diff --git a/CHANGELOG.md b/CHANGELOG.md index 28e236378ada44ba1f3aed6735d65e42ede70ea4..297aa3daaaeb8012192a74750547a63e4ada0f20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,10 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## Unreleased -* Elohiem's webgl art update 2 +* Reminders system improvements +* Elohiem's webgl art update 2 & 3 * added new hairstyles (bangs, hime, drills) +* added slave distribution presets (PLC, Japan/Korea, Carribean) * heavy reconstruction of the event systems +* REFI conversion complete * fixes +* RA UI tweaks ## 0.10.7.1-3.9.6 - 2021-04-02 diff --git a/css/001-lib/tippy.css b/css/001-lib/tippy.css new file mode 100644 index 0000000000000000000000000000000000000000..58d5a5e6970f2cafd3f1b51d8e483433f60b854c --- /dev/null +++ b/css/001-lib/tippy.css @@ -0,0 +1 @@ +.tippy-touch{cursor:pointer!important}.tippy-popper{max-width:400px;-webkit-perspective:800px;perspective:800px;z-index:9999}.tippy-popper.html-template{max-width:96%;max-width:calc(100% - 20px)}.tippy-popper[x-placement^=top] [x-arrow]{position:absolute;width:0;height:0;border-top:7px solid #333;border-right:7px solid transparent;border-left:7px solid transparent;bottom:-7px}.tippy-popper[x-placement^=top] [x-arrow].arrow-small{border-top:5px solid #333;border-right:5px solid transparent;border-left:5px solid transparent;bottom:-5px}.tippy-popper[x-placement^=top] [x-arrow].arrow-big{border-top:9px solid #333;border-right:9px solid transparent;border-left:9px solid transparent;bottom:-9px}.tippy-popper[x-placement^=top] [x-circle]{-webkit-transform-origin:0 50%;transform-origin:0 50%}.tippy-popper[x-placement^=top] [x-circle].enter{opacity:1;-webkit-transform:scale(1) translate(-50%,-50%);transform:scale(1) translate(-50%,-50%)}.tippy-popper[x-placement^=top] [x-circle].leave{opacity:0;-webkit-transform:scale(.4) translate(-50%,-50%);transform:scale(.4) translate(-50%,-50%)}.tippy-popper[x-placement^=top] .tippy-tooltip.light-theme [x-circle]{background-color:#fff}.tippy-popper[x-placement^=top] .tippy-tooltip.light-theme [x-arrow]{border-top:7px solid #fff;border-right:7px solid transparent;border-left:7px solid transparent}.tippy-popper[x-placement^=top] .tippy-tooltip.light-theme [x-arrow].arrow-small{border-top:5px solid #fff;border-right:5px solid transparent;border-left:5px solid transparent}.tippy-popper[x-placement^=top] .tippy-tooltip.light-theme [x-arrow].arrow-big{border-top:9px solid #fff;border-right:9px solid transparent;border-left:9px solid transparent}.tippy-popper[x-placement^=top] .tippy-tooltip.transparent-theme [x-circle]{background-color:rgba(0,0,0,.7)}.tippy-popper[x-placement^=top] .tippy-tooltip.transparent-theme [x-arrow]{border-top:7px solid rgba(0,0,0,.7);border-right:7px solid transparent;border-left:7px solid transparent}.tippy-popper[x-placement^=top] .tippy-tooltip.transparent-theme [x-arrow].arrow-small{border-top:5px solid rgba(0,0,0,.7);border-right:5px solid transparent;border-left:5px solid transparent}.tippy-popper[x-placement^=top] .tippy-tooltip.transparent-theme [x-arrow].arrow-big{border-top:9px solid rgba(0,0,0,.7);border-right:9px solid transparent;border-left:9px solid transparent}.tippy-popper[x-placement^=top] [data-animation=perspective]{-webkit-transform-origin:bottom;transform-origin:bottom}.tippy-popper[x-placement^=top] [data-animation=perspective].enter{opacity:1;-webkit-transform:translateY(-10px) rotateX(0);transform:translateY(-10px) rotateX(0)}.tippy-popper[x-placement^=top] [data-animation=perspective].leave{opacity:0;-webkit-transform:translateY(0) rotateX(90deg);transform:translateY(0) rotateX(90deg)}.tippy-popper[x-placement^=top] [data-animation=fade].enter{opacity:1;-webkit-transform:translateY(-10px);transform:translateY(-10px)}.tippy-popper[x-placement^=top] [data-animation=fade].leave{opacity:0;-webkit-transform:translateY(-10px);transform:translateY(-10px)}.tippy-popper[x-placement^=top] [data-animation=shift].enter{opacity:1;-webkit-transform:translateY(-10px);transform:translateY(-10px)}.tippy-popper[x-placement^=top] [data-animation=shift].leave{opacity:0;-webkit-transform:translateY(0);transform:translateY(0)}.tippy-popper[x-placement^=top] [data-animation=scale].enter{opacity:1;-webkit-transform:translateY(-10px) scale(1);transform:translateY(-10px) scale(1)}.tippy-popper[x-placement^=top] [data-animation=scale].leave{opacity:0;-webkit-transform:translateY(0) scale(0);transform:translateY(0) scale(0)}.tippy-popper[x-placement^=bottom] [x-arrow]{position:absolute;width:0;height:0;border-bottom:7px solid #333;border-right:7px solid transparent;border-left:7px solid transparent;top:-7px}.tippy-popper[x-placement^=bottom] [x-arrow].arrow-small{border-bottom:5px solid #333;border-right:5px solid transparent;border-left:5px solid transparent;top:-5px}.tippy-popper[x-placement^=bottom] [x-arrow].arrow-big{border-bottom:9px solid #333;border-right:9px solid transparent;border-left:9px solid transparent;top:-9px}.tippy-popper[x-placement^=bottom] [x-circle]{-webkit-transform-origin:0 -50%;transform-origin:0 -50%}.tippy-popper[x-placement^=bottom] [x-circle].enter{opacity:1;-webkit-transform:scale(1) translate(-50%,-50%);transform:scale(1) translate(-50%,-50%)}.tippy-popper[x-placement^=bottom] [x-circle].leave{opacity:0;-webkit-transform:scale(.4) translate(-50%);transform:scale(.4) translate(-50%)}.tippy-popper[x-placement^=bottom] .tippy-tooltip.light-theme [x-circle]{background-color:#fff}.tippy-popper[x-placement^=bottom] .tippy-tooltip.light-theme [x-arrow]{border-bottom:7px solid #fff;border-right:7px solid transparent;border-left:7px solid transparent}.tippy-popper[x-placement^=bottom] .tippy-tooltip.light-theme [x-arrow].arrow-small{border-bottom:5px solid #fff;border-right:5px solid transparent;border-left:5px solid transparent}.tippy-popper[x-placement^=bottom] .tippy-tooltip.light-theme [x-arrow].arrow-big{border-bottom:9px solid #fff;border-right:9px solid transparent;border-left:9px solid transparent}.tippy-popper[x-placement^=bottom] .tippy-tooltip.transparent-theme [x-circle]{background-color:rgba(0,0,0,.7)}.tippy-popper[x-placement^=bottom] .tippy-tooltip.transparent-theme [x-arrow]{border-bottom:7px solid rgba(0,0,0,.7);border-right:7px solid transparent;border-left:7px solid transparent}.tippy-popper[x-placement^=bottom] .tippy-tooltip.transparent-theme [x-arrow].arrow-small{border-bottom:5px solid rgba(0,0,0,.7);border-right:5px solid transparent;border-left:5px solid transparent}.tippy-popper[x-placement^=bottom] .tippy-tooltip.transparent-theme [x-arrow].arrow-big{border-bottom:9px solid rgba(0,0,0,.7);border-right:9px solid transparent;border-left:9px solid transparent}.tippy-popper[x-placement^=bottom] [data-animation=perspective]{-webkit-transform-origin:top;transform-origin:top}.tippy-popper[x-placement^=bottom] [data-animation=perspective].enter{opacity:1;-webkit-transform:translateY(10px) rotateX(0);transform:translateY(10px) rotateX(0)}.tippy-popper[x-placement^=bottom] [data-animation=perspective].leave{opacity:0;-webkit-transform:translateY(0) rotateX(-90deg);transform:translateY(0) rotateX(-90deg)}.tippy-popper[x-placement^=bottom] [data-animation=fade].enter{opacity:1;-webkit-transform:translateY(10px);transform:translateY(10px)}.tippy-popper[x-placement^=bottom] [data-animation=fade].leave{opacity:0;-webkit-transform:translateY(10px);transform:translateY(10px)}.tippy-popper[x-placement^=bottom] [data-animation=shift].enter{opacity:1;-webkit-transform:translateY(10px);transform:translateY(10px)}.tippy-popper[x-placement^=bottom] [data-animation=shift].leave{opacity:0;-webkit-transform:translateY(0);transform:translateY(0)}.tippy-popper[x-placement^=bottom] [data-animation=scale].enter{opacity:1;-webkit-transform:translateY(10px) scale(1);transform:translateY(10px) scale(1)}.tippy-popper[x-placement^=bottom] [data-animation=scale].leave{opacity:0;-webkit-transform:translateY(0) scale(0);transform:translateY(0) scale(0)}.tippy-popper[x-placement^=left] [x-arrow]{position:absolute;width:0;height:0;border-left:7px solid #333;border-top:7px solid transparent;border-bottom:7px solid transparent;right:-7px;top:50%}.tippy-popper[x-placement^=left] [x-arrow].arrow-small{border-left:5px solid #333;border-top:5px solid transparent;border-bottom:5px solid transparent;right:-5px;top:50%}.tippy-popper[x-placement^=left] [x-arrow].arrow-big{border-left:9px solid #333;border-top:9px solid transparent;border-bottom:9px solid transparent;right:-9px;top:50%}.tippy-popper[x-placement^=left] [x-circle]{-webkit-transform-origin:50% 5%;transform-origin:50% 5%}.tippy-popper[x-placement^=left] [x-circle].enter{opacity:1;-webkit-transform:scale(1) translate(-50%,-50%);transform:scale(1) translate(-50%,-50%)}.tippy-popper[x-placement^=left] [x-circle].leave{opacity:0;-webkit-transform:scale(.4) translate(-50%,-33%);transform:scale(.4) translate(-50%,-33%)}.tippy-popper[x-placement^=left] .tippy-tooltip.light-theme [x-circle]{background-color:#fff}.tippy-popper[x-placement^=left] .tippy-tooltip.light-theme [x-arrow]{border-left:7px solid #fff;border-top:7px solid transparent;border-bottom:7px solid transparent}.tippy-popper[x-placement^=left] .tippy-tooltip.light-theme [x-arrow].arrow-small{border-left:5px solid #fff;border-top:5px solid transparent;border-bottom:5px solid transparent}.tippy-popper[x-placement^=left] .tippy-tooltip.light-theme [x-arrow].arrow-big{border-left:9px solid #fff;border-top:9px solid transparent;border-bottom:9px solid transparent}.tippy-popper[x-placement^=left] .tippy-tooltip.transparent-theme [x-circle]{background-color:rgba(0,0,0,.7)}.tippy-popper[x-placement^=left] .tippy-tooltip.transparent-theme [x-arrow]{border-left:7px solid rgba(0,0,0,.7);border-top:7px solid transparent;border-bottom:7px solid transparent}.tippy-popper[x-placement^=left] .tippy-tooltip.transparent-theme [x-arrow].arrow-small{border-left:5px solid rgba(0,0,0,.7);border-top:5px solid transparent;border-bottom:5px solid transparent}.tippy-popper[x-placement^=left] .tippy-tooltip.transparent-theme [x-arrow].arrow-big{border-left:9px solid rgba(0,0,0,.7);border-top:9px solid transparent;border-bottom:9px solid transparent}.tippy-popper[x-placement^=left] [data-animation=perspective]{-webkit-transform-origin:right;transform-origin:right}.tippy-popper[x-placement^=left] [data-animation=perspective].enter{opacity:1;-webkit-transform:translateX(-10px) rotateY(0);transform:translateX(-10px) rotateY(0)}.tippy-popper[x-placement^=left] [data-animation=perspective].leave{opacity:0;-webkit-transform:translateX(0) rotateY(-90deg);transform:translateX(0) rotateY(-90deg)}.tippy-popper[x-placement^=left] [data-animation=fade].enter{opacity:1;-webkit-transform:translateX(-10px);transform:translateX(-10px)}.tippy-popper[x-placement^=left] [data-animation=fade].leave{opacity:0;-webkit-transform:translateX(-10px);transform:translateX(-10px)}.tippy-popper[x-placement^=left] [data-animation=shift].enter{opacity:1;-webkit-transform:translateX(-10px);transform:translateX(-10px)}.tippy-popper[x-placement^=left] [data-animation=shift].leave{opacity:0;-webkit-transform:translateX(0);transform:translateX(0)}.tippy-popper[x-placement^=left] [data-animation=scale].enter{opacity:1;-webkit-transform:translateX(-10px) scale(1);transform:translateX(-10px) scale(1)}.tippy-popper[x-placement^=left] [data-animation=scale].leave{opacity:0;-webkit-transform:translateX(0) scale(0);transform:translateX(0) scale(0)}.tippy-popper[x-placement^=right] [x-arrow]{position:absolute;width:0;height:0;border-right:7px solid #333;border-top:7px solid transparent;border-bottom:7px solid transparent;left:-7px;top:50%}.tippy-popper[x-placement^=right] [x-arrow].arrow-small{border-right:5px solid #333;border-top:5px solid transparent;border-bottom:5px solid transparent;left:-5px;top:50%}.tippy-popper[x-placement^=right] [x-arrow].arrow-big{border-right:9px solid #333;border-top:9px solid transparent;border-bottom:9px solid transparent;left:-9px;top:50%}.tippy-popper[x-placement^=right] [x-circle]{-webkit-transform-origin:-50% 5%;transform-origin:-50% 5%}.tippy-popper[x-placement^=right] [x-circle].enter{opacity:1;-webkit-transform:scale(1) translate(-50%,-50%);transform:scale(1) translate(-50%,-50%)}.tippy-popper[x-placement^=right] [x-circle].leave{opacity:0;-webkit-transform:scale(.4) translate(-50%,-33%);transform:scale(.4) translate(-50%,-33%)}.tippy-popper[x-placement^=right] .tippy-tooltip.light-theme [x-circle]{background-color:#fff}.tippy-popper[x-placement^=right] .tippy-tooltip.light-theme [x-arrow]{border-right:7px solid #fff;border-top:7px solid transparent;border-bottom:7px solid transparent}.tippy-popper[x-placement^=right] .tippy-tooltip.light-theme [x-arrow].arrow-small{border-right:5px solid #fff;border-top:5px solid transparent;border-bottom:5px solid transparent}.tippy-popper[x-placement^=right] .tippy-tooltip.light-theme [x-arrow].arrow-big{border-right:9px solid #fff;border-top:9px solid transparent;border-bottom:9px solid transparent}.tippy-popper[x-placement^=right] .tippy-tooltip.transparent-theme [x-circle]{background-color:rgba(0,0,0,.7)}.tippy-popper[x-placement^=right] .tippy-tooltip.transparent-theme [x-arrow]{border-right:7px solid rgba(0,0,0,.7);border-top:7px solid transparent;border-bottom:7px solid transparent}.tippy-popper[x-placement^=right] .tippy-tooltip.transparent-theme [x-arrow].arrow-small{border-right:5px solid rgba(0,0,0,.7);border-top:5px solid transparent;border-bottom:5px solid transparent}.tippy-popper[x-placement^=right] .tippy-tooltip.transparent-theme [x-arrow].arrow-big{border-right:9px solid rgba(0,0,0,.7);border-top:9px solid transparent;border-bottom:9px solid transparent}.tippy-popper[x-placement^=right] [data-animation=perspective]{-webkit-transform-origin:left;transform-origin:left}.tippy-popper[x-placement^=right] [data-animation=perspective].enter{opacity:1;-webkit-transform:translateX(10px) rotateY(0);transform:translateX(10px) rotateY(0)}.tippy-popper[x-placement^=right] [data-animation=perspective].leave{opacity:0;-webkit-transform:translateX(0) rotateY(90deg);transform:translateX(0) rotateY(90deg)}.tippy-popper[x-placement^=right] [data-animation=fade].enter{opacity:1;-webkit-transform:translateX(10px);transform:translateX(10px)}.tippy-popper[x-placement^=right] [data-animation=fade].leave{opacity:0;-webkit-transform:translateX(10px);transform:translateX(10px)}.tippy-popper[x-placement^=right] [data-animation=shift].enter{opacity:1;-webkit-transform:translateX(10px);transform:translateX(10px)}.tippy-popper[x-placement^=right] [data-animation=shift].leave{opacity:0;-webkit-transform:translateX(0);transform:translateX(0)}.tippy-popper[x-placement^=right] [data-animation=scale].enter{opacity:1;-webkit-transform:translateX(10px) scale(1);transform:translateX(10px) scale(1)}.tippy-popper[x-placement^=right] [data-animation=scale].leave{opacity:0;-webkit-transform:translateX(0) scale(0);transform:translateX(0) scale(0)}.tippy-popper [x-circle]{background-color:#fff}.tippy-popper[data-animatefill]{background-color:transparent}.tippy-popper [x-arrow]{position:absolute;width:0;height:0}.tippy-popper .tippy-tooltip.transparent-theme{background-color:rgba(0,0,0,.8)}.tippy-popper .tippy-tooltip.transparent-theme[data-animatefill]{background-color:transparent}.tippy-popper .tippy-tooltip.light-theme{color:#203d5d;box-shadow:0 4px 20px 4px rgba(0,20,60,.1),0 4px 80px -8px rgba(0,20,60,.2);background-color:#fff}.tippy-popper .tippy-tooltip.light-theme[data-animatefill]{background-color:transparent}.tippy-tooltip{position:relative;color:#fff;border-radius:4px;font-size:.95rem;padding:.4rem .8rem;text-align:center;will-change:transform;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#333}.tippy-tooltip--small{padding:.25rem .5rem;font-size:.8rem}.tippy-tooltip--big{padding:.6rem 1.2rem;font-size:1.2rem}.tippy-tooltip[data-animatefill]{overflow:hidden;background-color:transparent}.tippy-tooltip[data-inertia]{-webkit-transition-timing-function:cubic-bezier(.53,1,.36,.85);transition-timing-function:cubic-bezier(.53,2,.36,.85)}.tippy-tooltip [x-circle]{position:absolute;will-change:transform;background-color:#333;border-radius:50%;width:120%;width:calc(100% + 2rem);-webkit-transition:all ease-out;transition:all ease-out;left:50%;z-index:-1;opacity:0;overflow:hidden}.tippy-tooltip [x-circle]:before{content:"";padding-top:100%;padding-top:calc(60% + 2rem);float:left}@media (max-width:500px){.tippy-popper{max-width:96%;max-width:calc(100% - 20px)}} \ No newline at end of file diff --git a/css/gui/linksStrip.css b/css/gui/linksStrip.css index 2ae24c635862ceb42a6a35fbaf6b12049055aafe..7e11243e9b9cfa023148502f41328a30b510b768 100644 --- a/css/gui/linksStrip.css +++ b/css/gui/linksStrip.css @@ -1,15 +1,15 @@ -ul.choicesStrip { +ul.choices-strip { display: inline; list-style-type: none; padding: 0mm; margin-left: 0em; } -ul.choicesStrip li { +ul.choices-strip li { display: inline; } -ul.choicesStrip li + li:before { +ul.choices-strip li + li:before { content: " | "; } diff --git a/css/gui/tooltips/hasTooltip.css b/css/gui/tooltips/hasTooltip.css deleted file mode 100644 index 1eaca7af0ac5c88d57e07a07314f5ac8ab93b4eb..0000000000000000000000000000000000000000 --- a/css/gui/tooltips/hasTooltip.css +++ /dev/null @@ -1,21 +0,0 @@ -/* TODO unify tooltip systems */ -.hasTooltip { - text-decoration: underline; -} - -/* interactable tooltip-like container - created/destroyed dynamically */ -.details-overlay { - display: inline-block; - font-size: smaller; - width: max-content; - height: max-content; - border-style: solid; - border-color: slategray; - border-width: 2px; - border-radius: 3px; - background-color: rgb(17, 17, 17); - padding: 3px; - position: absolute; - z-index: 2; - text-indent: 0; -} diff --git a/css/gui/tooltips/textWithTooltip.css b/css/gui/tooltips/textWithTooltip.css deleted file mode 100644 index 6af64664bfecfc979302889d85fcfb9f3b0239ef..0000000000000000000000000000000000000000 --- a/css/gui/tooltips/textWithTooltip.css +++ /dev/null @@ -1,47 +0,0 @@ -/* TODO unify tooltip systems */ -.textWithTooltip { - position: relative; - text-decoration: underline; - text-decoration-color: lightblue; -} - -.textWithTooltip .tooltip { - visibility: hidden; - display: block; - font-size: smaller; - width: 20em; - margin-left: -10em; - background-color: rgb(29, 30, 32); - text-align: center; - border-radius: 3px; - padding: 3px; - position: absolute; - z-index: 1; - bottom: 100%; - left: 50%; -} - -.textWithTooltip .tooltip ul { - margin-left: 5px; - margin-right: 0px; - padding-left: 10px; - padding-right: 0px; - text-align: left; -} - -.textWithTooltip .tooltip::after { - content: ""; - position: absolute; - top: 100%; - left: 50%; - margin-left: -5px; - border-width: 5px; - border-style: solid; - border-color: #555 transparent transparent transparent; -} - -.textWithTooltip:hover .tooltip { - visibility: visible; - opacity: 1; - transition-delay: 0.3s; -} diff --git a/css/gui/tooltips/tippy.css b/css/gui/tooltips/tippy.css new file mode 100644 index 0000000000000000000000000000000000000000..72ffb2760d993eedc924831c52faf1c88168a1b5 --- /dev/null +++ b/css/gui/tooltips/tippy.css @@ -0,0 +1,18 @@ +.has-tooltip { + text-decoration: underline dotted; +} + +.tippy-content { + text-indent: initial; +} + +.tippy-content ul { + margin: 5px; +} +.tippy-content ul:not(.choices-strip) { + padding-left: 10px; +} + +.tippy-content .tip-details { + font-size: smaller; +} diff --git a/devNotes/standaloneFunctions.md b/devNotes/standaloneFunctions.md index 778be13a60a117c38f8936adb09a37cfc8febb04..7526fe940f275543534d33b0508f7be921ff8991 100644 --- a/devNotes/standaloneFunctions.md +++ b/devNotes/standaloneFunctions.md @@ -27,6 +27,3 @@ Collection of custom functions without dependencies on FC specific variables/dat * `jsDef(x)`: Returns whether x is undefined. A JS port of SugarCube's def. - -* `between(a, low, high)`: - Returns `true` if `a` is between `low` and `high`, otherwise `false`. diff --git a/devNotes/usefulJSFunctionDocumentation.txt b/devNotes/usefulJSFunctionDocumentation.txt index 4c85aa3bc1b94c90092265880080414451b19365..0108b253a8c74b72104c2048239bafb36f69aab1 100644 --- a/devNotes/usefulJSFunctionDocumentation.txt +++ b/devNotes/usefulJSFunctionDocumentation.txt @@ -238,11 +238,6 @@ UtilJS [script] weightedArray2HashMap() - between(a, low, high, mode = 'exclusive') - checks if the value is between low and high inputs. mode: defaults to exclusive but also supports 'inclusive'. e.g. - $trees === 1. - exclusive - between($trees, 1, 3) -> false - inclusive - between($trees, 1, 3) -> true - def() - Returns whether the input is defined, similar to SugarCube's def. Core Slave Functions: diff --git a/devTools/Script to convert SC to JS/SC to JS 1.py b/devTools/Script to convert SC to JS/SC to JS 1.py index baa14313d8526833de3a6ed5f6cfe410f296669c..b77dc0ba1ee381a958ab45dcd59cf2c91b12d866 100644 --- a/devTools/Script to convert SC to JS/SC to JS 1.py +++ b/devTools/Script to convert SC to JS/SC to JS 1.py @@ -39,6 +39,9 @@ editor.rereplace(r"<<unset (.*)>>", r"delete \1;") # Set editor.rereplace(r"<<set (.*?)>>", r"$1;") +editor.rereplace(r"<<(Master)>>", r"${$1}") +editor.rereplace(r"<<(say)>>", r"${$1}") + #Switch editor.rereplace(r"<<switch (.*?)>>", r"switch \(\1\) {") editor.rereplace(r"<</switch>>", r"}") @@ -108,3 +111,8 @@ editor.rereplace(r"_S\.", r"S.") editor.rereplace(r"\${He}adGirl", r"V.HeadGirl") editor.rereplace(r"\.}", r"}.") editor.rereplace(r"\${slave}", r"slave") +editor.rereplace(r"V.getSlave", r"getSlave") +editor.rereplace(r"V.App", r"App") + +# Compress speech macros, like <<s>> +editor.rereplace(r"`\);\n[ ]*<<([^\}]*)>>\n[ ]*r\.push\(`", r"$1") \ No newline at end of file diff --git a/devTools/javaSanityCheck/ignoredVariables b/devTools/javaSanityCheck/ignoredVariables index 1aea7eacb2fe33802d0518eea12b5dc93112d39c..20a462dbff031219ad7bc0187cee56f93bdd3e50 100644 --- a/devTools/javaSanityCheck/ignoredVariables +++ b/devTools/javaSanityCheck/ignoredVariables @@ -4,10 +4,9 @@ tacChance ############################ acquire ############################ -societyChanged totalMerc securityHQ waterwayTime dickSize dinnerParty -sacrificeType \ No newline at end of file +seed \ No newline at end of file diff --git a/devTools/types/FC/data.d.ts b/devTools/types/FC/data.d.ts index 48e6a8e94a673b25ced0e5a153d3eb5d24006772..eee7fbaa16b826501ad409826b823341c80dd7fb 100644 --- a/devTools/types/FC/data.d.ts +++ b/devTools/types/FC/data.d.ts @@ -60,6 +60,7 @@ declare namespace FC { jobs: Record<string, JobDesc>; defaultJob: string; manager: ManagerJobDesc | null; + decorated: boolean; } namespace SlaveSummary { diff --git a/devTools/types/FC/gameState.d.ts b/devTools/types/FC/gameState.d.ts index fb42f6230fca72cf6cb4de7cce273e89d8b4fb78..b28d13f53d15424cab78f1c43c2367ceefad9a4b 100644 --- a/devTools/types/FC/gameState.d.ts +++ b/devTools/types/FC/gameState.d.ts @@ -93,6 +93,13 @@ declare namespace FC { training: HeadGirlTraining; } + export interface ReminderEntry { + message: string | Node; + week: number; + category: string; + slaveID?: number; + } + /** * These variables shall not be in the game state and there is a hope they will be exterminated in the future */ diff --git a/devTools/types/FC/human.d.ts b/devTools/types/FC/human.d.ts index 29ecadb2abc2ee986c6ad177e9ee858359fecdde..543ac50e627e69136a716fbd9b564a83201eea33 100644 --- a/devTools/types/FC/human.d.ts +++ b/devTools/types/FC/human.d.ts @@ -221,6 +221,7 @@ declare global { | "size queen">; type BreastShape = "normal" | "perky" | "saggy" | "torpedo-shaped" | "downward-facing" | "wide-set" | "spherical"; + type HairStyle = "afro"| "braided" | "cornrows" | "curled" | "dreadlocks" | "eary" | "bun" | "messy bun" | "ponytail" | "tails" | "drills" | "luxurious" | "messy" | "neat" | "permed" | "bangs" | "hime" | "strip" | "up" | "shaved" | "trimmed" | "buzzcut" | "bald" | "undercut"; type Diet = "healthy" | "restricted" | "corrective" | "muscle building" | "fattening" | "slimming" | "XX" | "XY" | "XXY" | "cum production" | "cleansing" | "fertility" | "high caloric"; type Drug = "no drugs" | diff --git a/devTools/types/extensions.d.ts b/devTools/types/extensions.d.ts index b9b32455c007436a957ba03a8cf9afb982b2aeef..e0d7fb808ba794473b9b11ea4d1eaa46744450e8 100644 --- a/devTools/types/extensions.d.ts +++ b/devTools/types/extensions.d.ts @@ -3,6 +3,16 @@ interface MousetrapStatic { record(callback: (this: MousetrapStatic, sequence: string[]) => void): void; } +interface Number { + /** + * Returns whether the value is between the given bounds, with optional inclusivity. Exclusive by default. + * @param min The minimum value to check against. + * @param max The maximum value to check against. + * @param inclusive Whether to include the bounds values. + */ + isBetween(min: number, max: number, inclusive?: boolean): boolean; +} + // d3-dtree declare namespace d3dTree { diff --git a/devTools/types/tippy/index.d.ts b/devTools/types/tippy/index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..d284128c557c16c3c314b6c0311ac415c6b5820d --- /dev/null +++ b/devTools/types/tippy/index.d.ts @@ -0,0 +1,5 @@ +import {Tippy} from "./tippy"; + +declare global { + const tippy: Tippy; +} diff --git a/devTools/types/tippy/tippy.d.ts b/devTools/types/tippy/tippy.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..4c38918887cc883b458e2da4f7d4640116533036 --- /dev/null +++ b/devTools/types/tippy/tippy.d.ts @@ -0,0 +1,260 @@ +import * as Popper from '@popperjs/core'; + +export type BasePlacement = Popper.BasePlacement; + +export type Placement = Popper.Placement; + +export type Content = + | string + | Element + | DocumentFragment + | ((ref: Element) => string | Element | DocumentFragment); + +export type SingleTarget = Element; + +export type MultipleTargets = string | Element[] | NodeList; + +export type Targets = SingleTarget | MultipleTargets; + +export interface ReferenceElement<TProps = Props> extends Element { + _tippy?: Instance<TProps>; +} + +export interface PopperElement<TProps = Props> extends HTMLDivElement { + _tippy?: Instance<TProps>; +} + +export interface LifecycleHooks<TProps = Props> { + onAfterUpdate( + instance: Instance<TProps>, + partialProps: Partial<TProps> + ): void; + onBeforeUpdate( + instance: Instance<TProps>, + partialProps: Partial<TProps> + ): void; + onCreate(instance: Instance<TProps>): void; + onDestroy(instance: Instance<TProps>): void; + onHidden(instance: Instance<TProps>): void; + onHide(instance: Instance<TProps>): void | false; + onMount(instance: Instance<TProps>): void; + onShow(instance: Instance<TProps>): void | false; + onShown(instance: Instance<TProps>): void; + onTrigger(instance: Instance<TProps>, event: Event): void; + onUntrigger(instance: Instance<TProps>, event: Event): void; + onClickOutside(instance: Instance<TProps>, event: Event): void; +} + +export interface RenderProps { + allowHTML: boolean; + animation: string | boolean; + arrow: boolean | string | SVGElement | DocumentFragment; + content: Content; + inertia: boolean; + maxWidth: number | string; + role: string; + theme: string; + zIndex: number; +} + +export interface GetReferenceClientRect { + (): ClientRect | DOMRect; + contextElement?: Element; +} + +export interface Props extends LifecycleHooks, RenderProps { + animateFill: boolean; + appendTo: 'parent' | Element | ((ref: Element) => Element); + aria: { + content?: 'auto' | 'describedby' | 'labelledby' | null; + expanded?: 'auto' | boolean; + }; + delay: number | [number | null, number | null]; + duration: number | [number | null, number | null]; + followCursor: boolean | 'horizontal' | 'vertical' | 'initial'; + getReferenceClientRect: null | GetReferenceClientRect; + hideOnClick: boolean | 'toggle'; + ignoreAttributes: boolean; + inlinePositioning: boolean; + interactive: boolean; + interactiveBorder: number; + interactiveDebounce: number; + moveTransition: string; + offset: + | [number, number] + | (({ + placement, + popper, + reference, + }: { + placement: Placement; + popper: Popper.Rect; + reference: Popper.Rect; + }) => [number, number]); + placement: Placement; + plugins: Plugin<unknown>[]; + popperOptions: Partial<Popper.Options>; + render: + | (( + instance: Instance + ) => { + popper: PopperElement; + onUpdate?: (prevProps: Props, nextProps: Props) => void; + }) + | null; + showOnCreate: boolean; + sticky: boolean | 'reference' | 'popper'; + touch: boolean | 'hold' | ['hold', number]; + trigger: string; + triggerTarget: Element | Element[] | null; +} + +export interface DefaultProps extends Omit<Props, 'delay' | 'duration'> { + delay: number | [number, number]; + duration: number | [number, number]; +} + +export interface Instance<TProps = Props> { + clearDelayTimeouts(): void; + destroy(): void; + disable(): void; + enable(): void; + hide(): void; + hideWithInteractivity(event: MouseEvent): void; + id: number; + plugins: Plugin<TProps>[]; + popper: PopperElement<TProps>; + popperInstance: Popper.Instance | null; + props: TProps; + reference: ReferenceElement<TProps>; + setContent(content: Content): void; + setProps(partialProps: Partial<TProps>): void; + show(): void; + state: { + isEnabled: boolean; + isVisible: boolean; + isDestroyed: boolean; + isMounted: boolean; + isShown: boolean; + }; + unmount(): void; +} + +export interface TippyStatics { + readonly currentInput: {isTouch: boolean}; + readonly defaultProps: DefaultProps; + setDefaultProps(partialProps: Partial<DefaultProps>): void; +} + +export interface Tippy<TProps = Props> extends TippyStatics { + (targets: SingleTarget, optionalProps?: Partial<TProps>): Instance<TProps>; +} + +export interface Tippy<TProps = Props> extends TippyStatics { + (targets: MultipleTargets, optionalProps?: Partial<TProps>): Instance< + TProps + >[]; +} + +declare const tippy: Tippy; + +// ============================================================================= +// Addon types +// ============================================================================= +export interface DelegateInstance<TProps = Props> extends Instance<TProps> { + destroy(shouldDestroyTargetInstances?: boolean): void; +} + +export interface Delegate<TProps = Props> { + ( + targets: SingleTarget, + props: Partial<TProps> & {target: string} + ): DelegateInstance<TProps>; +} + +export interface Delegate<TProps = Props> { + ( + targets: MultipleTargets, + props: Partial<TProps> & {target: string} + ): DelegateInstance<TProps>[]; +} + +export type CreateSingletonProps<TProps = Props> = TProps & { + overrides: Array<keyof TProps>; +}; + +export type CreateSingletonInstance<TProps = CreateSingletonProps> = Instance< + TProps +> & { + setInstances(instances: Instance<any>[]): void; + show(target?: ReferenceElement | Instance | number): void; + showNext(): void; + showPrevious(): void; +}; + +export type CreateSingleton<TProps = Props> = ( + tippyInstances: Instance<any>[], + optionalProps?: Partial<CreateSingletonProps<TProps>> +) => CreateSingletonInstance<CreateSingletonProps<TProps>>; + +declare const delegate: Delegate; +declare const createSingleton: CreateSingleton; + +// ============================================================================= +// Plugin types +// ============================================================================= +export interface Plugin<TProps = Props> { + name?: string; + defaultValue?: any; + fn(instance: Instance<TProps>): Partial<LifecycleHooks<TProps>>; +} + +export interface AnimateFill extends Plugin { + name: 'animateFill'; + defaultValue: false; +} + +export interface FollowCursor extends Plugin { + name: 'followCursor'; + defaultValue: false; +} + +export interface InlinePositioning extends Plugin { + name: 'inlinePositioning'; + defaultValue: false; +} + +export interface Sticky extends Plugin { + name: 'sticky'; + defaultValue: false; +} + +declare const animateFill: AnimateFill; +declare const followCursor: FollowCursor; +declare const inlinePositioning: InlinePositioning; +declare const sticky: Sticky; + +// ============================================================================= +// Misc types +// ============================================================================= +export interface HideAllOptions { + duration?: number; + exclude?: Instance | ReferenceElement; +} + +export type HideAll = (options?: HideAllOptions) => void; + +declare const hideAll: HideAll; +declare const roundArrow: string; + +export default tippy; +export { + hideAll, + delegate, + createSingleton, + animateFill, + followCursor, + inlinePositioning, + sticky, + roundArrow, +}; diff --git a/js/001-lib/popper.min.js b/js/001-lib/popper.min.js new file mode 100644 index 0000000000000000000000000000000000000000..23122ccc3376a85030f32dd153335845ba70704c --- /dev/null +++ b/js/001-lib/popper.min.js @@ -0,0 +1,6 @@ +/** + * @popperjs/core v2.9.2 - MIT License + */ + +"use strict";!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){function t(e){return{width:(e=e.getBoundingClientRect()).width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,x:e.left,y:e.top}}function n(e){return null==e?window:"[object Window]"!==e.toString()?(e=e.ownerDocument)&&e.defaultView||window:e}function o(e){return{scrollLeft:(e=n(e)).pageXOffset,scrollTop:e.pageYOffset}}function r(e){return e instanceof n(e).Element||e instanceof Element}function i(e){return e instanceof n(e).HTMLElement||e instanceof HTMLElement}function a(e){return"undefined"!=typeof ShadowRoot&&(e instanceof n(e).ShadowRoot||e instanceof ShadowRoot)}function s(e){return e?(e.nodeName||"").toLowerCase():null}function f(e){return((r(e)?e.ownerDocument:e.document)||window.document).documentElement}function p(e){return t(f(e)).left+o(e).scrollLeft}function c(e){return n(e).getComputedStyle(e)}function l(e){return e=c(e),/auto|scroll|overlay|hidden/.test(e.overflow+e.overflowY+e.overflowX)}function u(e,r,a){void 0===a&&(a=!1);var c=f(r);e=t(e);var u=i(r),d={scrollLeft:0,scrollTop:0},m={x:0,y:0};return(u||!u&&!a)&&(("body"!==s(r)||l(c))&&(d=r!==n(r)&&i(r)?{scrollLeft:r.scrollLeft,scrollTop:r.scrollTop}:o(r)),i(r)?((m=t(r)).x+=r.clientLeft,m.y+=r.clientTop):c&&(m.x=p(c))),{x:e.left+d.scrollLeft-m.x,y:e.top+d.scrollTop-m.y,width:e.width,height:e.height}}function d(e){var n=t(e),o=e.offsetWidth,r=e.offsetHeight;return 1>=Math.abs(n.width-o)&&(o=n.width),1>=Math.abs(n.height-r)&&(r=n.height),{x:e.offsetLeft,y:e.offsetTop,width:o,height:r}}function m(e){return"html"===s(e)?e:e.assignedSlot||e.parentNode||(a(e)?e.host:null)||f(e)}function h(e){return 0<=["html","body","#document"].indexOf(s(e))?e.ownerDocument.body:i(e)&&l(e)?e:h(m(e))}function v(e,t){var o;void 0===t&&(t=[]);var r=h(e);return e=r===(null==(o=e.ownerDocument)?void 0:o.body),o=n(r),r=e?[o].concat(o.visualViewport||[],l(r)?r:[]):r,t=t.concat(r),e?t:t.concat(v(m(r)))}function g(e){return i(e)&&"fixed"!==c(e).position?e.offsetParent:null}function y(e){for(var t=n(e),o=g(e);o&&0<=["table","td","th"].indexOf(s(o))&&"static"===c(o).position;)o=g(o);if(o&&("html"===s(o)||"body"===s(o)&&"static"===c(o).position))return t;if(!o)e:{if(o=-1!==navigator.userAgent.toLowerCase().indexOf("firefox"),-1===navigator.userAgent.indexOf("Trident")||!i(e)||"fixed"!==c(e).position)for(e=m(e);i(e)&&0>["html","body"].indexOf(s(e));){var r=c(e);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||o&&"filter"===r.willChange||o&&r.filter&&"none"!==r.filter){o=e;break e}e=e.parentNode}o=null}return o||t}function b(e){function t(e){o.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){o.has(e)||(e=n.get(e))&&t(e)})),r.push(e)}var n=new Map,o=new Set,r=[];return e.forEach((function(e){n.set(e.name,e)})),e.forEach((function(e){o.has(e.name)||t(e)})),r}function w(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=void 0,n(e())}))}))),t}}function x(e){return e.split("-")[0]}function O(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&a(n))do{if(t&&e.isSameNode(t))return!0;t=t.parentNode||t.host}while(t);return!1}function j(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function E(e,r){if("viewport"===r){r=n(e);var a=f(e);r=r.visualViewport;var s=a.clientWidth;a=a.clientHeight;var l=0,u=0;r&&(s=r.width,a=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(l=r.offsetLeft,u=r.offsetTop)),e=j(e={width:s,height:a,x:l+p(e),y:u})}else i(r)?((e=t(r)).top+=r.clientTop,e.left+=r.clientLeft,e.bottom=e.top+r.clientHeight,e.right=e.left+r.clientWidth,e.width=r.clientWidth,e.height=r.clientHeight,e.x=e.left,e.y=e.top):(u=f(e),e=f(u),s=o(u),r=null==(a=u.ownerDocument)?void 0:a.body,a=_(e.scrollWidth,e.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),l=_(e.scrollHeight,e.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),u=-s.scrollLeft+p(u),s=-s.scrollTop,"rtl"===c(r||e).direction&&(u+=_(e.clientWidth,r?r.clientWidth:0)-a),e=j({width:a,height:l,x:u,y:s}));return e}function D(e,t,n){return t="clippingParents"===t?function(e){var t=v(m(e)),n=0<=["absolute","fixed"].indexOf(c(e).position)&&i(e)?y(e):e;return r(n)?t.filter((function(e){return r(e)&&O(e,n)&&"body"!==s(e)})):[]}(e):[].concat(t),(n=(n=[].concat(t,[n])).reduce((function(t,n){return n=E(e,n),t.top=_(n.top,t.top),t.right=U(n.right,t.right),t.bottom=U(n.bottom,t.bottom),t.left=_(n.left,t.left),t}),E(e,n[0]))).width=n.right-n.left,n.height=n.bottom-n.top,n.x=n.left,n.y=n.top,n}function L(e){return 0<=["top","bottom"].indexOf(e)?"x":"y"}function P(e){var t=e.reference,n=e.element,o=(e=e.placement)?x(e):null;e=e?e.split("-")[1]:null;var r=t.x+t.width/2-n.width/2,i=t.y+t.height/2-n.height/2;switch(o){case"top":r={x:r,y:t.y-n.height};break;case"bottom":r={x:r,y:t.y+t.height};break;case"right":r={x:t.x+t.width,y:i};break;case"left":r={x:t.x-n.width,y:i};break;default:r={x:t.x,y:t.y}}if(null!=(o=o?L(o):null))switch(i="y"===o?"height":"width",e){case"start":r[o]-=t[i]/2-n[i]/2;break;case"end":r[o]+=t[i]/2-n[i]/2}return r}function M(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function k(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function A(e,n){void 0===n&&(n={});var o=n;n=void 0===(n=o.placement)?e.placement:n;var i=o.boundary,a=void 0===i?"clippingParents":i,s=void 0===(i=o.rootBoundary)?"viewport":i;i=void 0===(i=o.elementContext)?"popper":i;var p=o.altBoundary,c=void 0!==p&&p;o=M("number"!=typeof(o=void 0===(o=o.padding)?0:o)?o:k(o,C));var l=e.elements.reference;p=e.rects.popper,a=D(r(c=e.elements[c?"popper"===i?"reference":"popper":i])?c:c.contextElement||f(e.elements.popper),a,s),c=P({reference:s=t(l),element:p,strategy:"absolute",placement:n}),p=j(Object.assign({},p,c)),s="popper"===i?p:s;var u={top:a.top-s.top+o.top,bottom:s.bottom-a.bottom+o.bottom,left:a.left-s.left+o.left,right:s.right-a.right+o.right};if(e=e.modifiersData.offset,"popper"===i&&e){var d=e[n];Object.keys(u).forEach((function(e){var t=0<=["right","bottom"].indexOf(e)?1:-1,n=0<=["top","bottom"].indexOf(e)?"y":"x";u[e]+=d[n]*t}))}return u}function W(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some((function(e){return!(e&&"function"==typeof e.getBoundingClientRect)}))}function B(e){void 0===e&&(e={});var t=e.defaultModifiers,n=void 0===t?[]:t,o=void 0===(e=e.defaultOptions)?F:e;return function(e,t,i){function a(){f.forEach((function(e){return e()})),f=[]}void 0===i&&(i=o);var s={placement:"bottom",orderedModifiers:[],options:Object.assign({},F,o),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},f=[],p=!1,c={state:s,setOptions:function(i){return a(),s.options=Object.assign({},o,s.options,i),s.scrollParents={reference:r(e)?v(e):e.contextElement?v(e.contextElement):[],popper:v(t)},i=function(e){var t=b(e);return I.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])}(function(e){var t=e.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{});return Object.keys(t).map((function(e){return t[e]}))}([].concat(n,s.options.modifiers))),s.orderedModifiers=i.filter((function(e){return e.enabled})),s.orderedModifiers.forEach((function(e){var t=e.name,n=e.options;n=void 0===n?{}:n,"function"==typeof(e=e.effect)&&(t=e({state:s,name:t,instance:c,options:n}),f.push(t||function(){}))})),c.update()},forceUpdate:function(){if(!p){var e=s.elements,t=e.reference;if(W(t,e=e.popper))for(s.rects={reference:u(t,y(e),"fixed"===s.options.strategy),popper:d(e)},s.reset=!1,s.placement=s.options.placement,s.orderedModifiers.forEach((function(e){return s.modifiersData[e.name]=Object.assign({},e.data)})),t=0;t<s.orderedModifiers.length;t++)if(!0===s.reset)s.reset=!1,t=-1;else{var n=s.orderedModifiers[t];e=n.fn;var o=n.options;o=void 0===o?{}:o,n=n.name,"function"==typeof e&&(s=e({state:s,options:o,name:n,instance:c})||s)}}},update:w((function(){return new Promise((function(e){c.forceUpdate(),e(s)}))})),destroy:function(){a(),p=!0}};return W(e,t)?(c.setOptions(i).then((function(e){!p&&i.onFirstUpdate&&i.onFirstUpdate(e)})),c):c}}function T(e){var t,o=e.popper,r=e.popperRect,i=e.placement,a=e.offsets,s=e.position,p=e.gpuAcceleration,l=e.adaptive;if(!0===(e=e.roundOffsets)){e=a.y;var u=window.devicePixelRatio||1;e={x:z(z(a.x*u)/u)||0,y:z(z(e*u)/u)||0}}else e="function"==typeof e?e(a):a;e=void 0===(e=(u=e).x)?0:e,u=void 0===(u=u.y)?0:u;var d=a.hasOwnProperty("x");a=a.hasOwnProperty("y");var m,h="left",v="top",g=window;if(l){var b=y(o),w="clientHeight",x="clientWidth";b===n(o)&&("static"!==c(b=f(o)).position&&(w="scrollHeight",x="scrollWidth")),"top"===i&&(v="bottom",u-=b[w]-r.height,u*=p?1:-1),"left"===i&&(h="right",e-=b[x]-r.width,e*=p?1:-1)}return o=Object.assign({position:s},l&&J),p?Object.assign({},o,((m={})[v]=a?"0":"",m[h]=d?"0":"",m.transform=2>(g.devicePixelRatio||1)?"translate("+e+"px, "+u+"px)":"translate3d("+e+"px, "+u+"px, 0)",m)):Object.assign({},o,((t={})[v]=a?u+"px":"",t[h]=d?e+"px":"",t.transform="",t))}function H(e){return e.replace(/left|right|bottom|top/g,(function(e){return $[e]}))}function R(e){return e.replace(/start|end/g,(function(e){return ee[e]}))}function S(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function q(e){return["top","right","bottom","left"].some((function(t){return 0<=e[t]}))}var C=["top","bottom","right","left"],N=C.reduce((function(e,t){return e.concat([t+"-start",t+"-end"])}),[]),V=[].concat(C,["auto"]).reduce((function(e,t){return e.concat([t,t+"-start",t+"-end"])}),[]),I="beforeRead read afterRead beforeMain main afterMain beforeWrite write afterWrite".split(" "),_=Math.max,U=Math.min,z=Math.round,F={placement:"bottom",modifiers:[],strategy:"absolute"},X={passive:!0},Y={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,o=e.instance,r=(e=e.options).scroll,i=void 0===r||r,a=void 0===(e=e.resize)||e,s=n(t.elements.popper),f=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&f.forEach((function(e){e.addEventListener("scroll",o.update,X)})),a&&s.addEventListener("resize",o.update,X),function(){i&&f.forEach((function(e){e.removeEventListener("scroll",o.update,X)})),a&&s.removeEventListener("resize",o.update,X)}},data:{}},G={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state;t.modifiersData[e.name]=P({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},J={top:"auto",right:"auto",bottom:"auto",left:"auto"},K={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options;e=void 0===(e=n.gpuAcceleration)||e;var o=n.adaptive;o=void 0===o||o,n=void 0===(n=n.roundOffsets)||n,e={placement:x(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:e},null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,T(Object.assign({},e,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:o,roundOffsets:n})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,T(Object.assign({},e,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:n})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},Q={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},o=t.attributes[e]||{},r=t.elements[e];i(r)&&s(r)&&(Object.assign(r.style,n),Object.keys(o).forEach((function(e){var t=o[e];!1===t?r.removeAttribute(e):r.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var o=t.elements[e],r=t.attributes[e]||{};e=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{}),i(o)&&s(o)&&(Object.assign(o.style,e),Object.keys(r).forEach((function(e){o.removeAttribute(e)})))}))}},requires:["computeStyles"]},Z={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.name,o=void 0===(e=e.options.offset)?[0,0]:e,r=(e=V.reduce((function(e,n){var r=t.rects,i=x(n),a=0<=["left","top"].indexOf(i)?-1:1,s="function"==typeof o?o(Object.assign({},r,{placement:n})):o;return r=(r=s[0])||0,s=((s=s[1])||0)*a,i=0<=["left","right"].indexOf(i)?{x:s,y:r}:{x:r,y:s},e[n]=i,e}),{}))[t.placement],i=r.x;r=r.y,null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=i,t.modifiersData.popperOffsets.y+=r),t.modifiersData[n]=e}},$={left:"right",right:"left",bottom:"top",top:"bottom"},ee={start:"end",end:"start"},te={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options;if(e=e.name,!t.modifiersData[e]._skip){var o=n.mainAxis;o=void 0===o||o;var r=n.altAxis;r=void 0===r||r;var i=n.fallbackPlacements,a=n.padding,s=n.boundary,f=n.rootBoundary,p=n.altBoundary,c=n.flipVariations,l=void 0===c||c,u=n.allowedAutoPlacements;c=x(n=t.options.placement),i=i||(c!==n&&l?function(e){if("auto"===x(e))return[];var t=H(e);return[R(e),t,R(t)]}(n):[H(n)]);var d=[n].concat(i).reduce((function(e,n){return e.concat("auto"===x(n)?function(e,t){void 0===t&&(t={});var n=t.boundary,o=t.rootBoundary,r=t.padding,i=t.flipVariations,a=t.allowedAutoPlacements,s=void 0===a?V:a,f=t.placement.split("-")[1];0===(i=(t=f?i?N:N.filter((function(e){return e.split("-")[1]===f})):C).filter((function(e){return 0<=s.indexOf(e)}))).length&&(i=t);var p=i.reduce((function(t,i){return t[i]=A(e,{placement:i,boundary:n,rootBoundary:o,padding:r})[x(i)],t}),{});return Object.keys(p).sort((function(e,t){return p[e]-p[t]}))}(t,{placement:n,boundary:s,rootBoundary:f,padding:a,flipVariations:l,allowedAutoPlacements:u}):n)}),[]);n=t.rects.reference,i=t.rects.popper;var m=new Map;c=!0;for(var h=d[0],v=0;v<d.length;v++){var g=d[v],y=x(g),b="start"===g.split("-")[1],w=0<=["top","bottom"].indexOf(y),O=w?"width":"height",j=A(t,{placement:g,boundary:s,rootBoundary:f,altBoundary:p,padding:a});if(b=w?b?"right":"left":b?"bottom":"top",n[O]>i[O]&&(b=H(b)),O=H(b),w=[],o&&w.push(0>=j[y]),r&&w.push(0>=j[b],0>=j[O]),w.every((function(e){return e}))){h=g,c=!1;break}m.set(g,w)}if(c)for(o=function(e){var t=d.find((function(t){if(t=m.get(t))return t.slice(0,e).every((function(e){return e}))}));if(t)return h=t,"break"},r=l?3:1;0<r&&"break"!==o(r);r--);t.placement!==h&&(t.modifiersData[e]._skip=!0,t.placement=h,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}},ne={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options;e=e.name;var o=n.mainAxis,r=void 0===o||o,i=void 0!==(o=n.altAxis)&&o;o=void 0===(o=n.tether)||o;var a=n.tetherOffset,s=void 0===a?0:a,f=A(t,{boundary:n.boundary,rootBoundary:n.rootBoundary,padding:n.padding,altBoundary:n.altBoundary});n=x(t.placement);var p=t.placement.split("-")[1],c=!p,l=L(n);n="x"===l?"y":"x",a=t.modifiersData.popperOffsets;var u=t.rects.reference,m=t.rects.popper,h="function"==typeof s?s(Object.assign({},t.rects,{placement:t.placement})):s;if(s={x:0,y:0},a){if(r||i){var v="y"===l?"top":"left",g="y"===l?"bottom":"right",b="y"===l?"height":"width",w=a[l],O=a[l]+f[v],j=a[l]-f[g],E=o?-m[b]/2:0,D="start"===p?u[b]:m[b];p="start"===p?-m[b]:-u[b],m=t.elements.arrow,m=o&&m?d(m):{width:0,height:0};var P=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0};v=P[v],g=P[g],m=_(0,U(u[b],m[b])),D=c?u[b]/2-E-m-v-h:D-m-v-h,u=c?-u[b]/2+E+m+g+h:p+m+g+h,c=t.elements.arrow&&y(t.elements.arrow),h=t.modifiersData.offset?t.modifiersData.offset[t.placement][l]:0,c=a[l]+D-h-(c?"y"===l?c.clientTop||0:c.clientLeft||0:0),u=a[l]+u-h,r&&(r=o?U(O,c):O,j=o?_(j,u):j,r=_(r,U(w,j)),a[l]=r,s[l]=r-w),i&&(r=(i=a[n])+f["x"===l?"top":"left"],f=i-f["x"===l?"bottom":"right"],r=o?U(r,c):r,o=o?_(f,u):f,o=_(r,U(i,o)),a[n]=o,s[n]=o-i)}t.modifiersData[e]=s}},requiresIfExists:["offset"]},oe={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,o=e.name,r=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=x(n.placement);if(e=L(s),s=0<=["left","right"].indexOf(s)?"height":"width",i&&a){r=M("number"!=typeof(r="function"==typeof(r=r.padding)?r(Object.assign({},n.rects,{placement:n.placement})):r)?r:k(r,C));var f=d(i),p="y"===e?"top":"left",c="y"===e?"bottom":"right",l=n.rects.reference[s]+n.rects.reference[e]-a[e]-n.rects.popper[s];a=a[e]-n.rects.reference[e],a=(i=(i=y(i))?"y"===e?i.clientHeight||0:i.clientWidth||0:0)/2-f[s]/2+(l/2-a/2),s=_(r[p],U(a,i-f[s]-r[c])),n.modifiersData[o]=((t={})[e]=s,t.centerOffset=s-a,t)}},effect:function(e){var t=e.state;if(null!=(e=void 0===(e=e.options.element)?"[data-popper-arrow]":e)){if("string"==typeof e&&!(e=t.elements.popper.querySelector(e)))return;O(t.elements.popper,e)&&(t.elements.arrow=e)}},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},re={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state;e=e.name;var n=t.rects.reference,o=t.rects.popper,r=t.modifiersData.preventOverflow,i=A(t,{elementContext:"reference"}),a=A(t,{altBoundary:!0});n=S(i,n),o=S(a,o,r),r=q(n),a=q(o),t.modifiersData[e]={referenceClippingOffsets:n,popperEscapeOffsets:o,isReferenceHidden:r,hasPopperEscaped:a},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":r,"data-popper-escaped":a})}},ie=B({defaultModifiers:[Y,G,K,Q]}),ae=[Y,G,K,Q,Z,te,ne,oe,re],se=B({defaultModifiers:ae});e.applyStyles=Q,e.arrow=oe,e.computeStyles=K,e.createPopper=se,e.createPopperLite=ie,e.defaultModifiers=ae,e.detectOverflow=A,e.eventListeners=Y,e.flip=te,e.hide=re,e.offset=Z,e.popperGenerator=B,e.popperOffsets=G,e.preventOverflow=ne,Object.defineProperty(e,"__esModule",{value:!0})})); +//# sourceMappingURL=popper.min.js.map diff --git a/js/001-lib/tippy-bundle.umd.min.js b/js/001-lib/tippy-bundle.umd.min.js new file mode 100644 index 0000000000000000000000000000000000000000..d44f7123625defca481a17c9679c87f96e06eece --- /dev/null +++ b/js/001-lib/tippy-bundle.umd.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],e):(t=t||self).tippy=e(t.Popper)}(this,(function(t){"use strict";var e="undefined"!=typeof window&&"undefined"!=typeof document,n=e?navigator.userAgent:"",r=/MSIE |Trident\//.test(n),i={passive:!0,capture:!0};function o(t,e,n){if(Array.isArray(t)){var r=t[e];return null==r?Array.isArray(n)?n[e]:n:r}return t}function a(t,e){var n={}.toString.call(t);return 0===n.indexOf("[object")&&n.indexOf(e+"]")>-1}function s(t,e){return"function"==typeof t?t.apply(void 0,e):t}function p(t,e){return 0===e?t:function(r){clearTimeout(n),n=setTimeout((function(){t(r)}),e)};var n}function u(t,e){var n=Object.assign({},t);return e.forEach((function(t){delete n[t]})),n}function c(t){return[].concat(t)}function f(t,e){-1===t.indexOf(e)&&t.push(e)}function l(t){return t.split("-")[0]}function d(t){return[].slice.call(t)}function v(){return document.createElement("div")}function m(t){return["Element","Fragment"].some((function(e){return a(t,e)}))}function g(t){return a(t,"MouseEvent")}function h(t){return!(!t||!t._tippy||t._tippy.reference!==t)}function b(t){return m(t)?[t]:function(t){return a(t,"NodeList")}(t)?d(t):Array.isArray(t)?t:d(document.querySelectorAll(t))}function y(t,e){t.forEach((function(t){t&&(t.style.transitionDuration=e+"ms")}))}function w(t,e){t.forEach((function(t){t&&t.setAttribute("data-state",e)}))}function x(t){var e,n=c(t)[0];return(null==n||null==(e=n.ownerDocument)?void 0:e.body)?n.ownerDocument:document}function E(t,e,n){var r=e+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(e){t[r](e,n)}))}var O={isTouch:!1},C=0;function T(){O.isTouch||(O.isTouch=!0,window.performance&&document.addEventListener("mousemove",A))}function A(){var t=performance.now();t-C<20&&(O.isTouch=!1,document.removeEventListener("mousemove",A)),C=t}function L(){var t=document.activeElement;if(h(t)){var e=t._tippy;t.blur&&!e.state.isVisible&&t.blur()}}var D=Object.assign({appendTo:function(){return document.body},aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(D);function R(t){var e=(t.plugins||[]).reduce((function(e,n){var r=n.name,i=n.defaultValue;return r&&(e[r]=void 0!==t[r]?t[r]:i),e}),{});return Object.assign({},t,{},e)}function j(t,e){var n=Object.assign({},e,{content:s(e.content,[t])},e.ignoreAttributes?{}:function(t,e){return(e?Object.keys(R(Object.assign({},D,{plugins:e}))):k).reduce((function(e,n){var r=(t.getAttribute("data-tippy-"+n)||"").trim();if(!r)return e;if("content"===n)e[n]=r;else try{e[n]=JSON.parse(r)}catch(t){e[n]=r}return e}),{})}(t,e.plugins));return n.aria=Object.assign({},D.aria,{},n.aria),n.aria={expanded:"auto"===n.aria.expanded?e.interactive:n.aria.expanded,content:"auto"===n.aria.content?e.interactive?null:"describedby":n.aria.content},n}function M(t,e){t.innerHTML=e}function P(t){var e=v();return!0===t?e.className="tippy-arrow":(e.className="tippy-svg-arrow",m(t)?e.appendChild(t):M(e,t)),e}function V(t,e){m(e.content)?(M(t,""),t.appendChild(e.content)):"function"!=typeof e.content&&(e.allowHTML?M(t,e.content):t.textContent=e.content)}function I(t){var e=t.firstElementChild,n=d(e.children);return{box:e,content:n.find((function(t){return t.classList.contains("tippy-content")})),arrow:n.find((function(t){return t.classList.contains("tippy-arrow")||t.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(t){return t.classList.contains("tippy-backdrop")}))}}function S(t){var e=v(),n=v();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=v();function i(n,r){var i=I(e),o=i.box,a=i.content,s=i.arrow;r.theme?o.setAttribute("data-theme",r.theme):o.removeAttribute("data-theme"),"string"==typeof r.animation?o.setAttribute("data-animation",r.animation):o.removeAttribute("data-animation"),r.inertia?o.setAttribute("data-inertia",""):o.removeAttribute("data-inertia"),o.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?o.setAttribute("role",r.role):o.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||V(a,t.props),r.arrow?s?n.arrow!==r.arrow&&(o.removeChild(s),o.appendChild(P(r.arrow))):o.appendChild(P(r.arrow)):s&&o.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),V(r,t.props),e.appendChild(n),n.appendChild(r),i(t.props,t.props),{popper:e,onUpdate:i}}S.$$tippy=!0;var B=1,H=[],N=[];function U(e,n){var a,u,m,h,b,C,T,A,L,k=j(e,Object.assign({},D,{},R((a=n,Object.keys(a).reduce((function(t,e){return void 0!==a[e]&&(t[e]=a[e]),t}),{}))))),M=!1,P=!1,V=!1,S=!1,U=[],_=p(bt,k.interactiveDebounce),z=B++,F=(L=k.plugins).filter((function(t,e){return L.indexOf(t)===e})),W={id:z,reference:e,popper:v(),popperInstance:null,props:k,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:F,clearDelayTimeouts:function(){clearTimeout(u),clearTimeout(m),cancelAnimationFrame(h)},setProps:function(t){if(W.state.isDestroyed)return;it("onBeforeUpdate",[W,t]),gt();var n=W.props,r=j(e,Object.assign({},W.props,{},t,{ignoreAttributes:!0}));W.props=r,mt(),n.interactiveDebounce!==r.interactiveDebounce&&(st(),_=p(bt,r.interactiveDebounce));n.triggerTarget&&!r.triggerTarget?c(n.triggerTarget).forEach((function(t){t.removeAttribute("aria-expanded")})):r.triggerTarget&&e.removeAttribute("aria-expanded");at(),rt(),q&&q(n,r);W.popperInstance&&(Et(),Ct().forEach((function(t){requestAnimationFrame(t._tippy.popperInstance.forceUpdate)})));it("onAfterUpdate",[W,t])},setContent:function(t){W.setProps({content:t})},show:function(){var t=W.state.isVisible,e=W.state.isDestroyed,n=!W.state.isEnabled,r=O.isTouch&&!W.props.touch,i=o(W.props.duration,0,D.duration);if(t||e||n||r)return;if(Z().hasAttribute("disabled"))return;if(it("onShow",[W],!1),!1===W.props.onShow(W))return;W.state.isVisible=!0,Q()&&(Y.style.visibility="visible");rt(),ft(),W.state.isMounted||(Y.style.transition="none");if(Q()){var a=et(),p=a.box,u=a.content;y([p,u],0)}T=function(){var t;if(W.state.isVisible&&!S){if(S=!0,Y.offsetHeight,Y.style.transition=W.props.moveTransition,Q()&&W.props.animation){var e=et(),n=e.box,r=e.content;y([n,r],i),w([n,r],"visible")}ot(),at(),f(N,W),null==(t=W.popperInstance)||t.forceUpdate(),W.state.isMounted=!0,it("onMount",[W]),W.props.animation&&Q()&&function(t,e){dt(t,e)}(i,(function(){W.state.isShown=!0,it("onShown",[W])}))}},function(){var t,e=W.props.appendTo,n=Z();t=W.props.interactive&&e===D.appendTo||"parent"===e?n.parentNode:s(e,[n]);t.contains(Y)||t.appendChild(Y);Et()}()},hide:function(){var t=!W.state.isVisible,e=W.state.isDestroyed,n=!W.state.isEnabled,r=o(W.props.duration,1,D.duration);if(t||e||n)return;if(it("onHide",[W],!1),!1===W.props.onHide(W))return;W.state.isVisible=!1,W.state.isShown=!1,S=!1,M=!1,Q()&&(Y.style.visibility="hidden");if(st(),lt(),rt(),Q()){var i=et(),a=i.box,s=i.content;W.props.animation&&(y([a,s],r),w([a,s],"hidden"))}ot(),at(),W.props.animation?Q()&&function(t,e){dt(t,(function(){!W.state.isVisible&&Y.parentNode&&Y.parentNode.contains(Y)&&e()}))}(r,W.unmount):W.unmount()},hideWithInteractivity:function(t){tt().addEventListener("mousemove",_),f(H,_),_(t)},enable:function(){W.state.isEnabled=!0},disable:function(){W.hide(),W.state.isEnabled=!1},unmount:function(){W.state.isVisible&&W.hide();if(!W.state.isMounted)return;Ot(),Ct().forEach((function(t){t._tippy.unmount()})),Y.parentNode&&Y.parentNode.removeChild(Y);N=N.filter((function(t){return t!==W})),W.state.isMounted=!1,it("onHidden",[W])},destroy:function(){if(W.state.isDestroyed)return;W.clearDelayTimeouts(),W.unmount(),gt(),delete e._tippy,W.state.isDestroyed=!0,it("onDestroy",[W])}};if(!k.render)return W;var X=k.render(W),Y=X.popper,q=X.onUpdate;Y.setAttribute("data-tippy-root",""),Y.id="tippy-"+W.id,W.popper=Y,e._tippy=W,Y._tippy=W;var $=F.map((function(t){return t.fn(W)})),J=e.hasAttribute("aria-expanded");return mt(),at(),rt(),it("onCreate",[W]),k.showOnCreate&&Tt(),Y.addEventListener("mouseenter",(function(){W.props.interactive&&W.state.isVisible&&W.clearDelayTimeouts()})),Y.addEventListener("mouseleave",(function(t){W.props.interactive&&W.props.trigger.indexOf("mouseenter")>=0&&(tt().addEventListener("mousemove",_),_(t))})),W;function G(){var t=W.props.touch;return Array.isArray(t)?t:[t,0]}function K(){return"hold"===G()[0]}function Q(){var t;return!!(null==(t=W.props.render)?void 0:t.$$tippy)}function Z(){return A||e}function tt(){var t=Z().parentNode;return t?x(t):document}function et(){return I(Y)}function nt(t){return W.state.isMounted&&!W.state.isVisible||O.isTouch||b&&"focus"===b.type?0:o(W.props.delay,t?0:1,D.delay)}function rt(){Y.style.pointerEvents=W.props.interactive&&W.state.isVisible?"":"none",Y.style.zIndex=""+W.props.zIndex}function it(t,e,n){var r;(void 0===n&&(n=!0),$.forEach((function(n){n[t]&&n[t].apply(void 0,e)})),n)&&(r=W.props)[t].apply(r,e)}function ot(){var t=W.props.aria;if(t.content){var n="aria-"+t.content,r=Y.id;c(W.props.triggerTarget||e).forEach((function(t){var e=t.getAttribute(n);if(W.state.isVisible)t.setAttribute(n,e?e+" "+r:r);else{var i=e&&e.replace(r,"").trim();i?t.setAttribute(n,i):t.removeAttribute(n)}}))}}function at(){!J&&W.props.aria.expanded&&c(W.props.triggerTarget||e).forEach((function(t){W.props.interactive?t.setAttribute("aria-expanded",W.state.isVisible&&t===Z()?"true":"false"):t.removeAttribute("aria-expanded")}))}function st(){tt().removeEventListener("mousemove",_),H=H.filter((function(t){return t!==_}))}function pt(t){if(!(O.isTouch&&(V||"mousedown"===t.type)||W.props.interactive&&Y.contains(t.target))){if(Z().contains(t.target)){if(O.isTouch)return;if(W.state.isVisible&&W.props.trigger.indexOf("click")>=0)return}else it("onClickOutside",[W,t]);!0===W.props.hideOnClick&&(W.clearDelayTimeouts(),W.hide(),P=!0,setTimeout((function(){P=!1})),W.state.isMounted||lt())}}function ut(){V=!0}function ct(){V=!1}function ft(){var t=tt();t.addEventListener("mousedown",pt,!0),t.addEventListener("touchend",pt,i),t.addEventListener("touchstart",ct,i),t.addEventListener("touchmove",ut,i)}function lt(){var t=tt();t.removeEventListener("mousedown",pt,!0),t.removeEventListener("touchend",pt,i),t.removeEventListener("touchstart",ct,i),t.removeEventListener("touchmove",ut,i)}function dt(t,e){var n=et().box;function r(t){t.target===n&&(E(n,"remove",r),e())}if(0===t)return e();E(n,"remove",C),E(n,"add",r),C=r}function vt(t,n,r){void 0===r&&(r=!1),c(W.props.triggerTarget||e).forEach((function(e){e.addEventListener(t,n,r),U.push({node:e,eventType:t,handler:n,options:r})}))}function mt(){var t;K()&&(vt("touchstart",ht,{passive:!0}),vt("touchend",yt,{passive:!0})),(t=W.props.trigger,t.split(/\s+/).filter(Boolean)).forEach((function(t){if("manual"!==t)switch(vt(t,ht),t){case"mouseenter":vt("mouseleave",yt);break;case"focus":vt(r?"focusout":"blur",wt);break;case"focusin":vt("focusout",wt)}}))}function gt(){U.forEach((function(t){var e=t.node,n=t.eventType,r=t.handler,i=t.options;e.removeEventListener(n,r,i)})),U=[]}function ht(t){var e,n=!1;if(W.state.isEnabled&&!xt(t)&&!P){var r="focus"===(null==(e=b)?void 0:e.type);b=t,A=t.currentTarget,at(),!W.state.isVisible&&g(t)&&H.forEach((function(e){return e(t)})),"click"===t.type&&(W.props.trigger.indexOf("mouseenter")<0||M)&&!1!==W.props.hideOnClick&&W.state.isVisible?n=!0:Tt(t),"click"===t.type&&(M=!n),n&&!r&&At(t)}}function bt(t){var e=t.target,n=Z().contains(e)||Y.contains(e);"mousemove"===t.type&&n||function(t,e){var n=e.clientX,r=e.clientY;return t.every((function(t){var e=t.popperRect,i=t.popperState,o=t.props.interactiveBorder,a=l(i.placement),s=i.modifiersData.offset;if(!s)return!0;var p="bottom"===a?s.top.y:0,u="top"===a?s.bottom.y:0,c="right"===a?s.left.x:0,f="left"===a?s.right.x:0,d=e.top-r+p>o,v=r-e.bottom-u>o,m=e.left-n+c>o,g=n-e.right-f>o;return d||v||m||g}))}(Ct().concat(Y).map((function(t){var e,n=null==(e=t._tippy.popperInstance)?void 0:e.state;return n?{popperRect:t.getBoundingClientRect(),popperState:n,props:k}:null})).filter(Boolean),t)&&(st(),At(t))}function yt(t){xt(t)||W.props.trigger.indexOf("click")>=0&&M||(W.props.interactive?W.hideWithInteractivity(t):At(t))}function wt(t){W.props.trigger.indexOf("focusin")<0&&t.target!==Z()||W.props.interactive&&t.relatedTarget&&Y.contains(t.relatedTarget)||At(t)}function xt(t){return!!O.isTouch&&K()!==t.type.indexOf("touch")>=0}function Et(){Ot();var n=W.props,r=n.popperOptions,i=n.placement,o=n.offset,a=n.getReferenceClientRect,s=n.moveTransition,p=Q()?I(Y).arrow:null,u=a?{getBoundingClientRect:a,contextElement:a.contextElement||Z()}:e,c=[{name:"offset",options:{offset:o}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(t){var e=t.state;if(Q()){var n=et().box;["placement","reference-hidden","escaped"].forEach((function(t){"placement"===t?n.setAttribute("data-placement",e.placement):e.attributes.popper["data-popper-"+t]?n.setAttribute("data-"+t,""):n.removeAttribute("data-"+t)})),e.attributes.popper={}}}}];Q()&&p&&c.push({name:"arrow",options:{element:p,padding:3}}),c.push.apply(c,(null==r?void 0:r.modifiers)||[]),W.popperInstance=t.createPopper(u,Y,Object.assign({},r,{placement:i,onFirstUpdate:T,modifiers:c}))}function Ot(){W.popperInstance&&(W.popperInstance.destroy(),W.popperInstance=null)}function Ct(){return d(Y.querySelectorAll("[data-tippy-root]"))}function Tt(t){W.clearDelayTimeouts(),t&&it("onTrigger",[W,t]),ft();var e=nt(!0),n=G(),r=n[0],i=n[1];O.isTouch&&"hold"===r&&i&&(e=i),e?u=setTimeout((function(){W.show()}),e):W.show()}function At(t){if(W.clearDelayTimeouts(),it("onUntrigger",[W,t]),W.state.isVisible){if(!(W.props.trigger.indexOf("mouseenter")>=0&&W.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(t.type)>=0&&M)){var e=nt(!1);e?m=setTimeout((function(){W.state.isVisible&&W.hide()}),e):h=requestAnimationFrame((function(){W.hide()}))}}else lt()}}function _(t,e){void 0===e&&(e={});var n=D.plugins.concat(e.plugins||[]);document.addEventListener("touchstart",T,i),window.addEventListener("blur",L);var r=Object.assign({},e,{plugins:n}),o=b(t).reduce((function(t,e){var n=e&&U(e,r);return n&&t.push(n),t}),[]);return m(t)?o[0]:o}_.defaultProps=D,_.setDefaultProps=function(t){Object.keys(t).forEach((function(e){D[e]=t[e]}))},_.currentInput=O;var z=Object.assign({},t.applyStyles,{effect:function(t){var e=t.state,n={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(e.elements.popper.style,n.popper),e.styles=n,e.elements.arrow&&Object.assign(e.elements.arrow.style,n.arrow)}}),F={mouseover:"mouseenter",focusin:"focus",click:"click"};var W={name:"animateFill",defaultValue:!1,fn:function(t){var e;if(!(null==(e=t.props.render)?void 0:e.$$tippy))return{};var n=I(t.popper),r=n.box,i=n.content,o=t.props.animateFill?function(){var t=v();return t.className="tippy-backdrop",w([t],"hidden"),t}():null;return{onCreate:function(){o&&(r.insertBefore(o,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",t.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(o){var t=r.style.transitionDuration,e=Number(t.replace("ms",""));i.style.transitionDelay=Math.round(e/10)+"ms",o.style.transitionDuration=t,w([o],"visible")}},onShow:function(){o&&(o.style.transitionDuration="0ms")},onHide:function(){o&&w([o],"hidden")}}}};var X={clientX:0,clientY:0},Y=[];function q(t){var e=t.clientX,n=t.clientY;X={clientX:e,clientY:n}}var $={name:"followCursor",defaultValue:!1,fn:function(t){var e=t.reference,n=x(t.props.triggerTarget||e),r=!1,i=!1,o=!0,a=t.props;function s(){return"initial"===t.props.followCursor&&t.state.isVisible}function p(){n.addEventListener("mousemove",f)}function u(){n.removeEventListener("mousemove",f)}function c(){r=!0,t.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||e.contains(n.target),i=t.props.followCursor,o=n.clientX,a=n.clientY,s=e.getBoundingClientRect(),p=o-s.left,u=a-s.top;!r&&t.props.interactive||t.setProps({getReferenceClientRect:function(){var t=e.getBoundingClientRect(),n=o,r=a;"initial"===i&&(n=t.left+p,r=t.top+u);var s="horizontal"===i?t.top:r,c="vertical"===i?t.right:n,f="horizontal"===i?t.bottom:r,l="vertical"===i?t.left:n;return{width:c-l,height:f-s,top:s,right:c,bottom:f,left:l}}})}function l(){t.props.followCursor&&(Y.push({instance:t,doc:n}),function(t){t.addEventListener("mousemove",q)}(n))}function d(){0===(Y=Y.filter((function(e){return e.instance!==t}))).filter((function(t){return t.doc===n})).length&&function(t){t.removeEventListener("mousemove",q)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=t.props},onAfterUpdate:function(e,n){var o=n.followCursor;r||void 0!==o&&a.followCursor!==o&&(d(),o?(l(),!t.state.isMounted||i||s()||p()):(u(),c()))},onMount:function(){t.props.followCursor&&!i&&(o&&(f(X),o=!1),s()||p())},onTrigger:function(t,e){g(e)&&(X={clientX:e.clientX,clientY:e.clientY}),i="focus"===e.type},onHidden:function(){t.props.followCursor&&(c(),u(),o=!0)}}}};var J={name:"inlinePositioning",defaultValue:!1,fn:function(t){var e,n=t.reference;var r=-1,i=!1,o={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(i){var o=i.state;t.props.inlinePositioning&&(e!==o.placement&&t.setProps({getReferenceClientRect:function(){return function(t){return function(t,e,n,r){if(n.length<2||null===t)return e;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||e;switch(t){case"top":case"bottom":var i=n[0],o=n[n.length-1],a="top"===t,s=i.top,p=o.bottom,u=a?i.left:o.left,c=a?i.right:o.right;return{top:s,bottom:p,left:u,right:c,width:c-u,height:p-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(t){return t.left}))),l=Math.max.apply(Math,n.map((function(t){return t.right}))),d=n.filter((function(e){return"left"===t?e.left===f:e.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return e}}(l(t),n.getBoundingClientRect(),d(n.getClientRects()),r)}(o.placement)}}),e=o.placement)}};function a(){var e;i||(e=function(t,e){var n;return{popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat(((null==(n=t.popperOptions)?void 0:n.modifiers)||[]).filter((function(t){return t.name!==e.name})),[e])})}}(t.props,o),i=!0,t.setProps(e),i=!1)}return{onCreate:a,onAfterUpdate:a,onTrigger:function(e,n){if(g(n)){var i=d(t.reference.getClientRects()),o=i.find((function(t){return t.left-2<=n.clientX&&t.right+2>=n.clientX&&t.top-2<=n.clientY&&t.bottom+2>=n.clientY}));r=i.indexOf(o)}},onUntrigger:function(){r=-1}}}};var G={name:"sticky",defaultValue:!1,fn:function(t){var e=t.reference,n=t.popper;function r(e){return!0===t.props.sticky||t.props.sticky===e}var i=null,o=null;function a(){var s=r("reference")?(t.popperInstance?t.popperInstance.state.elements.reference:e).getBoundingClientRect():null,p=r("popper")?n.getBoundingClientRect():null;(s&&K(i,s)||p&&K(o,p))&&t.popperInstance&&t.popperInstance.update(),i=s,o=p,t.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){t.props.sticky&&a()}}}};function K(t,e){return!t||!e||(t.top!==e.top||t.right!==e.right||t.bottom!==e.bottom||t.left!==e.left)}return e&&function(t){var e=document.createElement("style");e.textContent=t,e.setAttribute("data-tippy-stylesheet","");var n=document.head,r=document.querySelector("head>style,head>link");r?n.insertBefore(e,r):n.appendChild(e)}('.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}'),_.setDefaultProps({plugins:[W,$,J,G],render:S}),_.createSingleton=function(t,e){var n;void 0===e&&(e={});var r,i=t,o=[],a=e.overrides,s=[],p=!1;function c(){o=i.map((function(t){return t.reference}))}function f(t){i.forEach((function(e){t?e.enable():e.disable()}))}function l(t){return i.map((function(e){var n=e.setProps;return e.setProps=function(i){n(i),e.reference===r&&t.setProps(i)},function(){e.setProps=n}}))}function d(t,e){var n=o.indexOf(e);if(e!==r){r=e;var s=(a||[]).concat("content").reduce((function(t,e){return t[e]=i[n].props[e],t}),{});t.setProps(Object.assign({},s,{getReferenceClientRect:"function"==typeof s.getReferenceClientRect?s.getReferenceClientRect:function(){return e.getBoundingClientRect()}}))}}f(!1),c();var m={fn:function(){return{onDestroy:function(){f(!0)},onHidden:function(){r=null},onClickOutside:function(t){t.props.showOnCreate&&!p&&(p=!0,r=null)},onShow:function(t){t.props.showOnCreate&&!p&&(p=!0,d(t,o[0]))},onTrigger:function(t,e){d(t,e.currentTarget)}}}},g=_(v(),Object.assign({},u(e,["overrides"]),{plugins:[m].concat(e.plugins||[]),triggerTarget:o,popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat((null==(n=e.popperOptions)?void 0:n.modifiers)||[],[z])})})),h=g.show;g.show=function(t){if(h(),!r&&null==t)return d(g,o[0]);if(!r||null!=t){if("number"==typeof t)return o[t]&&d(g,o[t]);if(i.includes(t)){var e=t.reference;return d(g,e)}return o.includes(t)?d(g,t):void 0}},g.showNext=function(){var t=o[0];if(!r)return g.show(0);var e=o.indexOf(r);g.show(o[e+1]||t)},g.showPrevious=function(){var t=o[o.length-1];if(!r)return g.show(t);var e=o.indexOf(r),n=o[e-1]||t;g.show(n)};var b=g.setProps;return g.setProps=function(t){a=t.overrides||a,b(t)},g.setInstances=function(t){f(!0),s.forEach((function(t){return t()})),i=t,f(!1),c(),l(g),g.setProps({triggerTarget:o})},s=l(g),g},_.delegate=function(t,e){var n=[],r=[],o=!1,a=e.target,s=u(e,["target"]),p=Object.assign({},s,{trigger:"manual",touch:!1}),f=Object.assign({},s,{showOnCreate:!0}),l=_(t,p);function d(t){if(t.target&&!o){var n=t.target.closest(a);if(n){var i=n.getAttribute("data-tippy-trigger")||e.trigger||D.trigger;if(!n._tippy&&!("touchstart"===t.type&&"boolean"==typeof f.touch||"touchstart"!==t.type&&i.indexOf(F[t.type])<0)){var s=_(n,f);s&&(r=r.concat(s))}}}}function v(t,e,r,i){void 0===i&&(i=!1),t.addEventListener(e,r,i),n.push({node:t,eventType:e,handler:r,options:i})}return c(l).forEach((function(t){var e=t.destroy,a=t.enable,s=t.disable;t.destroy=function(t){void 0===t&&(t=!0),t&&r.forEach((function(t){t.destroy()})),r=[],n.forEach((function(t){var e=t.node,n=t.eventType,r=t.handler,i=t.options;e.removeEventListener(n,r,i)})),n=[],e()},t.enable=function(){a(),r.forEach((function(t){return t.enable()})),o=!1},t.disable=function(){s(),r.forEach((function(t){return t.disable()})),o=!0},function(t){var e=t.reference;v(e,"touchstart",d,i),v(e,"mouseover",d),v(e,"focusin",d),v(e,"click",d)}(t)})),l},_.hideAll=function(t){var e=void 0===t?{}:t,n=e.exclude,r=e.duration;N.forEach((function(t){var e=!1;if(n&&(e=h(n)?t.reference===n:t.popper===n.popper),!e){var i=t.props.duration;t.setProps({duration:r}),t.hide(),t.state.isDestroyed||t.setProps({duration:i})}}))},_.roundArrow='<svg width="16" height="6" xmlns="http://www.w3.org/2000/svg"><path d="M0 6s1.796-.013 4.67-3.615C5.851.9 6.93.006 8 0c1.07-.006 2.148.887 3.343 2.385C14.233 6.005 16 6 16 6H0z"></svg>',_})); +//# sourceMappingURL=tippy-bundle.umd.min.js.map diff --git a/js/002-config/fc-js-init.js b/js/002-config/fc-js-init.js index 326ce62de2af6fb1f208ef236edfa4db51b1c089..140abbe03acf1d48c7f4bf9f8b66081388857563 100644 --- a/js/002-config/fc-js-init.js +++ b/js/002-config/fc-js-init.js @@ -22,6 +22,7 @@ App.Data.HeroSlaves = {}; App.Data.Policies = {}; App.Data.Policies.Selection = {}; App.Data.SecExp = {}; +App.Data.Slave = {}; App.Data.Weather = {}; App.Debug = {}; App.Desc = {}; @@ -60,7 +61,6 @@ App.Medicine.OrganFarm = {}; App.Medicine.Salon = {}; App.Medicine.Surgery = {}; App.RA = {}; -App.Reminders = {}; App.SF = {}; App.SecExp = {}; App.SlaveAssignment = {}; diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js index 1adec9668749525c974833a84182060d9eca2ab8..e1cebc9bf31f26d2c27a825565e79546585b189a 100644 --- a/js/003-data/gameVariableData.js +++ b/js/003-data/gameVariableData.js @@ -482,6 +482,7 @@ App.Data.resetOnNGPlus = { /** @type {FC.SlaveStateOrZero} */ activeSlave: 0, activeChild: 0, + /** @type {Array<FC.ReminderEntry>} */ reminders: [], /** @type {FC.SlaveStateOrZero} */ diff --git a/js/003-data/policiesData.js b/js/003-data/policiesData.js index 10cd6c76a9c17a578214b594bcf940244500d3fc..1724e461df317c96bbeef91cca238254591a3cb2 100644 --- a/js/003-data/policiesData.js +++ b/js/003-data/policiesData.js @@ -3,7 +3,7 @@ * @property {string} title The title of the policy as displayed in the UI, "Health Inspection SMR" * @property {string} [titleClass] The class to apply to the title: "lime" * @property {string} [activatedTitle] The title of the policy if the policy is active. Param "title" is used as a fallback. - * @property {string} text Text that describes the policy in detail. No initial cap, ends with punctuation. + * @property {string|DocumentFragment} text Text that describes the policy in detail. No initial cap, ends with punctuation. * @property {string} [activatedText] Text that describes an active policy in detail. Uses param "text" as a fallback. * @property {boolean} [requirements] Function to determine if a policy can be enabled. * @property {function(void):void} [onImplementation] Beyond applying the policy itself and billing the player, are there other values to change? This allows a shortstack FS policy to revoke some generic tall policies, for example. @@ -743,7 +743,7 @@ App.Data.Policies.Selection = { const age = Math.clamp(v, 20, 120); V.customRetirementAge = age; V.retirementAge = age; - policy("RetirementPolicies"); + App.UI.reload(); }, true ), @@ -773,7 +773,7 @@ App.Data.Policies.Selection = { const age = Math.clamp(v, 20, 120); V.customRetirementAge = age; V.retirementAge = age; - policy("RetirementPolicies"); + App.UI.reload(); }, true ), @@ -829,7 +829,7 @@ App.Data.Policies.Selection = { "policies.retirement.sex": [ { title: "Sexual Milestone Retirement", - get text() { return `slaves will be rewarded with their freedom once they have been fucked ${num(V.policies.retirement.sex)} times.`; }, + get text() { return `slaves will be rewarded with their freedom once they have been fucked ${V.policies.retirement.sex === 0 ? "a set number of" : num(V.policies.retirement.sex)} times.`; }, get activatedText() { const el = new DocumentFragment; let div = document.createElement("div"); @@ -842,7 +842,7 @@ App.Data.Policies.Selection = { V.policies.retirement.sex, v => { V.policies.retirement.sex = Math.clamp(v, 1, 1e7); - policy("RetirementPolicies"); + App.UI.reload(); }, true ), @@ -859,7 +859,7 @@ App.Data.Policies.Selection = { "policies.retirement.milk": [ { title: "Productive Cow Retirement", - get text() { return `slaves will be rewarded with their freedom once they have given ${num(V.policies.retirement.milk)} liters of milk.`; }, + get text() { return `slaves will be rewarded with their freedom once they have given ${V.policies.retirement.milk === 0 ? "a set number of" : num(V.policies.retirement.milk)} liters of milk.`; }, get activatedText() { const el = new DocumentFragment; let div = document.createElement("div"); @@ -872,7 +872,7 @@ App.Data.Policies.Selection = { V.policies.retirement.milk, v => { V.policies.retirement.milk = Math.clamp(v, 1, 1e8); - policy("RetirementPolicies"); + App.UI.reload(); }, true ), @@ -889,7 +889,7 @@ App.Data.Policies.Selection = { "policies.retirement.cum": [ { title: "Productive Bull Retirement", - get text() { return `slaves will be rewarded with their freedom once they have given ${num(V.policies.retirement.cum)} deciliters of cum.`; }, + get text() { return `slaves will be rewarded with their freedom once they have given ${V.policies.retirement.cum === 0 ? "a set number of" : num(V.policies.retirement.cum)} deciliters of cum.`; }, get activatedText() { const el = new DocumentFragment; let div = document.createElement("div"); @@ -902,7 +902,7 @@ App.Data.Policies.Selection = { V.policies.retirement.cum, v => { V.policies.retirement.cum = Math.clamp(v, 1, 1e9); - policy("RetirementPolicies"); + App.UI.reload(); }, true ), @@ -919,7 +919,7 @@ App.Data.Policies.Selection = { "policies.retirement.births": [ { title: "Fertile Breeder Retirement", - get text() { return `slaves will be rewarded with their freedom once they add ${num(V.policies.retirement.births)} new slaves to the population of ${V.arcologies[0].name}.`; }, + get text() { return `slaves will be rewarded with their freedom once they add ${V.policies.retirement.births === 0 ? "a set number of" : num(V.policies.retirement.births)} new slaves to the population of ${V.arcologies[0].name}.`; }, get activatedText() { const el = new DocumentFragment; let div = document.createElement("div"); @@ -932,7 +932,7 @@ App.Data.Policies.Selection = { V.policies.retirement.births, v => { V.policies.retirement.births = Math.clamp(v, 1, 1e6); - policy("RetirementPolicies"); + App.UI.reload(); }, true ), @@ -949,7 +949,7 @@ App.Data.Policies.Selection = { "policies.retirement.kills": [ { title: "Champion Gladiatrix Retirement", - get text() { return `slaves will be rewarded with their freedom once they have killed ${num(V.policies.retirement.kills)} of their fellow slaves in the pit.`; }, + get text() { return `slaves will be rewarded with their freedom once they have killed ${V.policies.retirement.kills === 0 ? "a set number of" : num(V.policies.retirement.kills)} of their fellow slaves in the pit.`; }, get activatedText() { const el = new DocumentFragment; let div = document.createElement("div"); @@ -962,7 +962,7 @@ App.Data.Policies.Selection = { V.policies.retirement.kills, v => { V.policies.retirement.kills = Math.clamp(v, 1, 1e6); - policy("RetirementPolicies"); + App.UI.reload(); }, true ), @@ -1013,7 +1013,7 @@ App.Data.Policies.Selection = { if (V.customMenialRetirementAge < 45) { V.retirementAge = V.customMenialRetirementAge; } - policy("MenialRetirementPolicies"); + App.UI.reload(); }, true ), @@ -1090,7 +1090,8 @@ App.Data.Policies.Selection = { return ( V.arcologies[0].FSSlimnessEnthusiastLaw === 0 && V.arcologies[0].FSHedonisticDecadenceLaw2 === 0 && - V.arcologies[0].FSPhysicalIdealistLaw === 0 + V.arcologies[0].FSPhysicalIdealistLaw === 0 && + V.arcologies[0].FSGenderFundamentalist > 20 ); }, } @@ -1101,6 +1102,7 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "you will do your best to remind society that a woman does not need an education to serve her man.", activatedText: "women do not need to be educated to serve their role in society.", + get requirements() { return (V.arcologies[0].FSGenderFundamentalist >= 60); }, } ], "arcologies[0].FSGenderFundamentalistSMR": [ @@ -1124,7 +1126,8 @@ App.Data.Policies.Selection = { return ( V.arcologies[0].FSSlimnessEnthusiastLaw === 0 && V.arcologies[0].FSHedonisticDecadenceLaw2 === 0 && - V.arcologies[0].FSPhysicalIdealistLaw === 0 + V.arcologies[0].FSPhysicalIdealistLaw === 0 && + V.arcologies[0].FSGenderFundamentalist > 20 ); }, } @@ -1136,7 +1139,14 @@ App.Data.Policies.Selection = { text: "you will encourage veneration of slaves with both dicks and pussies.", activatedText: "you are encouraging Gender Radicalism towards veneration of slaves with both dicks and pussies.", enable: 1, - get requirements() { return (V.seeDicks !== 0); }, + get requirements() { + return ( + V.seeDicks !== 0 && + V.seeDicks !== 100 && + V.arcologies[0].FSGenderRadicalist > 60 && + V.arcologies[0].FSGenderRadicalistLawFuta === 0 + ); + }, note: `Will affect citizens' appreciation of futas` }, { @@ -1145,7 +1155,13 @@ App.Data.Policies.Selection = { text: "you will encourage an appreciation for stiff dicks and swinging balls.", activatedText: "you are encouraging Gender Radicalism towards an appreciation for stiff dicks and swinging balls.", enable: 2, - get requirements() { return (V.seeDicks !== 0); }, + get requirements() { + return ( + V.seeDicks !== 0 && + V.arcologies[0].FSGenderRadicalist > 60 && + V.arcologies[0].FSGenderRadicalistLawFuta === 0 + ); + }, note: `Will affect slaves' attractiveness to citizens` }, { @@ -1154,7 +1170,14 @@ App.Data.Policies.Selection = { text: "you will encourage an appreciation for broad hips, plush asses, big buttholes, and skilled sphincters.", activatedText: "you are encouraging an appreciation for broad hips, plush asses, big buttholes, and skilled sphincters.", enable: 3, - get requirements() { return (V.seeDicks !== 0); }, + get requirements() { + return ( + V.seeDicks !== 0 && + V.arcologies[0].FSGenderRadicalist > 60 && + V.arcologies[0].FSSlimnessEnthusiastLaw === 0 && + V.arcologies[0].FSGenderRadicalistLawFuta === 0 + ); + }, note: `Will affect slaves' attractiveness to citizens` }, { @@ -1163,7 +1186,14 @@ App.Data.Policies.Selection = { text: "you will encourage an appreciation for cute, flat chested slaves with small male genitals and no vagina.", activatedText: "you are encouraging an appreciation for cute, flat chested slaves with small male genitals and no vagina.", enable: 4, - get requirements() { return (V.seeDicks !== 0); }, + get requirements() { + return ( + V.seeDicks !== 0 && + V.arcologies[0].FSGenderRadicalist > 60 && + V.arcologies[0].FSHedonisticDecadenceLaw2 === 0 && + V.arcologies[0].FSGenderRadicalistLawFuta === 0 + ); + }, note: `Will affect slaves' attractiveness to citizens` }, ], @@ -1175,7 +1205,7 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "the slave markets will be required to treat incoming slaves reasonably well.", activatedText: "the slave markets are required to treat incoming slaves reasonably well.", - get requirements() { return (V.arcologies[0].FSDegradationistSMR === 0); }, + get requirements() { return (V.arcologies[0].FSDegradationistSMR === 0 && V.arcologies[0].FSPaternalist >= 40); }, note: `Will reduce the arcology's prosperity and help advance Paternalism` } ], @@ -1197,7 +1227,7 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "slave markets will be required to punish new slaves severely simply to introduce them to pain.", activatedText: "slave markets are required to punish new slaves severely simply to introduce them to pain.", - get requirements() { return (V.arcologies[0].FSPaternalistSMR === 0); }, + get requirements() { return (V.arcologies[0].FSPaternalistSMR === 0 && V.arcologies[0].FSDegradationist >= 40); }, note: `Will help advance Degradationism` } ], @@ -1219,7 +1249,7 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "in order to be sold in the arcology, slaves will need to fail a simple intelligence test.", activatedText: "in order to be sold in the arcology, slaves must fail a simple intelligence test.", - get requirements() { return (V.arcologies[0].FSSlaveProfessionalismSMR === 0); }, + get requirements() { return (V.arcologies[0].FSIntellectualDependency >= 40); }, onImplementation: function() { V.policies.SMR.intelligence.basicSMR = 0; V.policies.SMR.intelligence.qualitySMR = 0; @@ -1259,7 +1289,7 @@ App.Data.Policies.Selection = { title: "Head Start SMR", titleClass: "lime", text: "in order to be sold in the arcology, slaves must pass a rigorous course designed to bring their skills and poise up to standard.", - get requirements() { return (V.arcologies[0].FSIntellectualDependencySMR === 0); }, + get requirements() { return (V.arcologies[0].FSIntellectualDependencySMR === 0 && V.arcologies[0].FSSlaveProfessionalism >= 40); }, note: `Will help advance Slave Professionalism` } ], @@ -1286,7 +1316,8 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "in order to be sold in your arcology, slaves will be stripped of implants and body modifications.", activatedText: "in order to be sold in your arcology, slaves must be stripped of implants and body modifications.", - note: `Will help advance Body Purism` + note: `Will help advance Body Purism`, + get requirements() { return (V.arcologies[0].FSBodyPurist >= 40); }, } ], "arcologies[0].FSBodyPuristLaw": [ @@ -1320,7 +1351,8 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "in order to be sold in your arcology, slaves must be given a set of fake tits and ass.", activatedText: "in order to be sold in your arcology, slaves must be given a set of fake tits and ass.", - note: `Will help advance Transformation Fetishism` + note: `Will help advance Transformation Fetishism`, + get requirements() { return (V.arcologies[0].FSTransformationFetishist >= 40); }, } ], }, @@ -1331,7 +1363,8 @@ App.Data.Policies.Selection = { titleClass: "lime", text: " slave markets in your arcology are required to treat younger slaves carefully.", activatedText: "slave markets in your arcology are required to treat younger slaves carefully.", - note: `Will help advance Youth Preferentialism` + note: `Will help advance Youth Preferentialism`, + get requirements() { return (V.arcologies[0].FSYouthPreferentialist >= 40); }, } ], "arcologies[0].FSYouthPreferentialistLaw": [ @@ -1352,7 +1385,8 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "slave markets in your arcology will be required to treat mature slaves properly.", activatedText: "slave markets in your arcology are required to treat mature slaves properly.", - note: `Will help advance Maturity Preferentialism` + note: `Will help advance Maturity Preferentialism`, + get requirements() { return (V.arcologies[0].FSMaturityPreferentialist >= 40); }, } ], "arcologies[0].FSMaturityPreferentialistLaw": [ @@ -1373,7 +1407,7 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "in order to be sold in the arcology, slaves will have to pass height requirements.", activatedText: "in order to be sold in the arcology, slaves must pass height requirements.", - get requirements() { return (V.arcologies[0].FSStatuesqueGlorificationSMR === 0); }, + get requirements() { return (V.arcologies[0].FSPetiteAdmiration >= 40); }, onImplementation: function() { if (V.policies.SMR.height.advancedSMR > 0) { V.policies.SMR.height.advancedSMR = 0; @@ -1433,7 +1467,8 @@ App.Data.Policies.Selection = { t += ` and will repeal interfering height regulations`; } return t; - } + }, + get requirements() { return (V.arcologies[0].FSStatuesqueGlorification >= 40); }, } ], "arcologies[0].FSStatuesqueGlorificationLaw2": [ @@ -1463,6 +1498,7 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "in order to be sold in the arcology, chubby slaves will have to be forced to work out first.", activatedText: "in order to be sold in the arcology, chubby slaves must be forced to work out first.", + get requirements() { return (V.arcologies[0].FSSlimnessEnthusiast >= 40); }, } ], "arcologies[0].FSSlimnessEnthusiastLaw": [ @@ -1477,7 +1513,8 @@ App.Data.Policies.Selection = { V.arcologies[0].FSGenderFundamentalistLawBeauty === 0 && V.arcologies[0].FSGenderRadicalistLawFuta !== 3 && V.arcologies[0].FSHedonisticDecadenceLaw2 === 0 && - V.arcologies[0].FSPhysicalIdealistLaw === 0 + V.arcologies[0].FSPhysicalIdealistLaw === 0 && + V.arcologies[0].FSSlimnessEnthusiast > 20 ); }, note: `Flat slaves will enjoy increased attractiveness to citizens` @@ -1491,6 +1528,7 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "in order to be sold in the arcology, slaves will have to have their assets expanded with growth hormones.", activatedText: "in order to be sold in the arcology, slaves must have their assets expanded with growth hormones.", + get requirements() { return (V.arcologies[0].FSAssetExpansionist >= 40); }, } ], }, @@ -1501,7 +1539,8 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "in order to be sold in the arcology, slaves will be required to be actively lactating.", activatedText: "in order to be sold in the arcology, slaves must be actively lactating.", - note: `Will help advance Pastoralism` + note: `Will help advance Pastoralism`, + get requirements() { return (V.arcologies[0].FSPastoralist >= 40); }, } ], "arcologies[0].FSPastoralistLaw": [ @@ -1538,7 +1577,8 @@ App.Data.Policies.Selection = { } return t; }, - note: `Will help advance Physical Idealism` + note: `Will help advance Physical Idealism`, + get requirements() { return (V.arcologies[0].FSPhysicalIdealist >= 40); }, } ], "arcologies[0].FSPhysicalIdealistLaw": [ @@ -1578,7 +1618,8 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "in order to be sold in the arcology, slaves will be required to be plump.", activatedText: "in order to be sold in the arcology, slaves must be plump.", - note: `Will help advance Hedonistic Decadence` + note: `Will help advance Hedonistic Decadence`, + get requirements() { return (V.arcologies[0].FSHedonisticDecadence >= 40); }, } ], "arcologies[0].FSHedonisticDecadenceLaw2": [ @@ -1628,7 +1669,8 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "in order to be sold in the arcology, slaves will be offered for public use for a single day.", activatedText: "in order to be sold in the arcology, slaves must be offered for public use for a single day.", - note: `Will help advance Chattel Religionism` + note: `Will help advance Chattel Religionism`, + get requirements() { return (V.arcologies[0].FSChattelReligionist >= 40); }, } ], "arcologies[0].FSChattelReligionistLaw": [ @@ -1724,7 +1766,8 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "slave markets are encouraged to immediately dispose of low quality menial slaves in gladiatorial combats.", activatedText: "slave markets are encouraged to immediately dispose of low quality menial slaves in gladiatorial combats.", - note: `Will help advance Roman Revivalism` + note: `Will help advance Roman Revivalism`, + get requirements() { return (V.arcologies[0].FSRomanRevivalist >= 40); }, } ], "arcologies[0].FSRomanRevivalistLaw": [ @@ -1745,7 +1788,8 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "all captured and incorrigible slaves will be made tribute to the altars.", activatedText: "all captured and incorrigible slaves must be made tribute to the altars.", - note: `Will help advance Aztec Revivalism` + note: `Will help advance Aztec Revivalism`, + get requirements() { return (V.arcologies[0].FSAztecRevivalist >= 40); }, } ], "arcologies[0].FSAztecRevivalistLaw": [ @@ -1766,7 +1810,8 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "in order to be sold in the arcology, slaves will be instructed in the cultural tenets of ancient Egypt.", activatedText: "in order to be sold in the arcology, slaves must be instructed in the cultural tenets of ancient Egypt.", - note: `Will help advance Egyptian Revivalism` + note: `Will help advance Egyptian Revivalism`, + get requirements() { return (V.arcologies[0].FSEgyptianRevivalist >= 40); }, } ], "arcologies[0].FSEgyptianRevivalistLaw": [ @@ -1794,7 +1839,8 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "in order to be sold in the arcology, slaves will have to be instructed in the cultural tenets of Edo Japan.", activatedText: "in order to be sold in the arcology, slaves must be instructed in the cultural tenets of Edo Japan.", - note: `Will help advance Edo Revivalism` + note: `Will help advance Edo Revivalism`, + get requirements() { return (V.arcologies[0].FSEdoRevivalist >= 40); }, } ], "arcologies[0].FSEdoRevivalistLaw": [ @@ -1815,7 +1861,8 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "in order to be sold in the arcology, slaves will be instructed in the cultural tenets of the old Caliphate.", activatedText: "in order to be sold in the arcology, slaves must be instructed in the cultural tenets of the old Caliphate.", - note: `Will help advance Arabian Revivalism` + note: `Will help advance Arabian Revivalism`, + get requirements() { return (V.arcologies[0].FSArabianRevivalist >= 40); }, } ], "arcologies[0].FSArabianRevivalistLaw": [ @@ -1836,7 +1883,8 @@ App.Data.Policies.Selection = { titleClass: "lime", text: "in order to be sold in the arcology, slaves will have to be instructed in the cultural tenets of Imperial China.", activatedText: "in order to be sold in the arcology, slaves must be instructed in the cultural tenets of Imperial China.", - note: `Will help advance Chinese Revivalism` + note: `Will help advance Chinese Revivalism`, + get requirements() { return (V.arcologies[0].FSChineseRevivalist >= 40); }, } ], "arcologies[0].FSChineseRevivalistLaw": [ @@ -1978,7 +2026,7 @@ App.Data.Policies.Selection = { titleClass: "lime", get text() { return `will force anyone not of the ${V.arcologies[0].FSSupremacistRace} race to emigrate or accept enslavement, and make sex with non-${V.arcologies[0].FSSupremacistRace} people such an expectation that the appetite for all such slaves will increase slightly.`; }, get activatedText() { return `by law, anyone not of the ${V.arcologies[0].FSSupremacistRace} race in your arcology is a slave`; }, - get requirements() { return (V.seeDicks !== 0 && V.arcologies[0].FSSupremacist >= 40); }, + get requirements() { return (V.arcologies[0].FSSupremacist >= 40); }, onImplementation: function() { V.FSSupLawTrigger = 1; checkPolicyGameover(); diff --git a/js/003-data/slaveBody.js b/js/003-data/slaveBody.js new file mode 100644 index 0000000000000000000000000000000000000000..8f16e3a821df61e2702bcb79323831338a3a94aa --- /dev/null +++ b/js/003-data/slaveBody.js @@ -0,0 +1,105 @@ +/** + * @typedef {Object} bodyPart + * @property {"head"|"torso"|"arms"|"legs"} category + * @property {function(App.Entity.SlaveState):boolean} [requirements] + * @property {boolean} [isPair] + */ + +/** + * @type {Map.<string, bodyPart>} + */ +App.Data.Slave.body = new Map([ + // Head + ["ears", { + category: "head", + requirements: (slave) => slave.earShape !== "none", + isPair: true, + }], + ["cheek", { + category: "head", + isPair: true + }], + ["neck", { + category: "head", + }], + + // Torso + ["chest", { + category: "torso", + }], + ["breast", { + category: "torso", + isPair: true + }], + ["back", { + category: "torso", + }], + ["lower back", { + category: "torso", + }], + ["pubic mound", { + category: "torso", + }], + ["penis", { + category: "torso", + requirements: (slave) => slave.dick > 0, + }], + ["testicle", { + category: "torso", + requirements: (slave) => slave.scrotum > 0 && slave.balls > 0, + isPair: true + }], + + // Arms + ["shoulder", { + category: "arms", + requirements: (slave) => hasAnyNaturalArms(slave), + isPair: true + }], + ["upper arm", { + category: "arms", + requirements: (slave) => hasAnyNaturalArms(slave), + isPair: true + }], + ["lower arm", { + category: "arms", + requirements: (slave) => hasAnyNaturalArms(slave), + isPair: true + }], + ["wrist", { + category: "arms", + requirements: (slave) => hasAnyNaturalArms(slave), + isPair: true + }], + ["hand", { + category: "arms", + requirements: (slave) => hasAnyNaturalArms(slave), + isPair: true + }], + + // Legs + ["buttock", { + category: "legs", + isPair: true + }], + ["thigh", { + category: "legs", + requirements: (slave) => hasAnyNaturalLegs(slave), + isPair: true + }], + ["calf", { + category: "legs", + requirements: (slave) => hasAnyNaturalLegs(slave), + isPair: true + }], + ["ankle", { + category: "legs", + requirements: (slave) => hasAnyNaturalLegs(slave), + isPair: true + }], + ["foot", { + category: "legs", + requirements: (slave) => hasAnyNaturalLegs(slave), + isPair: true + }], +]); diff --git a/js/003-data/slaveMods.js b/js/003-data/slaveMods.js index 49f20cd365f9de2fb18b5e143441591a387966c3..7a6180316a05264e5357674b470f3b48236d1bea 100644 --- a/js/003-data/slaveMods.js +++ b/js/003-data/slaveMods.js @@ -282,6 +282,16 @@ App.Medicine.Modification.Color = { ] }; +/** + * @typedef {Object} hairStyle + * @property {string} title + * @property {FC.HairStyle} value + * @property {number} [hLength] + */ + +/** + * @type {Object<string, hairStyle[]>} + */ App.Medicine.Modification.hairStyles = { Normal: [ { @@ -382,30 +392,31 @@ App.Medicine.Modification.hairStyles = { hLength: 1 }, ], - Length: [ - { - title: "Very short", - hLength: 5 - }, - { - title: "Short", - hLength: 10 - }, - { - title: "Shoulder length", - hLength: 30 - }, - { - title: "Long", - hLength: 60 - }, - { - title: "Very long", - hLength: 100 - }, - ] }; +App.Medicine.Modification.hLength = [ + { + title: "Very short", + hLength: 5 + }, + { + title: "Short", + hLength: 10 + }, + { + title: "Shoulder length", + hLength: 30 + }, + { + title: "Long", + hLength: 60 + }, + { + title: "Very long", + hLength: 100 + }, +]; + App.Medicine.Modification.eyeColor = [ {value: "amber"}, {value: "black"}, @@ -500,13 +511,16 @@ App.Medicine.Modification.teeth = new Map([ `.` ); }, - get requirements() { return (V.seeExtreme === 1); } + get requirements() { return (V.seeExtreme === 1); }, + sharp: true }], ["fangs", { desc: ``, + sharp: true }], ["fang", { desc: ``, + sharp: true }], ["baby", { desc: ``, diff --git a/js/003-data/slaveTradePresets.js b/js/003-data/slaveTradePresets.js index 99e7e92ff247a68e4728d3d639a41540919bcde9..b1ea0e2ce964e6c292c4c6042ce9166901f651e4 100644 --- a/js/003-data/slaveTradePresets.js +++ b/js/003-data/slaveTradePresets.js @@ -939,4 +939,649 @@ App.Data.NationalityPresets.Mod = new Map([ Zambian: 2844, Zimbabwean: 2355 }], + + ["Japan/Korea weighted sea trade", { + Chinese: 2000, + Korean: 2000, + Japanese: 2000, + American: 500, + Russian: 500, + Filipina: 500, + Taiwanese: 500, + Vietnamese: 500, + Cambodian: 500, + Malaysian: 500, + Indonesian: 500, + Australian: 200, + "Papua New Guinean": 200, + "a New Zealander": 200, + Canadian: 200, + Mexican: 200, + Ecuadorian: 200, + Peruvian: 200, + Chilean: 200, + Thai: 200, + Burmese: 200, + Bangladeshi: 200, + Indian: 200, + "Sri Lankan": 200, + Iranian: 200, + Pakistani: 200, + Omani: 200, + Yemeni: 200, + Malagasy: 200, + Somali: 200, + "a Solomon Islander": 200, + "New Caledonian": 200, + Fijian: 200, + Mongolian: 200, + Tibetan: 200, + Laotian: 200, + Argentinian: 80, + Belgian: 80, + Armenian: 80, + Austrian: 80, + Bulgarian: 80, + British: 80, + Brazilian: 80, + Colombian: 80, + "Costa Rican": 80, + Croatian: 80, + Danish: 80, + Czech: 80, + Cuban: 80, + Dutch: 80, + Egyptian: 80, + Ethiopian: 80, + Finnish: 80, + French: 80, + Greek: 80, + German: 80, + Georgian: 80, + Hungarian: 80, + Honduran: 80, + Iraqi: 80, + Irish: 80, + Israeli: 80, + Italian: 80, + Kazakh: 80, + Jordanian: 80, + Moroccan: 80, + Nepalese: 80, + Nicaraguan: 80, + Norwegian: 80, + Portuguese: 80, + Polish: 80, + Paraguayan: 80, + Romanian: 80, + Salvadoran: 80, + Scottish: 80, + Serbian: 80, + Singaporean: 80, + "South African": 80, + Swedish: 80, + Spanish: 80, + Turkish: 80, + Tunisian: 80, + Turkmen: 80, + Ukrainian: 80, + Uruguayan: 80, + Venezuelan: 80, + Afghan: 12, + Azerbaijani: 12, + Bolivian: 12, + Dominican: 12, + Emirati: 12, + Gambian: 12, + Grenadian: 12, + Jamaican: 12, + Latvian: 12, + Luxembourgian: 12, + Micronesian: 12, + Panamanian: 12, + "Puerto Rican": 12, + Swiss: 12, + Zambian: 12, + Zimbabwean: 12, + Togolese: 12, + Syrian: 12, + Slovene: 12, + Senegalese: 12, + Qatari: 12, + Moldovan: 12, + Macedonian: 12, + Lebanese: 12, + Kosovan: 12, + Catalan: 12, + Bosnian: 12, + Belizean: 12, + Bahamian: 12, + Albanian: 12, + Algerian: 12, + Bahraini: 12, + Beninese: 12, + "Central African": 12, + Congolese: 12, + Cypriot: 12, + Guatemalan: 12, + Kurdish: 12, + Liberian: 12, + Marshallese: 12, + Mozambican: 12, + Sudanese: 12, + Tongan: 12, + Ugandan: 12, + Mauritanian: 12, + Libyan: 12, + Kuwaiti: 12, + Icelandic: 12, + Ghanan: 12, + Estonian: 12, + Chadian: 12, + Bermudian: 12, + Bhutanese: 12, + Bruneian: 12, + Cameroonian: 12, + Guyanese: 12, + Kenyan: 12, + Kyrgyz: 12, + Montenegrin: 12, + Nigerian: 12, + Tanzanian: 12, + Zairian: 12, + Uzbek: 12, + "South Sudanese": 12, + Saudi: 12, + Palestinian: 12, + Nigerien: 12, + Lithuanian: 12, + Ivorian: 12, + Haitian: 12, + Greenlandic: 12, + Gabonese: 12, + Belarusian: 12, + Angolan: 12, + "French Polynesian": 12, + Antiguan: 2, + Burkinabé: 2, + "Cape Verdean": 2, + Malian: 2, + Mosotho: 2, + Niuean: 2, + "Saint Lucian": 2, + Slovak: 2, + Vatican: 2, + Tuvaluan: 2, + Motswana: 2, + Maltese: 2, + Guamanian: 2, + Equatoguinean: 2, + Dominiquais: 2, + Curaçaoan: 2, + Comorian: 2, + Burundian: 2, + Eritrean: 2, + "I-Kiribati": 2, + Monégasque: 2, + "Ni-Vanuatu": 2, + Sammarinese: 2, + Vincentian: 2, + Trinidadian: 2, + Tajik: 2, + Surinamese: 2, + Seychellois: 2, + Samoan: 2, + Namibian: 2, + Malawian: 2, + Guinean: 2, + "French Guianan": 2, + "East Timorese": 2, + "a Cook Islander": 2, + Aruban: 2, + Andorran: 2, + Barbadian: 2, + "a Liechtensteiner": 2, + Mauritian: 2, + Nauruan: 2, + Palauan: 2, + Rwandan: 2, + "Sierra Leonean": 2, + "São Toméan": 2, + Swazi: 2, + Sahrawi: 2, + Maldivian: 2, + Kittitian: 2, + Djiboutian: 2 + }], + + ["Polish-Lithuanian Commonwealth with Silk Road", { + Polish: 2000, + Ukrainian: 2000, + Belarusian: 2000, + Chinese: 500, + Japanese: 500, + Korean: 500, + Russian: 500, + German: 500, + French: 500, + Italian: 500, + Turkish: 500, + Uzbek: 200, + Kazakh: 200, + Indian: 200, + Pakistani: 200, + Afghan: 200, + Iranian: 200, + Iraqi: 200, + Syrian: 200, + Egyptian: 200, + Saudi: 200, + Austrian: 200, + British: 200, + Bulgarian: 200, + Croatian: 200, + Czech: 200, + Danish: 200, + Dutch: 200, + Estonian: 200, + Finnish: 80, + Greek: 200, + Hungarian: 200, + Latvian: 200, + Lithuanian: 200, + Macedonian: 80, + Moldovan: 80, + Romanian: 200, + Spanish: 200, + Swedish: 200, + Nigerian: 80, + Ethiopian: 80, + Congolese: 80, + Moroccan: 80, + Algerian: 80, + Tunisian: 80, + Libyan: 80, + Sudanese: 80, + Bangladeshi: 80, + Burmese: 80, + Filipina: 80, + Indonesian: 80, + Kyrgyz: 80, + Malaysian: 80, + Nepalese: 80, + Taiwanese: 80, + Tajik: 80, + Thai: 80, + Tibetan: 80, + Turkmen: 80, + Vietnamese: 80, + Australian: 80, + Albanian: 80, + Belgian: 80, + Bosnian: 80, + Irish: 80, + Swiss: 80, + Scottish: 80, + Norwegian: 80, + Serbian: 80, + Slovak: 80, + Portuguese: 80, + Slovene: 80, + Kosovan: 80, + American: 80, + Canadian: 80, + Cuban: 80, + Mexican: 80, + Brazilian: 80, + Colombian: 80, + Argentinian: 80, + Peruvian: 80, + Venezuelan: 80, + Catalan: 12, + Georgian: 80, + Armenian: 80, + Yemeni: 80, + Jordanian: 80, + Emirati: 12, + Mongolian: 12, + Bolivian: 12, + Paraguayan: 12, + Chilean: 12, + Uruguayan: 12, + Ecuadorian: 12, + Salvadoran: 12, + Jamaican: 12, + Dominiquais: 12, + "Costa Rican": 12, + Guatemalan: 12, + Nicaraguan: 12, + Haitian: 12, + Dominican: 12, + Honduran: 12, + Lebanese: 12, + Kuwaiti: 12, + Kurdish: 12, + Azerbaijani: 12, + Bahraini: 12, + Omani: 12, + Palestinian: 12, + Israeli: 12, + Cypriot: 12, + Qatari: 12, + Icelandic: 12, + Montenegrin: 12, + Luxembourgian: 12, + "Papua New Guinean": 12, + Bhutanese: 12, + Bruneian: 12, + Laotian: 12, + Singaporean: 12, + Maldivian: 12, + Cambodian: 12, + "East Timorese": 12, + Cameroonian: 12, + Mosotho: 12, + Ghanan: 12, + Rwandan: 12, + Malagasy: 12, + Somali: 12, + "South African": 12, + Malawian: 12, + Guinean: 12, + Equatoguinean: 12, + Angolan: 12, + Beninese: 12, + "Central African": 12, + Eritrean: 12, + Ivorian: 12, + Mozambican: 12, + "South Sudanese": 12, + Ugandan: 12, + Zairian: 12, + Senegalese: 12, + Namibian: 12, + Mauritanian: 12, + Kenyan: 12, + Chadian: 12, + Gabonese: 12, + Liberian: 12, + Mauritian: 12, + Swazi: 12, + Zambian: 12, + Zimbabwean: 12, + Tanzanian: 12, + "Sierra Leonean": 12, + Nigerien: 12, + Gambian: 12, + Burundian: 12, + Guyanese: 2, + "French Guianan": 2, + Surinamese: 12, + Greenlandic: 12, + Bahamian: 2, + Djiboutian: 2, + Togolese: 2, + Sahrawi: 2, + Motswana: 2, + "Cape Verdean": 2, + Malian: 2, + "São Toméan": 2, + "Bissau-Guinean": 2, + Burkinabé: 2, + Comorian: 2, + Seychellois: 2, + Marshallese: 2, + Niuean: 2, + Tuvaluan: 2, + Palauan: 2, + Micronesian: 2, + "a Cook Islander": 2, + Fijian: 2, + Nauruan: 2, + Samoan: 2, + "New Caledonian": 2, + "French Polynesian": 2, + Guamanian: 2, + "a New Zealander": 2, + "a Solomon Islander": 2, + Tongan: 2, + "Ni-Vanuatu": 2, + "I-Kiribati": 2, + "a Liechtensteiner": 2, + Monégasque: 2, + Sammarinese: 2, + Andorran: 2, + Maltese: 2, + Vatican: 2, + Bermudian: 2, + "Saint Lucian": 2, + Kittitian: 2, + Antiguan: 2, + Aruban: 2, + Grenadian: 2, + Trinidadian: 2, + Vincentian: 2, + Panamanian: 2, + Curaçaoan: 2, + Barbadian: 2, + Belizean: 2, + "Puerto Rican": 2, + "Sri Lankan": 2 + }], + + ["Caribbean and Gulf of Mexico", { + Mexican: 1100, + American: 1100, + Guatemalan: 520, + Haitian: 520, + Cuban: 520, + Dominican: 520, + Honduran: 520, + Salvadoran: 520, + Nicaraguan: 520, + "Costa Rican": 520, + Panamanian: 520, + "Puerto Rican": 520, + Jamaican: 520, + Trinidadian: 520, + Colombian: 520, + Venezuelan: 520, + Brazilian: 520, + Belizean: 200, + Bahamian: 200, + Barbadian: 200, + Guyanese: 200, + Surinamese: 200, + "French Guianan": 200, + Ecuadorian: 200, + Peruvian: 200, + Chilean: 200, + Argentinian: 200, + Uruguayan: 200, + Paraguayan: 200, + Bolivian: 200, + Portuguese: 200, + Spanish: 200, + French: 200, + British: 200, + Irish: 200, + Scottish: 200, + Dutch: 200, + Japanese: 200, + Filipina: 200, + Indonesian: 200, + Algerian: 80, + "Saint Lucian": 80, + Grenadian: 80, + Vincentian: 80, + Antiguan: 80, + Dominiquais: 80, + Australian: 80, + Bangladeshi: 80, + Belgian: 80, + Bermudian: 80, + Curaçaoan: 80, + Greenlandic: 80, + German: 80, + Indian: 80, + Italian: 80, + Korean: 80, + Malaysian: 80, + Nigerian: 80, + Norwegian: 80, + "Papua New Guinean": 80, + Russian: 80, + Swedish: 80, + Turkish: 80, + Taiwanese: 80, + Chinese: 80, + Canadian: 80, + Iranian: 80, + Kittitian: 80, + Ivorian: 80, + Moroccan: 80, + Nigerien: 80, + "French Polynesian": 80, + Danish: 80, + Bruneian: 80, + Aruban: 80, + Icelandic: 80, + Vietnamese: 80, + Samoan: 80, + Congolese: 80, + "a Solomon Islander": 80, + "a New Zealander": 80, + Catalan: 80, + Tunisian: 80, + "Sri Lankan": 80, + "South African": 80, + Singaporean: 80, + Malagasy: 80, + Thai: 80, + Egyptian: 80, + "Cape Verdean": 80, + Angolan: 14, + Afghan: 14, + Azerbaijani: 14, + Belarusian: 14, + Libyan: 14, + Austrian: 14, + Bahraini: 14, + Armenian: 14, + Burmese: 14, + Cambodian: 14, + Cameroonian: 14, + "Central African": 14, + Cypriot: 14, + Czech: 14, + "a Cook Islander": 14, + Croatian: 14, + Fijian: 14, + Ethiopian: 14, + Estonian: 14, + Georgian: 14, + Ghanan: 14, + Greek: 14, + Hungarian: 14, + Iraqi: 14, + Israeli: 14, + Kazakh: 14, + Kuwaiti: 14, + Maldivian: 14, + Malawian: 14, + Liberian: 14, + Lebanese: 14, + Marshallese: 14, + Mauritian: 14, + Namibian: 14, + Mozambican: 14, + Micronesian: 14, + "New Caledonian": 14, + Pakistani: 14, + Omani: 14, + Romanian: 14, + Sammarinese: 14, + Qatari: 14, + Senegalese: 14, + Somali: 14, + Sudanese: 14, + Syrian: 14, + Swiss: 14, + Turkmen: 14, + Ukrainian: 14, + Yemeni: 14, + Zairian: 5, + Albanian: 5, + Bosnian: 5, + Beninese: 5, + Burundian: 5, + Bulgarian: 5, + Chadian: 5, + Comorian: 5, + Emirati: 5, + Equatoguinean: 5, + Finnish: 5, + "East Timorese": 5, + Gabonese: 5, + Djiboutian: 5, + Guinean: 5, + Eritrean: 5, + Gambian: 5, + Guamanian: 5, + Kurdish: 5, + Jordanian: 5, + Kenyan: 5, + Kyrgyz: 5, + Lithuanian: 5, + Macedonian: 5, + Latvian: 5, + Malian: 5, + Mosotho: 5, + Motswana: 5, + Moldovan: 5, + Mongolian: 5, + Mauritanian: 5, + Nepalese: 5, + Palestinian: 5, + Polish: 5, + Saudi: 5, + "South Sudanese": 5, + Uzbek: 5, + "Sierra Leonean": 5, + Seychellois: 5, + Tajik: 5, + Serbian: 5, + Tongan: 5, + Ugandan: 5, + Zimbabwean: 5, + Tuvaluan: 5, + Togolese: 5, + Luxembourgian: 5, + Tibetan: 5, + Zambian: 5, + Tanzanian: 5, + Kosovan: 3, + Slovak: 3, + Swazi: 3, + Laotian: 3, + Rwandan: 3, + "Bissau-Guinean": 3, + Burkinabé: 2, + Niuean: 2, + Vatican: 2, + Slovene: 2, + Maltese: 2, + "I-Kiribati": 2, + Monégasque: 2, + "Ni-Vanuatu": 2, + Andorran: 2, + Bhutanese: 2, + "a Liechtensteiner": 2, + Montenegrin: 2, + Nauruan: 2, + Palauan: 2, + "São Toméan": 2, + Sahrawi: 2 + }], + ]); diff --git a/js/003-data/slaveWearData.js b/js/003-data/slaveWearData.js index 187ad4e0269a891fab53f4964615630d298ae233..4bc7787d66ff7b464d9c46bf01be9f90fc1d5e5c 100644 --- a/js/003-data/slaveWearData.js +++ b/js/003-data/slaveWearData.js @@ -24,7 +24,7 @@ App.Data.clothes = new Map([ ["a Fuckdoll suit", { - name: "a Fuckdoll suit", + name: "Fuckdoll suit", exposure: 3, fuckdoll: true } diff --git a/js/extensions/number.extension.js b/js/extensions/number.extension.js new file mode 100644 index 0000000000000000000000000000000000000000..4100d71828586408ac09ad1d87ade1bd922d709a --- /dev/null +++ b/js/extensions/number.extension.js @@ -0,0 +1,3 @@ +Number.prototype.isBetween = function(min, max, inclusive = false) { + return inclusive ? this >= min && this <= max : this > min && this < max; +}; diff --git a/js/utils.js b/js/utils.js index 09a51932aa4f3a140d97b20ffaa438b2eb55386e..32ff8ed53793bc6e54a4e7504f4ea816c63cbda2 100644 --- a/js/utils.js +++ b/js/utils.js @@ -13,24 +13,6 @@ function jsDef(x) { return !(typeof x === "undefined" || x === null || x === undefined); } -/** - * Determines if a is between low and high - * @param {number} a - * @param {number} low - * @param {number} high - * @param {"exclusive"|"inclusive"} [mode='exclusive'] defaults to 'exclusive' but also supports 'inclusive'. - * @returns {boolean} - */ -function between(a, low, high, mode = 'exclusive') { - if (low === null) { low = -Infinity; } - if (high === null) { high = Infinity; } - if (mode === 'exclusive') { - return a > low && a < high; - } else if (mode === 'inclusive') { - return a >= low && a <= high; - } -} - /** * @template {PropertyKey} T * @param {Object.<T, number>} obj diff --git a/src/004-base/baseEncyclopediaEntry.js b/src/004-base/baseEncyclopediaEntry.js deleted file mode 100644 index 67370408c5fda90584cfdb6d84a8b255a32ee9c7..0000000000000000000000000000000000000000 --- a/src/004-base/baseEncyclopediaEntry.js +++ /dev/null @@ -1,43 +0,0 @@ -/** base class for class-based events */ -App.Encyclopedia.EncyclopediaCategory = class EncyclopediaCategory { - constructor() {} - /** - * @param {string} topic - * @returns {HTMLElement} - */ - topic(topic) { - return App.UI.DOM.makeElement("span", topic, ["encyclopedia", "topic"]); - } - - /** - * @param {string} linkText - * @param {string} topic - * @returns {HTMLElement} - */ - encyLink(linkText, topic) { - return App.Encyclopedia.Dialog.linkDOM(linkText, topic); - } - - renderArticle(which) { - if (which in this) { - return this[which](); - } - return null; - } -}; - -App.Encyclopedia.renderArticle = function(article) { - const categories = [ - new App.Encyclopedia.Anatomy(), - new App.Encyclopedia.Assignments(), - ]; - for (const cat of categories) { - const result = cat.renderArticle(article); - if (result) { - return result; - } - } - //TODO: turn this back on when completed. - // return `Encyclopedia entry "${article}" not found`; - return; -}; diff --git a/src/004-base/encyclopediaMap.js b/src/004-base/encyclopediaMap.js new file mode 100644 index 0000000000000000000000000000000000000000..38b23c44ead63fc12eae0f144d83d25704bf90e3 --- /dev/null +++ b/src/004-base/encyclopediaMap.js @@ -0,0 +1,93 @@ +// Articles map +/** + * @typedef {object} article + * @property {function():(HTMLElement|DocumentFragment)} render + * @property {string} [category] + */ +/** + * @type {Map<string, article>} + */ +App.Encyclopedia.articles = new Map(); + +/** + * Adds an article if it does not exist yet. + * + * @param {string} key + * @param {function():(HTMLElement|DocumentFragment)} article + * @param {string} [category] + */ +App.Encyclopedia.addArticle = function(key, article, category) { + if (!App.Encyclopedia.articles.has(key)) { + App.Encyclopedia.articles.set(key, {render: article, category: category}); + } else { + console.log(`Trying to overwrite encyclopedia article "${article}".`); + } +}; + +/** + * Renders the specified article. + * + * @param {string} article + * @returns {string|HTMLElement|DocumentFragment} + */ +App.Encyclopedia.renderArticle = function(article) { + if (App.Encyclopedia.articles.has(article)) { + return App.Encyclopedia.articles.get(article).render(); + } + + // TODO: turn this back on when completed. + // return `Encyclopedia article "${article}" not found.`; + return null; +}; + +// Categories map +/** + * @type {Map<string, function():(HTMLElement|DocumentFragment)>} + */ +App.Encyclopedia.categories = new Map(); + +/** + * Adds an article if it does not exist yet. + * + * @param {string} key + * @param {function():(HTMLElement|DocumentFragment)} category + */ +App.Encyclopedia.addCategory = function(key, category) { + if (!App.Encyclopedia.categories.has(key)) { + App.Encyclopedia.categories.set(key, category); + } else { + console.log(`Trying to overwrite encyclopedia category "${category}".`); + } +}; + +/** + * Renders the specified article. + * + * @param {string} article + * @returns {string|HTMLElement|DocumentFragment} + */ +App.Encyclopedia.renderCategory = function(article) { + if (!App.Encyclopedia.articles.has(article)) { + // TODO: turn this back on when completed. + // return `Encyclopedia article "${article}" not found.`; + return null; + } + + const category = App.Encyclopedia.articles.get(article).category; + if (!category) { + // TODO: turn this back on when completed. + // return `Encyclopedia article "${article}" has no category.`; + return null; + } + + if (!App.Encyclopedia.categories.has(category)) { + return `Encyclopedia category "${category}" not found.`; + } + + return App.Encyclopedia.categories.get(category)(); +}; + +// Utility functions +App.Encyclopedia.topic = function(topic) { + return App.UI.DOM.makeElement("span", topic, ["encyclopedia", "topic"]); +}; diff --git a/src/004-base/facility.js b/src/004-base/facility.js index 8a73a5b25e5e1201d32b852a44768becdd384fc6..dbfcf5be075cab9fc60d10ab5d5cd08a70547730 100644 --- a/src/004-base/facility.js +++ b/src/004-base/facility.js @@ -11,6 +11,7 @@ App.Data.FacilityDesc = class { this.defaultJob = ""; /** @type {FC.Data.ManagerJobDesc} */ this.manager = null; + this.decorated = false; } }; @@ -321,7 +322,7 @@ App.Entity.Facilities.Facility = class { /** Facility slave capacity * @returns {number} */ get capacity() { - return (typeof V[this.desc.baseName] === "object") ? V[this.desc.baseName].capacity : V[this.desc.baseName]; + return V[this.desc.baseName] !== null && ((typeof V[this.desc.baseName] === "object") ? V[this.desc.baseName].capacity : V[this.desc.baseName]); } get established() { @@ -381,7 +382,35 @@ App.Entity.Facilities.Facility = class { * @returns {number} */ upgrade(name) { - return this.option("Upgrade" + name); + return (typeof V[this.desc.baseName] === "object") ? V[this.desc.baseName].upgrade[name] : this.option("Upgrade" + name); + } + + /** Can this facility be decorated? */ + get isDecorated() { + return this.desc.decorated; + } + + /** How is this facility currently decorated? + * @returns {FC.FutureSocietyDeco} + */ + get decoration() { + if (!this.isDecorated) { + return "standard"; + } + return (typeof V[this.desc.baseName] === "object") ? V[this.desc.baseName].decoration : V[this.desc.baseName + "Decoration"]; + } + + /** Configure facility decoration + * @param {FC.FutureSocietyDeco} val + */ + set decoration(val) { + if (this.isDecorated) { + if (typeof V[this.desc.baseName] === "object") { + V[this.desc.baseName].decoration = val; + } else { + V[this.desc.baseName + "Decoration"] = val; + } + } } /** diff --git a/src/005-passages/eventsPassages.js b/src/005-passages/eventsPassages.js index 411794b7ab4d46acf481f7e134eca19003f3e1e8..90e8c03e059c6c3ae1e6acab2c31f3608daf28a1 100644 --- a/src/005-passages/eventsPassages.js +++ b/src/005-passages/eventsPassages.js @@ -6,6 +6,12 @@ new App.DomPassage("Nonrandom Event", } ); +new App.DomPassage("attackReport", + () => { + return App.Events.attackReport(); + } +); + /* ### Random Events ### */ new App.DomPassage("JS Random Event", diff --git a/src/005-passages/facilitiesPassages.js b/src/005-passages/facilitiesPassages.js index 7cc3640ea05ce90f289661635ec2bcd189f755c3..d111733c1d5b89dd4af44a8c6951b9eacf8efe32 100644 --- a/src/005-passages/facilitiesPassages.js +++ b/src/005-passages/facilitiesPassages.js @@ -40,18 +40,144 @@ new App.DomPassage("Agent Select", V.nextLink = "Neighbor Interact"; V.encyclopedia = "Agents"; - const f = document.createDocumentFragment(); - App.UI.DOM.appendNewElement("h2", f, "Appoint an Agent from your devoted slaves"); + return App.Facilities.AgentSelect(); + }, ["jump-from-safe"] +); - f.append(App.UI.SlaveList.slaveSelectionList( - s => App.Entity.facilities.arcologyAgent.manager.checkRequirements(s), - (slave) => App.UI.DOM.passageLink(SlaveFullName(slave), "Agent Workaround", - () => { V.i = V.slaves.findIndex((s) => s.ID === slave.ID); }), - s => App.Entity.facilities.arcologyAgent.manager.slaveHasExperience(s) - )); +new App.DomPassage("Attendant Select", + () => { + V.nextButton = "Back"; + V.nextLink = "Spa"; + V.encyclopedia = "Attendant"; - return f; - }, ["jump-from-safe"] + return App.Facilities.AttendantSelect(); + }, ["jump-to-safe", "jump-hidden", "jump-from-safe"] +); + +new App.DomPassage("BG Select", + () => { + V.nextButton = "Back to Main"; + V.nextLink = "Main"; + V.encyclopedia = "Bodyguard"; + + return App.Facilities.BGSelect(); + }, ["jump-to-safe", "jump-hidden", "jump-from-safe"] +); + +new App.DomPassage("Concubine Select", + () => { + V.nextButton = "Back"; + V.nextLink = "Master Suite"; + V.encyclopedia = "Concubine"; + + return App.Facilities.ConcubineSelect(); + }, ["jump-to-safe", "jump-hidden", "jump-from-safe"] +); + +new App.DomPassage("DJ Select", + () => { + return App.Facilities.DJSelect(); + }, ["jump-to-safe", "jump-hidden", "jump-from-safe"] +); + +new App.DomPassage("HG Select", + () => { + V.nextButton = "Back to Main"; + V.nextLink = "Main"; + V.encyclopedia = "Head Girl"; + + return App.Facilities.HGSelect(); + }, ["jump-to-safe", "jump-hidden", "jump-from-safe"] +); + +new App.DomPassage("Madam Select", + () => { + V.nextButton = "Back"; + V.nextLink = "Brothel"; + V.encyclopedia = "Madam"; + + return App.Facilities.MadamSelect(); + }, ["jump-to-safe", "jump-hidden", "jump-from-safe"] +); + +new App.DomPassage("Milkmaid Select", + () => { + V.nextButton = "Back"; + V.nextLink = "Dairy"; + V.encyclopedia = "Milkmaid"; + + return App.Facilities.MilkmaidSelect(); + }, ["jump-to-safe", "jump-hidden", "jump-from-safe"] +); + +new App.DomPassage("Nurse Select", + () => { + V.nextButton = "Back"; + V.nextLink = "Clinic"; + V.encyclopedia = "Nurse"; + + return App.Facilities.NurseSelect(); + }, ["jump-to-safe", "jump-hidden", "jump-from-safe"] +); + +new App.DomPassage("Recruiter Select", + () => { + V.nextButton = "Back to Main"; + V.nextLink = "Main"; + V.encyclopedia = "Recruiter"; + + return App.Facilities.RecruiterSelect(); + }, ["jump-to-safe", "jump-hidden", "jump-from-safe"] +); + +new App.DomPassage("Schoolteacher Select", + () => { + V.nextButton = "Back"; + V.nextLink = "Schoolroom"; + V.encyclopedia = "Schoolteacher"; + + return App.Facilities.SchoolTeacherSelect(); + }, ["jump-to-safe", "jump-hidden", "jump-from-safe"] +); + +new App.DomPassage("Stewardess Select", + () => { + V.nextButton = "Back"; + V.nextLink = "Servants' Quarters"; + V.encyclopedia = "Stewardess"; + + return App.Facilities.StewardessSelect(); + }, ["jump-to-safe", "jump-hidden", "jump-from-safe"] +); + +new App.DomPassage("Wardeness Select", + () => { + V.nextButton = "Back"; + V.nextLink = "Cellblock"; + V.encyclopedia = "Wardeness"; + + return App.Facilities.WardenessSelect(); + }, ["jump-to-safe", "jump-hidden", "jump-from-safe"] +); + +new App.DomPassage("Farmer Select", + () => { + V.nextButton = "Back"; + V.nextLink = "Farmyard"; + V.encyclopedia = "Farmer"; + + return App.Facilities.FarmerSelect(); + }, ["jump-to-safe", "jump-hidden", "jump-from-safe"] +); + +new App.DomPassage("Matron Select", + () => { + V.nextButton = "Back"; + V.nextLink = "Nursery"; + V.encyclopedia = "Matron"; + + return App.Facilities.MatronSelect(); + }, ["jump-to-safe", "jump-hidden", "jump-from-safe"] ); new App.DomPassage("Rules Assistant", diff --git a/src/005-passages/interactPassages.js b/src/005-passages/interactPassages.js index 8ef500cbbd59b11904362b5b88e29ba86db242e1..cc3673cb1a6786656b20785e1ba7daa3e525d89e 100644 --- a/src/005-passages/interactPassages.js +++ b/src/005-passages/interactPassages.js @@ -117,3 +117,147 @@ new App.DomPassage( return el; }, ["jump-from-safe"] ); + +new App.DomPassage("MpregSelf", + () => { + V.nextButton = "Back"; + V.nextLink = "Main"; + + return MpregSelf(); + } +); + +new App.DomPassage("BreedingTest", + () => { + V.nextButton = "Confirm changes"; + V.nextLink = "Slave Interact"; + return App.UI.DOM.makeElement("div", eliteBreedingExam(getSlave(V.AS))); + } +); + +new App.DomPassage("PC Surgery Degradation", + () => { + V.nextButton = "Continue"; + V.nextLink = "Manage Personal Affairs"; + return App.UI.PCSurgeryDegradation(); + } +); + +new App.DomPassage("Aztec Slave Sacrifice Penance", + () => { + V.nextButton = "Back to Main"; + V.nextLink = "Main"; + V.encyclopedia = "Aztec Revivalism"; + return App.UI.SlaveInteract.aztecSlaveSacrificePenance(getSlave(V.AS)); + } +); + +new App.DomPassage("Aztec Slave Sacrifice Life", + () => { + V.nextButton = "Back to Main"; + V.nextLink = "Main"; + V.encyclopedia = "Aztec Revivalism"; + return App.UI.SlaveInteract.aztecSlaveSacrificeLife(getSlave(V.AS)); + } +); + +new App.DomPassage("fLips", + () => { + return App.Interact.fLips(getSlave(V.AS)); + } +); + +new App.DomPassage("fBoobs", + () => { + return App.Interact.fBoobs(getSlave(V.AS)); + } +); + +new App.DomPassage("fVagina", + () => { + return App.Interact.fVagina(getSlave(V.AS)); + } +); + +new App.DomPassage("fRival", + () => { + return App.Interact.fRival(getSlave(V.AS)); + } +); +new App.DomPassage("fButt", + () => { + return App.Interact.fButt(getSlave(V.AS)); + } +); + +new App.DomPassage("fDick", + () => { + return App.Interact.fDick(getSlave(V.AS)); + } +); + +new App.DomPassage("fAnus", + () => { + return App.Interact.fAnus(getSlave(V.AS)); + } +); + +new App.DomPassage("Abort", + () => { + V.nextButton = "Back"; + V.nextLink = "Slave Interact"; + return App.Interact.abort(getSlave(V.AS)); + } +); + +new App.DomPassage("FAnimalImpreg", + () => { + V.nextButton = "Back"; + V.nextLink = "Slave Interact"; + return App.Interact.fAnimalImpreg(getSlave(V.AS)); + } +); + +new App.DomPassage("FSlaveSlaveDick", + () => { + V.nextLink = "Slave Interact"; + V.nextButton = "Back"; + return App.Interact.fSlaveSlaveDick(getSlave(V.AS)); + } +); + +new App.DomPassage("FSlaveSlaveVag", + () => { + V.nextLink = "Slave Interact"; + V.nextButton = "Back"; + return App.Interact.fSlaveSlaveVag(getSlave(V.AS)); + } +); + +new App.DomPassage("Matchmaking", + () => { + if (lastVisited("Child Interact") === 1) { + V.nextLink = "Incubator"; + } else { + V.nextLink = "Slave Interact"; + } + V.nextButton = "Continue"; + return App.Interact.matchmaking(getSlave(V.AS)); + } +); + +new App.DomPassage("FSelf", + () => { + V.nextLink = "Main"; + V.nextButton = "Back"; + return App.Interact.fSelf(); + } +); + +new App.DomPassage("FMarry", + () => { + V.nextButton = "Back"; + V.nextLink = "Slave Interact"; + return App.Interact.fMarry(getSlave(V.AS)); + } +); diff --git a/src/005-passages/managePassages.js b/src/005-passages/managePassages.js index 4f0fb63a06a797ea23508921dbb67fee05aea3f4..e3f55468fa8e3954913a3d8e9f2e0eef02e11f7f 100644 --- a/src/005-passages/managePassages.js +++ b/src/005-passages/managePassages.js @@ -19,6 +19,15 @@ new App.DomPassage("Manage Penthouse", }, ["jump-to-safe", "jump-from-safe"] ); +new App.DomPassage("Manage Personal Affairs", + () => { + V.nextButton = "Back"; + V.nextLink = "Main"; + V.encyclopedia = "Being in Charge"; + return App.UI.managePersonalAffairs(); + }, ["jump-to-safe", "jump-from-safe"] +); + new App.DomPassage("retire", () => { V.nextButton = "Back"; @@ -51,3 +60,27 @@ new App.DomPassage("Manage Corporation", return App.Corporate.manage(); }, ["jump-to-safe", "jump-from-safe"] ); + + +new App.DomPassage("Policies", + () => { + V.nextButton = "Back"; + V.nextLink = "Main"; + V.encyclopedia = "Future Societies"; + return App.UI.policies(); + }, ["jump-to-safe", "jump-from-safe"] +); + +new App.DomPassage("Universal Rules", + () => { + V.nextButton = "Back"; + V.nextLink = "Manage Penthouse"; + return App.UI.universalRules(); + }, ["jump-to-safe", "jump-from-safe"] +); + +new App.DomPassage("Farmyard Animals", + () => { + return App.Facilities.Farmyard.animals(); + } +); diff --git a/src/Corporation/corporate.js b/src/Corporation/corporate.js index c4c0a55e7a4891359ad00f179c7c5c9f04162c3e..b2b5d6729154cdfa477e3a9455d8f8a5bf809dee 100644 --- a/src/Corporation/corporate.js +++ b/src/Corporation/corporate.js @@ -18,7 +18,8 @@ globalThis.averageRange = class { } }; globalThis.evenFillArray = function(array, amount, lookupAmount) { - let perItem, changed; + let perItem; + let changed; let retval = []; do { let newArray = []; diff --git a/src/Mods/Catmod/interaction/fPet.js b/src/Mods/Catmod/interaction/fPet.js new file mode 100644 index 0000000000000000000000000000000000000000..a594e0f6a403124176d3d7295698fc62f2208467 --- /dev/null +++ b/src/Mods/Catmod/interaction/fPet.js @@ -0,0 +1,144 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fPet = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself, girl + } = getPronouns(slave); + + const {title: Master} = getEnunciation(slave); + + r.push(`You tell ${slave.slaveName} to`); + if (!hasAnyLegs(slave)) { + r.push(`have another slave set ${him} up onto your desk.`); + } else if (tooBigBreasts(slave)) { + r.push(`have another slave help ${him} heft ${his} tits so ${he} can be near you.`); + } else if (tooBigBelly(slave)) { + r.push(`have another slave help ${him} heft ${his} belly so ${he} can be near you.`); + } else if (tooBigButt(slave)) { + r.push(`have another slave help ${him} heft ${his} ass cheeks so ${he} can be near you.`); + } else if (tooBigDick(slave)) { + r.push(`have another slave help ${him} heft ${his} cock so ${he} can be near you.`); + } else if (tooBigBalls(slave)) { + r.push(`have another slave help ${him} heft ${his} balls so ${he} can be near you.`); + } else if (tooFatSlave(slave)) { + r.push(`have another slave help ${him} up so ${he} can be near you.`); + } else { + r.push(`move closer towards you.`); + } + + r.push(`Once ${he}'s at an acceptable petting range, you bring the overgrown cat into your embrace and gingerly run a hand from the top of ${his} head down ${his} spine, coursing through the soft fur in a massage-like petting motion.`); + + if (slave.fetish === "mindbroken") { + r.push(`${He} accepts the petting robotically, barely even comprehending what you're doing. The pleasant scritch of your fingers against ${his} back produces some sort of guttural purring sound, but that conveys the extent of the mindbroken cat's response.`); + } else if (slave.devotion > 75) { + r.push(`The cat${girl} loudly purrs and eagerly rubs up against you, arching ${his} back to give you a full range over the silky fur. ${His} tail flicks back and forth happily as you pet ${him}, flicking up to tease against your chin as you pet the purring kitten. When you finally retract your hand, ${slave.slaveName} bats ${his} eyelashes at you, still purring a little.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes glimmer`); + } else { + r.push(`expression stares`); + } + r.push(`at you contentedly.`); + } else if (!canTalk(slave)) { + r.push(`${He} signs a little thank-you for the pets.`); + } else { + r.push(`${He} mrowls,`); + r.push(Spoken(slave, `"Why'd you stop, ${Master}? Can I suck you off so you keep going?"`)); + } + } else if (slave.devotion > 50) { + r.push(`The cat${girl} presents ${his} back to you eagerly for petting, purring softly as you stroke your hand up and down ${his} soft fur. It's easy to let your hand practically get lost in the silky material, especially since the eager cat does all ${he} can to keep your hand runnng up and down ${his} spine in tender petting motions. When you finally retract your hand, ${slave.slaveName} bats ${his} eyelashes at you, still purring a little.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes glimmer`); + } else { + r.push(`expression stares`); + } + r.push(`at you contentedly.`); + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves you.`); + } else { + r.push(`${He} mrowls,`); + + r.push(Spoken(slave, `"That felt great, ${Master}. Can you pet me more often?"`)); + } + } else if (slave.devotion > 20) { + r.push(`The cat${girl} puts up a little facade of resistance, but just about immediately melts into your hands, giving you a full range of motion to pet and rub at ${his} silky fur. ${He} lets you pet along the full length of ${his} spine, rubbing under ${his} chin and exploring the curves of ${his} ass and breasts in a way that's, for once, entirely nonsexual. After about a minute, ${he} starts to purr at your petting, rumbling against your chest, and ${he} flutters ${his} eyelashes wistfully when you finally remove your hand.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes glint`); + } else { + r.push(`expression stares`); + } + r.push(`at you with a smug aura.`); + } else if (!canTalk(slave)) { + r.push(`${He} signs a little thank-you for the pets.`); + } else { + r.push(`${He} mrowls,`); + r.push(Spoken(slave, `"Thanks, ${Master}. That was nice."`)); + } + } else if (slave.devotion < -20 && slave.trust >= 20) { + r.push(`${He} glowers at you as you start to pet ${him}, clearly doing ${his} best to express nonverbal dissatisfaction with you. Despite that, ${he} can't help but to shiver somewhat as you gingerly pet the fluffy cat, rumbling with a deep purr that betrays ${his} distaste for you. ${He} glares up at you the entire time, even as ${he} purrs, ${his} tail swishing about in the air as you pet the furry thing vigorously. When you finally retract your hand, ${he} acts like ${he} didn't enjoy it.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes glower`); + } else { + r.push(`expression glowers`); + } + r.push(`at you.`); + } else if (!canTalk(slave)) { + r.push(`${He} makes a rude sign gesture.`); + } else { + r.push(`${He} mrowls,`); + r.push(Spoken(slave, `"I'm a person, not some kind of dumb animal."`)); + } + } else if (slave.devotion >= -20 && slave.trust >= -20) { + r.push(`${He} flinches back when you raise your hand towards ${him}, expecting to be hit. The tender petting that occurs obviously shocks ${him}, and for the first minute it looks like ${he}'s expecting you to change your mind at any moment and hit ${him} anyway. When you don't, only then does the scared cat${girl} allow ${himself} to get pet properly, slightly arching ${his} back to give you a range of motion against the silky fur as you stroke and play with your bioengineered cat${girl}. When you finally retract your hand, ${he} bats ${his} eyelashes at you, confused.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} just stares at you, blinking a few times.`); + } else if (!canTalk(slave)) { + r.push(`${He} makes a confused sign gesture.`); + } else { + r.push(`${He} mrowls,`); + r.push(Spoken(slave, `"I-Is that it, ${Master}..?"`)); + } + } else if (slave.trust < -20) { + r.push(`${He} flinches back when you raise your hand towards ${him}, expecting to be hit. The tender petting that occurs obviously shocks ${him}, and for the first minute it looks like ${he}'s expecting you to change your mind at any moment and hit ${him} anyway. When you don't, only then does the scared cat${girl} allow ${himself} to get pet properly, slightly arching ${his} back to give you a range of motion against the silky fur as you stroke and play with your bioengineered cat${girl}. When you finally retract your hand, ${he} bats ${his} eyelashes at you, confused.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} just stares at you, blinking a few times.`); + } else if (!canTalk(slave)) { + r.push(`${He} makes a confused sign gesture.`); + } else { + r.push(`${He} mrowls,`); + r.push(Spoken(slave, `"I-Is that it, ${Master}..?"`)); + } + } else { + r.push(`The cat${girl} puts up a little facade of resistance, but doesn't really fight back against your petting, giving you a full range of motion to pet and rub at ${his} silky fur. ${He} lets you pet along the full length of ${his} spine, rubbing under ${his} chin and exploring the curves of ${his} ass and breasts in a way that's, for once, entirely nonsexual. Despite ${himself}, ${he} can't help but to purr a little by the time you finally remove ${his} hands.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes glint`); + } else { + r.push(`expression stares`); + } + r.push(`at you uncertainly.`); + } else if (!canTalk(slave)) { + r.push(`${He} makes a huffy mrowling noise.`); + } else { + r.push(`${He} mrowls,`); + r.push(Spoken(slave, `"Thanks, I guess..."`)); + } + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/Mods/Catmod/interaction/fPet.tw b/src/Mods/Catmod/interaction/fPet.tw deleted file mode 100644 index 9a013a9898b51e11103d849582b138c24b937118..0000000000000000000000000000000000000000 --- a/src/Mods/Catmod/interaction/fPet.tw +++ /dev/null @@ -1,101 +0,0 @@ -:: FPet [nobr no-history] - -<<run Enunciate(getSlave($AS))>> -<<run App.Utils.setLocalPronouns(getSlave($AS))>> - -You tell <<= getSlave($AS).slaveName>> to -<<if !hasAnyLegs(getSlave($AS))>> - have another slave set $him up onto your desk. -<<elseif tooBigBreasts(getSlave($AS))>> - have another slave help $him heft $his tits so $he can be near you. -<<elseif tooBigBelly(getSlave($AS))>> - have another slave help $him heft $his belly so $he can be near you. -<<elseif tooBigButt(getSlave($AS))>> - have another slave help $him heft $his ass cheeks so $he can be near you. -<<elseif tooBigDick(getSlave($AS))>> - have another slave help $him heft $his cock so $he can be near you. -<<elseif tooBigBalls(getSlave($AS))>> - have another slave help $him heft $his balls so $he can be near you. -<<elseif tooFatSlave(getSlave($AS))>> - have another slave help $him up so $he can be near you. -<<else>> - move closer towards you. -<</if>> - -Once $he's at an acceptable petting range, you bring the overgrown cat into your embrace and gingerly run a hand from the top of $his head down $his spine, coursing through the soft fur in a massage-like petting motion. - -<<if (getSlave($AS).fetish == "mindbroken")>> -$He accepts the petting robotically, barely even comprehending what you're doing. The pleasant scritch of your fingers against $his back produces some sort of guttural purring sound, but that conveys the extent of the mindbroken cat's response. - -<<elseif (getSlave($AS).devotion > 75)>> -The cat<<= $girl>> loudly purrs and eagerly rubs up against you, arching $his back to give you a full range over the silky fur. $His tail flicks back and forth happily as you pet $him, flicking up to tease against your chin as you pet the purring kitten. When you finally retract your hand, <<= getSlave($AS).slaveName>> bats $his eyelashes at you, still purring a little. -<<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $His <<if canSee(getSlave($AS))>>eyes glimmer<<else>>expression stares<</if>> at you contentedly. - <<elseif !canTalk(getSlave($AS))>> - $He signs a little thank-you for the pets. - <<else>> - $He mrowls, "Why'd you <<s>>top, <<Master>>? Can I <<s>>uck you off <<s>>o you keep going?" - <</if>> - - -<<elseif (getSlave($AS).devotion > 50)>> -The cat<<= $girl>> presents $his back to you eagerly for petting, purring softly as you stroke your hand up and down $his soft fur. It's easy to let your hand practically get lost in the silky material, especially since the eager cat does all $he can to keep your hand runnng up and down $his spine in tender petting motions. When you finally retract your hand, <<= getSlave($AS).slaveName>> bats $his eyelashes at you, still purring a little. -<<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $His <<if canSee(getSlave($AS))>>eyes glimmer<<else>>expression stares<</if>> at you contentedly. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he loves you. - <<else>> - $He mrowls, "That felt great, <<Master>>. Can you pet me more often?" - <</if>> - -<<elseif (getSlave($AS).devotion > 20)>> -The cat<<= $girl>> puts up a little facade of resistance, but just about immediately melts into your hands, giving you a full range of motion to pet and rub at $his silky fur. $He lets you pet along the full length of $his spine, rubbing under $his chin and exploring the curves of $his ass and breasts in a way that's, for once, entirely nonsexual. After about a minute, $he starts to purr at your petting, rumbling against your chest, and $he flutters $his eyelashes wistfully when you finally remove your hand. -<<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $His <<if canSee(getSlave($AS))>>eyes glint<<else>>expression stares<</if>> at you with a smug aura. - <<elseif !canTalk(getSlave($AS))>> - $He signs a little thank-you for the pets. - <<else>> - $He mrowls, "Thank<<s>>, <<Master>>. That wa<<s>> nice." - <</if>> - -<<elseif (getSlave($AS).devotion < -20) && (getSlave($AS).trust >= 20)>> -$He glowers at you as you start to pet $him, clearly doing $his best to express nonverbal dissatifaction with you. Despite that, $he can't help but to shiver somewhat as you gingerly pet the fluffy cat, rumbling with a deep purr that betrays $his distaste for you. $He glares up at you the entire time, even as $he purrs, $his tail swishing about in the air as you pet the furry thing vigorously. When you finally retract your hand, $he acts like $he didn't enjoy it. -<<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $His <<if canSee(getSlave($AS))>>eyes glower<<else>>expression glowers<</if>> at you. - <<elseif !canTalk(getSlave($AS))>> - $He makes a rude sign gesture. - <<else>> - $He mrowls, "I'm a per<<s>>on, not <<s>>ome kind of dumb animal." - <</if>> - -<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).trust >= -20)>> -$He flinches back when you raise your hand towards $him, expecting to be hit. The tender petting that occurs obviously shocks $him, and for the first minute it looks like $he's expecting you to change your mind at any moment and hit $him anyway. When you don't, only then does the scared cat<<= $girl>> allow $himself to get pet properly, slightly arching $his back to give you a range of motion against the silky fur as you stroke and play with your bioengineered cat<<= $girl>>. When you finally retract your hand, $he bats $his eyelashes at you, confused. -<<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $He just stares at you, blinking a few times. - <<elseif !canTalk(getSlave($AS))>> - $He makes a confused sign gesture. - <<else>> - $He mrowls, "I-I<<s>> that it, <<Master>>..?" - <</if>> - -<<elseif (getSlave($AS).trust < -20)>> -$He flinches back when you raise your hand towards $him, expecting to be hit. The tender petting that occurs obviously shocks $him, and for the first minute it looks like $he's expecting you to change your mind at any moment and hit $him anyway. When you don't, only then does the scared cat<<= $girl>> allow $himself to get pet properly, slightly arching $his back to give you a range of motion against the silky fur as you stroke and play with your bioengineered cat<<= $girl>>. When you finally retract your hand, $he bats $his eyelashes at you, confused. -<<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $He just stares at you, blinking a few times. - <<elseif !canTalk(getSlave($AS))>> - $He makes a confused sign gesture. - <<else>> - $He mrowls, "I-I<<s>> that it, <<Master>>..?" - <</if>> - -<<else>> -The cat<<= $girl>> puts up a little facade of resistance, but doesn't really fight back against your petting, giving you a full range of motion to pet and rub at $his silky fur. $He lets you pet along the full length of $his spine, rubbing under $his chin and exploring the curves of $his ass and breasts in a way that's, for once, entirely nonsexual. Despite $himself, $he can't help but to purr a little by the time you finally remove $his hands. -<<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $His <<if canSee(getSlave($AS))>>eyes glint<<else>>expression stares<</if>> at you uncertainly. - <<elseif !canTalk(getSlave($AS))>> - $He makes a huffy mrowling noise. - <<else>> - $He mrowls, "Thank<<s>>, I gues<<s>>..." - <</if>> - -<</if>> diff --git a/src/Mods/Reminder/reminder.js b/src/Mods/Reminder/reminder.js index 22d2a74f28eb4cc0faaeb61c6ced8ee90d3ff5da..8482eaabb8a99ae702af5753ec4e3a79aee1795a 100644 --- a/src/Mods/Reminder/reminder.js +++ b/src/Mods/Reminder/reminder.js @@ -1,140 +1,217 @@ -/** - * @param {string|Node} message - * @param {number} week - * @param {string} [category] - */ -App.Reminders.add = function(message, week, category = "manual") { - if (message === "" || message === null) { - return; - } - const entry = {message: message, week: week, category: category}; - - // V.reminders is sorted by week from low to high, we insert at the correct place so it remains sorted. - const index = V.reminders.findIndex(e => e.week >= week); - if (index === -1) { - V.reminders.push(entry); - } else { - V.reminders.splice(index, 0, entry); - } -}; - -/** - * @param {Object} [obj] - * @param {number} [obj.maxFuture] how far into the future should reminders be displayed. - * @param {string} [obj.category] - * @param {boolean} [obj.link] show link to managePersonalAffairs.tw - * @returns {HTMLSpanElement|DocumentFragment} - */ -App.Reminders.list = function list({maxFuture = Number.POSITIVE_INFINITY, category = "all", link = false} = {}) { - if (V.reminders.length === 0) { - return document.createDocumentFragment(); - } +App.Reminders = (function() { + const displayDiv = document.createElement("div"); + const addDiv = document.createElement("div"); + return { + add: add, + list: list, + fullDisplay: fullDisplay, + slaveDisplay: slaveDisplay, + slaveLink: slaveLink, + dialog: dialog, + }; /** - * @param {string} c - * @returns {boolean} + * @param {string|Node} message + * @param {number} week + * @param {string} [category] + * @param {number} [slaveID] */ - const includedCategory = category === "all" ? () => true : c => c === category; + function add(message, week, category = "manual", slaveID = 0) { + if (message === "" || message === null) { + return; + } + const entry = {message: message, week: week, category: category}; + if (slaveID) { + entry.slaveID = slaveID; + } - const replace = () => App.UI.DOM.replace("#reminder-list", list({ - maxFuture: maxFuture, - category: category, - link: link - })); + // V.reminders is sorted by week from low to high, we insert at the correct place so it remains sorted. + const index = V.reminders.findIndex(e => e.week >= week); + if (index === -1) { + V.reminders.push(entry); + } else { + V.reminders.splice(index, 0, entry); + } + } /** - * @param {{}} entry + * @param {Object} [obj] + * @param {number} [obj.maxFuture] how far into the future should reminders be displayed. + * @param {function(FC.ReminderEntry):boolean} [obj.filter] + * @param {boolean} [obj.link] permit passage links + * @returns {HTMLSpanElement|DocumentFragment} */ - function clearEntry(entry) { - V.reminders.splice(V.reminders.indexOf(entry), 1); - replace(); - } + function list({maxFuture = Number.POSITIVE_INFINITY, filter = null, link = false} = {}) { + if (V.reminders.length === 0) { + return document.createDocumentFragment(); + } - // We only want to remove visible entries - function clearOverdue() { - V.reminders = V.reminders.filter(e => e.week >= V.week || e.week > V.week + maxFuture || !includedCategory(e.category)); - replace(); - } + if (!filter) { + filter = () => true; + } - function clearAll() { - V.reminders = V.reminders.filter(e => e.week > V.week + maxFuture || !includedCategory(e.category)); - replace(); - } + const outerSpan = document.createElement("span"); + + function replace() { + App.UI.DOM.replace(outerSpan, list({ + maxFuture: maxFuture, + filter: filter + })); + App.Utils.scheduleSidebarRefresh(); + } - let outerSpan = document.createElement("span"); - outerSpan.id = "reminder-list"; - - let overdue = 0, any = false; - - V.reminders.filter(e => e.week <= V.week + maxFuture && includedCategory(e.category)) - .forEach(entry => { - any = true; - let week; - let classes = []; // has to be an array, because makeElement takes no empty strings, but empty arrays. - if (entry.week < V.week) { - classes = ["red"]; - week = `${numberWithPluralOne(-(entry.week - V.week), 'week')} ago`; - overdue++; - } else if (entry.week === V.week) { - classes = ["orange"]; - week = "today"; - } else { - if (entry.week <= V.week + 5) { - classes = ["green"]; + /** + * @param {FC.ReminderEntry} entry + */ + function clearEntry(entry) { + V.reminders.splice(V.reminders.indexOf(entry), 1); + replace(); + } + + // We only want to remove visible entries + function clearOverdue() { + V.reminders = V.reminders.filter(e => e.week >= V.week || e.week > V.week + maxFuture || !filter(e)); + replace(); + } + + function clearAll() { + V.reminders = V.reminders.filter(e => e.week > V.week + maxFuture || !filter(e)); + replace(); + } + + let overdue = 0; + let any = false; + + V.reminders.filter(e => e.week <= V.week + maxFuture && filter(e)) + .forEach(entry => { + any = true; + let week; + let classes = []; // has to be an array, because makeElement takes no empty strings, but empty arrays. + if (entry.week < V.week) { + classes = ["red"]; + week = `${numberWithPluralOne(-(entry.week - V.week), 'week')} ago`; + overdue++; + } else if (entry.week === V.week) { + classes = ["orange"]; + week = "today"; + } else { + if (entry.week <= V.week + 5) { + classes = ["green"]; + } + week = `in ${numberWithPluralOne(entry.week - V.week, 'week')}`; } - week = `in ${numberWithPluralOne(entry.week - V.week, 'week')}`; - } - const div = document.createElement("div"); - div.append(entry.message, - " ", App.UI.DOM.makeElement("span", week.toString(), classes), - " ", App.UI.DOM.link("Clear", clearEntry, [entry])); - outerSpan.append(div); - }); + const div = document.createElement("div"); + div.append(entry.message, " ", App.UI.DOM.makeElement("span", week.toString(), classes)); + const slave = getSlave(entry.slaveID); + if (slave) { + const slaveName = link ? + App.UI.DOM.passageLink(SlaveFullName(slave), "Slave Interact", () => { + V.AS = slave.ID; + if (Dialog.isOpen()) { + Dialog.close(); + } + }) : + SlaveFullName(slave); + div.append(" (for ", slaveName, ")"); + } + div.append(" ", App.UI.DOM.link("Clear", clearEntry, [entry])); + outerSpan.append(div); + }); - if (overdue > 0) { - outerSpan.append(App.UI.DOM.makeElement("div", App.UI.DOM.link("Clear Overdue", clearOverdue))); - } - if (any) { - outerSpan.append(App.UI.DOM.makeElement("div", App.UI.DOM.link("Clear all", clearAll))); - if (link) { - outerSpan.append(App.UI.DOM.makeElement("div", App.UI.DOM.passageLink("Manage Reminders", "Manage Personal Affairs",))); + if (overdue > 0) { + outerSpan.append(App.UI.DOM.makeElement("div", App.UI.DOM.link("Clear Overdue", clearOverdue))); + } + if (any) { + outerSpan.append(App.UI.DOM.makeElement("div", App.UI.DOM.link("Clear all", clearAll))); } + + return outerSpan; } - return outerSpan; -}; + /** + * @param {function():void} refresh + * @param {string} [category] + * @param {number} [slaveID] + * @returns {HTMLDivElement} + */ + function addField(refresh, category, slaveID) { + jQuery(addDiv).empty(); + + let entry = ""; + let week = 0; + + addDiv.append( + App.UI.DOM.makeTextBox("", v => { entry = v; }), + " in ", App.UI.DOM.makeTextBox(0, v => { week = v; }, true), " weeks.", + " ", App.UI.DOM.link("Add", () => { + add(entry, V.week + week, category, slaveID); + refresh(); + App.Utils.scheduleSidebarRefresh(); + jQuery(addDiv).append(addField(refresh, category, slaveID)); + }) + ); + + return addDiv; + } -/** - * @returns {HTMLDivElement} - */ -App.Reminders.addField = function() { - const div = document.createElement("div"); + /** + * @param {boolean} [link=false] show passage links + * @returns {HTMLElement} + */ + function fullDisplay(link) { + jQuery(displayDiv).empty(); + displayDiv.append(App.UI.DOM.makeElement("h2", "Reminders")); - let entry = ""; - let week = 0; + const listEl = list({link}); + if (listEl !== null) { + displayDiv.append(App.UI.DOM.makeElement("p", listEl, "indent")); + } - div.append(App.UI.DOM.makeTextBox("", v => { entry = v; }), - " in ", App.UI.DOM.makeTextBox(0, v => { week = v; }, true), " weeks.", - " ", App.UI.DOM.passageLink("Add", passage(), () => { App.Reminders.add(entry, V.week + week); })); + displayDiv.append(App.UI.DOM.makeElement("h3", "Add new")); + displayDiv.append(App.UI.DOM.makeElement("p", addField(() => fullDisplay(link)))); + + return displayDiv; + } - return div; -}; + /** + * @param {number} slaveID + * @returns {HTMLElement} + */ + function slaveDisplay(slaveID) { + jQuery(displayDiv).empty(); + displayDiv.append(App.UI.DOM.makeElement("h2", `Reminders for ${SlaveFullName(getSlave(slaveID))}`)); -/** - * @returns {DocumentFragment} - */ -App.Reminders.fullDisplay = function() { - let fragment = document.createDocumentFragment(); + const listEl = list({filter: e => e.slaveID === slaveID}); + if (listEl !== null) { + displayDiv.append(App.UI.DOM.makeElement("p", listEl, "indent")); + } - fragment.append(App.UI.DOM.makeElement("h2", "Reminders")); + displayDiv.append(App.UI.DOM.makeElement("h3", "Add new")); + displayDiv.append(App.UI.DOM.makeElement("p", addField(() => slaveDisplay(slaveID), "slave", slaveID))); - let list = App.Reminders.list(); - if (list !== null) { - fragment.append(App.UI.DOM.makeElement("p", list, "indent")); + return displayDiv; } - fragment.append(App.UI.DOM.makeElement("h3", "Add new")); - fragment.append(App.UI.DOM.makeElement("p", App.Reminders.addField())); + /** + * @param {number} slaveID + * @returns {HTMLElement} + */ + function slaveLink(slaveID) { + return App.UI.DOM.link(String.fromCharCode(0x23f0), () => { + dialog(slaveID); + }); + } - return fragment; -}; + /** + * @param {number} [slaveID] + */ + function dialog(slaveID) { + if (Dialog.isOpen()) { + Dialog.close(); + } + Dialog.setup("Reminders", "reminders"); + const showLinks = Story.lookup("tags", "jump-from-safe").some(x => x.title === passage()); + $(Dialog.body()).empty().append(slaveID ? slaveDisplay(slaveID) : fullDisplay(showLinks)); + Dialog.open(); + } +})(); diff --git a/src/Mods/SecExp/events/attackReport.js b/src/Mods/SecExp/events/attackReport.js new file mode 100644 index 0000000000000000000000000000000000000000..f2d2e87c5e6d76e7fa9afaa76c479671e90f767a --- /dev/null +++ b/src/Mods/SecExp/events/attackReport.js @@ -0,0 +1,1927 @@ +App.Events.attackReport = function() { + V.nextButton = "Continue"; + V.nextLink = "Scheduled Event"; + V.encyclopedia = "Battles"; + const node = new DocumentFragment(); + let r = []; + const { + HisA, + himA, + } = getPronouns(V.assistant.personality > 0 ? assistant.pronouns().main : {pronoun: App.Data.Pronouns.Kind.ai}).appendSuffix("A"); + const {hisP} = getPronouns(V.PC).appendSuffix("P"); + + /* init*/ + const oldRep = V.rep; + const oldAuth = V.SecExp.core.authority; + V.SecExp.war.attacker.losses = Math.trunc(V.SecExp.war.attacker.losses); + if (V.SecExp.war.attacker.losses > V.SecExp.war.attacker.troops) { + V.SecExp.war.attacker.losses = V.SecExp.war.attacker.troops; + } + V.SecExp.core.totalKills += V.SecExp.war.attacker.losses; + V.SecExp.war.losses = Math.trunc(V.SecExp.war.losses); + let loot = 0; + let lostSlaves; + let captives; + const lossesList = []; + + /* result */ + const majorBattleMod = (V.majorBattle === 0) ? 1 : 2; + if (V.majorBattle !== 0) { + V.SecExp.battles.major++; + } + if (V.SecExp.war.result === 3) { + App.UI.DOM.makeElement("h1", `Victory!`, "strong"); + V.SecExp.battles.lossStreak = 0; + V.SecExp.battles.victoryStreak += 1; + V.SecExp.battles.victories++; + } else if (V.SecExp.war.result === -3) { + App.UI.DOM.makeElement("h1", `Defeat!`, "strong"); + V.SecExp.battles.lossStreak += 1; + V.SecExp.battles.victoryStreak = 0; + V.SecExp.battles.losses++; + } else if (V.SecExp.war.result === 2) { + App.UI.DOM.makeElement("h1", `Partial victory!`, "strong"); + V.SecExp.battles.victories++; + } else if (V.SecExp.war.result === -2) { + App.UI.DOM.makeElement("h1", `Partial defeat!`, "strong"); + V.SecExp.battles.losses++; + } else if (V.SecExp.war.result === -1) { + App.UI.DOM.makeElement("h1", `We surrendered`, "strong"); + V.SecExp.battles.losses++; + } else if (V.SecExp.war.result === 0) { + App.UI.DOM.makeElement("h1", `Failed bribery!`, "strong"); + V.SecExp.battles.losses++; + } else if (V.SecExp.war.result === 1) { + App.UI.DOM.makeElement("h1", `Successful bribery!`, "strong"); + V.SecExp.battles.victories++; + } + let end = (V.SecExp.battles.victoryStreak >= 2 || V.SecExp.battles.lossStreak >= 2) ? `,` : `.`; + if (V.SecExp.war.attacker.type === "raiders") { + r.push(`Today, ${asDateString(V.week, random(0, 7))}, our arcology was attacked by a band of wild raiders, ${num(Math.trunc(V.SecExp.war.attacker.troops))} men strong.`); + if (V.SecExp.war.result !== 1 && V.SecExp.war.result !== 0 && V.SecExp.war.result !== -1) { + r.push(`Our defense forces, ${num(Math.trunc(App.SecExp.battle.troopCount()))} strong, clashed with them`); + if (V.SecExp.war.terrain === "urban") { + r.push(`in the streets of`); + if (V.SecExp.war.terrain === "urban") { + r.push(`the old world city surrounding the arcology,`); + } else { + r.push(`of the free city,`); + } + } else if (V.SecExp.war.terrain === "rural") { + r.push(`in the rural land surrounding the free city,`); + } else if (V.SecExp.war.terrain === "hills") { + r.push(`on the hills around the free city,`); + } else if (V.SecExp.war.terrain === "coast") { + r.push(`along the coast just outside the free city,`); + } else if (V.SecExp.war.terrain === "outskirts") { + r.push(`just against the walls of the arcology,`); + } else if (V.SecExp.war.terrain === "mountains") { + r.push(`in the mountains overlooking the arcology,`); + } else if (V.SecExp.war.terrain === "wasteland") { + r.push(`in the wastelands outside the free city territory,`); + } + if (V.SecExp.war.attacker.losses !== V.SecExp.war.attacker.troops) { + r.push(`inflicting`); + num(Math.trunc(V.SecExp.war.attacker.losses)); + r.push(`casualties, while sustaining`); + if (V.SecExp.war.losses > 1) { + r.push(`${num(Math.trunc(V.SecExp.war.losses))} casualties`); + } else if (V.SecExp.war.losses > 0) { + r.push(`a casualty`); + } else { + r.push(`zero`); + } + r.push(`themselves.`); + } else { + r.push(`completely annihilating their troops, while sustaining`); + if (V.SecExp.war.losses > 1) { + r.push(`${num(Math.trunc(V.SecExp.war.losses))} casualties.`); + } else if (V.SecExp.war.losses > 0) { + r.push(`a casualty.`); + } else { + r.push(`zero casualties.`); + } + } + } + if (V.SecExp.war.result === 3) { + if (V.SecExp.war.turns <= 5) { + r.push(`The fight was quick and one sided, our men easily stopped the disorganized horde's futile attempt at raiding your arcology${end}`); + } else if (V.SecExp.war.turns <= 7) { + r.push(`The fight was hard, but in the end our men stopped the disorganized horde attempt at raiding your arcology${end}`); + } else { + r.push(`The fight was long and hard, but our men managed to stop the horde raiding party${end}`); + } + if (V.SecExp.battles.victoryStreak >= 2) { + r.push(`adding another victory to the growing list of our military's successes.`); + } else if (V.SecExp.battles.lossStreak >= 2) { + r.push(`finally putting an end to a series of unfortunate defeats.`); + } + } else if (V.SecExp.war.result === -3) { + if (V.SecExp.war.turns <= 5) { + r.push(`The fight was quick and one sided, our men were easily crushed by the barbaric horde of raiders${end}`); + } else if (V.SecExp.war.turns <= 7) { + r.push(`The fight was hard and in the end the bandits proved too much to handle for our men${end}`); + } else { + r.push(`The fight was long and hard, but despite their bravery the horde proved too much for our men${end}`); + } + if (V.SecExp.battles.victoryStreak >= 2) { + r.push(`so interrupting a long series of military successes.`); + } else if (V.SecExp.battles.lossStreak >= 2) { + r.push(`confirming the long list of recent failures our armed forces collected.`); + } + } else if (V.SecExp.war.result === 2) { + r.push(`The fight was long and hard, but in the end our men managed to repel the raiders, though not without difficulty.`); + } else if (V.SecExp.war.result === -2) { + r.push(`The fight was long and hard. Our men in the end had to yield to the horde raiders, which was fortunately unable to capitalized on their victory.`); + } else if (V.SecExp.war.result === -1) { + r.push(`You gave your troops the order to surrender, obediently they stand down.`); + } else if (V.SecExp.war.result === 0) { + r.push(`You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls.`); + } else if (V.SecExp.war.result === 1) { + r.push(`You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls.`); + } + } else if (V.SecExp.war.attacker.type === "free city") { + r.push(`Today, ${asDateString(V.week, random(0, 7))}, our arcology was attacked by a contingent of mercenaries hired by a competing free city, ${num(Math.trunc(V.SecExp.war.attacker.troops))} men strong.`); + if (V.SecExp.war.result !== 1 && V.SecExp.war.result !== 0 && V.SecExp.war.result !== -1) { + r.push(`Our defense forces, ${num(Math.trunc(App.SecExp.battle.troopCount()))} strong, clashed with them`); + if (V.SecExp.war.terrain === "urban") { + r.push(`in the streets of`); + if (V.SecExp.war.terrain === "urban") { + r.push(`the old world city surrounding the arcology,`); + } else { + r.push(`of the free city,`); + } + } else if (V.SecExp.war.terrain === "rural") { + r.push(`in the rural land surrounding the free city,`); + } else if (V.SecExp.war.terrain === "hills") { + r.push(`on the hills around the free city,`); + } else if (V.SecExp.war.terrain === "coast") { + r.push(`along the coast just outside the free city,`); + } else if (V.SecExp.war.terrain === "outskirts") { + r.push(`just against the walls of the arcology,`); + } else if (V.SecExp.war.terrain === "mountains") { + r.push(`in the mountains overlooking the arcology,`); + } else if (V.SecExp.war.terrain === "wasteland") { + r.push(`in the wastelands outside the free city territory,`); + } + if (V.SecExp.war.attacker.losses !== V.SecExp.war.attacker.troops) { + r.push(`inflicting ${V.SecExp.war.attacker.losses} casualties, while sustaining`); + if (V.SecExp.war.losses > 1) { + r.push(`${num(Math.trunc(V.SecExp.war.losses))} casualties`); + } else if (V.SecExp.war.losses > 0) { + r.push(`a casualty`); + } else { + r.push(`zero`); + } + r.push(`themselves.`); + } else { + r.push(`completely annihilating their troops, while sustaining`); + if (V.SecExp.war.losses > 1) { + r.push(`${num(Math.trunc(V.SecExp.war.losses))} casualties.`); + } else if (V.SecExp.war.losses > 0) { + r.push(`a casualty.`); + } else { + r.push(`zero casualties.`); + } + } + } + if (V.SecExp.war.result === 3) { + if (V.SecExp.war.turns <= 5) { + r.push(`The fight was quick and one sided, our men easily stopped the mercenaries dead in their tracks${end}`); + } else if (V.SecExp.war.turns <= 7) { + r.push(`The fight was hard, but in the end our men stopped the slavers attempt at weakening your arcology${end}`); + } else { + r.push(`The fight was long and hard, but our men managed to stop the free city mercenaries${end}`); + } + if (V.SecExp.battles.victoryStreak >= 2) { + r.push(`adding another victory to the growing list of our military's successes.`); + } else if (V.SecExp.battles.lossStreak >= 2) { + r.push(`finally putting an end to a series of unfortunate defeats.`); + } + } else if (V.SecExp.war.result === -3) { + if (V.SecExp.war.turns <= 5) { + r.push(`The fight was quick and one sided, our men were easily crushed by the consumed mercenary veterans sent against us${end}`); + } else if (V.SecExp.war.turns <= 7) { + r.push(`The fight was hard and in the end the slavers proved too much to handle for our men${end}`); + } else { + r.push(`The fight was long and hard, but despite their bravery the mercenary slavers proved too much for our men${end}`); + } + if (V.SecExp.battles.victoryStreak >= 2) { + r.push(`so interrupting a long series of military successes.`); + } else if (V.SecExp.battles.lossStreak >= 2) { + r.push(`confirming the long list of recent failures our armed forces collected.`); + } + } else if (V.SecExp.war.result === 2) { + r.push(`The fight was long and hard, but in the end our men managed to repel the mercenaries, though not without difficulty.`); + } else if (V.SecExp.war.result === -2) { + r.push(`The fight was long and hard. Our men in the end had to yield to the slavers, which were fortunately unable to capitalized on their victory.`); + } else if (V.SecExp.war.result === -1) { + r.push(`You gave your troops the order to surrender, obediently they stand down.`); + } else if (V.SecExp.war.result === 0) { + r.push(`You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls.`); + } else if (V.SecExp.war.result === 1) { + r.push(`You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls.`); + } + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + r.push(`Today, ${asDateString(V.week, random(0, 7))}, our arcology was attacked by a group of freedom fighters bent on the destruction of the institution of slavery, ${num(Math.trunc(V.SecExp.war.attacker.troops))} men strong.`); + if (V.SecExp.war.result !== 1 && V.SecExp.war.result !== 0 && V.SecExp.war.result !== -1) { + r.push(`Our defense forces, ${num(Math.trunc(App.SecExp.battle.troopCount()))} strong, clashed with them`); + if (V.SecExp.war.terrain === "urban") { + r.push(`in the streets of`); + if (V.SecExp.war.terrain === "urban") { + r.push(`the old world city surrounding the arcology,`); + } else { + r.push(`of the free city,`); + } + } else if (V.SecExp.war.terrain === "rural") { + r.push(`in the rural land surrounding the free city,`); + } else if (V.SecExp.war.terrain === "hills") { + r.push(`on the hills around the free city,`); + } else if (V.SecExp.war.terrain === "coast") { + r.push(`along the coast just outside the free city,`); + } else if (V.SecExp.war.terrain === "outskirts") { + r.push(`just against the walls of the arcology,`); + } else if (V.SecExp.war.terrain === "mountains") { + r.push(`in the mountains overlooking the arcology,`); + } else if (V.SecExp.war.terrain === "wasteland") { + r.push(`in the wastelands outside the free city territory,`); + } + if (V.SecExp.war.attacker.losses !== V.SecExp.war.attacker.troops) { + r.push(`inflicting ${V.SecExp.war.attacker.losses} casualties, while sustaining`); + if (V.SecExp.war.losses > 1) { + r.push(`${num(Math.trunc(V.SecExp.war.losses))} casualties`); + } else if (V.SecExp.war.losses > 0) { + r.push(`a casualty`); + } else { + r.push(`zero`); + } + r.push(`themselves.`); + } else { + r.push(`completely annihilating their troops, while sustaining`); + if (V.SecExp.war.losses > 1) { + r.push(`${num(Math.trunc(V.SecExp.war.losses))} casualties.`); + } else if (V.SecExp.war.losses > 0) { + r.push(`a casualty.`); + } else { + r.push(`zero casualties.`); + } + } + } + if (V.SecExp.war.result === 3) { + if (V.SecExp.war.turns <= 5) { + r.push(`The fight was quick and one sided, our men easily stopped the freedom fighters dead in their tracks${end}`); + } else if (V.SecExp.war.turns <= 7) { + r.push(`The fight was hard, but in the end our men stopped the fighters attack${end}`); + } else { + r.push(`The fight was long and hard, but our men managed to stop the freedom fighters${end}`); + } + if (V.SecExp.battles.victoryStreak >= 2) { + r.push(`adding another victory to the growing list of our military's successes.`); + } else if (V.SecExp.battles.lossStreak >= 2) { + r.push(`finally putting an end to a series of unfortunate defeats.`); + } + } else if (V.SecExp.war.result === -3) { + if (V.SecExp.war.turns <= 5) { + r.push(`The fight was quick and one sided, our men were easily crushed by the fanatical fury of the freedom fighters${end}`); + } else if (V.SecExp.war.turns <= 7) { + r.push(`The fight was hard and in the end the freedom fighters proved too much to handle for our men${end}`); + } else { + r.push(`The fight was long and hard, but despite their bravery the freedom fighters fury proved too much for our men${end}`); + } + if (V.SecExp.battles.victoryStreak >= 2) { + r.push(`so interrupting a long series of military successes.`); + } else if (V.SecExp.battles.lossStreak >= 2) { + r.push(`confirming the long list of recent failures our armed forces collected.`); + } + } else if (V.SecExp.war.result === 2) { + r.push(`The fight was long and hard, but in the end our men managed to repel the freedom fighters, though not without difficulty.`); + } else if (V.SecExp.war.result === -2) { + r.push(`The fight was long and hard. Our men in the end had to yield to the freedom fighters, which were fortunately unable to capitalized on their victory.`); + } else if (V.SecExp.war.result === -1) { + r.push(`You gave your troops the order to surrender, obediently they stand down.`); + } else if (V.SecExp.war.result === 0) { + r.push(`You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls.`); + } else if (V.SecExp.war.result === 1) { + r.push(`You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls.`); + } + } else if (V.SecExp.war.attacker.type === "old world") { + r.push(`Today, ${asDateString(V.week, random(0, 7))}, our arcology was attacked by an old world nation boasting a misplaced sense of superiority, ${num(Math.trunc(V.SecExp.war.attacker.troops))} men strong.`); + if (V.SecExp.war.result !== 1 && V.SecExp.war.result !== 0 && V.SecExp.war.result !== -1) { + r.push(`Our defense forces, ${num(Math.trunc(App.SecExp.battle.troopCount()))} strong, clashed with them`); + if (V.SecExp.war.terrain === "urban") { + r.push(`in the streets of`); + if (V.SecExp.war.terrain === "urban") { + r.push(`the old world city surrounding the arcology,`); + } else { + r.push(`of the free city,`); + } + } else if (V.SecExp.war.terrain === "rural") { + r.push(`in the rural land surrounding the free city,`); + } else if (V.SecExp.war.terrain === "hills") { + r.push(`on the hills around the free city,`); + } else if (V.SecExp.war.terrain === "coast") { + r.push(`along the coast just outside the free city,`); + } else if (V.SecExp.war.terrain === "outskirts") { + r.push(`just against the walls of the arcology,`); + } else if (V.SecExp.war.terrain === "mountains") { + r.push(`in the mountains overlooking the arcology,`); + } else if (V.SecExp.war.terrain === "wasteland") { + r.push(`in the wastelands outside the free city territory,`); + } + if (V.SecExp.war.attacker.losses !== V.SecExp.war.attacker.troops) { + r.push(`inflicting ${V.SecExp.war.attacker.losses} casualties, while sustaining`); + if (V.SecExp.war.losses > 1) { + r.push(`${num(Math.trunc(V.SecExp.war.losses))} casualties`); + } else if (V.SecExp.war.losses > 0) { + r.push(`a casualty`); + } else { + r.push(`zero`); + } + r.push(`themselves.`); + } else { + r.push(`completely annihilating their troops, while sustaining`); + if (V.SecExp.war.losses > 1) { + r.push(`${num(Math.trunc(V.SecExp.war.losses))} casualties.`); + } else if (V.SecExp.war.losses > 0) { + r.push(`a casualty.`); + } else { + r.push(`zero casualties.`); + } + } + } + if (V.SecExp.war.result === 3) { + if (V.SecExp.war.turns <= 5) { + r.push(`The fight was quick and one sided, our men easily stopped the old world soldiers dead in their tracks${end}`); + } else if (V.SecExp.war.turns <= 7) { + r.push(`The fight was hard, but in the end our men stopped the soldiers of the old world${end}`); + } else { + r.push(`The fight was long and hard, but our men managed to stop the old world soldiers${end}`); + } + if (V.SecExp.battles.victoryStreak >= 2) { + r.push(`adding another victory to the growing list of our military's successes.`); + } else if (V.SecExp.battles.lossStreak >= 2) { + r.push(`finally putting an end to a series of unfortunate defeats.`); + } + } else if (V.SecExp.war.result === -3) { + if (V.SecExp.war.turns <= 5) { + r.push(`The fight was quick and one sided, our men were easily crushed by the discipline of the old world armies${end}`); + } else if (V.SecExp.war.turns <= 7) { + r.push(`The fight was hard and in the end the old world proved too much to handle for our men${end}`); + } else { + r.push(`The fight was long and hard, but despite their bravery the determination of the old world troops proved too much for our men${end}`); + } + if (V.SecExp.battles.victoryStreak >= 2) { + r.push(`so interrupting a long series of military successes.`); + } else if (V.SecExp.battles.lossStreak >= 2) { + r.push(`confirming the long list of recent failures our armed forces collected.`); + } + } else if (V.SecExp.war.result === 2) { + r.push(`The fight was long and hard, but in the end our men managed to repel the old world soldiers, though not without difficulty.`); + } else if (V.SecExp.war.result === -2) { + r.push(`The fight was long and hard. Our men in the end had to yield to the old world soldiers, which were fortunately unable to capitalized on their victory.`); + } else if (V.SecExp.war.result === -1) { + r.push(`You gave your troops the order to surrender, obediently they stand down.`); + } else if (V.SecExp.war.result === 0) { + r.push(`You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls.`); + } else if (V.SecExp.war.result === 1) { + r.push(`You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls.`); + } + } + App.Events.addParagraph(node, r); + r = []; + /* calculates effects on the city */ + if (V.SecExp.war.result === 3) { + r.push(`Thanks to your victory, your <span class="green">reputation</span> and <span class="darkviolet">authority</span> increased. You were also able to capture`); + if (V.SecExp.war.attacker.type === "raiders") { + repX(4000 * majorBattleMod, "war"); + V.SecExp.core.authority += 800 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "free city") { + repX(6000 * majorBattleMod, "war"); + V.SecExp.core.authority += 1200 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + repX(7500 * majorBattleMod, "war"); + V.SecExp.core.authority += 1500 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "old world") { + repX(6000 * majorBattleMod, "war"); + V.SecExp.core.authority += 1200 * majorBattleMod; + } + if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 50) { + r.push(`a small amount of attackers,`); + captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3); + } else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 100) { + r.push(`an healthy group of attackers,`); + captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3); + } else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 150) { + r.push(`a big group of attackers,`); + captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3); + } else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses <= 200) { + r.push(`a huge group of attackers,`); + captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3); + } else if (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses > 200) { + r.push(`a great amount of attackers,`); + captives = (V.SecExp.war.attacker.troops - V.SecExp.war.attacker.losses) * 0.1 * random(1, 3); + } + r.push(`and some of their equipment, which once sold produced`); + if (V.SecExp.war.attacker.equip === 0) { + r.push(`<span class="yellowgreen">a small amount of cash.</span>`); + loot += 1000 * majorBattleMod; + } else if (V.SecExp.war.attacker.equip === 1) { + r.push(`<span class="yellowgreen">a moderate amount of cash.</span>`); + loot += 5000 * majorBattleMod; + } else if (V.SecExp.war.attacker.equip === 2) { + r.push(`<span class="yellowgreen">a good amount of cash.</span>`); + loot += 10000 * majorBattleMod; + } else if (V.SecExp.war.attacker.equip === 3) { + r.push(`<span class="yellowgreen">a great amount of cash.</span>`); + loot += 15000 * majorBattleMod; + } else if (V.SecExp.war.attacker.equip === 4) { + r.push(`<span class="yellowgreen">wealth worthy of the mightiest warlord.</span>`); + loot += 20000 * majorBattleMod; + } + if (V.SecExp.edicts.defense.privilege.mercSoldier === 1 && App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`Part of the loot is distributed to your mercenaries.`); + captives = Math.trunc(captives * 0.6); + loot = Math.trunc(loot * 0.6); + } + cashX(loot, "war"); + App.Events.addParagraph(node, r); + r = []; + r.push(`Damage to the infrastructure was <span class="yellow">virtually non-existent,</span> costing only pocket cash to bring the structure back to normal. The inhabitants as well reported little to no injuries, because of this the prosperity of the arcology did not suffer.`); + r.push(`${IncreasePCSkills('engineering', 0.1)}`); + cashX(forceNeg(1000 * majorBattleMod), "war"); + if (V.SecExp.battles.victoryStreak >= 3) { + r.push(`It seems your victories over the constant threats directed your way is having <span class="green">a positive effect on the prosperity of the arcology,</span> due to the security your leadership affords.`); + V.arcologies[0].prosperity += 5 * majorBattleMod; + } + } else if (V.SecExp.war.result === -3) { + r.push(`Due to your defeat, your <span class="red">reputation</span> and <span class="red">authority</span> decreased. Obviously your troops were not able to capture anyone or anything.`); + if (V.SecExp.war.attacker.type === "raiders") { + repX(forceNeg(400 * majorBattleMod), "war"); + V.SecExp.core.authority -= 400 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "free city") { + repX(forceNeg(600 * majorBattleMod), "war"); + V.SecExp.core.authority -= 600 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + repX(forceNeg(750 * majorBattleMod), "war"); + V.SecExp.core.authority -= 750 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "old world") { + repX(forceNeg(600 * majorBattleMod), "war"); + V.SecExp.core.authority -= 600 * majorBattleMod; + } + App.Events.addParagraph(node, r); + r = []; + r.push(`In the raiding following the battle <span class="red">the arcology sustained heavy damage,</span> which will cost quite the amount of cash to fix. Reports of <span class="red">citizens or slaves killed or missing</span> flood your office for a few days following the defeat.`); + r.push(`${IncreasePCSkills('engineering', 0.1)}`); + cashX(forceNeg(5000 * majorBattleMod), "war"); + if (V.week <= 30) { + V.lowerClass -= random(100) * majorBattleMod; + lostSlaves = random(150) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(5) * majorBattleMod; + } else if (V.week <= 60) { + V.lowerClass -= random(120) * majorBattleMod; + lostSlaves = random(170) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(10) * majorBattleMod; + } else if (V.week <= 90) { + V.lowerClass -= random(140) * majorBattleMod; + lostSlaves = random(190) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(15) * majorBattleMod; + } else if (V.week <= 120) { + V.lowerClass -= random(160) * majorBattleMod; + lostSlaves = random(210) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(20) * majorBattleMod; + } else { + V.lowerClass -= random(180) * majorBattleMod; + lostSlaves = random(230) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(25) * majorBattleMod; + } + if (V.SecExp.battles.lossStreak >= 3) { + r.push(`This only confirms the fears of many, <span class="red">your arcology is not safe</span> and it is clear their business will be better somewhere else.`); + V.arcologies[0].prosperity -= 5 * majorBattleMod; + } + } else if (V.SecExp.war.result === 2) { + r.push(`Thanks to your victory, your <span class="green">reputation</span> and <span class="darkviolet">authority</span> slightly increased. Our men were not able to capture any combatants, however some equipment was seized during the enemy's hasty retreat,`); + if (V.SecExp.war.attacker.type === "raiders") { + repX(1000 * majorBattleMod, "war"); + V.SecExp.core.authority += 200 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "free city") { + repX(1500 * majorBattleMod, "war"); + V.SecExp.core.authority += 300 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + repX(2000 * majorBattleMod, "war"); + V.SecExp.core.authority += 450 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "old world") { + repX(1500 * majorBattleMod, "war"); + V.SecExp.core.authority += 300 * majorBattleMod; + } + r.push(`which once sold produced`); + if (V.SecExp.war.attacker.equip === 0) { + r.push(`<span class="yellowgreen">a bit of cash.</span>`); + loot += 500 * majorBattleMod; + } else if (V.SecExp.war.attacker.equip === 1) { + r.push(`<span class="yellowgreen">a small amount of cash.</span>`); + loot += 2500 * majorBattleMod; + } else if (V.SecExp.war.attacker.equip === 2) { + r.push(`<span class="yellowgreen">a moderate amount of cash.</span>`); + loot += 5000 * majorBattleMod; + } else if (V.SecExp.war.attacker.equip === 3) { + r.push(`<span class="yellowgreen">a good amount of cash.</span>`); + loot += 7500 * majorBattleMod; + } else if (V.SecExp.war.attacker.equip === 4) { + r.push(`<span class="yellowgreen">a great amount of cash.</span>`); + loot += 10000 * majorBattleMod; + } + if (V.SecExp.edicts.defense.privilege.mercSoldier === 1 && App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`Part of the loot is distributed to your mercenaries.`); + loot = Math.trunc(loot * 0.6); + } + cashX(loot, "war"); + App.Events.addParagraph(node, r); + r = []; + r.push(`Damage to the city was <span class="red">limited,</span> it won't take much to rebuild. Very few citizens or slaves were involved in the fight and even fewer met their end, safeguarding the prosperity of the arcology.`); + r.push(`${IncreasePCSkills('engineering', 0.1)}`); + cashX(forceNeg(2000 * majorBattleMod), "war"); + V.lowerClass -= random(10) * majorBattleMod; + lostSlaves = random(20) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + } else if (V.SecExp.war.result === -2) { + r.push(`It was a close defeat, but nonetheless your <span class="red">reputation</span> and <span class="red">authority</span> slightly decreased. Your troops were not able to capture anyone or anything.`); + if (V.SecExp.war.attacker.type === "raiders") { + repX(forceNeg(40 * majorBattleMod), "war"); + V.SecExp.core.authority -= 40 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "free city") { + repX(forceNeg(60 * majorBattleMod), "war"); + V.SecExp.core.authority -= 60 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + repX(forceNeg(75 * majorBattleMod), "war"); + V.SecExp.core.authority -= 75 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "old world") { + repX(forceNeg(60 * majorBattleMod), "war"); + V.SecExp.core.authority -= 60 * majorBattleMod; + } + App.Events.addParagraph(node, r); + r = []; + r.push(`The enemy did not have the strength to raid the arcology for long, still <span class="red">the arcology sustained some damage,</span> which will cost a moderate amount of cash to fix. Some citizens and slaves found themselves on the wrong end of a gun and met their demise.`); + r.push(`Some business sustained heavy damage, slightly impacting the arcology's prosperity.`); + r.push(`${IncreasePCSkills('engineering', 0.1)}`); + cashX(forceNeg(3000 * majorBattleMod), "war"); + if (V.week <= 30) { + V.lowerClass -= random(50) * majorBattleMod; + lostSlaves = random(75) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(2) * majorBattleMod; + } else if (V.week <= 60) { + V.lowerClass -= random(60) * majorBattleMod; + lostSlaves = random(85) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(5) * majorBattleMod; + } else if (V.week <= 90) { + V.lowerClass -= random(70) * majorBattleMod; + lostSlaves = random(95) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(7) * majorBattleMod; + } else if (V.week <= 120) { + V.lowerClass -= random(80) * majorBattleMod; + lostSlaves = random(105) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(10) * majorBattleMod; + } else { + V.lowerClass -= random(90) * majorBattleMod; + lostSlaves = random(115) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(12) * majorBattleMod; + } + } else if (V.SecExp.war.result === -1) { + r.push(`Rather than waste the lives of your men you decided to surrender, hoping your enemy will cause less damage if you indulge them, this is however a big hit to your status. Your <span class="red">reputation</span> and <span class="red">authority</span> are significantly impacted.`); + if (V.SecExp.war.attacker.type === "raiders") { + repX(forceNeg(600 * majorBattleMod), "war"); + V.SecExp.core.authority -= 600 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "free city") { + repX(forceNeg(800 * majorBattleMod), "war"); + V.SecExp.core.authority -= 800 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + repX(forceNeg(1000 * majorBattleMod), "war"); + V.SecExp.core.authority -= 1000 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "old world") { + repX(forceNeg(800 * majorBattleMod), "war"); + V.SecExp.core.authority -= 800 * majorBattleMod; + } + App.Events.addParagraph(node, r); + r = []; + r.push(`The surrender allows the arcology to survive <span class="red">mostly intact,</span> however reports of <span class="red">mass looting and killing of citizens</span> flood your office for a few days.`); + r.push(`${IncreasePCSkills('engineering', 0.1)}`); + cashX(forceNeg(1000 * majorBattleMod), "war"); + if (V.week <= 30) { + V.lowerClass -= random(80) * majorBattleMod; + lostSlaves = random(120) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(5) * majorBattleMod; + } else if (V.week <= 60) { + V.lowerClass -= random(100) * majorBattleMod; + lostSlaves = random(140) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(10) * majorBattleMod; + } else if (V.week <= 90) { + V.lowerClass -= random(120) * majorBattleMod; + lostSlaves = random(160) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(15) * majorBattleMod; + } else if (V.week <= 120) { + V.lowerClass -= random(140) * majorBattleMod; + lostSlaves = random(180) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(20) * majorBattleMod; + } else { + V.lowerClass -= random(160) * majorBattleMod; + lostSlaves = random(200) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(25) * majorBattleMod; + } + } else if (V.SecExp.war.result === 0) { + r.push(`Unfortunately your adversary did not accept your money.`); + if (V.SecExp.war.attacker.type === "freedom fighters") { + r.push(`Their ideological crusade would not allow such thing.`); + } else { + r.push(`They saw your attempt as nothing more than admission of weakness.`); + } + r.push(`There was no time to organize a defense and so the enemy walked into the arcology as it was his. Your reputation and authority suffer a hit.`); + if (V.SecExp.war.attacker.type === "raiders") { + repX(forceNeg(400 * majorBattleMod), "war"); + V.SecExp.core.authority -= 400 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "free city") { + repX(forceNeg(600 * majorBattleMod), "war"); + V.SecExp.core.authority -= 600 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + repX(forceNeg(750 * majorBattleMod), "war"); + V.SecExp.core.authority -= 750 * majorBattleMod; + } else if (V.SecExp.war.attacker.type === "old world") { + repX(forceNeg(600 * majorBattleMod), "war"); + V.SecExp.core.authority -= 600 * majorBattleMod; + } + App.Events.addParagraph(node, r); + r = []; + r.push(`Fortunately the arcology survives <span class="yellow">mostly intact,</span> however reports of <span class="red">mass looting and killing of citizens</span> flood your office for a few days.`); + r.push(`${IncreasePCSkills('engineering', 0.1)}`); + cashX(-1000, "war"); + if (V.week <= 30) { + V.lowerClass -= random(80) * majorBattleMod; + lostSlaves = random(120) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(5) * majorBattleMod; + } else if (V.week <= 60) { + V.lowerClass -= random(100) * majorBattleMod; + lostSlaves = random(140) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(10) * majorBattleMod; + } else if (V.week <= 90) { + V.lowerClass -= random(120) * majorBattleMod; + lostSlaves = random(160) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(15) * majorBattleMod; + } else if (V.week <= 120) { + V.lowerClass -= random(140) * majorBattleMod; + lostSlaves = random(180) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(20) * majorBattleMod; + } else { + V.lowerClass -= random(160) * majorBattleMod; + lostSlaves = random(200) * majorBattleMod; + V.NPCSlaves -= Math.trunc((V.NPCSlaves / V.ASlaves) * lostSlaves); + V.menials -= Math.trunc((V.menials / V.ASlaves) * lostSlaves); + V.fuckdolls -= Math.trunc((V.fuckdolls / V.ASlaves) * lostSlaves); + V.menialBioreactors -= Math.trunc((V.menialBioreactors / V.ASlaves) * lostSlaves); + V.arcologies[0].prosperity -= random(25) * majorBattleMod; + } + App.Events.addParagraph(node, r); + r = []; + } else if (V.SecExp.war.result === 1) { + r.push(`The attackers wisely take the money offered them to leave your territory without further issues. The strength of the Free Cities was never in their guns but in their dollars, and today's events are the perfect demonstration of such strength.`); + r.push(`Your <span class="green">reputation slightly increases.</span>`); + if (V.SecExp.war.attacker.type === "raiders") { + repX(500 * majorBattleMod, "war"); + } else if (V.SecExp.war.attacker.type === "free city") { + repX(750 * majorBattleMod, "war"); + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + repX(1000 * majorBattleMod, "war"); + } else if (V.SecExp.war.attacker.type === "old world") { + repX(750 * majorBattleMod, "war"); + } + cashX(forceNeg(App.SecExp.battle.bribeCost()), "war"); + } + if (!Number.isInteger(V.lowerClass)) { + if (isNaN(V.lowerClass)) { + r.push(App.UI.DOM.makeElement("div", `Error: lowerClass is NaN, please report this issue`, "red")); + } else if (V.lowerClass > 0) { + V.lowerClass = Math.trunc(V.lowerClass); + } else { + V.lowerClass = 0; + } + } + if (!Number.isInteger(V.NPCSlaves)) { + if (isNaN(V.NPCSlaves)) { + r.push(App.UI.DOM.makeElement("div", `Error: NPCSlaves is NaN, please report this issue`, "red")); + } else if (V.NPCSlaves > 0) { + V.NPCSlaves = Math.trunc(V.NPCSlaves); + } else { + V.NPCSlaves = 0; + } + } + + App.Events.addParagraph(node, r); + r = []; + if (V.SecExp.war.result !== 1 && V.SecExp.war.result !== 0 && V.SecExp.war.result !== -1) { + /* leaders */ + if (V.SecExp.war.commander === "PC") { + r.push(`You decided to personally lead the defense of your arcology.`); + if (App.SecExp.battle.deployedUnits('militia') >= 1) { + if (oldRep <= 2500) { + if (oldRep > 1000) { + r.push(`You're not particularly popular between the inhabitants of your arcology, so your presence does little to reassure the volunteers.`); + } else { + r.push(`As your low reputation proves, your volunteers do not particularly enjoy your company. As far as they are concerned your presence is more of a hindrance than an advantage.`); + } + if (V.PC.career === "celebrity") { + r.push(`Still, your past celebrity does carry some weight, and many look forward to fight alongside a famous name.`); + } else if (V.PC.career === "capitalist") { + r.push(`Still, your past life as a famous venture capitalist does carry some weight, and many trust in your cunning to save them in the incoming battle.`); + } else if (V.PC.career === "gang") { + r.push(`The situation is not made easier by your past. Many still remember you as the gang leader who used to be on the other side of their guns.`); + } else if (V.PC.career === "escort") { + r.push(`The situation is not made easier by your past. Many still remember your past career as an escort and doubt you'll be of any use during the fighting.`); + } else if (V.PC.career === "mercenary") { + r.push(`Still, your past mercenary work does carry some weight, and many look forward to fight alongside a battle hardened name.`); + } + } else if (oldRep >= 5000) { + if (oldRep < 15000) { + r.push(`Your citizens are honored that their arcology owner is willing to put ${hisP} life in danger.`); + } else { + r.push(`Many among the volunteers are awed by your presence; never would they have thought they would fight shoulder to shoulder with their famous arcology owner.`); + } + if (V.PC.career === "celebrity") { + r.push(`They consider it a priceless opportunity to fight together with someone with such a renowned past as yours. Your celebrity past still carries weight.`); + } else if (V.PC.career === "capitalist") { + r.push(`They consider it a priceless opportunity to fight together with one of the great capitalist sharks of their time. Such a fine mind on their side can only bring victory!`); + } else if (V.PC.career === "gang") { + r.push(`Your past, however, does not help you. Many still remember you as the gang leader who used to be on the other side of their guns.`); + } else if (V.PC.career === "escort") { + r.push(`Your past, however, does not help you. Many still remember your past career as an escort and doubt you'll be of any use during the fighting.`); + } else if (V.PC.career === "mercenary") { + r.push(`Your past mercenary work does carries some weight, and many look forward to fight alongside a battle hardened name.`); + } + } + } + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + if (oldAuth <= 2500) { + if (oldAuth > 1000) { + r.push(`Your slave soldiers do not feel bound to you as much as they should, as your authority is far from absolute.`); + } else { + r.push(`Your slave soldiers are often openly rebellious. Only the threat of execution holds them in line.`); + } + if (V.PC.career === "escort") { + r.push(`Fortunately many feel some level of kinship with you, thanks to your past as an escort.`); + } else if (V.PC.career === "servant") { + r.push(`Fortunately many feel some level of kinship with you, thanks to your past as a servant.`); + } else if (V.PC.career === "slaver") { + r.push(`Things are made worse by your past as a notorious slaver.`); + } else if (V.PC.career === "mercenary") { + r.push(`Your past mercenary work carries some weight, and many look forward to fighting alongside a battle hardened name.`); + } + } else if (oldAuth >= 5000) { + if (oldAuth < 15000) { + r.push(`Your slave soldiers show a surprising amount of discipline, thanks to your high authority.`); + } else { + r.push(`Your slave soldiers show almost a fanatical level of martial discipline. Your absolute authority has a great effect on them.`); + } + if (V.PC.career === "escort") { + r.push(`Many have an instinctual feeling of kinship towards you because of your past as an escort.`); + } else if (V.PC.career === "servant") { + r.push(`Many have an instinctual feeling of kinship towards you because of your past as a servant.`); + } else if (V.PC.career === "slaver") { + r.push(`Still, some rebellious looks can be spotted once in a while. In their eyes your slaver past will always paint you in a dark light.`); + } else if (V.PC.career === "mercenary") { + r.push(`Your past mercenary work carries some weight, and many look forward to fighting alongside a battle hardened name.`); + } + } + } + if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + const mercLoyalty = App.SecExp.mercenaryAvgLoyalty(); + if (mercLoyalty <= 25) { + if (mercLoyalty <= 10) { + r.push(`Your mercenaries barely bother to pretend being loyal; their battle performance is obviously barely passable.`); + } else { + r.push(`Your presence does little to spur your mercenaries into action; their loyalty is straining and their performance suffers.`); + } + if (V.PC.career === "mercenary") { + r.push(`Thankfully they hold in high regard someone who made their fortune as a mercenary themselves.`); + } else if (V.PC.career === "wealth") { + r.push(`They do little to hide the contempt they have for someone who was born into wealth, rather than gaining it through blood, sweat, and tears.`); + } else if (V.PC.career === "servant") { + r.push(`They do little to hide their disgust at being ordered around by an ex-servant.`); + } else if (V.PC.career === "BlackHat") { + r.push(`They do little to hide their disgust at being ordered around by some unscrupulous code monkey.`); + } + } else if (mercLoyalty >= 50) { + if (mercLoyalty < 75) { + r.push(`Your mercenaries are ready to fight their hardest for you, their loyalty a testament to your capability as a leader.`); + } else { + r.push(`Your mercenaries fight with a martial fury worthy of religious fanatics. Their loyalty to you is absolute.`); + } + if (V.PC.career === "mercenary") { + r.push(`They're more than willing to follow someone who walked their same steps once as a gun for hire.`); + } else if (V.PC.career === "wealth") { + r.push(`Unfortunately many still resent you being born into your wealth and power, rather than having earned it through blood, sweat, and tears.`); + } else if (V.PC.career === "servant") { + r.push(`Unfortunately some still resent the fact they are ordered around by an ex-servant.`); + } else if (V.PC.career === "BlackHat") { + r.push(`Unfortunately some still resent the fact they are ordered around by an unscrupulous hacker.`); + } + } + if (oldRep >= 15000) { + r.push(`Your reputation is so high your name carries power by itself. Having you on the battlefield puts fear even in the hardiest of warriors.`); + } + } + if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + if (V.PC.career === "mercenary" || V.PC.career === "slaver" || V.PC.career === "capitalist" || V.PC.career === "gang" || V.PC.skill.warfare > 75) { + r.push(`The soldiers of ${V.SF.Lower} are ready and willing to follow you into battle, confident in your past experience.`); + } else if (V.PC.career === "wealth" || V.PC.career === "medicine" || V.PC.career === "engineer") { + r.push(`The soldiers of ${V.SF.Lower}, as loyal as they are, are not enthusiastic to follow the orders of someone who has no experience leading men.`); + } else if (V.PC.career === "servant") { + r.push(`The soldiers of ${V.SF.Lower}, as loyal as they are, are not enthusiastic to follow the orders of an ex-servant.`); + } else if (V.PC.career === "escort") { + r.push(`The soldiers of ${V.SF.Lower}, as loyal as they are, are not enthusiastic to follow the orders of an ex-escort.`); + } else if (V.PC.career === "BlackHat") { + r.push(`The soldiers of ${V.SF.Lower}, as loyal as they are, are not enthusiastic to follow the orders of a dubious incursion specialist.`); + } + } + if (V.PC.skill.warfare <= 25 && V.PC.skill.warfare > 10) { + r.push(`Your inexperience in military matters has a negative impact on your troops performance and the effectiveness of your battle plan.`); + } else if (V.PC.skill.warfare <= 10) { + r.push(`Your ignorance in military matters has a severe negative impact on your troops performance and the effectiveness of your battle plan.`); + } else if (V.PC.skill.warfare >= 50) { + r.push(`Your experience in military matters has a positive impact on your troops performance and the effectiveness of your battle plan.`); + } else if (V.PC.skill.warfare >= 75) { + r.push(`Your great experience in military matters has a major positive impact on your troops performance and the effectiveness of your battle plan.`); + } + if (V.SecExp.war.gainedWarfare) { + r.push(`Battlefield experience increased your understanding of warfare, making you a better commander.`); + } + if (V.PC.health.shortDamage >= 60) { + r.push(`During the fighting <span class="red">you were wounded.</span> Your medics assure you it's nothing life threatening, but you'll be weakened for a few weeks.`); + } + } else if (V.SecExp.war.commander === "assistant") { + if (V.auto === 1) { + r.push(`${V.assistant.name}`); + } else { + r.push(`You`); + } + r.push(`let your personal assistant lead the troops.`); + if (App.SecExp.battle.deployedUnits('mercs') >= 1 || App.SecExp.battle.deployedUnits('militia') >= 1 || App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`No soldier trusts a computer to be their commander,`); + if (oldRep < 10000 && oldAuth < 10000) { + r.push(`no algorithm can substitute experience,`); + if (V.assistant.power === 0) { + r.push(`and as expected,`); + } else { + r.push(`however,`); + } + } else { + r.push(`but they trust you enough to not question your decision,`); + if (V.assistant.power === 0) { + r.push(`however`); + } else { + r.push(`and`); + } + } + } else { + r.push(`You find`); + } + if (V.assistant.power === 0) { + r.push(`your assistant gives a rather poor field performance, due to the limited computing power available to ${himA}.`); + } else if (V.assistant.power === 1) { + r.push(`your assistant performs decently. While nothing to write home about your men are pleasantly surprised.`); + } else if (V.assistant.power === 2) { + r.push(`your assistant performs admirably. ${HisA} upgraded computing power allows ${himA} to monitor the battlefield closely, enhancing the efficiency of your troops and the effectiveness of your battle plan.`); + } else if (V.assistant.power >= 3) { + r.push(`your assistant performs admirably. ${HisA} vast computing power allows ${himA} to be everywhere on the battlefield, greatly enhancing the efficiency of your troops and the effectiveness of your battle plan.`); + } + } else if (V.SecExp.war.commander === "bodyguard") { + const { + His, He, + his, he, him + } = getPronouns(S.Bodyguard); + if (V.auto === 1) { + r.push(`${V.assistant.name}`); + } else { + r.push(`You`); + } + r.push(`decided it will be your bodyguard that leads the troops.`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + if (S.Bodyguard.devotion < -20) { + r.push(`${His} low devotion has a negative impact on the morale of your slave soldiers.`); + } else if (S.Bodyguard.devotion > 51) { + r.push(`${His} devotion to you has a positive impact on the morale of your slave soldiers, proud to be led by one of their own.`); + } + } + if (oldRep < 10000 && oldAuth < 10000 || S.Bodyguard.prestige < 1) { + if (App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`Your volunteers`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however`); + } + r.push(`are not enthusiastic to have a slave as a`); + if (V.SF.Toggle && V.SF.Active >= 1 && App.SecExp.battle.deployedUnits('mercs') === 1 && V.SecExp.war.deploySF) { + r.push(`commander, and neither are your mercenaries or your soldiers.`); + } else if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`commander, and neither are your mercenaries.`); + } else if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`commander, and neither are your soldiers.`); + } else { + r.push(`commander.`); + } + } else if (V.SF.Toggle && V.SF.Active >= 1 && App.SecExp.battle.deployedUnits('mercs') === 1 && V.SecExp.war.deploySF) { + r.push(`Your mercenaries and soldiers`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however`); + } + r.push(`are not enthusiastic to have a slave as a commander.`); + } else if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`Your mercenaries`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however`); + } + r.push(`are not enthusiastic to have a slave as a commander.`); + } else if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`Your soldiers`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however`); + } + r.push(`are not enthusiastic to have a slave as a commander.`); + } + } else if (S.Bodyguard.prestige >= 2) { + if (App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`Your`); + if (App.SecExp.battle.deployedUnits('mercs') === 1 && V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`volunteers, your mercenaries and your soldiers are delighted to have such a prestigious individual as their commander, almost forgetting ${he} is a slave.`); + } else if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`volunteers and your mercenaries are delighted to have such a prestigious individual as their commander, almost forgetting ${he} is a slave.`); + } else if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`volunteers and your soldiers are delighted to have such a prestigious individual as their commander, almost forgetting ${he} is a slave.`); + } else { + r.push(`volunteers are delighted to have such a prestigious individual as their commander, almost forgetting ${he} is a slave.`); + } + } else if (App.SecExp.battle.deployedUnits('mercs') === 1 && V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`Your mercenaries and soldiers are delighted to have such a prestigious individual as their commander, almost forgetting ${he} is a slave.`); + } else if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`Your mercenaries are delighted to have such a prestigious individual as their commander, almost forgetting ${he} is a slave.`); + } else if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`Your soldiers are delighted to have such a prestigious individual as their commander, almost forgetting ${he} is a slave.`); + } + } else { + if (App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`Your volunteers`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however`); + } + r.push(`are not enthusiastic to have a slave as a`); + if (App.SecExp.battle.deployedUnits('mercs') === 1 && V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`commander, and neither are your mercenaries and soldiers, but they trust you enough not to question your decision.`); + } else if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`commander, and neither are your mercenaries, but they trust you enough not to question your decision.`); + } else if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`commander, and neither are your soldiers, but they trust you enough not to question your decision.`); + } else { + r.push(`commander, but they trust you enough not to question your decision.`); + } + } else if (App.SecExp.battle.deployedUnits('mercs') === 1 && V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`Your mercenaries and soldiers`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however,`); + } + r.push(`are not enthusiastic to have a slave as a commander, but they trust you enough not to question your decision.`); + } else if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`Your mercenaries`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however,`); + } + r.push(`are not enthusiastic to have a slave as a commander, but they trust you enough not to question your decision.`); + } else if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`Your soldiers`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however,`); + } + r.push(`are not enthusiastic to have a slave as a commander, but they trust you enough not to question your decision.`); + } + } + const BGCareerGivesBonus = App.Data.Careers.Leader.bodyguard.includes(S.Bodyguard.career) || App.Data.Careers.Leader.HG.includes(S.Bodyguard.career) || App.Data.misc.secExCombatPrestige.includes(S.Bodyguard.prestigeDesc); + const BGTotalIntelligence = S.Bodyguard.intelligence + S.Bodyguard.intelligenceImplant; + if (BGCareerGivesBonus && BGTotalIntelligence > 95) { + r.push(`With ${his} experience and ${his} great intellect, ${he} is able to exploit the smallest of tactical advantages, making your troops very effective.`); + } else if (BGTotalIntelligence > 95) { + r.push(`While ${he} lacks experience, ${his} great intellect allows ${him} to seize and exploit any tactical advantage the battlefield offers ${him}.`); + } else if (BGCareerGivesBonus && BGTotalIntelligence > 50) { + r.push(`Having both the experience and the intelligence, ${he} performs admirably as your commander. ${His} competence greatly increases the efficiency of your troops.`); + } else if (BGTotalIntelligence > 50) { + r.push(`Despite not having a lot of experience as a leader, ${his} intelligence makes ${him} a good commander, increasing the efficiency of your troops.`); + } else if (BGCareerGivesBonus && BGTotalIntelligence > 15) { + r.push(`Thanks to ${his} experience, ${he} is a decent commander, competently guiding your troops through the battle.`); + } else if (BGTotalIntelligence > 15) { + r.push(`Lacking experience, ${his} performance as a commander is rather forgettable.`); + } else if (BGCareerGivesBonus && BGTotalIntelligence < -50) { + r.push(`Despite the experience ${he} accumulated during ${his} past career, ${his} very low intelligence is a great disadvantage for your troops.`); + } else if (BGTotalIntelligence < -50) { + r.push(`Without experience and low intelligence, ${he} performs horribly as a commander, greatly affecting your troops.`); + } else if (BGCareerGivesBonus && BGTotalIntelligence < -15) { + r.push(`Despite the experience ${he} accumulated during ${his} past career, ${he} lacks the intelligence to apply it quickly and effectively, making for a rather poor performance in the field.`); + } else if (BGTotalIntelligence < -15) { + r.push(`${He} lacks the experience and the intelligence to be an effective commander, the performance of your troops suffers because of ${his} poor leadership.`); + } + if (V.SecExp.war.gainedCombat) { + r.push(`During the battle, ${he} had to fight for ${his} life, giving ${him} experience in modern combat. ${He} is now proficient with modern firearms and hand to hand combat.`); + } + if (V.SecExp.war.leaderWounded) { + r.push(`Unfortunately, <span class="red">${he} sustained major injuries.</span>`); + const woundType = App.SecExp.inflictBattleWound(S.Bodyguard); + if (woundType === "voice") { + r.push(`A stray bullet hit ${his} neck. While ${he} fortunately avoided fatal hemorrhaging, ${his} vocal cords were irreparably damaged.`); + } else if (woundType === "eyes") { + r.push(`Some shrapnel found ${his} eyes as their final target, blinding ${him} permanently.`); + } else if (woundType === "legs") { + r.push(`A grenade landed close to ${him}, and ${his} badly mangled legs had to be amputated.`); + } else if (woundType === "arm") { + r.push(`A shrapnel blast mangled one of ${his} arms, which had to be amputated.`); + } else if (woundType === "flesh") { + r.push(`While gravely wounded, it seems ${he} will be able to fully recover, given enough time.`); + } + r.push(`Your troops were greatly affected by the loss of their leader.`); + } + if (V.SecExp.war.result === 3 && V.SecExp.settings.battle.allowSlavePrestige === 1) { + let found = 0; + for (const victory of V.SecExp.battles.slaveVictories) { + if (victory.ID === V.BodyguardID) { + victory.victories++; + found = 1; + if (victory.victories >= 10) { + if (S.Bodyguard.prestige < 3) { + S.Bodyguard.prestige++; + if (S.Bodyguard.prestige === 1) { + S.Bodyguard.prestigeDesc = "$He is well known for being a great commander."; + } else if (S.Bodyguard.prestige === 2) { + S.Bodyguard.prestigeDesc = "$He is famous for being an incredible commander."; + } else if (S.Bodyguard.prestige === 3) { + S.Bodyguard.prestigeDesc = "$He is known as a legendary commander all over the world."; + } + victory.victories = 0; + r.push(`${He} brought your army to victory so many times that ${his} <span class="green">prestige has increased.</span>`); + } + } + break; + } + } + if (found === 0) { + const newSlave = {ID: V.BodyguardID, victories: 0}; + V.SecExp.battles.slaveVictories.push(newSlave); + } + } + } else if (V.SecExp.war.commander === "headGirl") { + const { + His, He, + his, he, him + } = getPronouns(S.HeadGirl); + if (V.auto === 1) { + r.push(`${V.assistant.name}`); + } else { + r.push(`You`); + } + r.push(`decided it will be your Head Girl that leads the troops.`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + if (S.HeadGirl.devotion < -20) { + r.push(`${His} low devotion has a negative impact on the morale of your slave soldiers.`); + } else if (S.HeadGirl.devotion > 51) { + r.push(`${His} devotion to you has a positive impact on the morale of your slave soldiers, proud to be led by one of their own.`); + } + } + if (oldRep < 10000 && oldAuth < 10000 || S.HeadGirl.prestige < 1) { + if (App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`Your volunteers`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however`); + } + r.push(`are not enthusiastic to have a slave as a`); + if (App.SecExp.battle.deployedUnits('mercs') === 1 && V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`commander, and neither are your mercenaries or your soldiers.`); + } else if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`commander, and neither are your mercenaries.`); + } else if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`commander, and neither are your soldiers.`); + } else { + r.push(`commander.`); + } + } else if (App.SecExp.battle.deployedUnits('mercs') === 1 && V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`Your mercenaries and soldiers`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however`); + } + r.push(`are not enthusiastic to have a slave as a commander.`); + } else if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`Your mercenaries`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however`); + } + r.push(`are not enthusiastic to have a slave as a commander.`); + } else if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`Your soldiers`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however`); + } + r.push(`are not enthusiastic to have a slave as a commander.`); + } + } else if (S.HeadGirl.prestige >= 2) { + if (App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`Your`); + if (App.SecExp.battle.deployedUnits('mercs') === 1 && V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`volunteers, your mercenaries and your soldiers are delighted to have such a prestigious individual as their commander, almost forgetting ${he} is a slave.`); + } else if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`volunteers and your mercenaries are delighted to have such a prestigious individual as their commander, almost forgetting ${he} is a slave.`); + } else if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`volunteers and your soldiers are delighted to have such a prestigious individual as their commander, almost forgetting ${he} is a slave.`); + } else { + r.push(`volunteers are delighted to have such a prestigious individual as their commander, almost forgetting ${he} is a slave.`); + } + } else if (App.SecExp.battle.deployedUnits('mercs') === 1 && V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`Your mercenaries and soldiers are delighted to have such a prestigious individual as their commander, almost forgetting ${he} is a slave.`); + } else if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`Your mercenaries are delighted to have such a prestigious individual as their commander, almost forgetting ${he} is a slave.`); + } else if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`Your soldiers are delighted to have such a prestigious individual as their commander, almost forgetting ${he} is a slave.`); + } + } else { + if (App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`Your volunteers`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however`); + } + r.push(`are not enthusiastic to have a slave as a`); + if (App.SecExp.battle.deployedUnits('mercs') === 1 && V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`commander, and neither are your mercenaries and soldiers, but they trust you enough not to question your decision.`); + } else if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`commander, and neither are your mercenaries, but they trust you enough not to question your decision.`); + } else if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`commander, and neither are your soldiers, but they trust you enough not to question your decision.`); + } else { + r.push(`commander, but they trust you enough not to question your decision.`); + } + } else if (App.SecExp.battle.deployedUnits('mercs') === 1 && V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`Your mercenaries and soldiers`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however`); + } + r.push(`are not enthusiastic to have a slave as a commander, but they trust you enough not to question your decision.`); + } else if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`Your mercenaries`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however`); + } + r.push(`are not enthusiastic to have a slave as a commander, but they trust you enough not to question your decision.`); + } else if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`Your soldiers`); + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`however`); + } + r.push(`are not enthusiastic to have a slave as a commander, but they trust you enough not to question your decision.`); + } + } + if ((App.Data.Careers.Leader.bodyguard.includes(S.HeadGirl.career) || App.Data.Careers.Leader.HG.includes(S.HeadGirl.career) || App.Data.misc.secExCombatPrestige.includes(S.HeadGirl.prestigeDesc)) && S.HeadGirl.intelligence + S.HeadGirl.intelligenceImplant > 95) { + r.push(`With ${his} experience and ${his} great intellect, ${he} is able to exploits the smallest of tactical advantages, making your troops greatly effective.`); + } else if (S.HeadGirl.intelligence + S.HeadGirl.intelligenceImplant > 95) { + r.push(`While ${he} lacks experience, ${his} great intellect allows ${him} to seize and exploit any tactical advantage the battlefield offers ${him}.`); + } else if ((App.Data.Careers.Leader.bodyguard.includes(S.HeadGirl.career) || App.Data.Careers.Leader.HG.includes(S.HeadGirl.career) || App.Data.misc.secExCombatPrestige.includes(S.HeadGirl.prestigeDesc)) && S.HeadGirl.intelligence + S.HeadGirl.intelligenceImplant > 50) { + r.push(`Having both the experience and the intelligence, ${he} performs admirably as your commander. ${His} competence greatly increases the efficiency of your troops.`); + } else if (S.HeadGirl.intelligence + S.HeadGirl.intelligenceImplant > 50) { + r.push(`Despite not having a lot of experience as a leader, ${his} intelligence makes ${him} a good commander, increasing the efficiency of your troops.`); + } else if ((App.Data.Careers.Leader.bodyguard.includes(S.HeadGirl.career) || App.Data.Careers.Leader.HG.includes(S.HeadGirl.career) || App.Data.misc.secExCombatPrestige.includes(S.HeadGirl.prestigeDesc)) && S.HeadGirl.intelligence + S.HeadGirl.intelligenceImplant > 15) { + r.push(`Thanks to ${his} experience, ${he} is a decent commander, competently guiding your troops through the battle.`); + } else if (S.HeadGirl.intelligence + S.HeadGirl.intelligenceImplant > 15) { + r.push(`Lacking experience ${his} performance as a commander is rather forgettable.`); + } else if ((App.Data.Careers.Leader.bodyguard.includes(S.HeadGirl.career) || App.Data.Careers.Leader.HG.includes(S.HeadGirl.career) || App.Data.misc.secExCombatPrestige.includes(S.HeadGirl.prestigeDesc)) && S.HeadGirl.intelligence + S.HeadGirl.intelligenceImplant < -50) { + r.push(`Despite the experience ${he} accumulated during ${his} past career, ${his} very low intelligence is a great disadvantage for your troops.`); + } else if (S.HeadGirl.intelligence + S.HeadGirl.intelligenceImplant < -50) { + r.push(`Without experience and low intelligence, ${he} performs horribly as a commander, greatly affecting your troops.`); + } else if ((App.Data.Careers.Leader.bodyguard.includes(S.HeadGirl.career) || App.Data.Careers.Leader.HG.includes(S.HeadGirl.career) || App.Data.misc.secExCombatPrestige.includes(S.HeadGirl.prestigeDesc)) && S.HeadGirl.intelligence + S.HeadGirl.intelligenceImplant < -15) { + r.push(`Despite the experience ${he} accumulated during ${his} past career, ${he} lacks the intelligence to apply it quickly and effectively, making for a rather poor performance in the field.`); + } else if (S.HeadGirl.intelligence + S.HeadGirl.intelligenceImplant < -15) { + r.push(`${He} lacks the experience and the intelligence to be an effective commander, the performance of your troops suffers because of ${his} poor leadership.`); + } + if (V.SecExp.war.gainedCombat) { + r.push(`During the battle, ${he} had to fight for ${his} life, giving ${him} experience in modern combat. ${He} is now proficient with modern firearms and hand to hand combat.`); + } + if (V.SecExp.war.leaderWounded) { + r.push(`Unfortunately, <span class="red">${he} sustained major injuries.</span>`); + const woundType = App.SecExp.inflictBattleWound(S.Bodyguard); + if (woundType === "voice") { + r.push(`A stray bullet hit ${his} neck. While ${he} fortunately avoided fatal hemorrhaging, ${his} vocal cords were irreparably damaged.`); + } else if (woundType === "eyes") { + r.push(`Some shrapnel found ${his} eyes as their final target, blinding ${him} permanently.`); + } else if (woundType === "legs") { + r.push(`A grenade landed close to ${him}, and ${his} badly mangled legs had to be amputated.`); + } else if (woundType === "arm") { + r.push(`A shrapnel blast mangled one of ${his} arms, which had to be amputated.`); + } else if (woundType === "flesh") { + r.push(`While gravely wounded, it seems ${he} will be able to fully recover, given enough time.`); + } + r.push(`Your troops were greatly affected by the loss of their leader.`); + } + if (V.SecExp.war.result === 3 && V.SecExp.settings.battle.allowSlavePrestige === 1) { + let found = 0; + for (const victory of V.SecExp.battles.slaveVictories) { + if (victory.ID === V.HeadGirlID) { + victory.victories++; + found = 1; + if (victory.victories >= 10) { + if (S.HeadGirl.prestige < 3) { + S.HeadGirl.prestige++; + if (S.HeadGirl.prestige === 1) { + S.HeadGirl.prestigeDesc = "$He is well known for being a great commander."; + } else if (S.HeadGirl.prestige === 2) { + S.HeadGirl.prestigeDesc = "$He is famous for being an incredible commander."; + } else if (S.HeadGirl.prestige === 3) { + S.HeadGirl.prestigeDesc = "$He is known as a legendary commander all over the world."; + } + victory.victories = 0; + r.push(`${He} brought your army to victory so many times that ${his} <span class="green">prestige has increased.</span>`); + } + } + break; + } + } + if (found === 0) { + const newSlave = {ID: V.HeadGirlID, victories: 0}; + V.SecExp.battles.slaveVictories.push(newSlave); + } + } + } else if (V.SecExp.war.commander === "citizen") { + if (V.auto === 1) { + r.push(`${V.assistant.name}`); + } else { + r.push(`You`); + } + r.push(`decided to appoint one of your volunteers as the commander.`); + if (V.arcologies[0].FSDegradationist === "unset" && V.arcologies[0].FSPaternalist === "unset") { + if (App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`Your volunteers are honored and pleased that one of their own is leading the defense force of the city.`); + } + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`Your slaves${(App.SecExp.battle.deployedUnits('militia') >= 1) ? `, however,` : ``}are not thrilled by the news.`); + } + } else if (V.arcologies[0].FSPaternalist !== "unset") { + if (App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`Your volunteers are honored and pleased that one of their own is leading the defense force of the city.`); + } + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`Thanks to your paternalistic society, your slave soldiers trust your chosen citizen to treat them as more than cannon fodder.`); + } + } else if (V.arcologies[0].FSDegradationist !== "unset") { + if (App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`Your volunteers are honored and pleased that one of their own is leading the defense force of the city.`); + } + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`Because of your degradationist society,`); + if (App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`however,`); + } + r.push(`your slave soldiers are deeply distrustful of the new leader.`); + } + } + if (V.arcologies[0].FSRomanRevivalist !== "unset" && App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`Since you decided to revive old Rome, many of your citizens took on themselves to educate themselves in martial matters, because of this your mercenaries feel safe enough in the hands of one of your volunteers.`); + } else if (V.arcologies[0].FSNeoImperialist !== "unset" && App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`Since having instituted an Imperial society, your citizens have become adept at modern warfare and your hardened mercenaries feel far more comfortable with one of your Imperial Knights in command.`); + } else if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`Your mercenaries are not thrilled to be lead by a civilian without any formal martial training or education.`); + } + if (V.arcologies[0].FSRomanRevivalist !== "unset" && V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`Since you decided to revive old Rome, many of your citizens took on themselves to educate themselves in martial matters, because of this your soldiers feel safe enough in the hands of one of your volunteers.`); + } else if (V.arcologies[0].FSNeoImperialist !== "unset" && App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`Since having instituted an Imperial society, your citizens have become adept at modern warfare and the line soldiers feel much more comfortable being commanded by one of your Imperial Knights.`); + } else if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`You soldiers are not thrilled to be lead by a civilian without any formal martial training or education.`); + } + if (V.SecExp.war.leaderWounded) { + r.push(`During the battle a stray bullet managed to reach the leader. Your troops were greatly affected by the loss.`); + } + } else if (V.SecExp.war.commander === "mercenary") { + if (V.auto === 1) { + r.push(`${V.assistant.name}`); + } else { + r.push(`You`); + } + r.push(`decided to appoint one of your mercenary officers as the commander.`); + if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`Your mercenaries of course approve of your decision.`); + } + if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`Your soldiers feel more confident going into battle with an experienced commander.`); + } + if (V.arcologies[0].FSRomanRevivalist !== "unset" && App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`Since you decided to revive old Rome, your volunteers are more willing to trust one of your mercenaries as their leader.`); + } else if (App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`Your volunteers are not enthusiastic at the prospect of being commanded around by a gun for hire.`); + } + if (V.arcologies[0].FSDegradationist !== "unset" && App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`Because of your degradationist society, your slave soldiers are highly distrustful of the gun for hire you forced them to accept as leader.`); + } + if (V.SecExp.war.leaderWounded) { + r.push(`During the battle a stray bullet managed to reach the mercenary. Your troops were greatly affected by the loss of their leader.`); + } + } else if (V.SecExp.war.commander === "colonel") { + if (V.auto === 1) { + r.push(`${V.assistant.name}`); + } else { + r.push(`You`); + } + r.push(`decided to appoint The Colonel as the commander.`); + if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + r.push(`Your mercenaries approve of such decisions, as they feel more confident by having a good, experienced commander.`); + } + if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + r.push(`The soldiers of ${V.SF.Lower} obviously approved of your decision.`); + } + if (V.arcologies[0].FSRomanRevivalist !== "unset" && App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`Since you decided to revive old Rome, your volunteers are more willing to trust one of your soldiers as their leader.`); + } else if (V.arcologies[0].FSNeoImperialist !== "unset" && App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`Under the strict hierarchy of your Imperial society, the militia is more willing to follow the Colonel's commands.`); + } else if (App.SecExp.battle.deployedUnits('militia') >= 1) { + r.push(`Your volunteers are not enthusiastic at the prospect of being commanded around by an old style military officer.`); + } + if (V.arcologies[0].FSDegradationist !== "unset" && App.SecExp.battle.deployedUnits('slaves') >= 1) { + r.push(`Because of your degradationist society, your slave soldiers are highly distrustful of the soldier you forced them to accept as leader.`); + } + if (V.SecExp.war.leaderWounded) { + r.push(`During the battle a stray bullet managed to reach The Colonel, wounding her slightly. Your troops were greatly affected by the loss of their leader.`); + } + } + + App.Events.addParagraph(node, r); + r = []; + + /* tactics */ + if (V.auto === 1) { + r.push(`${V.assistant.name}`); + } else { + r.push(`You`); + } + if (V.SecExp.war.chosenTactic === "Bait and Bleed") { + r.push(`chose to employ "bait and bleed" tactics or relying on quick attacks and harassment to tire and wound the enemy until their surrender.`); + } else if (V.SecExp.war.chosenTactic === "Guerrilla") { + r.push(`chose to employ "guerrilla" tactics or relying on stealth, terrain knowledge and subterfuge to undermine and ultimately destroy the enemy.`); + } else if (V.SecExp.war.chosenTactic === "Choke Points") { + r.push(`chose to employ "choke points" tactics or the extensive use of fortified or highly defensive positions to slow down and eventually stop the enemy.`); + } else if (V.SecExp.war.chosenTactic === "Interior Lines") { + r.push(`chose to employ "interior lines" tactics or exploiting the defender's shorter front to quickly disengage and concentrate troops when and where needed.`); + } else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") { + r.push(`chose to employ "pincer maneuver" tactics or attempting to encircle the enemy by faking a collapsing center front.`); + } else if (V.SecExp.war.chosenTactic === "Defense In Depth") { + r.push(`chose to employ "defense in depth" tactics or relying on mobility to disengage and exploit overextended enemy troops by attacking their freshly exposed flanks.`); + } else if (V.SecExp.war.chosenTactic === "Blitzkrieg") { + r.push(`chose to employ "blitzkrieg" tactics or shattering the enemy's front-line with a violent, concentrated armored assault.`); + } else if (V.SecExp.war.chosenTactic === "Human Wave") { + r.push(`chose to employ "human wave" tactics or overwhelming the enemy's army with a massive infantry assault.`); + } + if (V.SecExp.war.terrain === "urban") { + if (V.SecExp.war.chosenTactic === "Bait and Bleed") { + r.push(`The urban terrain synergized well with bait and bleed tactics, slowly chipping away at the enemy's forces from the safety of the narrow streets and empty buildings.`); + } else if (V.SecExp.war.chosenTactic === "Guerrilla") { + r.push(`The urban terrain synergized well with guerrilla tactics, eroding your enemy's determination from the safety of the narrow streets and empty buildings.`); + } else if (V.SecExp.war.chosenTactic === "Choke Points") { + r.push(`The urban environment offers many opportunities to hunker down and stop the momentum of the enemy's assault while keeping your soldiers in relative safety.`); + } else if (V.SecExp.war.chosenTactic === "Interior Lines") { + r.push(`While the urban environment offers many highly defensive position, it does restrict movement and with it the advantages of exploiting interior lines.`); + } else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") { + r.push(`The urban terrain does not allow for wide maneuvers, the attempts of your forces to encircle the attackers are mostly unsuccessful.`); + } else if (V.SecExp.war.chosenTactic === "Defense In Depth") { + r.push(`While the urban environment offers many defensive positions, it limits mobility, limiting the advantages of using a defense in depth tactic.`); + } else if (V.SecExp.war.chosenTactic === "Blitzkrieg") { + r.push(`The urban terrain is difficult to traverse, making your troops attempt at a lightning strike unsuccessful.`); + } else if (V.SecExp.war.chosenTactic === "Human Wave") { + r.push(`The urban terrain offers great advantages to the defender, your men find themselves in great disadvantage while mass assaulting the enemy's position.`); + } + } else if (V.SecExp.war.terrain === "rural") { + if (V.SecExp.war.chosenTactic === "Bait and Bleed") { + r.push(`The open terrain of rural lands does not lend itself well to bait and bleed tactics, making it harder for your men to achieve tactical superiority.`); + } else if (V.SecExp.war.chosenTactic === "Guerrilla") { + r.push(`The open terrain of rural lands does not offer many hiding spots, making it harder for your men to perform guerrilla actions effectively.`); + } else if (V.SecExp.war.chosenTactic === "Choke Points") { + r.push(`The open terrain of rural lands does not offer many natural choke points, making it hard for your troops to funnel the enemy towards highly defended positions.`); + } else if (V.SecExp.war.chosenTactic === "Interior Lines") { + r.push(`The open terrain allows your men to easily exploit the superior mobility of the defender, making excellent use of interior lines to strike where it hurts.`); + } else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") { + r.push(`The open terrain affords your men great mobility, allowing them to easily position themselves for envelopment.`); + } else if (V.SecExp.war.chosenTactic === "Defense In Depth") { + r.push(`The open terrain affords your men great mobility, allowing them to exploit overextended assaults and concentrate where and when it matters.`); + } else if (V.SecExp.war.chosenTactic === "Blitzkrieg") { + r.push(`The open terrain affords your men great mobility, making it easier to accomplish concentrated lightning strikes.`); + } else if (V.SecExp.war.chosenTactic === "Human Wave") { + r.push(`The open terrain affords your men great mobility, making it easier to overwhelm the enemy with mass assaults.`); + } + } else if (V.SecExp.war.terrain === "hills") { + if (V.SecExp.war.chosenTactic === "Bait and Bleed") { + r.push(`While the hills offer some protection, they also make it harder to maneuver; bait and bleed tactics will not be 100% effective here.`); + } else if (V.SecExp.war.chosenTactic === "Guerrilla") { + r.push(`The hills offer protection to both your troops and your enemy's, making it harder for your men to accomplish guerrilla attacks effectively.`); + } else if (V.SecExp.war.chosenTactic === "Choke Points") { + r.push(`While not as defensible as mountains, hills offer numerous opportunities to funnel the enemy towards highly defensible choke points.`); + } else if (V.SecExp.war.chosenTactic === "Interior Lines") { + r.push(`The limited mobility on hills hampers the capability of your troops to exploit the defender's greater mobility afforded by interior lines.`); + } else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") { + r.push(`Limited mobility due to the hills is a double edged sword, affording your men a decent shot at encirclement.`); + } else if (V.SecExp.war.chosenTactic === "Defense In Depth") { + r.push(`The limited mobility on hills hampers the capability of your troops to use elastic defense tactics.`); + } else if (V.SecExp.war.chosenTactic === "Blitzkrieg") { + r.push(`The limited mobility on hills hampers the capability of your troops to organize lightning strikes.`); + } else if (V.SecExp.war.chosenTactic === "Human Wave") { + r.push(`The defensibility of hills makes it harder to accomplish victory through mass assaults.`); + } + } else if (V.SecExp.war.terrain === "coast") { + if (V.SecExp.war.chosenTactic === "Bait and Bleed") { + r.push(`On the coast there's little space and protection to effectively employ bait and bleed tactics.`); + } else if (V.SecExp.war.chosenTactic === "Guerrilla") { + r.push(`On the coast there's little space and protection to effectively employ guerrilla tactics.`); + } else if (V.SecExp.war.chosenTactic === "Choke Points") { + r.push(`Amphibious attacks are difficult in the best of situations; the defender has a very easy time funneling the enemy towards their key defensive positions.`); + } else if (V.SecExp.war.chosenTactic === "Interior Lines") { + r.push(`While in an amphibious landing mobility is not the defender's best weapon, exploiting interior lines still affords your troops some advantages.`); + } else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") { + r.push(`Attempting to encircle a landing party is not the best course of action, but not the worst either.`); + } else if (V.SecExp.war.chosenTactic === "Defense In Depth") { + r.push(`In an amphibious assault it's very easy for the enemy to overextend, making defense in depth tactics quite effective.`); + } else if (V.SecExp.war.chosenTactic === "Blitzkrieg") { + r.push(`The rough, restricted terrain does not lend itself well to lightning strikes, but the precarious position of the enemy still gives your mobile troops tactical superiority.`); + } else if (V.SecExp.war.chosenTactic === "Human Wave") { + r.push(`The rough, restricted terrain does not lend itself well to mass assaults, but the precarious position of the enemy still gives your troops tactical superiority.`); + } + } else if (V.SecExp.war.terrain === "outskirts") { + if (V.SecExp.war.chosenTactic === "Bait and Bleed") { + r.push(`Fighting just beneath the walls of the arcology does not allow for the dynamic redeployment of troops bait and bleed tactics would require.`); + } else if (V.SecExp.war.chosenTactic === "Guerrilla") { + r.push(`Fighting just beneath the walls of the arcology does not allow for the dynamic redeployment of troops guerrilla tactics would require.`); + } else if (V.SecExp.war.chosenTactic === "Choke Points") { + r.push(`The imposing structure of the arcology itself provides plenty of opportunities to create fortified choke points from which to shatter the enemy assault.`); + } else if (V.SecExp.war.chosenTactic === "Interior Lines") { + r.push(`While the presence of the arcology near the battlefield is an advantage, it does limit maneuverability, lowering overall effectiveness of interior lines tactics.`); + } else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") { + r.push(`While the presence of the arcology near the battlefield is an advantage, it does limit maneuverability, lowering the chances of making an effective encirclement.`); + } else if (V.SecExp.war.chosenTactic === "Defense In Depth") { + r.push(`Having the arcology near the battlefield means there are limited available maneuvers to your troops, who still needs to defend the structure, making defense in depth tactics not as effective.`); + } else if (V.SecExp.war.chosenTactic === "Blitzkrieg") { + r.push(`While an assault may save the arcology from getting involved at all, having the imposing structure so near does limit maneuverability and so the impetus of the lightning strike.`); + } else if (V.SecExp.war.chosenTactic === "Human Wave") { + r.push(`While an attack may save the arcology from getting involved at all, having the imposing structure so near does limit maneuverability and so the impetus of the mass assault.`); + } + } else if (V.SecExp.war.terrain === "mountains") { + if (V.SecExp.war.chosenTactic === "Bait and Bleed") { + r.push(`While the mountains offer great protection, they also limit maneuverability; bait and bleed tactics will not be quite as effective here.`); + } else if (V.SecExp.war.chosenTactic === "Guerrilla") { + r.push(`The mountains offer many excellent hiding spots and defensive positions, making guerrilla tactics very effective.`); + } else if (V.SecExp.war.chosenTactic === "Choke Points") { + r.push(`The mountains offer plenty of opportunity to build strong defensive positions from which to shatter the enemy's assault.`); + } else if (V.SecExp.war.chosenTactic === "Interior Lines") { + r.push(`While the rough terrain complicates maneuvers, the defensive advantages offered by the mountains offsets its negative impact.`); + } else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") { + r.push(`The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective encirclement in this environment.`); + } else if (V.SecExp.war.chosenTactic === "Defense In Depth") { + r.push(`While mobility is limited, defensive positions are plentiful; your men are not able to fully exploit overextended assaults, but are able to better resist them.`); + } else if (V.SecExp.war.chosenTactic === "Blitzkrieg") { + r.push(`The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective lightning strike in this environment.`); + } else if (V.SecExp.war.chosenTactic === "Human Wave") { + r.push(`The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective mass assault in this environment.`); + } + } else if (V.SecExp.war.terrain === "wasteland") { + if (V.SecExp.war.chosenTactic === "Bait and Bleed") { + r.push(`While the wastelands are mostly open terrain, there are enough hiding spots to make bait and bleed tactics work well enough.`); + } else if (V.SecExp.war.chosenTactic === "Guerrilla") { + r.push(`While the wastelands are mostly open terrain, there are enough hiding spots to make guerrilla tactics work well enough.`); + } else if (V.SecExp.war.chosenTactic === "Choke Points") { + r.push(`The wastelands are mostly open terrain; your men have a difficult time setting up effective fortified positions.`); + } else if (V.SecExp.war.chosenTactic === "Interior Lines") { + r.push(`The wastelands, while rough, are mostly open terrain, where your men can exploit to the maximum the superior mobility of the defender.`); + } else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") { + r.push(`The wastelands, while rough, are mostly open terrain; your men can set up an effective encirclement here.`); + } else if (V.SecExp.war.chosenTactic === "Defense In Depth") { + r.push(`The wastelands, while rough, are mostly open terrain, allowing your men to liberally maneuver to exploit overextended enemies.`); + } else if (V.SecExp.war.chosenTactic === "Blitzkrieg") { + r.push(`The wastelands, while rough, are mostly open terrain, where your men are able to mount effective lightning strikes.`); + } else if (V.SecExp.war.chosenTactic === "Human Wave") { + r.push(`The wastelands, while rough, are mostly open terrain, where your men are able to mount effective mass assaults.`); + } + } + + if (V.SecExp.war.chosenTactic === "Bait and Bleed") { + if (V.SecExp.war.attacker.type === "raiders") { + r.push(`Since the bands of raiders are used to be on high alert and on the move constantly, bait and bleed tactics are not effective against them.`); + } else if (V.SecExp.war.attacker.type === "free city") { + r.push(`The modern armies hired by Free Cities are decently mobile, which means quick hit and run attacks will be less successful, but their discipline and confidence still make them quite susceptible to this type of attack.`); + } else if (V.SecExp.war.attacker.type === "old world") { + r.push(`While old world armies are tough nuts to crack, their predictability makes them the perfect target for hit and run and harassment tactics.`); + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + r.push(`Freedom fighters live every day as chasing and being chased by far superior forces, they are far more experienced than your troops in this type of warfare and much less susceptible to it.`); + } + } else if (V.SecExp.war.chosenTactic === "Guerrilla") { + if (V.SecExp.war.attacker.type === "raiders") { + r.push(`Since the bands of raiders are used to be on high alert and on the move constantly, guerrilla tactics are not effective against them.`); + } else if (V.SecExp.war.attacker.type === "free city") { + r.push(`The modern armies hired by Free Cities are highly mobile, which means quick hit and run attacks will be less successful, but their discipline and confidence still make them quite susceptible to this type of attack.`); + } else if (V.SecExp.war.attacker.type === "old world") { + r.push(`While old world armies are tough nuts to crack, their predictability makes them the perfect target for hit and run and harassment tactics.`); + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + r.push(`Freedom fighters live every day as chasing and being chased by far superior forces, they are far more experienced than your troops in this type of warfare and much less susceptible to it.`); + } + } else if (V.SecExp.war.chosenTactic === "Choke Points") { + if (V.SecExp.war.attacker.type === "raiders") { + r.push(`Raiders lack heavy weaponry or armor, so making use of fortified positions is an excellent way to dissipate the otherwise powerful momentum of their assault.`); + } else if (V.SecExp.war.attacker.type === "free city") { + r.push(`The high tech equipment Free Cities can afford to give their guns for hire means there's no defensive position strong enough to stop them, still the relatively low numbers means they will have to take a careful approach, slowing them down.`); + } else if (V.SecExp.war.attacker.type === "old world") { + r.push(`Old world armies have both the manpower and the equipment to conquer any defensive position, making use of strong fortifications will only bring you this far against them.`); + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + r.push(`The lack of specialized weaponry means freedom fighters have a rather hard time overcoming tough defensive positions, unfortunately they have also a lot of experience in avoiding them.`); + } + } else if (V.SecExp.war.chosenTactic === "Interior Lines") { + if (V.SecExp.war.attacker.type === "raiders") { + r.push(`The highly mobile horde of raiders will not give much room for your troops to maneuver, lowering their tactical superiority.`); + } else if (V.SecExp.war.attacker.type === "free city") { + r.push(`While decently mobile, Free Cities forces are not in high enough numbers to risk maintaining prolonged contact, allowing your troops to quickly disengage and redeploy where it hurts.`); + } else if (V.SecExp.war.attacker.type === "old world") { + r.push(`Old world armies are not famous for the mobility, which makes them highly susceptible to any tactic that exploits maneuverability and speed.`); + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + r.push(`While not the best equipped army, the experience and mobility typical of freedom fighters groups make them tough targets for an army that relies itself on mobility.`); + } + } else if (V.SecExp.war.chosenTactic === "Pincer Maneuver") { + if (V.SecExp.war.attacker.type === "raiders") { + r.push(`While numerous, the undisciplined masses of raiders are easy prey for encirclements.`); + } else if (V.SecExp.war.attacker.type === "free city") { + r.push(`While decently mobile, the low number of Free Cities expedition forces make them good candidates for encirclements.`); + } else if (V.SecExp.war.attacker.type === "old world") { + r.push(`The discipline and numbers of old world armies make them quite difficult to encircle.`); + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + r.push(`While not particularly mobile, freedom fighters are used to fight against overwhelming odds, diminishing the effectiveness of the encirclement.`); + } + } else if (V.SecExp.war.chosenTactic === "Defense In Depth") { + if (V.SecExp.war.attacker.type === "raiders") { + r.push(`While their low discipline makes them prime candidates for an elastic defense type of strategy, their high numbers limit your troops maneuverability.`); + } else if (V.SecExp.war.attacker.type === "free city") { + r.push(`With their low numbers Free Cities mercenaries are quite susceptible to this type of tactic, despite their mobility.`); + } else if (V.SecExp.war.attacker.type === "old world") { + r.push(`With their low mobility old world armies are very susceptible to this type of strategy.`); + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + r.push(`Low mobility and not particularly high numbers mean freedom fighters can be defeated by employing elastic defense tactics.`); + } + } else if (V.SecExp.war.chosenTactic === "Blitzkrieg") { + if (V.SecExp.war.attacker.type === "raiders") { + r.push(`With their low discipline and lack of heavy equipment, lightning strikes are very effective against raider hordes.`); + } else if (V.SecExp.war.attacker.type === "free city") { + r.push(`Having good equipment and discipline on their side, Free Cities expeditions are capable of responding to even strong lightning strikes.`); + } else if (V.SecExp.war.attacker.type === "old world") { + r.push(`While disciplined, old world armies low mobility makes them highly susceptible to lightning strikes.`); + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + r.push(`While not well equipped, freedom fighters have plenty of experience fighting small, mobile attacks, making them difficult to defeat with lightning strikes.`); + } + } else if (V.SecExp.war.chosenTactic === "Human Wave") { + if (V.SecExp.war.attacker.type === "raiders") { + r.push(`The hordes of raiders are much more experienced than your soldiers in executing mass assaults and they also have a lot more bodies to throw in the grinder.`); + } else if (V.SecExp.war.attacker.type === "free city") { + r.push(`The good equipment and mobility of Free Cities mercenaries cannot save them from an organized mass assault.`); + } else if (V.SecExp.war.attacker.type === "old world") { + r.push(`Unfortunately the discipline and good equipment of old world armies allow them to respond well against a mass assault.`); + } else if (V.SecExp.war.attacker.type === "freedom fighters") { + r.push(`The relative low numbers and not great equipment typical of freedom fighters make them susceptible to being overwhelmed by an organized mass assault.`); + } + } + r.push(`In the end`); + if (V.SecExp.war.commander === "PC") { + r.push(`you were`); + } else { + r.push(`your commander was`); + } + if (V.SecExp.war.tacticsSuccessful) { + r.push(`<span class="green">able to successfully employ ${V.SecExp.war.chosenTactic} tactics,</span> greatly enhancing`); + } else { + r.push(`<span class="red">not able to effectively employ ${V.SecExp.war.chosenTactic} tactics,</span> greatly affecting`); + } + r.push(`the efficiency of your army.`); + App.Events.addParagraph(node, r); + r = []; + node.append(unitsBattleReport()); + + if ( + V.SF.Toggle && V.SF.Active >= 1 && + (V.SF.Squad.Firebase >= 7 || V.SF.Squad.GunS >= 1 || V.SF.Squad.Satellite >= 5 || V.SF.Squad.GiantRobot >= 6 || V.SF.Squad.MissileSilo >= 1) + ) { + /* SF upgrades effects */ + App.Events.addParagraph(node, r); + r = []; + if (V.SF.Squad.Firebase >= 7) { + r.push(`The artillery pieces installed around ${V.SF.Lower}'s firebase provided vital fire support to the troops in the field.`); + } + if (V.SF.Squad.GunS >= 1) { + r.push(`The gunship gave our troops an undeniable advantage in recon capabilities, air superiority and fire support.`); + } + if (V.SF.Squad.Satellite >= 5 && V.SF.SatLaunched > 0) { + r.push(`The devastating power of ${V.SF.Lower}'s satellite was employed with great efficiency against the enemy.`); + } + if (V.SF.Squad.GiantRobot >= 6) { + r.push(`The giant robot of ${V.SF.Lower} proved to be a great boon to our troops, shielding many from the worst the enemy had to offer.`); + } + if (V.SF.Squad.MissileSilo >= 1) { + r.push(`The missile silo exterminated many enemy soldiers even before the battle would begin.`); + } + } + }/* closes check for surrender and bribery */ + + App.Events.addParagraph(node, r); + r = []; + + let menialPrice = Math.trunc((V.slaveCostFactor * 1000) / 100) * 100; + menialPrice = Math.clamp(menialPrice, 500, 1500); + + captives = Math.trunc(captives); + if (captives > 0) { + r.push(`During the battle ${captives} attackers were captured.`); + /* + if (random(1,100) <= 25) { + roll = random(1,100); + if (roll <= 33) { + r.push(`Three of them have the potential to be sex slaves.`); + candidates = 3; + + } else if (roll <= 66) { + r.push(`Two of them have the potential to be sex slaves.`); + candidates = 2; + } else { + r.push(`One of them have the potential to be sex slaves.`); + candidates = 1; + } + } + */ + const sell = function() { + cashX((menialPrice * captives), "menialTransfer"); + return `Captives sold`; + }; + + const keep = function() { + V.menials += captives; + return `Captives added as menial slaves`; + }; + + App.Events.addResponses(node, [ + new App.Events.Result(`sell them all immediately`, sell), + new App.Events.Result(`sell them all immediately`, keep), + ]); + } + + /* resets variables */ + V.majorBattle = 0; + V.SecExp.units.bots.isDeployed = 0; + for (const squad of App.SecExp.unit.humanSquads()) { + squad.isDeployed = 0; + } + App.Events.addParagraph(node, r); + return node; + + function unitsBattleReport() { + const el = document.createElement("div"); + if (V.SecExp.war.losses === 0) { + if (App.SecExp.battle.deployedUnits('bots')) { + App.UI.DOM.appendNewElement("div", el, `Security Drones: no casualties.`); + } + if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + App.UI.DOM.appendNewElement("div", el, `${num(V.SF.ArmySize)} soldiers from ${V.SF.Lower} joined the battle: no casualties suffered`); + } + const noCasualties = function(units) { + for (const unit of units) { + if (unit.isDeployed === 1) { + const r = [`${unit.platoonName}: no casualties.`]; + unit.battlesFought++; + if (unit.training < 100) { + if (random(1, 100) > 60) { + r.push(`Experience has increased.`); + unit.training += random(5, 15) + V.majorBattle * random(5, 15); + } + } + App.Events.addNode(el, r, "div"); + } + } + }; + if (App.SecExp.battle.deployedUnits('militia') >= 1) { + noCasualties(V.SecExp.units.militia.squads); + } + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + noCasualties(V.SecExp.units.slaves.squads); + } + if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + noCasualties(V.SecExp.units.mercs.squads); + } + } else if (V.SecExp.war.losses > 0) { + /* if the losses are more than zero */ + /* generates a list of randomized losses, from which each unit picks one at random */ + let losses = V.SecExp.war.losses; + const averageLosses = Math.trunc(losses / App.SecExp.battle.deployedUnits()); + let validityCount = 0; + let assignedLosses; + for (let i = 0; i < App.SecExp.battle.deployedUnits(); i++) { + assignedLosses = Math.trunc(Math.clamp(averageLosses + random(-5, 5), 0, 100)); + if (assignedLosses > losses) { + assignedLosses = losses; + losses = 0; + } else { + losses -= assignedLosses; + } + lossesList.push(assignedLosses); + validityCount += assignedLosses; + } + if (losses > 0) { + lossesList[random(lossesList.length - 1)] += losses; + } + lossesList.shuffle(); + + /* sanity check for losses */ + let count = 0; + for (let i = 0; i < lossesList.length; i++) { + if (!Number.isInteger(lossesList[i])) { + lossesList[i] = 0; + } + count += lossesList[i]; + } + if (count < V.SecExp.war.losses) { + const rand = random(lossesList.length - 1); + lossesList[rand] += V.SecExp.war.losses - count; + } else if (count > V.SecExp.war.losses) { + const diff = count - V.SecExp.war.losses; + const rand = random(lossesList.length - 1); + lossesList[rand] = Math.clamp(lossesList[rand] - diff, 0, 100); + } + + /* assigns the losses and notify the player */ + if (App.SecExp.battle.deployedUnits('bots')) { + let loss = lossesList.pluck(); + loss = Math.clamp(loss, 0, V.SecExp.units.bots.troops); + V.SecExp.units.bots.troops -= loss; + const r = [`Security drones:`]; + if (loss <= 0) { + r.push(`no casualties`); + } else if (loss <= V.SecExp.units.bots.troops * 0.2) { + r.push(`light casualties`); + } else if (loss <= V.SecExp.units.bots.troops * 0.4) { + r.push(`moderate casualties`); + } else if (loss <= V.SecExp.units.bots.troops * 0.6) { + r.push(`heavy casualties`); + } else { + r.push(`catastrophic casualties`); + } + r.push(`suffered.`); + if (V.SecExp.units.bots.troops <= 5) { + V.SecExp.units.bots.active = 0; + r.push(`Unfortunately the losses they took were simply too great, their effective combatants are in so small number you can no longer call them a deployable unit. It will take quite the investment to rebuild them.`); + } else if (V.SecExp.units.bots.troops <= 10) { + r.push(`The unit has very few operatives left, it risks complete annihilation if deployed again.`); + } + App.Events.addNode(el, r, "div"); + } + if (V.SF.Toggle && V.SF.Active >= 1 && V.SecExp.war.deploySF) { + let loss = lossesList.pluck(); + loss = Math.clamp(loss, 0, V.SF.ArmySize); + const r = [`${num(V.SF.ArmySize)} soldiers from ${V.SF.Lower} joined the battle:`]; + if (loss <= 0) { + r.push(`no casualties`); + } else if (loss <= 10) { + r.push(`light casualties`); + } else if (loss <= 30) { + r.push(`moderate casualties`); + } else if (loss <= 60) { + r.push(`heavy casualties`); + } else { + r.push(`catastrophic casualties`); + } + r.push(`suffered.`); + V.SF.ArmySize -= loss; + App.Events.addNode(el, r, "div"); + } + if (App.SecExp.battle.deployedUnits('militia') >= 1) { + loopThroughUnits(V.SecExp.units.militia.squads); + } + if (App.SecExp.battle.deployedUnits('slaves') >= 1) { + loopThroughUnits(V.SecExp.units.slaves.squads); + } + if (App.SecExp.battle.deployedUnits('mercs') >= 1) { + loopThroughUnits(V.SecExp.units.militia.squads); + } + } else { + App.UI.DOM.appendNewElement("div", el, `Error: losses are a negative number or NaN`, "red"); + }/* closes check for more than zero casualties */ + return el; + + function loopThroughUnits(units) { + for (const unit of units) { + if (unit.isDeployed === 1) { + unit.battlesFought++; + let loss = lossesList.pluck(); + loss = Math.clamp(loss, 0, unit.troops); + const r = [`${unit.platoonName}:`]; + if (loss <= 0) { + r.push(`no casualties`); + } else if (loss <= unit.troops * 0.2) { + r.push(`light casualties`); + } else if (loss <= unit.troops * 0.4) { + r.push(`moderate casualties`); + } else if (loss <= unit.troops * 0.6) { + r.push(`heavy casualties`); + } else { + r.push(`catastrophic casualties`); + } + r.push(`suffered.`); + const med = Math.round(Math.clamp(loss * unit.medics * 0.25, 1, loss)); + if (unit.medics === 1 && loss > 0) { + r.push(`Some men were saved by their medics.`); + } + unit.troops -= Math.trunc(Math.clamp(loss - med, 0, unit.maxTroops)); + V.SecExp.units.militia.dead += Math.trunc(loss - med); + if (unit.training < 100) { + if (random(1, 100) > 60) { + r.push(`Experience has increased.`); + unit.training += random(5, 15) + V.majorBattle * random(5, 15); + } + } + App.Events.addNode(el, r, "div"); + if (unit.troops <= 5) { + unit.active = 0; + App.UI.DOM.appendNewElement("div", el, `Unfortunately the losses they took were simply too great, their effective combatants are in so small number you can no longer call them a deployable unit. The remnants will be sent home honored as veterans or reorganized in a new unit.`); + } else if (unit.troops <= 10) { + App.UI.DOM.appendNewElement("div", el, `The unit has very few operatives left, it risks complete annihilation if deployed again.`); + } + } + } + } + } +}; diff --git a/src/Mods/SecExp/events/attackReport.tw b/src/Mods/SecExp/events/attackReport.tw deleted file mode 100644 index 740a8dc1298ebdb1545803581e0e1cd73b3a83aa..0000000000000000000000000000000000000000 --- a/src/Mods/SecExp/events/attackReport.tw +++ /dev/null @@ -1,1514 +0,0 @@ -:: attackReport [nobr] - -<<set $nextButton = "Continue", $nextLink = "Scheduled Event", $encyclopedia = "Battles">> - -/*init*/ -<<set _oldRep = $rep>> -<<set _oldAuth = $SecExp.core.authority>> -<<set $SecExp.war.attacker.losses = Math.trunc($SecExp.war.attacker.losses)>> -<<if $SecExp.war.attacker.losses > $SecExp.war.attacker.troops>> - <<set $SecExp.war.attacker.losses = $SecExp.war.attacker.troops>> -<</if>> -<<set $SecExp.core.totalKills += $SecExp.war.attacker.losses>> -<<set $SecExp.war.losses = Math.trunc($SecExp.war.losses)>> -<<set _loot = 0>> - -/* result */ -<<if $majorBattle == 0>> - <<set _majorBattleMod = 1>> -<<else>> - <<set _majorBattleMod = 2>> - <<set $SecExp.battles.major++>> -<</if>> -<<if $SecExp.war.result == 3>> - <strong>Victory!</strong> - <<set $SecExp.battles.lossStreak = 0>> - <<set $SecExp.battles.victoryStreak += 1>> - <<set $SecExp.battles.victories++>> -<<elseif $SecExp.war.result == -3>> - <strong>Defeat!</strong> - <<set $SecExp.battles.lossStreak += 1>> - <<set $SecExp.battles.victoryStreak = 0>> - <<set $SecExp.battles.losses++>> -<<elseif $SecExp.war.result == 2>> - <strong>Partial victory!</strong> - <<set $SecExp.battles.victories++>> -<<elseif $SecExp.war.result == -2>> - <strong>Partial defeat!</strong> - <<set $SecExp.battles.losses++>> -<<elseif $SecExp.war.result == -1>> - <strong>We surrendered</strong> - <<set $SecExp.battles.losses++>> -<<elseif $SecExp.war.result == 0>> - <strong>Failed bribery!</strong> - <<set $SecExp.battles.losses++>> -<<elseif $SecExp.war.result == 1>> - <strong>Successful bribery!</strong> - <<set $SecExp.battles.victories++>> -<</if>> -<hr> - -<<if $SecExp.war.attacker.type == "raiders">> - Today, <<= asDateString($week, random(0,7))>>, our arcology was attacked by a band of wild raiders, <<print num(Math.trunc($SecExp.war.attacker.troops))>> men strong. - <<if $SecExp.war.result != 1 && $SecExp.war.result != 0 && $SecExp.war.result != -1>> - Our defense forces, <<print num(Math.trunc(App.SecExp.battle.troopCount()))>> strong, clashed with them - <<if $SecExp.war.terrain == "urban">> - in the streets of <<if $SecExp.war.terrain == "urban">>the old world city surrounding the arcology<<else>>of the free city<</if>>, - <<elseif $SecExp.war.terrain == "rural">> - in the rural land surrounding the free city, - <<elseif $SecExp.war.terrain == "hills">> - on the hills around the free city, - <<elseif $SecExp.war.terrain == "coast">> - along the coast just outside the free city, - <<elseif $SecExp.war.terrain == "outskirts">> - just against the walls of the arcology, - <<elseif $SecExp.war.terrain == "mountains">> - in the mountains overlooking the arcology, - <<elseif $SecExp.war.terrain == "wasteland">> - in the wastelands outside the free city territory, - <</if>> - <<if $SecExp.war.attacker.losses != $SecExp.war.attacker.troops>> - inflicting <<print num(Math.trunc($SecExp.war.attacker.losses))>> casualties, while sustaining <<if $SecExp.war.losses > 1>><<print num(Math.trunc($SecExp.war.losses))>> casualties<<elseif $SecExp.war.losses > 0>>a casualty<<else>>zero<</if>> themselves. - <<else>> - completely annihilating their troops, while sustaining <<if $SecExp.war.losses > 1>><<print num(Math.trunc($SecExp.war.losses))>> casualties<<elseif $SecExp.war.losses > 0>>a casualty<<else>>zero casualties<</if>>. - <</if>> - <</if>> - <<if $SecExp.war.result == 3>> - <<if $SecExp.war.turns <= 5>> - The fight was quick and one sided, our men easily stopped the disorganized horde's futile attempt at raiding your arcology<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<elseif $SecExp.war.turns <= 7>> - The fight was hard, but in the end our men stopped the disorganized horde attempt at raiding your arcology<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<else>> - The fight was long and hard, but our men managed to stop the horde raiding party<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <</if>> - <<if $SecExp.battles.victoryStreak >= 2>> - adding another victory to the growing list of our military's successes. - <<elseif $SecExp.battles.lossStreak >= 2>> - finally putting an end to a series of unfortunate defeats. - <</if>> - <<elseif $SecExp.war.result == -3>> - <<if $SecExp.war.turns <= 5>> - The fight was quick and one sided, our men were easily crushed by the barbaric horde of raiders<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<elseif $SecExp.war.turns <= 7>> - The fight was hard and in the end the bandits proved too much to handle for our men<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<else>> - The fight was long and hard, but despite their bravery the horde proved too much for our men<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <</if>> - <<if $SecExp.battles.victoryStreak >= 2>> - so interrupting a long series of military successes. - <<elseif $SecExp.battles.lossStreak >= 2>> - confirming the long list of recent failures our armed forces collected. - <</if>> - <<elseif $SecExp.war.result == 2>> - The fight was long and hard, but in the end our men managed to repel the raiders, though not without difficulty. - <<elseif $SecExp.war.result == -2>> - The fight was long and hard. Our men in the end had to yield to the horde raiders, which was fortunately unable to capitalized on their victory. - <<elseif $SecExp.war.result == -1>> - You gave your troops the order to surrender, obediently they stand down. - <<elseif $SecExp.war.result == 0>> - You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls. - <<elseif $SecExp.war.result == 1>> - You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls. - <</if>> -<<elseif $SecExp.war.attacker.type == "free city">> - Today, <<= asDateString($week, random(0,7))>>, our arcology was attacked by a contingent of mercenaries hired by a competing free city, <<print num(Math.trunc($SecExp.war.attacker.troops))>> men strong. - <<if $SecExp.war.result != 1 && $SecExp.war.result != 0 && $SecExp.war.result != -1>> - Our defense forces, <<print num(Math.trunc(App.SecExp.battle.troopCount()))>> strong, clashed with them - <<if $SecExp.war.terrain == "urban">> - in the streets of <<if $SecExp.war.terrain == "urban">>the old world city surrounding the arcology<<else>>of the free city<</if>>, - <<elseif $SecExp.war.terrain == "rural">> - in the rural land surrounding the free city, - <<elseif $SecExp.war.terrain == "hills">> - on the hills around the free city, - <<elseif $SecExp.war.terrain == "coast">> - along the coast just outside the free city, - <<elseif $SecExp.war.terrain == "outskirts">> - just against the walls of the arcology, - <<elseif $SecExp.war.terrain == "mountains">> - in the mountains overlooking the arcology, - <<elseif $SecExp.war.terrain == "wasteland">> - in the wastelands outside the free city territory, - <</if>> - <<if $SecExp.war.attacker.losses != $SecExp.war.attacker.troops>> - inflicting <<print $SecExp.war.attacker.losses>> casualties, while sustaining <<if $SecExp.war.losses > 1>> <<print num(Math.trunc($SecExp.war.losses))>> casualties <<elseif $SecExp.war.losses > 0>> a casualty <<else>> zero <</if>> themselves. - <<else>> - completely annihilating their troops, while sustaining <<if $SecExp.war.losses > 1>> <<print num(Math.trunc($SecExp.war.losses))>> casualties. <<elseif $SecExp.war.losses > 0>> a casualty.<<else>> zero casualties.<</if>> - <</if>> - <</if>> - <<if $SecExp.war.result == 3>> - <<if $SecExp.war.turns <= 5>> - The fight was quick and one sided, our men easily stopped the mercenaries dead in their tracks<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<elseif $SecExp.war.turns <= 7>> - The fight was hard, but in the end our men stopped the slavers attempt at weakening your arcology<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<else>> - The fight was long and hard, but our men managed to stop the free city mercenaries<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <</if>> - <<if $SecExp.battles.victoryStreak >= 2>> - adding another victory to the growing list of our military's successes. - <<elseif $SecExp.battles.lossStreak >= 2>> - finally putting an end to a series of unfortunate defeats. - <</if>> - <<elseif $SecExp.war.result == -3>> - <<if $SecExp.war.turns <= 5>> - The fight was quick and one sided, our men were easily crushed by the consumed mercenary veterans sent against us<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<elseif $SecExp.war.turns <= 7>> - The fight was hard and in the end the slavers proved too much to handle for our men<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<else>> - The fight was long and hard, but despite their bravery the mercenary slavers proved too much for our men<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <</if>> - <<if $SecExp.battles.victoryStreak >= 2>> - so interrupting a long series of military successes. - <<elseif $SecExp.battles.lossStreak >= 2>> - confirming the long list of recent failures our armed forces collected. - <</if>> - <<elseif $SecExp.war.result == 2>> - The fight was long and hard, but in the end our men managed to repel the mercenaries, though not without difficulty. - <<elseif $SecExp.war.result == -2>> - The fight was long and hard. Our men in the end had to yield to the slavers, which were fortunately unable to capitalized on their victory. - <<elseif $SecExp.war.result == -1>> - You gave your troops the order to surrender, obediently they stand down. - <<elseif $SecExp.war.result == 0>> - You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls. - <<elseif $SecExp.war.result == 1>> - You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls. - <</if>> -<<elseif $SecExp.war.attacker.type == "freedom fighters">> - Today, <<= asDateString($week, random(0,7))>>, our arcology was attacked by a group of freedom fighters bent on the destruction of the institution of slavery, <<print num(Math.trunc($SecExp.war.attacker.troops))>> men strong. - <<if $SecExp.war.result != 1 && $SecExp.war.result != 0 && $SecExp.war.result != -1>> - Our defense forces, <<print num(Math.trunc(App.SecExp.battle.troopCount()))>> strong, clashed with them - <<if $SecExp.war.terrain == "urban">> - in the streets of <<if $SecExp.war.terrain == "urban">>the old world city surrounding the arcology<<else>>of the free city<</if>>, - <<elseif $SecExp.war.terrain == "rural">> - in the rural land surrounding the free city, - <<elseif $SecExp.war.terrain == "hills">> - on the hills around the free city, - <<elseif $SecExp.war.terrain == "coast">> - along the coast just outside the free city, - <<elseif $SecExp.war.terrain == "outskirts">> - just against the walls of the arcology, - <<elseif $SecExp.war.terrain == "mountains">> - in the mountains overlooking the arcology, - <<elseif $SecExp.war.terrain == "wasteland">> - in the wastelands outside the free city territory, - <</if>> - <<if $SecExp.war.attacker.losses != $SecExp.war.attacker.troops>> - inflicting <<print $SecExp.war.attacker.losses>> casualties, while sustaining <<if $SecExp.war.losses > 1>> <<print num(Math.trunc($SecExp.war.losses))>> casualties <<elseif $SecExp.war.losses > 0>> a casualty <<else>> zero <</if>> themselves. - <<else>> - completely annihilating their troops, while sustaining <<if $SecExp.war.losses > 1>> <<print num(Math.trunc($SecExp.war.losses))>> casualties. <<elseif $SecExp.war.losses > 0>> a casualty. <<else>> zero casualties.<</if>> - <</if>> - <</if>> - <<if $SecExp.war.result == 3>> - <<if $SecExp.war.turns <= 5>> - The fight was quick and one sided, our men easily stopped the freedom fighters dead in their tracks<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<elseif $SecExp.war.turns <= 7>> - The fight was hard, but in the end our men stopped the fighters attack<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<else>> - The fight was long and hard, but our men managed to stop the freedom fighters<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <</if>> - <<if $SecExp.battles.victoryStreak >= 2>> - adding another victory to the growing list of our military's successes. - <<elseif $SecExp.battles.lossStreak >= 2>> - finally putting an end to a series of unfortunate defeats. - <</if>> - <<elseif $SecExp.war.result == -3>> - <<if $SecExp.war.turns <= 5>> - The fight was quick and one sided, our men were easily crushed by the fanatical fury of the freedom fighters<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<elseif $SecExp.war.turns <= 7>> - The fight was hard and in the end the freedom fighters proved too much to handle for our men<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<else>> - The fight was long and hard, but despite their bravery the freedom fighters fury proved too much for our men<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <</if>> - <<if $SecExp.battles.victoryStreak >= 2>> - so interrupting a long series of military successes. - <<elseif $SecExp.battles.lossStreak >= 2>> - confirming the long list of recent failures our armed forces collected. - <</if>> - <<elseif $SecExp.war.result == 2>> - The fight was long and hard, but in the end our men managed to repel the freedom fighters, though not without difficulty. - <<elseif $SecExp.war.result == -2>> - The fight was long and hard. Our men in the end had to yield to the freedom fighters, which were fortunately unable to capitalized on their victory. - <<elseif $SecExp.war.result == -1>> - You gave your troops the order to surrender, obediently they stand down. - <<elseif $SecExp.war.result == 0>> - You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls. - <<elseif $SecExp.war.result == 1>> - You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls. - <</if>> -<<elseif $SecExp.war.attacker.type == "old world">> - Today, <<= asDateString($week, random(0,7))>>, our arcology was attacked by an old world nation boasting a misplaced sense of superiority, <<print num(Math.trunc($SecExp.war.attacker.troops))>> men strong. - <<if $SecExp.war.result != 1 && $SecExp.war.result != 0 && $SecExp.war.result != -1>> - Our defense forces, <<print num(Math.trunc(App.SecExp.battle.troopCount()))>> strong, clashed with them - <<if $SecExp.war.terrain == "urban">> - in the streets of <<if $SecExp.war.terrain == "urban">>the old world city surrounding the arcology<<else>>of the free city<</if>>, - <<elseif $SecExp.war.terrain == "rural">> - in the rural land surrounding the free city, - <<elseif $SecExp.war.terrain == "hills">> - on the hills around the free city, - <<elseif $SecExp.war.terrain == "coast">> - along the coast just outside the free city, - <<elseif $SecExp.war.terrain == "outskirts">> - just against the walls of the arcology, - <<elseif $SecExp.war.terrain == "mountains">> - in the mountains overlooking the arcology, - <<elseif $SecExp.war.terrain == "wasteland">> - in the wastelands outside the free city territory, - <</if>> - <<if $SecExp.war.attacker.losses != $SecExp.war.attacker.troops>> - inflicting <<print $SecExp.war.attacker.losses>> casualties, while sustaining <<if $SecExp.war.losses > 1>> <<print num(Math.trunc($SecExp.war.losses))>> casualties <<elseif $SecExp.war.losses > 0>> a casualty <<else>> zero <</if>> themselves. - <<else>> - completely annihilating their troops, while sustaining <<if $SecExp.war.losses > 1>> <<print num(Math.trunc($SecExp.war.losses))>> casualties. <<elseif $SecExp.war.losses > 0>> a casualty. <<else>> zero casualties.<</if>> - <</if>> - <</if>> - <<if $SecExp.war.result == 3>> - <<if $SecExp.war.turns <= 5>> - The fight was quick and one sided, our men easily stopped the old world soldiers dead in their tracks<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<elseif $SecExp.war.turns <= 7>> - The fight was hard, but in the end our men stopped the soldiers of the old world<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<else>> - The fight was long and hard, but our men managed to stop the old world soldiers<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <</if>> - <<if $SecExp.battles.victoryStreak >= 2>> - adding another victory to the growing list of our military's successes. - <<elseif $SecExp.battles.lossStreak >= 2>> - finally putting an end to a series of unfortunate defeats. - <</if>> - <<elseif $SecExp.war.result == -3>> - <<if $SecExp.war.turns <= 5>> - The fight was quick and one sided, our men were easily crushed by the discipline of the old world armies<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<elseif $SecExp.war.turns <= 7>> - The fight was hard and in the end the old world proved too much to handle for our men<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <<else>> - The fight was long and hard, but despite their bravery the determination of the old world troops proved too much for our men<<if $SecExp.battles.victoryStreak >= 2 || $SecExp.battles.lossStreak >= 2>>,<<else>>.<</if>> - <</if>> - <<if $SecExp.battles.victoryStreak >= 2>> - so interrupting a long series of military successes. - <<elseif $SecExp.battles.lossStreak >= 2>> - confirming the long list of recent failures our armed forces collected. - <</if>> - <<elseif $SecExp.war.result == 2>> - The fight was long and hard, but in the end our men managed to repel the old world soldiers, though not without difficulty. - <<elseif $SecExp.war.result == -2>> - The fight was long and hard. Our men in the end had to yield to the old world soldiers, which were fortunately unable to capitalized on their victory. - <<elseif $SecExp.war.result == -1>> - You gave your troops the order to surrender, obediently they stand down. - <<elseif $SecExp.war.result == 0>> - You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls. - <<elseif $SecExp.war.result == 1>> - You decided in favor of a financial approach rather than open hostilities. Your troops remain inside the arcology's walls. - <</if>> -<</if>> -<br><br> -/* calculates effects on the city */ -<<if $SecExp.war.result == 3>> - Thanks to your victory, your @@.green;reputation@@ and @@.darkviolet;authority@@ increased. You were also able to capture - <<if $SecExp.war.attacker.type == "raiders">> - <<run repX(4000 * _majorBattleMod, "war")>> - <<set $SecExp.core.authority += 800 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "free city">> - <<run repX(6000 * _majorBattleMod, "war")>> - <<set $SecExp.core.authority += 1200 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - <<run repX(7500 * _majorBattleMod, "war")>> - <<set $SecExp.core.authority += 1500 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "old world">> - <<run repX(6000 * _majorBattleMod, "war")>> - <<set $SecExp.core.authority += 1200 * _majorBattleMod>> - <</if>> - <<if $SecExp.war.attacker.troops - $SecExp.war.attacker.losses <= 50>> - a small amount of attackers, - <<set _captives = ($SecExp.war.attacker.troops - $SecExp.war.attacker.losses) * 0.1 * random(1,3)>> - <<elseif $SecExp.war.attacker.troops - $SecExp.war.attacker.losses <= 100>> - an healthy group of attackers, - <<set _captives = ($SecExp.war.attacker.troops - $SecExp.war.attacker.losses) * 0.1 * random(1,3)>> - <<elseif $SecExp.war.attacker.troops - $SecExp.war.attacker.losses <= 150>> - a big group of attackers, - <<set _captives = ($SecExp.war.attacker.troops - $SecExp.war.attacker.losses) * 0.1 * random(1,3)>> - <<elseif $SecExp.war.attacker.troops - $SecExp.war.attacker.losses <= 200>> - a huge group of attackers, - <<set _captives = ($SecExp.war.attacker.troops - $SecExp.war.attacker.losses) * 0.1 * random(1,3)>> - <<elseif $SecExp.war.attacker.troops - $SecExp.war.attacker.losses > 200>> - a great amount of attackers, - <<set _captives = ($SecExp.war.attacker.troops - $SecExp.war.attacker.losses) * 0.1 * random(1,3)>> - <</if>> - and some of their equipment, which once sold produced - <<if $SecExp.war.attacker.equip == 0>> - @@.yellowgreen;a small amount of cash.@@ - <<set _loot += 1000 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.equip == 1>> - @@.yellowgreen;a moderate amount of cash.@@ - <<set _loot += 5000 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.equip == 2>> - @@.yellowgreen;a good amount of cash.@@ - <<set _loot += 10000 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.equip == 3>> - @@.yellowgreen;a great amount of cash.@@ - <<set _loot += 15000 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.equip == 4>> - @@.yellowgreen;wealth worthy of the mightiest warlord.@@ - <<set _loot += 20000 * _majorBattleMod>> - <</if>> - <<if $SecExp.edicts.defense.privilege.mercSoldier == 1 && App.SecExp.battle.deployedUnits('mercs') >= 1>> - Part of the loot is distributed to your mercenaries. - <<set _captives = Math.trunc(_captives * 0.6)>> - <<set _loot = Math.trunc(_loot * 0.6)>> - <</if>> - <<run cashX(_loot, "war")>> - <br> - Damage to the infrastructure was @@.yellow;virtually non-existent,@@ costing only pocket cash to bring the structure back to normal. The inhabitants as well reported little to no injuries, because of this the prosperity of the arcology did not suffer. - <<= IncreasePCSkills('engineering', 0.1)>> - <<run cashX(forceNeg(1000 * _majorBattleMod), "war")>> - <<if $SecExp.battles.victoryStreak >= 3>> - It seems your victories over the constant threats directed your way is having @@.green;a positive effect on the prosperity of the arcology,@@ due to the security your leadership affords. - <<set $arcologies[0].prosperity += 5 * _majorBattleMod>> - <</if>> -<<elseif $SecExp.war.result == -3>> - Due to your defeat, your @@.red;reputation@@ and @@.red;authority@@ decreased. Obviously your troops were not able to capture anyone or anything. - <<if $SecExp.war.attacker.type == "raiders">> - <<run repX(forceNeg(400 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 400 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "free city">> - <<run repX(forceNeg(600 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 600 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - <<run repX(forceNeg(750 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 750 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "old world">> - <<run repX(forceNeg(600 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 600 * _majorBattleMod>> - <</if>> - <br> - In the raiding following the battle @@.red;the arcology sustained heavy damage,@@ which will cost quite the amount of cash to fix. Reports of @@.red;citizens or slaves killed or missing@@ flood your office for a few days following the defeat. - <<= IncreasePCSkills('engineering', 0.1)>> - <<run cashX(forceNeg(5000 * _majorBattleMod), "war")>> - <<if $week <= 30>> - <<set $lowerClass -= random(100) * _majorBattleMod>> - <<set _lostSlaves = random(150) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(5) * _majorBattleMod>> - <<elseif $week <= 60>> - <<set $lowerClass -= random(120) * _majorBattleMod>> - <<set _lostSlaves = random(170) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(10) * _majorBattleMod>> - <<elseif $week <= 90>> - <<set $lowerClass -= random(140) * _majorBattleMod>> - <<set _lostSlaves = random(190) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(15) * _majorBattleMod>> - <<elseif $week <= 120>> - <<set $lowerClass -= random(160) * _majorBattleMod>> - <<set _lostSlaves = random(210) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(20) * _majorBattleMod>> - <<else>> - <<set $lowerClass -= random(180) * _majorBattleMod>> - <<set _lostSlaves = random(230) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(25) * _majorBattleMod>> - <</if>> - <<if $SecExp.battles.lossStreak >= 3>> - This only confirms the fears of many, @@.red;your arcology is not safe@@ and it is clear their business will be better somewhere else. - <<set $arcologies[0].prosperity -= 5 * _majorBattleMod>> - <</if>> -<<elseif $SecExp.war.result == 2>> - Thanks to your victory, your @@.green;reputation@@ and @@.darkviolet;authority@@ slightly increased. Our men were not able to capture any combatants, however some equipment was seized during the enemy's hasty retreat, - <<if $SecExp.war.attacker.type == "raiders">> - <<run repX(1000 * _majorBattleMod, "war")>> - <<set $SecExp.core.authority += 200 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "free city">> - <<run repX(1500 * _majorBattleMod, "war")>> - <<set $SecExp.core.authority += 300 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - <<run repX(2000 * _majorBattleMod, "war")>> - <<set $SecExp.core.authority += 450 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "old world">> - <<run repX(1500 * _majorBattleMod, "war")>> - <<set $SecExp.core.authority += 300 * _majorBattleMod>> - <</if>> - which once sold produced - <<if $SecExp.war.attacker.equip == 0>> - @@.yellowgreen;a bit of cash.@@ - <<set _loot += 500 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.equip == 1>> - @@.yellowgreen;a small amount of cash.@@ - <<set _loot += 2500 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.equip == 2>> - @@.yellowgreen;a moderate amount of cash.@@ - <<set _loot += 5000 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.equip == 3>> - @@.yellowgreen;a good amount of cash.@@ - <<set _loot += 7500 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.equip == 4>> - @@.yellowgreen;a great amount of cash.@@ - <<set _loot += 10000 * _majorBattleMod>> - <</if>> - <<if $SecExp.edicts.defense.privilege.mercSoldier == 1 && App.SecExp.battle.deployedUnits('mercs') >= 1>> - Part of the loot is distributed to your mercenaries. - <<set _loot = Math.trunc(_loot * 0.6)>> - <</if>> - <<run cashX(_loot, "war")>> - <br> - Damage to the city was @@.red;limited,@@ it won't take much to rebuild. Very few citizens or slaves were involved in the fight and even fewer met their end, safeguarding the prosperity of the arcology. - <<= IncreasePCSkills('engineering', 0.1)>> - <<run cashX(forceNeg(2000 * _majorBattleMod), "war")>> - <<set $lowerClass -= random(10) * _majorBattleMod>> - <<set _lostSlaves = random(20) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> -<<elseif $SecExp.war.result == -2>> - It was a close defeat, but nonetheless your @@.red;reputation@@ and @@.red;authority@@ slightly decreased. Your troops were not able to capture anyone or anything. - <<if $SecExp.war.attacker.type == "raiders">> - <<run repX(forceNeg(40 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 40 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "free city">> - <<run repX(forceNeg(60 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 60 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - <<run repX(forceNeg(75 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 75 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "old world">> - <<run repX(forceNeg(60 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 60 * _majorBattleMod>> - <</if>> - <br> - The enemy did not have the strength to raid the arcology for long, still @@.red;the arcology sustained some damage,@@ which will cost a moderate amount of cash to fix. Some citizens and slaves found themselves on the wrong end of a gun and met their demise. - Some business sustained heavy damage, slightly impacting the arcology's prosperity. - <<= IncreasePCSkills('engineering', 0.1)>> - <<run cashX(forceNeg(3000 * _majorBattleMod), "war")>> - <<if $week <= 30>> - <<set $lowerClass -= random(50) * _majorBattleMod>> - <<set _lostSlaves = random(75) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(2) * _majorBattleMod>> - <<elseif $week <= 60>> - <<set $lowerClass -= random(60) * _majorBattleMod>> - <<set _lostSlaves = random(85) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(5) * _majorBattleMod>> - <<elseif $week <= 90>> - <<set $lowerClass -= random(70) * _majorBattleMod>> - <<set _lostSlaves = random(95) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(7) * _majorBattleMod>> - <<elseif $week <= 120>> - <<set $lowerClass -= random(80) * _majorBattleMod>> - <<set _lostSlaves = random(105) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(10) * _majorBattleMod>> - <<else>> - <<set $lowerClass -= random(90) * _majorBattleMod>> - <<set _lostSlaves = random(115) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(12) * _majorBattleMod>> - <</if>> -<<elseif $SecExp.war.result == -1>> - Rather than waste the lives of your men you decided to surrender, hoping your enemy will cause less damage if you indulge them, this is however a big hit to your status. Your @@.red;reputation@@ and @@.red;authority@@ are significantly impacted. - <<if $SecExp.war.attacker.type == "raiders">> - <<run repX(forceNeg(600 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 600 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "free city">> - <<run repX(forceNeg(800 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 800 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - <<run repX(forceNeg(1000 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 1000 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "old world">> - <<run repX(forceNeg(800 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 800 * _majorBattleMod>> - <</if>> - <br> - The surrender allows the arcology to survive @@.red;mostly intact,@@ however reports of @@.red;mass looting and killing of citizens@@ flood your office for a few days. - <<= IncreasePCSkills('engineering', 0.1)>> - <<run cashX(forceNeg(1000 * _majorBattleMod), "war")>> - <<if $week <= 30>> - <<set $lowerClass -= random(80) * _majorBattleMod>> - <<set _lostSlaves = random(120) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(5) * _majorBattleMod>> - <<elseif $week <= 60>> - <<set $lowerClass -= random(100) * _majorBattleMod>> - <<set _lostSlaves = random(140) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(10) * _majorBattleMod>> - <<elseif $week <= 90>> - <<set $lowerClass -= random(120) * _majorBattleMod>> - <<set _lostSlaves = random(160) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(15) * _majorBattleMod>> - <<elseif $week <= 120>> - <<set $lowerClass -= random(140) * _majorBattleMod>> - <<set _lostSlaves = random(180) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(20) * _majorBattleMod>> - <<else>> - <<set $lowerClass -= random(160) * _majorBattleMod>> - <<set _lostSlaves = random(200) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(25) * _majorBattleMod>> - <</if>> -<<elseif $SecExp.war.result == 0>> - Unfortunately your adversary did not accept your money. <<if $SecExp.war.attacker.type == "freedom fighters">> Their ideological crusade would not allow such thing<<else>>They saw your attempt as nothing more than admission of weakness<</if>>. There was no time to organize a defense and so the enemy walked into the arcology as it was his. - Your reputation and authority suffer a hit. - <<if $SecExp.war.attacker.type == "raiders">> - <<run repX(forceNeg(400 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 400 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "free city">> - <<run repX(forceNeg(600 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 600 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - <<run repX(forceNeg(750 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 750 * _majorBattleMod>> - <<elseif $SecExp.war.attacker.type == "old world">> - <<run repX(forceNeg(600 * _majorBattleMod), "war")>> - <<set $SecExp.core.authority -= 600 * _majorBattleMod>> - <</if>> - <br> - Fortunately the arcology survives @@.yellow;mostly intact,@@ however reports of @@.red;mass looting and killing of citizens@@ flood your office for a few days. - <<= IncreasePCSkills('engineering', 0.1)>> - <<run cashX(-1000, "war")>> - <<if $week <= 30>> - <<set $lowerClass -= random(80) * _majorBattleMod>> - <<set _lostSlaves = random(120) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(5) * _majorBattleMod>> - <<elseif $week <= 60>> - <<set $lowerClass -= random(100) * _majorBattleMod>> - <<set _lostSlaves = random(140) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(10) * _majorBattleMod>> - <<elseif $week <= 90>> - <<set $lowerClass -= random(120) * _majorBattleMod>> - <<set _lostSlaves = random(160) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(15) * _majorBattleMod>> - <<elseif $week <= 120>> - <<set $lowerClass -= random(140) * _majorBattleMod>> - <<set _lostSlaves = random(180) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(20) * _majorBattleMod>> - <<else>> - <<set $lowerClass -= random(160) * _majorBattleMod>> - <<set _lostSlaves = random(200) * _majorBattleMod, - $NPCSlaves -= Math.trunc(($NPCSlaves / $ASlaves) * _lostSlaves), - $menials -= Math.trunc(($menials / $ASlaves) * _lostSlaves), - $fuckdolls -= Math.trunc(($fuckdolls / $ASlaves) * _lostSlaves), - $menialBioreactors -= Math.trunc(($menialBioreactors / $ASlaves) * _lostSlaves)>> - <<set $arcologies[0].prosperity -= random(25) * _majorBattleMod>> - <</if>> - <br> -<<elseif $SecExp.war.result == 1>> - The attackers wisely take the money offered them to leave your territory without further issues. The strength of the Free Cities was never in their guns but in their dollars, and today's events are the perfect demonstration of such strength. - Your @@.green;reputation slightly increases.@@ - <<if $SecExp.war.attacker.type == "raiders">> - <<run repX(500 * _majorBattleMod, "war")>> - <<elseif $SecExp.war.attacker.type == "free city">> - <<run repX(750 * _majorBattleMod, "war")>> - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - <<run repX(1000 * _majorBattleMod, "war")>> - <<elseif $SecExp.war.attacker.type == "old world">> - <<run repX(750 * _majorBattleMod, "war")>> - <</if>> - <<run cashX(forceNeg(App.SecExp.battle.bribeCost()), "war")>> -<</if>> -<<if !Number.isInteger($lowerClass)>> - <<if isNaN($lowerClass)>> - <br>@@.red;Error: lowerClass is NaN, please report this issue@@ - <<elseif $lowerClass > 0>> - <<set $lowerClass = Math.trunc($lowerClass)>> - <<else>> - <<set $lowerClass = 0>> - <</if>> -<</if>> -<<if !Number.isInteger($NPCSlaves)>> - <<if isNaN($NPCSlaves)>> - <br>@@.red;Error: NPCSlaves is NaN, please report this issue@@ - <<elseif $NPCSlaves > 0>> - <<set $NPCSlaves = Math.trunc($NPCSlaves)>> - <<else>> - <<set $NPCSlaves = 0>> - <</if>> -<</if>> - -<br><br> -<<if $SecExp.war.result != 1 && $SecExp.war.result != 0 && $SecExp.war.result != -1>> - - /* leaders */ - <<if $SecExp.war.commander == "PC">> - <<setPlayerPronouns>> - You decided to personally lead the defense of your arcology. - <<if App.SecExp.battle.deployedUnits('militia') >= 1>> - <<if _oldRep <= 2500>> - <<if _oldRep > 1000>> - You're not particularly popular between the inhabitants of your arcology, so your presence does little to reassure the volunteers. - <<else>> - As your low reputation proves, your volunteers do not particularly enjoy your company. As far as they are concerned your presence is more of a hindrance than an advantage. - <</if>> - <<if $PC.career == "celebrity">> - Still, your past celebrity does carry some weight, and many look forward to fight alongside a famous name. - <<elseif $PC.career == "capitalist">> - Still, your past life as a famous venture capitalist does carry some weight, and many trust in your cunning to save them in the incoming battle. - <<elseif $PC.career == "gang">> - The situation is not made easier by your past. Many still remember you as the gang leader who used to be on the other side of their guns. - <<elseif $PC.career == "escort">> - The situation is not made easier by your past. Many still remember your past career as an escort and doubt you'll be of any use during the fighting. - <<elseif $PC.career == "mercenary">> - Still, your past mercenary work does carry some weight, and many look forward to fight alongside a battle hardened name. - <</if>> - <<elseif _oldRep >= 5000>> - <<if _oldRep < 15000>> - Your citizens are honored that their arcology owner is willing to put _hisP life in danger. - <<else>> - Many among the volunteers are awed by your presence; never would they have thought they would fight shoulder to shoulder with their famous arcology owner. - <</if>> - <<if $PC.career == "celebrity">> - They consider it a priceless opportunity to fight together with someone with such a renowned past as yours. Your celebrity past still carries weight. - <<elseif $PC.career == "capitalist">> - They consider it a priceless opportunity to fight together with one of the great capitalist sharks of their time. Such a fine mind on their side can only bring victory! - <<elseif $PC.career == "gang">> - Your past, however, does not help you. Many still remember you as the gang leader who used to be on the other side of their guns. - <<elseif $PC.career == "escort">> - Your past, however, does not help you. Many still remember your past career as an escort and doubt you'll be of any use during the fighting. - <<elseif $PC.career == "mercenary">> - Your past mercenary work does carries some weight, and many look forward to fight alongside a battle hardened name. - <</if>> - <</if>> - <</if>> - <<if App.SecExp.battle.deployedUnits('slaves') >= 1>> - <<if _oldAuth <= 2500>> - <<if _oldAuth > 1000>> - Your slave soldiers do not feel bound to you as much as they should, as your authority is far from absolute. - <<else>> - Your slave soldiers are often openly rebellious. Only the threat of execution holds them in line. - <</if>> - <<if $PC.career == "escort">> - Fortunately many feel some level of kinship with you, thanks to your past as an escort. - <<elseif $PC.career == "servant">> - Fortunately many feel some level of kinship with you, thanks to your past as a servant. - <<elseif $PC.career == "slaver">> - Things are made worse by your past as a notorious slaver. - <<elseif $PC.career == "mercenary">> - Your past mercenary work carries some weight, and many look forward to fighting alongside a battle hardened name. - <</if>> - <<elseif _oldAuth >= 5000>> - <<if _oldAuth < 15000>> - Your slave soldiers show a surprising amount of discipline, thanks to your high authority. - <<else>> - Your slave soldiers show almost a fanatical level of martial discipline. Your absolute authority has a great effect on them. - <</if>> - <<if $PC.career == "escort">> - Many have an instinctual feeling of kinship towards you because of your past as an escort. - <<elseif $PC.career == "servant">> - Many have an instinctual feeling of kinship towards you because of your past as a servant. - <<elseif $PC.career == "slaver">> - Still, some rebellious looks can be spotted once in a while. In their eyes your slaver past will always paint you in a dark light. - <<elseif $PC.career == "mercenary">> - Your past mercenary work carries some weight, and many look forward to fighting alongside a battle hardened name. - <</if>> - <</if>> - <</if>> - <<if App.SecExp.battle.deployedUnits('mercs') >= 1>> - <<set _mercLoyalty = App.SecExp.mercenaryAvgLoyalty()>> - <<if _mercLoyalty <= 25>> - <<if _mercLoyalty <= 10>> - Your mercenaries barely bother to pretend being loyal; their battle performance is obviously barely passable. - <<else>> - Your presence does little to spur your mercenaries into action; their loyalty is straining and their performance suffers. - <</if>> - <<if $PC.career == "mercenary">> - Thankfully they hold in high regard someone who made their fortune as a mercenary themselves. - <<elseif $PC.career == "wealth">> - They do little to hide the contempt they have for someone who was born into wealth, rather than gaining it through blood, sweat, and tears. - <<elseif $PC.career == "servant">> - They do little to hide their disgust at being ordered around by an ex-servant. - <<elseif $PC.career == "BlackHat">> - They do little to hide their disgust at being ordered around by some unscrupulous code monkey. - <</if>> - <<elseif _mercLoyalty >= 50>> - <<if _mercLoyalty < 75>> - Your mercenaries are ready to fight their hardest for you, their loyalty a testament to your capability as a leader. - <<else>> - Your mercenaries fight with a martial fury worthy of religious fanatics. Their loyalty to you is absolute. - <</if>> - <<if $PC.career == "mercenary">> - They're more than willing to follow someone who walked their same steps once as a gun for hire. - <<elseif $PC.career == "wealth">> - Unfortunately many still resent you being born into your wealth and power, rather than having earned it through blood, sweat, and tears. - <<elseif $PC.career == "servant">> - Unfortunately some still resent the fact they are ordered around by an ex-servant. - <<elseif $PC.career == "BlackHat">> - Unfortunately some still resent the fact they are ordered around by an unscrupulous hacker. - <</if>> - <</if>> - <<if _oldRep >= 15000>> - Your reputation is so high your name carries power by itself. Having you on the battlefield puts fear even in the hardiest of warriors. - <</if>> - <</if>> - <<if $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - <<if $PC.career == "mercenary" || $PC.career == "slaver" || $PC.career == "capitalist" || $PC.career == "gang" || $PC.skill.warfare > 75>> - The soldiers of $SF.Lower are ready and willing to follow you into battle, confident in your past experience. - <<elseif $PC.career == "wealth" || $PC.career == "medicine" || $PC.career == "engineer">> - The soldiers of $SF.Lower, as loyal as they are, are not enthusiastic to follow the orders of someone who has no experience leading men. - <<elseif $PC.career == "servant">> - The soldiers of $SF.Lower, as loyal as they are, are not enthusiastic to follow the orders of an ex-servant. - <<elseif $PC.career == "escort">> - The soldiers of $SF.Lower, as loyal as they are, are not enthusiastic to follow the orders of an ex-escort. - <<elseif $PC.career == "BlackHat">> - The soldiers of $SF.Lower, as loyal as they are, are not enthusiastic to follow the orders of a dubious incursion specialist. - <</if>> - <</if>> - <<if $PC.skill.warfare <= 25 && $PC.skill.warfare > 10>> - Your inexperience in military matters has a negative impact on your troops performance and the effectiveness of your battle plan. - <<elseif $PC.skill.warfare <= 10>> - Your ignorance in military matters has a severe negative impact on your troops performance and the effectiveness of your battle plan. - <<elseif $PC.skill.warfare >= 50 && $PC.skill.warfare >= 50>> - Your experience in military matters has a positive impact on your troops performance and the effectiveness of your battle plan. - <<elseif $PC.skill.warfare >= 75>> - Your great experience in military matters has a major positive impact on your troops performance and the effectiveness of your battle plan. - <</if>> - <<if $SecExp.war.gainedWarfare>> - Battlefield experience increased your understanding of warfare, making you a better commander. - <</if>> - <<if $PC.health.shortDamage >= 60>> - During the fighting @@.red;you were wounded.@@ Your medics assure you it's nothing life threatening, but you'll be weakened for a few weeks. - <</if>> - <<elseif $SecExp.war.commander == "assistant">> - <<setAssistantPronouns>> - <<if $auto == 1>>$assistant.name<<else>>You<</if>> let your personal assistant lead the troops. - <<if App.SecExp.battle.deployedUnits('mercs') >= 1 || App.SecExp.battle.deployedUnits('militia') >= 1 || App.SecExp.battle.deployedUnits('slaves') >= 1>> - No soldier trusts a computer to be their commander, - <<if _oldRep < 10000 && _oldAuth < 10000>> - no algorithm can substitute experience, <<if $assistant.power == 0>>and as expected, <<else>>however, <</if>> - <<else>> - but they trust you enough to not question your decision<<if $assistant.power == 0>>, however<<else>>, and <</if>> - <</if>> - <<else>> - You find - <</if>> - <<if $assistant.power == 0>> - your assistant gives a rather poor field performance, due to the limited computing power available to _himA. - <<elseif $assistant.power == 1>> - your assistant performs decently. While nothing to write home about your men are pleasantly surprised. - <<elseif $assistant.power == 2>> - your assistant performs admirably. _HisA upgraded computing power allows _himA to monitor the battlefield closely, enhancing the efficiency of your troops and the effectiveness of your battle plan. - <<elseif $assistant.power >= 3>> - your assistant performs admirably. _HisA vast computing power allows _himA to be everywhere on the battlefield, greatly enhancing the efficiency of your troops and the effectiveness of your battle plan. - <</if>> - <<elseif $SecExp.war.commander == "bodyguard">> - <<setLocalPronouns _S.Bodyguard>> - <<if $auto == 1>>$assistant.name<<else>>You<</if>> decided it will be your bodyguard that leads the troops. - <<if App.SecExp.battle.deployedUnits('slaves') >= 1>> - <<if _S.Bodyguard.devotion < -20>> - $His low devotion has a negative impact on the morale of your slave soldiers. - <<elseif _S.Bodyguard.devotion > 51>> - $His devotion to you has a positive impact on the morale of your slave soldiers, proud to be led by one of their own. - <</if>> - <</if>> - <<if _oldRep < 10000 && _oldAuth < 10000 || _S.Bodyguard.prestige < 1>> - <<if App.SecExp.battle.deployedUnits('militia') >= 1>> - Your volunteers <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however<</if>> are not enthusiastic to have a slave as a - <<if $SF.Toggle && $SF.Active >= 1 && App.SecExp.battle.deployedUnits('mercs') == 1 && $SecExp.war.deploySF>> - commander, and neither are your mercenaries or your soldiers. - <<elseif App.SecExp.battle.deployedUnits('mercs') >= 1>> - commander, and neither are your mercenaries. - <<elseif $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - commander, and neither are your soldiers. - <<else>> - commander. - <</if>> - <<elseif $SF.Toggle && $SF.Active >= 1 && App.SecExp.battle.deployedUnits('mercs') == 1 && $SecExp.war.deploySF>> - Your mercenaries and soldiers <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however<</if>> are not enthusiastic to have a slave as a commander. - <<elseif App.SecExp.battle.deployedUnits('mercs') >= 1>> - Your mercenaries <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however<</if>> are not enthusiastic to have a slave as a commander. - <<elseif $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - Your soldiers <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however<</if>> are not enthusiastic to have a slave as a commander. - <</if>> - <<elseif _S.Bodyguard.prestige >= 2>> - <<if App.SecExp.battle.deployedUnits('militia') >= 1>> - Your - <<if App.SecExp.battle.deployedUnits('mercs') == 1 && $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - volunteers, your mercenaries and your soldiers are delighted to have such a prestigious individual as their commander, almost forgetting $he is a slave. - <<elseif App.SecExp.battle.deployedUnits('mercs') >= 1>> - volunteers and your mercenaries are delighted to have such a prestigious individual as their commander, almost forgetting $he is a slave. - <<elseif $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - volunteers and your soldiers are delighted to have such a prestigious individual as their commander, almost forgetting $he is a slave. - <<else>> - volunteers are delighted to have such a prestigious individual as their commander, almost forgetting $he is a slave. - <</if>> - <<elseif App.SecExp.battle.deployedUnits('mercs') == 1 && $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - Your mercenaries and soldiers are delighted to have such a prestigious individual as their commander, almost forgetting $he is a slave. - <<elseif App.SecExp.battle.deployedUnits('mercs') >= 1>> - Your mercenaries are delighted to have such a prestigious individual as their commander, almost forgetting $he is a slave. - <<elseif $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - Your soldiers are delighted to have such a prestigious individual as their commander, almost forgetting $he is a slave. - <</if>> - <<else>> - <<if App.SecExp.battle.deployedUnits('militia') >= 1>> - Your volunteers <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however<</if>> are not enthusiastic to have a slave as a - <<if App.SecExp.battle.deployedUnits('mercs') == 1 && $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - commander, and neither are your mercenaries and soldiers, but they trust you enough not to question your decision. - <<elseif App.SecExp.battle.deployedUnits('mercs') >= 1>> - commander, and neither are your mercenaries, but they trust you enough not to question your decision. - <<elseif $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - commander, and neither are your soldiers, but they trust you enough not to question your decision. - <<else>> - commander, but they trust you enough not to question your decision. - <</if>> - <<elseif App.SecExp.battle.deployedUnits('mercs') == 1 && $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - Your mercenaries and soldiers <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however,<</if>> are not enthusiastic to have a slave as a commander, but they trust you enough not to question your decision. - <<elseif App.SecExp.battle.deployedUnits('mercs') >= 1>> - Your mercenaries <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however,<</if>> are not enthusiastic to have a slave as a commander, but they trust you enough not to question your decision. - <<elseif $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - Your soldiers <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however,<</if>> are not enthusiastic to have a slave as a commander, but they trust you enough not to question your decision. - <</if>> - <</if>> - <<set _BGCareerGivesBonus = App.Data.Careers.Leader.bodyguard.includes(_S.Bodyguard.career) || App.Data.Careers.Leader.HG.includes(_S.Bodyguard.career) || setup.secExCombatPrestige.includes(_S.Bodyguard.prestigeDesc)>> - <<set _BGTotalIntelligence = _S.Bodyguard.intelligence+_S.Bodyguard.intelligenceImplant>> - <<if _BGCareerGivesBonus && _BGTotalIntelligence > 95>> - With $his experience and $his great intellect, $he is able to exploit the smallest of tactical advantages, making your troops very effective. - <<elseif _BGTotalIntelligence > 95>> - While $he lacks experience, $his great intellect allows $him to seize and exploit any tactical advantage the battlefield offers $him. - <<elseif _BGCareerGivesBonus && _BGTotalIntelligence > 50>> - Having both the experience and the intelligence, $he performs admirably as your commander. $His competence greatly increases the efficiency of your troops. - <<elseif _BGTotalIntelligence > 50>> - Despite not having a lot of experience as a leader, $his intelligence makes $him a good commander, increasing the efficiency of your troops. - <<elseif _BGCareerGivesBonus && _BGTotalIntelligence > 15>> - Thanks to $his experience, $he is a decent commander, competently guiding your troops through the battle. - <<elseif _BGTotalIntelligence > 15>> - Lacking experience, $his performance as a commander is rather forgettable. - <<elseif !_BGCareerGivesBonus || _BGTotalIntelligence < -50>> - Despite the experience $he accumulated during $his past career, $his very low intelligence is a great disadvantage for your troops. - <<elseif _BGTotalIntelligence < -50>> - Without experience and low intelligence, $he performs horribly as a commander, greatly affecting your troops. - <<elseif !_BGCareerGivesBonus || _BGTotalIntelligence < -15>> - Despite the experience $he accumulated during $his past career, $he lacks the intelligence to apply it quickly and effectively, making for a rather poor performance in the field. - <<elseif _BGTotalIntelligence < -15>> - $He lacks the experience and the intelligence to be an effective commander, the performance of your troops suffers because of $his poor leadership. - <</if>> - <<if $SecExp.war.gainedCombat>> - During the battle, $he had to fight for $his life, giving $him experience in modern combat. $He is now proficient with modern firearms and hand to hand combat. - <</if>> - <<if $SecExp.war.leaderWounded>> - Unfortunately, @@.red;$he sustained major injuries.@@ - <<set _woundType = App.SecExp.inflictBattleWound(_S.Bodyguard)>> - <<if _woundType == "voice">> - A stray bullet hit $his neck. While $he fortunately avoided fatal hemorrhaging, $his vocal cords were irreparably damaged. - <<elseif _woundType == "eyes">> - Some shrapnel found $his eyes as their final target, blinding $him permanently. - <<elseif _woundType == "legs">> - A grenade landed close to $him, and $his badly mangled legs had to be amputated. - <<elseif _woundType == "arm">> - A shrapnel blast mangled one of $his arms, which had to be amputated. - <<elseif _woundType == "flesh">> - While gravely wounded, it seems $he will be able to fully recover, given enough time. - <</if>> - Your troops were greatly affected by the loss of their leader. - <</if>> - <<if $SecExp.war.result == 3 && $SecExp.settings.battle.allowSlavePrestige == 1>> - <<set _found = 0>> - <<for _i = 0; _i < $SecExp.battles.slaveVictories.length; _i++>> - <<if $SecExp.battles.slaveVictories[_i].ID == $BodyguardID>> - <<set $SecExp.battles.slaveVictories[_i].victories++>> - <<set _found = 1>> - <<if $SecExp.battles.slaveVictories[_i].victories >= 10>> - <<if _S.Bodyguard.prestige < 3>> - <<set _S.Bodyguard.prestige++>> - <<if _S.Bodyguard.prestige == 1>> - <<set _S.Bodyguard.prestigeDesc = "$He is well known for being a great commander.">> - <<elseif _S.Bodyguard.prestige == 2>> - <<set _S.Bodyguard.prestigeDesc = "$He is famous for being an incredible commander.">> - <<elseif _S.Bodyguard.prestige == 3>> - <<set _S.Bodyguard.prestigeDesc = "$He is known as a legendary commander all over the world.">> - <</if>> - <<set $SecExp.battles.slaveVictories[_i].victories = 0>> - $He brought your army to victory so many times that $his @@.green;prestige has increased.@@ - <</if>> - <</if>> - <<break>> - <</if>> - <</for>> - <<if _found == 0>> - <<set _newSlave = {ID: $BodyguardID, victories: 0}>> - <<set $SecExp.battles.slaveVictories.push(_newSlave)>> - <</if>> - <</if>> - <<elseif $SecExp.war.commander == "headGirl">> - <<setLocalPronouns _S.HeadGirl>> - <<if $auto == 1>>$assistant.name<<else>>You<</if>> decided it will be your Head Girl that leads the troops. - <<if App.SecExp.battle.deployedUnits('slaves') >= 1>> - <<if _S.HeadGirl.devotion < -20>> - $His low devotion has a negative impact on the morale of your slave soldiers. - <<elseif _S.HeadGirl.devotion > 51>> - $His devotion to you has a positive impact on the morale of your slave soldiers, proud to be led by one of their own. - <</if>> - <</if>> - <<if _oldRep < 10000 && _oldAuth < 10000 || _S.HeadGirl.prestige < 1>> - <<if App.SecExp.battle.deployedUnits('militia') >= 1>> - Your volunteers <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however<</if>> are not enthusiastic to have a slave as a - <<if App.SecExp.battle.deployedUnits('mercs') == 1 && $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - commander, and neither are your mercenaries or your soldiers. - <<elseif App.SecExp.battle.deployedUnits('mercs') >= 1>> - commander, and neither are your mercenaries. - <<elseif $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - commander, and neither are your soldiers. - <<else>> - commander. - <</if>> - <<elseif App.SecExp.battle.deployedUnits('mercs') == 1 && $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - Your mercenaries and soldiers <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however<</if>> are not enthusiastic to have a slave as a commander. - <<elseif App.SecExp.battle.deployedUnits('mercs') >= 1>> - Your mercenaries <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however<</if>> are not enthusiastic to have a slave as a commander. - <<elseif $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - Your soldiers <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however<</if>> are not enthusiastic to have a slave as a commander. - <</if>> - <<elseif _S.HeadGirl.prestige >= 2>> - <<if App.SecExp.battle.deployedUnits('militia') >= 1>> - Your - <<if App.SecExp.battle.deployedUnits('mercs') == 1 && $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - volunteers, your mercenaries and your soldiers are delighted to have such a prestigious individual as their commander, almost forgetting $he is a slave. - <<elseif App.SecExp.battle.deployedUnits('mercs') >= 1>> - volunteers and your mercenaries are delighted to have such a prestigious individual as their commander, almost forgetting $he is a slave. - <<elseif $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - volunteers and your soldiers are delighted to have such a prestigious individual as their commander, almost forgetting $he is a slave. - <<else>> - volunteers are delighted to have such a prestigious individual as their commander, almost forgetting $he is a slave. - <</if>> - <<elseif App.SecExp.battle.deployedUnits('mercs') == 1 && $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - Your mercenaries and soldiers are delighted to have such a prestigious individual as their commander, almost forgetting $he is a slave. - <<elseif App.SecExp.battle.deployedUnits('mercs') >= 1>> - Your mercenaries are delighted to have such a prestigious individual as their commander, almost forgetting $he is a slave. - <<elseif $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - Your soldiers are delighted to have such a prestigious individual as their commander, almost forgetting $he is a slave. - <</if>> - <<else>> - <<if App.SecExp.battle.deployedUnits('militia') >= 1>> - Your volunteers <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however<</if>> are not enthusiastic to have a slave as a - <<if App.SecExp.battle.deployedUnits('mercs') == 1 && $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - commander, and neither are your mercenaries and soldiers, but they trust you enough not to question your decision. - <<elseif App.SecExp.battle.deployedUnits('mercs') >= 1>> - commander, and neither are your mercenaries, but they trust you enough not to question your decision. - <<elseif $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - commander, and neither are your soldiers, but they trust you enough not to question your decision. - <<else>> - commander, but they trust you enough not to question your decision. - <</if>> - <<elseif App.SecExp.battle.deployedUnits('mercs') == 1 && $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - Your mercenaries and soldiers <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however<</if>> are not enthusiastic to have a slave as a commander, but they trust you enough not to question your decision. - <<elseif App.SecExp.battle.deployedUnits('mercs') >= 1>> - Your mercenaries <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however<</if>> are not enthusiastic to have a slave as a commander, but they trust you enough not to question your decision. - <<elseif $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - Your soldiers <<if App.SecExp.battle.deployedUnits('slaves') >= 1>>however<</if>> are not enthusiastic to have a slave as a commander, but they trust you enough not to question your decision. - <</if>> - <</if>> - <<if (App.Data.Careers.Leader.bodyguard.includes(_S.HeadGirl.career) || App.Data.Careers.Leader.HG.includes(_S.HeadGirl.career) || setup.secExCombatPrestige.includes(_S.HeadGirl.prestigeDesc)) && _S.HeadGirl.intelligence+_S.HeadGirl.intelligenceImplant > 95>> - With $his experience and $his great intellect, $he is able to exploits the smallest of tactical advantages, making your troops greatly effective. - <<elseif _S.HeadGirl.intelligence+_S.HeadGirl.intelligenceImplant > 95>> - While $he lacks experience, $his great intellect allows $him to seize and exploit any tactical advantage the battlefield offers $him. - <<elseif (App.Data.Careers.Leader.bodyguard.includes(_S.HeadGirl.career) || App.Data.Careers.Leader.HG.includes(_S.HeadGirl.career) || setup.secExCombatPrestige.includes(_S.HeadGirl.prestigeDesc)) && _S.HeadGirl.intelligence+_S.HeadGirl.intelligenceImplant > 50>> - Having both the experience and the intelligence, $he performs admirably as your commander. $His competence greatly increases the efficiency of your troops. - <<elseif _S.HeadGirl.intelligence+_S.HeadGirl.intelligenceImplant > 50>> - Despite not having a lot of experience as a leader, $his intelligence makes $him a good commander, increasing the efficiency of your troops. - <<elseif (App.Data.Careers.Leader.bodyguard.includes(_S.HeadGirl.career) || App.Data.Careers.Leader.HG.includes(_S.HeadGirl.career) || setup.secExCombatPrestige.includes(_S.HeadGirl.prestigeDesc)) && _S.HeadGirl.intelligence+_S.HeadGirl.intelligenceImplant > 15>> - Thanks to $his experience, $he is a decent commander, competently guiding your troops through the battle. - <<elseif _S.HeadGirl.intelligence+_S.HeadGirl.intelligenceImplant > 15>> - Lacking experience $his performance as a commander is rather forgettable. - <<elseif !(App.Data.Careers.Leader.bodyguard.includes(_S.HeadGirl.career) && App.Data.Careers.Leader.HG.includes(_S.HeadGirl.career) && setup.secExCombatPrestige.includes(_S.HeadGirl.prestigeDesc)) || _S.HeadGirl.intelligence+_S.HeadGirl.intelligenceImplant < -50>> - Despite the experience $he accumulated during $his past career, $his very low intelligence is a great disadvantage for your troops. - <<elseif _S.HeadGirl.intelligence+_S.HeadGirl.intelligenceImplant < -50>> - Without experience and low intelligence, $he performs horribly as a commander, greatly affecting your troops. - <<elseif !(App.Data.Careers.Leader.bodyguard.includes(_S.HeadGirl.career) && App.Data.Careers.Leader.HG.includes(_S.HeadGirl.career) && setup.secExCombatPrestige.includes(_S.HeadGirl.prestigeDesc)) || _S.HeadGirl.intelligence+_S.HeadGirl.intelligenceImplant < -15>> - Despite the experience $he accumulated during $his past career, $he lacks the intelligence to apply it quickly and effectively, making for a rather poor performance in the field. - <<elseif _S.HeadGirl.intelligence+_S.HeadGirl.intelligenceImplant < -15>> - $He lacks the experience and the intelligence to be an effective commander, the performance of your troops suffers because of $his poor leadership. - <</if>> - <<if $SecExp.war.gainedCombat>> - During the battle, $he had to fight for $his life, giving $him experience in modern combat. $He is now proficient with modern firearms and hand to hand combat. - <</if>> - <<if $SecExp.war.leaderWounded>> - Unfortunately, @@.red;$he sustained major injuries.@@ - <<set _woundType = App.SecExp.inflictBattleWound(_S.Bodyguard)>> - <<if _woundType == "voice">> - A stray bullet hit $his neck. While $he fortunately avoided fatal hemorrhaging, $his vocal cords were irreparably damaged. - <<elseif _woundType == "eyes">> - Some shrapnel found $his eyes as their final target, blinding $him permanently. - <<elseif _woundType == "legs">> - A grenade landed close to $him, and $his badly mangled legs had to be amputated. - <<elseif _woundType == "arm">> - A shrapnel blast mangled one of $his arms, which had to be amputated. - <<elseif _woundType == "flesh">> - While gravely wounded, it seems $he will be able to fully recover, given enough time. - <</if>> - Your troops were greatly affected by the loss of their leader. - <</if>> - <<if $SecExp.war.result == 3 && $SecExp.settings.battle.allowSlavePrestige == 1>> - <<set _found = 0>> - <<for _i = 0; _i < $SecExp.battles.slaveVictories.length; _i++>> - <<if $SecExp.battles.slaveVictories[_i].ID == $HeadGirlID>> - <<set $SecExp.battles.slaveVictories[_i].victories++>> - <<set _found = 1>> - <<if $SecExp.battles.slaveVictories[_i].victories >= 10>> - <<if _S.HeadGirl.prestige < 3>> - <<set _S.HeadGirl.prestige++>> - <<if _S.HeadGirl.prestige == 1>> - <<set _S.HeadGirl.prestigeDesc = "$He is well known for being a great commander.">> - <<elseif _S.HeadGirl.prestige == 2>> - <<set _S.HeadGirl.prestigeDesc = "$He is famous for being an incredible commander.">> - <<elseif _S.HeadGirl.prestige == 3>> - <<set _S.HeadGirl.prestigeDesc = "$He is known as a legendary commander all over the world.">> - <</if>> - <<set $SecExp.battles.slaveVictories[_i].victories = 0>> - $He brought your army to victory so many times that $his @@.green;prestige has increased.@@ - <</if>> - <</if>> - <<break>> - <</if>> - <</for>> - <<if _found == 0>> - <<set _newSlave = {ID: $HeadGirlID, victories: 0}>> - <<set $SecExp.battles.slaveVictories.push(_newSlave)>> - <</if>> - <</if>> - <<elseif $SecExp.war.commander == "citizen">> - <<if $auto == 1>>$assistant.name<<else>>You<</if>> decided to appoint one of your volunteers as the commander. - <<if $arcologies[0].FSDegradationist == "unset" && $arcologies[0].FSPaternalist == "unset">> - <<if App.SecExp.battle.deployedUnits('militia') >= 1>> - Your volunteers are honored and pleased that one of their own is leading the defense force of the city. - <</if>> - <<if App.SecExp.battle.deployedUnits('slaves') >= 1>> - Your slaves<<if App.SecExp.battle.deployedUnits('militia') >= 1>>, however,<</if>> are not thrilled by the news. - <</if>> - <<elseif $arcologies[0].FSPaternalist != "unset">> - <<if App.SecExp.battle.deployedUnits('militia') >= 1>> - Your volunteers are honored and pleased that one of their own is leading the defense force of the city. - <</if>> - <<if App.SecExp.battle.deployedUnits('slaves') >= 1>> - Thanks to your paternalistic society, your slave soldiers trust your chosen citizen to treat them as more than cannon fodder. - <</if>> - <<elseif $arcologies[0].FSDegradationist != "unset">> - <<if App.SecExp.battle.deployedUnits('militia') >= 1>> - Your volunteers are honored and pleased that one of their own is leading the defense force of the city. - <</if>> - <<if App.SecExp.battle.deployedUnits('slaves') >= 1>> - Because of your degradationist society,<<if App.SecExp.battle.deployedUnits('militia') >= 1>> however,<</if>> your slave soldiers are deeply distrustful of the new leader. - <</if>> - <</if>> - <<if $arcologies[0].FSRomanRevivalist != "unset" && App.SecExp.battle.deployedUnits('mercs') >= 1>> - Since you decided to revive old Rome, many of your citizens took on themselves to educate themselves in martial matters, because of this your mercenaries feel safe enough in the hands of one of your volunteers. - <<elseif $arcologies[0].FSNeoImperialist != "unset" && App.SecExp.battle.deployedUnits('mercs') >= 1>> - Since having institued an Imperial society, your citizens have become adept at modern warfare and your hardened mercenaries feel far more comfortable with one of your Imperial Knights in command. - <<elseif App.SecExp.battle.deployedUnits('mercs') >= 1>> - Your mercenaries are not thrilled to be lead by a civilian without any formal martial training or education. - <</if>> - <<if $arcologies[0].FSRomanRevivalist != "unset" && $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - Since you decided to revive old Rome, many of your citizens took on themselves to educate themselves in martial matters, because of this your soldiers feel safe enough in the hands of one of your volunteers. - <<elseif $arcologies[0].FSNeoImperialist != "unset" && App.SecExp.battle.deployedUnits('mercs') >= 1>> - Since having institued an Imperial society, your citizens have become adept at modern warfare and the line soldiers feel much more comfortable being commanded by one of your Imperial Knights. - <<elseif $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - You soldiers are not thrilled to be lead by a civilian without any formal martial training or education. - <</if>> - <<if $SecExp.war.leaderWounded>> - During the battle a stray bullet managed to reach the leader. Your troops were greatly affected by the loss. - <</if>> - <<elseif $SecExp.war.commander == "mercenary">> - <<if $auto == 1>>$assistant.name<<else>>You<</if>> decided to appoint one of your mercenary officers as the commander. - <<if App.SecExp.battle.deployedUnits('mercs') >= 1>> - Your mercenaries of course approve of your decision. - <</if>> - <<if $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - Your soldiers feel more confident going into battle with an experienced commander. - <</if>> - <<if $arcologies[0].FSRomanRevivalist != "unset" && App.SecExp.battle.deployedUnits('militia') >= 1>> - Since you decided to revive old Rome, your volunteers are more willing to trust one of your mercenaries as their leader. - <<elseif App.SecExp.battle.deployedUnits('militia') >= 1>> - Your volunteers are not enthusiastic at the prospect of being commanded around by a gun for hire. - <</if>> - <<if $arcologies[0].FSDegradationist != "unset" && App.SecExp.battle.deployedUnits('slaves') >= 1>> - Because of your degradationist society, your slave soldiers are highly distrustful of the gun for hire you forced them to accept as leader. - <</if>> - <<if $SecExp.war.leaderWounded>> - During the battle a stray bullet managed to reach the mercenary. Your troops were greatly affected by the loss of their leader. - <</if>> - <<elseif $SecExp.war.commander == "colonel">> - <<if $auto == 1>>$assistant.name<<else>>You<</if>> decided to appoint The Colonel as the commander. - <<if App.SecExp.battle.deployedUnits('mercs') >= 1>> - Your mercenaries approve of such decisions, as they feel more confident by having a good, experienced commander. - <</if>> - <<if $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - The soldiers of $SF.Lower obviously approved of your decision. - <</if>> - <<if $arcologies[0].FSRomanRevivalist != "unset" && App.SecExp.battle.deployedUnits('militia') >= 1>> - Since you decided to revive old Rome, your volunteers are more willing to trust one of your soldiers as their leader. - <<elseif $arcologies[0].FSNeoImperialist != "unset" && App.SecExp.battle.deployedUnits('militia') >= 1>> - Under the strict hierarchy of your Imperial society, the militia is more willing to follow the Colonel's commands. - <<elseif App.SecExp.battle.deployedUnits('militia') >= 1>> - Your volunteers are not enthusiastic at the prospect of being commanded around by an old style military officer. - <</if>> - <<if $arcologies[0].FSDegradationist != "unset" && App.SecExp.battle.deployedUnits('slaves') >= 1>> - Because of your degradationist society, your slave soldiers are highly distrustful of the soldier you forced them to accept as leader. - <</if>> - <<if $SecExp.war.leaderWounded>> - During the battle a stray bullet managed to reach The Colonel, wounding her slightly. Your troops were greatly affected by the loss of their leader. - <</if>> - <</if>> - - <br><br> - - /* tactics */ - <<if $auto == 1>>$assistant.name<<else>>You<</if>> - <<if $SecExp.war.chosenTactic == "Bait and Bleed">> - chose to employ "bait and bleed" tactics or relying on quick attacks and harassment to tire and wound the enemy until their surrender. - <<elseif $SecExp.war.chosenTactic == "Guerrilla">> - chose to employ "guerrilla" tactics or relying on stealth, terrain knowledge and subterfuge to undermine and ultimately destroy the enemy. - <<elseif $SecExp.war.chosenTactic == "Choke Points">> - chose to employ "choke points" tactics or the extensive use of fortified or highly defensive positions to slow down and eventually stop the enemy. - <<elseif $SecExp.war.chosenTactic == "Interior Lines">> - chose to employ "interior lines" tactics or exploiting the defender's shorter front to quickly disengage and concentrate troops when and where needed. - <<elseif $SecExp.war.chosenTactic == "Pincer Maneuver">> - chose to employ "pincer maneuver" tactics or attempting to encircle the enemy by faking a collapsing center front. - <<elseif $SecExp.war.chosenTactic == "Defense In Depth">> - chose to employ "defense in depth" tactics or relying on mobility to disengage and exploit overextended enemy troops by attacking their freshly exposed flanks. - <<elseif $SecExp.war.chosenTactic == "Blitzkrieg">> - chose to employ "blitzkrieg" tactics or shattering the enemy's front-line with a violent, concentrated armored assault. - <<elseif $SecExp.war.chosenTactic == "Human Wave">> - chose to employ "human wave" tactics or overwhelming the enemy's army with a massive infantry assault. - <</if>> - <<if $SecExp.war.terrain == "urban">> - <<if $SecExp.war.chosenTactic == "Bait and Bleed">> - The urban terrain synergized well with bait and bleed tactics, slowly chipping away at the enemy's forces from the safety of the narrow streets and empty buildings. - <<elseif $SecExp.war.chosenTactic == "Guerrilla">> - The urban terrain synergized well with guerrilla tactics, eroding your enemy's determination from the safety of the narrow streets and empty buildings. - <<elseif $SecExp.war.chosenTactic == "Choke Points">> - The urban environment offers many opportunities to hunker down and stop the momentum of the enemy's assault while keeping your soldiers in relative safety. - <<elseif $SecExp.war.chosenTactic == "Interior Lines">> - While the urban environment offers many highly defensive position, it does restrict movement and with it the advantages of exploiting interior lines. - <<elseif $SecExp.war.chosenTactic == "Pincer Maneuver">> - The urban terrain does not allow for wide maneuvers, the attempts of your forces to encircle the attackers are mostly unsuccessful. - <<elseif $SecExp.war.chosenTactic == "Defense In Depth">> - While the urban environment offers many defensive positions, it limits mobility, limiting the advantages of using a defense in depth tactic. - <<elseif $SecExp.war.chosenTactic == "Blitzkrieg">> - The urban terrain is difficult to traverse, making your troops attempt at a lightning strike unsuccessful. - <<elseif $SecExp.war.chosenTactic == "Human Wave">> - The urban terrain offers great advantages to the defender, your men find themselves in great disadvantage while mass assaulting the enemy's position. - <</if>> - <<elseif $SecExp.war.terrain == "rural">> - <<if $SecExp.war.chosenTactic == "Bait and Bleed">> - The open terrain of rural lands does not lend itself well to bait and bleed tactics, making it harder for your men to achieve tactical superiority. - <<elseif $SecExp.war.chosenTactic == "Guerrilla">> - The open terrain of rural lands does not offer many hiding spots, making it harder for your men to perform guerrilla actions effectively. - <<elseif $SecExp.war.chosenTactic == "Choke Points">> - The open terrain of rural lands does not offer many natural choke points, making it hard for your troops to funnel the enemy towards highly defended positions. - <<elseif $SecExp.war.chosenTactic == "Interior Lines">> - The open terrain allows your men to easily exploit the superior mobility of the defender, making excellent use of interior lines to strike where it hurts. - <<elseif $SecExp.war.chosenTactic == "Pincer Maneuver">> - The open terrain affords your men great mobility, allowing them to easily position themselves for envelopment. - <<elseif $SecExp.war.chosenTactic == "Defense In Depth">> - The open terrain affords your men great mobility, allowing them to exploit overextended assaults and concentrate where and when it matters. - <<elseif $SecExp.war.chosenTactic == "Blitzkrieg">> - The open terrain affords your men great mobility, making it easier to accomplish concentrated lightning strikes. - <<elseif $SecExp.war.chosenTactic == "Human Wave">> - The open terrain affords your men great mobility, making it easier to overwhelm the enemy with mass assaults. - <</if>> - <<elseif $SecExp.war.terrain == "hills">> - <<if $SecExp.war.chosenTactic == "Bait and Bleed">> - While the hills offer some protection, they also make it harder to maneuver; bait and bleed tactics will not be 100% effective here. - <<elseif $SecExp.war.chosenTactic == "Guerrilla">> - The hills offer protection to both your troops and your enemy's, making it harder for your men to accomplish guerrilla attacks effectively. - <<elseif $SecExp.war.chosenTactic == "Choke Points">> - While not as defensible as mountains, hills offer numerous opportunities to funnel the enemy towards highly defensible choke points. - <<elseif $SecExp.war.chosenTactic == "Interior Lines">> - The limited mobility on hills hampers the capability of your troops to exploit the defender's greater mobility afforded by interior lines. - <<elseif $SecExp.war.chosenTactic == "Pincer Maneuver">> - Limited mobility due to the hills is a double edged sword, affording your men a decent shot at encirclement. - <<elseif $SecExp.war.chosenTactic == "Defense In Depth">> - The limited mobility on hills hampers the capability of your troops to use elastic defense tactics. - <<elseif $SecExp.war.chosenTactic == "Blitzkrieg">> - The limited mobility on hills hampers the capability of your troops to organize lightning strikes. - <<elseif $SecExp.war.chosenTactic == "Human Wave">> - The defensibility of hills makes it harder to accomplish victory through mass assaults. - <</if>> - <<elseif $SecExp.war.terrain == "coast">> - <<if $SecExp.war.chosenTactic == "Bait and Bleed">> - On the coast there's little space and protection to effectively employ bait and bleed tactics. - <<elseif $SecExp.war.chosenTactic == "Guerrilla">> - On the coast there's little space and protection to effectively employ guerrilla tactics. - <<elseif $SecExp.war.chosenTactic == "Choke Points">> - Amphibious attacks are difficult in the best of situations; the defender has a very easy time funneling the enemy towards their key defensive positions. - <<elseif $SecExp.war.chosenTactic == "Interior Lines">> - While in an amphibious landing mobility is not the defender's best weapon, exploiting interior lines still affords your troops some advantages. - <<elseif $SecExp.war.chosenTactic == "Pincer Maneuver">> - Attempting to encircle a landing party is not the best course of action, but not the worst either. - <<elseif $SecExp.war.chosenTactic == "Defense In Depth">> - In an amphibious assault it's very easy for the enemy to overextend, making defense in depth tactics quite effective. - <<elseif $SecExp.war.chosenTactic == "Blitzkrieg">> - The rough, restricted terrain does not lend itself well to lightning strikes, but the precarious position of the enemy still gives your mobile troops tactical superiority. - <<elseif $SecExp.war.chosenTactic == "Human Wave">> - The rough, restricted terrain does not lend itself well to mass assaults, but the precarious position of the enemy still gives your troops tactical superiority. - <</if>> - <<elseif $SecExp.war.terrain == "outskirts">> - <<if $SecExp.war.chosenTactic == "Bait and Bleed">> - Fighting just beneath the walls of the arcology does not allow for the dynamic redeployment of troops bait and bleed tactics would require. - <<elseif $SecExp.war.chosenTactic == "Guerrilla">> - Fighting just beneath the walls of the arcology does not allow for the dynamic redeployment of troops guerrilla tactics would require. - <<elseif $SecExp.war.chosenTactic == "Choke Points">> - The imposing structure of the arcology itself provides plenty of opportunities to create fortified choke points from which to shatter the enemy assault. - <<elseif $SecExp.war.chosenTactic == "Interior Lines">> - While the presence of the arcology near the battlefield is an advantage, it does limit maneuverability, lowering overall effectiveness of interior lines tactics. - <<elseif $SecExp.war.chosenTactic == "Pincer Maneuver">> - While the presence of the arcology near the battlefield is an advantage, it does limit maneuverability, lowering the chances of making an effective encirclement. - <<elseif $SecExp.war.chosenTactic == "Defense In Depth">> - Having the arcology near the battlefield means there are limited available maneuvers to your troops, who still needs to defend the structure, making defense in depth tactics not as effective. - <<elseif $SecExp.war.chosenTactic == "Blitzkrieg">> - While an assault may save the arcology from getting involved at all, having the imposing structure so near does limit maneuverability and so the impetus of the lightning strike. - <<elseif $SecExp.war.chosenTactic == "Human Wave">> - While an attack may save the arcology from getting involved at all, having the imposing structure so near does limit maneuverability and so the impetus of the mass assault. - <</if>> - <<elseif $SecExp.war.terrain == "mountains">> - <<if $SecExp.war.chosenTactic == "Bait and Bleed">> - While the mountains offer great protection, they also limit maneuverability; bait and bleed tactics will not be quite as effective here. - <<elseif $SecExp.war.chosenTactic == "Guerrilla">> - The mountains offer many excellent hiding spots and defensive positions, making guerrilla tactics very effective. - <<elseif $SecExp.war.chosenTactic == "Choke Points">> - The mountains offer plenty of opportunity to build strong defensive positions from which to shatter the enemy's assault. - <<elseif $SecExp.war.chosenTactic == "Interior Lines">> - While the rough terrain complicates maneuvers, the defensive advantages offered by the mountains offsets its negative impact. - <<elseif $SecExp.war.chosenTactic == "Pincer Maneuver">> - The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective encirclement in this environment. - <<elseif $SecExp.war.chosenTactic == "Defense In Depth">> - While mobility is limited, defensive positions are plentiful; your men are not able to fully exploit overextended assaults, but are able to better resist them. - <<elseif $SecExp.war.chosenTactic == "Blitzkrieg">> - The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective lightning strike in this environment. - <<elseif $SecExp.war.chosenTactic == "Human Wave">> - The rough terrain complicates maneuvers; your men have a really hard time pulling off an effective mass assault in this environment. - <</if>> - <<elseif $SecExp.war.terrain == "wasteland">> - <<if $SecExp.war.chosenTactic == "Bait and Bleed">> - While the wastelands are mostly open terrain, there are enough hiding spots to make bait and bleed tactics work well enough. - <<elseif $SecExp.war.chosenTactic == "Guerrilla">> - While the wastelands are mostly open terrain, there are enough hiding spots to make guerrilla tactics work well enough. - <<elseif $SecExp.war.chosenTactic == "Choke Points">> - The wastelands are mostly open terrain; your men have a difficult time setting up effective fortified positions. - <<elseif $SecExp.war.chosenTactic == "Interior Lines">> - The wastelands, while rough, are mostly open terrain, where your men can exploit to the maximum the superior mobility of the defender. - <<elseif $SecExp.war.chosenTactic == "Pincer Maneuver">> - The wastelands, while rough, are mostly open terrain; your men can set up an effective encirclement here. - <<elseif $SecExp.war.chosenTactic == "Defense In Depth">> - The wastelands, while rough, are mostly open terrain, allowing your men to liberally maneuver to exploit overextended enemies. - <<elseif $SecExp.war.chosenTactic == "Blitzkrieg">> - The wastelands, while rough, are mostly open terrain, where your men are able to mount effective lightning strikes. - <<elseif $SecExp.war.chosenTactic == "Human Wave">> - The wastelands, while rough, are mostly open terrain, where your men are able to mount effective mass assaults. - <</if>> - <</if>> - - <<if $SecExp.war.chosenTactic == "Bait and Bleed">> - <<if $SecExp.war.attacker.type == "raiders">> - Since the bands of raiders are used to be on high alert and on the move constantly, bait and bleed tactics are not effective against them. - <<elseif $SecExp.war.attacker.type == "free city">> - The modern armies hired by Free Cities are decently mobile, which means quick hit and run attacks will be less successful, but their discipline and confidence still make them quite susceptible to this type of attack. - <<elseif $SecExp.war.attacker.type == "old world">> - While old world armies are tough nuts to crack, their predictability makes them the perfect target for hit and run and harassment tactics. - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - Freedom fighters live every day as chasing and being chased by far superior forces, they are far more experienced than your troops in this type of warfare and much less susceptible to it. - <</if>> - <<elseif $SecExp.war.chosenTactic == "Guerrilla">> - <<if $SecExp.war.attacker.type == "raiders">> - Since the bands of raiders are used to be on high alert and on the move constantly, guerrilla tactics are not effective against them. - <<elseif $SecExp.war.attacker.type == "free city">> - The modern armies hired by Free Cities are highly mobile, which means quick hit and run attacks will be less successful, but their discipline and confidence still make them quite susceptible to this type of attack. - <<elseif $SecExp.war.attacker.type == "old world">> - While old world armies are tough nuts to crack, their predictability makes them the perfect target for hit and run and harassment tactics. - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - Freedom fighters live every day as chasing and being chased by far superior forces, they are far more experienced than your troops in this type of warfare and much less susceptible to it. - <</if>> - <<elseif $SecExp.war.chosenTactic == "Choke Points">> - <<if $SecExp.war.attacker.type == "raiders">> - Raiders lack heavy weaponry or armor, so making use of fortified positions is an excellent way to dissipate the otherwise powerful momentum of their assault. - <<elseif $SecExp.war.attacker.type == "free city">> - The high tech equipment Free Cities can afford to give their guns for hire means there's no defensive position strong enough to stop them, still the relatively low numbers means they will have to take a careful approach, slowing them down. - <<elseif $SecExp.war.attacker.type == "old world">> - Old world armies have both the manpower and the equipment to conquer any defensive position, making use of strong fortifications will only bring you this far against them. - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - The lack of specialized weaponry means freedom fighters have a rather hard time overcoming tough defensive positions, unfortunately they have also a lot of experience in avoiding them. - <</if>> - <<elseif $SecExp.war.chosenTactic == "Interior Lines">> - <<if $SecExp.war.attacker.type == "raiders">> - The highly mobile horde of raiders will not give much room for your troops to maneuver, lowering their tactical superiority. - <<elseif $SecExp.war.attacker.type == "free city">> - While decently mobile, Free Cities forces are not in high enough numbers to risk maintaining prolonged contact, allowing your troops to quickly disengage and redeploy where it hurts. - <<elseif $SecExp.war.attacker.type == "old world">> - Old world armies are not famous for the mobility, which makes them highly susceptible to any tactic that exploits maneuverability and speed. - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - While not the best equipped army, the experience and mobility typical of freedom fighters groups make them tough targets for an army that relies itself on mobility. - <</if>> - <<elseif $SecExp.war.chosenTactic == "Pincer Maneuver">> - <<if $SecExp.war.attacker.type == "raiders">> - While numerous, the undisciplined masses of raiders are easy prey for encirclements. - <<elseif $SecExp.war.attacker.type == "free city">> - While decently mobile, the low number of Free Cities expedition forces make them good candidates for encirclements. - <<elseif $SecExp.war.attacker.type == "old world">> - The discipline and numbers of old world armies make them quite difficult to encircle. - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - While not particularly mobile, freedom fighters are used to fight against overwhelming odds, diminishing the effectiveness of the encirclement. - <</if>> - <<elseif $SecExp.war.chosenTactic == "Defense In Depth">> - <<if $SecExp.war.attacker.type == "raiders">> - While their low discipline makes them prime candidates for an elastic defense type of strategy, their high numbers limit your troops maneuverability. - <<elseif $SecExp.war.attacker.type == "free city">> - With their low numbers Free Cities mercenaries are quite susceptible to this type of tactic, despite their mobility. - <<elseif $SecExp.war.attacker.type == "old world">> - With their low mobility old world armies are very susceptible to this type of strategy. - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - Low mobility and not particularly high numbers mean freedom fighters can be defeated by employing elastic defense tactics. - <</if>> - <<elseif $SecExp.war.chosenTactic == "Blitzkrieg">> - <<if $SecExp.war.attacker.type == "raiders">> - With their low discipline and lack of heavy equipment, lightning strikes are very effective against raider hordes. - <<elseif $SecExp.war.attacker.type == "free city">> - Having good equipment and discipline on their side, Free Cities expeditions are capable of responding to even strong lightning strikes. - <<elseif $SecExp.war.attacker.type == "old world">> - While disciplined, old world armies low mobility makes them highly susceptible to lightning strikes. - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - While not well equipped, freedom fighters have plenty of experience fighting small, mobile attacks, making them difficult to defeat with lightning strikes. - <</if>> - <<elseif $SecExp.war.chosenTactic == "Human Wave">> - <<if $SecExp.war.attacker.type == "raiders">> - The hordes of raiders are much more experienced than your soldiers in executing mass assaults and they also have a lot more bodies to throw in the grinder. - <<elseif $SecExp.war.attacker.type == "free city">> - The good equipment and mobility of Free Cities mercenaries cannot save them from an organized mass assault. - <<elseif $SecExp.war.attacker.type == "old world">> - Unfortunately the discipline and good equipment of old world armies allow them to respond well against a mass assault. - <<elseif $SecExp.war.attacker.type == "freedom fighters">> - The relative low numbers and not great equipment typical of freedom fighters make them susceptible to being overwhelmed by an organized mass assault. - <</if>> - <</if>> - In the end <<if $SecExp.war.commander == "PC">>you were<<else>>your commander was<</if>> - <<if $SecExp.war.tacticsSuccessful>> - @@.green;able to successfully employ <<print $SecExp.war.chosenTactic>> tactics,@@ greatly enhancing - <<else>> - @@.red;not able to effectively employ <<print $SecExp.war.chosenTactic>> tactics,@@ greatly affecting - <</if>> - the efficiency of your army. <br> <<include "unitsBattleReport">> - - <<if $SF.Toggle && $SF.Active >= 1 && ($SF.Squad.Firebase >= 7 || $SF.Squad.GunS >= 1 || $SF.Squad.Satellite >= 5 || $SF.Squad.GiantRobot >= 6 || $SF.Squad.MissileSilo >= 1)>> - /* SF upgrades effects */ <br><br> - <<if $SF.Squad.Firebase >= 7>> - The artillery pieces installed around $SF.Lower's firebase provided vital fire support to the troops in the field. - <</if>> - <<if $SF.Squad.GunS >= 1>> - The gunship gave our troops an undeniable advantage in recon capabilities, air superiority and fire support. - <</if>> - <<if $SF.Squad.Satellite >= 5 && $SF.SatLaunched > 0>> - The devastating power of $SF.Lower's satellite was employed with great efficiency against the enemy. - <</if>> - <<if $SF.Squad.GiantRobot >= 6>> - The giant robot of $SF.Lower proved to be a great boon to our troops, shielding many from the worst the enemy had to offer. - <</if>> - <<if $SF.Squad.MissileSilo >= 1>> - The missile silo exterminated many enemy soldiers even before the battle would begin. - <</if>> - <</if>> - -<</if>> /* closes check for surrender and bribery */ - -<br><br> - -<<set _menialPrice = Math.trunc(($slaveCostFactor*1000)/100)*100>> -<<set _menialPrice = Math.clamp(_menialPrice, 500, 1500)>> - -<<set _captives = Math.trunc(_captives)>> -<<if _captives > 0>> - During the battle <<print _captives>> attackers were captured. - /* - <<if random(1,100) <= 25>> - <<set _roll = random(1,100)>> - <<if _roll <= 33>> - Three of them have the potential to be sex slaves. - <<set _candidates = 3>> - - <<elseif _roll <= 66>> - Two of them have the potential to be sex slaves. - <<set _candidates = 2>> - <<else>> - One of them have the potential to be sex slaves. - <<set _candidates = 1>> - <</if>> - <</if>> - */ - <br> - <span id="captOptions"> - <<link "sell them all immediately">> - <<run cashX((_menialPrice * _captives), "menialTransfer")>> - <<replace "#captOptions">>Captives sold<</replace>> - <</link>> - | - <<link "Keep them as menial slaves">> - <<set $menials += _captives>> - <<replace "#captOptions">>Captives added as menial slaves<</replace>> - <</link>> - </span> -<</if>> - -/* resets variables */ -<<set $majorBattle = 0>> -<<set $SecExp.units.bots.isDeployed = 0>> -<<for _squad range App.SecExp.unit.humanSquads()>> - <<set _squad.isDeployed = 0>> -<</for>> \ No newline at end of file diff --git a/src/Mods/SecExp/events/secExpSmilingMan.tw b/src/Mods/SecExp/events/secExpSmilingMan.tw index 12f3bc8b2aa2e1779997c6a520c8aaca9c157f4b..7fc01021c5f1b1d16953d0a5fb15fd485b52d8c8 100644 --- a/src/Mods/SecExp/events/secExpSmilingMan.tw +++ b/src/Mods/SecExp/events/secExpSmilingMan.tw @@ -141,7 +141,7 @@ "I... I — I couldn't stop him! I'm sorry, <<= properTitle()>>." </p> <p> - You waste no time in rushing to the console and checking your finances. It's as you feared, <span class="cash.dec">you have been robbed.</span> + You waste no time in rushing to the console and checking your finances. It's as you feared, <span class="cash dec">you have been robbed.</span> </p> <<set _lostCash = Math.clamp(50000 * Math.trunc($week / 20), 50000, 1000000)>> <<if $assistant.power >= 1>> @@ -241,16 +241,16 @@ In little more than seconds all the data collected in the years past vanished. It's a disaster. The vast majority of currency is digital, so the actions of the Smiling Man have a devastating effect on the money supply. <<if $cash < 0>> - Luckily for you this means that your <span class="cash.inc">debt is reduced.</span> + Luckily for you this means that your <span class="cash inc">debt is reduced.</span> <<else>> - Unfortunately this means that your <span class="cash.dec">cash reserves are gutted.</span> + Unfortunately this means that your <span class="cash dec">cash reserves are gutted.</span> <</if>> <<run cashX(($cash * 0.2)-$cash, "event")>> You are not the only one affected by this however. <span class="red">The economy of the entire world is severely affected</span> by the loss of vast quantities of currency. Who knows how long will it take for the global economy to recover. <<set $SecExp.smilingMan.globalCrisisWeeks = random(8,16)>> Trade is <span class="red">severely affected.</span> <<set $SecExp.core.trade *= 0.2>> - With the loss of so much information, most of your accomplishments are simply forgotten, so <span class="reputation.dec">your reputation suffers.</span> + With the loss of so much information, most of your accomplishments are simply forgotten, so <span class="reputation dec">your reputation suffers.</span> <<run repX(($rep * 0.6)-$rep, "event")>> <<if $arcologies[0].ownership >= 60>> @@ -407,7 +407,7 @@ The world will never find out the truth of the Smiling Man and his legend will only grow with time, outliving his creator and maybe even $his new employer. </p> <p> - The collaboration of the ex-Smiling Man permanently increases <span class="green">security and the rate of prosperity growth.</span> <span class="cash.inc">Cash will be also provided,</span> but you're better off not knowing the sources. + The collaboration of the ex-Smiling Man permanently increases <span class="green">security and the rate of prosperity growth.</span> <span class="cash inc">Cash will be also provided,</span> but you're better off not knowing the sources. </p> <<elseif $SecExp.smilingMan.progress === 20>> <<set _activeSlave.clothes = "no clothing">> @@ -416,7 +416,7 @@ Once $his life ends, you order a statue erected in commemoration of the death of the Smiling Man. From this day forward the statue of the crucified criminal will adorn your arcology and his legend will be forever entangled with yours. </p> <p> - Having dealt with the Smiling Man will provide <span class="reputation.inc">a large boost to your reputation, as well as a moderate amount of reputation each week.</span> + Having dealt with the Smiling Man will provide <span class="reputation inc">a large boost to your reputation, as well as a moderate amount of reputation each week.</span> </p> <<run repX(10000, "architecture")>> <</if>> diff --git a/src/Mods/SecExp/events/unitsBattleReport.tw b/src/Mods/SecExp/events/unitsBattleReport.tw deleted file mode 100644 index 67744f41dee12a29daece5868eadf21a2ee732ff..0000000000000000000000000000000000000000 --- a/src/Mods/SecExp/events/unitsBattleReport.tw +++ /dev/null @@ -1,259 +0,0 @@ -:: unitsBattleReport [nobr] - -<<if $SecExp.war.losses == 0>> - <<if App.SecExp.battle.deployedUnits('bots')>> - <br>Security Drones: no casualties. - <</if>> - <<if $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - <br><<print num($SF.ArmySize)>> soldiers from $SF.Lower joined the battle: no casualties suffered. - <</if>> - <<if App.SecExp.battle.deployedUnits('militia') >= 1>> - <<for _j = 0; _j < $SecExp.units.militia.squads.length; _j++>> - <<if $SecExp.units.militia.squads[_j].isDeployed == 1>> - <br>$SecExp.units.militia.squads[_j].platoonName: no casualties. - <<set $SecExp.units.militia.squads[_j].battlesFought++>> - <<if $SecExp.units.militia.squads[_j].training < 100>> - <<if random(1,100) > 60>> - Experience has increased. - <<set $SecExp.units.militia.squads[_j].training += random(5,15) + $majorBattle * random(5,15)>> - <</if>> - <</if>> - <</if>> - <</for>> - <</if>> - <<if App.SecExp.battle.deployedUnits('slaves') >= 1>> - <<for _j = 0; _j < $SecExp.units.slaves.squads.length; _j++>> - <<if $SecExp.units.slaves.squads[_j].isDeployed == 1>> - <br>$SecExp.units.slaves.squads[_j].platoonName: no casualties. - <<set $SecExp.units.slaves.squads[_j].battlesFought++>> - <<if $SecExp.units.slaves.squads[_j].training < 100>> - <<if random(1,100) > 60>> - Experience has increased. - <<set $SecExp.units.slaves.squads[_j].training += random(5,15) + $majorBattle * random(5,15)>> - <</if>> - <</if>> - <</if>> - <</for>> - <</if>> - <<if App.SecExp.battle.deployedUnits('mercs') >= 1>> - <<for _j = 0; _j < $SecExp.units.mercs.squads.length; _j++>> - <<if $SecExp.units.mercs.squads[_j].isDeployed == 1>> - <br>$SecExp.units.mercs.squads[_j].platoonName: no casualties. - <<set $SecExp.units.mercs.squads[_j].battlesFought++>> - <<if $SecExp.units.mercs.squads[_j].training < 100>> - <<if random(1,100) > 60>> - Experience has increased. - <<set $SecExp.units.mercs.squads[_j].training += random(5,15) + $majorBattle * random(5,15)>> - <</if>> - <</if>> - <</if>> - <</for>> - <</if>> -<<elseif $SecExp.war.losses > 0>> - /* if the losses are more than zero */ - /* generates a list of randomized losses, from which each unit picks one at random */ - <<set _losses = $SecExp.war.losses>> - <<set _averageLosses = Math.trunc(_losses / App.SecExp.battle.deployedUnits())>> - <<set _lossesList = []>> - <<set _validityCount = 0>> - <<for _i = 0; _i < App.SecExp.battle.deployedUnits(); _i++>> - <<set _assignedLosses = Math.trunc(Math.clamp(_averageLosses + random(-5,5), 0, 100))>> - <<if _assignedLosses > _losses>> - <<set _assignedLosses = _losses>> - <<set _losses = 0>> - <<else>> - <<set _losses -= _assignedLosses>> - <</if>> - <<set _lossesList.push(_assignedLosses)>> - <<set _validityCount += _assignedLosses>> - <</for>> - <<if _losses > 0>> - <<set _lossesList[random(_lossesList.length - 1)] += _losses>> - <</if>> - <<set _lossesList.shuffle()>> - - /* sanity check for losses */ - <<set _count = 0>> - <<for _i = 0; _i < _lossesList.length; _i++>> - <<if !Number.isInteger(_lossesList[_i])>> - <<set _lossesList[_i] = 0>> - <</if>> - <<set _count += _lossesList[_i]>> - <</for>> - <<if _count < $SecExp.war.losses>> - <<set _rand = random(_lossesList.length - 1)>> - <<set _lossesList[_rand] += $SecExp.war.losses - _count>> - <<elseif _count > $SecExp.war.losses>> - <<set _diff = _count - $SecExp.war.losses>> - <<set _rand = random(_lossesList.length - 1)>> - <<set _lossesList[_rand] = Math.trunc(_lossesList[_rand]-_diff,0,100)>> - <</if>> - - /* assigns the losses and notify the player */ - <<if App.SecExp.battle.deployedUnits('bots')>> - <<set _loss = _lossesList.pluck()>> - <<set _loss = Math.clamp(_loss,0,$SecExp.units.bots.troops)>> - <<set $SecExp.units.bots.troops -= _loss>> - <br>Security drones: - <<if _loss <= 0>> - no casualties - <<elseif _loss <= $SecExp.units.bots.troops * 0.2>> - light casualties - <<elseif _loss <= $SecExp.units.bots.troops * 0.4>> - moderate casualties - <<elseif _loss <= $SecExp.units.bots.troops * 0.6>> - heavy casualties - <<else>> - catastrophic casualties - <</if>> - suffered. - <<if $SecExp.units.bots.troops <= 5>> - <<set $SecExp.units.bots.active = 0>> - Unfortunately the losses they took were simply too great, their effective combatants are in so small number you can no longer call them a deployable unit. It will take quite the investment to rebuild them. - <<elseif $SecExp.units.bots.troops <= 10>> - The unit has very few operatives left, it risks complete annihilation if deployed again. - <</if>> - <br> - <</if>> - <<if $SF.Toggle && $SF.Active >= 1 && $SecExp.war.deploySF>> - <<set _loss = _lossesList.pluck()>> - <<set _loss = Math.clamp(_loss,0,$SF.ArmySize)>> - <br> <<print num($SF.ArmySize)>> soldiers from $SF.Lower joined the battle: - <<if _loss <= 0>> - no casualties - <<elseif _loss <= 10>> - light casualties - <<elseif _loss <= 30>> - moderate casualties - <<elseif _loss <= 60>> - heavy casualties - <<else>> - catastrophic casualties - <</if>> - suffered. - <<set $SF.ArmySize -= _loss>> - <br> - <</if>> - <<if App.SecExp.battle.deployedUnits('militia') >= 1>> - <<for _j = 0; _j < $SecExp.units.militia.squads.length; _j++>> - <<if $SecExp.units.militia.squads[_j].isDeployed == 1>> - <<set $SecExp.units.militia.squads[_j].battlesFought++>> - <<set _loss = _lossesList.pluck()>> - <<set _loss = Math.clamp(_loss,0,$SecExp.units.militia.squads[_j].troops)>> - <br>$SecExp.units.militia.squads[_j].platoonName: - <<if _loss <= 0>> - no casualties - <<elseif _loss <= $SecExp.units.militia.squads[_j].troops * 0.2>> - light casualties - <<elseif _loss <= $SecExp.units.militia.squads[_j].troops * 0.4>> - moderate casualties - <<elseif _loss <= $SecExp.units.militia.squads[_j].troops * 0.6>> - heavy casualties - <<else>> - catastrophic casualties - <</if>> - suffered. - <<set _med = Math.round(Math.clamp(_loss * $SecExp.units.militia.squads[_j].medics * 0.25,1,_loss))>> - <<if $SecExp.units.militia.squads[_j].medics == 1 && _loss > 0>> - Some men were saved by their medics. - <</if>> - <<set $SecExp.units.militia.squads[_j].troops -= Math.trunc(Math.clamp(_loss - _med,0,$SecExp.units.militia.squads[_j].maxTroops))>> - <<set $SecExp.units.militia.dead += Math.trunc(_loss - _med)>> - <<if $SecExp.units.militia.squads[_j].training < 100>> - <<if random(1,100) > 60>> - Experience has increased. - <<set $SecExp.units.militia.squads[_j].training += random(5,15) + $majorBattle * random(5,15)>> - <</if>> - <</if>> - <<if $SecExp.units.militia.squads[_j].troops <= 5>> - <<set $SecExp.units.militia.squads[_j].active = 0>> - <br>Unfortunately the losses they took were simply too great, their effective combatants are in so small number you can no longer call them a deployable unit. The remnants will be sent home honored as veterans or reorganized in a new unit. - <<elseif $SecExp.units.militia.squads[_j].troops <= 10>> - <br>The unit has very few operatives left, it risks complete annihilation if deployed again. - <</if>> - <</if>> - <</for>> - <</if>> - <<if App.SecExp.battle.deployedUnits('slaves') >= 1>> - <<for _j = 0; _j < $SecExp.units.slaves.squads.length; _j++>> - <<if $SecExp.units.slaves.squads[_j].isDeployed == 1>> - <<set $SecExp.units.slaves.squads[_j].battlesFought++>> - <<set _loss = _lossesList.pluck()>> - <<set _loss = Math.clamp(_loss,0,$SecExp.units.slaves.squads[_j].troops)>> - <br>$SecExp.units.slaves.squads[_j].platoonName: - <<if _loss <= 0>> - no casualties - <<elseif _loss <= $SecExp.units.slaves.squads[_j].troops * 0.2>> - light casualties - <<elseif _loss <= $SecExp.units.slaves.squads[_j].troops * 0.4>> - moderate casualties - <<elseif _loss <= $SecExp.units.slaves.squads[_j].troops * 0.6>> - heavy casualties - <<else>> - catastrophic casualties - <</if>> - suffered. - <<set _med = Math.round(Math.clamp(_loss * $SecExp.units.slaves.squads[_j].medics * 0.25,1,_loss))>> - <<if $SecExp.units.slaves.squads[_j].medics == 1 && _loss > 0>> - Some men were saved by their medics. - <</if>> - <<set $SecExp.units.slaves.squads[_j].troops -= Math.trunc(Math.clamp(_loss - _med,0,$SecExp.units.slaves.squads[_j].maxTroops))>> - <<set $SecExp.units.slaves.dead += Math.trunc(_loss - _med)>> - <<if $SecExp.units.slaves.squads[_j].training < 100>> - <<if random(1,100) > 60>> - Experience has increased. - <<set $SecExp.units.slaves.squads[_j].training += random(5,15) + $majorBattle * random(5,15)>> - <</if>> - <</if>> - <<if $SecExp.units.slaves.squads[_j].troops <= 5>> - <<set $SecExp.units.slaves.squads[_j].active = 0>> - <br>Unfortunately the losses they took were simply too great, their effective combatants are in so small number you can no longer call them a deployable unit. The survivors will be sent home honored as veterans or reorganized in a new unit. - <<elseif $SecExp.units.slaves.squads[_j].troops <= 10>> - <br>The unit has very few operatives left, it risks complete annihilation if deployed again. - <</if>> - <</if>> - <</for>> - <</if>> - <<if App.SecExp.battle.deployedUnits('mercs') >= 1>> - <<for _j = 0; _j < $SecExp.units.mercs.squads.length; _j++>> - <<if $SecExp.units.mercs.squads[_j].isDeployed == 1>> - <<set $SecExp.units.mercs.squads[_j].battlesFought++>> - <<set _loss = _lossesList.pluck()>> - <<set _loss = Math.clamp(_loss,0,$SecExp.units.mercs.squads[_j].troops)>> - <br>$SecExp.units.mercs.squads[_j].platoonName: - <<if _loss <= 0>> - no casualties - <<elseif _loss <= $SecExp.units.mercs.squads[_j].troops * 0.2>> - light casualties - <<elseif _loss <= $SecExp.units.mercs.squads[_j].troops * 0.4>> - moderate casualties - <<elseif _loss <= $SecExp.units.mercs.squads[_j].troops * 0.6>> - heavy casualties - <<else>> - catastrophic casualties - <</if>> - suffered. - <<set _med = Math.round(Math.clamp(_loss * $SecExp.units.mercs.squads[_j].medics * 0.25,1,_loss))>> - <<if $SecExp.units.mercs.squads[_j].medics == 1 && _loss > 0>> - Some men were saved by their medics. - <</if>> - <<set $SecExp.units.mercs.squads[_j].troops -= Math.trunc(Math.clamp(_loss - _med,0,$SecExp.units.mercs.squads[_j].maxTroops))>> - <<set $SecExp.units.mercs.dead += Math.trunc(_loss - _med)>> - <<if $SecExp.units.mercs.squads[_j].training < 100>> - <<if random(1,100) > 60>> - Experience has increased. - <<set $SecExp.units.mercs.squads[_j].training += random(5,15) + $majorBattle * random(5,15)>> - <</if>> - <</if>> - <<if $SecExp.units.mercs.squads[_j].troops <= 5>> - <<set $SecExp.units.mercs.squads[_j].active = 0>> - <br>Unfortunately the losses they took were simply too great, their effective combatants are in so small number you can no longer call them a deployable unit. The remnants will be sent home honored as veterans or reorganized in a new unit. - <<elseif $SecExp.units.mercs.squads[_j].troops <= 10>> - <br>The unit has very few operatives left, it risks complete annihilation if deployed again. - <</if>> - <</if>> - <</for>> - <</if>> -<<else>> - <br>@@.red;Error: losses are a negative number or NaN@@ -<</if>> /* closes check for more than zero casualties */ \ No newline at end of file diff --git a/src/Mods/SecExp/js/secExpBC.js b/src/Mods/SecExp/js/secExpBC.js index 7274b6d7b5525b789415e5db991cce632a7fdf59..cd64d30599ab68d3ab4f743296aa45562f9a6eea 100644 --- a/src/Mods/SecExp/js/secExpBC.js +++ b/src/Mods/SecExp/js/secExpBC.js @@ -40,7 +40,7 @@ App.SecExp.generalBC = function() { V.SecExp.edicts.SFSupportLevel = V.SecExp.edicts.SFSupportLevel || V.SFSupportLevel || 0; V.SecExp.edicts.limitImmigration = V.SecExp.edicts.limitImmigration || V.limitImmigration || 0; V.SecExp.edicts.openBorders = V.SecExp.edicts.openBorders || V.openBorders || 0; - V.SecExp.edicts.weaponsLaw = V.weaponsLaw || between(V.SecExp.edicts.weaponsLaw, 0, 3, 'inclusive') ? V.SecExp.edicts.weaponsLaw : 3; + V.SecExp.edicts.weaponsLaw = V.weaponsLaw || V.SecExp.edicts.weaponsLaw.isBetween(0, 3, true) ? V.SecExp.edicts.weaponsLaw : 3; V.SecExp.edicts.defense.soldierWages = V.SecExp.edicts.defense.soldierWages || V.soldierWages || 1; V.SecExp.edicts.defense.slavesOfficers = V.SecExp.edicts.defense.slavesOfficers || V.slavesOfficers || 0; diff --git a/src/Mods/SpecialForce/SpecialForce.js b/src/Mods/SpecialForce/SpecialForce.js index 7eff80ab62eeba5ea720eaf19d516e035add653a..e736864af8311eefd84f18295e113230bd948d9b 100644 --- a/src/Mods/SpecialForce/SpecialForce.js +++ b/src/Mods/SpecialForce/SpecialForce.js @@ -1393,7 +1393,7 @@ App.SF.AAR = function(endWeekCall = 1) { upkeep *= 0.75 + (V.SF.ArmySize/10000); } - if (between(V.economy, 33, 100)) { + if (V.economy.isBetween(33, 100)) { let multiplier = (1.75 * Math.sqrt(Math.trunc(100000/V.economy-1000)/10)) + (0.2 * (Math.trunc(100000/V.economy-1000)/10)); income *= (1 + multiplier/100); } else if (V.economy <= 33) { // There comes a point where a worse global economy no longer benefits your Special Forces. diff --git a/src/art/assistantArt.js b/src/art/assistantArt.js index 7bd3d84c446ae9ed207ea498ddadc170ab3b1520..0245032fd5d05218a1350cc4d2fb38e0c01bcabf 100644 --- a/src/art/assistantArt.js +++ b/src/art/assistantArt.js @@ -128,7 +128,7 @@ globalThis.assistantArt = function(sizePlacement) { }; /** - * + * * @param {3} [sizePlacement] * @returns {HTMLElement} */ diff --git a/src/cheats/cheatEditArcology.js b/src/cheats/cheatEditArcology.js index 4ada16dc7ec108387229412002509b4838d02fd0..d55cd450efccafbaca399da315c222588a2917b0 100644 --- a/src/cheats/cheatEditArcology.js +++ b/src/cheats/cheatEditArcology.js @@ -1,6 +1,5 @@ /** - * - * @param {Number} num + * @param {number} num * @returns {DocumentFragment} */ App.UI.Cheat.arcology = function(num) { diff --git a/src/cheats/cheatEditSlave.js b/src/cheats/cheatEditSlave.js index 39835b4cb3096d7791a83bcfde0a3ca1e76eb5bb..35c2be24e62f969221dd9e41b6b401f1bd008258 100644 --- a/src/cheats/cheatEditSlave.js +++ b/src/cheats/cheatEditSlave.js @@ -135,7 +135,7 @@ App.UI.SlaveInteract.cheatEditSlave = function(slave) { option = options.addOption(`Porn ${he} is known for`, "fameType", porn).addValue("None", "none").pulldown(); for (const genre of App.Porn.getAllGenres()) { - option.addValue(genre.uiName(), genre.fameVar); + option.addValue(genre.uiName(), genre.fameName); } option = options.addOption(`Porn the studio focuses on`, "focus", porn).addValue("None", "none").pulldown(); diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js index 4fe8e5fb2bcecf94b96e6b2045f63507dcc9eaf1..8e934c7070f1ab93a54e1eb9dc44c38f18705254 100644 --- a/src/data/backwardsCompatibility/datatypeCleanup.js +++ b/src/data/backwardsCompatibility/datatypeCleanup.js @@ -1143,6 +1143,7 @@ globalThis.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() { } slave.heels = Math.clamp(+slave.heels, 0, 1) || 0; slave.PLimb = Math.clamp(+slave.PLimb, 0, 2) || 0; + slave.PTail = Math.clamp(+slave.PTail, 0, 1) || 0; if (slave.voice !== 0) { slave.voice = Math.clamp(+slave.voice, 0, 3) || 1; } diff --git a/src/debugging/debugJS.js b/src/debugging/debugJS.js index 0b3c3108147e62e8d8aa4ab4f761b80c2aae8df9..503a6f8b0d8425c1f6f9295d05e342b396fa56d7 100644 --- a/src/debugging/debugJS.js +++ b/src/debugging/debugJS.js @@ -16,7 +16,9 @@ Shamelessly copied from https://codereview.stackexchange.com/a/11580 Finds and returns the difference between two objects. Potentially will have arbitrary nestings of objects. */ globalThis.difference = function(o1, o2) { - let k, kDiff, diff = {}; + let k; + let kDiff; + let diff = {}; for (k in o1) { if (!o1.hasOwnProperty(k)) { } else if (typeof o1[k] !== 'object' || typeof o2[k] !== 'object') { diff --git a/src/descriptions/familySummaries.js b/src/descriptions/familySummaries.js index 4e34e480af2ddae319a19e66c984f885f092d976..f79bf17c3c2951a750a875aaae95f5a7e532ad55 100644 --- a/src/descriptions/familySummaries.js +++ b/src/descriptions/familySummaries.js @@ -53,7 +53,7 @@ App.Desc.family = (function() { if (character === V.PC) { return PCFamilySummary(); } else { - // FIXME: Argument of type 'HumanState' is not assignable to parameter of type 'SlaveState'. + // @ts-ignore return slaveFamilySummary(character); } } @@ -499,7 +499,7 @@ App.Desc.family = (function() { } else if (slave.inbreedingCoeff >= 0.25) { r.push("very"); } else if (slave.inbreedingCoeff >= 0.125) { - // TODO: ? + // no adjective here } else if (slave.inbreedingCoeff >= 0.0625) { r.push("somewhat"); } else { @@ -699,7 +699,8 @@ App.Desc.family = (function() { r.push("extremely"); } else if (V.PC.inbreedingCoeff >= 0.25) { r.push("very"); - } else if (V.PC.inbreedingCoeff >= 0.125) { // No adjective in this case + } else if (V.PC.inbreedingCoeff >= 0.125) { + // no adjective here } else if (V.PC.inbreedingCoeff >= 0.0625) { r.push("somewhat"); } else { diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js index 9d90425a8671a6263ee09ac2c8dac40c2508aa9b..0ef3830aa2dab08b752e1bb72d9068cd88b596e8 100644 --- a/src/endWeek/economics/persBusiness.js +++ b/src/endWeek/economics/persBusiness.js @@ -838,12 +838,12 @@ App.EndWeek.personalBusiness = function() { if (V.policies.regularParties === 0) { if (V.rep > 3000) { r.push(`Your <span class="red">reputation is damaged</span> by your not `); - r.push(App.UI.DOM.disabledLink("hosting regular social events", ["Regular Social Events is a domestic policy costing ¤5000 a week that you can adopt."])); + r.push(App.UI.DOM.spanWithTooltip("hosting regular social events", "Regular Social Events is a domestic policy costing ¤5000 a week that you can adopt.")); r.push(`for your leading citizens.`); repX(-50, "personalBusiness"); } else { r.push(`Though you are not `); - r.push(App.UI.DOM.disabledLink("hosting regular social events", ["Regular Social Events is a domestic policy costing ¤5000 a week that you can adopt."])); + r.push(App.UI.DOM.spanWithTooltip("hosting regular social events", "Regular Social Events is a domestic policy costing ¤5000 a week that you can adopt.")); r.push(` for your leading citizens, your lack of renown prevents this from damaging your reputation; they don't expect someone so relatively unknown to be throwing parties.`); } } diff --git a/src/endWeek/economics/reputation.js b/src/endWeek/economics/reputation.js index 4101c219c39ccd83a36cd02cda79fe973f816ab5..72630715bd638d8d3e64406171ea3798ee9097e3 100644 --- a/src/endWeek/economics/reputation.js +++ b/src/endWeek/economics/reputation.js @@ -580,7 +580,7 @@ App.EndWeek.reputation = function() { repX(-50, "PCactions"); if (canGetPregnant(V.PC)) { r.push(`That's not all that leaks out of you, considering all your shoots are rubber free.`); - r.push(knockMeUp(V.PC, 20, 0, -5, true)); + knockMeUp(V.PC, 20, 0, -5); } } diff --git a/src/endWeek/endWeek.js b/src/endWeek/endWeek.js index 3acd838daedead1c9c1176302a877f9abddeb90c..89bc0b634c66679a9743558b906fb4d098db6a14 100644 --- a/src/endWeek/endWeek.js +++ b/src/endWeek/endWeek.js @@ -304,7 +304,11 @@ globalThis.endWeek = (function() { } function confirmEndWeek() { - if (!V.sideBarOptions.confirmWeekEnd || confirm("Are you sure you want to end the week?")) { + const expiredReminders = V.reminders.filter(r => r.week <= V.week); + if ( + (!V.sideBarOptions.confirmWeekEnd || confirm("Are you sure you want to end the week?")) && + (expiredReminders.length === 0 || confirm(`These reminders are due: ${toSentence(Array.from(expiredReminders, r => r.message))}. End the week anyway?`)) + ) { App.UI.EndWeekAnim.start(); setTimeout(doEndWeek, 0); // execute immediately, but after the event loop runs, so the loading screen gets shown } diff --git a/src/endWeek/events/retire.js b/src/endWeek/events/retire.js index 62872652fdb3329e93e311fcc9dd16a9b0700293..c81d54ab585e57de6ef68269fc079b68c552f941 100644 --- a/src/endWeek/events/retire.js +++ b/src/endWeek/events/retire.js @@ -256,7 +256,7 @@ globalThis.retireScene = function(originalSlave) { r.push(`as usual, ${he} doesn't care that the phallus you fuck ${him} with is actually a strap-on. ${He} manages to pretend it's a cock knocking ${him} up.`); } } else if (slave.fetish === "dom" && slave.fetishKnown === 1) { - r.push(`After some mutually aggressive dancing that leaves you both panting and sweaty, you work together to attract another free dancer, a ${girlU} who ${slave.slaveName} had ${his} eye on already. Before long, the poor ${girlU} is screaming with orgasm in a private booth as you take _himU together.`); + r.push(`After some mutually aggressive dancing that leaves you both panting and sweaty, you work together to attract another free dancer, a ${girlU} who ${slave.slaveName} had ${his} eye on already. Before long, the poor ${girlU} is screaming with orgasm in a private booth as you take ${himU} together.`); } else if (slave.fetish === "sadist" && slave.fetishKnown === 1) { r.push(`After some mutually aggressive dancing that leaves you both panting and sweaty, you mutually select one of the club's slaves, and drag ${himU} back to a private booth. Before long, ${hisU} screams for mercy are audible on the floor.`); } else if (slave.fetish === "masochist" && slave.fetishKnown === 1) { @@ -412,7 +412,7 @@ globalThis.retireScene = function(originalSlave) { r.push(`The suit has a pair of gaps for its monstrous breasts, bare expanses of ${slave.skin} skin.`); } if (slave.belly >= 5000) { - r.push(`The suit has a gap for its big belly; a round dome of slave.skin skin.`); + r.push(`The suit has a gap for its big belly; a round dome of ${slave.skin} skin.`); } if (slave.lips > 40) { r.push(`Its upper hole is surrounded by a ludicrous set of swollen lips.`); diff --git a/src/endWeek/nextWeek/resetGlobals.js b/src/endWeek/nextWeek/resetGlobals.js index 9674eefe92fffd6e5bb1528a070271c1587f4fee..8f37de1191f79e7e716c780c09b62cc923996dd7 100644 --- a/src/endWeek/nextWeek/resetGlobals.js +++ b/src/endWeek/nextWeek/resetGlobals.js @@ -35,7 +35,6 @@ App.EndWeek.resetGlobals = function() { V.activeSlave = 0; V.eventSlave = 0; V.subSlave = 0; - V.relation = 0; V.relative = 0; V.relative2 = 0; diff --git a/src/endWeek/reports/arcadeReport.js b/src/endWeek/reports/arcadeReport.js index 01601f365e98c079cb48805c50f15bf4e3cfcf33..86bf873ce2d12ff2cfdc5e2524ac597a777e43a3 100644 --- a/src/endWeek/reports/arcadeReport.js +++ b/src/endWeek/reports/arcadeReport.js @@ -83,7 +83,7 @@ App.EndWeek.arcadeReport = function() { const {He} = getPronouns(slave); const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(slaveEntry, slave); - slaveEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave); r = []; r.push(App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name")); if (slave.choosesOwnAssignment === 2) { @@ -300,9 +300,7 @@ App.EndWeek.arcadeReport = function() { const {He} = getPronouns(slave); const milkResults = App.SlaveAssignment.getMilked(slave, 1.0); if (V.showEWD !== 0) { - r = []; - r.push(App.UI.DOM.makeElement("div", `${He} ${milkResults.text}`, "indent")); - App.Events.addNode(el, r, "div", "indent"); + App.Events.addNode(el, [He, milkResults.text], "div", "indent"); } return milkResults.cash; } diff --git a/src/endWeek/reports/brothelReport.js b/src/endWeek/reports/brothelReport.js index 0137e618c46ccc644f300b0d321f9da71c341672..d68b757f87383772b4c73d2b63221c8da4fc4d6d 100644 --- a/src/endWeek/reports/brothelReport.js +++ b/src/endWeek/reports/brothelReport.js @@ -101,7 +101,7 @@ App.EndWeek.brothelReport = function() { r.push(`${He} understands how to read the customer and please them effectively.`); } else if (S.Madam.skill.madam > 20) { r.push(`${He} has basic knowledge of how to run a whorehouse.`); - } + } if (S.Madam.skill.madam < V.masteredXP) { const skillIncrease = jsRandom(1, Math.ceil((S.Madam.intelligence + S.Madam.intelligenceImplant) / 15) + 8); r.push(slaveSkillIncrease('madam', S.Madam, skillIncrease)); @@ -267,7 +267,7 @@ App.EndWeek.brothelReport = function() { if (V.showEWD !== 0) { const madamEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(madamEntry, madam); - madamEntry.append(App.UI.favoriteToggle(madam), " "); + App.SlaveAssignment.appendSlaveLinks(madamEntry, madam); App.Events.addNode( madamEntry, [ @@ -331,7 +331,7 @@ App.EndWeek.brothelReport = function() { if (slave.trust < 30) { slave.trust += 5; } - if (slave.energy > 40 && slave.energy < 95) { + if (slave.energy.isBetween(40, 95)) { slave.energy++; } @@ -339,7 +339,7 @@ App.EndWeek.brothelReport = function() { const {He} = getPronouns(slave); const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(slaveEntry, slave); - slaveEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave); r = []; r.push(App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name")); if (slave.choosesOwnAssignment === 2) { diff --git a/src/endWeek/reports/cellblockReport.js b/src/endWeek/reports/cellblockReport.js index 148b09e67dd3cdef1e6cd330ae0df74e80f6eaf7..61ec702120605a74bbb01a048374a819e5305de2 100644 --- a/src/endWeek/reports/cellblockReport.js +++ b/src/endWeek/reports/cellblockReport.js @@ -175,7 +175,7 @@ App.EndWeek.cellblockReport = function() { if (V.showEWD !== 0) { const wardenessEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(wardenessEntry, slave); - wardenessEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(wardenessEntry, slave); App.Events.addNode( wardenessEntry, [ @@ -294,7 +294,7 @@ App.EndWeek.cellblockReport = function() { if (V.showEWD !== 0) { const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(slaveEntry, slave); - slaveEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave); r = []; r.push(App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name")); if (slave.choosesOwnAssignment === 2) { diff --git a/src/endWeek/reports/clinicReport.js b/src/endWeek/reports/clinicReport.js index 0317c4012b8e3e0780b0b903c7658cd46db54bf5..f75cb416b2c9481fef1187f12e5974843c64e77e 100644 --- a/src/endWeek/reports/clinicReport.js +++ b/src/endWeek/reports/clinicReport.js @@ -258,7 +258,7 @@ App.EndWeek.clinicReport = function() { if (V.showEWD !== 0) { const nurseEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(nurseEntry, slave); - nurseEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(nurseEntry, slave); $(nurseEntry).append(`<span class='slave-name'>${SlaveFullName(slave)}</span> is serving as the clinical nurse.`); nurseEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false)); } else { @@ -399,7 +399,7 @@ App.EndWeek.clinicReport = function() { if (V.showEWD !== 0) { const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(slaveEntry, slave); - slaveEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave); $(slaveEntry).append(`<span class='slave-name'>${SlaveFullName(slave)}</span> `); if (slave.choosesOwnAssignment === 2) { $(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave)); diff --git a/src/endWeek/reports/clubReport.js b/src/endWeek/reports/clubReport.js index 406c1a17c8edbe874917811eca60223384885a52..0d79a0438f806d6330378088e544e6c5a4a113c2 100644 --- a/src/endWeek/reports/clubReport.js +++ b/src/endWeek/reports/clubReport.js @@ -152,7 +152,7 @@ App.EndWeek.clubReport = function() { if (V.showEWD !== 0) { const DJEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(DJEntry, slave); - DJEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(DJEntry, slave); App.Events.addNode( DJEntry, [ @@ -204,7 +204,7 @@ App.EndWeek.clubReport = function() { if (V.showEWD !== 0) { const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(slaveEntry, slave); - slaveEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave); r = []; r.push(App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name")); if (slave.choosesOwnAssignment === 2) { diff --git a/src/endWeek/reports/dairyReport.js b/src/endWeek/reports/dairyReport.js index 11c056000cb14a0da29e27470598d17999b42fcf..243cde7eced61372ad82c924231b3a3f632f2125 100644 --- a/src/endWeek/reports/dairyReport.js +++ b/src/endWeek/reports/dairyReport.js @@ -50,11 +50,7 @@ App.EndWeek.dairyReport = function() { breeders++; } if (V.milkmaidImpregnates === 1 && canPenetrate(S.Milkmaid) && S.Milkmaid.pubertyXY === 1 && !slaveResting(S.Milkmaid)) { - if (canImpreg(slave, S.Milkmaid)) { - slave.preg = 1; - slave.pregSource = V.MilkmaidID; - slave.pregKnown = 1; - slave.pregWeek = 1; + if (canImpreg(slave, S.Milkmaid) && slave.pregKnown === 0) { milkmaidImpregnated++; if (slave.mpreg === 1) { slave.counter.anal += 10; @@ -63,8 +59,7 @@ App.EndWeek.dairyReport = function() { slave.counter.vaginal += 10; V.vaginalTotal += 10; } - slave.pregType = setPregType(slave); - WombImpregnate(slave, slave.pregType, V.MilkmaidID, 1); + knockMeUp(slave, 100, 2, V.MilkmaidID); } } /* how much effort the MM must take to force a slave into a stall */ @@ -345,7 +340,7 @@ App.EndWeek.dairyReport = function() { if (V.showEWD !== 0) { const milkMaidEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(milkMaidEntry, slave); - milkMaidEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(milkMaidEntry, slave); App.Events.addNode( milkMaidEntry, [ @@ -467,7 +462,7 @@ App.EndWeek.dairyReport = function() { if (V.showEWD !== 0) { const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(slaveEntry, slave); - slaveEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave); r = []; r.push(App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name")); if (slave.choosesOwnAssignment === 2) { diff --git a/src/endWeek/reports/farmyardReport.js b/src/endWeek/reports/farmyardReport.js index 559e43a2f231d186de820e983c84d7861bf32a4a..213025c4c2c01282dd8a94b7f2ed440c8f933635 100644 --- a/src/endWeek/reports/farmyardReport.js +++ b/src/endWeek/reports/farmyardReport.js @@ -257,7 +257,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { if (V.showEWD) { const farmerEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(farmerEntry, Farmer); - farmerEntry.append(App.UI.favoriteToggle(Farmer), " "); + App.SlaveAssignment.appendSlaveLinks(farmerEntry, slave); $(farmerEntry).append(`<span class="slave-name">${SlaveFullName(Farmer)}</span> is serving as the Farmer.`); farmerEntry.append(App.SlaveAssignment.standardSlaveReport(Farmer, false)); } else { @@ -336,7 +336,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { } function farmhandEnergy(slave) { - if (slave.energy > 40 && slave.energy < 95) { + if (slave.energy.isBetween(40, 95)) { slave.energy++; } } @@ -352,7 +352,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { if (V.showEWD) { const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(slaveEntry, slave); - slaveEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave); $(slaveEntry).append(`<span class="slave-name">${SlaveFullName(slave)}</span> `); if (slave.choosesOwnAssignment === 2) { diff --git a/src/endWeek/reports/masterSuiteReport.js b/src/endWeek/reports/masterSuiteReport.js index 0129ed1c0e01837a22dc303624a18c995bbd9b83..c6d08951a85c19310d2f59f6f25ba95583e99cfd 100644 --- a/src/endWeek/reports/masterSuiteReport.js +++ b/src/endWeek/reports/masterSuiteReport.js @@ -286,7 +286,7 @@ App.EndWeek.masterSuiteReport = function() { slave.boobs -= slave.boobsMilk; slave.boobsMilk = 0; } - if (slave.energy > 40 && slave.energy < 95) { + if (slave.energy.isBetween(40, 95)) { r.push(`Being a constant part of the fuckpit orgy <span class="green">greatly heightens ${his} libido.</span>`); slave.energy += 2; } @@ -432,14 +432,14 @@ App.EndWeek.masterSuiteReport = function() { tired(concubine); const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(slaveEntry, concubine); - slaveEntry.append(App.UI.favoriteToggle(concubine), " "); + App.SlaveAssignment.appendSlaveLinks(slaveEntry, concubine); App.Events.addNode(slaveEntry, [concubineText(), commonText(concubine)]); } for (const slave of App.SlaveAssignment.reportSlaves(slaves)) { const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(slaveEntry, slave); - slaveEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave); App.Events.addNode(slaveEntry, [nonConcubineText(slave), commonText(slave)]); } diff --git a/src/endWeek/reports/nurseryReport.js b/src/endWeek/reports/nurseryReport.js index dcc6676edb9d6d54084dde43db0826beb11c9be2..71540f5f0838db2452450ae5e20beb594806d10d 100644 --- a/src/endWeek/reports/nurseryReport.js +++ b/src/endWeek/reports/nurseryReport.js @@ -141,7 +141,7 @@ App.Facilities.Nursery.nurseryReport = function nurseryReport() { if (V.showEWD !== 0) { const matronEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(matronEntry, slave); - matronEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(matronEntry, slave); $(matronEntry).append(`<span class="slave-name">${SlaveFullName(slave)}</span> is serving as your Matron.`); matronEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false)); } else { @@ -197,7 +197,7 @@ App.Facilities.Nursery.nurseryReport = function nurseryReport() { const {He} = getPronouns(slave); const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(slaveEntry, slave); - slaveEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave); $(slaveEntry).append(`<span class="slave-name">${SlaveFullName(slave)}</span> `); if (slave.choosesOwnAssignment === 2) { diff --git a/src/endWeek/reports/penthouseReport.js b/src/endWeek/reports/penthouseReport.js index 3a7628e1c40eac3ade508aacab7465055a4f7f0a..5de638689bbe0965067f80bf8a33f66536eaf1c1 100644 --- a/src/endWeek/reports/penthouseReport.js +++ b/src/endWeek/reports/penthouseReport.js @@ -22,7 +22,7 @@ App.EndWeek.penthouseReport = function() { if (penthouseArtRenderer) { App.UI.DOM.appendNewElement("div", slaveEntry, penthouseArtRenderer.render(slave), ["imageRef", "medImg"]); } - slaveEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave); slaveEntry.append(fullReport(slave)); if (slave.ID === V.HeadGirlID && hgSlave) { diff --git a/src/endWeek/reports/schoolroomReport.js b/src/endWeek/reports/schoolroomReport.js index d2cee049162c72ebe191d10b2972b13921659a59..c80b267bce98021a3dcd09f286e50fdf4df08413 100644 --- a/src/endWeek/reports/schoolroomReport.js +++ b/src/endWeek/reports/schoolroomReport.js @@ -153,7 +153,7 @@ App.EndWeek.schoolroomReport = function() { if (V.showEWD !== 0) { const schoolteacherEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(schoolteacherEntry, slave); - schoolteacherEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(schoolteacherEntry, slave); $(schoolteacherEntry).append(`<span class='slave-name'>${SlaveFullName(slave)}</span> is serving as your Schoolteacher.`); schoolteacherEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false)); } else { @@ -226,7 +226,7 @@ App.EndWeek.schoolroomReport = function() { const {He} = getPronouns(slave); const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(slaveEntry, slave); - slaveEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave); $(slaveEntry).append(`<span class='slave-name'>${SlaveFullName(slave)}</span> `); if (slave.choosesOwnAssignment === 2) { $(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave)); diff --git a/src/endWeek/reports/servantsQuartersReport.js b/src/endWeek/reports/servantsQuartersReport.js index aa84a62f84f64d21726dee8f904ac3a78507ac17..ee308803e0b63c034cf8ff341018aca0b62f2f2f 100644 --- a/src/endWeek/reports/servantsQuartersReport.js +++ b/src/endWeek/reports/servantsQuartersReport.js @@ -9,6 +9,7 @@ App.EndWeek.servantsQuartersReport = function() { let r = []; let FLsFetish = 0; let stewardessImpregnated = 0; + let stewardessTookVirginity = 0; if (S.Stewardess) { S.Stewardess.devotion += devBonus; @@ -57,11 +58,20 @@ App.EndWeek.servantsQuartersReport = function() { } if (V.stewardessImpregnates === 1 && canPenetrate(S.Stewardess) && S.Stewardess.pubertyXY === 1 && !slaveResting(S.Stewardess)) { for (const slave of slaves) { - if (canImpreg(slave, S.Stewardess)) { // FIXME: assumes vaginal pregnancy without check - seX(S.Stewardess, "penetrative", slave, "vaginal", 10); - r.push(knockMeUp(slave, 100, 2, S.Stewardess.ID)); - if (slave.vagina === 0) { - slave.vagina = 1; // FIXME: silent virginity loss? + if (canImpreg(slave, S.Stewardess) && slave.pregKnown === 0) { + knockMeUp(slave, 100, 2, S.Stewardess.ID); + if (slave.mpreg === 1) { + seX(S.Stewardess, "penetrative", slave, "anal", 10); + if (slave.anus === 0) { + slave.anus = 1; + stewardessTookVirginity++; + } + } else { + seX(S.Stewardess, "penetrative", slave, "vaginal", 10); + if (slave.vagina === 0) { + slave.vagina = 1; + stewardessTookVirginity++; + } } stewardessImpregnated++; slave.need = 0; @@ -75,9 +85,19 @@ App.EndWeek.servantsQuartersReport = function() { r.push(`${he} ensures the ${stewardessImpregnated} fertile servants are full of ${his} cum at all times.`); } if (S.Stewardess.career === "a breeding bull") { - r.push(`${He} was conditioned to fill empty wombs, so ${he} takes a <span class="hotpink">deep pleasure</span> in ${his} job.`); + r.push(`${He} was conditioned to fill empty wombs, so ${he} takes a <span class="devotion inc">deep pleasure</span> in ${his} job.`); S.Stewardess.devotion++; } + if (stewardessTookVirginity > 0) { + r.push(`${He} needed to break in`); + if (stewardessImpregnated === 1) { + r.push(`their hole`); + } else { + r.push(`several holes`); + } + r.push(`to be certain ${his} seed took root; a treat ${he} <span class="devotion inc">quite enjoyed.</span>`); + S.Stewardess.devotion += stewardessTookVirginity; + } S.Stewardess.need = 0; } } @@ -222,7 +242,7 @@ App.EndWeek.servantsQuartersReport = function() { if (V.showEWD !== 0) { const stewardessEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(stewardessEntry, slave); - stewardessEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(stewardessEntry, slave); $(stewardessEntry).append(`<span class='slave-name'>${SlaveFullName(slave)}</span> is serving as your Stewardess.`); stewardessEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false)); } else { @@ -295,7 +315,7 @@ App.EndWeek.servantsQuartersReport = function() { const {He} = getPronouns(slave); const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(slaveEntry, slave); - slaveEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave); $(slaveEntry).append(`<span class='slave-name'>${SlaveFullName(slave)}</span> `); if (slave.choosesOwnAssignment === 2) { $(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave)); diff --git a/src/endWeek/reports/spaReport.js b/src/endWeek/reports/spaReport.js index 3f85560e83539213c65e6b80e44402bae4502c60..1e9884e14d96cc0fce638c9d15d2a94928ee2c4d 100644 --- a/src/endWeek/reports/spaReport.js +++ b/src/endWeek/reports/spaReport.js @@ -290,7 +290,7 @@ App.EndWeek.spaReport = function() { if (V.showEWD !== 0) { const attendantEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(attendantEntry, slave); - attendantEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(attendantEntry, slave); App.Events.addNode( attendantEntry, [ @@ -375,7 +375,7 @@ App.EndWeek.spaReport = function() { if (V.showEWD !== 0) { const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report"); App.SlaveAssignment.appendSlaveArt(slaveEntry, slave); - slaveEntry.append(App.UI.favoriteToggle(slave), " "); + App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave); r = []; r.push(App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name")); if (slave.choosesOwnAssignment === 2) { diff --git a/src/endWeek/saAgent.js b/src/endWeek/saAgent.js index 7e176c5c07436bcf7058eae1e3cdb0c331d30ead..550c48cdb10209f14978a7ce5141f6e3ec6cdc06 100644 --- a/src/endWeek/saAgent.js +++ b/src/endWeek/saAgent.js @@ -593,7 +593,7 @@ App.SlaveAssignment.agent = function(slave) { slave.vaginaLube += 1; } if (slave.geneMods.NCS === 0) { - if (slave.hips < 2 && random(70 - slave.physicalAge, 300) < slave.hormoneBalance && slave.physicalAge > 9 && slave.physicalAge < 20) { + if (slave.hips < 2 && random(70 - slave.physicalAge, 300) < slave.hormoneBalance && slave.physicalAge.isBetween(9, 20)) { slave.hips += 1; } } diff --git a/src/endWeek/saBeYourHeadGirl.js b/src/endWeek/saBeYourHeadGirl.js index 1900aed06ecaaf22a22be30aa625808764980957..4b8cd5bc40243a1063b1cc4d645348298b350b43 100644 --- a/src/endWeek/saBeYourHeadGirl.js +++ b/src/endWeek/saBeYourHeadGirl.js @@ -3,8 +3,12 @@ App.SlaveAssignment.beYourHeadGirl = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His, wife, wives; + let he; + let him; + let his; + let himself; + let He; + let His; let fetishChange; let arcology; @@ -21,8 +25,7 @@ App.SlaveAssignment.beYourHeadGirl = (function() { arcology = V.arcologies[0]; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli, wife, wives + he, him, his, himself, He, His, } = getPronouns(slave)); updateHGState(slave); diff --git a/src/endWeek/saChoosesOwnClothes.js b/src/endWeek/saChoosesOwnClothes.js index 64bb9e809ee76cfd1e9245bc270639d0871b025c..ceb1ba6616af889d203a7886d82325f0da7c4c5d 100644 --- a/src/endWeek/saChoosesOwnClothes.js +++ b/src/endWeek/saChoosesOwnClothes.js @@ -3,9 +3,12 @@ App.SlaveAssignment.choosesOwnClothes = (function() { let player; let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, himself, He, His; - + let He; + let His; + let he; + let him; + let his; + let himself; /** * @param {App.Entity.SlaveState} slave @@ -16,8 +19,7 @@ App.SlaveAssignment.choosesOwnClothes = (function() { r = ""; if (slave.choosesOwnClothes !== 1) { return r; } ({ - he, him, his, himself, - He, His + He, His, he, him, his, himself, } = getPronouns(slave)); if (slave.fetish === "mindbroken") { diff --git a/src/endWeek/saChoosesOwnJob.js b/src/endWeek/saChoosesOwnJob.js index cc1a4e7f439d3235bd259f84c9c818f2106ee559..ff7f150b586c899409b3d80c40f761d44faeda40 100644 --- a/src/endWeek/saChoosesOwnJob.js +++ b/src/endWeek/saChoosesOwnJob.js @@ -3,8 +3,12 @@ App.SlaveAssignment.choosesOwnJob = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His; + let he; + let him; + let his; + let himself; + let girl; + let He; let clinicL; let schoolL; @@ -39,8 +43,7 @@ App.SlaveAssignment.choosesOwnJob = (function() { arcology = V.arcologies[0]; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli + He, he, him, his, himself, girl, } = getPronouns(slave)); if (slave.choosesOwnAssignment === 0 || slave.fuckdoll > 0 || slave.fetish === "mindbroken") { diff --git a/src/endWeek/saClothes.js b/src/endWeek/saClothes.js index 264f98be307f196bed79832a74d044c77e794e4f..af6c41d459aa1291ac9b4e77733187d167b1aa42 100644 --- a/src/endWeek/saClothes.js +++ b/src/endWeek/saClothes.js @@ -4,8 +4,11 @@ App.SlaveAssignment.clothes = (function() { let r; let arcology; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His; + let he; + let him; + let his; + let He; + let His; return saClothes; @@ -19,8 +22,7 @@ App.SlaveAssignment.clothes = (function() { arcology = V.arcologies[0]; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli + He, His, he, him, his, } = getPronouns(slave)); updateAccessories(slave); diff --git a/src/endWeek/saDevotion.js b/src/endWeek/saDevotion.js index 060a87bdaf8b119d8d3f8cb34e4404cefc0af856..df0eb49ce3c43d759a9091de6e6b957631cb33b6 100644 --- a/src/endWeek/saDevotion.js +++ b/src/endWeek/saDevotion.js @@ -3,8 +3,12 @@ App.SlaveAssignment.devotion = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, He, His; + let He; + let His; + let he; + let him; + let his; + let himself; let playerPronouns; let PC; let gettingPersonalAttention; @@ -21,8 +25,7 @@ App.SlaveAssignment.devotion = (function() { PC = V.PC; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His + He, His, he, him, his, himself } = getPronouns(slave)); playerPronouns = getPronouns(PC); @@ -666,12 +669,12 @@ App.SlaveAssignment.devotion = (function() { if (PC.vagina > 0) { seX(slave, "penetrative", PC, "vaginal", App.EndWeek.saVars.freeSexualEnergy); if (canImpreg(PC, slave)) { - knockMeUp(PC, App.EndWeek.saVars.freeSexualEnergy, 0, slave.ID, true); + knockMeUp(PC, App.EndWeek.saVars.freeSexualEnergy, 0, slave.ID); } } else if (PC.anus > 0) { seX(slave, "penetrative", PC, "anal", App.EndWeek.saVars.freeSexualEnergy); if (canImpreg(PC, slave)) { - knockMeUp(PC, App.EndWeek.saVars.freeSexualEnergy, 1, slave.ID, true); + knockMeUp(PC, App.EndWeek.saVars.freeSexualEnergy, 1, slave.ID); } } if (V.policies.sexualOpenness === 0) { diff --git a/src/endWeek/saDiet.js b/src/endWeek/saDiet.js index adeb0b2ef46d466cad6a186abd6f5b270c946830..f7ea1f2bd89920fe6689e9aa479168e8d995a00e 100644 --- a/src/endWeek/saDiet.js +++ b/src/endWeek/saDiet.js @@ -3,8 +3,12 @@ App.SlaveAssignment.diet = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His; + let he; + let him; + let his; + let himself; + let He; + let His; let weightGain; let weightLoss; @@ -33,8 +37,7 @@ App.SlaveAssignment.diet = (function() { buttSize = slave.butt - slave.buttImplant; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli + he, him, his, himself, He, His } = getPronouns(slave)); if (V.feeder === 1) { @@ -589,10 +592,11 @@ App.SlaveAssignment.diet = (function() { } if (random(1, roll) <= target && buttSize > 0) { // FIXME: identical branches - if (slave.geneMods.NCS === 1 && buttSize > 2) { // TODO: WRITE BRANCH + if (slave.geneMods.NCS === 1 && buttSize > 2) { r.push(`<span class="change negative">${His} butt gets a little smaller.</span>`); slave.butt -= 1; } else { + // TODO: write this r.push(`<span class="change negative">${His} butt gets a little smaller.</span>`); slave.butt -= 1; } diff --git a/src/endWeek/saDrugs.js b/src/endWeek/saDrugs.js index d0c56e860e37eac3455e33848a8764bc2ed04b7c..71bc9502f62108b34c47c07e8868f658cbb1f414 100644 --- a/src/endWeek/saDrugs.js +++ b/src/endWeek/saDrugs.js @@ -3,8 +3,12 @@ App.SlaveAssignment.drugs = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His; + let he; + let him; + let his; + let himself; + let He; + let His; let intensive; let gigantomastiaMod; @@ -28,8 +32,7 @@ App.SlaveAssignment.drugs = (function() { buttSize = slave.butt - slave.buttImplant; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli + he, him, his, himself, He, His } = getPronouns(slave)); if (slave.drugs !== "no drugs") { diff --git a/src/endWeek/saGetMilked.js b/src/endWeek/saGetMilked.js index 7ae4fc0e5b406ded47faed735663e0f28c7f7b76..abe447c9f927e7a4ddbae23d781ebf85b9f60ed4 100644 --- a/src/endWeek/saGetMilked.js +++ b/src/endWeek/saGetMilked.js @@ -37,7 +37,11 @@ App.SlaveAssignment.getMilked = (function() { let cumHormones; let implantEffect; - let he, him, his, He, His; + let he; + let him; + let his; + let He; + let His; return saGetMilked; diff --git a/src/endWeek/saGuardYou.js b/src/endWeek/saGuardYou.js index 6cd1bf9433b532136e7ce432087e902c304d7bb4..65777a086bde165f5b27f95215669204acd7228c 100644 --- a/src/endWeek/saGuardYou.js +++ b/src/endWeek/saGuardYou.js @@ -3,8 +3,11 @@ App.SlaveAssignment.guardYou = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, He, His; + let he; + let him; + let his; + let He; + let His; let BGImpressiveness; @@ -24,8 +27,7 @@ App.SlaveAssignment.guardYou = (function() { r = []; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His + he, him, his, He, His } = getPronouns(slave)); BGImpressiveness = deadliness(slave); diff --git a/src/endWeek/saHormonesEffects.js b/src/endWeek/saHormonesEffects.js index 6cc50080d1d4fbf6eef1e5f161316f92cd4744a1..e51986ce7ee9fd66d812b26189b73471fbb72fbf 100644 --- a/src/endWeek/saHormonesEffects.js +++ b/src/endWeek/saHormonesEffects.js @@ -3,8 +3,11 @@ App.SlaveAssignment.hormonesEffects = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His; + let he; + let him; + let his; + let He; + let His; let gigantomastiaMod; let rearLipedemaMod; @@ -31,8 +34,7 @@ App.SlaveAssignment.hormonesEffects = (function() { faceValue = slave.face - slave.faceImplant; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli + he, him, his, He, His, } = getPronouns(slave)); hormoneBalance(slave); @@ -690,7 +692,7 @@ App.SlaveAssignment.hormonesEffects = (function() { } } } - if (faceValue > 0 && faceValue < 100) { + if (faceValue.isBetween(0, 100)) { r.push(`Hormonal effects cause <span class="orange">${his} facial structure to harden and become less attractive.</span>`); faceDec = 1 + V.hormoneUpgradePower; slave.face = Math.clamp(slave.face - faceDec, -100, 100); @@ -729,11 +731,11 @@ App.SlaveAssignment.hormonesEffects = (function() { } if (slave.geneMods.NCS === 0) { - if (slave.dick > 0 && slave.dick < 5) { + if (slave.dick.isBetween(0, 5)) { r.push(`Hormonal effects add <span class="lime">a bit more heft to ${his} penis.</span>`); slave.dick++; } - if (slave.balls > 0 && slave.balls < 5) { + if (slave.balls.isBetween(0, 5)) { r.push(`Hormonal effects cause <span class="lime">${his} balls to hang a little heavier.</span>`); slave.balls++; } @@ -779,7 +781,7 @@ App.SlaveAssignment.hormonesEffects = (function() { } } } - if (faceValue > 0 && faceValue < 100) { + if (faceValue.isBetween(0, 100)) { r.push(`Hormonal effects cause <span class="orange">${his} facial structure to harden and become less attractive.</span>`); faceDec = 1 + V.hormoneUpgradePower; slave.face = Math.clamp(slave.face - faceDec, -100, 100); @@ -819,11 +821,11 @@ App.SlaveAssignment.hormonesEffects = (function() { } if (slave.geneMods.NCS === 0) { - if (slave.dick > 0 && slave.dick < 5) { + if (slave.dick.isBetween(0, 5)) { r.push(`Hormonal effects add <span class="lime">a bit more heft to ${his} penis.</span>`); slave.dick++; } - if (slave.balls > 0 && slave.balls < 5 && slave.ballType !== "sterile") { + if (slave.balls.isBetween(0, 5) && slave.ballType !== "sterile") { r.push(`Hormonal effects cause <span class="lime">${his} balls to hang a little heavier.</span>`); slave.balls++; } @@ -864,7 +866,7 @@ App.SlaveAssignment.hormonesEffects = (function() { slave.faceShape = "androgynous"; } } - if (faceValue > 20 && faceValue < 100) { + if (faceValue.isBetween(20, 100)) { r.push(`Hormonal effects cause <span class="orange">${his} facial structure to harden and become less attractive.</span>`); faceDec = 1 + V.hormoneUpgradePower; slave.face = Math.clamp(slave.face - faceDec, -100, 100); @@ -904,11 +906,11 @@ App.SlaveAssignment.hormonesEffects = (function() { } if (slave.geneMods.NCS === 0) { - if (slave.dick > 0 && slave.dick < 4) { + if (slave.dick.isBetween(0, 4)) { r.push(`Hormonal effects add <span class="lime">a bit more heft to ${his} penis.</span>`); slave.dick++; } - if (slave.balls > 0 && slave.balls < 4 && slave.ballType !== "sterile") { + if (slave.balls.isBetween(0, 4) && slave.ballType !== "sterile") { r.push(`Hormonal effects cause <span class="lime">${his} balls to hang a little heavier.</span>`); slave.balls++; } @@ -949,7 +951,7 @@ App.SlaveAssignment.hormonesEffects = (function() { slave.faceShape = "androgynous"; } } - if (faceValue > 40 && faceValue < 100) { + if (faceValue.isBetween(40, 100)) { r.push(`Hormonal effects cause <span class="orange">${his} facial structure to harden and become less attractive.</span>`); faceDec = 1 + V.hormoneUpgradePower; slave.face = Math.clamp(slave.face - faceDec, -100, 100); @@ -987,11 +989,11 @@ App.SlaveAssignment.hormonesEffects = (function() { } if (slave.geneMods.NCS === 0) { - if (slave.dick > 0 && slave.dick < 3) { + if (slave.dick.isBetween(0, 3)) { r.push(`Hormonal effects add <span class="lime">a bit more heft to ${his} penis.</span>`); slave.dick++; } - if (slave.balls > 0 && slave.balls < 3 && slave.ballType !== "sterile") { + if (slave.balls.isBetween(0, 3) && slave.ballType !== "sterile") { r.push(`Hormonal effects cause <span class="lime">${his} balls to hang a little heavier.</span>`); slave.balls++; } @@ -1026,7 +1028,7 @@ App.SlaveAssignment.hormonesEffects = (function() { } } else if (slave.hormoneBalance <= -100) { if (slave.geneMods.NCS === 0) { - if (faceValue > 60 && faceValue < 100) { + if (faceValue.isBetween(60, 100)) { r.push(`Hormonal effects cause <span class="orange">${his} facial structure to harden and become less attractive.</span>`); faceDec = 1 + V.hormoneUpgradePower; slave.face = Math.clamp(slave.face - faceDec, -100, 100); @@ -1070,11 +1072,11 @@ App.SlaveAssignment.hormonesEffects = (function() { slave.waist += 2 + V.hormoneUpgradePower; } - if (slave.dick > 0 && slave.dick < 2) { + if (slave.dick.isBetween(0, 2)) { r.push(`Hormonal effects cause <span class="lime">${his} micropenis to return to a more normal size.</span>`); slave.dick++; } - if (slave.balls > 0 && slave.balls < 2) { + if (slave.balls.isBetween(0, 2)) { r.push(`Hormonal effects cause <span class="lime">${his} balls to drop.</span>`); slave.balls++; } diff --git a/src/endWeek/saInflation.js b/src/endWeek/saInflation.js index 2ce8a41b70dd120c2b5beb27bcdfd74d74f9158e..ccf41fcd879afadbec1e8044758adfabc528b6f4 100644 --- a/src/endWeek/saInflation.js +++ b/src/endWeek/saInflation.js @@ -3,8 +3,12 @@ App.SlaveAssignment.inflation = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His; + let he; + let him; + let his; + let himself; + let He; + let His; let gigantomastiaMod; let rearLipedemaMod; @@ -34,8 +38,7 @@ App.SlaveAssignment.inflation = (function() { } ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli + he, him, his, himself, He, His, } = getPronouns(slave)); inflationCancellation(slave); diff --git a/src/endWeek/saLiveWithHG.js b/src/endWeek/saLiveWithHG.js index 975d229b5a4af69a222e38b0e417c36cdd9da411..f9207d4e6057fb60cbce9d33a7721693481a729f 100644 --- a/src/endWeek/saLiveWithHG.js +++ b/src/endWeek/saLiveWithHG.js @@ -6,8 +6,21 @@ App.SlaveAssignment.liveWithHG = (function() { let r; let arcology; - let he, him, his, himself, girl, He, wife; - let he2, him2, his2, himself2, He2, His2, wife2; + let he; + let him; + let his; + let himself; + let girl; + let He; + let wife; + + let he2; + let him2; + let his2; + let himself2; + let He2; + let His2; + let wife2; let diet; let hormones; @@ -448,7 +461,7 @@ App.SlaveAssignment.liveWithHG = (function() { */ function HGTrainsSlave(slave, HG) { if (slave.skill.oral <= 30) { - r.push(`${HG.slaveName} wants to come home to a talented tongue, so ${he2} trains slave.slaveName's oral skills.`); + r.push(`${HG.slaveName} wants to come home to a talented tongue, so ${he2} trains ${slave.slaveName}'s oral skills.`); r.push(slaveSkillIncrease('oral', slave, 10)); } else if (slave.vagina > 0 && canDoVaginal(slave) && slave.skill.vaginal <= 30) { r.push(`${HG.slaveName} wants ${his2} personal sex slave to be as skilled with ${his} pussy as possible, so ${he2} trains ${slave.slaveName}'s vaginal skills.`); @@ -518,7 +531,7 @@ App.SlaveAssignment.liveWithHG = (function() { } } else if (slave.anus === 3) { if (HG.dick > 5 && HG.energy > 95 && random(1, 100) > 80) { - r.push(`${HG.slaveName} uses slave.slaveName's loose anus to vent ${his2} sexual addiction. Constant assrape from the Head Girl's monster cock eventually leaves it <span class="change positive">gaping.</span>`); + r.push(`${HG.slaveName} uses ${slave.slaveName}'s loose anus to vent ${his2} sexual addiction. Constant assrape from the Head Girl's monster cock eventually leaves it <span class="change positive">gaping.</span>`); slave.anus += 1; } } @@ -530,7 +543,7 @@ App.SlaveAssignment.liveWithHG = (function() { * @param {App.Entity.SlaveState} HG */ function HGManagesPregnancy(slave, HG) { - if (HG.fetish === "pregnancy" && canImpreg(slave, HG)) { + if (HG.fetish === "pregnancy" && canImpreg(slave, HG) && slave.pregKnown === 0) { if (arcology.FSRestart === "unset") { r.push(`${HG.slaveName} promptly <span class="pregnant">impregnates</span>`); if (HG.fetishKnown === 1) { @@ -540,15 +553,15 @@ App.SlaveAssignment.liveWithHG = (function() { r.push(`${slave.slaveName}. ${His2} eagerness completely exposes ${his2} hidden <span class="fetish gain">pregnancy kink.</span>`); HG.fetishKnown = 1; } - knockMeUp(slave, 100, 2, V.HeadGirlID, true); + knockMeUp(slave, 100, 2, V.HeadGirlID); if (HG.fetishStrength > 70 && canImpreg(HG, slave)) { r.push(`Unsurprisingly, ${he2} gives in to ${his2} own cravings and also takes ${slave.slaveName}'s loads until ${he2} <span class="pregnant">gets pregnant</span> too.`); - knockMeUp(HG, 100, 2, slave.ID, true); + knockMeUp(HG, 100, 2, slave.ID); } } else if (HG.fetishKnown === 1) { r.push(`${HG.slaveName} knows better than to even consider knocking up ${slave.slaveName}.`); } - } else if (HG.fetish === "pregnancy" && canImpreg(HG, slave)) { + } else if (HG.fetish === "pregnancy" && canImpreg(HG, slave) && HG.pregKnown === 0) { if (arcology.FSRestart === "unset" && HG.fetishStrength > 70) { r.push(`${HG.slaveName} promptly <span class="pregnant">knocks ${himself2} up</span> with ${slave.slaveName}'s`); if (HG.fetishKnown === 1) { @@ -559,13 +572,13 @@ App.SlaveAssignment.liveWithHG = (function() { HG.fetishKnown = 1; HG.devotion += 4; } - knockMeUp(HG, 100, 2, slave.ID, true); + knockMeUp(HG, 100, 2, slave.ID); } else if (HG.fetishKnown === 1) { r.push(`${HG.slaveName} knows better than to even consider getting knocked up by ${slave.slaveName}.`); } - } else if (arcology.FSRepopulationFocusPregPolicy === 1 && canImpreg(slave, HG)) { + } else if (arcology.FSRepopulationFocusPregPolicy === 1 && canImpreg(slave, HG) && slave.pregKnown === 0) { r.push(`${HG.slaveName} wastes no time in chasing the current trend and hurries to <span class="pregnant">impregnate</span> ${slave.slaveName}.`); - knockMeUp(slave, 100, 2, V.HeadGirlID, true); + knockMeUp(slave, 100, 2, V.HeadGirlID); } else if (slave.pregKnown === 1) { if (slave.breedingMark === 1) { r.push(`Since ${slave.slaveName} is marked as a breeding slave, ${HG.slaveName} feels it is ${his2} duty to keep ${his} pregnancy safe.`); @@ -573,14 +586,29 @@ App.SlaveAssignment.liveWithHG = (function() { r.push(`Since ${slave.slaveName} is bearing your child${slave.pregType > 1 ? "ren" : ""}, ${HG.slaveName} feels ${he2} has been tasked with keeping ${his} pregnancy safe.`); } else if (HG.fetish === "pregnancy") { r.push(`${HG.slaveName}`); - if (HG.fetishKnown === 1) { - if (slave.bellyPreg > 500) { - r.push(`enjoys the swell of ${slave.slaveName}'s baby bump, giving ${him2} plenty of reason to keep ${his} pregnancy.`); + if (slave.geneticQuirks.superfetation === 2 && V.geneticMappingUpgrade !== 0 && (slave.pregSource === V.HeadGirlID || arcology.FSRepopulationFocus !== "unset")) { + r.push(`takes advantage of ${slave.slaveName}'s unusual fertility to`); + if (HG.fetishKnown === 1) { + r.push(`<span class="pregnant">add another baby</span> to ${his} growing collection.`); } else { - r.push(`keeps ${slave.slaveName} pregnant so that ${he2} may savor ${his} growth.`); + r.push(`further your goals by`); + if (slave.bellyPreg > 10000) { + r.push(`cramming <span class="pregnant">another child</span> into ${his} increasingly full womb.`); + } else { + r.push(`planting <span class="pregnant">another child</span> in ${him}.`); + } } + knockMeUp(slave, 100, 2, V.HeadGirlID); } else { - r.push(`pays an unusual amount of attention to ${slave.slaveName}'s pregnancy.`); + if (HG.fetishKnown === 1) { + if (slave.bellyPreg > 500) { + r.push(`enjoys the swell of ${slave.slaveName}'s baby bump, giving ${him2} plenty of reason to keep ${his} pregnancy.`); + } else { + r.push(`keeps ${slave.slaveName} pregnant so that ${he2} may savor ${his} growth.`); + } + } else { + r.push(`pays an unusual amount of attention to ${slave.slaveName}'s pregnancy.`); + } } } else if (arcology.FSRepopulationFocusPregPolicy === 0 && arcology.FSRepopulationFocus === "unset" && V.HGSuiteDrugs === 1) { if (slave.preg > slave.pregData.normalBirth - 2 && slave.preg > slave.pregData.minLiveBirth && slave.broodmother === 0 && !isInLabor(slave)) { diff --git a/src/endWeek/saLongTermEffects.js b/src/endWeek/saLongTermEffects.js index 60da4bdcb282fe593496a616b43e6d9ee14b52dc..a7f1cbbdc61f0693bab79b40dcdf515932eac6e1 100644 --- a/src/endWeek/saLongTermEffects.js +++ b/src/endWeek/saLongTermEffects.js @@ -3,8 +3,12 @@ App.SlaveAssignment.longTermEffects = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His, wife; + let he; + let him; + let his; + let himself; + let He; + let His; let gigantomastiaMod; let rearQuirk; @@ -26,8 +30,7 @@ App.SlaveAssignment.longTermEffects = (function() { const oldEnergy = slave.energy; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli, wife + he, him, his, himself, He, His, } = getPronouns(slave)); if (slave.fuckdoll > 0) { diff --git a/src/endWeek/saLongTermMentalEffects.js b/src/endWeek/saLongTermMentalEffects.js index 785ae2e977ade19d59da700c19428dd9f4a16bc7..1329d27b29848f24938869a28cce2d2c2cacc610 100644 --- a/src/endWeek/saLongTermMentalEffects.js +++ b/src/endWeek/saLongTermMentalEffects.js @@ -3,8 +3,13 @@ App.SlaveAssignment.longTermMentalEffects = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His, wife; + let he; + let him; + let his; + let himself; + let girl; + let He; + let His; let boobSize; @@ -20,8 +25,7 @@ App.SlaveAssignment.longTermMentalEffects = (function() { boobSize = slave.boobs - slave.boobsImplant - slave.boobsMilk; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli, wife + he, him, his, himself, girl, He, His, } = getPronouns(slave)); if (slave.fetish === "mindbroken") { @@ -1385,8 +1389,8 @@ App.SlaveAssignment.longTermMentalEffects = (function() { } else if (slave.assignment === "be the Schoolteacher" && V.schoolroom >= 20) { r.push(`${His} paraphilia is satisfied by ${his} work as a sexual instructor; enough eyes are fixated on ${his} lessons.`); slave.paraphiliaSatisfied = 1; - } else if (slave.clothes === "no clothing") { - r.push(`${His} paraphilia is satisfied by ${his} total nudity.`); + } else if (App.Data.clothes.get(slave.clothes).exposure >= 4) { + r.push(`${His} paraphilia is satisfied by ${his} nudity.`); slave.paraphiliaSatisfied = 1; } else { r.push(`${He} doesn't seem to feel ${he}'s getting fucked in public enough, leaving the attention whore <span class="devotion dec">depressed and anxious.</span>`); diff --git a/src/endWeek/saLongTermPhysicalEffects.js b/src/endWeek/saLongTermPhysicalEffects.js index 3fa1aeb9b5cb87fc848665a8de5c5325f72200dd..41a4998b6cf7cc4cadd5483e994951b47b762810 100644 --- a/src/endWeek/saLongTermPhysicalEffects.js +++ b/src/endWeek/saLongTermPhysicalEffects.js @@ -3,8 +3,14 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His, wife; + let he; + let him; + let his; + let hers; + let himself; + let girl; + let He; + let His; let gigantomastiaMod; let rearQuirk; @@ -30,8 +36,7 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() { slaveInt = slave.intelligence + slave.intelligenceImplant; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli, wife + he, him, his, hers, himself, girl, He, His, } = getPronouns(slave)); if (slave.fuckdoll > 0) { @@ -535,14 +540,14 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() { seX(sexPartner, "vaginal", slave, "penetrative"); sexPartner.vagina++; if (canImpreg(sexPartner, slave)) { - knockMeUp(sexPartner, 50, 0, slave.ID, true); + knockMeUp(sexPartner, 50, 0, slave.ID); } } if (sexPartner.anus === 0 && canDoAnal(sexPartner)) { seX(sexPartner, "anal", slave, "penetrative"); sexPartner.anus++; if (canImpreg(sexPartner, slave)) { - knockMeUp(sexPartner, 50, 1, slave.ID, true); + knockMeUp(sexPartner, 50, 1, slave.ID); } } } @@ -1072,7 +1077,7 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() { if (slave.lactationAdaptation > 50) { r.push(`massively`); } - r.push(`engorged</span> with pent-up milk.); + r.push(`engorged</span> with pent-up milk.`); */ /* I don't know where to put this since it happens at the tail end of endWeek now */ if (slave.boobs - slave.boobsImplant + slave.boobsMilk > slave.boobs - slave.boobsImplant * 2) { @@ -1425,7 +1430,7 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() { slave.sexualFlaw = "none"; slave.behavioralFlaw = "none"; } else if (slave.weight <= -95 && slave.boobs < 100 && slave.butt < 1 && slave.muscles < -95) { - r.push(`Watching ${his} body sacrifice itself for a pregnancy ${he} hates takes its toll on ${slave.slaveName}'s mind. Feeling that ${he} is nothing more than a host for ${his} brood has destroyed any hopes ${he} had left. slave.slaveName has become <span class="mindbreak">completely broken.</span>`); + r.push(`Watching ${his} body sacrifice itself for a pregnancy ${he} hates takes its toll on ${slave.slaveName}'s mind. Feeling that ${he} is nothing more than a host for ${his} brood has destroyed any hopes ${he} had left. ${slave.slaveName} has become <span class="mindbreak">completely broken.</span>`); slave.fetish = "mindbroken"; slave.sexualFlaw = "none"; slave.behavioralFlaw = "none"; diff --git a/src/endWeek/saPleaseYou.js b/src/endWeek/saPleaseYou.js index dffa7ce831760b6f406bff3916fb42d309384fa6..3369bba9556fd9940f1fc06c89ca12a3e843f46a 100644 --- a/src/endWeek/saPleaseYou.js +++ b/src/endWeek/saPleaseYou.js @@ -3,8 +3,14 @@ App.SlaveAssignment.pleaseYou = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His, daughter, wife; + let he; + let him; + let his; + let himself; + let girl; + let He; + let His; + let wife; let playerPronouns; let fetishChange; @@ -42,8 +48,7 @@ App.SlaveAssignment.pleaseYou = (function() { trainingEfficiency = 5 + Math.trunc(slave.devotion / 30) + ((slave.intelligence+slave.intelligenceImplant) / 32); ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli, daughter, wife + he, him, his, himself, girl, He, His, wife } = getPronouns(slave)); playerPronouns = getPronouns(V.PC); @@ -258,7 +263,7 @@ App.SlaveAssignment.pleaseYou = (function() { } if (V.PC.dick !== 0) { if (canImpreg(slave, V.PC)) { - r.push(knockMeUp(slave, vaginalUse, 0, -1, true)); + knockMeUp(slave, vaginalUse, 0, -1); } } slave.counter.vaginal += vaginalUse; @@ -411,7 +416,7 @@ App.SlaveAssignment.pleaseYou = (function() { } if (V.PC.dick !== 0) { if (canImpreg(slave, V.PC)) { - r.push(knockMeUp(slave, analUse, 1, -1, true)); + knockMeUp(slave, analUse, 1, -1); } } slave.counter.anal += analUse; diff --git a/src/endWeek/saPorn.js b/src/endWeek/saPorn.js index 94711f4940b5d0aa6970bb20f851fa102c515279..c6ca088ac3ae6248c5b457993ca077c07c7c3ba5 100644 --- a/src/endWeek/saPorn.js +++ b/src/endWeek/saPorn.js @@ -2,7 +2,12 @@ App.SlaveAssignment.porn = (function() { "use strict"; let r; - let he, him, his, himself, He, His; + let he; + let him; + let his; + let himself; + let He; + let His; let decayRate; let viewership; let viewerSoaking; diff --git a/src/endWeek/saPregnancy.js b/src/endWeek/saPregnancy.js index 228c7fb19ad635f6897d70a720b98a66a393f4c6..d2cd0da25d1235368ca90d0cc9121dab034de6b7 100644 --- a/src/endWeek/saPregnancy.js +++ b/src/endWeek/saPregnancy.js @@ -3,8 +3,14 @@ App.SlaveAssignment.pregnancy = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His, wife; + let he; + let him; + let his; + let himself; + let girl; + let He; + let His; + let wife; let gigantomastiaMod; let rearQuirk; @@ -30,8 +36,7 @@ App.SlaveAssignment.pregnancy = (function() { hipSize = slave.hips - slave.hipsImplant; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli, wife + he, him, his, himself, girl, He, His, wife } = getPronouns(slave)); if (slave.preg > 0) { @@ -854,7 +859,7 @@ App.SlaveAssignment.pregnancy = (function() { let StudPenetrative = 0; let StudTakesV = 0; - if (V.universalRulesImpregnation === "PC" && canImpreg(slave, V.PC) && slave.PCExclude !== 1) { // consider female X female PC impreg here! + if (V.universalRulesImpregnation === "PC" && canImpreg(slave, V.PC) && slave.pregKnown === 0 && slave.PCExclude !== 1) { // consider female X female PC impreg here! r.push(`${slave.slaveName} is ripe for breeding, so you ejaculate inside ${him} often. When you bore of ${his} fertile`); if (slave.mpreg === 1) { r.push(`ass,`); @@ -902,12 +907,7 @@ App.SlaveAssignment.pregnancy = (function() { slave.trust += 5; } } - slave.preg = 1; - slave.pregSource = -1; - slave.pregWeek = 1; - slave.pregKnown = 1; - slave.pregType = setPregType(slave); - WombImpregnate(slave, slave.pregType, -1, 1); + knockMeUp(slave, 100, 2, -1); if (slave.mpreg === 1) { r.push(VCheck.Anal(slave, 10)); } else { @@ -915,7 +915,7 @@ App.SlaveAssignment.pregnancy = (function() { } } else if ((slave.vagina === 0 || (slave.anus === 0 && slave.mpreg > 0)) && !studIgnoresRules) { // Skip virgins. - } else if (V.HeadGirlID !== 0 && slave.ID !== V.HeadGirlID && V.universalRulesImpregnation === "HG" && canPenetrate(S.HeadGirl)) { + } else if (V.HeadGirlID !== 0 && slave.ID !== V.HeadGirlID && V.universalRulesImpregnation === "HG" && canPenetrate(S.HeadGirl) && slave.pregKnown === 0) { const { // eslint-disable-next-line no-unused-vars He2, he2, His2, his2, hers2, him2, himself2, girl2 @@ -1040,20 +1040,15 @@ App.SlaveAssignment.pregnancy = (function() { } } } - slave.preg = 1; - slave.pregSource = V.HeadGirlID; - slave.pregWeek = 1; - slave.pregKnown = 1; App.EndWeek.saVars.HGCum -= 1; - slave.pregType = setPregType(slave); - WombImpregnate(slave, slave.pregType, V.HeadGirlID, 1); + knockMeUp(slave, 100, 2, V.HeadGirlID); if (slave.mpreg === 1) { seX(slave, "anal", S.HeadGirl, "penetrative", 10); } else { seX(slave, "vaginal", S.HeadGirl, "penetrative", 10); } } - } else if (Stud && slave.ID !== V.StudID && V.universalRulesImpregnation === "Stud") { + } else if (Stud && slave.ID !== V.StudID && V.universalRulesImpregnation === "Stud" && slave.pregKnown === 0) { const { // eslint-disable-next-line no-unused-vars He2, he2, His2, his2, hers2, him2, himself2, girl2 @@ -1586,13 +1581,8 @@ App.SlaveAssignment.pregnancy = (function() { } } } - slave.preg = 1; - slave.pregSource = V.StudID; - slave.pregWeek = 1; - slave.pregKnown = 1; App.EndWeek.saVars.StudCum -= 1; - slave.pregType = setPregType(slave); - WombImpregnate(slave, slave.pregType, V.StudID, 1); + knockMeUp(slave, 100, 2, V.StudID); if (StudPenetrative) { seX(slave, "anal", Stud, "penetrative", 10); seX(slave, "vaginal", Stud, "penetrative", 10); @@ -1623,36 +1613,30 @@ App.SlaveAssignment.pregnancy = (function() { break; case "be your Concubine": if (slave.fuckdoll === 0 && slave.fetish !== "mindbroken" && canImpreg(slave, V.PC)) { - r.push(`As your concubine, ${he} takes care to only share ${his} fertile`); - if (slave.mpreg === 1) { - r.push(`ass`); - } else { - r.push(`pussy`); + if (slave.pregKnown === 0) { + r.push(`As your concubine, ${he} takes care to only share ${his} fertile`); + if (slave.mpreg === 1) { + r.push(`ass`); + } else { + r.push(`pussy`); + } + r.push(`with you. ${His} efforts paid off; <span class="pregnant">${he} has become pregnant with your child.</span>`); } - r.push(`with you. ${His} efforts paid off; <span class="pregnant">${he} has become pregnant with your child.</span>`); - slave.preg = 1; - slave.pregSource = -1; - slave.pregWeek = 1; - slave.pregKnown = 1; - slave.pregType = setPregType(slave); - WombImpregnate(slave, slave.pregType, -1, 1); + knockMeUp(slave, 100, 2, -1); } break; case "serve in the master suite": if (canImpreg(slave, V.PC) && ((slave.toyHole === "all her holes" && slave.mpreg !== 1 && slave.vagina > 0) || (slave.toyHole === "all her holes" && slave.mpreg === 1 && slave.anus > 0) || (slave.toyHole === "pussy" && slave.mpreg !== 1) || (slave.mpreg === 1 && slave.toyHole === "ass"))) { - r.push(`You frequently avail yourself to ${his} fertile`); - if (slave.mpreg === 1) { - r.push(`ass.`); - } else { - r.push(`pussy.`); + if (slave.pregKnown === 0) { + r.push(`You frequently avail yourself to ${his} fertile`); + if (slave.mpreg === 1) { + r.push(`ass.`); + } else { + r.push(`pussy.`); + } + r.push(`It's no surprise when <span class="pregnant">${he} ends up pregnant with your child.</span>`); } - r.push(`It's no surprise when <span class="pregnant">${he} ends up pregnant with your child.</span>`); - slave.preg = 1; - slave.pregSource = -1; - slave.pregWeek = 1; - slave.pregKnown = 1; - slave.pregType = setPregType(slave); - WombImpregnate(slave, slave.pregType, -1, 1); + knockMeUp(slave, 100, 2, -1); } else { // look for a random father among master suite slaves const msSlaves = V.slaves.filter((s) => s.assignment === "serve in the master suite").shuffle(); for (const msSlave of msSlaves) { @@ -1664,13 +1648,10 @@ App.SlaveAssignment.pregnancy = (function() { } } /* found eligible father */ - r.push(`After all the unprotected sex ${he} had this week, it's really no surprise when <span class="pregnant">${he} ends up pregnant.</span>`); - slave.preg = 1; - slave.pregSource = msSlave.ID; - slave.pregWeek = 1; - slave.pregKnown = 1; - slave.pregType = setPregType(slave); - WombImpregnate(slave, slave.pregType, slave.pregSource, 1); + if (slave.pregKnown === 0) { + r.push(`After all the unprotected sex ${he} had this week, it's really no surprise when <span class="pregnant">${he} ends up pregnant.</span>`); + } + knockMeUp(slave, 100, 2, msSlave.ID); break; } } @@ -1678,19 +1659,16 @@ App.SlaveAssignment.pregnancy = (function() { break; case "please you": if (canImpreg(slave, V.PC) && ((slave.toyHole === "all her holes" && slave.mpreg !== 1 && slave.vagina > 0) || (slave.toyHole === "all her holes" && slave.mpreg === 1 && slave.anus > 0) || (slave.toyHole === "pussy" && slave.mpreg !== 1) || (slave.mpreg === 1 && slave.toyHole === "ass"))) { - r.push(`You frequently avail yourself to ${his} fertile`); - if (slave.mpreg === 1) { - r.push(`ass.`); - } else { - r.push(`pussy.`); + if (slave.pregKnown === 0) { + r.push(`You frequently avail yourself to ${his} fertile`); + if (slave.mpreg === 1) { + r.push(`ass.`); + } else { + r.push(`pussy.`); + } + r.push(`It's no surprise when <span class="pregnant">${he} ends up pregnant with your child.</span>`); } - r.push(`It's no surprise when <span class="pregnant">${he} ends up pregnant with your child.</span>`); - slave.preg = 1; - slave.pregSource = -1; - slave.pregWeek = 1; - slave.pregKnown = 1; - slave.pregType = setPregType(slave); - WombImpregnate(slave, slave.pregType, -1, 1); + knockMeUp(slave, 100, 2, -1); } break; case "serve in the club": @@ -1698,58 +1676,53 @@ App.SlaveAssignment.pregnancy = (function() { case "whore": case "work in the brothel": if (slave.eggType === "human") { - r.push(`Due to all the citizens cumming in ${his} fertile`); - if (slave.mpreg === 1) { - r.push(`ass,`); - } else { - r.push(`pussy,`); + if (slave.pregKnown === 0) { + r.push(`Due to all the citizens cumming in ${his} fertile`); + if (slave.mpreg === 1) { + r.push(`ass,`); + } else { + r.push(`pussy,`); + } + r.push(`<span class="pregnant">${he} has become pregnant.</span>`); } - r.push(`<span class="pregnant">${he} has become pregnant.</span>`); - slave.preg = 1; - slave.pregSource = -2; - slave.pregWeek = 1; - slave.pregKnown = 1; - slave.pregType = setPregType(slave); - WombImpregnate(slave, slave.pregType, -2, 1); + knockMeUp(slave, 100, 2, -2); } break; case "work a glory hole": case "be confined in the arcade": if (slave.eggType === "human") { - r.push(`Due to all the customers cumming in ${his} fertile, restrained`); - if (slave.mpreg === 1) { - r.push(`ass,`); - } else { - r.push(`pussy,`); + if (slave.pregKnown === 0) { + r.push(`Due to all the customers cumming in ${his} fertile, restrained`); + if (slave.mpreg === 1) { + r.push(`ass,`); + } else { + r.push(`pussy,`); + } + r.push(`<span class="pregnant">${he} has become pregnant.</span>`); } - r.push(`<span class="pregnant">${he} has become pregnant.</span>`); - slave.preg = 1; - slave.pregSource = -2; - slave.pregWeek = 1; - slave.pregKnown = 1; - slave.pregType = setPregType(slave); - WombImpregnate(slave, slave.pregType, -2, 1); + knockMeUp(slave, 100, 2, -2); } break; default: /* random impregnation chance on other assignments - consider relationships first */ if (App.Utils.hasNonassignmentSex(slave) || slave.devotion <= 50) { + let pregSource = 0; if (conceptionSeed > 80 && ((slave.counter.vaginal > 0) || (slave.counter.anal > 0 && slave.mpreg > 0))) { /* TODO: compare to previous week totals? */ const tempLover = slave.relationship > 2 ? getSlave(slave.relationshipTarget) : null; const tempRival = slave.rivalry > 2 ? getSlave(slave.rivalryTarget) : null; const tempSub = slave.assignment === Job.SUBORDINATE && slave.subTarget > 0 ? getSlave(slave.subTarget) : null; if (((slave.relationship === -3) || (slave.relationship === -2)) && canImpreg(slave, V.PC) && App.Utils.sexAllowed(slave, V.PC)) { - slave.pregSource = -1; + pregSource = -1; } else if (tempLover && canImpreg(slave, tempLover)) { /* erection not needed for impregnation via consensual sex play (FWB or better) */ if (App.Utils.sexAllowed(slave, tempLover)) { - slave.pregSource = tempLover.ID; + pregSource = tempLover.ID; } else if (disobedience(slave) + disobedience(tempLover) + 5 > random(0, 100)) { /* note higher than normal disobedience chance...telling lovers they can't play is just asking for trouble */ r.push(`Although sexual contact between them is forbidden, ${slave.slaveName} and ${his} ${relationshipTerm(slave)} ${tempLover.slaveName} took a risk and <span class="trust dec">flaunted the rules.</span>`); slave.trust -= 5; tempLover.trust -= 5; - slave.pregSource = tempLover.ID; + pregSource = tempLover.ID; } } else if (tempSub && canAchieveErection(tempSub) && canImpreg(slave, tempSub)) { /* subordinate must have erection to impregnate target */ - slave.pregSource = tempSub.ID; + pregSource = tempSub.ID; } else if (random(1, 100) > 95 && tempRival && canAchieveErection(tempRival) && canImpreg(slave, tempRival)) { /* 5% chance to be raped and knocked up by bitter rival - erection needed */ if (App.Utils.sexAllowed(slave, tempRival)) { r.push(`Driven by the bitter rivalry between them, ${tempRival.slaveName} successfully manages to overpower ${slave.slaveName} and rape ${him}, cumming deep in ${his} fertile`); @@ -1759,7 +1732,7 @@ App.SlaveAssignment.pregnancy = (function() { r.push(`pussy.`); } r.push(`By the end of the week, ${slave.slaveName} is vowing revenge as ${he} regains confidence.`); - slave.pregSource = tempRival.ID; + pregSource = tempRival.ID; } else if (disobedience(tempRival) > random(0, 100)) { r.push(`Driven by the bitter rivalry between them, ${tempRival.slaveName} <span class="trust dec">breaks the rules,</span> successfully overpowering ${slave.slaveName} and raping ${him}, cumming deep in ${his} fertile`); if (slave.mpreg === 1) { @@ -1768,23 +1741,23 @@ App.SlaveAssignment.pregnancy = (function() { r.push(`pussy.`); } slave.trust -= 5; - slave.pregSource = tempRival.ID; + pregSource = tempRival.ID; } } else if (random(1, 100) > 60 && canImpreg(slave, V.PC) && App.Utils.sexAllowed(slave, V.PC)) { /* still 40% chance of impregnation by PC */ - slave.pregSource = -1; + pregSource = -1; } else if (random(1, 100) > 95 && slave.eggType === "human" && slave.devotion <= 20) { /* 5% chance of impregnation by random citizen - TODO: make this optional for players who want random fathers from among their own slaves only */ - slave.pregSource = -2; + pregSource = -2; } else { const potentialFathers = V.slaves.filter(s => canImpreg(slave, s)).shuffle(); const motherDisobeys = disobedience(slave) > random(0, 100); for (const father of potentialFathers) { if (father.ID === slave.ID) { /* self-impregnation check */ if (conceptionSeed <= 5) { /* 95% chance not to self-impregnate */ - slave.pregSource = slave.ID; + pregSource = slave.ID; break; } } else if (App.Utils.sexAllowed(slave, father)) { - slave.pregSource = father.ID; /* this is an eligible father */ + pregSource = father.ID; /* this is an eligible father */ break; } else if (motherDisobeys && (V.universalRulesConsent === 0 || disobedience(father) > random(0, 50))) { r.push(`Although sexual contact between them is forbidden, ${slave.slaveName} <span class="trust dec">breaks the rules</span> by`); @@ -1795,19 +1768,17 @@ App.SlaveAssignment.pregnancy = (function() { } r.push(`${father.slaveName} to fuck ${him}.`); slave.trust -= 5; - slave.pregSource = father.ID; + pregSource = father.ID; break; } } } } - if (slave.pregSource !== 0 && slave.eggType === "human") { - r.push(`A quick scan after a bout of morning nausea reveals that <span class="pregnant">${he} has become pregnant.</span>`); - slave.preg = 1; - slave.pregWeek = 1; - slave.pregKnown = 1; - slave.pregType = setPregType(slave); - WombImpregnate(slave, slave.pregType, slave.pregSource, 1); + if (pregSource !== 0 && slave.eggType === "human") { + if (slave.pregKnown === 0) { + r.push(`A quick scan after a bout of morning nausea reveals that <span class="pregnant">${he} has become pregnant.</span>`); + } + knockMeUp(slave, 100, 2, pregSource); } } /* closes random chance and non-zero sex acts check */ } /* closes assignment checks */ @@ -1819,9 +1790,9 @@ App.SlaveAssignment.pregnancy = (function() { * */ function autoImpregnation(slave) { - knockMeUp(slave, 100, 2, slave.ID, true); + knockMeUp(slave, 100, 2, slave.ID); if (slave.geneticQuirks.superfetation === 2 && slave.pregKnown === 1) { - if (V.geneticMappingUpgrade !== 0) { + if (V.geneticMappingUpgrade === 0) { r.push(`${He} experiences frequent spontaneous orgasms from ${his} asexual reproduction modification despite already being pregnant.`); } else { r.push(`Since ${he} is fertile and pregnant, the frequent orgasms caused by ${his} asexual reproduction modifications eventually force <span class="pregnant">another child into ${his} increasingly crowded womb.</span>`); diff --git a/src/endWeek/saRecruitGirls.js b/src/endWeek/saRecruitGirls.js index 2525edc330d929f0545605678f7162d30e887a82..059a93633372fd88d67191c41b9c1872a88b3acc 100644 --- a/src/endWeek/saRecruitGirls.js +++ b/src/endWeek/saRecruitGirls.js @@ -3,8 +3,15 @@ App.SlaveAssignment.recruitGirls = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, woman, women, loli, He, His; + let he; + let him; + let his; + let himself; + let girl; + let woman; + let women; + let He; + let His; let idleTarget; let arcology; @@ -25,8 +32,7 @@ App.SlaveAssignment.recruitGirls = (function() { slaveInt = slave.intelligence + slave.intelligenceImplant; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, woman, women, He, His, loli + he, him, his, himself, girl, woman, women, He, His, } = getPronouns(slave)); calcIdleTarget(slave); diff --git a/src/endWeek/saRelationships.js b/src/endWeek/saRelationships.js index 0060849530424be9fad73e5147b6ee311f7f30cd..6c1fefa3f706d8b92a1947f21199312e25356a16 100644 --- a/src/endWeek/saRelationships.js +++ b/src/endWeek/saRelationships.js @@ -3,8 +3,14 @@ App.SlaveAssignment.relationships = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, himself, He, His, wife, woman; + let he; + let him; + let his; + let himself; + let He; + let His; + let wife; + let woman; let playerPronouns; let PC; @@ -20,7 +26,6 @@ App.SlaveAssignment.relationships = (function() { PC = V.PC; ({ - // eslint-disable-next-line no-unused-vars he, him, his, himself, He, His, wife, woman } = getPronouns(slave)); playerPronouns = getPronouns(PC); @@ -346,7 +351,9 @@ App.SlaveAssignment.relationships = (function() { */ function existingRelationship(slave) { let friend; - let him2, his2, wife2; + let him2; + let his2; + let wife2; if (slave.relationship > 0) { friend = getSlave(slave.relationshipTarget); ({ @@ -984,11 +991,11 @@ App.SlaveAssignment.relationships = (function() { if (slave.sexualQuirk === "size queen" && canPenetrate(lover)) { if (lover.dick > 5) { r.push(`${He}'s <span class="devotion inc">very happy</span> with ${his} romantic status, since it means ${he} regularly gets monster cock.`); - if (canDoAnal(slave) && slave.anus > 0 && slave.anus < 3) { + if (canDoAnal(slave) && slave.anus.isBetween(0, 3)) { r.push(`${He}'s such a size queen that ${he} takes it up ${his} ass as often as ${he} can bear it, despite ${his} poor anus not being used to such abuse. This <span class="lime">stretches out ${his} sphincter.</span>`); slave.anus++; } - if (canDoVaginal(slave) && slave.vagina > 0 && slave.vagina < 3) { + if (canDoVaginal(slave) && slave.vagina.isBetween(0, 3)) { r.push(`It's a little big for what ${his} pussy can handle, <span class="lime">but ${he} gets used to it.</span>`); slave.vagina++; } @@ -997,11 +1004,11 @@ App.SlaveAssignment.relationships = (function() { lover.devotion += 2; } else if (lover.dick > 4) { r.push(`${He} <span class="devotion inc">quite likes</span> being in a sexual relationship with a slave who has such an impressive dick.`); - if (canDoAnal(slave) && slave.anus > 0 && slave.anus < 2) { + if (canDoAnal(slave) && slave.anus.isBetween(0, 2)) { r.push(`${He}'s such a size queen that ${he} takes it up ${his} ass as often as ${he} can bear it, despite ${his} tight butt not being used to such abuse. This <span class="lime">stretches out ${his} sphincter.</span>`); slave.anus++; } - if (canDoVaginal(slave) && slave.vagina > 0 && slave.vagina < 2) { + if (canDoVaginal(slave) && slave.vagina.isBetween(0, 2)) { r.push(`It's a little big for what ${his} tight pussy can handle, <span class="lime">but ${he} gets used to it.</span>`); slave.vagina++; } diff --git a/src/endWeek/saRewardAndPunishment.js b/src/endWeek/saRewardAndPunishment.js index 4b9ec7faf3441b23de0b03f150bd3eddf983a4f4..ab974a0ccd7f9c38223c13b8824042211caf0ffb 100644 --- a/src/endWeek/saRewardAndPunishment.js +++ b/src/endWeek/saRewardAndPunishment.js @@ -1,7 +1,12 @@ App.SlaveAssignment.rewardAndPunishment = (function() { /** @type {App.Entity.SlaveState} */ let slave; - let He, he, His, his, him, himself; + let He; + let he; + let His; + let his; + let him; + let himself; let rewards = 0; let punishments = 0; let combinedText = false; diff --git a/src/endWeek/saRivalries.js b/src/endWeek/saRivalries.js index 2c665042b94ac128249c9ae3f0aa74f2d67d2a52..566c436889e57b2254f78c81b4b7182f1c4a41b3 100644 --- a/src/endWeek/saRivalries.js +++ b/src/endWeek/saRivalries.js @@ -3,8 +3,9 @@ App.SlaveAssignment.rivalries = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His; + let he; + let him; + let his; let changed; @@ -18,8 +19,7 @@ App.SlaveAssignment.rivalries = (function() { r = []; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli + he, him, his } = getPronouns(slave)); if (canStartRivalry(slave)) { diff --git a/src/endWeek/saRules.js b/src/endWeek/saRules.js index a53e2859b46da5a10209329f76a60ed52f3e45d6..c8e418167e4f07f95f1b9f2d9af15a75e4fc56a4 100644 --- a/src/endWeek/saRules.js +++ b/src/endWeek/saRules.js @@ -561,7 +561,7 @@ App.SlaveAssignment.rules = function(slave) { r.push(`is well taken care of during ${his} stay in ${V.clinicName}; you make sure your ${wife}'s every sexual need is handled personally.`); slave.need = 0; if (canImpreg(slave, V.PC) && ((slave.vagina > 0 && slave.ovaries === 1) || (slave.anus !== 0 && slave.mpreg === 1))) { - r.push(knockMeUp(slave, 10, 0, -1, true)); + knockMeUp(slave, 10, 0, -1); if (slave.vagina > 0 && slave.ovaries === 1) { seX(slave, "vaginal", V.PC, "penetrative", 7); } else { @@ -898,7 +898,7 @@ App.SlaveAssignment.rules = function(slave) { seX(slave, "penetrative", V.PC, "oral", 7); } if (canImpreg(slave, V.PC) && ((slave.vagina > 0 && slave.ovaries === 1) || (slave.anus !== 0 && slave.mpreg === 1))) { - r.push(knockMeUp(slave, 10, 0, -1, true)); + knockMeUp(slave, 10, 0, -1); if (slave.preg > 0) { r.push(`As an added show, you <span class="lime">proudly display ${his} positive pregnancy</span> test for all to see.`); } @@ -908,9 +908,9 @@ App.SlaveAssignment.rules = function(slave) { SimpleSexAct.Slaves(slave, S.Wardeness, wardenFunTimes); if (wardenFunTimes > 0 && canImpreg(slave, S.Wardeness) && (V.cellblockWardenCumsInside === 1 || S.Wardeness.fetish === "mindbroken")) { if (canDoVaginal(slave) && slave.vagina > 0 && slave.ovaries === 1) { - r.push(knockMeUp(slave, 10, 0, V.WardenessID, true)); + knockMeUp(slave, 10, 0, V.WardenessID); } else if ((canDoAnal(slave) && slave.anus > 0 && slave.mpreg === 1)) { - r.push(knockMeUp(slave, 10, 1, V.WardenessID, true)); + knockMeUp(slave, 10, 1, V.WardenessID); } } } @@ -1476,7 +1476,7 @@ App.SlaveAssignment.rules = function(slave) { if (slave.vagina !== 0) { seX(S.Schoolteacher, "penetrative", slave, "vaginal", 7); if (canImpreg(slave, S.Schoolteacher) && (slave.breedingMark === 0 || V.propOutcome === 0 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")) { - r.push(knockMeUp(slave, 5, 0, S.Schoolteacher.ID, true)); + knockMeUp(slave, 5, 0, S.Schoolteacher.ID); } } slave.need -= 10; @@ -1485,7 +1485,7 @@ App.SlaveAssignment.rules = function(slave) { if (slave.anus !== 0) { seX(S.Schoolteacher, "penetrative", slave, "anal", 7); if (canImpreg(slave, S.Schoolteacher) && (slave.breedingMark === 0 || V.propOutcome === 0 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")) { - r.push(knockMeUp(slave, 5, 1, S.Schoolteacher.ID, true)); + knockMeUp(slave, 5, 1, S.Schoolteacher.ID); } } slave.need -= 10; @@ -1498,9 +1498,9 @@ App.SlaveAssignment.rules = function(slave) { } if (canImpreg(S.Schoolteacher, slave) && (S.Schoolteacher.breedingMark === 0 || V.propOutcome === 0 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")) { if (S.Schoolteacher.vagina !== 0 && S.Schoolteacher.ovaries === 1) { - r.push(knockMeUp(S.Schoolteacher, 5, 0, slave.ID, true)); + knockMeUp(S.Schoolteacher, 5, 0, slave.ID); } else if (S.Schoolteacher.anus !== 0 && S.Schoolteacher.mpreg === 1) { - r.push(knockMeUp(S.Schoolteacher, 5, 1, slave.ID, true)); + knockMeUp(S.Schoolteacher, 5, 1, slave.ID); } } slave.need -= 10; diff --git a/src/endWeek/saRulesFunctions.js b/src/endWeek/saRulesFunctions.js index 6206222b66cc77cd16f452daaa9ed761760b6bfc..8cec6e1cd838cc4afce621b27ed7f928ca1c8eea 100644 --- a/src/endWeek/saRulesFunctions.js +++ b/src/endWeek/saRulesFunctions.js @@ -573,7 +573,7 @@ App.EndWeek.Rules.masturbationDrugEffects = function(slave) { el.append(` in an effort to get pregnant since `); App.UI.DOM.appendNewElement("span", el, `you won't ${(V.PC.dick !== 0) ? `give ${him}` : `let ${him} find`} the dick ${he} needs. `, "gold"); if (canImpreg(slave, slave)) { - el.append(knockMeUp(slave, 5, 2, slave.ID, true)); + knockMeUp(slave, 5, 2, slave.ID); } if (slave.mpreg === 1 && slave.anus === 0) { App.UI.DOM.appendNewElement("span", el, `${He} is so baby crazed ${he} takes ${his} own anal virginity.`, "lime"); @@ -624,7 +624,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) { if (slave.fetish === "submissive") { el.append(`plead that ${_who} fuck ${him}. `); if (App.EndWeek.saVars.averageDick > 4) { - if (slave.anus > 0 && slave.anus < 3 && canDoAnal(slave)) { + if (slave.anus.isBetween(0, 3) && canDoAnal(slave)) { if ((slave.anus * 40) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { App.UI.DOM.appendNewElement("span", el, `${His} asshole is loosened `, "lime"); el.append(`during sex with other slaves, since most of the cocks ${he} enticed a dominating buttfuck from are very large. `); @@ -633,7 +633,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) { } } if (App.EndWeek.saVars.averageDick > 5) { - if (slave.vagina > 0 && slave.vagina < 3 && canDoVaginal(slave)) { + if (slave.vagina.isBetween(0, 3) && canDoVaginal(slave)) { if ((slave.vagina * 40) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { el.append(`Since most of the slaves ${he} enticed a pounding from are extremely hung, `); App.UI.DOM.appendNewElement("span", el, `${his} cunt gets stretched out.`, "lime"); @@ -683,7 +683,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) { } else if (slave.fetish === "buttslut" && canDoAnal(slave)) { el.append(`demand that ${_who} penetrate ${his} anus. `); if (App.EndWeek.saVars.averageDick > 4) { - if (slave.anus > 0 && slave.anus < 3 && canDoAnal(slave)) { + if (slave.anus.isBetween(0, 3) && canDoAnal(slave)) { if ((slave.anus * 30) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { el.append(`Since most of the slaves ${he} demands anal sex from are extremely hung, `); App.UI.DOM.appendNewElement("span", el, `${his} asshole gets stretched out.`, "lime"); @@ -780,7 +780,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) { } else if (slave.fetish === "masochist") { el.append(`demand that ${_who} hurt ${him}. `); if (App.EndWeek.saVars.averageDick > 4) { - if (slave.anus > 0 && slave.anus < 3 && canDoAnal(slave)) { + if (slave.anus.isBetween(0, 3) && canDoAnal(slave)) { if ((slave.anus * 30) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { App.UI.DOM.appendNewElement("span", el, `${His} asshole is loosened `, "lime"); el.append(`during sex with hung slaves, since ${he} often relies on painal to address ${his} needs. `); @@ -789,7 +789,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) { } } if (App.EndWeek.saVars.averageDick > 5) { - if (slave.vagina > 0 && slave.vagina < 3 && canDoVaginal(slave)) { + if (slave.vagina.isBetween(0, 3) && canDoVaginal(slave)) { if ((slave.vagina * 30) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { el.append(`Since ${he} usually demands that hung slaves fuck ${him} hard enough to make ${his} pussy hurt, `); App.UI.DOM.appendNewElement("span", el, `${his} cunt gets stretched out.`, "lime"); @@ -835,7 +835,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) { el.append(`demand that ${_who} indulge ${his} pregnancy fetish. `); if (App.EndWeek.saVars.averageDick > 5) { if (slave.mpreg === 0) { - if (slave.vagina > 0 && slave.vagina < 3 && canDoVaginal(slave)) { + if (slave.vagina.isBetween(0, 3) && canDoVaginal(slave)) { if ((slave.vagina * 40) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { el.append(`Since ${he} constantly demands to be fucked deeply to get ${his} womb filled with cum, `); App.UI.DOM.appendNewElement("span", el, `${his} cunt gets stretched out.`, "lime"); @@ -844,7 +844,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) { } } } else { - if (slave.anus > 0 && slave.anus < 3 && canDoAnal(slave)) { + if (slave.anus.isBetween(0, 3) && canDoAnal(slave)) { if ((slave.anus * 40) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { el.append(`Since ${he} constantly demands to be fucked deeply to get ${his} womb filled with cum, `); App.UI.DOM.appendNewElement("span", el, `${his} ass gets stretched out.`, "lime"); @@ -860,7 +860,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) { } else if (slave.energy > 95) { el.append(`demand that ${_who} satisfy ${his} formidable appetites. `); if (App.EndWeek.saVars.averageDick > 4) { - if (slave.anus > 0 && slave.anus < 3 && canDoAnal(slave)) { + if (slave.anus.isBetween(0, 3) && canDoAnal(slave)) { if ((slave.anus * 30) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { App.UI.DOM.appendNewElement("span", el, `${His} asshole is loosened `, "lime"); el.append(` during sex with well endowed slaves, since ${he}'s so addicted to sex all ${his} holes see heavy traffic. `); @@ -869,7 +869,7 @@ App.EndWeek.Rules.rapeFetish = function(slave) { } } if (App.EndWeek.saVars.averageDick > 5) { - if (slave.vagina > 0 && slave.vagina < 3 && canDoVaginal(slave)) { + if (slave.vagina.isBetween(0, 3) && canDoVaginal(slave)) { if ((slave.vagina * 30) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { el.append(`${He} indulges in non-stop sex with your well endowed slaves, so much so that `); App.UI.DOM.appendNewElement("span", el, `${his} cunt gets stretched out.`, "lime"); @@ -916,7 +916,7 @@ App.EndWeek.Rules.consentFetish = function(slave) { if (slave.fetish === "submissive") { el.append(`usually pairing off with a more dominant slave. `); if (App.EndWeek.saVars.averageDick > 4) { - if (slave.anus > 0 && slave.anus < 3 && canDoAnal(slave)) { + if (slave.anus.isBetween(0, 3) && canDoAnal(slave)) { if ((slave.anus * 40) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { App.UI.DOM.appendNewElement("span", el, `${His} asshole is loosened `, "lime"); el.append(` during sex with other slaves, since most of the cocks ${he} lets dominate ${his} backdoor are very large. `); @@ -925,7 +925,7 @@ App.EndWeek.Rules.consentFetish = function(slave) { } } if (App.EndWeek.saVars.averageDick > 5) { - if (slave.vagina > 0 && slave.vagina < 3 && canDoVaginal(slave)) { + if (slave.vagina.isBetween(0, 3) && canDoVaginal(slave)) { if ((slave.vagina * 40) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { el.append(`Since most of the slaves ${he} takes a pounding from are extremely hung, `); App.UI.DOM.appendNewElement("span", el, `${his} cunt gets stretched out.`, "lime"); @@ -960,7 +960,7 @@ App.EndWeek.Rules.consentFetish = function(slave) { } el.append(`in return. `); if (App.EndWeek.saVars.averageDick > 4) { - if (slave.anus > 0 && slave.anus < 3 && canDoAnal(slave)) { + if (slave.anus.isBetween(0, 3) && canDoAnal(slave)) { if ((slave.anus * 30) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { el.append(`Since most of the slaves ${he} enjoys anal sex with are extremely hung, `); App.UI.DOM.appendNewElement("span", el, `${his} asshole gets stretched out.`, "lime"); @@ -987,7 +987,7 @@ App.EndWeek.Rules.consentFetish = function(slave) { } else if (slave.fetish === "masochist") { el.append(`usually pairing off with an abusive slave. `); if (App.EndWeek.saVars.averageDick > 4) { - if (slave.anus > 0 && slave.anus < 3 && canDoAnal(slave)) { + if (slave.anus.isBetween(0, 3) && canDoAnal(slave)) { if ((slave.anus * 30) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { App.UI.DOM.appendNewElement("span", el, `${His} asshole is loosened, `, "lime"); el.append(`since ${he} begs hung slaves to fuck ${his} butt until ${he} cries. `); @@ -996,7 +996,7 @@ App.EndWeek.Rules.consentFetish = function(slave) { } } if (App.EndWeek.saVars.averageDick > 5) { - if (slave.vagina > 0 && slave.vagina < 3 && canDoVaginal(slave)) { + if (slave.vagina.isBetween(0, 3) && canDoVaginal(slave)) { if ((slave.vagina * 30) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { el.append(`Since ${he} eagerly begs hung slaves to fuck ${him} until ${he} cries, `); App.UI.DOM.appendNewElement("span", el, `${his} cunt gets stretched out.`, "lime"); @@ -1017,7 +1017,7 @@ App.EndWeek.Rules.consentFetish = function(slave) { el.append(`doing ${his} best to pair off with any pregnant slaves. `); if (slave.mpreg === 0) { if (App.EndWeek.saVars.averageDick > 5) { - if (slave.vagina > 0 && slave.vagina < 3 && canDoVaginal(slave)) { + if (slave.vagina.isBetween(0, 3) && canDoVaginal(slave)) { if ((slave.vagina * 40) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { el.append(`${He} also takes cock whenever ${he} can, begging to be fucked deeply to get ${his} womb filled with cum, so `); App.UI.DOM.appendNewElement("span", el, `${his} cunt gets stretched out.`, "lime"); @@ -1028,7 +1028,7 @@ App.EndWeek.Rules.consentFetish = function(slave) { } } else { if (App.EndWeek.saVars.averageDick > 5) { - if (slave.anus > 0 && slave.anus < 3 && canDoAnal(slave)) { + if (slave.anus.isBetween(0, 3) && canDoAnal(slave)) { if ((slave.anus * 40) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { el.append(`${He} also takes cock whenever ${he} can, begging to be fucked deeply to get ${his} womb filled with cum, so `); App.UI.DOM.appendNewElement("span", el, `${his} ass gets stretched out.`, "lime"); @@ -1045,7 +1045,7 @@ App.EndWeek.Rules.consentFetish = function(slave) { } else if (slave.energy > 95) { el.append(`and has to give out a lot of favors to get enough attention for ${himself}. `); if (App.EndWeek.saVars.averageDick > 4) { - if (slave.anus > 0 && slave.anus < 3 && canDoAnal(slave)) { + if (slave.anus.isBetween(0, 3) && canDoAnal(slave)) { if ((slave.anus * 30) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { App.UI.DOM.appendNewElement("span", el, `${His} asshole is loosened `, "lime"); el.append(`during sex with well endowed slaves, since ${he}'s so addicted to sex all ${his} holes see heavy traffic. `); @@ -1054,7 +1054,7 @@ App.EndWeek.Rules.consentFetish = function(slave) { } } if (App.EndWeek.saVars.averageDick > 5) { - if (slave.vagina > 0 && slave.vagina < 3 && canDoVaginal(slave)) { + if (slave.vagina.isBetween(0, 3) && canDoVaginal(slave)) { if ((slave.vagina * 30) - (App.EndWeek.saVars.averageDick * 5) < random(1, 100)) { el.append(`${He} indulges in non-stop sex with your well endowed slaves, so much so that `); App.UI.DOM.appendNewElement("span", el, `${his} cunt gets stretched out.`, "lime"); @@ -1429,7 +1429,8 @@ App.EndWeek.Rules.partnerDrugEffects = function(slave) { he, him, his} = getPronouns(slave); const _sr = getSlave(slave.relationshipTarget); - let his2, him2; + let his2; + let him2; if (_sr) { ({ his2, him2 diff --git a/src/endWeek/saServant.js b/src/endWeek/saServant.js index f46bdcad9ca79540578c06dab4ef7d7060c7e9ea..c5e1fdd264caef2957baf1ccb5d933f8cbf411ee 100644 --- a/src/endWeek/saServant.js +++ b/src/endWeek/saServant.js @@ -3,8 +3,13 @@ App.SlaveAssignment.servant = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His, wife; + let he; + let him; + let his; + let himself; + let He; + let His; + let wife; let cash; let oralUse; @@ -22,8 +27,7 @@ App.SlaveAssignment.servant = (function() { stewardessBonus = bonus; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli, wife + he, him, his, himself, He, His, wife } = getPronouns(slave)); cash = 0; diff --git a/src/endWeek/saServeThePublic.js b/src/endWeek/saServeThePublic.js index 506aecf7736b5c597685b0be60b47b3b5a51a2a3..2143078e2ced7e0121e7bc2b1e0155f2667af940 100644 --- a/src/endWeek/saServeThePublic.js +++ b/src/endWeek/saServeThePublic.js @@ -6,7 +6,15 @@ App.SlaveAssignment.serveThePublic = (function() { let arcology; let cervixPump; - let he, him, his, hers, himself, girl, loli, He, His; + let he; + let him; + let his; + let hers; + let himself; + let girl; + let loli; + let He; + let His; // if the following are set outside this file, they must be set in it too! let oralUse; @@ -25,7 +33,6 @@ App.SlaveAssignment.serveThePublic = (function() { arcology = V.arcologies[0]; r = ` `; ({ - // eslint-disable-next-line no-unused-vars he, him, his, hers, himself, girl, He, His, loli } = getPronouns(slave)); @@ -1412,7 +1419,7 @@ App.SlaveAssignment.serveThePublic = (function() { } } - if (slave.energy > 40 && slave.energy < 95) { + if (slave.energy.isBetween(40, 95)) { r += ` Being used sexually all week <span class="change positive">increases ${his} sex drive.</span>`; slave.energy += 1; } diff --git a/src/endWeek/saServeYourOtherSlaves.js b/src/endWeek/saServeYourOtherSlaves.js index a1c0b9f79dfb472c9924c2868cee4f50380f3598..1d63361bd3bfc9dfb3f1bc87e84442c6d407df19 100644 --- a/src/endWeek/saServeYourOtherSlaves.js +++ b/src/endWeek/saServeYourOtherSlaves.js @@ -3,10 +3,18 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His; - // eslint-disable-next-line no-unused-vars - let he2, him2, his2, hers2, himself2, girl2, loli2, He2, His2; + let he; + let him; + let his; + let himself; + let girl; + let He; + let His; + + let he2; + let him2; + let his2; + let himself2; let jobType; let fetishChange; @@ -46,8 +54,7 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() { fetishChange = fetishChangeChance(slave); ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli + he, him, his, himself, girl, He, His, } = getPronouns(slave)); oralUse = 0; @@ -275,14 +282,14 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() { r.push(`servicing your stock, ${he} is used to the <span class="health dec">point of exhaustion.</span>`); healthDamage(slave, 10); if (App.EndWeek.saVars.averageDick > 5) { - if (canDoVaginal(slave) && slave.vagina > 0 && slave.vagina < 4) { + if (canDoVaginal(slave) && slave.vagina.isBetween(0, 4)) { if ((slave.vagina * 40) - (App.EndWeek.saVars.averageDick * 5) < jsRandom(1, 100)) { r.push(`So many huge dicks pistoning in and out of ${his} pussy <span class="lime">loosen ${him} up.</span>`); slave.vagina++; actX(slave, "vaginal", 3); } } - if (canDoAnal(slave) && slave.anus > 0 && slave.anus < 4) { + if (canDoAnal(slave) && slave.anus.isBetween(0, 4)) { if ((slave.anus * 40) - (App.EndWeek.saVars.averageDick * 5) < jsRandom(1, 100)) { r.push(`<span class="lime">${His} asshole is loosened</span> after being pounded by so many giant cocks.`); slave.anus++; @@ -322,7 +329,7 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() { function subLife(slave) { ({ // eslint-disable-next-line no-unused-vars - he2, him2, his2, hers2, himself2, girl2, He2, His2, loli2 + he2, him2, his2, himself2, } = getPronouns(domSlave).appendSuffix('2')); if (V.seeRace === 1) { @@ -394,7 +401,7 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() { domSlave.counter.anal += penetrativeUse; V.analTotal += penetrativeUse; if (canImpreg(domSlave, slave)) { - r.push(knockMeUp(domSlave, 30, 1, slave.ID, true)); + knockMeUp(domSlave, 30, 1, slave.ID); if (domSlave.pregKnown === 1) { r.push(`With so many potent deposits into ${his2} fertile rear, it comes as little surprise when <span class="lime">${he2} ends up pregnant with ${subName}'s child.</span>`); } @@ -510,7 +517,7 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() { domSlave.counter.vaginal += penetrativeUse; V.vaginalTotal += penetrativeUse; if (canImpreg(domSlave, slave)) { - r.push(knockMeUp(domSlave, 30, 0, slave.ID, true)); + knockMeUp(domSlave, 30, 0, slave.ID); if (domSlave.pregKnown === 1) { r.push(`With so many potent loads kissing ${his2} cervix, it comes as little surprise when <span class="lime">${he2} ends up pregnant with ${subName}'s child.</span>`); } @@ -520,7 +527,7 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() { domSlave.counter.anal += penetrativeUse; V.analTotal += penetrativeUse; if (canImpreg(domSlave, slave)) { - r.push(knockMeUp(domSlave, 30, 1, slave.ID, true)); + knockMeUp(domSlave, 30, 1, slave.ID); if (domSlave.pregKnown === 1) { r.push(`With so many potent deposits into ${his2} fertile rear, it comes as little surprise when <span class="lime">${he2} ends up pregnant with ${subName}'s child.</span>`); } @@ -1456,7 +1463,7 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() { if (slave.fetishStrength < 100) { slave.fetishStrength++; } - } else if (fetishChange > jsRandom(0, 100) && slave.fetish !== "masochist" && slave.fetish !== "submissive" && between(App.EndWeek.saVars.subSlaveRatio, 0, 0.8)) { + } else if (fetishChange > jsRandom(0, 100) && slave.fetish !== "masochist" && slave.fetish !== "submissive" && App.EndWeek.saVars.subSlaveRatio.isBetween(0, 0.8)) { r.push(`Being used as much as ${he} is starts to take a toll on ${him} sexuality; <span class="lightcoral">${he} begins to enjoy being your chattel's fucktoy.</span>`); slave.fetish = "submissive"; slave.fetishStrength = 65; diff --git a/src/endWeek/saSocialEffects.js b/src/endWeek/saSocialEffects.js index e8e53e7c8ea833918011f944859610f202b2fe96..a912b739f2be87e32fa1883c74e5123a83073dc9 100644 --- a/src/endWeek/saSocialEffects.js +++ b/src/endWeek/saSocialEffects.js @@ -450,7 +450,7 @@ App.SlaveAssignment.saSocialEffects = function(slave) { } if (slave.intelligenceImplant <= -15) { t.push(new SocialEffect("Degradationist", 1, `Miseducated`, - `Society <span class="reputation.inc">is amused</span> by ${slave.slaveName}'s education and how much it hinders critical thought.`)); + `Society <span class="reputation inc">is amused</span> by ${slave.slaveName}'s education and how much it hinders critical thought.`)); } } if ((slave.assignment === Job.GLORYHOLE) || (slave.assignment === Job.ARCADE)) { @@ -916,37 +916,33 @@ App.SlaveAssignment.saSocialEffects = function(slave) { } function renderTooltip() { - const el = document.createDocumentFragment(); + const el = document.createElement("div"); + el.classList.add("tip-details", "grid-2columns-auto"); for (const effect of socialEffects) { - const domLine = document.createElement('div'); - domLine.style.display = "float"; - const domCell = document.createElement('span'); - domCell.style.float = "left"; - domCell.style.width = "3em"; - let text = ""; - if (Math.round(effect.magnitude) === 0) { - text = '0'; - domCell.className = "gray"; - } else if (effect.magnitude > 0) { + let className; + if (effect.magnitude > 0) { for (let i = 0; i < effect.magnitude; ++i) { text += "+"; } - domCell.className = "green"; + className = "green"; } else if (effect.magnitude < 0) { for (let i = 0; i > effect.magnitude; --i) { text += "-"; } - domCell.className = "red"; + className = "red"; + } else { + text = '0'; + className = "gray"; } - domCell.append(text); - domLine.append(domCell); + App.UI.DOM.appendNewElement("span", el, text, className); - domLine.append(effect.shortDesc); + const div = document.createElement('div'); + div.append(effect.shortDesc); if (effect.FS) { - domLine.append(` (${effect.FS})`); + div.append(` (${effect.FS})`); } - el.appendChild(domLine); + el.appendChild(div); } return el; } @@ -965,14 +961,17 @@ App.SlaveAssignment.saSocialEffects = function(slave) { const sum = positiveSum + negativeSum; frag.append(`Society has a `); if (sum > 0) { - const details = new App.UI.DOM.InteractiveDetails("positive", renderTooltip, ["green", "major-link", "underline"]); - frag.append(details.render(), ` overall view of ${slave.slaveName} `, sumFrag, `, which improves your reputation and advances social progress.`); + const opinion = App.UI.DOM.makeElement("span", "positive", ["green", "major-link", "has-tooltip"]); + tippy(opinion, {content: renderTooltip(), placement: "right"}); + frag.append(opinion, ` overall view of ${slave.slaveName} `, sumFrag, `, which improves your reputation and advances social progress.`); } else if (sum === 0) { - const details = new App.UI.DOM.InteractiveDetails("neutral", renderTooltip, ["yellow", "major-link", "underline"]); - frag.append(details.render(), ` overall view of ${slave.slaveName} `, sumFrag, `; ${he} had no net impact on your reputation or social progress this week.`); + const opinion = App.UI.DOM.makeElement("span", "neutral", ["yellow", "major-link", "has-tooltip"]); + tippy(opinion, {content: renderTooltip(), placement: "right"}); + frag.append(opinion, ` overall view of ${slave.slaveName} `, sumFrag, `; ${he} had no net impact on your reputation or social progress this week.`); } else { - const details = new App.UI.DOM.InteractiveDetails("negative", renderTooltip, ["red", "major-link", "underline"]); - frag.append(details.render(), ` overall view of ${slave.slaveName} `, sumFrag, `, which decreases your reputation and retards social progress.`); + const opinion = App.UI.DOM.makeElement("span", "negative", ["red", "major-link", "has-tooltip"]); + tippy(opinion, {content: renderTooltip(), placement: "right"}); + frag.append(opinion, ` overall view of ${slave.slaveName} `, sumFrag, `, which decreases your reputation and retards social progress.`); } } diff --git a/src/endWeek/saTakeClasses.js b/src/endWeek/saTakeClasses.js index 6f653e255bcff4b4c586f8dd242275f9f2e88d66..22c9848df218a6458e5fca49f144b3e8a09c7674 100644 --- a/src/endWeek/saTakeClasses.js +++ b/src/endWeek/saTakeClasses.js @@ -3,8 +3,12 @@ App.SlaveAssignment.takeClasses = (function() { let r; - // eslint-disable-next-line no-unused-vars - let he, him, his, hers, himself, girl, loli, He, His; + let he; + let him; + let his; + let himself; + let He; + let His; let learning; let teaching; @@ -20,8 +24,7 @@ App.SlaveAssignment.takeClasses = (function() { learning = 1; teaching = 0; ({ - // eslint-disable-next-line no-unused-vars - he, him, his, hers, himself, girl, He, His, loli + he, him, his, himself, He, His, } = getPronouns(slave)); jobPreface(slave); diff --git a/src/endWeek/saWhore.js b/src/endWeek/saWhore.js index f07cdf4ab58a02949a37c574e4ced838bc1721ac..07d1908cc304795c94ed70d59e6db66ab768199d 100644 --- a/src/endWeek/saWhore.js +++ b/src/endWeek/saWhore.js @@ -12,7 +12,15 @@ App.SlaveAssignment.whore = (function() { let cash; let cervixPump; - let he, him, his, hers, himself, girl, loli, He, His; + let he; + let him; + let his; + let hers; + let himself; + let girl; + let loli; + let He; + let His; // if the following are set outside this file, they must be set in it too! let oralUse; @@ -31,7 +39,6 @@ App.SlaveAssignment.whore = (function() { arcology = V.arcologies[0]; r = ` `; ({ - // eslint-disable-next-line no-unused-vars he, him, his, hers, himself, girl, He, His, loli } = getPronouns(slave)); @@ -1486,7 +1493,7 @@ App.SlaveAssignment.whore = (function() { } } - if (slave.energy > 40 && slave.energy < 95) { + if (slave.energy.isBetween(40, 95)) { r += ` Being used sexually all week <span class="change positive">increases ${his} sex drive.</span>`; slave.energy += 1; } diff --git a/src/endWeek/sexualServices.js b/src/endWeek/sexualServices.js index 5db92e5c7b73c1898bedbfd1c7de738535d81f8b..b2b2648ad78594371c5e3aabb4890fd9e27c6973 100644 --- a/src/endWeek/sexualServices.js +++ b/src/endWeek/sexualServices.js @@ -20,17 +20,17 @@ App.EndWeek.computeSexualServicesModel = function(renderContainer) { } repX(forceNeg(50 * V.brothelBoost.eligible), "brothel"); - let lowerClassSexDemand = Math.trunc(V.lowerClass * V.whoreBudget.lowerClass) * 2, - lowerClassSexDemandRef = Math.max(lowerClassSexDemand, 1), - visitorsSexDemand = Math.trunc(V.visitors) * 40, - middleClassSexDemand = Math.trunc(V.middleClass * V.whoreBudget.middleClass + visitorsSexDemand * 0.5) * 2, - middleClassSexDemandRef = Math.max(middleClassSexDemand, 1), - upperClassSexDemand = Math.trunc(V.upperClass * V.whoreBudget.upperClass + visitorsSexDemand * 0.5) * 2, - upperClassSexDemandRef = Math.max(upperClassSexDemand, 1), - topClassSexDemand = Math.trunc(V.topClass * V.whoreBudget.topClass) * 2, - topClassSexDemandRef = Math.max(topClassSexDemand, 1), - arcadeSupply = {lowerClass: 0, middleClass: 0, upperClass: 0}, - clubSupply = {lowerClass: 0, middleClass: 0}; + let lowerClassSexDemand = Math.trunc(V.lowerClass * V.whoreBudget.lowerClass) * 2; + let lowerClassSexDemandRef = Math.max(lowerClassSexDemand, 1); + let visitorsSexDemand = Math.trunc(V.visitors) * 40; + let middleClassSexDemand = Math.trunc(V.middleClass * V.whoreBudget.middleClass + visitorsSexDemand * 0.5) * 2; + let middleClassSexDemandRef = Math.max(middleClassSexDemand, 1); + let upperClassSexDemand = Math.trunc(V.upperClass * V.whoreBudget.upperClass + visitorsSexDemand * 0.5) * 2; + let upperClassSexDemandRef = Math.max(upperClassSexDemand, 1); + let topClassSexDemand = Math.trunc(V.topClass * V.whoreBudget.topClass) * 2; + let topClassSexDemandRef = Math.max(topClassSexDemand, 1); + let arcadeSupply = {lowerClass: 0, middleClass: 0, upperClass: 0}; + let clubSupply = {lowerClass: 0, middleClass: 0}; App.EndWeek.saVars.whorePriceAdjustment = { lowerClass: 0, middleClass: 0, upperClass: 0, topClass: 0 diff --git a/src/endWeek/slaveAssignmentReport.js b/src/endWeek/slaveAssignmentReport.js index 2c5745850af6ed89473dd911639d797bf9185eb7..96c0dfc96fac4d83624b144ffc0421d3da2c8caa 100644 --- a/src/endWeek/slaveAssignmentReport.js +++ b/src/endWeek/slaveAssignmentReport.js @@ -183,7 +183,7 @@ App.EndWeek.slaveAssignmentReport = function() { App.EndWeek.saVars.HGEnergy = 0; } if (canAchieveErection(slave)) { - App.EndWeek.saVars.HGCum = 2 + Math.trunc((slave.balls / 5) + (slave.energy / 95) + (slave.health.condition / 95) + (slave.devotion / 95) + (V.reproductionFormula * 5)); + App.EndWeek.saVars.HGCum = resetHGCum(slave); } } diff --git a/src/endWeek/standardSlaveReport.js b/src/endWeek/standardSlaveReport.js index a76d7a14d0142457c7bf7d86e817a2d97afa63c6..5de0aa6debf72c9e549b7faebe5db282e841eada 100644 --- a/src/endWeek/standardSlaveReport.js +++ b/src/endWeek/standardSlaveReport.js @@ -45,3 +45,15 @@ App.SlaveAssignment.appendSlaveArt = function(node, slave) { App.UI.DOM.appendNewElement("div", node, App.EndWeek.saVars.slaveArt.render(slave), ["imageRef", "tinyImg"]); } }; + +/** + * Render favorite and reminder links + * @param {ParentNode} node + * @param {App.Entity.SlaveState} slave + */ +App.SlaveAssignment.appendSlaveLinks = function(node, slave) { + node.append( + App.UI.favoriteToggle(slave), " ", + App.Reminders.slaveLink(slave.ID), " " + ); +}; diff --git a/src/events/PE/UnderageConcubine.js b/src/events/PE/UnderageConcubine.js index c4bbfa2739da4095c3503f5545c11a4a13bb8ceb..1ae05b822d89c8dc6b6b397fcf1d3cb2288f9aa1 100644 --- a/src/events/PE/UnderageConcubine.js +++ b/src/events/PE/UnderageConcubine.js @@ -257,13 +257,13 @@ App.Events.PEUnderageConcubine = class PEUnderageConcubine extends App.Events.Ba let frag2 = document.createDocumentFragment(); t = []; - t.push(`"Sex with teens is common, as it has been historically," you reply, proceeding to explain in detail that the modern aversion to sex with adolescents is a historical aberration, and that even in modern times sexual attraction to teens has not been considered abnormal by trained physcologists.`); + t.push(`"Sex with teens is common, as it has been historically," you reply, proceeding to explain in detail that the modern aversion to sex with adolescents is a historical aberration, and that even in modern times sexual attraction to teens has not been considered abnormal by trained psychologists.`); // don't try this line of reasoning with NCS youthening, obviously... if (concubine.visualAge >= 13) { t.push(`You also point out that physical characteristics of teens like ${concubine.slaveName} are really very similar to those of adults, and cast "age of consent" as an arbitrary social construct that the Free Cities' very different society has not chosen to retain.`); interviewPoints++; } else { - t.push(`Your efforts to illustrate that teens and adults are physcially similar, though, fall flat because of ${concubine.slaveName}'s extremely youthful appearance; there's no way ${he} could even remotely pass as a young adult.`); + t.push(`Your efforts to illustrate that teens and adults are physically similar, though, fall flat because of ${concubine.slaveName}'s extremely youthful appearance; there's no way ${he} could even remotely pass as a young adult.`); interviewPoints--; } App.Events.addParagraph(frag2, t); diff --git a/src/events/PE/concubineInterview.js b/src/events/PE/concubineInterview.js index e356177791939d4e7580a3344b5b75ed1ab49b5e..7676299c764d35e00de154b85a529415b02075ee 100644 --- a/src/events/PE/concubineInterview.js +++ b/src/events/PE/concubineInterview.js @@ -80,7 +80,7 @@ App.Events.PEConcubineInterview = class PEConcubineInterview extends App.Events. } else { t.push(`strides out`); } - if (eventSlave.clothes === "no clothing") { + if (App.Data.clothes.get(eventSlave.clothes).exposure >= 4) { t.push(`in magnificent nudity. It's a shock to old world values, no doubt, but the titillation should counterbalance that.`); } else { t.push(`resplendent in ${eventSlave.clothes}.`); @@ -105,7 +105,7 @@ App.Events.PEConcubineInterview = class PEConcubineInterview extends App.Events. } else if (eventSlave.intelligence + eventSlave.intelligenceImplant > 15) { t.push(`${He} manages to sway the topic away from ${his} apparent underageness. ${speak(`"I'm really ${eventSlave.actualAge}, believe it or not. Wouldn't you like to know my secret?"`)}`); } else { - t.push(`${He} manages to completely miss the insinuation and <span class="red">make things worse than they really are.</span> ${speak(`"Master loves the way I look, that's why I'm hisP favorite after all, but I'm still ${eventSlave.actualAge}-years old."`)}`); + t.push(`${He} manages to completely miss the insinuation and <span class="red">make things worse than they really are.</span> ${speak(`"Master loves the way I look, that's why I'm ${hisP} favorite after all, but I'm still ${eventSlave.actualAge}-years old."`)}`); rep(-100); } diff --git a/src/events/RE/reArcologyInspection.js b/src/events/RE/reArcologyInspection.js index bbf3d2850c2b33c7335c0abc24850fe15f6421fa..e7a4da784de79631d72466dcdefe87dacef519c1 100644 --- a/src/events/RE/reArcologyInspection.js +++ b/src/events/RE/reArcologyInspection.js @@ -444,10 +444,10 @@ App.Events.REArcologyInspection = class REArcologyInspection extends App.Events. function virginityWarning() { const virgins = []; - if (agent && (agent.vagina === 0 || agent.anus == 0)) { + if (agent && (agent.vagina === 0 || agent.anus === 0)) { virgins.push(agent.slaveName); } - if (agentLover && (agentLover.vagina === 0 || agentLover.anus == 0)) { + if (agentLover && (agentLover.vagina === 0 || agentLover.anus === 0)) { virgins.push(agentLover.slaveName); } if (virgins.length > 0) { diff --git a/src/events/RE/rePregInventorFCTV.js b/src/events/RE/rePregInventorFCTV.js new file mode 100644 index 0000000000000000000000000000000000000000..8ac5cd92523094777e587882f5dc6d5e07c46d9e --- /dev/null +++ b/src/events/RE/rePregInventorFCTV.js @@ -0,0 +1,608 @@ +App.Events.rePregInventorFCTV = class rePregInventorFCTV extends App.Events.BaseEvent { + eventPrerequisites() { + return [ + () => V.pregInventor === 2, + () => V.pregInventions === 1, + () => V.FCTV.receiver > 0 + ]; + } + + actorPrerequisites() { + return [ + [ + s => s.ID === V.pregInventorID, + s => s.bellyPreg >= 1000000, // even bigger than before + s => s.fetish !== "mindbroken", + s => s.fuckdoll === 0, + s => s.devotion > 50, + s => s.porn.prestige >= 1 || s.prestige >= 1 + ], + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [slave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, him, himself, girl + } = getPronouns(slave); + const legs = hasBothLegs(slave) ? `legs` : `leg`; + App.Events.drawEventArt(node, slave); + V.pregInventor = 3; + let r = []; + + r.push( + `The time has finally come for your slave,`, + App.UI.DOM.combineNodes(App.UI.DOM.slaveDescriptionDialog(slave), `,`), + `to appear on the slave-breeding based talk show, "Husbandry with Millie."` + ); + if (slave.porn.prestige > 2 || slave.prestige > 2) { + r.push(`While ${he} is already world-renowned, you might still improve ${his} chances to impress on the show with a little bit of extra investment in commercial spots or a tweaking of FCTV algorithms.`); + } else if ((slave.porn.prestige > 1 || slave.prestige > 2) && V.PC.skill.hacking >= 100) { + r.push(`While ${he} is already quite famous, you could still improve ${his} chances to impress on the show with a little bit of extra investment in commercial spots or a tweaking of FCTV algorithms.`); + } else { + r.push(`While ${he} has`); + if (slave.porn.prestige > 1) { + r.push(`managed to earn a reasonable following in slave pornography,`); + } else { + r.push(`a bit of a reputation already,`); + } + r.push(`you could significantly improve ${his} chances to impress on the show with a little bit of extra investment in commercial spots${(V.PC.skill.hacking >= 100) ? `or a tweaking of FCTV algorithms` : ``}.`); + } + App.Events.addParagraph(node, r); + + const responses = []; + if (V.PC.skill.hacking >= 100) { + responses.push(new App.Events.Result(`Manipulate the FCTV algorithms`, manipulate)); + } + responses.push(new App.Events.Result(`Spend ${cashFormat(10000)} to fund additional advertising`, advertising)); + responses.push(new App.Events.Result(`Trust in your slave`, trust)); + + App.Events.addResponses(node, responses); + + function manipulate() { + const frag = new DocumentFragment(); + let r = []; + r.push(`You `); + if (V.PC.skill.hacking < 70) { + r.push(`bribe an employee to `); + } + r.push(`tweak the randomized search algorithms for FCTV. While your hyperbroodmother is being interviewed concerning ${his} inventions, users browsing FCTV using the randomize channel function will be much more likely to be directed to the show. By the day of the interview, you're confident that many users will be watching as your slave sells your vision for the world's future.`); + App.Events.addParagraph(frag, r); + r = []; + r.push(`That done, you settle in to watch.`); + App.Events.addParagraph(frag, r); + r = []; + + frag.append(interview()); + + r.push(`You turn your FCTV screen off satisfied that your slave has just completed a job well done. Over the course of the next several weeks, it becomes clear that ${slave.slaveName}'s appearance on "Husbandry With Milly" has had a <span class="reputation inc">significant positive impact</span> on public opinion.`); + if (slave.prestige <= 2) { + slave.prestige = 2; + slave.prestigeDesc = "$He is a renowned inventor of hyperpregnant sex accessories and toys."; + } + repX(10000, "event"); + V.pregInventions = 2; + for (const arc of V.arcologies) { + if (arc.FSRepopulationFocus !== "unset") { + arc.FSRepopulationFocus += 10; + } else if (arc.FSRestart !== "unset") { + arc.FSRestart -= 20; + } + } + V.trinkets.push(`a cut out magazine cover of your renowned hyperbroodmother inventor, ${slave.slaveName}, and ${his} myriad toys`); + App.Events.addParagraph(frag, r); + return frag; + } + + function advertising() { + const frag = new DocumentFragment(); + let r = []; + r.push(`You fund an aggressive ad campaign featuring your slave in provocative positions and selling a "life changing interview" on "Husbandry with Millie." By the day of ${his} interview, user boards all through the global web are discussing your slave and what ${he} might be about to reveal. Even social demographics not typically inclined toward the idea of breeding slaves seem to be intrigued, and you're confident that many users will be watching as your slave sells your vision for the world's future.`); + App.Events.addParagraph(frag, r); + r = []; + r.push(`That done, you settle in to watch the interview.`); + App.Events.addParagraph(frag, r); + r = []; + + frag.append(interview()); + + r.push(`You turn your FCTV screen off satisfied that your slave has just completed a job well done. Over the course of the next several weeks, it becomes clear that ${slave.slaveName}'s appearance on "Husbandry With Milly" has had a <span class="reputation inc">significant positive impact</span> on public opinion.`); + if (slave.prestige < 2) { + slave.prestige = 2; + slave.prestigeDesc = "$He is a renowned inventor of hyperpregnant sex accessories and toys."; + } + repX(10000, "event"); + V.pregInventions = 2; + for (const arc of V.arcologies) { + if (arc.FSRepopulationFocus !== "unset") { + arc.FSRepopulationFocus += 10; + } else if (arc.FSRestart !== "unset") { + arc.FSRestart -= 20; + } + } + V.trinkets.push(`a cut out magazine cover of your renowned hyperbroodmother inventor, ${slave.slaveName}, and ${his} myriad toys`); + + App.Events.addParagraph(frag, r); + return frag; + } + + function trust() { + const frag = new DocumentFragment(); + let r = []; + r.push(`It's a gamble, but you decide to trust in the charisma of your slave and the fame ${he} has already accrued to sell your vision for the world's future during the interview.`); + if (slave.porn.prestige > 2) { + r.push(`${He}'s enormously popular, so your gambit has a good chance of success.`); + } else if (slave.porn.prestige > 1) { + r.push(`${He}'s quite popular, so your gambit has a reasonable chance of success.`); + } else { + r.push(`${He}'s only really well known in local pornography, but you still decide to bet on ${his} ability to sway the masses.`); + } + r.push(`Regardless, there's only so much your direct involvement could do to help ${him} as ${he} sells your vision for the world's future, and the natural cleverness ${he}'s already demonstrated might well allow ${him} to achieve results on ${his} own that would be impossible otherwise.`); + App.Events.addParagraph(frag, r); + r = []; + r.push(`When the day arrives, you settle in to watch the interview.`); + App.Events.addParagraph(frag, r); + r = []; + + frag.append(interview()); + + if (slave.porn.prestige >= 3 && random(1, 100) > 50) { + r.push(`You turn your FCTV screen off satisfied that your slave has just finished a job very well done. Over the course of the next several weeks, it becomes clear that ${slave.slaveName}'s appearance on "Husbandry With Milly" has had <span class="reputation inc">world changing</span> consequences.`); + if (slave.prestige < 3) { + slave.prestige = 3; + slave.prestigeDesc = "$He is a world renowned inventor of hyperpregnant sex accessories and toys."; + } + repX(25000, "event"); + V.pregInventions = 3; + for (const arc of V.arcologies) { + if (arc.FSRepopulationFocus !== "unset") { + arc.FSRepopulationFocus += 30; + } else if (arc.FSRestart !== "unset") { + arc.FSRestart -= 60; + } + } + V.trinkets.push(`a cut out magazine cover of your world renowned hyperbroodmother inventor, ${slave.slaveName}, and ${his} myriad toys`); + } else if (slave.porn.prestige >= 3 && random(1, 100) > 30) { + r.push(`You turn your FCTV screen off satisfied that your slave has just completed a job well done. Over the course of the next several weeks, it becomes clear that ${slave.slaveName}'s appearance on "Husbandry With Milly" has had a <span class="reputation inc">significant positive impact</span> on public opinion.`); + if (slave.prestige < 2) { + slave.prestige = 2; + slave.prestigeDesc = "$He is a renowned inventor of hyperpregnant sex accessories and toys."; + } + repX(10000, "event"); + V.pregInventions = 2; + for (const arc of V.arcologies) { + if (arc.FSRepopulationFocus !== "unset") { + arc.FSRepopulationFocus += 10; + } else if (arc.FSRestart !== "unset") { + arc.FSRestart -= 20; + } + } + V.trinkets.push(`a cut out magazine cover of your renowned hyperbroodmother inventor, ${slave.slaveName}, and ${his} myriad toys`); + } else if (slave.porn.prestige >= 3 && random(1, 100) > 15) { + r.push(`You turn your FCTV screen off satisfied that your slave has done a satisfactory job. Over the course of the next several weeks, it becomes clear that ${slave.slaveName}'s appearance on "Husbandry With Milly" has had a <span class="reputation inc">significant impact</span> on public opinion, though only at a local level.`); + if (slave.prestige < 1) { + slave.prestige = 1; + slave.prestigeDesc = "$He is a locally respected inventor of hyperpregnant sex accessories and toys."; + } + repX(2500, "event"); + for (const arc of V.arcologies) { + if (arc.FSRepopulationFocus !== "unset") { + arc.FSRepopulationFocus += 5; + } else if (arc.FSRestart !== "unset") { + arc.FSRestart -= 10; + } + } + } else if (slave.porn.prestige >= 3) { + r.push(`You turn your FCTV screen off disappointed that your slave has done a mediocre job. Over the course of the next several weeks, it becomes clear that <span class="reputation inc">what little impact</span> ${he} has had is on a local scale only.`); + repX(500, "event"); + for (const arc of V.arcologies) { + if (arc.FSRepopulationFocus !== "unset") { + arc.FSRepopulationFocus += 5; + } else if (arc.FSRestart !== "unset") { + arc.FSRestart -= 10; + } + } + } else if (slave.porn.prestige >= 2 && random(1, 100) > 75) { + r.push(`You turn your FCTV screen off satisfied that your slave has just finished a job very well done. Over the course of the next several weeks, it becomes clear that ${slave.slaveName}'s appearance on "Husbandry With Milly" has had <span class="reputation inc">world changing</span> consequences.`); + if (slave.prestige < 3) { + slave.prestige = 3; + slave.prestigeDesc = "$He is a world renowned inventor of hyperpregnant sex accessories and toys."; + } + repX(25000, "event"); + V.pregInventions = 3; + for (const arc of V.arcologies) { + if (arc.FSRepopulationFocus !== "unset") { + arc.FSRepopulationFocus += 30; + } else if (arc.FSRestart !== "unset") { + arc.FSRestart -= 60; + } + } + V.trinkets.push(`a cut out magazine cover of your world renowned hyperbroodmother inventor, ${slave.slaveName}, and ${his} myriad toys`); + } else if (slave.porn.prestige >= 2 && random(1, 100) > 50) { + r.push(`You turn your FCTV screen off satisfied that your slave has just completed a job well done. Over the course of the next several weeks, it becomes clear that ${slave.slaveName}'s appearance on "Husbandry With Milly" has had a <span class="reputation inc">significant positive impact</span> on public opinion.`); + if (slave.prestige < 2) { + slave.prestige = 2; + slave.prestigeDesc = "$He is a renowned inventor of hyperpregnant sex accessories and toys."; + } + repX(10000, "event"); + V.pregInventions = 2; + for (const arc of V.arcologies) { + if (arc.FSRepopulationFocus !== "unset") { + arc.FSRepopulationFocus += 10; + } else if (arc.FSRestart !== "unset") { + arc.FSRestart -= 20; + } + } + V.trinkets.push(`a cut out magazine cover of your renowned hyperbroodmother inventor, ${slave.slaveName}, and ${his} myriad toys`); + } else if (slave.porn.prestige >= 2 && random(1, 100) > 30) { + r.push(`You turn your FCTV screen off satisfied that your slave has done a satisfactory job. Over the course of the next several weeks, it becomes clear that ${slave.slaveName}'s appearance on "Husbandry With Milly" has had a <span class="reputation inc">significant impact</span> on public opinion, though only at a local level.`); + if (slave.prestige < 1) { + slave.prestige = 1; + slave.prestigeDesc = "$He is a locally respected inventor of hyperpregnant sex accessories and toys."; + } + repX(2500, "event"); + for (const arc of V.arcologies) { + if (arc.FSRepopulationFocus !== "unset") { + arc.FSRepopulationFocus += 5; + } else if (arc.FSRestart !== "unset") { + arc.FSRestart -= 10; + } + } + } else if (slave.porn.prestige >= 2) { + r.push(`You turn your FCTV screen off disappointed that your slave has done a mediocre job. Over the course of the next several weeks, it becomes clear that <span class="reputation inc">what little impact</span> ${he} has had is on a local scale only.`); + repX(500, "event"); + for (const arc of V.arcologies) { + if (arc.FSRepopulationFocus !== "unset") { + arc.FSRepopulationFocus += 5; + } else if (arc.FSRestart !== "unset") { + arc.FSRestart -= 10; + } + } + } else if (random(1, 100) > 90) { + r.push(`You turn your FCTV screen off satisfied that your slave has just finished a job very well done. Over the course of the next several weeks, it becomes clear that ${slave.slaveName}'s appearance on "Husbandry With Milly" has had <span class="reputation inc">world changing</span> consequences.`); + if (slave.prestige < 3) { + slave.prestige = 3; + slave.prestigeDesc = "$He is a world renowned inventor of hyperpregnant sex accessories and toys."; + } + repX(25000, "event"); + V.pregInventions = 3; + for (const arc of V.arcologies) { + if (arc.FSRepopulationFocus !== "unset") { + arc.FSRepopulationFocus += 30; + } else if (arc.FSRestart !== "unset") { + arc.FSRestart -= 60; + } + } + V.trinkets.push(`a cut out magazine cover of your world renowned hyperbroodmother inventor, ${slave.slaveName}, and ${his} myriad toys`); + } else if (random(1, 100) > 70) { + r.push(`You turn your FCTV screen off satisfied that your slave has just completed a job well done. Over the course of the next several weeks, it becomes clear that ${slave.slaveName}'s appearance on "Husbandry With Milly" has had a <span class="reputation inc">significant positive impact</span> on public opinion.`); + if (slave.prestige < 2) { + slave.prestige = 2; + slave.prestigeDesc = "$He is a renowned inventor of hyperpregnant sex accessories and toys."; + } + repX(10000, "event"); + V.pregInventions = 2; + for (const arc of V.arcologies) { + if (arc.FSRepopulationFocus !== "unset") { + arc.FSRepopulationFocus += 10; + } else if (arc.FSRestart !== "unset") { + arc.FSRestart -= 20; + } + } + V.trinkets.push(`a cut out magazine cover of your renowned hyperbroodmother inventor, ${slave.slaveName}, and ${his} myriad toys`); + } else if (random(1, 100) > 50) { + r.push(`You turn your FCTV screen off satisfied that your slave has done a satisfactory job. Over the course of the next several weeks, it becomes clear that ${slave.slaveName}'s appearance on "Husbandry With Milly" has had a <span class="reputation inc">significant impact</span> on public opinion, though only at a local level.`); + if (slave.prestige < 1) { + slave.prestige = 1; + slave.prestigeDesc = "$He is a locally respected inventor of hyperpregnant sex accessories and toys."; + } + repX(2500, "event"); + for (const arc of V.arcologies) { + if (arc.FSRepopulationFocus !== "unset") { + arc.FSRepopulationFocus += 5; + } else if (arc.FSRestart !== "unset") { + arc.FSRestart -= 10; + } + } + } else { + r.push(`You turn your FCTV screen off disappointed that your slave has done a mediocre job. Over the course of the next several weeks, it becomes clear that <span class="reputation inc">what little impact</span> ${he} has had is on a local scale only.`); + repX(500, "event"); + for (const arc of V.arcologies) { + if (arc.FSRepopulationFocus !== "unset") { + arc.FSRepopulationFocus += 5; + } else if (arc.FSRestart !== "unset") { + arc.FSRestart -= 10; + } + } + } + + App.Events.addParagraph(frag, r); + return frag; + } + + function interview() { + const el = document.createElement("p"); + const {title: Master, say: say} = getEnunciation(slave); + const {hisU, heU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U"); + r.push(`The interview starts about halfway into a special episode of "Husbandry with Millie." The show's host is introducing a who's who of important figures in the slave breeding community. As you turn on the show, Millie seems to have just completed another interview.`); + App.Events.addParagraph(el, r); + r = []; + r.push(`"Everybody, give one last round of applause for renowned breakout porn star 'Twinner Jennie'!" she says. "Who'd have thought an eighteen year old slave could be pregnant with their own eighteen year old cloned sister? Quite a world — thank you again for that fascinating interview! Our next guest on 'Husbandry with Millie' is a clever 'broodmother' class breeding slave and mother of ${num(slave.counter.birthsTotal)} children from the ${V.continent} arcology of '${V.arcologies[0].name}.' Everybody, please give a hearty welcome to ${SlaveFullName(slave)}!"`); + App.Events.addParagraph(el, r); + r = []; + r.push(`The first thing that the audience sees of your slave is a colossal ${slave.skin} orb pressing forward through an inadequate looking faux doorway at the rear of the set. "Husbandry with Millie" is a show about breeders and for breeders, and the host, Millie, has seen pregnant slaves of innumerable sizes and descriptions. Despite this, she does a clear double take as your slave enters, and enters, and enters stage right, ${his} grossly distorted belly seeming to go on forever as it precedes ${him}. ${He} is always growing, and you are constantly increasing the size of ${his} menial entourage to ensure ${his} unhindered mobility. As a result, a veritable platoon of masked menials can be seen throwing themselves into your overladen babyfactory before ${his}`); + if (slave.boobs >= 20000) { + r.push(`debilitatingly enormous, mind boggling breasts`); + } else if (slave.boobs >= 3000) { + r.push(`enormous breasts`); + } else if ((slave.boobsImplant / slave.boobs) >= .60) { + r.push(`implant inflated tits`); + } else { + r.push(`upper body`); + } + r.push(`and`); + if (slave.face > 80) { + r.push(`gorgeous face`); + } else if (slave.face > 40) { + r.push(`cute face`); + } else if (slave.face > 1) { + r.push(`unassuming face`); + } else { + r.push(`homely face`); + } + r.push(`come into view.`); + App.Events.addParagraph(el, r); + r = []; + r.push(`Your slave smiles,`); + if (hasBothArms(slave)) { + r.push(`rubbing the side of ${his} belly with one hand while waving at the audience with the other.`); + } else if (hasAnyArms(slave)) { + r.push(`alternating between rubbing the side of ${his} belly and waving at the audience.`); + } else { + r.push(`pushing one arm stump into the side of ${his} belly while waving the other at the studio audience.`); + } + r.push(`After ${he} has entered and taken ${his} place next to the interview couch — rolling forward to lay on ${his} belly so that ${he} can speak at eye level with ${his} interviewer while reclined in relative comfort — more menials enter the stage, carrying portable versions of the specialized maternity swing and moisturizing pool that ${he} has developed.`); + App.Events.addParagraph(el, r); + r = []; + r.push(`"Wow!" Millie says, "You're just about ready to pop, aren't you?"`); + App.Events.addParagraph(el, r); + r = []; + if (canTalk(slave)) { + r.push( + Spoken(slave, `"Mmm,"`), + `your slave ${say}s,` + ); + } else { + r.push(`Your slave nods,`); + } + if (hasAnyLegs(slave)) { + r.push(`crossing ${his} ${legs} over the rearmost swell of ${his} belly,`); + } else { + r.push(`bobbling ${his} leg stumps against the rearmost swell of ${his} belly,`); + } + if (canTalk(slave)) { + r.push(Spoken(slave, `"and I'm more and more ready to pop every day."`)); + } else if (hasAnyArms(slave)) { + r.push(`motioning toward ${his} belly to emphasize the truth of the host's statement.`); + } else { + r.push(`waving ${his} stumps at ${his} belly to emphasize the truth of the host's statement.`); + } + App.Events.addParagraph(el, r); + r = []; + r.push(`"I have to admit, ${slave.slaveName}," Millie says, "you might just be the most heavily pregnant breeder I've ever seen." She motions at your slave's replete body and says: "— May I?"`); + App.Events.addParagraph(el, r); + r = []; + if (canTalk(slave)) { + r.push( + Spoken(slave, `"Please do,"`), + `your slave ${say}s.` + ); + } else if (hasAnyArms(slave)) { + r.push(`Your slave invites the host to touch by patting ${his} belly and then grinning.`); + } else { + r.push(`Your slave nods.`); + } + r.push(He); + if (hasAnyArms(slave)) { + if (slave.boobs >= 20000) { + r.push(`rubs the bases of ${his} gargantuan breasts in hungry anticipation.`); + } else if (slave.boobs >= 3000) { + r.push(`rubs the sides of ${his} enormous breasts in hungry anticipation.`); + } else if ((slave.boobsImplant / slave.boobs) >= .60) { + r.push(`rubs the sides of ${his} fat, implanted tits in hungry anticipation.`); + } else { + if (slave.nipples !== "fuckable") { + r.push(`tweaks`); + } else { + r.push(`fingers`); + } + r.push(`${his} nipples through the sheer fabric of ${his} pretty slave gown while regarding the host with a look of hungry anticipation.`); + } + } else { + if (slave.boobs >= 20000) { + r.push(`pushes ${his} arm stubs into what little of the sides of ${his} gargantuan breasts ${he} can reach, a look of hungry anticipation on ${his} face.`); + } else if (slave.boobs >= 3000) { + r.push(`pushes ${his} arm stubs into the sides of ${his} enormous breasts, a look of hungry anticipation on ${his} face.`); + } else if ((slave.boobsImplant / slave.boobs) >= .60) { + r.push(`pushes ${his} arm stubs into the sides of ${his} fat, implanted tits, a look of hungry anticipation on ${his} face.`); + } else { + r.push(`rubs ${his} arm stubs against ${his} nipples through ${his} pretty slave gown, a look of hungry anticipation on ${his} face.`); + } + } + App.Events.addParagraph(el, r); + r = []; + r.push(`Millie places an appreciative hand on your slave's silk clad flank. The poor ${girl} is so packed full of children that ${his} brood can be seen pressed in outline along the full swell of ${his} belly, and Millie's hand rests on the embossed figure of one such child. The camera zooms in as its form can be clearly made out pushing through the skin of your slave and against the host's touch. It turns over, allowing her to cup its back in her palm. Your slave flexes ${his}`); + if (hasAnyLegs(slave)) { + r.push(legs); + } else { + r.push(`back`); + } + r.push(`and parts ${his}`); + if (slave.lips > 95) { + r.push(`swollen mouth pussy,`); + } else if (slave.lips > 70) { + r.push(`swollen lips,`); + } else if (slave.lips > 20) { + r.push(`lips,`); + } else { + r.push(`thin lips,`); + } + r.push(`making no noise. You know ${him} well enough to understand that the combined pleasure and pain from the talk show host's uncareful touch has caused ${him} to experience one of ${his} "secret little orgasms," and you savor the sight of ${him} squirming as ${he} tries not to let on.`); + App.Events.addParagraph(el, r); + r = []; + r.push(`"So, ${slave.slaveName}," Millie says, not taking her eyes off of the slave's incredibly fecund figure, "why don't you tell us about your inventions?"`); + App.Events.addParagraph(el, r); + r = []; + r.push(`Your slave bites ${his} lip and gives the talk show host a meaningful look.`); + if (canTalk(slave)) { + r.push(Spoken(slave, `"How about I give you a 'hands-on' demonstration instead?"`)); + r.push(`${he} asks.`); + } else if (hasAnyArms(slave)) { + r.push(`${He} signs that ${he}'d like to give her a "hands-on demonstration" instead.`); + } else { + r.push(`One of ${his} menials pushes ${hisU} body into the breeder's enormous stomach in a possessive manner, then turns to regard Millie. "My `); + if (getPronouns(slave).noun === "girl") { + r.push(`mistress`); + } else { + r.push(`master`); + } + r.push(`would like to give you a 'hands-on' demonstration, instead," ${heU} says.`); + } + App.Events.addParagraph(el, r); + r = []; + r.push(`The host quirks an eyebrow, then nods. "Alright," she says. "How about we start with that pool of yours?" She then strips her outer layer of clothing, showing off her own famously heavily pregnant figure in an inadequate bra and panties. She makes her way to the curative jelly filled pool, after your slave has been situated within it. Millie dips a toe into the substance and giggles. "Oh my, it tingles!"`); + App.Events.addParagraph(el, r); + r = []; + if (canTalk(slave)) { + r.push( + Spoken(slave, `"Just wait till you feel it on your belly,"`), + `your slave ${say}s.`, + Spoken(slave, `"It feels`), + App.UI.DOM.makeElement("span", Spoken(slave, `soooo`), "note"), + Spoken(slave, `good."`), + ); + } else if (hasAnyArms(slave)) { + r.push(`${He} signs that the host should get into the pool entirely to feel what it's like on the rest of her swollen body, as well.`); + } else { + r.push(`The slave's menial asks the host to get in and feel what it's like on the rest of her swollen body, as well.`); + } + App.Events.addParagraph(el, r); + r = []; + r.push(`Millie slips into the pool and the camera zooms in as she slowly sidles along its outer edge while being crushed up against your slave's capacious belly. When she's finally seated next to the breeder's vestigial-looking core body, a microphone attached to a boom descends to allow the audience to listen as they continue the interview.`); + App.Events.addParagraph(el, r); + r = []; + r.push(`"This feels great," Millie says. "I've been feeling a bit stretched thin, lately, but I can feel all the tension in my belly just slipping away."`); + App.Events.addParagraph(el, r); + r = []; + if (canTalk(slave)) { + r.push( + Spoken(slave, `"This pool is designed to allow slaves to care for their bodies no matter how large they inflate,"`), + `your slave ${say}s.`, + Spoken(slave, `"— Are you alright?"`), + `${he} asks, wearing a look of mock concern on ${his} face.` + ); + } else if (hasAnyArms(slave)) { + r.push(`Using the hand farthest from Millie, and with the other conspicuously hidden under the goo, your slave signs that the pool is designed to allow slaves to care for their bodies no matter how large they grow. ${He} then signs a request regarding the host's wellbeing, wearing a look of mocking concern on ${his} face.`); + } else { + r.push(`Your slave's speaking assistant explains that the pool is designed to allow slaves and women to care for their bodies no matter how large they inflate. Meanwhile, your slave has been slowly rotating in the pool until ${he} is pressed conspicuously close to the host. The assistant asks if the host is feeling well, a look of mock concern on ${hisU} face.`); + } + App.Events.addParagraph(el, r); + r = []; + r.push(`"Ah! Um, yes — yep! I'm feeling just fine," Millie says. She's blushing furiously and squirming, and you can just make out the outline of your slave performing some form of teasing shenanigans under the distorting effect of the pool's goo. "So — oooh, yes... ${slave.slaveName}, how did you, um, come up with the idea for this pool?"`); + App.Events.addParagraph(el, r); + r = []; + if (canTalk(slave)) { + r.push( + Spoken(slave, `"I'm always trying to think of ways to keep myself pretty for — oh! — my ${Master},"`), + `your slave ${say}s, suddenly squirming ${himself}. Millie has slouched down into the pool and is grinning wickedly as she apparently gets revenge.`, + Spoken(slave, `"This was just the best — um — I mean — the best — oh`), + App.UI.DOM.makeElement("span", Spoken(slave, `fuck, keep`), "note"), + Spoken(slave, ` — I mean, the best method I could think of for doing that."`) + ); + } else if (hasAnyArms(slave)) { + r.push(`Your slave signs that this was the best method ${he} could think of to keep ${himself} pretty for you, given ${his} size, then starts moaning as a grinning Millie seems to have started enacting her revenge.`); + } else { + r.push(`Your slave's speaker explains that this was the best method the broodmother could think of to keep ${himself} pretty for you, given ${his} size. The baby laden breeder starts moaning in the middle of ${his} assistant's description as a grinning Millie seems to have taken this opportunity to start enacting her revenge.`); + } + r.push(`Millie has turned her body sideways and snaked an arm between`); + if (slave.boobs >= 20000) { + r.push(`your slave's astoundingly enormous, slimed up cleavage, pumping it up and down to get their unfathomable mass jiggling while she nibbles at and whispers into the squirming baby machine's ear, just loud enough for the mic to pick it up.`); + } else if (slave.boobs >= 3000) { + r.push(`your slave's massive, slimed up tits, lewdly abusing one breast while she nibbles at and whispers into the squirming baby machine's ear, just loud enough for the mic to pick it up.`); + } else if ((slave.boobsImplant / slave.boobs) >= .60) { + r.push(`your slave's fat, implanted tits, pumping it up and down to get their tightly packed mass bobbing while she nibbles and whispers into the baby machine's ear, just loud enough for the mic to pick it up.`); + } else { + r.push(`your slave's breasts, rubbing it up and down one of ${his} pert nipples while she simultaneously toys with the ridge of one of the baby machine's ears and both nibbles on and whispers into the other, just loud enough for the mic to pick it up.`); + } + App.Events.addParagraph(el, r); + r = []; + r.push( + `"That's quite something," Millie whispers. "I don't know about you, ${slave.slaveName}, but I think I speak for everyone watching today when I say that now seems like a`, + App.UI.DOM.makeElement("span", `really good time`, "note"), + `to try out that other invention of yours."` + ); + App.Events.addParagraph(el, r); + r = []; + r.push(`They both exit the pool, dripping clear, slippery gel onto the wood floor of "Husbandry with Millie"'s set. Without a thorough rinsing, your slave's slathered up belly will be dripping for an hour or more, and ${he} seems to know that as ${he} motions to stop ${his} assistants from wiping ${him} off before strapping ${him} into ${his} aerial gymnastics maternity swing. As a result, when the two visibly panting preggos are strapped into the machine and elevated several `); + if (V.showInches === 2) { + r.push(`feet`); + } else { + r.push(`meters`); + } + r.push(`above the now-visible studio audience, your slave drips a steady stream of goop onto their craning heads.`); + App.Events.addParagraph(el, r); + r = []; + r.push(`"Oops!" Millie says. "Looks like we should have warned our audience about a wet zone for this episode. So, ${slave.slaveName}, why don't we show off all the things this advanced maternity swing of yours can do?"`); + App.Events.addParagraph(el, r); + r = []; + if (canTalk(slave)) { + r.push(Spoken(slave, `"Yes, please,"`)); + r.push(`your slave ${say}s. ${He}'s visibly worked up and ready to go.`); + } else if (hasAnyArms(slave)) { + r.push(`${He} signs, indicating fervent interest.`); + } else { + r.push(`The mute, limbless slave can only moan inchoately in response, but it's clear ${he}'s more than ready.`); + } + App.Events.addParagraph(el, r); + r = []; + r.push(`The two then approach each other in mid air, settling into heavy petting and making out before transition into mechanically assisted scissoring. Your hyperbroodmother's unfathomable belly is hanging sideways and down, jiggling madly mere `); + if (V.showInches === 2) { + r.push(`inches`); + } else { + r.push(`centimeters`); + } + r.push(`above the heads of the studio audience. One particularly adventurous audience member reaches up to place a hand on the slave's stomach to feel it bounce in their hands as ${he} gets fucked, and soon other members of the audience are also reaching up to feel the massive organ. The swing slowly rotates the coupling lovers back and forth over the length of the audience's seats, in a circle, and a wave of eager hands reach up as it does so, caressing your breeder's shaking belly as ${he} gets fucked by the show's moaning host. When Millie and your slave finally convulse in mutual orgasm, the camera zooms in on Millie's face for a close-up. She seems exhausted, but she smiles for it anyway.`); + slave.counter.vaginal++; + App.Events.addParagraph(el, r); + r = []; + r.push( + `"That was`, + App.UI.DOM.makeElement("span", Spoken(slave, `fantastic.`), "note"), + `I'm going to remember that experience for quite some time, and I'm sure our viewers here and at home will, too! Any last things you would like to say before we cut for break?"` + ); + App.Events.addParagraph(el, r); + r = []; + r.push(`The camera rotates to focus on your slave and ${he} shakes ${himself}, apparently regathering ${his} wits.`); + App.Events.addParagraph(el, r); + r = []; + if (V.arcologies[0].FSRepopulationFocus !== "unset") { + if (canTalk(slave)) { + r.push(`"My ${Master}, ${(SlaveStatsChecker.checkForLisp(slave)) ? lispReplace(PlayerName()) : PlayerName()}, has a vision for a beautiful future where baby-laden broodmothers like me aren't the exception in Free Cities society, but the norm. We both hope that everyone here will support us, and so we've hidden certificates for free pools and swings under everyone's seats — everybody look! If you like what you've seen today as much as we hope you have, my ${Master} and I both hope you'll be filling these inventions with your own slaves' swollen bodies, soon. And we hope that, some day, everyone watching at home will feel this way, as well!"`); + } else { + r.push(`Since your slave is unable to speak, ${he} signals the show's video crew to start playing a pre-recorded video in which you explain your vision for a future where specialized hyper-swollen breeding slaves can be found in Free Cities across the world. You then open your arms wide, in the video, and declare that vouchers for free pools and swings have been hidden under the audience's chairs.`); + } + } else { + if (canTalk(slave)) { + r.push(Spoken(slave, `"My ${Master}, ${(SlaveStatsChecker.checkForLisp(slave)) ? lispReplace(PlayerName()) : PlayerName()}, has a vision for a beautiful future where baby-laden broodmothers like me are all able to enjoy sex with their owners and clients. We both hope that everyone here will support us, and so we've hidden certificates for free pools and swings under everyone's seats — everybody look! If you like what you've seen today as much as we hope you have, my ${Master} and I both hope you'll be filling these inventions with your own slaves swollen bodies, soon. And we hope that, some day, everyone watching at home will enjoy hyperpregnant sex with our new toys, too!"`)); + } else { + r.push(`Since your slave is unable to speak, ${he} signals the show's video crew to start playing a pre-recorded video in which you explain your vision for a future where specialized hyper-swollen breeding slaves aren't just a sexual novelty, but enjoyable to fuck in their own right. You then open your arms wide, in the video, and declare that vouchers for free pools and swings have been hidden under the audience's chairs.`); + } + } + r.push(`The camera zooms out for a nice panning shot of the audience exclaiming and fawning over the vouchers they've found taped to the bottom of their chairs. Finally, it fades to black.`); + + App.Events.addParagraph(el, r); + return el; + } + } +}; diff --git a/src/events/RE/rePregInventorInvite.js b/src/events/RE/rePregInventorInvite.js new file mode 100644 index 0000000000000000000000000000000000000000..699c70ad9dd2c9ccc24ed363343e500b73b6ea6a --- /dev/null +++ b/src/events/RE/rePregInventorInvite.js @@ -0,0 +1,351 @@ +App.Events.rePregInventorInvite = class rePregInventorInvite extends App.Events.BaseEvent { + eventPrerequisites() { + return [ + () => V.pregInventor === 0, + ]; + } + + actorPrerequisites() { + return [ + [ + s => s.bellyPreg >= 600000, + s => s.counter.birthsTotal > 30, + s => s.ovaries === 1, + canDoVaginal, + canSee, + s => s.fetish !== "mindbroken", + s => s.fuckdoll === 0, + s => (s.devotion > 90 && s.trust > 50) || s.sexualFlaw === "breeder", + s => s.intelligence + s.intelligenceImplant > 50 + ], + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [slave] = this.actors.map(a => getSlave(a)); + const { + He, His, + he, his, him, himself, girl, + } = getPronouns(slave); + const {himA} = getPronouns(assistant.pronouns().main).appendSuffix("A"); + const {title: Master, say: say} = getEnunciation(slave); + App.Events.drawEventArt(node, slave); + V.pregInventorID = slave.ID; + let r = []; + + r.push( + `Your broodmother,`, + App.UI.DOM.combineNodes(App.UI.DOM.slaveDescriptionDialog(slave), `,`), + `asks to see you, so you have ${him} brought to your office. It takes your menial servants several minutes to safely produce ${him} as ${his} massive, bloated${(V.seeRace === 1) ? `, ${slave.race}` : ``} womb is stretched so thin by its load that the sudden shock to ${his} body if ${he} were dropped might cause ${him} to explode. Both you and your babymaker are used to these circumstances at this point, however, and, as your servants work to lower ${him} to the soft carpeted floor at the center of your office without undue strain to ${his} belly, ${he} shoots you a provocative`); + if (!hasAnyArms(slave)) { + r.push(`grin.`); + } else { + if (slave.boobs >= 20000) { + r.push(`grin and rubs the sides of ${his} debilitatingly large breasts with anticipation.`); + } else if ((slave.boobsImplant / slave.boobs) >= .60) { + r.push(`grin and pushes ${his} augmented tits together to give you a view of ${his} impressive cleavage.`); + } else if (slave.boobs >= 3000) { + r.push(`grin and hefts one of ${his} massive breasts${(hasBothArms(slave)) ? `with both hands` : ``}, sucking on ${his} nipple to give you a show while you wait.`); + } else { + r.push(`grin and tweaks the nipples on ${his} pert breasts.`); + } + } + App.Events.addParagraph(node, r); + r = []; + r.push(`Once ${he} is safely resting on the ground, your slave`); + if (hasAnyArms(slave)) { + r.push(`pushes up against it, stretching so that ${he} `); + if (canSee(slave)) { + r.push(`can look you in the eyes.`); + } else { + r.push(`is face-to-face with you.`); + } + } else { + r.push(`blushes and wiggles ${his} stumps, looking down.`); + } + if (canTalk(slave)) { + r.push(`"${Master}," ${he} ${say}s, "I love being your hyperpregnant brood slave. My poor ${(slave.mpreg === 1) ? `` : `ass`}pussy weeps every time a baby passes through it, and so many have passed through — and, ${Master}, it hurts, sometimes, but I love the feeling of my body stretching fuller and fuller with life every day. There's nothing I want more than to be your`); + if (SlaveStatsChecker.checkForLisp(slave)) { + r.push(lispReplace(SlaveTitle(slave))); + } else { + r.push(SlaveTitle(slave)); + } + r.push(`until my body gives out. So, ${Master}, I really want to give something back to you for making my dreams come true."`); + } else { + if (hasAnyArms(slave)) { + r.push(`${He} signs to you that ${he} wants to give back to you for blessing ${him} with ${his} `); + if (slave.broodmother > 0) { + r.push(`permanently hyperpregnant`); + } else { + r.push(`life-swollen`); + } + r.push(`body.`); + } else { + r.push(`Your personal assistant speaks, probably in response to a nonverbal cue from your slave. ${He} explains that your slave wishes to give back to you for blessing ${him} with ${his} `); + if (slave.broodmother > 0) { + r.push(`permanently hyperpregnant`); + } else { + r.push(`life-swollen`); + } + r.push(`body.`); + } + } + App.Events.addParagraph(node, r); + r = []; + r.push(`The explanation has been going on for a while now, so you motion for your slave to get to the point.`); + if (canTalk(slave)) { + r.push(`"${Master}," ${he} ${say}s, "I want the whole world to love hyperpregnant baby machines as much as I do. I know it's selfish, but I've been looking into ways to make sex with broodmothers even better than it already is. It feels great to get fucked while I'm so packed full and helpless, but, if you'll let me try, I've got some ideas for making it even better for broodmothers. And, more importantly, ${Master}, for you and any other potential partners, too."`); + } else { + if (hasAnyArms(slave)) { + r.push(`${He} explains through gestures that ${he}'s been thinking of ways to make sex with overly pregnant slaves more convenient and enjoyable and would like your permission to develop them.`); + } else { + r.push(`Your assistant explains that the ${girl} has been thinking of ways to make sex with overly pregnant slaves more convenient and enjoyable and would like your permission to develop them.`); + } + } + + App.Events.addParagraph(node, r); + r = []; + r.push(`You consider ${his} offer. Will you support ${him}?`); + App.Events.addParagraph(node, r); + + App.Events.addResponses(node, [ + new App.Events.Result(`No, and remind ${him} of ${his} place.`, no), + new App.Events.Result(`Yes, and offer to help ${him} in a... personal capacity`, yes), + new App.Events.Result(`Yes, and offer to fund ${his} endeavors with ${cashFormat(10000)}`, fund), + ]); + + function no() { + const frag = new DocumentFragment(); + let r = []; + r.push(`You calmly explain to your baby-filled broodmother that ${he} is property and expected to fulfill ${his} duties, not to think. ${He} is not to pursue this matter further.`); + if (slave.trust < -95) { + r.push(`You then rape ${him}, hard, to get your point across, ignoring ${his} moans of pain and the loud complaints from ${his} overfilled womb as it barely holds together under your assault. The bitch is delusional, idolizing ${himself} and ${his} position like this. ${slave.slaveName} has been holding onto sanity by a thread with this idea about loving what ${he} is, but your rejection breaks something fundamental inside of ${him}. ${He}'s a baby machine. ${His} body belongs to you. ${His} brain is just a vestigial accessory to ${his} womb and pussy. <span class="mindbreak">${slave.slaveName} is broken.</span> ${He} will never question ${his} place again.`); + slave.fetish = "mindbroken"; + slave.sexualQuirk = "none"; + slave.sexualFlaw = "none"; + slave.behavioralQuirk = "none"; + slave.behavioralFlaw = "none"; + r.push(VCheck.Vaginal(slave, 1)); + } else if (slave.trust < -20) { + r.push(`You then fuck ${him}, hard, to get your point across, ignoring ${his} moans of pain and the loud complaints from ${his} overfilled womb as it barely holds together under your assault. When you finally get bored and`); + if (V.PC.dick !== 0) { + r.push(`shoot your load into ${his}`); + if (slave.vagina >= 10) { + r.push(`gaping pussy,`); + } else if (slave.vagina > 3) { + r.push(`loose pussy,`); + } else if (slave.vagina >= 1) { + r.push(`vagina,`); + } else { + r.push(`surprisingly resilient, tight little pussy,`); + } + r.push(VCheck.Vaginal(slave, 1)); + } else { + r.push(`clench your legs around ${his} slutty head as ${he} drives your pussy over the edge with ${his} tongue,`); + seX(slave, "oral", V.PC, "penetrative"); + } + r.push(`${he} cries out in a reciprocating orgasm and then cries out a second time when, massive stomach shuddering,`); + if (slave.broodmother > 1) { + r.push(`${he} begins to give birth to yet another child. You call your menials back to your office and decide to take a walk. By the time you're at the door, the head of ${slave.slaveName}'s next child is already cresting.`); + } else if (slave.broodmother === 0 && slave.preg > slave.pregData.minLiveBirth + 1) { + r.push(`${his} water breaks. You call your menials back to your office and decide to take a walk. As you pass by ${him}, it's clear that ${he}'ll have more important things to think about it the coming day.`); + startLabor(slave); + } else { + r.push(`${his} brood shifts precariously. You call your menials back to your office and decide to take a walk. As you pass by ${him}, it's clear that ${he}'ll be more concerned with staying whole than whatever foolish endeavors ${he} was planning.`); + } + r.push(`${slave.slaveName} is now more <span class="gold">fearful.</span>`); + slave.trust -= 4; + } else { + if (canTalk(slave)) { + r.push(`"I'm sorry, ${Master}," ${he} ${say}s, "I just thought, well... nevermind."`); + } else { + if (hasAnyArms(slave)) { + r.push(`${He} motions in apology, trying to hide ${his} extreme disappointment.`); + } else { + r.push(`${He} is mute and limbless, so it is nearly impossible for ${him} to communicate ${his} feelings without a great deal of forward planning and help from your AI assistant. Despite this, you can tell ${he}'s disappointed.`); + } + } + App.Events.addParagraph(node, r); + r = []; + if (hasAnyCyberneticEyes(slave)) { + r.push(`${His} pretty ${App.Desc.eyesColor(slave, "bionic")} flash a shade cooler than normal and you can tell ${he}'s struggling to accept your decision.`); + } else { + r.push(`You can see tears brimming in ${his} ${App.Desc.eyesColor(slave)}.`); + } + r.push(`You kiss ${him} on the head, make sweet love to ${him} to improve ${his} mood, then have ${him} escorted out of your office.`); + r.push(VCheck.Vaginal(slave, 1)); + r.push(`You are certain you made the right choice. If possible, ${slave.slaveName} is now more <span class="devotion inc">devoted.</span>`); + slave.devotion += 5; + } + App.Events.addParagraph(frag, r); + return frag; + } + + function yes() { + const frag = new DocumentFragment(); + let r = []; + r.push(`Being so close to the near-bursting womb of your slave for so long has got your loins stirring, and you hop up onto your desk, bringing your`); + if (V.PC.dick !== 0) { + r.push(`dick`); + } else { + r.push(`vagina`); + } + r.push(`level with the broodmother's mouth. You tell ${him} that you could be convinced to let ${him} explore ${his} interests. ${He} squeals in delight and`); + if (V.PC.dick !== 0) { + r.push(`wraps ${his}`); + if (slave.lips > 95) { + r.push(`plush mouth pussy`); + } else if (slave.lips > 70) { + r.push(`thick, dick sucking lips`); + } else if (slave.lips > 20) { + r.push(`lips`); + } else { + r.push(`thin, almost childlike lips`); + } + r.push(`around your penis.`); + if (canTalk(slave)) { + r.push(`Between ${his} slurping and sucking, ${he} manages to get out enough intelligible words to give you a good idea about the sorts of things ${he} thinks could make sex with an enormously pregnant slave more fun.`); + } else { + if (hasAnyArms(slave)) { + r.push(`While slurping and sucking, ${he} signs to you, communicating ${his} ideas about the sorts of things ${he} thinks could make sex with an enormously pregnant slave more fun.`); + } else { + r.push(`${He} focuses on slurping and sucking on your knob while your personal assistant explains ${his} ideas about the sorts of things ${he} thinks could make sex with an enormously pregnant slave more fun.`); + } + } + } else { + if (canTalk(slave)) { + r.push(`buries ${his} eager tongue in your quim. Between sucking on your clit and moaning, ${he} manages to get out enough intelligible words to give you a good idea about the sorts of things ${he} thinks could make sex with an enormously pregnant slave more fun.`); + } else { + if (hasAnyArms(slave)) { + r.push(`While burying ${his} tongue in your quim, ${he} signs to you, communicating ${his} ideas about the sorts of things ${he} thinks could make sex with an enormously pregnant slave more fun.`); + } else { + r.push(`${He} focuses burying ${his} tongue in your quim while your personal assistant explains ${his} ideas about the sorts of things ${he} thinks could make sex with an enormously pregnant slave more fun.`); + } + } + } + seX(slave, "oral", V.PC, "penetrative"); + r.push(`While you're not interested in giving ${him} the funds necessary to make some of ${his} more outlandish ideas a reality, you're certainly excited by ${his} ideas regarding positions and hyperpregnant vaginal play. You tell ${him} to go for those and ${he} trills in delight, vibrating ${his} tongue`); + if (V.PC.dick !== 0) { + r.push(`along your dick and sending you over the edge. ${He} swallows your load, licking ${his} lips.`); + if (canTalk(slave)) { + r.push( + Spoken(slave, `"Make sure to keep feeding me your cum,"`), + `${he} ${say}s flirtatiously.`, + Spoken(slave, `"I'm eating for a`), + App.UI.DOM.makeElement("span", Spoken(slave, `lot`), "note"), + Spoken(slave, `more than two, after all."`) + ); + } else { + if (hasAnyArms(slave)) { + r.push(`${He} signs to you, begging you to keep feeding ${him} your cum as ${he}'s eating for a lot more than two.`); + } else { + r.push(`${He} then nuzzles your crotch possessively, looking up at your face with devoted eyes.`); + } + } + } else { + r.push(`in your intimate spaces and sending you over the edge. ${He} removes ${himself} from your pussy and licks ${his} lips.`); + if (canTalk(slave)) { + r.push( + Spoken(slave, `"Make sure to keep feeding me your pussy juice,"`,), + `${he} ${say}s flirtatiously.`, + Spoken(slave, `"I'm eating for a`), + App.UI.DOM.makeElement("span", Spoken(slave, `lot`), "note"), + Spoken(slave, `more than two, after all."`) + ); + } else { + if (hasAnyArms(slave)) { + r.push(`${He} signs to you, begging you to keep feeding ${him} your pussy juice as ${he}'s eating for a lot more than two.`); + } else { + r.push(`${He} then nuzzles your crotch possessively, looking up at your face with devoted eyes.`); + } + } + } + App.Events.addParagraph(node, r); + r = []; + r.push(`You congratulate yourself on having made the right decision as ${slave.slaveName} <span class="devotion inc">grows ever closer to you,</span> and ever larger in ${his} middle, over the course of the next week.`); + slave.devotion += 5; + + App.Events.addParagraph(frag, r); + return frag; + } + + function fund() { + const frag = new DocumentFragment(); + let r = []; + r.push(`You are intrigued by ${his} offer.`); + if (hasAnyArms(slave)) { + r.push(`You take ${his}`); + if (V.seeRace === 1) { + r.push(`${slave.race}`); + } + r.push((hasBothArms(slave)) ? `hands` : `hand`); + r.push(`in yours, noting their pleasant softness, and direct ${him} to explain.`); + } else { + r.push(`You place a hand on ${his} exaggerated gut and direct ${him} to explain.`); + } + r.push(`${He} blushes, sexually stimulated by even this minor touch, and`); + if (canTalk(slave)) { + r.push(`describes various ideas ${he}'s had for tools and techniques that could improve an enormously pregnant girl's sexual potential.`); + } else { + if (hasAnyArms(slave)) { + r.push(`signs, describing various ideas ${he}'s had for tools and techniques that could improve an enormously pregnant girl's sexual potential.`); + } else { + r.push(`wiggles a stump, prompting your personal assistant to describe various ideas ${he}'s had for tools and techniques that could improve an enormously pregnant girl's sexual potential.`); + } + } + r.push(`Picturing the actions as ${he} describes them gets`); + if (V.PC.dick !== 0) { + r.push(`you rock hard in short order`); + } else { + r.push(`your pussy dripping with need in short order`); + } + r.push(`and, as the description continues, you move around behind your broodmother, pushing ${him} up onto ${his} tremendous womb so that you can fuck ${him} against it. ${His} belly squashes down slightly under your weight, but less than you'd expect — ${he}'s so packed full of children that ${his} stomach resists changing shape. ${He} wiggles ${his} hips as you`); + if (slave.butt > 11) { + r.push(`sink face first into ${his} warm, room filling ass cleavage`); + } else if (slave.butt > 5) { + r.push(`grab generous handfuls of ${his} humongous ass`); + } else if ((slave.buttImplant / slave.butt) > .60) { + r.push(`rest the weight of your upper body on ${his} implant inflated ass cheeks`); + } else if (slave.butt > 2) { + r.push(`slap ${his} generous ass`); + } else { + r.push(`press down on ${his} petite little ass with your hips`); + } + r.push(`and begin teasing ${his} pussy with`); + if (V.PC.dick !== 0) { + r.push(`the tip of your dick.`); + } else { + r.push(`your fingers.`); + } + App.Events.addParagraph(node, r); + r = []; + if (canTalk(slave)) { + r.push(`"Ooh, ${Master}," your slave ${say}s, "if you keep this up you'll wake the babies."`); + } else { + if (hasAnyArms(slave)) { + r.push(`Your slave signs, teasingly implying that you'll wake the babies.`); + } else { + r.push(`The skin of your slave's monumental belly flushes red and ${he} wiggles ${his} stumps in combined embarrassment and arousal.`); + } + } + App.Events.addParagraph(node, r); + r = []; + r.push(`Despite ${his} complaints, ${he} doesn't seem to mind once you start really fucking ${him} senseless.`); + r.push(VCheck.Vaginal(slave, 1)); + r.push(`Once you've finished melting your swollen "little" sex slave into a puddle of sexually satisfied goo,`); + if (V.PC.dick !== 0) { + r.push(`shooting your load into ${his} wanting pussy,`); + } else { + r.push(`collapsing into orgasm on ${his} bloated body,`); + } + r.push(`you call up your personal assistant, giving ${himA} orders to have your menials collect your exhausted breeder and to ensure ${he} has all the funds necessary to make ${his} perverted dreams a reality. ${slave.slaveName} can only <span class="devotion inc">idolize you.</span>`); + cashX(-10000, "event", slave); + slave.devotion += 15; + V.pregInventor = 1; + + App.Events.addParagraph(frag, r); + return frag; + } + } +}; diff --git a/src/events/RE/rePregInventorShowOff.js b/src/events/RE/rePregInventorShowOff.js new file mode 100644 index 0000000000000000000000000000000000000000..3ae39a2f06480d8fc1cc8671e788c53b39faac0b --- /dev/null +++ b/src/events/RE/rePregInventorShowOff.js @@ -0,0 +1,571 @@ +App.Events.rePregInventorShowOff = class rePregInventorShowOff extends App.Events.BaseEvent { + eventPrerequisites() { + return [ + () => V.pregInventor === 1, + ]; + } + + actorPrerequisites() { + return [ + [ + s => s.ID === V.pregInventorID, + s => s.bellyPreg >= 600000, + s => s.fetish !== "mindbroken", + s => s.fuckdoll === 0, + s => s.devotion > 50 + ], + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [slave] = this.actors.map(a => getSlave(a)); + const { + He, His, + he, his, him, himself, woman, hers + } = getPronouns(slave); + const legs = hasBothLegs(slave) ? `legs` : `leg`; + const arms = hasBothArms(slave) ? `arms` : `arm`; + const {title: Master, say: say} = getEnunciation(slave); + App.Events.drawEventArt(node, slave); + const tvCost = 10000; + let r = []; + + r.push( + `Your broodmother,`, + App.UI.DOM.combineNodes(App.UI.DOM.slaveDescriptionDialog(slave), `,`), + `has been using the resources you gave ${him} to expand the possibilities for sex with hyperpregnant slaves. ${He} has been working hard and is finally ready to show off ${his} results. Your assistant gives you a list of the slave's innovations and you decide to give one a try:` + ); + App.Events.addParagraph(node, r); + + const responses = [ + new App.Events.Result(`Have ${him} show off ${his} developments in the sport of advanced maternity swing gymnastics.`, swing), + new App.Events.Result(`Have ${him} give you a trained assisted strip show`, strip), + ]; + if (V.spa !== 0) { + responses.push(new App.Events.Result(`Enjoy a game of 'jelly' wrestling in your new curative gelatin pool.`, wrestle)); + } + + App.Events.addResponses(node, responses); + + function swing() { + const frag = new DocumentFragment(); + let r = []; + r.push(`${He} is brought into your office alongside ${his} invention: a customized maternity swing. It is a true marvel of Free Cities engineering, resembling something designed for use with large marine mammals rather than a sex aid for a pregnant ${woman}. It has been specially rigged to support both its user and their sexual partner, and to suspend them in the air, enabling them to explore sex positions that would otherwise be rendered impossible by a hyperpregnant slave's mass and size. Just watching the effort your menials expend squeezing the ${SlaveTitle(slave)} into a device that would dwarf a normal person is enough to get you excited, and you're fully ready to enjoy some personal time with ${him} by the time they've hooked you both into the device. The maternity swing is controlled via a vocal command system and, as your menials retreat to give you time alone, you instruct it to lift both you and ${him} into the air.`); + App.Events.addParagraph(frag, r); + r = []; + r.push(`The reinforced silk supports strain slightly under the weight of your slave's belly, but they make no noise, and you soon find yourself suspended in midair with ${his}`); + if (slave.vagina >= 10) { + r.push(`huge, weeping pussy lips`); + } else if (slave.vagina >= 6) { + r.push(`loose pussy`); + } else if (slave.vagina >= 3) { + r.push(`pussy`); + } else { + r.push(`tight little pussy`); + } + r.push(`at perfect eye level. You go down on ${him} to get ${him} primed and enjoy the feeling of`); + if (hasAnyLegs(slave)) { + r.push(`${his} ${legs} wrapping around your head`); + } else { + r.push(`${his} stumps squeezing the sides of your head`); + } + r.push(`as you bring ${him} to climax.`); + seX(slave, "vaginal", V.PC, "penetrative"); + App.Events.addParagraph(frag, r); + r = []; + r.push(`With gentle coaching from your slave, you rotate the two of you in the air so that ${he} can ride you reverse cowgirl style. ${VCheck.Vaginal(slave, 2)} You then switch ${him} around, allowing ${his} belly to eclipse your vision entirely as ${he} rides you in the traditional cowgirl position. The contents of ${his} womb have exploded its weight to the point that this position would have previously been hazardous to both your health and ${hers}, if not completely impossible, and the illusion of having sex while perpetually on the knife's edge of being flattened by literal tons of baby packed slave flesh sends you over the edge. You`); + if (V.PC.dick !== 0) { + r.push(`ejaculate into ${him}, your cum dripping out of ${his} vagina, splattering on the ground below.`); + } else { + r.push(`orgasm as you transition into scissoring with your tightly packed broodmare, keeping the fantasy of being crushed by ${his} body foremost in your mind.`); + } + App.Events.addParagraph(frag, r); + r = []; + r.push(`You explore many other sexual positions before commanding the maternity swing to take you back to earth. You extricate yourself from the device, but leave ${him} inside of it. ${He} does a little twirl in the device, showing off the shape of ${his} hyper-inflated body${(hasAnyLegs(slave)) ? `, the tips of ${his} toes barely touching the ground` : ``}.`); + App.Events.addParagraph(frag, r); + r = []; + if (canTalk(slave)) { + r.push( + Spoken(slave, `"So what did you think, ${Master}?"`), + `${he} asks. ${He} purses ${his} lips, waiting for your response.` + ); + } else { + r.push(`${He} motions to you, making it clear ${he}'s waiting for your judgment.`); + } + slave.devotion += 5; + r.push(followUp()); + App.Events.addParagraph(frag, r); + return frag; + } + + function strip() { + const frag = new DocumentFragment(); + let r = []; + r.push(`The first thing that you notice when your slave walks through the door is the way ${he} struts in with apparent ease. It's been quite a while since you've seen ${him} walk with any sort of elegance, but ${he} does so now. ${He} spins around, giving you a look at ${his}`); + if (slave.butt > 11) { + r.push(`debilitating, insanely enormous ass`); + } else if (slave.butt > 5) { + r.push(`huge ass`); + } else if ((slave.buttImplant / slave.butt) > .60) { + r.push(`implant swollen ass cheeks`); + } else if (slave.butt > 2) { + r.push(`plump ass`); + } else { + r.push(`slender ass`); + } + r.push(`and then shakes ${his} booty, glancing over ${his} shoulder to `); + if (canSee(slave)) { + r.push(`see`); + } else { + r.push(`judge`); + } + r.push(`how you react. You motion for ${him} to continue and ${he} turns around and approaches you, stopping only when ${his} massive belly is looming in front of you, almost touching you. You look over the apex of ${his} stomach to consider the "invention" ${he}'s developed to enable ${his} miraculous mobility.`); + App.Events.addParagraph(frag, r); + r = []; + r.push(`A significant number of menial slaves have been repurposed and specially trained to aid your hyperbroodmother and ${his} incredible belly. These menials,`); + if (V.arcologies[0].FSPaternalist > 60) { + r.push(`outfitted with expensive safety gear to protect them during their potentially dangerous endeavors,`); + } else if (V.arcologies[0].FSRepopulationFocus > 60) { + r.push(`themselves pregnant, though not nearly as large,`); + } else if (V.arcologies[0].FSRestart > 60) { + r.push(`low-quality stock unfit to serve as breeders,`); + } else if (V.arcologies[0].FSPastoralist > 60) { + r.push(`their huge, milky tits squashed up against your slave's body, leaking milk,`); + } else if (V.arcologies[0].FSAssetExpansionist > 60) { + r.push(`their huge tits and asses serving as exotic cushions for the tender flesh of your massively bloated hyperbroodmother,`); + } else if (V.arcologies[0].FSTransformationFetishist > 60) { + r.push(`their huge implanted tits and asses clearly designed to maximize their potential as cushions for your massively bloated hyperbroodmother,`); + } else if (V.arcologies[0].FSPhysicalIdealist > 60) { + r.push(`their impressive muscles rippling as they exert themselves,`); + } else if (V.arcologies[0].FSHedonisticDecadence > 60) { + r.push(`surprisingly strong, given how plush they are, and well suited for their job,`); + } else if (V.arcologies[0].FSChattelReligionist > 60) { + r.push(`dressed in skimpy monks habits and eyes flashing with exalted fervor as they go about their duties,`); + } else if (V.arcologies[0].FSYouthPreferentialist > 60) { + r.push(`just barely the legal age for consent in your arcology and clearly eager to prove themselves,`); + } else if (V.arcologies[0].FSMaturityPreferentialist > 60) { + r.push(`plush MILFs who support your hyperbroodmother's insane pregnancy with a hint of maternal affection,`); + } else if (V.arcologies[0].FSSlimnessEnthusiast > 60) { + r.push(`lithe and possessed of wiry strength,`); + } else if (V.arcologies[0].FSStatuesqueGlorification > 60) { + r.push(`impressively tall and quite capable of handling your massively bloated hyperbroodmother,`); + } else if (V.arcologies[0].FSPetiteAdmiration > 60) { + r.push(`tiny and trying their hardest to move ${him},`); + } else if (V.arcologies[0].FSSlaveProfessionalism > 60) { + r.push(`quick witted slaves who flawlessly redirect attention to your hyperpregnant star,`); + } else if (V.arcologies[0].FSIntellectualDependency > 60) { + r.push(`very aroused and having trouble staying focused when so intimately close to such an expanse of flesh,`); + } else if (V.arcologies[0].FSRomanRevivalist > 60) { + r.push(`dressed in a skimpy reproduction of roman legionary garb,`); + } else if (V.arcologies[0].FSNeoImperialist > 60) { + r.push(`dressed in skimpy bodysuits that outline their tight bodies,`); + } else if (V.arcologies[0].FSAztecRevivalist > 60) { + r.push(`clad only in exotic feathers,`); + } else if (V.arcologies[0].FSEgyptianRevivalist > 60) { + r.push(`dressed in `); + if (hasAnyLegs(slave)) { + r.push(`ankle-length`); + } else { + r.push(`long`); + } + r.push(`tarkhans made of brass and turquoise colored beads,`); + } else if (V.arcologies[0].FSEdoRevivalist > 60) { + r.push(`dressed in skimpy noh theater costumes,`); + } else if (V.arcologies[0].FSArabianRevivalist > 60) { + r.push(`their sinful figures made modest by roomy abayas,`); + } else if (V.arcologies[0].FSChineseRevivalist > 60) { + r.push(`clad in traditional silk chang'ao and lotus shoes,`); + } else { + r.push(`their clothing specifically chosen to supplement and flatter your hyperbroodmother's own outfit,`); + } + r.push(`act to support ${his} movements as ${he} teases you, seemingly heedless of their own safety. Their ego has been subsumed in pursuit of their duties and, as they fall into place to hold up ${his} gargantuan belly with each of ${his} slightest, most thoughtless movements, they give you the impression of being more extensions of ${his} will than independent beings. Your hyperbroodmother leans forward, just the slightest bit, as you consider ${his} assistants, and presses ${his} unfathomable stomach into your crotch. As ${he} does so, two of ${his} assistants slide under ${his} belly with practiced ease, cushioning it with their bodies to prevent it from touching the cold ground. No sound passes their lips as the gargantuan organ crushes down on them, but you can hear their bones creak.`); + App.Events.addParagraph(frag, r); + r = []; + if (canTalk(slave)) { + r.push(Spoken(slave, `"Oooh, someone likes what they see,"`)); + r.push(`${he} ${say}s.`); + } else { + r.push(`${He} can't speak, but ${he} does grin and roll ${his} belly up and down your lap for a moment, ${his} servants lifting and supporting ${him} from the periphery such that ${he} seems to be in casual control of ${his} immobilizing bulk.`); + } + App.Events.addParagraph(frag, r); + r = []; + r.push(`It is only then that you realize that`); + if (V.PC.dick !== 0) { + r.push(`your dick is as hard as a length of steel.`); + } else { + r.push(`your kitty is positively drowning in fem-cum.`); + } + r.push(`You move to touch ${his} belly, but ${he} steps backward, leaving it just out of reach.`); + App.Events.addParagraph(frag, r); + r = []; + if (canTalk(slave)) { + r.push( + Spoken(slave, `"If you'll permit, ${Master},"`), + `${he} ${say}s teasingly,`, + Spoken(slave, `"I'd like to show off my 'invention' just a little longer."`) + ); + } else { + r.push(`${He} smirks and`); + if (hasAnyArms(slave)) { + r.push(`motions to you that ${he}'d like to tease you just a little longer.`); + } else { + r.push(`one of ${his} servants, seeming to read their mistress's mind, motions to you that your slave has something big to show off still.`); + } + } + App.Events.addParagraph(frag, r); + r = []; + r.push(`You motion for ${him} to continue.`); + if (hasAnyArms(slave)) { + r.push(`${He} lifts ${his} ${arms} over ${his} head and begins to spin again, giving you a glorious view of ${his}`); + } else { + r.push(`${His} servants spin ${him} again, giving you a glorious view of ${his}`); + } + if (slave.boobs >= 20000) { + r.push(`eye wateringly massive tits`); + } else if (slave.boobs >= 3000) { + r.push(`huge tits`); + } else if ((slave.boobsImplant / slave.boobs) >= .60) { + r.push(`luscious, augmented tits`); + } else { + r.push(`petite breasts`); + } + r.push(`and`); + if (slave.butt > 11) { + r.push(`couch smothering ass cheeks.`); + } else if (slave.butt > 5) { + r.push(`enormous ass.`); + } else if ((slave.buttImplant / slave.butt) > .60) { + r.push(`implant-filled ass.`); + } else if (slave.butt > 2) { + r.push(`delicious looking ass.`); + } else { + r.push(`small ass.`); + } + r.push(`As ${he} spins, ${his} servants support ${his} motions, using their own bodies to cushion and propel ${him} in the direction ${he} wants. They move in a limp manner that seems to blend into ${his} body, keeping the focus of your attention on your slave's form rather than theirs. One enters your office with a portable stripper stage, complete with pole, and your slave makes ${his} way over to it.`); + if (canTalk(slave)) { + r.push( + Spoken(slave, `"There were some... sacrifices,"`), + `${he} ${say}s,`, + Spoken(slave, `"to get where we are today."`) + ); + if (hasAnyArms(slave)) { + r.push(`${He} raises ${his} ${arms} as ${his} myriad servants plaster themselves to ${his} monolithic body, raising ${his} considerable bulk to a sufficient height to allow ${him} to take hold of the pole.`); + } else { + r.push(`${He} raises a dainty stub and one of ${his} myriad servants, pressed back to back with ${him} to help support ${his} weight as the others push ${him} into position, snakes a hand upward, creating the illusion that, for just this moment, your amputee broodmother is whole once more and grabbing onto the pole.`); + } + } else { + if (hasAnyArms(slave)) { + r.push(`${He} motions to you that there were some sacrifices, raising ${his} ${arms} as ${his} myriad servants plaster themselves under ${his} monolithic belly, raising ${his} considerable bulk to sufficient height to allow ${him} to take hold of the pole.`); + } else { + r.push(`The servant serving as the "mouth" for your mute, limbless hyperpregnant slave motions to you that there were some sacrifices. Your slave raises a dainty stub and one of ${his} myriad servants, pressed back to back with ${him} to help support ${his} weight as the others push ${him} into position, snakes a hand upward, creating the illusion that, for just this moment, your amputee broodmother is whole once more and grabbing onto the pole.`); + } + } + App.Events.addParagraph(frag, r); + r = []; + if (canTalk(slave)) { + r.push(Spoken(slave, `"I think you'll find, though..."`), `${he} ${say}s.`); + } else if (hasAnyArms(slave)) { + r.push(`${He} motions that "${he} believes you'll find," then falls into a coy silence.`); + } else { + r.push(`${His} mouthpiece motions that your slave "believes you'll find," then falls into a coy silence.`); + } + App.Events.addParagraph(frag, r); + r = []; + r.push(`${He}'s spinning around the pole now, reminding you of ${his} earlier motions. ${He} seems weightless, ${his} massive bulk perfectly supported regardless of the personal cost to those supporting ${him}. Your gaze turns to several motionless servants who have been knocked unconscious by ${his} careening bulk. They're piled up against a side wall, but inconspicuous. You can't recall when they collapsed, or when they were dragged away. The passiveness with which your slave's glorified human clothing moves makes even the collapsed menials seem natural and perfectly reasonable — just something that happens when your hyperbroodmother exercises ${his} body, sometimes. Not an abuse of another person. More like flexing a limb.`); + App.Events.addParagraph(frag, r); + r = []; + r.push(`${His} servants surge upward, piling on top of each other and rotating ${him}. ${He} flips upside down and, for a moment, you worry that ${he} might fall with disastrous consequences. The mass of human bodies working in tandem to protect and enable ${him} executes its motions in perfect synchrony, however, and you are treated to the sight of an impossibly pregnant slave spinning upside down, hooking one`); + if (hasAnyLegs(slave)) { + r.push(legs); + } + r.push(`around a stripper pole, and performing a slow, effortless body inversion, ${his} massive upside down belly rotating just a split second slower than the rest of ${him}. ${He} rotates some more and then flips back into a normal standing position, leaning over ${his} stomach and once again slightly crushing ${his} now visibly exhausted servants as ${he} performs a mock bow.`); + App.Events.addParagraph(frag, r); + r = []; + if (canTalk(slave)) { + r.push( + Spoken(slave, `"That it was worth it!"`), + `${he} ${say}s, finishing ${his} earlier statement.`, + Spoken(slave, `"So, what do you think?"`), + `${he} asks. ${He} seems not even slightly out of breath.` + ); + } else if (hasAnyArms(slave)) { + r.push(`${He} motions to you, communicating the last part of ${his} earlier message: "that it was worth it!" ${He} then indicates that ${he} is waiting for your opinion. You note that ${he} hasn't even broken a sweat.`); + } else { + r.push(`${His} mouthpiece motions to you, communicating the last part of the message your slave started earlier: "that it was worth it!" The menial then indicates that your slave is waiting for your opinion of ${his} work. You note that your hyperbroodmother hasn't even broken a sweat.`); + } + r.push(followUp()); + App.Events.addParagraph(frag, r); + return frag; + } + + function wrestle() { + const frag = new DocumentFragment(); + let r = []; + r.push(`Your slave asks you to meet ${him} in your spa. Upon entering, you take a moment to enjoy the`); + if (V.spaDecoration === "Paternalist") { + r.push(`sight of the opulently appointed pools and the intellectually stimulating shows streaming from the many screens set on the walls of the room.`); + } else if (V.spaDecoration === "Repopulationist") { + r.push(`sight of all of the maternity aid devices scattered throughout the room. Whatever the nature of ${his} invention, your slave's toy is guaranteed to fit in well in these particular baths.`); + } else if (V.spaDecoration === "Eugenics") { + r.push(`sight of the dualistic, caste based facilities.`); + } else if (V.spaDecoration === "Pastoralist") { + r.push(`faint smell of milk that wafts through the room with the steam and the sight of the many aid devices that your hypermassive slaves absolutely require to make use of the facilities.`); + } else if (V.spaDecoration === "Asset Expansionist") { + r.push(`sight of the aid equipment that your hypermassive slaves absolutely require to make use of the facilities.`); + } else if (V.spaDecoration === "Transformation Fetishist") { + r.push(`sight of the various surgical recovery devices scattered throughout the room.`); + } else if (V.spaDecoration === "Physical Idealist") { + r.push(`sight of the various light impact workout machines scattered throughout the room.`); + } else if (V.spaDecoration === "Hedonistic") { + r.push(`smell of the lavishly appointed cornucopias of food scattered around the facility's many opulent pools.`); + } else if (V.spaDecoration === "Chattel Religionist") { + r.push(`sight of the ritual pools and the various icons of the faith scattered throughout the room.`); + } else if (V.spaDecoration === "Youth Preferentialist") { + r.push(`carnival atmosphere created by the waterpark theming of the facilities.`); + } else if (V.spaDecoration === "Gender Radicalist") { + r.push(`sight of the extreme penetration based pornography feeds streaming from the many screens set on the walls of the room.`); + } else if (V.spaDecoration === "Gender Fundamentalist") { + r.push(`sight of the traditionalist pornographic feeds streaming from the many screens set on the walls of the room.`); + } else if (V.spaDecoration === "Maturity Preferentialist") { + r.push(`sight of the many businesslike, beautifying devices and service stations scattered throughout the room.`); + } else if (V.spaDecoration === "Slimness Enthusiast") { + r.push(`comfortable atmosphere of the facilities.`); + } else if (V.spaDecoration === "Degradationist") { + r.push(`sight of the all-seeing cameras scattered throughout the room. You give a nod to one of the obvious ones, knowing there's an audience watching.`); + } else if (V.spaDecoration === "Roman Revivalist") { + r.push(`sight of the sexual mosaics at the bottom of its spacious baths.`); + } else if (V.spaDecoration === "Aztec Revivalist") { + r.push(`sight of its golden idols and exotic animal trophies as well as the warm smell of tropical herbs.`); + } else if (V.spaDecoration === "Egyptian Revivalist") { + r.push(`heavy perfumed air pervading the room and the sight of its warm, reed lined pools.`); + } else if (V.spaDecoration === "Edo Revivalist") { + r.push(`steam rising up off of the stone-lined onsen pools.`); + } else if (V.spaDecoration === "Arabian Revivalist") { + r.push(`vibrant tilework and the smell of the heavy perfume in the steamy air.`); + } else if (V.spaDecoration === "Chinese Revivalist") { + r.push(`stultifying, gloomy atmosphere pervading the room.`); + } else if (V.spaDecoration === "Body Purist") { + r.push(`comfortable atmosphere of the facilities.`); + } else if (V.spaDecoration === "Neo-Imperialist") { + r.push(`sight of the verdant greenery, brilliant high-tech lighting, and steaming central bath.`); + } else { + r.push(`sight of its spacious baths and pleasant atmosphere.`); + } + r.push(`Your eyes then fall on what must be ${his} invention: a new pool, set in a corner. It's not Olympic size, but it is quite large compared to most of your other pools — a large oval — and it is completely filled with a clear, gooey substance. Lounging in it, facing you and with ${his} massive belly poking out just far enough for you to enjoy the sight of ${his} bulging "outie" belly button, is your slave, wearing an attractive bikini that seems to be soaked through with whatever goo is filling the pool. ${He}`); + if (hasAnyArms(slave)) { + r.push(`waves at you and then gently rolls forward onto ${his} astounding pregnancy,`); + } else { + r.push(`waves a stub at you and then pokes it at a holographic remote array hovering nearby. A mobility assistance device in the pool rolls ${him} forward onto ${his} astounding pregnancy,`); + } + if (slave.boobs >= 20000) { + r.push(`causing ${his} insanely enormous tits to flop onto the tile at the pool's edge with a loud "thwack."`); + } else if (slave.boobs >= 3000) { + r.push(`resting ${his} enormous breasts on the pool's edge, causing them to push up into ${his} chin as ${he} looks up at you.`); + } else if ((slave.boobsImplant / slave.boobs) >= .60) { + r.push(`resting ${his} huge, implant-distended tits on the pool's edge, causing them to push up into ${his} chin as ${he} looks up at you.`); + } else { + r.push(`giving you a nice view of ${his} cute tits.`); + } + App.Events.addParagraph(frag, r); + r = []; + if (canTalk(slave)) { + r.push( + Spoken(slave, `"Hi, ${Master},"`), + `${he} ${say}s.`, + App.UI.DOM.makeElement("span", Spoken(slave, `"Oooooh...`), "italic"), + Spoken(slave, `you have no idea how good this feels. My aching belly is warmed all through — well? Why don't you come in and I'll explain things."`), + ); + } else if (hasAnyArms(slave)) { + r.push(`${He} motions to you in more formal greetings and then lets out an involuntary moan of pleasure, rubbing at the sides of ${his} tremendous belly. ${He} beckons you to enter the pool.`); + } else { + r.push(`${He} is limbless as well as mute, so ${he} can't greet you more formally, but ${his} pleasurable, incomprehensible moaning and the way ${he} presses ${his} stumps into ${his} monstrously inflated, baby packed belly makes it clear to you that ${he}'s happy to see you. You decide to get into the pool to try out your slave's invention for yourself.`); + } + App.Events.addParagraph(frag, r); + r = []; + r.push(`You strip and put on one of the swimming outfits that are stored in the baths for your personal use, then slide yourself into the pool, squeezing in between its wall and your hyperswollen broodmother. The gel has a medicinal scent masked by lavender and is the perfect warmth to ease your muscles as you slide into it. Your skin tingles at its touch.`); + App.Events.addParagraph(frag, r); + r = []; + if (canTalk(slave)) { + r.push( + Spoken(slave, `"It's curative jelly,"`), + `your slave explains.`, + Spoken(slave, `"I'm so big, now, it takes most of the day to moisturize my poor belly, even with help. With this jelly pool, it only takes a few minutes. I'm sure this pool can help all sorts of slaves with big assets so that they can keep themselves looking pretty for their ${Master}."`) + ); + } else { + if (hasAnyArms(slave)) { + r.push(`${He} motions to you, explaining in sign that the pool is filled with curative gel. It's designed to help slaves with enormous assets moisturize their oversized bodies without having to spend all day applying it manually.`); + } else { + r.push(`Your personal assistant chimes in to explain that the pool is filled with curative gel. It's designed to help slaves with enormous assets moisturize their oversized bodies without having to spend all day applying it manually.`); + } + } + App.Events.addParagraph(frag, r); + r = []; + if (hasAnyArms(slave)) { + r.push(`${He} presses a few buttons on a holographic remote array`); + } else { + r.push(`${He} nods a signal`); + } + r.push(`and a series of silk-lined spherical rollers at the base of the pool come to life, humming as they spin ${his} laden body around. ${He} pushes into your chest, rotating forward so that ${his}`); + if (slave.boobs >= 20000) { + r.push(`colossal breasts spread out around you, completely surrounding your head. With some effort, you part ${his} heavy cleavage enough to be able to continue listening to ${him} without being smothered.`); + } else if (slave.boobs >= 3000) { + r.push(`massive chest fills the space between you, blocking your view of ${his} face. You spread ${his} cleavage enough to be able to continue listening to ${him}.`); + } else if ((slave.boobsImplant / slave.boobs) >= .60) { + r.push(`fat, implanted tits fill the space between you, blocking your view of ${his} face. With some effort, you spread ${his} tightly packed, spherical cleavage enough to be able to continue listening to ${him}.`); + } else { + r.push(`spherical belly pushes into your crotch.`); + } + if (hasAnyArms(slave)) { + r.push(`${He} then reaches out and, after you nod that ${he} can continue, ${he} caresses your face.`); + } else { + r.push(`${He} then reaches out to caress your face, but blushes and stops the motion as ${he} remembers that ${he} is physically unequipped to do so.`); + } + r.push(`${His} weight falls onto you and pushes you into the cushioned wall of the pool. The wall gives beneath your combined bulk, swelling down and outward to accommodate and support you.`); + App.Events.addParagraph(frag, r); + r = []; + if (canTalk(slave)) { + r.push( + Spoken(slave, `"Do you like it, ${Master}?"`), + `${he} asks.`, + Spoken(slave, `"It's built to grow and change as your slaves do. It should be the perfect size to support them, no matter what that size might be. And if we ever get too big for even that, well..."`), + `${he} smiles and you realize that, between the feeling of ${his} heavy, slick mass pressing into you and the rejuvenating effect of the gel,`); + if (V.PC.dick !== 0) { + r.push(`you're hard as a rock and`); + } else { + r.push(`your pussy is absolutely weeping and you are`); + } + r.push(`as refreshed and eager to fuck as you've been in quite some time.`); + r.push(Spoken(slave, `"We can always just make it... bigger."`)); + } else { + if (hasAnyArms(slave)) { + r.push(`${He} motions to you, explaining that the pool is designed to grow to accommodate and support its users, then smiles. You realize that, between the feeling of ${his} heavy, slick mass pressing into you and the rejuvenating effect of the gel,`); + if (V.PC.dick !== 0) { + r.push(`you're hard as a rock${(V.PC.vagina > -1) ? `, your pussy is absolutely weeping,` : ``} and`); + } else { + r.push(`your pussy is absolutely weeping and you are`); + } + r.push(`as refreshed and eager to fuck as you've been in quite a while.`); + } else { + r.push(`Your personal assistant explains that the pool has been designed to grow to accommodate and support its users. You're only half-listening to what ${he} is saying, however, as you have suddenly realized that, between the feeling of your slave's heavy, slick mass pressing into you and the rejuvenating effect of the gel,`); + if (V.PC.dick !== 0) { + r.push(`you're hard as a rock and`); + } else { + r.push(`your pussy is absolutely weeping and you are`); + } + r.push(`as refreshed and eager to fuck as you've been in quite a while.`); + } + } + App.Events.addParagraph(frag, r); + r = []; + r.push(`Your arousal gives you an idea, and you push back on your hyperbroodmother's colossal belly. ${He} steps away from you until ${he} is in the center of the pool, a look of confusion on ${his} face. You take control of the remote and then manipulate the reticulating frame supporting the pool such that it lifts the floor, slowly rendering both you and your colossal-bellied breeder knee deep in the warm gel. You hunker down into an aggressive, combative stance and`); + if (hasAnyCyberneticEyes(slave)) { + r.push(`${his} ${App.Desc.eyesColor(slave, "synthetic")} flash white for a moment as a look of understanding dawns on ${his} face.`); + } else { + r.push(`a look of understanding lights up in ${his} ${App.Desc.eyesColor(slave)}.`); + } + if (!canTalk(slave)) { + if (hasAnyArms(slave)) { + r.push(`${He} waves ${his} ${arms} in mock dismay`); + if (slave.skill.combat > 0) { + r.push(`and lowers ${his} guard`); + } + r.push(`as you prepare to wrestle ${him} in the pool of goop.`); + } else { + r.push(`${He} waves ${his} stubs in mock dismay as you prepare to wrestle ${him} in the pool of goop.`); + } + } else { + r.push(Spoken(slave, `"Oh no,"`), `${he} ${say}s in mock dismay${(slave.skill.combat > 0) ? `, lowering ${his} guard` : ``}. "My ${Master} is going to wrestle me into submission in this hot, heavy, goo pool. Whatever will I do?"`); + } + r.push(`You circle around ${him}, slowly approaching ${him}, and ${he} uses the pool's mobility assistance tools to rotate ${his} body so that ${he} can just barely keep you in ${his} gaze, drizzling gel over ${his} belly as ${he} keeps it between you and ${him} to use as a protective barrier. When you're close enough to touch the apex of ${his} fecund body, you leap forward through the gel, diving to one side and disappearing under it. Your momentum carries you a reasonable distance despite the resistance of the thick substance and you pop back up directly behind ${him}. You grab ${him} under ${his} armpits, pressing your`); + if (V.PC.dick !== 0) { + r.push(`rigid dick against ${his}`); + } else { + r.push(`engorged pussy lips against ${his}`); + } + if (slave.butt > 7) { + r.push(`enormous, gel-slicked ass,`); + } else if (slave.butt > 4) { + r.push(`plush, gel-slicked ass,`); + } else if ((slave.buttImplant / slave.butt) > .60) { + r.push(`implant-filled, gel-slicked ass,`); + } else if (slave.butt > 2) { + r.push(`perfect, gel-slicked ass,`); + } else { + r.push(`small, gel-slicked ass,`); + } + r.push(`and throw your weight backward to bring you both to the ground. ${He}'s far too enormous to make this achievement doable with anything less than superhuman strength, but the mobility assistance devices engage as you move, and the two of you slowly collapse into the warm jelly.`); + r.push(VCheck.Vaginal(slave, 1)); + r.push(`After you've fucked ${him} near senseless, enjoying ${his} struggles to keep abreast of the smothering gel as you abuse ${his} pussy, you both retire to the side of the pool and ${he} presses into you, nuzzling your neck and`); + if (canTalk(slave)) { + r.push(`asking you what you think of ${his} invention.`); + } else { + if (hasAnyArms(slave)) { + r.push(`motioning to you, asking you what you think of ${his} invention.`); + } else { + r.push(`waving a stub in the air. As if on cue, your personal servant asks you what you think of your broodmother's invention.`); + } + } + r.push(followUp()); + App.Events.addParagraph(frag, r); + return frag; + } + + function followUp() { + const div = document.createElement("div"); + const responses = [ + new App.Events.Result(`Insult ${him} and halt all further training.`, halt), + new App.Events.Result(`Compliment ${him} but keep ${his} discoveries to yourself.`, keep), + ]; + if (V.FCTV.receiver > 0) { + responses.push(new App.Events.Result(`Organize a televised demonstration of ${his} skills.`, tv, `This will cost ${cashFormat(tvCost)}`)); + } + + App.Events.addResponses(div, responses); + return div; + + function halt() { + const frag = new DocumentFragment(); + let r = []; + r.push(`As much as ${his} antics amused you, it's clear that ${slave.slaveName} wasted your money. You calmly explain to ${him} that the next time ${he} has a "brilliant" idea, ${he} should keep it to ${himself}, then arrange to have ${his} "discoveries" disposed of.`); + if (slave.trust < -95) { + r.push(`The look of pride and accomplishment on ${his} face transforms into a look of crushing disappointment. You slap ${him} on the ass and then have your menials escort ${him} back to ${his} duties. The next time you see ${him}, the spark of life and vitality that drove ${him} has been fully extinguished. <span class="mindbreak">${slave.slaveName} has broken.</span> Anything ${he} might have learned from this experience is lost in ${his} empty mind. ${He} will never question ${his} place, or anything else, again.`); + slave.fetish = "mindbroken"; + } else if (slave.trust < -20) { + r.push(`The look of pride and accomplishment on ${his} face transforms into a look of crushing disappointment. ${He} apologizes for wasting your time and, cognizant of the power you hold over ${him}, promises never to do so again. <span class="trust dec">${slave.slaveName} is now more fearful.</span> Though ${he} never bothers you with ${his} "ideas" again, you can tell <span class="mediumorchid">${he} no longer regards you as highly.</span>`); + slave.trust -= 4; + slave.devotion -= 10; + } else { + r.push(`The look of pride and accomplishment on ${his} face transforms into a look of disappointment. <span class="trust dec">${slave.slaveName} finds you less trust worthy</span> as a result of your unkindness, but ${he} soon gets over ${his} disappointment and begins thinking of ways to truly impress you.`); + slave.trust -= 4; + } + App.Events.addParagraph(frag, r); + return frag; + } + + function keep() { + const frag = new DocumentFragment(); + let r = []; + r.push(`You are impressed by ${his} ideas and arrange to have them implemented in a limited way in your arcology. You also arrange to keep ${his} discoveries secret, so as to hoard all the enjoyment of them for yourself. ${slave.slaveName} doesn't mind. ${He} is <span class="devotion inc">simply happy</span> to have pleased you and <span class="trust inc">trusts your intentions will benefit ${him}.</span>`); + V.pregInventions = 1; + slave.trust += 2; + slave.devotion += 5; + App.Events.addParagraph(frag, r); + return frag; + } + + function tv() { + const frag = new DocumentFragment(); + let r = []; + r.push(`You are so impressed by ${his} ideas that you arrange to have ${him} demonstrate ${his} discoveries on a prominent FCTV talk show. It will take some time, and you'll have to insure that ${he}'s at least reasonably well known before the show's executives will agree to allow ${him} on-air, but you're certain that ${slave.slaveName}'s name will soon be on the lips of pregnancy-loving slaveowners and Free Cities citizens around the world. In the meantime, you implement ${his} ideas around the arcology. ${He} is <span class="devotion inc">thrilled</span> to have pleased you so much that you would <span class="trust inc">put such faith in ${his} ideas.</span>`); + cashX(-tvCost, "event", slave); + V.pregInventor = 2; + V.pregInventions = 1; + slave.trust += 4; + slave.devotion += 10; + App.Events.addParagraph(frag, r); + return frag; + } + } + } +}; diff --git a/src/events/RE/reRelativeRecruiter.js b/src/events/RE/reRelativeRecruiter.js index f1405dfab40662fb03dfc121b94e4d8c92211756..340d7aaeb9305fd083d4f63a3ccf9ff2a21fbf00 100644 --- a/src/events/RE/reRelativeRecruiter.js +++ b/src/events/RE/reRelativeRecruiter.js @@ -485,7 +485,7 @@ App.Events.RERelativeRecruiter = class RERelativeRecruiter extends App.Events.Ba slave.skill.oral = 35; slave.skill.anal = 75; slave.hLength = random(10, 20); - slave.hStyle = either("buzzcut", "long", "neat", "trimmed"); + slave.hStyle = either("buzzcut", "neat", "trimmed"); slave.voice = 1; slave.energy = 0; slave.balls = 0; diff --git a/src/events/RE/reRoyalBlood.js b/src/events/RE/reRoyalBlood.js index a6b9ab51044100081d3e45246a0881c091a6be27..775ab9641a222d49a4a9d5d33a03a5256885b59c 100644 --- a/src/events/RE/reRoyalBlood.js +++ b/src/events/RE/reRoyalBlood.js @@ -598,6 +598,7 @@ App.Events.RERoyalBlood = class RERoyalBlood extends App.Events.BaseEvent { slave.skill.oral = 0; setHealth(slave, jsRandom(30, 60), 0, 0, 0, 0); slave.behavioralFlaw = either("arrogant", "bitchy"); + setMissingParents(slave); // set .father so the prince will be a full sibling return slave; } diff --git a/src/events/RE/reShelterInspection.js b/src/events/RE/reShelterInspection.js index 5931bcc201462d1fc0f3957139d6827b7f0475f4..496ca07c5069ae3f67b764918f06925cf72dad98 100644 --- a/src/events/RE/reShelterInspection.js +++ b/src/events/RE/reShelterInspection.js @@ -256,11 +256,10 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.B function allow() { let r = []; const el = new DocumentFragment(); - let _inspectionContinues = 1; r.push(`You have ${him2} ushered up to your office, and order ${inspectee.slaveName} brought in.`); /* - + let _inspectionContinues = 1; if (isAmputee(inspectee) && !isAmputee(originSlave)) { r.push(`You may have lopped off the poor ${girl}'s arms and legs, a fact not lost on the inspector. ${He2} can barely conceal ${his2} terror as ${he2} makes lengthy notes on ${his2} tablet before practically running out of the penthouse.`); V.shelterAbuse += 10; diff --git a/src/events/RECI/butthole.js b/src/events/RECI/butthole.js index a1d8fe295ef7589033591bf957c8309f36137660..0f87c857782f4e189d5469a6bb2b5661fb6804c2 100644 --- a/src/events/RECI/butthole.js +++ b/src/events/RECI/butthole.js @@ -15,7 +15,7 @@ App.Events.RECIButthole = class RECIButthole extends App.Events.BaseEvent { canWalk, canSee, canHear, - s => s.anus > 1 && s.anus < 4, + s => s.anus.isBetween(1, 4), s => s.analArea > 1, ] ]; @@ -26,7 +26,7 @@ App.Events.RECIButthole = class RECIButthole extends App.Events.BaseEvent { let [eventSlave] = this.actors.map(a => getSlave(a)); const { // eslint-disable-next-line no-unused-vars - He, he, His, his, hers, him, himself, girl, woman, loli + He, he, His, his, him, himself, girl, woman, loli } = getPronouns(eventSlave); const {title: Master, say: say} = getEnunciation(eventSlave); const belly = bellyAdjective(eventSlave); @@ -302,10 +302,7 @@ App.Events.RECIButthole = class RECIButthole extends App.Events.BaseEvent { function DoubleTeam(partner) { let container = document.createDocumentFragment(); const partnerSlave = partner; - const { - // eslint-disable-next-line no-unused-vars - He2, he2, His2, his2, hers2, him2, himself2, girl2 - } = getPronouns(partnerSlave).appendSuffix('2'); + const {He2, he2, his2, him2, himself2} = getPronouns(partnerSlave).appendSuffix('2'); const {title: Master2} = getEnunciation(partnerSlave); // replace slave art diff --git a/src/events/RECI/feminization.js b/src/events/RECI/feminization.js index 2d278430d847708279eb9ea0af409ababb847f99..7d0a004602f9b3132272a5bbdccd7c4537b75209 100644 --- a/src/events/RECI/feminization.js +++ b/src/events/RECI/feminization.js @@ -32,10 +32,7 @@ App.Events.RECIFeminization = class RECIFeminization extends App.Events.BaseEven execute(node) { /** @type {Array<App.Entity.SlaveState>} */ let [eventSlave] = this.actors.map(a => getSlave(a)); - const { - // eslint-disable-next-line no-unused-vars - He, he, His, his, hers, him, himself, girl - } = getPronouns(eventSlave); + const {He, he, His, his, him, himself, girl} = getPronouns(eventSlave); const {title: Master, say: say} = getEnunciation(eventSlave); const desc = SlaveTitle(eventSlave); const legs = hasBothLegs(eventSlave) ? "legs" : "leg"; diff --git a/src/events/RECI/orientation.js b/src/events/RECI/orientation.js index 7c8e701f9d0bf35c110bb4b4f80a79ca99a1c15b..d021dbb6dfa09005d0bccef65bf71eeabf0b445f 100644 --- a/src/events/RECI/orientation.js +++ b/src/events/RECI/orientation.js @@ -25,10 +25,7 @@ App.Events.RECIOrientation = class RECIOrientation extends App.Events.BaseEvent execute(node) { /** @type {Array<App.Entity.SlaveState>} */ let [eventSlave] = this.actors.map(a => getSlave(a)); - const { - // eslint-disable-next-line no-unused-vars - He, he, His, his, hers, him, himself, girl - } = getPronouns(eventSlave); + const {He, he, his, him, himself, girl} = getPronouns(eventSlave); const {title: Master} = getEnunciation(eventSlave); const belly = bellyAdjective(eventSlave); const desc = SlaveTitle(eventSlave); diff --git a/src/events/RECI/ugly.js b/src/events/RECI/ugly.js index 76b80c69d324dfc469958afc1dd4516bd387ff5c..95ca6f23c68ef02e7ca5c1764680155d12685f14 100644 --- a/src/events/RECI/ugly.js +++ b/src/events/RECI/ugly.js @@ -26,10 +26,7 @@ App.Events.RECIUgly = class RECIUgly extends App.Events.BaseEvent { execute(node) { /** @type {Array<App.Entity.SlaveState>} */ let [eventSlave] = this.actors.map(a => getSlave(a)); - const { - // eslint-disable-next-line no-unused-vars - He, he, His, his, hers, him, himself, girl - } = getPronouns(eventSlave); + const {He, he, His, his, him, himself, girl} = getPronouns(eventSlave); const {title: Master, say: say} = getEnunciation(eventSlave); const freeMovement = (canWalk(eventSlave) || (canMove(eventSlave) && eventSlave.rules.mobility === "permissive")); diff --git a/src/events/REFI/reButtslut.js b/src/events/REFI/reButtslut.js index 790961f0566b2c747e2c40f0775be4d58d37a093..a8bfad6415c09b42b8a76e24421edfe68911a6b6 100644 --- a/src/events/REFI/reButtslut.js +++ b/src/events/REFI/reButtslut.js @@ -32,7 +32,7 @@ App.Events.REFIButtslut = class REFIButtslut extends App.Events.BaseEvent { App.Events.drawEventArt(node, [eventSlave, subSlave], [eventSlave.clothes, "no clothing"]); if (canImpreg(subSlave, V.PC)) { - knockMeUp(subSlave, 5, 1, -1, true); + knockMeUp(subSlave, 5, 1, -1); } seX(subSlave, "anal", V.PC, "penetrative"); diff --git a/src/events/REFI/reHumiliation.js b/src/events/REFI/reHumiliation.js index e12851f0a7abeef1361b86b1b8c227a14cd8b12c..6b23282ee0c1a0797f4a7a59d6205acc1520c992 100644 --- a/src/events/REFI/reHumiliation.js +++ b/src/events/REFI/reHumiliation.js @@ -30,12 +30,12 @@ App.Events.REFIHumiliation = class REFIHumiliation extends App.Events.BaseEvent if (canDoVaginal(subSlave) && subSlave.vagina > 0) { seX(subSlave, "vaginal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)){ - knockMeUp(subSlave, 5, 0, -1, true); + knockMeUp(subSlave, 5, 0, -1); } } else { seX(subSlave, "anal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)){ - knockMeUp(subSlave, 5, 1, -1, true); + knockMeUp(subSlave, 5, 1, -1); } } diff --git a/src/events/REFI/reMasochist.js b/src/events/REFI/reMasochist.js index 4f7300e6298227cfc139c9e26300978c61e1bbae..0136db454a0d19e147806bf15694ad7766f8888c 100644 --- a/src/events/REFI/reMasochist.js +++ b/src/events/REFI/reMasochist.js @@ -31,12 +31,12 @@ App.Events.REFIMasochist = class REFIMasochist extends App.Events.BaseEvent { if (canDoAnal(subSlave) && subSlave.anus > 0) { seX(subSlave, "anal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)){ - knockMeUp(subSlave, 5, 1, -1, true); + knockMeUp(subSlave, 5, 1, -1); } } else { seX(subSlave, "vaginal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)) { - knockMeUp(subSlave, 5, 0, -1, true); + knockMeUp(subSlave, 5, 0, -1); } } diff --git a/src/events/REFI/rePregnancy.js b/src/events/REFI/rePregnancy.js index 316e2ba1597129f646a641f2f35ff05a35037afb..1aefc10e7a40847b7c1df31969e05d3fb97a0853 100644 --- a/src/events/REFI/rePregnancy.js +++ b/src/events/REFI/rePregnancy.js @@ -561,7 +561,7 @@ App.Events.REFIPregnancy = class REFIPregnancy extends App.Events.BaseEvent { if (eventSlave.toyHole === "dick" || V.policies.sexualOpenness === 1) { t.push(`You push ${him} onto the couch, line yourself up with ${his} throbbing erection, and ask if ${he} wants to impregnate a girl. ${He}'s almost beside ${himself}, shuddering at the titillation, but before ${he} can answer, you tell ${him} that getting to use ${his} dick is a very special reward for very good slaves, and you might give it to ${him} one day — but that ${he} doesn't deserve it yet. With that, you tease the tip of ${his} penis with your pussy; a clear mistake, as this sets ${him} over the edge. ${He} can only gasp wordlessly over having just accidentally came in ${his} ${getWrittenTitle(eventSlave)}, something you take full advantage of. You clearly inform ${him} that you were fertile. <span style="italic">Were.</span> You continue to tease the blooming impregnation fetishist with descriptions of how hard it will be for you so heavily laden with child and how ${he} had better plan on taking responsibility. ${He} can't take it and releases another spurt of cum, this time onto ${himself};`); if (canImpreg(V.PC, eventSlave)) { - t.push(knockMeUp(V.PC, 20, 0, eventSlave.ID, true)); + knockMeUp(V.PC, 20, 0, eventSlave.ID); t.push(`you aren't taking more chances with ${him}.`); } else { t.push(`you can't actually get pregnant right now, but ${he} doesn't need to know that.`); diff --git a/src/events/REFI/reSubmissive.js b/src/events/REFI/reSubmissive.js index db6a8acc22684eac44bea0f03925458ae43aaf96..f0462f2ba71ee18f5c8ef0502469ae00145e1ca3 100644 --- a/src/events/REFI/reSubmissive.js +++ b/src/events/REFI/reSubmissive.js @@ -29,18 +29,17 @@ App.Events.REFISubmissive = class REFISubmissive extends App.Events.BaseEvent { if (canDoVaginal(subSlave) && (subSlave.vagina > 0)) { seX(subSlave, "vaginal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)) { - knockMeUp(subSlave, 5, 0, -1, true); + knockMeUp(subSlave, 5, 0, -1); } } else { seX(subSlave, "anal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)){ - knockMeUp(subSlave, 5, 1, -1, true); + knockMeUp(subSlave, 5, 1, -1); } } let t = []; - t.push(contextualIntro(V.PC, subSlave, "DOM")); - t.push(`is lying on the edge of your desk with ${his2}`); + t.push(`You have`, contextualIntro(V.PC, subSlave, "DOM"), `lying on the edge of your desk with ${his2}`); if (subSlave.belly >= 1500) { t.push(`bloated`); } @@ -50,7 +49,7 @@ App.Events.REFISubmissive = class REFISubmissive extends App.Events.BaseEvent { } else { t.push(`strap-on`); } - t.push(`in ${him2}, and your hands around ${his2} neck. It's just breath play, and you're practiced enough that ${he2}'s in no danger. ${He2}'s such a sexual submissive that ${he2} sometimes acts out if not managed. This happens when ${he2} feels the urge to misbehave in order to access punishment, so you personally ensure that ${he2} can indulge ${his2} submissiveness when ${he2} needs it. ${He2} does not orgasm with you, ${his2} complete servitude to your pleasure fulfilling a deeper need than that. ${He2}`); + t.push(`inside ${him2}, and your hands around ${his2} neck. It's just breath play, and you're practiced enough that ${he2}'s in no danger. ${He2}'s such a sexual submissive that ${he2} sometimes acts out if not managed. This happens when ${he2} feels the urge to misbehave in order to access punishment, so you personally ensure that ${he2} can indulge ${his2} submissiveness when ${he2} needs it. ${He2} does not orgasm with you, ${his2} complete servitude to your pleasure fulfilling a deeper need than that. ${He2}`); if (canMove(subSlave)) { t.push(`leaves`); } else { diff --git a/src/events/RESS/arcadeSadist.js b/src/events/RESS/arcadeSadist.js new file mode 100644 index 0000000000000000000000000000000000000000..61f9962cc1e8fff23eb5cb7943008f0ab7f447e7 --- /dev/null +++ b/src/events/RESS/arcadeSadist.js @@ -0,0 +1,298 @@ +App.Events.RESSArcadeSadist = class RESSArcadeSadist extends App.Events.BaseEvent { + eventPrerequisites() { + return [ + () => App.Entity.facilities.arcade.established, + () => App.Entity.facilities.arcade.hasEmployees, + ]; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish === "sadist", + s => s.fetishStrength > 20, + s => s.fetishKnown === 1, + hasAnyArms, + canMove, + canTalk, + canHear, + s => s.devotion > 50, + s => s.trust >= -20, + s => s.belly < 300000, + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, his, him, himself, girl + } = getPronouns(eventSlave); + const {title: Master, say} = getEnunciation(eventSlave); + + V.nextLink = "Next Week"; + + let artDiv = document.createElement("div"); // named container so we can replace it later + App.Events.drawEventArt(artDiv, eventSlave); + node.appendChild(artDiv); + + let r = []; + r.push(`You happen to come across`); + r.push(contextualIntro(V.PC, eventSlave, "DOM")); + r.push(`during one of ${his} rest periods. ${He}'s lying on a couch in the slave areas,`); + if (canSee(eventSlave)) { + r.push(`staring at the ceiling above ${him}`); + } else { + r.push(`leaning back`); + } + r.push(`with a dreamy expression on ${his} face. ${He}'s`); + if (eventSlave.rules.release.masturbation === 1) { + r.push(`touching ${himself} idly.`); + } else { + r.push(`not allowed to touch ${himself}, but ${he}'s extremely aroused.`); + } + r.push(`Whatever's on ${his} mind, it's so absorbing that ${he} doesn't realize you're there until you're standing over ${him}.`); + App.Events.addParagraph(node, r); + r = []; + + r.push(Spoken(eventSlave, `"Sorry, ${Master},"`), `he ${say}s apologetically,`); + if (eventSlave.belly >= 10000 || eventSlave.weight > 160) { + r.push(`struggling`); + } else { + r.push(`scrambling`); + } + r.push(`to ${his} feet.`); + r.push(Spoken(eventSlave, `"I didn't notice you there."`)); + if (canSee(eventSlave)) { + r.push(`Seeing your questioning look,`); + } else { + r.push(`Hearing your lack of response,`); + } + r.push(`${he} explains ${himself} further.`); + r.push(Spoken(eventSlave, `"I was just thinking about, um, my favorite place. I can almost get off just by thinking about it."`)); + r.push(`There's a wild, perverted gleam`); + if (canSee(eventSlave)) { + r.push(`in ${his} ${App.Desc.eyesColor(eventSlave)}.`); + } else { + r.push(`on ${his} face.`); + } + r.push(`${He}'s a confirmed sadist, so whatever ${his} favorite mental masturbation is probably quite strong.`); + + App.Events.addParagraph(node, r); + App.Events.addResponses(node, [ + new App.Events.Result(`Ask ${him} about ${his} fantasy`, fantasy), + new App.Events.Result(`Just fuck ${him}`, fuck), + ]); + + function fantasy() { + const frag = document.createDocumentFragment(); + r = []; + + const {hisU, heU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U"); + + r.push(`You order ${him} to explain further.`); + r.push(Spoken(eventSlave, `"${Master},"`), `${he} ${say}s carefully,`, Spoken(eventSlave, `"it's ${V.arcadeName}. There's a specific place there, and, well, I can't describe it. It's in the service area under ${V.arcadeName}. Can I show you what I mean?"`)); + r.push(`Intrigued, you order ${him} to show you the place ${he}'s talking about, and lead ${him} to ${V.arcadeName} through the access hallway. ${He} points to the service tunnel under one of the rows of inmates, which allows trusted slaves to clean up and perform maintenance.`); + if (eventSlave.belly >= 100000 || eventSlave.weight > 160) { + r.push(`Once you've managed to shove the massive slut`); + } else if (eventSlave.belly >= 5000) { + r.push(`Once you've helped the`); + if (eventSlave.bellyPreg >= 3000) { + r.push(`gravid`); + } else { + r.push(`bloated`); + } + r.push(`${girl} fit`); + } else { + r.push(`Once you've led ${him}`); + } + r.push(`in there, ${he} stops and`); + if (canSee(eventSlave)) { + r.push(`watches`); + } else { + r.push(`listens`); + } + if (V.PC.belly >= 100000 || V.PC.weight > 130) { + r.push(r.pop() + `as you struggle to join ${him} in the increasingly cramped space.`); + } else if (V.PC.belly >= 5000) { + r.push(r.pop() + `as you gently slip your motherly body in after ${him}.`); + } else { + r.push(r.pop() + "."); + } + r.push(`Inside the industrial access corridor, above you both, is a row of bodies. The slaves' faces and hips are pressed against the apertures that present their holes to customers, but the rest of them is visible from here.`); + App.Events.addParagraph(frag, r); + r = []; + + r.push(`There is little noise; the slaves are closely restrained. Indeed, you have to look closely to see that they're being fucked at all. Here and there, though, there are signs. When someone fucks a slave's face, ${hisU} throat bulges, and ${heU} often gags and struggles a little within the restraints. When their`); + if (App.Entity.facilities.arcade.employees().some(s => s.vagina > 0)) { + r.push(`pussies`); + } else { + r.push(`assholes`); + } + r.push(`get fucked, there's also some involuntary struggling, and if the phallus being thrust into them is particularly large, a rhythmic bulging of their abdomens can be discerned.`); + if (V.arcadeUpgradeInjectors === 1) { + r.push(`The bodies frequently jerk as electrostimulation is applied to force them to tighten their holes.`); + } else if (V.arcadeUpgradeInjectors === 2) { + r.push(`The quiet hissing of the drug injectors adds a menacing undertone, and the bodies frequently jerk as electrostimulation is applied to force them to tighten their holes.`); + } + if (V.arcadeUpgradeCollectors === 1) { + r.push(`The pumping collectors attached to the slaves' breasts`); + if (App.Entity.facilities.arcade.employees().some(s => s.dick > 0)) { + r.push(`and cocks`); + } + r.push(`carry the white fluid away to be processed elsewhere.`); + } + r.push(`The overall effect is subtle, but powerful. There's a sense of total servitude, overlaid with a certain feeling, or perhaps even a scent, of mindless despair. There's no wonder ${eventSlave.slaveName} likes it; there's an infinite supply of uncomplicated human anguish here.`); + + App.Events.addParagraph(frag, r); + App.Events.addResponses(frag, [ // TODO: Why the fuck are you crawling around random access shafts? + (V.PC.belly < 5000 && eventSlave.belly < 5000) + ? new App.Events.Result(`Fuck ${him} here`, here) + : new App.Events.Result(null, null, `Fucking ${him} here would be interesting; unfortunately, there just isn't enough room for two mothers-to-be.`), + new App.Events.Result(`Teach ${him} about true sadism`, truShit), + ]); + return frag; + + function here() { + r = []; + + r.push(`You reach out for ${eventSlave.slaveName}, not taking your eyes off the mesmerizing sight above. ${He}'s enjoying the spectacle too, and is so aroused that your rough handling of ${his} breasts almost brings ${him} to an immediate orgasm.`); + if (eventSlave.nipples !== "fuckable") { + r.push(`Pinching`); + } else { + r.push(`Hooking`); + } + r.push(`${his} ${eventSlave.nipples} nipples to stop ${him} from getting off too soon, you`); + if (V.PC.dick === 0) { + r.push(`hug ${him} to your chest and start playing with ${his}`); + if (canDoVaginal(eventSlave)) { + r.push(`pussy,`); + seX(eventSlave, "vaginal", V.PC, "penetrative"); + } else if (eventSlave.dick > 0 && eventSlave.chstityPenis === 0) { + r.push(`dick,`); + } else { + r.push(`body,`); + } + r.push(`commanding ${him} to reach around and do the same for you.`); + seX(V.PC, "vaginal", eventSlave, "penetrative"); + } else if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) { + r.push(`pull ${him} up to the right height and slide your dick inside ${him}, keeping both of you on your feet so you can take ${him} standing.`); + r.push(VCheck.Vaginal(eventSlave, 1)); + } else if (canDoAnal(eventSlave) && eventSlave.anus > 0) { + r.push(`shove your cock roughly up ${his} asshole, letting ${him} struggle a little as ${he} finds the right angle to take standing anal here.`); + r.push(VCheck.Anal(eventSlave, 1)); + } else { + r.push(`slide your stiff prick up between the virgin's thighs for some intercrural sex.`); + } + if (eventSlave.belly >= 5000 || V.PC.belly >= 5000 || V.PC.weight > 160 || V.PC.boobs > 40000 || V.PC.butt > 10 || eventSlave.weight > 160 || eventSlave.boobs > 40000 || eventSlave.butt > 10) { + r.push(`As you fuck in the cramped corridor, ${his}`); + } else { + r.push(`As you fuck, ${his}`); + } + if (canSee(eventSlave)) { + r.push(`gaze flicks up and down along the row`); + } else { + r.push(`ears perk up at the subtle sounds`); + } + r.push(`of suffering bodies. ${He} climaxes again and again, shuddering at each new subtle sign that another one of the slaves here is being degraded by yet another cock inserted into yet another of ${hisU} defenseless holes. By the time you're satisfied, ${he}'s so exhausted that ${his} legs are trembling uncontrollably as ${he} struggles to remain standing with you. You drop ${him}, leaving ${him} to find ${his} own way out of this place. You look back from the entrance, seeing that ${he}'s`); + if (canWalk(eventSlave)) { + r.push(`following you on shaky legs,`); + } else { + r.push(`steadily pushing ${himself} along,`); + } + if (canSee(eventSlave)) { + r.push(`staring at`); + } else { + r.push(`facing`); + } + r.push(`you with a profound look of mixed <span class="trust inc">trust for your understanding of ${his} horrible sadism,</span> and deep unease that this is what truly gets ${him} off.`); + eventSlave.trust += 5; + return r; + } + + function truShit() { + r = []; + const randomArcadeSlave = App.Entity.facilities.arcade.employees().random(); + const {he2, His2, his2} = getPronouns(randomArcadeSlave).appendSuffix("2"); + // replace slave art + $(artDiv).empty(); + App.Events.drawEventArt(artDiv, [eventSlave, randomArcadeSlave], [eventSlave.clothes, "no clothing"]); + + r.push(`${He} seems to be focusing on the purely physical aspects of the degradation here. The true meaning of this place is so much more, and you decide to share it with ${him}. You call ${his} name, tearing ${his} attention away from the spectacle mere`); + if (V.showInches === 2) { + r.push(`inches`); + } else { + r.push(`centimeters`); + } + r.push(`over your heads, and`); + if (canSee(eventSlave)) { + r.push(`point`); + } else { + r.push(`direct ${him}`); + } + r.push(`to a particular slave. You tell ${eventSlave.slaveName} that this particular Arcade inmate's name is ${SlaveFullName(randomArcadeSlave)}.`); + if (randomArcadeSlave.career !== 0) { + r.push(`You tell ${him} that ${he2} is ${randomArcadeSlave.actualAge} years old, that ${he2} is ${randomArcadeSlave.nationality}, and that ${he2} was once ${convertCareer(randomArcadeSlave)}.`); + } else { + r.push(`You tell ${him} that ${he2} is ${randomArcadeSlave.actualAge} years old and ${randomArcadeSlave.nationality}.`); + } + r.push(`You list more details of ${his2} life before ${he2} was placed here to be fucked endlessly. ${eventSlave.slaveName}'s eyes widen as you recite the details of the prior life of this piece of human sexual equipment and the sheer weight of the intellectual sadism smashes into ${him}. Then the slave above you both jerks a little.`); + if (eventSlave.dick === 0) { + r.push(`There's no visible sign ${his2} pussy's being fucked, so it must be`); + } else { + r.push(`${His2} cock hardens involuntarily, indicating that it's`); + } + r.push(`going into ${his2} ass. You resume, mentioning that ${he2}'s been buttfucked ${randomArcadeSlave.counter.anal} times.`); + r.push(`${eventSlave.slaveName} jerks suddenly,`); + if (canAchieveErection(eventSlave)) { + r.push(`shooting ${his} cum onto the floor.`); + } else if (eventSlave.dick > 0) { + r.push(`dribbling a little.`); + } else if (eventSlave.vaginaLube > 0 || eventSlave.balls > 0) { + r.push(`squirting onto the floor.`); + } else { + r.push(`orgasming.`); + } + r.push(`${He} came without being touched. ${He}`); + if (canSee(eventSlave)) { + r.push(`stares at`); + } else { + r.push(`faces`); + } + r.push(`the mess ${he} made just by being in the presence of the arcology's <span class="devotion inc">undisputed preeminent sadist;</span> ${he} shudders at the sheer gothic glory of it. ${He} has a new moment to think of when ${he} feels like <span class="fetish inc">indulging ${his} own sadism.</span>`); + eventSlave.devotion += 5; + eventSlave.fetishStrength = Math.clamp(eventSlave.fetishStrength + 10, 0, 100); + return r; + } + } + + function fuck() { + r = []; + + r.push(`You're not particularly interested in what ${he} dreams about when ${he} gets the chance, and you tell ${him} so. Whatever sadistic little fantasies ${he} keeps locked away to bring out when ${he}'s got a moment to satiate ${his} perversions is less interesting to you than the prospect of`); + if (V.PC.dick === 0) { + r.push(`${his} mouth on your cunt. So, you shove ${him} down to sit on the couch and straddle ${his} face, cutting off any further whimsies by pressing your wet pussy against ${his} lips. ${He} eats you out obediently, accepting`); + seX(eventSlave, "oral", V.PC, "vaginal"); + } else if (canDoVaginal(eventSlave) && (eventSlave.vagina > 0)) { + r.push(`giving it to ${him}. So, you shove ${him} down to sit on the couch, nudge ${his} legs apart, kneel between them, and pound ${his} pussy. You fuck ${him} so hard that ${he} doesn't have the attention for further whimsies, and ${he} accepts`); + r.push(VCheck.Vaginal(eventSlave, 1)); + } else if (canDoAnal(eventSlave) && (eventSlave.anus > 0)) { + r.push(`fucking ${his} butt. So, you shove ${him} down to`); + if (hasAnyLegs(eventSlave)) { + r.push(`kneel`); + } else { + r.push(`get`); + } + r.push(`on the couch facing away from you, and ram your cock up ${his} asshole. You assfuck ${him} so hard that ${he} doesn't have the attention for further whimsies, and ${he} accepts`); + r.push(VCheck.Anal(eventSlave, 1)); + } else { + r.push(`${him} sucking your dick. So, you shove ${him} down to sit on the couch and give ${him} your cock to keep ${his} mouth occupied, cutting off any further whimsies. ${He} blows you obediently, accepting`); + seX(eventSlave, "oral", V.PC, "penetrative"); + } + r.push(`the implicit message that <span class="devotion inc">${he}'s your slut</span> in the real world, whatever thoughts ${he} may find appealing in the privacy of ${his} own mind.`); + eventSlave.devotion += 3; + return r; + } + } +}; diff --git a/src/events/RESS/assFitting.js b/src/events/RESS/assFitting.js index c86a7a4ba39842bca5a192b61309ff09f04078a6..299bb57e90bf5adc4468657ca443ded752f8c506 100644 --- a/src/events/RESS/assFitting.js +++ b/src/events/RESS/assFitting.js @@ -7,7 +7,7 @@ App.Events.RESSAssFitting = class RESSAssFitting extends App.Events.BaseEvent { return [ [ // single event slave s => s.fetish !== "mindbroken", - s => s.assignment !== "work as a servant", + s => s.assignment !== Job.QUARTER, s => s.devotion > 20, s => s.butt > 5, s => ["a bimbo outfit", "a biyelgee costume", "a bunny outfit", "a burkini", "a cheerleader outfit", "a comfortable bodysuit", "a dirndl", "a fallen nuns habit", "a huipil", "a latex catsuit", "a leotard", "a long qipao", "a maternity dress", "a military uniform", "a monokini", "a mounty outfit", "a nice nurse outfit", "a red army uniform", "a scalemail bikini", "a schoolgirl outfit", "a schutzstaffel uniform", "a slutty nurse outfit", "a slutty outfit", "a slutty qipao", "a slutty schutzstaffel uniform", "a succubus outfit", "attractive lingerie for a pregnant woman", "attractive lingerie", "battlearmor", "chains", "clubslut netting", "conservative clothing", "cutoffs and a t-shirt", "kitty lingerie", "lederhosen", "nice business attire", "overalls", "restrictive latex", "striped panties", "slutty business attire", "slutty jewelry", "spats and a tank top", "stretch pants and a crop-top", "uncomfortable straps", "Western clothing", "Imperial Plate", "a tight Imperial bodysuit"].includes(s.clothes), diff --git a/src/events/RESS/bedSnuggle.js b/src/events/RESS/bedSnuggle.js new file mode 100644 index 0000000000000000000000000000000000000000..97119374f94efb646b7fbbab30255dee85be80b5 --- /dev/null +++ b/src/events/RESS/bedSnuggle.js @@ -0,0 +1,464 @@ + +App.Events.RESSBedSnuggle = class RESSBedSnuggle extends App.Events.BaseEvent { + eventPrerequisites() { + return []; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + s => [Job.CONCUBINE, Job.FUCKTOY, Job.MASTERSUITE].includes(s.assignment), + s => s.devotion > 50, + s => s.trust > 50, + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, His, his, him, woman, girl, himself + } = getPronouns(eventSlave); + const {say} = getEnunciation(eventSlave); + const {hisA, girlA, womanA, loliA} = getPronouns(assistant.pronouns().main).appendSuffix('A'); + const belly = bellyAdjective(eventSlave); + + let womanTerm = "kid"; + if (eventSlave.physicalAge > 30) { + womanTerm = woman; + } else if (eventSlave.physicalAge > 18) { + womanTerm = girl; + } else if (eventSlave.physicalAge > 12) { + womanTerm = "teen"; + } + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave, "no clothing"); + + + let r = []; + r.push(`${capFirstChar(V.assistant.name)} wakes you in the morning,`); + if (V.assistant.personality <= 0) { + r.push(`${hisA} voice`); + } else { + switch (V.assistant.appearance) { + case "monstergirl": + r.push(`${hisA} monster${girlA} avatar's sultry voice`); + break; + case "shemale": + r.push(`${hisA} shemale avatar's syrupy voice`); + break; + case "amazon": + r.push(`${hisA} amazon avatar's powerful voice`); + break; + case "businesswoman": + r.push(`${hisA} business${womanA} avatar's confident voice`); + break; + case "fairy": + case "pregnant fairy": + r.push(`${hisA} fairy avatar's adorable voice`); + break; + case "schoolgirl": + r.push(`${hisA} school${girlA} avatar's bubbly voice`); + break; + case "loli": + case "preggololi": + r.push(`${hisA} ${loliA} avatar's childish voice`); + break; + case "angel": + r.push(`${hisA} angel avatar's heavenly voice`); + break; + case "cherub": + r.push(`${hisA} cherub avatar's cheerful voice`); + break; + case "incubus": + r.push(`${hisA} incubus avatar's forceful voice`); + break; + case "succubus": + r.push(`${hisA} succubus avatar's sultry voice`); + break; + case "imp": + r.push(`${hisA} imp avatar's mischievous voice`); + break; + case "witch": + r.push(`${hisA} witch avatar's cocky voice`); + break; + case "ERROR_1606_APPEARANCE_FILE_CORRUPT": + r.push(`${hisA} avatar's piecemeal voice`); + break; + default: + r.push(`${hisA} voice`); + } + } + r.push(`gently calling your name. As you regain consciousness, you become aware of a weight on your`); + if (V.PC.boobs >= 1400) { + r.push(`chest other than your heavy tits.`); + } else { + r.push("chest."); + } + r.push(contextualIntro(V.PC, eventSlave, "DOM")); + r.push(`has snuggled up against you in ${his} sleep. ${He}'s nude, and so are you; everyone sleeps naked in your penthouse. The sheet is down at your hips, leaving your upper bodies bare.`); + if (!hasAnyArms(eventSlave)) { + r.push(`${He}'s wormed ${his}`); + if (isAmputee(eventSlave)) { + r.push(`limbless`); + } else { + r.push(`armless`); + } + r.push(`torso under your arm,`); + } else { + r.push(`${He} has one arm across your`); + if (V.PC.boobs >= 300) { + r.push(`chest, just below your breasts,`); + } else if (V.PC.title === 1) { + r.push(`manly chest`); + } else { + r.push(`flat chest,`); + } + } + r.push(`and is using your shoulder as a pillow. You can feel ${his} warm breath across`); + if (V.PC.boobs >= 300 || V.PC.title === 0) { + r.push(`your nipple on that side, and it hardens slowly under your gaze.`); + } else { + r.push(`your well-developed pectorals.`); + } + if (eventSlave.boobs > 4000) { + r.push(`${His} incredible tits are resting to either side of your ribcage, with one of them a heavy mass on your chest and the other trapped under ${his}`); + } else if (eventSlave.boobs > 1200) { + r.push(`${His} big boobs form a warm, soft mass between you`); + } else { + r.push(`${His} soft chest rests warmly against your ribcage`); + } + if (eventSlave.belly >= 10000) { + r.push(r.pop() + `, beneath them, ${his} ${belly}`); + if (eventSlave.bellyPreg >= 8000) { + r.push(r.pop() + `pregnant`); + } + r.push(`belly rests`); + if (V.PC.belly >= 1500) { + r.push(`against your own baby bump,`); + } else { + r.push(`upon your flat stomach,`); + } + } + r.push(`and farther down, there's another source of warmth where ${he}'s`); + if (!hasAnyLegs(eventSlave)) { + r.push(`got ${his} legless pelvis resting against your ${eventSlave.height <= V.PC.height ? "hip" : "thigh"}.`); + } else { + r.push(`straddling your thigh.`); + } + App.Events.addParagraph(node, r); + r = []; + + r.push(`"${properTitle()}," ${V.assistant.name} calls again, "you`); + if (V.assistant.personality <= 0) { + r.push(`set a wake-up for this time.`); + } else { + r.push(`asked me to wake you at this time.`); + } + r.push(`You have a business meeting that starts shortly." You begin to slide out from under ${eventSlave.slaveName}, but the ${womanTerm} clings to you in ${his} sleep as the warmth of your body begins to move away from ${him}.`); + + App.Events.addParagraph(node, r); + App.Events.addResponses(node, [ + new App.Events.Result("Make the meeting", meeting), + new App.Events.Result("Call in from where you are", call), + new App.Events.Result("Go back to sleep", sleep), + new App.Events.Result("Spend the day in bed", bed), + ]); + + function meeting() { + r = []; + + let meetingBonus = Math.trunc(V.cash / 10000 * 1000); + if (meetingBonus > 5000) { + meetingBonus = 5000; + } else if (meetingBonus < 1000) { + meetingBonus = 1000; + } + r.push(`You finish the motion and get on with your day. ${He} burrows into the warm place on the bed where your body lay, which is actually an excellent sign of ${his} mental state. It suggests that ${his} dreaming mind is quite comfortable with your`); + if (canSmell(eventSlave)) { + r.push(`presence, and even smell.`); + } else { + r.push(`presence.`); + } + r.push(`You make the meeting, consoling yourself with the thought that you're hardly lacking for opportunities to`); + if (V.PC.dick !== 0) { + r.push(`stick your dick in`); + } else { + r.push(`have sex with`); + } + r.push(`${eventSlave.slaveName}. The business opportunity turns out to be <span class="cash inc">quite profitable;</span> you're glad you didn't pass it up.`); + cashX(meetingBonus, "event", eventSlave); + return r; + } + + function call() { + r = []; + + let meetingBonus = Math.trunc(V.cash / 10000) * 1000; + if (meetingBonus > 5000) { + meetingBonus = 5000; + } else if (meetingBonus < 1000) { + meetingBonus = 1000; + } + r.push(`You tell ${V.assistant.name} to inform your business contacts that you'll be attending the meeting by telepresence. A camera mounted above you focuses tightly on your face, making it look like you're relaxing, but concealing the fact that you have a naked ${womanTerm} draped across you. The meeting is long enough that your interlocutors eventually realize that something unusual is going on, especially once ${he} wakes up and starts sleepily`); + if (V.PC.dick !== 0) { + r.push(`sucking your dick`); + if (V.PC.vagina !== -1) { + r.push(`and`); + } + seX(eventSlave, "oral", V.PC, "penetrative"); + } + if (V.PC.vagina !== -1) { + r.push(`eating you out`); + seX(eventSlave, "oral", V.PC, "vaginal"); + } + r.push(r.pop() + `, out of frame. They're <span class="reputation dec">slightly annoyed,</span> since having sex during meetings is still considered a minor faux pas, but you <span class="cash inc">close the deal,</span> and ${eventSlave.slaveName} is <span class="devotion inc">very pleased</span> that you would rearrange your affairs to make time for`); + if (V.PC.dick !== 0) { + r.push(`one of ${his} blowjobs.`); + } else { + r.push(`oral sex with ${him}.`); + } + + cashX(meetingBonus, "event", eventSlave); + repX(forceNeg(50), "event", eventSlave); + eventSlave.devotion += 4; + return r; + } + + function sleep() { + r = []; + const frag = document.createDocumentFragment(); + let didAnal = false; + let didVaginal = false; + + r.push(`You tell ${V.assistant.name} to cancel the appointment, plant a kiss atop your bedmate's sleeping head, and go back to sleep yourself, with the peerless comfort of a warm, naked ${womanTerm} cuddled up beside you. ${capFirstChar(V.assistant.name)} lowers the temperature in the room and directs another slave to quietly put a couple of warm blankets over you and ${eventSlave.slaveName}. When you finally wake, several hours later, the effect is magical. You're ensconced in a little island of warmth and comfort, a tiny universe of relaxation populated only by yourself and your slave. ${He} woke before you did, but remained still to avoid disturbing you.`); + if (canSee(eventSlave)) { + r.push(`From the lazy, contented look in ${his} ${App.Desc.eyesColor(eventSlave)} as ${he} meets your waking gaze, ${he} did not mind waiting. <span class="devotion inc">${He} was already looking at your face when you opened your eyes.</span>`); + } else { + r.push(`From the serene expression on ${his} face as ${he} meets your waking gaze, ${he} did not mind waiting. <span class="devotion inc">${He} was already looking at your face, lost in the soothing ${canHear(eventSlave) ? "sounds" : "motions"} of your breathing, when you opened your eyes.</span>`); + } + App.Events.addParagraph(frag, r); + r = []; + + r.push(`Since you're awake, ${he} rolls onto ${his} face and then further, to place ${his} back and`); + if (eventSlave.butt > 5) { + r.push(`massive ass`); + } else if (eventSlave.butt > 2) { + r.push(`healthy rear`); + } else { + r.push(`butt`); + } + r.push(`against you, making sure to drag ${his} ${eventSlave.nipples} nipples against you the whole way. You accept the invitation and spoon ${him},`); + // PC height stuff here! + if (eventSlave.height >= 185) { + r.push(`your bodies lining up well, since ${he}'s as tall as you are.`); + } else if (eventSlave.height >= 160) { + r.push(`${his} body fitting neatly within the embrace of your larger frame.`); + } else { + r.push(`${his} small body fitting entirely within your embrace.`); + } + if (eventSlave.muscles > 30) { + r.push(`${His} muscles`); + } else { + r.push(`${His} softness`); + } + r.push(`and warmth awaken your desire, and ${he} feels`); + if (V.PC.dick !== 0) { + r.push(`your stiffening cock beginning to press against`); + if (!hasBothLegs(eventSlave)) { + r.push(`${his} perineum. ${He} shifts to slide ${himself} along its`); + if (V.PC.vagina !== -1) { + r.push(`shaft and down to where your pussy begins.`); + } else { + r.push("shaft."); + } + } else { + r.push(`the place between ${his} thighs. ${He} shifts to let your dick slide between them, and reaches down to massage its head.`); + } + } else { + r.push(`heat building against ${his} butt.`); + if (!hasAnyArms(eventSlave)) { + r.push(`${He} does ${his} best to grind against you, since ${he} can't caress you without hands.`); + } else { + r.push(`${He} snakes a hand behind ${himself} to caress your womanhood, and begins to gently`); + if (hasBothArms(eventSlave)) { + r.push(`masturbate with the other.`); + } else { + r.push(`grind against you.`); + } + } + } + if (V.PC.dick !== 0) { + if (eventSlave.vagina > 0 && eventSlave.anus > 0 && canDoVaginal(eventSlave) && canDoAnal(eventSlave)) { + r.push(`${He} begins to shift farther forward and back along your dick, causing its head to press against ${his} anus and then slide forward to nestle between ${his} pussylips. In response to ${his} wordless question, you nibble ${his} ear and tell ${him} that it's ${his} choice. ${He} turns ${his} upper torso to`); + if (canSee(eventSlave)) { + r.push(`stare at you in surprise`); + } else { + r.push(`so that you may see ${his} surprise`); + } + r.push(`for a moment, and then smiles and gives you a peck on the cheek.`); + if ((eventSlave.fetish === "buttslut") && (eventSlave.fetishKnown === 1)) { + r.push(`${He} hikes ${himself} up a bit, and then slides ${his} anal sphincter slowly around and down your cock until you're resting all the way up ${his} ass. You share loving anal`); + didAnal = true; + } else { + r.push(`${He} hikes ${himself} up to give your dickhead a last teasing press against ${his} butt before cocking ${his} hips and sliding your cock into ${his} soaking cunt. You make love`); + didVaginal = true; + } + } else if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) { + r.push(`${He} cocks ${his} hips and so that your cock is pressing against ${his} soaked cunt. In response to ${his} wordless question, you nibble ${his} ear and tell ${him} that it's ${his} choice. ${He} turns ${his} upper torso to`); + if (canSee(eventSlave)) { + r.push(`stare at you in surprise`); + } else { + r.push(`so that you may see ${his} surprise`); + } + r.push(`for a moment, and then smiles and gives you a peck on the cheek.`); + if (eventSlave.fetish === "pregnancy" && eventSlave.fetishKnown === 1 && isFertile(eventSlave)) { + r.push(`${He} pushes against you until you are fully inserted into ${his} pussy. ${He}'s ripe for impregnation and needs your baby in ${him}. You make love`); + } else if (eventSlave.vagina > 2) { + r.push(`${He} easily slides your cock into ${his} loose pussy. You make love`); + } else { + r.push(`${He} hikes ${himself} up a bit, and then gently slides your cock into ${his} tight pussy. You make love`); + } + didVaginal = true; + } else if (eventSlave.anus > 0 && canDoAnal(eventSlave)) { + r.push(`${He} begins to shift farther forward along your dick, causing its head to press against ${his} anus. In response to ${his} wordless question, you nibble ${his} ear and tell ${him} that it's ${his} choice. ${He} turns ${his} upper torso to`); + if (canSee(eventSlave)) { + r.push(`stare at you in surprise`); + } else { + r.push(`so that you may see ${his} surprise`); + } + r.push(`for a moment, and then smiles and gives you a peck on the cheek.`); + if (eventSlave.fetish === "buttslut" && eventSlave.fetishKnown === 1) { + r.push(`${He} hikes ${himself} up a bit, and then slides ${his} anal sphincter slowly around and down your cock until you're resting all the way up ${his} ass. You share loving anal`); + didAnal = true; + } else if (eventSlave.anus > 2) { + r.push(`${He} hikes ${himself} up a bit, and then easily slides your cock into ${his} loose rectum. You share loving anal`); + didAnal = true; + } else { + r.push(`${He} decides against buttsex, and`); + if (!hasBothLegs(eventSlave)) { + r.push(`contents ${himself} with grinding`); + } else { + r.push(`presses ${his} thighs together so you can frot ${him}.`); + } + r.push(`After making love`); + } + } else { + r.push(`You`); + if (!hasBothLegs(eventSlave)) { + r.push(`grind against ${him}`); + } else { + r.push(`frot ${him}`); + } + } + } else { + r.push(`You reach around ${him} and attend to a nipple with each hand, spreading your attention to the whole breast once`); + if (eventSlave.nipples !== "fuckable") { + r.push(`they're perfectly stiff.`); + } else { + r.push(`they've tightened around your fingers.`); + } + r.push(`After sharing gentle lovemaking`); + } + r.push(`for a while, until you sense that ${he}'s on the edge of climax. Without warning, you lift the edge of the blankets and send a gust of cool air down ${his} front and`); + if (eventSlave.dick > 0) { + r.push(`right onto ${his} cock.`); + } else { + r.push(`across ${him}`); + if (eventSlave.nipples !== "fuckable") { + r.push(`hard`); + } else { + r.push(`engorged`); + } + r.push(`nipples.`); + } + r.push(`${He} gasps at the sudden overstimulation and then orgasms very strongly, jerking against you`); + if (!canTalk(eventSlave)) { + r.push(`and panting in lieu of an exclamation.`); + } else { + r.push(`and ${say}ing "oh" over and over again.`); + } + if (V.PC.dick !== 0) { + r.push(`${He} clenches against your dick,`); + if (V.PC.vagina !== -1) { + r.push(`so hard that you can feel the rush of blood into your cunt,`); + } + } else { + r.push(`${He} works your pussy harder,`); + } + r.push(`getting you off in turn, and then rolls over to plant a whole-hearted kiss on your lips.`); + eventSlave.devotion += 4; + if (didAnal) { + r.push(VCheck.Anal(eventSlave, 1)); + } else if (didVaginal) { + r.push(VCheck.Vaginal(eventSlave, 1)); + } + App.Events.addParagraph(frag, r); + return frag; + } + + function bed() { + r = []; + let didAnal = false; + let didVaginal = false; + + r.push(`What's the point of becoming a wealthy tycoon in an anarcho-libertarian paradise if you have to obey the rules all the time? You tell ${V.assistant.name} to cancel the appointment. Then, you wake your bedmate, and`); + if (V.PC.dick !== 0) { + r.push(`get a blowjob`); + seX(eventSlave, "oral", V.PC, "penetrative"); + if (V.PC.vagina !== -1) { + r.push(`and some attention for your pussy`); + seX(eventSlave, "oral", V.PC, "vaginal"); + } + } else { + r.push(`have ${him} eat you out`); + seX(eventSlave, "oral", V.PC, "vaginal"); + } + r.push(`under the sheet while you enjoy the lurid sunrise through the glass wall of your bedroom. When the sun is up and you've`); + if (V.PC.dick !== 0) { + r.push(`shot your load down ${his} throat,`); + } else { + r.push(`climaxed twice,`); + } + r.push(`you pull the bemused ${girl} up alongside you again, bring the sheets up over you both, switch on a wallscreen, and ask ${him} if there's anything ${he}'d like to`); + if (canSee(eventSlave)) { + r.push(`watch.`); + } else if (canHear(eventSlave)) { + r.push(`listen to.`); + } else { + r.push(`put on.`); + } + r.push(`${He} smiles incredulously, but after you encourage ${him} ${he} <span class="trust inc">finds ${his} confidence</span> and admits that there's a Free Cities serial drama about slave life that ${he} enjoys. You put it on and watch three episodes with ${him}. It's terribly insipid, but there's a lot of explicit sex to liven things up, and all the actresses are nice enough to look at. ${eventSlave.slaveName} cuddles comfortably with you the entire time,`); + if (canSee(eventSlave)) { + r.push(`watching raptly`); + } else if (canHear(eventSlave)) { + r.push(`listening intently`); + } else { + r.push(`enjoying your company`); + } + r.push(`and doing ${his} best to explain the wretchedly trite plot you've missed. You have a meal delivered,`); + if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) { + r.push(`fuck ${him},`); + didVaginal = true; + } else if (eventSlave.anus > 0 && canDoAnal(eventSlave)) { + r.push(`fuck ${his} butt,`); + didAnal = true; + } else { + r.push(`fuck ${him},`); + seX(eventSlave, "oral", V.PC, "penetrative"); + } + r.push(`and then share a shower and a nap. Thus invigorated, you decide to tour the arcology's nightlife, and tell ${him} ${he}'ll accompany you. ${He} hurries to get ready, filled with excitement. A lovely day.`); + eventSlave.trust += 4; + if (didAnal) { + r.push(VCheck.Anal(eventSlave, 1)); + } else if (didVaginal) { + r.push(VCheck.Vaginal(eventSlave, 1)); + } + return r; + } + } +}; diff --git a/src/events/RESS/bondageGear.js b/src/events/RESS/bondageGear.js new file mode 100644 index 0000000000000000000000000000000000000000..104173930bc9ffe0673416c5d9f00984991cb88e --- /dev/null +++ b/src/events/RESS/bondageGear.js @@ -0,0 +1,213 @@ +App.Events.RESSBondageGear = class RESSBondageGear extends App.Events.BaseEvent { + eventPrerequisites() { + return []; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + s => s.devotion < -20, + s => s.trust >= -20, + s => s.clothes === "uncomfortable straps", + canMove, + ] + ]; + } + + execute(node) { + /** @type {Array<App.Entity.SlaveState>} */ + let [eventSlave] = this.actors.map(a => getSlave(a)); + const {He, he, His, his, him, himself} = getPronouns(eventSlave); + const {title: Master, say} = getEnunciation(eventSlave); + const belly = bellyAdjective(eventSlave); + const hands = hasBothArms(eventSlave) ? "hands" : "hand"; + App.Events.drawEventArt(node, eventSlave, "no clothing"); + + V.nextLink = "Next Week"; + + let t = []; + t.push(`One day, you catch sight of`); + t.push(contextualIntro(V.PC, eventSlave, "DOM")); + if (!canWalk(eventSlave)) { + t.push(`crawling`); + } else if (shoeHeelCategory(eventSlave) > 1) { + t.push(`tottering`); + } else if (eventSlave.belly >= 10000) { + t.push(`waddling`); + } else { + t.push(`walking`); + } + t.push(`around stark naked. This is unacceptable, as ${he} has been ordered to wear humiliating and uncomfortable bondage gear. When confronted,`); + if (!canTalk(eventSlave)) { + if (!hasAnyArms(eventSlave)) { + t.push(`${he} tries to communicate ${his} reluctance to wear the clothing as best as ${he} can with various head movements and facial`); + if (eventSlave.bellyPreg >= 5000) { + t.push(`expressions, including several nods towards ${his} rounded middle.`); + } else { + t.push("expressions."); + } + } else { + t.push(`${he} uses gestures to communicate ${his} embarrassment with ${his} clothing, covering ${his} nipples, crotch, and anus with ${his} ${hands} one after the other, and begging for clothes that do the same.`); + if (eventSlave.bellyPreg >= 5000) { + t.push(`${He} also gestures to ${his} rounded belly with a look of concern.`); + } + } + } else { + t.push(`${he} ${say}s fearfully,`); + if (eventSlave.bellyPreg >= 5000) { + t.push(Spoken(eventSlave, `"I'm sorry, ${Master}, but those things are just so embarrassing! I'm also worried for my ${eventSlave.pregType > 1 ? "babies'" : "baby's"} safety."`)); + } else { + t.push(Spoken(eventSlave, `"I'm sorry, ${Master}, but those things are just so embarrassing!"`)); + } + } + + App.Events.addParagraph(node, t); + App.Events.addResponses(node, [ + new App.Events.Result(`Let ${him} go naked`, naked), + new App.Events.Result(`Force ${him} to choose between ${his} straps and public nudity`, publicNude), + (eventSlave.buttplug === "none" && (eventSlave.vagina < 0 || (eventSlave.vaginalAccessory === "none" && eventSlave.vaginalAttachment === "none"))) + ? new App.Events.Result(`Add dildos to ${his} gear`, dildos, (eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) ? `This option will take ${his} virginity` : null) + : new App.Events.Result(), + (V.arcade > 0) + ? new App.Events.Result(`Sentence ${him} to a month in the arcade`, arcade) + : new App.Events.Result(), + + ]); + + function naked() { + t = []; + if (!canWalk(eventSlave)) { + t.push(`${He} cheerfully leaves your office,`); + } else { + t.push(`${He} skips away happily,`); + } + t.push(`overjoyed to be free of the clothing you ordered ${him} to wear. ${His} obedience to you <span class="devotion dec">has decreased,</span> as has <span class="trust inc">${his} fear</span> of you.`); + eventSlave.devotion -= 5; + eventSlave.trust += 4; + return t; + } + + function publicNude() { + t = []; + t.push(`You tell ${him} that you understand, and that ${he} can go naked; ${he} looks thrilled until you ${canHear(eventSlave) ? "tell" : "inform"} ${him} ${he}'ll be ${canWalk(eventSlave) ? "walking" : `dragging ${himself} down`} every hallway in ${V.arcologies[0].name} today, nude. Before ${he} can protest, you add that ${his} only other option is to put ${his} proper clothes back on and be a good little bitch.`); + if (eventSlave.fetish === "humiliation") { + t.push(`${He} <span class="devotion inc">happily accepts the alternative,</span>`); + if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) { + t.push(`${his} dick hardening`); + } else if (eventSlave.dick > 0) { + t.push(`${his} dick leaking precum`); + } else if (eventSlave.vagina > 0) { + t.push(`${his} pussy moistening`); + } else { + t.push(`${his} nipples`); + if (eventSlave.nipples !== "fuckable") { + t.push(`hardening`); + } else { + t.push(`swelling`); + } + } + t.push(`with anticipation.`); + eventSlave.devotion += 4; + eventSlave.clothes = "no clothing"; + if (eventSlave.fetishKnown === 0) { + t.push(`That was not the response you expected; turns out ${he} has a <span class="fetish gain">humiliation fetish.</span>`); + eventSlave.fetishKnown = 1; + } + } else { + t.push(`${He} shudders and <span class="trust dec">hurries to get ${his} straps back on.</span>`); + eventSlave.trust -= 5; + } + return t; + } + + function dildos() { + t = []; + t.push(`You tell ${him} that you understand, and that you will get ${him} some new clothing. ${He} is thrilled, but ${his} pleasure turns to horror when ${he} ${canSee(eventSlave) ? "sees" : "finds"} that the new clothes are a version of the same slave bondage gear, just with inward-facing dildos for ${his}`); + if (eventSlave.vagina > -1) { + t.push(`pussy and`); + } + t.push(`asshole.`); + if (eventSlave.anus === 0 && eventSlave.vagina === 0 && canDoAnal(eventSlave) && canDoVaginal(eventSlave)) { + t.push(`You pause before getting ${him} dressed; there's little reason to waste virginities on plugs. You`); + if (V.PC.dick !== 0) { + t.push(`stroke yourself to erection`); + } else { + t.push(`don a strap-on`); + } + t.push(`and bend ${him} over, opting to start with ${his} tight pussy.`); + t.push(VCheck.Both(eventSlave, 1)); + } else if (eventSlave.anus === 0 && canDoAnal(eventSlave)) { + t.push(`You pause before getting ${him} dressed; there's little reason to waste ${his} anal virginity on a plug. You `); + if (V.PC.dick !== 0) { + t.push(`stroke yourself to erection`); + } else { + t.push(`don a strap-on`); + } + t.push(`and bend ${him} over before working your way into ${his} tight anus.`); + t.push(VCheck.Anal(eventSlave, 1)); + } else if (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) { + t.push(`You pause before getting ${him} dressed; there's little reason to waste ${his} virginity on a plug. You`); + if (V.PC.dick !== 0) { + t.push(`stroke yourself to erection`); + } else { + t.push(`don a strap-on`); + } + t.push(` and bend ${him} over before working your way into ${his} tight pussy.`); + t.push(VCheck.Vaginal(eventSlave, 1)); + } + t.push(`For the rest of the week, ${he} ${canWalk(eventSlave) ? "walks" : "crawls"} around awkwardly, unable to find a comfortable position`); + if (eventSlave.belly >= 1500) { + t.push(`between`); + } else { + t.push(`since`); + } + t.push(`${his}`); + if (V.seeRace === 1) { + t.push(`${eventSlave.race}`); + } + t.push(`body`); + if (eventSlave.belly < 1500) { + t.push(`is`); + } + if (eventSlave.belly >= 1500) { + t.push(`being penetrated by ${his} own clothing and the straps digging into ${his} ${belly} rounded belly`); + } else { + t.push(`being penetrated by ${his} own clothing.`); + } + t.push(`<span class="devotion inc">${He} has become more submissive.</span>`); + eventSlave.devotion += 4; + return t; + } + + function arcade() { + t = []; + t.push(`${eventSlave.slaveName} ${canTalk(eventSlave) ? "screams and " : ""}begs when ${he} realizes what ${his} punishment is, but you are obdurate.`); + if (eventSlave.muscles > 30) { + t.push(`${His} powerful form has to be sedated for immurement in the arcade.`); + } else if ((eventSlave.weight >= 190)) { + t.push(`${He} is so massively fat that immuring ${him} in the arcade is a struggle, even when ${he} isn't trying to.`); + } else if (eventSlave.belly >= 120000) { + t.push(`${He} is so enormously gravid that immuring ${him} in the arcade is a hassle, even though ${his} ${belly} middle limits ${his} ability to struggle.`); + } else if ((eventSlave.weight >= -10)) { + t.push(`${His} desperate struggles make immuring ${him} in the arcade difficult.`); + } else if (eventSlave.belly >= 1500) { + t.push(`${His}`); + if (eventSlave.bellyPreg >= 3000) { + t.push(`pregnant`); + } else { + t.push(belly); + } + t.push(`body makes it slightly difficult to fit ${him} properly into the restraints for immurement in the arcade.`); + } else if (eventSlave.muscles < -15) { + t.push(`${His} weak body makes immuring ${him} in the arcade pathetically easy.`); + } else { + t.push(`${His} thin form makes immuring ${him} in the arcade pathetically easy.`); + } + t.push(`After ${he}'s properly confined, the only sign of ${his} discomfiture is a slight movement of ${his} ${eventSlave.skin} butt as ${he} wriggles desperately against ${his} restraints.`); + assignJob(eventSlave, "be confined in the arcade"); + eventSlave.sentence = 4; + return t; + } + } +}; diff --git a/src/events/RESS/frighteningDick.js b/src/events/RESS/frighteningDick.js index 2669b9a87a997ac709f11b793247ffe7b7f79bdd..bd3bcfed353d5197995e8f4d9ca3700f288d6858 100644 --- a/src/events/RESS/frighteningDick.js +++ b/src/events/RESS/frighteningDick.js @@ -112,7 +112,7 @@ App.Events.RESSFrighteningDick = class RESSFrighteningDick extends App.Events.Ba function rape() { t = []; - t.push(`Sometimes there's really no need to overthink things. You reach down, grab ${him} under the armpits, and haul ${him} up, throwing ${him} across your desk. ${He} lands on ${his} back, and the impact drives the wind out of ${him}, so ${he} lies there, <span class="gold">all possibility of resistance driven out of ${him}.</span> ${eventSlave.clothes === "no clothing" ? `${He}'s already naked, so there's no need to` : "You"} tear the clothes off ${him}. You force yourself in between ${his} legs as ${he} struggles to get ${his} breath back, and ${he} gets another good look at the formidable dick that's about to be slammed inside ${him}`); + t.push(`Sometimes there's really no need to overthink things. You reach down, grab ${him} under the armpits, and haul ${him} up, throwing ${him} across your desk. ${He} lands on ${his} back, and the impact drives the wind out of ${him}, so ${he} lies there, <span class="gold">all possibility of resistance driven out of ${him}.</span> ${App.Data.clothes.get(eventSlave.clothes).exposure >= 4 ? `${He}'s already naked, so there's no need to` : "You"} tear the clothes off ${him}. You force yourself in between ${his} legs as ${he} struggles to get ${his} breath back, and ${he} gets another good look at the formidable dick that's about to be slammed inside ${him}`); if (eventSlave.belly >= 5000) { t.push(`before it disappears beneath ${his} ${eventSlave.bellyPreg >= 3000 ? "pregnant" : belly} belly`); } diff --git a/src/events/RESS/hotPC.js b/src/events/RESS/hotPC.js index 45f6f499040428cc56145b92462f64bd1213dfcb..99fa49a67dac71ff32ff6017cc9919073d844835 100644 --- a/src/events/RESS/hotPC.js +++ b/src/events/RESS/hotPC.js @@ -157,7 +157,7 @@ App.Events.RESSHotPC = class RESSHotPC extends App.Events.BaseEvent { t = []; App.Events.addResponses(frag, [ - ((canDoVaginal(eventSlave) || canDoAnal(eventSlave))) + (canDoVaginal(eventSlave) || canDoAnal(eventSlave)) ? new App.Events.Result(`Fuck ${him} right here`, fuck, virginityWarning()) : new App.Events.Result(virginityWarning()), new App.Events.Result(`Have ${him} lick you clean`, lick), diff --git a/src/events/RESS/kitchenMolestation.js b/src/events/RESS/kitchenMolestation.js index 65d7c3189c84ea0ba1bc720134c6b8672340483f..0a4255dcfaef2ab13fe63e0b3de1313c928ccfc4 100644 --- a/src/events/RESS/kitchenMolestation.js +++ b/src/events/RESS/kitchenMolestation.js @@ -81,10 +81,10 @@ App.Events.RESSKitchenMolestation = class RESSKitchenMolestation extends App.Eve seX(s, "anal", eventSlave, "penetrative"); seX(s, "anal", PC, "penetrative"); if (canImpreg(s, PC)) { - t.push(knockMeUp(s, 5, 1, -1, true)); + knockMeUp(s, 5, 1, -1); } if (canImpreg(s, eventSlave)) { - t.push(knockMeUp(s, 5, 1, eventSlave.ID, true)); + knockMeUp(s, 5, 1, eventSlave.ID); } if (s.anus === 1) { s.trust -= 2; @@ -96,10 +96,10 @@ App.Events.RESSKitchenMolestation = class RESSKitchenMolestation extends App.Eve seX(s, "vaginal", eventSlave, "penetrative"); seX(s, "vaginal", PC, "penetrative"); if (canImpreg(s, PC)) { - t.push(knockMeUp(s, 5, 0, -1, true)); + knockMeUp(s, 5, 0, -1); } if (canImpreg(s, eventSlave)) { - t.push(knockMeUp(s, 5, 0, eventSlave.ID, true)); + knockMeUp(s, 5, 0, eventSlave.ID); } if (s.vagina === 1) { s.trust -= 2; @@ -109,10 +109,10 @@ App.Events.RESSKitchenMolestation = class RESSKitchenMolestation extends App.Eve seX(s, "anal", eventSlave, "penetrative"); seX(s, "vaginal", eventSlave, "penetrative"); if (canImpreg(s, PC)) { - t.push(knockMeUp(s, 5, 2, -1, true)); + knockMeUp(s, 5, 2, -1); } if (canImpreg(s, eventSlave)) { - t.push(knockMeUp(s, 5, 1, eventSlave.ID, true)); + knockMeUp(s, 5, 1, eventSlave.ID); } } } else if (canDoVaginal(s)) { @@ -120,10 +120,10 @@ App.Events.RESSKitchenMolestation = class RESSKitchenMolestation extends App.Eve seX(s, "vaginal", eventSlave, "penetrative"); seX(s, "vaginal", PC, "penetrative"); if (canImpreg(s, PC)) { - t.push(knockMeUp(s, 5, 0, -1, true)); + knockMeUp(s, 5, 0, -1); } if (canImpreg(s, eventSlave)) { - t.push(knockMeUp(s, 5, 0, eventSlave.ID, true)); + knockMeUp(s, 5, 0, eventSlave.ID); } if (s.vagina === 1) { s.trust -= 2; @@ -134,10 +134,10 @@ App.Events.RESSKitchenMolestation = class RESSKitchenMolestation extends App.Eve seX(s, "anal", eventSlave, "penetrative"); seX(s, "anal", PC, "penetrative"); if (canImpreg(s, PC)) { - t.push(knockMeUp(s, 5, 1, -1, true)); + knockMeUp(s, 5, 1, -1); } if (canImpreg(s, eventSlave)) { - t.push(knockMeUp(s, 5, 1, eventSlave.ID, true)); + knockMeUp(s, 5, 1, eventSlave.ID); } if (s.anus === 1) { s.trust -= 2; @@ -195,7 +195,7 @@ App.Events.RESSKitchenMolestation = class RESSKitchenMolestation extends App.Eve if (canGetPregnant(eventSlave) && eventSlave.mpreg === 1) { const pregSources = V.slaves.filter(s => canImpreg(eventSlave, s) && targetJobs.includes(s.assignment) && s.ID !== eventSlave.ID); if (pregSources.length > 0) { - t.push(knockMeUp(eventSlave, 50, 1, pregSources.pluck().ID, true)); + knockMeUp(eventSlave, 50, 1, pregSources.pluck().ID); } } V.slaves.forEach(function(s) { if (s.trust < 50 && targetJobs.includes(s.assignment) && s.ID !== eventSlave.ID) { s.trust += 4; } }); diff --git a/src/events/RESS/meanGirls.js b/src/events/RESS/meanGirls.js index da37c0c5685d2551ab3f55f7b91e2e08413a3833..c0924c6b42634e0812644692432a2ff00281b05b 100644 --- a/src/events/RESS/meanGirls.js +++ b/src/events/RESS/meanGirls.js @@ -98,147 +98,17 @@ App.Events.RESSMeanGirls = class RESSMeanGirls extends App.Events.BaseEvent { r.push(`reluctantly`); } r.push(`showing off ${his}`); - if (eventSlave.clothes === "no clothing") { - r.push(`nude`); - if (eventSlave.bellyPreg >= 1500) { - r.push(`pregnant`); - } else if (eventSlave.bellyImplant >= 1500) { - r.push(`gravid`); - } else if (eventSlave.bellyFluid >= 1500) { - r.push(`bloated`); - } - r.push(`body`); + if (eventSlave.bellyPreg >= 1500) { + r.push(`pregnant`); + } else if (eventSlave.bellyImplant >= 1500) { + r.push(`gravid`); + } else if (eventSlave.bellyFluid >= 1500) { + r.push(`bloated`); + } + if (App.Data.clothes.get(eventSlave.clothes).exposure >= 4) { + r.push(`nude body`); } else { - if (eventSlave.bellyPreg >= 1500) { - r.push(`pregnant`); - } else if (eventSlave.bellyImplant >= 1500) { - r.push(`gravid`); - } else if (eventSlave.bellyFluid >= 1500) { - r.push(`bloated`); - } - r.push(`body in ${his}`); - switch (eventSlave.clothes) { - case "a toga": - r.push(`toga`); - break; - case "a huipil": - r.push(`huipil`); - break; - case "a long qipao": - case "a slutty qipao": - r.push(`qipao`); - break; - case "a penitent nuns habit": - r.push(`habit`); - break; - case "a slave gown": - case "a ball gown": - r.push(`gown`); - break; - case "a comfortable bodysuit": - r.push(`bodysuit`); - break; - case "a leotard": - r.push(`leotard`); - break; - case "a bunny outfit": - r.push(`bunny outfit`); - break; - case "a nice nurse outfit": - r.push(`nurse outfit`); - break; - case "a slutty nurse outfit": - r.push(`slutty nurse outfit`); - break; - case "a schoolgirl outfit": - r.push(`school clothes`); - break; - case "a hijab and abaya": - r.push(`hijab and abaya`); - break; - case "a kimono": - r.push(`kimono`); - break; - case "a nice maid outfit": - r.push(`maid outfit`); - break; - case "a slutty maid outfit": - r.push(`skimpy maid outfit`); - break; - case "a biyelgee costume": - case "a dirndl": - case "a halter top dress": - case "a mini dress": - case "a maternity dress": - r.push(`dress`); - break; - case "a latex catsuit": - r.push(`latex catsuit`); - break; - case "a military uniform": - case "a mounty outfit": - case "a red army uniform": - case "a schutzstaffel uniform": - case "a slutty schutzstaffel uniform": - r.push(`uniform`); - break; - case "battlearmor": - r.push(`battlearmor`); - break; - case "Imperial Plate": - r.push(`imperial armor`); - break; - case "lederhosen": - r.push(`lederhosen`); - break; - case "spats and a tank top": - r.push(`spats`); - break; - case "a burkini": - case "a monokini": - r.push(`swimsuit`); - break; - case "a chattel habit": - case "a fallen nuns habit": - r.push(`slutty habit`); - break; - case "a cheerleader outfit": - r.push(`cheerleader outfit`); - break; - case "a cybersuit": - r.push(`cybersuit`); - break; - case "a tight Imperial bodysuit": - r.push(`imperial bodysuit`); - break; - case "an apron": - r.push(`apron`); - break; - case "a scalemail bikini": - r.push(`scalemail bikini`); - break; - case "a slutty outfit": - r.push(`slutty outfit`); - break; - case "a string bikini": - r.push(`string bikini`); - break; - case "a succubus outfit": - r.push(`succubus getup`); - break; - case "a hijab and blouse": - case "conservative clothing": - r.push(`conservative clothes`); - break; - case "a bimbo outfit": - r.push(`bimbo outfit`); - break; - case "a courtesan dress": - r.push(`courtesan dress`); - break; - default: - r.push(`${eventSlave.clothes}`); - } + r.push(`body in ${his} ${App.Data.clothes.get(eventSlave.clothes).name.toLowerCase()}`); } r.push(`and flirting with passersby. Or ${he} would be, if ${he} weren't surrounded by a hostile group of girls. They're very obviously inebriated, rich, vapid, and on vacation, and their rapid-fire bitchiness makes the cause clear.`); App.Events.addParagraph(node, r); diff --git a/src/events/RESS/obedientIdiot.js b/src/events/RESS/obedientIdiot.js index 23598c22a531fb28503c7e6ae9abe04f7517f425..9d2edffc55a0a6027e923ab5d2e1203fcc6c591e 100644 --- a/src/events/RESS/obedientIdiot.js +++ b/src/events/RESS/obedientIdiot.js @@ -76,7 +76,7 @@ App.Events.RESSObedientIdiot = class RESSObedientIdiot extends App.Events.BaseEv t.push(`${He} mumbles a hesitant question:`); t.push(Spoken(eventSlave, `"${eventSlave.rudeTitle === 1 ? PoliteRudeTitle(eventSlave) : Master}, am I a good slave?"`)); } - t.push(`You tell ${him} that ${he} is, running a hand ${eventSlave.hStyle === "shaved bald" ? `across ${his} bald scalp` : `through ${his} hair`}. ${He} seems <span class="devotion inc">reassured,</span> and <span class="trust inc">thankful</span> when you give ${him} a cup of ${his} proper rations from your own hand.`); + t.push(`You tell ${him} that ${he} is, running a hand ${eventSlave.hStyle.includes("bald") ? `across ${his} bald scalp` : `through ${his} hair`}. ${He} seems <span class="devotion inc">reassured,</span> and <span class="trust inc">thankful</span> when you give ${him} a cup of ${his} proper rations from your own hand.`); eventSlave.devotion += 2; eventSlave.trust += 2; diff --git a/src/events/RESS/tooThinForCumDiet.js b/src/events/RESS/tooThinForCumDiet.js index 84de69d9e16fe4c5b2918b79145a1f98edf90d27..ecc36a0d53602de673ac69965b1501fdb875fdc3 100644 --- a/src/events/RESS/tooThinForCumDiet.js +++ b/src/events/RESS/tooThinForCumDiet.js @@ -42,7 +42,7 @@ App.Events.RESSTooThinForCumDiet = class RESSTooThinForCumDiet extends App.Event t.push(`You are in your office, tending to the tedious business of requisition orders for your penthouse when you see`); t.push(contextualIntro(V.PC, eventSlave, "DOM")); t.push(`appear outside your door. ${He} hovers outside in the hall, peeking ${his} head around the entry-way, looking very unsure about disturbing you. You stop what you're doing and call ${him} in. ${He}'s reticent at first, but then ${he} obediently steps into your office. ${He} is`); - if (eventSlave.clothes === "no clothing") { + if (App.Data.clothes.get(eventSlave.clothes).exposure >= 4) { t.push(`forced to remain naked at all times, and the most striking thing about ${his} body is how`); if (eventSlave.belly >= 100000) { if (eventSlave.bellyPreg >= 3000) { diff --git a/src/events/RESS/waistlineWoes.js b/src/events/RESS/waistlineWoes.js index c03c65210abf70e41fc1fe843f3377cf187b98f1..77965ec6a9e188be8debd561047880ed1e03b2da 100644 --- a/src/events/RESS/waistlineWoes.js +++ b/src/events/RESS/waistlineWoes.js @@ -235,16 +235,16 @@ App.Events.RESSWaistlineWoes = class RESSWaistlineWoes extends App.Events.BaseEv if (eventSlave.behavioralQuirk === "fitness") { t.push(`${He} brightens, catching on immediately and nodding ${his} head with understanding`); if (V.PC.dick === 0) { - t.push(`before quickly ${eventSlave.clothes !== "no clothing" && eventSlave.clothes !== "body oil" ? `shedding ${his} clothes and` : ""} retrieving an appropriate dildo, eager for the workout.`); + t.push(`before quickly ${App.Data.clothes.get(eventSlave.clothes).exposure <= 3 ? `shedding ${his} clothes and` : ""} retrieving an appropriate dildo, eager for the workout.`); } else { - t.push(`${eventSlave.clothes !== "no clothing" && eventSlave.clothes !== "body oil" ? "before" : ""} quickly ${eventSlave.clothes !== "no clothing" && eventSlave.clothes !== "body oil" ? `shedding ${his} clothes` : ""}, eager for the workout.`); + t.push(`${App.Data.clothes.get(eventSlave.clothes).exposure <= 3 ? "before" : ""} quickly ${App.Data.clothes.get(eventSlave.clothes).exposure <= 3 ? `shedding ${his} clothes` : ""}, eager for the workout.`); } } else { t.push(`${He} catches on quickly, nodding ${his} head with understanding`); if (V.PC.dick === 0) { - t.push(`before ${eventSlave.clothes !== "no clothing" && eventSlave.clothes !== "body oil" ? `shedding ${his} clothes and` : ""} retrieving an appropriate dildo, glad for the opportunity.`); + t.push(`before ${App.Data.clothes.get(eventSlave.clothes).exposure <= 3 ? `shedding ${his} clothes and` : ""} retrieving an appropriate dildo, glad for the opportunity.`); } else { - t.push(`${eventSlave.clothes !== "no clothing" && eventSlave.clothes !== "body oil" ? `before shedding ${his} clothes` : ""}, glad for the opportunity.`); + t.push(`${App.Data.clothes.get(eventSlave.clothes).exposure <= 3 ? `before shedding ${his} clothes` : ""}, glad for the opportunity.`); } } t.push(`${His} hips settle close to yours, moving seductively while ${he} makes a show of undressing you. ${His} fingers smooth`); diff --git a/src/events/RETS/reAnalCowgirl.js b/src/events/RETS/reAnalCowgirl.js index 79ca7821de80e541ddeb5f6b4bac36ea7cf06243..bd2d3d11c8bb53b9a65c4c9512d2487ce192a77a 100644 --- a/src/events/RETS/reAnalCowgirl.js +++ b/src/events/RETS/reAnalCowgirl.js @@ -289,7 +289,7 @@ App.Events.RETSAnalCowgirl = class RETSAnalCowgirl extends App.Events.BaseEvent subSlave.trust += 2; seX(subSlave, "anal", eventSlave, "penetrative"); if (canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 1, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 1, eventSlave.ID); } return t; } @@ -387,10 +387,10 @@ App.Events.RETSAnalCowgirl = class RETSAnalCowgirl extends App.Events.BaseEvent t.push(`climaxes quickly despite having no sensation in ${his} fake dick, since ${he} finds the situation so arousing.`); } if (canImpreg(subSlave, V.PC)) { - t.push(knockMeUp(subSlave, 5, 0, -1, true)); + knockMeUp(subSlave, 5, 0, -1); } if (canP && canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 1, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 1, eventSlave.ID); } seX(subSlave, "vaginal", V.PC, "penetrative"); } else if (subSlave.anus > 2) { @@ -401,10 +401,10 @@ App.Events.RETSAnalCowgirl = class RETSAnalCowgirl extends App.Events.BaseEvent t.push(`climaxes quickly despite having no sensation in ${his} fake dick, since ${he} finds the situation so arousing.`); } if (canImpreg(subSlave, V.PC)) { - t.push(knockMeUp(subSlave, 5, 1, -1, true)); + knockMeUp(subSlave, 5, 1, -1); } if (canP && canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 1, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 1, eventSlave.ID); } seX(subSlave, "anal", V.PC, "penetrative"); } else { @@ -415,10 +415,10 @@ App.Events.RETSAnalCowgirl = class RETSAnalCowgirl extends App.Events.BaseEvent t.push(`climaxes quickly despite having no sensation in ${his} fake dick, since ${he} finds the situation so arousing.`); } if (canImpreg(subSlave, V.PC)) { - t.push(knockMeUp(subSlave, 5, 1, -1, true)); + knockMeUp(subSlave, 5, 1, -1); } if (canP && canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 1, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 1, eventSlave.ID); } seX(subSlave, "anal", V.PC, "penetrative"); } diff --git a/src/events/RETS/reBoobCollision.js b/src/events/RETS/reBoobCollision.js index 7073f83e50f33b31adf834f9fb026e24629eeda8..f09e2804c761be4f69cc9d938f6a1b6c4e08a6cb 100644 --- a/src/events/RETS/reBoobCollision.js +++ b/src/events/RETS/reBoobCollision.js @@ -65,7 +65,7 @@ App.Events.RETSBoobCollision = class RETSBoobCollision extends App.Events.BaseEv t.push(`huge boobs getting in the way`); } t.push(`as ${he} rushes around. Returning from the shower to the sleeping area, ${he} turns a corner and runs hard into`); - t.push(App.UI.DOM.combineNodes(contextualIntro(eventSlave, subSlave, "DOM"),".")); + t.push(App.UI.DOM.combineNodes(contextualIntro(eventSlave, subSlave, "DOM"), ".")); t.push(`Both slaves are nude, and the collision of their massive breasts makes an audibly painful smack. ${eventSlave.slaveName} has enough momentum that ${he} overbears the top-heavy ${subSlave.slaveName} entirely. The poor`); if (subSlave.physicalAge > 30) { t.push(woman2); @@ -144,7 +144,7 @@ App.Events.RETSBoobCollision = class RETSBoobCollision extends App.Events.BaseEv } seX(subSlave, "anal", eventSlave, "penetrative"); if (canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 1, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 1, eventSlave.ID); } } else { t.push(`pushes ${subSlave.slaveName}'s legs apart to rotate ${his2} hips, reaches down, and`); @@ -155,7 +155,7 @@ App.Events.RETSBoobCollision = class RETSBoobCollision extends App.Events.BaseEv } seX(subSlave, "anal", eventSlave, "penetrative"); if (canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 1, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 1, eventSlave.ID); } } } else { @@ -170,7 +170,7 @@ App.Events.RETSBoobCollision = class RETSBoobCollision extends App.Events.BaseEv } seX(subSlave, "vaginal", eventSlave, "penetrative"); if (canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 0, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 0, eventSlave.ID); } } else { t.push(`reaches down`); @@ -181,7 +181,7 @@ App.Events.RETSBoobCollision = class RETSBoobCollision extends App.Events.BaseEv } seX(subSlave, "vaginal", eventSlave, "penetrative"); if (canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 0, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 0, eventSlave.ID); } } } @@ -269,13 +269,13 @@ App.Events.RETSBoobCollision = class RETSBoobCollision extends App.Events.BaseEv t.push(`push your cock against ${eventSlave.slaveName}'s tight asshole, causing ${him} to stiffen and struggle momentarily before it pops inside ${him}. After giving ${his} butt a thorough fuck, you move your wet cockhead down ${his} soft perineum`); seX(subSlave, "anal", V.PC, "penetrative"); if (canImpreg(eventSlave, V.PC)) { - t.push(knockMeUp(eventSlave, 5, 1, -1, true)); + knockMeUp(eventSlave, 5, 1, -1); } } else { t.push(`push your cock up ${eventSlave.slaveName}'s asspussy, which accepts it with ease. After giving it a good hard reaming, you move your wet cockhead down ${his} soft perineum`); seX(subSlave, "anal", V.PC, "penetrative"); if (canImpreg(eventSlave, V.PC)) { - t.push(knockMeUp(eventSlave, 5, 1, -1, true)); + knockMeUp(eventSlave, 5, 1, -1); } } if (!canDoVaginal(eventSlave) || (eventSlave.vagina === 0)) { @@ -284,7 +284,7 @@ App.Events.RETSBoobCollision = class RETSBoobCollision extends App.Events.BaseEv t.push(`and into ${his} cunt, giving it a good hard fuck.`); seX(eventSlave, "vaginal", V.PC, "penetrative"); if (canImpreg(eventSlave, V.PC)) { - t.push(knockMeUp(eventSlave, 5, 0, -1, true)); + knockMeUp(eventSlave, 5, 0, -1); } } t.push(`Then you see to ${subSlave.slaveName} beneath ${him},`); @@ -292,7 +292,7 @@ App.Events.RETSBoobCollision = class RETSBoobCollision extends App.Events.BaseEv t.push(`giving ${him2} a turn with ${his2} owner's cock inside ${his2} womanhood before`); seX(eventSlave, "vaginal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)) { - t.push(knockMeUp(subSlave, 5, 0, -1, true)); + knockMeUp(subSlave, 5, 0, -1); } } if (subSlave.anus === 0 || !canDoAnal(subSlave)) { @@ -301,7 +301,7 @@ App.Events.RETSBoobCollision = class RETSBoobCollision extends App.Events.BaseEv t.push(`giving ${him2} as hard a buttfuck as you can manage with ${eventSlave.slaveName} between you.`); seX(subSlave, "anal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)) { - t.push(knockMeUp(subSlave, 5, 1, -1, true)); + knockMeUp(subSlave, 5, 1, -1); } } } @@ -365,10 +365,10 @@ App.Events.RETSBoobCollision = class RETSBoobCollision extends App.Events.BaseEv seX(eventSlave, "anal", subSlave, "penetrative"); seX(eventSlave, "anal", V.PC, "penetrative"); if (canImpreg(eventSlave, V.PC)) { - t.push(knockMeUp(eventSlave, 5, 1, -1, true)); + knockMeUp(eventSlave, 5, 1, -1); } if (canImpreg(eventSlave, subSlave)) { - t.push(knockMeUp(eventSlave, 5, 1, subSlave.ID, true)); + knockMeUp(eventSlave, 5, 1, subSlave.ID); } } else { t.push(`fingerfuck ${him}. ${subSlave.slaveName} obeys hurriedly, reaching inward and`); @@ -398,7 +398,7 @@ App.Events.RETSBoobCollision = class RETSBoobCollision extends App.Events.BaseEv } t.push(`slide between ${subSlave.slaveName}'s fingers, ${cm} by agonizing ${cm}, and seat itself up ${his} butt. ${He} shudders when you begin to thrust. ${subSlave.slaveName} keeps ${his2} fingers where they are, doing ${his2} best to use them to give you a handjob inside ${eventSlave.slaveName}'s ass.`); if (canImpreg(eventSlave, V.PC)) { - t.push(knockMeUp(eventSlave, 5, 1, -1, true)); + knockMeUp(eventSlave, 5, 1, -1); } } t.push(`When you're done, you pull out, leaving ${eventSlave.slaveName} to collapse, whimpering and shaking, onto ${subSlave.slaveName}'s boobs. ${subSlave.slaveName}`); diff --git a/src/events/RETS/reCockmilkInterception.js b/src/events/RETS/reCockmilkInterception.js index 266b9f5c4d069f611f398e4b13f8f891ae442de4..b8e6b31138ae645ea56c1cdf5e4bf88d118f00df 100644 --- a/src/events/RETS/reCockmilkInterception.js +++ b/src/events/RETS/reCockmilkInterception.js @@ -363,7 +363,7 @@ App.Events.RETSCockmilkInterception = class RETSCockmilkInterception extends App seX(subSlave, "anal", V.PC, "penetrative"); actX(subSlave, "vaginal"); if (canImpreg(slave, V.PC)) { - t.push(knockMeUp(slave, 5, 1, -1, true)); + knockMeUp(slave, 5, 1, -1); } } else if (subSlave.anus > 2 && doAnal) { t.push(`${His2} ass is so relaxed that your`); @@ -380,7 +380,7 @@ App.Events.RETSCockmilkInterception = class RETSCockmilkInterception extends App } seX(subSlave, "anal", V.PC, "penetrative"); if (canImpreg(slave, V.PC)) { - t.push(knockMeUp(slave, 5, 1, -1, true)); + knockMeUp(slave, 5, 1, -1); } } else { t.push(`The stimulator is effective enough, but it can't match `); @@ -393,12 +393,12 @@ App.Events.RETSCockmilkInterception = class RETSCockmilkInterception extends App if (doAnal) { seX(subSlave, "anal", V.PC, "penetrative"); if (canImpreg(slave, V.PC)) { - t.push(knockMeUp(slave, 5, 1, -1, true)); + knockMeUp(slave, 5, 1, -1); } } else { seX(subSlave, "vaginal", V.PC, "penetrative"); if (canImpreg(slave, V.PC)) { - t.push(knockMeUp(slave, 5, 0, -1, true)); + knockMeUp(slave, 5, 0, -1); } } } @@ -442,12 +442,12 @@ App.Events.RETSCockmilkInterception = class RETSCockmilkInterception extends App if (canDoAnal(slave) && slave.anus > 0) { seX(subSlave, "anal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)) { - t.push(knockMeUp(subSlave, 5, 1, -1, true)); + knockMeUp(subSlave, 5, 1, -1); } } else if (canDoVaginal(slave) && slave.vagina > 0) { seX(subSlave, "vaginal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)) { - t.push(knockMeUp(subSlave, 5, 0, -1, true)); + knockMeUp(subSlave, 5, 0, -1); } } } else { @@ -547,7 +547,7 @@ App.Events.RETSCockmilkInterception = class RETSCockmilkInterception extends App t = []; t.push(`You order ${slave.slaveName} to put the dick back where it belongs and come out from under there. There's a lewd noise as ${he} spits out ${subSlave.slaveName}'s penis.`, Spoken(slave, `"Yes, ${getWrittenTitle(slave)}!"`), `${he} ${say}s automatically, knowing your voice, and ${he} scrabbles to obey, stuffing poor moaning ${subSlave.slaveName}'s member back in its proper cum receptacle before hurriedly scooting out from under,`); - if (slave.clitSetting === "cumslut") { // is cumslut missing from slavestate clitSetting or is this incorrect?? + if (slave.clitSetting === "oral") { t.push(`gasping with the stimulation applied by ${his} smart piercing, which is encouraging ${him} to suck dick.`); } else if (slave.belly >= 10000) { t.push(`a struggle considering just how big ${his}`); diff --git a/src/events/RETS/reIfYouEnjoyIt.js b/src/events/RETS/reIfYouEnjoyIt.js index 123638aac4b45725e983e406d4380fee4b72bb73..25990d6d28c6aa52ede80ed4c2a8d3b2bea28997 100644 --- a/src/events/RETS/reIfYouEnjoyIt.js +++ b/src/events/RETS/reIfYouEnjoyIt.js @@ -208,7 +208,7 @@ App.Events.RETSIfYouEnjoyIt = class RETSIfYouEnjoyIt extends App.Events.BaseEven subSlave.fetishKnown = 1; subSlave.fetishStrength = 65; if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 20, 1, eventSlave.ID, true)); + knockMeUp(subSlave, 20, 1, eventSlave.ID); } App.Events.addParagraph(frag, t); return frag; @@ -323,7 +323,7 @@ App.Events.RETSIfYouEnjoyIt = class RETSIfYouEnjoyIt extends App.Events.BaseEven subSlave.trust -= 4; subSlave.devotion += 4; if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 20, 1, eventSlave.ID, true)); + knockMeUp(subSlave, 20, 1, eventSlave.ID); } return t; diff --git a/src/events/RETS/reIncestuousNursing.js b/src/events/RETS/reIncestuousNursing.js index 44e02efd5c43b0f0bf2fe46457f98bfa31d97387..2947e3a3fcc910662ba2e79f2489b6d454ce66d9 100644 --- a/src/events/RETS/reIncestuousNursing.js +++ b/src/events/RETS/reIncestuousNursing.js @@ -346,7 +346,7 @@ App.Events.RETSIncestuousNursing = class RETSIncestuousNursing extends App.Event } seX(eventSlave, "anal", subSlave, "penetrative"); if (canPenetrate(subSlave) && canImpreg(eventSlave, subSlave)) { - t.push(knockMeUp(eventSlave, 5, 1, subSlave.ID, true)); + knockMeUp(eventSlave, 5, 1, subSlave.ID); } break; case "boobs": @@ -370,13 +370,13 @@ App.Events.RETSIncestuousNursing = class RETSIncestuousNursing extends App.Event t.push(Spoken(eventSlave, `"fill my pussy with your cum. Make a sister for yourself."`)); seX(subSlave, "penetrative", eventSlave, "vaginal"); if (canImpreg(eventSlave, subSlave)) { - t.push(knockMeUp(eventSlave, 5, 0, subSlave.ID, true)); + knockMeUp(eventSlave, 5, 0, subSlave.ID); } } else if (canDoAnal(eventSlave) && canPenetrate(subSlave) && eventSlave.mpreg === 1) { t.push(Spoken(eventSlave, `"fill my ass with your cum. I know it seems wrong, but that's where my babies come from. So please, make a sister for yourself."`)); seX(eventSlave, "anal", subSlave, "penetrative"); if (canImpreg(eventSlave, subSlave)) { - t.push(knockMeUp(eventSlave, 5, 1, subSlave.ID, true)); + knockMeUp(eventSlave, 5, 1, subSlave.ID); } } else if (eventSlave.pregKnown === 1) { t.push(Spoken(eventSlave, `"and keep doing that. Just, just touch my belly, too.`)); diff --git a/src/events/RETS/reInterslaveBegging.js b/src/events/RETS/reInterslaveBegging.js index 92bd8f4db86c3ca140ec655a222ded85793ff3d8..a5da5129913edd611a23550b57e688e1bdaeb4c5 100644 --- a/src/events/RETS/reInterslaveBegging.js +++ b/src/events/RETS/reInterslaveBegging.js @@ -352,12 +352,12 @@ App.Events.RETSInterslaveBegging = class RETSInterslaveBegging extends App.Event if (vaginal) { seX(subSlave, "vaginal", eventSlave, "penetrative"); if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 0, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 0, eventSlave.ID); } } else { seX(subSlave, "anal", eventSlave, "penetrative"); if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 1, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 1, eventSlave.ID); } } App.Events.addParagraph(frag, t); @@ -537,12 +537,12 @@ App.Events.RETSInterslaveBegging = class RETSInterslaveBegging extends App.Event if (vaginal) { seX(subSlave, "vaginal", eventSlave, "penetrative"); if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 0, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 0, eventSlave.ID); } } else { seX(subSlave, "anal", eventSlave, "penetrative"); if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 1, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 1, eventSlave.ID); } } App.Events.addParagraph(frag, t); @@ -712,25 +712,25 @@ App.Events.RETSInterslaveBegging = class RETSInterslaveBegging extends App.Event if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) { seX(eventSlave, "vaginal", V.PC, "penetrative"); if (canImpreg(eventSlave, V.PC)) { - t.push(knockMeUp(eventSlave, 5, 0, -1, true)); + knockMeUp(eventSlave, 5, 0, -1); } } else { seX(eventSlave, "anal", V.PC, "penetrative"); if (canImpreg(eventSlave, V.PC)) { - t.push(knockMeUp(eventSlave, 5, 1, -1, true)); + knockMeUp(eventSlave, 5, 1, -1); } } if (vaginal) { subSlave.devotion += 3; seX(subSlave, "vaginal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)) { - t.push(knockMeUp(subSlave, 15, 0, -1, true)); + knockMeUp(subSlave, 15, 0, -1); } } else { subSlave.devotion += 3; seX(subSlave, "vaginal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)) { - t.push(knockMeUp(subSlave, 15, 1, -1, true)); + knockMeUp(subSlave, 15, 1, -1); } } @@ -832,13 +832,13 @@ App.Events.RETSInterslaveBegging = class RETSInterslaveBegging extends App.Event subSlave.trust -= 3; seX(subSlave, "vaginal", eventSlave, "penetrative"); if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 0, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 0, eventSlave.ID); } } else { subSlave.trust -= 3; seX(subSlave, "vaginal", eventSlave, "penetrative"); if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 1, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 1, eventSlave.ID); } } diff --git a/src/events/RETS/reRepressedAnalVirgin.js b/src/events/RETS/reRepressedAnalVirgin.js index 2ac8f569e043549e9254d56d63a84c42853f4117..019583561ae7584a5cbb369e3e6fc67038fe0f0e 100644 --- a/src/events/RETS/reRepressedAnalVirgin.js +++ b/src/events/RETS/reRepressedAnalVirgin.js @@ -89,7 +89,7 @@ App.Events.RETSAnalRepressedVirgin = class RETSAnalRepressedVirgin extends App.E t.push(Spoken(eventSlave, `"I'm s-sorry, ${getWrittenTitle(eventSlave)}, but I still don't understand. I thought sex happened in a v-vagina. I d-didn't think b-butts were — were for, you know, that."`)); seX(subSlave, "anal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)) { - t.push(knockMeUp(subSlave, 5, 1, -1, true)); + knockMeUp(subSlave, 5, 1, -1); } App.Events.addResponses(node, [ @@ -173,7 +173,7 @@ App.Events.RETSAnalRepressedVirgin = class RETSAnalRepressedVirgin extends App.E eventSlave.anus += 1; seX(eventSlave, "anal", V.PC, "penetrative"); if (canImpreg(eventSlave, V.PC)) { - t.push(knockMeUp(eventSlave, 5, 1, -1, true)); + knockMeUp(eventSlave, 5, 1, -1); } App.Events.addParagraph(frag, t); return frag; @@ -219,7 +219,7 @@ App.Events.RETSAnalRepressedVirgin = class RETSAnalRepressedVirgin extends App.E eventSlave.anus += 1; seX(eventSlave, "anal", V.PC, "penetrative"); if (canImpreg(eventSlave, V.PC)) { - t.push(knockMeUp(eventSlave, 5, 1, -1, true)); + knockMeUp(eventSlave, 5, 1, -1); } return t; } @@ -263,7 +263,7 @@ App.Events.RETSAnalRepressedVirgin = class RETSAnalRepressedVirgin extends App.E eventSlave.anus += 1; seX(eventSlave, "anal", "public", "penetrative"); if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") { - t.push(knockMeUp(eventSlave, 5, 1, -2, true)); + knockMeUp(eventSlave, 5, 1, -2); } return t; } diff --git a/src/events/RETS/reSadisticDescription.js b/src/events/RETS/reSadisticDescription.js index 1ccadf5ae67fa099397a0b2d2f057f3e62458bca..8265d32fb81874b47a5f46becbc51f329812f5cb 100644 --- a/src/events/RETS/reSadisticDescription.js +++ b/src/events/RETS/reSadisticDescription.js @@ -223,7 +223,7 @@ App.Events.RETSSadisticDescription = class RETSSadisticDescription extends App.E subSlave.devotion -= 5; seX(subSlave, "anal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)) { - t.push(knockMeUp(subSlave, 5, 1, -1, true)); + knockMeUp(subSlave, 5, 1, -1); } return t; @@ -326,7 +326,7 @@ App.Events.RETSSadisticDescription = class RETSSadisticDescription extends App.E eventSlave.devotion += 5; seX(eventSlave, "anal", V.PC, "penetrative"); if (canImpreg(eventSlave, V.PC)) { - t.push(knockMeUp(eventSlave, 5, 1, -1, true)); + knockMeUp(eventSlave, 5, 1, -1); } subSlave.trust -= 5; subSlave.devotion += 5; diff --git a/src/events/RETS/reShowerForce.js b/src/events/RETS/reShowerForce.js index 4ac56a98b8a0463eff83a505145f76a577cce28a..d293e4c9d41dc0b3af74e6b9d9dac94394c0cfb6 100644 --- a/src/events/RETS/reShowerForce.js +++ b/src/events/RETS/reShowerForce.js @@ -126,7 +126,7 @@ App.Events.RETSShowerForce = class RETSShowerForce extends App.Events.BaseEvent seX(subSlave, "anal", eventSlave, "penetrative"); subSlave.trust += 4; if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 1, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 1, eventSlave.ID); } return t; } @@ -175,10 +175,10 @@ App.Events.RETSShowerForce = class RETSShowerForce extends App.Events.BaseEvent seX(subSlave, "anal", eventSlave, "penetrative"); seX(subSlave, "anal", V.PC, "penetrative"); if (canImpreg(subSlave, V.PC)) { - t.push(knockMeUp(subSlave, 5, 1, -1, true)); + knockMeUp(subSlave, 5, 1, -1); } if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) { - t.push(knockMeUp(subSlave, 5, 1, eventSlave.ID, true)); + knockMeUp(subSlave, 5, 1, eventSlave.ID); } return t; } diff --git a/src/events/RETS/reSimpleAssault.js b/src/events/RETS/reSimpleAssault.js index 9df1d133a614b69ce863f00b908a96e08120a5d2..408a67752e77427438a54117bf1f0aed06e7b17f 100644 --- a/src/events/RETS/reSimpleAssault.js +++ b/src/events/RETS/reSimpleAssault.js @@ -151,23 +151,23 @@ App.Events.RETSSimpleAssault = class RETSSimpleAssault extends App.Events.BaseEv if (domSlave.vagina !== 0 && canDoVaginal(domSlave)) { seX(domSlave, "vaginal", PC, "penetrative"); if (canImpreg(domSlave, PC)) { - t.push(knockMeUp(domSlave, 5, 0, -1, true)); + knockMeUp(domSlave, 5, 0, -1); } } else { seX(domSlave, "anal", PC, "penetrative"); if (canImpreg(domSlave, PC)) { - t.push(knockMeUp(domSlave, 5, 1, -1, true)); + knockMeUp(domSlave, 5, 1, -1); } } if (vaginal) { seX(subSlave, "vaginal", domSlave, "penetrative"); if (canPenetrate(domSlave) && canImpreg(subSlave, domSlave)) { - t.push(knockMeUp(subSlave, 5, 0, domSlave.ID, true)); + knockMeUp(subSlave, 5, 0, domSlave.ID); } } else { seX(subSlave, "anal", domSlave, "penetrative"); if (canPenetrate(domSlave) && canImpreg(subSlave, domSlave)) { - t.push(knockMeUp(subSlave, 5, 1, domSlave.ID, true)); + knockMeUp(subSlave, 5, 1, domSlave.ID); } } return t; @@ -195,18 +195,18 @@ App.Events.RETSSimpleAssault = class RETSSimpleAssault extends App.Events.BaseEv if (vaginal) { seX(subSlave, "vaginal", domSlave, "penetrative"); if (canImpreg(domSlave, PC)) { - t.push(knockMeUp(domSlave, 5, 0, -1, true)); + knockMeUp(domSlave, 5, 0, -1); } if (canPenetrate(domSlave) && canImpreg(subSlave, domSlave)) { - t.push(knockMeUp(subSlave, 5, 0, domSlave.ID, true)); + knockMeUp(subSlave, 5, 0, domSlave.ID); } } else { seX(subSlave, "anal", domSlave, "penetrative"); if (canImpreg(domSlave, PC)) { - t.push(knockMeUp(domSlave, 5, 1, -1, true)); + knockMeUp(domSlave, 5, 1, -1); } if (canPenetrate(domSlave) && canImpreg(subSlave, domSlave)) { - t.push(knockMeUp(subSlave, 5, 1, domSlave.ID, true)); + knockMeUp(subSlave, 5, 1, domSlave.ID); } } if (!fit) { diff --git a/src/events/RETS/reTasteTest.js b/src/events/RETS/reTasteTest.js index aa648d60fae95cea3d648e9ceeea341a5262977d..7df10d0394ff29c1edd42c530c435146f15495b6 100644 --- a/src/events/RETS/reTasteTest.js +++ b/src/events/RETS/reTasteTest.js @@ -420,11 +420,11 @@ App.Events.RETSTasteTest = class RETSTasteTest extends App.Events.BaseEvent { subSlave.devotion += 2; if (sexTarget === "vaginal") { if (canImpreg(subSlave, V.PC)) { - t.push(knockMeUp(subSlave, 5, 0, -1, true)); + knockMeUp(subSlave, 5, 0, -1); } } else { if (canImpreg(subSlave, V.PC)) { - t.push(knockMeUp(subSlave, 5, 1, -1, true)); + knockMeUp(subSlave, 5, 1, -1); } } seX(subSlave, sexTarget, V.PC, "penetrative", 2); @@ -432,14 +432,14 @@ App.Events.RETSTasteTest = class RETSTasteTest extends App.Events.BaseEvent { if (canDoVaginal(eventSlave) && eventSlave.vagina !== 0) { seX(eventSlave, "vaginal", V.PC, "penetrative"); if (canImpreg(eventSlave, V.PC)) { - t.push(knockMeUp(eventSlave, 5, 0, -1, true)); + knockMeUp(eventSlave, 5, 0, -1); } seX(eventSlave, "oral", subSlave, "oral"); } if (canDoAnal(subSlave) && subSlave.anus !== 0) { seX(eventSlave, "anal", V.PC, "penetrative"); if (canImpreg(eventSlave, V.PC)) { - t.push(knockMeUp(eventSlave, 5, 0, -1, true)); + knockMeUp(eventSlave, 5, 0, -1); } seX(eventSlave, "oral", subSlave, "oral"); } diff --git a/src/events/RETS/reTopExhaustion.js b/src/events/RETS/reTopExhaustion.js index 4db34abde09ced7cc20d6439fb803f3a20ac8125..f20f42b963d40a6fa04e8bfe74b0c2a22d24bc3a 100644 --- a/src/events/RETS/reTopExhaustion.js +++ b/src/events/RETS/reTopExhaustion.js @@ -119,7 +119,7 @@ App.Events.RETSTopExhaustion = class RETSTopExhaustion extends App.Events.BaseEv t.push(`${He} can barely feel ${his} lover's tiny cock inside ${his} relaxed hole.`); } if (canImpreg(subSlave, domSlave)) { - knockMeUp(subSlave, 10, 1, domSlave.ID, true); + knockMeUp(subSlave, 10, 1, domSlave.ID); } } else { t.push(`${His} lover is using a formidable phallus, but ${he} was clearly fucked into a nice relaxed gape a while ago.`); @@ -136,7 +136,7 @@ App.Events.RETSTopExhaustion = class RETSTopExhaustion extends App.Events.BaseEv t.push(`${He} lover's dick is a little on the small side, but ${he}'s enjoying it all the same.`); } if (canImpreg(subSlave, domSlave)) { - knockMeUp(subSlave, 10, 1, domSlave.ID, true); + knockMeUp(subSlave, 10, 1, domSlave.ID); } } else { t.push(`${His} lover is using a formidable phallus, but ${his} tight ass has clearly been worked in gradually tonight, and ${he}'s taking it just fine.`); @@ -156,7 +156,7 @@ App.Events.RETSTopExhaustion = class RETSTopExhaustion extends App.Events.BaseEv t.push(`${He} can barely feel ${his} lover's tiny cock inside ${his} relaxed hole.`); } if (canImpreg(subSlave, domSlave)) { - knockMeUp(subSlave, 10, 0, domSlave.ID, true); + knockMeUp(subSlave, 10, 0, domSlave.ID); } } else { t.push(`${His} lover is using a formidable phallus, but ${he}'s relaxed and taking it easily.`); @@ -173,7 +173,7 @@ App.Events.RETSTopExhaustion = class RETSTopExhaustion extends App.Events.BaseEv t.push(`${He} lover's dick is a little on the small side, but ${he}'s enjoying it all the same.`); } if (canImpreg(subSlave, domSlave)) { - knockMeUp(subSlave, 10, 0, domSlave.ID, true); + knockMeUp(subSlave, 10, 0, domSlave.ID); } } else { t.push(`${His} lover is using a formidable phallus, but ${his} tight little pussy has clearly been worked in gradually tonight, and ${he}'s taking it just fine.`); @@ -331,14 +331,14 @@ App.Events.RETSTopExhaustion = class RETSTopExhaustion extends App.Events.BaseEv seX(subSlave, "anal", PC, "penetrative"); if (canPenetrate(domSlave)) { if (canImpreg(subSlave, domSlave)) { - knockMeUp(subSlave, 5, 1, domSlave.ID, true); + knockMeUp(subSlave, 5, 1, domSlave.ID); } if (canImpreg(subSlave, PC)) { - knockMeUp(subSlave, 5, 1, -1, true); + knockMeUp(subSlave, 5, 1, -1); } } else { if (canImpreg(subSlave, PC)) { - knockMeUp(subSlave, 5, 1, -1, true); + knockMeUp(subSlave, 5, 1, -1); } } } else { @@ -346,14 +346,14 @@ App.Events.RETSTopExhaustion = class RETSTopExhaustion extends App.Events.BaseEv seX(subSlave, "vaginal", PC, "penetrative"); if (canPenetrate(domSlave)) { if (canImpreg(subSlave, domSlave)) { - knockMeUp(subSlave, 5, 0, domSlave.ID, true); + knockMeUp(subSlave, 5, 0, domSlave.ID); } if (canImpreg(subSlave, PC)) { - knockMeUp(subSlave, 5, 0, -1, true); + knockMeUp(subSlave, 5, 0, -1); } } else { if (canImpreg(subSlave, PC)) { - knockMeUp(subSlave, 5, 0, -1, true); + knockMeUp(subSlave, 5, 0, -1); } } } @@ -427,12 +427,12 @@ App.Events.RETSTopExhaustion = class RETSTopExhaustion extends App.Events.BaseEv if (usingAss) { seX(subSlave, "anal", PC, "penetrative"); if (canImpreg(subSlave, PC)) { - knockMeUp(subSlave, 5, 1, -1, true); + knockMeUp(subSlave, 5, 1, -1); } } else { seX(subSlave, "vaginal", PC, "penetrative"); if (canImpreg(subSlave, PC)) { - knockMeUp(subSlave, 5, 1, -1, true); + knockMeUp(subSlave, 5, 1, -1); } } } diff --git a/src/events/assistant/assistantSP.js b/src/events/assistant/assistantSP.js index 32e9a9d441619bbe18f369af9d7b68ea56a5a4ff..2e05964e0f9bc99df3f5537e89f6ce99e28f6265 100644 --- a/src/events/assistant/assistantSP.js +++ b/src/events/assistant/assistantSP.js @@ -19,7 +19,7 @@ App.Events.assistantSP = class assistantSP extends App.Events.BaseEvent { let r = []; V.assistant.options = 1; - const slave = V.slaves.find(s => s.rules.release.masturbation === 1 || s.assignment === "take classes") || V.slaves.random(); + const slave = V.slaves.find(s => s.rules.release.masturbation === 1 || s.assignment === Job.CLASSES) || V.slaves.random(); const {him} = getPronouns(slave); const artFrame = V.seeImages ? node.append(App.UI.DOM.assistantArt(3)) : new DocumentFragment(); diff --git a/src/events/intro/introSummary.js b/src/events/intro/introSummary.js index 80c9e0b4f2af68799083f352ed63b4002e36fbbb..4841494db14a3bddc92cbc3eb37678d63ff37afc 100644 --- a/src/events/intro/introSummary.js +++ b/src/events/intro/introSummary.js @@ -711,4 +711,4 @@ App.Intro.economy = function(isIntro) { V.modCost = Math.trunc(5000 / V.economy); V.surgeryCost = Math.trunc(30000 / V.economy); } -} +}; diff --git a/src/events/nonRandom/daughters/pCoupAttempt.tw b/src/events/nonRandom/daughters/pCoupAttempt.tw index 5839cc217ec274cfcf0cb2d79033045397467adf..ba3a05fd5c9853ac414589eb39468a65670933c7 100644 --- a/src/events/nonRandom/daughters/pCoupAttempt.tw +++ b/src/events/nonRandom/daughters/pCoupAttempt.tw @@ -91,7 +91,7 @@ You are awakened in the middle of the night by a jolt that shakes the entire arc <<elseif _SecExpUnits >= 4>> small <</if>> - private army quickly and efficently contribues to the defense of $arcologies[0].name. + private army quickly and efficiently contribues to the defense of $arcologies[0].name. <</if>> <br><br> diff --git a/src/events/nonRandom/pAbducted.js b/src/events/nonRandom/pAbducted.js new file mode 100644 index 0000000000000000000000000000000000000000..4067dd1b46a36f9635ab6bdc7c18a1dc14ce351e --- /dev/null +++ b/src/events/nonRandom/pAbducted.js @@ -0,0 +1,286 @@ +App.Events.pAbducted = class pAbducted extends App.Events.BaseEvent { + constructor(actors, params) { + super(actors, params); + } + + eventPrerequisites() { + return [ + () => App.Events.effectiveWeek() === 12, + () => V.raped === -1, + () => V.arcologyUpgrade.drones !== 1, + () => V.BodyguardID === 0, + () => V.PC.career !== "arcology owner", + () => V.PC.visualAge < 14 + ]; + } + + execute(node) { + // disable Continue + V.nextButton = " "; + + let r = []; + const { + girlP + } = getPronouns(V.PC).appendSuffix("P"); + let abducted = 1; + + const genParam = {minAge: 22, race: "nonslave", disableDisability: 1}; + let abductor; + const contractCost = 1000; + abductor = GenerateNewSlave("XY", genParam); + abductor.boobs = 100; + abductor.skill.oral = 0; + abductor.skill.anal = 0; + abductor.muscles = Math.max(abductor.muscles, 40); + abductor.origin = `You sentenced $him to enslavement for the attempted abduction of a child.`; + abductor.devotion = -100; + abductor.trust = -100; + setHealth(abductor, jsRandom(-40, -20), normalRandInt(15, 3), undefined, 1, random(30, 80)); + abductor.anus = 0; + abductor.behavioralFlaw = "arrogant"; + abductor.sexualFlaw = "judgemental"; + + const { + He, + his, he, him + } = getPronouns(abductor); + + r.push(`While returning from a meeting with a prospective investor, an unfortunate wrong turn has led you into a rather seedy area of your arcology. You feel distinctly uncomfortable for some reason. You suspicions are quickly confirmed as a bag is swung over your head. Your grab your assailant's wrists and struggle to keep them from completely engulfing you,`); + + if (overpowerCheck(abductor, V.PC) >= random(1, 100)) { + r.push(`only to find that you're quite capable of keeping them at bay.`); + abducted = -1; + } else { + r.push(`only to find that you're far too outmatched to be able to hold them back.`); + } + if (abducted === -1) { // fought back and got stabbed + App.Events.addParagraph(node, r); + r = []; + V.fcnn.push("...is stable after altercation and plans for increased security measures following..."); + + r.push(`You quickly manage to gain the upper hand, pulling yourself out of the bag and getting a good look at the would-be kidnapper. Being bested by a child was not in his plans and, short of options, draws a knife and <span class="red">drives it into your stomach.</span> Realizing what he just did, he panics and flees, leaving you bleeding, his blade still stuck in you.`); + if (V.PC.skill.medicine < 0) { + r.push(`You cry out as you yank the weapon from your body, and clutching the gushing wound, hobble back the way you came — the way back to safety. The world spins as you lose consciousnesses.`); + App.Events.addParagraph(node, r); + r = []; + r.push(`You awaken on a hard cot, staring face to face with a rather haggard looking man. You leap in shock, sending the man swearing and tearing your stitches open. As you regain composure, and get restitched, you realize that you are in a particularly shitty clinic known for their outrageous treatment fees. The wound was minor and should heal readily, but it will keep you out of commission for a little. `); + if (V.PC.preg > 2 && V.PC.pregKnown) { + r.push(`You're just glad it didn't harm your womb. This could have been a lot worse.`); + } + App.Events.addParagraph(node, r); + r = []; + r.push(`It would be prudent to up security in your arcology. That or take a guard along when you leave the penthouse. Your wallet might actually hurt more than your injury does, ${cashFormatColor(5000, true)} for crappy stitches, but at least you'll be on your feet again in a week.`); + App.Events.addParagraph(node, r); + cashX(-5000, "event"); + } else { + r.push(`As much as it hurts, you steel yourself and apply pressure to the wound around the weapon before slowly hobbling back the way you came. It doesn't take long before someone comes rushing to your aid, and you've managed to keep your composure long enough to convey where you should be taken for medical treatment.`); + App.Events.addParagraph(node, r); + r = []; + r.push(`You awaken in a nice, warm bed and are immediately greeted by a lovely boxum nurse; both familiar aspects of the clinic you've chosen for any serious medical emergencies. The wound was minor, only requiring some stiches, and should heal readily, but it will keep you out of commission for a little. At least the bill of ${cashFormatColor(1000, true)} isn't that bad.`); + if (V.PC.preg > 2 && V.PC.pregKnown) { + r.push(`You're just glad it didn't harm your womb. This could have been a lot worse.`); + } + App.Events.addParagraph(node, r); + r = []; + r.push(`It would be prudent to up security in your arcology. That or take a guard along when you leave the penthouse. You are undeniably a high-value target for wealthy collectors and would rather avoid any future attempts and or stabbings. Even with a full description of them, your assailant got away; there was just nobody interested in tracking him down.`); + App.Events.addParagraph(node, r); + cashX(-1000, "event"); + } + continueButton(node); + // injury code here + } else { + r.push(`Once your vision is obscured, your attacker sweeps your legs and tosses you into a waiting crate.`); + r.push(Spoken(abductor, `"Be a good little ${girlP} and keep quiet. Wouldn't want anything bad to happen to ya, eh? I'd really hate to damage the merchandise."`)); + r.push(`With nothing holding you, you slip the bag off yourself and assess the situation. Peeking from an airhole, you can see that you're being loaded on a dolly destined for the loading docks.`); + App.Events.addParagraph(node, r); + + App.Events.addResponses(node, [ + new App.Events.Result("Scream for help", badEnd), + new App.Events.Result("Remain calm", scream), + ]); + } + + function badEnd() { + r = []; + r.push(`You let loose a deafening shriek, desperate for someone to hear you.`); + r.push(Spoken(abductor, `"I said SHUT IT you little bitch!"`)); + r.push(`Your head is bashed into the side of the box as your kidnapper kicks it, sending it and you tumbling to the floor.`); + r.push(Spoken(abductor, `"Shit!"`)); + r.push(`Your abductor cursing and spitting is the last thing you hear before you lose consciousness.`); + App.Events.addParagraph(node, r); + + r = []; + r.push(`Once the realization strikes that you've gone missing, your arcology descends into lawlessness as the less than reputable clash to see who can seize control of building, at least until a new owner arrives to clean them out. An indeterminate amount of time later, a slave that looks a lot like the lost owner of ${V.arcologies[0].name} is seen; who's to say if it is you, or somebody else though? The story of your new life may be worth telling, but it must be told elsewhere.`); + App.Events.addParagraph(node, r); + + App.Events.addParagraph(node, ["<span class='bold'>GAME OVER</span>"]); + V.ui = "start"; + App.Utils.scheduleSidebarRefresh(); + } + + function scream() { + let bounty = 500 * random(3, 6); + r = []; + r.push(`Calling for help when it's just you and your abductor is nothing short of an invitation for trouble, so you keep your mouth shut and wait for an opportunity. There's only so many ways in and out of the arcology, and there's bound to be people going about their business through them at this hour. After an uncomfortably cramped ride and having to put up with your captive merrily humming to himself and arriving at a suitably populated loading dock, the thought occurs to you; what if they don't believe you are anything more than an unbroken slave?`); + if (V.PC.actualAge < V.minimumSlaveAge) { + r.push(`Fortunately, you are actually underage, so your screams for help quickly attract concerned workers. They corner the man and pry the lid off your box, allowing you to clamber back onto solid ground. Your would-be captor makes a short lived escape attempt straight into a fist once he realizes his plans are ruined. He's quickly tied up and presented to you for revenge.`); + abductor.minorInjury = "black eye"; + } else { + r.push(`Sometimes simple is better, so you scream out that you're being kidnapped and will give ${cashFormat(500)} to anyone that assures your return to safety. The prospect of easy money quickly has your captor tackled and you freed and helped to your feet. It may have costed you ${cashFormatColor(bounty, true)}, but the sight of the man groveling at your feet for mercy is worth it.`); + cashX(-bounty, "event"); + } + App.Events.addParagraph(node, r); + r = []; + r.push(`It would be prudent to up security in your arcology. That or take a guard along when you leave the penthouse. You are undeniably a high-value target for wealthy collectors and would rather avoid the indignity of being crammed in a box again.`); + App.Events.addParagraph(node, r); + continueButton(node); + V.fcnn.push("...plans for increased security measures following the unsuccessful abduction of..."); + + App.UI.DOM.appendNewElement("div", node, `Now the only remaining question is what to do with the would-be kidnapper. You could toss them out of the arcology, but it might be more fun to turn the tables on ${him}.`); + + let slaveCosts = slaveCost(abductor); + slaveCosts -= contractCost; + App.UI.DOM.appendNewElement("div", node, `Applying enslavement as punishment will cost ${cashFormat(contractCost)}. Doing so and then selling ${him} immediately will bring in approximately ${cashFormat(slaveCosts)}.`, "note"); + + node.append(App.Desc.longSlave(abductor, {market: "generic"})); + const choices = []; + if (V.cash >= contractCost) { + choices.push(new App.Events.Result(`Enslave ${him}`, enslave)); + choices.push(new App.Events.Result(`Sentence ${him} to a day in the stocks, then enslave ${him}`, stocks)); + if (V.arcade > 0) { + choices.push(new App.Events.Result(`Enslave ${him} and sentence ${him} to a month in the arcade`, arcade)); + } + if (V.dairy > 0 && V.dairyRestraintsSetting > 1) { + choices.push(new App.Events.Result(`Enslave ${him} and send ${him} straight to the industrial dairy`, dairy)); + } + if (V.farmyard > 0) { + choices.push(new App.Events.Result(`Enslave ${him} and send ${him} straight to the farmyard`, farmyard)); + } + if (V.seeExtreme > 0) { + choices.push(new App.Events.Result(`Punitively amputate ${his} limbs, and then enslave ${him}`, amputate)); + } + } else { + choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`)); + } + choices.push(new App.Events.Result(`Publicly flog the criminal`, flog)); + App.Events.addResponses(node, choices); + + function enslave() { + const el = new DocumentFragment(); + cashX(forceNeg(contractCost), "slaveTransfer", abductor); + el.append(`You complete the legalities and biometric scanning quickly and without fuss. The idiot will regret crossing you when ${he} wakes in the penthouse for basic slave induction.`); + el.append(App.UI.newSlaveIntro(abductor)); + return el; + } + + function stocks() { + const el = new DocumentFragment(); + const r = []; + healthDamage(abductor, 10); + abductor.behavioralFlaw = "odd"; + abductor.sexualFlaw = "hates penetration"; + abductor.anus = 2; + seX(abductor, "oral", "public", "penetrative", 23); + seX(abductor, "anal", "public", "penetrative", 12); + if (abductor.vagina > -1) { + abductor.vagina = 2; + seX(abductor, "vaginal", "public", "penetrative", 12); + if (random(1, 100) > 60 && isFertile(abductor)) { + knockMeUp(abductor, 100, 0, -2); + } + } else { + seX(abductor, "anal", "public", "penetrative", 12);/* even more anal */ + } + cashX(forceNeg(contractCost), "slaveTransfer", abductor); + + r.push(`You declare ${his} holes fair game for the entire arcology. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health.dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(abductor.vagina > -1) ? ` and <span class="lime">fucked-out</span> pussy` : ``}. The public <span class="green">enjoys the fun.</span>`); + repX(500, "event"); + V.arcologies[0].prosperity += 2; + r.push(App.UI.newSlaveIntro(abductor)); + App.Events.addParagraph(el, r); + return el; + } + + function arcade() { + assignJob(abductor, "be confined in the arcade"); + abductor.sentence = 4; + cashX(forceNeg(contractCost), "slaveTransfer", abductor); + newSlave(abductor);/* skip New Slave Intro */ + return `You complete the legalities and biometric scanning quickly and cautiously. The idiot will be in for a surprise when ${he} awakes to find ${he} can't move and a dick is in ${his} ass.`; + } + + function dairy() { + const el = new DocumentFragment(); + const r = []; + assignJob(abductor, "work in the dairy"); + cashX(forceNeg(contractCost), "slaveTransfer", abductor); + r.push(`You complete the legalities and biometric scanning quickly and cautiously. The idiot will wake up`); + if (V.dairyStimulatorsSetting > 1) { + r.push(`in agony as ${his} anus takes the rectal hydration dildo.`); + } else { + r.push(`to find ${his} chest has begun swelling with milk.`); + } + abductor.boobs += 300; + newSlave(abductor); /* skip New Slave Intro */ + App.Events.addNode(el, r); + return el; + } + + function farmyard() { + const el = new DocumentFragment(); + const r = []; + assignJob(abductor, "work as a farmhand"); + cashX(forceNeg(contractCost), "slaveTransfer", abductor); + r.push(`You complete the legalities and biometric scanning quickly and cautiously. The idiot will wake up in ${V.farmyardName}, where ${he} will spend the rest of ${his} days working the fields`); + if (V.farmyardShows === 1) { + r.push(`and`); + if (V.seeBestiality === 1) { + r.push(`getting fucked by animals.`); + } else { + r.push(`putting on shows with animals.`); + } + } + newSlave(abductor);/* skip New Slave Intro */ + App.Events.addNode(el, r); + return el; + } + + function amputate() { + const el = new DocumentFragment(); + const r = []; + healthDamage(abductor, 20); + removeLimbs(abductor, "all"); + abductor.behavioralFlaw = "odd"; + cashX(forceNeg(contractCost), "slaveTransfer", abductor); + r.push(`You want ${him} to suffer for what ${he} tried to pull on you. You make sure ${he} is fully awake as ${he} is strapped into the autosurgery. You take great pleasure in watching ${him} struggle as ${his} limbs are taken, one by one. Of course, <span class="health.dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> After ${he} has stabilized, it's off to the penthouse for basic slave induction. You'd like to see ${him} try and carry you off again without arms and legs.`); + if (abductor.balls > 0) { + const geld = function() { + const el = new DocumentFragment(); + const r = []; + healthDamage(abductor, 20); + abductor.balls = 0; + abductor.devotion -= 25; + abductor.trust -= 25; + cashX(forceNeg(contractCost), "slaveTransfer", abductor); + r.push(`You want ${him} to suffer for what ${he} tried to pull on you. You make sure ${he} is fully awake as ${he} is strapped into the autosurgery, taking the time to roughly fondle ${his} balls. You take great pleasure in watching ${him} struggle as ${his} testicles are removed. Once ${he} can stand again, it's off to the penthouse for basic slave induction.`); + r.push(App.UI.newSlaveIntro(abductor)); + App.Events.addNode(el, r); + return el; + }; + App.Events.addResponses(el, [new App.Events.Result(`Enslave the criminal and geld ${him}`, geld)]); + } + App.Events.addNode(el, r); + return el; + } + + function flog() { + const el = new DocumentFragment(); + const r = []; + r.push(`Naturally, the wretch will be thrown out of the arcology, but an example must first be made. Free people must understand that criminals who commit outrages against them will be severely punished. The protesting malefactor is stripped and flogged on the promenade before being escorted bleeding from the arcology. The public <span class="green">approves of this harshness.</span>`); + repX(500, "event"); + App.Events.addNode(el, r); + return el; + } + } + } +}; diff --git a/src/events/nonRandom/pRaped.js b/src/events/nonRandom/pRaped.js new file mode 100644 index 0000000000000000000000000000000000000000..cf14d0b7c3e6034b34b68289a3c0644d80ebd708 --- /dev/null +++ b/src/events/nonRandom/pRaped.js @@ -0,0 +1,688 @@ +App.Events.pRaped = class pRaped extends App.Events.BaseEvent { + constructor(actors, params) { + super(actors, params); + } + + eventPrerequisites() { + return [ + () => App.Events.effectiveWeek() === 12, + () => V.raped === -1, + () => V.arcologyUpgrade.drones !== 1, + () => V.BodyguardID === 0, + () => V.PC.career !== "arcology owner", + () => V.PC.visualAge >= 14 + ]; + } + + execute(node) { + let r = []; + const { + hisP, womanP, girlP + } = getPronouns(V.PC).appendSuffix("P"); + V.raped = 1; + + const genParam = {minAge: 16, race: "nonslave", disableDisability: 1}; + let rapist; + const contractCost = 1000; + if (V.PC.vagina >= 0) { + rapist = GenerateNewSlave("XY", genParam); + rapist.dick = 6; + rapist.balls = 5; + rapist.boobs = 100; + rapist.waist = 50; + rapist.skill.oral = 0; + rapist.skill.anal = 0; + } else { + rapist = GenerateNewSlave("XX", genParam); + rapist.vagina = 1; + rapist.preg = 0; + rapist.weight = random(-20, 30); + rapist.waist = -20; + } + rapist.muscles = Math.max(rapist.muscles, 10); + rapist.origin = `You sentenced $him to enslavement for the attempted rape of a free ${womanP}.`; + rapist.devotion = -100; + rapist.trust = -100; + setHealth(rapist, jsRandom(-40, -20), normalRandInt(15, 3), undefined, 1, jsRandom(30, 80)); + rapist.anus = 0; + rapist.behavioralFlaw = "arrogant"; + rapist.sexualFlaw = "judgemental"; + + const { + He, + his, he, him, himself, woman + } = getPronouns(rapist); + const {say} = getEnunciation(rapist); + + r.push(`While returning from a meeting with a prospective investor, an unfortunate wrong turn has led you into a rather seedy area of your arcology. You feel distinctly uncomfortable for some reason.`); + + if (isPCCareerInCategory("mercenary") || V.PC.skill.warfare >= 85) { + r.push(`The moment you hear the sound of the knife unsheathe your reflexes take`); + if (!isHindered(V.PC)) { + r.push(`over. With a single strike, the ${woman} tailing you lies in a heap on the ground.`); + V.raped = 0; + } else { + r.push(`over, but your body has grown a bit too unwieldy as of late, so you find yourself quickly outmaneuvered and held with a knife to your throat.`); + } + } else if (isPCCareerInCategory("slaver") || V.PC.skill.warfare >= 45) { + r.push(`The moment you notice an arm coming around from behind you does your training kick in.`); + if (!isHindered(V.PC)) { + r.push(`You quickly disarm the assailant and knock them to the floor before placing them in a choke-hold. Once they are subdued, you stand back to decide what to do next.`); + V.raped = 0; + } else { + r.push(`You quickly try to disarm your assailant, but find your body has become a bit too ponderous as of late. After a short struggle, it is you that ends up pinned with a knife to the throat.`); + } + } else if (isPCCareerInCategory("gang")) { + r.push(`The moment you hear the sound of the knife unsheathe your reflexes take over.`); + if (!isHindered(V.PC)) { + r.push(`With a single stab, your own shiv is buried in ${his} chest, incapacitating ${him}.`); + V.raped = 0; + } else { + r.push(`You try to draw your shiv and stab ${him}, but your body has grown a bit too unwieldy as of late, so you find yourself quickly outmaneuvered and held with a knife to your throat.`); + } + } else { + r.push(`You stifle a`); + if (V.PC.title === 1) { + r.push(`swear`); + } else { + r.push(`scream`); + } + r.push(`when you feel your arm grabbed and the knife pressed to your throat, knowing that it will only end badly for you in this place.`); + } + App.Events.addParagraph(node, r); + if (V.raped === 1) { + r = []; + V.fcnn.push("...plans for increased security measures, but refused to answer questions regarding..."); + if (V.PC.vagina >= 0) { + r.push(Spoken(rapist, `"Well, well, well, look what ${(V.PC.belly >= 5000 || V.PC.preg >= 20 || V.PC.weight >= 130) ? `waddled` : `walked`} into my territory. If it isn't ${V.PC.slaveName}, come to grace me with ${hisP} presence."`)); + } else { + r.push(Spoken(rapist, `"I've been watching you ever since you first moved in, ${V.PC.slaveName}, waiting for the perfect moment to make you mine. We are going to have a little fun, you and I."`)); + } + r.push(`The ${woman} binds your hands behind you, all the while keeping the knife to your throat.`); + r.push(Spoken(rapist, `"Smart keeping your mouth shut; maybe I won't have to hurt you. Heh, I know what you're thinking, that you'll find out who I am and punish me. Don't worry, I made sure to not to leave you any trails to follow${V.PC.visualAge < V.minimumSlaveAge ? ", especially with you being so sinfully delectable" : ""}. Now let's see what we have here."`)); + + if (V.PC.vagina >= 0) { + if (V.PC.butt > 4) { + r.push(Spoken(rapist, `"God, the way your fat ass is hugging my dick, you were just made to be bent over, weren't you?"`)); + r.push(`he states matter of factly as ${he} pulls you closer.`); + } + r.push(`With ${his} free hand, ${he} begins to explore your vulnerable body.`); + if (V.PC.weight > 130) { + r.push(Spoken(rapist, `"Normally I don't go for fatties, but for you, I think I can make an exception,"`)); + r.push(`he chides as grinds against your soft form.`); + } else if (V.PC.weight > 95) { + r.push(Spoken(rapist, `"Bit soon to be letting yourself go, isn't it?"`)); + r.push(`he chides as grinds against your soft form.`); + } else if (V.PC.weight > 30) { + r.push(Spoken(rapist, `"Nothing wrong with carrying a little extra weight,"`)); + r.push(`he teases as grinds against your soft form.`); + } + if (isPCCareerInCategory("wealth")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"Nice and supple. How much did you have to pay for these babies?"`)); + r.push(`he smirks as he gropes your breasts.`); + } + if (V.PC.preg >= 20 || V.PC.belly >= 5000) { + r.push(Spoken(rapist, `"Couldn't afford an abortion after you took over? How sad,"`)); + r.push(`he chuckles as he rubs your pregnant belly.`); + } + if (V.PC.dick > 0) { + r.push(Spoken(rapist, `"Went with the full package didn't you?"`)); + r.push(`he mocks as he flicks the tip of your stiffening cock.`); + } + } else if (isPCCareerInCategory("capitalist")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"Nice and supple. Bet these got you some great deals with guys, didn't they?"`)); + r.push(`he smirks as he gropes your breasts.`); + } + if (V.PC.preg >= 20 || V.PC.belly >= 5000) { + r.push(Spoken(rapist, `"Sleeping with guys to close deals? Such a slut,"`)); + r.push(`he chuckles as he rubs your pregnant belly.`); + } + if (V.PC.dick > 0) { + r.push(Spoken(rapist, `"Guess you fuck people over in more ways than one, don't you?"`)); + r.push(`he mocks as he flicks the tip of your stiffening cock.`); + } + } else if (isPCCareerInCategory("mercenary")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"So did you ever actually see combat, or did you just spend all your days in the barracks servicing the real soldiers?"`)); + r.push(`he smirks as he gropes your breasts.`); + } + if (V.PC.preg >= 20 || V.PC.belly >= 5000) { + r.push(Spoken(rapist, `"Well now I know why you aren't serving still,"`)); + r.push(`he chuckles as he rubs your pregnant belly.`); + } + if (V.PC.dick > 0) { + r.push(Spoken(rapist, `"Got a little surgery betweem missions, eh?"`)); + r.push(`he mocks as he flicks the tip of your stiffening cock.`); + } + } else if (isPCCareerInCategory("engineer")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"Nice and supple. Did the other engineers care about your designs or just your tits?"`)); + r.push(`he smirks as he gropes your breasts.`); + } + if (V.PC.preg >= 20 || V.PC.belly >= 5000) { + r.push(Spoken(rapist, `"I can see why your designs were so popular, you fucked your way into the spotlight!"`)); + r.push(`he chuckles as he rubs your pregnant belly.`); + } + if (V.PC.dick > 0) { + r.push(Spoken(rapist, `"Well you do know how to erect things, don't you?"`)); + r.push(`he mocks as he flicks the tip of your stiffening cock.`); + } + } else if (isPCCareerInCategory("medicine")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"Nice and supple. Did you implant them yourself?"`)); + r.push(`he smirks as he gropes your breasts.`); + } + if (V.PC.preg >= 20 || V.PC.belly >= 5000) { + if (V.PC.dick > 0) { + r.push(Spoken(rapist, `"Look at that belly! I bet you inseminated yourself with your own seed,"`)); + r.push(`he chuckles as he rubs your pregnant belly.`); + } else { + r.push(Spoken(rapist, `"I see how you work. Mess up a surgery and give the guy a pity fuck. Surprised you couldn't get their spawn out of your belly though. Guess you aren't that good of a surgeon,"`)); + r.push(`he chuckles as he rubs your pregnant belly.`); + } + } + if (V.PC.dick > 0) { + r.push(Spoken(rapist, `"I'm impressed. Your woman impression is quite good. Did you do the surgery yourself?"`)); + r.push(`he mocks as he flicks the tip of your stiffening cock.`); + r.push(Spoken(rapist, `"Still going to fuck you though."`)); + } + } else if (isPCCareerInCategory("slaver")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"With tits like these, I bet you were the bait used to lure them in,"`)); + r.push(`he smirks as he gropes your breasts.`); + } + if (V.PC.preg >= 20 || V.PC.belly >= 5000) { + r.push(Spoken(rapist, `"Did a slave beat me to you?"`)); + r.push(`he chuckles as he rubs your pregnant belly.`); + } + if (V.PC.dick > 0) { + r.push(Spoken(rapist, `"Bet you raped a bunch of girls with this, didn't you? Consider what's coming karma,"`)); + r.push(`he mocks as he flicks the tip of your stiffening cock.`); + } + } else if (isPCCareerInCategory("celebrity")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"Nice and supple. I wonder how many guys jacked off to your pictures?"`)); + r.push(`he smirks as he gropes your breasts.`); + } + if (V.PC.preg >= 20 || V.PC.belly >= 5000) { + r.push(Spoken(rapist, `"I can see how you got so popular!"`)); + r.push(`he chuckles as he rubs your pregnant belly.`); + } + if (V.PC.dick > 0) { + r.push(Spoken(rapist, `"How much tape did it take to hold this guy down?"`)); + r.push(`he mocks as he flicks the tip of your stiffening cock.`); + } + } else if (isPCCareerInCategory("escort")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"Nice and soft. How many dicks have been between these babies?"`)); + r.push(`he smirks as he gropes your breasts.`); + } + if (V.PC.preg >= 20 || V.PC.belly >= 5000) { + r.push(Spoken(rapist, `"What kind of whore doesn't know about protection?"`)); + r.push(`he chuckles as he rubs your pregnant belly.`); + } + if (V.PC.dick > 0) { + r.push(Spoken(rapist, `"So, did you ever get to use this when you were a prostitute?"`)); + r.push(`he mocks as he flicks the tip of your stiffening cock.`); + } + } else if (isPCCareerInCategory("gang")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"I bet I'm not the first person to do this to you, am I?"`)); + r.push(`he smirks as he gropes your breasts.`); + } + if (V.PC.preg >= 20 || V.PC.belly >= 5000) { + r.push(Spoken(rapist, `"Ah, now I get it. Your role in the gang was to lie on your back and take dick all day, wasn't it?"`)); + r.push(`he chuckles as he rubs your pregnant belly.`); + } + if (V.PC.dick > 0) { + r.push(Spoken(rapist, `"Fuck or be fucked world; today, it's gonna be you,"`)); + r.push(`he mocks as he flicks the tip of your stiffening cock.`); + } + } else if (isPCCareerInCategory("servant")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"Nice and supple. Bet your Master spent a fortune making these so nice,"`)); + r.push(`he smirks as he gropes your breasts.`); + } + if (V.PC.preg >= 20 || V.PC.belly >= 5000) { + r.push(Spoken(rapist, `"Holding on to your Master's final gift are you?"`)); + r.push(`he chuckles as he rubs your pregnant belly.`); + } + if (V.PC.dick > 0) { + r.push(Spoken(rapist, `"When your Master first undressed you, what did he think of his 'girl'?"`)); + r.push(`he mocks as he flicks the tip of your stiffening cock.`); + } + } else if (isPCCareerInCategory("BlackHat")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"Nice and supple. What are the odds that I can find these babies on the internet?"`)); + r.push(`he smirks as he gropes your breasts.`); + } + if (V.PC.preg >= 20 || V.PC.belly >= 5000) { + r.push(Spoken(rapist, `"You'd think someone so skilled at breaking security would understand protection themselves. Or did you trade your pussy for information?"`)); + r.push(`he chuckles as he rubs your pregnant belly.`); + } + if (V.PC.dick > 0) { + r.push(Spoken(rapist, `"Trying to catch a signal with that?"`)); + r.push(`he mocks as he flicks the tip of your stiffening cock.`); + } + } + r.push(`Finally he reaches your moistening pussy.`); + r.push(Spoken(rapist, `"Already wet are we? Glad you know your place,"`)); + r.push(`he states as he pulls your clothes off and bends you over.`); + if (V.PC.vagina === 0) { + r.push(Spoken(rapist, `"And you still have your innocence, how delightful!"`)); + } + App.Events.addParagraph(node, r); + r = []; + r.push(`You can feel the head of his cock teasing your`); + if (V.PC.vagina === 0) { + r.push(`virgin pussy; you grit your teeth knowing what will come next. Without mercy, he <span class="red">tears through your hymen</span> and forces himself as deep as your tight pussy lets him. You choke back a sob as he struggles to hilt himself in you. He must have undergone surgery or something because there is no way your body can handle such a monster. You're in agony already - you can't fathom what will happen when he loses his patience.`); + } else { + r.push(`pussy lips; you hope it feels bigger than it really is. As he struggles to force it into you, you regret thinking about it. He must have undergone surgery or something because he fills you completely. You feel weak just from him sticking it in, you can't fathom what will happen once he starts thrusting.`); + } + r.push(`You soon find out as he wastes no time starting slow. He violently rams his oversized cock deep into you, threatening to penetrate your cervix with each thrust. He quickens his pace, fucking you like a beast.`); + if (V.PC.preg < 1) { + if (random(1, 100) > 60) { + r.push(`His hand rises to your lips and forces something into your mouth.`); + r.push(Spoken(rapist, `"Swallow it."`)); + r.push(`You obey, hoping to just get this over with.`); + V.PC.forcedFertDrugs += 3; + } + r.push(`With one final thrust, he forces through your battered cervix and unloads in the depths of your`); + if (canGetPregnant(V.PC)) { + r.push(`fertile`); + } + r.push(`womb.`); + } else { + r.push(`With one final thrust, he forces it in as deep as he can into you and blows his seed deep in your aching cunt.`); + } + if (V.PC.preg >= 20 || V.PC.belly >= 5000) { + r.push(Spoken(rapist, `"Now your ${(V.PC.pregType > 1) ? `children` : `child`} will know what a real man's sperm is like!"`)); + } + r.push(`He shoves you to the ground, pussy gaping from the size of his shaft and leaking his huge load all over yourself. By the time you loosen your bindings, he is long gone.`); + App.Events.addParagraph(node, r); + r = []; + r.push(`It would be prudent to up security in your arcology. That or take a guard along when you leave the penthouse. Such a thing, happening to you. You can't allow such an indignity to happen again,`); + if (V.PC.vagina === 0) { + r.push(`not that you'll ever get your first time back,`); + } else { + r.push(`you think to yourself,`); + } + r.push(`as you try to coax his sperm from your abused pussy.`); + if (canGetPregnant(V.PC)) { + r.push(`For some reason your body feels really satisfied, despite`); + if (V.PC.vagina === 0) { + r.push(`what transpired...`); + } else { + r.push(`not climaxing...`); + } + r.push(`Is this what it feels like to be bred by someone so dominant? You should take a pregnancy test right away and make sure he didn't knock you up.`); + knockMeUp(V.PC, 100, 0, -2); + } + if (V.PC.vagina === 0) { + V.PC.vagina++; + } + } else { + if (V.PC.weight > 95) { + r.push(Spoken(rapist, `"I don't mind a little weight, so long as it doesn't get in the way. And even if it did, it won't stop me."`)); + r.push(`${he} chuckles as ${he} embraces your soft form.`); + } + r.push(`With ${his} free hand, ${he} begins to explore your bound body.`); + if (V.PC.preg >= 20 || V.PC.belly >= 5000) { + r.push(Spoken(rapist, `"Can't say I've ever had sex with a pregnant ${womanP} before... I'll figure it out, don't you worry!"`)); + r.push(`${he} teases as he rubs your pregnant belly.`); + r.push(Spoken(rapist, `"I won't be far behind you..."`)); + r.push(`${he} thinks out loud, much to your chagrin.`); + } + if (isPCCareerInCategory("wealth")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"Spared no expenses for these babies, did you?"`)); + r.push(`${he} smirks as ${he} gropes your breasts.`); + } + r.push(`${He} slips ${his} hand down your pants.`); + r.push(Spoken(rapist, `"Now there's the money maker!"`)); + if (V.PC.balls >= 9) { + r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"And apparently the bank too!"`)); + r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`); + } else if (V.PC.balls >= 5) { + r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"And loaded in the virility department too!"`)); + r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`); + } + } else if (isPCCareerInCategory("capitalist")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"Ever wonder if they were listening to you or just ogling the man with the breasts?"`)); + r.push(`${he} smirks as ${he} gropes your breasts.`); + } + r.push(`${He} slips ${his} hand down your pants.`); + r.push(Spoken(rapist, `"Now that explains how you were so successful!"`)); + if (V.PC.balls >= 9) { + r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"And you're positively loaded!"`)); + r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`); + } else if (V.PC.balls >= 5) { + r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"And you've got a nice investment for me too!"`)); + r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`); + } + } else if (isPCCareerInCategory("mercenary")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"Must have been pretty tight in your body armor, huh?"`)); + r.push(`${he} smirks as ${he} gropes your breasts.`); + } + r.push(`${He} slips ${his} hand down your pants.`); + r.push(Spoken(rapist, `"I guess they do let you keep your rifle!"`)); + if (V.PC.balls >= 9) { + r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"I'd have been worried lugging these into combat, but I'm so glad you made it through unscathed!"`)); + r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`); + } else if (V.PC.balls >= 5) { + r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"Glad to see these made it through unharmed!"`)); + r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`); + } + } else if (isPCCareerInCategory("engineer")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"How did you get any work done with these hanging over your designs?"`)); + r.push(`${he} smirks as ${he} gropes your breasts.`); + } + r.push(`${He} slips ${his} hand down your pants.`); + r.push(Spoken(rapist, `"I see what kind of tools you like. Big and strong!"`)); + if (V.PC.balls >= 9) { + r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"Oh my! I must have been tight squeezed into your work attire! I hope I can handle such a large-scale construction job!"`)); + r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`); + } else if (V.PC.balls >= 5) { + r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"Ah! It looks like you have a nice construction crew all ready for me!"`)); + r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`); + } + } else if (isPCCareerInCategory("medicine")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"I'm sure you had quite the number of clients after a pair of these,"`)); + r.push(`${he} smirks as ${he} gropes your breasts.`); + } + r.push(`${He} slips ${his} hand down your pants.`); + r.push(Spoken(rapist, `"Huh, I wonder if that's real..."`)); + if (V.PC.balls >= 9) { + r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"Hitting the experimental drugs a little, are we? Let me help you with your research!"`)); + r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`); + } else if (V.PC.balls >= 5) { + r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"Heh, access to such lovely virility aids did wonders for you and I."`)); + r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`); + } + } else if (isPCCareerInCategory("slaver")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"A lovely pair of deployable distractions,"`)); + r.push(`${he} smirks as ${he} gropes your breasts.`); + } + r.push(`${He} slips ${his} hand down your pants.`); + r.push(Spoken(rapist, `"Did you have a nickname for him? Like 'the discipliner' or something?"`)); + if (V.PC.balls >= 9) { + r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"Pump me full, like all those fresh captures you broke in!"`)); + r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`); + } else if (V.PC.balls >= 5) { + r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"I wonder how many slaves you had to empty these bad boys out into."`)); + r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`); + } + } else if (isPCCareerInCategory("celebrity")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"Nice and supple. Just like I'd expect from a man sporting tits."`)); + r.push(`${he} smirks as ${he} gropes your breasts.`); + } + r.push(`${He} slips ${his} hand down your pants;`); + r.push(Spoken(rapist, `"Oh, now those tabloids make sense."`)); + if (V.PC.balls >= 9) { + r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"You certainly stole the show, no matter what you wore!"`)); + r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`); + } else if (V.PC.balls >= 5) { + r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"Heh, I always loved the sight of these in your fine clothes."`)); + r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`); + } + } else if (isPCCareerInCategory("escort")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"With these hanging out, how many men tried to pick you up?"`)); + r.push(`${he} smirks as ${he} gropes your breasts.`); + } + r.push(`${He} slips ${his} hand down your pants.`); + r.push(Spoken(rapist, `"Now there's the money maker!"`)); + if (V.PC.balls >= 9) { + r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"I bet these made you quite popular with those little sluts looking to get knocked up! Can't wait to join them!"`)); + r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`); + } else if (V.PC.balls >= 5) { + r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"And his two fine friends as well!"`)); + r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`); + } + } else if (isPCCareerInCategory("gang")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"You're a lot less threatening with these,"`)); + r.push(`${he} smirks as ${he} gropes your breasts.`); + } + r.push(`${He} slips ${his} hand down your pants.`); + r.push(Spoken(rapist, `"I bet he's seen a lot of action, hasn't he?"`)); + if (V.PC.balls >= 9) { + r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"I'd have been worried, carrying around jewels like these. Glad they're healthy and soon to be very happy!"`)); + r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`); + } else if (V.PC.balls >= 5) { + r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"Your coin purse is looking a little heavy. How bout I help you empty it?"`)); + r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`); + } + } else if (isPCCareerInCategory("servant")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"Did your Master even ask before he stuck you with these?"`)); + r.push(`${he} smirks as ${he} gropes your breasts.`); + } + r.push(`${He} slips ${his} hand down your pants.`); + if (V.PC.dick >= 3) { + r.push(Spoken(rapist, `"Now that's surprising. I expected something smaller."`)); + } else { + r.push(Spoken(rapist, `"Can't say I'm surprised. Wouldn't want another rooster in the henhouse after all."`)); + } + if (V.PC.balls >= 9) { + r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"Did not expect them to be so, profound... Compensating for all the years you weren't allowed to use them?"`)); + r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`); + } else if (V.PC.balls >= 5) { + r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"And then there's these! Such lovely baby makers!"`)); + r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`); + } + } else if (isPCCareerInCategory("BlackHat")) { + if (V.PC.boobs >= 300) { + r.push(Spoken(rapist, `"Nice and supple. What are the odds that I can find these babies on the internet?"`)); + r.push(`${he} smirks as ${he} gropes your breasts.`); + } + r.push(`${He} slips ${his} hand down your pants.`); + r.push(Spoken(rapist, `"You wouldn't mind if I download a few files now would you? Well, not that it matters."`)); + if (V.PC.balls >= 9) { + r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"You really should dig a little deeper into the drugs you find online, not that I'm complaining!"`)); + r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`); + } else if (V.PC.balls >= 5) { + r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`); + r.push(Spoken(rapist, `"I bet you're proud of these, with as many as you've seen out there."`)); + r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`); + } + } + r.push(`Satisfied, ${he} pulls your cock out of its increasingly cramped confines.`); + r.push(Spoken(rapist, `"Look at him grow, he knows what comes next..."`)); + r.push(`${He} teases as ${he} pushes you to the ground and climbs on top of you.`); + App.Events.addParagraph(node, r); + r = []; + r.push(`${He} lines ${himself} up with the tip of your dick before taking its entire length into ${himself}. ${He} lets out a lust filled moan as ${he} begins to bounce on your traitorous member. You can do nothing to stop ${him} from riding you to climax, so you just enjoy the sight of ${his} breasts bouncing to ${his} pace. As you feel your orgasm approaching, you try to time it so you can slip out of ${him} just before you blow your load, but you have no such luck.`); + r.push(Spoken(rapist, `"You really think I'd let you spoil my plans?"`)); + r.push(`${he} asks as ${he} grinds against you, making sure you cum deep in ${his} pussy. ${He} leans back and massages ${his}`); + if (V.PC.balls >= 20) { + r.push(`taut`); + } + r.push(`stomach, savoring the sensation of your seed seeping into ${him}.`); + r.push(Spoken(rapist, `"That's it, make me a mommy."`)); + r.push(`${He} leans in close and you pop free of ${his} snatch.`); + r.push(Spoken(rapist, `"Be a good ${girlP} and make this arcology a nice place for your bastard. I want to retire in luxury."`)); + r.push(`${He} blows you a kiss as ${he} stuffs a plug up ${his} vagina, redresses and heads on ${his} way. By the time you loosen your bindings, ${he} is long gone.`); + App.Events.addParagraph(node, r); + r = []; + r.push(`It would be prudent to up security in your arcology, that or take a guard along when you leave the penthouse. You can't allow such an indignity to happen again, nor do you need the stress of a bastard trying to seize control of your estate when you want to retire, but you wouldn't mind having your way with ${him} if you get the chance.`); + App.Events.addParagraph(node, r); + } + } else { + App.UI.DOM.appendNewElement("div", node, `Now the only question is what to do with the would-be rapist. You could toss them out of the arcology, but it might be more fun to turn the tables on ${him}.`); + + let slaveCosts = slaveCost(rapist); + slaveCosts -= contractCost; + App.UI.DOM.appendNewElement("div", node, `Applying enslavement as punishment will cost ${cashFormat(contractCost)}. Doing so and then selling ${him} immediately will bring in approximately ${cashFormat(slaveCosts)}.`, "note"); + + node.append(App.Desc.longSlave(rapist, {market: "generic"})); + const choices = []; + if (V.cash >= contractCost) { + choices.push(new App.Events.Result(`Enslave ${him}`, enslave)); + choices.push(new App.Events.Result(`Sentence ${him} to a day in the stocks, then enslave ${him}`, stocks)); + if (V.arcade > 0) { + choices.push(new App.Events.Result(`Enslave ${him} and sentence ${him} to a month in the arcade`, arcade)); + } + if (V.dairy > 0 && V.dairyRestraintsSetting > 1) { + choices.push(new App.Events.Result(`Enslave ${him} and send ${him} straight to the industrial dairy`, dairy)); + } + if (V.farmyard > 0) { + choices.push(new App.Events.Result(`Enslave ${him} and send ${him} straight to the farmyard`, farmyard)); + } + if (V.seeExtreme > 0) { + choices.push(new App.Events.Result(`Punitively amputate ${his} limbs, and then enslave ${him}`, amputate)); + } + } else { + choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`)); + } + choices.push(new App.Events.Result(`Publicly flog the criminal`, flog)); + App.Events.addResponses(node, choices); + } + + function enslave() { + const el = new DocumentFragment(); + cashX(forceNeg(contractCost), "slaveTransfer", rapist); + el.append(`You complete the legalities and biometric scanning quickly and without fuss. The idiot will regret crossing you when ${he} wakes in the penthouse for basic slave induction.`); + el.append(App.UI.newSlaveIntro(rapist)); + return el; + } + + function stocks() { + const el = new DocumentFragment(); + const r = []; + healthDamage(rapist, 10); + rapist.behavioralFlaw = "odd"; + rapist.sexualFlaw = "hates penetration"; + rapist.anus = 2; + seX(rapist, "oral", "public", "penetrative", 23); + seX(rapist, "anal", "public", "penetrative", 12); + if (rapist.vagina > -1) { + rapist.vagina = 2; + seX(rapist, "vaginal", "public", "penetrative", 12); + if (random(1, 100) > 60 && isFertile(rapist)) { + knockMeUp(rapist, 100, 0, -2); + } + } else { + seX(rapist, "anal", "public", "penetrative", 12);/* even more anal */ + } + cashX(forceNeg(contractCost), "slaveTransfer", rapist); + + r.push(`You declare ${his} holes fair game for the entire arcology. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(rapist.vagina > -1) ? ` and <span class="lime">fucked-out</span> pussy` : ``}. The public <span class="green">enjoys the fun.</span>`); + repX(500, "event"); + V.arcologies[0].prosperity += 2; + r.push(App.UI.newSlaveIntro(rapist)); + App.Events.addParagraph(el, r); + return el; + } + + function arcade() { + assignJob(rapist, "be confined in the arcade"); + rapist.sentence = 4; + cashX(forceNeg(contractCost), "slaveTransfer", rapist); + newSlave(rapist);/* skip New Slave Intro */ + return `You complete the legalities and biometric scanning quickly and cautiously. The idiot will be in for a surprise when ${he} awakes to find ${he} can't move and a dick is in ${his} ass.`; + } + + function dairy() { + const el = new DocumentFragment(); + const r = []; + assignJob(rapist, "work in the dairy"); + cashX(forceNeg(contractCost), "slaveTransfer", rapist); + r.push(`You complete the legalities and biometric scanning quickly and cautiously. The idiot will wake up`); + if (V.dairyStimulatorsSetting > 1) { + r.push(`in agony as ${his} anus takes the rectal hydration dildo.`); + } else { + r.push(`to find ${his} chest has begun swelling with milk.`); + } + rapist.boobs += 300; + newSlave(rapist); /* skip New Slave Intro */ + App.Events.addNode(el, r); + return el; + } + + function farmyard() { + const el = new DocumentFragment(); + const r = []; + assignJob(rapist, "work as a farmhand"); + cashX(forceNeg(contractCost), "slaveTransfer", rapist); + r.push(`You complete the legalities and biometric scanning quickly and cautiously. The idiot will wake up in ${V.farmyardName}, where ${he} will spend the rest of ${his} days working the fields`); + if (V.farmyardShows === 1) { + r.push(`and`); + if (V.seeBestiality === 1) { + r.push(`getting fucked by animals.`); + } else { + r.push(`putting on shows with animals.`); + } + } + newSlave(rapist);/* skip New Slave Intro */ + App.Events.addNode(el, r); + return el; + } + + function amputate() { + const el = new DocumentFragment(); + const r = []; + healthDamage(rapist, 20); + removeLimbs(rapist, "all"); + rapist.behavioralFlaw = "odd"; + cashX(forceNeg(contractCost), "slaveTransfer", rapist); + r.push(`You want ${him} to suffer for what ${he} tried to pull on you. You make sure ${he} is fully awake as ${he} is strapped into the autosurgery. You take great pleasure in watching ${him} struggle as ${his} limbs are taken, one by one. Of course, <span class="health dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> After ${he} has stabilized, it's off to the penthouse for basic slave induction. You'd like to see ${him} try and touch you again without arms and legs.`); + if (rapist.balls > 0) { + const geld = function() { + const el = new DocumentFragment(); + const r = []; + healthDamage(rapist, 20); + rapist.balls = 0; + rapist.devotion -= 25; + rapist.trust -= 25; + cashX(forceNeg(contractCost), "slaveTransfer", rapist); + r.push(`You want ${him} to suffer for what ${he} tried to pull on you. You make sure ${he} is fully awake as ${he} is strapped into the autosurgery, taking the time to roughly fondle ${his} balls. You take great pleasure in watching ${him} struggle as ${his} testicles are removed. Once ${he} can stand again, it's off to the penthouse for basic slave induction.`); + r.push(App.UI.newSlaveIntro(rapist)); + App.Events.addNode(el, r); + return el; + }; + App.Events.addResponses(el, [new App.Events.Result(`Enslave the criminal and geld ${him}`, geld)]); + } + App.Events.addNode(el, r); + return el; + } + + function flog() { + const el = new DocumentFragment(); + const r = []; + r.push(`Naturally, the wretch will be thrown out of the arcology, but an example must first be made. Free people must understand that criminals who commit outrages against them will be severely punished. The protesting malefactor is stripped and flogged on the promenade before being escorted bleeding from the arcology. The public <span class="green">approves of this harshness.</span>`); + repX(500, "event"); + App.Events.addNode(el, r); + return el; + } + } +}; diff --git a/src/events/nonRandom/rival/pHostageAcquisition.js b/src/events/nonRandom/rival/pHostageAcquisition.js index 464bd577c81e44c36a2525af580bc04add7c9da6..895c76bd3ed83fa2b8564d359269ca9339339493 100644 --- a/src/events/nonRandom/rival/pHostageAcquisition.js +++ b/src/events/nonRandom/rival/pHostageAcquisition.js @@ -12,8 +12,8 @@ App.Events.pHostageAcquisition = function() { he, his, him, girl, woman } = getPronouns(V.hostage); V.hostageRescued = 0; - // V.hostage.ID += 55555; V.hostage.weekAcquired = V.week; + let _closer = 0; const { his2, woman2, wife2, girl2 @@ -23,45 +23,96 @@ App.Events.pHostageAcquisition = function() { App.Events.drawEventArt(node, V.hostage); r.push(`${SlaveFullName(V.hostage)}, once`); - switch (V.PC.career) { - case "wealth": - r.push(`a popular party ${girl}`); - break; - case "capitalist": + if (isPCCareerInCategory("wealth")) { + r.push(`a popular party ${girl}`); + if (V.PC.career === "rich kid") { + _closer = 1; + } + } else if (isPCCareerInCategory("capitalist")) { + if (V.PC.career === "capitalist") { r.push(`a bright young manager`); - break; - case "mercenary": + } else if (V.PC.career === "entrepreneur" || V.PC.actualAge > 16) { + r.push(`a hopeful intern`); + } else { + r.push(`a brilliant student`); + _closer = 1; + } + } else if (isPCCareerInCategory("mercenary")) { + if (V.PC.career === "mercenary" || V.PC.career === "recruit" || V.PC.actualAge > 16) { r.push(`a logistics officer`); - break; - case "engineer": + } else if (V.PC.career === "child soldier") { + r.push(`a conscript`); + _closer = 1; + } + } else if (isPCCareerInCategory("engineer")) { + if (V.PC.career === "engineer" || V.PC.career === "construction" || V.PC.actualAge > 16) { r.push(`an arcology sales${woman}`); - break; - case "medicine": + } else if (V.PC.career === "worksite helper") { + r.push(`a prodigy`); + _closer = 1; + } + } else if (isPCCareerInCategory("medicine")) { + if (V.PC.career === "medicine" || V.PC.career === "medical assistant" || V.PC.actualAge > 16) { r.push(`a surgical nurse`); - break; - case "slaver": + } else if (V.PC.career === "nurse") { + r.push(`a nurse`); + _closer = 1; + } + } else if (isPCCareerInCategory("slaver")) { + if (V.PC.career === "slaver" || V.PC.career === "slave overseer" || V.PC.actualAge > 16) { r.push(`an abusive pens guard`); - break; - case "celebrity": + } else if (V.PC.career === "slave tender") { + r.push(`a slave caretaker`); + _closer = 1; + } + } else if (isPCCareerInCategory("celebrity")) { + if (V.PC.career === "celebrity" || V.PC.career === "rising star" || V.PC.actualAge > 16) { r.push(`a popular groupie`); - break; - case "escort": + } else if (V.PC.career === "slave tender") { + r.push(`a child star`); + _closer = 1; + } + } else if (isPCCareerInCategory("escort")) { + if (V.PC.career === "escort" || V.PC.actualAge > 24) { r.push(`an expensive escort`); - break; - case "gang": + } else if (V.PC.career === "prostitute" || V.PC.actualAge > 16) { + r.push(`a prostitute`); + } else { + r.push(`a young prostitute`); + _closer = 1; + } + } else if (isPCCareerInCategory("gang")) { + if (V.PC.career === "gang" || V.PC.career === "hoodlum" || V.PC.actualAge > 16) { r.push(`a gang member`); - break; - case "servant": + } else { + r.push(`a homeless ${girl}`); + _closer = 1; + } + } else if (isPCCareerInCategory("servant")) { + if (V.PC.career === "servant" || V.PC.career === "handmaiden" || V.PC.actualAge > 16) { r.push(`a maid`); - break; - case "BlackHat": + } + if (V.PC.career === "child servant") { + _closer = 1; + } + } else if (isPCCareerInCategory("BlackHat")) { + if (V.PC.career === "BlackHat" || V.PC.actualAge > 24) { r.push(`a brilliant code breaker`); - break; - default: - r.push(`a prominent Free Cities citizen`); + } else if (V.PC.career === "hacker" || V.PC.actualAge > 16) { + r.push(`a bright hacker`); + } else { + r.push(`a young hacker`); + _closer = 1; + } + } else if (isPCCareerInCategory("arcology owner")) { + r.push(`a prominent Free Cities citizen`); + } + if (_closer === 1) { + r.push(`dear to you`); + } else { + r.push(`of your acquaintance`); } - r.push(`of your acquaintance from before you were an arcology owner, and then a pawn in your rival arcology owner's campaign of psychological warfare against you, is now one of your slaves. - Your hired mercenaries are en route now with your precious cargo.`); + r.push(`from before you were an arcology owner, and then a pawn in your rival arcology owner's campaign of psychological warfare against you, is now one of your slaves. Your hired mercenaries are en route now with your precious cargo.`); switch (V.rivalryFS) { case "Racial Subjugationism": @@ -788,6 +839,9 @@ App.Events.pHostageAcquisition = function() { r.push(`sobbing`); r.push(Spoken(V.hostage, `"I've never had to exercise so much; I'm exhausted!"`)); r.push(`You gently wrap your arms around ${his} soft body in a comforting embrace. ${He}'s exactly as you remember.`); + if (_closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) { + r.push(`Well, except for the sizable busoms pressing against you; puberty was quite generous to ${him}`); + } } else if (V.rivalryDuration <= 10) { r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`); if (V.PC.boobs >= 650) { @@ -798,6 +852,9 @@ App.Events.pHostageAcquisition = function() { r.push(`feeling the muscles under ${his} chubby body, as ${he} breaks down in tears.`); r.push(Spoken(V.hostage, `"You aren't going to make me pump iron, are you?"`)); r.push(`While ${he}'s thinner than you remember, and a little more muscular, ${his} personality is exactly the same.`); + if (_closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) { + r.push(`You can't help but notice the size of ${his} breasts pressing against you; puberty was generous to ${him}`); + } } else if (V.rivalryDuration <= 15) { r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} says`); r.push(Spoken(V.hostage, `"I don't want to ever be so heavy again..."`)); @@ -909,6 +966,9 @@ App.Events.pHostageAcquisition = function() { r.push(`sobbing`); r.push(Spoken(V.hostage, `"I've never had to exercise so much, I'm exhausted!"`)); r.push(`You gently wrap your arms around ${his} soft body in a comforting embrace. ${He}'s exactly as you remember.`); + if (_closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) { + r.push(`Well, except for the sizable busoms pressing against you; puberty was quite generous to ${him}`); + } } else if (V.rivalryDuration <= 10) { r.push(`Upon seeing you, ${V.hostage.slaveName} gingerly approaches, uncertain if ${he} should. You pull ${him} into your`); if (V.PC.boobs >= 650) { @@ -919,6 +979,9 @@ App.Events.pHostageAcquisition = function() { r.push(`feeling the muscles under ${his} chubby body, as ${he} breaks down in tears.`); r.push(Spoken(V.hostage, `"You aren't going to make me pump iron, are you?"`)); r.push(`While ${he}'s thinner than you remember, and a little more muscular, ${his} personality is exactly the same.`); + if (_closer && V.hostage.actualAge <= 16 && V.hostage.boobs > 800) { + r.push(`You can't help but notice the size of ${his} breasts pressing against you; puberty was generous to ${him}`); + } } else if (V.rivalryDuration <= 15) { r.push(`Upon seeing you, ${V.hostage.slaveName} shifts ${his} weight back and forth, unsure of what to make of you. As you step forward, ${he} hesitatingly approaches. Once ${he} is close enough ${he} says`); r.push(Spoken(V.hostage, `"I don't want to ever be so heavy again..."`)); diff --git a/src/events/nonRandom/rival/pRivalryHostage.js b/src/events/nonRandom/rival/pRivalryHostage.js index 30dc805557c8288546c19e6bc0b39358848c8f2c..ea44ed3de3aff9aa690acb7d65bdd81a12cb9186 100644 --- a/src/events/nonRandom/rival/pRivalryHostage.js +++ b/src/events/nonRandom/rival/pRivalryHostage.js @@ -119,7 +119,7 @@ App.Events.pRivalryHostage = function() { } else if (V.PC.career === "street urchin") { r.push(`time on the streets.`); if (V.hostage.actualAge >= V.PC.actualAge + 6) { - r.push(`${He} was a charming homeless ${girl} that kept a watchful eye on you to make sure you stayed safe, as if ${he} were your big ${brother}. ${He} even helped you become a gang initiate.`); + r.push(`${He} was a charming homeless ${girl} that kept a watchful eye on you to make sure you stayed safe, as if ${he} were your big ${sister}. ${He} even helped you become a gang initiate.`); } else { r.push(`${He} was another destitute child that you spent most of your time with. You foraged for scraps together, kept each other warm at night, and even became initiates into the same gang.`); } @@ -204,7 +204,7 @@ App.Events.pRivalryHostage = function() { } else if (V.PC.career === "slave tender") { r.push(`time looking after slaves.`); if (V.hostage.actualAge >= V.PC.actualAge + 6) { - r.push(`${He} was a pretty, if slightly scary, older ${girl} that kept a watchful eye over the slaves and you, almost like a grumpy big ${brother}.`); + r.push(`${He} was a pretty, if slightly scary, older ${girl} that kept a watchful eye over the slaves and you, almost like a grumpy big ${sister}.`); } else { r.push(`${He} was a little ${girl} that helped clean and feed the slaves with you. You made a pretty good team; if a new capture thought it would be easy to overpower a child, they'd quickly learn to watch their back.`); } @@ -217,7 +217,7 @@ App.Events.pRivalryHostage = function() { r.push(`${He} was a pretty little groupie who flitted from entourage to entourage. You were never particularly close,`); } else if (V.PC.career === "child star") { if (V.hostage.actualAge >= V.PC.actualAge + 6) { - r.push(`${He} older ${girl} that not only acted as your ${brother} on the set, but also taught in the ins and outs of show business.`); + r.push(`${He} older ${girl} that not only acted as your ${sister} on the set, but also taught in the ins and outs of show business.`); } else { r.push(`${He} was a child star that was often booked alongside you. So much so, you started to be treated more like siblings than competitors.`); } @@ -468,7 +468,7 @@ App.Events.pRivalryHostage = function() { WombFlush(slave); - if (V.PC.career === "wealth" || V.PC.career === "trust fund" || V.PC.career === "rich kid") { + if (isPCCareerInCategory("wealth")) { slave.career = "a party girl"; if (V.PC.career === "wealth" || V.PC.actualAge > 24) { slave.actualAge = random(18, 24); @@ -490,7 +490,7 @@ App.Events.pRivalryHostage = function() { slave.intelligenceImplant = 0; slave.skill.oral = 100; slave.skill.entertainment = 100; - } else if (V.PC.career === "escort" || V.PC.career === "prostitute" || V.PC.career === "child prostitute") { + } else if (isPCCareerInCategory("escort")) { if (V.PC.career === "escort" || V.PC.actualAge > 24) { slave.career = "an escort"; slave.actualAge = random(18, 20); @@ -520,7 +520,7 @@ App.Events.pRivalryHostage = function() { slave.skill.anal = 100; slave.skill.vaginal = 100; slave.skill.whoring = 100; - } else if (V.PC.career === "servant" || V.PC.career === "handmaiden" || V.PC.career === "child servant") { + } else if (isPCCareerInCategory("servant")) { slave.career = "a maid"; if (V.PC.career === "servant" || V.PC.actualAge > 24) { slave.actualAge = random(18, 20); @@ -555,7 +555,7 @@ App.Events.pRivalryHostage = function() { slave.skill.vaginal = 15; slave.skill.whoring = 0; slave.custom.tattoo = "$He has your Master's brand on $his left breast."; - } else if (V.PC.career === "gang" || V.PC.career === "hoodlum" || V.PC.career === "street urchin") { + } else if (isPCCareerInCategory("gang")) { if (V.PC.career === "gang" || V.PC.actualAge > 24) { slave.actualAge = random(20, 24); slave.custom.tattoo = "$He has your former gang's sign tattooed on $his neck."; @@ -581,7 +581,7 @@ App.Events.pRivalryHostage = function() { slave.muscles = 40; setHealth(slave, 100, 0, 0, 0, jsRandom(10, 30)); slave.skill.combat = 1; - } else if (V.PC.career === "BlackHat" || V.PC.career === "hacker" || V.PC.career === "script kiddy") { + } else if (isPCCareerInCategory("BlackHat")) { slave.career = "a shut-in"; if (V.PC.career === "BlackHat" || V.PC.actualAge > 24) { slave.actualAge = random(18, 21); @@ -630,7 +630,7 @@ App.Events.pRivalryHostage = function() { } slave.face = 55; slave.intelligence = 100; - } else if (V.PC.career === "mercenary" || V.PC.career === "recruit" || V.PC.career === "child soldier") { + } else if (isPCCareerInCategory("mercenary")) { if (V.PC.career === "mercenary" || V.PC.actualAge > 24) { slave.actualAge = random(20, 24); slave.career = "a soldier"; @@ -654,7 +654,7 @@ App.Events.pRivalryHostage = function() { } slave.face = 55; slave.intelligence = 100; - } else if (V.PC.career === "engineer" || V.PC.career === "construction" || V.PC.career === "worksite helper") { + } else if (isPCCareerInCategory("engineer")) { if (V.PC.career === "engineer" || V.PC.actualAge > 24) { slave.actualAge = random(18, 24); slave.career = "a saleswoman"; @@ -678,7 +678,7 @@ App.Events.pRivalryHostage = function() { } slave.face = 100; slave.intelligence = 100; - } else if (V.PC.career === "medicine" || V.PC.career === "medical assistant" || V.PC.career === "nurse") { + } else if (isPCCareerInCategory("medicine")) { slave.career = "a nurse"; if (V.PC.career === "medicine" || V.PC.actualAge > 24) { slave.actualAge = random(16, 24); @@ -700,7 +700,7 @@ App.Events.pRivalryHostage = function() { } slave.face = 55; slave.intelligence = 100; - } else if (V.PC.career === "slaver" || V.PC.career === "slave overseer" || V.PC.career === "slave tender") { + } else if (isPCCareerInCategory("slaver")) { slave.career = "a prison guard"; if (V.PC.career === "slaver" || V.PC.actualAge > 24) { slave.actualAge = random(20, 24); @@ -724,7 +724,7 @@ App.Events.pRivalryHostage = function() { slave.fetish = "sadist"; slave.fetishStrength = 100; slave.fetishKnown = 1; - } else if (V.PC.career === "celebrity" || V.PC.career === "rising star" || V.PC.career === "child star") { + } else if (isPCCareerInCategory("celebrity")) { if (V.PC.career === "celebrity" || V.PC.actualAge > 24) { slave.actualAge = random(18, 24); slave.career = "a party girl"; @@ -748,7 +748,7 @@ App.Events.pRivalryHostage = function() { slave.intelligenceImplant = 0; slave.skill.oral = 100; slave.skill.entertainment = 100; - } else if (V.PC.career === "arcology owner") { + } else if (isPCCareerInCategory("arcology owner")) { slave.career = "a leading arcology citizen"; if (V.pedo_mode === 1) { slave.actualAge = random(16, 18); @@ -787,7 +787,7 @@ App.Events.pRivalryHostage = function() { } slave.boobs = 800; break; - case "Pastoralism": // note to self: check age for child hostages and comment on acquisition that she grew tits! + case "Pastoralism": slave.weight = 100; slave.muscles = 0; slave.boobs = 1200; diff --git a/src/events/nonRandomEvent.js b/src/events/nonRandomEvent.js index 15884cdfcc76c5a4838583f14ac4147e5eb1651b..7f4d2661dc738f2dc49ab40d0de42b7449c8363d 100644 --- a/src/events/nonRandomEvent.js +++ b/src/events/nonRandomEvent.js @@ -102,6 +102,8 @@ App.Events.getNonrandomEvents = function() { ], "SE nicaea council"), new App.Events.MurderAttempt(), new App.Events.MurderAttemptFollowup(), + new App.Events.pRaped(), + new App.Events.pAbducted(), ]; }; @@ -242,8 +244,6 @@ globalThis.nonRandomEvent = function() { setTimeout(() => Engine.play("SE vatcatgirl"), Engine.minDomActionDelay); } else if (V.projectN.status === 8 && V.growingNewCat === 0) { setTimeout(() => Engine.play("SE vatcatboy"), Engine.minDomActionDelay); - } else if ((effectiveWeek === 12) && V.raped === -1 && V.arcologyUpgrade.drones !== 1 && V.BodyguardID === 0 && V.PC.career !== "arcology owner") { - setTimeout(() => Engine.play("P raped"), Engine.minDomActionDelay); } else if ((effectiveWeek >= 15) && (V.arcologies[0].FSNeoImperialistLaw1 === 1) && V.assholeKnight !== 1) { V.assholeKnight = 1; V.imperialEventWeek = effectiveWeek; diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js index 100e737caf4fda444c40b8b352a8aa57e67ef33a..072492877bc35bd021dc4240f5b47066157c3503 100644 --- a/src/events/randomEvent.js +++ b/src/events/randomEvent.js @@ -10,12 +10,15 @@ App.Events.getIndividualEvents = function() { return [ // instantiate all possible random individual events here // example: new App.Events.TestEvent(), - new App.Events.RESSDevotedFearfulSlave(), + new App.Events.RESSArcadeSadist(), new App.Events.RESSAssFitting(), + new App.Events.RESSBedSnuggle(), + new App.Events.RESSBondageGear(), new App.Events.RESSCockFeederResistance(), new App.Events.RESSComfortableSeat(), new App.Events.RESSDevotedAnalVirgin(), new App.Events.RESSDevotedEducated(), + new App.Events.RESSDevotedFearfulSlave(), new App.Events.RESSDevotedShortstack(), new App.Events.RESSDevotedVirgin(), new App.Events.RESSDevotedWaist(), @@ -73,6 +76,10 @@ App.Events.getIndividualEvents = function() { new App.Events.CMRESSCatWorship(), new App.Events.CMRESSCatLove(), new App.Events.CMRESSCatPresent(), + + new App.Events.rePregInventorInvite(), + new App.Events.rePregInventorShowOff(), + new App.Events.rePregInventorFCTV(), ]; }; diff --git a/src/events/reRecruit/femaleRecruit.js b/src/events/reRecruit/femaleRecruit.js index 3f443fc4839a7fe7b479330cd4e9f80ec7b6c300..7d79f308f3b9fd61d010b4b744a9e61cd9552167 100644 --- a/src/events/reRecruit/femaleRecruit.js +++ b/src/events/reRecruit/femaleRecruit.js @@ -54,7 +54,7 @@ App.Events.recFemaleRecruit = class recFemaleRecruit extends App.Events.BaseEven let r = []; cashX(forceNeg(contractCost), "slaveTransfer", slave); r.push(`You complete the legalities and biometric scanning quickly and without fuss. ${slave.slaveName} bounces nervously on ${his} heels. Finally ${he} works up ${his} courage and asks,`); - if (S.HeadGirl.clothes !== "no clothing") { + if (App.Data.clothes.get(S.HeadGirl.clothes).exposure <= 3) { r.push(Spoken(slave, `"Can I have ${S.HeadGirl.clothes} like ${S.HeadGirl.slaveName}?"`)); } else { r.push(Spoken(slave, `"Can I work with ${S.HeadGirl.slaveName}?"`)); @@ -71,7 +71,7 @@ App.Events.recFemaleRecruit = class recFemaleRecruit extends App.Events.BaseEven let r = []; cashX(cost, "slaveTransfer"); r.push(`You complete the legalities and biometric scanning quickly and without fuss. ${slave.slaveName} bounces nervously on ${his} heels. Finally ${he} works up ${his} courage and asks,`); - if (S.HeadGirl.clothes !== "no clothing") { + if (App.Data.clothes.get(S.HeadGirl.clothes).exposure <= 3) { r.push(Spoken(slave, `"Can I have ${S.HeadGirl.clothes} like ${S.HeadGirl.slaveName}?"`)); } else { r.push(Spoken(slave, `"Can I work with ${S.HeadGirl.slaveName}?"`)); diff --git a/src/events/reRecruit/maleRecruit.js b/src/events/reRecruit/maleRecruit.js index 584898eebef9301ab3d3084f27a0a42de92b2797..3f33670b2f8aa39f928ec524adec5be78e73388d 100644 --- a/src/events/reRecruit/maleRecruit.js +++ b/src/events/reRecruit/maleRecruit.js @@ -50,7 +50,7 @@ App.Events.recMaleRecruit = class recMaleRecruit extends App.Events.BaseEvent { let r = []; cashX(forceNeg(contractCost), "slaveTransfer", slave); r.push(`You complete the legalities and biometric scanning quickly and without fuss. ${slave.slaveName} bounces nervously on ${his} heels. Finally ${he} works up ${his} courage and asks,`); - if (S.HeadGirl.clothes !== "no clothing") { + if (App.Data.clothes.get(S.HeadGirl.clothes).exposure <= 3) { r.push(Spoken(slave, `"Can I have ${S.HeadGirl.clothes} like ${S.HeadGirl.slaveName}?"`)); } else { r.push(Spoken(slave, `"Can I work with ${S.HeadGirl.slaveName}?"`)); @@ -67,7 +67,7 @@ App.Events.recMaleRecruit = class recMaleRecruit extends App.Events.BaseEvent { let r = []; cashX(cost, "slaveTransfer"); r.push(`You complete the legalities and biometric scanning quickly and without fuss. ${slave.slaveName} bounces nervously on ${his} heels. Finally ${he} works up ${his} courage and asks,`); - if (S.HeadGirl.clothes !== "no clothing") { + if (App.Data.clothes.get(S.HeadGirl.clothes).exposure <= 3) { r.push(Spoken(slave, `"Can I have ${S.HeadGirl.clothes} like ${S.HeadGirl.slaveName}?"`)); } else { r.push(Spoken(slave, `"Can I work with ${S.HeadGirl.slaveName}?"`)); diff --git a/src/events/scheduled/pitFight.js b/src/events/scheduled/pitFight.js index 4f5b02f0efa77fbc04a0c77604c9d28eb525c14e..a79f2897d0f20c26e85640a5b1a05786087a2670 100644 --- a/src/events/scheduled/pitFight.js +++ b/src/events/scheduled/pitFight.js @@ -7,52 +7,48 @@ App.Events.SEPitFight = class SEPitFight extends App.Events.BaseEvent { return [ () => !!V.pit, () => !V.pit.fought, - () => !!V.pit.slaveFightingBodyguard - || (V.pit.fighterIDs.length > 0 && (!!V.pit.animal || V.pit.bodyguardFights)) - || (V.pit.fighterIDs.length > 1) /* TODO: this condition should probably be reimplemented as casting for this event, rather than prereq... */ ]; } - execute(node) { - /** @type {number[]} */ + castActors() { const available = [...new Set(V.pit.fighterIDs)]; - /** @type {number[]} */ - const fighters = []; - - V.nextButton = "Continue"; - V.nextLink = "Scheduled Event"; - V.returnTo = "Scheduled Event"; - - V.pit.fought = true; if (V.pit.slaveFightingBodyguard) { // slave is fighting bodyguard for their life - fighters.push(S.Bodyguard.ID, V.pit.slaveFightingBodyguard); + this.actors.push(S.Bodyguard.ID, V.pit.slaveFightingBodyguard); } else { if (available.length > 0) { // first fighter if (S.Bodyguard && V.pit.bodyguardFights) { available.delete(S.Bodyguard.ID); - fighters.push(S.Bodyguard.ID); + this.actors.push(S.Bodyguard.ID); } else { - fighters.push(available.pluck()); + this.actors.push(available.pluck()); } // second fighter - if (available.length > 0 && !V.pit.animal) { - fighters.push(available.pluck()); + if (!V.pit.animal) { + if (available.length > 0) { + this.actors.push(available.pluck()); + } else { + return false; // couldn't cast second fighter + } } - } else { - throw new Error(`Pit fight triggered with ${V.pit.fighterIDs.length} fighters.`); // should technically never be triggered } } + return this.actors.length > 0; + } + + execute(node) { + V.nextButton = "Continue"; + V.nextLink = "Scheduled Event"; + V.returnTo = "Scheduled Event"; + + V.pit.fought = true; + node.appendChild(V.pit.lethal ? - App.Facilities.Pit.lethalFight(fighters) : - App.Facilities.Pit.nonlethalFight(fighters) + App.Facilities.Pit.lethalFight(this.actors) : + App.Facilities.Pit.nonlethalFight(this.actors) ); - - if (V.debugMode) { - console.log(`Available:\n${available}\nFighters:\n${fighters}`); - } } }; diff --git a/src/events/scheduled/seRaiding.js b/src/events/scheduled/seRaiding.js index a886c959483bf52abd94e9ee23dea0841adf4460..d4f96c85d406243b2317fd6c7562903b5713cd76 100644 --- a/src/events/scheduled/seRaiding.js +++ b/src/events/scheduled/seRaiding.js @@ -437,7 +437,8 @@ App.Events.SERaiding = class SERaiding extends App.Events.BaseEvent { slave.skill.combat = 1; slave.intelligence = random(20, 60); slave.intelligenceImplant = 15; - slave.hStyle = either("short", "very short"); + slave.hStyle = either("buzzcut", "bun", "shaved", "neat"); + slave.hLength = jsRandom(1, 9); slave.boobs = 150; slave.vagina = -1; slave.clit = 0; @@ -958,7 +959,7 @@ App.Events.SERaiding = class SERaiding extends App.Events.BaseEvent { r.push(`teen`); } else if (slave.visualAge <= 24) { r.push(`young`); - } else if (slave.visualAge <= 32) { + } else if (slave.visualAge <= 32) { // do nothing } else { r.push(`old`); } diff --git a/src/events/scheduled/seWedding.js b/src/events/scheduled/seWedding.js index b951ae7299dc810c678ba4a437e82b0a37e66bda..ba2a0a2cc854bdb0a5a97c818e22fddfd8cece94 100644 --- a/src/events/scheduled/seWedding.js +++ b/src/events/scheduled/seWedding.js @@ -785,12 +785,7 @@ App.Events.SEWedding = class SEWedding extends App.Events.BaseEvent { } } for (const slave of brides) { - slave.preg = 1; - slave.pregKnown = 1; - slave.pregWeek = 1; - slave.pregType = setPregType(slave); - WombImpregnate(slave, slave.pregType, -1, slave.preg); - slave.pregSource = -1; + knockMeUp(slave, 100, 2, -1); } if (brides.every((b) => b.vagina === 0 || (b.mpreg === 1 && b.anus === 0))) { r.push(`Naturally, the ceremony <span class="lime">took their virginities;</span>`); @@ -1830,11 +1825,7 @@ App.Events.SEWedding = class SEWedding extends App.Events.BaseEvent { marryingSlave.anus = 4; if (canGetPregnant(marryingSlave) && (random(1, 100) > 70) && marryingSlave.eggType === "human") { r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals the bitch managed to get knocked up. There is no time before the ceremony to deal with it.`); - marryingSlave.preg = 1; - marryingSlave.pregKnown = 1; - marryingSlave.pregWeek = 1; - marryingSlave.pregType = setPregType(marryingSlave); - WombImpregnate(marryingSlave, marryingSlave.pregType, marryingSlave.pregSource, marryingSlave.preg); + knockMeUp(marryingSlave, 100, 2, 0); } } else if (canDoVaginal(marryingSlave)) { seX(marryingSlave, "vaginal", "public", "penetrative", random(30, 60)); @@ -1848,11 +1839,7 @@ App.Events.SEWedding = class SEWedding extends App.Events.BaseEvent { } if (canGetPregnant(marryingSlave) && (random(1, 100) > 70) && marryingSlave.eggType === "human") { r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals the bitch managed to get knocked up. There is no time before the ceremony to deal with it.`); - marryingSlave.preg = 1; - marryingSlave.pregKnown = 1; - marryingSlave.pregWeek = 1; - marryingSlave.pregType = setPregType(marryingSlave); - WombImpregnate(marryingSlave, marryingSlave.pregType, marryingSlave.pregSource, marryingSlave.preg); + knockMeUp(marryingSlave, 100, 0, 0); } } else if (canDoAnal(marryingSlave)) { seX(marryingSlave, "anal", "public", "penetrative", random(30, 60)); @@ -1864,11 +1851,7 @@ App.Events.SEWedding = class SEWedding extends App.Events.BaseEvent { marryingSlave.anus = 4; if (canGetPregnant(marryingSlave) && (random(1, 100) > 70) && marryingSlave.eggType === "human") { r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals the bitch managed to get knocked up. There is no time before the ceremony to deal with it.`); - marryingSlave.preg = 1; - marryingSlave.pregKnown = 1; - marryingSlave.pregWeek = 1; - marryingSlave.pregType = setPregType(marryingSlave); - WombImpregnate(marryingSlave, marryingSlave.pregType, marryingSlave.pregSource, marryingSlave.preg); + knockMeUp(marryingSlave, 100, 1, 0); } } else { seX(marryingSlave, "oral", "public", "penetrative", random(30, 60)); @@ -1891,12 +1874,7 @@ App.Events.SEWedding = class SEWedding extends App.Events.BaseEvent { } if (canImpreg(marryingSlave, relationshipSlave) && (random(1, 100) > 70)) { r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals the bitch managed to get knocked up. There is no time before the ceremony to deal with it.`); - marryingSlave.preg = 1; - marryingSlave.pregKnown = 1; - marryingSlave.pregWeek = 1; - marryingSlave.pregSource = relationshipSlave.ID; - marryingSlave.pregType = setPregType(marryingSlave); - WombImpregnate(marryingSlave, marryingSlave.pregType, marryingSlave.pregSource, marryingSlave.preg); + knockMeUp(marryingSlave, 100, 2, relationshipSlave.ID); } } else if (canDoVaginal(marryingSlave)) { seX(marryingSlave, "vaginal", relationshipSlave, "penetrative", random(3, 7)); @@ -1907,12 +1885,7 @@ App.Events.SEWedding = class SEWedding extends App.Events.BaseEvent { } if (canImpreg(marryingSlave, relationshipSlave) && (random(1, 100) > 70)) { r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals the bitch managed to get knocked up. There is no time before the ceremony to deal with it.`); - marryingSlave.preg = 1; - marryingSlave.pregKnown = 1; - marryingSlave.pregWeek = 1; - marryingSlave.pregSource = relationshipSlave.ID; - marryingSlave.pregType = setPregType(marryingSlave); - WombImpregnate(marryingSlave, marryingSlave.pregType, marryingSlave.pregSource, marryingSlave.preg); + knockMeUp(marryingSlave, 100, 0, relationshipSlave.ID); } } else if (canDoAnal(marryingSlave)) { seX(marryingSlave, "anal", relationshipSlave, "penetrative", random(1, 4)); @@ -1923,12 +1896,7 @@ App.Events.SEWedding = class SEWedding extends App.Events.BaseEvent { } if (canImpreg(marryingSlave, relationshipSlave) && (random(1, 100) > 70)) { r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals the bitch managed to get knocked up. There is no time before the ceremony to deal with it.`); - marryingSlave.preg = 1; - marryingSlave.pregKnown = 1; - marryingSlave.pregWeek = 1; - marryingSlave.pregSource = relationshipSlave.ID; - marryingSlave.pregType = setPregType(marryingSlave); - WombImpregnate(marryingSlave, marryingSlave.pregType, marryingSlave.pregSource, marryingSlave.preg); + knockMeUp(marryingSlave, 100, 1, relationshipSlave.ID); } } else { seX(marryingSlave, "oral", relationshipSlave, "penetrative", random(15, 20)); @@ -1951,12 +1919,7 @@ App.Events.SEWedding = class SEWedding extends App.Events.BaseEvent { } if (canImpreg(marryingSlave, relationshipSlave) && (random(1, 100) > 70)) { r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals the bitch managed to get knocked up. There is no time before the ceremony to deal with it.`); - marryingSlave.preg = 1; - marryingSlave.pregKnown = 1; - marryingSlave.pregWeek = 1; - marryingSlave.pregSource = relationshipSlave.ID; - marryingSlave.pregType = setPregType(marryingSlave); - WombImpregnate(marryingSlave, marryingSlave.pregType, marryingSlave.pregSource, marryingSlave.preg); + knockMeUp(marryingSlave, 100, 2, relationshipSlave.ID); } } else if (canDoVaginal(marryingSlave)) { seX(marryingSlave, "vaginal", relationshipSlave, "penetrative", random(3, 7)); @@ -1967,12 +1930,7 @@ App.Events.SEWedding = class SEWedding extends App.Events.BaseEvent { } if (canImpreg(marryingSlave, relationshipSlave) && (random(1, 100) > 70)) { r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals the bitch managed to get knocked up. There is no time before the ceremony to deal with it.`); - marryingSlave.preg = 1; - marryingSlave.pregKnown = 1; - marryingSlave.pregWeek = 1; - marryingSlave.pregSource = relationshipSlave.ID; - marryingSlave.pregType = setPregType(marryingSlave); - WombImpregnate(marryingSlave, marryingSlave.pregType, marryingSlave.pregSource, marryingSlave.preg); + knockMeUp(marryingSlave, 100, 0, relationshipSlave.ID); } } else if (canDoAnal(marryingSlave)) { seX(marryingSlave, "anal", relationshipSlave, "penetrative", random(1, 4)); @@ -1983,11 +1941,7 @@ App.Events.SEWedding = class SEWedding extends App.Events.BaseEvent { } if (canImpreg(marryingSlave, relationshipSlave) && (random(1, 100) > 70)) { r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals the bitch managed to get knocked up. There is no time before the ceremony to deal with it.`); - marryingSlave.preg = 1; - marryingSlave.pregKnown = 1; - marryingSlave.pregWeek = 1; - marryingSlave.pregType = setPregType(marryingSlave); - WombImpregnate(marryingSlave, marryingSlave.pregType, marryingSlave.pregSource, marryingSlave.preg); + knockMeUp(marryingSlave, 100, 1, relationshipSlave.ID); } } else { seX(marryingSlave, "oral", relationshipSlave, "penetrative", random(15, 20)); @@ -2019,25 +1973,15 @@ App.Events.SEWedding = class SEWedding extends App.Events.BaseEvent { seX(marryingSlave, "vaginal", relationshipSlave, "penetrative"); r.push(`${He} later lets you know ${he} let ${relationshipSlave.slaveName} enjoy ${his} pussy one last time.`); if (canImpreg(marryingSlave, relationshipSlave) && (random(1, 100) > 90)) { - r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals${marryingSlave.slaveName} managed to get knocked up. There is no time before the ceremony to deal with it and the distraught ${girl} is in a panic for making you go through this.`); - marryingSlave.preg = 1; - marryingSlave.pregKnown = 1; - marryingSlave.pregWeek = 1; - marryingSlave.pregSource = relationshipSlave.ID; - marryingSlave.pregType = setPregType(marryingSlave); - WombImpregnate(marryingSlave, marryingSlave.pregType, marryingSlave.pregSource, marryingSlave.preg); + r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals ${marryingSlave.slaveName} managed to get knocked up. There is no time before the ceremony to deal with it and the distraught ${girl} is in a panic for making you go through this.`); + knockMeUp(marryingSlave, 100, 0, relationshipSlave.ID); } } else if (canDoAnal(marryingSlave)) { seX(marryingSlave, "anal", relationshipSlave, "penetrative"); r.push(`${He} later lets you know ${he} let ${relationshipSlave.slaveName} enjoy ${his} butt one last time.`); if (canImpreg(marryingSlave, relationshipSlave) && (random(1, 100) > 90)) { - r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals${marryingSlave.slaveName} managed to get knocked up. There is no time before the ceremony to deal with it and the distraught ${girl} is in a panic for making you go through this.`); - marryingSlave.preg = 1; - marryingSlave.pregKnown = 1; - marryingSlave.pregWeek = 1; - marryingSlave.pregSource = relationshipSlave.ID; - marryingSlave.pregType = setPregType(marryingSlave); - WombImpregnate(marryingSlave, marryingSlave.pregType, marryingSlave.pregSource, marryingSlave.preg); + r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals ${marryingSlave.slaveName} managed to get knocked up. There is no time before the ceremony to deal with it and the distraught ${girl} is in a panic for making you go through this.`); + knockMeUp(marryingSlave, 100, 1, relationshipSlave.ID); } } else { seX(marryingSlave, "oral", relationshipSlave, "penetrative"); @@ -2056,25 +2000,15 @@ App.Events.SEWedding = class SEWedding extends App.Events.BaseEvent { seX(marryingSlave, "vaginal", relationshipSlave, "penetrative"); r.push(`${He} later lets you know ${he} let ${relationshipSlave.slaveName} enjoy ${his} pussy one last time.`); if (canImpreg(marryingSlave, relationshipSlave) && (random(1, 100) > 90)) { - r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals${marryingSlave.slaveName} managed to get knocked up. There is no time before the ceremony to deal with it and the distraught ${girl} is in a panic for making you go through this.`); - marryingSlave.preg = 1; - marryingSlave.pregKnown = 1; - marryingSlave.pregWeek = 1; - marryingSlave.pregSource = relationshipSlave.ID; - marryingSlave.pregType = setPregType(marryingSlave); - WombImpregnate(marryingSlave, marryingSlave.pregType, marryingSlave.pregSource, marryingSlave.preg); + r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals ${marryingSlave.slaveName} managed to get knocked up. There is no time before the ceremony to deal with it and the distraught ${girl} is in a panic for making you go through this.`); + knockMeUp(marryingSlave, 100, 0, relationshipSlave.ID); } } else if (canDoAnal(marryingSlave)) { seX(marryingSlave, "anal", relationshipSlave, "penetrative"); r.push(`${He} later lets you know ${he} let ${relationshipSlave.slaveName} enjoy ${his} butt one last time.`); if (canImpreg(marryingSlave, relationshipSlave) && (random(1, 100) > 90)) { - r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals${marryingSlave.slaveName} managed to get knocked up. There is no time before the ceremony to deal with it and the distraught ${girl} is in a panic for making you go through this.`); - marryingSlave.preg = 1; - marryingSlave.pregKnown = 1; - marryingSlave.pregWeek = 1; - marryingSlave.pregSource = relationshipSlave.ID; - marryingSlave.pregType = setPregType(marryingSlave); - WombImpregnate(marryingSlave, marryingSlave.pregType, marryingSlave.pregSource, marryingSlave.preg); + r.push(`A pre-wedding checkup following an unusual bout of morning nausea reveals ${marryingSlave.slaveName} managed to get knocked up. There is no time before the ceremony to deal with it and the distraught ${girl} is in a panic for making you go through this.`); + knockMeUp(marryingSlave, 100, 1, relationshipSlave.ID); } } else { seX(marryingSlave, "oral", relationshipSlave, "penetrative"); diff --git a/src/facilities/AgentSelect.js b/src/facilities/AgentSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..1d67d8d8eb6bbc73eefac04b76f477fc2b781d48 --- /dev/null +++ b/src/facilities/AgentSelect.js @@ -0,0 +1,12 @@ +App.Facilities.AgentSelect = function() { + const f = document.createDocumentFragment(); + + App.UI.DOM.appendNewElement("h2", f, "Appoint an Agent from your devoted slaves"); + f.append(App.UI.SlaveList.slaveSelectionList( + s => App.Entity.facilities.arcologyAgent.manager.checkRequirements(s), + (slave) => App.UI.DOM.passageLink(SlaveFullName(slave), "Agent Workaround", + () => { V.i = V.slaves.findIndex((s) => s.ID === slave.ID); }), + s => App.Entity.facilities.arcologyAgent.manager.slaveHasExperience(s) + )); + return f; +}; diff --git a/src/facilities/arcade/arcadeFramework.js b/src/facilities/arcade/arcadeFramework.js index 1aefdf6abbc4cb49c2f70ef11627d932c80300c5..4093d972395e50c7181ea436ee24ac4f157c2aff 100644 --- a/src/facilities/arcade/arcadeFramework.js +++ b/src/facilities/arcade/arcadeFramework.js @@ -10,7 +10,8 @@ App.Data.Facilities.arcade = { }, }, defaultJob: "assignee", - manager: null + manager: null, + decorated: true }; App.Entity.Facilities.ArcadeJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/armory/BGSelect.js b/src/facilities/armory/BGSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..6cf9ca64096a92726a6286549959b7c5211eb78d --- /dev/null +++ b/src/facilities/armory/BGSelect.js @@ -0,0 +1,23 @@ +App.Facilities.BGSelect = function() { + let div = document.createElement("div"); + const f = document.createDocumentFragment(); + + App.UI.DOM.appendNewElement("h1", f, "Bodyguard Management"); + + if (S.Bodyguard) { + f.append(`${SlaveFullName(S.Bodyguard)} is working as your Bodyguard, remaining close to you at all times and guards your person. `); + f.append(App.UI.DOM.link("Remove Bodyguard", () => { + removeJob(S.Bodyguard, Job.BODYGUARD); + }, + [], "Main" + )); + + div.append(App.UI.DOM.makeCheckbox("bodyguardTrains"), " Can train potential successors."); + f.append(div); + } else { + f.append(`No Bodyguard assigned, appoint one from your devoted slaves.`); + } + + f.append(App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.armory, "BG Select")); + return f; +}; diff --git a/src/facilities/armory/armoryFramework.js b/src/facilities/armory/armoryFramework.js index c2a595acecf80bdf0230b4a64636faa1bc82ca73..9e8adb220d52853e8477d91232ba6396217dc7d1 100644 --- a/src/facilities/armory/armoryFramework.js +++ b/src/facilities/armory/armoryFramework.js @@ -19,7 +19,8 @@ App.Data.Facilities.armory = { shouldTalk: false, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: false }; App.Entity.facilities.armory = new App.Entity.Facilities.Facility(App.Data.Facilities.armory); diff --git a/src/facilities/bodyModification/bodyModification.js b/src/facilities/bodyModification/bodyModification.js index 025809e659e8ec1779b08276334420f36f00eb67..7cb155dd010df61ea9ddf0dfcc040d25904b2fc9 100644 --- a/src/facilities/bodyModification/bodyModification.js +++ b/src/facilities/bodyModification/bodyModification.js @@ -60,7 +60,7 @@ App.UI.bodyModification = function(slave, cheat = false) { r.push(`${his} new appearance.`); } if (brandApplied) { - r.push(`The smell of burnt flesh hangs in the air. Being branded <span class="health.dec">has hurt ${his} health a little.</span>`); + r.push(`The smell of burnt flesh hangs in the air. Being branded <span class="health dec">has hurt ${his} health a little.</span>`); healthDamage(slave, 10); brandApplied = false; } @@ -92,7 +92,7 @@ App.UI.bodyModification = function(slave, cheat = false) { } r.push(r.pop() + "."); } - r.push(`No matter how you chose to apply it, scarring so much of ${his} body has <span class="health.dec"> hurt ${his} health.</span>`); + r.push(`No matter how you chose to apply it, scarring so much of ${his} body has <span class="health dec"> hurt ${his} health.</span>`); healthDamage(slave, 20); } else { if (slave.scar[V.scarTarget.local][V.scarDesign.local] > 0) { @@ -142,7 +142,7 @@ App.UI.bodyModification = function(slave, cheat = false) { r.push(`You had no shortage of kinky and medical tools for applying scars. ${His} ${slave.skin} ${V.scarTarget.local} is bleeding profusely.`); } - r.push(`No matter how you chose to apply it, being scarred <span class="health.dec"> hurt ${his} health a little.</span>`); + r.push(`No matter how you chose to apply it, being scarred <span class="health dec"> hurt ${his} health a little.</span>`); healthDamage(slave, 10); } r.push(`Afterwards you seal the wounds with a white medical spray. Infection is no risk to ${slave.slaveName} thanks to your curatives, but in order to form obvious scar tissue you had to keep air out and delay normal healing as long as possible.`); @@ -538,7 +538,7 @@ App.UI.bodyModification = function(slave, cheat = false) { } function oddTattoos() { - const el = new DocumentFragment(); + const frag = new DocumentFragment(); let linkArray = []; let r = []; @@ -586,7 +586,7 @@ App.UI.bodyModification = function(slave, cheat = false) { r.push(`${His} middle isn't large enough to be a suitable canvas for a navel focused tattoo.`); } r.push(App.UI.DOM.generateLinksStrip(linkArray)); - App.Events.addNode(el, r, "div"); + App.Events.addNode(frag, r, "div"); r = []; linkArray = []; @@ -680,7 +680,7 @@ App.UI.bodyModification = function(slave, cheat = false) { } } r.push(App.UI.DOM.generateLinksStrip(linkArray)); - App.Events.addNode(el, r, "div"); + App.Events.addNode(frag, r, "div"); r = []; linkArray = []; @@ -770,13 +770,13 @@ App.UI.bodyModification = function(slave, cheat = false) { } r.push(App.UI.DOM.generateLinksStrip(linkArray)); - App.Events.addNode(el, r, "div"); - return el; + App.Events.addNode(frag, r, "div"); + return frag; } function customTats() { - const el = new DocumentFragment(); - App.UI.DOM.appendNewElement("h3", el, "Custom Tattoos"); + const frag = new DocumentFragment(); + App.UI.DOM.appendNewElement("h3", frag, "Custom Tattoos"); const r = []; for (const location of validTattooLocations) { const varName = tattooLocations.get(location); @@ -811,9 +811,9 @@ App.UI.bodyModification = function(slave, cheat = false) { ) ) ); - App.Events.addNode(el, r, "div", "grid-2columns-auto"); + App.Events.addNode(frag, r, "div", "grid-2columns-auto"); if (slave.custom.tattoo !== "") { - el.append( + frag.append( App.UI.DOM.link( "Remove custom Tattoo", () => { @@ -824,7 +824,7 @@ App.UI.bodyModification = function(slave, cheat = false) { ) ); } - return el; + return frag; } } @@ -832,7 +832,7 @@ App.UI.bodyModification = function(slave, cheat = false) { const el = new DocumentFragment(); const selection = document.createElement("span"); selection.id = "brand-selection"; - selection.append(brand(slave, cheat)); + selection.append(brand()); el.append(selection); if (slave.breedingMark === 1 && (V.propOutcome === 0 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")) { @@ -856,6 +856,7 @@ App.UI.bodyModification = function(slave, cheat = false) { const el = new DocumentFragment(); App.UI.DOM.appendNewElement("h2", el, "Scars"); let r = []; + const bodyPartData = App.Data.Slave.body.get(V.scarTarget.local); for (const _scarName in slave.scar) { const scarDiv = document.createElement("div"); @@ -880,191 +881,16 @@ App.UI.bodyModification = function(slave, cheat = false) { App.UI.DOM.appendNewElement("div", el, `${His} skin is not scarred.`); } + el.append(App.UI.scarSelect("local", slave, cheat)); r = []; - r.push(`Use <strong>${V.scarDesign.local}</strong> or choose another scar:`); - const scarTypes = new Set([ - "whip", - "burn", - "surgical", - "menacing", - "exotic" - ]); // Other common scars might be battle scars or c-Section but it makes little sense to include them here - let linkArray = []; - for (const scarType of scarTypes) { - linkArray.push( - App.UI.DOM.link( - capFirstChar(scarType), - () => { - V.scarDesign.local = scarType; - refresh(); - } - ) - ); - } - r.push(App.UI.DOM.generateLinksStrip(linkArray)); - App.Events.addNode(el, r, "div"); - - r = []; - r.push(`Or design your own:`); - r.push( - App.UI.DOM.makeTextBox( - V.scarDesign.local, - (v) => { - V.scarDesign.local = v; - refresh(); - } - ) - ); - App.Events.addNode(el, r, "div"); - - r = []; - r.push(`Choose a site for scaring:`); - - let scarLocations = new Map(); - - if (["exotic", "menacing"].includes(V.scarDesign.local)) { - scarLocations.set("Cheeks", "cheek"); - } else { - // Sorted head to toe - scarLocations.set("Entire body", "entire body"); - - // Head - if (slave.earShape !== "none") { - scarLocations.set("Ears", "ear"); - } - scarLocations.set("Cheeks", "cheek"); - scarLocations.set("Neck", "neck"); - - // Torso - scarLocations.set("Chest", "chest"); - scarLocations.set("Breasts", "breast"); - scarLocations.set("Back", "back"); - scarLocations.set("Lower Back", "lower back"); - scarLocations.set("Belly", "belly"); - scarLocations.set("Pubic Mound", "pubic mound"); - - if (slave.dick > 0) { - scarLocations.set("Penis", "penis"); - } - if (slave.balls > 0 && slave.scrotum > 0) { - scarLocations.set("Testicles", "testicle"); - } - - // Arms - scarLocations.set("Shoulders", "shoulder"); - if (hasAnyNaturalArms(slave)) { - scarLocations.set("Arm, upper", "upper arm"); - scarLocations.set("Arm, lower", "lower arm"); - scarLocations.set("Wrists", "wrist"); - scarLocations.set("Hands", "hand"); - } - - // Legs - scarLocations.set("Buttocks", "buttock"); - if (hasAnyNaturalLegs(slave)) { - scarLocations.set("Thighs", "thigh"); - scarLocations.set("Calves", "calf"); - scarLocations.set("Ankles", "ankle"); - scarLocations.set("Feet", "foot"); - } - } - - linkArray = []; - for (const [text, value] of scarLocations) { - linkArray.push( - App.UI.DOM.link( - text, - () => { - V.scarTarget.local = value; - refresh(); - } - ) - ); - } - r.push(App.UI.DOM.generateLinksStrip(linkArray)); - App.Events.addNode(el, r, "div"); - - r = []; - r.push(`Or a custom site:`); - r.push( - App.UI.DOM.makeTextBox( - V.scarTarget.local, - (v) => { - V.scarTarget.local = v; - refresh(); - } - ) - ); - App.Events.addNode(el, r, "div"); - - // Correct some "bad" choices" - if (["exotic", "menacing"].includes(V.scarDesign.local)) { - if (V.scarTarget.local !== "cheek") { - V.scarTarget.local = "cheek"; - } - } - - r = []; - - if (["ankle", "breast", "buttock", "calf", "cheek", "ear", "foot", "hand", "lower arm", "shoulder", "testicle", "thigh", "upper arm", "wrist"].includes(V.scarTarget.local)) { - const _leftTarget = ("left " + V.scarTarget.local); - const _rightTarget = ("right " + V.scarTarget.local); - if (slave.scar[_leftTarget]) { - r.push(`${His}${_leftTarget} is already marked with ${App.Desc.expandScarString(slave, _leftTarget)}.`); - } - if (slave.scar[_rightTarget]) { - r.push(`${His}${_rightTarget} is already marked with ${App.Desc.expandScarString(slave, _rightTarget)}.`); - } - r.push(`Scar ${him} now with ''${V.scarDesign.local}'' on the`); - let _left = 0, _right = 0; - // overwrite brand - - if (!(["upper arm", "lower arm", "wrist", "hand"].includes(V.scarTarget.local) && getLeftArmID(slave) !== 1) && !(["thigh", "calf", "ankle", "foot"].includes(V.scarTarget.local) && getLeftLegID(slave) !== 1)) { - _left = 1; - // make next checks easier - r.push( - App.UI.DOM.link( - "left", - () => { - V.scarTarget.local = _leftTarget; - scarApplied = true; - App.Medicine.Modification.addScar(slave, _leftTarget, V.scarDesign.local); - billMod(); - degradation += 10; - refresh(); - } - ) - ); - } - if (!(["upper arm", "lower arm", "wrist", "hand"].includes(V.scarTarget.local) && getRightArmID(slave) !== 1) && !(["thigh", "calf", "ankle", "foot"].includes(V.scarTarget.local) && getRightLegID(slave) !== 1)) { - _right = 1; - // make next checks easier - } - if (_left && _right) { - r.push(`${V.scarTarget.local}, or the`); - } - if (_right) { - r.push( - App.UI.DOM.link( - "right", - () => { - V.scarTarget.local = _rightTarget; - scarApplied = true; - App.Medicine.Modification.addScar(slave, _rightTarget, V.scarDesign.local); - billSurgery(); - degradation += 10; - refresh(); - } - ) - ); - } - if (!_left || !_right) { - r.push(`${V.scarTarget.local}?`); - } + if (["exotic", "menacing"].includes(V.scarDesign.local) && !V.scarTarget.local.endsWith("cheek")) { + r.push(`"${capFirstChar(V.scarDesign.local)}" scars can only be applied to cheeks.`); + } else if (bodyPartData && bodyPartData.isPair) { + r.push(`Choose a side to scar.`); } else { if (slave.scar.hasOwnProperty(V.scarTarget.local)) { if (slave.scar[V.scarTarget.local][V.scarDesign.local]) { - r.push(`${He} already has ${V.scarDesign.local} scars on ${his} V.scarTarget.local. You can make it worse.`); + r.push(`${He} already has ${V.scarDesign.local} scars on ${his} ${V.scarTarget.local}. You can make it worse.`); } else { // check how much scarring is on this part const _scarTotalValue = (Object.values(slave.scar[V.scarTarget.local])).reduce((a, b) => a + b, 0); @@ -1119,10 +945,11 @@ App.UI.bodyModification = function(slave, cheat = false) { return el; } - function brand(slave, cheat = false) { + function brand() { const el = new DocumentFragment(); let p = document.createElement('p'); let div = document.createElement('div'); + const bodyPartData = App.Data.Slave.body.get(V.brandTarget.local); App.UI.DOM.appendNewElement("h2", el, "Branding"); @@ -1134,30 +961,20 @@ App.UI.bodyModification = function(slave, cheat = false) { div.append(App.UI.DOM.passageLink("official brand", "Universal Rules")); } div.append(": "); - if (!cheat) { - div.append( - App.UI.DOM.link( - "Remove Brand", - () => { + div.append( + App.UI.DOM.link( + "Remove Brand", + () => { + if (!cheat) { brandApplied = false; - delete slave.brand[brandPlace]; billSurgery(); degradation -= 10; - refresh(); - }, - ) - ); - } else { - div.append( - App.UI.DOM.link( - "Remove Brand", - () => { - delete slave.brand[brandPlace]; - brandRefresh(); - }, - ) - ); - } + } + delete slave.brand[brandPlace]; + refresh(); + }, + ) + ); p.append(div); } @@ -1174,290 +991,40 @@ App.UI.bodyModification = function(slave, cheat = false) { } el.append(p); - p = document.createElement('p'); - - div = document.createElement('div'); - div.append(`Use ''${V.brandDesign.local}'' or choose another brand: `); - div.append(symbolOptions("personal")); - p.append(div); - - p.append(symbolBlock("dirtyWord")); - p.append(symbolBlock("genitalSymbol")); - p.append(symbolBlock("silhouettes")); - p.append(symbolBlock("FS")); - - div = document.createElement('div'); - div.append(`Or design your own: `); - div.append( - App.UI.DOM.makeTextBox( - V.brandDesign.local, - v => { - V.brandDesign.local = v; - brandRefresh(); - }, - ) - ); - p.append(div); - el.append(p); - - p = document.createElement('p'); - App.UI.DOM.appendNewElement("div", p, "Choose a site for branding: "); - const body = slaveBody(); - p.append(partLinks(body.head)); - p.append(partLinks(body.torso)); - p.append(partLinks(body.arms)); - p.append(partLinks(body.legs)); - - div = document.createElement('div'); - div.append(`Or a custom site: `); - div.append( - App.UI.DOM.makeTextBox( - V.brandTarget.local, - v => { - V.brandTarget.local = v; - brandRefresh(); - }, - ) - ); - p.append(div); - el.append(p); + el.append(App.UI.brandSelect("local", slave, cheat)); p = document.createElement('p'); - if (["ankle", "breast", "buttock", "calf", "cheek", "ear", "foot", "hand", "lower arm", "shoulder", "testicle", "thigh", "upper arm", "wrist"].includes(V.brandTarget.local)) { - const leftTarget = ("left " + V.brandTarget.local); - const rightTarget = ("right " + V.brandTarget.local); - if (slave.brand[leftTarget]) { - p.append(`${His} ${leftTarget} is already marked with ${slave.brand[leftTarget]}. `); - } - if (slave.brand[rightTarget]) { - p.append(`${His} ${rightTarget} is already marked with ${slave.brand[rightTarget]}. `); - } - p.append(`Brand ${him} now with ''${V.brandDesign.local}'' on the `); // todo: break out bold - let _left; - let _right; - if ( - !(["upper arm", "lower arm", "wrist", "hand"].includes(V.brandTarget.local) && getLeftArmID(slave) !== 1) && - !(["thigh", "calf", "ankle", "foot"].includes(V.brandTarget.local) && getLeftLegID(slave) !== 1) - ) { - _left = 1;// make next checks easier - if (!cheat) { - p.append( - App.UI.DOM.link( - "left", - () => { - brandApplied = true; - slave.brand[leftTarget] = check(V.brandDesign.local); - billMod(); - degradation += 10; - refresh(); - }, - ) - ); - } else { - p.append( - App.UI.DOM.link( - "left", - () => { - slave.brand[leftTarget] = check(V.brandDesign.local); - refresh(); - }, - ) - ); - } - if (!(["upper arm", "lower arm", "wrist", "hand"].includes(V.brandTarget.local) && getRightArmID(slave) !== 1) && !(["thigh", "calf", "ankle", "foot"].includes(V.brandTarget.local) && getRightLegID(slave) !== 1)) { - _right = 1; // make next checks easier - } - if (_left && _right) { - p.append(` ${V.brandTarget.local}, or the `); - } - if (_right) { - if (!cheat) { - p.append( - App.UI.DOM.link( - "right", - () => { - brandApplied = true; - slave.brand[rightTarget] = check(V.brandDesign.local); - billMod(); - degradation += 10; - refresh(); - }, - ) - ); - } else { - p.append( - App.UI.DOM.link( - "right", - () => { - slave.brand[rightTarget] = check(V.brandDesign.local); - refresh(); - }, - ) - ); - } - } - p.append(`? `); - if (!_left || !_right) { - p.append(` ${V.brandTarget.local}`); - App.UI.DOM.appendNewElement("span", p, `Branding will slightly reduce ${his} beauty but may slowly increase your reputation.`, "note"); - } - } + if (slave.brand[V.brandTarget.local] === V.brandDesign.local) { + p.append(`${He} already has ${V.brandDesign.local} on ${his} ${V.brandTarget.local}.`); + } else if (bodyPartData && bodyPartData.isPair) { + p.append(`Choose a side to brand.`); } else { - if (slave.brand[V.brandTarget.local] === V.brandDesign.local) { - p.append(`${He} already has ${V.brandDesign.local} on ${his} ${V.brandTarget.local}.`); + p.append( + App.UI.DOM.link( + "Brand", + () => { + if (!cheat) { + brandApplied = true; + billMod(); + degradation += 10; + } + slave.brand[V.brandTarget.local] = V.brandDesign.local; + refresh(); + }, + ) + ); + p.append(` with ${V.brandDesign.local} on the ${V.brandTarget.local}`); + if (slave.brand[V.brandTarget.local]) { + p.append(`, covering the "${slave.brand[V.brandTarget.local]}" that is already there? `); } else { - if (!cheat) { - p.append( - App.UI.DOM.link( - "Brand", - () => { - brandApplied = true; - slave.brand[V.brandTarget.local] = V.brandDesign.local; - billMod(); - degradation += 10; - refresh(); - }, - ) - ); - } else { - p.append( - App.UI.DOM.link( - "Brand", - () => { - slave.brand[V.brandTarget.local] = V.brandDesign.local; - refresh(); - }, - ) - ); - } - p.append(` with ${V.brandDesign.local} on the ${V.brandTarget.local}`); - if (slave.brand[V.brandTarget.local]) { - p.append(`, covering the "${slave.brand[V.brandTarget.local]}" that is already there? `); - } else { - p.append(`. `); - } - App.UI.DOM.appendNewElement("span", p, `Branding will slightly reduce ${his} beauty but may slowly increase your reputation.`, "note"); + p.append(`. `); } + App.UI.DOM.appendNewElement("span", p, `Branding will slightly reduce ${his} beauty but may slowly increase your reputation.`, "note"); } el.append(p); return el; - - function symbolBlock(brandList) { - const div = document.createElement('div'); - div.classList.add("choices"); - div.append(symbolOptions(brandList)); - return div; - } - - function symbolOptions(brandList) { - const list = App.Medicine.Modification.Brands[brandList]; - const array = []; - for (const brand in list) { - const frag = new DocumentFragment(); - if (!cheat && list[brand].hasOwnProperty("requirements")) { - if (!list[brand].requirements(slave)) { - continue; - } - } - if (brandList === "FS") { - App.UI.DOM.appendNewElement("span", frag, "FS ", "note"); - } - frag.append( - App.UI.DOM.link( - list[brand].displayName, - () => { - V.brandDesign.local = check(brand); - brandRefresh(); - } - ) - ); - array.push(frag); - } - return App.UI.DOM.generateLinksStrip(array); - } - - function slaveBody() { - const body = {}; - // Sorted head to toe - // Head - body.head = {}; - if (slave.earShape !== "none") { - body.head.ears = "Ears"; - } - body.head.cheek = "Cheeks"; - body.head.neck = "Neck"; - - // Torso - body.torso = {}; - body.torso.chest = "Chest"; - body.torso.breast = "Breasts"; - body.torso.back = "Back"; - body.torso["lower back"] = "Lower Back"; - body.torso.belly = "Belly"; - body.torso["pubic mound"] = "Pubic Mound"; - - if (slave.dick > 0) { - body.torso.penis = "Penis"; - } - if (slave.balls > 0 && slave.scrotum > 0) { - body.torso.testicle = "Testicles"; - } - - // Arms - body.arms = {}; - body.arms.shoulder = "Shoulders"; - if (hasAnyNaturalArms(slave)) { - body.arms["upper arm"] = "Arm, upper"; - body.arms["lower arm"] = "Arm, lower"; - body.arms.wrist = "Wrists"; - body.arms.hand = "Hands"; - } - - // Legs - body.legs = {}; - body.legs.buttock = "Buttocks"; - if (hasAnyNaturalLegs(slave)) { - body.legs.thigh = "Thighs"; - body.legs.calf = "Calves"; - body.legs.ankle = "Ankles"; - body.legs.foot = "Feet"; - } - return body; - } - - function partLinks(bodyPartObj) { - const div = document.createElement("div"); - div.classList.add("choices"); - const array = []; - for (const bp in bodyPartObj) { - array.push( - App.UI.DOM.link( - bodyPartObj[bp], - () => { - V.brandTarget.local = check(bp); - brandRefresh(); - } - ) - ); - } - div.append(App.UI.DOM.generateLinksStrip(array)); - return div; - } - - function check(brand) { - switch (brand) { - case "a big helping of your favorite food": - return "a big helping of " + V.PC.refreshment; - default: - return brand; - } - } - - function brandRefresh() { - jQuery('#brand-selection').empty().append(brand(slave, cheat)); - } } function refresh() { @@ -1490,3 +1057,257 @@ App.UI.bodyModification = function(slave, cheat = false) { } } }; +/** + * UI for the Body Modification system/studio. Refreshes without refreshing the passage. + * @param {"local"|"official"} category + * @param {App.Entity.SlaveState} [slave] + * @param {boolean} [cheat] if true, will hide scenes, prevent damage to slaves, and keep the player from being billed for mods. + * @returns {DocumentFragment} + */ +App.UI.brandSelect = function(category, slave, cheat = false) { + const el = new DocumentFragment(); + let r = []; + const isOfficial = category === "official"; + + r.push(`Use <strong>${V.brandDesign[category]}</strong> or choose another brand:`); + r.push(symbolOptions("personal")); + App.Events.addNode(el, r, "div"); + r = []; + + r.push(symbolBlock("dirtyWord")); + r.push(symbolBlock("genitalSymbol")); + r.push(symbolBlock("silhouettes")); + r.push(symbolBlock("FS")); + App.Events.addNode(el, r, "div"); + r = []; + + r.push(`Or design your own: `); + r.push( + App.UI.DOM.makeTextBox( + V.brandDesign[category], + v => { + V.brandDesign[category] = v; + App.UI.reload(); + }, + ) + ); + App.Events.addNode(el, r, "div"); + r = []; + + App.UI.DOM.appendNewElement("div", el, "Choose a site for branding: "); + if (category === "local") { + r.push(App.UI.bodyPartSelector(V.brandTarget, "local", slave)); + } else { + r.push( + App.UI.DOM.makeElement("div", `One 'welcome' for a new slave is to have them branded. Where would you like such brands to be applied?`), + App.UI.bodyPartSelector(V.brandTarget, "primary", true) + ); + const bodyPartRoot = App.UI.bodyPartRoot(V.brandTarget.primary); + const bodyPartData = App.Data.Slave.body.get(bodyPartRoot); + if (bodyPartData && (bodyPartData).hasOwnProperty("requirements")) { + r.push(`It's possible that <strong>${V.brandTarget.primary}</strong> may be missing from a slave. Choose a fallback in case it is not available: Current backup is <strong>${V.brandTarget.secondary}</strong>:`); + App.Events.addNode(el, r, "div"); + r = []; + r.push(App.UI.bodyPartSelector(V.brandTarget, "secondary", false)); + } + } + + App.Events.addNode(el, r, "div"); + return el; + + function symbolBlock(brandList) { + const div = document.createElement('div'); + div.classList.add("choices"); + div.append(symbolOptions(brandList)); + return div; + } + + function symbolOptions(brandList) { + const list = App.Medicine.Modification.Brands[brandList]; + const array = []; + for (const brand in list) { + const frag = new DocumentFragment(); + if (!cheat && list[brand].hasOwnProperty("requirements")) { + if (!isOfficial && !list[brand].requirements(slave)) { + continue; + } + } + if (brandList === "FS") { + App.UI.DOM.appendNewElement("span", frag, "FS ", "note"); + } + frag.append( + App.UI.DOM.link( + list[brand].displayName, + () => { + V.brandDesign[category] = check(brand); + App.UI.reload(); + } + ) + ); + array.push(frag); + } + return App.UI.DOM.generateLinksStrip(array); + } + + function check(brand) { + switch (brand) { + case "a big helping of your favorite food": + return "a big helping of " + V.PC.refreshment; + default: + return brand; + } + } +}; + +/** + * @param {"local"|"official"} category + * @param {App.Entity.SlaveState} [slave] + * @param {boolean} [cheat] if true, will hide scenes, prevent damage to slaves, and keep the player from being billed for mods. + * @returns {DocumentFragment} + */ +App.UI.scarSelect = function(category, slave, cheat = false) { + const el = new DocumentFragment(); + let r = []; + r.push(`Use <strong>${V.scarDesign.local}</strong> or choose another scar:`); + const scarTypes = new Set([ + "whip", + "burn", + "surgical", + "menacing", + "exotic" + ]); // Other common scars might be battle scars or c-Section but it makes little sense to include them here + let linkArray = []; + for (const scarType of scarTypes) { + linkArray.push( + App.UI.DOM.link( + capFirstChar(scarType), + () => { + V.scarDesign.local = scarType; + App.UI.reload(); + } + ) + ); + } + r.push(App.UI.DOM.generateLinksStrip(linkArray)); + App.Events.addNode(el, r, "div"); + + r = []; + r.push(`Or design your own:`); + r.push( + App.UI.DOM.makeTextBox( + V.scarDesign.local, + (v) => { + V.scarDesign.local = v; + App.UI.reload(); + } + ) + ); + App.Events.addNode(el, r, "div"); + + r = []; + r.push(`Choose a site for scaring:`); + if (category === "local") { + r.push(App.UI.bodyPartSelector(V.scarTarget, "local", slave)); + } else { + r.push( + App.UI.DOM.makeElement("div", `One 'welcome' for a new slave is to have them scarred. Where would you like such scars to be applied?`), + App.UI.bodyPartSelector(V.scarTarget, "primary", true) + ); + const bodyPartRoot = App.UI.bodyPartRoot(V.scarTarget.primary); + const bodyPartData = App.Data.Slave.body.get(bodyPartRoot); + if (bodyPartData && bodyPartData.hasOwnProperty("requirements")) { + r.push(`It's possible that <strong>${V.scarTarget.primary}</strong> may be missing from a slave. Choose a fallback in case it is not available: Current backup is <strong>${V.scarTarget.secondary}</strong>:`); + App.Events.addNode(el, r, "div"); + r = []; + r.push(App.UI.bodyPartSelector(V.scarTarget, "secondary", false)); + } + } + App.Events.addNode(el, r, "div"); + return el; +}; + +/** + * + * @param {Object} variable + * @param {string} property + * @param {boolean | App.Entity.SlaveState} selector false means missing limbs. True means no missing limbs. Slave state checks the slave. + * @returns {HTMLElement} + */ +App.UI.bodyPartSelector = function(variable, property, selector) { + let el = document.createElement("div"); + const links = { + head: [], + torso: [], + arms: [], + legs: [], + }; + + const makeLink = (bodyKey, bodyObj) => { + links[bodyObj.category].push( + App.UI.DOM.link( + capFirstChar(bodyKey), + () => { + variable[property] = bodyKey; + App.UI.reload(); + } + ) + ); + }; + for (const [bodyKey, bodyObj] of App.Data.Slave.body) { + if (selector === true) { // Always show all parts + makeLink(bodyKey, bodyObj); + } else if (selector === false) { // Looking for a backup slot for every slave, hide all parts that could be amputated + if (!bodyObj.hasOwnProperty("requirements")) { + makeLink(bodyKey, bodyObj); + } + } else if (!(bodyObj.hasOwnProperty("requirements")) || bodyObj.requirements(selector)) { // We have an actual slave here, run the check on them + makeLink(bodyKey, bodyObj); + } + } + for (const category in links) { + App.UI.DOM.appendNewElement("div", el, App.UI.DOM.generateLinksStrip(links[category]), "choices"); + } + + // Choose a side + const bodyPartData = App.Data.Slave.body.get(variable[property]); + if (bodyPartData && bodyPartData.isPair) { + const linkArray = []; + for (const side of ["left", "right"]) { + linkArray.push(App.UI.DOM.link(capFirstChar(side), () => { + variable[property] = `${side} ${variable[property]}`; + App.UI.reload(); + })); + } + App.UI.DOM.appendNewElement("div", el, "Side: ", "indent") + .append(App.UI.DOM.generateLinksStrip(linkArray)); + } + + let div = document.createElement('div'); + div.append(`Or a custom site: `); + div.append( + App.UI.DOM.makeTextBox( + variable[property], + v => { + variable[property] = v; + App.UI.reload(); + }, + ) + ); + el.append(div); + + return el; +}; + +/** + * Find the root of a string that may start with "left" or "right" + * @param {string} bodyPart + * @returns {string} + */ +App.UI.bodyPartRoot = function(bodyPart) { + if (bodyPart.startsWith("left")) { + bodyPart = (bodyPart.replace(/left /g, "")); + } else if (bodyPart.startsWith("right")) { + bodyPart = (bodyPart.replace(/right /g, "")); + } + return bodyPart; +}; diff --git a/src/facilities/brothel/MadamSelect.js b/src/facilities/brothel/MadamSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..1d883bcb9495f1943971b38445b0af1c370e8d01 --- /dev/null +++ b/src/facilities/brothel/MadamSelect.js @@ -0,0 +1,17 @@ +App.Facilities.MadamSelect = function() { + const f = document.createDocumentFragment(); + + if (S.Madam) { + f.append(`Madam: ${SlaveFullName(S.Madam)}, manages the brothel. `); + f.append(App.UI.DOM.link("Remove Madam", () => { + removeJob(S.Madam, Job.MADAM); + }, + [], "Brothel" + )); + } else { + f.append(`No Madam assigned, appoint one from your devoted slaves.`); + } + + f.append(App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.brothel, "Brothel")); + return f; +}; diff --git a/src/facilities/brothel/brothelFramework.js b/src/facilities/brothel/brothelFramework.js index 1230827d0d541a6de0c078b0056317913dcb87b1..394381ad87e8e52292525ef29efdf12c8f9d8d26 100644 --- a/src/facilities/brothel/brothelFramework.js +++ b/src/facilities/brothel/brothelFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.brothel = { shouldTalk: true, shouldThink: true, requiredDevotion: 50 - } + }, + decorated: true }; App.Entity.Facilities.BrothelJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/cellblock/WardenessSelect.js b/src/facilities/cellblock/WardenessSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..ab9b749520f639806bb2db72f841b5958d28ba8e --- /dev/null +++ b/src/facilities/cellblock/WardenessSelect.js @@ -0,0 +1,17 @@ +App.Facilities.WardenessSelect = function() { + const f = document.createDocumentFragment(); + + if (S.Wardeness) { + f.append(`Wardeness: ${SlaveFullName(S.Wardeness)}, helps breaking your prisoners. `); + f.append(App.UI.DOM.link("Remove Wardeness", () => { + removeJob(S.Wardeness, Job.WARDENESS); + }, + [], "Cellblock" + )); + } else { + f.append(`No Wardeness assigned, appoint one from your devoted slaves.`); + } + + f.append(App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.cellblock, "Cellblock")); + return f; +}; diff --git a/src/facilities/cellblock/cellblockFramework.js b/src/facilities/cellblock/cellblockFramework.js index 627cf6d90468e0587ff5d3d963e1f954b8109952..4c3edfa4186f730e4eadb2aad9138fd7092d669f 100644 --- a/src/facilities/cellblock/cellblockFramework.js +++ b/src/facilities/cellblock/cellblockFramework.js @@ -25,8 +25,8 @@ App.Data.Facilities.cellblock = { shouldTalk: false, shouldThink: false, requiredDevotion: 51 - - } + }, + decorated: false }; App.Entity.Facilities.CellblockJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/clinic/NurseSelect.js b/src/facilities/clinic/NurseSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..b63ebff3cbeab4653a8ef2e22cb9e88bef1b0901 --- /dev/null +++ b/src/facilities/clinic/NurseSelect.js @@ -0,0 +1,17 @@ +App.Facilities.NurseSelect = function() { + const f = document.createDocumentFragment(); + + if (S.Nurse) { + f.append(`${SlaveFullName(S.Nurse)} is working as your Nurse, helping to heal your slaves. `); + f.append(App.UI.DOM.link("Remove Nurse", () => { + removeJob(S.Nurse, Job.NURSE); + }, + [], "Clinic" + )); + } else { + f.append(`No Nurse assigned, appoint one from your devoted slaves.`); + } + + f.append(App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.clinic, "Clinic")); + return f; +}; diff --git a/src/facilities/clinic/clinicFramework.js b/src/facilities/clinic/clinicFramework.js index 23dd472c60def174c852bae283bbe3f97835d0db..dbdde301ccfaae7ce7f3ad2f810862a83a48e022 100644 --- a/src/facilities/clinic/clinicFramework.js +++ b/src/facilities/clinic/clinicFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.clinic = { shouldTalk: false, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.ClinicPatientJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/club/DJSelect.js b/src/facilities/club/DJSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..0c9709074305f1a13092b2543b5366d85db82500 --- /dev/null +++ b/src/facilities/club/DJSelect.js @@ -0,0 +1,20 @@ +App.Facilities.DJSelect = function() { + const f = document.createDocumentFragment(); + V.nextButton = "Back"; + V.nextLink = "Club"; + V.encyclopedia = "DJ"; + + if (S.DJ) { + f.append(`${SlaveFullName(S.DJ)} is working as your DJ, managing entertainment in ${V.clubName}. `); + f.append(App.UI.DOM.link("Remove DJ", () => { + removeJob(S.Concubine, Job.DJ); + }, + [], "Club" + )); + } else { + f.append(`No DJ assigned, appoint one from your devoted slaves.`); + } + + f.append(App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.club, "Club")); + return f; +}; diff --git a/src/facilities/club/clubFramework.js b/src/facilities/club/clubFramework.js index e34db004dfcebbd2ca273ba0be575a48ed1fb8f8..19bb8d05833876586882ba767e0f60968580b8a6 100644 --- a/src/facilities/club/clubFramework.js +++ b/src/facilities/club/clubFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.club = { shouldTalk: true, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.ClubSlutJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/dairy/MilkmaidSelect.js b/src/facilities/dairy/MilkmaidSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..71d0137889fecd798c6cbb54bc5c51b4c76a1903 --- /dev/null +++ b/src/facilities/dairy/MilkmaidSelect.js @@ -0,0 +1,17 @@ +App.Facilities.MilkmaidSelect = function() { + const f = document.createDocumentFragment(); + + if (S.Milkmaid) { + f.append(`${SlaveFullName(S.Milkmaid)} is working as your Milkmaid, looking after your livestock, helping them give milk${V.seeDicks > 0 ? ' and semen' : ''}. `); + f.append(App.UI.DOM.link("Remove Milkmaid", () => { + removeJob(S.Milkmaid, Job.MILKMAID); + }, + [], "Dairy" + )); + } else { + f.append(`No Milkmaid assigned, appoint one from your devoted slaves.`); + } + + f.append(App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.dairy, "Dairy")); + return f; +}; diff --git a/src/facilities/dairy/dairyFramework.js b/src/facilities/dairy/dairyFramework.js index 36515b4243a65a91a71839a295f421b29e24bb6c..3c3b1db0d8054ae929590e721fe46151f87aa6c8 100644 --- a/src/facilities/dairy/dairyFramework.js +++ b/src/facilities/dairy/dairyFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.dairy = { shouldTalk: false, shouldThink: true, requiredDevotion: 21 - } + }, + decorated: true }; App.Entity.Facilities.DairyCowJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/farmyard/FarmerSelect.js b/src/facilities/farmyard/FarmerSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..12e8db3a450746bf8da2218017394d32e94c86c9 --- /dev/null +++ b/src/facilities/farmyard/FarmerSelect.js @@ -0,0 +1,17 @@ +App.Facilities.FarmerSelect = function() { + const f = document.createDocumentFragment(); + + if (S.Farmer) { + f.append(`Farmer: ${SlaveFullName(S.Farmer)}, tends to your crops and animals. `); + f.append(App.UI.DOM.link("Remove Farmer", () => { + removeJob(S.Farmer, Job.FARMER); + }, + [], "Farmyard" + )); + } else { + f.append(`No Farmer assigned, appoint one from your devoted slaves.`); + } + + f.append(App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.farmyard, "Farmyard")); + return f; +}; diff --git a/src/facilities/farmyard/animals/farmyardAnimals.tw b/src/facilities/farmyard/animals/farmyardAnimals.tw deleted file mode 100644 index 0174a57b3d50ff39684c5c08b9644476aed2bd1d..0000000000000000000000000000000000000000 --- a/src/facilities/farmyard/animals/farmyardAnimals.tw +++ /dev/null @@ -1,3 +0,0 @@ -:: Farmyard Animals [nobr] - -<<includeDOM App.Facilities.Farmyard.animals()>> diff --git a/src/facilities/farmyard/farmerSelect.tw b/src/facilities/farmyard/farmerSelect.tw deleted file mode 100644 index dfaadbb1a96df02ad478825766207ce21efd0ea8..0000000000000000000000000000000000000000 --- a/src/facilities/farmyard/farmerSelect.tw +++ /dev/null @@ -1,14 +0,0 @@ -:: Farmer Select [nobr jump-to-safe jump-hidden jump-from-safe] - -<<set $nextButton = "Back", $nextLink = "Farmyard", $encyclopedia = "Farmer">> -<<if ($FarmerID != 0)>> - <<setLocalPronouns _S.Farmer>> - <span class='slave-name'><<= SlaveFullName(_S.Farmer)>></span> is serving as your Farmer.<br><br>$He will tend to your crops and animals. -<<else>> - You have not selected a Farmer. -<</if>> - -<br><br>''Appoint a Farmer from your obedient slaves:'' -<br><br>[[None|Farmyard][removeJob(_S.Farmer, Job.FARMER)]] -<br><br> -<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.farmyard, "Farmyard")>> diff --git a/src/facilities/farmyard/farmyardFramework.js b/src/facilities/farmyard/farmyardFramework.js index b79c787e6c8c1c5e224dbe567e50bc4b5ec5d4c1..399caad3194f222d414b4d7d0866f8bc75f9375a 100644 --- a/src/facilities/farmyard/farmyardFramework.js +++ b/src/facilities/farmyard/farmyardFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.farmyard = { shouldTalk: false, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.FarmHandJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/headGirlSuite/headGirlSuiteFramework.js b/src/facilities/headGirlSuite/headGirlSuiteFramework.js index cfc1d1c3e3c05660d37be15d75ccac12c44abe74..ae9d465fd8b0f4adcd058cbb7f45e03c076500d2 100644 --- a/src/facilities/headGirlSuite/headGirlSuiteFramework.js +++ b/src/facilities/headGirlSuite/headGirlSuiteFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.headGirlSuite = { shouldTalk: true, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: false }; App.Entity.Facilities.HeadGirlSuite = class extends App.Entity.Facilities.SingleJobFacility { diff --git a/src/facilities/incubator/incubatorFramework.js b/src/facilities/incubator/incubatorFramework.js index 22d9d4bae2006f146dd16321fd9f202ea6aa6669..dce45c6cd6c235338f01d2d59d97953f0ded7dcb 100644 --- a/src/facilities/incubator/incubatorFramework.js +++ b/src/facilities/incubator/incubatorFramework.js @@ -10,7 +10,8 @@ App.Data.Facilities.incubator = { } }, defaultJob: "tank", - manager: null + manager: null, + decorated: false }; App.Entity.Facilities.IncubatorTankJob = class extends App.Entity.Facilities.Job { diff --git a/src/facilities/incubator/incubatorInteract.js b/src/facilities/incubator/incubatorInteract.js index 82a8c0420107ccebb5ca827f573f862e16f34753..9b57a3fe331332addaf70a257e3c0ce089afaf21 100644 --- a/src/facilities/incubator/incubatorInteract.js +++ b/src/facilities/incubator/incubatorInteract.js @@ -892,7 +892,8 @@ App.UI.incubator = function() { testicles: 0, rightEye: 0, leftEye: 0, - voiceBox: 0 + voiceBox: 0, + cochleae: 0 }; for (const organ of V.incubator.organs) { if (V.incubator.tanks[i].ID === organ.ID) { @@ -988,6 +989,16 @@ App.UI.incubator = function() { } App.Events.addNode(p, r, "div"); } + if (V.incubator.tanks[i].hears === -2) { + r = []; + r.push(`${He} appears to be deaf:`); + if (tankOrgans.cochleae !== 1) { + r.push(makeLink("Prepare cochleae", () => { App.Medicine.OrganFarm.growIncubatorOrgan(V.incubator.tanks[i], "cochleae"); }, refresh)); + } else { + r.push(App.UI.DOM.makeElement("span", `Cochleae are already prepared.`, `detail`)); + } + App.Events.addNode(p, r, "div"); + } } el.append(p); } @@ -1394,7 +1405,7 @@ App.UI.incubator = function() { row.append(`Advanced monitoring and stimulant injection systems have been installed in the tanks to monitor and maintain a developing child's height.`); row = document.createElement("div"); linkArray = []; - if (V.incubator.upgrade.growthStims === 2) { + if (V.incubator.setting.growthStims === 2) { row.append(`Children are injected with higher than recommended doses of stimulants; exceeding expected final height is likely. `); } else { linkArray.push(makeLink(`Overload`, () => { V.incubator.setting.growthStims = 2; }, refresh)); diff --git a/src/facilities/masterSuite/ConcubineSelect.js b/src/facilities/masterSuite/ConcubineSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..289eeb32199ebf51d64f3d3ab8f11681c1a0c424 --- /dev/null +++ b/src/facilities/masterSuite/ConcubineSelect.js @@ -0,0 +1,17 @@ +App.Facilities.ConcubineSelect = function() { + const f = document.createDocumentFragment(); + + if (S.Concubine) { + f.append(`${SlaveFullName(S.Concubine)} is your Concubine, taking the lead in seeing to your pleasure. `); + f.append(App.UI.DOM.link("Remove Concubine", () => { + removeJob(S.Concubine, Job.CONCUBINE); + }, + [], "Master Suite" + )); + } else { + f.append(`No Concubine assigned, appoint one from your devoted slaves.`); + } + + f.append(App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.masterSuite, "Master Suite")); + return f; +}; diff --git a/src/facilities/masterSuite/masterSuiteFramework.js b/src/facilities/masterSuite/masterSuiteFramework.js index cdcc7d5f28a3333deb02e45c2f636ded2d546429..83e67a773242e968831fc29ed8c173bd852b533e 100644 --- a/src/facilities/masterSuite/masterSuiteFramework.js +++ b/src/facilities/masterSuite/masterSuiteFramework.js @@ -26,7 +26,8 @@ App.Data.Facilities.masterSuite = { shouldTalk: false, shouldThink: false, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.MasterSuiteFuckToyJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/nursery/MatronSelect.js b/src/facilities/nursery/MatronSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..b67973ca9eaed2e25adadda46e11dfdb0aff50f6 --- /dev/null +++ b/src/facilities/nursery/MatronSelect.js @@ -0,0 +1,17 @@ +App.Facilities.MatronSelect = function() { + const f = document.createDocumentFragment(); + + if (S.Matron) { + f.append(`${SlaveFullName(S.Matron)} is working as your Matron, managing the nursery. `); + f.append(App.UI.DOM.link("Remove Matron", () => { + removeJob(S.Matron, Job.MATRON); + }, + [], "Nursery" + )); + } else { + f.append(`No Matron assigned, appoint one from your devoted slaves.`); + } + + f.append(App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.nursery, "Nursery")); + return f; +}; diff --git a/src/facilities/nursery/matronSelect.tw b/src/facilities/nursery/matronSelect.tw deleted file mode 100644 index 1f00599be61f945e66b825c517dc574407accc5f..0000000000000000000000000000000000000000 --- a/src/facilities/nursery/matronSelect.tw +++ /dev/null @@ -1,14 +0,0 @@ -:: Matron Select [nobr jump-to-safe jump-hidden jump-from-safe] - -<<set $nextButton = "Back", $nextLink = "Nursery", $encyclopedia = "Matron">> -<<if ($MatronID != 0)>> - <<setLocalPronouns _S.Matron>> - <span class='slave-name'><<= SlaveFullName(_S.Matron)>></span> is serving as your Matron.<br><br>$He will manage the nursery. -<<else>> - You have not selected a Matron. -<</if>> - -<br><br>''Appoint a Matron from your devoted slaves:'' -<br><br>[[None|Nursery][removeJob(_S.Matron, Job.MATRON)]] -<br><br> -<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.nursery, "Nursery")>> diff --git a/src/facilities/nursery/nurseryFramework.js b/src/facilities/nursery/nurseryFramework.js index daa83f65ceeb4065faef20f304a1e19b84844514..94597390d5e89097835c89ea7548d6fcbb570ac2 100644 --- a/src/facilities/nursery/nurseryFramework.js +++ b/src/facilities/nursery/nurseryFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.nursery = { shouldTalk: true, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.NurseryNannyJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/penthouse/HGSelect.js b/src/facilities/penthouse/HGSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..505a6105cc5781b4a394200e489f3287840b0df3 --- /dev/null +++ b/src/facilities/penthouse/HGSelect.js @@ -0,0 +1,216 @@ +App.Facilities.HGSelect = function() { + let div = document.createElement("div"); + const f = document.createDocumentFragment(); + let r = []; + let links = []; + + App.UI.DOM.appendNewElement("h1", f, "Head Girl Management"); + + if (S.HeadGirl) { + const HGName = SlaveFullName(S.HeadGirl); + const { + His, He, he, + his, him, himself + } = getPronouns(S.HeadGirl); + + f.append(`${SlaveFullName(S.HeadGirl)} is working as your HeadGirl`); + if (V.arcologies[0].FSEgyptianRevivalistLaw === 1) { + f.append(`/Consort; serving and providing comfort, in addition to performing normal Head Girl duties`); + } + f.append(`. `); + if (V.HGSuite) { + f.append(`Currently living in ${capFirstChar(V.HGSuiteName)} `); + } + f.append(App.UI.DOM.link("Remove HeadGirl", () => { + removeJob(S.HeadGirl, Job.HEADGIRL); + }, + [], "Main" + )); + + App.UI.DOM.appendNewElement("div", f, `Slave training ${HGName} will prioritize enabled items in the following order`, "bold"); + + div.append(App.UI.DOM.makeCheckbox("headGirlTrainsHealth"), " Health"); + App.UI.DOM.appendNewElement("div", f, div, "indent"); + + div = document.createElement("div"); + div.append(App.UI.DOM.makeCheckbox("headGirlTrainsParaphilias"), " Paraphilias"); + App.UI.DOM.appendNewElement("div", f, div, "indent"); + + if (V.headGirlTrainsFlaws) { + r.push(`${HGName} will train flaws.`,); + } else if (V.headGirlSoftensFlaws) { + r.push(`${HGName} will softern flaws into quirks.`); + } else if (V.headGirlOverridesQuirks) { + r.push(`${HGName} will override quirks.`); + } + + links.push(App.UI.DOM.link(" Override quirks", () => { + V.headGirlTrainsFlaws = 0; + V.headGirlSoftensFlaws = 0; + V.headGirlOverridesQuirks = 1; + }, + [], passage() + )); + links.push(App.UI.DOM.link(" Soften flaws", () => { + V.headGirlTrainsFlaws = 0; + V.headGirlSoftensFlaws = 1; + V.headGirlOverridesQuirks = 0; + }, + [], passage() + )); + links.push(App.UI.DOM.link(" Train flaws", () => { + V.headGirlTrainsFlaws = 1; + V.headGirlSoftensFlaws = 0; + V.headGirlOverridesQuirks = 0; + }, + [], passage() + )); + + r.push(App.UI.DOM.generateLinksStrip(links)); + App.Events.addNode(f, r, "div", "indent"); + + div = document.createElement("div"); + div.append(App.UI.DOM.makeCheckbox("headGirlTrainsObedience"), " Obedience"); + App.UI.DOM.appendNewElement("div", f, div, "indent"); + + div = document.createElement("div"); + div.append(App.UI.DOM.makeCheckbox("headGirlTrainsSkills"), " Skills"); + App.UI.DOM.appendNewElement("div", f, div, "indent"); + + App.UI.DOM.appendNewElement("div", f, "Training methods: ", "underline"); + + r = []; + if (V.HGSeverity === 1) { + r.push(`${HGName} will be <span class="bold">aggressive</span> when punishing, with rape strongly encouraged.`); + r.push(App.UI.DOM.link(" Moderate", () => { + V.HGSeverity = 0; + }, + [], passage() + )); + } else if (V.HGSeverity === 0) { + links = []; + r.push(`${HGName} will be <span class="bold">moderate</span> when punishing, carefully selecting appropriate consequences.`); + links.push(App.UI.DOM.link(" Be aggressive", () => { + V.HGSeverity = 1; + }, + [], passage() + )); + links.push(App.UI.DOM.link(` Apply restrictions`, () => { + V.HGSeverity = -1; + }, + [], passage() + )); + r.push(App.UI.DOM.generateLinksStrip(links)); + } else if (V.HGSeverity === -1) { + r.push(`${HGName} will be <span class="bold">respectful</span> when punishing, treating slaves decently.`); + r.push(App.UI.DOM.link(" Be stricter", () => { + V.HGSeverity = 0; + }, + [], passage() + )); + } + App.Events.addNode(f, r, "div", "indent"); + + r = []; + if (V.HGPiercings === 1) { + r.push(`${HGName} is <span class="bold">allowed</span> to use piercings as a tool to improve slaves' attitudes.`); + r.push(App.UI.DOM.link(" Disallow", () => { + V.HGPiercings = 0; + }, + [], passage() + )); + } else { + r.push(`${HGName} is <span class="bold">not allowed</span> to use piercings as a tool to improve slaves' attitudes.`); + r.push(App.UI.DOM.link(" Allow", () => { + V.HGPiercings = 1; + }, + [], passage() + )); + } + App.Events.addNode(f, r, "div", "indent"); + + r = []; + App.UI.DOM.appendNewElement("div", f, "Behavior towards you: ", "underline"); + if (V.HGFormality === 1) { + r.push(`${HGName} will be <span class="bold">formal:</span> you will always be called ${getWrittenTitle(S.HeadGirl)}, just like any other slave.`); + r.push(App.UI.DOM.link(" Allow private informality", () => { + V.HGFormality = 0; + }, + [], passage() + )); + } else { + r.push(`${HGName} is allowed to be <span class="bold">informal:</span> in private, you can be called ${properTitle()}.`); + r.push(App.UI.DOM.link(" Maintain complete formality", () => { + V.HGFormality = 1; + }, + [], passage() + )); + } + App.Events.addNode(f, r, "div", "indent"); + + if (V.seePreg !== 0) { + if (V.universalRulesImpregnation === "HG") { + f.append(`${HGName} is responsible for impregnating fertile slaves.`); + V.HGCum = resetHGCum(S.HeadGirl); + if (canPenetrate(S.HeadGirl) && S.HeadGirl.pubertyXY === 1) { + f.append(`To maximize the chances of impregnation, ${he} will fuck fertile pussies frequently during the week. ${S.HeadGirl.slaveName} can service ${V.HGCum} slaves this way.`); + if (S.HeadGirl.devotion > 95) { + f.append(`${He} loves you so much ${he}'ll fuck them until ${he}'s sore.`); + } else { + f.append(`If ${he} were more devoted to you, ${he} might be able to drive ${himself} to get hard and service one more.`); + } + if (S.HeadGirl.balls >= 120) { + r.push(`${His} unreal balls produce nearly an endless supply of semen; ${his} ability to impregnate is almost limitless.`); + } else if (S.HeadGirl.balls >= 80) { + r.push(`${His} inhuman balls produce so much semen ${he} can easily impregnate twenty girls in one sitting.`); + } else if (S.HeadGirl.balls >= 50) { + r.push(`${His} giant balls produce so much semen ${he} can easily impregnate twelve girls in one sitting.`); + } else if (S.HeadGirl.balls >= 25) { + r.push(`${His} oversized balls produce so much semen ${he} can cum repeatedly in a single session.`); + } else if (S.HeadGirl.balls >= 5) { + r.push(`${His} big balls produce so much semen ${he} can cum more before ${he}'s drained.`); + } else { + r.push(`Bigger balls would let ${him} cum more before ${he}'s drained.`); + } + if (S.HeadGirl.health.condition > 95) { + f.append(`${His} wonderful health lets ${him} get hard and stay hard all the time.`); + } else { + f.append(`If ${his} health were perfect, ${he} might be able to get hard more often.`); + } + if (S.HeadGirl.energy > 95) { + f.append(`${His} nymphomania drives ${him} to go above and beyond in this.`); + } else { + f.append(`A more powerful sex drive could reduce ${his} refractory period.`); + } + } else { + f.append(`However, ${S.HeadGirl.slaveName} cannot perform this duty.`); + } + r.push(App.UI.DOM.link(` Rescind ${his} impregnation responsibility`, () => { + V.universalRulesImpregnation = "none"; + }, + [], passage() + )); + r.push(App.UI.DOM.link(` See to it yourself`, () => { + V.universalRulesImpregnation = "PC"; + }, + [], passage() + )); + f.append(App.UI.DOM.generateLinksStrip(r)); + } else { + if (canPenetrate(S.HeadGirl) && S.HeadGirl.pubertyXY === 1) { + App.UI.DOM.appendNewElement("div", f, `${HGName} is capable of impregnating slaves, but it's not part of ${his} responsibilities.`).append( + App.UI.DOM.link(` Assign ${him} to impregnate`, () => { + V.universalRulesImpregnation = "HG"; + }, + [], passage() + )); + } + } + } + } else { + f.append(`No HeadGirl assigned, appoint one from your devoted slaves.`); + } + + f.append(App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.headGirlSuite, "HG Select")); + return f; +}; diff --git a/src/facilities/penthouse/RecruiterSelect.js b/src/facilities/penthouse/RecruiterSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..9ba675579b8ae80e7e84b379c2c7d1548e7907e2 --- /dev/null +++ b/src/facilities/penthouse/RecruiterSelect.js @@ -0,0 +1,162 @@ +App.Facilities.RecruiterSelect = function() { + const f = document.createDocumentFragment(); + const recruiterCap = document.createDocumentFragment(); + let newLine = document.createElement("div"); + let r = []; + + App.UI.DOM.appendNewElement("h1", f, "Recruiter Management"); + + if (S.Recruiter) { + f.append(`${SlaveFullName(S.Recruiter)} is working as your Recruiter, currently ${V.recruiterTarget !== "other arcologies" ? 'recruiting girls. ' : 'acting as a sexual Ambassador'}`); + if (V.recruiterTarget === "other arcologies") { + if (V.arcologies[0].influenceTarget === -1) { + f.append(`.<span class='red'>Since you have not selected another arcology to influence, your recruiter's talents are going to waste. Select an influence target to apply them. `); + } else { + f.append(` to `); + for (const arc of V.arcologies) { + if (arc.direction === V.arcologies[0].influenceTarget) { + f.append(`${arc.name}` ); + break; + } + } + } + } + f.append(App.UI.DOM.link("Remove Recruiter", () => { + removeJob(S.Recruiter, Job.RECRUITER); + }, + [], "Main" + )); + + App.UI.DOM.appendNewElement("div", f); + f.append(`Your recruiter will target ${V.recruiterTarget}, `); + if (V.recruiterTarget === "desperate whores") { + f.append("they will be skilled but unhealthy. "); + } else if (V.recruiterTarget === "young migrants") { + f.append("they will be young and inexperienced but unhealthy. "); + } else if (V.recruiterTarget === "Will be mature") { + f.append("they will be mature. "); + } else if (V.recruiterTarget === "expectant mothers") { + f.append("they will be pregnant and likely unhealthy. "); + } else if (V.recruiterTarget === "dissolute sissies") { + f.append("they will be born male and have some experience. "); + } else if (V.recruiterTarget === "reassignment candidates") { + f.append("they will be born male. "); + } else if (V.recruiterTarget === "other arcologies") { + f.append("they will appoint the Recruiter to be a sexual Ambassador. "); + } + + r.push(App.UI.DOM.link(`Desperate whores`, () => { + V.recruiterTarget = "desperate whores"; + }, + [], passage() + )); + + r.push(App.UI.DOM.link("Young migrants", () => { + V.recruiterTarget = "young migrants"; + }, + [], passage() + )); + + r.push(App.UI.DOM.link("Recent divorcees", () => { + V.recruiterTarget = "recent divorcees"; + }, + [], passage() + )); + + if (V.seeDicks !== 100 && V.seePreg !== 0) { + r.push(App.UI.DOM.link("Expectant mothers", () => { + V.recruiterTarget = "expectant mothers"; + }, + [], passage() + )); + } + + if (V.seeDicks !== 0) { + r.push(App.UI.DOM.link("Dissolute sissies", () => { + V.recruiterTarget = "dissolute sissies"; + }, + [], passage() + )); + + r.push(App.UI.DOM.link("Reassignment candidates", () => { + V.recruiterTarget = "reassignment candidates"; + }, + [], passage() + )); + } + + if (V.arcologies.length > 1) { + r.push(App.UI.DOM.link("Other arcologies' cultures", () => { + V.oldRecruiterTarget = V.recruiterTarget; + V.recruiterTarget = "other arcologies"; + }, + [], passage() + )); + } + + f.append(App.UI.DOM.generateLinksStrip(r)); + + newLine.append(App.UI.DOM.makeCheckbox("recruiterEugenics"), App.UI.DOM.makeElement("note", " Target only individuals that can pass eugenics SMRs. This option will increase time it takes to recruit depending on how many eugenics SMR are active.")); + f.append(newLine); + + let idleTarget = 2 + + (V.brothel + V.club + V.arcade + V.dairy + V.servantsQuarters) + + V.masterSuite + V.HGSuite + V.dojo + V.brothel + V.club; + if (V.dairy && V.dairyRestraintsSetting < 2) { + idleTarget++; + } + idleTarget += V.farmyard + V.servantsQuarters + V.masterSuite + V.schoolroom + V.spa; + idleTarget += V.nursery + V.clinic + V.cellblock; + + newLine = document.createElement("div"); + newLine.append("Suspend active recruiting and focus on publicity when: "); + if (V.recruiterIdleRule === "number") { + newLine.append(`${V.recruiterIdleNumber} sex slaves owned`); + } else if (V.recruiterIdleRule === "facility") { + newLine.append(`match facility expansion, `); + if (idleTarget >= 20) { + newLine.append(`${idleTarget} positions.`); + } else { + newLine.append("20 positions (rule minimum)."); + } + } else { + newLine.append("always recruit"); + } + f.append(newLine); + + r = []; + r.push(App.UI.DOM.link("Always recruit", () => { + V.recruiterIdleRule = "always"; + }, + [], passage() + )); + r.push(App.UI.DOM.link("Facilities & leadership", () => { + V.recruiterIdleRule = "facility"; + }, + [], passage() + )); + + recruiterCap.append(App.UI.DOM.link("Set to this many slaves ", () => { + V.recruiterIdleRule = "number"; + }, + [], passage() + )); + if (V.recruiterIdleRule === "number") { + recruiterCap.append(App.UI.DOM.makeTextBox(V.recruiterIdleNumber, (v) => { + V.recruiterIdleNumber = v; + Engine.play(passage()); + }, true)); + } + r.push(recruiterCap); + + f.append(App.UI.DOM.generateLinksStrip(r)); + App.UI.DOM.appendNewElement("div", f, "'Facilities' doesn't include training slots in cellblock, schoolroom, spa, clinic (but does include those leaders)"); + + V.recruiterIdleNumber = Math.max(Math.trunc(Number(V.recruiterIdleNumber) || 20), 20); + } else { + f.append(`No Recruiter assigned, appoint one from your devoted slaves.`); + } + + f.append(App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.penthouse, "Recruiter Select")); + return f; +}; diff --git a/src/facilities/penthouse/penthouseFramework.js b/src/facilities/penthouse/penthouseFramework.js index b7fa25023b6df5cad44b3e2a6d57d542319290f7..de971b63f50cb9e1eaa743077cec05aaf0c481ae 100644 --- a/src/facilities/penthouse/penthouseFramework.js +++ b/src/facilities/penthouse/penthouseFramework.js @@ -85,7 +85,8 @@ App.Data.Facilities.penthouse = { shouldTalk: true, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: false }; App.Entity.Facilities.PenthouseJobs = { diff --git a/src/facilities/penthouse/penthousePassage.js b/src/facilities/penthouse/penthousePassage.js index 8a2c616b64026c0f9e4dd86422ab6f1c5c33e0f6..ac96c78561fb2e767ff894647ba96046446ee3d3 100644 --- a/src/facilities/penthouse/penthousePassage.js +++ b/src/facilities/penthouse/penthousePassage.js @@ -47,11 +47,10 @@ App.UI.managePenthouse = function() { function capacity() { const el = new DocumentFragment(); let r = []; - let cost; App.UI.DOM.appendNewElement("h2", el, "Penthouse Capacity"); // Dorms - cost = Math.trunc(V.dormitory * 1000 * V.upgradeMultiplierArcology); + const dormCost = Math.trunc(V.dormitory * 1000 * V.upgradeMultiplierArcology); r.push(`The main penthouse dormitory, which houses slaves who aren't living in a facility and aren't granted a luxurious standard of living, has a capacity of`); r.push(App.UI.DOM.makeElement("span", JSON.stringify(V.dormitory), "bold")); r.push(`slaves.`); @@ -59,14 +58,14 @@ App.UI.managePenthouse = function() { App.UI.DOM.link( "Expand the dormitory", () => { - cashX(forceNeg(cost), "capEx"); + cashX(forceNeg(dormCost), "capEx"); V.dormitory += 10; V.PC.skill.engineering += .1; App.UI.reload(); }, [], "", - `Costs ${cashFormat(cost)}` + `Costs ${cashFormat(dormCost)}` ) ); r.push(App.UI.DOM.makeElement("span", `Exceeding this limit is bad for slaves' health, devotion and trust.`, "detail")); @@ -74,7 +73,7 @@ App.UI.managePenthouse = function() { // Luxury rooms r = []; - cost = Math.trunc(V.rooms * 1000 * V.upgradeMultiplierArcology); + const luxuryCost = Math.trunc(V.rooms * 1000 * V.upgradeMultiplierArcology); r.push(`The penthouse also features little individual rooms, which house slaves who do enjoy a luxurious standard of living. They have a capacity of`); r.push(App.UI.DOM.makeElement("span", JSON.stringify(V.rooms), "bold")); r.push(`slaves.`); @@ -82,14 +81,14 @@ App.UI.managePenthouse = function() { App.UI.DOM.link( "Expand the rooms", () => { - cashX(forceNeg(cost), "capEx"); + cashX(forceNeg(luxuryCost), "capEx"); V.rooms += 5; V.PC.skill.engineering += .1; App.UI.reload(); }, [], "", - `Costs ${cashFormat(cost)}` + `Costs ${cashFormat(luxuryCost)}` ) ); r.push(App.UI.DOM.makeElement("span", `The number of rooms determines the number of slaves that can be granted luxury.`, "detail")); diff --git a/src/facilities/pit/pitFramework.js b/src/facilities/pit/pitFramework.js index 88c32bb2f2f30e36a1988674701b6e0ca07fd647..9401caf98b6190bcd06014cbbe54350956456467 100644 --- a/src/facilities/pit/pitFramework.js +++ b/src/facilities/pit/pitFramework.js @@ -11,7 +11,8 @@ App.Data.Facilities.pit = { } }, defaultJob: "fighter", - manager: null + manager: null, + decorated: false }; App.Entity.Facilities.PitFighterJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/salon/salonPassage.js b/src/facilities/salon/salonPassage.js index 00dba29238bb3c875a147a35cd0c2071bf0bb164..c6d257eb7c3561b331f86f9bd422a48b5ea856dc 100644 --- a/src/facilities/salon/salonPassage.js +++ b/src/facilities/salon/salonPassage.js @@ -99,7 +99,7 @@ App.UI.salon = function(slave, cheat = false) { } el.append(options.render()); - el.append(App.Medicine.Salon.ears(slave)); + el.append(App.Medicine.Salon.ears(slave, cheat)); return el; } @@ -265,7 +265,7 @@ App.UI.salon = function(slave, cheat = false) { // Length option = options.addOption(`${hasWig ? "Find longer or shorter wig" : "Cut or lengthen hair"}`, "hLength", slave); if (slave.hLength > 0) { - for (const style of App.Medicine.Modification.hairStyles.Length) { + for (const style of App.Medicine.Modification.hLength) { if ( (style.hasOwnProperty("requirements") && !style.requirements(slave)) || (style.hLength && style.hLength > slave.hLength) @@ -515,6 +515,8 @@ App.UI.salon = function(slave, cheat = false) { } el.append(options.render()); + + el.append(App.Medicine.Salon.tail(slave, cheat)); return el; } diff --git a/src/facilities/schoolroom/SchoolTeacherSelect.js b/src/facilities/schoolroom/SchoolTeacherSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..8501f5f29a9768cbdcc22ecc94e6ea93032cf53a --- /dev/null +++ b/src/facilities/schoolroom/SchoolTeacherSelect.js @@ -0,0 +1,17 @@ +App.Facilities.SchoolTeacherSelect = function() { + const f = document.createDocumentFragment(); + + if (S.Schoolteacher) { + f.append(`${SlaveFullName(S.Schoolteacher)} is working as your Schoolteacher, helping to teach your slaves. `); + f.append(App.UI.DOM.link("Remove Schoolteacher", () => { + removeJob(S.Schoolteacher, Job.TEACHER); + }, + [], "Schoolroom" + )); + } else { + f.append(`No Schoolteacher assigned, appoint one from your devoted slaves.`); + } + + f.append(App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.schoolroom, "Schoolroom")); + return f; +}; diff --git a/src/facilities/schoolroom/schoolroomFramework.js b/src/facilities/schoolroom/schoolroomFramework.js index 2770017ce38892cba7f962c7c118b51b94a345cd..0c22037161a18f55bd44bea535b338322133af54 100644 --- a/src/facilities/schoolroom/schoolroomFramework.js +++ b/src/facilities/schoolroom/schoolroomFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.schoolroom = { shouldTalk: true, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.SchoolroomStudentJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/servantsQuarters/StewardessSelect.js b/src/facilities/servantsQuarters/StewardessSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..cee631852fc790241f045afac9b051ef59907b21 --- /dev/null +++ b/src/facilities/servantsQuarters/StewardessSelect.js @@ -0,0 +1,17 @@ +App.Facilities.StewardessSelect = function() { + const f = document.createDocumentFragment(); + + if (S.Stewardess) { + f.append(`${SlaveFullName(S.Stewardess)} is working as your Stewardess, managing the Servants' Quarters. `); + f.append(App.UI.DOM.link("Remove Stewardess", () => { + removeJob(S.Stewardess, Job.STEWARD); + }, + [], "Servants' Quarters" + )); + } else { + f.append(`No Stewardess assigned, appoint one from your devoted slaves.`); + } + + f.append(App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.servantsQuarters, "Servants' Quarters")); + return f; +}; diff --git a/src/facilities/servantsQuarters/servantsQuartersFramework.js b/src/facilities/servantsQuarters/servantsQuartersFramework.js index e908720753a47c470b97dd722a3e1bee70473b33..48a10fbb637c1ea7cb5dd3ff5306cc5618fabbc0 100644 --- a/src/facilities/servantsQuarters/servantsQuartersFramework.js +++ b/src/facilities/servantsQuarters/servantsQuartersFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.servantsQuarters = { shouldTalk: true, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.ServantsQuartersServantJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/spa/AttendantSelect.js b/src/facilities/spa/AttendantSelect.js new file mode 100644 index 0000000000000000000000000000000000000000..c5cdd28a9d28036cd504ded8a0fb13773b700983 --- /dev/null +++ b/src/facilities/spa/AttendantSelect.js @@ -0,0 +1,17 @@ +App.Facilities.AttendantSelect = function() { + const f = document.createDocumentFragment(); + + if (S.Attendant) { + f.append(`${SlaveFullName(S.Attendant)} is working as your Attendant, pampering and counseling your slaves. `); + f.append(App.UI.DOM.link("Remove Attendant", () => { + removeJob(S.Attendant, Job.ATTENDANT); + }, + [], "Spa" + )); + } else { + f.append(`No Attendant assigned, appoint one from your devoted slaves.`); + } + + f.append(App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.spa, "Spa")); + return f; +}; diff --git a/src/facilities/spa/spaFramework.js b/src/facilities/spa/spaFramework.js index 02d9f7f0e8f410739a3cc5c44c033bd16a1d9ee0..95012872750b1a9f1bd59dcdcf13595504f43099 100644 --- a/src/facilities/spa/spaFramework.js +++ b/src/facilities/spa/spaFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.spa = { shouldTalk: false, shouldThink: true, requiredDevotion: 51 - } + }, + decorated: true }; App.Entity.Facilities.SpaAssigneeJob = class extends App.Entity.Facilities.FacilitySingleJob { diff --git a/src/facilities/surgery/remoteSurgery.js b/src/facilities/surgery/remoteSurgery.js index 55797694aa5aaace4d934702833de1406e2039bb..6a4616a33c77b4db4ea4c6a03653904fbca19887 100644 --- a/src/facilities/surgery/remoteSurgery.js +++ b/src/facilities/surgery/remoteSurgery.js @@ -3,7 +3,6 @@ App.UI.SlaveInteract.remoteSurgery = function(slave) { const el = new DocumentFragment(); const r = []; const {His} = getPronouns(slave); - App.Utils.setLocalPronouns(slave); updateHealth(slave); V.surgeryType = 0; diff --git a/src/futureSocieties/aztec/slaveSacrifice.tw b/src/futureSocieties/aztec/slaveSacrifice.tw deleted file mode 100644 index 5061bdeb6e7d90e069f2e664adaa76f5d5b34de5..0000000000000000000000000000000000000000 --- a/src/futureSocieties/aztec/slaveSacrifice.tw +++ /dev/null @@ -1,380 +0,0 @@ -:: Aztec Slave Sacrifice [nobr] - -<<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Main", $encyclopedia = "Aztec Revivalism">> -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run Enunciate(getSlave($AS))>> - -<<set _activeSlaveRepSacrifice = repGainSacrifice(getSlave($AS), $arcologies[0])>> - -<<if $sacrificeType == "penance">> - You inform <<= getSlave($AS).slaveName>> that $he's been chosen to take part in a ritual sacrifice to Xochiquetzal, the goddess of carnal love, excess, and sexual release. - <<if (getSlave($AS).devotion > 50)>> - <<if !canTalk(getSlave($AS))>> - $He looks excited at the prospect of suffering for the goddess. - <<elseif (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetish != "none")>> - $He looks excited. "<<Master>>! I'm honored to be cho<<s>>en! Thank you <<s>>o much!" - <<if (getSlave($AS).fetish == "masochist")>> - $He shudders with excitement. "I mean, I know my pain will help to feed the godde<<ss>> and I'm willing to <<s>>uffer plenty to plea<<s>>e her, but i<<s>> it really a <<s>>acrifi<<c>>e if I'm enjoying it?" - <<elseif (getSlave($AS).fetish == "cumslut")>> - $He hesitates, looking concerned. "Oh God<<s>>, the <<s>>e<<x>> clean<<s>>ing will be awful, but I'm willing to <<s>>acrifi<<c>>e all that pain for the godde<<ss>>." - <<elseif (getSlave($AS).fetish == "humiliation")>> - $He shudders with excitement. "I heard everyone can <<s>>ee me a<<s>> I <<s>>uffer. I hope the public penan<<c>>e will plea<<s>>e the godde<<ss>>." - <<elseif (getSlave($AS).fetish == "buttslut")>> - $He <<if canSee(getSlave($AS))>>looks sadly at the floor<<else>>tilts $his head downwards sadly<</if>>. "Oh God<<s>>, that mean<<s>> no butt <<s>>e<<x>> for me. I hope Xochiquetzal be plea<<s>>ed by all that <<s>>acrifi<<c>>e." - <</if>> - <<else>> - $He looks determined. "<<Master>>, I'll do my be<<s>>t. No other <<s>>lave will be cleaner for the godde<<ss>> than I. - <</if>> - <<elseif (getSlave($AS).devotion > 20) || ((getSlave($AS).devotion >= -20) && (getSlave($AS).trust < -20) && (getSlave($AS).trust >= -50))>> - <<if !canTalk(getSlave($AS))>> - $He looks cautious at the prospect of suffering for the goddess. - <<elseif (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetish != "none")>> - $He looks cautiously excited. "<<Master>>, - <<if (getSlave($AS).fetish == "submissive")>> - I'll follow your every word to be a good <<s>>acrifi<<c>>e for the godde<<ss>>. I won't even blink if I'm not in<<s>>tructed to. - <<elseif (getSlave($AS).fetish == "masochist")>> - <<s>>acrifi<<c>>e will be hard, right? Lot<<s>> of pain the whole week..." $he trails off. - <<elseif (getSlave($AS).fetish == "cumslut")>> - it'<<s>> going to be <<s>>o hard to not be able to drink cum the whole week!" An expression of sadness spreads across $his face. "But I'm willing to do it for the godde<<ss>>." - <<elseif (getSlave($AS).fetish == "humiliation")>> - it'<<s>> a public <<s>>acrifi<<c>>e, right? I hope they all <<s>>ee how much one mu<<s>>t <<s>>uffer to plea<<s>>e the godde<<ss>>." - <<elseif (getSlave($AS).fetish == "buttslut")>> - my poor a<<ss>>, <<s>>o neglected. I hope Xochiquetzal will be plea<<s>>ed with <<s>>uch a hard <<s>>acrifi<<c>>e." $He rubs $his butt in anticipation. - <<else>> - I will do my be<<s>>t to be a good <<s>>acrifi<<c>>e," $he says, trying to put on a brave front. Then, half to $himself, $he adds in a small voice, "I can do thi<<s>>." - <</if>> - <<elseif getSlave($AS).sexualFlaw != "none">> - "Ye<<s>>, <<Master>>," $he <<say>>s obediently. $He hesitates, looking concerned. - <<if (getSlave($AS).sexualFlaw == "hates oral")>> - "<<S>>o, no <<s>>ucking dick<<s>> for a week, right? It will be hard, but I'll do it to plea<<s>>e the godde<<ss>>." A coy little smile appears on $his face when $he thinks you aren't looking. - <<elseif (getSlave($AS).sexualFlaw == "hates anal")>> - "<<S>>o, no taking dick<<s>> up my a<<ss>> for a week, right? It will be hard, but I'll do it to plea<<s>>e the godde<<ss>>." A coy little smile appears on $his face when $he thinks you aren't looking. - <<elseif (getSlave($AS).sexualFlaw == "shamefast")>> - "That loin cloth <<s>>eem<<s>> <<s>>o <<s>>mall..." $His face turns red as $he stutters. - <<elseif (getSlave($AS).sexualFlaw == "repressed")>> - "<<S>>o, no <<s>>e<<x>> at all for a week, right? It will be hard, but I'll do it to plea<<s>>e the godde<<ss>>. A coy little smile appears on $his face when $he thinks you aren't looking. - <<else>> - $He tries to be brave. "<<Master>>, I will do my be<<s>>t to be a good <<s>>acrifi<<c>>e" Then, half to $himself, $he adds in a small voice, "I can do thi<<s>>..." - <</if>> - <<else>> - $He tries to be brave. "<<Master>>, I will do my be<<s>>t to be a good <<s>>acrifi<<c>>e." Then, half to $himself, $he adds in a small voice, "I can do thi<<s>>..." - <</if>> - <<elseif (getSlave($AS).devotion >= -50) && (getSlave($AS).trust < -20)>> - <<if !canTalk(getSlave($AS))>> - $He looks afraid at the prospect of suffering for the goddess. - <<elseif getSlave($AS).sexualFlaw != "none">> - $He seems afraid of what's to come and $his answer is barely more than a whisper, almost to $himself, "Ye<<s>> <<Master>>..." Finally $he gasps out, "God<<s>>, I'm going to <<s>>-<<s>>uffer <<s>>o much." - <<if (getSlave($AS).sexualFlaw == "hates oral") || (getSlave($AS).sexualFlaw == "hates anal") || (getSlave($AS).sexualFlaw == "hates penetration")>> - $He visibly considers disobedience but the prospect of not having <<if (getSlave($AS).sexualFlaw == "hates oral")>>a dick down $his throat<<elseif (getSlave($AS).sexualFlaw == "hates anal")>>$his butt filled<<elseif (getSlave($AS).sexualFlaw == "hates penetration")>>any hole filled with dick<</if>> for a hole week seems enough to go through any ordeal you order $him to do. Trembling, $he answers, "Ye<<s>> <<Master>>, I'll obey." - <<elseif (getSlave($AS).sexualFlaw == "shamefast")>> - $He bursts into tears. "I'm going to be practically naked where everyone can <<s>>ee me!" - <<elseif (getSlave($AS).sexualFlaw == "repressed")>> - A big smile appears on $his face. "I'm going to be clean<<s>>ed. I'll be cleaned for the godde<<ss>>..." - <</if>> - <<else>> - $He does $his best to control $himself and avoid punishment. "<<Master>>, I will do it. I'll do the peniten<<c>>e for the godde<<ss>>." $He holds $himself together until you dismiss $him; as $he turns to leave, the tears come fast, and $he almost runs into the door frame on $his way out<<if canSee(getSlave($AS))>>, blinded with weeping<</if>>. - <</if>> - <<else>> - <<if canWalk(getSlave($AS))>> - $He manages to run halfway to your desk before $he's <<if _S.Bodyguard>>clotheslined by _S.Bodyguard.slaveName<<elseif $HeadGirlID != 0>> restrained by _S.HeadGirl.slaveName<<else>>restrained by another, more obedient slave<</if>>. $He kicks and struggles as $he's removed from your office. By the end of the week, it won't matter; $he'll be so hungry and horny that resistance will be the last thing on $his mind. - <<elseif !canTalk(getSlave($AS))>> - A long line of slurs and names are screamed at you, none of them particularly pleasant. Your <<if $HeadGirlID != 0>>Head Girl _S.HeadGirl.slaveName <<else>>another, more obedient slave<</if>> removes $him as $he continues $his rant, spitting and resisting as much as $he can without limbs. By the end of the week, it won't matter; $he'll be so hungry and horny that resistance will be the last thing on $his mind. - <<else>> - $He proceeds to drop into a massive tantrum for the lack of better ways to express $himself. <<if $HeadGirlID != 0>>_S.HeadGirl.slaveName<<else>>Another, more obedient slave<</if>> removes $him as $he continues struggling, spitting and resisting as much as $he can. By the end of the week, it won't matter; $he'll be so hungry and horny that resistance will be the last thing on $his mind. - <</if>> - <</if>> - - <br> - <<setNonlocalPronouns $seeDicks>> - As tradition dictates, the purification of $his body will be used as penance to the goddess in an attempt to pay for the favors bestowed upon your arcology. First, one of your slaves is appointed to represent you as $his owner, who willingly gives the slave as sacrifice, and is put in charge of the slave's health while $he goes through the penance process. <<= getSlave($AS).slaveName>> is thoroughly bathed and $his whole body covered in blue paint, while $his mouth is covered in black paint, as payment for being a prostitute. /*Might need a clause here for other jobs besides "whore"*/ $He's taken to spend the night at the sexual servitude of another slave who will be sacrificed to Tezcatlipoca, god of the night sky. $He's <<if (getSlave($AS).devotion > 20)>>fucked all night long <<else>>raped over and over again throughout the night <</if>>; $his holes dedicated to the sexual satisfaction of the slave who soon will face a much darker fate than $him to please the gods. - <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>> - <<set _randomVag = random(1,2)>> - <<set _randomAnal = random(1,2)>> - <<set _randomOral = random(2,6)>> - <<set getSlave($AS).counter.vaginal += _randomVag, getSlave($AS).counter.anal += _randomAnal, getSlave($AS).counter.oral += _randomOral, $vaginalTotal += _randomVag, $analTotal += _randomAnal, $oralTotal += _randomOral>> - <<if getSlave($AS).vagina == 0 && getSlave($AS).anus == 0>> - $His sacrifice to the gods naturally meant giving up @@.lime;both of $his virginities.@@ - <<set getSlave($AS).vagina = 1, getSlave($AS).anus = 1>> - <</if>> - <<if canGetPregnant(getSlave($AS)) && getSlave($AS).eggType == "human">> - $His lover tried _hisU best to plant _hisU seed deep within $him. $He's likely pregnant after last night. - <<= knockMeUp(getSlave($AS), 70, 2, 0)>> - <</if>> - <<elseif canDoVaginal(getSlave($AS))>> - <<set _randomVag = random(1,3)>> - <<set _randomOral = random(2,3)>> - <<set getSlave($AS).counter.vaginal += _randomVag, getSlave($AS).counter.oral += _randomOral, $vaginalTotal += _randomVag, $oralTotal += _randomOral>> - <<if getSlave($AS).vagina == 0>> - $His sacrifice to the gods ended up including @@.lime;$his virginity.@@ - <<set getSlave($AS).vagina = 1>> - <</if>> - <<if canGetPregnant(getSlave($AS)) && getSlave($AS).eggType == "human">> - $His lover tried _hisU best to plant _hisU seed deep within $him. $He's likely pregnant after last night. - <<= knockMeUp(getSlave($AS), 70, 0, 0)>> - <</if>> - <<elseif canDoAnal(getSlave($AS))>> - <<set _randomAnal = random(1,3)>> - <<set _randomOral = random(2,3)>> - <<set getSlave($AS).counter.anal += _randomAnal, getSlave($AS).counter.oral += _randomOral, $analTotal += _randomAnal, $oralTotal += _randomOral>> - <<if getSlave($AS).anus == 0>> - $His sacrifice to the gods ended up including @@.lime;$his anal virginity.@@ - <<set getSlave($AS).anus = 1>> - <</if>> - <<if canGetPregnant(getSlave($AS)) && getSlave($AS).eggType == "human">> - $His lover tried _hisU best to plant _hisU seed deep within $him. $He's likely pregnant after last night. - <<= knockMeUp(getSlave($AS), 70, 1, 0)>> - <</if>> - <<else>> - <<set _randomOral = random(2,6)>> - <<set getSlave($AS).counter.oral += _randomOral, $oralTotal += _randomOral>> - By the following morning $he's sickened from the number of loads blown down $his throat. Luckily inducing vomiting will be enough to have $him ready for the next step. - <</if>> - - <br> - $He's prepared for $his public penance. First, $he is left to sweat for several hours on the temazcal to remove any impurity of the previous night before being bathed and painted once again. $He's specially dressed for the occasion - - <<if (getSlave($AS).sexualFlaw == "shamefast") || (getSlave($AS).sexualFlaw == "repressed")>> - a short red loincloth and a chastity belt designed to prevent any forbidden self-stimulation cover as little of $his lower body as possible. The setup is adorned with long, red, silky fringes that move as $he walks. $His chest is bare except for a pair of golden pasties over $his nipples joined by three blue chains on cascade. - <<else>> - a particularly enticing red loincloth covers $his lower regions while hiding the chastity belt that will thwart any forbidden self-stimulation. $His chest is nearly naked save for a large necklace adorned with feathers, gold and flowers. - <</if>> - Lastly, $his head is decorated with a huge crest of feathers in the colors of the goddess. - - <br> - - You lead the procession through the arcology's halls with <<= getSlave($AS).name>>, - <<if (getSlave($AS).devotion > 20)>> - proudly facing destiny, - <<else>> - restrained and crying while $he tries to resist, - <</if>> - followed by the sound of drums and flutes with $his caretaker bringing up the rear. Finally, you reach the center of your arcology's largest plaza where - <<if _activeSlaveRepSacrifice <= 0>> - you find nobody cares about $his penance. $He's presented to anyone that will listen - <<elseif _activeSlaveRepSacrifice < 10>> - a few spectators have assembled to watch $his internment. $He's presented to the onlookers - <<elseif _activeSlaveRepSacrifice < 100>> - a small crowd has assembled to watch $his internment. $He's presented to the crowd - <<else>> - a large crowd has assembled to eagerly watch $his internment. $He's presented to the excited crowd - <</if>> - as the sacrifice and is - <<if (getSlave($AS).devotion > 20)>> - helped - <<else>> - pushed - <</if>> - into a golden cage, just big enough for $him to fit. Once inside, a huge dose of aphrodisiacs are injected into $him and the door is locked. During $his week-long penance, $he will be kept on a strict regimen of aphrodisiacs to keep $him aroused but unable to cum, a special spiced tea diet to avoid dehydration, and a constant vigil, with only a few hours of sleep every night. - - <br> - <<if (getSlave($AS).devotion > 50)>> - As the week starts, $he is proud to fulfill $his duty. $He fights the urge to touch $himself, drinking only when $he needs to, and does $his best to keep $himself pure for the goddess. - - <<if (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetish != "none")>> - <<if (getSlave($AS).fetish == "submissive")>> - $He makes sure to be ready to take any instruction, and it's clear that $he enjoys it. As the week progresses, the signs of $his sexual frustration become more evident. However, $he seems to enjoy the struggle of resisting the urges, since $he is under strict orders not to touch $himself. Every time the slave in charge of feeding $him or renewing $his aphrodisiacs orders $him to come closer, $his body shudders with lust-fueled pleasure. $He moans lewdly whenever $he's ordered to wake up or to sleep. By the end of the week, $he fights to remain standing, almost delusional from lust and starvation. $He was told to remain <<if hasBothLegs(getSlave($AS))>>on $his feet<<else>>standing<</if>>, but, much to $his chagrin, exhaustion often brings $him to <<if hasBothLegs(getSlave($AS))>>$his knees<<else>>the floor<</if>>. - <<elseif (getSlave($AS).fetish == "masochist")>> - $He seems to enjoy the pain $his sacrifice gives $him. As the week progresses, it is fairly common to see $him moaning and showing other signs of pleasure that seem to be unrelated to the huge amount of aphrodisiacs in $his system. Before long, $he starts to faint more often as $he refuses to even drink the tea to keep $him hydrated and avoids any sleep whatsoever. The specially designated slave appointed to $his care needs to force $him to drink every few hours to avoid dying of dehydration. $He seems to enjoy the extra abuse and even fights to retain as little liquid inside $him as possible. By the end of the week, $he needs to be constantly reanimated to carry out $his penance, a process that $he also seems to enjoy. - <<elseif (getSlave($AS).fetish == "cumslut")>> - $He can be seen frequently crying and desperately fighting the excruciating need to touch $himself. As a result of the aphrodisiacs, the paint on $his <<if hasAnyLegs(getSlave($AS))>>inner thigh<<if hasBothLegs(getSlave($AS))>>s<</if>><<else>>crotch<</if>> is constantly wet and steadily drips onto the cage floor. As the week progresses, $his whining increase and $his body convulses harder and harder with lust. The loincloth $he's wearing is constantly wet, as <<if hasBothLegs(getSlave($AS))>>are $his legs<<else>>is most of $his lower body<</if>>. It is common to see $him begging strength from the goddess only to burst into tears when no relief comes to $him and crying $himself to sleep at night only to be awoken a few hours later. As a result of all $his crying and lubrication, $he needs to be hydrated more often. By the end of the week, $his body refuses to lose more liquid, a fact that doesn't stop $him from sobbing, immobile in $his dried arousal on the floor of the cage, interrupted only by the spasms of $his lust raked body and the slave posted to procure $him more tea to prevent $him from succumbing to dehydration. - <<elseif (getSlave($AS).fetish == "humiliation")>> - $He seems to enjoy all the attention $he receives as $he tries to fight the impulse to touch $himself. $He takes special care to show how degrading the whole process can be. It is common to see $him enjoying every reapplication of aphrodisiacs and when $he needs to be awoken. Often, $he refuses to drink the tea, hoping the time comes that $he will be forced to drink it. As the week progresses and the signs of discomfort become more obvious, $he rejoices in the attempts of the slave on duty to force $him to drink $his tea and the way $he's awakened after just a few hours of sleep. $His body shows clear signs of food, sleep and sexual deprivation that increases as the days go by; $he shows no shame with displaying $his lack of inner strength. By the end of the week, $he can't stand up and remains on the floor of the cage, enjoying the soak in $his own sexual fluids and saving what little strength $he has left to make $his waterings thoroughly humiliating. - <<elseif (getSlave($AS).fetish == "buttslut")>> - $He tries to keep $his butt away from the bars of the cage to avoid any possible stimulation of it. As the week progresses, it is common to see $him trying to remain immobile as $his body shakes and twitches with lust; the constant stimulation of the soft fabric over $his butt, every shift of $his weight and even the caress of the air threatening to drive $him into a frenzy. The lack of food, sexual release and sleep wears $his will down as $he's often ordered back <<if hasBothLegs(getSlave($AS))>>to $his feet<<else>>into a standing position<</if>> since $he insists on sitting down with the hope that $his butt numbs. By the end of the week, $he remains on the floor of the cage, sitting on $his side, as immobile as $he can, interrupted only by the occasional twitch and the need to drink or roll over. - <<elseif (getSlave($AS).fetish == "boobs")>> - $He tries to distract $himself from the constant stimulation the necklace forces onto $his sensitive <<if getSlave($AS).boobs >= 300>>breasts<<else>>chest<</if>>. $He can be seen constantly fighting the urge to tweak $his nipples every time the aphrodisiacs are injected into to $his body. As the week goes by, the lack of food and sleep seem to distract $him enough to stop $him from clenching the cage's bars in an attempt to avoid cumming from stimulation to $his breasts. $He needs to be constantly watched during $his sleep to make sure <<if hasAnyArms(getSlave($AS))>>$his <<if hasBothArms(getSlave($AS))>>hands don't<<else>>hand doesn't<</if>> slip under<<else>>$he doesn't toy with<</if>> $his necklace. By the end of the week, $he remains on the floor of $his cage, incapable of moving, from the lack of food, sleep, and sexual release. $His nipples are painfully erect from the aphrodisiacs in $his body. - <<else>> - $He tries to fulfill $his sacrifice as best $he can by trying to keep $himself pure for the goddess. $He submits to every instruction to the best of $his ability. $He can be seen constantly fighting the urge to touch $himself, shaking and moaning at the overwhelming lust caused by the aphrodisiacs. $He drinks only when told, and kindly refuses it when $he thinks $he can hold longer without it. As the week progresses, $his body shakes and twitches more often as $he struggles to stave off the compounding effects of the aphrodisiacs. $He tries to minimize any extra stimulation from the soft fabric or the necklace on $his chest by staying still, but sometimes $he bursts into tears when $his strength wavers. The only interactions $he faces are the reminders to stay hydrated, the application of more aphrodisiacs and $his sleep deprivation. By the end of the week, $he can hardly stand and often remains on the floor of the cage, soaked in $his own desperation. - <</if>> - <<else>> - $He tries to fulfill $his sacrifice as best $he can by trying to keep $himself pure for the goddess. $He submits to every instruction to the best of $his ability. $He can be seen constantly fighting the urge to touch $himself, shaking and moaning at the overwhelming lust caused by the aphrodisiacs. $He drinks only when told, and kindly refuses it when $he thinks $he can hold longer without it. As the week progresses, $his body shakes and twitches more often as $he struggles to stave off the compounding effects of the aphrodisiacs. $He tries to minimize any extra stimulation from the soft fabric or the necklace on $his chest by staying still, but sometimes $he bursts into tears when $his strength wavers. The only interactions $he faces are the reminders to stay hydrated, the application of more aphrodisiacs and $his sleep deprivation. By the end of the week, $he can hardly stand and often remains on the floor of the cage, soaked in $his own desperation. - <</if>> - - <<elseif (getSlave($AS).devotion > 20) || ((getSlave($AS).devotion >= -20) && (getSlave($AS).trust < -20) && (getSlave($AS).trust >= -50))>> - As week starts, $he tries to fulfill $his duty. $He fights the urge to touch $himself, drinks only when $he needs to, and tries to keep $himself pure for the goddess. - - <<if (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetish != "none")>> - <<if (getSlave($AS).fetish == "submissive")>> - $He makes sure is ready to take any order $he might be given, and it's evident that $he enjoys it every time $he is ordered to do something. As the week progresses $he finds $himself close to the limits of $his submission. As much as $he tries to <<if hasAnyArms(getSlave($AS))>>keep $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> to $himself<<else>>stay calm<</if>>, $his sexual frustration finally wins the battle, and $he desperately tries to masturbate, only for $him to discover how effective the chastity belt really is. $He cries in frustration and shame for being unable to fulfill $his orders. The signs of sexual frustration are more evident on $his body as time goes by and it is common to see $him repeating "<<Master>> told me 'no touching your<<s>>elf i<<s>> allowed'" over and over again as $he shifts $his weight from <<if hasBothLegs(getSlave($AS))>>foot to foot<<else>>side to side<</if>>. The only thing that seems to shut $him up is when $he is ordered to come closer to drink, renew $his dose of aphrodisiacs or when ordered to be prepared to sleep. As soon as $he <<if canHear(getSlave($AS))>>hears<<elseif canSee(getSlave($AS))>>sees<<else>>recognizes<</if>> the order, $his body twitches and a soft moan can be heard. By the end of the week $he fights to remain standing up almost delusional as $he was told to remain <<if hasBothLegs(getSlave($AS))>>on $his feet<<else>>standing<</if>> but the signs of exhaustion often bring $him to <<if hasBothLegs(getSlave($AS))>>$his knees<<else>>the floor<</if>>. Sometimes $he tries to touch $himself down there only to burst into tears when $he is unable to do so. - <<elseif (getSlave($AS).fetish == "masochist")>> - $He seems to enjoy the pain $his sacrifice submits $him to. Through the week is fairly common to see $his moaning and showing other signs of pleasure that seem to be fairly unrelated to the huge amounts of aphrodisiacs that run through $him. Every time the shot it is injected to $his body $he pants and thrusts, enjoying the pain of $his swollen <<if getSlave($AS).dick != 0>>dick<<elseif getSlave($AS).vagina > -1>>pussy lips<</if>> throbbing inside $his chastity belt. As the week progresses, $he starts to frequently faint, as $he refuses to even drink the tea that keeps $him hydrated or sleep whatsoever, instead choosing to focus on the pain of being constantly aroused. As a precaution, alternative methods to keep $him hydrated are put in place to avoid the pleasure of being forced to drink every few hours as $he was caught several times trying to cum from it. By the end of the week $he needs to be constantly reanimated to fulfill $his vigil, moaning as $he comes to conscience as the exhaustion and pain on $his body washes over to $him. - <<elseif (getSlave($AS).fetish == "cumslut")>> /*Will need to be completely rewritten*/ - At first, $he seems resigned to not cum at all during $his penance. Soon $his resolution seems to vanish and $he can be seen constantly crying, trying to fight the excruciating need to touch $himself yet failing by trying to masturbate through the chastity belt. As a result of the aphrodisiacs in $his body the paint on the inner part of $his <<if hasBothLegs(getSlave($AS))>>legs<<else>>hips<</if>> seems constantly wet and dripping into the cage which $he seems to enjoy. As $his whining and tears increases so do the spasms, a direct result of $his need to cum. The loincloth $he is wearing has to be constantly changed and $his <<if hasAnyLegs(getSlave($AS))>>leg<<if hasBothLegs(getSlave($AS))>>s<</if>><<else>>lower body<</if>> constantly cleaned when it becomes apparent they are wet to avoid any evidence of pleasure. $He tries to make it more difficult as now it is the only thing $he has to fantasize on cumming. At the end of the week is often common to see $him beg to be touched by anyone who is close enough to hear $him and bursts into tears when $he is blatantly ignored. As a result of all this crying, the lack of food and sleep $he needs to be hydrated more often also the dose of aphrodisiacs is changed to be less potent but be injected more often to avoid the danger that $he might cum from it. $His body refuses to lose anymore more liquids, a fact that doesn't stop $him from sobbing and begging to be touched as soon as $he finds the strength to it while $he remains almost immobile on the bottom of the cage, interrupted by the spasms of $his body as a result of being constantly aroused for a week. - <<elseif (getSlave($AS).fetish == "humiliation")>> - $He seems to enjoy all the attention $he receives every time $he tries to fight the impulse to touch $himself as $his body shows clear signs of arousal and takes special care in showing just how degrading the whole process can be. It's common to see $him enjoying every time the dose of aphrodisiacs needs to be injected again or when $he needs to be awaken. Often, $he refuses to drink the tea provided, hoping that when the moment comes $he will be forced to drink it — preferably in a very humiliating way. As the week progresses and $his need to cum increases $he focuses on the humiliation $he gets every time the aphrodisiacs get the best of $him and tries to find release and fails as the citizens passing by throw insults and disgusted looks on $his direction for failing in trying to please the goddess. As a result, $he is immobilized and blindfolded in an attempt to reduce external stimulation. By the end of the week $he cannot stand up and remains on the bottom of the cage, saving $his strength to procure making the procedures as humiliating as possible with the little strength $he has saved. - <<elseif (getSlave($AS).fetish == "buttslut")>> - At first, is common to see $him trying to resist the heavy dose of aphrodisiacs in $his body as $he cannot find a way to release. As the week progresses, $he is constantly crying and whining as $he is unable find a way to stimulate $his ass when the aphrodisiacs become too much for $him. As the week progresses and $his strength lingers $he tries to find ways to increase stimulation on $his ass. $He tries to keep $his butt as close as possible to the cage's bars, rubbing on them to increase any stimulation on $his buttocks or focus on the feel of the sort fabric that covers $him as it moves when $he readjust $himself. $He seems particularly angry every time $his attempts are put to an end just to burst into tears ashamed of $his actions. By the end of the week $he remains immobile on the center of $his cage and the fabric readjusted to procure as little extra stimulation as possible. $He insists on sitting down and rubbing $his behind against the floor and is forced to stand up. By the end of the week the lack of food, sexual release and sleep seems to be wearing $his will off as $he takes longer being able to stand up every time and $he remains on the bottom of the cage forced to lay on $his chest as immobile as $he can, interrupted only by the occasional twitch and the need to drink. - <<elseif (getSlave($AS).fetish == "boobs")>> - At first, $he tries to distract $himself from the constant stimulation the necklace over $his chest seems to be producing. $He can be seen constantly fighting the urge to touch $his breasts every time the aphrodisiacs are injected into to $his body. As the week progresses $his resolutions seem to vanish and $he needs to be stopped from touching $his breast on several occasions or is constantly caught and forcefully stopped trying to moving $his chest to make the necklace rub $his breasts. Later on, the necklace is replaced by a breastplate equally colorful and adorned but extremely tight making $his breast flatter and unable to move. $He soon realizes not only that $he can no longer stimulate $his breast with it on but that now $his breasts are completely hidden from view. As a result, $he can be seen constantly crying and trying to rip the breastplate apart to no avail. $He is constantly awake during the times $he is supposed to be sleeping as $he tries to touch $his breast but can't seem to find them hidden under the breastplate. At the end of the week $he remains on the bottom of $his cage unable to move as the lack of food, sleep and sexual release takes a toll on $his body, the breastplate is without feathers or other delicate adornments but still in a perfect position. - <<else>> - At first, $he tries to fulfill $his sacrifice the best $he can by trying to maintain $himself pure for the goddess. $He submits to every instruction and tries to hold off as much as $his body allows $him, drinking as little as $he can and sleeping only when $he is told. Soon the aphrodisiacs make $his resolutions useless as $he tries to touch $himself to find release. It doesn't take $him long to discover how efficient the chastity belt is. $He cries and tries as much as $he can but $he is unable to experience any kind of pleasure. As time goes by $he seems to shift $his efforts from fighting to removing the chastity belt from $himself with no avail. $His body twitches and shakes frequently as the aphrodisiacs hit $him harder every time $his dose is renewed. Later on, $he tries to please any part of $his body which $he is able to touch and needs to be restrained. Hunger and sleep deprivation take a toll on $his body also $he tries to drink as much as possible to fool the hunger $he feels. The tea is rationed to be given only when required and $his sleep is carefully monitored. By the end of the week $he remains on the bottom of $his cage trying to save what little energy $he has left, only to be interrupted as $his body spasms brought about by the aphrodisiacs in $his body followed by a soft moan. - <</if>> - - <<elseif getSlave($AS).sexualFlaw != "none">> - <<if (getSlave($AS).sexualFlaw == "hates oral")>> - $He focuses on fulfilling $his duty to keeping $himself pure for the goddess while fighting the urge to touch $himself. $He seems to think the worst part of $his penance is over as $he is no longer going to be raped in the mouth like $he was last night. Soon $he discovers that is far the truth when $his first dose of the tea doesn't come in a tea cup. As a means of keeping $his penance in accordance to the suffering the goddess demands the tea will be administered through a similar device used in dairies. A feeding phallus is quickly installed into a side of the cage. If $he wants to avoid dehydration $he will have to suck it off and only after $he does it right is the tea provided. When $he realizes what is in store for $him, $he begins to cry. $He tries to drink only when strictly necessary. However, as the week progresses, $he starts to faint more frequently as $his body receives only the minimum amount of liquids necessary. As a result, $he is restrained and the feeding phalli is pressed into $his mouth and down $his throat to facefuck $him. $He gags and struggles, tears running down $his face as $he tries to figure out how to breathe while being facefucked. Only after $he manages to control $himself is the transparent reservoir of tea injected. $He swallows desperately. As per your instructions $his feedings are synced with $his dose of aphrodisiacs which confuses $him to no end and adds to $his penance. This procedure occurs several times a day. By the end of the week $he can hardly stand up as the lack of food and sleep keeps $him weak. $He remains on the bottom of the cage only interrupted by $his feedings and the body spasms $he suffers as a result of the constant arousal. - <<elseif (getSlave($AS).sexualFlaw == "shamefast")>> - At first, $he tries to fulfill $his duty to keeping $himself pure to the goddess, distracting $himself by trying to cover however $he can $his almost naked body. As a way to keep $his penance according to the suffering the goddess demands a big screen set next to $his cage. After a few hours, the screen turns on and a live image of $him on the cage appears. The screen then shifts to a low shot of $his tight dripping wet product of $his arousal, showing different stats related to it. After a few minutes, the screens changes to previously recorded footage of $his naked body glistening while laying comfortably on the temazcal. After a minute, it shifts again to a close shot of $his ass being carefully painted with blue, the camera following the movement of the brush as it moves over $his ass cheek and shifts again to a very close shot of $him being fucked the night before. The video changes over and over again showing scenes of previously recorded footage of $his preparation for $his penance, every one carefully picked to give a good look of $his body or revealing live shots of $his body picked to show where $his sexual arousal is more evident. The first time $he sees them $he burst into tears, begging the screens to be turned off just to see $his image begging and crying a few hours later. As the week goes new clips are added showing the best scenes the camera was able to capture while on the cage. Due to $his resistance to show $his body for the cameras and the citizens passing by $he is immobilized to be kept standing, $his body conveniently positioned to get the best shots. $He tries to ignore the whole situation trying to focus on resisting the signs of $his hunger, exhaustion and arousal $he constantly feels. By the end of the week as $he remains sitting immobilize on a stool to procure a good shot a small screen is set in front of $him, the image divided in two, one half showing what the big screen projects and the other the audience and $his reactions. - <<elseif (getSlave($AS).sexualFlaw == "repressed")>> - Although $he thinks $his clothes are degrading, $he seems happy to fulfill $his duty keeping $himself pure to the goddess and fighting the urge to touch $himself. At first, $he seems confident $he can manage the heavy dose of aphrodisiacs that run through $his body and tries to give no indication of the constant arousal $he suffers. An occasional shake or moan escapes $his lips for what $he seems to be deeply ashamed. As the week goes by and $his resistance reduces $his body betrays $him every time more often. $He shakes, moans and shivers with the littlest provocation, which horrify $him to no end. Little does $he know that $his dose of aphrodisiacs is being increased every time $he is injected and that they are more effective now that the lack of sleep takes a toll on $his body. $He hates $himself for being unable to control the shameful things $his body demands and burst into tears when $his pelvis thrusts the minute the fringes are moved by the wind and caresses $his body or the necklace rubs on $his nipples. By the end of the week $he cannot handle it and tries to touch $himself when $he thinks no one is watching $him only to be caught right after. The shame is so big $he breaks out on tears. $He spends the rest of $his time left in penance on the bottom of the cage sobbing as $his body keeps as much of the energy it can only interrupted by the moans $he can no longer control and the shivers to run through $his body when the aphrodisiacs overwhelmed $him. - <<elseif (getSlave($AS).sexualFlaw == "attention whore")>> - $He seems to enjoy all the attention $he receives every time $he tries to fight the impulse to touch $himself as $his body shows clear signs of arousal and takes special care in showing $his body to the audience. $He rejoices with the reactions of the citizens as they gasp and point while $he shakes and moans. The first time the tea is offered to $him $he refuses it hoping to get a reaction of $his crowd. As a way to keep $his penance according to the suffering the goddess demands after the first night is over $he is informed that due to $his good behavior $he has been granted the chance to finish $his penance in private. $He cries and begs to be left where $he is. $He is blindfolded and taken to a minuscule room nearby while cries and begs. Once inside $he is left to $himself, $his only contact with another person is the slave appointed to $his care who enters to administer the aphrodisiacs when required, when $his ration of tea is left on the room or when $he falls sleep and is required to be awake. Little does $he know the room is filled with hidden cameras which are connected to a big screen installed where $his cage was as the penance must be public. As the week goes by $he is left to deal with the hunger, the lack of sleep and the constant need to release. By the end of the week $he cannot stand up and remains on the bottom of the room, saving $his strength and sobbing. - <<elseif (getSlave($AS).sexualFlaw == "self hating")>> - As week starts $he tries to fulfill $his duty, fighting the urge to touch $himself and drinking just when $he needs to, hoping that by following the rules the penance of such unworthy slave will be enough to please the goddess. As the week progresses $his resolution reduces. $He soon discovers how efficient a chastity belt could be when, once completely overpowered by $his need of release $he tries to touch $himself, fearing the wrath of the goddess for $his lack of strength. $His body shakes and twitches every time more often as the aphrodisiacs run through $his body, blaming $himself for not being able to keep control. $His pelvis thrusts every time the airs provides extra stimulation product the sexual frustration and tries to stop it by banging $his head against the cage. $He soon needs to be immobilized to avoid damage. As $he lays on the cage $he blames $himself for $his inability to fulfill $his task. The lack of food has a toll on $him too, as $he often refuses to drink thinking the dehydration is well deserved. As a result of this, it is forced to drink several times a day which seems to infuriate $him. By the end of the week $he can hardly stand up as the lack of food and sleep keeps $him weak. $He remains on the bottom of the cage being fed by another slave when it is clear $he that needs more liquid in $his body and $his hours of sleep are over. - <<else>> - At first, $he tries to fulfill $his sacrifice the best $he can, trying to maintain $himself pure for the goddess. $He submits to every instruction trying to hold as much as $his body allows $him, drinking as little as $he can and sleeping only when $he is told. Soon the aphrodisiacs make $his resolutions dilute as $he tries to touch $himself to find release. It does not take $him long to prove how efficient $his chastity belt is. $He cries and tries as much as $he can but $he is unable to cause any kind of pleasure. As time goes by $he seems to shift $his efforts on fighting to remove the chastity belt from $himself with no avail. $His body twitches and shakes every time more often as the aphrodisiacs hit $him harder every time $his dose is renewed. Later on, $he tries to please any part of $his body which is free to touch and needs to be restrained. Hunger and deprivation of sleep take a toll on $his body too and tries to drink as much as possible to fool the hunger $he feels. The tea is rationed to be given only when need it and the sleep carefully monitored. By the end of the week $he remains on the bottom of $his cage trying to the little energy $he has, only interrupted by the body spasms caused by the aphrodisiacs in $his body followed by a soft moan. - <</if>> - <<else>> - At first, $he tries to fulfill $his sacrifice the best $he can, trying to keep $himself pure for the goddess. $He submits to every instruction trying to hold as much as $his body allows $him, drinking as little as $he can and sleeping only when $he is told. Soon the aphrodisiacs make $his resolutions dilute as $he tries to touch $himself to find release. It does not take $him long to prove just how effective $his chastity belt is. $He cries and tries as much as $he can but $he is unable to cause any kind of pleasure. As time goes by $he seems to shift $his efforts on fighting to remove the chastity belt to no avail. $His body twitches and shakes more and more often as the aphrodisiacs hit $him harder each time $his dose is renewed. Later on, $he tries to please any part of $his body that $he is able to, and so needs to be restrained. Hunger and sleep deprivation take a toll on $his body, and $he tries to drink as much as possible to fool the hunger. The tea is rationed to be given only when need it and the sleep carefully monitored. By the end of the week $he remains on the bottom of $his cage trying to conserve the little energy $he has, interrupted only by the spasms caused by the aphrodisiacs in $his body, followed by a soft moan. - <</if>> - - <<elseif (getSlave($AS).trust < -20)>> - <<if (getSlave($AS).sexualFlaw == "hates oral")>> - $He immediately focuses on $his need of release, since $he thinks the worst part of $his penance is over as $his mouth is no longer going to be raped like it was last night. Soon $he discovers that this is far from the truth when it is time for $his first dose of the tea. As a means to keep $his penance according to the suffering the goddess demands, the tea it to be administered through a similar device as is used in dairies. A feeding phallus is installed on a side of the cage, and if $he wants to avoid dehydration, $he will have to suck it off. When $he realizes what lies in store for $him $he begins to cry and refuses to drink at all. As the week progresses $he begins to faint more and more often as $he vehemently refuses to work for $his drink. As a result, $he is restrained and the feeding phallus is shoved into $his mouth and down $his throat. $He gags and struggles, tears running down $his face as $he tries and fails to scream. After several minutes, $he stops panicking and finally starts to inhale and exhale regularly. Only after this the transparent reservoir of tea is injected. $He chokes on it but swallows desperately. As per your instructions $his feedings are synched with $his dose of aphrodisiacs which confuses $him to no end and adds to $his penance. The procedure goes on during the rest of the week several times a day. By the end of the week $he can hardly stand up as the lack of food and sleep keeps $him weak. $He remains on the bottom of the cage, only interrupted by $his feedings and the spasms $he suffers as a result of the constant arousal. - <<elseif (getSlave($AS).sexualFlaw == "shamefast")>> - At first, $he tries to relieve $himself while $he tries to hide $his body. As a way to keep $his penance according to the suffering the goddess demands a big screen is set next to $his cage. After a few hours, the screen turns on and a live image of $him on the cage appears. The screen then shifts to a low shot of $his tight pussy dripping with the wet product of $his arousal, showing different stats related to it. After a few minutes, the screens changes to previously recorded footage of $his naked body glistening while laying comfortably on the temazcal. After a minute, it shifts again to a close-up shot of $his ass being carefully painted with blue, the camera following the movement of the brush as it moves over $his ass cheek then shifts again to a very close shot of $him being fucked the night before. The video changes over and over again showing scenes of previously recorded footage preparation for $his penance, every one carefully picked to give a good view of $his body or revealing live shots of $his body picked to show where $his sexual arousal is more evident. The first time $he sees them $he burst into tears. As the week goes new clips are added showing the best scenes of $him that the camera was able to capture while the aphrodisiacs forced $him to masturbate without success. Due $his resistance to show $his body for the cameras and the citizens passing by, $he is immobilized into standing, $his body conveniently positioned to get the best shots. $He tries to ignore the whole situation by trying to focus on ignoring the screen. As a result, a small screen is set in front of $him, the image divided in two, one half showing the big screen's projection and the other reactions of all parties. By the end of the week $he remains sitting immobilized on a stool to produce a good shivering shot. - <<elseif (getSlave($AS).sexualFlaw == "repressed")>> - Although $he thinks $his clothes are degrading, $he seems content to fulfill $his duty to keeping $himself pure to the goddess and fights the urge to touch $himself. At first, $he manages to control the heavy dose of aphrodisiacs that run through $his body and tries to give no indication of the constant arousal $he suffers. An occasional shake or moan escapes $his lips for which $he seems to be deeply ashamed. As the week goes by and $his resistance reduces $his body does betray $him most of the time. $He shakes, moans and shivers at the littlest provocation, which horrifies $him to no end. Little does $he know that $his dosage of aphrodisiacs has being increased every time $he is injected and are more effective now that the lack of sleep takes a toll on $his body. $He hates $himself for being unable to control the shameful things $his body demands and bursts into tears when $his pelvis thrusts the minute the fringes are moved by the wind and caresses $his body or the necklace rubs on $his nipples. By the end of the week $he cannot handle it and tries to touch $himself when the arousal becomes too much, which is often. $He seems ashamed of $his actions and often $he breaks out in tears as $he tries to masturbate. $He remains $his time left on penance in the bottom of the cage sobbing as $his body keeps as much of the energy it can only interrupted by the moans $he can no longer control and the shivers to run through $his body when the aphrodisiacs overwhelmed $him. - <<elseif (getSlave($AS).sexualFlaw == "attention whore")>> - $He seems to enjoy all the attention $he receives every time $he tries to find release as the citizens passing by scream at $him for $his lack of faith and takes special care in showing $his body to the audience. $He rejoices with the reactions of the citizens as they gasp and point while $he shakes and moans. The first time the tea is offered to $him $he refuses it hoping to get a reaction out of the crowd. As a way to keep $his penance in accordance to the suffering the goddess demands, after the first night is over $he is informed that due to $his good behavior $he has been granted the chance to finish $his penance in private. $He curses and swears, fighting with all of $his strength to be left where $he is. $He is taken out by forced and pinned to the floor to be immobilized. $He is blindfolded and taken to a minuscule room nearby while $he cries and tries to resist. Once inside $he is left to $himself, $his only contact with another person is the slave appointed to $his care who enters to administer the aphrodisiacs when required, when $his ration of tea is left on the room or when $he falls sleep and is required to be awake. Little does $he know the room is filled with hidden cameras which are connected to a big screen installed where $his cage was as the penance must be public. As the week goes by $he is left to deal with the hunger, the lack of sleep and the constant need for release which $he can no longer control. By the end of the week $he cannot stand up and remains on the bottom of the room, saving $his strength and sobbing. - <<elseif (getSlave($AS).sexualFlaw == "self hating")>> - As week starts $he tries to fulfill $his duty, fighting the urge to touch $himself and drinking just when $he needs to, hoping that by following the rules the penance of such an unworthy slave will be enough to please the goddess. As the week progresses $his resolution reduces. $He soon discovers how efficient a chastity belt could be when, once completely overpowered by $his need of release $he tried to touch $himself fearing the wrath of the goddess for $his lack of strength. $His body shakes and twitches more frequently as the aphrodisiacs run through $his body. $He blames $himself for not being able to keep $himself in control. $His pelvis thrusts every time the airs provides extra stimulation that produces sexual frustration and tries to stop it by banging $his head against the cage's bars. $He soon needs to be immobilized to avoid damage. As $he lies down on the cage's floor $he blames $himself and hating $his inability to fulfill $his task. The lack of food has taken a toll on $him too as $he often refuses to drink thinking the dehydration is well deserved. As a result, $he is forced to drink several times a day which seems to infuriate $him. By the end of the week $he can hardly stand up as the lack of food and sleep keeps $him weak. $He remains on the bottom of the cage fed by another slave when it is clear that $he needs more liquids in $his body and $his hours of sleep are over. - <<else>> - As $he starts to feel the effect of the aphrodisiacs on $his body a soft moan leaves $his mouth. Soon $his <<if hasBothLegs(getSlave($AS))>>legs<<elseif !hasAnyLegs(getSlave($AS))>>stumps<<else>>leg and stump<</if>> are shaking and $his body is sweating. $He tries to reach down there to relieve $himself but $he cannot do so. $He tries to find a way to reach <<if getSlave($AS).dick != 0>>$his dick or $his asshole<<else>>any hole<</if>> only to discover how efficient a chastity belt could be. $He tries to reach harder, desperately trying to find any kind of release but $he is unable. Soon all of $his efforts seem focus on removing the chastity belt to no avail. After a few hours, $he has finally given up and remains holding the bars of $his cage, crying in despair, thrusting over and over again while desperately moaning. $He begs for release to anyone who passes by and bursts into tears when $he is blatantly ignored. $He refuses to drink as $his need to cum is stronger. As the week goes by $his hunger increases and tries to drink as much of the tea $he is provided to try to fool $his stomach. As a result of this, the tea is only given to $him when it is strictly necessary which seems to infuriate $him. By the end of the week $he can hardly stand up as the lack of food and sleep keeps $him weak. $He remains on the bottom of the cage fed by another slave when it is clear that $he needs more liquids in $his body and $his hours of sleep are over. - <</if>> - <</if>> - - Once the time for penance is over, $he is carried out of the cage, as $he is too weak to support $his own weight. After a short ceremony, $he is taken back to the penthouse to rest. - <<if getSlave($AS).lactation > 1>> - $His breasts are grotesquely bloated, super sensitive and leaking milk from a week of neglected hyper-lactation. - <<set getSlave($AS).boobsMilk += 50*getSlave($AS).lactationAdaptation>> - <<set getSlave($AS).boobs += getSlave($AS).boobsMilk>> - <<elseif getSlave($AS).lactation > 0>> - $His breasts are hugely swollen from a week of pent up lactation. - <<set getSlave($AS).boobsMilk += 10*getSlave($AS).lactationAdaptation>> - <<set getSlave($AS).boobs += getSlave($AS).boobsMilk>> - <</if>> - <<run healthDamage(getSlave($AS), 20)>> - The penance put $his body through great stress @@.health.dec;which impacted $his health.@@ - <<set getSlave($AS).addict = 5>> - <<set getSlave($AS).clothes = "no clothing">> - - <<if (getSlave($AS).devotion > 50)>> - <<if (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetish != "none")>> - <<if fetishChangeChance(getSlave($AS)) > random(0,100)>> - <<set getSlave($AS).fetishStrength = 10, getSlave($AS).fetishKnown = 1, getSlave($AS).fetish = "masochist">> - <<set getSlave($AS).devotion += 4, getSlave($AS).trust += 4>> - $His successful penance made $him @@.gold;trust@@ and @@.hotpink;love@@ you more as $he has proved both to you and the goddess how good of a slave $he is. - <<elseif (getSlave($AS).fetish == "masochist")>> - <<set getSlave($AS).devotion += 6, getSlave($AS).trust += 6>> - The constant pain you submitted $him to during $his penance made $him @@.gold;trust@@ and @@.hotpink;love@@ you more. - <<set getSlave($AS).fetishStrength += 4>> - <<elseif (getSlave($AS).fetish == "cumslut")>> - <<set getSlave($AS).fetishStrength -= 2>> - <<elseif (getSlave($AS).fetish == "humiliation")>> - <<set getSlave($AS).devotion += 6, getSlave($AS).trust += 6>> - The constant humiliation during $his penance made $him @@.gold;trust@@ and @@.hotpink;love@@ you more as $he has proved both to you and the goddess how good of a slave $he is. - <<set getSlave($AS).fetishStrength += 3>> - <<elseif (getSlave($AS).fetish == "buttslut")>> - <<set getSlave($AS).fetishStrength -= 2>> - <<elseif (getSlave($AS).fetish == "boobs")>> - <<set getSlave($AS).fetishStrength -= 2>> - <</if>> - <<else>> - <<set getSlave($AS).devotion += 5, getSlave($AS).trust += 5>> - $He now understands the importance of $his role as a pennant slave, $his commitment to you and the goddess makes $him @@.gold;trust@@ and @@.hotpink;love@@ you more. - <</if>> - <<elseif (getSlave($AS).devotion > 20) || ((getSlave($AS).devotion >= -20) && (getSlave($AS).trust < -20) && (getSlave($AS).trust >= -50))>> - <<if (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetish != "none")>> - <<if fetishChangeChance(getSlave($AS)) > random(0,100)>> - <<set getSlave($AS).fetishKnown = 1, getSlave($AS).fetish = "masochist">> - <</if>> - <<if (getSlave($AS).fetish == "submissive")>> - <<set getSlave($AS).devotion += 3, getSlave($AS).trust += 3>> - The constant submission $he was subjected under your orders made $him @@.gold;trust@@ and @@.hotpink;love you more.@@ - <<set getSlave($AS).fetishStrength += 6>> - <<elseif (getSlave($AS).fetish == "masochist")>> - <<set getSlave($AS).devotion += 3, getSlave($AS).trust += 3>> - The constant abuse $he was subjected under your orders made $him @@.gold;trust@@ and @@.hotpink;love you more.@@ - <<elseif (getSlave($AS).fetish == "cumslut")>> - <<set getSlave($AS).fetishStrength -= 2>> - <<elseif (getSlave($AS).fetish == "humiliation")>> - <<set getSlave($AS).devotion += 3, getSlave($AS).trust += 3>> - The constant humiliation $he was subjected under your orders made $him @@.gold;trust@@ and @@.hotpink;love you more.@@ - <<set getSlave($AS).fetishStrength += 6>> - <<elseif (getSlave($AS).fetish == "buttslut")>> - <<set getSlave($AS).fetishStrength -= 2>> - <<elseif (getSlave($AS).fetish == "boobs")>> - <<set getSlave($AS).fetishStrength -= 2>> - <</if>> - <<else>> - $He now understands the importance of $his role as a pennant slave, $his commitment to you and the goddess. $He neither trusts nor loves you more any more or less. - <</if>> - <<if (getSlave($AS).sexualFlaw == "hates oral")>> - <<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 5>> - The constant abuse to $his mouth for $his feedings and the pain you subject $him to makes $him @@.mediumorchid;trust you less@@ and @@.hotpink;hate you more.@@ - <<set getSlave($AS).fetishStrength -= 5>> - <<elseif (getSlave($AS).sexualFlaw == "hates anal")>> - <<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 5>> - $His constant need of release without the chance to stimulate $his ass and the pain you subject $him to made $him @@.mediumorchid;trust you less@@ and @@.hotpink;hate you more.@@ - <<set getSlave($AS).fetishStrength -= 2>> - <<elseif (getSlave($AS).sexualFlaw == "shamefast")>> - <<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 5>> - The constant exposure of $his naked body through the bars to anyone willing to see $him and the pain you subjected $him to made $him @@.mediumorchid;trust you less@@ and @@.hotpink;hate you more.@@ - <<set getSlave($AS).fetishStrength -= 4>> - <<elseif (getSlave($AS).sexualFlaw == "self hating")>> - <<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 5>> - The constant deprivation of food, sleep and sexual release made $him hate $himself more. As a result $he @@.mediumorchid;trusts you less@@ and @@.hotpink;hates you more.@@ - <<set getSlave($AS).fetishStrength += 7>> - <<elseif (getSlave($AS).sexualFlaw == "repressed")>> - <<set getSlave($AS).fetishStrength -= 2>> - The constant shame $he was subjected in such a public way made $him @@.mediumorchid;trust you less@@ and @@.hotpink;hate you more.@@ - <<else>> - <<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 5>> - The lack of food, sleep and the constant arousal with the chastity belt made $him @@.mediumorchid;trust you less@@ and @@.hotpink;hate you more.@@ - <</if>> - <<elseif (getSlave($AS).trust < -20)>> - <<if (getSlave($AS).fetish != "none")>> - <<if fetishChangeChance(getSlave($AS)) > random(0,100)>> - <<set getSlave($AS).fetishStrength = 10, getSlave($AS).fetishKnown = 1, getSlave($AS).fetish = "masochist">> - <</if>> - <</if>> - <</if>> - <<if (getSlave($AS).sexualFlaw == "hates oral")>> - <<set getSlave($AS).devotion -= 7, getSlave($AS).trust -= 7>> - The constant abuse of $his mouth for feedings and the pain you subjected $him to made $him @@.mediumorchid;trust you less@@ and @@.hotpink;hate you more.@@ - <<set getSlave($AS).fetishStrength -= 6>> - <<elseif (getSlave($AS).sexualFlaw == "shamefast")>> - <<set getSlave($AS).devotion -= 7, getSlave($AS).trust -= 7>> - The constant exposure of $his naked body through the bars to anyone willing to see $him and the pain you subjected $him to makes $him @@.mediumorchid;trust you less@@ and @@.hotpink;hate you more.@@ - <<set getSlave($AS).fetishStrength -= 5>> - <<elseif (getSlave($AS).sexualFlaw == "repressed")>> - <<set getSlave($AS).devotion -= 7, getSlave($AS).trust -= 7>> - The constant shame $he was subjected in such a public way makes $him @@.mediumorchid;trust you less@@ and @@.hotpink;hate you more.@@ - <<elseif (getSlave($AS).sexualFlaw == "attention whore")>> - <<set getSlave($AS).devotion -= 7, getSlave($AS).trust -= 7>> - $He @@.mediumorchid;trust you less@@ and @@.hotpink;hate you more@@ for spoiling $his chance for attention and depriving $him of $his audience. - <<set getSlave($AS).fetishStrength += 2>> - <<elseif (getSlave($AS).sexualFlaw == "self hating")>> - <<set getSlave($AS).devotion -= 7, getSlave($AS).trust -= 7>> - The constant deprivation of food, sleep and sexual release made $him hate $himself more. As a result $he @@.mediumorchid;trust you less@@ and @@.hotpink;hate you more.@@ - <<set getSlave($AS).fetishStrength += 5>> - <<else>> - <<set getSlave($AS).devotion -= 3, getSlave($AS).trust -= 3>> - The lack of food, sleep and the constant arousal with the chastity belt made $him @@.gold;trust you less@@ and @@.mediumorchid;hate you more.@@ - <</if>> - <<if $arcologies[0].FSAztecRevivalist !== "unset" && $arcologies[0].FSAztecRevivalist < 100>> - <<set $arcologies[0].FSAztecRevivalist += 1>> - <</if>> - <<set $slavesSacrificedThisWeek = ($slavesSacrificedThisWeek || 0) + 1>> -<<elseif $sacrificeType == "life">> - $He dies screaming as $his still beating heart is ripped out of $his body. <<if _activeSlaveRepSacrifice <= 0>>Nobody cares.<<elseif _activeSlaveRepSacrifice < 10>>The few spectators are suitably impressed.<<elseif _activeSlaveRepSacrifice < 100>>The small crowd appreciates your devotion to the Aztec culture.<<else>>The crowd cheers to the bloody spectacle.<</if>><<if $slaves.length > 0>> On the other hand, your remaining <<if $slaves.length == 1>>slave is<<else>>slaves are<</if>> suitably @@.gold;horrified@@.<</if>> - <<run repX(_activeSlaveRepSacrifice, "futureSocieties")>> - <<run $slaves.filter(function(s) { return !isVegetable(s); }).forEach(function(s) { s.trust -= 5 + random(5); })>> - <<if $arcologies[0].FSAztecRevivalist !== "unset" && $arcologies[0].FSAztecRevivalist < 100>> - <<set $arcologies[0].FSAztecRevivalist += 1>> - <</if>> - <<set $slavesSacrificedThisWeek = ($slavesSacrificedThisWeek || 0) + 1>> - <<run removeSlave(getSlave($AS))>> -<</if>> - -<<set $sacrificeType = 0>> diff --git a/src/futureSocieties/aztec/slaveSacrificeLife.js b/src/futureSocieties/aztec/slaveSacrificeLife.js new file mode 100644 index 0000000000000000000000000000000000000000..ca8d17a1b6e8f05fef094bb7125915116b53fc55 --- /dev/null +++ b/src/futureSocieties/aztec/slaveSacrificeLife.js @@ -0,0 +1,40 @@ +/** @param {App.Entity.SlaveState} sacrifice */ +App.UI.SlaveInteract.aztecSlaveSacrificeLife = function(sacrifice) { + const frag = new DocumentFragment(); + let r = []; + + const {He, his} = getPronouns(sacrifice); + + const activeSlaveRepSacrifice = repGainSacrifice(sacrifice, V.arcologies[0]); + r.push(`${He} dies screaming as ${his} still beating heart is ripped out of ${his} body.`); + if (activeSlaveRepSacrifice <= 0) { + r.push(`Nobody cares.`); + } else if (activeSlaveRepSacrifice < 10) { + r.push(`The few spectators are suitably impressed.`); + } else if (activeSlaveRepSacrifice < 100) { + r.push(`The small crowd appreciates your devotion to the Aztec culture.`); + } else { + r.push(`The crowd cheers to the bloody spectacle.`); + } + if (V.slaves.length > 0) { + r.push(`On the other hand, your remaining`); + if (V.slaves.length === 1) { + r.push(`slave is`); + } else { + r.push(`slaves are`); + } + r.push(`suitably <span class="trust dec">horrified</span>.`); + for (const slave of V.slaves.filter((s) => !isVegetable(s))) { + slave.trust -= 5 + random(5); + } + } + repX(activeSlaveRepSacrifice, "futureSocieties"); + if (V.arcologies[0].FSAztecRevivalist !== "unset" && V.arcologies[0].FSAztecRevivalist < 100) { + V.arcologies[0].FSAztecRevivalist += 1; + } + V.slavesSacrificedThisWeek = (V.slavesSacrificedThisWeek || 0) + 1; + removeSlave(sacrifice); + + App.Events.addParagraph(frag, r); + return frag; +}; diff --git a/src/futureSocieties/aztec/slaveSacrificePenance.js b/src/futureSocieties/aztec/slaveSacrificePenance.js new file mode 100644 index 0000000000000000000000000000000000000000..0cd5b87b23a060c692708f522335a472bc78f33e --- /dev/null +++ b/src/futureSocieties/aztec/slaveSacrificePenance.js @@ -0,0 +1,625 @@ +/** @param {App.Entity.SlaveState} sacrifice */ +App.UI.SlaveInteract.aztecSlaveSacrificePenance = function(sacrifice) { + const frag = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself + } = getPronouns(sacrifice); + const {title: Master, say: say} = getEnunciation(sacrifice); + + const activeSlaveRepSacrifice = repGainSacrifice(sacrifice, V.arcologies[0]); + + r.push(`You inform ${sacrifice.slaveName} that ${he}'s been chosen to take part in a ritual sacrifice to Xochiquetzal, the goddess of carnal love, excess, and sexual release.`); + if (sacrifice.devotion > 50) { + if (!canTalk(sacrifice)) { + r.push(`${He} looks excited at the prospect of suffering for the goddess.`); + } else if (sacrifice.fetishKnown === 1 && sacrifice.fetishStrength > 60 && sacrifice.fetish !== "none") { + r.push(`${He} looks excited.`); + r.push(Spoken(sacrifice, `"${Master}! I'm honored to be chosen! Thank you so much!"`)); + if (sacrifice.fetish === "masochist") { + r.push(`${He} shudders with excitement.`); + r.push(Spoken(sacrifice, `"I mean, I know my pain will help to feed the goddess and I'm willing to suffer plenty to please her, but is it really a sacrifice if I'm enjoying it?"`)); + } else if (sacrifice.fetish === "cumslut") { + r.push(`${He} hesitates, looking concerned.`); + r.push(Spoken(sacrifice, `"Oh Gods, the sex cleansing will be awful, but I'm willing to sacrifice all that pain for the goddess."`)); + } else if (sacrifice.fetish === "humiliation") { + r.push(`${He} shudders with excitement.`); + r.push(Spoken(sacrifice, `"I heard everyone can see me as I suffer. I hope the public penance will please the goddess."`)); + } else if (sacrifice.fetish === "buttslut") { + r.push(`${He}`); + if (canSee(sacrifice)) { + r.push(`looks sadly at the floor.`); + } else { + r.push(`tilts ${his} head downwards sadly.`); + } + r.push(Spoken(sacrifice, `"Oh Gods, that means no butt sex for me. I hope Xochiquetzal be pleased by all that sacrifice."`)); + } + } else { + r.push(`${He} looks determined.`); + r.push(Spoken(sacrifice, `"${Master}, I'll do my best. No other slave will be cleaner for the goddess than I.`)); + } + } else if (sacrifice.devotion > 20 || (sacrifice.devotion >= -20 && sacrifice.trust < -20 && sacrifice.trust >= -50)) { + if (!canTalk(sacrifice)) { + r.push(`${He} looks cautious at the prospect of suffering for the goddess.`); + } else if (sacrifice.fetishKnown === 1 && sacrifice.fetishStrength > 60 && sacrifice.fetish !== "none") { + r.push(`${He} looks cautiously excited.`); + r.push(Spoken(sacrifice, `"${Master},`)); + if (sacrifice.fetish === "submissive") { + r.push(Spoken(sacrifice, `I'll follow your every word to be a good sacrifice for the goddess. I won't even blink if I'm not instructed to.`)); + } else if (sacrifice.fetish === "masochist") { + r.push( + Spoken(sacrifice, `sacrifice will be hard, right? Lots of pain the whole week..."`), + `${he} trails off.` + ); + } else if (sacrifice.fetish === "cumslut") { + r.push( + Spoken(sacrifice, `it's going to be so hard to not be able to drink cum the whole week!"`), + `An expression of sadness spreads across ${his} face.`, + Spoken(sacrifice, `"But I'm willing to do it for the goddess."`) + ); + } else if (sacrifice.fetish === "humiliation") { + r.push(Spoken(sacrifice, `it's a public sacrifice, right? I hope they all see how much one must suffer to please the goddess."`)); + } else if (sacrifice.fetish === "buttslut") { + r.push( + Spoken(sacrifice, `my poor ass, so neglected. I hope Xochiquetzal will be pleased with such a hard sacrifice."`), + `${He} rubs ${his} butt in anticipation.` + ); + } else { + r.push( + Spoken(sacrifice, `I will do my best to be a good sacrifice,"`), + `${he} says, trying to put on a brave front. Then, half to ${himself}, ${he} adds in a small voice,`, + Spoken(sacrifice, `"I can do this."`) + ); + } + } else if (sacrifice.sexualFlaw !== "none") { + r.push(Spoken(sacrifice, `"Yes, ${Master},"`)); + r.push(`${he} ${say}s obediently. ${He} hesitates, looking concerned.`); + if (sacrifice.sexualFlaw === "hates oral") { + r.push( + Spoken(sacrifice, `"So, no sucking dicks for a week, right? It will be hard, but I'll do it to please the goddess."`), + `A coy little smile appears on ${his} face when ${he} thinks you aren't looking.` + ); + } else if (sacrifice.sexualFlaw === "hates anal") { + r.push( + Spoken(sacrifice, `"So, no taking dicks up my ass for a week, right? It will be hard, but I'll do it to please the goddess."`), + `A coy little smile appears on ${his} face when ${he} thinks you aren't looking.` + ); + } else if (sacrifice.sexualFlaw === "shamefast") { + r.push( + Spoken(sacrifice, `"That loin cloth seems so small..."`), + `${His} face turns red as ${he} stutters.` + ); + } else if (sacrifice.sexualFlaw === "repressed") { + r.push( + Spoken(sacrifice, `"So, no sex at all for a week, right? It will be hard, but I'll do it to please the goddess."`), + `A coy little smile appears on ${his} face when ${he} thinks you aren't looking.` + ); + } else { + r.push( + `${He} tries to be brave.`, + Spoken(sacrifice, `"${Master}, I will do my best to be a good sacrifice" Then, half to ${himself}, ${he} adds in a small voice, "I can do this..."`) + ); + } + } else { + r.push( + `${He} tries to be brave.`, + Spoken(sacrifice, `"${Master}, I will do my best to be a good sacrifice."`), + `Then, half to ${himself}, ${he} adds in a small voice,`, + Spoken(sacrifice, `"I can do this..."`) + ); + } + } else if (sacrifice.devotion >= -50 && sacrifice.trust < -20) { + if (!canTalk(sacrifice)) { + r.push(`${He} looks afraid at the prospect of suffering for the goddess.`); + } else if (sacrifice.sexualFlaw !== "none") { + r.push( + `${He} seems afraid of what's to come and ${his} answer is barely more than a whisper, almost to ${himself},`, + Spoken(sacrifice, `"Yes ${Master}..."`), + `Finally ${he} gasps out,`, + Spoken(sacrifice, `"Gods, I'm going to s-suffer so much."`) + ); + if (["hates oral", "hates anal", "hates penetration"].includes(sacrifice.sexualFlaw)) { + r.push(`${He} visibly considers disobedience but the prospect of not having`); + if (sacrifice.sexualFlaw === "hates oral") { + r.push(`a dick down ${his} throat`); + } else if (sacrifice.sexualFlaw === "hates anal") { + r.push(`${his} butt filled`); + } else if (sacrifice.sexualFlaw === "hates penetration") { + r.push(`any hole filled with dick`); + } + r.push( + `for a hole week seems enough to go through any ordeal you order ${him} to do. Trembling, ${he} answers,`, + Spoken(sacrifice, `"Yes ${Master}, I'll obey."`) + ); + } else if (sacrifice.sexualFlaw === "shamefast") { + r.push( + `${He} bursts into tears.`, + Spoken(sacrifice, `"I'm going to be practically naked where everyone can see me!"`) + ); + } else if (sacrifice.sexualFlaw === "repressed") { + r.push( + `A big smile appears on ${his} face.`, + Spoken(sacrifice, `"I'm going to be cleansed. I'll be cleaned for the goddess..."`) + ); + } + } else { + r.push( + `${He} does ${his} best to control ${himself} and avoid punishment.`, + Spoken(sacrifice, `"${Master}, I will do it. I'll do the penitence for the goddess."`), + `${He} holds ${himself} together until you dismiss ${him}; as ${he} turns to leave, the tears come fast, and ${he} almost runs into the door frame on ${his} way out${(canSee(sacrifice)) ? `, blinded with weeping` : ``}.`); + } + } else { + if (canWalk(sacrifice)) { + r.push(`${He} manages to run halfway to your desk before ${he}'s`); + if (S.Bodyguard) { + r.push(`clotheslined by ${S.Bodyguard.slaveName}.`); + } else if (V.HeadGirlID !== 0) { + r.push(`restrained by ${S.HeadGirl.slaveName}.`); + } else { + r.push(`restrained by another, more obedient slave.`); + } + r.push(`${He} kicks and struggles as ${he}'s removed from your office. By the end of the week, it won't matter; ${he}'ll be so hungry and horny that resistance will be the last thing on ${his} mind.`); + } else if (!canTalk(sacrifice)) { + r.push(`A long line of slurs and names are screamed at you, none of them particularly pleasant. Your`); + if (V.HeadGirlID !== 0) { + r.push(`Head Girl ${S.HeadGirl.slaveName}`); + } else { + r.push(`another, more obedient slave`); + } + r.push(`removes ${him} as ${he} continues ${his} rant, spitting and resisting as much as ${he} can without limbs. By the end of the week, it won't matter; ${he}'ll be so hungry and horny that resistance will be the last thing on ${his} mind.`); + } else { + r.push(`${He} proceeds to drop into a massive tantrum for the lack of better ways to express ${himself}.`); + if (V.HeadGirlID !== 0) { + r.push(S.HeadGirl.slaveName); + } else { + r.push(`Another, more obedient slave`); + } + r.push(`removes ${him} as ${he} continues struggling, spitting and resisting as much as ${he} can. By the end of the week, it won't matter; ${he}'ll be so hungry and horny that resistance will be the last thing on ${his} mind.`); + } + } + + App.Events.addParagraph(frag, r); + r = []; + + const {hisU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U"); + r.push(`As tradition dictates, the purification of ${his} body will be used as penance to the goddess in an attempt to pay for the favors bestowed upon your arcology. First, one of your slaves is appointed to represent you as ${his} owner, who willingly gives the slave as sacrifice, and is put in charge of the slave's health while ${he} goes through the penance process. ${sacrifice.slaveName} is thoroughly bathed and ${his} whole body covered in blue paint, while ${his} mouth is covered in black paint, as payment for being a prostitute.`); + /* Might need a clause here for other jobs besides "whore"*/ + r.push(`${He}'s taken to spend the night at the sexual servitude of another slave who will be sacrificed to Tezcatlipoca, god of the night sky. ${He}'s`); + if (sacrifice.devotion > 20) { + r.push(`fucked all night long;`); + } else { + r.push(`raped over and over again throughout the night;`); + } + r.push(`${his} holes dedicated to the sexual satisfaction of the slave who soon will face a much darker fate than ${him} to please the gods.`); + if (canDoVaginal(sacrifice) && canDoAnal(sacrifice)) { + actX(sacrifice, "vaginal", random(1, 2)); + actX(sacrifice, "anal", random(1, 2)); + actX(sacrifice, "oral", random(2, 6)); + if (sacrifice.vagina === 0 && sacrifice.anus === 0) { + r.push(`${His} sacrifice to the gods naturally meant giving up <span class="lime">both of ${his} virginities.</span>`); + sacrifice.vagina = 1; + sacrifice.anus = 1; + } + if (canGetPregnant(sacrifice) && sacrifice.eggType === "human") { + r.push(`${His} lover tried ${hisU} best to plant ${hisU} seed deep within ${him}. ${He}'s likely pregnant after last night.`); + r.push(knockMeUp(sacrifice, 70, 2, 0)); + } + } else if (canDoVaginal(sacrifice)) { + actX(sacrifice, "vaginal", random(1, 3)); + actX(sacrifice, "oral", random(2, 3)); + if (sacrifice.vagina === 0) { + r.push(`${His} sacrifice to the gods ended up including <span class="lime">${his} virginity.</span>`); + sacrifice.vagina = 1; + } + if (canGetPregnant(sacrifice) && sacrifice.eggType === "human") { + r.push(`${His} lover tried ${hisU} best to plant ${hisU} seed deep within ${him}. ${He}'s likely pregnant after last night.`); + r.push(knockMeUp(sacrifice, 70, 0, 0)); + } + } else if (canDoAnal(sacrifice)) { + actX(sacrifice, "anal", random(1, 3)); + actX(sacrifice, "oral", random(2, 3)); + if (sacrifice.anus === 0) { + r.push(`${His} sacrifice to the gods ended up including <span class="lime">${his} anal virginity.</span>`); + sacrifice.anus = 1; + } + if (canGetPregnant(sacrifice) && sacrifice.eggType === "human") { + r.push(`${His} lover tried ${hisU} best to plant ${hisU} seed deep within ${him}. ${He}'s likely pregnant after last night.`); + r.push(knockMeUp(sacrifice, 70, 1, 0)); + } + } else { + actX(sacrifice, "oral", random(2, 6)); + r.push(`By the following morning ${he}'s sickened from the number of loads blown down ${his} throat. Luckily inducing vomiting will be enough to have ${him} ready for the next step.`); + } + + App.Events.addParagraph(frag, r); + r = []; + + r.push(`${He}'s prepared for ${his} public penance. First, ${he} is left to sweat for several hours on the temazcal to remove any impurity of the previous night before being bathed and painted once again. ${He}'s specially dressed for the occasion -`); + if (sacrifice.sexualFlaw === "shamefast" || sacrifice.sexualFlaw === "repressed") { + r.push(`a short red loincloth and a chastity belt designed to prevent any forbidden self-stimulation cover as little of ${his} lower body as possible. The setup is adorned with long, red, silky fringes that move as ${he} walks. ${His} chest is bare except for a pair of golden pasties over ${his} nipples joined by three blue chains on cascade.`); + } else { + r.push(`a particularly enticing red loincloth covers ${his} lower regions while hiding the chastity belt that will thwart any forbidden self-stimulation. ${His} chest is nearly naked save for a large necklace adorned with feathers, gold and flowers.`); + } + r.push(`Lastly, ${his} head is decorated with a huge crest of feathers in the colors of the goddess.`); + + App.Events.addParagraph(frag, r); + r = []; + + r.push(`You lead the procession through the arcology's halls with ${sacrifice.slaveName},`); + if (sacrifice.devotion > 20) { + r.push(`proudly facing destiny,`); + } else { + r.push(`restrained and crying while ${he} tries to resist,`); + } + r.push(`followed by the sound of drums and flutes with ${his} caretaker bringing up the rear. Finally, you reach the center of your arcology's largest plaza where`); + if (activeSlaveRepSacrifice <= 0) { + r.push(`you find nobody cares about ${his} penance. ${He}'s presented to anyone that will listen`); + } else if (activeSlaveRepSacrifice < 10) { + r.push(`a few spectators have assembled to watch ${his} internment. ${He}'s presented to the onlookers`); + } else if (activeSlaveRepSacrifice < 100) { + r.push(`a small crowd has assembled to watch ${his} internment. ${He}'s presented to the crowd`); + } else { + r.push(`a large crowd has assembled to eagerly watch ${his} internment. ${He}'s presented to the excited crowd`); + } + r.push(`as the sacrifice and is`); + if (sacrifice.devotion > 20) { + r.push(`helped`); + } else { + r.push(`pushed`); + } + r.push(`into a golden cage, just big enough for ${him} to fit. Once inside, a huge dose of aphrodisiacs are injected into ${him} and the door is locked. During ${his} week-long penance, ${he} will be kept on a strict regimen of aphrodisiacs to keep ${him} aroused but unable to cum, a special spiced tea diet to avoid dehydration, and a constant vigil, with only a few hours of sleep every night.`); + + App.Events.addParagraph(frag, r); + r = []; + if (sacrifice.devotion > 50) { + r.push(`As the week starts, ${he} is proud to fulfill ${his} duty. ${He} fights the urge to touch ${himself}, drinking only when ${he} needs to, and does ${his} best to keep ${himself} pure for the goddess.`); + + if (sacrifice.fetishKnown === 1 && sacrifice.fetishStrength > 60 && sacrifice.fetish !== "none") { + if (sacrifice.fetish === "submissive") { + r.push(`${He} makes sure to be ready to take any instruction, and it's clear that ${he} enjoys it. As the week progresses, the signs of ${his} sexual frustration become more evident. However, ${he} seems to enjoy the struggle of resisting the urges, since ${he} is under strict orders not to touch ${himself}. Every time the slave in charge of feeding ${him} or renewing ${his} aphrodisiacs orders ${him} to come closer, ${his} body shudders with lust-fueled pleasure. ${He} moans lewdly whenever ${he}'s ordered to wake up or to sleep. By the end of the week, ${he} fights to remain standing, almost delusional from lust and starvation. ${He} was told to remain`); + if (hasBothLegs(sacrifice)) { + r.push(`on ${his} feet,`); + } else { + r.push(`standing,`); + } + r.push(`but, much to ${his} chagrin, exhaustion often brings ${him} to`); + if (hasBothLegs(sacrifice)) { + r.push(`${his} knees.`); + } else { + r.push(`the floor.`); + } + } else if (sacrifice.fetish === "masochist") { + r.push(`${He} seems to enjoy the pain ${his} sacrifice gives ${him}. As the week progresses, it is fairly common to see ${him} moaning and showing other signs of pleasure that seem to be unrelated to the huge amount of aphrodisiacs in ${his} system. Before long, ${he} starts to faint more often as ${he} refuses to even drink the tea to keep ${him} hydrated and avoids any sleep whatsoever. The specially designated slave appointed to ${his} care needs to force ${him} to drink every few hours to avoid dying of dehydration. ${He} seems to enjoy the extra abuse and even fights to retain as little liquid inside ${him} as possible. By the end of the week, ${he} needs to be constantly reanimated to carry out ${his} penance, a process that ${he} also seems to enjoy.`); + } else if (sacrifice.fetish === "cumslut") { + r.push(`${He} can be seen frequently crying and desperately fighting the excruciating need to touch ${himself}. As a result of the aphrodisiacs, the paint on ${his}`); + if (hasAnyLegs(sacrifice)) { + r.push(`inner thigh`); + if (hasBothLegs(sacrifice)) { + r.push(`s`); + } + } else { + r.push(`crotch`); + } + r.push(`is constantly wet and steadily drips onto the cage floor. As the week progresses, ${his} whining increase and ${his} body convulses harder and harder with lust. The loincloth ${he}'s wearing is constantly wet, as`); + if (hasBothLegs(sacrifice)) { + r.push(`are ${his} legs.`); + } else { + r.push(`is most of ${his} lower body.`); + } + r.push(`It is common to see ${him} begging strength from the goddess only to burst into tears when no relief comes to ${him} and crying ${himself} to sleep at night only to be awoken a few hours later. As a result of all ${his} crying and lubrication, ${he} needs to be hydrated more often. By the end of the week, ${his} body refuses to lose more liquid, a fact that doesn't stop ${him} from sobbing, immobile in ${his} dried arousal on the floor of the cage, interrupted only by the spasms of ${his} lust raked body and the slave posted to procure ${him} more tea to prevent ${him} from succumbing to dehydration.`); + } else if (sacrifice.fetish === "humiliation") { + r.push(`${He} seems to enjoy all the attention ${he} receives as ${he} tries to fight the impulse to touch ${himself}. ${He} takes special care to show how degrading the whole process can be. It is common to see ${him} enjoying every reapplication of aphrodisiacs and when ${he} needs to be awoken. Often, ${he} refuses to drink the tea, hoping the time comes that ${he} will be forced to drink it. As the week progresses and the signs of discomfort become more obvious, ${he} rejoices in the attempts of the slave on duty to force ${him} to drink ${his} tea and the way ${he}'s awakened after just a few hours of sleep. ${His} body shows clear signs of food, sleep and sexual deprivation that increases as the days go by; ${he} shows no shame with displaying ${his} lack of inner strength. By the end of the week, ${he} can't stand up and remains on the floor of the cage, enjoying the soak in ${his} own sexual fluids and saving what little strength ${he} has left to make ${his} waterings thoroughly humiliating.`); + } else if (sacrifice.fetish === "buttslut") { + r.push(`${He} tries to keep ${his} butt away from the bars of the cage to avoid any possible stimulation of it. As the week progresses, it is common to see ${him} trying to remain immobile as ${his} body shakes and twitches with lust; the constant stimulation of the soft fabric over ${his} butt, every shift of ${his} weight and even the caress of the air threatening to drive ${him} into a frenzy. The lack of food, sexual release and sleep wears ${his} will down as ${he}'s often ordered back`); + if (hasBothLegs(sacrifice)) { + r.push(`to ${his} feet`); + } else { + r.push(`into a standing position`); + } + r.push(`since ${he} insists on sitting down with the hope that ${his} butt numbs. By the end of the week, ${he} remains on the floor of the cage, sitting on ${his} side, as immobile as ${he} can, interrupted only by the occasional twitch and the need to drink or roll over.`); + } else if (sacrifice.fetish === "boobs") { + r.push(`${He} tries to distract ${himself} from the constant stimulation the necklace forces onto ${his} sensitive`); + if (sacrifice.boobs >= 300) { + r.push(`breasts.`); + } else { + r.push(`chest.`); + } + r.push(`${He} can be seen constantly fighting the urge to tweak ${his} nipples every time the aphrodisiacs are injected into to ${his} body. As the week goes by, the lack of food and sleep seem to distract ${him} enough to stop ${him} from clenching the cage's bars in an attempt to avoid cumming from stimulation to ${his} breasts. ${He} needs to be constantly watched during ${his} sleep to make sure`); + if (hasAnyArms(sacrifice)) { + r.push(`${his}`); + if (hasBothArms(sacrifice)) { + r.push(`hands don't`); + } else { + r.push(`hand doesn't`); + } + r.push(`slip under`); + } else { + r.push(`${he} doesn't toy with`); + } + r.push(`${his} necklace. By the end of the week, ${he} remains on the floor of ${his} cage, incapable of moving, from the lack of food, sleep, and sexual release. ${His} nipples are painfully erect from the aphrodisiacs in ${his} body.`); + } else { + r.push(`${He} tries to fulfill ${his} sacrifice as best ${he} can by trying to keep ${himself} pure for the goddess. ${He} submits to every instruction to the best of ${his} ability. ${He} can be seen constantly fighting the urge to touch ${himself}, shaking and moaning at the overwhelming lust caused by the aphrodisiacs. ${He} drinks only when told, and kindly refuses it when ${he} thinks ${he} can hold longer without it. As the week progresses, ${his} body shakes and twitches more often as ${he} struggles to stave off the compounding effects of the aphrodisiacs. ${He} tries to minimize any extra stimulation from the soft fabric or the necklace on ${his} chest by staying still, but sometimes ${he} bursts into tears when ${his} strength wavers. The only interactions ${he} faces are the reminders to stay hydrated, the application of more aphrodisiacs and ${his} sleep deprivation. By the end of the week, ${he} can hardly stand and often remains on the floor of the cage, soaked in ${his} own desperation.`); + } + } else { + r.push(`${He} tries to fulfill ${his} sacrifice as best ${he} can by trying to keep ${himself} pure for the goddess. ${He} submits to every instruction to the best of ${his} ability. ${He} can be seen constantly fighting the urge to touch ${himself}, shaking and moaning at the overwhelming lust caused by the aphrodisiacs. ${He} drinks only when told, and kindly refuses it when ${he} thinks ${he} can hold longer without it. As the week progresses, ${his} body shakes and twitches more often as ${he} struggles to stave off the compounding effects of the aphrodisiacs. ${He} tries to minimize any extra stimulation from the soft fabric or the necklace on ${his} chest by staying still, but sometimes ${he} bursts into tears when ${his} strength wavers. The only interactions ${he} faces are the reminders to stay hydrated, the application of more aphrodisiacs and ${his} sleep deprivation. By the end of the week, ${he} can hardly stand and often remains on the floor of the cage, soaked in ${his} own desperation.`); + } + } else if (sacrifice.devotion > 20 || (sacrifice.devotion >= -20 && sacrifice.trust < -20 && sacrifice.trust >= -50)) { + r.push(`As week starts, ${he} tries to fulfill ${his} duty. ${He} fights the urge to touch ${himself}, drinks only when ${he} needs to, and tries to keep ${himself} pure for the goddess.`); + + if (sacrifice.fetishKnown === 1 && sacrifice.fetishStrength > 60 && sacrifice.fetish !== "none") { + if (sacrifice.fetish === "submissive") { + r.push(`${He} makes sure is ready to take any order ${he} might be given, and it's evident that ${he} enjoys it every time ${he} is ordered to do something. As the week progresses ${he} finds ${himself} close to the limits of ${his} submission. As much as ${he} tries to`); + if (hasAnyArms(sacrifice)) { + r.push(`keep ${his} hand`); + if (hasBothArms(sacrifice)) { + r.push(`s`); + } + r.push(`to ${himself},`); + } else { + r.push(`stay calm,`); + } + r.push( + `${his} sexual frustration finally wins the battle, and ${he} desperately tries to masturbate, only for ${him} to discover how effective the chastity belt really is. ${He} cries in frustration and shame for being unable to fulfill ${his} orders. The signs of sexual frustration are more evident on ${his} body as time goes by and it is common to see ${him} repeating`, + Spoken(sacrifice, `"${Master} told me 'no touching yourself is allowed'"`), + `over and over again as ${he} shifts ${his} weight from` + ); + if (hasBothLegs(sacrifice)) { + r.push(`foot to foot.`); + } else { + r.push(`side to side.`); + } + r.push(`The only thing that seems to shut ${him} up is when ${he} is ordered to come closer to drink, renew ${his} dose of aphrodisiacs or when ordered to be prepared to sleep. As soon as ${he}`); + if (canHear(sacrifice)) { + r.push(`hears`); + } else if (canSee(sacrifice)) { + r.push(`sees`); + } else { + r.push(`recognizes`); + } + r.push(`the order, ${his} body twitches and a soft moan can be heard. By the end of the week ${he} fights to remain standing up almost delusional as ${he} was told to remain`); + if (hasBothLegs(sacrifice)) { + r.push(`on ${his} feet`); + } else { + r.push(`standing`); + } + r.push(`but the signs of exhaustion often bring ${him} to`); + if (hasBothLegs(sacrifice)) { + r.push(`${his} knees.`); + } else { + r.push(`the floor.`); + } + r.push(`Sometimes ${he} tries to touch ${himself} down there only to burst into tears when ${he} is unable to do so.`); + } else if (sacrifice.fetish === "masochist") { + r.push(`${He} seems to enjoy the pain ${his} sacrifice submits ${him} to. Through the week is fairly common to see ${his} moaning and showing other signs of pleasure that seem to be fairly unrelated to the huge amounts of aphrodisiacs that run through ${him}. Every time the shot it is injected to ${his} body ${he} pants and thrusts, enjoying the pain of ${his} swollen`); + if (sacrifice.dick !== 0) { + r.push(`dick`); + } else if (sacrifice.vagina > -1) { + r.push(`pussy lips`); + } + r.push(`throbbing inside ${his} chastity belt. As the week progresses, ${he} starts to frequently faint, as ${he} refuses to even drink the tea that keeps ${him} hydrated or sleep whatsoever, instead choosing to focus on the pain of being constantly aroused. As a precaution, alternative methods to keep ${him} hydrated are put in place to avoid the pleasure of being forced to drink every few hours as ${he} was caught several times trying to cum from it. By the end of the week ${he} needs to be constantly reanimated to fulfill ${his} vigil, moaning as ${he} comes to conscience as the exhaustion and pain on ${his} body washes over to ${him}.`); + } else if (sacrifice.fetish === "cumslut") { + r.push(`/*Will need to be completely rewritten*/`); + r.push(`At first, ${he} seems resigned to not cum at all during ${his} penance. Soon ${his} resolution seems to vanish and ${he} can be seen constantly crying, trying to fight the excruciating need to touch ${himself} yet failing by trying to masturbate through the chastity belt. As a result of the aphrodisiacs in ${his} body the paint on the inner part of ${his}`); + if (hasBothLegs(sacrifice)) { + r.push(`legs`); + } else { + r.push(`hips`); + } + r.push(`seems constantly wet and dripping into the cage which ${he} seems to enjoy. As ${his} whining and tears increases so do the spasms, a direct result of ${his} need to cum. The loincloth ${he} is wearing has to be constantly changed and ${his}`); + if (hasAnyLegs(sacrifice)) { + r.push(`leg`); + if (hasBothLegs(sacrifice)) { + r.push(`s`); + } + } else { + r.push(`lower body`); + } + r.push(`constantly cleaned when it becomes apparent they are wet to avoid any evidence of pleasure. ${He} tries to make it more difficult as now it is the only thing ${he} has to fantasize on cumming. At the end of the week is often common to see ${him} beg to be touched by anyone who is close enough to hear ${him} and bursts into tears when ${he} is blatantly ignored. As a result of all this crying, the lack of food and sleep ${he} needs to be hydrated more often also the dose of aphrodisiacs is changed to be less potent but be injected more often to avoid the danger that ${he} might cum from it. ${His} body refuses to lose anymore more liquids, a fact that doesn't stop ${him} from sobbing and begging to be touched as soon as ${he} finds the strength to it while ${he} remains almost immobile on the bottom of the cage, interrupted by the spasms of ${his} body as a result of being constantly aroused for a week.`); + } else if (sacrifice.fetish === "humiliation") { + r.push(`${He} seems to enjoy all the attention ${he} receives every time ${he} tries to fight the impulse to touch ${himself} as ${his} body shows clear signs of arousal and takes special care in showing just how degrading the whole process can be. It's common to see ${him} enjoying every time the dose of aphrodisiacs needs to be injected again or when ${he} needs to be awaken. Often, ${he} refuses to drink the tea provided, hoping that when the moment comes ${he} will be forced to drink it — preferably in a very humiliating way. As the week progresses and ${his} need to cum increases ${he} focuses on the humiliation ${he} gets every time the aphrodisiacs get the best of ${him} and tries to find release and fails as the citizens passing by throw insults and disgusted looks on ${his} direction for failing in trying to please the goddess. As a result, ${he} is immobilized and blindfolded in an attempt to reduce external stimulation. By the end of the week ${he} cannot stand up and remains on the bottom of the cage, saving ${his} strength to procure making the procedures as humiliating as possible with the little strength ${he} has saved.`); + } else if (sacrifice.fetish === "buttslut") { + r.push(`At first, is common to see ${him} trying to resist the heavy dose of aphrodisiacs in ${his} body as ${he} cannot find a way to release. As the week progresses, ${he} is constantly crying and whining as ${he} is unable find a way to stimulate ${his} ass when the aphrodisiacs become too much for ${him}. As the week progresses and ${his} strength lingers ${he} tries to find ways to increase stimulation on ${his} ass. ${He} tries to keep ${his} butt as close as possible to the cage's bars, rubbing on them to increase any stimulation on ${his} buttocks or focus on the feel of the sort fabric that covers ${him} as it moves when ${he} readjust ${himself}. ${He} seems particularly angry every time ${his} attempts are put to an end just to burst into tears ashamed of ${his} actions. By the end of the week ${he} remains immobile on the center of ${his} cage and the fabric readjusted to procure as little extra stimulation as possible. ${He} insists on sitting down and rubbing ${his} behind against the floor and is forced to stand up. By the end of the week the lack of food, sexual release and sleep seems to be wearing ${his} will off as ${he} takes longer being able to stand up every time and ${he} remains on the bottom of the cage forced to lay on ${his} chest as immobile as ${he} can, interrupted only by the occasional twitch and the need to drink.`); + } else if (sacrifice.fetish === "boobs") { + r.push(`At first, ${he} tries to distract ${himself} from the constant stimulation the necklace over ${his} chest seems to be producing. ${He} can be seen constantly fighting the urge to touch ${his} breasts every time the aphrodisiacs are injected into to ${his} body. As the week progresses ${his} resolutions seem to vanish and ${he} needs to be stopped from touching ${his} breast on several occasions or is constantly caught and forcefully stopped trying to moving ${his} chest to make the necklace rub ${his} breasts. Later on, the necklace is replaced by a breastplate equally colorful and adorned but extremely tight making ${his} breast flatter and unable to move. ${He} soon realizes not only that ${he} can no longer stimulate ${his} breast with it on but that now ${his} breasts are completely hidden from view. As a result, ${he} can be seen constantly crying and trying to rip the breastplate apart to no avail. ${He} is constantly awake during the times ${he} is supposed to be sleeping as ${he} tries to touch ${his} breast but can't seem to find them hidden under the breastplate. At the end of the week ${he} remains on the bottom of ${his} cage unable to move as the lack of food, sleep and sexual release takes a toll on ${his} body, the breastplate is without feathers or other delicate adornments but still in a perfect position.`); + } else { + r.push(`At first, ${he} tries to fulfill ${his} sacrifice the best ${he} can by trying to maintain ${himself} pure for the goddess. ${He} submits to every instruction and tries to hold off as much as ${his} body allows ${him}, drinking as little as ${he} can and sleeping only when ${he} is told. Soon the aphrodisiacs make ${his} resolutions useless as ${he} tries to touch ${himself} to find release. It doesn't take ${him} long to discover how efficient the chastity belt is. ${He} cries and tries as much as ${he} can but ${he} is unable to experience any kind of pleasure. As time goes by ${he} seems to shift ${his} efforts from fighting to removing the chastity belt from ${himself} with no avail. ${His} body twitches and shakes frequently as the aphrodisiacs hit ${him} harder every time ${his} dose is renewed. Later on, ${he} tries to please any part of ${his} body which ${he} is able to touch and needs to be restrained. Hunger and sleep deprivation take a toll on ${his} body also ${he} tries to drink as much as possible to fool the hunger ${he} feels. The tea is rationed to be given only when required and ${his} sleep is carefully monitored. By the end of the week ${he} remains on the bottom of ${his} cage trying to save what little energy ${he} has left, only to be interrupted as ${his} body spasms brought about by the aphrodisiacs in ${his} body followed by a soft moan.`); + } + } else if (sacrifice.sexualFlaw !== "none") { + if (sacrifice.sexualFlaw === "hates oral") { + r.push(`${He} focuses on fulfilling ${his} duty to keeping ${himself} pure for the goddess while fighting the urge to touch ${himself}. ${He} seems to think the worst part of ${his} penance is over as ${he} is no longer going to be raped in the mouth like ${he} was last night. Soon ${he} discovers that is far the truth when ${his} first dose of the tea doesn't come in a tea cup. As a means of keeping ${his} penance in accordance to the suffering the goddess demands the tea will be administered through a similar device used in dairies. A feeding phallus is quickly installed into a side of the cage. If ${he} wants to avoid dehydration ${he} will have to suck it off and only after ${he} does it right is the tea provided. When ${he} realizes what is in store for ${him}, ${he} begins to cry. ${He} tries to drink only when strictly necessary. However, as the week progresses, ${he} starts to faint more frequently as ${his} body receives only the minimum amount of liquids necessary. As a result, ${he} is restrained and the feeding phalli is pressed into ${his} mouth and down ${his} throat to facefuck ${him}. ${He} gags and struggles, tears running down ${his} face as ${he} tries to figure out how to breathe while being facefucked. Only after ${he} manages to control ${himself} is the transparent reservoir of tea injected. ${He} swallows desperately. As per your instructions ${his} feedings are synced with ${his} dose of aphrodisiacs which confuses ${him} to no end and adds to ${his} penance. This procedure occurs several times a day. By the end of the week ${he} can hardly stand up as the lack of food and sleep keeps ${him} weak. ${He} remains on the bottom of the cage only interrupted by ${his} feedings and the body spasms ${he} suffers as a result of the constant arousal.`); + } else if (sacrifice.sexualFlaw === "shamefast") { + r.push(`At first, ${he} tries to fulfill ${his} duty to keeping ${himself} pure to the goddess, distracting ${himself} by trying to cover however ${he} can ${his} almost naked body. As a way to keep ${his} penance according to the suffering the goddess demands a big screen set next to ${his} cage. After a few hours, the screen turns on and a live image of ${him} on the cage appears. The screen then shifts to a low shot of ${his} tight dripping wet product of ${his} arousal, showing different stats related to it. After a few minutes, the screens changes to previously recorded footage of ${his} naked body glistening while laying comfortably on the temazcal. After a minute, it shifts again to a close shot of ${his} ass being carefully painted with blue, the camera following the movement of the brush as it moves over ${his} ass cheek and shifts again to a very close shot of ${him} being fucked the night before. The video changes over and over again showing scenes of previously recorded footage of ${his} preparation for ${his} penance, every one carefully picked to give a good look of ${his} body or revealing live shots of ${his} body picked to show where ${his} sexual arousal is more evident. The first time ${he} sees them ${he} burst into tears, begging the screens to be turned off just to see ${his} image begging and crying a few hours later. As the week goes new clips are added showing the best scenes the camera was able to capture while on the cage. Due to ${his} resistance to show ${his} body for the cameras and the citizens passing by ${he} is immobilized to be kept standing, ${his} body conveniently positioned to get the best shots. ${He} tries to ignore the whole situation trying to focus on resisting the signs of ${his} hunger, exhaustion and arousal ${he} constantly feels. By the end of the week as ${he} remains sitting immobilize on a stool to procure a good shot a small screen is set in front of ${him}, the image divided in two, one half showing what the big screen projects and the other the audience and ${his} reactions.`); + } else if (sacrifice.sexualFlaw === "repressed") { + r.push(`Although ${he} thinks ${his} clothes are degrading, ${he} seems happy to fulfill ${his} duty keeping ${himself} pure to the goddess and fighting the urge to touch ${himself}. At first, ${he} seems confident ${he} can manage the heavy dose of aphrodisiacs that run through ${his} body and tries to give no indication of the constant arousal ${he} suffers. An occasional shake or moan escapes ${his} lips for what ${he} seems to be deeply ashamed. As the week goes by and ${his} resistance reduces ${his} body betrays ${him} every time more often. ${He} shakes, moans and shivers with the littlest provocation, which horrify ${him} to no end. Little does ${he} know that ${his} dose of aphrodisiacs is being increased every time ${he} is injected and that they are more effective now that the lack of sleep takes a toll on ${his} body. ${He} hates ${himself} for being unable to control the shameful things ${his} body demands and burst into tears when ${his} pelvis thrusts the minute the fringes are moved by the wind and caresses ${his} body or the necklace rubs on ${his} nipples. By the end of the week ${he} cannot handle it and tries to touch ${himself} when ${he} thinks no one is watching ${him} only to be caught right after. The shame is so big ${he} breaks out on tears. ${He} spends the rest of ${his} time left in penance on the bottom of the cage sobbing as ${his} body keeps as much of the energy it can only interrupted by the moans ${he} can no longer control and the shivers to run through ${his} body when the aphrodisiacs overwhelmed ${him}.`); + } else if (sacrifice.sexualFlaw === "attention whore") { + r.push(`${He} seems to enjoy all the attention ${he} receives every time ${he} tries to fight the impulse to touch ${himself} as ${his} body shows clear signs of arousal and takes special care in showing ${his} body to the audience. ${He} rejoices with the reactions of the citizens as they gasp and point while ${he} shakes and moans. The first time the tea is offered to ${him} ${he} refuses it hoping to get a reaction of ${his} crowd. As a way to keep ${his} penance according to the suffering the goddess demands after the first night is over ${he} is informed that due to ${his} good behavior ${he} has been granted the chance to finish ${his} penance in private. ${He} cries and begs to be left where ${he} is. ${He} is blindfolded and taken to a minuscule room nearby while cries and begs. Once inside ${he} is left to ${himself}, ${his} only contact with another person is the slave appointed to ${his} care who enters to administer the aphrodisiacs when required, when ${his} ration of tea is left on the room or when ${he} falls sleep and is required to be awake. Little does ${he} know the room is filled with hidden cameras which are connected to a big screen installed where ${his} cage was as the penance must be public. As the week goes by ${he} is left to deal with the hunger, the lack of sleep and the constant need to release. By the end of the week ${he} cannot stand up and remains on the bottom of the room, saving ${his} strength and sobbing.`); + } else if (sacrifice.sexualFlaw === "self hating") { + r.push(`As week starts ${he} tries to fulfill ${his} duty, fighting the urge to touch ${himself} and drinking just when ${he} needs to, hoping that by following the rules the penance of such unworthy slave will be enough to please the goddess. As the week progresses ${his} resolution reduces. ${He} soon discovers how efficient a chastity belt could be when, once completely overpowered by ${his} need of release ${he} tries to touch ${himself}, fearing the wrath of the goddess for ${his} lack of strength. ${His} body shakes and twitches every time more often as the aphrodisiacs run through ${his} body, blaming ${himself} for not being able to keep control. ${His} pelvis thrusts every time the airs provides extra stimulation product the sexual frustration and tries to stop it by banging ${his} head against the cage. ${He} soon needs to be immobilized to avoid damage. As ${he} lays on the cage ${he} blames ${himself} for ${his} inability to fulfill ${his} task. The lack of food has a toll on ${him} too, as ${he} often refuses to drink thinking the dehydration is well deserved. As a result of this, it is forced to drink several times a day which seems to infuriate ${him}. By the end of the week ${he} can hardly stand up as the lack of food and sleep keeps ${him} weak. ${He} remains on the bottom of the cage being fed by another slave when it is clear ${he} that needs more liquid in ${his} body and ${his} hours of sleep are over.`); + } else { + r.push(`At first, ${he} tries to fulfill ${his} sacrifice the best ${he} can, trying to maintain ${himself} pure for the goddess. ${He} submits to every instruction trying to hold as much as ${his} body allows ${him}, drinking as little as ${he} can and sleeping only when ${he} is told. Soon the aphrodisiacs make ${his} resolutions dilute as ${he} tries to touch ${himself} to find release. It does not take ${him} long to prove how efficient ${his} chastity belt is. ${He} cries and tries as much as ${he} can but ${he} is unable to cause any kind of pleasure. As time goes by ${he} seems to shift ${his} efforts on fighting to remove the chastity belt from ${himself} with no avail. ${His} body twitches and shakes every time more often as the aphrodisiacs hit ${him} harder every time ${his} dose is renewed. Later on, ${he} tries to please any part of ${his} body which is free to touch and needs to be restrained. Hunger and deprivation of sleep take a toll on ${his} body too and tries to drink as much as possible to fool the hunger ${he} feels. The tea is rationed to be given only when need it and the sleep carefully monitored. By the end of the week ${he} remains on the bottom of ${his} cage trying to the little energy ${he} has, only interrupted by the body spasms caused by the aphrodisiacs in ${his} body followed by a soft moan.`); + } + } else { + r.push(`At first, ${he} tries to fulfill ${his} sacrifice the best ${he} can, trying to keep ${himself} pure for the goddess. ${He} submits to every instruction trying to hold as much as ${his} body allows ${him}, drinking as little as ${he} can and sleeping only when ${he} is told. Soon the aphrodisiacs make ${his} resolutions dilute as ${he} tries to touch ${himself} to find release. It does not take ${him} long to prove just how effective ${his} chastity belt is. ${He} cries and tries as much as ${he} can but ${he} is unable to cause any kind of pleasure. As time goes by ${he} seems to shift ${his} efforts on fighting to remove the chastity belt to no avail. ${His} body twitches and shakes more and more often as the aphrodisiacs hit ${him} harder each time ${his} dose is renewed. Later on, ${he} tries to please any part of ${his} body that ${he} is able to, and so needs to be restrained. Hunger and sleep deprivation take a toll on ${his} body, and ${he} tries to drink as much as possible to fool the hunger. The tea is rationed to be given only when need it and the sleep carefully monitored. By the end of the week ${he} remains on the bottom of ${his} cage trying to conserve the little energy ${he} has, interrupted only by the spasms caused by the aphrodisiacs in ${his} body, followed by a soft moan.`); + } + } else if (sacrifice.trust < -20) { + if (sacrifice.sexualFlaw === "hates oral") { + r.push(`${He} immediately focuses on ${his} need of release, since ${he} thinks the worst part of ${his} penance is over as ${his} mouth is no longer going to be raped like it was last night. Soon ${he} discovers that this is far from the truth when it is time for ${his} first dose of the tea. As a means to keep ${his} penance according to the suffering the goddess demands, the tea it to be administered through a similar device as is used in dairies. A feeding phallus is installed on a side of the cage, and if ${he} wants to avoid dehydration, ${he} will have to suck it off. When ${he} realizes what lies in store for ${him} ${he} begins to cry and refuses to drink at all. As the week progresses ${he} begins to faint more and more often as ${he} vehemently refuses to work for ${his} drink. As a result, ${he} is restrained and the feeding phallus is shoved into ${his} mouth and down ${his} throat. ${He} gags and struggles, tears running down ${his} face as ${he} tries and fails to scream. After several minutes, ${he} stops panicking and finally starts to inhale and exhale regularly. Only after this the transparent reservoir of tea is injected. ${He} chokes on it but swallows desperately. As per your instructions ${his} feedings are synched with ${his} dose of aphrodisiacs which confuses ${him} to no end and adds to ${his} penance. The procedure goes on during the rest of the week several times a day. By the end of the week ${he} can hardly stand up as the lack of food and sleep keeps ${him} weak. ${He} remains on the bottom of the cage, only interrupted by ${his} feedings and the spasms ${he} suffers as a result of the constant arousal.`); + } else if (sacrifice.sexualFlaw === "shamefast") { + r.push(`At first, ${he} tries to relieve ${himself} while ${he} tries to hide ${his} body. As a way to keep ${his} penance according to the suffering the goddess demands a big screen is set next to ${his} cage. After a few hours, the screen turns on and a live image of ${him} on the cage appears. The screen then shifts to a low shot of ${his} tight pussy dripping with the wet product of ${his} arousal, showing different stats related to it. After a few minutes, the screens changes to previously recorded footage of ${his} naked body glistening while laying comfortably on the temazcal. After a minute, it shifts again to a close-up shot of ${his} ass being carefully painted with blue, the camera following the movement of the brush as it moves over ${his} ass cheek then shifts again to a very close shot of ${him} being fucked the night before. The video changes over and over again showing scenes of previously recorded footage preparation for ${his} penance, every one carefully picked to give a good view of ${his} body or revealing live shots of ${his} body picked to show where ${his} sexual arousal is more evident. The first time ${he} sees them ${he} burst into tears. As the week goes new clips are added showing the best scenes of ${him} that the camera was able to capture while the aphrodisiacs forced ${him} to masturbate without success. Due ${his} resistance to show ${his} body for the cameras and the citizens passing by, ${he} is immobilized into standing, ${his} body conveniently positioned to get the best shots. ${He} tries to ignore the whole situation by trying to focus on ignoring the screen. As a result, a small screen is set in front of ${him}, the image divided in two, one half showing the big screen's projection and the other reactions of all parties. By the end of the week ${he} remains sitting immobilized on a stool to produce a good shivering shot.`); + } else if (sacrifice.sexualFlaw === "repressed") { + r.push(`Although ${he} thinks ${his} clothes are degrading, ${he} seems content to fulfill ${his} duty to keeping ${himself} pure to the goddess and fights the urge to touch ${himself}. At first, ${he} manages to control the heavy dose of aphrodisiacs that run through ${his} body and tries to give no indication of the constant arousal ${he} suffers. An occasional shake or moan escapes ${his} lips for which ${he} seems to be deeply ashamed. As the week goes by and ${his} resistance reduces ${his} body does betray ${him} most of the time. ${He} shakes, moans and shivers at the littlest provocation, which horrifies ${him} to no end. Little does ${he} know that ${his} dosage of aphrodisiacs has being increased every time ${he} is injected and are more effective now that the lack of sleep takes a toll on ${his} body. ${He} hates ${himself} for being unable to control the shameful things ${his} body demands and bursts into tears when ${his} pelvis thrusts the minute the fringes are moved by the wind and caresses ${his} body or the necklace rubs on ${his} nipples. By the end of the week ${he} cannot handle it and tries to touch ${himself} when the arousal becomes too much, which is often. ${He} seems ashamed of ${his} actions and often ${he} breaks out in tears as ${he} tries to masturbate. ${He} remains ${his} time left on penance in the bottom of the cage sobbing as ${his} body keeps as much of the energy it can only interrupted by the moans ${he} can no longer control and the shivers to run through ${his} body when the aphrodisiacs overwhelmed ${him}.`); + } else if (sacrifice.sexualFlaw === "attention whore") { + r.push(`${He} seems to enjoy all the attention ${he} receives every time ${he} tries to find release as the citizens passing by scream at ${him} for ${his} lack of faith and takes special care in showing ${his} body to the audience. ${He} rejoices with the reactions of the citizens as they gasp and point while ${he} shakes and moans. The first time the tea is offered to ${him} ${he} refuses it hoping to get a reaction out of the crowd. As a way to keep ${his} penance in accordance to the suffering the goddess demands, after the first night is over ${he} is informed that due to ${his} good behavior ${he} has been granted the chance to finish ${his} penance in private. ${He} curses and swears, fighting with all of ${his} strength to be left where ${he} is. ${He} is taken out by forced and pinned to the floor to be immobilized. ${He} is blindfolded and taken to a minuscule room nearby while ${he} cries and tries to resist. Once inside ${he} is left to ${himself}, ${his} only contact with another person is the slave appointed to ${his} care who enters to administer the aphrodisiacs when required, when ${his} ration of tea is left on the room or when ${he} falls sleep and is required to be awake. Little does ${he} know the room is filled with hidden cameras which are connected to a big screen installed where ${his} cage was as the penance must be public. As the week goes by ${he} is left to deal with the hunger, the lack of sleep and the constant need for release which ${he} can no longer control. By the end of the week ${he} cannot stand up and remains on the bottom of the room, saving ${his} strength and sobbing.`); + } else if (sacrifice.sexualFlaw === "self hating") { + r.push(`As week starts ${he} tries to fulfill ${his} duty, fighting the urge to touch ${himself} and drinking just when ${he} needs to, hoping that by following the rules the penance of such an unworthy slave will be enough to please the goddess. As the week progresses ${his} resolution reduces. ${He} soon discovers how efficient a chastity belt could be when, once completely overpowered by ${his} need of release ${he} tried to touch ${himself} fearing the wrath of the goddess for ${his} lack of strength. ${His} body shakes and twitches more frequently as the aphrodisiacs run through ${his} body. ${He} blames ${himself} for not being able to keep ${himself} in control. ${His} pelvis thrusts every time the airs provides extra stimulation that produces sexual frustration and tries to stop it by banging ${his} head against the cage's bars. ${He} soon needs to be immobilized to avoid damage. As ${he} lies down on the cage's floor ${he} blames ${himself} and hating ${his} inability to fulfill ${his} task. The lack of food has taken a toll on ${him} too as ${he} often refuses to drink thinking the dehydration is well deserved. As a result, ${he} is forced to drink several times a day which seems to infuriate ${him}. By the end of the week ${he} can hardly stand up as the lack of food and sleep keeps ${him} weak. ${He} remains on the bottom of the cage fed by another slave when it is clear that ${he} needs more liquids in ${his} body and ${his} hours of sleep are over.`); + } else { + r.push(`As ${he} starts to feel the effect of the aphrodisiacs on ${his} body a soft moan leaves ${his} mouth. Soon ${his}`); + if (hasBothLegs(sacrifice)) { + r.push(`legs`); + } else if (!hasAnyLegs(sacrifice)) { + r.push(`stumps`); + } else { + r.push(`leg and stump`); + } + r.push(`are shaking and ${his} body is sweating. ${He} tries to reach down there to relieve ${himself} but ${he} cannot do so. ${He} tries to find a way to reach`); + if (sacrifice.dick !== 0) { + r.push(`${his} dick or ${his} asshole`); + } else { + r.push(`any hole`); + } + r.push(`only to discover how efficient a chastity belt could be. ${He} tries to reach harder, desperately trying to find any kind of release but ${he} is unable. Soon all of ${his} efforts seem focus on removing the chastity belt to no avail. After a few hours, ${he} has finally given up and remains holding the bars of ${his} cage, crying in despair, thrusting over and over again while desperately moaning. ${He} begs for release to anyone who passes by and bursts into tears when ${he} is blatantly ignored. ${He} refuses to drink as ${his} need to cum is stronger. As the week goes by ${his} hunger increases and tries to drink as much of the tea ${he} is provided to try to fool ${his} stomach. As a result of this, the tea is only given to ${him} when it is strictly necessary which seems to infuriate ${him}. By the end of the week ${he} can hardly stand up as the lack of food and sleep keeps ${him} weak. ${He} remains on the bottom of the cage fed by another slave when it is clear that ${he} needs more liquids in ${his} body and ${his} hours of sleep are over.`); + } + } + + r.push(`Once the time for penance is over, ${he} is carried out of the cage, as ${he} is too weak to support ${his} own weight. After a short ceremony, ${he} is taken back to the penthouse to rest.`); + if (sacrifice.lactation > 1) { + r.push(`${His} breasts are grotesquely bloated, super sensitive and leaking milk from a week of neglected hyper-lactation.`); + sacrifice.boobsMilk += 50*sacrifice.lactationAdaptation; + sacrifice.boobs += sacrifice.boobsMilk; + } else if (sacrifice.lactation > 0) { + r.push(`${His} breasts are hugely swollen from a week of pent up lactation.`); + sacrifice.boobsMilk += 10*sacrifice.lactationAdaptation; + sacrifice.boobs += sacrifice.boobsMilk; + } + healthDamage(sacrifice, 20); + r.push(`The penance put ${his} body through great stress <span class="health dec">which impacted ${his} health.</span>`); + sacrifice.addict = 5; + sacrifice.clothes = "no clothing"; + + if (sacrifice.devotion > 50) { + if (sacrifice.fetishKnown === 1 && sacrifice.fetishStrength > 60 && sacrifice.fetish !== "none") { + if (fetishChangeChance(sacrifice) > random(0, 100)) { + sacrifice.fetishStrength = 10; + sacrifice.fetishKnown = 1; + sacrifice.fetish = "masochist"; + sacrifice.devotion += 4; + sacrifice.trust += 4; + r.push(`${His} successful penance made ${him} <span class="trust inc">trust</span> and <span class="devotion inc">love</span> you more as ${he} has proved both to you and the goddess how good of a slave ${he} is.`); + } else if (sacrifice.fetish === "masochist") { + sacrifice.devotion += 6; + sacrifice.trust += 6; + r.push(`The constant pain you submitted ${him} to during ${his} penance made ${him} <span class="trust inc">trust</span> and <span class="devotion inc">love</span> you more.`); + sacrifice.fetishStrength += 4; + } else if (sacrifice.fetish === "cumslut") { + sacrifice.fetishStrength -= 2; + } else if (sacrifice.fetish === "humiliation") { + sacrifice.devotion += 6; + sacrifice.trust += 6; + r.push(`The constant humiliation during ${his} penance made ${him} <span class="trust inc">trust</span> and <span class="devotion inc">love</span> you more as ${he} has proved both to you and the goddess how good of a slave ${he} is.`); + sacrifice.fetishStrength += 3; + } else if (sacrifice.fetish === "buttslut") { + sacrifice.fetishStrength -= 2; + } else if (sacrifice.fetish === "boobs") { + sacrifice.fetishStrength -= 2; + } + } else { + sacrifice.devotion += 5; + sacrifice.trust += 5; + r.push(`${He} now understands the importance of ${his} role as a pennant slave, ${his} commitment to you and the goddess makes ${him} <span class="trust inc">trust</span> and <span class="devotion inc">love</span> you more.`); + } + } else if (sacrifice.devotion > 20 || (sacrifice.devotion >= -20 && sacrifice.trust < -20 && sacrifice.trust >= -50)) { + if (sacrifice.fetishKnown === 1 && sacrifice.fetishStrength > 60 && sacrifice.fetishStrength > 60 && sacrifice.fetish !== "none") { + if (fetishChangeChance(sacrifice) > random(0, 100)) { + sacrifice.fetishKnown = 1; + sacrifice.fetish = "masochist"; + } + if (sacrifice.fetish === "submissive") { + sacrifice.devotion += 3; + sacrifice.trust += 3; + r.push(`The constant submission ${he} was subjected under your orders made ${him} <span class="trust inc">trust</span> and <span class="devotion inc">love you more.</span>`); + sacrifice.fetishStrength += 6; + } else if (sacrifice.fetish === "masochist") { + sacrifice.devotion += 3; + sacrifice.trust += 3; + r.push(`The constant abuse ${he} was subjected under your orders made ${him} <span class="trust inc">trust</span> and <span class="devotion inc">love you more.</span>`); + } else if (sacrifice.fetish === "cumslut") { + sacrifice.fetishStrength -= 2; + } else if (sacrifice.fetish === "humiliation") { + sacrifice.devotion += 3; + sacrifice.trust += 3; + r.push(`The constant humiliation ${he} was subjected under your orders made ${him} <span class="trust inc">trust</span> and <span class="devotion inc">love you more.</span>`); + sacrifice.fetishStrength += 6; + } else if (sacrifice.fetish === "buttslut") { + sacrifice.fetishStrength -= 2; + } else if (sacrifice.fetish === "boobs") { + sacrifice.fetishStrength -= 2; + } + } else { + r.push(`${He} now understands the importance of ${his} role as a pennant slave, ${his} commitment to you and the goddess. ${He} neither trusts nor loves you more any more or less.`); + } + if (sacrifice.sexualFlaw === "hates oral") { + sacrifice.devotion -= 5; + sacrifice.trust -= 5; + r.push(`The constant abuse to ${his} mouth for ${his} feedings and the pain you subject ${him} to makes ${him} <span class="trust dec">trust you less</span> and <span class="devotion dec">hate you more.</span>`); + sacrifice.fetishStrength -= 5; + } else if (sacrifice.sexualFlaw === "hates anal") { + sacrifice.devotion -= 5; + sacrifice.trust -= 5; + r.push(`${His} constant need of release without the chance to stimulate ${his} ass and the pain you subject ${him} to made ${him} <span class="trust dec">trust you less</span> and <span class="devotion dec">hate you more.</span>`); + sacrifice.fetishStrength -= 2; + } else if (sacrifice.sexualFlaw === "shamefast") { + sacrifice.devotion -= 5; + sacrifice.trust -= 5; + r.push(`The constant exposure of ${his} naked body through the bars to anyone willing to see ${him} and the pain you subjected ${him} to made ${him} <span class="trust dec">trust you less</span> and <span class="devotion dec">hate you more.</span>`); + sacrifice.fetishStrength -= 4; + } else if (sacrifice.sexualFlaw === "self hating") { + sacrifice.devotion -= 5; + sacrifice.trust -= 5; + r.push(`The constant deprivation of food, sleep and sexual release made ${him} hate ${himself} more. As a result ${he} <span class="trust dec">trusts you less</span> and <span class="devotion dec">hates you more.</span>`); + sacrifice.fetishStrength += 7; + } else if (sacrifice.sexualFlaw === "repressed") { + sacrifice.fetishStrength -= 2; + // r.push(`The constant shame ${he} was subjected in such a public way made ${him} <span class="devotion dec">trust you less</span> and <span class="devotion inc">hate you more.</span>`); TODO: FIXME + } else { + sacrifice.devotion -= 5; + sacrifice.trust -= 5; + r.push(`The lack of food, sleep and the constant arousal with the chastity belt made ${him} <span class="trust dec">trust you less</span> and <span class="devotion inc">hate you more.</span>`); + } + } else if (sacrifice.trust < -20) { + if (sacrifice.fetish !== "none") { + if (fetishChangeChance(sacrifice) > random(0, 100)) { + sacrifice.fetishStrength = 10; + sacrifice.fetishKnown = 1; + sacrifice.fetish = "masochist"; + } + } + } + if (sacrifice.sexualFlaw === "hates oral") { + sacrifice.devotion -= 7; + sacrifice.trust -= 7; + r.push(`The constant abuse of ${his} mouth for feedings and the pain you subjected ${him} to made ${him} <span class="trust dec">trust you less</span> and <span class="devotion dec">hate you more.</span>`); + sacrifice.fetishStrength -= 6; + } else if (sacrifice.sexualFlaw === "shamefast") { + sacrifice.devotion -= 7; + sacrifice.trust -= 7; + r.push(`The constant exposure of ${his} naked body through the bars to anyone willing to see ${him} and the pain you subjected ${him} to makes ${him} <span class="trust dec">trust you less</span> and <span class="devotion dec">hate you more.</span>`); + sacrifice.fetishStrength -= 5; + } else if (sacrifice.sexualFlaw === "repressed") { + sacrifice.devotion -= 7; + sacrifice.trust -= 7; + r.push(`The constant shame ${he} was subjected in such a public way makes ${him} <span class="trust dec">trust you less</span> and <span class="devotion dec">hate you more.</span>`); + } else if (sacrifice.sexualFlaw === "attention whore") { + sacrifice.devotion -= 7; + sacrifice.trust -= 7; + r.push(`${He} <span class="trust dec">trust you less</span> and <span class="devotion dec">hate you more</span> for spoiling ${his} chance for attention and depriving ${him} of ${his} audience.`); + sacrifice.fetishStrength += 2; + } else if (sacrifice.sexualFlaw === "self hating") { + sacrifice.devotion -= 7; + sacrifice.trust -= 7; + r.push(`The constant deprivation of food, sleep and sexual release made ${him} hate ${himself} more. As a result ${he} <span class="trust dec">trust you less</span> and <span class="devotion dec">hate you more.</span>`); + sacrifice.fetishStrength += 5; + } else { + sacrifice.devotion -= 3; + sacrifice.trust -= 3; + r.push(`The lack of food, sleep and the constant arousal with the chastity belt made ${him} <span class="trust dec">trust you less</span> and <span class="devotion dec">hate you more.</span>`); + } + if (V.arcologies[0].FSAztecRevivalist !== "unset" && V.arcologies[0].FSAztecRevivalist < 100) { + V.arcologies[0].FSAztecRevivalist += 1; + } + V.slavesSacrificedThisWeek = (V.slavesSacrificedThisWeek || 0) + 1; + + App.Events.addParagraph(frag, r); + return frag; +}; diff --git a/src/futureSocieties/fsDecoration.js b/src/futureSocieties/fsDecoration.js index 7861241d48ae57bb351a16903a3729b531e4cb72..9547267c3e33721f2da7da5748a372369fb4455f 100644 --- a/src/futureSocieties/fsDecoration.js +++ b/src/futureSocieties/fsDecoration.js @@ -3,10 +3,6 @@ */ App.UI.facilityRedecoration = function() { const el = new DocumentFragment(); - /** - * @type {Map<string, string>} - */ - const activeFacilities = new Map([]); const options = new App.UI.OptionsGroup(); const arc = V.arcologies[0]; @@ -15,53 +11,7 @@ App.UI.facilityRedecoration = function() { const applicableFS = FutureSocieties.activeFSes(arc).filter(name => (arc[name] > 20)); const decorationNames = Array.from(applicableFS, FS => FutureSocieties.decorationName(FS)).filter(Boolean); - if (V.brothel > 0) { - activeFacilities.set(V.brothelName, "brothelDecoration"); - } - - if (V.club > 0) { - activeFacilities.set(V.clubName, "clubDecoration"); - } - - if (V.dairy > 0) { - activeFacilities.set(V.dairyName, "dairyDecoration"); - } - - if (V.farmyard > 0) { - activeFacilities.set(V.farmyardName, "farmyardDecoration"); - } - - if (V.spa > 0) { - activeFacilities.set(V.spaName, "spaDecoration"); - } - - if (V.nursery > 0) { - activeFacilities.set(V.nurseryName, "nurseryDecoration"); - } - - if (V.clinic > 0) { - activeFacilities.set(V.clinicName, "clinicDecoration"); - } - - if (V.schoolroom > 0) { - activeFacilities.set(V.schoolroomName, "schoolroomDecoration"); - } - - if (V.cellblock > 0) { - activeFacilities.set(V.cellblockName, "cellblockDecoration"); - } - - if (V.servantsQuarters > 0) { - activeFacilities.set(V.servantsQuartersName, "servantsQuartersDecoration"); - } - - if (V.arcade > 0) { - activeFacilities.set(V.arcadeName, "arcadeDecoration"); - } - - if (V.masterSuite > 0) { - activeFacilities.set(V.masterSuiteName, "masterSuiteDecoration"); - } + const activeFacilities = Object.values(App.Entity.facilities).filter(f => f.isDecorated && f.established); // dummy variable to make sure the first option is selected by default const currentSelected = {value: "none"}; @@ -77,10 +27,10 @@ App.UI.facilityRedecoration = function() { let totalCost = 0; if (value === "even") { // Cycles through the list of available FS decorations, and distributes them to facilities round robin style. let i = 0; - for (const decoration of activeFacilities.values()) { - if (V[decoration] !== decorationNames[i]) { + for (const facility of activeFacilities) { + if (facility.decoration !== decorationNames[i]) { totalCost += 5000; - V[decoration] = decorationNames[i]; + facility.decoration = decorationNames[i]; } i++; if (i >= decorationNames.length) { @@ -88,11 +38,11 @@ App.UI.facilityRedecoration = function() { } } } else if (value !== "none") { - for (const decoration of activeFacilities.values()) { + for (const facility of activeFacilities) { if (value !== "standard") { totalCost += 5000; } - V[decoration] = value; + facility.decoration = value; } } if (totalCost > 0) { @@ -100,8 +50,8 @@ App.UI.facilityRedecoration = function() { } }).pulldown(); - for (const [name, decoration] of activeFacilities) { - options.addOption(`The decoration style of ${name} is`, decoration) + for (const facility of activeFacilities) { + options.addOption(`The decoration style of ${facility.name} is`, "decoration", facility) .addValue("Standard", "standard") .addValueList(decorationNames) .addCallbackToEach(value => { diff --git a/src/futureSocieties/futureSociety.js b/src/futureSocieties/futureSociety.js index 91021b60b48376800d0a5bc197d91007d1df6018..be020a5b19869e7ea5ce2a0a4e1f55e4e762ad51 100644 --- a/src/futureSocieties/futureSociety.js +++ b/src/futureSocieties/futureSociety.js @@ -406,47 +406,41 @@ globalThis.FutureSocieties = (function() { /* call as FutureSocieties.DecorationCleanup() */ function DecorationCleanup() { - ValidateFacilityDecoration("brothelDecoration"); - ValidateFacilityDecoration("dairyDecoration"); - ValidateFacilityDecoration("clubDecoration"); - ValidateFacilityDecoration("servantsQuartersDecoration"); - ValidateFacilityDecoration("schoolroomDecoration"); - ValidateFacilityDecoration("spaDecoration"); - ValidateFacilityDecoration("clinicDecoration"); - ValidateFacilityDecoration("arcadeDecoration"); - ValidateFacilityDecoration("cellblockDecoration"); - ValidateFacilityDecoration("masterSuiteDecoration"); - ValidateFacilityDecoration("nurseryDecoration"); - ValidateFacilityDecoration("farmyardDecoration"); + for (const facility of Object.values(App.Entity.facilities).filter(f => f.isDecorated)) { + ValidateFacilityDecoration(facility); + } } /** helper function, not callable externally - * @param {string} decoration should be passed as "facilityDecoration" in quotes. For example, ValidateFacilityDecoration("brothelDecoration"). The quotes are important, do not pass it as a story variable. + * @param {App.Entity.Facilities.Facility} facility */ - function ValidateFacilityDecoration(decoration) { + function ValidateFacilityDecoration(facility) { // Backwards compatibility, do not remove - if (V[decoration] === "Hedonism" || V[decoration] === "Hedonistic Decadence") { - V[decoration] = "Hedonistic"; - } else if (V[decoration] === "Repopulation Focus") { - V[decoration] = "Repopulationist"; - } else if (V[decoration] === "Neo Imperialist") { - V[decoration] = "Neo-Imperialist"; + // @ts-ignore BC + if (facility.decoration === "Hedonism" || facility.decoration === "Hedonistic Decadence") { + facility.decoration = "Hedonistic"; + // @ts-ignore BC + } else if (facility.decoration === "Repopulation Focus") { + facility.decoration = "Repopulationist"; + // @ts-ignore BC + } else if (facility.decoration === "Neo Imperialist") { + facility.decoration = "Neo-Imperialist"; } - const activeFS = DecoToFSMap.get(V[decoration]); // gets the property name + const activeFS = DecoToFSMap.get(facility.decoration); // gets the property name - if (V[decoration] === "standard") { + if (facility.decoration === "standard") { // nothing to do } else if (activeFS === undefined) { // eslint-disable-next-line no-console - console.log(`Error: $${decoration} is ${V[decoration]}`); - V[decoration] = "standard"; + console.log(`Error: ${facility.nameCaps} decoration is ${facility.decoration}`); + facility.decoration = "standard"; } else if (!Number.isFinite(V.arcologies[0][activeFS])) { if (V.arcologies[0][activeFS] !== "unset") { // eslint-disable-next-line no-console console.log(`Error: $arcologies[0].${activeFS} is ${V.arcologies[0][activeFS]}`); } - V[decoration] = "standard"; + facility.decoration = "standard"; } } diff --git a/src/gui/Encyclopedia/encyclopedia.tw b/src/gui/Encyclopedia/encyclopedia.tw index 75cb8e94e7c6cacb1a3639306d037c0c2706c386..8bec530a64d37e17818470fdcf6d9474fbbfb5be 100644 --- a/src/gui/Encyclopedia/encyclopedia.tw +++ b/src/gui/Encyclopedia/encyclopedia.tw @@ -52,179 +52,8 @@ $encyclopedia </div> /********** -PLAYING FREE CITIES +Design Your Master TODO unify with "Design Your Master" article **********/ -<<case "Playing Free Cities">> - Welcome to the Free Cities, <<= PlayerName()>>! - - <br><br> - //Future room for lore text// - - <br><br> - Choose a more particular entry below: - <br> - -<<case "First Game Guide">> - Unfortunately, Twine doesn't have a solid tooltip system at the moment. So, a certain amount of confusion is to be expected. Sorry about that. Flip through the encyclopedia, or at least this gameplay section. It answers a lot of frequently asked questions, and if you read it you can save yourself the trouble of asking your frequently asked question on /d/ or the blog and getting told to read the encyclopedia. If you've still got questions, start a game and read what it says. The game is reasonably good about telling you what's happening to your slaves, and why. It bears repetition that almost all stat effects are called out with colored text. Try this opening strategy if you don't know where to start. It isn't an optimal build, but it works reliably and will show you the basics. - - <br><br>__Starting options__ - <br> Start the game and select any of the world options; choose normal difficulty, since it's pretty forgiving and this opener will make good @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>.@@ Build a completely male PC for your first game; it makes @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ maintenance much easier. Choose wealth for both your career and your rumored method of obtaining the arcology; the other options are fun but a full wealth build will set you up quickly to get started. - - <br><br>Now, customize your starting slaves. - <br>For your first, make her as @@.cyan;intelligent, educated,@@ and old as possible. Make her @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devoted", "From Rebellious to Devoted")>>,@@ but save @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>@@ by giving her flaws, an unknown fetish, and @@.gold;making her afraid of you.@@ (These are easy to fix.) You can customize the rest of her as you wish, but try to keep her under ;@@.yellowgreen;<<print cashFormat(5000)>>.@@ Don't worry about skills, since with two of them you'll be able to rotate Head Girl duty so the other can learn skills. Commit her, base another slave off her, and commit that one too. Those are your <<= App.Encyclopedia.Dialog.linkSC("Head Girls", "Head Girl")>>. - - <br> Spend the rest of your @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>@@ on prospects: slaves that are @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("cheap", "Money")>>@@ now, but can be improved quickly. As long as you keep @@.hotpink;devotion@@ pretty high, low @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ can be fixed reliably. Unknown fetishes, emaciated or fat, flaws, deep voice, and poor skills are all good ways to drive prices down, and can all be fixed quickly. Virginities are a bad idea because they drive costs up and are easy to break. @@.cyan;Education@@ can take awhile and will take slaves away from other jobs, so make them all educated for now, and keep their @@.cyan;intelligence@@ reasonably high. - - <br><br>__First turn__ - <br> Assign one of your Head Girls to be ''the'' Head Girl and make the other whore. Assign everyone else to whore. The <<= App.Encyclopedia.Dialog.linkSC("rules assistant", "Rules Assistant")>> will speed things up a lot when you know the basics, but leave it off for now; it's easy to miss a lot of stuff if you set it up without a bit of experience. Go through your girls one by one and experiment with their options, but anyone who's @@.hotpink;Accepting@@ or better should get nice clothes, accessories, and <<= App.Encyclopedia.Dialog.linkSC("living conditions", "Living Conditions")>>; anyone who's not should not. When slaves tip over into @@.hotpink;Accepting,@@ switch them over from bedrolls and uncomfortable straps; until then, the good life is a waste of @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>@@ and will spoil them. Give @@.health.dec;unhealthy@@ slaves curatives, and give everyone hormones, since they're @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("cheap", "Money")>>@@ and have good front end benefits. Get everyone working out or dieting to reach a basic fitness level and an attractive (not @@.red;red@@) <<= App.Encyclopedia.Dialog.linkSC("weight", "Weight")>>. Sell the girl(s) your predecessor left behind for seed @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>,@@ and choose the most profitable option; there are ways to maximize this, but worry about that later. Check out the arcology management menu. You should have the @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>@@ to upgrade the security systems, build the <<= App.Encyclopedia.Dialog.linkSC("Head Girl suite", "Head Girl Suite")>>, and to buy the kitchen upgrade; this will make dieting work faster. Check out the slave market, and buy a single bargain slave: @@.yellowgreen;<<print cashFormat(2000)>>@@ is good. Put her in the suite: if she won't go, abuse her until she will. Open the personal attention menu, and fix your Head Girl's flaws; softening is powerful but it takes longer and we're focusing on the basics. ''Save the game'' and end the turn. - - <br><br>__The end turn report__ - <br> Read this, and note all the colored text. Pay particular attention to @@.red;red,@@ @@.gold;gold,@@ or @@.mediumorchid;orchid@@ text; these are generally bad. Being a slave whore is a hard life, and some trouble is inevitable. But take particular note of things like slaves losing <<= App.Encyclopedia.Dialog.linkSC("health", "Health")>>, becoming <<= App.Encyclopedia.Dialog.linkSC("fearful", "Trust")>>, or <<= App.Encyclopedia.Dialog.linkSC("hating", "From Rebellious to Devoted")>> you due to their <<= App.Encyclopedia.Dialog.linkSC("rules", "Rules Assistant")>>, <<= App.Encyclopedia.Dialog.linkSC("conditions", "Living Conditions")>>, or other slaves — these things you can control. Reload your save and fiddle around with the options to address these areas. (The Head Girl's girl may have a rough time; you can't affect that.) Since your Head Girl has her own slave to help her around the house, she'll work with two of your slaves. - - <br><br>__Economics and events__ - <br> The economics report offers some flavor, but you should leave the options it offers alone until you've got some spare cash. An event or two will follow; feel free to reload the page on each (F5 on most browsers) to see what the different options do. Generally, try to pick options that give you @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>@@ and improve @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>.@@ @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("Trust", "Trust")>>@@ and @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ can wait. - - <br><br>__Moving forward__ - <br> Hopefully, many of your slaves learned skills during their week of <<= App.Encyclopedia.Dialog.linkSC("whoring", "Whoring")>>. Three levels of skill (@@.cyan;Veteran Whore@@ or @@.cyan;W+++@@ for example) is the maximum, though slaves without vaginas will only acquire two complete levels of sexual skills. As you move through the first ten weeks or so, many of your slaves will max out their whoring and sexual skills. When they do, switch them over to <<= App.Encyclopedia.Dialog.linkSC("public service", "Public Service")>> until they achieve maximum <<= App.Encyclopedia.Dialog.linkSC("entertainment skill", "Entertainment Skill")>>, and then put them back on whoring, since cross training will improve their whoring performance. When your Head Girl alternate has maxed skills, make her the Head Girl and train up the MILF she replaced. Switch your personal attention around; for now, fix the <<= App.Encyclopedia.Dialog.linkSC("quirks", "Quirks")>> of the most @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devoted", "From Rebellious to Devoted")>>@@ slave who has any, since that's the best way to maximize your chances of success each turn. - - <br> Pay attention to your cash flow. If it's positive and you have a decent buffer of @@.yellowgreen;<<print cashFormat(10000)>>@@ or so built up, wait for the slave market prices to naturally dip, and then purchase a girl or two to work on once your starting stable is well trained, though you may have to confine or rest new purchases for a while if they're @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("rebellious", "From Rebellious to Devoted")>>@@ or sick. If you get a virgin, consider applying chastity to preserve value for resale. When prices are high, consider selling anyone who's free of flaws and has a discovered sexual fetish, since this maximizes value bonuses. Within ten turns, you should be making decent weekly profit, with resale of slaves building up your bank when prices favor sale. Once you're confident of the whoring mechanics, consider building a <<= App.Encyclopedia.Dialog.linkSC("brothel", "Brothel")>>. Your alternate Head Girl will make a good <<= App.Encyclopedia.Dialog.linkSC("madam", "Madam")>>. - -<<case "How to Play">> - This is not a game in which the PC slaveowner is some magical sexual god whose mere presence turns women into submissives. This means that sane slaves will tend to lose obedience and @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ over time if you don't take any steps to maintain their mental state. Mental stats have maximum and minimum values. These are somewhat 'sticky,' so slaves at minimum @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@ for example may require an extra jolt to break free of this state. - - <br><br>Maximized @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@ and @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ are not useless; if one of these stats is maximized and the other is not, the extra @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@ or @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ will boost the other. If both are maximized, the player gains @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ instead. - - <br><br>However if both are low the slave in question is liable to experience breakdowns and generally be useless. - - <br><br>A slave's health is extremely important. Being healthy generally improves beauty and job performance. Most transformative drugs and surgeries can damage health, while curative drugs and rest will restore it. Extremely unhealthy slaves can die, while extremely healthy slaves enjoy considerable bonuses on many assignments. Health damage is generally scaled to a slave's current health, so if a slave is already unhealthy, injuries will hurt her more severely. Pulling a slave with red health indicators off work for a week of rest is generally advisable. - - <br><br>The first button in the left-side UI bar will always continue the game without taking any actions. If you wish to advance the game rapidly, click that button repeatedly. If you are presented with a menu and do not wish to select any of the options, that button will also serve as a none of the above choice. ''The spacebar will also advance the game.'' - - <br><br>The author has played several otherwise good H-Games in which it can be hard to parse exactly what the flavor descriptions mean in terms of stats. Therefore, this game will usually flag stat impacts in descriptions by means of colored text. For example: - <br> @@.green;Green text@@ means something good, like a @@.health.inc;healthy.@@ slave - <br> @@.red;Red text@@ means something bad, like a sick or injured slave. - <br> @@.yellow;Yellow text@@ means something neutral but noteworthy. - <br> @@.hotpink;Hot pink text@@ means an increase in a slave's regard for to you. - <br> @@.mediumorchid;Orchid text@@ means a decrease in a slave's regard for to you. - <br> @@.mediumaquamarine;Aquamarine text@@ means an increase in a slave's @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ of to you, and a reduction in her fear of you. - <br> @@.gold;Gold text@@ means a decrease in the slave's @@.gold;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ of you, and an increase in her fear of you. - <br> @@.orangered;Orange-red text@@ means a decrease in a hateful slave's fear of you. - <br> @@.lime;Lime text@@ means something has grown or improved, which is usually, but not always, good. - <br> @@.orange;Orange text@@ means something has shrunk or degraded, which is usually, but not always, bad. - <br> @@.yellowgreen;Yellow-green text@@ is for a @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>@@-related event. - <br> @@.coral;Coral text@@ is used for simple identifiers that can be used to check a slave's general type at a glance, also weakening fetishes. - <br> @@.lightcoral;Light coral text@@ is used when a slave's fetish strengthens or develops. - <br> @@.lightgreen;Light green text@@ is used to indicate positive relationships. - <br> @@.lightsalmon;Light salmon text@@ is used when a rivalry develops or strenghtens. - <br> @@.libido.inc;Violet text@@ means an increase in sex drive. - <br> @@.libido.dec;Khaki text@@ means a decrease in sex drive. - - <br><br>__It is important to note__ that if a scene doesn't have colored text, it doesn't impact a slave's stats. For example, the short sex scenes available from the main screen are for the most part unlimited and have no real gameplay effect: they are for fun and flavor only. - - <br><br>This game produces less visible text than a lot of text-based H-Games; this is because most text has numerous variations that change based on a slave's body, mental state etc. The author has deliberately made some of the variations available only with extreme stats so that new content will still be out there even if you play for a while. - - <br><br>Things that increase income from <<= App.Encyclopedia.Dialog.linkSC("prostitution", "Whoring")>>, @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ gain from <<= App.Encyclopedia.Dialog.linkSC("slutting", "Public Service")>>, and performance in most jobs include all appearance stats (that's right, every one; though some are more or less important), <<= App.Encyclopedia.Dialog.linkSC("sexual skills", "Skills")>>, a slave's <<= App.Encyclopedia.Dialog.linkSC("health", "Health")>>, and the state of a slave's holes. Going from a novice to a veteran whore will have non-linear impacts on income, since a novice will get good @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>@@ for being fresh and little @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>@@ for her skills, and a veteran will get the reverse. The <<= App.Encyclopedia.Dialog.linkSC("fetishes", "Fetishes")>> and physical statuses that get pink text on the main menu (huge tits, bisexual, etc.) give bonuses. - - <br><br>The game is not intended to be crushingly difficult, but it is balanced so that in order to achieve some of the best event outcomes, and eventually in order to survive, the player must build a business empire that turns a significant profit. Profits are necessary because the player will want to be able to make some major expenditures in the late game. Buy low, sell high, and always try to improve your slaves. Even something as simple as a few weeks' personal attention to fix <<= App.Encyclopedia.Dialog.linkSC("mental flaws", "Flaws")>> and boost @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@ can produce significant profits when a slave is resold. - - -<<case "Keyboard Shortcuts">> - The uppermost button (in events and reports it continues the game, while in menus it functions as a back button) in the left-side UI bar can be activated via context sensitive keybinds; ''<<print App.UI.Hotkeys.hotkeys("endWeek")>>'' is used to end the week from the main menu, and ''<<print App.UI.Hotkeys.hotkeys("nextLink")>>'' is used to continue in all other situations. - - <br><br>Within slaves' individual menus ''<<print App.UI.Hotkeys.hotkeys("prev-slave")>>'' will move to the last slave and ''<<print App.UI.Hotkeys.hotkeys("next-slave")>>'' to the next. - - <br>Review your personal affairs with ''<<print App.UI.Hotkeys.hotkeys("Manage Personal Affairs")>>'' and weekly actions with ''<<print App.UI.Hotkeys.hotkeys("Personal Attention Select")>>''. - <br>''<<print App.UI.Hotkeys.hotkeys("Rules Assistant")>>'' will open RA Rules. - <br>''<<print App.UI.Hotkeys.hotkeys("Manage Arcology")>>'' will open arcology management. - <br>''<<print App.UI.Hotkeys.hotkeys("Options")>>'' will opens the options menu. - <br>''<<print App.UI.Hotkeys.hotkeys("Buy Slaves")>>'' will open the slave markets. - <br>''<<print App.UI.Hotkeys.hotkeys("BG Select")>>'' will open Bodyguard management. - <br>''<<print App.UI.Hotkeys.hotkeys("Future Society")>>'' will open Future Societies. - <br>''<<print App.UI.Hotkeys.hotkeys("Manage Penthouse")>>'' will open Manage Penthouse. - - <br>''<<print App.UI.Hotkeys.hotkeys("Manage Penthouse")>>'' will ''only open'' Head Girl management on the main page. - - <br><br>Nearly every key can be rebound in Hotkey Settings which can be accessed in game via SideBar -> Options -> Hotkey Settings. - <<includeDOM App.UI.DOM.linkReplace(" Modify/review them now", App.UI.Hotkeys.settings())>> -<<case "The Arcology Interface">> - The Arcology Interface is the large table-based display at the top of the main menu. It's designed as an abstract representation of the arcology. - - <br><br>It is divided into levels and sectors. Levels are the horizontal rows. An arcology is a very large building, and each Level includes many floors. Sectors are slices of those levels. For example, on Levels with four Sectors, each sector includes a quarter of each floor that's part of that Level. Each Sector has its own cell in the interface, and each Sector is occupied by facilities, tenants, or both. Each type of Sector occupant is bordered in a different color. The contents of a Sector can be viewed and changed by clicking on the text inside a Sector. - - <br><br>The uppermost level is the Penthouse. It's where the player character and the slaves under their direct supervision live, and it can be upgraded with a number of facilities that can be accessed through shortcuts that are added to the Penthouse in the interface once they're installed. Some of these facilities can house some of the player character's sex slaves. Unlike every other Sector, the Penthouse is always owned by the player and cannot be sold. Every other Sector can be privately owned, reducing the player's control of the arcology. Privately owned Sectors can be purchased, or acquired using @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ if the player character's @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ is extremely high. Privately owned sectors are bordered in red regardless of what's in them. - - <br><br>The next level down, with three Sectors, is the Promenade, which is a major social area and hosts most of the businesses which cater to the arcology's citizens. Promenade Sectors are occupied by Shops by default, which will automatically be filled by business tenants that will pay the player character rent if they own the Sector. Promenade Sectors can be upgraded into <<= App.Encyclopedia.Dialog.linkSC("brothels", "Brothel")>>, <<= App.Encyclopedia.Dialog.linkSC("clubs", "Club")>>, or an enhanced version of shops which will attract business tenants that help advance a specific <<= App.Encyclopedia.Dialog.linkSC("future society", "Future Societies")>> model, and still provide rent. - - <br><br>The next three levels have four sectors and are living areas that are occupied by apartments by default. These house arcology citizens, who pay rent, and who are indirectly very important because they determine the level of local demand for sexual services provided by whores, public servants, and other sex slaves doing sexual jobs. Apartments can be upgraded for either density or luxury. Dense Apartments increase the citizen population, and are therefore useful to keep demand up if the player is relying on selling or giving away sexual services. Luxury apartments increase the arcology's prosperity, and are therefore a better choice if demand for sexual services isn't a priority. - - <br><br>The first level with five Sectors is the Concourse. Like the Promenade, it hosts businesses, but these focus more on bulk trade and less on citizens' luxury needs, and include the arcology's slave markets. Its sectors are occupied by Markets by default, which pay rent. Concourse sectors can be upgraded into a <<= App.Encyclopedia.Dialog.linkSC("pit", "Pit")>> for fighting slaves, an <<= App.Encyclopedia.Dialog.linkSC("arcade", "Arcade")>>, or into a flagship store for the player character's <<= App.Encyclopedia.Dialog.linkSC("corporation", "The Corporation")>>. - - <br><br>The lowest level, also with five Sectors, is the Service level. Its Sectors are occupied by Manufacturing by default, which of course pay rent. If the player is focusing on menial slaves, its Sectors can be upgraded into pens, to increase the total number of <<= App.Encyclopedia.Dialog.linkSC("menial slaves", "Menial Slaves")>> that can be kept in the arcology, or into Sweatshops, to put the labor of menial slaves in the arcology to use. Alternatively, these Sectors can be upgraded into a <<= App.Encyclopedia.Dialog.linkSC("dairy", "Dairy")>>, or into a barracks, which will reduce the weekly upkeep of any mercenaries the player character has hired. - - -<<case "Tips and Tricks">> - Buy low, sell high. - - <br><br>Slaves will sometimes default to the resting assignment after they're done with something else. If a slave is resting and the game suspects that she shouldn't be, her assignment will be ''__@@.lime;lime@@__'', bold, and underlined on the main menu to indicate that. - - <br><br>If a new slave isn't afraid of you, make her. Then and only then build her @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>.@@ - - <br><br>The personal attention assignment should be used tactically. It is the most powerful single way of improving slaves because it's reliable. Devotion and <<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>> gains during a single week are normally capped. However, personal attention removes these caps. This is most powerful for slaves that are already well broken and are enjoying fairly luxurious lives. With so many things driving up devotion and <<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>, using personal attention to remove the caps can quickly maximize both stats. Focusing on business instead (by selecting no slave for personal attention) is also powerful. Doing so produces @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>@@ proportional to the amount of @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>@@ on hand, //and// improves prosperity growth, which improves future income from rents. - -/********** -Design Your Master -**********/ -<<case "Design Your Master">> - This happens at the start of a game of FC: it is not possible to change the PC during the main game. The player must select a career background, a rumored method of acquiring the arcology, and their age group; then choose between some broad body and gender options. - - <br><br>''Wealth'' is a choice for both the ''career background'' and ''rumored method of acquiring the arcology'' options. Both provide you with @@.yellowgreen;<<print cashFormat(10000)>>@@ each for a total of @@.yellowgreen;<<print cashFormat(30000)>>@@ if both are chosen. As a ''background option'' it means that your starting slaves will have two free levels of sex skills available. - - <br><br>__Career background options__ - <br>Being an ex- - <br>''business owner'' (also referred to as capitalist) enhances the business-focused personal attention, increasing the @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>@@ it produces and improving arcology prosperity when business-focused personal attention is selected. Also, your starting slaves will have a free level of prostitution skill available. - Starts having already mastered <<= App.Encyclopedia.Dialog.linkSC("Trading", "PC Skills")>>. - - <br><br>''private security contractor'' (also referred to as a //mercenary background//) greatly reduces the cost of keeping mercenaries in your employ. Your starting slaves will have free @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ available. - Starts having already mastered <<= App.Encyclopedia.Dialog.linkSC("Warfare", "PC Skills")>>. - - <br><br>''slave driver'' enhances slave-focused personal attention, adding bonus @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@ or @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ to many training applications or preventing their loss. Starting slaves will be cheaper, in addition having already mastered <<= App.Encyclopedia.Dialog.linkSC("Slaving", "PC Skills")>>. - - <br><br>''arcology engineer'' provides a significant discount on many @@.yellowgreen;arcology upgrades and expansions.@@ In addition to the arcology starting off with @@.green;basic economic upgrades@@ already installed. Starts having already mastered <<= App.Encyclopedia.Dialog.linkSC("Engineering", "PC Skills")>>. - - <br><br>''doctor'' allows the player character to perform surgery personally, providing a @@.yellowgreen;discount on surgery costs@@ and a @@.green;reduction to resulting health damage.@@ Additionally, slaves may react differently to surgery if the player character performs it and starting slaves will have free implants available. Starts having already mastered <<= App.Encyclopedia.Dialog.linkSC("Medicine", "PC Skills")>>. - - <br><br>''escort'' provides a one-time bonus to a slave's entertainment, whoring, and two sexual skills when a new slave is acquired. Furthermore, society will not take lightly to being run by an ex-whore, and you will receive heavy @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ losses each week. You can spend your free time selling your body for @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("money", "Money")>>,@@ at the cost of a large amount of @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>.@@ - - <br><br>''celebrity'' provides extra @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ at game start. - Starting slaves will have a free level of entertainment skill available. - - <br><br>''servant'' provides a one-time bonus to a slave's @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ and @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>.@@ Furthermore, society will not approve of being run by an ex-servant, and you will face @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ losses each week. You can spend your free time, putting your previous experience to use, by greatly reducing the costs of your penthouse. You also passively reduce costs when not focusing on doing so. - - <br><br>''gang leader'' provides a one-time bonus to a slave's health and a free level of combat skill. Furthermore, society will not approve of being run by a gang-banger, and you will face @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ losses each week. New slaves will likely have heard of your previous exploits and fear you. - You know how to haggle slaves. - You can spend your free time, putting your previous experience to use, proving another source of income however this isn't guaranteed. - - <br><br>''incursion specialist'' provides starting slaves with a free level of @@.cyan;intelligence.@@ Also certain upgrades may be @@.yellowgreen;<<= App.Encyclopedia.Dialog.linkSC("cheaper", "Money")>>@@ and you may find alternative approaches to problems. - Starts having already mastered <<= App.Encyclopedia.Dialog.linkSC("Hacking", "PC Skills")>>. - - <br><br> - Players using the <<= App.Encyclopedia.Dialog.linkSC("Security Expansion", "Security Expansion")>> mod may want to view this page with <<= App.Encyclopedia.Dialog.linkSC("additional details", "Design Your Master in SecExp")>>. - - <br><br>__Rumored acquisition options__ - <br>''Hard Work'' provides a one-time bonus to both @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@ and @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ when a new slave is acquired. - - <br><br>''Force'' means that if a slave does not have enough @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@ to obey when acquired, this option will terrify her and reduce her @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@ to the point where she should comply. - - <br><br>''Social Engineering'' means that you will start with the first societal option unlocked, since you manipulated the arcology's citizens. - - <br><br>''Luck'' provides extra @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ at game start, but no ongoing advantages once the main game begins. - - <br><br>__Age groups__ - <br>Older PCs enjoy easier @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ maintenance, but possess lower <<= App.Encyclopedia.Dialog.linkSC("sexual energy", "Sexual Energy")>> while younger PC's are the opposite. - - <br><br>__Body and gender options__ - <br>All PC body changes will alter scenes, but their main mechanical effect is on @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ maintenance. Feminine options will make it harder to maintain @@.green;<<= App.Encyclopedia.Dialog.linkSC("reputation", "Arcologies and Reputation")>>@@ without providing any gameplay advantage, making playing as a feminine PC a form of increased difficulty. There are other minor gameplay differences including differing slave reactions to the PC based on attraction, but these are fairly minor. - <<case "Design Your Master in SecExp">> This happens at the start of a game of FC: it is not possible to change the PC during the main game. The player must select a career background, a rumored method of acquiring the arcology, and their age group; then choose between some broad body and gender options. @@ -644,13 +473,6 @@ SLAVE ASSIGNMENTS: Choose a more particular entry below: <br> -<<case "Slave Assignments">> - Slave assignments are stratified into ordinary assignments and <<= App.Encyclopedia.Dialog.linkSC("leadership positions", "Leadership Positions")>>. - - <br><br> - Choose a more particular entry below: - <br> - <<case "Career Experience">> Slaves may retain useful experience from their lives before enslavement. Freedom and slavery are so different that the bonuses slaves get are minor. Careers fall into categories, each with its own bonus; these are: @@ -946,62 +768,6 @@ SLAVE ASSIGNMENTS: <<case "Wardeness">> A ''Wardeness'' can be selected once the <<= App.Encyclopedia.Dialog.linkSC("Cellblock", "Cellblock")>> facility is built. Wardenesses increase the rate at which slaves in the cellblock are broken. Very high <<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>, <<= App.Encyclopedia.Dialog.linkSC("nymphomania", "Nymphomania")>> or <<= App.Encyclopedia.Dialog.linkSC("sadism", "Sadists")>>, strong <<= App.Encyclopedia.Dialog.linkSC("muscles", "Musculature")>>, applicable <<= App.Encyclopedia.Dialog.linkSC("career experience", "Career Experience")>>, and a solid dick make a powerful Wardeness. -/********** -SLAVE ASSIGNMENTS (COMMON): -**********/ -<<case "Attending Classes">> - <<includeDOM App.Encyclopedia.renderArticle("attendingClasses")>> - //Associated facility: <<= App.Encyclopedia.Dialog.linkSC("Schoolroom", "Schoolroom")>>// - - -<<case "Confinement">> - <<includeDOM App.Encyclopedia.renderArticle("confinement")>> - //Associated facility: <<= App.Encyclopedia.Dialog.linkSC("Cellblock", "Cellblock")>>// - - -<<case "Fucktoy">> - <<includeDOM App.Encyclopedia.renderArticle("fucktoy")>> - //Associated facility: <<= App.Encyclopedia.Dialog.linkSC("Master Suite", "Master Suite")>>// - - -<<case "Glory Hole">> - <<includeDOM App.Encyclopedia.renderArticle("gloryHole")>> - //Associated facility: <<= App.Encyclopedia.Dialog.linkSC("Arcade", "Arcade")>>// - - -<<case "Milking">> - <<includeDOM App.Encyclopedia.renderArticle("milking")>> - //Associated facility: <<= App.Encyclopedia.Dialog.linkSC("Dairy", "Dairy")>>// - - -<<case "Farming">> - <<includeDOM App.Encyclopedia.renderArticle("farming")>> - //Associated facility: <<= App.Encyclopedia.Dialog.linkSC("Farmyard", "Farmyard")>>// - - -<<case "Public Service">> - <<includeDOM App.Encyclopedia.renderArticle("publicService")>> - //Associated facility: <<= App.Encyclopedia.Dialog.linkSC("Club", "Club")>>// - - -<<case "Rest">> - <<includeDOM App.Encyclopedia.renderArticle("rest")>> - //Associated facilities: <<= App.Encyclopedia.Dialog.linkSC("Spa", "Spa")>>, <<= App.Encyclopedia.Dialog.linkSC("Clinic", "Clinic")>>// - - -<<case "Sexual Servitude">> - <<includeDOM App.Encyclopedia.renderArticle("sexualServitude")>> - - -<<case "Servitude">> - <<includeDOM App.Encyclopedia.renderArticle("servitude")>> - //Associated facility: <<= App.Encyclopedia.Dialog.linkSC("Servants' Quarters", "Servants' Quarters")>>// - - -<<case "Whoring">> - <<includeDOM App.Encyclopedia.renderArticle("whoring")>> - //Associated facility: <<= App.Encyclopedia.Dialog.linkSC("Brothel", "Brothel")>>// - /********** SLAVE SKILLS **********/ diff --git a/src/gui/Encyclopedia/encyclopediaAssignments.js b/src/gui/Encyclopedia/encyclopediaAssignments.js deleted file mode 100644 index 1723d8d59960ba94131a590476db2d14d3956822..0000000000000000000000000000000000000000 --- a/src/gui/Encyclopedia/encyclopediaAssignments.js +++ /dev/null @@ -1,111 +0,0 @@ -/* TODO: add entries for Nursery */ - -App.Encyclopedia.Assignments = class Assignments extends App.Encyclopedia.EncyclopediaCategory { - attendingClasses() { - return App.UI.DOM.combineNodes( - this.topic("Attending classes"), - " is an assignment which educates the slave, raising intelligence if possible. Being educated raises value and is useful for some jobs and leadership positions." - ); - } - - confinement() { - App.UI.DOM.combineNodes( - this.topic("Confinement"), - " is an assignment which accelerates breaking for disobedient slaves. If a slave isn't obedient enough to work and isn't ", - this.encyLink("unhealthy", "Health"), - " enough to need rest, this will make them useful sooner." - ); - } - - fucktoy() { - return App.UI.DOM.combineNodes( - this.topic("Fucktoy service"), - " is an assignment which keeps the slave close and under the player's eye. It's mostly just for fun, but fucktoys can improve reputation based on their beauty, and the player character's attention can be targeted to areas of the slave's body with possible fetish effects on happy slaves." - ); - } - - gloryHole() { - return App.UI.DOM.combineNodes( - this.topic("Occupying a glory hole"), - " is an assignment which makes money off of slaves regardless of their beauty, skills, or feelings; it's not fun or ", - this.encyLink("healthy", "Health"), - " but very powerful for extracting ¤ out of otherwise useless slaves." - ); - } - - milking() { - const fragment = document.createDocumentFragment(); - - fragment.append( - this.topic("Getting milked"), - " is an assignment which makes money from lactation based on a slave's breasts, ", - this.encyLink("health", "Health"), - " and hormonal status." - ); - if (V.seeDicks > 0) { - fragment.append(" Cows with balls will also give semen."); - } - fragment.append(` Creates profit quickly from slaves with big tits${V.seeDicks ? " or balls" : ""}.`); - - return fragment; - } - - farming() { - const fragment = document.createDocumentFragment(); - fragment.append( - this.topic("Farming"), - " is an assignment which produces ", - this.encyLink("food", "Food"), - " from your slaves' hard work" - ); - if (V.seeBestiality) { - fragment.append(" and allows you to breed slaves with animals"); - } - fragment.append( - ". Can also reduce arcology upkeep with upgrades in the ", - this.encyLink("Farmyard", "Farmyard") - ); - return fragment; - } - - publicService() { - return App.UI.DOM.combineNodes( - this.topic("Public Service"), - " is an assignment which increases reputation based on a slave's beauty, sexual appeal, and skills. Very similar to whoring, but for reputation rather than money." - ); - } - - rest() { - return App.UI.DOM.combineNodes( - this.topic("Rest"), - " is an assignment mostly used to improve ", - this.encyLink("health", "Health"), - ". It can be useful to order slaves you wish to intensively modify to rest, since most modifications damage health. It will synergize with curative treatments, providing bonus healing when both are simultaneously applied." - ); - } - - sexualServitude() { - return App.UI.DOM.combineNodes( - this.topic("Sexual servitude"), - " is an assignment which pleases other slaves by forcing the slave to service them sexually. Useful for driving the targeted slave's ", - this.encyLink("devotion", "Devotion"), - " up quickly." - ); - } - - servitude() { - return App.UI.DOM.combineNodes( - this.topic("Servitude"), - " is an assignment which reduces your upkeep based on the slave's ", - this.encyLink("devotion", "Devotion"), - " Available at lower obedience than other jobs, is insensitive to the quality of a slave's body, and doesn't require skills; a good transitional assignment. Unusually, low sex drive is advantageous as a servant, since it reduces distraction. Lactating slaves are slightly better at this job, since they can contribute to their fellow slaves' nutrition." - ); - } - - whoring() { - return App.UI.DOM.combineNodes( - this.topic("Whoring"), - " is an assignment which makes money based on a slave's beauty, sexual appeal, and skills. Good whores take a long time to train and beautify but become very profitable." - ); - } -}; diff --git a/src/gui/Encyclopedia/encyclopediaBody.js b/src/gui/Encyclopedia/encyclopediaBody.js index 2483b7f7e1e6d7c713f8493767a417f92d7638af..ff8f91b403040c29dec8c5f8a6f56ec5a1111d35 100644 --- a/src/gui/Encyclopedia/encyclopediaBody.js +++ b/src/gui/Encyclopedia/encyclopediaBody.js @@ -1,524 +1,544 @@ -App.Encyclopedia.Anatomy = class Anatomy extends App.Encyclopedia.EncyclopediaCategory { - constructor() { - super(); - this["Body"] = () => { - const fragment = new DocumentFragment(); - App.UI.DOM.appendNewElement("p", fragment, "Future room for lore text", "note"); - App.UI.DOM.appendNewElement("div", fragment, "Choose a more particular entry below:"); - return fragment; - }; - - this["Waist"] = () => { - const fragment = new DocumentFragment(); - const r = []; - r.push(`Slaves'`); - r.push(this.topic("waist")); - r.push(`contributes to beauty. Waists can be altered permanently by corsets over time, or quickly in the surgery. (wiki: needs more technical detail)`); - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Anuses"] = () => { - const fragment = new DocumentFragment(); - const r = []; - r.push(`Slaves'`); - r.push(this.topic("anuses")); - r.push(`are a valuable commodity. Like`); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("vaginas", "Vaginas"), - `,` - )); - r.push(`they appear in four degrees of tightness: virgin and three increasing levels of looseness. Tighter anuses improve performance at sexual assignments, but most methods of learning `); - r.push(App.Encyclopedia.Dialog.linkDOM("anal skill", "Anal Skill")); - r.push(`tend to loosen anuses. Assigning a virgin to sex work will result in a one-time bonus to performance, but may anger her and can result in skipping up one level of looseness. A virgin anus applies a moderate cost multiplier for slave purchase or sale. Anuses can be loosened by events, strenuous sex work, or plug accessories; they can be tightened with rest from strenuous sex work, personal attention, or the autosurgery, though such surgery can reduce`); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("anal skill", "Anal Skill"), - `.` - )); - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Areolae"] = () => { - const fragment = new DocumentFragment(); - const r = []; - r.push(`Slaves'`); - r.push(this.topic("areolae")); - r.push(`can be altered in size or shape through surgery. (wiki: needs more technical detail)`); - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Breasts"] = () => { - const fragment = new DocumentFragment(); - const r = []; - r.push(`Slaves'`); - r.push(this.topic("breasts")); - r.push(`contribute to beauty. They can be enlarged with`); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("XX hormones", "Hormones (XX)"), - `, intense` - )); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("lactation", "Lactation"), - `,` - )); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("weight gain", "Weight"), - `, or surgery (which` - )); - r.push(App.Encyclopedia.Dialog.linkDOM("boob fetishists", "Boob Fetishists")); - r.push(`will be grateful for).`); - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Clits"] = () => { - const fragment = new DocumentFragment(); - const r = []; - r.push(`Slaves'`); - r.push(this.topic("clits")); - r.push(`contribute to beauty. (wiki: needs more technical detail)`); - /*TODO: how are clits tied to dicks, vaginas, and hormones?*/ - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Dicks"] = () => { - const fragment = new DocumentFragment(); - let r = []; - r.push(`Slaves'`); - r.push(this.topic("dicks")); - r.push(`are less straightforward than`); - - r.push(App.Encyclopedia.Dialog.linkDOM("anuses", "Anuses")); - r.push(` or `); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("vaginas", "Vaginas"), `.` - )); - r.push(`At game start, larger dicks reduce slave value, though this can be reduced or even reversed by some future society choices. Slaves will remain capable of erection so long as they retain `); - r.push(App.Encyclopedia.Dialog.linkDOM("testicles", "Testicles")); - r.push(` and are not on `); - r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("female hormone treatments", "Hormones (XX)"), `.`)); - App.Events.addParagraph(fragment, r); - fragment.append(App.Encyclopedia.Dialog.linkDOM("Clits?", "Clits")); - /*TODO: how do dicks and clits relate, future coder?*/ - return fragment; - }; - - this["Ethnicity"] = () => { - const fragment = new DocumentFragment(); - const r = []; - r.push(`Slaves'`); - r.push(this.topic("ethnicity")); - r.push(`affects random slave generation; the game produces bodies according to broad phenotypes. For example, black hair is almost universal among randomly generated Asian slaves. Its only other impact at game start is that white slaves enjoy a minor bonus to beauty, modeling the near-universal reach of western standards of beauty. Racially based future societies can apply ethnic bonuses or penalties to beauty, changing this landscape.`); - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Faces"] = () => { - const fragment = new DocumentFragment(); - let r = []; - for (const [key, shape] of App.Medicine.Modification.faceShape) { - if (shape.hasOwnProperty("requirements") && !shape.requirements) { - continue; - } else { - r.push(App.UI.DOM.makeElement("span", capFirstChar(key), "note")); - r.push(shape.desc); - App.Events.addNode(fragment, r, "div"); - r = []; - } - } - r.push(`Slaves'`); - r.push(this.topic("faces")); - r.push(`contribute heavily to beauty. They occur in six shapes and seven levels of attractiveness, which can be affected by surgery or, if the slave is unattractive or masculine, intensive `); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("XX hormones", "Hormones (XX)"), - `.` - )); - r.push(`Unlike most other attributes, a slave's face cannot be improved more than two steps by surgery. The autosurgery upgrade removes this limitation.`); - App.Events.addParagraph(fragment, r); - r = []; - r.push(App.UI.DOM.makeElement("h2", `Facial shapes and beauty`)); - return fragment; - }; - - this["Height"] = () => { - const fragment = new DocumentFragment(); - const r = []; - r.push(`Slaves'`); - r.push(this.topic("height")); - r.push(`contributes to beauty and improves combat effectiveness. It is measured in`); // TODO link to CE? - if (V.showInches === 2) { - r.push(`inches,`); - } else { - r.push(`centimeters,`); - } - r.push(`though the game handles it in terms of ranges; beyond ${heightToEitherUnit(190)}, all very tall slaves will be treated almost identically. Height can be affected by surgery, and younger slaves can also see minor hormonal impacts on height. Unlike most other attributes, a slave's height cannot be changed more than one step by surgery.`); - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Hips"] = () => { - const fragment = new DocumentFragment(); - const r = []; - r.push(`Slaves'`); - r.push(this.topic("hips")); - r.push(`contribute to beauty. (wiki: needs more technical detail)`); - /*TODO: how are clits tied to dicks, vaginas, and hormones?*/ - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Lactation"] = () => { - const fragment = new DocumentFragment(); - const r = []; - r.push(`Slaves can begin to`); - r.push(this.topic("lactate")); - r.push(`two ways: naturally due to pregnancy or constant stimulation, or artificially, through surgical implantation of a slow-release lactation-inducing drug pellet. Drug-induced lactation is more copious, but may damage `); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("health", "Health"), - `. Larger ` - )); - r.push(App.Encyclopedia.Dialog.linkDOM("breasts", "Breasts")); - r.push(`will produce more milk, but not linearly: diminishing returns apply to bigger tits. Happy and `); - r.push(App.Encyclopedia.Dialog.linkDOM("healthy", "Health")); - r.push(`cows are also more productive, and slaves with`); - r.push(App.Encyclopedia.Dialog.linkDOM("ovaries", "Ovaries")); - r.push(`enjoy a bonus to milk production. Natural lactation will dry up over time if not constantly maintained.`); - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Lips"] = () => { - const fragment = new DocumentFragment(); - const r = []; - r.push(`Slaves'`); - r.push(this.topic("lips")); - r.push(`contribute to beauty. At very large sizes, they will alter dialog, though this has no mechanical effect. They can be enlarged with targeted growth hormones or surgery, but such surgery can reduce `); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("oral skill", "Oral Skill"), - `.` - )); - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Musculature"] = () => { - const fragment = new DocumentFragment(); - let r = []; - r.push(`Slaves'`); - r.push(this.topic("musculature")); - r.push(`occurs in seven levels, and affects combat effectiveness, beauty, and the effects of breasts. For combat, the penultimate level is best. At game start, muscles are a minor detriment to beauty, though this can be changed through `); - r.push(App.Encyclopedia.Dialog.linkDOM("future society", "Future Societies")); - r.push(`choices. Extremely large breasts can begin to hinder slaves, but the first level will allow them to carry their burdens.`); - App.Events.addParagraph(fragment, r); - r = []; - - r.push(`From the slave documentation;`); - const table = App.UI.DOM.makeElement("table", null, "invisible"); - r.push(table); - App.UI.DOM.makeRow(table, `96`, `100`, `extremely muscular`); - App.UI.DOM.makeRow(table, `31`, `95`, `muscular`); - App.UI.DOM.makeRow(table, `6`, `30`, `toned`); - App.UI.DOM.makeRow(table, `-5`, `5`, `none`); - App.UI.DOM.makeRow(table, `-30`, `-6`, `weak`); - App.UI.DOM.makeRow(table, `-95`, `-31`, `very weak`); - App.UI.DOM.makeRow(table, `-100`, `-96`, `frail`); - - App.Events.addParagraph(fragment, r); - r = []; - r.push(`A standard`); - r.push(App.Encyclopedia.Dialog.linkDOM("bodyguard", "Bodyguard")); - r.push(`is negatively impacted by being weak or extremely muscular and positively impacted by being muscular. A slave that is at the max of tall or very tall (>= 185) can handle being extremely muscular.`); - App.Events.addParagraph(fragment, r); - App.UI.DOM.appendNewElement("p", fragment, App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("DJ", "DJ"), - `'s are more effective when they are just under being muscular and inside being toned.` - )); - - App.UI.DOM.appendNewElement("p", fragment, App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("Nurse", "Nurse"), - ` is more effective when they are toned or greater.` - )); - App.UI.DOM.appendNewElement("p", fragment, `Values >= 95 allows slaves with extremely hypertrophied balls (>70) to move around with effort.`); - - return fragment; - }; - - this["Nipples"] = () => { - const fragment = new DocumentFragment(); - const r = []; - r.push(`Slaves'`); - r.push(this.topic("nipples")); - r.push(`have varying effects, depending on their shape. Tiny nipples have a negative effect on beauty, puffy and inverted nipples improve it, huge nipples improve it more strongly, and all others have no effect. Inverted and partially inverted nipples can be permanently protruded by nipple piercings or milking: this is uncomfortable, and will reduce`); - r.push(App.UI.DOM.makeElement("span", - App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted"), "hotpink" - )); - r.push(`unless the slave is a`); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("masochist", "Masochists"), - `. Tiny nipples can be enlarged with `, - App.Encyclopedia.Dialog.linkDOM("XX hormones", "Hormones (XX)"), - `, huge nipples can be reduced with `, - App.Encyclopedia.Dialog.linkDOM("XY hormones", "Hormones (XY)"), - `, breast growth hormones will grow and may invert nipples, and breast implantation may damage nipples enough to shrink them slightly.` - )); - - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Ovaries"] = () => { - const fragment = new DocumentFragment(); - const r = []; - r.push(`Slaves'`); - r.push(this.topic("ovaries")); - r.push(`are necessary for pregnancy and provide a small amount of natural XX hormones. An oophorectomy, available with extreme content enabled, will render a slave barren and stop ovaries' hormonal effects, producing a slave with no natural hormones. Barren slaves do suffer penalties under some future society choices, but do not require costly contraceptives to avoid pregnancy. Ovaries grant a bonus to `); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("lactation", "Lactation"), - `.` - )); - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Pregnancy"] = () => { - return App.UI.DOM.combineNodes( - `Slaves require both `, - App.Encyclopedia.Dialog.linkDOM("vaginas", "Vaginas"), - ` and `, - App.Encyclopedia.Dialog.linkDOM("ovaries", "Ovaries"), - ` to become`, - this.topic("pregnant."), - `However, it's rumored that Gender Radicalist societies have developed a method for `, - App.Encyclopedia.Dialog.linkDOM("male impregnation", "Gender Radicalism Research"), - `. Fertile slaves can be impregnated by the player character or a slave with `, - App.Encyclopedia.Dialog.linkDOM("testicles", "Testicles"), - ` from the fertile slave's individual menu. Otherwise, slaves with vaginas and ovaries who aren't wearing chastity belts or taking contraceptives, and have not had their tubes tied via surgery, will likely become pregnant if performing sexual jobs or if allowed to have sex with slaves with balls. Pregnancy has a number of minor physical effects and will induce `, - App.Encyclopedia.Dialog.linkDOM("lactation", "Lactation") - ); - }; - - this["Skin Distinctions"] = () => { - const fragment = new DocumentFragment(); - let r = []; - r.push(`Slaves can have various`); - r.push(this.topic("skin distinctions,")); - r.push(`including freckles, heavy freckling, beauty marks, and birthmarks. Beauty marks and birthmarks can be removed in the Salon.`); - App.Events.addParagraph(fragment, r); - - r = []; - r.push(App.UI.DOM.makeElement("span", "Freckles", "italics")); - r.push(`of both densities will slightly improve a slave's `); - App.Encyclopedia.Dialog.linkDOM("attractiveness score", "Slave Score (Attractiveness)"); - r.push(`if she has pale or fair skin, and slightly improve it again if she has red hair.`); - App.Events.addParagraph(fragment, r); - - r = []; - r.push(App.UI.DOM.makeElement("span", "Beauty marks,", "italics")); - r.push(`otherwise known as facial moles, will improve a slave's`); - App.Encyclopedia.Dialog.linkDOM("attractiveness score", "Slave Score (Attractiveness)"); - r.push(`if she has a gorgeous `); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("face", "Faces"), - `, reduce it if she has an average or worse face, and have no effect if she has a very pretty face.` - )); - App.Events.addParagraph(fragment, r); - - r = []; - r.push(App.UI.DOM.makeElement("span", "Birthmarks", "italics")); - r.push(`will improve a slave's attractiveness score if she is prestigious, and reduce it if she is not.`); - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Teeth"] = () => { - const fragment = new DocumentFragment(); - let r = []; - r.push(`Slaves'`); - r.push(this.topic("teeth")); - r.push(`have a variety of impacts and can be customized in several ways.`); - App.Events.addParagraph(fragment, r); - r = []; - for (const [key, teeth] of App.Medicine.Modification.teeth) { - if (teeth.hasOwnProperty("requirements") && !teeth.requirements) { - continue; - } else { - r.push(App.UI.DOM.makeElement("span", capFirstChar(key), "note")); - r.push(teeth.desc); - App.Events.addNode(fragment, r, "div"); - r = []; - } - } - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Testicles"] = () => { - const fragment = new DocumentFragment(); - const r = []; - r.push(`Slaves'`); - r.push(this.topic("testicles")); - r.push(`are necessary for erection and provide a small amount of natural XY hormones. At game start, larger testicles reduce slave value, though this can be reduced or even reversed by some future society choices. Orchiectomy, available with extreme content enabled, will stop testicles' hormonal effects, producing a slave with no natural hormones. It also has significant mental effects.`); - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Vaginas"] = () => { - const fragment = new DocumentFragment(); - const r = []; - r.push(`Slaves'`); - r.push(this.topic("vaginas")); - r.push(`are a valuable commodity. Like `); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("anuses", "Anuses"), - `, they appear in four degrees of tightness: virgin and three increasing levels of looseness. Tighter vaginas improve performance at sexual assignments, but most methods of learning ` - )); - - r.push(App.Encyclopedia.Dialog.linkDOM("vaginal skill", "Anal Skill")); - r.push(`tend to loosen anuses. Assigning a virgin to sex work will result in a one-time bonus to performance but may anger her; alternatively, a chastity belt can be used to preserve virginity during sexual assignments. A virgin vagina applies a large cost multiplier for slave purchase or sale. Vaginas can be loosened by events, strenuous sex work, or plug accessories; they can be tightened with rest from strenuous sex work, personal attention, or the autosurgery, though such surgery can reduce`); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("vaginal skill", "Vaginal Skill"), - `.` - )); - App.Events.addParagraph(fragment, r); - - fragment.append(App.Encyclopedia.Dialog.linkDOM("Clit?", "Clits")); - - return fragment; - }; - - this["Weight"] = () => { - const fragment = new DocumentFragment(); - let r = []; - r.push(`A slaves'`); - r.push(this.topic("weight")); - r.push(`contributes to their beauty. The middle three values (thin, average and curvy) are all considered equally good; outside that range, penalties are applied. Gaining and losing weight can cause changes to a slave's`); - r.push(App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("breast", "Breasts"), - ` and `, - App.Encyclopedia.Dialog.linkDOM("butt", "Butts"), - ` size, and will be different for `, - App.Encyclopedia.Dialog.linkDOM("anorexics", "Anorexic"), - `, `, - App.Encyclopedia.Dialog.linkDOM("gluttons", "Gluttonous"), - `, and `, - App.Encyclopedia.Dialog.linkDOM("fitness", "Fitness"), - ` fanatics.`, - )); - App.Events.addParagraph(fragment, r); - - r = []; - r.push(`From the slave documentation;`); - const table = App.UI.DOM.makeElement("table", null, "invisible"); - r.push(table); - App.UI.DOM.makeRow(table, `191`, `200`, `dangerously obese. This can lead to a slave losing their leadership position.`); - App.UI.DOM.makeRow(table, `161`, `190`, `super obese`); - App.UI.DOM.makeRow(table, `131`, `160`, `obese`); - App.UI.DOM.makeRow(table, `96`, `130`, `fat`); - App.UI.DOM.makeRow(table, `31`, `95`, `overweight`); - App.UI.DOM.makeRow(table, `11`, `30`, `curvy`); - App.UI.DOM.makeRow(table, `-10`, `10`, `neither too fat nor too skinny`); - App.UI.DOM.makeRow(table, `-30`, `-11`, `thin`); - App.UI.DOM.makeRow(table, `-95`, `-31`, `very thin`); - App.UI.DOM.makeRow(table, `-100`, `-96`, `emaciated`); - - App.Events.addParagraph(fragment, r); - r = []; - r.push(`he ideal range for a`); - r.push(App.Encyclopedia.Dialog.linkDOM("bodyguard", "Bodyguard")); - r.push(` is -10 to 30, going either way negatively impacts them.`); - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Hormones (XX)"] = () => { - const fragment = new DocumentFragment(); - let r = []; - r.push(App.UI.DOM.combineNodes( - this.topic("XX Hormones"), - `are female hormones, either from hormone treatments or from `, - App.Encyclopedia.Dialog.linkDOM("ovaries", "Ovaries"), - `. A hidden hormonal score is calculated for each slave, with positive values more feminine:` - )); +App.Encyclopedia.addArticle("Body", function() { + const fragment = new DocumentFragment(); + App.UI.DOM.appendNewElement("p", fragment, "Future room for lore text", "note"); + App.UI.DOM.appendNewElement("div", fragment, "Choose a more particular entry below:"); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Waist", function() { + const fragment = new DocumentFragment(); + const r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("waist")); + r.push(`contributes to beauty. Waists can be altered permanently by corsets over time, or quickly in the surgery. (wiki: needs more technical detail)`); + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Anuses", function() { + const fragment = new DocumentFragment(); + const r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("anuses")); + r.push(`are a valuable commodity. Like`); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("vaginas", "Vaginas"), + `,` + )); + r.push(`they appear in four degrees of tightness: virgin and three increasing levels of looseness. Tighter anuses improve performance at sexual assignments, but most methods of learning `); + r.push(App.Encyclopedia.Dialog.linkDOM("anal skill", "Anal Skill")); + r.push(`tend to loosen anuses. Assigning a virgin to sex work will result in a one-time bonus to performance, but may anger her and can result in skipping up one level of looseness. A virgin anus applies a moderate cost multiplier for slave purchase or sale. Anuses can be loosened by events, strenuous sex work, or plug accessories; they can be tightened with rest from strenuous sex work, personal attention, or the autosurgery, though such surgery can reduce`); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("anal skill", "Anal Skill"), + `.` + )); + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Areolae", function() { + const fragment = new DocumentFragment(); + const r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("areolae")); + r.push(`can be altered in size or shape through surgery. (wiki: needs more technical detail)`); + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Breasts", function() { + const fragment = new DocumentFragment(); + const r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("breasts")); + r.push(`contribute to beauty. They can be enlarged with`); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("XX hormones", "Hormones (XX)"), + `, intense` + )); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("lactation", "Lactation"), + `,` + )); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("weight gain", "Weight"), + `, or surgery (which` + )); + r.push(App.Encyclopedia.Dialog.linkDOM("boob fetishists", "Boob Fetishists")); + r.push(`will be grateful for).`); + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Clits", function() { + const fragment = new DocumentFragment(); + const r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("clits")); + r.push(`contribute to beauty. (wiki: needs more technical detail)`); + // TODO: how are clits tied to dicks, vaginas, and hormones? + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Dicks", function() { + const fragment = new DocumentFragment(); + let r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("dicks")); + r.push(`are less straightforward than`); + + r.push(App.Encyclopedia.Dialog.linkDOM("anuses", "Anuses")); + r.push(` or `); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("vaginas", "Vaginas"), `.` + )); + r.push(`At game start, larger dicks reduce slave value, though this can be reduced or even reversed by some future society choices. Slaves will remain capable of erection so long as they retain `); + r.push(App.Encyclopedia.Dialog.linkDOM("testicles", "Testicles")); + r.push(` and are not on `); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("female hormone treatments", "Hormones (XX)"), `.`)); + App.Events.addParagraph(fragment, r); + fragment.append(App.Encyclopedia.Dialog.linkDOM("Clits?", "Clits")); + // TODO: how do dicks and clits relate, future coder? + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Ethnicity", function() { + const fragment = new DocumentFragment(); + const r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("ethnicity")); + r.push(`affects random slave generation; the game produces bodies according to broad phenotypes. For example, black hair is almost universal among randomly generated Asian slaves. Its only other impact at game start is that white slaves enjoy a minor bonus to beauty, modeling the near-universal reach of western standards of beauty. Racially based future societies can apply ethnic bonuses or penalties to beauty, changing this landscape.`); + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Faces", function() { + const fragment = new DocumentFragment(); + let r = []; + for (const [key, shape] of App.Medicine.Modification.faceShape) { + if (!shape.hasOwnProperty("requirements") || shape.requirements) { + r.push(App.UI.DOM.makeElement("span", capFirstChar(key), "note")); + r.push(shape.desc); App.Events.addNode(fragment, r, "div"); - - const list = App.UI.DOM.appendNewElement("ul", fragment); - - App.UI.DOM.appendNewElement("li", list, `normal XX hormones provide +1`); - App.UI.DOM.appendNewElement("li", list, `heavy XX hormones provide +2`); - App.UI.DOM.appendNewElement("li", list, App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("Ovaries", "Ovaries"), - ` provide +1` - )); - App.UI.DOM.appendNewElement("li", list, App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("Testicles", "Testicles"), - ` provide -1` - )); - - r = []; - r.push(`At a total of +1 with no ovaries present, XY attraction will increase, dicks will shrink, testicles will shrink, deep voices will be raised, small breasts and buttocks will grow, ugly faces will soften, huge clits will shrink, and extreme `); - r.push(App.Encyclopedia.Dialog.linkDOM("musculature", "Musculature")); - r.push(` will soften.`); - App.Events.addParagraph(fragment, r); - r = []; - r.push(`At +2, all these effects become more likely and more extreme, and`); - r.push(App.UI.DOM.makeElement("span", App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted"), "hotpink")); - r.push(`and`); - r.push(App.UI.DOM.makeElement("span", App.Encyclopedia.Dialog.linkDOM("trust", "Trust"), "mediumaquamarine")); - r.push(`can both increase.`); - App.Events.addParagraph(fragment, r); - - r = []; - r.push(`Artificial hormonal effects can be accelerated by installing the second `); - r.push(App.Encyclopedia.Dialog.linkDOM("upgrade", "What the Upgrades Do")); - r.push(` to the kitchen, which will also stop slave's assets from shrinking due to natural hormonal effects.`); - - App.Events.addParagraph(fragment, r); - return fragment; - }; - - this["Hormones (XY)"] = () => { - const fragment = new DocumentFragment(); - let r = []; - r.push(App.UI.DOM.combineNodes( - this.topic("XY Hormones"), - `are male hormones, either from hormone treatments or from `, - App.Encyclopedia.Dialog.linkDOM("Testicles", "Testicles"), - `. A hidden hormonal score is calculated for each slave, with negative values more masculine:` - )); + } + } + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("faces")); + r.push(`contribute heavily to beauty. They occur in six shapes and seven levels of attractiveness, which can be affected by surgery or, if the slave is unattractive or masculine, intensive `); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("XX hormones", "Hormones (XX)"), + `.` + )); + r.push(`Unlike most other attributes, a slave's face cannot be improved more than two steps by surgery. The autosurgery upgrade removes this limitation.`); + App.Events.addParagraph(fragment, r); + r = []; + r.push(App.UI.DOM.makeElement("h2", `Facial shapes and beauty`)); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Height", function() { + const fragment = new DocumentFragment(); + const r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("height")); + r.push(`contributes to beauty and improves combat effectiveness. It is measured in`); // TODO link to CE? + if (V.showInches === 2) { + r.push(`inches,`); + } else { + r.push(`centimeters,`); + } + r.push(`though the game handles it in terms of ranges; beyond ${heightToEitherUnit(190)}, all very tall slaves will be treated almost identically. Height can be affected by surgery, and younger slaves can also see minor hormonal impacts on height. Unlike most other attributes, a slave's height cannot be changed more than one step by surgery.`); + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Hips", function() { + const fragment = new DocumentFragment(); + const r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("hips")); + r.push(`contribute to beauty. (wiki: needs more technical detail)`); + // TODO: how are clits tied to dicks, vaginas, and hormones? + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Lactation", function() { + const fragment = new DocumentFragment(); + const r = []; + r.push(`Slaves can begin to`); + r.push(App.Encyclopedia.topic("lactate")); + r.push(`two ways: naturally due to pregnancy or constant stimulation, or artificially, through surgical implantation of a slow-release lactation-inducing drug pellet. Drug-induced lactation is more copious, but may damage `); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("health", "Health"), + `. Larger ` + )); + r.push(App.Encyclopedia.Dialog.linkDOM("breasts", "Breasts")); + r.push(`will produce more milk, but not linearly: diminishing returns apply to bigger tits. Happy and `); + r.push(App.Encyclopedia.Dialog.linkDOM("healthy", "Health")); + r.push(`cows are also more productive, and slaves with`); + r.push(App.Encyclopedia.Dialog.linkDOM("ovaries", "Ovaries")); + r.push(`enjoy a bonus to milk production. Natural lactation will dry up over time if not constantly maintained.`); + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Lips", function() { + const fragment = new DocumentFragment(); + const r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("lips")); + r.push(`contribute to beauty. At very large sizes, they will alter dialog, though this has no mechanical effect. They can be enlarged with targeted growth hormones or surgery, but such surgery can reduce `); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("oral skill", "Oral Skill"), + `.` + )); + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Musculature", function() { + const fragment = new DocumentFragment(); + let r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("musculature")); + r.push(`occurs in seven levels, and affects combat effectiveness, beauty, and the effects of breasts. For combat, the penultimate level is best. At game start, muscles are a minor detriment to beauty, though this can be changed through `); + r.push(App.Encyclopedia.Dialog.linkDOM("future society", "Future Societies")); + r.push(`choices. Extremely large breasts can begin to hinder slaves, but the first level will allow them to carry their burdens.`); + App.Events.addParagraph(fragment, r); + r = []; + + r.push(`From the slave documentation;`); + const table = App.UI.DOM.makeElement("table", null, "invisible"); + r.push(table); + App.UI.DOM.makeRow(table, `96`, `100`, `extremely muscular`); + App.UI.DOM.makeRow(table, `31`, `95`, `muscular`); + App.UI.DOM.makeRow(table, `6`, `30`, `toned`); + App.UI.DOM.makeRow(table, `-5`, `5`, `none`); + App.UI.DOM.makeRow(table, `-30`, `-6`, `weak`); + App.UI.DOM.makeRow(table, `-95`, `-31`, `very weak`); + App.UI.DOM.makeRow(table, `-100`, `-96`, `frail`); + + App.Events.addParagraph(fragment, r); + r = []; + r.push(`A standard`); + r.push(App.Encyclopedia.Dialog.linkDOM("bodyguard", "Bodyguard")); + r.push(`is negatively impacted by being weak or extremely muscular and positively impacted by being muscular. A slave that is at the max of tall or very tall (>= 185) can handle being extremely muscular.`); + App.Events.addParagraph(fragment, r); + App.UI.DOM.appendNewElement("p", fragment, App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("DJ", "DJ"), + `'s are more effective when they are just under being muscular and inside being toned.` + )); + + App.UI.DOM.appendNewElement("p", fragment, App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("Nurse", "Nurse"), + ` is more effective when they are toned or greater.` + )); + App.UI.DOM.appendNewElement("p", fragment, `Values >= 95 allows slaves with extremely hypertrophied balls (>70) to move around with effort.`); + + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Nipples", function() { + const fragment = new DocumentFragment(); + const r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("nipples")); + r.push(`have varying effects, depending on their shape. Tiny nipples have a negative effect on beauty, puffy and inverted nipples improve it, huge nipples improve it more strongly, and all others have no effect. Inverted and partially inverted nipples can be permanently protruded by nipple piercings or milking: this is uncomfortable, and will reduce`); + r.push(App.UI.DOM.makeElement("span", + App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted"), "hotpink" + )); + r.push(`unless the slave is a`); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("masochist", "Masochists"), + `. Tiny nipples can be enlarged with `, + App.Encyclopedia.Dialog.linkDOM("XX hormones", "Hormones (XX)"), + `, huge nipples can be reduced with `, + App.Encyclopedia.Dialog.linkDOM("XY hormones", "Hormones (XY)"), + `, breast growth hormones will grow and may invert nipples, and breast implantation may damage nipples enough to shrink them slightly.` + )); + + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Ovaries", function() { + const fragment = new DocumentFragment(); + const r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("ovaries")); + r.push(`are necessary for pregnancy and provide a small amount of natural XX hormones. An oophorectomy, available with extreme content enabled, will render a slave barren and stop ovaries' hormonal effects, producing a slave with no natural hormones. Barren slaves do suffer penalties under some future society choices, but do not require costly contraceptives to avoid pregnancy. Ovaries grant a bonus to `); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("lactation", "Lactation"), + `.` + )); + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Pregnancy", function() { + return App.UI.DOM.combineNodes( + `Slaves require both `, + App.Encyclopedia.Dialog.linkDOM("vaginas", "Vaginas"), + ` and `, + App.Encyclopedia.Dialog.linkDOM("ovaries", "Ovaries"), + ` to become`, + App.Encyclopedia.topic("pregnant."), + `However, it's rumored that Gender Radicalist societies have developed a method for `, + App.Encyclopedia.Dialog.linkDOM("male impregnation", "Gender Radicalism Research"), + `. Fertile slaves can be impregnated by the player character or a slave with `, + App.Encyclopedia.Dialog.linkDOM("testicles", "Testicles"), + ` from the fertile slave's individual menu. Otherwise, slaves with vaginas and ovaries who aren't wearing chastity belts or taking contraceptives, and have not had their tubes tied via surgery, will likely become pregnant if performing sexual jobs or if allowed to have sex with slaves with balls. Pregnancy has a number of minor physical effects and will induce `, + App.Encyclopedia.Dialog.linkDOM("lactation", "Lactation") + ); +}, "body"); + +App.Encyclopedia.addArticle("Skin Distinctions", function() { + const fragment = new DocumentFragment(); + let r = []; + r.push(`Slaves can have various`); + r.push(App.Encyclopedia.topic("skin distinctions,")); + r.push(`including freckles, heavy freckling, beauty marks, and birthmarks. Beauty marks and birthmarks can be removed in the Salon.`); + App.Events.addParagraph(fragment, r); + + r = []; + r.push(App.UI.DOM.makeElement("span", "Freckles", "italics")); + r.push(`of both densities will slightly improve a slave's `); + App.Encyclopedia.Dialog.linkDOM("attractiveness score", "Slave Score (Attractiveness)"); + r.push(`if she has pale or fair skin, and slightly improve it again if she has red hair.`); + App.Events.addParagraph(fragment, r); + + r = []; + r.push(App.UI.DOM.makeElement("span", "Beauty marks,", "italics")); + r.push(`otherwise known as facial moles, will improve a slave's`); + App.Encyclopedia.Dialog.linkDOM("attractiveness score", "Slave Score (Attractiveness)"); + r.push(`if she has a gorgeous `); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("face", "Faces"), + `, reduce it if she has an average or worse face, and have no effect if she has a very pretty face.` + )); + App.Events.addParagraph(fragment, r); + + r = []; + r.push(App.UI.DOM.makeElement("span", "Birthmarks", "italics")); + r.push(`will improve a slave's attractiveness score if she is prestigious, and reduce it if she is not.`); + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Teeth", function() { + const fragment = new DocumentFragment(); + let r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("teeth")); + r.push(`have a variety of impacts and can be customized in several ways.`); + App.Events.addParagraph(fragment, r); + r = []; + for (const [key, teeth] of App.Medicine.Modification.teeth) { + if (!teeth.hasOwnProperty("requirements") || teeth.requirements) { + r.push(App.UI.DOM.makeElement("span", capFirstChar(key), "note")); + r.push(teeth.desc); App.Events.addNode(fragment, r, "div"); - - const list = App.UI.DOM.appendNewElement("ul", fragment); - - App.UI.DOM.appendNewElement("li", list, `normal XY hormones provide -1`); - App.UI.DOM.appendNewElement("li", list, `heavy XY hormones provide -2`); - App.UI.DOM.appendNewElement("li", list, App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("Ovaries", "Ovaries"), - ` provide +1` - )); - App.UI.DOM.appendNewElement("li", list, App.UI.DOM.combineNodes( - App.Encyclopedia.Dialog.linkDOM("Testicles", "Testicles"), - ` provide -1` - )); - - App.UI.DOM.appendNewElement("p", fragment, `At a total of -1, XY attraction will increase, large breasts and buttocks will shrink, and clits will grow.`); - r = []; - r.push(`At +2, all these effects become more likely and more extreme,`); - r.push(App.UI.DOM.makeElement("span", App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted"), "hotpink")); - r.push(`can decrease, dicks and testicles will grow, voices will deepen, and faces will become uglier.`); - App.Events.addParagraph(fragment, r); - - r = []; - r.push(`Artificial hormonal effects can be accelerated by installing the second `); - r.push(App.Encyclopedia.Dialog.linkDOM("upgrade", "What the Upgrades Do")); - r.push(` to the kitchen, which will also stop slave's assets from shrinking due to natural hormonal effects.`); - - App.Events.addParagraph(fragment, r); - return fragment; - }; + } } -}; + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Testicles", function() { + const fragment = new DocumentFragment(); + const r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("testicles")); + r.push(`are necessary for erection and provide a small amount of natural XY hormones. At game start, larger testicles reduce slave value, though this can be reduced or even reversed by some future society choices. Orchiectomy, available with extreme content enabled, will stop testicles' hormonal effects, producing a slave with no natural hormones. It also has significant mental effects.`); + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Vaginas", function() { + const fragment = new DocumentFragment(); + const r = []; + r.push(`Slaves'`); + r.push(App.Encyclopedia.topic("vaginas")); + r.push(`are a valuable commodity. Like `); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("anuses", "Anuses"), + `, they appear in four degrees of tightness: virgin and three increasing levels of looseness. Tighter vaginas improve performance at sexual assignments, but most methods of learning ` + )); + + r.push(App.Encyclopedia.Dialog.linkDOM("vaginal skill", "Anal Skill")); + r.push(`tend to loosen anuses. Assigning a virgin to sex work will result in a one-time bonus to performance but may anger her; alternatively, a chastity belt can be used to preserve virginity during sexual assignments. A virgin vagina applies a large cost multiplier for slave purchase or sale. Vaginas can be loosened by events, strenuous sex work, or plug accessories; they can be tightened with rest from strenuous sex work, personal attention, or the autosurgery, though such surgery can reduce`); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("vaginal skill", "Vaginal Skill"), + `.` + )); + App.Events.addParagraph(fragment, r); + + fragment.append(App.Encyclopedia.Dialog.linkDOM("Clit?", "Clits")); + + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Weight", function() { + const fragment = new DocumentFragment(); + let r = []; + r.push(`A slaves'`); + r.push(App.Encyclopedia.topic("weight")); + r.push(`contributes to their beauty. The middle three values (thin, average and curvy) are all considered equally good; outside that range, penalties are applied. Gaining and losing weight can cause changes to a slave's`); + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("breast", "Breasts"), + ` and `, + App.Encyclopedia.Dialog.linkDOM("butt", "Butts"), + ` size, and will be different for `, + App.Encyclopedia.Dialog.linkDOM("anorexics", "Anorexic"), + `, `, + App.Encyclopedia.Dialog.linkDOM("gluttons", "Gluttonous"), + `, and `, + App.Encyclopedia.Dialog.linkDOM("fitness", "Fitness"), + ` fanatics.`, + )); + App.Events.addParagraph(fragment, r); + + r = []; + r.push(`From the slave documentation;`); + const table = App.UI.DOM.makeElement("table", null, "invisible"); + r.push(table); + App.UI.DOM.makeRow(table, `191`, `200`, `dangerously obese. This can lead to a slave losing their leadership position.`); + App.UI.DOM.makeRow(table, `161`, `190`, `super obese`); + App.UI.DOM.makeRow(table, `131`, `160`, `obese`); + App.UI.DOM.makeRow(table, `96`, `130`, `fat`); + App.UI.DOM.makeRow(table, `31`, `95`, `overweight`); + App.UI.DOM.makeRow(table, `11`, `30`, `curvy`); + App.UI.DOM.makeRow(table, `-10`, `10`, `neither too fat nor too skinny`); + App.UI.DOM.makeRow(table, `-30`, `-11`, `thin`); + App.UI.DOM.makeRow(table, `-95`, `-31`, `very thin`); + App.UI.DOM.makeRow(table, `-100`, `-96`, `emaciated`); + + App.Events.addParagraph(fragment, r); + r = []; + r.push(`he ideal range for a`); + r.push(App.Encyclopedia.Dialog.linkDOM("bodyguard", "Bodyguard")); + r.push(` is -10 to 30, going either way negatively impacts them.`); + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Hormones (XX)", function() { + const fragment = new DocumentFragment(); + let r = []; + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.topic("XX Hormones"), + `are female hormones, either from hormone treatments or from `, + App.Encyclopedia.Dialog.linkDOM("ovaries", "Ovaries"), + `. A hidden hormonal score is calculated for each slave, with positive values more feminine:` + )); + App.Events.addNode(fragment, r, "div"); + + const list = App.UI.DOM.appendNewElement("ul", fragment); + + App.UI.DOM.appendNewElement("li", list, `normal XX hormones provide +1`); + App.UI.DOM.appendNewElement("li", list, `heavy XX hormones provide +2`); + App.UI.DOM.appendNewElement("li", list, App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("Ovaries", "Ovaries"), + ` provide +1` + )); + App.UI.DOM.appendNewElement("li", list, App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("Testicles", "Testicles"), + ` provide -1` + )); + + r = []; + r.push(`At a total of +1 with no ovaries present, XY attraction will increase, dicks will shrink, testicles will shrink, deep voices will be raised, small breasts and buttocks will grow, ugly faces will soften, huge clits will shrink, and extreme `); + r.push(App.Encyclopedia.Dialog.linkDOM("musculature", "Musculature")); + r.push(` will soften.`); + App.Events.addParagraph(fragment, r); + + r = []; + r.push(`At +2, all these effects become more likely and more extreme, and`); + r.push(App.UI.DOM.makeElement("span", App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted"), "hotpink")); + r.push(`and`); + r.push(App.UI.DOM.makeElement("span", App.Encyclopedia.Dialog.linkDOM("trust", "Trust"), "mediumaquamarine")); + r.push(`can both increase.`); + App.Events.addParagraph(fragment, r); + + r = []; + r.push(`Artificial hormonal effects can be accelerated by installing the second `); + r.push(App.Encyclopedia.Dialog.linkDOM("upgrade", "What the Upgrades Do")); + r.push(` to the kitchen, which will also stop slave's assets from shrinking due to natural hormonal effects.`); + + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addArticle("Hormones (XY)", function() { + const fragment = new DocumentFragment(); + let r = []; + r.push(App.UI.DOM.combineNodes( + App.Encyclopedia.topic("XY Hormones"), + `are male hormones, either from hormone treatments or from `, + App.Encyclopedia.Dialog.linkDOM("Testicles", "Testicles"), + `. A hidden hormonal score is calculated for each slave, with negative values more masculine:` + )); + App.Events.addNode(fragment, r, "div"); + + const list = App.UI.DOM.appendNewElement("ul", fragment); + + App.UI.DOM.appendNewElement("li", list, `normal XY hormones provide -1`); + App.UI.DOM.appendNewElement("li", list, `heavy XY hormones provide -2`); + App.UI.DOM.appendNewElement("li", list, App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("Ovaries", "Ovaries"), + ` provide +1` + )); + App.UI.DOM.appendNewElement("li", list, App.UI.DOM.combineNodes( + App.Encyclopedia.Dialog.linkDOM("Testicles", "Testicles"), + ` provide -1` + )); + + App.UI.DOM.appendNewElement("p", fragment, `At a total of -1, XY attraction will increase, large breasts and buttocks will shrink, and clits will grow.`); + + r = []; + r.push(`At +2, all these effects become more likely and more extreme,`); + r.push(App.UI.DOM.makeElement("span", App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted"), "hotpink")); + r.push(`can decrease, dicks and testicles will grow, voices will deepen, and faces will become uglier.`); + App.Events.addParagraph(fragment, r); + + r = []; + r.push(`Artificial hormonal effects can be accelerated by installing the second `); + r.push(App.Encyclopedia.Dialog.linkDOM("upgrade", "What the Upgrades Do")); + r.push(` to the kitchen, which will also stop slave's assets from shrinking due to natural hormonal effects.`); + + App.Events.addParagraph(fragment, r); + return fragment; +}, "body"); + +App.Encyclopedia.addCategory("body", function() { + const links = []; + links.push(App.Encyclopedia.Dialog.linkDOM("Anuses", "Anuses")); + links.push(App.Encyclopedia.Dialog.linkDOM("Areolae", "Areolae")); + links.push(App.Encyclopedia.Dialog.linkDOM("Breasts", "Breasts")); + links.push(App.Encyclopedia.Dialog.linkDOM("Butts", "Butts")); + links.push(App.Encyclopedia.Dialog.linkDOM("Clits", "Clits")); + links.push(App.Encyclopedia.Dialog.linkDOM("Dicks", "Dicks")); + links.push(App.Encyclopedia.Dialog.linkDOM("Ethnicity", "Ethnicity")); + links.push(App.Encyclopedia.Dialog.linkDOM("Faces", "Faces")); + links.push(App.Encyclopedia.Dialog.linkDOM("Height", "Height")); + links.push(App.Encyclopedia.Dialog.linkDOM("Hips", "Hips")); + links.push(App.Encyclopedia.Dialog.linkDOM("Lactation", "Lactation")); + links.push(App.Encyclopedia.Dialog.linkDOM("Lips", "Lips")); + links.push(App.Encyclopedia.Dialog.linkDOM("Musculature", "Musculature")); + links.push(App.Encyclopedia.Dialog.linkDOM("Nipples", "Nipples")); + links.push(App.Encyclopedia.Dialog.linkDOM("Ovaries", "Ovaries")); + links.push(App.Encyclopedia.Dialog.linkDOM("Pregnancy", "Pregnancy")); + links.push(App.Encyclopedia.Dialog.linkDOM("Skin Distinctions", "Skin Distinctions")); + links.push(App.Encyclopedia.Dialog.linkDOM("Teeth", "Teeth")); + links.push(App.Encyclopedia.Dialog.linkDOM("Testicles", "Testicles")); + links.push(App.Encyclopedia.Dialog.linkDOM("Vaginas", "Vaginas")); + links.push(App.Encyclopedia.Dialog.linkDOM("Waist", "Waist")); + links.push(App.Encyclopedia.Dialog.linkDOM("Weight", "Weight")); + links.push(App.Encyclopedia.Dialog.linkDOM("XX", "Hormones (XX)")); + links.push(App.Encyclopedia.Dialog.linkDOM("XY", "Hormones (XY)")); + return App.UI.DOM.generateLinksStrip(links); +}); diff --git a/src/gui/Encyclopedia/encyclopediaCommonAssignments.js b/src/gui/Encyclopedia/encyclopediaCommonAssignments.js new file mode 100644 index 0000000000000000000000000000000000000000..004c9ea87323ed89267f0ca5765c36909b89ccab --- /dev/null +++ b/src/gui/Encyclopedia/encyclopediaCommonAssignments.js @@ -0,0 +1,294 @@ +/* TODO: add entries for Nursery */ + +App.Encyclopedia.Assignments = { + /** + * @returns {DocumentFragment} + */ + attendingClasses() { + return App.UI.DOM.combineNodes( + App.Encyclopedia.topic("Attending classes"), + " is an assignment which educates the slave, raising intelligence if possible. Being educated raises value and is useful for some jobs and leadership positions." + ); + }, + + /** + * @returns {DocumentFragment} + */ + confinement() { + return App.UI.DOM.combineNodes( + App.Encyclopedia.topic("Confinement"), + " is an assignment which accelerates breaking for disobedient slaves. If a slave isn't obedient enough to work and isn't ", + App.Encyclopedia.Dialog.linkDOM("unhealthy", "Health"), + " enough to need rest, this will make them useful sooner." + ); + }, + + /** + * @returns {DocumentFragment} + */ + fucktoy() { + return App.UI.DOM.combineNodes( + App.Encyclopedia.topic("Fucktoy service"), + " is an assignment which keeps the slave close and under the player's eye. It's mostly just for fun, but fucktoys can improve reputation based on their beauty, and the player character's attention can be targeted to areas of the slave's body with possible fetish effects on happy slaves." + ); + }, + + /** + * @returns {DocumentFragment} + */ + gloryHole() { + return App.UI.DOM.combineNodes( + App.Encyclopedia.topic("Occupying a glory hole"), + " is an assignment which makes money off of slaves regardless of their beauty, skills, or feelings; it's not fun or ", + App.Encyclopedia.Dialog.linkDOM("healthy", "Health"), + " but very powerful for extracting ¤ out of otherwise useless slaves." + ); + }, + + /** + * @returns {DocumentFragment} + */ + milking() { + const fragment = document.createDocumentFragment(); + + fragment.append( + App.Encyclopedia.topic("Getting milked"), + " is an assignment which makes money from lactation based on a slave's breasts, ", + App.Encyclopedia.Dialog.linkDOM("health", "Health"), + " and hormonal status." + ); + if (V.seeDicks > 0) { + fragment.append(" Cows with balls will also give semen."); + } + fragment.append(` Creates profit quickly from slaves with big tits${V.seeDicks ? " or balls" : ""}.`); + + return fragment; + }, + + /** + * @returns {DocumentFragment} + */ + farming() { + const fragment = document.createDocumentFragment(); + fragment.append( + App.Encyclopedia.topic("Farming"), + " is an assignment which produces ", + App.Encyclopedia.Dialog.linkDOM("food", "Food"), + " from your slaves' hard work" + ); + if (V.seeBestiality) { + fragment.append(" and allows you to breed slaves with animals"); + } + fragment.append( + ". Can also reduce arcology upkeep with upgrades in the ", + App.Encyclopedia.Dialog.linkDOM("Farmyard", "Farmyard") + ); + return fragment; + }, + + /** + * @returns {DocumentFragment} + */ + publicService() { + return App.UI.DOM.combineNodes( + App.Encyclopedia.topic("Public Service"), + " is an assignment which increases reputation based on a slave's beauty, sexual appeal, and skills. Very similar to whoring, but for reputation rather than money." + ); + }, + + /** + * @returns {DocumentFragment} + */ + rest() { + return App.UI.DOM.combineNodes( + App.Encyclopedia.topic("Rest"), + " is an assignment mostly used to improve ", + App.Encyclopedia.Dialog.linkDOM("health", "Health"), + ". It can be useful to order slaves you wish to intensively modify to rest, since most modifications damage health. It will synergize with curative treatments, providing bonus healing when both are simultaneously applied." + ); + }, + + /** + * @returns {DocumentFragment} + */ + sexualServitude() { + return App.UI.DOM.combineNodes( + App.Encyclopedia.topic("Sexual servitude"), + " is an assignment which pleases other slaves by forcing the slave to service them sexually. Useful for driving the targeted slave's ", + App.Encyclopedia.Dialog.linkDOM("devotion", "Devotion"), + " up quickly." + ); + }, + + /** + * @returns {DocumentFragment} + */ + servitude() { + return App.UI.DOM.combineNodes( + App.Encyclopedia.topic("Servitude"), + " is an assignment which reduces your upkeep based on the slave's ", + App.Encyclopedia.Dialog.linkDOM("devotion", "Devotion"), + " Available at lower obedience than other jobs, is insensitive to the quality of a slave's body, and doesn't require skills; a good transitional assignment. Unusually, low sex drive is advantageous as a servant, since it reduces distraction. Lactating slaves are slightly better at this job, since they can contribute to their fellow slaves' nutrition." + ); + }, + + /** + * @returns {DocumentFragment} + */ + whoring() { + return App.UI.DOM.combineNodes( + App.Encyclopedia.topic("Whoring"), + " is an assignment which makes money based on a slave's beauty, sexual appeal, and skills. Good whores take a long time to train and beautify but become very profitable." + ); + } +}; + +App.Encyclopedia.addArticle("Slave Assignments", function() { + const frag = new DocumentFragment(); + const r = []; + r.push("Slave assignments are stratified into ordinary assignments and"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("leadership positions", "Leadership Positions"), ".")); + App.Events.addParagraph(frag, r); + + App.UI.DOM.appendNewElement("p", frag, "Choose a more particular entry below:"); + + return frag; +}, "assignmentCommon"); + +App.Encyclopedia.addArticle("Attending Classes", function() { + const frag = new DocumentFragment(); + const r = []; + r.push(App.Encyclopedia.Assignments.attendingClasses()); + r.push(App.UI.DOM.makeElement("span", + App.UI.DOM.combineNodes("Associated facility: ", App.Encyclopedia.Dialog.linkDOM("Schoolroom", "Schoolroom")), + "note")); + frag.append(...App.Events.spaceSentences(r)); + return frag; +}, "assignmentCommon"); + +App.Encyclopedia.addArticle("Confinement", function() { + const frag = new DocumentFragment(); + const r = []; + r.push(App.Encyclopedia.Assignments.confinement()); + r.push(App.UI.DOM.makeElement("span", + App.UI.DOM.combineNodes("Associated facility: ", App.Encyclopedia.Dialog.linkDOM("Cellblock", "Cellblock")), + "note")); + frag.append(...App.Events.spaceSentences(r)); + return frag; +}, "assignmentCommon"); + +App.Encyclopedia.addArticle("Fucktoy", function() { + const frag = new DocumentFragment(); + const r = []; + r.push(App.Encyclopedia.Assignments.fucktoy()); + r.push(App.UI.DOM.makeElement("span", + App.UI.DOM.combineNodes("Associated facility: ", App.Encyclopedia.Dialog.linkDOM("Master Suite", "Master Suite")), + "note")); + frag.append(...App.Events.spaceSentences(r)); + return frag; +}, "assignmentCommon"); + +App.Encyclopedia.addArticle("Glory Hole", function() { + const frag = new DocumentFragment(); + const r = []; + r.push(App.Encyclopedia.Assignments.gloryHole()); + r.push(App.UI.DOM.makeElement("span", + App.UI.DOM.combineNodes("Associated facility: ", App.Encyclopedia.Dialog.linkDOM("Arcade", "Arcade")), + "note")); + frag.append(...App.Events.spaceSentences(r)); + return frag; +}, "assignmentCommon"); + +App.Encyclopedia.addArticle("Milking", function() { + const frag = document.createDocumentFragment(); + const r = []; + + r.push(App.Encyclopedia.Assignments.milking()); + + r.push(App.UI.DOM.makeElement("span", + App.UI.DOM.combineNodes("Associated facility: ", App.Encyclopedia.Dialog.linkDOM("Dairy", "Dairy")), + "note")); + frag.append(...App.Events.spaceSentences(r)); + return frag; +}, "assignmentCommon"); + +App.Encyclopedia.addArticle("Farming", function() { + const frag = document.createDocumentFragment(); + const r = []; + r.push(App.Encyclopedia.Assignments.farming()); + + r.push(App.UI.DOM.makeElement("span", + App.UI.DOM.combineNodes("Associated facility: ", App.Encyclopedia.Dialog.linkDOM("Farmyard", "Farmyard")), + "note")); + frag.append(...App.Events.spaceSentences(r)); + return frag; +}, "assignmentCommon"); + +App.Encyclopedia.addArticle("Public Service", function() { + const frag = new DocumentFragment(); + const r = []; + r.push(App.Encyclopedia.Assignments.publicService()); + + r.push(App.UI.DOM.makeElement("span", + App.UI.DOM.combineNodes("Associated facility: ", App.Encyclopedia.Dialog.linkDOM("Club", "Club")), + "note")); + frag.append(...App.Events.spaceSentences(r)); + return frag; +}, "assignmentCommon"); + +App.Encyclopedia.addArticle("Rest", function() { + const frag = new DocumentFragment(); + const r = []; + r.push(App.Encyclopedia.Assignments.rest()); + + r.push(App.UI.DOM.makeElement("span", + App.UI.DOM.combineNodes("Associated facilities: ", App.Encyclopedia.Dialog.linkDOM("Spa", "Spa"), + ", ", App.Encyclopedia.Dialog.linkDOM("Clinic", "Clinic")), + "note")); + frag.append(...App.Events.spaceSentences(r)); + return frag; +}, "assignmentCommon"); + +App.Encyclopedia.addArticle("Sexual Servitude", App.Encyclopedia.Assignments.servitude, "assignmentCommon"); + +App.Encyclopedia.addArticle("Servitude", function() { + const frag = new DocumentFragment(); + const r = []; + r.push(App.Encyclopedia.Assignments.servitude()); + + r.push(App.UI.DOM.makeElement("span", + App.UI.DOM.combineNodes("Associated facility: ", App.Encyclopedia.Dialog.linkDOM("Servants' Quarters", "Servants' Quarters")), + "note")); + frag.append(...App.Events.spaceSentences(r)); + return frag; +}, "assignmentCommon"); + +App.Encyclopedia.addArticle("Whoring", function() { + const frag = new DocumentFragment(); + const r = []; + r.push(App.Encyclopedia.Assignments.whoring()); + + r.push(App.UI.DOM.makeElement("span", + App.UI.DOM.combineNodes("Associated facility: ", App.Encyclopedia.Dialog.linkDOM("Brothel", "Brothel")), + "note")); + frag.append(...App.Events.spaceSentences(r)); + return frag; +}, "assignmentCommon"); + +App.Encyclopedia.addCategory("assignmentCommon", function() { + const r = []; + r.push(App.Encyclopedia.Dialog.linkDOM("Common Assignments", "Slave Assignments")); + r.push(App.Encyclopedia.Dialog.linkDOM("Career Experience", "Career Experience")); + r.push(App.Encyclopedia.Dialog.linkDOM("Attending Classes", "Attending Classes")); + r.push(App.Encyclopedia.Dialog.linkDOM("Confinement", "Confinement")); + r.push(App.Encyclopedia.Dialog.linkDOM("Farming", "Farming")); + r.push(App.Encyclopedia.Dialog.linkDOM("Fucktoy", "Fucktoy")); + r.push(App.Encyclopedia.Dialog.linkDOM("Glory Hole", "Glory Hole")); + r.push(App.Encyclopedia.Dialog.linkDOM("Milking", "Milking")); + r.push(App.Encyclopedia.Dialog.linkDOM("Public Service", "Public Service")); + r.push(App.Encyclopedia.Dialog.linkDOM("Rest", "Rest")); + r.push(App.Encyclopedia.Dialog.linkDOM("Servitude, Sexual", "Sexual Servitude")); + r.push(App.Encyclopedia.Dialog.linkDOM("Servitude", "Servitude")); + r.push(App.Encyclopedia.Dialog.linkDOM("Whoring", "Whoring")); + return App.UI.DOM.generateLinksStrip(r); +}); diff --git a/src/gui/Encyclopedia/encyclopediaDialog.js b/src/gui/Encyclopedia/encyclopediaDialog.js index 8c33f758288b5798d75e901990b1ad7eaed4d2e2..4f8e20033caa6d2122a1394e266741f51ca82646 100644 --- a/src/gui/Encyclopedia/encyclopediaDialog.js +++ b/src/gui/Encyclopedia/encyclopediaDialog.js @@ -11,10 +11,19 @@ App.Encyclopedia.Dialog = (function() { /** Create a link to an encyclopedia dialog for a given article with the given text * @param {string} text Text for link * @param {string} article Encyclopedia article to link to + * @param {string} [classNames] CSS Class to add to the link * @returns {HTMLElement} DOM link element */ - function makeLinkDOM(text, article) { - return App.UI.DOM.link(text, () => showArticleInDialog(article)); + function makeLinkDOM(text, article, classNames) { + const link = App.UI.DOM.link(text, () => showArticleInDialog(article)); + if (!classNames) { + return link; + } + // Wrap in a span for coloring, more reliable when hovering over the link + const span = document.createElement("span"); + span.className += classNames; + span.append(link); + return span; } /** Show a given encyclopedia article in the encyclopedia dialog diff --git a/src/gui/Encyclopedia/encyclopediaGuide.js b/src/gui/Encyclopedia/encyclopediaGuide.js new file mode 100644 index 0000000000000000000000000000000000000000..c24e5237ad0681ccbbf56e62020b36f3cf005532 --- /dev/null +++ b/src/gui/Encyclopedia/encyclopediaGuide.js @@ -0,0 +1,487 @@ +App.Encyclopedia.addArticle("Playing Free Cities", function() { + const f = new DocumentFragment(); + App.UI.DOM.appendNewElement("p", f, `Welcome to the Free Cities, ${PlayerName()}!`); + App.UI.DOM.appendNewElement("p", f, "Future room for lore text", "note"); + App.UI.DOM.appendNewElement("p", f, "Choose a more particular entry below:"); + return f; +}, "guide"); + +App.Encyclopedia.addArticle("First Game Guide", function() { + const f = new DocumentFragment(); + let r; + + App.UI.DOM.appendNewElement("p", f, "Unfortunately, Twine doesn't have a solid tooltip system at the moment. So, a certain amount of confusion is to be expected. Sorry about that. Flip through the encyclopedia, or at least this gameplay section. It answers a lot of frequently asked questions, and if you read it you can save yourself the trouble of asking your frequently asked question on /d/ or the blog and getting told to read the encyclopedia. If you've still got questions, start a game and read what it says. The game is reasonably good about telling you what's happening to your slaves, and why. It bears repetition that almost all stat effects are called out with colored text. Try this opening strategy if you don't know where to start. It isn't an optimal build, but it works reliably and will show you the basics."); + + App.UI.DOM.appendNewElement("h3", f, "Starting options"); + r = []; + r.push("Start the game and select any of the world options; choose normal difficulty, since it's pretty forgiving and this opener will make good"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("money", "Money"), "."), "cash")); + r.push("Build a completely male PC for your first game; it makes"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("maintenance much easier. Choose wealth for both your career and your rumored method of obtaining the arcology; the other options are fun but a full wealth build will set you up quickly to get started."); + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("p", f, "Now, customize your starting slaves."); + r = []; + r.push("For your first, make her as <span class='intelligent'>intelligent, educated,</span> and old as possible. Make her"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("devoted", "From Rebellious to Devoted"), "."), ["devotion", "accept"])); + r.push("but save"); + r.push(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash")); + r.push(`by giving her flaws, an unknown fetish, and <span class='trust dec'>making her afraid of you.</span> (These are easy to fix.) You can customize the rest of her as you wish, but try to keep her under <span class='cash'>${cashFormat(5000)}.</span> Don't worry about skills, since with two of them you'll be able to rotate Head Girl duty so the other can learn skills. Commit her, base another slave off her, and commit that one too. Those are your`); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Head Girls", "Head Girl"), ".")); + App.Events.addParagraph(f, r); + + r = []; + r.push("Spend the rest of your"); + r.push(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash")); + r.push("on prospects: slaves that are"); + r.push(App.Encyclopedia.Dialog.linkDOM("cheap", "Money", "cash")); + r.push("now, but can be improved quickly. As long as you keep <span class='devotion accept'>devotion</span> pretty high, low"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust inc")); + r.push("can be fixed reliably. Unknown fetishes, emaciated or fat, flaws, deep voice, and poor skills are all good ways to drive prices down, and can all be fixed quickly. Virginities are a bad idea because they drive costs up and are easy to break. <span class='intelligent'>Education</span> can take awhile and will take slaves away from other jobs, so make them all educated for now, and keep their <span class='intelligent'>intelligence</span> reasonably high."); + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("h3", f, "First turn"); + r = []; + r.push("Assign one of your Head Girls to be <strong>the</strong> Head Girl and make the other whore. Assign everyone else to whore. The"); + r.push(App.Encyclopedia.Dialog.linkDOM("rules assistant", "Rules Assistant")); + r.push("will speed things up a lot when you know the basics, but leave it off for now; it's easy to miss a lot of stuff if you set it up without a bit of experience. Go through your girls one by one and experiment with their options, but anyone who's <span class='devotion accept'>Accepting</span> or better should get nice clothes, accessories, and"); + r.push(App.Encyclopedia.Dialog.linkDOM("living conditions", "Living Conditions")); + r.push("anyone who's not should not. When slaves tip over into <span class='devotion accept'>Accepting,</span> switch them over from bedrolls and uncomfortable straps; until then, the good life is a waste of"); + r.push(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash")); + r.push("and will spoil them. Give <span class='health dec'>unhealthy</span> slaves curatives, and give everyone hormones, since they're"); + r.push(App.Encyclopedia.Dialog.linkDOM("cheap", "Money", "cash")); + r.push("and have good front end benefits. Get everyone working out or dieting to reach a basic fitness level and an attractive (not <span class='warning'>red</span>)"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("weight", "Weight"), ".")); + r.push("Sell the girl(s) your predecessor left behind for seed"); + r.push(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash")); + r.push("and choose the most profitable option; there are ways to maximize this, but worry about that later. Check out the arcology management menu. You should have the"); + r.push(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash")); + r.push("to upgrade the security systems, build the"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Head Girl suite", "Head Girl Suite"), ",")); + r.push(`and to buy the kitchen upgrade; this will make dieting work faster. Check out the slave market, and buy a single bargain slave: <span class="cash">${cashFormat(2000)}</span> is good. Put her in the suite: if she won't go, abuse her until she will. Open the personal attention menu, and fix your Head Girl's flaws; softening is powerful but it takes longer and we're focusing on the basics. <strong>Save the game</strong> and end the turn.`); + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("h3", f, "The end turn report"); + r = []; + r.push("Read this, and note all the colored text. Pay particular attention to <span class='warning'>red,</span> <span class='trust dec'>gold,</span> or <span class='devotion dec'>orchid</span> text; these are generally bad. Being a slave whore is a hard life, and some trouble is inevitable. But take particular note of things like slaves losing"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("health", "Health"), ",")); + r.push("becoming"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("fearful", "Trust"), ",")); + r.push("or"); + r.push(App.Encyclopedia.Dialog.linkDOM("hating", "From Rebellious to Devoted")); + r.push("you due to their"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("rules", "Rules Assistant"), ",")); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("conditions", "Living Conditions"), ",")); + r.push("or other slaves — these things you can control. Reload your save and fiddle around with the options to address these areas. (The Head Girl's girl may have a rough time; you can't affect that.) Since your Head Girl has her own slave to help her around the house, she'll work with two of your slaves."); + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("h3", f, "Economics and events"); + r = []; + r.push("The economics report offers some flavor, but you should leave the options it offers alone until you've got some spare cash. An event or two will follow; feel free to reload the page on each (F5 on most browsers) to see what the different options do. Generally, try to pick options that give you"); + r.push(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash")); + r.push("and improve"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted"), "."), ["devotion", "inc"])); + r.push(App.Encyclopedia.Dialog.linkDOM("Trust", "Trust", "trust inc")); + r.push("and"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("can wait."); + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("h3", f, "Moving forward"); + r = []; + r.push("Hopefully, many of your slaves learned skills during their week of"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("whoring", "Whoring"), ".")); + r.push("Three levels of skill (<span class='cyan'>Veteran Whore</span> or <span class='cyan'>W+++</span> for example) is the maximum, though slaves without vaginas will only acquire two complete levels of sexual skills. As you move through the first ten weeks or so, many of your slaves will max out their whoring and sexual skills. When they do, switch them over to"); + r.push(App.Encyclopedia.Dialog.linkDOM("public service", "Public Service")); + r.push("until they achieve maximum"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("entertainment skill", "Entertainment Skill"), ",")); + r.push("and then put them back on whoring, since cross training will improve their whoring performance. When your Head Girl alternate has maxed skills, make her the Head Girl and train up the MILF she replaced. Switch your personal attention around; for now, fix the"); + r.push(App.Encyclopedia.Dialog.linkDOM("quirks", "Quirks")); + r.push("of the most"); + r.push(App.Encyclopedia.Dialog.linkDOM("devoted", "From Rebellious to Devoted", "devotion accept")); + r.push("slave who has any, since that's the best way to maximize your chances of success each turn."); + App.Events.addParagraph(f, r); + + r = []; + r.push(`Pay attention to your cash flow. If it's positive and you have a decent buffer of <span class='cash'>${cashFormat(10000)}</span> or so built up, wait for the slave market prices to naturally dip, and then purchase a girl or two to work on once your starting stable is well trained, though you may have to confine or rest new purchases for a while if they're`); + r.push(App.Encyclopedia.Dialog.linkDOM("rebellious", "From Rebellious to Devoted", "devotion resistant")); + r.push("or sick. If you get a virgin, consider applying chastity to preserve value for resale. When prices are high, consider selling anyone who's free of flaws and has a discovered sexual fetish, since this maximizes value bonuses. Within ten turns, you should be making decent weekly profit, with resale of slaves building up your bank when prices favor sale. Once you're confident of the whoring mechanics, consider building a"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("brothel", "Brothel"), ".")); + r.push("Your alternate Head Girl will make a good"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("madam", "Madam"), ".")); + App.Events.addParagraph(f, r); + + return f; +}, "guide"); + +App.Encyclopedia.addArticle("How to Play", function() { + const f = new DocumentFragment(); + let r; + + r = []; + r.push("This is not a game in which the PC slaveowner is some magical sexual god whose mere presence turns women into submissives. This means that sane slaves will tend to lose obedience and"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust inc")); + r.push("over time if you don't take any steps to maintain their mental state. Mental stats have maximum and minimum values. These are somewhat 'sticky,' so slaves at minimum"); + r.push(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted", "devotion accept")); + r.push("for example may require an extra jolt to break free of this state."); + App.Events.addParagraph(f, r); + + r = []; + r.push("Maximized"); + r.push(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted", "devotion accept")); + r.push("and"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust careful")); + r.push("are not useless; if one of these stats is maximized and the other is not, the extra"); + r.push(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted", "devotion accept")); + r.push("or"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust careful")); + r.push("will boost the other. If both are maximized, the player gains"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("instead. However if both are low the slave in question is liable to experience breakdowns and generally be useless."); + App.Events.addParagraph(f, r); + + r = []; + r.push("A slave's health is extremely important. Being healthy generally improves beauty and job performance. Most transformative drugs and surgeries can damage health, while curative drugs and rest will restore it. Extremely unhealthy slaves can die, while extremely healthy slaves enjoy considerable bonuses on many assignments. Health damage is generally scaled to a slave's current health, so if a slave is already unhealthy, injuries will hurt her more severely. Pulling a slave with red health indicators off work for a week of rest is generally advisable."); + App.Events.addParagraph(f, r); + + r = []; + r.push("The first button in the left-side UI bar will always continue the game without taking any actions. If you wish to advance the game rapidly, click that button repeatedly. If you are presented with a menu and do not wish to select any of the options, that button will also serve as a none of the above choice. <strong>The spacebar will also advance the game.</strong>"); + App.Events.addParagraph(f, r); + + r = []; + r.push("The author has played several otherwise good H-Games in which it can be hard to parse exactly what the flavor descriptions mean in terms of stats. Therefore, this game will usually flag stat impacts in descriptions by means of colored text. For example:"); + const ul = document.createElement("ul"); + App.Events.addNode(ul, ["<span class='green'>Green text</span> means something good, like a <span class='health inc'>healthy</span> slave."], "li"); + App.Events.addNode(ul, ["<span class='red'>Red text</span> means something bad, like a sick or injured slave. "], "li"); + App.Events.addNode(ul, ["<span class='yellow'>Yellow text</span> means something neutral but noteworthy. "], "li"); + App.Events.addNode(ul, ["<span class='hotpink'>pink text</span> means an increase in a slave's regard for to you. "], "li"); + App.Events.addNode(ul, ["<span class='mediumorchid'>Orchid text</span> means a decrease in a slave's regard for to you. "], "li"); + App.Events.addNode(ul, ["<span class='trust inc'>Aquamarine text</span> means an increase in a slave's", + App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust inc"), "of to you, and a reduction in her fear of you. "], "li"); + App.Events.addNode(ul, ["<span class='trust dec'>Gold text</span> means a decrease in the slave's", + App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust dec"), " of you, and an increase in her fear of you. "], "li"); + App.Events.addNode(ul, ["<span class='orangered'>Orange-red text</span> means a decrease in a hateful slave's fear of you. "], "li"); + App.Events.addNode(ul, ["<span class='lime'>Lime text</span> means something has grown or improved, which is usually, but not always, good. "], "li"); + App.Events.addNode(ul, ["<span class='orange'>Orange text</span> means something has shrunk or degraded, which is usually, but not always, bad. "], "li"); + App.Events.addNode(ul, ["<span class='cash'>Yellow-green text</span> is for a", + App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash"), "-related"), "event. "], "li"); + App.Events.addNode(ul, ["<span class='coral'>Coral text</span> is used for simple identifiers that can be used to check a slave's general type at a glance, also weakening fetishes. "], "li"); + App.Events.addNode(ul, ["<span class='lightcoral'>Light coral text</span> is used when a slave's fetish strengthens or develops. "], "li"); + App.Events.addNode(ul, ["<span class='lightgreen'>Light green text</span> is used to indicate positive relationships. "], "li"); + App.Events.addNode(ul, ["<span class='lightsalmon'>Light salmon text</span> is used when a rivalry develops or strengthens. "], "li"); + App.Events.addNode(ul, ["<span class='libido inc'>Violet text</span> means an increase in sex drive. "], "li"); + App.Events.addNode(ul, ["<span class='libido dec'>Khaki text</span> means a decrease in sex drive. "], "li"); + r.push(ul); + App.Events.addParagraph(f, r); + + r = []; + r.push("<strong>It is important to note</strong> that if a scene doesn't have colored text, it doesn't impact a slave's stats. For example, the short sex scenes available from the main screen are for the most part unlimited and have no real gameplay effect: they are for fun and flavor only."); + App.Events.addParagraph(f, r); + + r = []; + r.push("This game produces less visible text than a lot of text-based H-Games; this is because most text has numerous variations that change based on a slave's body, mental state etc. The author has deliberately made some of the variations available only with extreme stats so that new content will still be out there even if you play for a while."); + App.Events.addParagraph(f, r); + + r = []; + r.push("Things that increase income from"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("prostitution", "Whoring"), ",")); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("gain from"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("slutting", "Public Service"), ",")); + r.push("and performance in most jobs include all appearance stats (that's right, every one; though some are more or less important),"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("sexual skills", "Skills"), ",")); + r.push("a slave's"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("health", "Health"), ",")); + r.push("and the state of a slave's holes. Going from a novice to a veteran whore will have non-linear impacts on income, since a novice will get good"); + r.push(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash")); + r.push("for being fresh and little"); + r.push(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash")); + r.push("for her skills, and a veteran will get the reverse. The"); + r.push(App.Encyclopedia.Dialog.linkDOM("fetishes", "Fetishes")); + r.push("and physical statuses that get pink text on the main menu (huge tits, bisexual, etc.) give bonuses."); + App.Events.addParagraph(f, r); + + r = []; + r.push("The game is not intended to be crushingly difficult, but it is balanced so that in order to achieve some of the best event outcomes, and eventually in order to survive, the player must build a business empire that turns a significant profit. Profits are necessary because the player will want to be able to make some major expenditures in the late game. Buy low, sell high, and always try to improve your slaves. Even something as simple as a few weeks' personal attention to fix"); + r.push(App.Encyclopedia.Dialog.linkDOM("mental flaws", "Flaws")); + r.push("and boost"); + r.push(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted", "devotion accept")); + r.push("can produce significant profits when a slave is resold."); + App.Events.addParagraph(f, r); + + return f; +}, "guide"); + +App.Encyclopedia.addArticle("Keyboard Shortcuts", function() { + const f = new DocumentFragment(); + let r; + + r = []; + r.push(`The uppermost button (in events and reports it continues the game, while in menus it functions as a back button) in the left-side UI bar can be activated via context sensitive keybinds; <strong>${App.UI.Hotkeys.hotkeys("endWeek")}</strong> is used to end the week from the main menu, and <strong>${App.UI.Hotkeys.hotkeys("nextLink")}</strong> is used to continue in all other situations.`); + App.Events.addParagraph(f, r); + + r = []; + r.push(`Within slaves' individual menus <strong>${App.UI.Hotkeys.hotkeys("prev-slave")}</strong> will move to the last slave and <strong>${App.UI.Hotkeys.hotkeys("next-slave")}</strong> to the next.`); + r.push(`Review your personal affairs with <strong>${App.UI.Hotkeys.hotkeys("Manage Personal Affairs")}</strong> and weekly actions with <strong>${App.UI.Hotkeys.hotkeys("Personal Attention Select")}</strong>.`); + const ul = document.createElement("ul"); + App.Events.addNode(ul, [`<strong>${App.UI.Hotkeys.hotkeys("Rules Assistant")}</strong> will open RA Rules.`], "li"); + App.Events.addNode(ul, [`<strong>${App.UI.Hotkeys.hotkeys("Manage Arcology")}</strong> will open arcology management.`], "li"); + App.Events.addNode(ul, [`<strong>${App.UI.Hotkeys.hotkeys("Options")}</strong> will opens the options menu.`], "li"); + App.Events.addNode(ul, [`<strong>${App.UI.Hotkeys.hotkeys("Buy Slaves")}</strong> will open the slave markets.`], "li"); + App.Events.addNode(ul, [`<strong>${App.UI.Hotkeys.hotkeys("BG Select")}</strong> will open Bodyguard management.`], "li"); + App.Events.addNode(ul, [`<strong>${App.UI.Hotkeys.hotkeys("Future Society")}</strong> will open Future Societies.`], "li"); + App.Events.addNode(ul, [`<strong>${App.UI.Hotkeys.hotkeys("Manage Penthouse")}</strong> will open Manage Penthouse.`], "li"); + App.Events.addNode(ul, [`<strong>${App.UI.Hotkeys.hotkeys("Manage Penthouse")}</strong> will <strong>only open</strong> Head Girl management on the main page.`], "li"); + r.push(ul); + App.Events.addParagraph(f, r); + + r = []; + r.push("Nearly every key can be rebound in Hotkey Settings which can be accessed in game via SideBar -> Options -> Hotkey Settings."); + App.Events.addParagraph(f, r); + + return f; +}, "guide"); + +App.Encyclopedia.addArticle("The Arcology Interface", function() { + const f = new DocumentFragment(); + let r; + + r = []; + r.push("The Arcology Interface is the large table-based display at the top of the main menu. It's designed as an abstract representation of the arcology."); + App.Events.addParagraph(f, r); + + r = []; + r.push("It is divided into levels and sectors. Levels are the horizontal rows. An arcology is a very large building, and each Level includes many floors. Sectors are slices of those levels. For example, on Levels with four Sectors, each sector includes a quarter of each floor that's part of that Level. Each Sector has its own cell in the interface, and each Sector is occupied by facilities, tenants, or both. Each type of Sector occupant is bordered in a different color. The contents of a Sector can be viewed and changed by clicking on the text inside a Sector."); + App.Events.addParagraph(f, r); + + r = []; + r.push("The uppermost level is the Penthouse. It's where the player character and the slaves under their direct supervision live, and it can be upgraded with a number of facilities that can be accessed through shortcuts that are added to the Penthouse in the interface once they're installed. Some of these facilities can house some of the player character's sex slaves. Unlike every other Sector, the Penthouse is always owned by the player and cannot be sold. Every other Sector can be privately owned, reducing the player's control of the arcology. Privately owned Sectors can be purchased, or acquired using"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("if the player character's"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("is extremely high. Privately owned sectors are bordered in red regardless of what's in them."); + App.Events.addParagraph(f, r); + + r = []; + r.push("The next level down, with three Sectors, is the Promenade, which is a major social area and hosts most of the businesses which cater to the arcology's citizens. Promenade Sectors are occupied by Shops by default, which will automatically be filled by business tenants that will pay the player character rent if they own the Sector. Promenade Sectors can be upgraded into"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("brothels", "Brothel"), ",")); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("clubs", "Club"), ",")); + r.push("or an enhanced version of shops which will attract business tenants that help advance a specific"); + r.push(App.Encyclopedia.Dialog.linkDOM("future society", "Future Societies")); + r.push("model, and still provide rent."); + App.Events.addParagraph(f, r); + + r = []; + r.push("The next three levels have four sectors and are living areas that are occupied by apartments by default. These house arcology citizens, who pay rent, and who are indirectly very important because they determine the level of local demand for sexual services provided by whores, public servants, and other sex slaves doing sexual jobs. Apartments can be upgraded for either density or luxury. Dense Apartments increase the citizen population, and are therefore useful to keep demand up if the player is relying on selling or giving away sexual services. Luxury apartments increase the arcology's prosperity, and are therefore a better choice if demand for sexual services isn't a priority."); + App.Events.addParagraph(f, r); + + r = []; + r.push("The first level with five Sectors is the Concourse. Like the Promenade, it hosts businesses, but these focus more on bulk trade and less on citizens' luxury needs, and include the arcology's slave markets. Its sectors are occupied by Markets by default, which pay rent. Concourse sectors can be upgraded into a"); + r.push(App.Encyclopedia.Dialog.linkDOM("pit", "Pit")); + r.push("for fighting slaves, an"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("arcade", "Arcade"), ",")); + r.push("or into a flagship store for the player character's"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("corporation", "The Corporation"), ".")); + App.Events.addParagraph(f, r); + + r = []; + r.push("The lowest level, also with five Sectors, is the Service level. Its Sectors are occupied by Manufacturing by default, which of course pay rent. If the player is focusing on menial slaves, its Sectors can be upgraded into pens, to increase the total number of"); + r.push(App.Encyclopedia.Dialog.linkDOM("menial slaves", "Menial Slaves")); + r.push("that can be kept in the arcology, or into Sweatshops, to put the labor of menial slaves in the arcology to use. Alternatively, these Sectors can be upgraded into a"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("dairy", "Dairy"), ",")); + r.push("or into a barracks, which will reduce the weekly upkeep of any mercenaries the player character has hired."); + App.Events.addParagraph(f, r); + + return f; +}, "guide"); + +App.Encyclopedia.addArticle("Tips and Tricks", function() { + const f = new DocumentFragment(); + let r; + + App.UI.DOM.appendNewElement("p", f, "Buy low, sell high."); + + r = []; + r.push("Slaves will sometimes default to the resting assignment after they're done with something else. If a slave is resting and the game suspects that she shouldn't be, her assignment will be <span class='freeAssignment'>lime, bold, and underlined</span> on the main menu to indicate that."); + App.Events.addParagraph(f, r); + + r = []; + r.push("If a new slave isn't afraid of you, make her. Then and only then build her"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted"), "."), ["devotion", "accept"])); + App.Events.addParagraph(f, r); + + r = []; + r.push("The personal attention assignment should be used tactically. It is the most powerful single way of improving slaves because it's reliable. Devotion and"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust")); + r.push("gains during a single week are normally capped. However, personal attention removes these caps. This is most powerful for slaves that are already well broken and are enjoying fairly luxurious lives. With so many things driving up devotion and"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("trust", "Trust"), ",")); + r.push("using personal attention to remove the caps can quickly maximize both stats. Focusing on business instead (by selecting no slave for personal attention) is also powerful. Doing so produces"); + r.push(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash")); + r.push("proportional to the amount of"); + r.push(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash")); + r.push("on hand, <strong>and</strong> improves prosperity growth, which improves future income from rents."); + App.Events.addParagraph(f, r); + + return f; +}, "guide"); + +App.Encyclopedia.addArticle("Design Your Master", function() { + const f = new DocumentFragment(); + let r; + + r = []; + r.push("This happens at the start of a game of FC: it is not possible to change the PC during the main game. The player must select a career background, a rumored method of acquiring the arcology, and their age group; then choose between some broad body and gender options."); + App.Events.addParagraph(f, r); + + r = []; + r.push(`<strong>Wealth</strong> is a choice for both the <strong>career background</strong> and <strong>rumored method of acquiring the arcology</strong> options. Both provide you with <span class="cash">${cashFormat(10000)}</span> each for a total of <span class="cash">${cashFormat(30000)}</span> if both are chosen. As a <strong>background option</strong> it means that your starting slaves will have two free levels of sex skills available.`); + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("h3", f, "Career background options"); + const p = document.createElement("p"); + p.append("Being an ex-"); + let ul = document.createElement("ul"); + + r = []; + r.push("<strong>business owner</strong> <span class='note'>(also referred to as capitalist)</span> enhances the business-focused personal attention, increasing the"); + r.push(App.Encyclopedia.Dialog.linkDOM("money", "Money", "cash")); + r.push("it produces and improving arcology prosperity when business-focused personal attention is selected. Also, your starting slaves will have a free level of prostitution skill available. Starts having already mastered"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Trading", "PC Skills"), ".")); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>private security contractor</strong> <span class='note'>(also referred to as mercenary background)</span> greatly reduces the cost of keeping mercenaries in your employ. Your starting slaves will have free"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust careful")); + r.push("available. Starts having already mastered"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Warfare", "PC Skills"), ".")); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>slave driver</strong> enhances slave-focused personal attention, adding bonus"); + r.push(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted", "devotion accept")); + r.push("or"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust careful")); + r.push("to many training applications or preventing their loss. Starting slaves will be cheaper, in addition having already mastered"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Slaving", "PC Skills"), ".")); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>arcology engineer</strong> provides a significant discount on many <span class='cash'>arcology upgrades and expansions.</span> In addition to the arcology starting off with <span class='positive'>basic economic upgrades</span> already installed. Starts having already mastered"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Engineering", "PC Skills"), ".")); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>doctor</strong> allows the player character to perform surgery personally, providing a <span class='cash'>discount on surgery costs</span> and a <span class='positive'>reduction to resulting health damage.</span> Additionally, slaves may react differently to surgery if the player character performs it and starting slaves will have free implants available. Starts having already mastered"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Medicine", "PC Skills"), ".")); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>escort</strong> provides a one-time bonus to a slave's entertainment, whoring, and two sexual skills when a new slave is acquired. Furthermore, society will not take lightly to being run by an ex-whore, and you will receive heavy"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("losses each week. You can spend your free time selling your body for"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("money", "Money"), ","), "cash")); + r.push("at the cost of a large amount of"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation"), "."), ["reputation", "inc"])); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>celebrity</strong> provides extra"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("at game start. Starting slaves will have a free level of entertainment skill available."); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>servant</strong> provides a one-time bonus to a slave's"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust careful")); + r.push("and"); + r.push(App.UI.DOM.makeElement("span", App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted"), "."), ["devotion", "accept"])); + r.push("Furthermore, society will not approve of being run by an ex-servant, and you will face"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("losses each week. You can spend your free time, putting your previous experience to use, by greatly reducing the costs of your penthouse. You also passively reduce costs when not focusing on doing so."); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>gang leader</strong> provides a one-time bonus to a slave's health and a free level of combat skill. Furthermore, society will not approve of being run by a gang-banger, and you will face"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("losses each week. New slaves will likely have heard of your previous exploits and fear you. You know how to haggle slaves. You can spend your free time putting your previous experience to use, proving another source of income however this isn't guaranteed."); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>incursion specialist</strong> provides starting slaves with a free level of <span class='intelligent'>intelligence.</span> Also certain upgrades may be"); + r.push(App.Encyclopedia.Dialog.linkDOM("cheaper", "Money", "cash")); + r.push("and you may find alternative approaches to problems. Starts having already mastered"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("Hacking", "PC Skills"), ".")); + App.Events.addNode(ul, r, "li"); + + p.append(ul); + f.append(p); + + r = []; + r.push("Players using the"); + r.push(App.Encyclopedia.Dialog.linkDOM("Security Expansion", "Security Expansion")); + r.push("mod may want to view this page with"); + r.push(App.UI.DOM.combineNodes(App.Encyclopedia.Dialog.linkDOM("additional details", "Design Your Master in SecExp"), ".")); + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("h3", f, "Rumored acquisition options"); + ul = document.createElement("ul"); + r = []; + r.push("<strong>Hard Work</strong> provides a one-time bonus to both"); + r.push(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted", "devotion accept")); + r.push("and"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust accept")); + r.push("when a new slave is acquired."); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>Force</strong> means that if a slave does not have enough"); + r.push(App.Encyclopedia.Dialog.linkDOM("devotion", "From Rebellious to Devoted", "devotion accept")); + r.push("to obey when acquired, this option will terrify her and reduce her"); + r.push(App.Encyclopedia.Dialog.linkDOM("trust", "Trust", "trust accept")); + r.push("to the point where she should comply."); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>Social Engineering</strong> means that you will start with the first societal option unlocked, since you manipulated the arcology's citizens."); + App.Events.addNode(ul, r, "li"); + + r = []; + r.push("<strong>Luck</strong> provides extra"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("at game start, but no ongoing advantages once the main game begins."); + App.Events.addNode(ul, r, "li"); + + App.UI.DOM.appendNewElement("p", f, ul); + + App.UI.DOM.appendNewElement("h3", f, "Age groups"); + r = []; + r.push("Older PCs enjoy easier"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("maintenance, but possess lower"); + r.push(App.Encyclopedia.Dialog.linkDOM("sexual energy", "Sexual Energy")); + r.push("while younger PC's are the opposite."); + App.Events.addParagraph(f, r); + + App.UI.DOM.appendNewElement("h3", f, "Body and gender options"); + r = []; + r.push("All PC body changes will alter scenes, but their main mechanical effect is on"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("maintenance. Feminine options will make it harder to maintain"); + r.push(App.Encyclopedia.Dialog.linkDOM("reputation", "Arcologies and Reputation", "reputation inc")); + r.push("without providing any gameplay advantage, making playing as a feminine PC a form of increased difficulty. There are other minor gameplay differences including differing slave reactions to the PC based on attraction, but these are fairly minor."); + App.Events.addParagraph(f, r); + + return f; +}, "guide"); + +App.Encyclopedia.addCategory("guide", function() { + const r = []; + r.push(App.Encyclopedia.Dialog.linkDOM("First Game Guide", "First Game Guide")); + r.push(App.Encyclopedia.Dialog.linkDOM("How to Play", "How to Play")); + r.push(App.Encyclopedia.Dialog.linkDOM("Keyboard Shortcuts", "Keyboard Shortcuts")); + r.push(App.Encyclopedia.Dialog.linkDOM("The Arcology Interface", "The Arcology Interface")); + r.push(App.Encyclopedia.Dialog.linkDOM("Tips and Tricks", "Tips and Tricks")); + r.push(App.Encyclopedia.Dialog.linkDOM("Design Your Master", "Design Your Master")); + return App.UI.DOM.generateLinksStrip(r); +}); diff --git a/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw b/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw index 48bf1a4d93abff76b48243cd434bbbce16eb6a50..dbf0e17244ea73b6179c50409250c34cd2befd42 100644 --- a/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw +++ b/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw @@ -5,18 +5,13 @@ <br><h3>Related Links</h3> <</if>> -<<switch $encyclopedia>> -/********** -PLAYING FREE CITIES -**********/ -<<case "Design Your Master" "First Game Guide" "How to Play" "Keyboard Shortcuts" "Playing Free Cities" "The Arcology Interface" "Tips and Tricks">> - <<= App.Encyclopedia.Dialog.linkSC("First Game Guide", "First Game Guide")>> - | <<= App.Encyclopedia.Dialog.linkSC("How to Play", "How to Play")>> - | <<= App.Encyclopedia.Dialog.linkSC("Keyboard Shortcuts", "Keyboard Shortcuts")>> - | <<= App.Encyclopedia.Dialog.linkSC("The Arcology Interface", "The Arcology Interface")>> - | <<= App.Encyclopedia.Dialog.linkSC("Tips and Tricks", "Tips and Tricks")>> - | <<= App.Encyclopedia.Dialog.linkSC("Design Your Master", "Design Your Master")>> +<<set _pass = App.Encyclopedia.renderCategory($encyclopedia)>> +<<if _pass>> + <<includeDOM _pass>> +<<else>> + +<<switch $encyclopedia>> /********** BEING IN CHARGE @@ -88,53 +83,6 @@ SLAVE LEADERS: | <<= App.Encyclopedia.Dialog.linkSC("Stewardess", "Stewardess")>> | <<= App.Encyclopedia.Dialog.linkSC("Wardeness", "Wardeness")>> -/********** -SLAVE ASSIGNMENTS (COMMON): -**********/ -<<case "Attending Classes" "Confinement" "Fucktoy" "Glory Hole" "Milking" "Farming" "Public Service" "Rest" "Sexual Servitude" "Servitude" "Slave Assignments" "Whoring">> - <<= App.Encyclopedia.Dialog.linkSC("Common Assignments", "Slave Assignments")>> - | <<= App.Encyclopedia.Dialog.linkSC("Career Experience", "Career Experience")>> - | <<= App.Encyclopedia.Dialog.linkSC("Attending Classes", "Attending Classes")>> - | <<= App.Encyclopedia.Dialog.linkSC("Confinement", "Confinement")>> - | <<= App.Encyclopedia.Dialog.linkSC("Farming", "Farming")>> - | <<= App.Encyclopedia.Dialog.linkSC("Fucktoy", "Fucktoy")>> - | <<= App.Encyclopedia.Dialog.linkSC("Glory Hole", "Glory Hole")>> - | <<= App.Encyclopedia.Dialog.linkSC("Milking", "Milking")>> - | <<= App.Encyclopedia.Dialog.linkSC("Public Service", "Public Service")>> - | <<= App.Encyclopedia.Dialog.linkSC("Rest", "Rest")>> - | <<= App.Encyclopedia.Dialog.linkSC("Servitude, Sexual", "Sexual Servitude")>> - | <<= App.Encyclopedia.Dialog.linkSC("Servitude", "Servitude")>> - | <<= App.Encyclopedia.Dialog.linkSC("Whoring", "Whoring")>> - -/********** -SLAVE BODY: -**********/ -<<case "Anuses" "Areolae" "Body" "Breasts" "Butts" "Clits" "Dicks" "Ethnicity" "Faces" "Height" "Hips" "Lactation" "Lips" "Musculature" "Nipples" "Ovaries" "Skin Distinctions" "Teeth" "Testicles" "Vaginas" "Waist" "Weight" "Hormones (XX)" "Hormones (XY)">> - <<= App.Encyclopedia.Dialog.linkSC("Anuses", "Anuses")>> - | <<= App.Encyclopedia.Dialog.linkSC("Areolae", "Areolae")>> - | <<= App.Encyclopedia.Dialog.linkSC("Breasts", "Breasts")>> - | <<= App.Encyclopedia.Dialog.linkSC("Butts", "Butts")>> - | <<= App.Encyclopedia.Dialog.linkSC("Clits", "Clits")>> - | <<= App.Encyclopedia.Dialog.linkSC("Dicks", "Dicks")>> - | <<= App.Encyclopedia.Dialog.linkSC("Ethnicity", "Ethnicity")>> - | <<= App.Encyclopedia.Dialog.linkSC("Faces", "Faces")>> - | <<= App.Encyclopedia.Dialog.linkSC("Height", "Height")>> - | <<= App.Encyclopedia.Dialog.linkSC("Hips", "Hips")>> - | <<= App.Encyclopedia.Dialog.linkSC("Lactation", "Lactation")>> - | <<= App.Encyclopedia.Dialog.linkSC("Lips", "Lips")>> - | <<= App.Encyclopedia.Dialog.linkSC("Musculature", "Musculature")>> - | <<= App.Encyclopedia.Dialog.linkSC("Nipples", "Nipples")>> - | <<= App.Encyclopedia.Dialog.linkSC("Ovaries", "Ovaries")>> - | <<= App.Encyclopedia.Dialog.linkSC("Pregnancy", "Pregnancy")>> - | <<= App.Encyclopedia.Dialog.linkSC("Skin Distinctions", "Skin Distinctions")>> - | <<= App.Encyclopedia.Dialog.linkSC("Teeth", "Teeth")>> - | <<= App.Encyclopedia.Dialog.linkSC("Testicles", "Testicles")>> - | <<= App.Encyclopedia.Dialog.linkSC("Vaginas", "Vaginas")>> - | <<= App.Encyclopedia.Dialog.linkSC("Waist", "Waist")>> - | <<= App.Encyclopedia.Dialog.linkSC("Weight", "Weight")>> - | <<= App.Encyclopedia.Dialog.linkSC("XX", "Hormones (XX)")>> - | <<= App.Encyclopedia.Dialog.linkSC("XY", "Hormones (XY)")>> - /********** SLAVE SKILLS **********/ @@ -466,3 +414,4 @@ MODS | <<= App.Encyclopedia.Dialog.linkSC("Bioengineering", "Bioengineering")>> <</switch>> +<</if>> diff --git a/src/gui/interactiveDetails.js b/src/gui/interactiveDetails.js deleted file mode 100644 index 548e501761cd932478733926f30d1fcab011cbd8..0000000000000000000000000000000000000000 --- a/src/gui/interactiveDetails.js +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Displays a value that you can click on to get some details in an overlay - */ -App.UI.DOM.InteractiveDetails = class { - /** - * @param {string} linkText text to use for the show/hide link - * @param {function(): HTMLElement|DocumentFragment} [detailsGenerator] function which generates the contents of the details overlay (omit to disable details) - * @param {string[]} [linkClasses=[]] list of extra CSS classes to apply to the link - */ - constructor(linkText, detailsGenerator, linkClasses = []) { - this.span = App.UI.DOM.makeElement("span", "", "details-overlay"); - this.span.style.visibility = "hidden"; - this.link = detailsGenerator ? App.UI.DOM.link(linkText, () => this.toggle()) : App.UI.DOM.makeElement("span", linkText); - this.link.classList.add(...linkClasses); - this.func = detailsGenerator; - this.shown = false; - } - - /** - * Toggle the visibility of the overlay (changing the render state) - */ - toggle() { - this.shown = !this.shown; - if (this.shown) { - $(this.span).empty().append(this.func()); - // by default, the CSS will try to show it as inline-block on the right - this.span.style.removeProperty("right"); // reset style in case we'd moved it last time it was shown - const overlayRect = this.span.getBoundingClientRect(); - const linkRect = this.link.getBoundingClientRect(); - if (overlayRect.right > window.innerWidth) { - if (overlayRect.width < linkRect.left) { - // if it won't fit in the default position, but it *will* fit on the left, force it to move over to the left side of the link - this.span.style.right = "100%"; - } - // if it won't fit on either side, give up and leave it where it is. TODO: maybe do something smarter? - } - this.span.style.visibility = "visible"; - } else { - $(this.span).empty(); - this.span.style.visibility = "hidden"; - } - } - - /** - * Render the object to the page - * @returns {HTMLSpanElement} - */ - render() { - const containingSpan = document.createElement("span"); - containingSpan.style.position = "relative"; // required for absolute positioning to work correctly later - containingSpan.append(this.link, this.span); - return containingSpan; - } -}; diff --git a/src/gui/options/optionsGroup.js b/src/gui/options/optionsGroup.js index 1401237940d57a0fe2f24963fbc6d9ea48df14c7..b005e0c3e6cbefa45af70d4d43356df3fbe4fe86 100644 --- a/src/gui/options/optionsGroup.js +++ b/src/gui/options/optionsGroup.js @@ -58,7 +58,7 @@ App.UI.OptionsGroup = (function() { addValueList(values) { for (const value of values) { if (Array.isArray(value)) { - this.addValue(value[0], value[1]); + this.addValue(value[0], value[1], value[2]); } else { this.addValue(value); } diff --git a/src/gui/storyCaption.js b/src/gui/storyCaption.js index 138447be6be60c49654539dbc4fdd925b13617e1..a2ff2f9a9a858e5c2c11195c4bdc087bb6c120cc 100644 --- a/src/gui/storyCaption.js +++ b/src/gui/storyCaption.js @@ -65,7 +65,11 @@ App.UI.storyCaption = function() { if (V.debugMode > 0) { fragment.append(debug()); } - /* Closes nextButton != "Continue" && nextButton != " " */ + } + + const reminders = App.UI.DOM.appendNewElement("div", fragment, App.UI.DOM.link("Reminders", () => App.Reminders.dialog())); + if (V.reminders.find(r => r.week <= V.week)) { + reminders.append(" ", App.UI.DOM.makeElement("span", String.fromCharCode(0xe80c), ["icons", "noteworthy"])); } } else if (pass === "Starting Girls") { fragment.append(startingGirls()); diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js index a33af50bc6ea68a22ad03491d7ee9a8abe6d3a74..d760154404277d11d1699399c9ea63ef6ddf45f2 100644 --- a/src/interaction/main/walkPast.js +++ b/src/interaction/main/walkPast.js @@ -4,7 +4,6 @@ globalThis.walkPast = (function() { // selection variables let target; - let partner; let partnerSlave; /** generate a walkPast vignette @@ -14,51 +13,51 @@ globalThis.walkPast = (function() { */ function walkPast(activeSlave, fixedTarget) { let output = ""; + let partner = ""; - let flag; - if (totalRelatives(activeSlave) > 0 && ((fixedTarget === "FRelation") || (!fixedTarget && jsRandom(1, 100) > 80))) { - flag = 110; + if (totalRelatives(activeSlave) > 0 && ((fixedTarget === "fRelation") || (!fixedTarget && jsRandom(1, 100) > 80))) { partner = "relation"; - } else if (activeSlave.relationship > 0 && ((fixedTarget === "FRelation") || (!fixedTarget && jsRandom(1, 100) > 70))) { - flag = 120; + } else if (activeSlave.relationship > 0 && ((fixedTarget === "fRelation") || (!fixedTarget && jsRandom(1, 100) > 70))) { partner = "relationship"; - } else if (activeSlave.rivalry !== 0 && hasAllLimbs(activeSlave) && ((fixedTarget === "FRival") || (!fixedTarget && jsRandom(1, 100) > 70))) { - flag = 130; + } else if (activeSlave.rivalry !== 0 && hasAllLimbs(activeSlave) && ((fixedTarget === "fRival") || (!fixedTarget && jsRandom(1, 100) > 70))) { partner = "rivalry"; } else { - flag = 99; partner = ""; } // return if we insist on a relation or rival but we didn't find one above - if (["FRelation", "FRival"].includes(fixedTarget) && !partner) { + if (["fRelation", "fRival"].includes(fixedTarget) && !partner) { return; } const seed = jsRandom(1, 100); - output += primeSlave(activeSlave, seed); + + // loverSlave outputs for both slaves, but other paths require primeSlave output first + if (partner !== "relationship" || !App.Utils.hasPartnerSex(activeSlave)) { + output += primeSlave(activeSlave, seed); + } if (partner === "rivalry") { output += rivalSlave(activeSlave, seed); } else if (partner === "relationship" && App.Utils.hasPartnerSex(activeSlave)) { output += loverSlave(activeSlave); } else if (partner === "relationship" || partner === "relation") { - output += relatedSlave(activeSlave); + output += relatedSlave(activeSlave, partner); } else { switch (fixedTarget) { - case "FLips": + case "fLips": output += lipWatch(activeSlave); break; - case "FBoobs": + case "fBoobs": output += boobWatch(activeSlave); break; - case "FButt": + case "fButt": output += buttWatch(activeSlave); break; - case "FAnus": + case "fAnus": output += anusWatch(activeSlave); break; - case "FVagina": + case "fVagina": if (activeSlave.belly < 150000) { if (activeSlave.vagina >= 0) { output += `<br><span class="note">Vagina scene available:</span> ${vaginaWatch(activeSlave)}`; @@ -68,7 +67,7 @@ globalThis.walkPast = (function() { output += `<br><span class="note">Belly scene available:</span> ${bellyWatch(activeSlave)}`; } break; - case "FDick": + case "fDick": if (activeSlave.belly < 150000) { if (activeSlave.dick > 0 && (V.policies.sexualOpenness === 1 || activeSlave.toyHole === "dick")) { output += dickWatch(activeSlave); @@ -108,44 +107,39 @@ globalThis.walkPast = (function() { } = getPronouns(activeSlave); let links = []; - const executeWalkpast = (passage) => { - V.AS = activeSlave.ID; // TODO: remove me once all the F* passages don't need activeSlave anymore - $(`#walkpast-${activeSlave.ID}`).empty().append(App.UI.DOM.renderPassage(passage)); + const executeWalkpast = (passage, ...args) => { + $(linkSpan).empty().append(App.Interact[passage](activeSlave, ...args)); }; if (activeSlave.fuckdoll === 0) { - if (target === "FButt" && activeSlave.chastityAnus) { + if (target === "fButt" && activeSlave.chastityAnus) { output += ` If you wish to have anal intercourse with ${him} you must order ${him} to remove ${his} chastity belt.`; - links.push(App.UI.DOM.link(`Grope ${his} rear instead`, executeWalkpast, "FondleButt")); - } else if (target === "FVagina" && activeSlave.chastityVagina) { + links.push(App.UI.DOM.link(`Grope ${his} rear instead`, executeWalkpast, ["fondleButt"])); + } else if (target === "fVagina" && activeSlave.chastityVagina) { output += ` If you wish to have vanilla intercourse with ${him} you must order ${him} to remove ${his} chastity belt.`; - } else if (flag > 100) { - links.push(App.UI.DOM.link(`Summon them both`, (partner, relation, target) => { - V.partner = partner; - V.relation = relation; // TODO: remove these once FRelation/FRival don't need them anymore - executeWalkpast(target); - }, [partner, flag === 110 ? partnerSlave.ID : null, target])); + } else if (target === "fRelation" || target === "fRival") { + links.push(App.UI.DOM.link(`Summon them both`, executeWalkpast, [target, partnerSlave])); } else if (activeSlave.assignment === Job.CONFINEMENT) { - links.push(App.UI.DOM.link(`Have ${him} brought out of ${his} cell`, executeWalkpast, target)); + links.push(App.UI.DOM.link(`Have ${him} brought out of ${his} cell`, executeWalkpast, [target])); } else if (activeSlave.assignment === Job.DAIRY && V.dairyRestraintsSetting > 1) { output += ` ${He} is strapped into a milking machine and cannot leave ${V.dairyName}.`; } else { if ([Job.ARCADE, Job.CELLBLOCK, Job.ATTENDANT, Job.DJ, Job.MADAM, Job.MILKMAID, Job.TEACHER, Job.STEWARD, Job.WARDEN, Job.AGENT, Job.CONCUBINE, Job.AGENTPARTNER, Job.HEADGIRLSUITE, Job.CLUB, Job.MASTERSUITE, Job.CONFINEMENT, Job.GLORYHOLE, Job.QUARTER, Job.BROTHEL, Job.DAIRY].includes(activeSlave.assignment)) { - links.push(App.UI.DOM.link(`Have ${him} take a break and come up`, executeWalkpast, target)); + links.push(App.UI.DOM.link(`Have ${him} take a break and come up`, executeWalkpast, [target])); } else { - links.push(App.UI.DOM.link(`Call ${him} over`, executeWalkpast, target)); + links.push(App.UI.DOM.link(`Call ${him} over`, executeWalkpast, [target])); } } } else { switch (target) { - case "FVagina": - links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, "FFuckdollVaginal")); + case "fVagina": + links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, ["fFuckdollVaginal"])); break; - case "FButt": - case "FAnus": - links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, "FFuckdollAnal")); + case "fButt": + case "fAnus": + links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, ["fFuckdollAnal"])); break; default: - links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, "FFuckdollOral")); + links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, ["fFuckdollOral"])); } } @@ -155,8 +149,7 @@ globalThis.walkPast = (function() { const frag = document.createDocumentFragment(); $(frag).append(output + ' '); - const span = App.UI.DOM.appendNewElement("span", frag, App.UI.DOM.generateLinksStrip(links)); - span.id = `walkpast-${activeSlave.ID}`; + const linkSpan = App.UI.DOM.appendNewElement("span", frag, App.UI.DOM.generateLinksStrip(links)); return frag; } @@ -166,15 +159,9 @@ globalThis.walkPast = (function() { * @returns {string} */ function primeSlave(activeSlave, seed) { - let r = ""; - - if (partner !== "relationship" || !App.Utils.hasPartnerSex(activeSlave)) { - r += `${activeSlave.slaveName} `; - r += walkPasts(activeSlave, seed); - t = ""; - /* WALKPASTS END */ - } - /* TIME TOGETHER EXCEPTION ENDS */ + let r = `${activeSlave.slaveName} `; + r += walkPasts(activeSlave, seed); + t = ""; return r; } @@ -203,7 +190,7 @@ globalThis.walkPast = (function() { } r += walkPasts(partnerSlave, 100 - seed); - target = "FRival"; + target = "fRival"; } return r + ` `; @@ -1400,7 +1387,7 @@ globalThis.walkPast = (function() { } /* CLOSE SEXY/CUDDLE/TOGETHER TIME */ - target = "FRelation"; + target = "fRelation"; } else { t += ` Lover not found!`; } @@ -1408,11 +1395,12 @@ globalThis.walkPast = (function() { return t + ` `; } - /** Generate walkpast for a relative of the slave we're looking at + /** Generate walkpast for a relative or relationship partner of the slave we're looking at * @param {App.Entity.SlaveState} activeSlave + * @param {"relation"|"relationship"} partner which kind of partner are we looking for? * @returns {string} */ - function relatedSlave(activeSlave) { + function relatedSlave(activeSlave, partner) { let r = ""; const fuckSeed = jsRandom(1, 100); @@ -1434,9 +1422,9 @@ globalThis.walkPast = (function() { r += `${partnerSlave.slaveName} `; r += walkPasts(partnerSlave, fuckSeed); - target = "FRelation"; /* potentially removed later */ + target = "fRelation"; } else { - r += ` Expected partner not found!`; + r += ` Expected ${partner} partner not found!`; } return r + ` `; @@ -2065,7 +2053,7 @@ globalThis.walkPast = (function() { His } = pronouns; - target = "FBoobs"; + target = "fBoobs"; const breasts = (slave.boobs < 300) ? `flat chest` : `breasts`; @@ -2511,7 +2499,7 @@ globalThis.walkPast = (function() { He, His } = getPronouns(slave); - target = "FButt"; + target = "fButt"; t += App.Desc.butt(slave); t += ` `; @@ -2864,7 +2852,7 @@ globalThis.walkPast = (function() { He, His } = getPronouns(slave); - target = "FVagina"; + target = "fVagina"; // Desc belly if large enough t += ` `; @@ -7755,7 +7743,7 @@ globalThis.walkPast = (function() { He, His } = getPronouns(slave); - target = "FVagina"; + target = "fVagina"; // Desc dick and vag t += App.Desc.crotch(slave); t += ` `; @@ -8345,7 +8333,7 @@ globalThis.walkPast = (function() { He, His } = getPronouns(slave); - target = "FDick"; + target = "fDick"; // Desc dick and vag t += App.Desc.crotch(slave); t += ` `; @@ -8935,7 +8923,7 @@ globalThis.walkPast = (function() { He, His } = getPronouns(slave); - target = "FAnus"; + target = "fAnus"; t += App.Desc.anus(slave); if (slave.chastityAnus === 0) { @@ -9355,9 +9343,9 @@ globalThis.walkPast = (function() { } if (jsRandom(1, 3) === 1) { - target = "FKiss"; + target = "fKiss"; } else { - target = "FLips"; + target = "fLips"; } return t; diff --git a/src/interaction/multiImplant.js b/src/interaction/multiImplant.js index 87ef27e9abb7fdfdb0e961e4d6fdd9d1af8642cb..0dfdbb732cfecdf0f3ddd9e18fab25ddb5766917 100644 --- a/src/interaction/multiImplant.js +++ b/src/interaction/multiImplant.js @@ -33,7 +33,9 @@ App.UI.multiImplant = function() { App.UI.DOM.appendNewElement("h3", frag, F.Organs.get(sortedOrgans[j]).name); let actions = F.Organs.get(sortedOrgans[j]).implantActions; - let manual = false, success = false, cancel = false; + let manual = false; + let success = false; + let cancel = false; for (let k = 0; k < actions.length; k++) { if (!actions[k].autoImplant) { if (actions[k].canImplant(slave)) { diff --git a/src/interaction/policies/policies.js b/src/interaction/policies/policies.js index ff007797478400085bcf863e9cf37df27be92b3f..226468abe021012aa4b214fabc69bf42879087e7 100644 --- a/src/interaction/policies/policies.js +++ b/src/interaction/policies/policies.js @@ -22,115 +22,67 @@ globalThis.policies = (function() { })(); /** * @param {string} category - * @returns {JQuery} + * @returns {Array} */ globalThis.policy = function(category) { - const frag = new DocumentFragment; - for (let policyVariable in App.Data.Policies.Selection[category]) { - frag.append(policyElement(policyVariable)); + const validPolicies = []; + for (let policyString in App.Data.Policies.Selection[category]) { + policyElement(policyString); } - return jQuery(`#${category}`).empty().append(frag); - /** - * @param {string} policyVariable - * @returns {Node} el - */ - function policyElement(policyVariable) { - let el = document.createElement("p"); - let div; - let span; - const policyValue = _.get(V, policyVariable); + return validPolicies; + + /** @param {string} policyString */ + function policyElement(policyString) { + const policyValue = _.get(V, policyString); /** @type {PolicySelector[]} */ - const policyObject = App.Data.Policies.Selection[category][policyVariable]; + const policies = App.Data.Policies.Selection[category][policyString]; if (policyValue === 0) { // apply - for (let i = 0; i < policyObject.length; i++) { - const p = policyObject[i]; + for (const p of policies) { + const el = document.createElement("p"); const enable = p.enable || 1; if (p.hasOwnProperty("requirements") && p.requirements === false) { continue; } - div = document.createElement("div"); - span = document.createElement("span"); // title - span.style.fontWeight = "bold"; + const classArray = ["bold"]; if (p.hasOwnProperty("titleClass")) { - span.classList.add(p.titleClass); + classArray.push(p.titleClass); } - span.append(p.title); - div.append(span); - div.append(`: `); + App.UI.DOM.appendNewElement("span", el, p.title, classArray).append(`: `); // Description text - div.append(p.text); - div.append(` `); + el.append(p.text); // link if (!(p.hasOwnProperty("hide") && p.hide.button === 1)) { - if (p.hasOwnProperty("requirements")) { - if (p.requirements === true) { - div.append(implement(p, enable)); - } else { - const link = App.UI.DOM.disabledLink("Implement", [`You do not meet the requirements, or passed a conflicting policy already`]); - link.style.color = "white"; - div.append(link); - } - } else { - div.append(implement(p, enable)); - } + el.append(` `, implement(p, enable)); } - el.append(div); + validPolicies.push(el); } } else if (typeof policyValue === "string" || typeof policyValue === "number") { + const el = document.createElement("p"); // repeal - let i = 0; - for (const pol in policyObject) { - if (policyObject[pol].hasOwnProperty("enable") && policyObject[pol].enable === policyValue) { - i = pol; - break; - } - } - const p = policyObject[i]; - if (p.hasOwnProperty("hide")) { - if (p.hide.ifActivated === 1) { - return el; - } + const p = policies.find(pol => pol.hasOwnProperty("enable") && pol.enable === policyValue) || policies[0]; + if (p.hasOwnProperty("hide") && p.hide.ifActivated === 1) { + return; } - let title; - if (p.hasOwnProperty("activatedTitle")) { - title = p.activatedTitle; - } else { - title = p.title; - } - let text; - if (p.hasOwnProperty("activatedText")) { - text = p.activatedText; - } else { - text = p.text; - } - div = document.createElement("div"); - span = document.createElement("span"); - // title - span.style.fontWeight = "bold"; - span.append(title); - div.append(span); - div.append(`: `); + const title = (p.hasOwnProperty("activatedTitle")) ? p.activatedTitle : p.title; + App.UI.DOM.appendNewElement("span", el, title, "bold").append(`: `); // Description text - div.append(text); - div.append(` `); + el.append((p.hasOwnProperty("activatedText")) ? p.activatedText : p.text); // link - div.append(repeal(p)); - el.append(div); + el.append(` `, repeal(p)); + validPolicies.push(el); } else { - throw `V.${policyVariable} not initialized properly, "${policyValue}"`; + throw `V.${policyString} not initialized properly, "${policyValue}"`; } - return el; - /** * @param {PolicySelector} p The data object that describes the policy being considered. * @returns {Node} Link to repeal. @@ -145,13 +97,13 @@ globalThis.policy = function(category) { "Repeal", () => { if (V.rep >= 1000) { - _.set(V, policyVariable, 0); + _.set(V, policyString, 0); applyCost(); if (p.hasOwnProperty("onRepeal")) { p.onRepeal(); } } - policy(category); + App.UI.reload(); } ); link.style.color = "yellow"; @@ -182,13 +134,13 @@ globalThis.policy = function(category) { "Implement", () => { if (V.rep >= 1000) { - _.set(V, policyVariable, enable); + _.set(V, policyString, enable); applyCost(); if (p.hasOwnProperty("onImplementation")) { p.onImplementation(); } } - App.UI.reload(); // policy(category); We need to make sure all tabs are refreshed, so this policy call is too targeted for now. + App.UI.reload(); } ); link.style.color = "green"; @@ -201,11 +153,11 @@ globalThis.policy = function(category) { linkArray.push(App.UI.DOM.link( "Cheat apply", () => { - _.set(V, policyVariable, enable); + _.set(V, policyString, enable); if (p.hasOwnProperty("onImplementation")) { p.onImplementation(); } - App.UI.reload(); // policy(category); We need to make sure all tabs are refreshed, so this policy call is too targeted for now. + App.UI.reload(); } )); } diff --git a/src/interaction/policies/policies.tw b/src/interaction/policies/policies.tw deleted file mode 100644 index 6dde979ae3aa0a04cc514ed21987519bfdba0c9a..0000000000000000000000000000000000000000 --- a/src/interaction/policies/policies.tw +++ /dev/null @@ -1,357 +0,0 @@ -:: Policies [nobr jump-to-safe jump-from-safe] - -<style> -.active { - background-color: grey; -} -</style> - -<<set $nextButton = "Back">> -<<set $passageSwitchHandler = App.EventHandlers.societyChanged>> -<<run checkPolicyGameover()>> -<<set $encyclopedia = "Future Societies">> - -<<run App.UI.tabBar.handlePreSelectedTab($tabChoice.policies)>> -<p class="scene-intro"> - Passing any law will cost <<print cashFormat(5000)>> and - <<if $rep >= 1000>> - <span class="green">a small amount of reputation.</span> - <<else>> - <span class="red">a better reputation.</span> - <</if>> - More policies will become available as the arcology develops. -</p> -<div class="tab-bar"> - <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'SMRs')" id="tab SMRs">Slave Market Regulations</button> - <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'ST')" id="tab ST">Sexual Trendsetting</button> - <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Population')" id="tab Population">Population & Domestic</button> - <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Education')" id="tab Education">Education</button> - <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'FS')" id="tab FS">Future Societies</button> - <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'SRP')" id="tab SRP">Slave Retirement Planning</button> -</div> - -<div id="SMRs" class="tab-content"> - <div class="content"> - <p class="scene-intro"> - Slave Market Regulations (SMRs) will affect slaves that come through the official slave markets in your arcology. The markets themselves will bear the cost of these regulations, but the minimum practicable slave prices may rise as a result. - </p> - <span id="SMR"></span> - <script> - policy("SMR"); - </script> - </div> -</div> - -<div id="ST" class="tab-content"> - <div class="content"> - <span id="SexualTrendsetting"></span> - <script> - policy("SexualTrendsetting"); - </script> - </div> -</div> - -<div id="Population" class="tab-content"> - <div class="content"> - - <h1>Population</h1> - <span id="PopulationPolicies"></span> - <script> - policy("PopulationPolicies"); - </script> - - <h1>Domestic</h1> - <span id="DomesticPolicies"></span> - <script> - policy("DomesticPolicies"); - </script> - - </div> -</div> - -<div id="Education" class="tab-content"> - <div class="content"> - <<if $schoolSuggestion == 0>> - <p> - You have yet to contact a school about adding a local branch. - </p> - <</if>> - <span id="EducationPolicies"></span> - <script> - policy("EducationPolicies"); - </script> - </div> -</div> - -<div id="SRP" class="tab-content"> - <div class="content"> - <<if $policies.retirement.customAgePolicy == 0 && $policies.retirement.physicalAgePolicy == 0>> - <br>''Default Retirement Age:'' in the absence of a defined slave retirement age, slaves will not remain sex slaves after reaching age $retirementAge. - <br> //This is a current content and mechanical limitation in FC $ver, not a universal Free Cities rule.// - <</if>> - - <span id="RetirementPolicies"></span> - <script> - policy("RetirementPolicies"); - </script> - <h1>Menials</h1> - - <span id="MenialRetirementPolicies"></span> - <script> - policy("MenialRetirementPolicies"); - </script> - </div> -</div> - -<div id="FS" class="tab-content"> - <div class="content"> - <span id="FutureSocietiesTab"></span> - <script> - policy("FutureSocietiesTab"); - </script> - <<if $arcologies[0].FSGenderFundamentalist >= 20>> - <h2>Gender Fundamentalist</h2> - <span id="FSGenderFundamentalist"></span> - <script> - policy("FSGenderFundamentalist"); - </script> - <<elseif $arcologies[0].FSGenderRadicalist >= 20>> - <h2>Gender Radicalist</h2> - <span id="FSGenderRadicalist"></span> - <script> - policy("FSGenderRadicalist"); - </script> - <</if>> - - <<if $arcologies[0].FSPaternalist >= 40>> - <h2>Paternalist</h2> - <span id="FSPaternalist"></span> - <script> - policy("FSPaternalist"); - </script> - <</if>> - - <<if $arcologies[0].FSDegradationist >= 40>> - <h2>Degradationist</h2> - <span id="FSDegradationist"></span> - <script> - policy("FSDegradationist"); - </script> - <</if>> - - <<if $arcologies[0].FSIntellectualDependency >= 40>> - <h2>Intellectual Dependency</h2> - <span id="FSIntellectualDependency"></span> - <script> - policy("FSIntellectualDependency"); - </script> - <</if>> - - <<if $arcologies[0].FSSlaveProfessionalism >= 40>> - <h2>Slave Professionalism</h2> - <span id="FSSlaveProfessionalism"></span> - <script> - policy("FSSlaveProfessionalism"); - </script> - <</if>> - - <<if $arcologies[0].FSBodyPurist >= 40>> - <h2>Body Purist</h2> - <span id="FSBodyPurist"></span> - <script> - policy("FSBodyPurist"); - </script> - <</if>> - - <<if $arcologies[0].FSTransformationFetishist >= 40>> - <h2>Transformation Fetishist</h2> - <span id="FSTransformationFetishist"></span> - <script> - policy("FSTransformationFetishist"); - </script> - <</if>> - - <<if $arcologies[0].FSYouthPreferentialist >= 40>> - <h2>Youth Preferentialist</h2> - <span id="FSYouthPreferentialist"></span> - <script> - policy("FSYouthPreferentialist"); - </script> - <</if>> - - <<if $arcologies[0].FSMaturityPreferentialist >= 40>> - <h2>Maturity Preferentialist</h2> - <span id="FSMaturityPreferentialist"></span> - <script> - policy("FSMaturityPreferentialist"); - </script> - <</if>> - - <<if $arcologies[0].FSPetiteAdmiration >= 40>> - <h2>Petite Admiration</h2> - <span id="FSPetiteAdmiration"></span> - <script> - policy("FSPetiteAdmiration"); - </script> - <</if>> - - <<if $arcologies[0].FSStatuesqueGlorification >= 40>> - <h2>Statuesque Glorification</h2> - <span id="FSStatuesqueGlorification"></span> - <script> - policy("FSStatuesqueGlorification"); - </script> - <</if>> - - <<if $arcologies[0].FSSlimnessEnthusiast >= 40>> - <h2>Slimness Enthusiast</h2> - <span id="FSSlimnessEnthusiast"></span> - <script> - policy("FSSlimnessEnthusiast"); - </script> - <</if>> - - <<if $arcologies[0].FSAssetExpansionist >= 40>> - <h2>Asset Expansionist</h2> - <span id="FSAssetExpansionist"></span> - <script> - policy("FSAssetExpansionist"); - </script> - <</if>> - - <<if $arcologies[0].FSPastoralist >= 40>> - <h2>Pastoralist</h2> - <span id="FSPastoralist"></span> - <script> - policy("FSPastoralist"); - </script> - <</if>> - - <<if $arcologies[0].FSPhysicalIdealist >= 40>> - <h2>Physical Idealist</h2> - <span id="FSPhysicalIdealist"></span> - <script> - policy("FSPhysicalIdealist"); - </script> - <</if>> - - <<if $arcologies[0].FSHedonisticDecadence >= 40>> - <h2>Hedonistic Decadence</h2> - <span id="FSHedonisticDecadence"></span> - <script> - policy("FSHedonisticDecadence"); - </script> - <</if>> - - <<if $arcologies[0].FSChattelReligionist >= 40>> - <h2>Chattel Religionist</h2> - <span id="FSChattelReligionist"></span> - <script> - policy("FSChattelReligionist"); - </script> - <</if>> - - <<if $nicaea.held>> - <h2>Nicaea</h2> - <span id="nicaea"></span> - <script> - policy("nicaea"); - </script> - <</if>> - - <<if $arcologies[0].FSRepopulationFocus >= 40>> - <h2>Repopulation Focus</h2> - <span id="FSRepopulationFocus"></span> - <script> - policy("FSRepopulationFocus"); - </script> - <</if>> - - <<if $arcologies[0].FSRestart >= 40 || $propOutcome !== 0>> - <h2>Eugenics</h2> - <div> - <<if $propOutcome>> - ''Elite Breeder Eligibility:'' Societal Elite may use eligible slaves as breeders. - <<elseif $propOutcome == -1>> - ''Elite Breeder Eligibility:'' The Societal Elite have rejected your breeding proposal. - <</if>> - </div> - <span id="FSRestart"></span> - <script> - policy("FSRestart"); - </script> - <</if>> - - <<if $arcologies[0].FSSupremacist >= 40>> - <h2>Racial Supremacy</h2> - <span id="FSSupremacist"></span> - <script> - policy("FSSupremacist"); - </script> - <</if>> - - <<if $arcologies[0].FSSubjugationist >= 40>> - <h2>Racial Subjugation</h2> - <span id="FSSubjugationist"></span> - <script> - policy("FSSubjugationist"); - </script> - <</if>> - - <<if $arcologies[0].FSRomanRevivalist >= 40>> - <h2>Roman Revivalist</h2> - <span id="FSRomanRevivalist"></span> - <script> - policy("FSRomanRevivalist"); - </script> - <</if>> - - <<if $arcologies[0].FSNeoImperialist >= 40>> - <h2>Neo-Imperialism</h2> - <span id="FSNeoImperialist"></span> - <script> - policy("FSNeoImperialist"); - </script> - <</if>> - - <<if $arcologies[0].FSAztecRevivalist >= 40>> - <h2>Aztec Revivalist</h2> - <span id="FSAztecRevivalist"></span> - <script> - policy("FSAztecRevivalist"); - </script> - <</if>> - - <<if $arcologies[0].FSEgyptianRevivalist >= 40>> - <h2>Egyptian Revivalist</h2> - <span id="FSEgyptianRevivalist"></span> - <script> - policy("FSEgyptianRevivalist"); - </script> - <</if>> - - <<if $arcologies[0].FSEdoRevivalist >= 40>> - <h2>Edo Revivalist</h2> - <span id="FSEdoRevivalist"></span> - <script> - policy("FSEdoRevivalist"); - </script> - <</if>> - - <<if $arcologies[0].FSArabianRevivalist >= 40>> - <h2>Arabian Revivalist</h2> - <span id="FSArabianRevivalist"></span> - <script> - policy("FSArabianRevivalist"); - </script> - <</if>> - - <<if $arcologies[0].FSChineseRevivalist >= 40>> - <h2>Chinese Revivalist</h2> - <span id="FSChineseRevivalist"></span> - <script> - policy("FSChineseRevivalist"); - </script> - <</if>> - </div> -</div> diff --git a/src/interaction/policies/policiesPassage.js b/src/interaction/policies/policiesPassage.js new file mode 100644 index 0000000000000000000000000000000000000000..c8d055a12e017f8fc3c7a830020dbd4261ef45a0 --- /dev/null +++ b/src/interaction/policies/policiesPassage.js @@ -0,0 +1,82 @@ +App.UI.policies = function() { + const node = new DocumentFragment(); + + const r = []; + r.push(`Passing any law will cost ${cashFormat(5000)} and`); + if (V.rep >= 1000) { + r.push(App.UI.DOM.makeElement("span", `a small amount of reputation.`, `green`)); + } else { + r.push(App.UI.DOM.makeElement("span", `a better reputation.`, `red`)); + } + r.push(`More policies will become available as the arcology develops.`); + App.Events.addNode(node, r, "p", "scene-intro"); + + + const tabBar = new App.UI.Tabs.TabBar("Policies"); + + tabBar.addTab("Slave Market Regulations", "smr", smr()); + tabBar.addTab("Sexual Trendsetting", "st", st()); + tabBar.addTab("Population & Domestic", "population", population()); + tabBar.addTab("Education", "education", education()); + tabBar.addTab("Future Societies", "fs", fs()); + tabBar.addTab("Slave Retirement Planning", "srp", srp()); + + node.append(tabBar.render()); + return node; + + function smr() { + const frag = new DocumentFragment(); + App.UI.DOM.appendNewElement("div", frag, `Slave Market Regulations (SMRs) will affect slaves that come through the official slave markets in your arcology. The markets themselves will bear the cost of these regulations, but the minimum practicable slave prices may rise as a result.`, "scene-intro"); + policy("SMR").forEach(p => frag.append(p)); + return frag; + } + + function st() { + const frag = new DocumentFragment(); + policy("SexualTrendsetting").forEach(p => frag.append(p)); + return frag; + } + + function population() { + const frag = new DocumentFragment(); + App.UI.DOM.appendNewElement("h1", frag, `Population`); + policy("PopulationPolicies").forEach(p => frag.append(p)); + App.UI.DOM.appendNewElement("h1", frag, `Domestic`); + policy("DomesticPolicies").forEach(p => frag.append(p)); + return frag; + } + + function education() { + const frag = new DocumentFragment(); + if (V.schoolSuggestion === 0) { + App.UI.DOM.appendNewElement("p", frag, `You have yet to contact a school about adding a local branch.`); + } + policy("EducationPolicies").forEach(p => frag.append(p)); + return frag; + } + + function srp() { + const frag = new DocumentFragment(); + if (V.policies.retirement.customAgePolicy === 0 && V.policies.retirement.physicalAgePolicy === 0) { + const div = App.UI.DOM.appendNewElement("div", frag, `Default Retirement Age:`, "bold"); + div.append(` in the absence of a defined slave retirement age, slaves will not remain sex slaves after reaching age ${V.retirementAge}`); + App.UI.DOM.appendNewElement("div", frag, `This is a current content and mechanical limitation in FC ${V.ver}, not a universal Free Cities rule.`, ["indent", "note"]); + } + policy("RetirementPolicies").forEach(p => frag.append(p)); + App.UI.DOM.appendNewElement("h1", frag, `Menials`); + policy("MenialRetirementPolicies").forEach(p => frag.append(p)); + return frag; + } + function fs() { + const frag = new DocumentFragment(); + policy("FutureSocietiesTab").forEach(p => frag.append(p)); + for (const FS in App.Data.FutureSociety.records) { + const policies = policy(FS); + if (policies.length > 0) { + App.UI.DOM.appendNewElement("h2", frag, App.Data.FutureSociety.records[FS].adj); + policies.forEach(p => frag.append(p)); + } + } + return frag; + } +}; diff --git a/src/interaction/prostheticConfig.js b/src/interaction/prostheticConfig.js index 6ef6942ef61143e3ddc25ba0fe88d70d9e2eba14..02a7816003739ecd7d3418a428d1d2e7086ab16e 100644 --- a/src/interaction/prostheticConfig.js +++ b/src/interaction/prostheticConfig.js @@ -54,7 +54,9 @@ App.UI.prostheticsConfig = function(slave) { const eyeContainer = document.createElement("div"); eyeContainer.classList.add("eyeContainer", "choices"); - let _on = 0, _blur = 0, _off = 0; + let _on = 0; + let _blur = 0; + let _off = 0; if (getLeftEyeType(slave) === 3) { App.UI.DOM.appendNewElement("div", eyeContainer, "Left:"); let div = document.createElement("div"); @@ -349,22 +351,22 @@ App.UI.prostheticsConfig = function(slave) { let tooltip; if (V.researchLab.level > 0) { - tooltip = [`Depending on lab speed, it might be faster than fitting an existing prosthetic, but should almost always be faster than first building and then fitting it to ${him}.`]; + tooltip = `Depending on lab speed, it might be faster than fitting an existing prosthetic, but should almost always be faster than first building and then fitting it to ${him}.`; } else { - tooltip = ["With a lab you could both increase speed and decrease cost."]; + tooltip = "With a lab you could both increase speed and decrease cost."; } - App.UI.DOM.appendNewElement("div", gridDiv, App.UI.DOM.disabledLink("Construct in lab", tooltip)); + App.UI.DOM.appendNewElement("div", gridDiv, App.UI.DOM.spanWithTooltip("Construct in lab", tooltip)); - tooltip = []; + tooltip = ""; if (V.researchLab.speed >= 300) { /* max speed */ - tooltip = ["Your lab is so fast that fitting prosthetics to your slave can be done instantly, though you will sacrifice some efficiency."]; + tooltip = "Your lab is so fast that fitting prosthetics to your slave can be done instantly, though you will sacrifice some efficiency."; } else if (V.researchLab.level > 0) { - tooltip = ["Your lab is not fast enough to fit prosthetics instantly."]; + tooltip = "Your lab is not fast enough to fit prosthetics instantly."; } const fastDiv = document.createElement("div"); - if (tooltip.length > 0) { - fastDiv.append(App.UI.DOM.disabledLink("Fast assembly", tooltip)); + if (tooltip!=="") { + fastDiv.append(App.UI.DOM.spanWithTooltip("Fast assembly", tooltip)); fastDiv.style.textAlign = "right"; } gridDiv.append(fastDiv); diff --git a/src/interaction/sellSlave.js b/src/interaction/sellSlave.js index c26c996e036d9faad14745677c09d8021ecfce4a..eabec96fcc163e1d93d9f0a8533356ac14229765 100644 --- a/src/interaction/sellSlave.js +++ b/src/interaction/sellSlave.js @@ -348,14 +348,13 @@ new App.DomPassage("Sell Slave", () => { } } if ((V.week - slave.weekAcquired >= 20) && (slave.skill.entertainment >= 100)) { - if (App.Data.Careers.General.entertainment.includes(slave.career)) { - } else { + // FIXME: review this + if (!App.Data.Careers.General.entertainment.includes(slave.career)) { t.push(`${He}'s gotten enough experience as a slave entertainer that ${he} has the added value of a ${girl} with a history in entertainment from before ${he} was a slave.`); } } if (slave.counter.oral + slave.counter.anal + slave.counter.vaginal + slave.counter.mammary + slave.counter.penetrative > 1000) { - if (App.Data.Careers.General.whore.includes(slave.career)) { - } else { + if (!App.Data.Careers.General.whore.includes(slave.career)) { t.push(`I see ${he}'s sexually very experienced; that counts as a stand-in for the usual bonus value from having been a sex worker before enslavement.`); } } @@ -744,8 +743,8 @@ new App.DomPassage("Sell Slave", () => { } } else if (V.arcologies[0].FSGenderRadicalistLawFuta === 4) { if (slave.boobs <= 400) { - if (slave.dick > 0 && slave.dick < 3) { - if (slave.balls > 0 && slave.balls < 3) { + if (slave.dick.isBetween(0, 3)) { + if (slave.balls.isBetween(0, 3)) { t.push(`Slaves with such cute little parts appraise quite well, thanks to your leadership on gender.`); } } @@ -963,7 +962,7 @@ new App.DomPassage("Sell Slave", () => { if (V.PC.father === V.AS) { V.boomerangStats.PCfather = V.AS; } - for (const s of V.slaves) { //TODO: review for hyperfet compatibility + for (const s of V.slaves) { // TODO: review for hyperfet compatibility if (s.ID !== V.AS) { if (s.mother === V.AS) { V.boomerangStats.boomerangMother.push(s.ID); @@ -1224,8 +1223,7 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your more idiotic slaves are <span class="mediumorchid">deeply jealous</span> of - slave.slaveName's new pampered lifestyle, oblivious to the demanding nature of eugenics.`); + r.push(`Your more idiotic slaves are <span class="mediumorchid">deeply jealous</span> of ${slave.slaveName}'s new pampered lifestyle, oblivious to the demanding nature of eugenics.`); } App.Events.addNode(el, r); return el; @@ -1711,8 +1709,8 @@ new App.DomPassage("Sell Slave", () => { (slave.weight < 10 && slave.weight > -10) && (slave.waist < 10 && slave.waist > -50) && (slave.boobs >= 550 && slave.boobs < 1000) && - (slave.butt > 2 && slave.butt < 5) && - (slave.hips > 0 && slave.hips < 3) && + (slave.butt.isBetween(2, 5)) && + (slave.hips.isBetween(0, 3)) && (slave.face >= 20) ); }, @@ -1997,7 +1995,7 @@ new App.DomPassage("Sell Slave", () => { let slaveImpact; r.push(`${slave.slaveName} becomes a frequent sight in ${slave.porn.fameType} smut and attracts huge crowds with each public appearance.`); for (const s of V.slaves) { - if (s.porn.prestige > 0 && s.porn.prestige < 3) { + if (s.porn.prestige.isBetween(0, 3)) { if (s.devotion > 20) { s.trust += 2; slaveImpact = 1; diff --git a/src/interaction/siDescription.js b/src/interaction/siDescription.js index 09b0a872c719dc740a61e147eb2d9b4fa70ba271..cbf71e275f2aece1644c9b3154409a40d75b6024 100644 --- a/src/interaction/siDescription.js +++ b/src/interaction/siDescription.js @@ -26,6 +26,8 @@ App.UI.SlaveInteract.description = function(slave) { el.append(descriptionLink); } + el.append(App.Reminders.slaveDisplay(slave.ID)); + return el; function showOptions() { diff --git a/src/interaction/siPhysicalRegimen.js b/src/interaction/siPhysicalRegimen.js index 930ac3c4e02fafc3960cf726497b136b017ffe29..526b3db0d687b33a7d9910d6582c3e747aaf6c53 100644 --- a/src/interaction/siPhysicalRegimen.js +++ b/src/interaction/siPhysicalRegimen.js @@ -187,7 +187,7 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) { } } } - if (slave.dick > 0 && slave.dick < 11 && !canAchieveErection(slave) && slave.chastityPenis !== 1) { + if (slave.dick.isBetween(0, 11) && !canAchieveErection(slave) && slave.chastityPenis !== 1) { dick.push({text: `Erectile dysfunction circumvention`, updateSlave: {drugs: `priapism agents`}}); } diff --git a/src/interaction/siRules.js b/src/interaction/siRules.js index 7a0161bfc5e9172cbfd0aea4e31ff0f5f5cecc33..996808093c33c998e98cb15216d60f690ca16281 100644 --- a/src/interaction/siRules.js +++ b/src/interaction/siRules.js @@ -237,7 +237,7 @@ App.UI.SlaveInteract.rules = function(slave, refresh) { {value: "restrictive"}, {value: "permissive"}, ]; - if (slave.accent > 0 && slave.accent < 4) { + if (slave.accent.isBetween(0, 4)) { choices.push( {value: "accent elimination"}, ); diff --git a/src/interaction/siUtilities.js b/src/interaction/siUtilities.js index 8c6ae0888a179da7dbd6cc051aa3aae9c317e31c..3a8bfae984fa716d7c9408a7796d7eef8156da70 100644 --- a/src/interaction/siUtilities.js +++ b/src/interaction/siUtilities.js @@ -74,9 +74,8 @@ App.UI.SlaveInteract.generateRows = function(array, slave, category, accessCheck ); if (item.FS) { - let FS = App.UI.DOM.disabledLink(`FS`, [FutureSocieties.displayAdj(item.FS)]); - FS.style.fontStyle = "italic"; - link.appendChild(FS); + link.append(App.UI.DOM.spanWithTooltip(`FS`, + FutureSocieties.displayAdj(item.FS), "note")); } } linkArray.push(link); diff --git a/src/interaction/siWardrobe.js b/src/interaction/siWardrobe.js index ee83b53092c3578b3bb11cffdf6765197ac6d209..b44a8df0f12babd7a34027243da6beb225e95416 100644 --- a/src/interaction/siWardrobe.js +++ b/src/interaction/siWardrobe.js @@ -138,9 +138,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { const label = document.createElement('div'); label.append(`Slave selects ${his} own outfits: `); - let choice = App.UI.DOM.disabledLink(`${slave.choosesOwnClothes ? "Allowed" : "Forbidden"}`, []); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + App.UI.DOM.appendNewElement("span", label, slave.choosesOwnClothes ? "Allowed" : "Forbidden", "bold"); el.appendChild(label); @@ -174,15 +172,10 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { const clothingDiv = document.createElement('div'); let links; let label; - let choice; if (slave.fuckdoll === 0) { // First Row label = document.createElement('div'); - label.append(`Clothes: `); - - choice = App.UI.DOM.disabledLink(`${slave.clothes} `, [itemTooltip(slave.clothes, "clothes")]); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + label.append(`Clothes: `, App.UI.DOM.spanWithTooltip(slave.clothes, itemTooltip(slave.clothes, "clothes"), "bold")); if (slave.fuckdoll !== 0 || slave.clothes === "restrictive latex" || slave.clothes === "a latex catsuit" || slave.clothes === "a cybersuit" || slave.clothes === "a comfortable bodysuit") { if (V.seeImages === 1 && V.imageChoice === 1) { @@ -197,10 +190,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { } label = document.createElement('div'); - label.append(`Collar: `); - choice = App.UI.DOM.disabledLink(`${slave.collar}`, [itemTooltip(slave.collar, "collar")]); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + label.append(`Collar: `, App.UI.DOM.spanWithTooltip(slave.collar, itemTooltip(slave.collar, "collar"), "bold")); // Choose her own if (slave.collar !== `none`) { label.append(noneLink("collar")); @@ -279,11 +269,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { const el = document.createElement('div'); const label = document.createElement('div'); - label.append(`Mask: `); - - let choice = App.UI.DOM.disabledLink(`${slave.faceAccessory} `, [itemTooltip(slave.faceAccessory, "faceAccessory")]); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + label.append(`Mask: `, App.UI.DOM.spanWithTooltip(slave.faceAccessory, itemTooltip(slave.faceAccessory, "faceAccessory"), "bold")); // Choose her own if (slave.faceAccessory !== `none`) { @@ -326,11 +312,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { const el = document.createElement('div'); const label = document.createElement('div'); - label.append(`Gag: `); - - let choice = App.UI.DOM.disabledLink(`${slave.mouthAccessory}`, [itemTooltip(slave.mouthAccessory, "mouthAccessory")]); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + label.append(`Gag: `, App.UI.DOM.spanWithTooltip(slave.mouthAccessory, itemTooltip(slave.mouthAccessory, "mouthAccessory"), "bold")); // Choose her own if (slave.mouthAccessory !== `none`) { @@ -361,11 +343,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { // App.Desc.armwear(slave) const label = document.createElement('div'); - label.append(`Arm accessory: `); - - let choice = App.UI.DOM.disabledLink(`${slave.armAccessory}`, [itemTooltip(slave.armAccessory, "armAccessory")]); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + label.append(`Arm accessory: `, App.UI.DOM.spanWithTooltip(slave.armAccessory, itemTooltip(slave.armAccessory, "armAccessory"), "bold")); // Choose her own if (slave.armAccessory !== "none") { @@ -386,9 +364,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { const el = document.createElement('div'); const label = App.UI.DOM.appendNewElement("div", el, `Shoes: `); - let choice = App.UI.DOM.disabledLink(`${slave.shoes}`, [itemTooltip(slave.shoes, "shoes")]); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + label.append(App.UI.DOM.spanWithTooltip(slave.shoes, itemTooltip(slave.shoes, "shoes"), "bold")); /* We have "barefoot" in App.Data.slaveWear.slaveWear to cover for this // Choose her own @@ -427,9 +403,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { const el = document.createElement('div'); const label = App.UI.DOM.appendNewElement("div", el, `Leg accessory: `); - const choice = App.UI.DOM.disabledLink(`${slave.legAccessory}`, [itemTooltip(slave.legAccessory, "legAccessory")]); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + label.append(App.UI.DOM.spanWithTooltip(slave.legAccessory, itemTooltip(slave.legAccessory, "legAccessory"))); // Choose her own if (slave.legAccessory !== "none") { @@ -464,9 +438,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { let label = App.UI.DOM.appendNewElement("div", el, `Belly accessory: `); - let choice = App.UI.DOM.disabledLink(`${slave.bellyAccessory}`, [itemTooltip(slave.bellyAccessory, "bellyAccessory")]); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + label.append(App.UI.DOM.spanWithTooltip(slave.bellyAccessory, itemTooltip(slave.bellyAccessory, "bellyAccessory"), "bold")); // Choose her own if (slave.bellyAccessory !== `none`) { @@ -498,11 +470,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { const el = document.createElement('div'); const label = document.createElement('div'); - label.append(`Anal accessory: `); - - let choice = App.UI.DOM.disabledLink(`${slave.buttplug}`, [itemTooltip(slave.buttplug, "buttplug")]); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + label.append(`Anal accessory: `, App.UI.DOM.spanWithTooltip(slave.buttplug, itemTooltip(slave.buttplug, "buttplug"), "bold")); if (slave.buttplug !== `none`) { label.append(noneLink("buttplug")); @@ -554,11 +522,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { } const label = document.createElement('div'); - label.append(`Anal accessory attachment: `); - - const choice = App.UI.DOM.disabledLink(`${slave.buttplugAttachment}`, [itemTooltip(slave.buttplugAttachment, "buttplugAttachment")]); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + label.append(`Anal accessory attachment: `, App.UI.DOM.spanWithTooltip(slave.buttplugAttachment, itemTooltip(slave.buttplugAttachment, "buttplugAttachment"), "bold")); if (slave.buttplugAttachment !== `none`) { label.append(noneLink("buttplugAttachment")); @@ -595,11 +559,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { const el = document.createElement('div'); const label = document.createElement('div'); - label.append(`Vaginal accessory: `); - - let choice = App.UI.DOM.disabledLink(`${slave.vaginalAccessory}`, [itemTooltip(slave.vaginalAccessory, "vaginalAccessory")]); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + label.append(`Vaginal accessory: `, App.UI.DOM.spanWithTooltip(slave.vaginalAccessory, itemTooltip(slave.vaginalAccessory, "vaginalAccessory"), "bold")); if (slave.vaginalAccessory !== `none`) { label.append(noneLink("vaginalAccessory")); @@ -660,9 +620,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { let label = App.UI.DOM.appendNewElement("div", el, `Vaginal accessory attachment: `); - let choice = App.UI.DOM.disabledLink(`${slave.vaginalAttachment}`, [itemTooltip(slave.vaginalAttachment, "vaginalAttachment")]); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + label.append(App.UI.DOM.spanWithTooltip(slave.vaginalAttachment, itemTooltip(slave.vaginalAttachment, "vaginalAttachment"), "bold")); if (slave.vaginalAttachment !== `none`) { label.append(noneLink("vaginalAttachment")); @@ -698,11 +656,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { const el = document.createElement('div'); const label = document.createElement('div'); - label.append(`Dick accessory: `); - - const choice = App.UI.DOM.disabledLink(`${slave.dickAccessory}`, [itemTooltip(slave.dickAccessory, "dickAccessory")]); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + label.append(`Dick accessory: `, App.UI.DOM.spanWithTooltip(slave.dickAccessory, itemTooltip(slave.dickAccessory, "dickAccessory"))); if (slave.dickAccessory !== `none`) { label.append(noneLink("dickAccessory")); @@ -765,9 +719,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { chasCho = `THERE HAS BEEN AN ERROR `; } - let choice = App.UI.DOM.disabledLink(chasCho, [itemTooltip(chasCho, "chastity")]); - choice.style.fontWeight = "bold"; - label.appendChild(choice); + label.append(App.UI.DOM.spanWithTooltip(chasCho, itemTooltip(chasCho, "chastity"), "bold")); if (slave.chastityAnus !== 0 || slave.chastityPenis !== 0 || slave.chastityVagina !== 0) { label.append( @@ -1050,9 +1002,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) { ); if (item.fs && item.fs.unlocks) { - let FS = App.UI.DOM.disabledLink(`FS`, [FutureSocieties.displayAdj(item.fs.unlocks)]); - FS.style.fontStyle = "italic"; - link.appendChild(FS); + link.append(App.UI.DOM.spanWithTooltip(`FS`, FutureSocieties.displayAdj(item.fs.unlocks), "note")); } } linkArray.push(link); diff --git a/src/interaction/siWork.js b/src/interaction/siWork.js index bf97f37f5f3815b46c4a33ac4d1cd58378d884fc..e5e100331968b052d0fbe837128232f2947ccbf9 100644 --- a/src/interaction/siWork.js +++ b/src/interaction/siWork.js @@ -102,7 +102,7 @@ App.UI.SlaveInteract.work = function(slave, refresh) { default: // CAN BE REASSIGNED span.classList.remove("note"); - //span.id = "assignmentLinks"; + // span.id = "assignmentLinks"; span.appendChild(assignmentBlock()); if ((V.brothel + V.club + V.dairy + V.farmyard + V.servantsQuarters + V.masterSuite + V.spa + V.nursery + V.clinic + V.schoolroom + V.cellblock + V.arcade + V.HGSuite) > 0) { @@ -156,24 +156,26 @@ App.UI.SlaveInteract.work = function(slave, refresh) { return el; function generateLink(linkDesc) { + const span = document.createElement("span"); // is it just text? if (linkDesc.disabled) { return App.UI.DOM.disabledLink(linkDesc.text, [linkDesc.disabled]); } // Are they already on this whoreClass? if (linkDesc.whoreClass === slave.whoreClass) { return document.createTextNode(linkDesc.text); } // Set up the link - const link = App.UI.DOM.link( + span.append(App.UI.DOM.link( linkDesc.text, () => { slave.whoreClass = linkDesc.whoreClass; refresh(); }, - ); + )); // add a note node if required if (linkDesc.note) { - App.UI.DOM.appendNewElement("span", link, linkDesc.note, "note"); + span.append(" "); + App.UI.DOM.appendNewElement("span", span, linkDesc.note, "note"); } - return link; + return span; } function assignmentBlock() { @@ -300,7 +302,7 @@ App.UI.SlaveInteract.work = function(slave, refresh) { /** * @typedef {Object} sexOption * @property {string} text "Link text" - * @property {string|Node} [scene] + * @property {string|function():Node} [scene] * @property {string} [goto] if another passage is needed * @property {Object} [updateSlave] update slave itself if needed, like {trust: 2}, * @property {Object} [update] updates V., @@ -317,9 +319,9 @@ App.UI.SlaveInteract.work = function(slave, refresh) { if (slave.fuckdoll === 0) { if (slave.vagina > -1) { if (canDoVaginal(slave)) { - sexOptions.push({text: `Fuck ${him}`, scene: `FVagina`}); + sexOptions.push({text: `Fuck ${him}`, scene: () => App.Interact.fVagina(slave)}); if (canDoAnal(slave)) { - sexOptions.push({text: `Use ${his} holes`, scene: `FButt`}); + sexOptions.push({text: `Use ${his} holes`, scene: () => App.Interact.fButt(slave)}); } } else { sexOptions.push({ @@ -330,69 +332,69 @@ App.UI.SlaveInteract.work = function(slave, refresh) { } if (slave.bellyPreg >= 300000) { if (canDoVaginal(slave) || canDoAnal(slave)) { - sexOptions.push({text: `Fuck ${him} on ${his} belly`, scene: `FBellyFuck`}); + sexOptions.push({text: `Fuck ${him} on ${his} belly`, scene: () => App.Interact.fBellyFuck(slave)}); if (V.pregInventions >= 1) { - sexOptions.push({text: `Fuck ${him} in ${his} maternity swing`, scene: `FMaternitySwing`}); + sexOptions.push({text: `Fuck ${him} in ${his} maternity swing`, scene: () => App.Interact.fMaternitySwing(slave)}); sexOptions.push({ text: `Fuck ${him} with the help of ${his} assistants`, - scene: `FAssistedSex` + scene: () => App.Interact.fAssistedSex(slave) }); - sexOptions.push({text: `Fuck ${him} in your goo pool`, scene: `FPoolSex`}); + sexOptions.push({text: `Fuck ${him} in your goo pool`, scene: () => App.Interact.fPoolSex(slave)}); } } } if (canDoAnal(slave)) { - sexOptions.push({text: `Fuck ${his} ass`, scene: `FAnus`}); + sexOptions.push({text: `Fuck ${his} ass`, scene: () => App.Interact.fAnus(slave)}); } else { sexOptions.push({ text: `Fuck ${his} ass`, disabled: `Remove ${his} chastity belt if you wish to fuck ${his} ass` }); } - sexOptions.push({text: `Use ${his} mouth`, scene: `FLips`}); - sexOptions.push({text: `Kiss ${him}`, scene: `FKiss`}); + sexOptions.push({text: `Use ${his} mouth`, scene: () => App.Interact.fLips(slave)}); + sexOptions.push({text: `Kiss ${him}`, scene: () => App.Interact.fKiss(slave)}); if (hasAnyLegs(slave)) { - sexOptions.push({text: `Have ${him} dance for you`, get scene() { return App.Interact.fDance(slave); }}); + sexOptions.push({text: `Have ${him} dance for you`, scene: () => App.Interact.fDance(slave)}); } - sexOptions.push({text: `Play with ${his} tits`, scene: `FBoobs`}); + sexOptions.push({text: `Play with ${his} tits`, scene: () => App.Interact.fBoobs(slave)}); - sexOptions.push({text: `Caress ${him}`, scene: `FCaress`}); + sexOptions.push({text: `Caress ${him}`, scene: () => App.Interact.fCaress(slave)}); - sexOptions.push({text: `Give ${him} a hug`, scene: `FEmbrace`}); + sexOptions.push({text: `Give ${him} a hug`, scene: () => App.Interact.fEmbrace(slave)}); if (V.cheatMode === 1) { - sexOptions.push({text: `Pat ${his} head`, scene: `FPat`}); + sexOptions.push({text: `Pat ${his} head`, scene: () => App.Interact.fPat(slave)}); } if (slave.race === "catgirl") { - sexOptions.push({text: `Pet ${him}`, scene: `FPet`}); + sexOptions.push({text: `Pet ${him}`, scene: () => App.Interact.fPet(slave)}); } - sexOptions.push({text: `Grope ${his} boobs`, scene: `FondleBoobs`}); + sexOptions.push({text: `Grope ${his} boobs`, scene: () => App.Interact.fondleBoobs(slave)}); if (slave.nipples === "fuckable" && V.PC.dick > 0) { - sexOptions.push({text: `Fuck ${his} nipples`, scene: `FNippleFuck`}); + sexOptions.push({text: `Fuck ${his} nipples`, scene: () => App.Interact.fNippleFuck(slave)}); } if (slave.lactation > 0 && slave.boobs >= 2000 && slave.belly < 60000 && hasAnyArms(slave)) { - sexOptions.push({text: `Drink ${his} milk`, scene: `FSuckle`}); + sexOptions.push({text: `Drink ${his} milk`, scene: () => App.Interact.fSuckle(slave)}); } if (canDoAnal(slave)) { - sexOptions.push({text: `Grope ${his} butt`, scene: `FondleButt`}); + sexOptions.push({text: `Grope ${his} butt`, scene: () => App.Interact.fondleButt(slave)}); } if (slave.vagina > -1) { if (canDoVaginal(slave)) { - sexOptions.push({text: `Grope ${his} pussy`, scene: `FondleVagina`}); - sexOptions.push({text: `Eat ${him} out`, scene: `FLickPussy`}); + sexOptions.push({text: `Grope ${his} pussy`, scene: () => App.Interact.fondleVagina(slave)}); + sexOptions.push({text: `Eat ${him} out`, scene: () => App.Interact.fLickPussy(slave)}); } } if (slave.dick > 0) { if (!(slave.chastityPenis)) { - sexOptions.push({text: `Grope ${his} dick`, scene: `FondleDick`}); + sexOptions.push({text: `Grope ${his} dick`, scene: () => App.Interact.fondleDick(slave)}); if (canPenetrate(slave)) { if (V.policies.sexualOpenness === 1 || slave.toyHole === "dick") { - sexOptions.push({text: `Ride ${his} dick`, scene: `FDick`}); + sexOptions.push({text: `Ride ${his} dick`, scene: () => App.Interact.fDick(slave)}); } } } else { @@ -404,20 +406,20 @@ App.UI.SlaveInteract.work = function(slave, refresh) { } if (hasAnyLegs(slave) && V.PC.dick > 0) { - sexOptions.push({text: `Get a footjob`, scene: `FFeet`}); + sexOptions.push({text: `Get a footjob`, scene: () => App.Interact.fFeet(slave)}); } if (canGetPregnant(slave) && (slave.geneticQuirks.superfetation !== 2 || V.geneticMappingUpgrade !== 0) && (slave.fuckdoll === 0) && V.seePreg !== 0) { if (canImpreg(slave, V.PC)) { sexOptions.push({ text: `Impregnate ${him} yourself`, - get scene() { return App.Interact.fPCImpreg(slave); }, + scene: () => App.Interact.fPCImpreg(slave), }); } if (canImpreg(slave, slave)) { - sexOptions.push({text: `Use ${his} own seed to impregnate ${him}`, scene: `FSlaveSelfImpreg`}); + sexOptions.push({text: `Use ${his} own seed to impregnate ${him}`, scene: () => App.Interact.fSlaveSelfImpreg(slave)}); } - sexOptions.push({text: `Use another slave to impregnate ${him}`, scene: `FSlaveImpreg`}); + sexOptions.push({text: `Use another slave to impregnate ${him}`, scene: () => App.Interact.fSlaveImpreg(slave)}); } if (slave.assignment !== Job.DAIRY && slave.assignment !== Job.ARCADE && slave.assignment !== Job.CELLBLOCK) { if (V.dairyPiping === 1) { @@ -426,12 +428,12 @@ App.UI.SlaveInteract.work = function(slave, refresh) { if (slave.inflationType === "milk" || slave.inflationType === "none") { fillAssOptions.push({ text: `Milk`, - scene: `FillUpButt`, + scene: () => App.Interact.fillUpButt(slave), updateSlave: {inflationType: "milk", inflationMethod: 2} }); fillFaceOptions.push({ text: `Milk`, - scene: `FillUpFace`, + scene: () => App.Interact.fillUpFace(slave), updateSlave: {inflationType: "milk", inflationMethod: 1} }); } @@ -451,12 +453,12 @@ App.UI.SlaveInteract.work = function(slave, refresh) { if (slave.inflationType === "cum" || slave.inflationType === "none") { fillAssOptions.push({ text: `Cum`, - scene: `FillUpButt`, + scene: () => App.Interact.fillUpButt(slave), updateSlave: {inflationType: "cum", inflationMethod: 2} }); fillFaceOptions.push({ text: `Cum`, - scene: `FillUpFace`, + scene: () => App.Interact.fillUpFace(slave), updateSlave: {inflationType: "cum", inflationMethod: 1} }); } @@ -477,7 +479,7 @@ App.UI.SlaveInteract.work = function(slave, refresh) { if (slave.inflationType === "water" || slave.inflationType === "none") { fillAssOptions.push({ text: `Water`, - scene: `FillUpButt`, + scene: () => App.Interact.fillUpButt(slave), updateSlave: {inflationType: "water", inflationMethod: 2} }); } @@ -485,21 +487,21 @@ App.UI.SlaveInteract.work = function(slave, refresh) { if (slave.inflationType === "aphrodisiac" || slave.inflationType === "none") { fillAssOptions.push({ text: `Aphrodisiacs`, - scene: `FillUpButt`, + scene: () => App.Interact.fillUpButt(slave), updateSlave: {inflationType: "aphrodisiac", inflationMethod: 2} }); } if (slave.inflationType === "curative" || slave.inflationType === "none") { fillAssOptions.push({ text: `Curatives`, - scene: `FillUpButt`, + scene: () => App.Interact.fillUpButt(slave), updateSlave: {inflationType: "curative", inflationMethod: 2} }); } if (slave.inflationType === "tightener" || slave.inflationType === "none") { fillAssOptions.push({ text: `Rectal tighteners`, - scene: `FillUpButt`, + scene: () => App.Interact.fillUpButt(slave), updateSlave: {inflationType: "tightener", inflationMethod: 2} }); } @@ -511,7 +513,7 @@ App.UI.SlaveInteract.work = function(slave, refresh) { if (slave.inflationType === "urine" || slave.inflationType === "none") { fillAssOptions.push({ text: `Urine`, - scene: `FillUpButt`, + scene: () => App.Interact.fillUpButt(slave), updateSlave: {inflationType: "urine", inflationMethod: 2} }); } @@ -523,18 +525,18 @@ App.UI.SlaveInteract.work = function(slave, refresh) { if (V.boughtItem.toys.buckets === 1) { fillFaceOptions.push({ text: `Two liters of slave food`, - scene: `forceFeeding`, + scene: () => App.Interact.forceFeeding(slave), updateSlave: {inflation: 1, inflationType: "food", inflationMethod: 1} }); if (slave.pregKnown === 0) { fillFaceOptions.push({ text: `A gallon of slave food`, - scene: `forceFeeding`, + scene: () => App.Interact.forceFeeding(slave), updateSlave: {inflation: 2, inflationType: "food", inflationMethod: 1} }); fillFaceOptions.push({ text: `Two gallons of slave food`, - scene: `forceFeeding`, + scene: () => App.Interact.forceFeeding(slave), updateSlave: {inflation: 3, inflationType: "food", inflationMethod: 1} }); } @@ -543,52 +545,51 @@ App.UI.SlaveInteract.work = function(slave, refresh) { } } if (canDoVaginal(slave)) { - sexOptions.push({text: `Have another slave fuck ${his} pussy`, scene: `FSlaveSlaveVag`}); + sexOptions.push({text: `Have another slave fuck ${his} pussy`, goto: `FSlaveSlaveVag`}); } if (canPenetrate(slave)) { - sexOptions.push({text: `Have another slave ride ${his} cock`, scene: `FSlaveSlaveDick`}); + sexOptions.push({text: `Have another slave ride ${his} cock`, goto: `FSlaveSlaveDick`}); } else if (slave.clit >= 4) { - sexOptions.push({text: `Have another slave ride ${his} clit-dick`, scene: `FSlaveSlaveDick`}); + sexOptions.push({text: `Have another slave ride ${his} clit-dick`, goto: `FSlaveSlaveDick`}); } if (V.seeBestiality) { if (V.farmyardKennels > 0 && V.active.canine) { sexOptions.push({ text: `Have a ${V.active.canine.species} mount ${him}`, - get scene() { return App.Interact.fAnimal(slave, "canine"); }, + scene: () => App.Interact.fAnimal(slave, "canine"), }); } if (V.farmyardStables > 0 && V.active.hooved) { sexOptions.push({ text: `Let a ${V.active.hooved.species} mount ${him}`, - get scene() { return App.Interact.fAnimal(slave, "hooved"); }, + scene: () => App.Interact.fAnimal(slave, "hooved"), }); } if (V.farmyardCages > 0 && V.active.feline) { sexOptions.push({ text: `Have a ${V.active.feline.species} mount ${him}`, - get scene() { return App.Interact.fAnimal(slave, "feline"); }, + scene: () => App.Interact.fAnimal(slave, "feline"), }); } } - sexOptions.push({text: `Abuse ${him}`, scene: `FAbuse`}); + sexOptions.push({text: `Abuse ${him}`, scene: () => App.Interact.fAbuse(slave)}); if (V.seeIncest === 1) { const availRelatives = availableRelatives(slave); if (availRelatives.mother) { sexOptions.push({ text: `Fuck ${him} with ${his} mother`, - scene: `FRelation`, - update: {partner: "mother"} + scene: () => App.Interact.fRelation(slave, getSlave(slave.mother)) }); } else if (availRelatives.motherName !== null) { sexOptions.push({text: `${His} mother, ${availRelatives.motherName}, is unavailable`}); } /* - if (availRelatives.father) { - sexOptions.push({text: `Fuck ${him} with ${his} father`, scene: `FRelation`, update: {partner: "father"}}); - } else if (availRelatives.fatherName !== null) { - sexOptions.push({text: `${His} father, ${availRelatives.motherName}, is unavailable`}); - } - */ + if (availRelatives.father) { + sexOptions.push({text: `Fuck ${him} with ${his} father`, scene: () => App.Interact.fRelation(slave, getSlave(slave.father))}); + } else if (availRelatives.fatherName !== null) { + sexOptions.push({text: `${His} father, ${availRelatives.fatherName}, is unavailable`}); + } + */ if (slave.daughters > 0) { if (availRelatives.daughters === 0) { if (slave.daughters === 1) { @@ -606,21 +607,19 @@ App.UI.SlaveInteract.work = function(slave, refresh) { if (slave.daughters === 1) { sexOptions.push({ text: `Fuck ${him} with ${his} ${availRelatives.oneDaughterRel}`, - scene: `FRelation`, - update: {partner: "daughter"} + scene: () => App.Interact.fRelation(slave, randomAvailableDaughter(slave)) }); } else { sexOptions.push({ text: `Fuck ${him} with one of ${his} daughters`, - scene: `FRelation`, - update: {partner: "daughter"} + scene: () => App.Interact.fRelation(slave, randomAvailableDaughter(slave)) }); } /* - if (availRelatives.daughters > 1) { - sexOptions.push({text: `Fuck ${him} with ${his} daughters`, scene: `FRelation`, update: {partner: "daughter"}}); - } - */ + if (availRelatives.daughters > 1) { + sexOptions.push({text: `Fuck ${him} with ${his} daughters`, scene: () => App.Interact.fRelation(slave, daughters?)}); + } + */ } } if (slave.sisters > 0) { @@ -640,21 +639,19 @@ App.UI.SlaveInteract.work = function(slave, refresh) { if (slave.sisters === 1) { sexOptions.push({ text: `Fuck ${him} with ${his} ${availRelatives.oneSisterRel}`, - scene: `FRelation`, - update: {partner: "sister"} + scene: () => App.Interact.fRelation(slave, randomAvailableSister(slave)) }); } else { sexOptions.push({ text: `Fuck ${him} with one of ${his} sisters`, - scene: `FRelation`, - update: {partner: "sister"} + scene: () => App.Interact.fRelation(slave, randomAvailableSister(slave)) }); } /* - if (availRelatives.sisters > 1) { - sexOptions.push({text: `Fuck ${him} with ${his} sisters`, scene: `FRelation`, update: {partner: "sisters}}); - } - */ + if (availRelatives.sisters > 1) { + sexOptions.push({text: `Fuck ${him} with ${his} sisters`, scene: () => App.Interact.fRelation(slave, sisters?)}); + } + */ } } } @@ -663,8 +660,7 @@ App.UI.SlaveInteract.work = function(slave, refresh) { if (isSlaveAvailable(lover)) { sexOptions.push({ text: `Fuck ${him} with ${his} ${relationshipTermShort(slave)} ${SlaveFullName(lover)}`, - scene: `FRelation`, - update: {partner: "relationship"} + scene: () => App.Interact.fRelation(slave, lover) }); } else if (lover.assignment === Job.AGENT) { if (slave.broodmother < 2) { @@ -683,13 +679,13 @@ App.UI.SlaveInteract.work = function(slave, refresh) { if (slave.rivalryTarget !== 0 && hasAllLimbs(slave)) { const rival = getSlave(slave.relationshipTarget); if (isSlaveAvailable(rival) && hasAnyLegs(rival)) { - sexOptions.push({text: `Abuse ${his} rival with ${him}`, scene: `FRival`}); + sexOptions.push({text: `Abuse ${his} rival with ${him}`, scene: () => App.Interact.fRival(slave)}); } } if (slave.fetish !== "mindbroken" && slave.accent < 4 && ((canTalk(slave)) || hasAnyArms(slave))) { - sexOptions.push({text: `Ask ${him} about ${his} feelings`, scene: App.Interact.feelings(slave)}); + sexOptions.push({text: `Ask ${him} about ${his} feelings`, scene: () => App.Interact.feelings(slave)}); if (V.PC.dick > 0) { - sexOptions.push({text: `Make ${him} beg`, scene: `FBeg`}); + sexOptions.push({text: `Make ${him} beg`, scene: () => App.Interact.fBeg(slave)}); } } if (slave.devotion >= 100 && slave.relationship < 0 && slave.relationship > -3) { @@ -711,27 +707,35 @@ App.UI.SlaveInteract.work = function(slave, refresh) { } } else { /* IS A FUCKDOLL */ - sexOptions.push({text: `Fuck ${his} face hole`, scene: `FFuckdollOral`}); + sexOptions.push({text: `Fuck ${his} face hole`, scene: () => App.Interact.fFuckdollOral(slave)}); if (canDoVaginal(slave)) { - sexOptions.push({text: `Fuck ${his} front hole`, scene: `FFuckdollVaginal`}); + sexOptions.push({text: `Fuck ${his} front hole`, scene: () => App.Interact.fFuckdollVaginal(slave)}); } if (canGetPregnant(slave) && (slave.geneticQuirks.superfetation !== 2 || V.geneticMappingUpgrade !== 0) && V.seePreg !== 0) { if (canImpreg(slave, V.PC)) { - sexOptions.push({text: `Put a baby in ${him}`, scene: `FFuckdollImpreg`}); + sexOptions.push({text: `Put a baby in ${him}`, scene: () => App.Interact.fFuckdollImpreg(slave)}); } } if (canDoAnal(slave)) { - sexOptions.push({text: `Fuck ${his} rear hole`, scene: `FFuckdollAnal`}); + sexOptions.push({text: `Fuck ${his} rear hole`, scene: () => App.Interact.fFuckdollAnal(slave)}); } } let activeSlaveRepSacrifice = repGainSacrifice(slave, V.arcologies[0]); - if (activeSlaveRepSacrifice > 0 && V.arcologies[0].FSPaternalist === "unset" && (slave.breedingMark === 0 || V.propOutcome === 0 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")) { + if (activeSlaveRepSacrifice > 0) { + /* + TODO: fix this interaction. Consider that it "takes a week" but is not tied to endweek. Consider how easy it is to cheese for rep gains. sexOptions.push({ - text: `Sacrifice ${him} on the altar`, - goto: `Aztec Slave Sacrifice`, - note: `This will kill ${him} and gain you ${activeSlaveRepSacrifice} reputation`, - update: {sacrificeType: "life"} - }); + text: `Require ${him} to offer penance to Xochiquetzal`, + goto: `Aztec Slave Sacrifice Penance`, + note: `This will gain you ${activeSlaveRepSacrifice} reputation`, + });*/ + if (V.arcologies[0].FSPaternalist === "unset" && (slave.breedingMark === 0 || V.propOutcome === 0 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")) { + sexOptions.push({ + text: `Sacrifice ${him} on the altar`, + goto: `Aztec Slave Sacrifice Life`, + note: `This will kill ${him} and gain you ${activeSlaveRepSacrifice} reputation`, + }); + } } el.append(`Use ${him}: `); el.appendChild(generateRows(sexOptions)); @@ -772,7 +776,11 @@ App.UI.SlaveInteract.work = function(slave, refresh) { // add a note node if required if (sexArray[i].note) { - link.appendChild(App.UI.DOM.makeElement('span', sexArray[i].note, 'note')); + link = App.UI.DOM.combineNodes( + link, + " ", + (App.UI.DOM.makeElement('span', sexArray[i].note, 'note')) + ); } } linkArray.push(link); @@ -796,8 +804,8 @@ App.UI.SlaveInteract.work = function(slave, refresh) { if (typeof sexOption.scene === "string") { // Run scene and store render results temporarily frag = App.UI.DOM.renderPassage(sexOption.scene); - } else { - frag = sexOption.scene; + } else if (typeof sexOption.scene === "function") { + frag = sexOption.scene(); } // Refresh (clears scene display) refresh(); @@ -848,24 +856,26 @@ App.UI.SlaveInteract.work = function(slave, refresh) { } function generateLink(linkDesc) { + const span = document.createElement("span"); // is it just text? if (linkDesc.disabled) { return App.UI.DOM.disabledLink(linkDesc.text, [linkDesc.disabled]); } // Are they already on this toyHole? if (linkDesc.toyHole === slave.toyHole) { return document.createTextNode(linkDesc.text); } // Set up the link - const link = App.UI.DOM.link( + span.append(App.UI.DOM.link( linkDesc.text, () => { slave.toyHole = linkDesc.toyHole; jQuery('#fucktoy-pref').empty().append(fucktoyPref()); }, - ); + )); // add a note node if required if (linkDesc.note) { - App.UI.DOM.appendNewElement("span", link, linkDesc.note, "note"); + span.append(" "); + App.UI.DOM.appendNewElement("span", span, linkDesc.note, "note"); } - return link; + return span; } el.appendChild(App.UI.DOM.generateLinksStrip(links.map(generateLink))); diff --git a/src/interaction/universalRules.js b/src/interaction/universalRules.js new file mode 100644 index 0000000000000000000000000000000000000000..8cc36e2042f4db1c1dd8a6085f3ad3dbb67fdcbf --- /dev/null +++ b/src/interaction/universalRules.js @@ -0,0 +1,263 @@ +App.UI.universalRules = function() { + const node = new DocumentFragment(); + let option; + const tabBar = new App.UI.Tabs.TabBar("CheatArcology"); + tabBar.addTab("Permissions", "permissions", permissions()); + tabBar.addTab("Slave mods", "mods", mods()); + tabBar.addTab("Names", "names", names()); + if (V.seePreg) { + tabBar.addTab("Babies", "babies", babies()); + } + node.append(tabBar.render()); + return node; + + function permissions() { + const frag = new DocumentFragment(); + App.UI.DOM.appendNewElement("h2", frag, `Permissions for slaves`); + + let options = new App.UI.OptionsGroup(); + + options.addOption("When unhealthy on assignment, slaves", "universalRulesRest") + .addValueList([ + ["Remain on assignment", 1], + [`Automatically rest`, 0] + ]); + + options.addOption("Get consent before fucking other slaves", "universalRulesConsent") + .addValue("Yes", 1).on() + .addValue(`No`, 0).off(); + + options.addOption("Slave requests for body mods are", "modRequestsAllowed") + .addValue("Allowed", 1).on() + .addValue(`Forbidden`, 0).off(); + + options.addOption("Slave requests for growth hormones are", "expansionRequestsAllowed") + .addValue("Allowed", 1).on() + .addValue(`Forbidden`, 0).off(); + + if (V.brothel + V.club + V.dairy + V.farmyard + V.servantsQuarters + V.arcade + V.schoolroom + V.spa + V.nursery + V.clinic + V.masterSuite + V.cellblock > 0) { + options.addOption("Slaves cooperate with staffed facilities to improve their performance", "universalRulesFacilityWork") + .addValue("Allow", 1).on() + .addValue(`Stop`, 0).off(); + + options.addOption("Slave permission to assign themselves to facilities when choosing their assignment", "universalRulesAssignsSelfFacility") + .addValue("Allow", 1).on() + .addValue(`Stop`, 0).off(); + } + + options.addOption("Immobile slaves maintain their muscles rather than allow themselves to become soft", "universalRulesImmobileSlavesMaintainMuscles") + .addValue("Mandatory workouts", 1).on() + .addValue(`Stop`, 0).off(); + + frag.append(options.render()); + + App.UI.DOM.appendNewElement("h2", frag, `New slaves`); + options = new App.UI.OptionsGroup(); + options.addOption(`Apply Rules Assistant to newly acquired slaves`, "universalRulesNewSlavesRA") + .addValue("Yes", 1).on() + .addValue("No", 0).off(); + frag.append(options.render()); + return frag; + } + + function mods() { + const frag = new DocumentFragment(); + App.UI.DOM.appendNewElement("h2", frag, `Branding for slaves`); + frag.append(App.UI.brandSelect("official")); + + App.UI.DOM.appendNewElement("h2", frag, `Scarring for slaves`); + frag.append(App.UI.scarSelect("official")); + + return frag; + } + + function names() { + const frag = new DocumentFragment(); + App.UI.DOM.appendNewElement("h2", frag, `Names for slaves`); + + const options = new App.UI.OptionsGroup(); + + options.addOption("Slaves keep surnames", "surnamesForbidden") + .addValue("Yes", 1).on() + .addValue(`No going forward`, 0).off() + .customButton(`No and strip all current surnames`, () => { + for (const slave of V.slaves) { + slave.slaveSurname = 0; + } + V.surnamesForbidden = 0; + }, passage()); + + if (V.surnamesForbidden === 0) { + options.addOption("Surname convention", "surnameScheme") + .addValue("Family (Patrilineal)", 0) + .addValue("Family (Matrilineal)", 1) + .addValue("Norse (Patronymic)", 2) + .addValue("Norse (Matronymic)", 3) + .addValue("Hadesha (Patronymic)", 4) + .addValue("Hadesha (Matronymic)", 5) + .addValue("Double-barreled", 6) + .addValue("Hispanic", 7) + .addValue("Lusitanic", 8) + .addComment((() => { + const start = "If Adam Smith and Betty Jones have a daughter, Charlotte, and a son, Daniel, they will be named "; + switch (V.surnameScheme) { + case 0: + return start + "Charlotte Smith and Daniel Smith"; + case 1: + return start + "Charlotte Jones and Daniel Jones"; + case 2: + return start + "Charlotte Adamsdóttir and Daniel Adamsson"; + case 3: + return start + "Charlotte Bettysdóttir and Daniel Bettysson"; + case 4: + return start + "Charlotte Adam and Daniel Adam"; + case 5: + return start + "Charlotte Betty and Daniel Betty"; + case 6: + return start + "Charlotte Smith-Jones and Daniel Smith-Jones"; + case 7: + return start + "Charlotte Smith Jones and Daniel Smith Jones"; + case 8: + return start + "Charlotte Jones Smith and Daniel Jones Smith"; + } + })()); + if ([0, 1, 6, 7, 8].includes(V.surnameScheme)) { + options.addOption("Grant this family name to children born without one", "surnameArcology").showTextBox(); + } + if ([0, 1, 2, 3, 4, 5].includes(V.surnameScheme)) { + options.addOption("Override gender preference for your own children", "surnamePCOverride") + .addValue("Follow conventions", 0).on().addValue("Prefer using your name", 1).addValue("Avoid using your name", 2); + } + } + + options.addOption("Slave nicknames", "nicknamesAllowed") + .addValue("Allowed", 1).on() + .addValue(`Forbidden`, 0).off(); + + if (V.FSAnnounced > 0) { + options.addOption("Future society names for new slaves", "useFSNames") + .addValue("Applied", 1).on() + .addValue(`Not applied`, 0).off(); + + if (V.useFSNames !== 0) { + option = options.addOption("Future society names for new slaves", "FSNamePref") + .addValue(`No direction`, 0); + + if (V.arcologies[0].FSChattelReligionist >= 20) { + option.addValue(`Devotional`, 1); + } + if (V.arcologies[0].FSRomanRevivalist > 20) { + option.addValue(`Roman`, 2); + } + if (V.arcologies[0].FSAztecRevivalist > 20) { + option.addValue(`Aztec`, 3); + } + if (V.arcologies[0].FSEgyptianRevivalist > 20) { + option.addValue(`Egyptian`, 4); + } + if (V.arcologies[0].FSEdoRevivalist > 20) { + option.addValue(`Japanese`, 5); + } + if (V.arcologies[0].FSDegradationist !== "unset") { + option.addValue(`Degrading`, 6); + } + if (V.arcologies[0].FSPaternalist >= 20) { + option.addValue(`Paternalist`, 7); + } + if (V.arcologies[0].FSIntellectualDependency >= 20) { + option.addValue(`Simple Bimbo`, 8); + } + if (V.arcologies[0].FSPastoralist >= 20) { + option.addValue(`Pastoralist`, 9); + } + } + } + frag.append(options.render()); + return frag; + } + + function babies() { + const frag = new DocumentFragment(); + const r = []; + App.UI.DOM.appendNewElement("h2", frag, `Pregnant slaves`); + let options = new App.UI.OptionsGroup(); + + if (V.universalRulesImpregnation === "HG") { + r.push(`Fertile slaves will be systematically impregnated by your Head Girl,`); + const {he} = getPronouns(S.HeadGirl ? S.HeadGirl : {pronoun: App.Data.Pronouns.Kind.plural}); + if (!V.HeadGirlID) { + r.push(`once you designate one capable of the act.`); + } else { + r.push(`if ${he} is able to do so.`); + } + } else if (V.universalRulesImpregnation === "Stud") { + if (!V.StudID) { + r.push(`Fertile slaves will be systematically impregnated by a Stud, once you designate a subordinate slave to act as such.`); + } else { + const stud = slaveStateById(V.StudID); + const {he} = getPronouns(stud ? stud : {pronoun: App.Data.Pronouns.Kind.plural}); + r.push(`Fertile slaves will be systematically impregnated by your Stud, if ${he} is able to do so.`); + } + } else if (V.universalRulesImpregnation === "PC") { + r.push(`Fertile slaves will be systematically impregnated by you.`); + } else { + r.push(`Fertile slaves will not be systematically impregnated.`); + } + option = options.addOption(r.join(" "), "universalRulesImpregnation"); + option.addValue(`No regimen`, "none", () => V.universalHGImpregnateMasterSuiteToggle = 0); + if (V.PC.dick > 0) { + option.addValue(`Inseminate them yourself`, "PC", () => V.universalHGImpregnateMasterSuiteToggle = 0); + } + if (V.seeDicks !== 0) { + option.addValue(`Head Girl`, "HG"); + } + option.addValue(`Stud`, "Stud"); + + if (["HG", "Stud"].includes(V.universalRulesImpregnation)) { + options.addOption(`${V.universalRulesImpregnation}, if able, will impregnate slaves in the Master Suite`, "universalHGImpregnateMasterSuiteToggle") + .addValue("Yes", 1).on() + .addValue("No", 0).off(); + } + + option = options.addOption(`Scan heavily pregnant slaves daily`, "universalRulesBirthing") + .addValue("Yes", 1).on() + .addValue("No", 0).off(); + if (V.universalRulesBirthing === 1) { + option.addComment(`Heavily pregnant slaves will be scanned daily for signs of labor and moved to a birthing area immediately if any are detected.`); + r.push(); + } else { + option.addComment(`Heavily pregnant slaves will be required to work right up until they feel contractions. This will increase upkeep costs for these slaves`); + } + + option = options.addOption(`Slave birth`, "universalRulesCSec") + .addValue("C-sections", 1) + .addValue("Naturally", 0); + + if (V.universalRulesCSec === 1) { + option.addComment(`Pregnant slaves will be given Caesarean sections rather than allowed to give birth naturally in order to minimize health issues and to preserve their vaginas.`); + } else { + option.addComment(`Pregnant slaves will give birth naturally unless health issues pose a threat. Will lessen medical costs, at the expense of scarring`); + } + frag.append(options.render()); + + App.UI.DOM.appendNewElement("h2", frag, `Babies`); + options = new App.UI.OptionsGroup(); + + option = options.addOption(`Babies will be sent to`, "DefaultBirthDestination") + .addValue("Decide individually", "individually decided fates", () => V.universalRulesChildrenBecomeBreeders = 0) + .addValue("Slave orphanage", "an orphanage", () => V.universalRulesChildrenBecomeBreeders = 0) + .addValue("Citizen school", "a citizen school", () => V.universalRulesChildrenBecomeBreeders = 0) + .addValue("Private school", "a private school", () => V.universalRulesChildrenBecomeBreeders = 0); + + if (V.policies.cash4Babies > 0) { + option.addValue("Market", "the market"); + } + if (V.arcologies[0].FSRepopulationFocus > 40) { + option.addValue("Breeder schools", "breeder schools", () => V.universalRulesChildrenBecomeBreeders = 1) + .addComment(`Will require a ${cashFormat(50)} donation per week once enrollment begins`); + } + option.addComment(`Children reserved for the Incubator or Nursery will not be affected`); + frag.append(options.render()); + return frag; + } +}; diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js index a810a07bf3991064fb2581add046741f81cc2847..0d5ca07c02493e14bc873f5942d2606dadcb5476 100644 --- a/src/js/DefaultRules.js +++ b/src/js/DefaultRules.js @@ -23,7 +23,10 @@ globalThis.DefaultRules = (function() { /** @type {string} */ let r; - let pronouns, he, him, his; + let pronouns; + let he; + let him; + let his; /** * @param {App.Entity.SlaveState} slave @@ -110,7 +113,8 @@ globalThis.DefaultRules = (function() { // merge all rules applying on a slave into one big rule /** @type {FC.RA.Rule[]} */ const rules = V.defaultRules.filter((rule) => ruleAppliesP(rule, slave)); - const ruleIds = [], assignments = []; + const ruleIds = []; + const assignments = []; for (const rule of rules) { ruleIds.push(rule.ID); assignments.push(ProcessAssignments(slave, Object.assign({}, rule.set))); @@ -1467,13 +1471,13 @@ globalThis.DefaultRules = (function() { break; case "penis enhancement": - if (!((slave.dick > 0 && slave.dick < 10) || slave.clit < 5)) { + if (!((slave.dick.isBetween(0, 10)) || slave.clit < 5)) { flag = false; } break; case "hyper penis enhancement": - if (V.arcologies[0].FSAssetExpansionistResearch !== 1 || !((slave.dick > 0 && slave.dick < 31) || slave.clit < 5)) { + if (V.arcologies[0].FSAssetExpansionistResearch !== 1 || !((slave.dick.isBetween(0, 31)) || slave.clit < 5)) { flag = false; } break; @@ -3071,7 +3075,8 @@ globalThis.DefaultRules = (function() { } // removing tags selected for removal. - let tags = [], i; + let tags = []; + let i; if (rule.removeLabel != null && rule.removeLabel !== '') { tags = rule.removeLabel.split("|"); } diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js index 5636ddf9c581a569783c4d9dc7d1061959985d5a..c3c9ba6d5a2cdd06210541f93f46378c561ba706 100644 --- a/src/js/SlaveState.js +++ b/src/js/SlaveState.js @@ -804,7 +804,9 @@ App.Entity.SlaveState = class SlaveState { * @type {FC.EyebrowThickness} */ this.eyebrowFullness = "natural"; - /** hair style */ + /** hair style + * @type {FC.HairStyle} + */ this.hStyle = "neat"; /** pubic hair style */ this.pubicHStyle = "neat"; diff --git a/src/js/assignJS.js b/src/js/assignJS.js index f6bc5ac4e7a15892a5d090f85778ba1f02da52d0..f6f5451d6ce25d10572b20bafa6982ac1f774625 100644 --- a/src/js/assignJS.js +++ b/src/js/assignJS.js @@ -48,7 +48,6 @@ globalThis.assignJob = function(slave, job) { V[specialIDProp] = slave.ID; } } - /* Tracking for the following cases: */ if (oldJob !== job && V.assignmentRecords[slave.ID] !== job && oldJob !== Job.REST) { // Check that there is a real change happening. Sometimes when you send someone to a classroom or something, this fires twice. switch (job.toLowerCase()) { diff --git a/src/js/birth/birth.js b/src/js/birth/birth.js index 5122c25a3dda5616df3c90883d6c800c6598d32d..d811de7dd9b0c0feb9529fe712c4ec458ce5a178 100644 --- a/src/js/birth/birth.js +++ b/src/js/birth/birth.js @@ -7137,7 +7137,7 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {}) babyIntro = `${his} ${babies}${UH}`; } - if (undressed === 0 && slave.clothes !== "no clothing" && slave.clothes !== "body oil") { + if (undressed === 0 && App.Data.clothes.get(slave.clothes).exposure <= 3) { if (slave.fetish === "mindbroken") { r.push(`Instinctively, ${he} begins to push out`); if (slave.broodmother > 0) { @@ -8505,7 +8505,7 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {}) } } } - } else if (slave.clothes === "no clothing" || slave.clothes === "body oil") { + } else if (App.Data.clothes.get(slave.clothes).exposure <= 3) { if (slave.fetish === "mindbroken") { r.push(`Instinctively, ${he} begins to push out`); if (slave.broodmother > 0) { diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js index 38230dced5b884256049a2c45d04cdb4e6a2a30b..c4242bccc77d37461f4ad9351ed6ea5a1581f66c 100644 --- a/src/js/eventSelectionJS.js +++ b/src/js/eventSelectionJS.js @@ -482,19 +482,6 @@ if(eventSlave.drugs === "breast injections") { } } } - if (eventSlave.fetish === "sadist") { - if (eventSlave.fetishStrength > 20) { - if (App.Entity.facilities.arcade.established) { - if (eventSlave.trust >= -20) { - if (eventSlave.devotion > 50) { - if (eventSlave.belly < 300000) { - V.RESSevent.push("arcade sadist"); - } - } - } - } - } - } if (eventSlave.assignment !== Job.QUARTER) { if (eventSlave.dick === 0) { if (eventSlave.vagina === -1) { @@ -754,14 +741,6 @@ if(eventSlave.drugs === "breast injections") { } } - if (eventSlave.devotion < -20) { - if (eventSlave.trust >= -20) { - if (eventSlave.clothes === "uncomfortable straps") { - V.RESSevent.push("bondage gear"); - } - } - } - if (eventSlave.labia > 1 && eventSlave.vagina >= 0) { if (eventSlave.muscles > 5 || eventSlave.diet === "muscle building") { if (eventSlave.belly < 10000) { @@ -1039,16 +1018,6 @@ if(eventSlave.drugs === "breast injections") { } } - if (eventSlave.assignment !== Job.QUARTER) { - if (eventSlave.devotion > 50) { - if (eventSlave.trust > 50) { - if ([Job.CONCUBINE, Job.FUCKTOY, Job.MASTERSUITE].includes(eventSlave.assignment)) { - V.RESSevent.push("bed snuggle"); - } - } - } - } - if (eventSlave.minorInjury === "sore ass") { if (eventSlave.devotion <= 50) { V.RESSevent.push("sore ass"); diff --git a/src/js/itemAvailability.js b/src/js/itemAvailability.js index b440d93de6016f6b192d4e0f4d8fc0a9f487c902..84ba805ba924c6d7abbc0a7c73f2ffbfd3896f42 100644 --- a/src/js/itemAvailability.js +++ b/src/js/itemAvailability.js @@ -27,7 +27,7 @@ globalThis.isItemAccessible = (function() { /** * Returns array of wearable clothing in format [name, value], basically player facing / game data. * @param {Map} map Map to look in (such as App.Data.clothes) - * @param {function} [filter] + * @param {(arg0: any) => any} [filter] The callback function to run. * @returns {Array} */ function array(map, filter) { diff --git a/src/js/main.js b/src/js/main.js index 0c7e90ce46aa5e67003dc1f28e07418b1dbaa722..accb599874e0ddcaccefa47d2e195874ae600359 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -29,32 +29,33 @@ App.MainView.useFucktoy = function(slave) { if (slave.fuckdoll === 0) { div.append(", but for now:"); - const optionDiv = document.createElement("div"); - optionDiv.classList.add("indent"); + const linkArray = []; - optionDiv.append(App.UI.DOM.passageLink(`Use ${his} mouth`, "FLips", setEnvironment), - " | ", App.UI.DOM.passageLink("Play with " + his + " tits", "FBoobs", setEnvironment)); + linkArray.push( + App.UI.DOM.passageLink(`Use ${his} mouth`, "fLips", setEnvironment), + App.UI.DOM.passageLink("Play with " + his + " tits", "fBoobs", setEnvironment) + ); if (canDoVaginal(slave)) { - optionDiv.append(" | ", App.UI.DOM.passageLink(`Fuck ${him}`, "FVagina", setEnvironment)); + linkArray.push(App.UI.DOM.passageLink(`Fuck ${him}`, "fVagina", setEnvironment)); if (canDoAnal(slave)) { - optionDiv.append(" | ", App.UI.DOM.passageLink(`Use ${his} holes`, "FButt", setEnvironment)); + linkArray.push(App.UI.DOM.passageLink(`Use ${his} holes`, "fButt", setEnvironment)); } } if (canDoAnal(slave)) { - optionDiv.append(" | ", App.UI.DOM.passageLink(`Fuck ${his} ass`, "FAnus", setEnvironment)); + linkArray.push(App.UI.DOM.passageLink(`Fuck ${his} ass`, "fAnus", setEnvironment)); } if (canDoVaginal(slave) || canDoAnal(slave)) { if (slave.belly >= 300000) { - optionDiv.append(" | ", App.UI.DOM.passageLink(`Fuck ${him} over ${his} belly`, "FBellyFuck", setEnvironment)); + linkArray.push(App.UI.DOM.passageLink(`Fuck ${him} over ${his} belly`, "fBellyFuck", setEnvironment)); } } if (canPenetrate(slave)) { - optionDiv.append(" | ", App.UI.DOM.passageLink(`Ride ${him}`, "FDick", setEnvironment)); + linkArray.push(App.UI.DOM.passageLink(`Ride ${him}`, "fDick", setEnvironment)); } - optionDiv.append(" | ", App.UI.DOM.passageLink(`Abuse ${him}`, "FAbuse", setEnvironment)); + linkArray.push(App.UI.DOM.passageLink(`Abuse ${him}`, "fAbuse", setEnvironment)); - div.append(optionDiv); + App.UI.DOM.appendNewElement("div", div, App.UI.DOM.generateLinksStrip(linkArray), "indent"); } else { div.append("."); } @@ -84,34 +85,31 @@ App.MainView.useGuard = function() { } const {him, his} = getPronouns(guard); - const optionDiv = document.createElement("div"); - optionDiv.classList.add("indent"); + const linkArray = []; - optionDiv.append( - App.UI.DOM.passageLink(`Use ${his} mouth`, "FLips", setEnvironment), - " | ", - App.UI.DOM.passageLink(`Play with ${his} tits`, "FBoobs", setEnvironment) + linkArray.push( + App.UI.DOM.passageLink(`Use ${his} mouth`, "fLips", setEnvironment), + App.UI.DOM.passageLink(`Play with ${his} tits`, "fBoobs", setEnvironment) ); if (canDoVaginal(guard)) { - optionDiv.append(" | ", App.UI.DOM.passageLink(`Fuck ${him}`, "FVagina", setEnvironment)); + linkArray.push(App.UI.DOM.passageLink(`Fuck ${him}`, "fVagina", setEnvironment)); if (canDoAnal(guard)) { - optionDiv.append(" | ", App.UI.DOM.passageLink(`Use ${his} holes`, "FButt", setEnvironment)); + linkArray.push(App.UI.DOM.passageLink(`Use ${his} holes`, "fButt", setEnvironment)); } if (guard.belly >= 300000) { - optionDiv.append(" | ", App.UI.DOM.passageLink(`Fuck ${him} over ${his} belly`, "FBellyFuck", setEnvironment)); + linkArray.push(App.UI.DOM.passageLink(`Fuck ${him} over ${his} belly`, "fBellyFuck", setEnvironment)); } } if (canPenetrate(guard)) { - optionDiv.append(" | ", App.UI.DOM.passageLink(`Ride ${him}`, "FDick", setEnvironment)); + linkArray.push(App.UI.DOM.passageLink(`Ride ${him}`, "fDick", setEnvironment)); } if (canDoAnal(guard)) { - optionDiv.append(" | ", App.UI.DOM.passageLink(`Fuck ${his} ass`, "FAnus", setEnvironment)); + linkArray.push(App.UI.DOM.passageLink(`Fuck ${his} ass`, "fAnus", setEnvironment)); } - optionDiv.append(" | ", App.UI.DOM.passageLink(`Abuse ${him}`, "Gameover", () => { V.gameover = "idiot ball"; })); - - outerDiv.append(optionDiv); + linkArray.push(App.UI.DOM.passageLink(`Abuse ${him}`, "Gameover", () => { V.gameover = "idiot ball"; })); + App.UI.DOM.appendNewElement("div", outerDiv, App.UI.DOM.generateLinksStrip(linkArray), "indent"); return outerDiv; }; @@ -299,8 +297,6 @@ App.MainView.full = function() { App.UI.DOM.passageLink("Hide", "Main", () => { V.seeDesk = 0; }))); } - fragment.append(App.Reminders.list({maxFuture: 5, link: true})); - if (V.seeFCNN === 1) { const div = document.createElement("div"); div.classList.add("main-fcnn"); diff --git a/src/js/physicalDevelopment.js b/src/js/physicalDevelopment.js index 3c7c22eb6173886520d2d89fa0fe97ed0560164e..96fa22e73aefdb98a755e36161b8888c7f4a40c3 100644 --- a/src/js/physicalDevelopment.js +++ b/src/js/physicalDevelopment.js @@ -38,10 +38,10 @@ globalThis.physicalDevelopment = (function physicalDevelopment() { if (slave.boobs - slave.boobsImplant <= 300) { increaseBoobsXX(slave); } - if (slave.dick > 0 && (slave.dick < 3 || slave.geneticQuirks.wellHung === 2)) { + if (slave.dick.isBetween(0, 3) || slave.geneticQuirks.wellHung === 2) { increaseDick(slave); } - if (slave.balls > 0 && slave.balls < 3) { + if (slave.balls.isBetween(0, 3)) { increaseBalls(slave); } if (slave.vagina > 0 && slave.ovaries > 0 && physicalAgeSwap > slave.pubertyAgeXX) { @@ -3208,67 +3208,67 @@ globalThis.physicalDevelopment = (function physicalDevelopment() { } } else if (slave.hormoneBalance <= -100) { if (physicalAgeSwap === 8) { - if (slave.clit > 0 && slave.clit < 4) { + if (slave.clit.isBetween(0, 4)) { if (jsRandom(1, 100) > 90) { slave.clit++; } } } else if (physicalAgeSwap === 9) { - if (slave.clit > 0 && slave.clit < 4) { + if (slave.clit.isBetween(0, 4)) { if (jsRandom(1, 100) > 90) { slave.clit++; } } } else if (physicalAgeSwap === 10) { - if (slave.clit > 0 && slave.clit < 4) { + if (slave.clit.isBetween(0, 4)) { if (jsRandom(1, 100) > 90) { slave.clit++; } } } else if (physicalAgeSwap === 11) { - if (slave.clit > 0 && slave.clit < 4) { + if (slave.clit.isBetween(0, 4)) { if (jsRandom(1, 100) > 70) { slave.clit++; } } } else if (physicalAgeSwap === 12) { - if (slave.clit > 0 && slave.clit < 4) { + if (slave.clit.isBetween(0, 4)) { if (jsRandom(1, 100) > 70) { slave.clit++; } } } else if (physicalAgeSwap === 13) { - if (slave.clit > 0 && slave.clit < 4) { + if (slave.clit.isBetween(0, 4)) { if (jsRandom(1, 100) > 70) { slave.clit++; } } } else if (physicalAgeSwap === 14) { - if (slave.clit > 0 && slave.clit < 4) { + if (slave.clit.isBetween(0, 4)) { if (jsRandom(1, 100) > 70) { slave.clit++; } } } else if (physicalAgeSwap === 15) { - if (slave.clit > 0 && slave.clit < 4) { + if (slave.clit.isBetween(0, 4)) { if (jsRandom(1, 100) > 70) { slave.clit++; } } } else if (physicalAgeSwap === 16) { - if (slave.clit > 0 && slave.clit < 4) { + if (slave.clit.isBetween(0, 4)) { if (jsRandom(1, 100) > 70) { slave.clit++; } } } else if (physicalAgeSwap === 17) { - if (slave.clit > 0 && slave.clit < 4) { + if (slave.clit.isBetween(0, 4)) { if (jsRandom(1, 100) > 70) { slave.clit++; } } } else if (physicalAgeSwap === 18) { - if (slave.clit > 0 && slave.clit < 4) { + if (slave.clit.isBetween(0, 4)) { if (jsRandom(1, 100) > 70) { slave.clit++; } diff --git a/src/js/pregJS.js b/src/js/pregJS.js index 8615dcb7c82b6dfd43f3bd9d12d37f7f1009964a..a9b3dbaa556e82281bba82fc04585a4040d3742b 100644 --- a/src/js/pregJS.js +++ b/src/js/pregJS.js @@ -423,19 +423,14 @@ globalThis.setPregType = function(actor) { * @param {number} chance is the % chance to conceive. * @param {number} hole control's the hole involved (0 - vagina, 1 - ass, 2 - both). .mpreg did this. * @param {number} [fatherID] is the ID of her sire or 0 if undefined. - * @param {boolean} [displayOverride] is an override if defined - fatherID must be defined in this case. * @returns {string} */ -globalThis.knockMeUp = function(target, chance, hole, fatherID, displayOverride) { - let He; +globalThis.knockMeUp = function(target, chance, hole, fatherID) { let r = ``; - if (target.ID !== -1) { - ({He} = getPronouns(target)); - } if (V.seePreg !== 0) { // eslint-disable-next-line no-nested-ternary if (jsRandom(0, 99) < (chance + (V.reproductionFormula * ((target.pregSource <= 0) ? ((target.ID === -1) ? 0 : 10) : 20)))) { - if (target.mpreg === hole) { + if (target.mpreg === hole || hole === 2) { if (target.pregWeek <= 0) { target.preg = 1; target.pregSource = (!fatherID ? 0 : fatherID); @@ -445,53 +440,16 @@ globalThis.knockMeUp = function(target, chance, hole, fatherID, displayOverride) } target.pregType = setPregType(target); - WombImpregnate(target, target.pregType, target.pregSource, 1); + WombImpregnate(target, target.pregType, fatherID, 1); if (V.menstruation === 1) { // - } else if (!displayOverride) { - target.pregKnown = 1; - if (target.ID === -1) { - /* r += "<span class="lime">You have gotten pregnant.</span>"; */ - } else { - r += `<span class="lime">${He} has become pregnant.</span>`; - } - if (target.geneticQuirks.superfetation === 2 && target.womb.length > 0) { - if (V.seeHyperPreg === 1) { - target.fertPeak = 1; - } else { - target.fertPeak = 4; - } - } } else { - target.pregKnown = 1; - if (target.geneticQuirks.superfetation === 2 && target.womb.length > 0) { - if (V.seeHyperPreg === 1) { - target.fertPeak = 1; - } else { - target.fertPeak = 4; - } - } - } - } else if (hole === 2) { - if (target.pregWeek <= 0) { - target.preg = 1; - target.pregSource = (!fatherID ? 0 : fatherID); - if (target.ID !== -1) { - target.pregWeek = 1; - } - } - - target.pregType = setPregType(target); - WombImpregnate(target, target.pregType, target.pregSource, 1); - - if (V.menstruation === 1) { - // - } else if (!displayOverride) { target.pregKnown = 1; if (target.ID === -1) { /* r += "<span class="lime">You have gotten pregnant.</span>"; */ } else { + const {He} = getPronouns(target); r += `<span class="lime">${He} has become pregnant.</span>`; } if (target.geneticQuirks.superfetation === 2 && target.womb.length > 0) { @@ -501,15 +459,6 @@ globalThis.knockMeUp = function(target, chance, hole, fatherID, displayOverride) target.fertPeak = 4; } } - } else { - target.pregKnown = 1; - if (target.geneticQuirks.superfetation === 2 && target.womb.length > 0) { - if (V.seeHyperPreg === 1) { - target.fertPeak = 1; - } else { - target.fertPeak = 4; - } - } } } } diff --git a/src/js/quickListJS.js b/src/js/quickListJS.js index 6331fb161d0954f5a5d1fd53c3000be49d1d6eb8..6f6b45c2bfeb0363c22558577d27b5fd10cb4763 100644 --- a/src/js/quickListJS.js +++ b/src/js/quickListJS.js @@ -35,8 +35,8 @@ globalThis.quickListBuildLinks = function() { }; App.UI.quickBtnScrollToHandler = function() { - let $this = $(this), - $toElement = $this.attr('data-scroll-to'); + let $this = $(this); + let $toElement = $this.attr('data-scroll-to'); // note the * 1 enforces $offset to be an integer, without // it we scroll to True, which goes nowhere fast. let $offset = parseInt($this.attr('data-scroll-offset') || "0"); diff --git a/src/js/relationshipChecks.js b/src/js/relationshipChecks.js index 629252b9158731644952980e0cc13cd3f71eda87..86c50e712b0ffa71d35a5f63cb69f89cd23310eb 100644 --- a/src/js/relationshipChecks.js +++ b/src/js/relationshipChecks.js @@ -1,11 +1,11 @@ /** - * @param {{ rivalry: number }} id + * @param {{ rivalry: number }} actor * @returns {string} */ -globalThis.rivalryTerm = function(id) { - if (id.rivalry === 1) { +globalThis.rivalryTerm = function(actor) { + if (actor.rivalry === 1) { return "growing rival"; - } else if (id.rivalry === 2) { + } else if (actor.rivalry === 2) { return "rival"; } else { return "bitter rival"; @@ -13,38 +13,38 @@ globalThis.rivalryTerm = function(id) { }; /** - * @param {{ relationship: number, pronoun: number }} id + * @param {{ relationship: number, pronoun: number }} actor * @returns {string} */ -globalThis.relationshipTerm = function(id) { - if (id.relationship === 1) { +globalThis.relationshipTerm = function(actor) { + if (actor.relationship === 1) { return "friend"; - } else if (id.relationship === 2) { + } else if (actor.relationship === 2) { return "best friend"; - } else if (id.relationship === 3) { + } else if (actor.relationship === 3) { return "friend with benefits"; - } else if (id.relationship === 4) { + } else if (actor.relationship === 4) { return "lover"; } else { - return `slave ${getPronouns(id).wife}`; + return `slave ${getPronouns(actor).wife}`; } }; /** - * @param {{ relationship: number, pronoun: number }} id + * @param {{ relationship: number, pronoun: number }} actor * @returns {string} */ -globalThis.relationshipTermShort = function(id) { - if (id.relationship === 1) { +globalThis.relationshipTermShort = function(actor) { + if (actor.relationship === 1) { return "friend"; - } else if (id.relationship === 2) { + } else if (actor.relationship === 2) { return "BFF"; - } else if (id.relationship === 3) { + } else if (actor.relationship === 3) { return "FWB"; - } else if (id.relationship === 4) { + } else if (actor.relationship === 4) { return "lover"; } else { - return `${getPronouns(id).wife}`; + return `${getPronouns(actor).wife}`; } }; diff --git a/src/js/removeSlave.js b/src/js/removeSlave.js index f83d0b029a7d5997e85b085903098a0da00e3f8b..4dcacd4f845193792e3608552502fc67bfddd9fd 100644 --- a/src/js/removeSlave.js +++ b/src/js/removeSlave.js @@ -34,6 +34,7 @@ globalThis.removeSlave = function(slave) { } V.favorites.delete(AS_ID); + V.reminders.deleteWith(r => r.slaveID === AS_ID); V.researchLab.tasks = V.researchLab.tasks.filter((t) => t.slaveID !== AS_ID); diff --git a/src/js/rulesAssistant.js b/src/js/rulesAssistant.js index c524403210c586ba7b2fb4920d67a380ff3edb2d..e16b7e61a74b24600a499455f6c4aead3e866b94 100644 --- a/src/js/rulesAssistant.js +++ b/src/js/rulesAssistant.js @@ -142,10 +142,7 @@ globalThis.ruleAppliesP = function(rule, slave) { slave ); } - flag = between( - slaveAttribute, - cond.data.value[0], - cond.data.value[1]); + flag = slaveAttribute.isBetween(cond.data.value[0], cond.data.value[1]); if (cond.applyRuleOnce && flag) { V.rulesToApplyOnce[rule.ID].push(slave.ID); } diff --git a/src/js/rulesAutosurgery.js b/src/js/rulesAutosurgery.js index e7f40989fb32789c6a47743fa0568c009bc24a7b..cb96326919ca434c3790a572c86f53da0be046e2 100644 --- a/src/js/rulesAutosurgery.js +++ b/src/js/rulesAutosurgery.js @@ -18,7 +18,7 @@ globalThis.rulesAutosurgery = (function() { CommitSurgery(slave, thisSurgery, surgeries); } if (surgeries.length > 0) { - PrintResult(slave, thisSurgery, surgeries); + r += `${capFirstChar(V.assistant.name)}, ordered to apply surgery, gives ${slave.slaveName} ${surgeries.length > 1 ? `${surgeries.length} surgeries` : 'a single operation'}: <span class="lime">${toSentence(surgeries)}.</span>`; } return r; } @@ -105,7 +105,7 @@ globalThis.rulesAutosurgery = (function() { let sorter; if (shallShrink) { if (target.val === 0) { - commitProcedure(`surgery to remove ${his} ${bodyPart} implants`, slave => { + commitProcedure(`surgery to remove ${his} ${bodyPart} implants`, () => { slave[bodyPart] -= slave[`${bodyPart}Implant`]; slave[`${bodyPart}Implant`] = 0; slave[`${bodyPart}ImplantType`] = "none"; @@ -187,7 +187,7 @@ globalThis.rulesAutosurgery = (function() { } else if ((slave.boobShape === "saggy" || slave.boobShape === "downward-facing") && thisSurgery.cosmetic > 0 && slave.breastMesh !== 1) { commitProcedure("a breast lift", s => { s.boobShape = "normal"; }); } else if ((slave.boobShape === "normal" || slave.boobShape === "wide-set") && thisSurgery.cosmetic > 0 && slave.breastMesh !== 1) { - commitProcedure("more interestingly shaped breasts", slave => { + commitProcedure("more interestingly shaped breasts", () => { if (slave.boobs > 800) { slave.boobShape = "torpedo-shaped"; } else { @@ -203,42 +203,42 @@ globalThis.rulesAutosurgery = (function() { } if (slave.anus > 3 && thisSurgery.cosmetic > 0) { - commitProcedure("a restored anus", slave => { + commitProcedure("a restored anus", () => { slave.anus = 3; if (slave.skill.anal > 10) { slave.skill.anal -= 10; } }); } else if (slave.vagina > 3 && thisSurgery.cosmetic > 0) { - commitProcedure("a restored pussy", slave => { + commitProcedure("a restored pussy", () => { slave.vagina = 3; if (slave.skill.vaginal > 10) { slave.skill.vaginal -= 10; } }); } else if (slave.anus > 0 && V.surgeryUpgrade === 1 && thisSurgery.holes === 2) { - commitProcedure("a virgin anus", slave => { + commitProcedure("a virgin anus", () => { slave.anus = 0; if (slave.skill.anal > 10) { slave.skill.anal -= 10; } }); } else if (slave.vagina > 0 && V.surgeryUpgrade === 1 && thisSurgery.holes === 2) { - commitProcedure("a virgin pussy", slave => { + commitProcedure("a virgin pussy", () => { slave.vagina = 0; if (slave.skill.vaginal > 10) { slave.skill.vaginal -= 10; } }); } else if (slave.anus > 1 && thisSurgery.holes === 1) { - commitProcedure("a tighter anus", slave => { + commitProcedure("a tighter anus", () => { slave.anus = 1; if (slave.skill.anal > 10) { slave.skill.anal -= 10; } }); } else if (slave.vagina > 1 && thisSurgery.holes === 1) { - commitProcedure("a tighter pussy", slave => { + commitProcedure("a tighter pussy", () => { slave.vagina = 1; if (slave.skill.vaginal > 10) { slave.skill.vaginal -= 10; @@ -252,30 +252,31 @@ globalThis.rulesAutosurgery = (function() { commitProcedure("a precum production enhancing drug implant", s => { s.prostate = 2; }); } else if (slave.balls > 0 && slave.vasectomy === 0 && thisSurgery.vasectomy === true) { commitProcedure("vasectomy", s => { s.vasectomy = 1; }); - V.surgeryType = "vasectomy"; } else if (slave.balls > 0 && slave.vasectomy === 1 && thisSurgery.vasectomy === false) { commitProcedure("undo vasectomy", s => { s.vasectomy = 0; }); - V.surgeryType = "vasectomy undo"; } if (slave.faceImplant <= 15 && slave.face <= 95 && thisSurgery.cosmetic > 0) { - commitProcedure("a nicer face", slave => { + commitProcedure("a nicer face", () => { if (slave.faceShape === "masculine") { slave.faceShape = "androgynous"; } slave.faceImplant += 25 - 5 * Math.trunc(V.PC.skill.medicine / 50) - 5 * V.surgeryUpgrade; slave.face = Math.clamp(slave.face + 20, -100, 100); }); } else if (slave.faceImplant <= 15 && slave.ageImplant !== 1 && slave.visualAge >= 25 && thisSurgery.cosmetic > 0) { - commitProcedure("an age lift", slave => { + commitProcedure("an age lift", () => { slave.faceImplant += 25 - 5 * Math.trunc(V.PC.skill.medicine / 50) - 5 * V.surgeryUpgrade; applyAgeImplant(slave); }); - } else if (((slave.underArmHStyle !== "bald" && slave.underArmHStyle !== "hairless") || (slave.pubicHStyle !== "bald" && slave.pubicHStyle !== "hairless")) && thisSurgery.bodyhair === 2) { - commitProcedure("body hair removal", slave => { + } else if (thisSurgery.bodyhair === 2 && ( + (slave.underArmHStyle !== "bald" && slave.underArmHStyle !== "hairless") || + (slave.pubicHStyle !== "bald" && slave.pubicHStyle !== "hairless") + )) { + commitProcedure("body hair removal", () => { if (slave.underArmHStyle !== "hairless") { slave.underArmHStyle = "bald"; } if (slave.pubicHStyle !== "hairless") { slave.pubicHStyle = "bald"; } }, 0); } else if ((slave.bald === 0 || slave.hStyle !== "bald" || slave.eyebrowHStyle !== "bald") && thisSurgery.hair === 2) { - commitProcedure("hair removal", slave => { + commitProcedure("hair removal", () => { slave.eyebrowHStyle = "bald"; slave.hStyle = "bald"; slave.bald = 1; @@ -283,17 +284,17 @@ globalThis.rulesAutosurgery = (function() { } else if (slave.weight >= 10 && thisSurgery.cosmetic > 0) { commitProcedure("liposuction", s => { s.weight -= 50; }); } else if ((slave.bellySagPreg > 0 || slave.bellySag > 0) && (thisSurgery.cosmetic > 0 || thisSurgery.tummy > 0 )) { - commitProcedure("a tummy tuck", slave => { + commitProcedure("a tummy tuck", () => { slave.bellySag = 0; slave.bellySagPreg = 0; }, 20); } else if (slave.voice === 1 && slave.voiceImplant === 0 && thisSurgery.cosmetic > 0) { - commitProcedure("a feminine voice", slave => { + commitProcedure("a feminine voice", () => { slave.voice += 1; slave.voiceImplant += 1; }); } else if (App.RA.shallShrink(slave.lipsImplant, thisSurgery.lips) && thisSurgery.lips.val === 0) { - commitProcedure(`surgery to remove ${his} lip implants`, slave => { + commitProcedure(`surgery to remove ${his} lip implants`, () => { slave.lips -= slave.lipsImplant; slave.lipsImplant = 0; if (slave.skill.oral > 10) { @@ -301,7 +302,7 @@ globalThis.rulesAutosurgery = (function() { } }); } else if (App.RA.shallGrow(slave.lipsImplant, thisSurgery.lips, 10) && slave.lips <= 95) { - commitProcedure("bigger lips", slave => { + commitProcedure("bigger lips", () => { slave.lipsImplant += 10; slave.lips += 10; if (slave.skill.oral > 10) { @@ -311,18 +312,18 @@ globalThis.rulesAutosurgery = (function() { } else if (slave.scar.hasOwnProperty("belly") && slave.scar.belly["c-section"] > 0 && thisSurgery.cosmetic > 0) { commitProcedure("surgery to remove a c-section scar", s => { App.Medicine.Modification.removeScar(s, "belly", "c-section"); }); } else if (slave.faceImplant <= 45 && slave.face <= 95 && thisSurgery.cosmetic === 2) { - commitProcedure("a nicer face", slave => { + commitProcedure("a nicer face", () => { if (slave.faceShape === "masculine") { slave.faceShape = "androgynous"; } slave.faceImplant += 25 - 5 * Math.trunc(V.PC.skill.medicine / 50) - 5 * V.surgeryUpgrade; slave.face = Math.clamp(slave.face + 20, -100, 100); }); } else if (slave.faceImplant <= 45 && slave.ageImplant !== 1 && slave.visualAge >= 25 && thisSurgery.cosmetic === 2) { - commitProcedure("an age lift", slave => { + commitProcedure("an age lift", () => { applyAgeImplant(slave); slave.faceImplant += 25 - 5 * Math.trunc(V.PC.skill.medicine / 50) - 5 * V.surgeryUpgrade; }); } else if (slave.voice < 3 && slave.voiceImplant === 0 && thisSurgery.cosmetic === 2) { - commitProcedure("a bimbo's voice", slave => { + commitProcedure("a bimbo's voice", () => { slave.voice += 1; slave.voiceImplant += 1; }); @@ -333,32 +334,29 @@ globalThis.rulesAutosurgery = (function() { } else if (slave.waist >= -95 && V.seeExtreme === 1 && thisSurgery.cosmetic === 2) { commitProcedure("a narrower waist", s => { s.waist = Math.clamp(s.waist - 20, -100, 100); }); } else if (thisSurgery.hips !== null && slave.hips < 3 && V.surgeryUpgrade === 1 && (slave.hips < thisSurgery.hips)) { - commitProcedure("wider hips", slave => { + commitProcedure("wider hips", () => { slave.hips++; slave.hipsImplant++; }); } if (slave.bellyImplant < 0 && V.bellyImplants > 0 && thisSurgery.bellyImplant === "install" && slave.womb.length === 0 && slave.broodmother === 0) { - const proc = slave => { + const proc = () => { slave.bellyImplant = 100; slave.preg = -2; }; if (slave.ovaries === 1 || slave.mpreg === 1) { - V.surgeryType = "bellyIn"; commitProcedure("belly implant", proc, 10); } else { - V.surgeryType = "bellyInMale"; commitProcedure("male belly implant", proc, 50); } bellyIn(slave); } else if (slave.bellyImplant >= 0 && thisSurgery.bellyImplant === "remove") { - commitProcedure("belly implant removal", slave => { + commitProcedure("belly implant removal", () => { slave.preg = 0; slave.bellyImplant = -1; slave.cervixImplant = 0; }); - V.surgeryType = "bellyOut"; } if (slave.horn !== "none" && thisSurgery.horn === 1) { @@ -388,22 +386,6 @@ globalThis.rulesAutosurgery = (function() { } } - /** - * @param {App.Entity.SlaveState} slave - * @param {object} thisSurgery - * @param {string[]} surgeries - */ - function PrintResult(slave, thisSurgery, surgeries) { - let surgeriesDisplay = ""; - if (surgeries.length === 1) { - surgeriesDisplay = surgeries[0]; - } else { - surgeriesDisplay = surgeries.slice(0, surgeries.length - 1).join(", "); - surgeriesDisplay += `, and ${surgeries[surgeries.length - 1]}`; - } - r += `${capFirstChar(V.assistant.name)}, ordered to apply surgery, gives ${slave.slaveName} ${surgeries.length > 1 ? `${surgeries.length} surgeries` : 'a single operation'}: <span class="lime">${surgeriesDisplay}.</span>`; - } - /** * @param {App.Entity.SlaveState} slave */ diff --git a/src/js/salon.js b/src/js/salon.js index 97336e536912f7ab25130de16962b814b53599ec..87ac19f472898a84be7c9f473b039729e17b3c88 100644 --- a/src/js/salon.js +++ b/src/js/salon.js @@ -226,13 +226,12 @@ App.Medicine.Modification.eyeSelector = function(entity, cheat = false) { /** * Update ears in salon * @param {App.Entity.SlaveState} slave - * @param {object} params - * @param {number|string} [params.primaryEarColor=0] - * @param {string} [params.secondaryEarColor=""] - * @param {boolean} [params.cheat=false] + * @param {boolean} [cheat=false] * @returns {HTMLElement} */ -App.Medicine.Salon.ears = function(slave, {primaryEarColor = 0, secondaryEarColor = "", cheat = false} = {}) { +App.Medicine.Salon.ears = function(slave, cheat = false) { + let primaryEarColor = 0; + let secondaryEarColor = ""; let updatePrimary = (newVal) => { primaryEarColor = newVal; apply(); @@ -242,7 +241,6 @@ App.Medicine.Salon.ears = function(slave, {primaryEarColor = 0, secondaryEarColo apply(); }; const container = document.createElement("div"); - container.id = "salon-ears"; container.append(content()); return container; @@ -294,11 +292,10 @@ App.Medicine.Salon.ears = function(slave, {primaryEarColor = 0, secondaryEarColo `Color ${his} ears`, () => { slave.earTColor = (primaryEarColor + secondaryEarColor); - App.Art.refreshSlaveArt(slave, 3, "art-frame"); if (!cheat) { cashX(forceNeg(V.modCost), "slaveMod", slave); } - App.Medicine.Salon.ears(slave); // discard selections after locking them in. + App.UI.reload(); } ) ); @@ -325,27 +322,20 @@ App.Medicine.Salon.ears = function(slave, {primaryEarColor = 0, secondaryEarColo function apply() { App.Art.refreshSlaveArt(slave, 3, "art-frame"); - App.Medicine.Salon.ears( - slave, - { - primaryEarColor: primaryEarColor, - secondaryEarColor: secondaryEarColor, - } - ); + jQuery(container).empty().append(content()); } }; /** * Update hair in salon * @param {App.Entity.SlaveState} slave - * @param {object} params - * @param {number|string} [params.primaryTailColor] - * @param {string} [params.secondaryTailColor] - * @param {boolean} [params.cheat] - * @returns {JQuery<HTMLElement>} + * @param {boolean} [cheat] + * @returns {HTMLElement} */ -App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailColor = "", cheat = false} = {}) { - const frag = new DocumentFragment(); +App.Medicine.Salon.tail = function(slave, cheat = false) { + const container = document.createElement("div"); + let primaryTailColor = 0; + let secondaryTailColor = ""; let updatePrimary = (newVal) => { primaryTailColor = newVal.value; apply(); @@ -357,10 +347,10 @@ App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailCo const {His, his} = getPronouns(slave); if (slave.tail !== "none") { - frag.append(tailDye()); + container.append(tailDye()); } - return jQuery("#salon-tail").empty().append(frag); + return container; function tailDye() { const frag = new DocumentFragment(); @@ -376,11 +366,10 @@ App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailCo "Match current hair", () => { slave.tailColor = slave.hColor; - App.Art.refreshSlaveArt(slave, 3, "art-frame"); if (!cheat) { cashX(forceNeg(V.modCost), "slaveMod", slave); } - apply(); + App.UI.reload(); } ) ); @@ -393,13 +382,13 @@ App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailCo div = document.createElement("div"); div.classList.add("choices"); - div.append(`Colors:`); + div.append(`Colors: `); div.append(createList(App.Medicine.Modification.Color.Primary, updatePrimary)); frag.append(div); div = document.createElement("div"); div.classList.add("choices"); - div.append(`Highlights:`); + div.append(`Highlights: `); div.append(createList(App.Medicine.Modification.Color.Secondary, updateSecondary)); frag.append(div); @@ -415,7 +404,7 @@ App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailCo if (!cheat) { cashX(forceNeg(V.modCost), "slaveMod", slave); } - App.Medicine.Salon.tail(slave); // discard selections after locking them in. + App.UI.reload(); // discard selections after locking them in. } ) ); @@ -446,12 +435,6 @@ App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailCo function apply() { App.Art.refreshSlaveArt(slave, 3, "art-frame"); - App.Medicine.Salon.tail( - slave, - { - primaryTailColor: primaryTailColor, - secondaryTailColor: secondaryTailColor, - } - ); + jQuery(container).empty().append(tailDye()); } }; diff --git a/src/js/sexActsJS.js b/src/js/sexActsJS.js index 26e576fd2391631c5fd86522ca83bc7cc4ca5bda..cb042571f0cec08d0345a5a43ef19ab202a378a7 100644 --- a/src/js/sexActsJS.js +++ b/src/js/sexActsJS.js @@ -58,7 +58,7 @@ globalThis.VCheck = (function() { } if (canDoAnal(slave)) { if (canImpreg(slave, V.PC)) { - r += knockMeUp(slave, 10, 1, -1, true); + knockMeUp(slave, 10, 1, -1); } seX(slave, "anal", V.PC, "penetrative", times); } @@ -104,7 +104,7 @@ globalThis.VCheck = (function() { } if (canDoVaginal(slave)) { if (canImpreg(slave, V.PC)) { - r += knockMeUp(slave, 10, 0, -1, true); + knockMeUp(slave, 10, 0, -1); } seX(slave, "vaginal", V.PC, "penetrative", times); } @@ -186,12 +186,12 @@ globalThis.VCheck = (function() { seX(slave, "vaginal", V.PC, "penetrative", bothTimes); seX(slave, "anal", V.PC, "penetrative", bothTimes); if (canImpreg(slave, V.PC)) { - r += knockMeUp(slave, 10, 2, -1, true); + knockMeUp(slave, 10, 2, -1); } } else { seX(slave, "vaginal", V.PC, "penetrative", bothTimes); if (canImpreg(slave, V.PC)) { - r += knockMeUp(slave, 10, 0, -1, true); + knockMeUp(slave, 10, 0, -1); } } } else if (canDoAnal(slave)) { @@ -219,7 +219,7 @@ globalThis.VCheck = (function() { } seX(slave, "anal", V.PC, "penetrative", analTimes); if (canImpreg(slave, V.PC)) { - r += knockMeUp(slave, 10, 1, -1, true); + knockMeUp(slave, 10, 1, -1); } } return r; @@ -238,16 +238,11 @@ globalThis.VCheck = (function() { } } - /** - * Before using this function, set V.partner to the index of the partner in the V.slaves array - analTimes is how many times to increment the Anal counts, if there is no Vagina available. - bothTimes is how many times to increment both holes counts (usually it is half of Anal). - In both cases if left undefined it will assume it to be 1. - This also checks for a valid Vagina/Accessory, though most code I've seen does this already, you - never know when someone might use the routine and forget to do such. + /** call as VCheck.Partner + * Checks for a valid Vagina/Accessory, though in most cases the calling code will do so anyway * @param {App.Entity.SlaveState} partner - * @param {number} [analTimes=1] - * @param {number} [bothTimes =1] + * @param {number} [analTimes = 1] how many times to increment the Anal counts, if there is no Vagina available. + * @param {number} [bothTimes = 1] how many times to increment both holes counts (usually it is half of Anal). */ function PartnerVCheck(partner, analTimes = 1, bothTimes = 1) { let r = ''; @@ -332,12 +327,12 @@ globalThis.SimpleSexAct = (function() { } else if (canDoVaginal(slave) && slave.vagina > 0 && fuckTarget > 33) { seX(slave, "vaginal", V.PC, playerSex); if (canImpreg(slave, V.PC)) { - r += knockMeUp(slave, 10, 0, -1, true); + knockMeUp(slave, 10, 0, -1); } } else if (canDoAnal(slave) && slave.anus > 0 && fuckTarget > 10) { seX(slave, "anal", V.PC, "penetrative"); if (canImpreg(slave, V.PC)) { - r += knockMeUp(slave, 10, 1, -1, true); + knockMeUp(slave, 10, 1, -1); } } else { seX(slave, "oral", V.PC, playerSex); @@ -396,18 +391,18 @@ globalThis.SimpleSexAct = (function() { sex = "vaginal"; sex2 = "vaginal"; if (canFemImpreg(subSlave, domSlave)) { - r += knockMeUp(subSlave, 3, 0, domSlave.ID, true); + knockMeUp(subSlave, 3, 0, domSlave.ID); } } else if (canDoVaginal(subSlave) && subSlave.vagina > 0 && canPenetrate(domSlave) && fuckTarget > 33) { sex = "vaginal"; if (canImpreg(subSlave, domSlave)) { - r += knockMeUp(subSlave, 3, 0, domSlave.ID, true); + knockMeUp(subSlave, 3, 0, domSlave.ID); } } else if (canDoAnal(subSlave) && subSlave.anus > 0 && canPenetrate(domSlave) && fuckTarget > 10) { // i think would impregnate from anal here even without .mpreg? same in original widget too sex = "anal"; if (canImpreg(subSlave, domSlave) && subSlave.mpreg === 1) { - r += knockMeUp(subSlave, 3, 1, domSlave.ID, true); + knockMeUp(subSlave, 3, 1, domSlave.ID); } } else { sex = "oral"; diff --git a/src/js/slaveCostJS.js b/src/js/slaveCostJS.js index fcbb4a71a861ce6cad4e6a41a41be5bc9b5c1838..c24903f34f37af6152e97ec19469960ca603257c 100644 --- a/src/js/slaveCostJS.js +++ b/src/js/slaveCostJS.js @@ -280,7 +280,7 @@ globalThis.BeautyArray = (function() { break; case "straightening braces": case "cosmetic braces": - if (slave.visualAge > 14 && slave.visualAge < 18) { + if (slave.visualAge.isBetween(14, 18)) { adjustBeauty("Teeth", (1)); } break; @@ -433,7 +433,7 @@ globalThis.BeautyArray = (function() { adjustBeauty("Age: Youth Preferentialist", ((30 - slave.visualAge) / (30 - V.minimumSlaveAge) * ((arcology.FSYouthPreferentialist / 2) + (arcology.FSYouthPreferentialistLaw * 10)))); /* max 60 */ } } else if (arcology.FSMaturityPreferentialist !== "unset") { - if (between(V.retirementAge, 30, 60, 'inclusive')) { + if (V.retirementAge.isBetween(30, 60, true)) { adjustBeauty("Age: Maturity Preferentialist", ((30 - slave.visualAge) / (30 - V.retirementAge) * ((arcology.FSMaturityPreferentialist / 2) + (arcology.FSMaturityPreferentialistLaw * 10)))); /* max 60, problems if retirementAge is 30 or under */ } } @@ -1637,9 +1637,16 @@ globalThis.Beauty = function(s) { globalThis.BeautyTooltip = function(slave) { // Make a link. Text should be slave's beauty. Clicking the link will display detailed info about that beauty over the top of the page (tooltip-style) const beauty = Beauty(slave); - const displayFunc = V.cheatMode || V.debugMode ? BeautyDisplay : undefined; - const interactor = new App.UI.DOM.InteractiveDetails(beauty.toString(), displayFunc, ["pink", "bold"]); - return interactor.render(); + const span = App.UI.DOM.makeElement("span", beauty.toString(), ["pink", "bold"]); + if (V.cheatMode || V.debugMode) { + span.tabIndex = 0; + span.classList.add("has-tooltip"); + tippy(span, { + content: BeautyDisplay(), + placement: "right", interactive: true, trigger: "click" + }); + } + return span; // Upon the link being clicked, set up some links to sort the info and a span to show it in function BeautyDisplay() { @@ -1648,6 +1655,7 @@ globalThis.BeautyTooltip = function(slave) { // Heading line that handles sorting let el = document.createElement('div'); + el.classList.add("tip-details"); el.appendChild(document.createTextNode(`Sort by: `)); el.appendChild(App.UI.DOM.generateLinksStrip([ @@ -1676,37 +1684,27 @@ globalThis.BeautyTooltip = function(slave) { // Set up the frame that contains the info function BeautyFrame() { - let el = document.createDocumentFragment(); - let beautyArray; + let el = document.createElement("div"); + el.classList.add("grid-2columns-auto"); + let beautyArray; if ((criteria === "text" && direction === "descending") || (criteria === "value" && direction === "ascending")) { beautyArray = BeautyArray(slave).sort((a, b) => (a[criteria] > b[criteria]) ? 1 : -1); } else { beautyArray = BeautyArray(slave).sort((a, b) => (a[criteria] < b[criteria]) ? 1 : -1); } - let domLine; - let domCell; beautyArray.forEach((line) => { line.value = (Math.floor(line.value * 10) / 10); - domLine = document.createElement('div'); - domLine.style.display = "float"; - domCell = document.createElement('span'); - domCell.style.float = "left"; - domCell.style.width = "3em"; - let textNode = document.createTextNode(line.value); + let className; if (line.value > 0) { - domCell.className = "green"; + className = "green"; } else if (line.value < 0) { - domCell.className = "red"; + className = "red"; } - domCell.appendChild(textNode); - domLine.appendChild(domCell); - - textNode = document.createTextNode(line.text); - domLine.appendChild(textNode); - el.appendChild(domLine); + App.UI.DOM.appendNewElement("div", el, line.value.toString(), className); + App.UI.DOM.appendNewElement("div", el, line.text); }); return el; } @@ -2186,9 +2184,16 @@ globalThis.FResult = function(s, forSale = 0) { */ globalThis.FResultTooltip = function(slave, forSale = 0) { // Make a link. Text should be slave's FResult. Clicking the link will display detailed info about that FResult over the top of the page (tooltip-style) - const displayFunc = V.cheatMode || V.debugMode ? FResultDisplay : undefined; - const interactor = new App.UI.DOM.InteractiveDetails(FResult(slave, forSale).toString(), displayFunc, ["lightcoral", "bold"]); - return interactor.render(); + const span = App.UI.DOM.makeElement("span", FResult(slave, forSale).toString(), ["lightcoral", "bold"]); + if (V.cheatMode || V.debugMode) { + span.tabIndex = 0; + span.classList.add("has-tooltip"); + tippy(span, { + content: FResultDisplay(), + placement: "right", interactive: true, trigger: "click" + }); + } + return span; /** Upon the link being clicked, set up some links to sort the info and a span to show it in * @returns {HTMLElement} @@ -2199,6 +2204,7 @@ globalThis.FResultTooltip = function(slave, forSale = 0) { // Heading line that handles sorting const el = document.createElement('div'); + el.classList.add("tip-details"); el.appendChild(document.createTextNode(`Sort by: `)); el.appendChild(App.UI.DOM.generateLinksStrip([ @@ -2225,40 +2231,31 @@ globalThis.FResultTooltip = function(slave, forSale = 0) { return el; /** Set up the frame that contains the info - * @returns {DocumentFragment} + * @returns {HTMLDivElement} */ function FResultFrame() { - let el = document.createDocumentFragment(); - let fResultArray; + let el = document.createElement("div"); + el.classList.add("grid-2columns-auto"); + let fResultArray; if ((criteria === "text" && direction === "descending") || (criteria === "value" && direction === "ascending")) { fResultArray = FResultArray(slave, forSale).sort((a, b) => (a[criteria] > b[criteria]) ? 1 : -1); } else { fResultArray = FResultArray(slave, forSale).sort((a, b) => (a[criteria] < b[criteria]) ? 1 : -1); } - let domLine; - let domCell; fResultArray.forEach((line) => { line.value = (Math.floor(line.value * 10) / 10); - domLine = document.createElement('div'); - domLine.style.display = "float"; - domCell = document.createElement('span'); - domCell.style.float = "left"; - domCell.style.width = "3em"; - let textNode = document.createTextNode(line.value.toString()); + let className; if (line.value > 0) { - domCell.className = "green"; + className = "green"; } else if (line.value < 0) { - domCell.className = "red"; + className = "red"; } - domCell.appendChild(textNode); - domLine.appendChild(domCell); + App.UI.DOM.appendNewElement("div", el, line.value.toString(), className); - textNode = document.createTextNode(line.text); - domLine.appendChild(textNode); - el.appendChild(domLine); + App.UI.DOM.appendNewElement("div", el, line.text); }); return el; } diff --git a/src/js/slaveListing.js b/src/js/slaveListing.js index 19c6fed698a3935dffac430ca76f1cbbbe58c8f4..1131d3efaefdeb3811fb06127b53341eaf84a77b 100644 --- a/src/js/slaveListing.js +++ b/src/js/slaveListing.js @@ -813,13 +813,12 @@ App.UI.SlaveList.penthousePage = function() { } else { slaveWrapper.append(" as a Sexual Ambassador"); if (A.influenceTarget === -1) { - slaveWrapper.append(", but ", App.UI.DOM.makeElement("span", `${he} has no target to influence.`, "warning")); + slaveWrapper.append(", but ", App.UI.DOM.makeElement("span", `${he} has no target to influence. `, "warning")); } else { const targetName = V.arcologies.find(a => a.direction === A.influenceTarget).name; - slaveWrapper.append(` to ${targetName}.`); + slaveWrapper.append(` to ${targetName}. `); } } - slaveWrapper.append(". "); const link = App.UI.DOM.makeElement("span", App.UI.DOM.passageLink("Manage Recruiter", "Recruiter Select"), "major-link"); link.id = "manageRecruiter"; slaveWrapper.append(link, " ", App.UI.DOM.makeElement("span", App.UI.Hotkeys.hotkeys("Recruiter Select"), "hotkey")); @@ -912,36 +911,36 @@ App.UI.SlaveList.penthousePage = function() { if (V.showTipsFromEncy) { switch (jn) { case "rest": - span.append(App.Encyclopedia.renderArticle("rest")); + span.append(App.Encyclopedia.Assignments.rest()); break; case "chooseOwn": break; /* no entry written for choose own */ case "fucktoy": - span.append(App.Encyclopedia.renderArticle("fucktoy")); + span.append(App.Encyclopedia.Assignments.fucktoy()); break; case "classes": - span.append(App.Encyclopedia.renderArticle("attendingClasses")); + span.append(App.Encyclopedia.Assignments.attendingClasses()); break; case "houseServant": - span.append(App.Encyclopedia.renderArticle("servitude")); + span.append(App.Encyclopedia.Assignments.servitude()); break; case Job.WHORE: - span.append(App.Encyclopedia.renderArticle("whoring")); + span.append(App.Encyclopedia.Assignments.whoring()); break; case "publicServant": - span.append(App.Encyclopedia.renderArticle("publicService")); + span.append(App.Encyclopedia.Assignments.publicService()); break; case "subordinateSlave": - span.append(App.Encyclopedia.renderArticle("sexualServitude")); + span.append(App.Encyclopedia.Assignments.sexualServitude()); break; case "cow": - span.append(App.Encyclopedia.renderArticle("milking")); + span.append(App.Encyclopedia.Assignments.milking()); break; case "gloryhole": - span.append(App.Encyclopedia.renderArticle("gloryHole")); + span.append(App.Encyclopedia.Assignments.gloryHole()); break; case "confinement": - span.append(App.Encyclopedia.renderArticle("confinement")); + span.append(App.Encyclopedia.Assignments.confinement()); break; default: span.append(App.UI.DOM.makeElement("span", "missing tip for this tab", "error")); diff --git a/src/js/slaveSummaryHelpers.js b/src/js/slaveSummaryHelpers.js index fefd15ca935cbdb3b7b1304259d189f8e3715028..6d40b9534dce09a6add9e38da0c1239e5e77613e 100644 --- a/src/js/slaveSummaryHelpers.js +++ b/src/js/slaveSummaryHelpers.js @@ -228,12 +228,14 @@ App.UI.SlaveSummaryImpl = function() { * @returns {HTMLSpanElement} */ function referenceSlaveWithPreview(container, slave, text) { - const res = App.UI.DOM.appendNewElement("span", container, text, "textWithTooltip"); - const tooltip = App.UI.DOM.appendNewElement("span", res, undefined, "tooltip"); - tooltip.append(App.UI.DOM.generateLinksStrip([ - App.UI.DOM.slaveDescriptionDialog(slave, "Pop-up", {eventDescription: false, noArt: true}), - App.UI.SlaveList.SlaveInteract.stdInteract(slave, "Go to") - ])); + const res = App.UI.DOM.appendNewElement("span", container, text, "has-tooltip"); + tippy(res, { + content: App.UI.DOM.generateLinksStrip([ + App.UI.DOM.slaveDescriptionDialog(slave, "Pop-up", {eventDescription: false, noArt: true}), + App.UI.SlaveList.SlaveInteract.stdInteract(slave, "Go to") + ]), + interactive: true + }); return res; } diff --git a/src/js/slaveSummaryWidgets.js b/src/js/slaveSummaryWidgets.js index e28ed8c61cd915ff9da266c454ffe54eda2cce49..99398330f5262b7522ae8200e73229c398bd45a3 100644 --- a/src/js/slaveSummaryWidgets.js +++ b/src/js/slaveSummaryWidgets.js @@ -137,7 +137,7 @@ App.UI.SlaveSummaryRenderers = function() { } if (slave.vagina === 0) { makeSpan(c, "VV", "lime"); - } else if ((slave.pregKnown === 1) && canStand(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) { + } else if ((slave.pregKnown === 1) && canStand(slave) && (App.Data.clothes.get(slave.clothes).exposure >= 3) && (slave.shoes === "none")) { makeSpan(c, "NBP", "pink"); } if (slave.anus === 0) { @@ -459,7 +459,7 @@ App.UI.SlaveSummaryRenderers = function() { } if (slave.vagina === 0) { helpers.makeSpan(c, "Virgin.", "lime"); - } else if ((slave.pregKnown === 1) && canStand(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) { + } else if ((slave.pregKnown === 1) && canStand(slave) && (App.Data.clothes.get(slave.clothes).exposure >= 4) && (slave.shoes === "none")) { helpers.makeSpan(c, "Naked, barefoot, and pregnant.", "pink"); } if (slave.anus === 0) { diff --git a/src/js/spanMacroJS.js b/src/js/spanMacroJS.js index 61760b318d2d82c24865279255ce48018f846033..cf385d4701903eaade2d2e3e9fd37a91b86b45ea 100644 --- a/src/js/spanMacroJS.js +++ b/src/js/spanMacroJS.js @@ -23,6 +23,7 @@ Macro.add('span', { return this.error(`bad evaluation: ${typeof ex === 'object' ? ex.message : ex}`); } + // FIXME: Expected an assignment or function call and instead saw an expression. Config.debug && this.debugView.modes({block: true}); jQuery(`<span id='${String(result)}' />`) diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js index 6ef0785335f9a603419e660d9539e7c9cf4b1a6e..58f58bb03f29a0a655e61206d4232c48c34fc198 100644 --- a/src/js/utilsDOM.js +++ b/src/js/utilsDOM.js @@ -79,13 +79,17 @@ App.UI.DOM.link = function(linkText, handler, args = [], passage = "", tooltip = const hArgs = Array.isArray(args) ? args : [args]; const link = document.createElement("a"); link.textContent = linkText; - link.title = tooltip; link.onclick = () => { handler(...hArgs); if (passage !== '') { SugarCube.Engine.play(passage); } }; + + tippy(link, { + content: tooltip, + }); + return link; }; @@ -102,23 +106,38 @@ App.UI.DOM.disabledLink = function(link, reasons) { tooltip = document.createElement("span"); tooltip.textContent = reasons[0]; } else { - tooltip = document.createElement("div"); - let ul = document.createElement("ul"); - tooltip.appendChild(ul); + tooltip = document.createElement("ul"); for (const li of reasons.map(r => { const li = document.createElement("li"); li.textContent = r; return li; })) { - ul.appendChild(li); + tooltip.appendChild(li); } } - tooltip.className = "tooltip"; - let res = document.createElement("span"); - res.textContent = link; - res.className = "textWithTooltip"; - res.appendChild(tooltip); - return res; + return App.UI.DOM.spanWithTooltip(link, tooltip); +}; + +/** + * @param {string} text + * @param {string|HTMLElement} tooltip + * @param {string|Array<string>} [classNames] + * @returns {HTMLSpanElement} + */ +App.UI.DOM.spanWithTooltip = function(text, tooltip, classNames) { + /** @type {HTMLSpanElement} */ + const span = App.UI.DOM.makeElement("span", text, "has-tooltip"); + if (classNames) { + if (Array.isArray(classNames)) { + span.classList.add(...classNames); + } else { + span.classList.add(classNames); + } + } + // Make the span focusable, allows showing the tooltip on mobile + span.tabIndex = 0; + tippy(span, {content: tooltip}); + return span; }; /** @@ -314,34 +333,6 @@ App.UI.DOM.toSentence = function(content, delimiter = ", ", lastDelimiter = " an return output; }; -/** - * @param {function (*):void} callback - * @param {Object.<string, *>} options - * @param {*|function (): *} currentValue - * @param {string} [description] - * @returns {HTMLSpanElement} - */ -App.UI.DOM.Widgets.optionSelector = function(callback, options, currentValue, description) { - const res = document.createElement("span"); - res.classList.add("optionMacro"); - if (description) { - App.UI.DOM.appendNewElement("span", res, description, "optionDescription"); - } - const curVal = (currentValue instanceof Function) ? currentValue() : currentValue; - const valueNode = App.UI.DOM.appendNewElement("span", res, null, "optionValue"); - for (const s in options) { - const v = options[s]; - const choice = App.UI.DOM.appendNewElement("span", valueNode, null, "optionMacroOption"); - if (v === curVal) { - choice.classList.add("optionMacroSelected"); - choice.innerText = s; - } else { - choice.append(App.UI.DOM.link(s, () => { callback(v); })); - } - } - return res; -}; - /** * @param {string} text * @returns {HTMLElement} @@ -361,7 +352,7 @@ App.Utils.htmlToElement = function(text) { */ App.UI.DOM.generateLinksStrip = function(links) { const strip = document.createElement('ul'); - strip.className = "choicesStrip"; + strip.className = "choices-strip"; links.reduce((/** @type {HTMLUListElement} */ list, lnk) => { const li = document.createElement("li"); @@ -536,3 +527,18 @@ App.UI.DOM.makeRow = function(table, ...items) { cell.innerHTML = item; } }; + +/** + * Creates a checkbox. + * @param arg - item to be checked. Currently only designed to with items that have values of 0 - 1. + */ +App.UI.DOM.makeCheckbox = function(arg) { + const checkbox = document.createElement("input"); + checkbox.setAttribute("type", "checkbox"); + checkbox.checked = (V[arg] === 1); + + checkbox.onchange = () => { + V[arg] = checkbox.checked ? 1 : 0; + }; + return checkbox; +}; diff --git a/src/js/utilsPC.js b/src/js/utilsPC.js index 2c2eb72a692b863b88145e28a4714cf03348a373..845579e23f79e57db65befdaf0cb518180b905c7 100644 --- a/src/js/utilsPC.js +++ b/src/js/utilsPC.js @@ -649,7 +649,7 @@ globalThis.resetPersonalAttention = function() { /** * Param takes "classic" PC careers, and then function checks data to see if PC has that classic career or a 4.0 equivalent. - * @param {String} category + * @param {"wealth"|"escort"|"servant"|"gang"|"BlackHat"|"capitalist"|"mercenary"|"engineer"|"medicine"|"slaver"|"celebrity"|"arcology"} category * @returns {boolean} */ globalThis.isPCCareerInCategory = function(category) { diff --git a/src/js/utilsSC.js b/src/js/utilsSC.js index 4f9316836e7081b3ced53a33acc7bec8ea6d04bd..d2faa271d1af7f472546c8a260d1709cb3bddb91 100644 --- a/src/js/utilsSC.js +++ b/src/js/utilsSC.js @@ -224,19 +224,6 @@ App.UI.tabBar = function() { } }(); -/** - * Creates a span for an link with tooltip containing the reasons why it is disabled - * @param {string} link - * @param {string[]} reasons - * @returns {string} - */ -App.UI.disabledLink = function(link, reasons) { - const tooltips = reasons.length === 1 ? - `<span class="tooltip">${reasons}</span>` : - `<div class="tooltip"><ul>${reasons.map(e => `<li>${e}</li>`).join('')}</ul></div>`; - return `<span class="textWithTooltip">${link}${tooltips}</span>`; -}; - /** handler function for slaveDescriptionDialog. do not call directly. */ App.UI._showDescriptionDialog = function(slave, options) { Dialog.setup(SlaveFullName(slave)); diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js index fc914ef55984e879415a152e78ce9db3df6aeb5f..bf003da1defeb9196c739fd2fb257b0a00192262 100644 --- a/src/js/utilsSlave.js +++ b/src/js/utilsSlave.js @@ -2289,7 +2289,7 @@ globalThis.SlaveTitle = function(slave) { r = `big bottomed ${r}`; } - if (slave.weight > 10 && slave.weight < 100 && slave.boobs > 5000 && slave.butt > 5 && slave.hips >= 2 && slave.bellyPreg >= 30000 && slave.counter.births >= 10) { + if (slave.weight.isBetween(10, 100) && slave.boobs > 5000 && slave.butt > 5 && slave.hips >= 2 && slave.bellyPreg >= 30000 && slave.counter.births >= 10) { r = `${r} fertility goddess`; } else if (slave.counter.births >= 6) { r = `${r} broodmother`; @@ -3241,6 +3241,7 @@ globalThis.ageSlaveWeeks = function(slave, weeks = 1) { }; /** advances the age of a slave by one year, incurring all aging side effects + * Note that this function does NOT currently handle puberty, or teeth. * @param {App.Entity.SlaveState} slave * @param {boolean} [forceDevelopment=false] */ @@ -3564,3 +3565,7 @@ globalThis.addPartner = function(slave, partner) { partnerState.partners.add(slave.ID); } }; + +globalThis.resetHGCum = function(s) { + return 2 + Math.trunc((s.balls / 5) + (s.energy / 95) + (s.health.condition / 95) + (s.devotion / 95) + (V.reproductionFormula * 5)); +}; diff --git a/src/js/utilsUnits.js b/src/js/utilsUnits.js index f6148acebff83fdde93ee95bacb5fbf7e6a6ec32..4446fd1cb0fb8ecd232cc81fdc4e939b798e2d69 100644 --- a/src/js/utilsUnits.js +++ b/src/js/utilsUnits.js @@ -1,8 +1,8 @@ /** - * Returns numbers as text, e.g. 10 as "ten", according to the player's settings + * Converts numbers to text according to the player's settings. * @param {number} x - * @param {boolean} [printText=false] (optional) - * @returns {string} + * @param {boolean} [printText=false] Whether to return the text form regardless of the user's settings. Mainly used for events. + * @returns {string} Returns the given value in string form as either an integer (e.g. "10") or word form (e.g."ten"). */ globalThis.num = function(x, printText = false) { const max = V.showNumbersMax; @@ -70,7 +70,10 @@ globalThis.num = function(x, printText = false) { tens = number / 10 | 0; // equivalent to Math.floor(number / 10) words.push(TENS[tens - 1]); - words.push(inEnglish(ones)); + + if (number % 10 !== 0) { + words.push(inEnglish(ones)); + } return words.filter(isTruthy).join("-"); } @@ -128,17 +131,29 @@ globalThis.num = function(x, printText = false) { } }; -globalThis.asPlural = function(single, plural) { +/** + * Converts the given string to the plural form of the given string. Mainly used as a helper function. + * @param {string|{single: string, plural: string}} single The singular form. + * @param {string} [plural] The plural form (e.g. "oxen" for "ox"). Returns the singular form with an "s" if one is not given. + * @returns {string} Returns the plural form of a given number of items. + */ +globalThis.asPlural = function(single, plural = null) { if (typeof single !== 'string') { let asObj = single; single = asObj.single; plural = asObj.plural; } - if (plural == null) { + if (!plural) { plural = single + "s"; } return plural; }; + +/** + * Converts the given string to the singular form of the given string. Mainly used as a helper function. + * @param {string|{single: string}} single The singular form. + * @returns {string} Returns the singular form of a given number of items. + */ globalThis.asSingular = function(single) { if (typeof single !== 'string') { let asObj = single; @@ -146,55 +161,77 @@ globalThis.asSingular = function(single) { } return single; }; -// When 1, shows "a (slave)" + +/** + * Converts the given number to a string in either singular or plural form. + * @param {number} number The number to format. + * @param {string} single The singular form. + * @param {string} plural The plural form (e.g. "oxen" for "ox"). Returns the singular form with an "s" if one is not given. + * @returns {string} Returns "a _", "less than one _", or the number formatted as either words or numbers, depending on the users' settings. + */ globalThis.numberWithPlural = function(number, single, plural) { if (number === 0) { return "no " + asPlural(single, plural); } else if (number === 1) { return addA(asSingular(single)); - } else if (number > 0 && number < 1) { + } else if (number.isBetween(0, 1)) { return "less than one " + asSingular(single); } else { - return number + " " + asPlural(single, plural); + return num(number) + " " + asPlural(single, plural); } }; -// when 1, shows "one (slave)" +/** + * Converts the given number to a string in either singular or plural form. + * @param {number} number The number to format. + * @param {string} single The singular form. + * @param {string} [plural] The plural form (e.g. "oxen" for "ox"). Returns the singular form with an "s" if one is not given. + * @returns {string} Returns "no _", "one _", "less than one _", or the number formatted as either words or numbers, depending on the user's settings. + */ globalThis.numberWithPluralOne = function(number, single, plural) { if (number === 0) { return "no " + asPlural(single, plural); } else if (number === 1) { return "one " + asSingular(single); - } else if (number > 0 && number < 1) { + } else if (number.isBetween(0, 1)) { return "less than one " + asSingular(single); } else { - return number + " " + asPlural(single, plural); + return num(number) + " " + asPlural(single, plural); } }; -// shows "less than one (slave)" instead of "no (slaves)" when number is 0. + +/** + * Converts the given number to a string in either singular or plural form. + * @param {number} number The number to format. + * @param {string} single The singular form. + * @param {string} plural The plural form (e.g. "oxen" for "ox"). + * @returns {string} Returns "less than one _" instead of "no _" when `number` is 0. + */ globalThis.numberWithPluralNonZero = function(number, single, plural) { if (number === 0) { number = 0.1; } return numberWithPlural(number, single, plural); }; + +/** + * Converts the given number to a string in either singular or plural form. + * @param {number} number The number to format. + * @param {string} single The singular form. + * @param {string} plural The plural form (e.g. "oxen" for "ox"). + * @returns {string} Returns the singular form if `number` is greater than 0 and less than or equal to 1. Otherwise returns the plural form of the number. + */ globalThis.onlyPlural = function(number, single, plural) { if (number > 0 && number <= 1) { return asSingular(single); } return asPlural(single, plural); }; -globalThis.Separator = function(SeparatorObject) { - if (SeparatorObject.need) { - return SeparatorObject.text; - } - SeparatorObject.need = true; - return ""; -}; + /** - * Returns numbers with comma, e.g. 10000 as "10,000", according to the player's settings - * @param {number} s - * @returns {string} + * Converts the given number to a string with or without commas, based on the user's settings. + * @param {number} s The number to format. + * @returns {string} Returns the number either with or without comma dividers, depending on the user's settings. */ globalThis.commaNum = function(s) { // Separated from num because some places in code (like long lists, tables) should never have numbers spelled out, but still benefit from commas @@ -209,9 +246,9 @@ globalThis.commaNum = function(s) { }; /** - * Returns the number of weeks in a years / months / weeks format - * @param {number} weeks - * @returns {string} + * Converts the given number in weeks to a string in a years / months / weeks format. + * @param {number} weeks The number of weeks to format. + * @returns {string} Returns "_ years _ months _ weeks". */ globalThis.years = function(weeks) { let years = 0; @@ -247,52 +284,66 @@ globalThis.years = function(weeks) { months += quarters * 3; // Each quarter has three months. if (years) { - array.push(`${num(years)} year${years !== 1 ? `s` : ``}`); + array.push(numberWithPluralOne(years, 'year')); } if (months) { - array.push(`${num(months)} month${months !== 1 ? `s` : ``}`); + array.push(numberWithPluralOne(months, 'month')); } if (weeks) { - array.push(`${num(weeks)} week${weeks !== 1 ? `s` : ``}`); + array.push(numberWithPluralOne(weeks, 'week')); } return toSentence(array); }; + /** - * @param {number} [weeks] - * @param {number} [bonusDay] - * @returns {Date} + * Converts the given number in weeks to a new Date object. + * @param {number} [weeks] The week to use. Uses the current week if one is not given. + * @param {number} [bonusDay] A specific day of the week to represent. 0-indexed. + * @returns {Date} Returns a new Date object. */ globalThis.asDate = function(weeks = null, bonusDay = 0) { - if (weeks == null) { + if (weeks === null) { weeks = V.week; } let d = new Date(2037, 0, 12); d.setDate(d.getDate() + weeks * 7 + bonusDay); return d; }; + /** - * @param {number} [weeks] - * @param {number} [bonusDay] - * @returns {string} + * Formats the given number in weeks as a string. + * @param {number} [weeks] The week to use. Uses the current week if one is not given. + * @param {number} [bonusDay] A specific day of the week to represent. 0-indexed. + * @returns {string} Returns a string of the number formatted as a date based on the user's locale settings. */ globalThis.asDateString = function(weeks = null, bonusDay = 0) { return asDate(weeks, bonusDay).toLocaleString(undefined, {year: 'numeric', month: 'long', day: 'numeric'}); }; /** - * @param {number} s - * @returns {string} + * Formats the given number as currency. + * @param {number} s The number to format. + * @returns {string} Returns a string of the number formatted as a currency. */ -globalThis.cashFormat = function(s) { +globalThis.cashFormat = function(s = 0) { if (s < 0) { return `-¤${commaNum(Math.abs(s))}`; } return `¤${commaNum(s)}`; }; -globalThis.cashFormatColor = function(s, invert = false) { + +/** + * Formats the given number as currency. + * + * Positive values returns in green, negative values return in red. + * @param {number} s The number to format. + * @param {boolean} invert Whether or not to invert the numbers. + * @returns {string} Returns a string of the number formatted as a currency with different colors depending on the amount. + */ +globalThis.cashFormatColor = function(s = 0, invert = false) { if (invert) { s = -1 * s; } @@ -304,16 +355,18 @@ globalThis.cashFormatColor = function(s, invert = false) { return `<span>${cashFormat(s)}</span>`; // Yellow for positive } else { - return `<span class='yellowgreen'>${cashFormat(s)}</span>`; + return `<span class='cash'>${cashFormat(s)}</span>`; } }; /** - * @param {number} s - * @returns {string} + * Formats the given number as reputation. + * + * Positive values returns in green, negative values return in red. + * @param {number} s The number to format. + * @returns {string} Returns a given number of reputation as a string. */ -globalThis.repFormat = function(s) { - /* if (!s) { s = 0; }*/ +globalThis.repFormat = function(s = 0) { if (V.cheatMode === 1 || V.debugMode === 1) { if (s > 0) { return `<span class="green">${commaNum(Math.round(s * 100) / 100)} rep</span>`; @@ -348,18 +401,15 @@ globalThis.repFormat = function(s) { } else if (weight < 0) { return `<span class="red">− rep</span>`; } - /* return weight;*/ } }; /** - * @param {number} s - * @returns {string} + * Converts the given number in kg to a string in tons or kg. + * @param {number} s The number to format. Returns "tons" if greater than 1000, otherwise returns "kg". + * @returns {string} Returns "_ tons", "1 ton" (or "one ton"), or "_ kg". */ -globalThis.massFormat = function(s) { - if (!s) { - s = 0; - } +globalThis.massFormat = function(s = 0) { if (Math.abs(s) >= 1000) { s = Math.trunc(s / 1000); if (s !== 1) { @@ -373,26 +423,26 @@ globalThis.massFormat = function(s) { }; /** - * Takes an integer e.g. slave.hLength, returns a string in the format 10 inches - * @param {number} cm - * @returns {string} + * Converts the given number in cm to a string in inches. + * @param {number} cm The number to format, in cm. + * @returns {string} Returns "less than an inch", "1 inch" (or "one inch"), or "_ inches". */ globalThis.cmToInchString = function(cm) { let inches = cm / 2.54; - if (inches > 0 && inches < 1) { + if (inches.isBetween(0, 1)) { return "less than an inch"; } inches = Math.round(inches); if (inches === 1) { - return "1 inch"; + return `${num(1)} inch`; } return `${inches} inches`; }; /** - * takes an integer e.g. slave.height, returns a string in the format 6'5" - * @param {number} cm - * @returns {string} + * Converts the given number in cm to a string in feet and inches. + * @param {number} cm The value to convert. + * @returns {string} Returns "less than an inch", "1 inch" (or "one inch"), "_ inches", or "_'_"". */ globalThis.cmToFootInchString = function(cm) { if (Math.round(cm / 2.54) < 12) { @@ -402,18 +452,18 @@ globalThis.cmToFootInchString = function(cm) { }; /** - * takes a dick value e.g. slave.dick, returns a string in the format 6 inches - * @param {number} dick - * @returns {string} + * Converts the given `.dick` value to a string in inches. + * @param {number} dick The value to convert. + * @returns {string} Returns "less than an inch", "1 inch" (or "one inch"), or "_ inches". */ globalThis.dickToInchString = function(dick) { return cmToInchString(dickToCM(dick)); }; /** - * takes a dick value e.g. slave.dick, returns an int of the dick length in cm - * @param {number} dick - * @returns {number} + * Converts the given `.dick` value to a number in cm. + * @param {number} dick The value to convert. + * @returns {number} Returns the value in cm. */ globalThis.dickToCM = function(dick) { if (dick < 9) { @@ -423,19 +473,20 @@ globalThis.dickToCM = function(dick) { } return dick * 6; }; + /** - * takes a ball value e.g. slave.balls, returns a string in the format 3 inches - * @param {number} balls - * @returns {string} + * Converts the given `.balls` value to a string in inches. + * @param {number} balls The value to convert. + * @returns {string} Returns "less than an inch", "1 inch" (or "one inch"), or "_ inches". */ globalThis.ballsToInchString = function(balls) { return cmToInchString(ballsToCM(balls)); }; /** - * takes a ball value e.g. slave.balls, returns an int of the ball size in cm - * @param {number} balls - * @returns {number} + * Converts the given `.balls` value to a number in cm. + * @param {number} balls The value to convert. + * @returns {number} Returns the value in cm. */ globalThis.ballsToCM = function(balls) { if (balls < 2) { @@ -445,9 +496,9 @@ globalThis.ballsToCM = function(balls) { }; /** - * takes a dick value e.g. slave.dick, returns a string in the format of either `20cm (8 inches)`, `8 inches`, or `20cm` - * @param {number} dick - * @returns {string} + * Converts the given `.dick` value to a string in either cm or inches, depending on the user's settings. + * @param {number} dick The value to convert. + * @returns {string} Returns either "_cm (_ inches)", "_ inches", or "_cm". */ globalThis.dickToEitherUnit = function(dick) { if (V.showInches === 1) { @@ -460,9 +511,9 @@ globalThis.dickToEitherUnit = function(dick) { }; /** - * takes a ball value e.g. slave.balls, returns a string in the format of either `20cm (8 inches)`, `8 inches`, or `20cm` - * @param {number} balls - * @returns {string} + * Converts the given `.balls` value to a string in either cm or inches, depending on the user's settings. + * @param {number} balls The value to convert. + * @returns {string} Returns either "_cm (_ inches)", "_ inches", or "_cm". */ globalThis.ballsToEitherUnit = function(balls) { if (V.showInches === 1) { @@ -475,9 +526,9 @@ globalThis.ballsToEitherUnit = function(balls) { }; /** - * takes an int in centimeters e.g. slave.height, returns a string in the format of either `200cm (6'7")`, `6'7"`, or `200cm` - * @param {number} height - * @returns {string} + * Converts the given `.height` value to a string in either cm or inches, depending on the user's settings. + * @param {number} height The value to convert. + * @returns {string} Returns either "_cm (_'_")", "_'_"", or "_cm". */ globalThis.heightToEitherUnit = function(height) { if (V.showInches === 1) { @@ -490,9 +541,9 @@ globalThis.heightToEitherUnit = function(height) { }; /** - * takes an int in centimeters e.g. slave.hLength, returns a string in the format of either `30cm (12 inches)`, `12 inches`, or `30cm` - * @param {number} length - * @returns {string} + * Converts the given value in cm to a string in either cm or inches, depending on the user's settings. + * @param {number} length The value to convert. + * @returns {string} Returns either "_cm (_ inches)", "_ inches", or "_cm". */ globalThis.lengthToEitherUnit = function(length) { if (V.showInches === 1) { diff --git a/src/js/vignettes.js b/src/js/vignettes.js index a103cd3c9a03357faf648b9fbc604958a0a5570c..8414cd2d17b8e338953ac2e81dabfd391c8deacd 100644 --- a/src/js/vignettes.js +++ b/src/js/vignettes.js @@ -1467,7 +1467,7 @@ globalThis.GetVignette = function(slave) { } } if (V.arcologies[0].FSGenderRadicalist !== "unset") { - if (slave.dick > 0 && slave.dick < 3) { + if (slave.dick.isBetween(0, 3)) { vignettes.push({ text: `${he} got repeat business from a customer who is coming to terms with Gender Radicalism, and is unthreatened by ${his} little penis,`, type: "cash", @@ -3471,7 +3471,7 @@ globalThis.GetVignette = function(slave) { } } if (V.arcologies[0].FSGenderRadicalist !== "unset") { - if (slave.dick > 0 && slave.dick < 3) { + if (slave.dick.isBetween(0, 3)) { vignettes.push({ text: `${he} gratified a citizen who is coming to terms with Gender Radicalism, and is unthreatened by ${his} little penis,`, type: "rep", diff --git a/src/js/wombJS.js b/src/js/wombJS.js index d48f4045a5dd8cd2941470e2f934c88c0e1bbbdf..7a1cf00585da20ad7c359ae3ce51b912dfc29985 100644 --- a/src/js/wombJS.js +++ b/src/js/wombJS.js @@ -78,8 +78,9 @@ globalThis.WombInit = function(actor) { WombImpregnate(actor, actor.pregType, actor.pregSource, actor.preg); } else if (actor.womb.length === 0 && actor.pregType > 0 && actor.broodmother > 0 && actor.broodmotherOnHold < 1) { // sorry but for already present broodmothers it's impossible to calculate fully, approximation used. - let pw = actor.preg, - bCount, bLeft; + let pw = actor.preg; + let bCount; + let bLeft; if (pw > actor.pregData.normalBirth) { pw = actor.pregData.normalBirth; } // to avoid disaster. bCount = Math.floor(actor.pregType / pw); bLeft = actor.pregType - (bCount * pw); @@ -284,7 +285,17 @@ globalThis.WombGetVolume = function(actor) { // most legacy code from pregJS.tw function getCurData(actor, age) { let i = 0; - let min, max, ageMin, ageMax, rateMin, rateMax, one, rateOne, rate, cAge, cSize; + let min; + let max; + let ageMin; + let ageMax; + let rateMin; + let rateMax; + let one; + let rateOne; + let rate; + let cAge; + let cSize; let data = {}; while (actor.pregData.fetusWeek[i + 1] < age && i < actor.pregData.fetusWeek.length - 1) { @@ -317,7 +328,8 @@ globalThis.WombGetVolume = function(actor) { // most legacy code from pregJS.tw function getVolByLen(actor) { let phi = 1.618; - let targetData, targetLen; + let targetData; + let targetLen; let wombSize = 0; try { @@ -426,7 +438,17 @@ globalThis.FetusGetPrediction = function(actor, age) { function getCurData(actor, age) { let i = 0; - let min, max, ageMin, ageMax, rateMin, rateMax, one, rateOne, rate, cAge, cSize; + let min; + let max; + let ageMin; + let ageMax; + let rateMin; + let rateMax; + let one; + let rateOne; + let rate; + let cAge; + let cSize; let data = {}; while (actor.pregData.fetusWeek[i + 1] < age && i < actor.pregData.fetusWeek.length - 1) { @@ -459,7 +481,8 @@ globalThis.FetusGetPrediction = function(actor, age) { function getVolByLen(actor, age) { let phi = 1.618; - let targetData, targetLen; + let targetData; + let targetLen; let volume = 0; targetData = getCurData(actor, age); diff --git a/src/markets/gingering.js b/src/markets/gingering.js index c8308dcbda2f8e52c463d6f12bf1841f223818a2..4a7deacf27c35f079597fa081e34bf9a4a35ab42 100644 --- a/src/markets/gingering.js +++ b/src/markets/gingering.js @@ -2,8 +2,9 @@ App.Entity.GingeringParameters = class { /** Get gingering parameters for a particular slave and market. * @param {App.Entity.SlaveState} slave * @param {FC.Zeroable<FC.SlaveMarketName>} market + * @param {number} [arcIndex] - arcology index if market is "neighbor" */ - constructor(slave, market) { + constructor(slave, market, arcIndex) { /** @type {FC.Gingering} */ this.type = 0; /** @type {FC.GingeringDetection} */ @@ -13,7 +14,13 @@ App.Entity.GingeringParameters = class { // figure out what type of gingering applies, if any if (applyLawCheck(market) === 1 && V.policies.SMR.honestySMR === 1) { - /* SMR prohibits gingering and is enforced for this slave - do nothing */ + /* SMR prohibits gingering and is enforced for this seller - do nothing */ + } else if (App.Data.misc.schools.has(market)) { + /* slave schools have a reputation to maintain, and will never ginger their slaves */ + } else if (["wetware", "heap", "gangs and smugglers", "low tier criminals", "military prison", "white collar", "corporate"].includes(market)) { + /* these sellers see no reason to ginger their slaves */ + } else if (market === "neighbor" && App.Neighbor.opinion(V.arcologies[0], V.arcologies[arcIndex]) >= 50) { + /* socially-aligned neighbors will not try to cheat you */ } else if (slave.indenture > 0) { /* indentured servants cannot be gingered */ } else if (isShelterSlave(slave)) { @@ -89,10 +96,11 @@ globalThis._makeGingeredSlaveHandler = function(gParams, gKeys) { /** Get a gingered proxy for a slave. * @param {App.Entity.SlaveState} slave * @param {FC.Zeroable<FC.SlaveMarketName>} market + * @param {number} arcIndex - arcology number if market is "neighbor" * @returns {FC.GingeredSlave} * */ -globalThis.getGingeredSlave = function(slave, market) { - const gingering = new App.Entity.GingeringParameters(slave, market); +globalThis.getGingeredSlave = function(slave, market, arcIndex) { + const gingering = new App.Entity.GingeringParameters(slave, market, arcIndex); /** @type {Map<string, string|number>} */ const gingeredKeys = new Map(); diff --git a/src/markets/specificMarkets/schoolFutanari.js b/src/markets/specificMarkets/schoolFutanari.js index dc200b7c0297e3991bffe0c05bff37f9954053ad..d43461afdeaaac6daec2290eb44d9313d161cc49 100644 --- a/src/markets/specificMarkets/schoolFutanari.js +++ b/src/markets/specificMarkets/schoolFutanari.js @@ -98,43 +98,43 @@ App.Markets.TFS = function() { r.push(`You leave the Sisters' suite after a few hours of fucking and being fucked, feeling tired but satisfied.`); } if (canGetPregnant(V.PC)) { - r.push(knockMeUp(V.PC, 5, 0, -9, true)); + knockMeUp(V.PC, 5, 0, -9); } break; case 2: r.push(`She doesn't have to explain the Sisters' sexual equality this time, or that you have to subject yourself to it. You remember, and you let her know you're willing by giving her a friendly hug that squashes your breasts against each other and rubs your stiff pricks together. She reaches around you to grab your ass, already pulling you towards the pile of futas. You leave the Sisters' suite after a few hours of fucking and being fucked, in a state of total sexual satiation.`); if (canGetPregnant(V.PC)) { - r.push(knockMeUp(V.PC, 10, 0, -9, true)); + knockMeUp(V.PC, 10, 0, -9); } break; case 3: r.push(`She asked that with a distinctly flirty tone, obviously hoping you'd agree again, and she isn't disappointed. You take her by the hand and skip over to the pile of futas, most of which know you very intimately by now. They see their Sister and you approaching, and those of them that don't have their mouths full greet you eagerly. Three of them quickly rearrange themselves to present you with a couple of dicks to sit on and a pussy to fuck, all at once. You leave the Sisters' suite after many hours of fucking and being fucked, tired but satisfied.`); if (canGetPregnant(V.PC)) { - r.push(knockMeUp(V.PC, 20, 0, -9, true)); + knockMeUp(V.PC, 20, 0, -9); } break; case 4: r.push(`She asked that in a knowing voice, confident you'd agree, and was already moving in to kiss you when you did. She seems to want you more than usual today, and pulls you down onto the edge of the pit, guiding your cock into her pussy. She isn't selfish, of course, and reaches around to spread your buttocks so you can get fucked while you fuck. You leave the Sisters' suite after many hours of this, very tired. You wonder when you can make time to visit the Sisters again.`); if (canGetPregnant(V.PC)) { - r.push(knockMeUp(V.PC, 40, 0, -9, true)); + knockMeUp(V.PC, 40, 0, -9); } break; case 5: r.push(`She runs her tongue over her lips as she asks, and sits you down on the edge of the pit and deepthroats you as soon as you agree. She wants your cum, and uses a couple of fingers to tickle your prostate and make it appear faster. You jerk with orgasm, and she pushes your wet cock up against your stomach so she can fuck your pussy. She pauses for a moment, letting a younger Sister enter her ass first. You leave the Sisters' suite after a full day of this, utterly exhausted but eager to return.`); if (canGetPregnant(V.PC)) { - r.push(knockMeUp(V.PC, 60, 0, -9, true)); + knockMeUp(V.PC, 60, 0, -9); } break; case 6: r.push(`You nod, and she turns back towards the orgy, not seeing any reason to lead you, since you know the way. You both sink back into the pile of cocks, pussies, mouths, asses, boobs; the hours go by without you noticing. You leave the Sisters' suite unable to remember specifics, but you clearly fucked and got fucked by every futa there at least once. You're surprised when you learn how long you were there, but the worries of being an arcology owner no longer seem as pressing as they once did.`); if (canGetPregnant(V.PC)) { - r.push(knockMeUp(V.PC, 80, 0, -9, true)); + knockMeUp(V.PC, 80, 0, -9); } break; case 7: r.push(`You don't even bother to respond, and head straight for the orgy. You insert yourself into an eager mouth, bending over so the matron following you can take you from behind. The worries of your life as an arcology owner seem very far away as she slides inside you. You only leave when ${V.assistant.name} repeatedly pages you over the arcology's public announcement system. On the way to your office, you notice how full of cum your stomach is, how relaxed your pussy and ass are, and how happy you feel.`); if (canGetPregnant(V.PC)) { - r.push(knockMeUp(V.PC, 100, 0, -9, true)); + knockMeUp(V.PC, 100, 0, -9); } break; case 8: diff --git a/src/markets/theMarket/tradeMenials.js b/src/markets/theMarket/tradeMenials.js index e483254910e617dff9cc2b5fe8102cdbf643602b..90c3a30c6d3138e72af342435223fae09a49b25a 100644 --- a/src/markets/theMarket/tradeMenials.js +++ b/src/markets/theMarket/tradeMenials.js @@ -148,7 +148,7 @@ App.UI.tradeMenials = function(menialWorkersOnly) { } function menialTrading() { - const el = new DocumentFragment(); + const el = document.createElement("div"); let div = document.createElement("div"); if (!menialWorkersOnly) { if (V.menials > 1) { @@ -347,7 +347,7 @@ App.UI.tradeMenials = function(menialWorkersOnly) { } function fuckDollTrading() { - const el = new DocumentFragment(); + const el = document.createElement("div"); let div = document.createElement("div"); if (V.fuckdolls > 1) { el.append(`You own ${num(Math.trunc(V.fuckdolls))} standard Fuckdolls. `); @@ -356,6 +356,7 @@ App.UI.tradeMenials = function(menialWorkersOnly) { } else if (V.arcologies[0].FSPaternalist === "unset") { el.append(`You do not own any standard Fuckdolls. `); } + el.append(div); if ((V.fuckdolls > 0) || (V.arcologies[0].FSPaternalist === "unset")) { el.append(`The market price of standard Fuckdolls is ${cashFormat(menialPrice)}.`); if (bulkMax > 0) { @@ -447,7 +448,7 @@ App.UI.tradeMenials = function(menialWorkersOnly) { } function bioreactorTrading() { - const el = new DocumentFragment(); + const el = document.createElement("div"); let div = document.createElement("div"); if (V.menialBioreactors > 1) { el.append(`You own ${num(Math.trunc(V.menialBioreactors))} standard bioreactors. `); diff --git a/src/neighbor/neighborDisplay.js b/src/neighbor/neighborDisplay.js index ad90dbedb033ba880e4942e08767c967bb623819..c09bbf946ab5f33aee63e1a94d9c1d175c551cd1 100644 --- a/src/neighbor/neighborDisplay.js +++ b/src/neighbor/neighborDisplay.js @@ -100,9 +100,8 @@ App.Neighbor.Display = class { * @returns {HTMLSpanElement} */ function withTooltip(text, tooltipText, className) { - let tooltip = App.UI.DOM.makeElement("span", tooltipText, "tooltip"); - let res = App.UI.DOM.makeElement("span", text, ["textWithTooltip", className]); - res.appendChild(tooltip); + let res = App.UI.DOM.makeElement("span", text, ["has-tooltip", className]); + tippy(res, {content: tooltipText}); return res; } @@ -165,7 +164,7 @@ App.Neighbor.Display = class { App.UI.DOM.appendNewElement("li", frag, withTooltip(challengerPercent, "Minority challenger ownership", "orange")); } App.UI.DOM.appendNewElement("li", frag, withTooltip(hostilePercent, "Hostile ownership", "red")); - return App.UI.DOM.makeElement("ul", frag, "choicesStrip"); + return App.UI.DOM.makeElement("ul", frag, "choices-strip"); } let frag = document.createDocumentFragment(); diff --git a/src/npc/agent/agentFramework.js b/src/npc/agent/agentFramework.js index e2511101340aee998a0bd067c51b8dfca4e6c116..4b40cc952555dcbd4041e62255515242ba475b52 100644 --- a/src/npc/agent/agentFramework.js +++ b/src/npc/agent/agentFramework.js @@ -25,7 +25,8 @@ App.Data.Facilities.arcologyAgent = { shouldTalk: true, shouldThink: true, requiredDevotion: 21 - } + }, + decorated: false }; App.Entity.Facilities.AgentJob = class extends App.Entity.Facilities.ManagingJob { diff --git a/src/npc/children/longChildDescription.js b/src/npc/children/longChildDescription.js index 7d55945a3e86ec38546066b50fbb16b0bd24c816..b09446606cecb70107651e17dd98da1e4840d750 100644 --- a/src/npc/children/longChildDescription.js +++ b/src/npc/children/longChildDescription.js @@ -8146,9 +8146,9 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event } } - if (child.addict > 0 && child.addict < 3) { + if (child.addict.isBetween(0, 3)) { r += `${He} is a new <span class="cyan">aphrodisiac addict.</span> `; - } else if (child.addict > 0 && child.addict < 10) { + } else if (child.addict.isBetween(0, 10)) { r += `${He} is a confirmed <span class="cyan">aphrodisiac addict.</span> `; } else if (child.addict > 0) { r += `${He} is completely <span class="cyan">dependent on aphrodisiacs,</span> and it is unlikely you will ever be able to wean ${him} off them. `; diff --git a/src/npc/databases/dSlavesDatabase.js b/src/npc/databases/dSlavesDatabase.js index 185c3bd433af318dfe0f5d79316f210ac483baea..3babb1d13d5be621e53226035c6aa486d96b4c78 100644 --- a/src/npc/databases/dSlavesDatabase.js +++ b/src/npc/databases/dSlavesDatabase.js @@ -1,4 +1,7 @@ /* eslint-disable camelcase */ +/** + * @type {Partial<partialSlaveState>[]} + */ App.Data.HeroSlaves.D = [ // start 900000 { @@ -648,7 +651,8 @@ App.Data.HeroSlaves.D = [ origHColor: "red", pubicHColor: "red", origSkin: "pale", - hStyle: "long", + hStyle: "ponytail", + hLength: 60, waist: -55, boobs: 400, butt: 2, @@ -1277,7 +1281,8 @@ App.Data.HeroSlaves.D = [ origHColor: "black", pubicHColor: "black", origSkin: "brown", - hStyle: "long", + hStyle: "luxurious", + hLength: 60, boobs: 500, butt: 3, vagina: 1, @@ -1770,7 +1775,8 @@ App.Data.HeroSlaves.D = [ devotion: 25, race: "white", origSkin: "white", - hStyle: "long", + hStyle: "ponytail", + hLength: 60, boobs: 650, boobsTat: "degradation", buttTat: "degradation", @@ -3992,7 +3998,7 @@ App.Data.HeroSlaves.D = [ pubicHColor: "black", origSkin: "pale", hLength: 0, - hStyle: "shaved bald", + hStyle: "shaved", pubicHStyle: "bushy", boobs: 600, nipplesPiercing: 1, @@ -4074,6 +4080,9 @@ App.Data.HeroSlaves.D = [ }, ]; /* Removed eye color customDesc -BoneyM*/ +/** + * @type {Partial<partialSlaveState>[]} + */ App.Data.HeroSlaves.Dextreme = [ { ID: 900099, @@ -4175,7 +4184,7 @@ App.Data.HeroSlaves.Dextreme = [ pubicHColor: "black", origSkin: "very fair", hLength: 60, - hStyle: "in a hime cut", + hStyle: "hime", boobs: 500, butt: 3, vaginaLube: 1, @@ -4346,7 +4355,7 @@ App.Data.HeroSlaves.Dextreme = [ pubicHColor: "black", origSkin: "pale", hLength: 0, - hStyle: "shaved bald", + hStyle: "shaved", waist: -100, boobs: 2000, boobsImplant: 600, @@ -4633,7 +4642,7 @@ App.Data.HeroSlaves.Dextreme = [ origHColor: "blonde", origSkin: "pale", hLength: 60, - hStyle: "neat, with thick luxurious bangs,", + hStyle: "bangs", waist: -55, voice: 2, boobs: 300, @@ -4678,7 +4687,7 @@ App.Data.HeroSlaves.Dextreme = [ origHColor: "blonde", origSkin: "pale", hLength: 60, - hStyle: "neat, with thick luxurious bangs,", + hStyle: "bangs", waist: -55, voice: 2, boobs: 500, diff --git a/src/npc/databases/ddSlavesDatabase.js b/src/npc/databases/ddSlavesDatabase.js index 90fa71d27fa20a7f8b6180fdc07aab5f45783e6f..0bc4e7c5aafba1bd0d6907bd7e846ad96f40c32f 100644 --- a/src/npc/databases/ddSlavesDatabase.js +++ b/src/npc/databases/ddSlavesDatabase.js @@ -1,6 +1,27 @@ /* eslint-disable camelcase */ // _i = 800000}, +/** + * @typedef {object} missingProperties + * @property {any} health + * @property {any} skill + * @property {any} custom + * @property {any} eye + * @property {any} counter + * @property {any} leg + * @property {any} geneticQuirks + * @property {any} rules + * @property {Array<0|1>} removedLimbs //limbs to be removed + */ + +/** + * @typedef {object} partialSlaveState + * @type {App.Entity.SlaveState & missingProperties} + */ + +/** + * @type {Partial<partialSlaveState>[]} + */ App.Data.HeroSlaves.DD = [ { ID: 800001, @@ -533,7 +554,8 @@ App.Data.HeroSlaves.DD = [ origHColor: "red", pubicHColor: "red", origSkin: "pale", - hStyle: "long", + hStyle: "braided", + hLength: 60, boobs: 1800, nipplesPiercing: 1, shoulders: -1, @@ -723,7 +745,7 @@ App.Data.HeroSlaves.DD = [ pubicHColor: "blonde", race: "white", hLength: 0, - hStyle: "shaved bald", + hStyle: "shaved", boobs: 200, butt: 3, vagina: -1, @@ -987,7 +1009,7 @@ App.Data.HeroSlaves.DD = [ underArmHColor: "red", origSkin: "light", hLength: 30, - hStyle: "in a hime cut", + hStyle: "hime", waist: -55, boobs: 250, butt: 3.5, @@ -1308,7 +1330,7 @@ App.Data.HeroSlaves.DD = [ pubicHColor: "blonde", origSkin: "pale", hLength: 0, - hStyle: "shaved bald", + hStyle: "shaved", pubicHStyle: "bushy", boobs: 1700, boobsTat: "rude words", @@ -1423,6 +1445,9 @@ App.Data.HeroSlaves.DD = [ }, ]; +/** + * @type {Partial<partialSlaveState>[]} + */ App.Data.HeroSlaves.DDextreme = [ { ID: 800032, diff --git a/src/npc/databases/dfSlavesDatabase.js b/src/npc/databases/dfSlavesDatabase.js index 67eff09a4a1e2fd64de8da1607768d1f4011f151..f630aafa1e1f0ab543b8596a19cd49521e6eba78 100644 --- a/src/npc/databases/dfSlavesDatabase.js +++ b/src/npc/databases/dfSlavesDatabase.js @@ -1,6 +1,9 @@ /* eslint-disable camelcase */ // _i: 700000}, +/** + * @type {Partial<partialSlaveState>[]} + */ App.Data.HeroSlaves.DF = [ { ID: 700001, @@ -338,6 +341,9 @@ App.Data.HeroSlaves.DF = [ /* vibe nips, stupid, sensitive, no masturbation implant*/ ]; +/** + * @type {Partial<partialSlaveState>[]} + */ App.Data.HeroSlaves.DFextreme = [ { ID: 700009, diff --git a/src/npc/descriptions/crotch/vaginalAccessory.js b/src/npc/descriptions/crotch/vaginalAccessory.js index 9b5227dfd120119bf540ebe4608166bda4d6ef69..c607dbb59b608b3b7c6645dc7887195699e32381 100644 --- a/src/npc/descriptions/crotch/vaginalAccessory.js +++ b/src/npc/descriptions/crotch/vaginalAccessory.js @@ -67,7 +67,7 @@ App.Desc.vaginalAccessory = function(slave) { default: if (slave.chastityVagina) { r.push(`${His} pussy is protected by a chastity`); - if (slave.clothes !== "no clothing") { + if (App.Data.clothes.get(slave.clothes).exposure <= 3) { r.push(`belt worn under ${his} clothing.`); } else { r.push(`belt.`); diff --git a/src/npc/descriptions/drugs.js b/src/npc/descriptions/drugs.js index 4609cc969ab188b4ca1559b74d0e90df1cbeb8c3..d1f5639449a4f2a72b9838cb0a5e4dcfd1682ca8 100644 --- a/src/npc/descriptions/drugs.js +++ b/src/npc/descriptions/drugs.js @@ -921,9 +921,9 @@ App.Desc.drugs = function(slave) { } } } - if (slave.addict > 0 && slave.addict <= 2) { + if (slave.addict.isBetween(0, 3)) { r.push(`${He} is a new <span class="cyan">aphrodisiac addict.</span>`); - } else if (slave.addict > 0 && slave.addict < 10) { + } else if (slave.addict.isBetween(0, 10)) { r.push(`${He} is a confirmed <span class="cyan">aphrodisiac addict.</span>`); } else if (slave.addict > 0) { r.push(`${He} is completely <span class="cyan">dependent on aphrodisiacs,</span> and it is unlikely you will ever be able to wean ${him} off them.`); diff --git a/src/npc/descriptions/legs.js b/src/npc/descriptions/legs.js index 1282f78d05cc4b8aebf05b61471aa2a4d6fb9a69..fb8a53a9be1a90ecb0866455fae6e15fd861eddf 100644 --- a/src/npc/descriptions/legs.js +++ b/src/npc/descriptions/legs.js @@ -3,129 +3,71 @@ * @returns {string} */ App.Desc.legs = function(slave) { - const r = []; const { his, He } = getPronouns(slave); - if (hasAnyNaturalLegs(slave)) { + if (hasAnyNaturalLegs(slave) && (slave.weight > 95 || slave.muscles > 5)) { + const thighs = hasBothNaturalLegs(slave) ? "thighs" : "thigh"; + const thighMuscles = slave.muscles > 5 ? `${thighs} and ${muscleDesc()}` : thighs; if (slave.weight > 190) { - r.push(`${He} has`); if (hasBothNaturalLegs(slave)) { - r.push(`extremely fat legs with immense soft, rather uneven`); - if (slave.muscles > 5) { - r.push(`thighs and`); - } else { - r.push(`thighs.`); - } + return `${He} has extremely fat legs with immense soft, rather uneven ${thighMuscles}.`; } else { - r.push(`an extremely fat leg with an immense soft, rather uneven`); - if (slave.muscles > 5) { - r.push(`thigh and`); - } else { - r.push(`thigh.`); - } + return `${He} has an extremely fat leg with an immense soft, rather uneven ${thighMuscles}.`; } } else if (slave.weight > 160) { - r.push(`${He} has`); if (hasBothNaturalLegs(slave)) { - r.push(`very fat legs with massively thick, soft, somewhat uneven`); - if (slave.muscles > 5) { - r.push(`thighs and`); - } else { - r.push(`thighs.`); - } + return `${He} has very fat legs with massively thick, soft, somewhat uneven ${thighMuscles}.`; } else { - r.push(`a very fat leg with a massively thick, soft, somewhat uneven`); - if (slave.muscles > 5) { - r.push(`thigh and`); - } else { - r.push(`thigh.`); - } + return `${He} has a very fat leg with a massively thick, soft, somewhat uneven ${thighMuscles}.`; } } else if (slave.weight > 130) { - r.push(`${He} has`); if (hasBothNaturalLegs(slave)) { - r.push(`fat legs with hugely thick, soft`); - if (slave.muscles > 5) { - r.push(`thighs and`); - } else { - r.push(`thighs.`); - } + return `${He} has fat legs with hugely thick, soft ${thighMuscles}.`; } else { - r.push(`a fat leg with a hugely thick, soft`); - if (slave.muscles > 5) { - r.push(`thigh and`); - } else { - r.push(`thigh.`); - } + return `${He} has a fat leg with a hugely thick, soft ${thighMuscles}.`; } } else if (slave.weight > 97) { - r.push(`${He} has`); if (hasBothNaturalLegs(slave)) { - r.push(`fat legs with thick, soft`); - if (slave.muscles > 5) { - r.push(`thighs and`); - } else { - r.push(`thighs.`); - } + return `${He} has fat legs with thick, soft ${thighMuscles}.`; } else { - r.push(`a fat leg with a thick, soft`); - if (slave.muscles > 5) { - r.push(`thigh and`); - } else { - r.push(`thigh.`); - } + return `${He} has a fat leg with a thick, soft ${thighMuscles}.`; } } else if (slave.weight > 95) { - r.push(`${He} has`); if (hasBothNaturalLegs(slave)) { - r.push(`normal legs with thick, soft`); - if (slave.muscles > 5) { - r.push(`thighs and`); - } else { - r.push(`thighs.`); - } + return `${He} has normal legs with thick, soft ${thighMuscles}.`; } else { - r.push(`a normal leg with a thick, soft`); - if (slave.muscles > 5) { - r.push(`thigh and`); - } else { - r.push(`thigh.`); - } + return `${He} has a normal leg with a thick, soft ${thighMuscles}.`; } } else if (slave.muscles > 5) { - r.push(`${He} has`); if (hasBothNaturalLegs(slave)) { - r.push(`relatively normal legs and thighs`); + return `${He} has relatively normal legs and thighs with ${muscleDesc()}.`; } else { - r.push(`a relatively normal leg and thigh`); + return `${He} has a relatively normal leg and thigh with ${muscleDesc()}.`; } - r.push(`with`); } + } + function muscleDesc(){ if (slave.muscles > 95) { if (slave.weight > 95) { - r.push(`huge muscles hidden beneath ${his} soft flab.`); + return `huge muscles hidden beneath ${his} soft flab`; } else { - r.push(`huge muscles.`); + return `huge muscles`; } } else if (slave.muscles > 30) { if (slave.weight > 95) { - r.push(`obvious muscles hidden beneath ${his} soft flab.`); + return `obvious muscles hidden beneath ${his} soft flab.`; } else { - r.push(`obvious muscles.`); + return `obvious muscles`; } } else if (slave.muscles > 5) { if (slave.weight > 30) { - r.push(`toned muscles hidden beneath ${his} soft flab.`); + return `toned muscles hidden beneath ${his} soft flab.`; } else { - r.push(`toned muscles.`); + return `toned muscles`; } - } else { - // barely any muscle in them. } } - return r.join(" "); }; - diff --git a/src/npc/descriptions/longSlave.js b/src/npc/descriptions/longSlave.js index 939e00b9b7ace2ef41359953c58e5e9b3708deab..67a7f3de6c46309f0531c136ea79c52b568df40f 100644 --- a/src/npc/descriptions/longSlave.js +++ b/src/npc/descriptions/longSlave.js @@ -430,7 +430,7 @@ App.Desc.longSlave = function(slave, {market = 0, eventDescription = false, pris if (slave.hColor === "red") { if (slave.hLength >= 10) { if (slave.markings === "freckles" || slave.markings === "heavily freckled") { - if (skinToneLevel(slave.skin) > 5 && skinToneLevel(slave.skin) < 10) { + if (skinToneLevel(slave.skin).isBetween(5, 10)) { r.push(`It goes perfectly with ${his} ${slave.skin} skin and freckles.`); } } diff --git a/src/npc/descriptions/womb/pregnancy.js b/src/npc/descriptions/womb/pregnancy.js index 27357c000bb795c13ba94620dec2e3c2c63f1a31..ccfc3aa695a16603367311526e515fc7a299c8b6 100644 --- a/src/npc/descriptions/womb/pregnancy.js +++ b/src/npc/descriptions/womb/pregnancy.js @@ -569,29 +569,29 @@ App.Desc.pregnancy = function(slave, {market, eventDescription} = {}) { r.push(`${daddy}'s growing child.`); } } - // } else if (slave.partners.size === 1) { - // let daddy = slave.partners.values().next().value; + } else if (slave.partners.size === 1) { + let daddy = slave.partners.values().next().value; - // if (daddy > 0) { - // if (daddy === slave.ID) { - // daddy = himself; - // } else { - // daddy = getSlave(daddy).slaveName; - // } - // } else { - // let desc = { - // 1: `you`, - // 2: `one of the citizens of ${V.arcologies[0].name}`, - // 3: `your former Master`, - // 4: `the owner of another arcology`, - // 6: `a member of the Societal Elite`, - // 8: `one of your pets`, - // 9: `a Futanari Sister`, - // }; - // daddy = desc[Math.abs(daddy)]; - // } + if (daddy > 0) { + if (daddy === slave.ID) { + daddy = himself; + } else { + daddy = SlaveFullName(getSlave(daddy)); + } + } else { + let desc = { + 1: `you`, + 2: `one of the citizens of ${V.arcologies[0].name}`, + 3: `your former Master`, + 4: `the owner of another arcology`, + 6: `a member of the Societal Elite`, + 8: `one of your pets`, + 9: `a Futanari Sister`, + }; + daddy = desc[Math.abs(daddy)]; + } - // r.push(`${His} ${slave.pregType > 1 ? `children were` : `child was`} fathered by ${daddy}.`); + r.push(`${His} ${slave.pregType > 1 ? `children were` : `child was`} fathered by ${daddy}.`); } else { r.push(`It is too early to tell who exactly fathered the child growing in ${his} womb.`); } diff --git a/src/npc/generate/generateMarketSlave.js b/src/npc/generate/generateMarketSlave.js index 8b86473926afa5495f7f6810ae285870afd1ae06..e17dfc3eb6112c8898bb93f0fd1703987516b0a6 100644 --- a/src/npc/generate/generateMarketSlave.js +++ b/src/npc/generate/generateMarketSlave.js @@ -3200,5 +3200,5 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1 break; } } - return {text: r, slave: getGingeredSlave(slave, market)}; + return {text: r, slave: getGingeredSlave(slave, market, numArcology)}; }; diff --git a/src/npc/generate/generateNewSlaveJS.js b/src/npc/generate/generateNewSlaveJS.js index 86f8bac471c64bd2cf3c95851e39a2fceda893e4..2401a43f416ee847206ba24ea49dd8e8d39d1a42 100644 --- a/src/npc/generate/generateNewSlaveJS.js +++ b/src/npc/generate/generateNewSlaveJS.js @@ -1646,11 +1646,11 @@ globalThis.GenerateNewSlave = (function() { /** @type {Array<FC.BreastShape>} */ const BoobShapeGen = []; - if (slave.boobs > 250 && slave.boobs < 800) { + if (slave.boobs.isBetween(250, 800)) { BoobShapeGen.push("perky"); BoobShapeGen.push("downward-facing"); } - if (slave.boobs > 400 && slave.boobs < 1200) { + if (slave.boobs.isBetween(400, 1200)) { BoobShapeGen.push("torpedo-shaped"); BoobShapeGen.push("wide-set"); } diff --git a/src/npc/generate/generateRelatedSlave.js b/src/npc/generate/generateRelatedSlave.js index 8880ee830f11f2460def1b51acb38c036f0146a2..5d5369081d1bdd93970490f8fa94a3d8be780e93 100644 --- a/src/npc/generate/generateRelatedSlave.js +++ b/src/npc/generate/generateRelatedSlave.js @@ -284,11 +284,25 @@ globalThis.generateRelatedSlave = (function() { * @param {App.Entity.SlaveState} slave - the new relative */ function ageFixup(slave) { - // adjust for age + // adjust immature slaves if (slave.physicalAge <= 15) { ageAdjustYoungRelative(slave); } + + // reset height slave.height = Math.trunc(Height.random(slave)); + + // reset puberty status + generatePuberty(slave); + + // reset teeth + if (slave.physicalAge < 6) { + slave.teeth = "baby"; + } else if (slave.physicalAge < 12) { + slave.teeth = "mixed"; + } else if (slave.teeth === "baby" || slave.teeth === "mixed") { + slave.teeth = either("crooked", "normal", "normal"); + } } /** @@ -357,11 +371,11 @@ globalThis.generateRelatedSlave = (function() { /* nipple size - checks for flat nipples and their validity, otherwise reroll */ const AllowedBoobShapes = []; const AllowedNippleShapes = []; - if (slave.boobs > 250 && slave.boobs < 800) { + if (slave.boobs.isBetween(250, 800)) { AllowedBoobShapes.push("perky"); AllowedBoobShapes.push("downward-facing"); } - if (slave.boobs > 400 && slave.boobs < 1200) { + if (slave.boobs.isBetween(400, 1200)) { AllowedBoobShapes.push("torpedo-shaped"); AllowedBoobShapes.push("wide-set"); } @@ -418,16 +432,6 @@ globalThis.generateRelatedSlave = (function() { slave.scrotum = slave.balls; } } - - /* teeth */ - if (slave.physicalAge < 6) { - slave.teeth = "baby"; - } else if (slave.physicalAge < 12) { - slave.teeth = "mixed"; - } - - /* reset puberty status */ - generatePuberty(slave); } function fastForward(slave, years) { diff --git a/src/npc/generate/newChildIntro.js b/src/npc/generate/newChildIntro.js index 68fcc696d0ded699fc7aaf1bcf8793e283f6497f..9619dc509f6252ec9386c8594de6cdcfe7e2c9d6 100644 --- a/src/npc/generate/newChildIntro.js +++ b/src/npc/generate/newChildIntro.js @@ -14,8 +14,6 @@ App.UI.newChildIntro = function(slave) { const tempMom = getSlave(slave.mother); const tempDad = getSlave(slave.father); - App.Utils.setLocalPronouns(slave); - r = []; r.push(`You completed the legalities before heading to ${V.incubator.name}, knowing the tank will release ${him} on your approach, and instruct ${V.assistant.name} to notify the new ${girl}'s parents to meet you in your office. As the tank exhumes the disoriented ${girl},`); diff --git a/src/npc/generate/newSlaveIntro.js b/src/npc/generate/newSlaveIntro.js index 6ae9f6d2abffcf1ecd6f5319ea6a582bfe9e61ab..1b871d618282454fda2dd414a4a9967f08b33f0b 100644 --- a/src/npc/generate/newSlaveIntro.js +++ b/src/npc/generate/newSlaveIntro.js @@ -1782,7 +1782,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest = actX(slave, "vaginal", 15); } if (isFertile(slave) && PC.dick > 0) { - knockMeUp(slave, 100, 0, -1, true); + knockMeUp(slave, 100, 0, -1); } slave.devotion += 100; return r.join(" "); @@ -1804,7 +1804,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest = r.push(`your pussy onto ${his} cock. ${He} shudders and moan softly as you slide yourself up and down ${his} shaft with steadily increasing speed. You keep your eyes locked on ${hers} all the while, as ${his} expression shifts from bewilderment to acceptance to ecstasy, as ${he} soon shoots ${his} seed up into you. Afterwards, you slip ${his} softening cock out of you, climb off of ${him}, and leave the exhausted and overwhelmed slave${girl} on your desk as you attend to business elsewhere. You think ${he}'s <span class="orangered">going to like it here.</span>`); actX(slave, "penetrative"); if (canImpreg(V.PC, slave)) { - knockMeUp(V.PC, 100, 0, slave.ID, true); + knockMeUp(V.PC, 100, 0, slave.ID); } } else { r.push(`yourself into ${his}`); @@ -1830,7 +1830,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest = r.push(VCheck.Vaginal(slave, 1)); actX(slave, "vaginal"); if (isFertile(slave) && PC.dick > 0) { - knockMeUp(slave, 100, 0, -1, true); + knockMeUp(slave, 100, 0, -1); } } else { r.push(VCheck.Anal(slave, 1)); @@ -2759,12 +2759,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest = } App.Events.addParagraph(el, r); - slave.preg = 1; - slave.pregType = setPregType(slave); - slave.pregWeek = 1; - slave.pregKnown = 1; - slave.pregSource = -1; - WombImpregnate(slave, slave.pregType, -1, 1); + knockMeUp(slave, 100, 2, -1); return el; }, }); diff --git a/src/npc/importSlave.js b/src/npc/importSlave.js index 48b9ca6095487a8fa31dcae5d616b80deb5b85f8..857a98725c745601d9b322bef5626ed2904c1a6d 100644 --- a/src/npc/importSlave.js +++ b/src/npc/importSlave.js @@ -8,8 +8,11 @@ App.UI.SlaveInteract.importSlave = function() { if (v) { const slave = JSON.parse(`{${v}}`); slave.ID = generateSlaveID(); + App.Update.Slave(slave); + App.Entity.Utils.SlaveDataSchemeCleanup(slave); newSlave(slave); SlaveDatatypeCleanup(slave); + removeJob(slave, slave.assignment); V.AS = slave.ID; Engine.play("Slave Interact"); } diff --git a/src/npc/interaction/FFuckdollAnal.js b/src/npc/interaction/FFuckdollAnal.js new file mode 100644 index 0000000000000000000000000000000000000000..ee8968d3ee4b2204ac2a24c1019883b598b42fa3 --- /dev/null +++ b/src/npc/interaction/FFuckdollAnal.js @@ -0,0 +1,147 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fFuckdollAnal = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him + } = getPronouns(slave); + + addPartner(slave, -1); + + seX(slave, "anal", V.PC, "penetrative"); + r.push(`You decide to use the Fuckdoll's`); + if (slave.anus > 3) { + r.push(`gaping`); + } else if (slave.anus === 3) { + r.push(`loose`); + } else if (slave.anus === 2) { + r.push(`relaxed`); + } else if (slave.anus === 1) { + r.push(`tight`); + } + r.push(`rear hole.`); + if (slave.fuckdoll <= 10) { + r.push(`Since ${he} is not well adapted to life as a living sex toy yet, ${he} won't respond to position commands. So, you simply`); + if (hasAnyLegs(slave)) { + r.push(`walk over to ${him}`); + } else { + r.push(`flip ${him} over`); + } + r.push(`and ram`); + if (V.PC.dick !== 0) { + r.push(`your cock`); + } else { + r.push(`a strap-on`); + } + r.push(`up ${his} rear hole.`); + } else if (slave.fuckdoll <= 80) { + r.push(`${He} can follow intermediate commands, so you order ${him} to present ${his} rear hole. ${He} obediently`); + if (hasAnyLegs(slave)) { + r.push(`bends over, arches ${his} back, and`); + } else { + r.push(`flips over and`); + } + r.push(`winks ${his} anus until you insert`); + if (V.PC.dick !== 0) { + r.push(`your cock.`); + } else { + r.push(`a strap-on.`); + } + } else { + r.push(`${He} can follow advanced commands, so you bring ${him} over to your chair`); + if (hasAnyLegs(slave)) { + r.push(`and order ${him} to squat down onto your`); + if (V.PC.dick !== 0) { + r.push(`cock`); + } else { + r.push(`strap-on`); + } + r.push(`and slide ${his} anus up and down`); + if (V.PC.dick !== 0) { + r.push(`your`); + } else { + r.push(`the`); + } + r.push(`shaft.`); + } else { + r.push(`and impale ${him} on`); + if (V.PC.dick !== 0) { + r.push(`your cock,`); + } else { + r.push(`your strap-on,`); + } + r.push(`ordering ${him} to do ${his} feeble best to bounce.`); + } + } + if (slave.fuckdoll <= 20) { + r.push(`${He}'s not fully used to having things suddenly forced up ${his} ass, so ${he} struggles, and ${his} sphincter spasms deliciously.`); + } else if (slave.fuckdoll <= 40) { + r.push(`Aware that ${he} is supposed to relax and accept anal rape, ${he} does ${his} best to accommodate the sodomy.`); + } else { + r.push(`You command ${him} to milk your`); + if (V.PC.dick !== 0) { + r.push(`cock`); + } else { + r.push(`strap-on`); + } + r.push(`with ${his} asshole, and ${he} obediently tightens ${his} sphincter against the invading phallus rhythmically.`); + } + if (slave.fuckdoll <= 60) { + if (slave.energy > 60) { + r.push(`Denied any other outlet for ${his} powerful sex drive, ${he} orgasms.`); + } + } else { + r.push(`Tuned to enjoy any use by total denial of all other stimulation, ${he} orgasms repeatedly as you fuck ${his} anus.`); + } + if (slave.voice === 0) { + r.push(`Though ${he} is mute, ${his} breath hisses loudly`); + if (slave.lips > 95) { + r.push(`past the lips of ${his} facepussy.`); + } else { + r.push(`through ${his} mouth insert.`); + } + } else { + r.push(`${He} moans,`); + if (slave.lips > 95) { + r.push(`and the lips of ${his} facepussy quiver.`); + } else { + r.push(`struggling to force the sound past ${his} mouth insert.`); + } + } + r.push(`You climax${(V.PC.dick !== 0) ? `, filling ${his} rectum with your cum,` : ``} and return ${him} to`); + if (hasAnyLegs(slave)) { + r.push(`a standing position.`); + } else { + r.push(`where ${he} was resting.`); + } + if (V.PC.dick !== 0) { + if (slave.anus > 2) { + r.push(`Your cum flows out of ${his} gaped rear hole and down the material of ${his} suit.`); + } else if (slave.anus === 2) { + r.push(`Your cum drips out of ${his} loosened rear hole and down the material of ${his} suit.`); + } else { + r.push(`${His} tight rear hole retains every drop of your cum.`); + } + if (canImpreg(slave, V.PC)) { + r.push(knockMeUp(slave, 5, 0, -1)); + } + r.push(`The Fuckdoll will be cleaned by another slave.`); + } + if (slave.anus === 0) { + if (slave.fetish !== "mindbroken") { + r.push(`As you return to your business, ${he} shakes slightly in place, and a few low moans come out of ${his} face hole. This is probably a reaction to losing ${his} anal virginity.`); + } else { + r.push(`${He} gives no external indication that ${he}'s aware that ${he}'s just lost ${his} anal virginity.`); + } + r.push(`In any case, <span class="virginity loss">${his} rear hole has been broken in.</span>`); + slave.anus = 1; + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/FFuckdollAnal.tw b/src/npc/interaction/FFuckdollAnal.tw deleted file mode 100644 index 76cb99324db3b9c2d3a88a99bd9c6727dd9f4327..0000000000000000000000000000000000000000 --- a/src/npc/interaction/FFuckdollAnal.tw +++ /dev/null @@ -1,51 +0,0 @@ -:: FFuckdollAnal [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> - -<<set getSlave($AS).counter.anal++, $analTotal++>> -You decide to use the Fuckdoll's <<if getSlave($AS).anus > 3>>gaping<<elseif getSlave($AS).anus == 3>>loose<<elseif getSlave($AS).anus == 2>>relaxed<<elseif getSlave($AS).anus == 1>>tight<</if>> rear hole. -<<if getSlave($AS).fuckdoll <= 10>> - Since $he is not well adapted to life as a living sex toy yet, $he won't respond to position commands. So, you simply <<if hasAnyLegs(getSlave($AS))>>walk over to $him<<else>>flip $him over<</if>> and ram <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>> up $his rear hole. -<<elseif getSlave($AS).fuckdoll <= 80>> - $He can follow intermediate commands, so you order $him to present $his rear hole. $He obediently <<if hasAnyLegs(getSlave($AS))>>bends over, arches $his back, and<<else>>flips over and<</if>> winks $his anus until you insert <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>>. -<<else>> - $He can follow advanced commands, so you bring $him over to your chair <<if hasAnyLegs(getSlave($AS))>>and order $him to squat down onto your <<if $PC.dick != 0>>cock<<else>>strap-on<</if>> and slide $his anus up and down <<if $PC.dick != 0>>your<<else>>the<</if>> shaft.<<else>>and impale $him on <<if $PC.dick != 0>>your cock<<else>>your strap-on<</if>>, ordering $him to do $his feeble best to bounce.<</if>> -<</if>> -<<if getSlave($AS).fuckdoll <= 20>> - $He's not fully used to having things suddenly forced up $his ass, so $he struggles, and $his sphincter spasms deliciously. -<<elseif getSlave($AS).fuckdoll <= 40>> - Aware that $he is supposed to relax and accept anal rape, $he does $his best to accommodate the sodomy. -<<else>> - You command $him to milk your <<if $PC.dick != 0>>cock<<else>>strap-on<</if>> with $his asshole, and $he obediently tightens $his sphincter against the invading phallus rhythmically. -<</if>> -<<if getSlave($AS).fuckdoll <= 60>> - <<if getSlave($AS).energy > 60>>Denied any other outlet for $his powerful sex drive, $he orgasms.<</if>> -<<else>> - Tuned to enjoy any use by total denial of all other stimulation, $he orgasms repeatedly as you fuck $his anus. -<</if>> -<<if getSlave($AS).voice == 0>> - Though $he is mute, $his breath hisses loudly <<if getSlave($AS).lips > 95>>past the lips of $his facepussy<<else>>through $his mouth insert<</if>>. -<<else>> - $He moans, <<if getSlave($AS).lips > 95>>and the lips of $his facepussy quiver<<else>>struggling to force the sound past $his mouth insert<</if>>. -<</if>> -You climax<<if $PC.dick != 0>>, filling $his rectum with your cum,<</if>> and return $him to <<if hasAnyLegs(getSlave($AS))>>a standing position<<else>>where $he was resting<</if>>. -<<if $PC.dick != 0>> - <<if getSlave($AS).anus > 2>>Your cum flows out of $his gaped rear hole and down the material of $his suit. - <<elseif getSlave($AS).anus == 2>>Your cum drips out of $his loosened rear hole and down the material of $his suit. - <<else>>$His tight rear hole retains every drop of your cum. - <</if>> - <<if canImpreg(getSlave($AS), $PC)>> - <<= knockMeUp(getSlave($AS), 5, 0, -1)>> - <</if>> - The Fuckdoll will be cleaned by another slave. -<</if>> -<<if getSlave($AS).anus == 0>> - <<if getSlave($AS).fetish != "mindbroken">> - As you return to your business, $he shakes slightly in place, and a few low moans come out of $his face hole. This is probably a reaction to losing $his anal virginity. - <<else>> - $He gives no external indication that $he's aware that $he's just lost $his anal virginity. - <</if>> - In any case, <span class="virginity loss">$his rear hole has been broken in.</span> - <<set getSlave($AS).anus = 1>> -<</if>> diff --git a/src/npc/interaction/FFuckdollImpreg.js b/src/npc/interaction/FFuckdollImpreg.js new file mode 100644 index 0000000000000000000000000000000000000000..035f2250ffa0a39bcfb79c2cc939ada3ad622785 --- /dev/null +++ b/src/npc/interaction/FFuckdollImpreg.js @@ -0,0 +1,183 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fFuckdollImpreg = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him + } = getPronouns(slave); + + addPartner(slave, -1); + const _bonus = random(6, 20); + + if (slave.mpreg === 1) { + slave.counter.anal += _bonus + 1; + V.analTotal += _bonus + 1; + } else { + slave.counter.vaginal += _bonus + 1; + V.vaginalTotal += _bonus + 1; + } + + r.push(`You decide to use the Fuckdoll's fertile womb to grow a child.`); + if (slave.fuckdoll <= 10) { + r.push(`Since ${he} is not well adapted to life as a living sex toy yet, ${he} won't respond to position commands. So, you simply`); + if (hasAnyLegs(slave)) { + r.push(`push ${him} down to lie on the couch`); + } else { + r.push(`set ${him} on your desk`); + } + r.push(`and shove`); + if (V.PC.dick !== 0) { + r.push(`your cock`); + } else { + r.push(`a strap-on`); + } + r.push(`inside ${his}`); + if (slave.mpreg === 1) { + r.push(`asshole.`); + } else { + r.push(`vagina.`); + } + } else if (slave.fuckdoll <= 70) { + r.push(`${He} can follow intermediate commands, so you order ${him} into a position for use of ${his}`); + if (slave.mpreg === 1) { + r.push(`rear`); + } else { + r.push(`front`); + } + r.push(`hole. ${He} obediently`); + if (hasAllLimbs(slave)) { + r.push(`gets down on all fours and`); + } + r.push(`cocks ${his} hips, offering ${his}`); + if (slave.mpreg === 1) { + r.push(`asspussy`); + } else { + r.push(`cunt`); + } + r.push(`until you insert your`); + if (V.PC.dick > 0) { + r.push(`cock`); + } else { + r.push(`strap-on`); + } + r.push(`into ${his}`); + if (slave.mpreg === 1) { + r.push(`winking`); + } else { + r.push(`wet`); + } + r.push(`channel.`); + } else { + r.push(`${He} can follow advanced commands, so you bring ${him} over to your chair`); + if (hasAnyLegs(slave)) { + r.push(`and order ${him} to squat down onto your cock and ride.`); + } else { + r.push(`and impale ${him} on your cock, ordering ${him} to do ${his} feeble best to bounce.`); + } + } + if (slave.fuckdoll <= 20) { + r.push(`${He}'s not fully used to being raped without warning, so ${he} struggles, ${his} muscles spasming delightfully.`); + } else if (slave.fuckdoll <= 40) { + r.push(`Aware that ${he} is supposed to relax and accept rape, ${he} does ${his} best to let you take ${him} without resistance.`); + } else { + r.push(`You command ${him} to milk your cock with ${his}`); + if (slave.mpreg === 1) { + r.push(`anal`); + } else { + r.push(`vaginal`); + } + r.push(`walls, and ${he} obediently starts to flex ${his} well-developed`); + if (slave.mpreg === 1) { + r.push(`cunt`); + } else { + r.push(`anal`); + } + r.push(`muscles, squeezing you from base to tip.`); + } + if (slave.fuckdoll <= 60) { + if (slave.energy > 40) { + r.push(`Denied any other outlet for ${his} healthy sex drive, ${he} orgasms.`); + } + } else { + r.push(`${He} orgasmed for the first time as you entered ${him}, and ${he} continues to do so as you fuck ${him}. ${He}'s perfectly tuned.`); + } + if (slave.voice === 0) { + r.push(`Though ${he} is mute, ${his} breath hisses loudly`); + if (slave.lips > 95) { + r.push(`past the lips of ${his} facepussy.`); + } else { + r.push(`through ${his} mouth insert.`); + } + } else { + r.push(`${He} moans,`); + if (slave.lips > 95) { + r.push(`and the lips of ${his} facepussy quiver.`); + } else { + r.push(`struggling to force the sound past ${his} mouth insert.`); + } + } + r.push(`You climax, your cum shooting forward to splash against ${his} womb, and return ${he} to`); + if (hasAnyLegs(slave)) { + r.push(`a standing position`); + } else { + r.push(`where ${he} was resting`); + } + r.push(`to allow your seed to find ${his} mark.`); + if (slave.mpreg === 1) { + if (slave.anus > 2) { + r.push(`Your cum flows out of ${his} gaping rear hole and down the material of ${his} suit.`); + } else if (slave.anus === 2) { + r.push(`Your cum drips out of ${his} well-fucked rear hole and down the material of ${his} suit.`); + } else { + r.push(`${His} tight rear hole retains almost every drop of your cum. A few escape and run down the material of ${his} suit.`); + } + r.push(`The Fuckdoll will be cleaned by another slave.`); + if (slave.anus === 0) { + if (slave.fetish !== "mindbroken") { + r.push(`As you return to your business, ${he} shakes slightly in place, and a few low moans come out of ${his} face hole. This is probably a reaction to losing ${his} anal virginity.`); + } else { + r.push(`${He} gives no external indication that ${he}'s aware that ${he}'s just lost ${his} virginity.`); + } + r.push(`In any case, <span class="virginity loss">${his} rear hole has been broken in.</span>`); + slave.anus = 1; + } + } else { + if (slave.vagina >= 10) { + r.push(`Your cum steadily flows from its prolapsed front hole and down the material of ${his} suit.`); + } else if (slave.vagina > 2) { + r.push(`Your cum flows out of ${his} gaping front hole and down the material of ${his} suit.`); + } else if (slave.vagina === 2) { + r.push(`Your cum drips out of ${his} well-fucked front hole and down the material of ${his} suit.`); + } else { + r.push(`${His} tight front hole retains almost every drop of your cum. A few escape and run down the material of ${his} suit.`); + } + r.push(`The Fuckdoll will be cleaned by another slave.`); + if (slave.vagina === 0) { + if (slave.fetish !== "mindbroken") { + r.push(`As you return to your business, ${he} shakes slightly in place, and a few low moans come out of ${his} face hole. This is probably a reaction to losing ${his} virginity.`); + } else { + r.push(`${He} gives no external indication that ${he}'s aware that ${he}'s just lost ${his} virginity.`); + } + r.push(`In any case, <span class="virginity loss">${his} front hole has been broken in.</span>`); + slave.vagina = 1; + } + } + + r.push(`You repeat this ritual throughout the week, ensuring that ${he} will be an <span class="pregnant">incubator for your child.</span>`); + knockMeUp(slave, 100, 2, -1); + + if (V.arcologies[0].FSRestart !== "unset" && V.eugenicsFullControl !== 1) { + if (slave.breedingMark !== 1 || V.propOutcome === 0) { + r.push(`Rumors spread about you knocking up your playthings; the Societal Elite are <span class="elites.loss"> very displeased</span> by these rumors.`); + V.failedElite += 5; + } + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/FFuckdollImpreg.tw b/src/npc/interaction/FFuckdollImpreg.tw deleted file mode 100644 index f521b5f02faf7a3e8bb4db2a115bbf112f463155..0000000000000000000000000000000000000000 --- a/src/npc/interaction/FFuckdollImpreg.tw +++ /dev/null @@ -1,87 +0,0 @@ -:: FFuckdollImpreg [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> -<<set _bonus = random(6,20)>> - -<<if getSlave($AS).mpreg == 1>> - <<set getSlave($AS).counter.anal += _bonus+1, $analTotal += _bonus+1>> -<<else>> - <<set getSlave($AS).counter.vaginal += _bonus+1, $vaginalTotal += _bonus+1>> -<</if>> - -You decide to use the Fuckdoll's fertile womb to grow a child. -<<if getSlave($AS).fuckdoll <= 10>> - Since $he is not well adapted to life as a living sex toy yet, $he won't respond to position commands. So, you simply <<if hasAnyLegs(getSlave($AS))>>push $him down to lie on the couch<<else>>set $him on your desk<</if>> and shove <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>> inside $his <<if getSlave($AS).mpreg == 1>>asshole<<else>>vagina<</if>>. -<<elseif getSlave($AS).fuckdoll <= 70>> - $He can follow intermediate commands, so you order $him into a position for use of $his <<if getSlave($AS).mpreg == 1>>rear<<else>>front<</if>> hole. $He obediently <<if hasAllLimbs(getSlave($AS))>>gets down on all fours and <</if>>cocks $his hips, offering $his <<if getSlave($AS).mpreg == 1>>asspussy<<else>>cunt<</if>> until you insert your - <<if $PC.dick > 0>> - cock - <<else>> - strap-on - <</if>> - into $his <<if getSlave($AS).mpreg == 1>>winking<<else>>wet<</if>> channel. -<<else>> - $He can follow advanced commands, so you bring $him over to your chair <<if hasAnyLegs(getSlave($AS))>>and order $him to squat down onto your cock and ride.<<else>>and impale $him on your cock, ordering $him to do $his feeble best to bounce.<</if>> -<</if>> -<<if getSlave($AS).fuckdoll <= 20>> - $He's not fully used to being raped without warning, so $he struggles, $his muscles spasming delightfully. -<<elseif getSlave($AS).fuckdoll <= 40>> - Aware that $he is supposed to relax and accept rape, $he does $his best to let you take $him without resistance. -<<else>> - You command $him to milk your cock with $his <<if getSlave($AS).mpreg == 1>>anal<<else>>vaginal<</if>> walls, and $he obediently starts to flex $his well-developed <<if getSlave($AS).mpreg == 1>>cunt<<else>>anal<</if>> muscles, squeezing you from base to tip. -<</if>> -<<if getSlave($AS).fuckdoll <= 60>> - <<if getSlave($AS).energy > 40>>Denied any other outlet for $his healthy sex drive, $he orgasms.<</if>> -<<else>> - $He orgasmed for the first time as you entered $him, and $he continues to do so as you fuck $him. $He's perfectly tuned. -<</if>> -<<if getSlave($AS).voice == 0>> - Though $he is mute, $his breath hisses loudly <<if getSlave($AS).lips > 95>>past the lips of $his facepussy<<else>>through $his mouth insert<</if>>. -<<else>> - $He moans, <<if getSlave($AS).lips > 95>>and the lips of $his facepussy quiver<<else>>struggling to force the sound past $his mouth insert<</if>>. -<</if>> -You climax, your cum shooting forward to splash against $his womb, and return $he to <<if hasAnyLegs(getSlave($AS))>>a standing position<<else>>where $he was resting<</if>> to allow your seed to find $his mark. -<<if getSlave($AS).mpreg == 1>> - <<if getSlave($AS).anus > 2>>Your cum flows out of $his gaping rear hole and down the material of $his suit. - <<elseif getSlave($AS).anus == 2>>Your cum drips out of $his well-fucked rear hole and down the material of $his suit. - <<else>>$His tight rear hole retains almost every drop of your cum. A few escape and run down the material of $his suit. - <</if>> - The Fuckdoll will be cleaned by another slave. - <<if getSlave($AS).anus == 0>> - <<if getSlave($AS).fetish != "mindbroken">> - As you return to your business, $he shakes slightly in place, and a few low moans come out of $his face hole. This is probably a reaction to losing $his anal virginity. - <<else>> - $He gives no external indication that $he's aware that $he's just lost $his virginity. - <</if>> - In any case, <span class="virginity loss">$his rear hole has been broken in.</span> - <<set getSlave($AS).anus = 1>> - <</if>> -<<else>> - <<if getSlave($AS).vagina >= 10>>Your cum steadily flows from its prolapsed front hole and down the material of $his suit. - <<elseif getSlave($AS).vagina > 2>>Your cum flows out of $his gaping front hole and down the material of $his suit. - <<elseif getSlave($AS).vagina == 2>>Your cum drips out of $his well-fucked front hole and down the material of $his suit. - <<else>>$His tight front hole retains almost every drop of your cum. A few escape and run down the material of $his suit. - <</if>> - The Fuckdoll will be cleaned by another slave. - <<if getSlave($AS).vagina == 0>> - <<if getSlave($AS).fetish != "mindbroken">> - As you return to your business, $he shakes slightly in place, and a few low moans come out of $his face hole. This is probably a reaction to losing $his virginity. - <<else>> - $He gives no external indication that $he's aware that $he's just lost $his virginity. - <</if>> - In any case, <span class="virginity loss">$his front hole has been broken in.</span> - <<set getSlave($AS).vagina = 1>> - <</if>> -<</if>> - -You repeat this ritual throughout the week, ensuring that $he will be an @@.pregnant;incubator for your child.@@ - -<<= knockMeUp(getSlave($AS), 100, 2, -1, 1)>> - -<<if $arcologies[0].FSRestart != "unset" && $eugenicsFullControl != 1>> - <<if getSlave($AS).breedingMark != 1 || $propOutcome == 0>> - Rumors spread about you knocking up your playthings; the Societal Elite are @@.elites.loss; very displeased@@ by these rumors. - <<set $failedElite += 5>> - <</if>> -<</if>> diff --git a/src/npc/interaction/FFuckdollOral.js b/src/npc/interaction/FFuckdollOral.js new file mode 100644 index 0000000000000000000000000000000000000000..6ea7b81106c0a8a205cb154e75ab682d4d3c80d1 --- /dev/null +++ b/src/npc/interaction/FFuckdollOral.js @@ -0,0 +1,103 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fFuckdollOral = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, + he, his, him + } = getPronouns(slave); + + addPartner(slave, -1); + + seX(slave, "oral", V.PC, "penetrative"); + r.push(`You decide to use the Fuckdoll's`); + if (slave.lips > 95) { + r.push(`facepussy.`); + } else { + r.push(`face hole.`); + } + if (slave.fuckdoll <= 10) { + r.push(`Since ${he} is not well adapted to life as a living sex toy yet, ${he} won't respond to position commands. So, you simply`); + if (hasBothLegs(slave)) { + r.push(`shove ${him} into a kneeling position`); + } else { + r.push(`set ${him} on the couch`); + } + r.push(`and straddle ${his} face.`); + } else if (slave.fuckdoll <= 80) { + r.push(`${He} can follow intermediate commands, so you order ${him} into a position for use of ${his} face hole. ${He} obediently`); + if (hasBothLegs(slave)) { + r.push(`gets to ${his} knees`); + } else { + r.push(`cranes ${his} neck up`); + } + r.push(`and sticks ${his} tongue out as far as it will go, wiggling it invitingly. You straddle ${his} face.`); + } else { + r.push(`${He} can follow advanced commands, so you order ${him} into a position for use of ${his} face hole. ${He} instantly`); + if (hasAnyLegs(slave)) { + if (V.PC.dick !== 0) { + r.push(`bends at the waist and turns ${his} head upward, placing ${his} throat horizontally and at waist height.`); + } else { + r.push(`gets to ${his} knees and turns ${his} head upward at just the right angle for a pussy to ride ${his} face hole.`); + } + } else { + r.push(`cranes ${his} neck up and sticks ${his} tongue out as far as it will go, wiggling it invitingly.`); + } + r.push(`You straddle ${his} face.`); + } + if (slave.fuckdoll <= 20) { + r.push(`${He}'s not fully used to being surprised with face rape, so ${he} struggles, and ${his} difficulty breathing`); + if (V.PC.dick !== 0) { + r.push(`makes ${his} throat spasm around your dickhead.`); + } else { + r.push(`feels lovely on your cunt.`); + } + } else if (slave.fuckdoll <= 50) { + r.push(`Aware that ${he} is supposed to relax and let you rape ${his} face, ${he} does ${his} best to let you`); + if (V.PC.dick !== 0) { + r.push(`fuck ${his} throat.`); + } else { + r.push(`ride ${his} face.`); + } + } else { + r.push(`You command ${him} to`); + if (V.PC.dick !== 0) { + r.push(`milk your dick, and ${he} begins to suck with almost frightening force.`); + } else { + r.push(`pleasure your cunt, and ${he} begins to eat you out with almost frightening hunger.`); + } + } + if (slave.fuckdoll <= 60) { + if (slave.energy > 80) { + r.push(`Denied any other outlet for ${his} extreme sex drive, ${he} orgasms from nothing more than oral stimulation.`); + } + } else { + r.push(`${He}'s so perfectly tuned that ${he} begins to orgasm from nothing more than oral stimulation, and ${he} continues to shiver with repeated orgasms as ${he} sucks.`); + } + r.push(`You climax,`); + if (V.PC.dick !== 0) { + r.push(`blowing your load down ${his} throat,`); + } else { + r.push(`giving ${him} a good amount of femcum to swallow,`); + } + r.push(`and return ${him} to`); + if (hasAnyLegs(slave)) { + r.push(`a standing position.`); + } else { + r.push(`where ${he} was resting.`); + } + if (V.PC.dick !== 0) { + if (slave.lips > 95) { + r.push(`${He} gives sloppy blowjobs, ${his} lips being too big for much control, and strings of your cum beribbon ${his} suit. The Fuckdoll will be cleaned by another slave.`); + } else { + r.push(`${He} swallows repeatedly as ${he} returns to ${his} resting posture.`); + } + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/FFuckdollOral.tw b/src/npc/interaction/FFuckdollOral.tw deleted file mode 100644 index b3c5da8aa7ceda5caaf36ed18a0c043f18a2b57a..0000000000000000000000000000000000000000 --- a/src/npc/interaction/FFuckdollOral.tw +++ /dev/null @@ -1,32 +0,0 @@ -:: FFuckdollOral [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> - -<<set getSlave($AS).counter.oral++, $oralTotal++>> -You decide to use the Fuckdoll's <<if getSlave($AS).lips > 95>>facepussy<<else>>face hole<</if>>. -<<if getSlave($AS).fuckdoll <= 10>> - Since $he is not well adapted to life as a living sex toy yet, $he won't respond to position commands. So, you simply <<if hasBothLegs(getSlave($AS))>>shove $him into a kneeling position<<else>>set $him on the couch<</if>> and straddle $his face. -<<elseif getSlave($AS).fuckdoll <= 80>> - $He can follow intermediate commands, so you order $him into a position for use of $his face hole. $He obediently <<if hasBothLegs(getSlave($AS))>>gets to $his knees<<else>>cranes $his neck up<</if>> and sticks $his tongue out as far as it will go, wiggling it invitingly. You straddle $his face. -<<else>> - $He can follow advanced commands, so you order $him into a position for use of $his face hole. $He instantly <<if hasAnyLegs(getSlave($AS))>><<if $PC.dick != 0>>bends at the waist and turns $his head upward, placing $his throat horizontally and at waist height.<<else>>gets to $his knees and turns $his head upward at just the right angle for a pussy to ride $his face hole.<</if>><<else>>cranes $his neck up and sticks $his tongue out as far as it will go, wiggling it invitingly.<</if>> You straddle $his face. -<</if>> -<<if getSlave($AS).fuckdoll <= 20>> - $He's not fully used to being surprised with face rape, so $he struggles, and $his difficulty breathing <<if $PC.dick != 0>>makes $his throat spasm around your dickhead<<else>>feels lovely on your cunt<</if>>. -<<elseif getSlave($AS).fuckdoll <= 50>> - Aware that $he is supposed to relax and let you rape $his face, $he does $his best to let you <<if $PC.dick != 0>>fuck $his throat<<else>>ride $his face<</if>>. -<<else>> - You command $him to <<if $PC.dick != 0>>milk your dick, and $he begins to suck with almost frightening force<<else>>pleasure your cunt, and $he begins to eat you out with almost frightening hunger<</if>>. -<</if>> -<<if getSlave($AS).fuckdoll <= 60>> - <<if getSlave($AS).energy > 80>>Denied any other outlet for $his extreme sex drive, $he orgasms from nothing more than oral stimulation.<</if>> -<<else>> - $He's so perfectly tuned that $he begins to orgasm from nothing more than oral stimulation, and $he continues to shiver with repeated orgasms as $he sucks. -<</if>> -You climax, <<if $PC.dick != 0>>blowing your load down $his throat<<else>>giving $him a good amount of femcum to swallow<</if>>, and return $him to <<if hasAnyLegs(getSlave($AS))>>a standing position<<else>>where $he was resting<</if>>. -<<if $PC.dick != 0>> - <<if getSlave($AS).lips > 95>>$He gives sloppy blowjobs, $his lips being too big for much control, and strings of your cum beribbon $his suit. The Fuckdoll will be cleaned by another slave. - <<else>>$He swallows repeatedly as $he returns to $his resting posture. - <</if>> -<</if>> diff --git a/src/npc/interaction/FFuckdollVaginal.js b/src/npc/interaction/FFuckdollVaginal.js new file mode 100644 index 0000000000000000000000000000000000000000..a4ad469a6d21bb78d11fd56989d9dc91f0b00413 --- /dev/null +++ b/src/npc/interaction/FFuckdollVaginal.js @@ -0,0 +1,148 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fFuckdollVaginal = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him + } = getPronouns(slave); + + addPartner(slave, -1); + + seX(slave, "vaginal", V.PC, "penetrative"); + r.push(`You decide to use the Fuckdoll's`); + if (slave.vagina > 3) { + r.push(`cavernous`); + } else if (slave.vagina === 3) { + r.push(`soft`); + } else if (slave.vagina === 2) { + r.push(`inviting`); + } else if (slave.vagina === 1) { + r.push(`tight`); + } + r.push(`front hole.`); + if (slave.fuckdoll <= 10) { + r.push(`Since ${he} is not well adapted to life as a living sex toy yet, ${he} won't respond to position commands. So, you simply`); + if (hasAnyLegs(slave)) { + r.push(`push ${him} down to lie on the couch`); + } else { + r.push(`set ${him} on your desk`); + } + r.push(`and shove`); + if (V.PC.dick !== 0) { + r.push(`your cock`); + } else { + r.push(`a strap-on`); + } + r.push(`inside ${his} vagina.`); + } else if (slave.fuckdoll <= 70) { + r.push(`${He} can follow intermediate commands, so you order ${him} into a position for use of ${his} front hole. ${He} obediently`); + if (hasAllLimbs(slave)) { + r.push(`gets down on all fours and`); + } else if (hasAnyLegs(slave)) { + r.push(`bends over and`); + } + r.push(`cocks ${his} hips, offering ${his} cunt until you insert`); + if (V.PC.dick !== 0) { + r.push(`your cock`); + } else { + r.push(`a strap-on`); + } + r.push(`into ${his} wet channel.`); + } else { + r.push(`${He} can follow advanced commands, so you bring ${him} over to your chair`); + if (hasAnyLegs(slave)) { + r.push(`and order ${him} to squat down onto your`); + if (V.PC.dick !== 0) { + r.push(`cock`); + } else { + r.push(`strap-on`); + } + r.push(`and ride.`); + } else { + r.push(`and impale ${him} on`); + if (V.PC.dick !== 0) { + r.push(`your cock,`); + } else { + r.push(`your strap-on,`); + } + r.push(`ordering ${him} to do ${his} feeble best to bounce.`); + } + } + if (slave.fuckdoll <= 20) { + r.push(`${He}'s not fully used to being raped without warning, so ${he} struggles, ${his} muscles spasming delightfully.`); + } else if (slave.fuckdoll <= 40) { + r.push(`Aware that ${he} is supposed to relax and accept rape, ${he} does ${his} best to let you take ${him} without resistance.`); + } else { + r.push(`You command ${him} to milk your`); + if (V.PC.dick !== 0) { + r.push(`cock`); + } else { + r.push(`strap-on`); + } + r.push(`with ${his} vaginal walls, and ${he} obediently starts to flex ${his} well-developed cunt muscles, squeezing`); + if (V.PC.dick !== 0) { + r.push(`you`); + } else { + r.push(`your strap-on`); + } + r.push(`from base to tip.`); + } + if (slave.fuckdoll <= 60) { + if (slave.energy > 40) { + r.push(`Denied any other outlet for ${his} healthy sex drive, ${he} orgasms.`); + } + } else { + r.push(`${He} orgasmed for the first time as you entered ${him}, and ${he} continues to do so as you fuck ${him}. ${He}'s perfectly tuned.`); + } + if (slave.voice === 0) { + r.push(`Though ${he} is mute, ${his} breath hisses loudly`); + if (slave.lips > 95) { + r.push(`past the lips of ${his} facepussy.`); + } else { + r.push(`through ${his} mouth insert.`); + } + } else { + r.push(`${He} moans,`); + if (slave.lips > 95) { + r.push(`and the lips of ${his} facepussy quiver.`); + } else { + r.push(`struggling to force the sound past ${his} mouth insert.`); + } + } + r.push(`You climax${(V.PC.dick !== 0) ? `, your cum shooting forward to splash against ${his} womb,` : ``} and return ${him} to`); + if (hasAnyLegs(slave)) { + r.push(`a standing position.`); + } else { + r.push(`where ${he} was resting.`); + } + if (V.PC.dick !== 0) { + if (slave.vagina > 2) { + r.push(`Your cum flows out of ${his} gaping front hole and down the material of ${his} suit.`); + } else if (slave.vagina === 2) { + r.push(`Your cum drips out of ${his} well-fucked front hole and down the material of ${his} suit.`); + } else { + r.push(`${His} tight front hole retains almost every drop of your cum. A few escape and run down the material of ${his} suit.`); + } + if (canImpreg(slave, V.PC)) { + r.push(knockMeUp(slave, 5, 1, -1)); + } + r.push(`The Fuckdoll will be cleaned by another slave.`); + } + if (slave.vagina === 0) { + if (slave.fetish !== "mindbroken") { + r.push(`As you return to your business, ${he} shakes slightly in place, and a few low moans come out of ${his} face hole. This is probably a reaction to losing ${his} virginity.`); + } else { + r.push(`${He} gives no external indication that ${he}'s aware that ${he}'s just lost ${his} virginity.`); + } + r.push(`In any case, <span class="lime">${his} front hole has been broken in.</span>`); + slave.vagina = 1; + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/FFuckdollVaginal.tw b/src/npc/interaction/FFuckdollVaginal.tw deleted file mode 100644 index 4c30c5c3372ec0dbb074a435c1e39695013232c1..0000000000000000000000000000000000000000 --- a/src/npc/interaction/FFuckdollVaginal.tw +++ /dev/null @@ -1,51 +0,0 @@ -:: FFuckdollVaginal [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> - -<<set getSlave($AS).counter.vaginal++, $vaginalTotal++>> -You decide to use the Fuckdoll's <<if getSlave($AS).vagina > 3>>cavernous<<elseif getSlave($AS).vagina == 3>>soft<<elseif getSlave($AS).vagina == 2>>inviting<<elseif getSlave($AS).vagina == 1>>tight<</if>> front hole. -<<if getSlave($AS).fuckdoll <= 10>> - Since $he is not well adapted to life as a living sex toy yet, $he won't respond to position commands. So, you simply <<if hasAnyLegs(getSlave($AS))>>push $him down to lie on the couch<<else>>set $him on your desk<</if>> and shove <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>> inside $his vagina. -<<elseif getSlave($AS).fuckdoll <= 70>> - $He can follow intermediate commands, so you order $him into a position for use of $his front hole. $He obediently <<if hasAllLimbs(getSlave($AS))>>gets down on all fours and <<elseif hasAnyLegs(getSlave($AS))>>bends over and <</if>>cocks $his hips, offering $his cunt until you insert <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>> into $his wet channel. -<<else>> - $He can follow advanced commands, so you bring $him over to your chair <<if hasAnyLegs(getSlave($AS))>>and order $him to squat down onto your <<if $PC.dick != 0>>cock<<else>>strap-on<</if>> and ride.<<else>>and impale $him on <<if $PC.dick != 0>>your cock<<else>>your strap-on<</if>>, ordering $him to do $his feeble best to bounce.<</if>> -<</if>> -<<if getSlave($AS).fuckdoll <= 20>> - $He's not fully used to being raped without warning, so $he struggles, $his muscles spasming delightfully. -<<elseif getSlave($AS).fuckdoll <= 40>> - Aware that $he is supposed to relax and accept rape, $he does $his best to let you take $him without resistance. -<<else>> - You command $him to milk your <<if $PC.dick != 0>>cock<<else>>strap-on<</if>> with $his vaginal walls, and $he obediently starts to flex $his well-developed cunt muscles, squeezing <<if $PC.dick != 0>>you<<else>>your strap-on<</if>> from base to tip. -<</if>> -<<if getSlave($AS).fuckdoll <= 60>> - <<if getSlave($AS).energy > 40>>Denied any other outlet for $his healthy sex drive, $he orgasms.<</if>> -<<else>> - $He orgasmed for the first time as you entered $him, and $he continues to do so as you fuck $him. $He's perfectly tuned. -<</if>> -<<if getSlave($AS).voice == 0>> - Though $he is mute, $his breath hisses loudly <<if getSlave($AS).lips > 95>>past the lips of $his facepussy<<else>>through $his mouth insert<</if>>. -<<else>> - $He moans, <<if getSlave($AS).lips > 95>>and the lips of $his facepussy quiver<<else>>struggling to force the sound past $his mouth insert<</if>>. -<</if>> -You climax<<if $PC.dick != 0>>, your cum shooting forward to splash against $his womb,<</if>> and return $him to <<if hasAnyLegs(getSlave($AS))>>a standing position<<else>>where $he was resting<</if>>. -<<if $PC.dick != 0>> - <<if getSlave($AS).vagina > 2>>Your cum flows out of $his gaping front hole and down the material of $his suit. - <<elseif getSlave($AS).vagina == 2>>Your cum drips out of $his well-fucked front hole and down the material of $his suit. - <<else>>$His tight front hole retains almost every drop of your cum. A few escape and run down the material of $his suit. - <</if>> - <<if canImpreg(getSlave($AS), $PC)>> - <<= knockMeUp(getSlave($AS), 5, 1, -1)>> - <</if>> - The Fuckdoll will be cleaned by another slave. -<</if>> -<<if getSlave($AS).vagina == 0>> - <<if getSlave($AS).fetish != "mindbroken">> - As you return to your business, $he shakes slightly in place, and a few low moans come out of $his face hole. This is probably a reaction to losing $his virginity. - <<else>> - $He gives no external indication that $he's aware that $he's just lost $his virginity. - <</if>> - In any case, @@.lime;$his front hole has been broken in.@@ - <<set getSlave($AS).vagina = 1>> -<</if>> diff --git a/src/npc/interaction/FSuckle.js b/src/npc/interaction/FSuckle.js new file mode 100644 index 0000000000000000000000000000000000000000..3d0dbf06544857277fe3cbf0d04bcb9841dcb3e9 --- /dev/null +++ b/src/npc/interaction/FSuckle.js @@ -0,0 +1,784 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fSuckle = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself + } = getPronouns(slave); + + addPartner(slave, -1); + + seX(slave, "mammary", V.PC, "oral"); + let _mood; + if (V.PC.pregMood === 0 || V.PC.preg < 28) { + _mood = 0; + } else if (V.PC.pregMood === 1) { + _mood = 1; + } else if (V.PC.pregMood === 2) { + _mood = 2; + } + + // still needed: breast implant support, nipple piercing support + + r.push(`You`); + if (_mood === 2) { + r.push(`demand`); + } else { + r.push(`beckon`); + } + r.push(`${slave.slaveName} to`); + if (!hasAnyLegs(slave)) { + r.push(`have another slave set ${him} on the floor close to you.`); + } else if (tooBigBreasts(slave)) { + r.push(`have another slave help ${him} heft ${his} tits so ${he} can take a seat on the floor close to you.`); + } else if (tooBigBelly(slave)) { + r.push(`have another slave help ${him} heft ${his} belly so ${he} can take a seat on the floor close to you.`); + } else if (tooBigButt(slave)) { + r.push(`have another slave help ${him} heft ${his} ass cheeks so ${he} can take a seat on the floor close to you.`); + } else if (tooBigDick(slave)) { + r.push(`have another slave help ${him} heft ${his} cock so ${he} can take a seat on the floor close to you.`); + } else if (tooBigBalls(slave)) { + r.push(`have another slave help ${him} heft ${his} balls so ${he} can take a seat on the floor close to you.`); + } else if (tooFatSlave(slave)) { + r.push(`have another slave help ${him} up so ${he} can take a seat on the floor close to you.`); + } else { + r.push(`to take a seat on the floor close to you.`); + } + + if (canMove(slave)) { + if (slave.fetish === "mindbroken") { + r.push(`${He} complies without a thought.`); + } else if (slave.devotion > 20 && slave.trust > 20) { + r.push(`${He} complies,`); + if (_mood === 2) { + r.push(`knowing full well what you want.`); + } else { + r.push(`giddy with anticipation of your plans for ${him}.`); + } + } else if (slave.trust < -20) { + r.push(`${He} hurriedly complies,`); + if (_mood === 2) { + r.push(`fearful of the sudden shift in your demeanor.`); + } else { + r.push(`aware of the consequences of disobedience.`); + } + } else if (slave.devotion < -20) { + if (_mood === 2) { + r.push(`${He} is shaken by your tone, knowing that disobedience may lead to even worse matters for ${him}; ${he} complies without any further hassle.`); + } else { + r.push(`${He} begrudgingly complies, not understanding your intentions, but knowing worse things await at ${his} disobedience.`); + } + } else { + if (_mood === 2) { + r.push(`${He} is a little afraid of your sudden demanding tone, but steels ${himself} for whatever punishment you wish to mete out to ${him}.`); + } else { + r.push(`Though hesitant, ${he} complies without question.`); + } + } + } else { + if (slave.fetish === "mindbroken") { + r.push(`${He} pays no attention as ${he} is carefully positioned for your use.`); + } else if (slave.devotion > 20 && slave.trust > 20) { + r.push(`Though ${he} has no agency over this,`); + if (_mood === 2) { + r.push(`${he} is somewhat confused by your sudden aggressive posture.`); + } else { + r.push(`${he} is visibly giddy with anticipation for your next course of action as ${he} is helped into position.`); + } + } else if (slave.trust < -20) { + if (_mood === 2) { + r.push(`${He} knows better than to struggle as ${he} is helped into position, though ${he} dreads what ${his} pregnant ${getWrittenTitle(slave)} has planned.`); + } else { + r.push(`${He} knows better than to struggle as ${he} is helped into position, well aware of the consequences it would bring.`); + } + } else if (slave.devotion < -20) { + r.push(`Though ${he} is rebellious,`); + if (_mood === 2) { + r.push(`seeing such a gravid person take such a predatory stance shakes ${him} and ${he} becomes more compliant.`); + } else { + r.push(`${his} inability to move and distaste for falling to the ground kept ${him} from giving ${his} help much trouble.`); + } + } else { + if (_mood === 2) { + r.push(`Though ${he} is frightened by your sudden aggressiveness, ${he} complies with ${his} helper as ${he} is positioned.`); + } else { + r.push(`Though hesitant, ${he} complies with ${his} helper as ${he} is positioned.`); + } + } + } + + if (slave.boobs >= 20000) { + r.push(`You`); + if (_mood === 1) { + r.push(`caress`); + } else { + r.push(`take note of`); + } + r.push(`${his} massive udders,`); + if (_mood === 2) { + if (slave.nipples === "puffy") { + r.push(`grabbing a puffy nipple, lifting it up and letting it drop back down with a loud plop and a spurt of milk. They are dripping with excess milk and the flurry of kicks in your middle tells you what you need to do.`); + } else if (slave.nipples === "inverted") { + r.push(`prying an inverted nipple out of one of them before letting it slip back down with a loud plop and a gush of milk. A strong kick tells you that you are to take some of that cream for yourself.`); + } else if (slave.nipples === "flat") { + r.push(`pinching a nubby nipple, eliciting a dribble of milk that causes you to lose your grip. A strong kick insists you wrap your lips around it and try your hardest to suck out some cream.`); + } else if (slave.nipples === "fuckable") { + r.push(`using two fingers to pry a nippleslit open before letting it slip shut with a moist plop. A strong kick tells you that something good is hiding in there that you'll need to work out.`); + } else { + r.push(`grabbing one by the nipple only to let it drop back down with a loud plop and a spurt of milk. A strong kick tells you that you are to take some of that cream for yourself.`); + } + } else { + r.push(`dripping with excess milk and resting on ${his} legs, the very spot you plan to make your own, but it will take finesse.`); + } + r.push(`You lift up ${his} hefty breasts and`); + if (V.PC.belly >= 10000) { + r.push(`gently lower yourself`); + } else { + r.push(`lie`); + } + r.push(`down on ${his} lap,`); + if (slave.belly >= 30000) { + if (slave.bellyPreg > 1000) { + r.push(`getting familiar with ${his} huge life-swollen baby bump and`); + } else { + r.push(`getting familiar with ${his} hugely swollen belly and`); + } + } else if (slave.belly >= 10000) { + if (slave.bellyPreg >= 8000) { + r.push(`beside ${his} baby bump and`); + } else if (slave.bellyImplant >= 8000) { + r.push(`beside the swollen orb that is ${his} stomach and`); + } else { + r.push(`beside the bloated container of ${slave.inflationType} that is ${his} middle and`); + } + } else if (slave.belly >= 1000) { + if (slave.bellyPreg >= 1000) { + r.push(`beside the life growing within ${him} and`); + } else if (slave.bellyImplant >= 1000) { + r.push(`beside the curve of ${his} stomach and`); + } else { + r.push(`beside the groaning container of ${slave.inflationType} within ${him} and`); + } + } else if (slave.weight > 95) { + r.push(`getting familiar with ${his} fat belly and`); + } + r.push(`letting go so that ${his} tits cover your face and`); + if (V.PC.belly >= 5000) { + r.push(`belly`); + } else { + r.push(`torso`); + } + r.push(`in heavenly softness, ${his}`); + if (slave.nipples !== "fuckable") { + if (slave.nipples === "puffy") { + r.push(`exceedingly soft nipple already brushing against your lips, covering your face with excess milk as if begging for you to empty ${him}.`); + } else if (slave.nipples === "inverted" || slave.nipples === "partially inverted") { + r.push(`internally curved nipple providing an inviting hole for you to tease out with your tongue.`); + } else if (slave.nipples === "flat") { + r.push(`coin-sized nipple brushing your lips, daring you to get a grip on it.`); + } else { + r.push(`overly exertive nipple already prodding at your mouth, as if begging to be suckled on.`); + } + r.push(`Though muffled, you`); + if (_mood === 2) { + r.push(`order ${him} to deal with`); + if (V.PC.dick !== 0) { + r.push(`the erect monster pressing uncomfortably against the underside of your belly.`); + } else { + r.push(`the needy hole leaking all over your floor.`); + } + if (slave.fetish === "mindbroken") { + r.push(`${He} obeys without question and mechanically begins to`); + if (V.PC.dick !== 0) { + r.push(`jerk you off.`); + } else { + r.push(`finger you.`); + } + } else if (slave.devotion >= -20) { + r.push(`This proves unnecessary as, before you finish speaking, ${he}`); + if (V.PC.dick !== 0) { + r.push(`wraps ${his} fingers around your needy cock`); + } else { + if (canSmell(slave)) { + r.push(`smells`); + } else { + r.push(`recognizes`); + } + r.push(`your arousal`); + } + r.push(`and begins to apply ${his} ministrations to take care of you${slave.nipples.endsWith("inverted") ? `, as the sensations to ${his} nipple add so much more to the already surrounding breastflesh` : ``}. You buck to ${his} touch, forcing ${him} to try and steady ${his} breasts as your baby bump jumps with life.`); + } else if (slave.trust < -20) { + r.push(`${He} begins to question your order, but quickly realizes that was a mistake as you grab ${his} hand and force it to your crotch. Hastily, ${he} begins to stroke`); + if (V.PC.dick !== 0) { + r.push(`your dick`); + } else { + r.push(`your pussy`); + } + r.push(`until reassured that ${he} is pleasing you from your lusty moans and thrusting. ${He} does ${his} best, hoping to not anger you further as ${he} presses`); + if (V.PC.dick !== 0) { + r.push(`the head`); + } else { + r.push(`your lower lips`); + } + r.push(`against ${his} nearby nipple.`); + } else { + r.push(`Though ${he} furrows ${his} brow, ${he} decides it's better to get it over with quickly and in ${his} hand before ${he} is pinned in a much more compromising position by your pregnancy. ${slave.slaveName} begins to`); + if (V.PC.dick !== 0) { + r.push(`tug at your penis, pressing the head against ${his} nearby nipple, hoping this doesn't`); + } else { + r.push(`finger your quivering pussy, rubbing ${his} thumb against your clit, hoping this won't`); + } + r.push(`take too long.`); + } + } else { + r.push(`instruct ${him} to use ${his} hand to appease the evident arousal between your legs.`); + if (slave.fetish === "mindbroken") { + r.push(`${He} obeys without question and mechanically begins to`); + if (V.PC.dick !== 0) { + r.push(`jerk you off.`); + } else { + r.push(`finger you.`); + } + } else if (slave.devotion >= -20) { + r.push(`This proves unnecessary as, before you finish speaking, ${he}`); + if (V.PC.dick !== 0) { + r.push(`notices your hardening penis`); + } else { + if (canSmell(slave)) { + r.push(`smells`); + } else { + r.push(`recognizes`); + } + r.push(`your arousal`); + } + r.push(`and begins to apply ${his} ministrations to take care of you${slave.nipples.endsWith("inverted") ? `, as the sensations to ${his} nipple add so much more to the already surrounding breastflesh` : ``}. You respond further with a positive "Mmmhmm~", which calms ${his} worries as ${he} works on pleasuring you as much as ${he} can with one hand.`); + } else if (slave.trust < -20) { + r.push(`${He} begins to question your order, but quickly realizes`); + if (V.PC.dick !== 0) { + r.push(`your penis is at full mast and prodding ${his} breastflesh.`); + } else { + r.push(`you're soaking wet and quivering with desire.`); + } + r.push(`Cautiously, ${he} begins to stroke`); + if (V.PC.dick !== 0) { + r.push(`it`); + } else { + r.push(`your pussy`); + } + r.push(`until reassured that ${he} is pleasing you with a positive "Mmmhmm~". ${He} does ${his} best, hoping to not anger you in any way or make a mistake as ${he} presses`); + if (V.PC.dick !== 0) { + r.push(`the head`); + } else { + r.push(`your lower lips`); + } + r.push(`against ${his} nearby nipple.`); + } else { + r.push(`Though ${he} furrows ${his} brow, ${he} decides it's better to get it over with quickly and in ${his} hand rather than any other hole or in worse circumstances. ${slave.slaveName} begins to`); + if (V.PC.dick !== 0) { + r.push(`tug at your hardened penis, pressing the head against ${his} nearby nipple, hoping this doesn't`); + } else { + r.push(`finger your quivering pussy, rubbing ${his} thumb against your clit, hoping this won't`); + } + r.push(`take too long.`); + } + } + } else { + r.push(`exotic nipple brushing across your lips, as if wanting to have your tongue inside it, while ${his} other nipple`); + if (_mood === 2) { + r.push(`brushes across your`); + if (V.PC.dick !== 0) { + r.push(`penis, just begging to be penetrated. You struggle to shift yourself in such a way to penetrate ${his} nipple, before finally managing to slip the tip into ${him}`); + } else { + r.push(`clit, as if begging to join in. You struggle to shift yourself to an angle where you could attach your sex to`); + } + r.push(`${his} nippleslit.`); + if (slave.fetish === "mindbroken") { + if (V.PC.dick !== 0) { + r.push(`${He} gasps in surprise as you force yourself all the way into ${him} and your gravid swell parts ${his} breasts.`); + } else { + r.push(`${He} fails to understand your efforts, leaving you humping against ${his} breast.`); + } + } else if (slave.devotion >= -20) { + r.push(`${He} gasps in surprise before understanding what you desire and begins to`); + if (V.PC.dick !== 0) { + r.push(`ease ${his} breast into consuming the rest of your length. ${He} fails to do so fast enough and you force yourself upwards, your gravid swell parting ${his} breasts as your cock delves into the depths of ${his} tits.`); + } else { + r.push(`jiggle ${his} breast in an attempt to add to your efforts.`); + } + } else if (slave.trust < -20) { + r.push(`${He} begins to question your intent, but quickly realizes your`); + if (V.PC.dick !== 0) { + r.push(`penis is entering ${his} breastpussy by force and the ${he}'d better get used to it.`); + } else { + r.push(`pussy is rubbing against ${his} nippleslit. ${He} begins to jiggle ${his} breast in an attempt to add to your efforts.`); + } + } else { + r.push(`Though ${he} furrows ${his} brow, ${he} decides it's better to get it over with quickly rather than in worse circumstances. ${slave.slaveName}`); + if (V.PC.dick !== 0) { + r.push(`shudders as the rest of your shaft forces its way into ${his} breastpussy,`); + } else { + r.push(`begins to jiggle ${his} breast in an attempt to get you off,`); + } + r.push(`hoping this doesn't take too long.`); + } + r.push(`You breathe in ${his} scent as you let out a moan, your ${(V.PC.pregType > 1) ? `children` : `child`} satisfied with the sensations of ${his} milky depths surrounding your crotch.`); + } else { + r.push(`brushes across your hardening`); + if (V.PC.dick !== 0) { + r.push(`penis, as if begging to be penetrated. You shift to angle yourself just right before thrusting your hips upwards, inserting the tip of your shaft into`); + } else { + r.push(`clit, as if begging to join in. You shift to angle yourself just right before thrusting your hips upwards in an attempt to attach your sex to`); + } + r.push(`${his} nippleslit.`); + if (slave.fetish === "mindbroken") { + if (V.PC.dick !== 0) { + r.push(`${He} gasps in surprise as you push all the way into ${him}.`); + } else { + r.push(`${He} fails to understand your efforts, leaving you rubbing yourself against ${his} breast.`); + } + } else if (slave.devotion >= -20) { + r.push(`${He} gasps in surprise before understanding what you desire and begins to`); + if (V.PC.dick !== 0) { + r.push(`ease ${his} breast into consuming the rest of your length.`); + } else { + r.push(`jiggle ${his} breast in an attempt to add to your efforts.`); + } + } else if (slave.trust < -20) { + r.push(`${He} begins to question your intent, but quickly realizes your`); + if (V.PC.dick !== 0) { + r.push(`penis is entering ${his} breastpussy one way or another and begins to ease it all the way in before you decide to force the matter.`); + } else { + r.push(`pussy is rubbing against ${his} nippleslit. ${He} begins to jiggle ${his} breast in an attempt to add to your efforts.`); + } + } else { + r.push(`Though ${he} furrows ${his} brow, ${he} decides it's better to get it over with quickly rather than in worse circumstances. ${slave.slaveName} begins to`); + if (V.PC.dick !== 0) { + r.push(`ease the rest of your shaft into ${his} breastpussy,`); + } else { + r.push(`jiggle ${his} breast in an attempt to get you off,`); + } + r.push(`hoping this doesn't take too long.`); + } + r.push(`You breathe in ${his} scent as you let out a sigh, content with the sensations of ${his} milky depths surrounding your crotch.`); + } + } + } else if (slave.boobs >= 2000) { + r.push(`You`); + if (_mood === 1) { + r.push(`caress`); + } else if (_mood === 2) { + r.push(`hungrily eye`); + } else { + r.push(`eye`); + } + r.push(`${his} ${slave.nipples} nipples,`); + if (slave.nipples === "puffy") { + if (_mood === 2) { + r.push(`gripping the nipple with your hand and squeezing hard enough to force out a spurt of milk. A flurry of kicks tells you that you are to take one of those swollen, dripping beauties and have a drink.`); + } else { + r.push(`swollen and dripping with excess milk and calling on your instincts to suckle on them.`); + } + } else if (slave.nipples === "inverted") { + if (_mood === 2) { + r.push(`poking it with your finger as deep as you can. The inviting hole keeps all the delicious milk locked up, your instincts insisting that you pry out the flavor for yourself. The kicking in your middle settles it, you're taking a drink whether or not ${his} nipples agree.`); + } else { + r.push(`the inviting hole keeping all the delicious milk locked up, your instincts insisting that you pry out the flavor for yourself.`); + } + } else if (slave.nipples === "flat") { + if (_mood === 2) { + r.push(`pinching the nipple with your fingertips and squeezing hard enough to force out some drops of milk. A flurry of kicks demands you wrap you lips around it and take what little milk hides within.`); + } else { + r.push(`swollen and dripping with excess milk and calling on your instincts to suck on them.`); + } + } else if (slave.nipples === "fuckable") { + if (_mood === 2) { + r.push(`using two fingers to penetrate and spread apart to appreciate the insides. They are dripping with excess milk and resemble a tiny pussy; a series of kicks insist that you have a taste${(V.PC.dick !== 0) ? `and a little stress relief` : ``}.`); + } else { + r.push(`dripping with excess milk and resembling a tiny pussy, your instincts doubly insisting that you have a taste.`); + } + } else { + if (_mood === 2) { + r.push(`pinching one between your thumb and forefinger with enough force to hurt. Excess milk drips from it as a rather forceful kick from your womb insists that you take your fill; you wouldn't mind a taste yourself.`); + } else { + r.push(`dripping with excess milk and calling on your instincts to suckle on them.`); + } + } + r.push(`Though you plan to sate those innate desires, you also plan to do so with finesse. You`); + if (V.PC.belly >= 10000) { + r.push(`gently lower yourself`); + } else { + r.push(`lay`); + } + r.push(`down on ${his} lap and`); + if (slave.nipples === "fuckable") { + r.push(`ease your head onto`); + } else { + r.push(`rest your head on`); + } + r.push(`${his} thigh,`); + if (slave.belly >= 30000) { + if (slave.bellyPreg > 1000) { + r.push(`the huge life-swollen orb that is ${his} middle brushing you and`); + } else { + r.push(`the hugely swollen orb that is ${his} middle brushing you and`); + } + } else if (slave.belly >= 10000) { + if (slave.bellyPreg >= 8000) { + r.push(`beside ${his} baby bump and`); + } else if (slave.bellyImplant >= 8000) { + r.push(`beside the swollen orb that is ${his} stomach and`); + } else { + r.push(`beside the bloated container of ${slave.inflationType} that is ${his} middle and`); + } + } else if (slave.belly >= 1000) { + if (slave.bellyPreg >= 1000) { + r.push(`beside the life growing within ${him} and`); + } else if (slave.bellyImplant >= 1000) { + r.push(`beside the curve of ${his} stomach and`); + } else { + r.push(`beside the groaning container of ${slave.inflationType} within ${him} and`); + } + } else if (slave.weight > 95) { + r.push(`getting familiar with ${his} fat belly as`); + } + r.push(`${his} over-productive bosoms dripping sweet cream on your face${(slave.nipples === "inverted") ? `, the milk waiting to be sucked from the tight inverted holes above you` : ``}${(V.PC.belly >= 10000) ? ` and your belly brushing the undersides of ${his} tits` : ``}. You`); + if (_mood === 2) { + r.push(`order ${him} to deal with`); + if (V.PC.dick !== 0) { + r.push(`the erect monster pressing uncomfortably against the underside of your belly.`); + } else { + r.push(`the needy hole leaking all over your floor.`); + } + } else { + r.push(`instruct ${him} to use ${his} hand to appease the evident arousal between your legs.`); + } + if (slave.fetish === "mindbroken") { + r.push(`${He} obeys without question and mechanically begins to`); + if (V.PC.dick !== 0) { + r.push(`jerk you off.`); + } else { + r.push(`finger you.`); + } + } else if (slave.devotion >= -20 || slave.trust < -20) { + if (V.PC.dick !== 0) { + r.push(`Though ${he} believes it would be better for you to use another of ${his} slew of pleasurable orifices, ${he} does not question your decision.`); + } else { + r.push(`${He} happily sets to work on your clit.`); + } + } else { + r.push(`Though ${he} furrows ${his} brow, ${he} decides it's better to get it over with quickly and in ${his} hand rather than any other hole or in worse circumstances. ${slave.slaveName} begins to`); + if (V.PC.dick !== 0) { + r.push(`tug at your hardened penis,`); + } else { + r.push(`stroke your quivering pussy as best as ${he} can,`); + } + r.push(`hoping this doesn't take too long.`); + } + } + + if (slave.fetish === "mindbroken") { + r.push(`You`); + if (_mood === 1) { + r.push(`struggle to lean forward and wrap your lips gently around a nipple,`); + } else { + r.push(`lurch forward and engulf a nipple with your lips,`); + } + r.push(`causing ${him} to shudder with arousal as the suction causes milk to gush into your mouth to sate your needs.`); + } else if (slave.devotion <= 20 || slave.trust < -20) { + r.push(`${He} braces ${himself} as you`); + if (_mood === 1) { + r.push(`struggle to lean forward and wrap your lips gently around a nipple,`); + } else { + r.push(`lurch forward and engulf a nipple with your lips,`); + } + r.push(`cringing as the suction causes milk to gush into your mouth to sate your needs.`); + } else { + r.push(`You`); + if (_mood === 1) { + r.push(`struggle to lean forward and wrap your lips gently around a nipple,`); + } else { + r.push(`lurch forward and engulf a nipple with your lips,`); + } + r.push(`causing ${him} to coo with delight`); + if (_mood === 1) { + r.push(`and support your head`); + } + r.push(`as the suction causes milk to gush into your mouth to sate your needs.`); + } + if (_mood === 2) { + r.push(`Your`); + if (V.PC.pregType > 1) { + r.push(`babies calm`); + } else { + r.push(`baby calms`); + } + r.push(`down as ${his} cream reaches your system.`); + } else if (_mood === 1) { + r.push(`Your`); + if (V.PC.pregType > 1) { + r.push(`babies kick`); + } else { + r.push(`baby kicks`); + } + r.push(`happily as you hug yourself closer to ${him}.`); + } else { + r.push(`You find yourself moaning at the delight of ${his} cream flowing into you.`); + if (V.PC.preg > 15) { + r.push(`A fluttering sensation in your womb tells you someone else also appreciates the drink.`); + } + } + + if (slave.boobs >= 20000) { + r.push(`Such sensations hasten your breath, making you take in more of ${his} womanly scent. You work with your lips and tongue to`); + if (slave.nipples === "inverted" || slave.nipples === "partially inverted") { + r.push(`tease out ${his} nipple and suckle with newfound gusto,`); + } else if (slave.nipples === "flat") { + r.push(`get a hold of ${his} nipple and suckle with newfound gusto,`); + } else if (slave.nipples === "fuckable") { + r.push(`explore the inner chambers of ${his} breasts and ease out more of ${his} cream in a lustful frenzy,`); + } else { + r.push(`ease out more of ${his} cream in a lustful frenzy,`); + } + r.push(`as though the rest of the world did not exist. It might as well not, given how the entirety of your upper body sees and feels nothing but ${his} mesmerizing mammaries and`); + if (slave.nipples === "puffy") { + r.push(`${his} soft nipple in your mouth, while your sex focuses on the soft hand diligently working it. You feverishly suckle on ${his} nipple as you thrash your tongue, your efforts rewarded with more milk.`); + } else if (slave.nipples === "flat") { + r.push(`${his} milky nub in your mouth, while your sex focuses on the soft hand diligently working it. You feverishly suck on ${his} nipple as you thrash your tongue, your efforts accidentally forcing you off with a wet pop, but you just latch back on like nothing happened.`); + } else if (slave.nipples === "inverted" || slave.nipples === "partially inverted") { + r.push(`${his} erect nipple in your mouth, while your sex focuses on the soft hand diligently working it. You feverishly suckle on ${his} nipple as you thrash your tongue, your efforts rewarded with more milk.`); + } else if (slave.nipples === "fuckable") { + r.push(`your sex feeling nothing but the wet`); + if (V.PC.dick !== 0) { + r.push(`insides of ${his} breast.`); + } else { + r.push(`lips of ${his} breastpussy.`); + } + r.push(`You feverishly thrash your tongue around inside of the bumpy enclosure, with each strong movement sending shivers through ${him}, forcing gasps, moans and milk out of ${him}.`); + } else { + r.push(`${his} milky nipple in your mouth, while your sex focuses on the soft hand diligently working it. You feverishly suckle on ${his} nipple as you thrash your tongue, your efforts rewarded with more milk.`); + } + r.push(`You would worry about drowning if it didn't taste good enough for you to suckle ever harder with each spurt.`); + } else if (slave.boobs >= 2000) { + r.push(`Such sensations bring your attention further to ${his} teat; as you`); + if (slave.nipples === "inverted") { + r.push(`tease ${his} nipple`); + } else if (slave.nipples === "fuckable") { + r.push(`explore the depths of ${his} inner breast`); + } else { + r.push(`roll and prod`); + } + r.push(`with your tongue, trying to get the most out of ${his} mammaries, you hasten ${his} breath and bring ${him} further pleasure${(slave.nipples === "inverted") ? `as it slowly hardens and leaves its inverted state` : ``}.`); + if (slave.nipples === "puffy") { + r.push(`You note the texture of ${his} nipple: soft, more so even than the rest of ${his} boob. Your constant efforts of sucking and tongueplay are rewarded`); + } else if (slave.nipples === "flat") { + r.push(`You take in the texture of ${his} nipple: hard and bumpy, just like the firm globe pulling it flat. Your constant efforts of sucking and tongueplay are rewarded`); + } else if (slave.nipples === "fuckable") { + r.push(`You feverishly thrash your tongue around in the bumpy enclosure, each strong movement sending shivers through ${him}, causing ${him} to gasp and moan, as well as rewarding you`); + } else if (slave.nipples !== "inverted") { + r.push(`You take in the texture of ${his} nipple: hard and bumpy, a stark contrast to the rest of ${his} boob — an undeniable ocean of softness. Your constant efforts of sucking and tongueplay are rewarded`); + } else { + r.push(`Your constant efforts of sucking and tongueplay are rewarded`); + } + r.push(`with more milk straight from the tap.`); + } + + r.push(`Milk continues to spill into your mouth as you suckle away at the`); + if (slave.nipples === "puffy") { + r.push(`softness,`); + } else if (slave.nipples === "flat") { + r.push(`swollen bulge,`); + } else if (slave.nipples === "inverted" || slave.nipples === "partially inverted") { + r.push(`erect hardness,`); + } else if (slave.nipples === "fuckable") { + r.push(`milky slit,`); + } else { + r.push(`hardness,`); + } + r.push(`relishing the delicious treat one could have only received from a mother's bosom; at least, so was the case before modern medicine decided to say something about it. Though it may as well be artificial, the act of breastfeeding continues to appease a fundamental emotional need that is arguably unique to the action.`); + if (_mood === 2) { + r.push(`It gives you undeniable emotional respite despite the mood caused by your pregnancy, even if it will only last as long as you stay with ${him}.`); + } else if (_mood === 1) { + r.push(`You can only hope ${he}'ll return the favor when you yourself become too heavy with milk.`); + } else if (V.PC.preg > 30) { + r.push(`You know that you'll soon have your own child`); + if (V.PC.pregType > 1) { + r.push(`ren`); + } + r.push(`to share this feeling with and deep down, you hope to enjoy it just as much as ${he} does.`); + } + + if (slave.boobs >= 20000) { + if (slave.nipples === "fuckable") { + r.push(`${He}`); + if (V.PC.dick !== 0) { + r.push(`holds ${his} breast and jiggles it in an attempt to compliment your thrusts, adding even more sensation alongside your own efforts. With the milk adding lubrication to the sensual hole of ${his} nipple and the enclosed nature of ${his} sopping wet breastpussy itself adding suction, it's like you were enveloped inside of a highly advanced cock milking machine, each bump sending thrums of pleasure as your dick brushed against them.`); + } else { + r.push(`held ${his} breast and jiggled it in an attempt to compliment your thrusts, adding more sensation to your own efforts. The milk adding wetness to the sensual hole of ${his} nipple and the nature of ${his} sopping wet breastpussy itself adding suction felt like you were being enveloped by a world class pussy pump, each movement adding more suction and wetness than the last.`); + } + } else { + r.push(`While you were busy suckling, ${he} was anything but idle, using ${his} hand as best as ${he} could to bring you the most pleasure ${he} is capable of. Though no lube was applied, ${his} ministrations were more than enough to take you to the knife's edge of orgasm more than once. In your`); + if (V.PC.dick !== 0) { + r.push(`already dazed state,`); + } else { + r.push(`lust addled haze,`); + } + r.push(`${his} fingers seem to send lightning along your nerves${(V.PC.dick !== 0) ? `; the tips brushing across your shaft to tickle its head make you thrust instinctively. ${His} tugs, gentle yet firm` : `. ${His} fingertips brush across your labia to tickle your clit, making you buck instinctively. ${His} strokes, gentle yet decisive`}, have an almost motherly feel to them. Such ministrations cannot help but prepare you to`); + if (V.PC.dick !== 0) { + r.push(`shoot your load`); + } else { + r.push(`come`); + } + r.push(`as hard as you can.`); + } + } else if (slave.boobs >= 2000) { + r.push(`While you were busy suckling, ${he} was anything but idle, using ${his} hand as best as ${he} could to bring you the most pleasure ${he} is is capable of. Though no lube was applied, ${his} ministrations were more than enough to take you to the knife's edge of orgasm more than once. ${His} hand continues to apply itself to your`); + if (V.PC.dick !== 0) { + r.push(`shaft, its fingertips brushing across your shaft to tickle its head and make you thrust instinctively. ${His} tugs,`); + } else { + r.push(`sex, ${his} fingertips seeming to send lightning along your nerves. As ${he} tickles your clit, you buck instinctively. ${His} strokes,`); + } + r.push(`gentle yet firm, have an almost motherly feel to them. Such ministrations cannot help but prepare you to`); + if (V.PC.dick !== 0) { + r.push(`shoot your load`); + } else { + r.push(`come`); + } + r.push(`as hard as you can.`); + } + + r.push(`The two of you put so much into seeking pleasure in the act that you both cum at once, ${his} great gasp coinciding with your`); + if (V.PC.dick !== 0) { + if (V.PC.balls >= 10) { + r.push(`flood`); + } else { + r.push(`jet`); + } + r.push(`of jizz flying`); + } else { + r.push(`own jet of pussy juice squirting`); + } + if (slave.boobs >= 20000 && slave.nipples === "fuckable") { + r.push(`into`); + } else { + r.push(`onto`); + } + r.push(`${his} other breast${(V.PC.dick !== 0 && V.PC.balls >= 10) ? `and backflowing hard from your sheer volume` : ``}. You release ${his} nipple with a loud pop and lick your lips in delight.`); + if (slave.boobs >= 20000 && slave.nipples === "fuckable") { + r.push(`Your`); + if (V.PC.dick !== 0) { + r.push(`dick slips out`); + } else { + r.push(`pussy separates`); + } + r.push(`from ${his} other breast with a delicate pop, followed by lewd dripping noises and the sight of`); + if (V.PC.dick !== 0) { + r.push(`semen`); + } else { + r.push(`girlcum`); + } + r.push(`and milk oozing from ${his}`); + if (V.PC.dick !== 0) { + r.push(`newly expanded hole.`); + } else { + r.push(`nippleslit.`); + } + } + if (_mood === 2) { + r.push(`For a moment, ${he} thought you were finished, but with your hormone fueled libido, ${he}'ll be feeling a lot more than sore nipples but the time you tire of ${his} touch.`); + } else if (_mood === 1) { + r.push(`You cuddle up against ${him}, holding close to ${him} as you snooze off your milky meal.`); + if (slave.fetish === "mindbroken") { + r.push(`${He} struggles in discomfort at your pregnant weight pinning ${him} down until ${he} manages to rouse your child`); + if (V.PC.pregType > 1) { + r.push(`ren`); + } + r.push(`and get you to move.`); + } else if (slave.devotion > 20 && slave.trust > 20) { + r.push(`${He} holds you close, gently caressing your head and pregnancy as you rest it off.`); + } else if (slave.trust < -20) { + r.push(`${He} freezes in fear, unsure of what to do other than let you rest.`); + } else if (slave.devotion < -20) { + r.push(`${He} groans at the weight leaning against ${him} and begrudgingly rests ${his} arm atop your pregnant bulge.`); + if (V.PC.pregSource === slave.ID) { + r.push(`${He} takes a moment to appreciate the size of your belly, knowing ${he} was the one that seeded you. ${He} admires ${his} work with pride.`); + } else { + r.push(`${He} knows ${he} has little choice but to put up with it.`); + } + } else { + r.push(`Though hesitant, ${he} carefully rubs the taut dome of your belly as you rest.`); + } + } + + if (slave.lactation > 0) { + slave.lactationDuration = 2; + slave.boobs -= slave.boobsMilk; + slave.boobsMilk = 0; + } + + r.push(`Once you`); + if (_mood === 1) { + r.push(`wake and slowly rise to your feet, you help ${him} clean up`); + } else { + r.push(`are done, you allow ${him} to clean up`); + } + switch (slave.assignment) { + case "work in the brothel": + r.push(`before returning ${his} lovely tits to the brothel.`); + break; + case "serve in the club": + r.push(`before resuming ${his} lovely bouncing in the club.`); + break; + case "work in the dairy": + r.push(`before returning to the dairy.`); + break; + case "work as a farmhand": + r.push(`to avoid tainting the food in ${V.farmyardName}.`); + break; + case "work as a servant": + r.push(`mostly to keep everything ${he} has to clean from getting any dirtier.`); + break; + case "work as a nanny": + r.push(`before heading back to take care of the children.`); + break; + case "whore": + r.push(`before returning to offering ${his} lovely tits for sale.`); + break; + case "serve the public": + r.push(`before returning to offering ${his} lovely tits for free.`); + break; + case "rest": + r.push(`before crawling back into bed.`); + break; + case "get milked": + r.push(`before resting until ${his} tits swell with milk again.`); + break; + case "be a servant": + r.push(`since ${his} chores didn't perform themselves while you enjoyed ${him}.`); + break; + case "please you": + r.push(`before returning to await your next use of ${his} body, as though nothing had happened.`); + break; + case "be a subordinate slave": + r.push(`though it's only a matter of time before another slave decides to play with ${his} tits.`); + break; + case "be your Head Girl": + r.push(`worried that ${his} charges got up to trouble while ${he} enjoyed ${his} ${getWrittenTitle(slave)}'s use.`); + break; + case "guard you": + r.push(`so ${he} can be fresh and ready for more sexual use even as ${he} guards your person.`); + break; + case "train slaves": + r.push(`before ${he} returns to teaching ${his} classes.`); + break; + default: + r.push(`before ${he} returns to ${slave.assignment}.`); + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/FSuckle.tw b/src/npc/interaction/FSuckle.tw deleted file mode 100644 index 7ccb414b304624cc305af5e40dfce7111baad972..0000000000000000000000000000000000000000 --- a/src/npc/interaction/FSuckle.tw +++ /dev/null @@ -1,459 +0,0 @@ -:: FSuckle [nobr no-history] - -<<run Enunciate(getSlave($AS))>> -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> - -<<set getSlave($AS).counter.mammary++>> -<<set $mammaryTotal++>> -<<if $PC.pregMood == 0 || $PC.preg < 28>> - <<set _mood = 0>> -<<elseif $PC.pregMood == 1>> - <<set _mood = 1>> -<<elseif $PC.pregMood == 2>> - <<set _mood = 2>> -<</if>> - -/* still needed: breast implant support, nipple piercing support */ - -You <<if _mood == 2>>demand<<else>>beckon<</if>> <<= getSlave($AS).slaveName>> to -<<if (!hasAnyLegs(getSlave($AS)))>> - have another slave set $him on the floor close to you. -<<elseif tooBigBreasts(getSlave($AS))>> - have another slave help $him heft $his tits so $he can take a seat on the floor close to you. -<<elseif tooBigBelly(getSlave($AS))>> - have another slave help $him heft $his belly so $he can take a seat on the floor close to you. -<<elseif tooBigButt(getSlave($AS))>> - have another slave help $him heft $his ass cheeks so $he can take a seat on the floor close to you. -<<elseif tooBigDick(getSlave($AS))>> - have another slave help $him heft $his cock so $he can take a seat on the floor close to you. -<<elseif tooBigBalls(getSlave($AS))>> - have another slave help $him heft $his balls so $he can take a seat on the floor close to you. -<<elseif tooFatSlave(getSlave($AS))>> - have another slave help $him up so $he can take a seat on the floor close to you. -<<else>> - to take a seat on the floor close to you. -<</if>> - -<<if canMove(getSlave($AS))>> - <<if getSlave($AS).fetish == "mindbroken">> - $He complies without a thought. - <<elseif getSlave($AS).devotion > 20 && getSlave($AS).trust > 20>> - $He complies, - <<if _mood == 2>> - knowing full well what you want. - <<else>> - giddy with anticipation of your plans for $him. - <</if>> - <<elseif getSlave($AS).trust < -20>> - $He hurriedly complies, - <<if _mood == 2>> - fearful of the sudden shift in your demeanor. - <<else>> - aware of the consequences of disobedience. - <</if>> - <<elseif getSlave($AS).devotion < -20>> - <<if _mood == 2>> - $He is shaken by your tone, knowing that disobedience may lead to even worse matters for $him; $he complies without any further hassle. - <<else>> - $He begrudgingly complies, not understanding your intentions, but knowing worse things await at $his disobedience. - <</if>> - <<else>> - <<if _mood == 2>> - $He is a little afraid of your sudden demanding tone, but steels $himself for whatever punishment you wish to mete out to $him. - <<else>> - Though hesitant, $he complies without question. - <</if>> - <</if>> -<<else>> - <<if getSlave($AS).fetish == "mindbroken">> - $He pays no attention as $he is carefully positioned for your use. - <<elseif getSlave($AS).devotion > 20 && getSlave($AS).trust > 20>> - Though $he has no agency over this, - <<if _mood == 2>> - $he is somewhat confused by your sudden aggressive posture. - <<else>> - $he is visibly giddy with anticipation for your next course of action as $he is helped into position. - <</if>> - <<elseif getSlave($AS).trust < -20>> - <<if _mood == 2>> - $He knows better than to struggle as $he is helped into position, though $he dreads what $his pregnant <<= getWrittenTitle(getSlave($AS))>> has planned. - <<else>> - $He knows better than to struggle as $he is helped into position, well aware of the consequences it would bring. - <</if>> - <<elseif getSlave($AS).devotion < -20>> - Though $he is rebellious, - <<if _mood == 2>> - seeing such a gravid person take such a predatory stance shakes $him and $he becomes more compliant. - <<else>> - $his inability to move and distaste for falling to the ground kept $him from giving $his help much trouble. - <</if>> - <<else>> - <<if _mood == 2>> - Though $he is frightened by your sudden aggressiveness, $he complies with $his helper as $he is positioned. - <<else>> - Though hesitant, $he complies with $his helper as $he is positioned. - <</if>> - <</if>> -<</if>> - -<<if getSlave($AS).boobs >= 20000>> - You <<if _mood == 1>>caress<<else>>take note of<</if>> $his massive udders, - <<if _mood == 2>> - <<if getSlave($AS).nipples == "puffy">> - grabbing a puffy nipple, lifting it up and letting it drop back down with a loud plop and a spurt of milk. They are dripping with excess milk and the flurry of kicks in your middle tells you what you need to do. - <<elseif getSlave($AS).nipples == "inverted">> - prying an inverted nipple out of one of them before letting it slip back down with a loud plop and a gush of milk. A strong kick tells you that you are to take some of that cream for yourself. - <<elseif getSlave($AS).nipples == "flat">> - pinching a nubby nipple, eliciting a dribble of milk that causes you to lose your grip. A strong kick insists you wrap your lips around it and try your hardest to suck out some cream. - <<elseif getSlave($AS).nipples == "fuckable">> - using two fingers to pry a nippleslit open before letting it slip shut with a moist plop. A strong kick tells you that something good is hiding in there that you'll need to work out. - <<else>> - grabbing one by the nipple only to let it drop back down with a loud plop and a spurt of milk. A strong kick tells you that you are to take some of that cream for yourself. - <</if>> - <<else>> - dripping with excess milk and resting on $his legs, the very spot you plan to make your own, but it will take finesse. - <</if>> - You lift up $his hefty breasts and <<if $PC.belly >= 10000>>gently lower yourself<<else>>lie<</if>> down on $his lap, - <<if getSlave($AS).belly >= 30000>> - <<if getSlave($AS).bellyPreg > 1000>> - getting familiar with $his huge life-swollen baby bump and - <<else>> - getting familiar with $his hugely swollen belly and - <</if>> - <<elseif getSlave($AS).belly >= 10000>> - <<if getSlave($AS).bellyPreg >= 8000>> - beside $his baby bump and - <<elseif getSlave($AS).bellyImplant >= 8000>> - beside the swollen orb that is $his stomach and - <<else>> - beside the bloated container of <<= getSlave($AS).inflationType>> that is $his middle and - <</if>> - <<elseif getSlave($AS).belly >= 1000>> - <<if getSlave($AS).bellyPreg >= 1000>> - beside the life growing within $him and - <<elseif getSlave($AS).bellyImplant >= 1000>> - beside the curve of $his stomach and - <<else>> - beside the groaning container of <<= getSlave($AS).inflationType>> within $him and - <</if>> - <<elseif getSlave($AS).weight > 95>> - getting familiar with $his fat belly and - <</if>> - letting go so that $his tits cover your face and <<if $PC.belly >= 5000>>belly<<else>>torso<</if>> in heavenly softness, $his - <<if getSlave($AS).nipples != "fuckable">> - <<if getSlave($AS).nipples == "puffy">> - exceedingly soft nipple already brushing against your lips, covering your face with excess milk as if begging for you to empty $him. - <<elseif getSlave($AS).nipples == "inverted" || getSlave($AS).nipples == "partially inverted">> - internally curved nipple providing an inviting hole for you to tease out with your tongue. - <<elseif getSlave($AS).nipples == "flat">> - coin-sized nipple brushing your lips, daring you to get a grip on it. - <<else>> - overly exertive nipple already prodding at your mouth, as if begging to be suckled on. - <</if>> - Though muffled, you - <<if _mood == 2>> - order $him to deal with <<if $PC.dick != 0>>the erect monster pressing uncomfortably against the underside of your belly<<else>>the needy hole leaking all over your floor<</if>>. - <<if getSlave($AS).fetish == "mindbroken">> - $He obeys without question and mechanically begins to <<if $PC.dick != 0>>jerk you off<<else>>finger you<</if>>. - <<elseif getSlave($AS).devotion >= -20>> - This proves unnecessary as, before you finish speaking, $he <<if $PC.dick != 0>>wraps $his fingers around your needy cock<<else>><<if canSmell(getSlave($AS))>>smells<<else>>recognizes<</if>> your arousal<</if>> and begins to apply $his ministrations to take care of you<<if getSlave($AS).nipples == "inverted" || getSlave($AS).nipples == "partially inverted">>, as the sensations to $his nipple add so much more to the already surrounding breastflesh<</if>>. You buck to $his touch, forcing $him to try and steady $his breasts as your baby bump jumps with life. - <<elseif getSlave($AS).trust < -20>> - $He begins to question your order, but quickly realizes that was a mistake as you grab $his hand and force it to your crotch. Hastily, $he begins to stroke <<if $PC.dick != 0>>your dick<<else>>your pussy<</if>> until reassured that $he is pleasing you from your lusty moans and thrusting. $He does $his best, hoping to not anger you further as $he presses <<if $PC.dick != 0>>the head<<else>>your lower lips<</if>> against $his nearby nipple. - <<else>> - Though $he furrows $his brow, $he decides it's better to get it over with quickly and in $his hand before $he is pinned in a much more compromising position by your pregnancy. <<= getSlave($AS).slaveName>> begins to <<if $PC.dick != 0>>tug at your penis, pressing the head against $his nearby nipple, hoping this doesn't<<else>>finger your quivering pussy, rubbing $his thumb against your clit, hoping this won't<</if>> take too long. - <</if>> - <<else>> - instruct $him to use $his hand to appease the evident arousal between your legs. - <<if getSlave($AS).fetish == "mindbroken">> - $He obeys without question and mechanically begins to <<if $PC.dick != 0>>jerk you off<<else>>finger you<</if>>. - <<elseif getSlave($AS).devotion >= -20>> - This proves unnecessary as, before you finish speaking, $he <<if $PC.dick != 0>>notices your hardening penis<<else>><<if canSmell(getSlave($AS))>>smells<<else>>recognizes<</if>> your arousal<</if>> and begins to apply $his ministrations to take care of you<<if getSlave($AS).nipples == "inverted" || getSlave($AS).nipples == "partially inverted">>, as the sensations to $his nipple add so much more to the already surrounding breastflesh<</if>>. You respond further with a positive "Mmmhmm~", which calms $his worries as $he works on pleasuring you as much as $he can with one hand. - <<elseif getSlave($AS).trust < -20>> - $He begins to question your order, but quickly realizes <<if $PC.dick != 0>>your penis is at full mast and prodding $his breastflesh<<else>>you're soaking wet and quivering with desire<</if>>. Cautiously, $he begins to stroke <<if $PC.dick != 0>>it<<else>>your pussy<</if>> until reassured that $he is pleasing you with a positive "Mmmhmm~". $He does $his best, hoping to not anger you in any way or make a mistake as $he presses <<if $PC.dick != 0>>the head<<else>>your lower lips<</if>> against $his nearby nipple. - <<else>> - Though $he furrows $his brow, $he decides it's better to get it over with quickly and in $his hand rather than any other hole or in worse circumstances. <<= getSlave($AS).slaveName>> begins to <<if $PC.dick != 0>>tug at your hardened penis, pressing the head against $his nearby nipple, hoping this doesn't<<else>>finger your quivering pussy, rubbing $his thumb against your clit, hoping this won't<</if>> take too long. - <</if>> - <</if>> - <<else>> - exotic nipple brushing across your lips, as if wanting to have your tongue inside it, while $his other nipple - <<if _mood == 2>> - brushes across your <<if $PC.dick != 0>>penis, just begging to be penetrated. You struggle to shift yourself in such a way to penetrate $his nipple, before finally managing to slip the tip into $him<<else>>clit, as if begging to join in. You struggle to shift yourself to an angle where you could attach your sex to<</if>> $his nippleslit. - <<if getSlave($AS).fetish == "mindbroken">> - <<if $PC.dick != 0>>$He gasps in surprise as you force yourself all the way into $him and your gravid swell parts $his breasts.<<else>>$He fails to understand your efforts, leaving you humping against $his breast.<</if>> - <<elseif getSlave($AS).devotion >= -20>> - $He gasps in surprise before understanding what you desire and begins to <<if $PC.dick != 0>>ease $his breast into consuming the rest of your length. $He fails to do so fast enough and you force yourself upwards, your gravid swell parting $his breasts as your cock delves into the depths of $his tits<<else>>jiggle $his breast in an attempt to add to your efforts<</if>>. - <<elseif getSlave($AS).trust < -20>> - $He begins to question your intent, but quickly realizes your <<if $PC.dick != 0>>penis is entering $his breastpussy by force and the $he'd better get used to it<<else>>pussy is rubbing against $his nippleslit. $He begins to jiggle $his breast in an attempt to add to your efforts<</if>>. - <<else>> - Though $he furrows $his brow, $he decides it's better to get it over with quickly rather than in worse circumstances. <<= getSlave($AS).slaveName>> <<if $PC.dick != 0>>shudders as the rest of your shaft forces its way into $his breastpussy<<else>>begins to jiggle $his breast in an attempt to get you off<</if>>, hoping this doesn't take too long. - <</if>> - You breathe in $his scent as you let out a moan, your child<<if $PC.pregType > 1>>ren<</if>> satisfied with the sensations of $his milky depths surrounding your crotch. - <<else>> - brushes across your hardening <<if $PC.dick != 0>>penis, as if begging to be penetrated. You shift to angle yourself just right before thrusting your hips upwards, inserting the tip of your shaft into<<else>>clit, as if begging to join in. You shift to angle yourself just right before thrusting your hips upwards in an attempt to attach your sex to<</if>> $his nippleslit. - <<if getSlave($AS).fetish == "mindbroken">> - <<if $PC.dick != 0>>$He gasps in surprise as you push all the way into $him.<<else>>$He fails to understand your efforts, leaving you rubbing yourself against $his breast.<</if>> - <<elseif getSlave($AS).devotion >= -20>> - $He gasps in surprise before understanding what you desire and begins to <<if $PC.dick != 0>>ease $his breast into consuming the rest of your length<<else>>jiggle $his breast in an attempt to add to your efforts<</if>>. - <<elseif getSlave($AS).trust < -20>> - $He begins to question your intent, but quickly realizes your <<if $PC.dick != 0>>penis is entering $his breastpussy one way or another and begins to ease it all the way in before you decide to force the matter<<else>>pussy is rubbing against $his nippleslit. $He begins to jiggle $his breast in an attempt to add to your efforts<</if>>. - <<else>> - Though $he furrows $his brow, $he decides it's better to get it over with quickly rather than in worse circumstances. <<= getSlave($AS).slaveName>> begins to <<if $PC.dick != 0>>ease the rest of your shaft into $his breastpussy<<else>>jiggle $his breast in an attempt to get you off<</if>>, hoping this doesn't take too long. - <</if>> - You breathe in $his scent as you let out a sigh, content with the sensations of $his milky depths surrounding your crotch. - <</if>> - <</if>> -<<elseif getSlave($AS).boobs >= 2000>> - You <<if _mood == 1>>caress<<elseif _mood == 2>>hungrily eye<<else>>eye<</if>> $his <<= getSlave($AS).nipples>> nipples, - <<if getSlave($AS).nipples == "puffy">> - <<if _mood == 2>> - gripping the nipple with your hand and squeezing hard enough to force out a spurt of milk. A flurry of kicks tells you that you are to take one of those swollen, dripping beauties and have a drink. - <<else>> - swollen and dripping with excess milk and calling on your instincts to suckle on them. - <</if>> - <<elseif getSlave($AS).nipples == "inverted">> - <<if _mood == 2>> - poking it with your finger as deep as you can. The inviting hole keeps all the delicious milk locked up, your instincts insisting that you pry out the flavor for yourself. The kicking in your middle settles it, you're taking a drink whether or not $his nipples agree. - <<else>> - the inviting hole keeping all the delicious milk locked up, your instincts insisting that you pry out the flavor for yourself. - <</if>> - <<elseif getSlave($AS).nipples == "flat">> - <<if _mood == 2>> - pinching the nipple with your fingertips and squeezing hard enough to force out some drops of milk. A flurry of kicks demands you wrap you lips around it and take what little milk hides within. - <<else>> - swollen and dripping with excess milk and calling on your instincts to suck on them. - <</if>> - <<elseif getSlave($AS).nipples == "fuckable">> - <<if _mood == 2>> - using two fingers to penetrate and spread apart to appreciate the insides. They are dripping with excess milk and resemble a tiny pussy; a series of kicks insist that you have a taste<<if $PC.dick != 0>> and a little stress relief<</if>>. - <<else>> - dripping with excess milk and resembling a tiny pussy, your instincts doubly insisting that you have a taste. - <</if>> - <<else>> - <<if _mood == 2>> - pinching one between your thumb and forefinger with enough force to hurt. Excess milk drips from it as a rather forceful kick from your womb insists that you take your fill; you wouldn't mind a taste yourself. - <<else>> - dripping with excess milk and calling on your instincts to suckle on them. - <</if>> - <</if>> - Though you plan to sate those innate desires, you also plan to do so with finesse. You <<if $PC.belly >= 10000>>gently lower yourself<<else>>lay<</if>> down on $his lap and - <<if getSlave($AS).nipples == "fuckable">> - ease your head onto - <<else>> - rest your head on - <</if>> - $his thigh, - <<if getSlave($AS).belly >= 30000>> - <<if getSlave($AS).bellyPreg > 1000>> - the huge life-swollen orb that is $his middle brushing you and - <<else>> - the hugely swollen orb that is $his middle brushing you and - <</if>> - <<elseif getSlave($AS).belly >= 10000>> - <<if getSlave($AS).bellyPreg >= 8000>> - beside $his baby bump and - <<elseif getSlave($AS).bellyImplant >= 8000>> - beside the swollen orb that is $his stomach and - <<else>> - beside the bloated container of <<= getSlave($AS).inflationType>> that is $his middle and - <</if>> - <<elseif getSlave($AS).belly >= 1000>> - <<if getSlave($AS).bellyPreg >= 1000>> - beside the life growing within $him and - <<elseif getSlave($AS).bellyImplant >= 1000>> - beside the curve of $his stomach and - <<else>> - beside the groaning container of <<= getSlave($AS).inflationType>> within $him and - <</if>> - <<elseif getSlave($AS).weight > 95>> - getting familiar with $his fat belly as - <</if>> - $his over-productive bosoms dripping sweet cream on your face<<if getSlave($AS).nipples == "inverted">>, the milk waiting to be sucked from the tight inverted holes above you<</if>><<if $PC.belly >= 10000>> and your belly brushing the undersides of $his tits<</if>>. You - <<if _mood == 2>> - order $him to deal with <<if $PC.dick != 0>>the erect monster pressing uncomfortably against the underside of your belly<<else>>the needy hole leaking all over your floor<</if>>. - <<else>> - instruct $him to use $his hand to appease the evident arousal between your legs. - <</if>> - <<if getSlave($AS).fetish == "mindbroken">> - $He obeys without question and mechanically begins to <<if $PC.dick != 0>>jerk you off<<else>>finger you<</if>>. - <<elseif getSlave($AS).devotion >= -20 || getSlave($AS).trust < -20>> - <<if $PC.dick != 0>>Though $he believes it would be better for you to use another of $his slew of pleasurable orifices, $he does not question your decision<<else>>$He happily sets to work on your clit<</if>>. - <<else>> - Though $he furrows $his brow, $he decides it's better to get it over with quickly and in $his hand rather than any other hole or in worse circumstances. <<= getSlave($AS).slaveName>> begins to <<if $PC.dick != 0>>tug at your hardened penis<<else>>stroke your quivering pussy as best as $he can<</if>>, hoping this doesn't take too long. - <</if>> -<</if>> - -<<if getSlave($AS).fetish == "mindbroken">> - You <<if _mood == 1>>struggle to lean forward and wrap your lips gently around a nipple<<else>>lurch forward and engulf a nipple with your lips<</if>>, causing $him to shudder with arousal as the suction causes milk to gush into your mouth to sate your needs. -<<elseif getSlave($AS).devotion <= 20 || getSlave($AS).trust < -20>> - $He braces $himself as you <<if _mood == 1>>struggle to lean forward and wrap your lips gently around a nipple<<else>>lurch forward and engulf a nipple with your lips<</if>>, cringing as the suction causes milk to gush into your mouth to sate your needs. -<<else>> - You <<if _mood == 1>>struggle to lean forward and wrap your lips gently around a nipple<<else>>lurch forward and engulf a nipple with your lips<</if>>, causing $him to coo with delight<<if _mood == 1>> and support your head<</if>> as the suction causes milk to gush into your mouth to sate your needs. -<</if>> -<<if _mood == 2>> - Your <<if $PC.pregType > 1>>babies calm<<else>>baby calms<</if>> down as $his cream reaches your system. -<<elseif _mood == 1>> - Your <<if $PC.pregType > 1>>babies kick<<else>>baby kicks<</if>> happily as you hug yourself closer to $him. -<<else>> - You find yourself moaning at the delight of $his cream flowing into you. - <<if $PC.preg > 15>> A fluttering sensation in your womb tells you someone else also appreciates the drink.<</if>> -<</if>> - -<<if getSlave($AS).boobs >= 20000>> - Such sensations hasten your breath, making you take in more of $his womanly scent. You work with your lips and tongue to - <<if getSlave($AS).nipples == "inverted" || getSlave($AS).nipples == "partially inverted">> - tease out $his nipple and suckle with newfound gusto, - <<elseif getSlave($AS).nipples == "flat">> - get a hold of $his nipple and suckle with newfound gusto, - <<elseif getSlave($AS).nipples == "fuckable">> - explore the inner chambers of $his breasts and ease out more of $his cream in a lustful frenzy, - <<else>> - ease out more of $his cream in a lustful frenzy, - <</if>> - as though the rest of the world did not exist. It might as well not, given how the entirety of your upper body sees and feels nothing but $his mesmerizing mammaries and - <<if getSlave($AS).nipples == "puffy">> - $his soft nipple in your mouth, while your sex focuses on the soft hand diligently working it. You feverishly suckle on $his nipple as you thrash your tongue, your efforts rewarded with more milk. - <<elseif getSlave($AS).nipples == "flat">> - $his milky nub in your mouth, while your sex focuses on the soft hand diligently working it. You feverishly suck on $his nipple as you thrash your tongue, your efforts accidentally forcing you off with a wet pop, but you just latch back on like nothing happened. - <<elseif getSlave($AS).nipples == "inverted" || getSlave($AS).nipples == "partially inverted">> - $his erect nipple in your mouth, while your sex focuses on the soft hand diligently working it. You feverishly suckle on $his nipple as you thrash your tongue, your efforts rewarded with more milk. - <<elseif getSlave($AS).nipples == "fuckable">> - your sex feeling nothing but the wet <<if $PC.dick != 0>>insides of $his breast<<else>>lips of $his breastpussy<</if>>. You feverishly thrash your tongue around inside of the bumpy enclosure, with each strong movement sending shivers through $him, forcing gasps, moans and milk out of $him. - <<else>> - $his milky nipple in your mouth, while your sex focuses on the soft hand diligently working it. You feverishly suckle on $his nipple as you thrash your tongue, your efforts rewarded with more milk. - <</if>> - You would worry about drowning if it didn't taste good enough for you to suckle ever harder with each spurt. -<<elseif getSlave($AS).boobs >= 2000>> - Such sensations bring your attention further to $his teat; as you - <<if getSlave($AS).nipples == "inverted">> - tease $his nipple - <<elseif getSlave($AS).nipples == "fuckable">> - explore the depths of $his inner breast - <<else>> - roll and prod - <</if>> - with your tongue, trying to get the most out of $his mammaries, you hasten $his breath and bring $him further pleasure<<if getSlave($AS).nipples == "inverted">> as it slowly hardens and leaves its inverted state<</if>>. - <<if getSlave($AS).nipples == "puffy">> - You note the texture of $his nipple: soft, more so even than the rest of $his boob. Your constant efforts of sucking and tongueplay are rewarded - <<elseif getSlave($AS).nipples == "flat">> - You take in the texture of $his nipple: hard and bumpy, just like the firm globe pulling it flat. Your constant efforts of sucking and tongueplay are rewarded - <<elseif getSlave($AS).nipples == "fuckable">> - You feverishly thrash your tongue around in the bumpy enclosure, each strong movement sending shivers through $him, causing $him to gasp and moan, as well as rewarding you - <<elseif getSlave($AS).nipples != "inverted">> - You take in the texture of $his nipple: hard and bumpy, a stark contrast to the rest of $his boob — an undeniable ocean of softness. Your constant efforts of sucking and tongueplay are rewarded - <<else>> - Your constant efforts of sucking and tongueplay are rewarded - <</if>> - with more milk straight from the tap. -<</if>> - -Milk continues to spill into your mouth as you suckle away at the -<<if getSlave($AS).nipples == "puffy">> - softness, -<<elseif getSlave($AS).nipples == "flat">> - swollen bulge, -<<elseif getSlave($AS).nipples == "inverted" || getSlave($AS).nipples == "partially inverted">> - erect hardness, -<<elseif getSlave($AS).nipples == "fuckable">> - milky slit, -<<else>> - hardness, -<</if>> -relishing the delicious treat one could have only received from a mother's bosom; at least, so was the case before modern medicine decided to say something about it. Though it may as well be artificial, the act of breastfeeding continues to appease a fundamental emotional need that is arguably unique to the action. -<<if _mood == 2>> - It gives you undeniable emotional respite despite the mood caused by your pregnancy, even if it will only last as long as you stay with $him. -<<elseif _mood == 1>> - You can only hope $he'll return the favor when you yourself become too heavy with milk. -<<elseif $PC.preg > 30>> - You know that you'll soon have your own child<<if $PC.pregType > 1>>ren<</if>> to share this feeling with and deep down, you hope to enjoy it just as much as $he does. -<</if>> - -<<if getSlave($AS).boobs >= 20000>> - <<if getSlave($AS).nipples == "fuckable">> - $He - <<if $PC.dick != 0>> - holds $his breast and jiggles it in an attempt to compliment your thrusts, adding even more sensation alongside your own efforts. With the milk adding lubrication to the sensual hole of $his nipple and the enclosed nature of $his sopping wet breastpussy itself adding suction, it's like you were enveloped inside of a highly advanced cock milking machine, each bump sending thrums of pleasure as your dick brushed against them. - <<else>> - held $his breast and jiggled it in an attempt to compliment your thrusts, adding more sensation to your own efforts. The milk adding wetness to the sensual hole of $his nipple and the nature of $his sopping wet breastpussy itself adding suction felt like you were being enveloped by a world class pussy pump, each movement adding more suction and wetness than the last. - <</if>> - <<else>> - While you were busy suckling, $he was anything but idle, using $his hand as best as $he could to bring you the most pleasure $he is capable of. Though no lube was applied, $his ministrations were more than enough to take you to the knife's edge of orgasm more than once. In your <<if $PC.dick != 0>>already dazed state<<else>>lust addled haze<</if>>, $his fingers seem to send lightning along your nerves<<if $PC.dick != 0>>; the tips brushing across your shaft to tickle its head make you thrust instinctively. $His tugs, gentle yet firm<<else>>. $His fingertips brush across your labia to tickle your clit, making you buck instinctively. $His strokes, gentle yet decisive<</if>>, have an almost motherly feel to them. Such ministrations cannot help but prepare you to <<if $PC.dick != 0>>shoot your load<<else>>come<</if>> as hard as you can. - <</if>> -<<elseif getSlave($AS).boobs >= 2000>> - While you were busy suckling, $he was anything but idle, using $his hand as best as $he could to bring you the most pleasure $he is is capable of. Though no lube was applied, $his ministrations were more than enough to take you to the knife's edge of orgasm more than once. $His hand continues to apply itself to your <<if $PC.dick != 0>>shaft, its fingertips brushing across your shaft to tickle its head and make you thrust instinctively. $His tugs<<else>>sex, $his fingertips seeming to send lightning along your nerves. As $he tickles your clit, you buck instinctively. $His strokes<</if>>, gentle yet firm, have an almost motherly feel to them. Such ministrations cannot help but prepare you to <<if $PC.dick != 0>>shoot your load<<else>>come<</if>> as hard as you can. -<</if>> - -The two of you put so much into seeking pleasure in the act that you both cum at once, $his great gasp coinciding with your <<if $PC.dick != 0>><<if $PC.balls >= 10>>flood<<else>>jet<</if>> of jizz flying<<else>>own jet of pussy juice squirting<</if>> -<<if getSlave($AS).boobs >= 20000 && getSlave($AS).nipples == "fuckable">> - into -<<else>> - onto -<</if>> -$his other breast<<if $PC.dick != 0>><<if $PC.balls >= 10>> and backflowing hard from your sheer volume<</if>><</if>>. You release $his nipple with a loud pop and lick your lips in delight. -<<if getSlave($AS).boobs >= 20000 && getSlave($AS).nipples == "fuckable">> - Your <<if $PC.dick != 0>>dick slips out<<else>>pussy separates<</if>> from $his other breast with a delicate pop, followed by lewd dripping noises and the sight of <<if $PC.dick != 0>>semen<<else>>girlcum<</if>> and milk oozing from $his <<if $PC.dick != 0>>newly expanded hole<<else>>nippleslit<</if>>. -<</if>> -<<if _mood == 2>> - For a moment, $he thought you were finished, but with your hormone fueled libido, $he'll be feeling a lot more than sore nipples but the time you tire of $his touch. -<<elseif _mood == 1>> - You cuddle up against $him, holding close to $him as you snooze off your milky meal. - <<if getSlave($AS).fetish == "mindbroken">> - $He struggles in discomfort at your pregnant weight pinning $him down until $he manages to rouse your child<<if $PC.pregType > 1>>ren<</if>> and get you to move. - <<elseif getSlave($AS).devotion > 20 && getSlave($AS).trust > 20>> - $He holds you close, gently caressing your head and pregnancy as you rest it off. - <<elseif getSlave($AS).trust < -20>> - $He freezes in fear, unsure of what to do other than let you rest. - <<elseif getSlave($AS).devotion < -20>> - $He groans at the weight leaning against $him and begrudgingly rests $his arm atop your pregnant bulge. - <<if $PC.pregSource == $AS>> - $He takes a moment to appreciate the size of your belly, knowing $he was the one that seeded you. $He admires $his work with pride. - <<else>> - $He knows $he has little choice but to put up with it. - <</if>> - <<else>> - Though hesitant, $he carefully rubs the taut dome of your belly as you rest. - <</if>> -<</if>> - -<<if getSlave($AS).lactation > 0>> - <<set getSlave($AS).lactationDuration = 2>> - <<set getSlave($AS).boobs -= getSlave($AS).boobsMilk, getSlave($AS).boobsMilk = 0>> -<</if>> - -Once you <<if _mood == 1>>wake and slowly rise to your feet, you help $him clean up<<else>>are done, you allow $him to clean up<</if>> -<<switch getSlave($AS).assignment>> -<<case "work in the brothel">> - before returning $his lovely tits to the brothel. -<<case "serve in the club">> - before resuming $his lovely bouncing in the club. -<<case "work in the dairy">> - before returning to the dairy. -<<case "work as a farmhand">> - to avoid tainting the food in $farmyardName. -<<case "work as a servant">> - mostly to keep everything $he has to clean from getting any dirtier. -<<case "work as a nanny">> - before heading back to take care of the children. -<<case "whore">> - before returning to offering $his lovely tits for sale. -<<case "serve the public">> - before returning to offering $his lovely tits for free. -<<case "rest">> - before crawling back into bed. -<<case "get milked">> - before resting until $his tits swell with milk again. -<<case "be a servant">> - since $his chores didn't perform themselves while you enjoyed $him. -<<case "please you">> - before returning to await your next use of $his body, as though nothing had happened. -<<case "be a subordinate slave">> - though it's only a matter of time before another slave decides to play with $his tits. -<<case "be your Head Girl">> - worried that $his charges got up to trouble while $he enjoyed $his <<= getWrittenTitle(getSlave($AS))>>'s use. -<<case "guard you">> - so $he can be fresh and ready for more sexual use even as $he guards your person. -<<case "train slaves">> - before $he returns to teaching $his classes. -<<default>> - before $he returns to <<= getSlave($AS).assignment>>. -<</switch>> diff --git a/src/npc/interaction/fAbuse.js b/src/npc/interaction/fAbuse.js new file mode 100644 index 0000000000000000000000000000000000000000..0fed52f19efa130bd6b308451a293a187e0f6019 --- /dev/null +++ b/src/npc/interaction/fAbuse.js @@ -0,0 +1,776 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fAbuse = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself + } = getPronouns(slave); + + if (slave.assignment === Job.BODYGUARD) { + if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 95) { + r.push(`Knowing how much your bodyguard likes being hurt, you decide to reward ${him} in ${his} own particular way.`); + } else if (slave.muscles < -5 && slave.skill.combat === 0) { + r.push(`Looking at your bodyguard, you think ${he} doesn't seem that dangerous, as ${he} can barely hold a weapon up. You order ${him} to spar with you, and you quickly overpower ${him} without even breaking a sweat. Afterwards, you take the pretext of punishing ${him} to satisfy your urges.`); + } else if (slave.muscles >= -5 && slave.muscles <= 5 && slave.skill.combat !== 0) { + r.push(`You glance at your bodyguard. ${He} looks like ${he} can handle ${himself}, and you know ${he} does, but ${his} lack of musculature makes ${him} look somewhat frail. You inform ${him} that ${he} isn't muscular enough, and that you'll punish ${him} yourself for neglecting ${his} physique.`); + } else if (slave.muscles > 50 && slave.skill.combat === 0) { + r.push(`Your bodyguard may look strong and powerful, you know ${he} can't really handle ${his} weapon. You order ${him} to spar with you, and you use ${his} own muscles against ${him}, winning easily. Afterwards, you take the pretext of punishing ${him} to satisfy your urges.`); + } else if (slave.muscles > 5 && slave.skill.combat !== 0) { + r.push(`Your bodyguard stands at your side. ${He} is definitely a force to be reckoned with. You know you'd have a hard time besting ${him}, and do not wish to get hurt, so you'll just inform ${him} ${he}'ll be undertaking some particular training.`); + } else if (slave.muscles > 5 && slave.skill.combat === 0) { + r.push(`Your bodyguard may look fit, you know ${he} can't really handle ${his} weapon. You order ${him} to spar with you; while ${he} may be quick, ${he} mostly just flails ${his} weapon around allowing you an easy win. Afterwards, you take the pretext of punishing ${him} to satisfy your urges.`); + } + } + + let _assPain = 0; + + if (!hasAnyLegs(slave)) { + r.push(`You set ${his} helpless form down for abuse. Brutalizing ${him} is almost childishly easy; ${his}`); + if (hasAnyArms(slave)) { + r.push(`leg`); + } else { + r.push(`limb`); + } + r.push(`less torso leaves ${him} at your mercy.`); + } else { + r.push(`You call ${him} over so you can abuse the`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`bitch. You get things started with an open-handed slap across the face${(!canSee(slave)) ? `; ${he} never saw it coming` : ``}. As ${he} reels in shock and pain, you follow up with`); + if (slave.bellyPreg >= 600000) { + r.push(`a vicious slap across ${his} straining pregnancy,`); + } else if (slave.bellyFluid > 2000) { + r.push(`a vicious punch into ${his} bloated belly,`); + } else if (slave.dick > 0) { + r.push(`a vicious slap to ${his} cock,`); + } else if (slave.clit > 0) { + r.push(`a vicious slap to ${his} exposed clit,`); + } else if (slave.nipples === "fuckable") { + r.push(`a vicious jab deep into ${his} nipplecunt,`); + } else if (slave.nipples === "huge") { + r.push(`a vicious jerk on ${his} big nipples,`); + } else if (slave.nipples === "inverted") { + r.push(`a vicious pinch to each side of ${his} sensitive, fully inverted nipples,`); + } else if (slave.bellyPreg >= 100000) { + r.push(`a vicious slap across ${his} overfull pregnant belly,`); + } else if (slave.preg > slave.pregData.normalBirth/4) { + r.push(`a vicious slap across ${his} pregnant belly,`); + } else if (slave.heels > 0) { + r.push(`a vicious thrust to ${his} altered tendons,`); + } else if (slave.boobs >= 800) { + r.push(`a vicious slap across ${his} massive breasts,`); + } else if (slave.bellyImplant >= 1500) { + r.push(`a vicious slap across ${his} implant rounded belly,`); + } else if (!(slave.chastityVagina)) { + r.push(`a vicious slap on the mons,`); + } else { + r.push(`a vicious jerk on ${his} nipples,`); + } + + if (slave.bellyFluid >= 10000) { + if (slave.inflationMethod === 2) { + r.push(`which causes ${him} to discharge ${his} contained ${slave.inflationType} all over ${himself} before collapsing into ${his} puddle on the floor in agony.`); + deflate(slave); + } else { + r.push(`which causes ${him} to vomit up ${his} contained ${slave.inflationType} all over ${himself} before collapsing into ${his} puddle on the floor in agony.`); + deflate(slave); + } + } else if (slave.bellyFluid >= 5000) { + if (random(1, 100) > slave.devotion) { + r.push(`which nearly forces ${him} to lose ${his} contained ${slave.inflationType}, but ${he} controls ${himself} out of devotion to you as ${he} drops to the floor in agony.`); + } else { + if (slave.inflationMethod === 2) { + r.push(`which causes ${him} to discharge ${his} contained ${slave.inflationType} all over ${himself} before collapsing into ${his} puddle on the floor in agony.`); + deflate(slave); + } else { + r.push(`which causes ${him} to vomit up ${his} contained ${slave.inflationType} all over ${himself} before collapsing into ${his} puddle on the floor in agony.`); + deflate(slave); + } + } + } else { + r.push(`which causes ${him} to collapse to the floor in agony.`); + } + if (!hasAnyArms(slave)) { + if (slave.clothes !== "no clothing") { + r.push(`You don't have the patience for ${him} to squirm ${his} way out of ${his} clothing, so you roughly extract ${him} from it, making sure that to treat ${his} clothes better than you do ${him}.`); + } + } else { + if (slave.clothes !== "no clothing" || slave.bellyAccessory !== "none") { + r.push(`You tell ${him} ${he} has ten seconds to get naked.`); + } + switch (slave.bellyAccessory) { + case "a support band": + r.push(`${His} fingers fumble desperately trying to grip the hook and loop of ${his} support band.`); + break; + case "a corset": + r.push(`${His} fingers fumble desperately with the straps of ${his} corset.`); + break; + case "an extreme corset": + r.push(`${His} fingers fumble desperately with the bindings of ${his} corset, and ${he} hyperventilates within its embrace as ${he} works.`); + break; + } + switch (slave.clothes) { + case "uncomfortable straps": + r.push(`In ${his} haste to get out of ${his} straps ${he} trips and falls flat.`); + break; + case "clubslut netting": + r.push(`In ${his} haste to get out of ${his} slutty netting ${he} trips and falls flat.`); + break; + case "shibari ropes": + r.push(`In ${his} haste to get out of ${his} shibari ropes ${he} only manages to get tangled and fall over.`); + break; + case "a latex catsuit": + case "restrictive latex": + r.push(`In ${his} haste to get out of ${his} clinging latex ${he} trips and falls flat in a tangle of latex and trembling flesh.`); + break; + case "a military uniform": + r.push(`${He}'s desperately torn between hurry to avoid punishment and fear ${he}'ll damage ${his} shirt.`); + break; + case "a schutzstaffel uniform": + r.push(`${He}'s desperately torn between hurry to avoid punishment and fear ${he}'ll damage ${his} trousers.`); + break; + case "a slutty schutzstaffel uniform": + r.push(`${He}'s desperately torn between hurry to avoid punishment and fear ${he}'ll tear ${his} miniskirt.`); + break; + case "a red army uniform": + r.push(`${He}'s desperately torn between hurry to avoid punishment and fear ${he}'ll damage ${his} shirt.`); + break; + case "a mounty outfit": + r.push(`${He}'s desperately torn between hurry to avoid punishment and fear ${he}'ll damage ${his} slacks.`); + break; + case "a nice nurse outfit": + r.push(`${He} quickly tears off ${his} loose scrubs.`); + break; + case "a biyelgee costume": + r.push(`${He} quickly tears off ${his} loose dress.`); + break; + case "a mini dress": + r.push(`${He} struggles to take off ${his} tight mini dress.`); + break; + case "attractive lingerie": + r.push(`${He} almost tears ${his} delicate lingerie in ${his} haste to avoid punishment.`); + break; + case "a succubus outfit": + if (["a corset", "an extreme corset"].includes(slave.bellyAccessory)) { + r.push(`${He} struggles with ${his} leather corset.`); + } else { + r.push(`Panic sets in as ${he} hastily sheds what's left of ${his} outfit.`); + } + break; + case "spats and a tank top": + r.push(`${He} hastily slips ${his} top off and struggles to get out of ${his} clinging spats.`); + break; + case "lederhosen": + r.push(`${He} hastily slips ${his} tunic off and struggles to unbutton ${his} clinging shorts.`); + break; + case "attractive lingerie for a pregnant woman": + r.push(`${He} quickly sheds ${his} vest and tight bra before panicking and resorting to ripping ${his} silk panties off.`); + break; + case "a maternity dress": + r.push(`${He} hastily pulls ${his} dress down, revealing ${his} body.`); + break; + case "a dirndl": + r.push(`${He} hastily pulls ${his} dress down, revealing ${his} body.`); + break; + case "a long qipao": + r.push(`${He} hastily pulls ${his} dress down, revealing ${his} body.`); + break; + case "stretch pants and a crop-top": + r.push(`${He} hastily pulls ${his} crop-top over ${his} head and struggles to remove ${his} stretch pants only to get tangled and fall over.`); + break; + case "a cheerleader outfit": + r.push(`${He} yanks ${his} cheerleader skirt down and pulls ${his} slutty top off.`); + break; + case "a string bikini": + r.push(`${He} gives ${himself} a nasty pinch between the legs in ${his} haste to get out of ${his} string bottom.`); + break; + case "a scalemail bikini": + r.push(`${He} gives ${himself} a tiny cut on ${his} breast in ${his} haste to get out of ${his} scalemail top.`); + break; + case "striped panties": + r.push(`${He} yanks ${his} panties down, kicking them off to the side.`); + break; + case "a monokini": + r.push(`${He} nearly snaps the shoulder straps of ${his} monokini in ${his} haste to remove it.`); + break; + case "overalls": + r.push(`${He} nearly snaps the shoulder straps of ${his} overalls in ${his} haste to remove them.`); + break; + case "an apron": + r.push(`${He} quickly undoes ${his} apron's straps and hoists the garment over ${his} head.`); + break; + case "a hijab and blouse": + case "conservative clothing": + r.push(`${He} winds up tearing a few buttons off ${his} shirt in ${his} haste to remove it.`); + break; + case "Western clothing": + r.push(`${He} winds up tearing a few buttons off ${his} flannel shirt in ${his} haste to remove it.`); + break; + case "a cybersuit": + r.push(`${He} whimpers as ${he} knows ${he} can barely remove ${his} visor in that amount of time, let alone the whole bodysuit, but ${he} tries anyway.`); + break; + case "a tight Imperial bodysuit": + r.push(`${He} struggles valiantly to get ${his} tight-fitting bodysuit off, but can only frantically peel it down halfway in your short timeframe.`); + break; + case "battlearmor": + r.push(`${He} whimpers as ${he} knows ${he} can barely remove ${his} arm guards in that amount of time, let alone the whole suit, but ${he} tries anyway.`); + break; + case "Imperial Plate": + r.push(`${He} quietly whimpers, knowing that it'll take ${him} full minutes to completely get off ${his} ultra-heavy Imperial Plate. Nevertheless, ${he} makes a valiant effort. Having this heavily-armored tank squirming underneath you is almost amusing.`); + break; + case "a fallen nuns habit": + r.push(`${He} tugs desperately at the laces of ${his} tight latex nun getup.`); + break; + case "a chattel habit": + r.push(`${He} shucks ${his} habit off easily, since it was designed to be removed quickly.`); + break; + case "a penitent nuns habit": + r.push(`${He} pulls ${his} coarse habit over ${his} head, revealing ${his} chafed flesh.`); + break; + case "cutoffs and a t-shirt": + r.push(`${He} shimmies out of ${his} cutoffs and whips ${his} t-shirt over ${his} head.`); + break; + case "a slutty nurse outfit": + r.push(`Getting out of ${his} tight nurse getup in that amount of time is impossible, but ${he} tries anyway.`); + break; + case "a schoolgirl outfit": + r.push(`${His} schoolgirl outfit is easily stripped off: ${he} pulls down ${his} skimpy skirt and tears off ${his} little blouse, and ${he}'s nude.`); + break; + case "a kimono": + r.push(`Getting out of ${his} kimono in that amount of time is flagrantly impossible, but ${he} tries anyway.`); + break; + case "a klan robe": + r.push(`Because ${he}'s nude under ${his} robes, ${he} simply lifts them over ${his} head.`); + break; + case "a hijab and abaya": + case "a niqab and abaya": + r.push(`Because ${he}'s nude under ${his} abaya, ${he} simply lifts it over ${his} head.`); + break; + case "a burqa": + r.push(`Because ${he}'s nude under ${his} burqa, ${he} simply lifts it over ${his} head.`); + break; + case "a tube top and thong": + r.push(`${He} shimmies out of ${his} thong and whips ${his} tube top over ${his} head.`); + break; + case "a button-up shirt and panties": + r.push(`${He} drops ${his} panties and lifts ${his} shirt over ${his} head.`); + break; + case "a gothic lolita dress": + r.push(`Getting out of ${his} lolita dress in that amount of time is impossible, but ${he} tries anyway.`); + break; + case "a hanbok": + r.push(`${He} winds up tearing stitches out of ${his} shirt in ${his} haste to remove it.`); + break; + case "a bra": + r.push(`Because ${he}'s nude under ${his} bra, ${he} simply lifts it over ${his} head.`); + break; + case "a button-up shirt": + r.push(`Because ${he}'s nude under ${his} shirt, ${he} simply lifts it over ${his} head.`); + break; + case "a nice pony outfit": + r.push(`${He} whimpers as ${he} knows ${he} can't remove ${his} outfit without some help.`); + break; + case "a slutty pony outfit": + r.push(`${He} whimpers as ${he} knows ${he} can't remove ${his} outfit without some help.`); + break; + case "a sweater": + r.push(`Because ${he}'s nude under ${his} sweater, ${he} simply lifts it over ${his} head.`); + break; + case "a tank-top": + r.push(`Because ${he}'s nude under ${his} tank-top, ${he} simply lifts it over ${his} head.`); + break; + case "a thong": + r.push(`${He} slips out of ${his} thong and kicks it aside.`); + break; + case "a tube top": + r.push(`Because ${he}'s nude under ${his} tube top, ${he} simply lifts it over ${his} head.`); + break; + case "a one-piece swimsuit": + r.push(`Because ${he}'s nude under ${his} swimsuit, ${he} simply pulls it down past ${his} hips and wiggles free.`); + break; + case "a police uniform": + r.push(`${He} almost tears ${his} uniform in ${his} haste to avoid punishment.`); + break; + case "a striped bra": + r.push(`Because ${he}'s nude under ${his} bra, ${he} simply lifts it over ${his} head.`); + break; + case "striped underwear": + r.push(`${He} pulls off ${his} bra and panties with minimal effort.`); + break; + case "a skimpy loincloth": + r.push(`${He} slips out of ${his} loincloth and kicks it aside.`); + break; + case "a slutty klan robe": + r.push(`${He} slips off ${his} robe and throws it aside.`); + break; + case "a sports bra": + r.push(`Because ${he}'s nude under ${his} bra, ${he} simply lifts it over ${his} head.`); + break; + case "a sweater and panties": + r.push(`${He} tears ${his} sweater in ${his} haste and slips out of ${his} panties quickly.`); + break; + case "a t-shirt": + r.push(`Because ${he}'s nude under ${his} t-shirt, ${he} simply lifts it over ${his} head and throws it aside.`); + break; + case "a tank-top and panties": + r.push(`${He} yanks off ${his} t-shirt and drops ${his} panties.`); + break; + case "a t-shirt and thong": + r.push(`${He} yanks off ${his} t-shirt and drops ${his} thong.`); + break; + case "an oversized t-shirt and boyshorts": + r.push(`${He} yanks off ${his} t-shirt and drops ${his} boy shorts.`); + break; + case "an oversized t-shirt": + r.push(`${He} yanks off ${his} t-shirt.`); + break; + case "a t-shirt and jeans": + r.push(`${He} yanks off ${his} t-shirt but struggles to wiggle out of ${his} blue jeans.`); + break; + case "boyshorts": + r.push(`${He} drops ${his} shorts quickly.`); + break; + case "cutoffs": + r.push(`${He} wiggles out of ${his} shorts quickly.`); + break; + case "leather pants and pasties": + r.push(`${He} yanks ${his} pasties off but struggles to wiggle out of ${his} leather pants.`); + break; + case "leather pants": + r.push(`${He} struggles to wiggle out of ${his} leather pants.`); + break; + case "panties": + r.push(`${He} drops ${his} panties quickly.`); + break; + case "sport shorts and a t-shirt": + r.push(`${He} yanks off ${his} shirt and drops ${his} shorts.`); + break; + case "a t-shirt and panties": + r.push(`${He} yanks off ${his} t-shirt and drops ${his} panties.`); + break; + case "panties and pasties": + r.push(`${He} yanks off ${his} pasties and drops ${his} panties.`); + break; + case "pasties": + r.push(`${He} hastily yanks off ${his} pasties.`); + break; + case "sport shorts and a sports bra": + r.push(`${He} drops ${his} shorts and tosses ${his} bra.`); + break; + case "jeans": + r.push(`${He} struggles to wiggle out of ${his} blue jeans.`); + break; + case "a sweater and cutoffs": + r.push(`${He} tosses off ${his} sweater and drops ${his} shorts.`); + break; + case "leather pants and a tube top": + r.push(`${He} yanks ${his} tube top off but struggles to wiggle out of ${his} leather pants.`); + break; + case "sport shorts": + r.push(`${He} drops ${his} shorts quickly.`); + break; + case "battledress": + r.push(`${He} strips ${his} tank top off in one motion, unfastens ${his} belt, and pulls down ${his} pants, though ${his} boots defeat ${him} and stay on.`); + break; + case "a slutty outfit": + r.push(`${He} hurriedly strips ${himself} out of ${his} carefully chosen outfit.`); + break; + case "a slave gown": + r.push(`${He}'s desperately torn between hurry to avoid punishment and fear ${he}'ll rip ${his} delicate gown.`); + break; + case "a halter top dress": + r.push(`${He}'s desperately torn between hurry to avoid punishment and fear ${he}'ll rip ${his} delicate dress.`); + break; + case "a ball gown": + r.push(`${He}'s desperately torn between hurry to avoid punishment and fear ${he}'ll rip ${his} delicate silken ball gown.`); + break; + case "nice business attire": + r.push(`${He}'s desperately torn between hurry to avoid punishment and fear ${he}'ll damage ${his} blouse.`); + break; + case "slutty business attire": + r.push(`${He}'s desperately torn between hurry to avoid punishment and fear ${he}'ll tear ${his} suit in ${his} haste.`); + break; + case "a nice maid outfit": + r.push(`${He} pulls ${his} dress over ${his} head and quickly undoes the buttons of ${his} blouse, one after the other.`); + break; + case "a slutty maid outfit": + r.push(`${His} short dress comes off easily, but ${he} fumbles with the buttons on ${his} tight blouse.`); + break; + case "a comfortable bodysuit": + r.push(`${He}'s desperately torn between hurry to avoid punishment and fear ${he}'ll stretch out ${his} bodysuit.`); + break; + case "a burkini": + r.push(`${He}'s desperately torn between hurry to avoid punishment and fear ${he}'ll stretch out ${his} burkini.`); + break; + case "a leotard": + r.push(`${His} leotard is tight enough that ${he} has to struggle mightily to get it off that quickly.`); + break; + case "a bunny outfit": + r.push(`${He}'s desperately torn between hurry to avoid punishment and fear ${he}'ll put runs in ${his} hose.`); + break; + case "kitty lingerie": + r.push(`${He} almost tears ${his} decorative lingerie in ${his} haste to avoid punishment.`); + break; + case "harem gauze": + r.push(`${He}'s desperately torn between hurry to avoid punishment and fear ${he}'ll tear ${his} flimsy gauze.`); + break; + case "a Santa dress": + r.push(`${He} tears off some of ${his} dress's white fur trim in ${his} struggle to remove it.`); + break; + case "slutty jewelry": + r.push(`${He} hurriedly strips fine jewelry from ${his} neck, ${hasBothArms(slave) ? `wrists` : `wrist`} and ${hasBothLegs(slave) ? `ankles` : `ankle`}.`); + break; + case "a courtesan dress": + if (["a corset", "an extreme corset"].includes(slave.bellyAccessory)) { + r.push(`${His} fingers fumble desperately with the straps of ${his} corset, knowing there is still a lot of dress left to remove after it.`); + } else { + r.push(`Panic sets in as ${he} realizes just how much dress is left to remove. In ${his} haste, ${he} hooks a sleeve with ${his} foot and falls flat, exposing ${his} bare ass.`); + } + break; + case "a bimbo outfit": + r.push(`In two swift motions ${he}'s out of ${his} outfit.`); + } + } + } + + if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 95) { + r.push(`The slap seems to have excited ${him}, seeing ${his} hard nipples and wet pussy, and ${his} eyes practically beg for more.`); + } else if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`${He} seems to be a bit expectant of what is to come.`); + } + + if (V.PC.dick !== 0) { + if (hasAnyArms(slave) && App.Data.clothes.get(slave.clothes).exposure <= 3) { + r.push(`While ${he} strips, your`); + } else { + r.push(`Your`); + } + r.push(`stiffening cock rises${(V.PC.vagina !== -1) ? `, revealing your pussy and` : ``} earning`); + } else { + if (hasAnyArms(slave) && App.Data.clothes.get(slave.clothes).exposure <= 3) { + r.push(`While ${he} strips, you`); + } else { + r.push(`You`); + } + r.push(`don a cruelly large strap-on, earning`); + } + if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 95) { + r.push(`a sultry look`); + } else if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`a shy look`); + } else { + r.push(`a frightened glance`); + } + r.push(`from your victim.`); + + if (isAmputee(slave)) { + if (App.Data.clothes.get(slave.clothes).exposure <= 3) { + r.push(`Growing impatient, you rip the clothes off ${his} limbless torso`); + } else { + r.push(`You walk up to ${him}`); + } + r.push(`and spank ${him} brutally; spinning ${him} to present`); + if (slave.vagina > -1) { + r.push(`${his} holes`); + } else { + r.push(`${his} hole`); + } + r.push(`to you and`); + if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + if (canAchieveErection(slave)) { + r.push(`making ${his} erect dick throb`); + } else if (slave.vagina > -1) { + r.push(`making ${his} pussy throb`); + } else { + r.push(`making ${his} butthole throb`); + } + } + r.push(`with anticipation.`); + } else { + r.push(`You order ${him} to present`); + if (slave.vagina > -1) { + r.push(`${his} holes`); + } else { + r.push(`${his} hole`); + } + r.push(`to you and spank ${him} brutally`); + if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + if (canAchieveErection(slave)) { + r.push(`making ${his} erect dick throb`); + } else if (slave.vagina > -1) { + r.push(`making ${his} pussy throb`); + } else { + r.push(`making ${his} butthole throb`); + } + } + if (slave.devotion < -50) { + r.push(`until ${he} complies.`); + } else if (slave.devotion < -20) { + r.push(`as ${he} slowly complies.`); + } else if (slave.devotion <= 20) { + r.push(`as ${he} fearfully complies.`); + } else if (slave.devotion <= 50) { + r.push(`as ${he} rushes to comply.`); + } else { + r.push(`as ${he} complies.`); + } + } + + r.push(`${His} ${slave.skin}${V.seeRace === 1 ? `, ${slave.race}` : ``} ass`); + const skinToneLvl = skinToneLevel(slave.skin); + if (App.Medicine.Modification.dyedSkins.includes(slave.skin)) { + r.push(`barely shows the spanking.`); + } else if (skinToneLvl < 5) { + r.push(`shows the spanking extremely well.`); + } else if (skinToneLvl < 12) { + r.push(`shows the spanking well.`); + } else if (skinToneLvl < 20) { + r.push(`barely shows the spanking.`); + } else { + r.push(`barely shows any marks from the spanking.`); + } + + if (slave.chastityPenis === 1) { + r.push(`You rip ${his} dick chastity off ${him}, though ${he} knows not to be relieved. ${His} cock is now vulnerable, not free.`); + } + + if (slave.anus === 0) { + r.push(`The bitch's still a butthole virgin and you don't mean to take that now, but you torture ${him} with the threat of raping ${his} virgin ass for a while before settling for ${his} gagging throat.`); + seX(slave, "oral", V.PC, "penetrative"); + } else if (slave.chastityVagina && canDoAnal(slave)) { + r.push(`The bitch's wearing a chastity belt, so ${he} isn't surprised when you shove`); + if (V.PC.dick === 0) { + r.push(`the strap-on`); + } else { + r.push(`your dick`); + } + r.push(`up ${his} butt. What surprises ${him} is when you slide a finger or two in alongside your dick to stretch ${him} to the point of pain.`); + r.push(VCheck.Anal(slave, 1)); + _assPain = 1; + } else if (slave.vagina === 0) { + r.push(`The bitch's still a virgin and you don't mean to take that now, but you torture ${him} with the threat of raping ${his} virgin pussy for a while before settling for ${his} gagging throat.`); + seX(slave, "oral", V.PC, "penetrative"); + } else if (slave.bellyPreg >= 600000) { + r.push(`The bitch is on the brink of bursting, so hard intercourse will be painful and terrifying to ${him}. You thrust hard into ${him} causing ${his} taut belly to bulge and making ${his} children squirm within ${his} straining womb.`); + if (V.PC.vagina !== -1 && V.PC.dick !== 0) { + r.push(`Fortunately for ${him}, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.`); + } + r.push(`You brutally fuck ${him} as ${he} pleads for you to stop until you're at your edge. More cum won't make the bitch more pregnant, but you cum inside ${him} anyway.`); + r.push(VCheck.Vaginal(slave, 1)); + } else if (slave.bellyPreg >= 120000) { + r.push(`The bitch is hugely pregnant, so hard intercourse will be uncomfortable and worrying for ${him}. You have hard intercourse. ${He} sobs as you rock the huge weight of ${his} belly back and forth without mercy, forcing ${his} already straining belly to bulge further, and whines as ${he} feels your cockhead batter ${his} womb.`); + if (V.PC.vagina !== -1 && V.PC.dick !== 0) { + r.push(`Fortunately for ${him}, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.`); + } + r.push(`More cum won't make the bitch more pregnant, but you cum inside ${him} anyway.`); + r.push(VCheck.Vaginal(slave, 1)); + } else if (slave.preg > slave.pregData.normalBirth/2) { + r.push(`The bitch is pregnant, so hard intercourse will be uncomfortable and even worrying for ${him}. You have hard intercourse. ${He} sobs as you saw the huge weight of ${his} belly back and forth without mercy, and whines as ${he} feels your cockhead batter ${his} womb.`); + if (V.PC.vagina !== -1 && V.PC.dick !== 0) { + r.push(`Fortunately for ${him}, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.`); + } + r.push(`More cum won't make the bitch more pregnant, but you cum inside ${him} anyway.`); + r.push(VCheck.Vaginal(slave, 1)); + } else if (slave.pregKnown === 1) { + r.push(`The bitch knows ${he} is pregnant, even if it isn't obvious yet, so hard intercourse will be uncomfortable and even worrying for ${him}. You have hard intercourse. ${He} sobs as you pound ${his} vagina without mercy, and whines as ${he} feels your cockhead batter ${his} womb.`); + if (V.PC.vagina !== -1 && V.PC.dick !== 0) { + r.push(`Fortunately for ${him}, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.`); + } + r.push(`More cum won't make the bitch more pregnant, but you cum inside ${him} anyway.`); + r.push(VCheck.Vaginal(slave, 1)); + } else if (slave.vagina === 1) { + r.push(`The bitch's pussy is tight, so you ram`); + if (V.PC.dick === 0) { + r.push(`the strap-on`); + } else { + r.push(`your dick`); + } + r.push(`into ${him} without preamble and fuck ${him} hard and fast.`); + if (V.PC.vagina !== -1 && V.PC.dick !== 0) { + r.push(`Fortunately for ${him}, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.`); + } + r.push(`${His} cunt spasms with the pain of the rape. You cum in no time.`); + r.push(VCheck.Vaginal(slave, 1)); + } else if (slave.anus === 1) { + r.push(`The bitch's butt is tight, so you ram`); + if (V.PC.dick === 0) { + r.push(`the strap-on`); + } else { + r.push(`your dick`); + } + r.push(`into ${him} without lubricant and sodomize ${him} as hard as you can without damaging your property.`); + if (V.PC.vagina !== -1 && V.PC.dick !== 0) { + r.push(`Fortunately for ${him}, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.`); + } + r.push(`${His} asshole spasms with the pain of the rape. You cum explosively.`); + r.push(VCheck.Anal(slave, 1)); + _assPain = 1; + } else if (slave.dick > 0 && slave.scrotum > 0) { + r.push(`You ram`); + if (V.PC.dick === 0) { + r.push(`the strap-on`); + } else { + r.push(`your dick`); + } + r.push(`into ${his} sissy butt without lubricant. As ${he} flinches you announce that ${he}'ll be taking part in giving ${himself} anal pain. ${He} humps into you lamely, so you administer a truly agonizing slap to ${his} balls`); + if (V.PC.dick === 0) { + } else { + r.push(`that makes ${his} anal ring stiffen deliciously around your dick.`); + } + r.push(`To avoid further punishment ${he} fucks ${himself} against you almost hard enough to hurt ${himself}.`); + if (V.PC.vagina !== -1 && V.PC.dick !== 0) { + r.push(`Fortunately for ${him}, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.`); + } + r.push(`You orgasm explosively.`); + r.push(VCheck.Anal(slave, 1)); + _assPain = 1; + } else if (slave.dick > 0) { + r.push(`You ram`); + if (V.PC.dick === 0) { + r.push(`the strap-on`); + } else { + r.push(`your dick`); + } + r.push(`into ${his} gelded butt without lubricant and sodomize ${him} as hard as you can without damaging your property.`); + if (V.PC.vagina !== -1) { + r.push(`Fortunately for ${him}, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.`); + } + r.push(`${He}'s such a slut that ${he} shows signs of enjoyment, but you put a stop to that whenever it happens by slapping and flicking ${his} cock. You cum explosively.`); + r.push(VCheck.Anal(slave, 1)); + _assPain = 1; + } else { + r.push(`${He}'s got no special physical targets for abuse, so you just rape ${him} hard and fast, raining stinging slaps down on ${him} as you do. ${He} cries and whimpers; you finish.`); + r.push(VCheck.Both(slave, 1)); + } + if (slave.assignment !== Job.BODYGUARD) { + r.push(`This leaves ${him} sobbing on the floor`); + if (V.PC.dick === 0) { + r.push(`as you shuck off the strap-on and drop it on ${his} face.`); + } else { + r.push(`with cum dripping out of ${him}.`); + } + } else if (slave.assignment === Job.BODYGUARD && slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 95) { + r.push(`${He} thanks you rapidly, trying to break away from the pleasure of your reward. ${He} quickly gets back to ${his} feet and stumbles towards the shower, to make sure you won't stay unprotected too long.`); + } else { + r.push(`Even though ${he}'s in a somewhat bad shape, ${he} still jumps back to ${his} feet and stumbles towards the shower, to make sure you won't stay unprotected too long.`); + } + + if (slave.assignment !== Job.BODYGUARD) { + if (slave.minorInjury === 0) { + if (_assPain === 1) { + r.push(`The anal rape leaves ${him} with a sore butthole.`); + } else if (random(1, 100) > 50) { + slave.minorInjury = either("black eye", "bruise", "split lip"); + r.push(`Your abuse gave ${him} a ${slave.minorInjury}.`); + } + } + } + + if (slave.bellyPreg >= 600000) { + r.push(`The rough fucking was <span class="health dec">very unhealthy</span> for ${his} massive pregnancy.`); + healthDamage(slave, 40); + } + + if (slave.assignment === Job.BODYGUARD) { + if (slave.muscles <= 5 && slave.skill.combat === 0) { + r.push(`Your bodyguard accepts this as a punishment for ${his} uselessness.`); + } else if (slave.muscles <= 5 && slave.skill.combat !== 0) { + r.push(`Your bodyguard accepts this as a punishment for ${his} lack of muscles`); + } else if (slave.muscles > 30 && slave.skill.combat === 0) { + r.push(`Your bodyguard accepts this as a punishment for ${his} lack of combat skills`); + } else if (slave.muscles > 5 && slave.skill.combat !== 0) { + r.push(`Your bodyguard just admits it as a part of ${his} body training.`); + } else if (slave.muscles > 5 && slave.skill.combat === 0) { + r.push(`Your bodyguard accepts this as a punishment for ${his} lack of expertise`); + } + if (slave.fetish === "masochist" && slave.fetishStrength > 60 && slave.fetishKnown === 1) { + r.push(`Though ${he} secretly got off on the pain and humiliation.`); + } + } else if (slave.fetish === "masochist" && slave.fetishStrength > 60 && slave.fetishKnown === 1) { + r.push(`${He} secretly got off on the pain and humiliation.`); + } else if (V.arcologies[0].FSDegradationist !== "unset") { + r.push(`${He} knew that a degradationist arcology wouldn't be easy on ${him}, so even if ${he} resents it, ${he} tries to accept it.`); + } else if (slave.devotion < -50) { + r.push(`${His} <span class="mediumorchid">hatred</span> and <span class="gold">fear</span> of you have increased.`); + slave.devotion-=4; + slave.trust-=4; + } else if (slave.devotion < -20) { + r.push(`${His} <span class="mediumorchid">resistance</span> to and <span class="gold">fear</span> of you have increased.`); + slave.devotion-=4; + slave.trust-=4; + } else if (slave.devotion <= 20) { + r.push(`${His} <span class="gold">fear</span> of you is tinged with <span class="mediumorchid">hatred.</span>`); + slave.devotion-=4; + slave.trust-=4; + } else if (slave.devotion <= 50) { + r.push(`${His} <span class="mediumorchid">obedience to you is reduced,</span> and ${he} <span class="gold">fears</span> further abuse.`); + slave.devotion-=4; + slave.trust-=4; + } else { + r.push(`${He} is so devoted to you that ${he} accepts your abuse as ${his} just due, but ${he} now <span class="gold">fears</span> you more and trusts you less.`); + slave.trust-=4; + } + + if (random(1, 100) > (20+slave.devotion+slave.trust)) { + if (slave.fetish !== "submissive" && slave.fetish !== "masochist" && slave.assignment !== Job.BODYGUARD) { + const _seed = random(1, 8); + r.push(`Brutal abuse has left ${him}`); + if (_seed === 1 && slave.behavioralFlaw !== "odd") { + r.push(`<span class="red">acting strangely.</span>`); + slave.behavioralFlaw = "odd"; + } else if (_seed === 2 && slave.behavioralFlaw !== "anorexic") { + r.push(`<span class="red">starving ${himself}</span> in a crippling attempt to be pretty.`); + slave.behavioralFlaw = "anorexic"; + } else if (_seed === 3 && slave.behavioralFlaw !== "gluttonous") { + r.push(`<span class="red">stress eating</span> whenever ${he} can.`); + slave.behavioralFlaw = "gluttonous"; + } else if (_seed === 4 && slave.behavioralFlaw !== "devout") { + r.push(`<span class="red">praying in private</span> whenever ${he} can.`); + slave.behavioralFlaw = "devout"; + } else if (_seed === 5 && slave.sexualFlaw !== "apathetic") { + r.push(`<span class="red">sexually apathetic,</span> since ${he} feels it cannot go well for ${him}.`); + slave.sexualFlaw = "apathetic"; + } else if (_seed === 6 && slave.sexualFlaw !== "crude") { + r.push(`<span class="red">sexually crude,</span> out of an unconscious belief that sex is ugly and unworthy of effort.`); + slave.sexualFlaw = "crude"; + } else if (_seed === 7 && slave.sexualFlaw !== "judgemental") { + r.push(`<span class="red">sexually judgemental,</span> out of an unconscious desire to disqualify people from being good enough to have sex with ${him}.`); + slave.sexualFlaw = "judgemental"; + } else if (V.PC.dick !== -1) { + r.push(`<span class="red">hating men,</span> since you forced your cock on ${him}.`); + slave.behavioralFlaw = "hates men"; + } else { + r.push(`<span class="red">hating women,</span> since you forced your cunt on ${him}.`); + slave.behavioralFlaw = "hates women"; + } + } + } + if (random(1, 100) > (50+slave.devotion+slave.trust) && slave.assignment !== Job.BODYGUARD) { + if (slave.fetish !== "mindbroken" && slave.fetishKnown === 0 && slave.clitSetting !== slave.fetish) { + 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>`); + slave.fetish = "submissive"; + slave.fetishKnown = 1; + } else if (slave.fetish !== "masochist") { + r.push(`<span class="lightcoral">sexuality towards masochism.</span>`); + slave.fetish = "masochist"; + slave.fetishKnown = 1; + } + } + } + if (slave.fetish === "mindbroken" && slave.relationship === -3) { + if (slave.kindness) { + slave.kindness = 0; + } + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fAbuse.tw b/src/npc/interaction/fAbuse.tw deleted file mode 100644 index abe601fedf816d28f4e40c93ee0cb185f19668d7..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fAbuse.tw +++ /dev/null @@ -1,532 +0,0 @@ -:: FAbuse [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> - -<<if ($AS == $BodyguardID)>> - <<if (getSlave($AS).fetish == "masochist") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 95)>> - Knowing how much your bodyguard likes being hurt, you decide to reward $him in $his own particular way. - <<elseif (getSlave($AS).muscles < -5) && (getSlave($AS).skill.combat == 0)>> - Looking at your bodyguard, you think $he doesn't seem that dangerous, as $he can barely hold a weapon up. You order $him to spar with you, and you quickly overpower $him without even breaking a sweat. Afterwards, you take the pretext of punishing $him to satisfy your urges. - <<elseif (getSlave($AS).muscles >= -5 && getSlave($AS).muscles <= 5) && (getSlave($AS).skill.combat != 0)>> - You glance at your bodyguard. $He looks like $he can handle $himself, and you know $he does, but $his lack of musculature makes $him look somewhat frail. You inform $him that $he isn't muscular enough, and that you'll punish $him yourself for neglecting $his physique. - <<elseif (getSlave($AS).muscles > 50) && (getSlave($AS).skill.combat == 0)>> - Your bodyguard may look strong and powerful, you know $he can't really handle $his weapon. You order $him to spar with you, and you use $his own muscles against $him, winning easily. Afterwards, you take the pretext of punishing $him to satisfy your urges. - <<elseif (getSlave($AS).muscles > 5) && (getSlave($AS).skill.combat != 0)>> - Your bodyguard stands at your side. $He is definitely a force to be reckoned with. You know you'd have a hard time besting $him, and do not wish to get hurt, so you'll just inform $him $he'll be undertaking some particular training. - <<elseif (getSlave($AS).muscles > 5) && (getSlave($AS).skill.combat == 0)>> - Your bodyguard may look fit, you know $he can't really handle $his weapon. You order $him to spar with you; while $he may be quick, $he mostly just flails $his weapon around allowing you an easy win. Afterwards, you take the pretext of punishing $him to satisfy your urges. - <</if>> -<</if>> - -<<set _assPain = 0>> - -<<if !hasAnyLegs(getSlave($AS))>> - You set $his helpless form down for abuse. Brutalizing $him is almost childishly easy; $his <<if hasAnyArms(getSlave($AS))>>leg<<else>>limb<</if>>less torso leaves $him at your mercy. -<<else>> - You call $him over so you can abuse the <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>bitch. You get things started with an open-handed slap across the face<<if !canSee(getSlave($AS))>>; $he never saw it coming<</if>>. As $he reels in shock and pain, you follow up with - <<if getSlave($AS).bellyPreg >= 600000>> - a vicious slap across $his straining pregnancy, - <<elseif (getSlave($AS).bellyFluid > 2000)>> - a vicious punch into $his bloated belly, - <<elseif (getSlave($AS).dick > 0)>> - a vicious slap to $his cock, - <<elseif (getSlave($AS).clit > 0)>> - a vicious slap to $his exposed clit, - <<elseif (getSlave($AS).nipples == "fuckable")>> - a vicious jab deep into $his nipplecunt, - <<elseif (getSlave($AS).nipples == "huge")>> - a vicious jerk on $his big nipples, - <<elseif (getSlave($AS).nipples == "inverted")>> - a vicious pinch to each side of $his sensitive, fully inverted nipples, - <<elseif getSlave($AS).bellyPreg >= 100000>> - a vicious slap across $his overfull pregnant belly, - <<elseif (getSlave($AS).preg > getSlave($AS).pregData.normalBirth/4)>> - a vicious slap across $his pregnant belly, - <<elseif (getSlave($AS).heels > 0)>> - a vicious thrust to $his altered tendons, - <<elseif (getSlave($AS).boobs >= 800)>> - a vicious slap across $his massive breasts, - <<elseif (getSlave($AS).bellyImplant >= 1500)>> - a vicious slap across $his implant rounded belly, - <<elseif !(getSlave($AS).chastityVagina)>> - a vicious slap on the mons, - <<else>> - a vicious jerk on $his nipples, - <</if>> - - <<if getSlave($AS).bellyFluid >= 10000>> - <<if getSlave($AS).inflationMethod == 2>> - which causes $him to discharge $his contained <<= getSlave($AS).inflationType>> all over $himself before collapsing into $his puddle on the floor in agony. - <<run deflate(getSlave($AS))>> - <<else>> - which causes $him to vomit up $his contained <<= getSlave($AS).inflationType>> all over $himself before collapsing into $his puddle on the floor in agony. - <<run deflate(getSlave($AS))>> - <</if>> - <<elseif getSlave($AS).bellyFluid >= 5000>> - <<if random(1,100) > getSlave($AS).devotion>> - which nearly forces $him to lose $his contained <<= getSlave($AS).inflationType>>, but $he controls $himself out of devotion to you as $he drops to the floor in agony. - <<else>> - <<if getSlave($AS).inflationMethod == 2>> - which causes $him to discharge $his contained <<= getSlave($AS).inflationType>> all over $himself before collapsing into $his puddle on the floor in agony. - <<run deflate(getSlave($AS))>> - <<else>> - which causes $him to vomit up $his contained <<= getSlave($AS).inflationType>> all over $himself before collapsing into $his puddle on the floor in agony. - <<run deflate(getSlave($AS))>> - <</if>> - <</if>> - <<else>> - which causes $him to collapse to the floor in agony. - <</if>> - <<if !hasAnyArms(getSlave($AS))>> - <<if getSlave($AS).clothes != "no clothing">> - You don't have the patience for $him to squirm $his way out of $his clothing, so you roughly extract $him from it, making sure that to treat $his clothes better than you do $him. - <</if>> - <<else>> - <<if getSlave($AS).clothes != "no clothing" || getSlave($AS).bellyAccessory != "none">> - You tell $him $he has ten seconds to get naked. - <</if>> - <<switch getSlave($AS).bellyAccessory>> - <<case "a support band">> - $His fingers fumble desperately trying to grip the hook and loop of $his support band. - <<case "a corset">> - $His fingers fumble desperately with the straps of $his corset. - <<case "an extreme corset">> - $His fingers fumble desperately with the bindings of $his corset, and $he hyperventilates within its embrace as $he works. - <</switch>> - <<switch getSlave($AS).clothes>> - <<case "uncomfortable straps">> - In $his haste to get out of $his straps $he trips and falls flat. - <<case "clubslut netting">> - In $his haste to get out of $his slutty netting $he trips and falls flat. - <<case "shibari ropes">> - In $his haste to get out of $his shibari ropes $he only manages to get tangled and fall over. - <<case "a latex catsuit" "restrictive latex">> - In $his haste to get out of $his clinging latex $he trips and falls flat in a tangle of latex and trembling flesh. - <<case "a military uniform">> - $He's desperately torn between hurry to avoid punishment and fear $he'll damage $his shirt. - <<case "a schutzstaffel uniform">> - $He's desperately torn between hurry to avoid punishment and fear $he'll damage $his trousers. - <<case "a slutty schutzstaffel uniform">> - $He's desperately torn between hurry to avoid punishment and fear $he'll tear $his miniskirt. - <<case "a red army uniform">> - $He's desperately torn between hurry to avoid punishment and fear $he'll damage $his shirt. - <<case "a mounty outfit">> - $He's desperately torn between hurry to avoid punishment and fear $he'll damage $his slacks. - <<case "a nice nurse outfit">> - $He quickly tears off $his loose scrubs. - <<case "a biyelgee costume">> - $He quickly tears off $his loose dress. - <<case "a mini dress">> - $He struggles to take off $his tight mini dress. - <<case "attractive lingerie">> - $He almost tears $his delicate lingerie in $his haste to avoid punishment. - <<case "a succubus outfit">> - <<if ["a corset", "an extreme corset"].includes(getSlave($AS).bellyAccessory)>> - $He struggles with $his leather corset. - <<else>> - Panic sets in as $he hastily sheds what's left of $his outfit. - <</if>> - <<case "spats and a tank top">> - $He hastily slips $his top off and struggles to get out of $his clinging spats. - <<case "lederhosen">> - $He hastily slips $his tunic off and struggles to unbutton $his clinging shorts. - <<case "attractive lingerie for a pregnant woman">> - $He quickly sheds $his vest and tight bra before panicking and resorting to ripping $his silk panties off. - <<case "a maternity dress">> - $He hastily pulls $his dress down, revealing $his body. - <<case "a dirndl">> - $He hastily pulls $his dress down, revealing $his body. - <<case "a long qipao">> - $He hastily pulls $his dress down, revealing $his body. - <<case "stretch pants and a crop-top">> - $He hastily pulls $his crop-top over $his head and struggles to remove $his stretch pants only to get tangled and fall over. - <<case "a cheerleader outfit">> - $He yanks $his cheerleader skirt down and pulls $his slutty top off. - <<case "a string bikini">> - $He gives $himself a nasty pinch between the legs in $his haste to get out of $his string bottom. - <<case "a scalemail bikini">> - $He gives $himself a tiny cut on $his breast in $his haste to get out of $his scalemail top. - <<case "striped panties">> - $He yanks $his panties down, kicking them off to the side. - <<case "a monokini">> - $He nearly snaps the shoulder straps of $his monokini in $his haste to remove it. - <<case "overalls">> - $He nearly snaps the shoulder straps of $his overalls in $his haste to remove them. - <<case "an apron">> - $He quickly undoes $his apron's straps and hoists the garment over $his head. - <<case "a hijab and blouse" "conservative clothing">> - $He winds up tearing a few buttons off $his shirt in $his haste to remove it. - <<case "Western clothing">> - $He winds up tearing a few buttons off $his flannel shirt in $his haste to remove it. - <<case "a cybersuit">> - $He whimpers as $he knows $he can barely remove $his visor in that amount of time, let alone the whole bodysuit, but $he tries anyway. - <<case "a tight Imperial bodysuit">> - $He struggles valiantly to get $his tight-fitting bodysuit off, but can only frantically peel it down halfway in your short timeframe. - <<case "battlearmor">> - $He whimpers as $he knows $he can barely remove $his arm guards in that amount of time, let alone the whole suit, but $he tries anyway. - <<case "Imperial Plate">> - $He quietly whimpers, knowing that it'll take $him full minutes to completely get off $his ultra-heavy Imperial Plate. Nevertheless, $he makes a valiant effort. Having this heavily-armored tank squirming underneath you is almost amusing. - <<case "a fallen nuns habit">> - $He tugs desperately at the laces of $his tight latex nun getup. - <<case "a chattel habit">> - $He shucks $his habit off easily, since it was designed to be removed quickly. - <<case "a penitent nuns habit">> - $He pulls $his coarse habit over $his head, revealing $his chafed flesh. - <<case "cutoffs and a t-shirt">> - $He shimmies out of $his cutoffs and whips $his t-shirt over $his head. - <<case "a slutty nurse outfit">> - Getting out of $his tight nurse getup in that amount of time is impossible, but $he tries anyway. - <<case "a schoolgirl outfit">> - $His schoolgirl outfit is easily stripped off: $he pulls down $his skimpy skirt and tears off $his little blouse, and $he's nude. - <<case "a kimono">> - Getting out of $his kimono in that amount of time is flagrantly impossible, but $he tries anyway. - <<case "a klan robe">> - Because $he's nude under $his robes, $he simply lifts them over $his head. - <<case "a hijab and abaya" "a niqab and abaya">> - Because $he's nude under $his abaya, $he simply lifts it over $his head. - <<case "a burqa">> - Because $he's nude under $his burqa, $he simply lifts it over $his head. - <<case "a tube top and thong">> - $He shimmies out of $his thong and whips $his tube top over $his head. - <<case "a button-up shirt and panties">> - $He drops $his panties and lifts $his shirt over $his head. - <<case "a gothic lolita dress">> - Getting out of $his lolita dress in that amount of time is impossible, but $he tries anyway. - <<case "a hanbok">> - $He winds up tearing stitches out of $his shirt in $his haste to remove it. - <<case "a bra">> - Because $he's nude under $his bra, $he simply lifts it over $his head. - <<case "a button-up shirt">> - Because $he's nude under $his shirt, $he simply lifts it over $his head. - <<case "a nice pony outfit">> - $He whimpers as $he knows $he can't remove $his outfit without some help. - <<case "a slutty pony outfit">> - $He whimpers as $he knows $he can't remove $his outfit without some help. - <<case "a sweater">> - Because $he's nude under $his sweater, $he simply lifts it over $his head. - <<case "a tank-top">> - Because $he's nude under $his tank-top, $he simply lifts it over $his head. - <<case "a thong">> - $He slips out of $his thong and kicks it aside. - <<case "a tube top">> - Because $he's nude under $his tube top, $he simply lifts it over $his head. - <<case "a one-piece swimsuit">> - Because $he's nude under $his swimsuit, $he simply pulls it down past $his hips and wiggles free. - <<case "a police uniform">> - $He almost tears $his uniform in $his haste to avoid punishment. - <<case "a striped bra">> - Because $he's nude under $his bra, $he simply lifts it over $his head. - <<case "striped underwear">> - $He pulls off $his bra and panties with minimal effort. - <<case "a skimpy loincloth">> - $He slips out of $his loincloth and kicks it aside. - <<case "a slutty klan robe">> - $He slips off $his robe and throws it aside. - <<case "a sports bra">> - Because $he's nude under $his bra, $he simply lifts it over $his head. - <<case "a sweater and panties">> - $He tears $his sweater in $his haste and slips out of $his panties quickly. - <<case "a t-shirt">> - Because $he's nude under $his t-shirt, $he simply lifts it over $his head and throws it aside. - <<case "a tank-top and panties">> - $He yanks off $his t-shirt and drops $his panties. - <<case "a t-shirt and thong">> - $He yanks off $his t-shirt and drops $his thong. - <<case "an oversized t-shirt and boyshorts">> - $He yanks off $his t-shirt and drops $his boy shorts. - <<case "an oversized t-shirt">> - $He yanks off $his t-shirt. - <<case "a t-shirt and jeans">> - $He yanks off $his t-shirt but struggles to wiggle out of $his blue jeans. - <<case "boyshorts">> - $He drops $his shorts quickly. - <<case "cutoffs">> - $He wiggles out of $his shorts quickly. - <<case "leather pants and pasties">> - $He yanks $his pasties off but struggles to wiggle out of $his leather pants. - <<case "leather pants">> - $He struggles to wiggle out of $his leather pants. - <<case "panties">> - $He drops $his panties quickly. - <<case "sport shorts and a t-shirt">> - $He yanks off $his shirt and drops $his shorts. - <<case "a t-shirt and panties">> - $He yanks off $his t-shirt and drops $his panties. - <<case "panties and pasties">> - $He yanks off $his pasties and drops $his panties. - <<case "pasties">> - $He hastily yanks off $his pasties. - <<case "sport shorts and a sports bra">> - $He drops $his shorts and tosses $his bra. - <<case "jeans">> - $He struggles to wiggle out of $his blue jeans. - <<case "a sweater and cutoffs">> - $He tosses off $his sweater and drops $his shorts. - <<case "leather pants and a tube top">> - $He yanks $his tube top off but struggles to wiggle out of $his leather pants. - <<case "sport shorts">> - $He drops $his shorts quickly. - <<case "battledress">> - $He strips $his tank top off in one motion, unfastens $his belt, and pulls down $his pants, though $his boots defeat $him and stay on. - <<case "a slutty outfit">> - $He hurriedly strips $himself out of $his carefully chosen outfit. - <<case "a slave gown">> - $He's desperately torn between hurry to avoid punishment and fear $he'll rip $his delicate gown. - <<case "a halter top dress">> - $He's desperately torn between hurry to avoid punishment and fear $he'll rip $his delicate dress. - <<case "a ball gown">> - $He's desperately torn between hurry to avoid punishment and fear $he'll rip $his delicate silken ball gown. - <<case "nice business attire">> - $He's desperately torn between hurry to avoid punishment and fear $he'll damage $his blouse. - <<case "slutty business attire">> - $He's desperately torn between hurry to avoid punishment and fear $he'll tear $his suit in $his haste. - <<case "a nice maid outfit">> - $He pulls $his dress over $his head and quickly undoes the buttons of $his blouse, one after the other. - <<case "a slutty maid outfit">> - $His short dress comes off easily, but $he fumbles with the buttons on $his tight blouse. - <<case "a comfortable bodysuit">> - $He's desperately torn between hurry to avoid punishment and fear $he'll stretch out $his bodysuit. - <<case "a burkini">> - $He's desperately torn between hurry to avoid punishment and fear $he'll stretch out $his burkini. - <<case "a leotard">> - $His leotard is tight enough that $he has to struggle mightily to get it off that quickly. - <<case "a bunny outfit">> - $He's desperately torn between hurry to avoid punishment and fear $he'll put runs in $his hose. - <<case "kitty lingerie">> - $He almost tears $his decorative lingerie in $his haste to avoid punishment. - <<case "harem gauze">> - $He's desperately torn between hurry to avoid punishment and fear $he'll tear $his flimsy gauze. - <<case "a Santa dress">> - $He tears off some of $his dress's white fur trim in $his struggle to remove it. - <<case "slutty jewelry">> - $He hurriedly strips fine jewelry from $his neck, wrist<<if hasBothArms(getSlave($AS))>>s<</if>> and ankle<<if hasBothLegs(getSlave($AS))>>s<</if>>. - <<case "a courtesan dress">> - <<if ["a corset", "an extreme corset"].includes(getSlave($AS).bellyAccessory)>> - $His fingers fumble desperately with the straps of $his corset, knowing there is still a lot of dress left to remove after it. - <<else>> - Panic sets in as $he realizes just how much dress is left to remove. In $his haste, $he hooks a sleeve with $his foot and falls flat, exposing $his bare ass. - <</if>> - <<case "a bimbo outfit">> - In two swift motions $he's out of $his outfit. - <</switch>> - <</if>> -<</if>> - -<<if (getSlave($AS).fetish == "masochist") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 95)>> - The slap seems to have excited $him, seeing $his hard nipples and wet pussy, and $his eyes practically beg for more. -<<elseif (getSlave($AS).fetish == "masochist") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>> - $He seems to be a bit expectant of what is to come. -<</if>> - -<<if ($PC.dick != 0)>> - <<if hasAnyArms(getSlave($AS)) && (getSlave($AS).clothes !== "no clothing")>>While $he strips, your<<else>>Your<</if>> stiffening cock rises<<if $PC.vagina != -1>>, revealing your pussy and<</if>> earning -<<else>> - <<if hasAnyArms(getSlave($AS)) && (getSlave($AS).clothes !== "no clothing")>>While $he strips, you<<else>>You<</if>> don a cruelly large strap-on, earning -<</if>> -<<if (getSlave($AS).fetish == "masochist") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 95)>> - a sultry look -<<elseif (getSlave($AS).fetish == "masochist") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>> - a shy look -<<else>> - a frightened glance -<</if>> -from your victim. - -<<if isAmputee(getSlave($AS))>> - <<if (getSlave($AS).clothes !== "no clothing")>>Growing impatient, you rip the clothes off $his limbless torso<<else>>You walk up to $him<</if>> and spank $his brutally; spinning $him to present - <<if (getSlave($AS).vagina > -1)>> - $his holes - <<else>> - $his hole - <</if>> - to you and - <<if (getSlave($AS).fetish == "masochist") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>> - <<if canAchieveErection(getSlave($AS))>>making $his erect dick throb<<elseif getSlave($AS).vagina > -1>>making $his pussy throb<<else>>making $his butthole throb<</if>> - <</if>> - with anticipation. -<<else>> - You order $him to present <<if (getSlave($AS).vagina > -1)>>$his holes<<else>>$his hole<</if>> to you and spank $him brutally - <<if (getSlave($AS).fetish == "masochist") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>> - <<if canAchieveErection(getSlave($AS))>>making $his erect dick throb<<elseif getSlave($AS).vagina > -1>>making $his pussy throb<<else>>making $his butthole throb<</if>> - <</if>> - <<if getSlave($AS).devotion < -50>> - until $he complies. - <<elseif getSlave($AS).devotion < -20>> - as $he slowly complies. - <<elseif getSlave($AS).devotion <= 20>> - as $he fearfully complies. - <<elseif getSlave($AS).devotion <= 50>> - as $he rushes to comply. - <<else>> - as $he complies. - <</if>> -<</if>> - -<<if (App.Medicine.Modification.dyedSkins.includes(getSlave($AS).skin))>> - $His <<= getSlave($AS).skin>><<if $seeRace == 1>>, <<= getSlave($AS).race>><</if>> ass barely shows the spanking. -<<elseif (skinToneLevel(getSlave($AS)) < 5)>> - $His <<= getSlave($AS).skin>><<if $seeRace == 1>>, <<= getSlave($AS).race>><</if>> ass shows the spanking extremely well. -<<elseif (skinToneLevel(getSlave($AS)) < 12)>> - $His <<= getSlave($AS).skin>><<if $seeRace == 1>>, <<= getSlave($AS).race>><</if>> ass shows the spanking well. -<<elseif (skinToneLevel(getSlave($AS)) < 20)>> - $His <<= getSlave($AS).skin>><<if $seeRace == 1>>, <<= getSlave($AS).race>><</if>> ass barely shows the spanking. -<<else>> - $His <<= getSlave($AS).skin>><<if $seeRace == 1>>, <<= getSlave($AS).race>><</if>> ass barely shows any marks from the spanking. -<</if>> - -<<if (getSlave($AS).chastityPenis == 1)>> - You rip $his dick chastity off $him, though $he knows not to be relieved. $His cock is now vulnerable, not free. -<</if>> - -<<if (getSlave($AS).anus == 0)>> - The bitch's still a butthole virgin and you don't mean to take that now, but you torture $him with the threat of raping $his virgin ass for a while before settling for $his gagging throat. - <<set getSlave($AS).counter.oral++, $oralTotal++>> -<<elseif (getSlave($AS).chastityVagina) && canDoAnal(getSlave($AS))>> - The bitch's wearing a chastity belt, so $he isn't surprised when you shove <<if ($PC.dick == 0)>>the strap-on<<else>>your dick<</if>> up $his butt. What surprises $him is when you slide a finger or two in alongside your dick to stretch $him to the point of pain. - <<= VCheck.Anal(getSlave($AS), 1)>> - <<set _assPain = 1>> -<<elseif (getSlave($AS).vagina == 0)>> - The bitch's still a virgin and you don't mean to take that now, but you torture $him with the threat of raping $his virgin pussy for a while before settling for $his gagging throat. - <<set getSlave($AS).counter.oral++, $oralTotal++>> -<<elseif getSlave($AS).bellyPreg >= 600000>> - The bitch is on the brink of bursting, so hard intercourse will be painful and terrifying to $him. You thrust hard into $him causing $his taut belly to bulge and making $his children squirm within $his straining womb.<<if ($PC.vagina != -1) && ($PC.dick != 0)>> Fortunately for $him, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.<</if>> You brutally fuck $him as $he pleads for you to stop until you're at your edge. More cum won't make the bitch more pregnant, but you cum inside $him anyway. - <<= VCheck.Vaginal(getSlave($AS), 1)>> -<<elseif getSlave($AS).bellyPreg >= 120000>> - The bitch is hugely pregnant, so hard intercourse will be uncomfortable and worrying for $him. You have hard intercourse. $He sobs as you rock the huge weight of $his belly back and forth without mercy, forcing $his already straining belly to bulge further, and whines as $he feels your cockhead batter $his womb.<<if ($PC.vagina != -1) && ($PC.dick != 0)>> Fortunately for $him, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.<</if>> More cum won't make the bitch more pregnant, but you cum inside $him anyway. - <<= VCheck.Vaginal(getSlave($AS), 1)>> -<<elseif (getSlave($AS).preg > getSlave($AS).pregData.normalBirth/2)>> - The bitch is pregnant, so hard intercourse will be uncomfortable and even worrying for $him. You have hard intercourse. $He sobs as you saw the huge weight of $his belly back and forth without mercy, and whines as $he feels your cockhead batter $his womb.<<if ($PC.vagina != -1) && ($PC.dick != 0)>> Fortunately for $him, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.<</if>> More cum won't make the bitch more pregnant, but you cum inside $him anyway. - <<= VCheck.Vaginal(getSlave($AS), 1)>> -<<elseif (getSlave($AS).pregKnown == 1)>> - The bitch knows $he is pregnant, even if it isn't obvious yet, so hard intercourse will be uncomfortable and even worrying for $him. You have hard intercourse. $He sobs as you pound $his vagina without mercy, and whines as $he feels your cockhead batter $his womb.<<if ($PC.vagina != -1) && ($PC.dick != 0)>> Fortunately for $him, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.<</if>> More cum won't make the bitch more pregnant, but you cum inside $him anyway. - <<= VCheck.Vaginal(getSlave($AS), 1)>> -<<elseif (getSlave($AS).vagina == 1)>> - The bitch's pussy is tight, so you ram <<if ($PC.dick == 0)>>the strap-on<<else>>your dick<</if>> into $him without preamble and fuck $him hard and fast.<<if ($PC.vagina != -1) && ($PC.dick != 0)>> Fortunately for $him, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.<</if>> $His cunt spasms with the pain of the rape. You cum in no time. - <<= VCheck.Vaginal(getSlave($AS), 1)>> -<<elseif (getSlave($AS).anus == 1)>> - The bitch's butt is tight, so you ram <<if ($PC.dick == 0)>>the strap-on<<else>>your dick<</if>> into $him without lubricant and sodomize $him as hard as you can without damaging your property.<<if ($PC.vagina != -1) && ($PC.dick != 0)>> Fortunately for $him, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.<</if>> $His asshole spasms with the pain of the rape. You cum explosively. - <<= VCheck.Anal(getSlave($AS), 1)>> - <<set _assPain = 1>> -<<elseif (getSlave($AS).dick > 0) && (getSlave($AS).scrotum > 0)>> - You ram <<if ($PC.dick == 0)>>the strap-on<<else>>your dick<</if>> into $his sissy butt without lubricant. As $he flinches you announce that $he'll be taking part in giving $himself anal pain. $He humps into you lamely, so you administer a truly agonizing slap to $his balls<<if ($PC.dick == 0)>><<else>> that makes $his anal ring stiffen deliciously around your dick<</if>>. To avoid further punishment $he fucks $himself against you almost hard enough to hurt $himself.<<if ($PC.vagina != -1) && ($PC.dick != 0)>> Fortunately for $him, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.<</if>> You orgasm explosively. - <<= VCheck.Anal(getSlave($AS), 1)>> - <<set _assPain = 1>> -<<elseif (getSlave($AS).dick > 0)>> - You ram <<if ($PC.dick == 0)>>the strap-on<<else>>your dick<</if>> into $his gelded butt without lubricant and sodomize $him as hard as you can without damaging your property.<<if $PC.vagina != -1>> Fortunately for $him, this gets you so wet that some of your pussyjuice makes it down onto your shaft and serves as improvised lube.<</if>> $He's such a slut that $he shows signs of enjoyment, but you put a stop to that whenever it happens by slapping and flicking $his cock. You cum explosively. - <<= VCheck.Anal(getSlave($AS), 1)>> - <<set _assPain = 1>> -<<else>> - $He's got no special physical targets for abuse, so you just rape $him hard and fast, raining stinging slaps down on $him as you do. $He cries and whimpers; you finish. - <<= VCheck.Both(getSlave($AS), 1)>> -<</if>> -<<if ($AS !== $BodyguardID)>> - This leaves $him sobbing on the floor <<if ($PC.dick == 0)>>as you shuck off the strap-on and drop it on $his face<<else>>with cum dripping out of $him<</if>>. -<<elseif ($AS == $BodyguardID) && (getSlave($AS).fetish == "masochist") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 95)>> - $He thanks you rapidly, trying to break away from the pleasure of your reward. $He quickly gets back to $his feet and stumbles towards the shower, to make sure you won't stay unprotected too long. -<<else>> - Even though $he's in a somewhat bad shape, $he still jumps back to $his feet and stumbles towards the shower, to make sure you won't stay unprotected too long. -<</if>> - -<<if ($AS !== $BodyguardID)>> - <<if getSlave($AS).minorInjury == 0>> - <<if _assPain == 1>> - The anal rape leaves $him with a sore butthole. - <<elseif random(1,100) > 50>> - <<set getSlave($AS).minorInjury = either("black eye", "bruise", "split lip")>> - Your abuse gave $him a <<= getSlave($AS).minorInjury>>. - <</if>> - <</if>> -<</if>> - -<<if getSlave($AS).bellyPreg >= 600000>> - The rough fucking was @@.health.dec;very unhealthy@@ for $his massive pregnancy. - <<run healthDamage(getSlave($AS), 40)>> -<</if>> - -<<if ($AS == $BodyguardID)>> - <<if (getSlave($AS).muscles <= 5) && (getSlave($AS).skill.combat == 0)>> - Your bodyguard accepts this as a punishment for $his uselessness. - <<elseif (getSlave($AS).muscles <= 5) && (getSlave($AS).skill.combat != 0)>> - Your bodyguard accepts this as a punishment for $his lack of muscles - <<elseif (getSlave($AS).muscles > 30) && (getSlave($AS).skill.combat == 0)>> - Your bodyguard accepts this as a punishment for $his lack of combat skills - <<elseif (getSlave($AS).muscles > 5) && (getSlave($AS).skill.combat != 0)>> - Your bodyguard just admits it as a part of $his body training. - <<elseif (getSlave($AS).muscles > 5) && (getSlave($AS).skill.combat == 0)>> - Your bodyguard accepts this as a punishment for $his lack of expertise - <</if>> - <<if (getSlave($AS).fetish == "masochist") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1)>> - Though $he secretly got off on the pain and humiliation. - <</if>> -<<elseif (getSlave($AS).fetish == "masochist") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1)>> - $He secretly got off on the pain and humiliation. -<<elseif $arcologies[0].FSDegradationist != "unset">> - $He knew that a degradationist arcology wouldn't be easy on $him, so even if $he resents it, $he tries to accept it. -<<elseif getSlave($AS).devotion < -50>> - $His @@.mediumorchid;hatred@@ and @@.gold;fear@@ of you have increased. - <<set getSlave($AS).devotion-=4, getSlave($AS).trust-=4>> -<<elseif getSlave($AS).devotion < -20>> - $His @@.mediumorchid;resistance@@ to and @@.gold;fear@@ of you have increased. - <<set getSlave($AS).devotion-=4, getSlave($AS).trust-=4>> -<<elseif getSlave($AS).devotion <= 20>> - $His @@.gold;fear@@ of you is tinged with @@.mediumorchid;hatred.@@ - <<set getSlave($AS).devotion-=4, getSlave($AS).trust-=4>> -<<elseif getSlave($AS).devotion <= 50>> - $His @@.mediumorchid;obedience to you is reduced,@@ and $he @@.gold;fears@@ further abuse. - <<set getSlave($AS).devotion-=4, getSlave($AS).trust-=4>> -<<else>> - $He is so devoted to you that $he accepts your abuse as $his just due, but $he now @@.gold;fears@@ you more and trusts you less. - <<set getSlave($AS).trust-=4>> -<</if>> - -<<if (random(1,100) > (20+getSlave($AS).devotion+getSlave($AS).trust))>> - <<if (getSlave($AS).fetish !== "submissive") && (getSlave($AS).fetish !== "masochist") && ($AS != $BodyguardID)>> - <<set _seed = random(1,8)>> - Brutal abuse has left $him - <<if (_seed == 1) && (getSlave($AS).behavioralFlaw !== "odd")>> - @@.red;acting strangely.@@ - <<set getSlave($AS).behavioralFlaw = "odd">> - <<elseif (_seed == 2) && (getSlave($AS).behavioralFlaw !== "anorexic")>> - @@.red;starving $himself@@ in a crippling attempt to be pretty. - <<set getSlave($AS).behavioralFlaw = "anorexic">> - <<elseif (_seed == 3) && (getSlave($AS).behavioralFlaw !== "gluttonous")>> - @@.red;stress eating@@ whenever $he can. - <<set getSlave($AS).behavioralFlaw = "gluttonous">> - <<elseif (_seed == 4) && (getSlave($AS).behavioralFlaw !== "devout")>> - @@.red;praying in private@@ whenever $he can. - <<set getSlave($AS).behavioralFlaw = "devout">> - <<elseif (_seed == 5) && (getSlave($AS).sexualFlaw !== "apathetic")>> - @@.red;sexually apathetic,@@ since $he feels it cannot go well for $him. - <<set getSlave($AS).sexualFlaw = "apathetic">> - <<elseif (_seed == 6) && (getSlave($AS).sexualFlaw !== "crude")>> - @@.red;sexually crude,@@ out of an unconscious belief that sex is ugly and unworthy of effort. - <<set getSlave($AS).sexualFlaw = "crude">> - <<elseif (_seed == 7) && (getSlave($AS).sexualFlaw !== "judgemental")>> - @@.red;sexually judgemental,@@ out of an unconscious desire to disqualify people from being good enough to have sex with $him. - <<set getSlave($AS).sexualFlaw = "judgemental">> - <<elseif ($PC.dick != -1)>> - @@.red;hating men,@@ since you forced your cock on $him. - <<set getSlave($AS).behavioralFlaw = "hates men">> - <<else>> - @@.red;hating women,@@ since you forced your cunt on $him. - <<set getSlave($AS).behavioralFlaw = "hates women">> - <</if>> - <</if>> -<</if>> -<<if (random(1,100) > (50+getSlave($AS).devotion+getSlave($AS).trust)) && ($AS !== $BodyguardID)>> - <<if (getSlave($AS).fetish !== "mindbroken") && (getSlave($AS).fetishKnown == 0) && (getSlave($AS).clitSetting !== getSlave($AS).fetish)>> - $His acceptance of your abuse has twisted $his - <<if (random(1,2) == 1) && (getSlave($AS).fetish !== "submissive")>> - @@.lightcoral;sexuality towards submissiveness.@@ - <<set getSlave($AS).fetish = "submissive", getSlave($AS).fetishKnown = 1>> - <<elseif (getSlave($AS).fetish !== "masochism")>> - @@.lightcoral;sexuality towards masochism.@@ - <<set getSlave($AS).fetish = "masochism", getSlave($AS).fetishKnown = 1>> - <</if>> - <</if>> -<</if>> -<<if getSlave($AS).fetish == "mindbroken" && getSlave($AS).relationship == -3>> - <<if def getSlave($AS).kindness>> - <<set getSlave($AS).kindness = 0>> - <</if>> -<</if>> diff --git a/src/npc/interaction/fAnimal.js b/src/npc/interaction/fAnimal.js index d8a064064ce3a29c66ae694fe26b0374d4d78c0c..3ba0b8d8e1cb82acf7bcefa063cbe6a18f26ce5f 100644 --- a/src/npc/interaction/fAnimal.js +++ b/src/npc/interaction/fAnimal.js @@ -158,7 +158,10 @@ App.Interact.fAnimal = function(slave, type) { mainSpan.append(`${slave.slaveName} visibly blanches at the thought of having to suck down an animal's cum, but ${he} is so devoted to you that ${he} reluctantly agrees. `); } } else { - if ((act === Acts.VAGINAL && slave.vagina > 0) || (act === Acts.ANAL && slave.anus > 0)) { + if ( + (act === Acts.VAGINAL && slave.vagina > 0) || + (act === Acts.ANAL && slave.anus > 0) + ) { if (slaveApproves()) { mainSpan.append(`${slave.slaveName}'s face visibly brightens at the thought of ${fetishDesc}, even if the dick is an animal's. `); } else { @@ -186,7 +189,10 @@ App.Interact.fAnimal = function(slave, type) { mainSpan.append(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of blowing an animal, but quickly regains ${his} composure. `); } } else { - if ((act === Acts.VAGINAL && slave.vagina > 0) || (act === Acts.ANAL && slave.anus > 0)) { + if ( + (act === Acts.VAGINAL && slave.vagina > 0) || + (act === Acts.ANAL && slave.anus > 0) + ) { if (slaveApproves()) { mainSpan.append(`${slave.slaveName} doesn't seem terribly keen on the idea of fucking an animal, but the thought of ${fetishDesc} seems to be enough to win ${him} over. `); } else { @@ -265,7 +271,7 @@ App.Interact.fAnimal = function(slave, type) { if (act === Acts.ORAL) { r.push(`You have ${him} kneel on the floor before calling in the ${animal.name}. The beast slowly saunters up to the slave where ${he} waits, showing little concern when the slave reaches out and begins masturbating it to begin the process of getting the animal hard. Once the ${animal.name} is hard enough, ${slave.slaveName} takes its cock and begins to give it a few tentative licks before finally putting it in ${his} mouth. `); } else { - r.push(`You have ${him} ${slave.clothes !== "no clothing" ? `take off ${his} clothes and ` : ``}get on the floor, ass in the air, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few short moments for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed. `); + r.push(`You have ${him} ${App.Data.clothes.get(slave.clothes).exposure <= 3 ? `take off ${his} clothes and ` : ``}get on the floor, ass in the air, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few short moments for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed. `); } switch (animal) { @@ -340,7 +346,7 @@ App.Interact.fAnimal = function(slave, type) { if (act === Acts.ORAL) { r.push(`You tell ${him} to kneel on the floor before calling in the ${animal.name}. The beast slowly saunters up to the slave where ${he} waits, showing little concern when the slave hesitantly reaches out and begins masturbating it to begin the process of getting the animal hard. Once the ${animal.name} is hard enough, ${slave.slaveName} takes its cock, and, after taking a moment to steel ${his} resolve, begins to give it a few reluctant licks before putting it in ${his} mouth. `); } else { - r.push(`You tell ${him} to ${slave.clothes !== "no clothing" ? `take off ${his} clothes and ` : ``}get on the floor, ass in the air, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few seconds for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed. `); + r.push(`You tell ${him} to ${App.Data.clothes.get(slave.clothes).exposure <= 3 ? `take off ${his} clothes and ` : ``}get on the floor, ass in the air, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few seconds for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed. `); } switch (animal) { @@ -415,7 +421,7 @@ App.Interact.fAnimal = function(slave, type) { if (act === Acts.ORAL) { r.push(`You force ${him} to kneel on the floor before calling in the ${animal.name}. The beast slowly saunters up to the slave where ${he} waits, showing little concern when the slave reluctantly reaches out and begins masturbating it to begin the process of getting the animal hard. Once the ${animal.name} is hard enough, ${slave.slaveName} takes its cock and begins to give it a few tentative licks before finally putting it in ${his} mouth. `); } else { - r.push(`You force ${him} to ${slave.clothes !== "no clothing" ? `take off ${his} clothes and ` : ``}get on the floor, ass in the air, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few short moments for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed. `); + r.push(`You force ${him} to ${App.Data.clothes.get(slave.clothes).exposure <= 3 ? `take off ${his} clothes and ` : ``}get on the floor, ass in the air, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few short moments for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed. `); } switch (animal) { @@ -490,7 +496,7 @@ App.Interact.fAnimal = function(slave, type) { if (act === Acts.ORAL) { r.push(`You have to physically force ${him} to kneel on the floor before calling in the ${animal.name}. The beast slowly saunters up to the slave where ${he} is restrained, showing little concern when another slave reaches out and begins masturbating it to begin the process of getting the animal hard. Once the ${animal.name} is hard enough, the slave takes its cock and lines it up with ${slave.slaveName}'s mouth. The animal needs no prompting, and thrusts itself into ${his} ring-gagged mouth. `); } else { - r.push(`You have to physically force ${him} to ${slave.clothes !== "no clothing" ? `take off ${his} clothes and ` : ``} get on the floor, ass in the air and restraints around ${his} wrists and ankles, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few short moments for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed. `); + r.push(`You have to physically force ${him} to ${App.Data.clothes.get(slave.clothes).exposure <= 3 ? `take off ${his} clothes and ` : ``} get on the floor, ass in the air and restraints around ${his} wrists and ankles, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few short moments for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed. `); } switch (animal) { diff --git a/src/npc/interaction/fAnus.js b/src/npc/interaction/fAnus.js new file mode 100644 index 0000000000000000000000000000000000000000..fbad482c6877711f7dd728fbfde480af8c57d1d9 --- /dev/null +++ b/src/npc/interaction/fAnus.js @@ -0,0 +1,457 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fAnus = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself, girl + } = getPronouns(slave); + + seX(slave, "anal", V.PC, "penetrative"); + + r.push(`You call ${him} over so you can`); + if (slave.anus > 3) { + r.push(`fuck ${his} gaping anus.`); + } else if (slave.anus === 3) { + r.push(`fuck ${his} loose butthole.`); + } else if (slave.anus === 2) { + r.push(`use ${his} whorish asshole.`); + } else if (slave.anus === 1) { + r.push(`use ${his} tight butt.`); + } else { + r.push(`take ${his} anal virginity.`); + } + + if (slave.fetish === "buttslut" && slave.devotion >= -20) { + r.push(`${He}'s delighted at the prospect of ${his} favorite activity.`); + } else if (slave.fetish === "buttslut") { + r.push(`${He} perks up at the prospect of ${his} favorite activity, but the idea of spending it with you instantly sours ${his} mood.`); + } + + if (slave.anusTat === "tribal patterns") { + r.push(`${His} bleached asshole is an inviting sight, after all.`); + } else if (slave.anusTat === "scenes") { + r.push(`${His} tattooed asshole invites sodomy, after all.`); + } else if (slave.anusTat === "degradation") { + r.push(`The tattoos on ${his} asshole make it clear ${he}'s an anal slut, after all.`); + } + + if (slave.heels === 1) { + if (shoeHeelCategory(slave) > 0) { + r.push(`As ${he} went past your desk, ${his} high heels and surgically altered legs enforced a gait that presented ${his} butt enticingly.`); + } else { + r.push(`As ${he} crawls along on`); + if (hasAllLimbs(slave)) { + r.push(`all fours,`); + } else { + r.push(`the ground,`); + } + r.push(`${his} anus is readily available.`); + } + } + + if (slave.anusPiercing > 1) { + r.push(`The ring of stud piercings around ${his} anus should massage you delightfully as you sodomize ${him}.`); + } else if (slave.anusPiercing === 1) { + r.push(`${His} perineum piercing has a big ring in it, which you should be able to feel when you hilt yourself in ${his} ass.`); + } + + if (slave.anusTat !== 0 && slave.anusTat !== 4) { + r.push(`${His} anus is invitingly bleached,`); + if (slave.vagina > -1) { + r.push(`which is appropriate: rather than looking like ${he} has a hole for fucking and an ass, it looks like ${he} has two fuckholes.`); + } else { + r.push(`making ${his} sole fuckable hole look nice and natural.`); + } + } + + if (slave.anus === 0) { + if (slave.devotion > 20) { + r.push(`${He} accepts your orders without comment and presents ${his} virgin anus for defloration. You`); + if (V.PC.dick === 0) { + r.push(`don a strap-on and`); + } + r.push(`gently sodomize ${him}. You gently ease into ${his} butthole and slowly accelerate your thrusting into ${his} ass. Since ${he} is already well broken, this new connection with ${his} ${getWrittenTitle(slave)} <span class="devotion inc">increases ${his} devotion to you.</span> <span class="virginity loss">${His} tight little ass has been broken in.</span> ${He} looks forward to having ${his} asshole fucked by you again.`); + slave.devotion += 4; + } else if (slave.devotion >= -20) { + r.push(`${He} is clearly unhappy at the idea of taking a dick up ${his} butt. ${He} obeys orders anyway, and lies there wincing and moaning as you`); + if (V.PC.dick === 0) { + r.push(`don a strap-on and`); + } + r.push(`fuck ${his} ass. You gently ease into ${his} butthole and slowly accelerate your thrusting into ${his} ass. However ${he} still squeals in pain as you continue pounding. <span class="virginity loss">${His} tight little ass has been broken in,</span> and ${he} <span class="trust dec">fears further anal pain.</span>`); + slave.trust -= 5; + } else { + r.push(`${He} is appalled at the idea of taking it up the ass${(V.PC.dick === 0) ? `and cries with fear as you don a strap-on` : ``}. ${He} does anyway though, sobbing into the cushions`); + if (hasAnyArms(slave)) { + r.push(`while you hold ${his} ${hasBothArms(slave) ? `arms` : `arm`}behind ${him}`); + } + r.push(r.pop() + `.`); + r.push(`You force yourself into ${his} butthole and continue thrusting your member into ${his} ass. ${He} sobs and cries with disgust while you pump into ${his} rear. The painful anal rape <span class="devotion dec">decreases ${his} devotion to you.</span> <span class="virginity loss">${His} tight little ass has been broken in,</span> and ${he} is <span class="trust dec">terrified of further anal pain.</span>`); + slave.devotion -= 10; + slave.trust -= 10; + } + slave.anus++; + } else if (slave.fetish === "mindbroken") { + if (hasAnyArms(slave)) { + r.push(`You instruct ${him} to present ${his} anus. ${He} dully`); + if (hasBothLegs(slave)) { + r.push(`kneels`); + } else { + r.push(`bends over`); + } + r.push(`and spreads ${his} buttocks${V.PC.dick === 0 ? `as you don a strap-on` : ``}. You spit on ${his} hole and ram`); + if (V.PC.dick === 0) { + r.push(`it`); + } else { + r.push(`your cock`); + } + r.push(`up ${his} butt.`); + } else { + r.push(`Talking to a broken mind is pointless, so you simply set ${him} on the couch, spread ${his} buttocks with one hand, spit on ${his} hole, and ram`); + if (V.PC.dick === 0) { + r.push(`it`); + } else { + r.push(`your cock`); + } + r.push(`up ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`butt.`); + } + r.push(`${His} butthole spasms as you assrape ${him},`); + if (V.PC.dick === 0) { + r.push(`an amusing sight.`); + } else { + r.push(`squeezing your dick nicely.`); + } + if (slave.dick !== 0 && canAchieveErection(slave)) { + if (slave.chastityPenis === 1) { + r.push(`Automatic responses give ${him} an erection, which ${his} chastity makes so uncomfortable that ${he} spasms. This cycle continues repeatedly, ${his} rectum squeezing unconsciously each time.`); + } else if (slave.prostate !== 0) { + r.push(`Despite ${his} mental deficiency, the prostate stimulation gives ${him} an erection anyway.`); + } else { + r.push(`Without a prostate, there's little stimulation to provoke an involuntary response, and ${his} cock stays limp.`); + } + } else if (slave.chastityPenis === 1) { + r.push(`${His} dick chastity keeps ${his} pointless cock hidden away while you use ${his} anus like a pussy.`); + } else if (slave.dick !== 0) { + r.push(`${His} cock is totally flaccid throughout.`); + } + } else if (slave.devotion < -20) { + if (!isAmputee(slave)) { + r.push(`You instruct ${him} to present ${his} anus${V.PC.dick === 0 ? `as you don a strap-on` : ``}. Horrified, ${he} tries to back away, but you catch ${him} and throw ${him} on the couch next to your desk. ${He} tries to`); + if (hasAnyArms(slave)) { + r.push(`shield ${his} asshole,`); + } else { + r.push(`back away,`); + } + r.push(`but you pin`); + if (hasAnyArms(slave)) { + r.push(`${his} hand`); + if (hasBothArms(slave)) { + r.push(`s`); + } + r.push(`behind ${him} with one hand,`); + } else { + r.push(`${him} down,`); + } + r.push(`spit on ${his} hole, and ram your`); + if (V.PC.dick === 0) { + r.push(`fake dick`); + } else { + r.push(`cock`); + } + r.push(`up ${his} butt with the other hand.`); + } else { + r.push(`You tell ${him} it's time for an assfuck. ${He}'s horrified, but as an amputee can do nothing about it. You spit on ${his} hole and ram your`); + if (V.PC.dick === 0) { + r.push(`fake dick`); + } else { + r.push(`cock`); + } + r.push(`up ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`butt.`); + } + r.push(`${His} butthole spasms as you assrape ${him},`); + if (V.PC.dick === 0) { + r.push(`an amusing sight.`); + } else { + r.push(`squeezing your dick nicely.`); + } + if (slave.dick !== 0 && canAchieveErection(slave)) { + if (slave.prostate === 0) { + r.push(`${He} lacks a prostate, denying ${him} any real pleasure from this. ${His} dick stays flaccid as you rape ${him}.`); + } else if (slave.chastityPenis === 1) { + r.push(`Despite ${his} unwillingness to be sodomized, the prostate stimulation starts to give ${him} an erection, which ${his} dick chastity makes horribly uncomfortable. ${He} bucks with the pain, ${his} asshole spasming delightfully.`); + } else { + r.push(`Despite ${his} unwillingness to be sodomized, the prostate stimulation gives ${him} an erection. ${He}'s mortified that ${he} would get hard while being anally raped.`); + } + } else if (slave.chastityPenis === 1) { + r.push(`${His} dick chastity keeps ${his} bitch cock hidden away while you use ${his} anus like a pussy.`); + } else if (slave.dick !== 0) { + r.push(`${His} flaccid dick is ground into the back of the couch as you rape ${him}.`); + } + } else if (slave.devotion <= 20 && slave.vagina < 0) { + if (!isAmputee(slave)) { + r.push(`You instruct ${him} to present ${his} anus${V.PC.dick === 0 ? `as you don a strap-on` : ``}. ${He} knows a sissy slave takes it up the butt, and lies on the couch next to your desk with ${his}`); + if (!hasAnyLegs(slave)) { + r.push(`hips`); + } else { + r.push(hasBothLegs(slave) ? `legs` : `leg`); + } + r.push(`in the air, spreading ${his} buttocks`); + if (!hasAnyArms(slave)) { + r.push(`as best ${he} can.`); + } else { + r.push(`with ${his} ${hasBothArms(slave) ? `hands` : `hand`}.`); + } + } else { + r.push(`You tell ${him} it's time for an assfuck. ${He}'s hesitant, but as an amputee can do nothing about it.`); + } + r.push(`You take your time and fuck ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`butthole for a good long while`); + if (slave.chastityPenis !== 1) { + if (slave.dick !== 0) { + r.push(`so ${his} limp dick flops around`); + } else if (slave.balls !== 0) { + r.push(`as ${his} erect dick waves in the air`); + } + } + r.push(r.pop() + `.`); + r.push(`This gives you enough time to stroke ${him} until ${he} gets aroused despite ${his} discomfort with anal. ${He} doesn't orgasm, but ${he}'s getting accustomed to ${his} asshole as a sexual organ.`); + } else if (slave.devotion < 10) { + if (!isAmputee(slave)) { + r.push(`You instruct ${him} to present ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`anus${V.PC.dick === 0 ? `as you don a strap-on` : ``}. ${He} hesitates but eventually lies on the couch next to your desk with ${his}`); + if (!hasAnyLegs(slave)) { + r.push(`hips`); + } else { + r.push(hasBothLegs(slave) ? `legs` : `leg`); + } + r.push(`in the air, spreading ${his} buttocks`); + if (!hasAnyArms(slave)) { + r.push(`as best ${he} can.`); + } else { + r.push(`with ${his} ${hasBothArms(slave) ? `hands` : `hand`}.`); + } + } else { + r.push(`You tell ${him} it's time for an assfuck. ${He}'s hesitant, but as an amputee can do nothing about it.`); + } + r.push(`You take your time and fuck ${his} butthole for a good long while.`); + if (slave.anus === 1) { + r.push(`${His} ass is so tight that ${he} winces with anal pain`); + } else if (slave.anus === 2) { + r.push(`${His} experienced ass takes your`); + if (V.PC.dick === 0) { + r.push(`fake dick`); + } else { + r.push(`cock`); + } + r.push(`without trouble`); + } else { + r.push(`${His} asspussy is so loose you can pound it as hard as you like`); + } + if (slave.dick !== 0) { + r.push(`as ${his} limp dick flops around.`); + } else if (slave.dick !== 0) { + r.push(`as ${his} erect dick waves in the air.`); + } else if (slave.vagina === -1) { + r.push(`as it does its duty as ${his} sole fuckhole.`); + } else { + r.push(`as it substitutes for ${his} pussy.`); + } + r.push(`${He} gets aroused despite ${his} discomfort with anal, though ${he} doesn't orgasm.`); + } else { + if (hasAnyLegs(slave)) { + r.push(`${He} kneels on the couch`); + } else { + r.push(`You lay ${him} on the couch`); + } + r.push(`with ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`butt facing you, back strongly arched to angle ${his} rectum for more comfortable anal coupling.`); + if (hasAnyArms(slave) && slave.prostate > 1 && slave.dick > 3) { + if (V.PC.dick === 0) { + r.push(`While you don a strap-on, ${he}`); + } else { + r.push(`${He}`); + } + r.push(`shoves ${his} slavering dick down and around towards ${his} ass and squeezes it, pushing a lot of ${his} precum out to lube ${his} own asshole.`); + } else { + if (V.PC.dick === 0) { + r.push(`You don a strap-on and let some saliva fall onto its head`); + } else { + r.push(`You let some saliva fall onto your dickhead`); + } + r.push(`before penetrating ${him}.`); + } + r.push(`You take your time and fuck ${his} butthole for a good long while.`); + if (slave.anus === 1) { + r.push(`${His} ass is so tight that ${he} has to concentrate on relaxing for you.`); + } else if (slave.anus === 2) { + r.push(`${His} experienced ass feels great.`); + } else { + r.push(`${His} asspussy is so loose you can pound it as hard as you like.`); + } + r.push(`${He} rubs ${his}`); + if (!hasAnyArms(slave)) { + r.push(`body against you as much as ${he} can manage,`); + } else if (canAchieveErection(slave)) { + r.push(`hard-on,`); + } else if (slave.dick !== 0) { + r.push(`soft dick,`); + } else if (slave.chastityVagina || slave.clit === 0) { + r.push(`nipples,`); + } else if (slave.clit > 2) { + r.push(`huge, stiff clit,`); + } else { + r.push(`clit,`); + } + r.push(`and brings ${himself} to orgasm before you.`); + if (V.PC.dick === 0) { + r.push(`The sight of ${him} gasping and shaking ${his} way through an anal orgasm brings you to climax yourself, and you shove yourself against the strap-on harness with enough force to give the slave's sensitized hole a final brutal stretching.`); + } else { + r.push(`${His} orgasmic rectal spasms squeeze your cock and you blow your load inside ${his} ass.`); + } + } + + if (slave.bellyPreg >= 1500) { + r.push(`The poor slave's pregnant belly causes ${him} some discomfort as you sodomize ${him}.`); + } else if (slave.bellyImplant >= 1500) { + r.push(`The poor ${girl}'s implant filled belly causes ${him} some discomfort as you sodomize ${him}.`); + } else if (slave.bellyFluid >= 1500) { + r.push(`The poor ${girl}'s sloshing belly causes ${him} some discomfort as you sodomize ${him}, though the lewd jiggling the pounding sends through it is quite a sight.`); + } + + if (slave.anusTat === "scenes" && slave.anus === 1) { + r.push(`As you fucked ${his} butt, the decorative pattern around ${his} ass stretched open. When you pull out, ${his} momentary gape closes the pattern up quickly.`); + } else if (slave.anusTat === "scenes") { + r.push(`As you fucked ${his} butt, the decorative pattern around ${his} ass stretched open. When you pull out, ${his} gape leaves the pattern distorted.`); + } else if (slave.anusTat === "degradation") { + r.push(`As you fucked ${his} butt, the offensive language around ${his} ass stretched and distorted.`); + } + + if (random(1, 100) > (100 + slave.devotion)) { + if (slave.fetish !== "buttslut" && slave.energy <= 95 && slave.sexualFlaw !== "hates anal") { + r.push(`Being assraped has given ${him} a <span class="flaw gain">hatred of anal sex.</span>`); + slave.sexualFlaw = "hates anal"; + } + } else if (random(1, 100) > (110-slave.devotion)) { + if (slave.fetish === "none" && slave.sexualFlaw !== "hates anal") { + r.push(`Orgasming to the sensation of your member in ${his} bottom <span class="fetish gain">has ${him} eager for anal.</span>`); + slave.fetish = "buttslut"; + slave.fetishKnown = 1; + } + } + + if (V.PC.dick !== 0) { + if (slave.cervixImplant === 2 || slave.cervixImplant === 3) { + slave.bellyImplant += random(10, 20); + } + + if (slave.anus > 3) { + r.push(`Your cum falls out of ${his} gaping hole.`); + } else if (slave.anus > 2) { + r.push(`Cum flows out of ${his} gaped butthole.`); + } else if (slave.anus === 2) { + r.push(`Cum drips out of ${his} newly gaped anus.`); + } else if (slave.anus === 1) { + r.push(`${His} still-tight ass keeps your load inside ${him}.`); + } + + if (canImpreg(slave, V.PC)) { + r.push(knockMeUp(slave, 5, 1, -1)); + } + + if (V.postSexCleanUp > 0) { + if (canMove(slave)) { + let anus; + if (slave.anus < 2) { + anus = "tight butt"; + } else if (slave.anus < 3) { + anus = "used butthole"; + } else if (slave.anus < 4) { + anus = "gaping butthole"; + } else { + anus = "anal gape"; + } + switch (slave.assignment) { + case "work in the brothel": + r.push(`${He} goes to wash ${his} ${anus} so ${his} next customer can have the illusion that he's the first to use it today.`); + break; + case "serve in the club": + r.push(`${He} goes to wash and delicately perfume ${his} ${anus} so it can gratify the finest citizen.`); + break; + case "work in the dairy": + r.push(`${He} goes off to carefully wash ${his} ${anus} to avoid besmirching the nice clean dairy.`); + break; + case "work as a farmhand": + r.push(`${He} goes off to wash ${his} ${anus} to avoid tainting the food in ${V.farmyardName}.`); + break; + case "work as a servant": + r.push(`${He} rushes to wash ${his} ${anus}, impatient to get back to ${his} many chores.`); + break; + case "work as a nanny": + r.push(`${He} goes off to wash ${his} ${anus}, before hurrying to continue taking care of the children in ${V.nurseryName}.`); + break; + case "whore": + r.push(`${He} uses an enema to clean ${his} ${anus} before returning to offering it for sale.`); + break; + case "serve the public": + r.push(`${He} uses an enema to clean ${his} ${anus} before returning to offering it for free.`); + break; + case "be a servant": + r.push(`${He} uses an enema to clean ${his} ${anus}, since ${his} chores didn't perform themselves while you used ${his} backdoor.`); + break; + case "rest": + r.push(`${He} uses an enema to clean ${his} ${anus} before crawling back into bed, face-down.`); + break; + case "get milked": + r.push(`${He} uses an enema to clean ${his} ${anus}`); + if (slave.lactation > 0) { + r.push(`before going to get ${his} uncomfortably milk-filled tits drained.`); + } else { + r.push(`and then rests until ${his} balls are ready to be drained again.`); + } + break; + case "please you": + r.push(`${He} uses an enema to clean ${his} ${anus} before returning to await your next use of ${his} backdoor, as though nothing had happened.`); + break; + case "be a subordinate slave": + r.push(`${He} uses an enema to clean ${his} ${anus}, though it's only a matter of time before another slave decides to play with ${his} backdoor.`); + break; + case "be your Head Girl": + r.push(`${He} uses an enema to clean ${his} ${anus}, worried that ${his} charges got up to trouble while ${he} enjoyed the buttsex.`); + break; + case "guard you": + r.push(`${He} hurries off to wash ${his} ${anus} so you'll be unguarded for as little time as possible.`); + break; + case "train slaves": + r.push(`${He} uses an enema to clean ${his} ${anus} before ${he} returns to teaching ${his} classes, a little bow-legged.`); + break; + default: + r.push(`${He} hurries off to wash ${his} ${anus} before going back to ${slave.assignment}.`); + } + } + } + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fAnus.tw b/src/npc/interaction/fAnus.tw deleted file mode 100644 index 33ab80883491ed20b1957f7e5c7786a19d531b76..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fAnus.tw +++ /dev/null @@ -1,248 +0,0 @@ -:: FAnus [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> -<<set getSlave($AS).counter.anal++, $analTotal++>> - -You call $him over so you can -<<if (getSlave($AS).anus > 3)>> - fuck $his gaping anus. -<<elseif (getSlave($AS).anus == 3)>> - fuck $his loose butthole. -<<elseif (getSlave($AS).anus == 2)>> - use $his whorish asshole. -<<elseif (getSlave($AS).anus == 1)>> - use $his tight butt. -<<else>> - take $his anal virginity. -<</if>> - -<<if (getSlave($AS).fetish == "buttslut") && (getSlave($AS).devotion >= -20)>> - $He's delighted at the prospect of $his favorite activity. -<<elseif (getSlave($AS).fetish == "buttslut")>> - $He perks up at the prospect of $his favorite activity, but the idea of spending it with you instantly sours $his mood. -<</if>> - -<<if (getSlave($AS).anusTat == "tribal patterns")>> - $His bleached asshole is an inviting sight, after all. -<<elseif (getSlave($AS).anusTat == "scenes")>> - $His tattooed asshole invites sodomy, after all. -<<elseif (getSlave($AS).anusTat == "degradation")>> - The tattoos on $his asshole make it clear $he's an anal slut, after all. -<</if>> - -<<if (getSlave($AS).heels == 1)>> - <<if shoeHeelCategory(getSlave($AS)) > 0>> - As $he went past your desk, $his high heels and surgically altered legs enforced a gait that presented $his butt enticingly. - <<else>> - As $he crawls along on <<if hasAllLimbs(getSlave($AS))>>all fours<<else>>the ground<</if>>, $his anus is readily available. - <</if>> -<</if>> - -<<if (getSlave($AS).anusPiercing > 1)>> - The ring of stud piercings around $his anus should massage you delightfully as you sodomize $him. -<<elseif (getSlave($AS).anusPiercing == 1)>> - $His perineum piercing has a big ring in it, which you should be able to feel when you hilt yourself in $his ass. -<</if>> - -<<if (getSlave($AS).anusTat !== 0) && (getSlave($AS).anusTat !== 4)>> - $His anus is invitingly bleached, - <<if (getSlave($AS).vagina > -1)>> - which is appropriate: rather than looking like $he has a hole for fucking and an ass, it looks like $he has two fuckholes. - <<else>> - making $his sole fuckable hole look nice and natural. - <</if>> -<</if>> - -<<if (getSlave($AS).anus == 0)>> - <<if (getSlave($AS).devotion > 20)>> - $He accepts your orders without comment and presents $his virgin anus for defloration. You<<if ($PC.dick == 0)>> don a strap-on and<</if>> gently sodomize $him. You gently ease into $his butthole and slowly accelerate your thrusting into $his ass. Since $he is already well broken, this new connection with $his <<= getWrittenTitle(getSlave($AS))>> <span class="devotion inc">increases $his devotion to you.</span> <span class="virginity loss">$His tight little ass has been broken in.</span> $He looks forward to having $his asshole fucked by you again. - <<set getSlave($AS).devotion += 4>> - <<elseif (getSlave($AS).devotion >= -20)>> - $He is clearly unhappy at the idea of taking a dick up $his butt. $He obeys orders anyway, and lies there wincing and moaning as you<<if ($PC.dick == 0)>> don a strap-on and<</if>> fuck $his ass. You gently ease into $his butthole and slowly accelerate your thrusting into $his ass. However $he still squeals in pain as you continue pounding. <span class="virginity loss">$His tight little ass has been broken in,</span> and $he <span class="trust dec">fears further anal pain.</span> - <<set getSlave($AS).trust -= 5>> - <<else>> - $He is appalled at the idea of taking it up the ass<<if ($PC.dick == 0)>> and cries with fear as you don a strap-on<</if>>. $He does anyway though, sobbing into the cushions<<if hasAnyArms(getSlave($AS))>> while you hold $his arm<<if hasBothArms(getSlave($AS))>>s<</if>> behind $him<</if>>. You force yourself into $his butthole and continue thrusting your member into $his ass. $He sobs and cries with disgust while you pump into $his rear. The painful anal rape @@.devotion.dec;decreases $his devotion to you.@@ <span class="virginity loss">$His tight little ass has been broken in,</span> and $he is <span class="trust dec">terrified of further anal pain.</span> - <<set getSlave($AS).devotion -= 10, getSlave($AS).trust -= 10>> - <</if>> - <<set getSlave($AS).anus++>> -<<elseif getSlave($AS).fetish == "mindbroken">> - <<if hasAnyArms(getSlave($AS))>> - You instruct $him to present $his anus. $He dully <<if hasBothLegs(getSlave($AS))>>kneels<<else>>bends over<</if>> and spreads $his buttocks<<if ($PC.dick == 0)>>as you don a strap-on<</if>>. You spit on $his hole and ram <<if ($PC.dick == 0)>>it<<else>>your cock<</if>> up $his butt. - <<else>> - Talking to a broken mind is pointless, so you simply set $him on the couch, spread $his buttocks with one hand, spit on $his hole, and ram <<if ($PC.dick == 0)>>it<<else>>your cock<</if>> up $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>butt. - <</if>> - $His butthole spasms as you assrape $him, <<if ($PC.dick == 0)>>an amusing sight<<else>>squeezing your dick nicely<</if>>. - <<if (getSlave($AS).dick != 0) && canAchieveErection(getSlave($AS))>> - <<if getSlave($AS).chastityPenis == 1>> - Automatic responses give $him an erection, which $his chastity makes so uncomfortable that $he spasms. This cycle continues repeatedly, $his rectum squeezing unconsciously each time. - <<elseif getSlave($AS).prostate != 0>> - Despite $his mental deficiency, the prostate stimulation gives $him an erection anyway. - <<else>> - Without a prostate, there's little stimulation to provoke an involuntary response, and $his cock stays limp. - <</if>> - <<elseif getSlave($AS).chastityPenis == 1>> - $His dick chastity keeps $his pointless cock hidden away while you use $his anus like a pussy. - <<elseif (getSlave($AS).dick != 0)>> - $His cock is totally flaccid throughout. - <</if>> -<<elseif getSlave($AS).devotion < -20>> - <<if !isAmputee(getSlave($AS))>> - You instruct $him to present $his anus<<if ($PC.dick == 0)>> as you don a strap-on<</if>>. Horrified, $he tries to back away, but you catch $him and throw $him on the couch next to your desk. $He tries to <<if hasAnyArms(getSlave($AS))>>shield $his asshole<<else>>back away<</if>>, but you pin <<if hasAnyArms(getSlave($AS))>>$his hand<<if hasBothArms(getSlave($AS))>>s<</if>> behind $him with one hand<<else>>$him down<</if>>, spit on $his hole, and ram your <<if ($PC.dick == 0)>>fake dick<<else>>cock<</if>> up $his butt with the other hand. - <<else>> - You tell $him it's time for an assfuck. $He's horrified, but as an amputee can do nothing about it. You spit on $his hole and ram your <<if ($PC.dick == 0)>>fake dick<<else>>cock<</if>> up $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>butt. - <</if>> - $His butthole spasms as you assrape $him, <<if ($PC.dick == 0)>>an amusing sight<<else>>squeezing your dick nicely<</if>>. - <<if (getSlave($AS).dick != 0) && canAchieveErection(getSlave($AS))>> - <<if getSlave($AS).prostate == 0>> - $He lacks a prostate, denying $him any real pleasure from this. $His dick stays flaccid as you rape $him. - <<elseif (getSlave($AS).chastityPenis == 1)>> - Despite $his unwillingness to be sodomized, the prostate stimulation starts to give $him an erection, which $his dick chastity makes horribly uncomfortable. $He bucks with the pain, $his asshole spasming delightfully. - <<else>> - Despite $his unwillingness to be sodomized, the prostate stimulation gives $him an erection. $He's mortified that $he would get hard while being anally raped. - <</if>> - <<elseif (getSlave($AS).chastityPenis == 1)>> - $His dick chastity keeps $his bitch cock hidden away while you use $his anus like a pussy. - <<elseif (getSlave($AS).dick != 0)>> - $His flaccid dick is ground into the back of the couch as you rape $him. - <</if>> -<<elseif (getSlave($AS).devotion <= 20) && (getSlave($AS).vagina < 0)>> - <<if !isAmputee(getSlave($AS))>> - You instruct $him to present $his anus<<if ($PC.dick == 0)>> as you don a strap-on<</if>>. $He knows a sissy slave takes it up the butt, and lies on the couch next to your desk with $his <<if !hasAnyLegs(getSlave($AS))>>hips<<else>>leg<<if hasBothLegs(getSlave($AS))>>s<</if>><</if>> in the air, spreading $his buttocks <<if !hasAnyArms(getSlave($AS))>>as best $he can<<else>>with $his hand<<if hasBothArms(getSlave($AS))>>s<</if>><</if>>. - <<else>> - You tell $him it's time for an assfuck. $He's hesitant, but as an amputee can do nothing about it. - <</if>> - You take your time and fuck $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>butthole for a good long while<<if (getSlave($AS).chastityPenis != 1)>><<if (getSlave($AS).dick != 0)>> so $his limp dick flops around<<elseif (getSlave($AS).balls != 0)>> as $his erect dick waves in the air<</if>><</if>>. This gives you enough time to stroke $him until $he gets aroused despite $his discomfort with anal. $He doesn't orgasm, but $he's getting accustomed to $his asshole as a sexual organ. -<<elseif getSlave($AS).devotion < 10>> - <<if !isAmputee(getSlave($AS))>> - You instruct $him to present $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>anus<<if ($PC.dick == 0)>> as you don a strap-on<</if>>. $He hesitates but eventually lies on the couch next to your desk with $his <<if !hasAnyLegs(getSlave($AS))>>hips<<else>>leg<<if hasBothLegs(getSlave($AS))>>s<</if>><</if>> in the air, spreading $his buttocks <<if !hasAnyArms(getSlave($AS))>>as best $he can<<else>>with $his hand<<if hasBothArms(getSlave($AS))>>s<</if>><</if>>. - <<else>> - You tell $him it's time for an assfuck. $He's hesitant, but as an amputee can do nothing about it. - <</if>> - You take your time and fuck $his butthole for a good long while. - <<if (getSlave($AS).anus == 1)>> - $His ass is so tight that $he winces with anal pain - <<elseif (getSlave($AS).anus == 2)>> - $His experienced ass takes your <<if ($PC.dick == 0)>>fake dick<<else>>cock<</if>> without trouble - <<else>> - $His asspussy is so loose you can pound it as hard as you like - <</if>> - <<if (getSlave($AS).dick != 0)>> - as $his limp dick flops around. - <<elseif (getSlave($AS).dick != 0)>> - as $his erect dick waves in the air. - <<elseif getSlave($AS).vagina == -1>> - as it does its duty as $his sole fuckhole. - <<else>> - as it substitutes for $his pussy. - <</if>> - $He gets aroused despite $his discomfort with anal, though $he doesn't orgasm. -<<else>> - <<if hasAnyLegs(getSlave($AS))>>$He kneels on the couch<<else>>You lay $him on the couch<</if>> with $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>butt facing you, back strongly arched to angle $his rectum for more comfortable anal coupling. - <<if hasAnyArms(getSlave($AS)) && getSlave($AS).prostate > 1 && getSlave($AS).dick > 3>> - <<if $PC.dick == 0>>While you don a strap-on, $he<<else>>$He<</if>> shoves $his slavering dick down and around towards $his ass and squeezes it, pushing a lot of $his precum out to lube $his own asshole. - <<else>> - <<if $PC.dick == 0>>You don a strap-on and let some saliva fall onto its head<<else>>You let some saliva fall onto your dickhead<</if>> before penetrating $him. - <</if>> - You take your time and fuck $his butthole for a good long while. <<if (getSlave($AS).anus == 1)>>$His ass is so tight that $he has to concentrate on relaxing for you.<<elseif (getSlave($AS).anus == 2)>>$His experienced ass feels great.<<else>>$His asspussy is so loose you can pound it as hard as you like.<</if>> $He rubs $his <<if !hasAnyArms(getSlave($AS))>>body against you as much as $he can manage<<elseif canAchieveErection(getSlave($AS))>>hard-on<<elseif (getSlave($AS).dick != 0)>>soft dick<<elseif (getSlave($AS).chastityVagina) || (getSlave($AS).clit == 0)>>nipples<<elseif (getSlave($AS).clit > 2)>>huge, stiff clit<<else>>clit<</if>>, and brings $himself to orgasm before you. <<if ($PC.dick == 0)>>The sight of $him gasping and shaking $his way through an anal orgasm brings you to climax yourself, and you shove yourself against the strap-on harness with enough force to give the slave's sensitized hole a final brutal stretching.<<else>>$His orgasmic rectal spasms squeeze your cock and you blow your load inside $his ass.<</if>> -<</if>> - -<<if (getSlave($AS).bellyPreg >= 1500)>> - The poor slave's pregnant belly causes $him some discomfort as you sodomize $him. -<<elseif (getSlave($AS).bellyImplant >= 1500)>> - The poor $girl's implant filled belly causes $him some discomfort as you sodomize $him. -<<elseif (getSlave($AS).bellyFluid >= 1500)>> - The poor $girl's sloshing belly causes $him some discomfort as you sodomize $him, though the lewd jiggling the pounding sends through it is quite a sight. -<</if>> - -<<if (getSlave($AS).anusTat == "scenes") && (getSlave($AS).anus == 1)>> - As you fucked $his butt, the decorative pattern around $his ass stretched open. When you pull out, $his momentary gape closes the pattern up quickly. -<<elseif (getSlave($AS).anusTat == "scenes")>> - As you fucked $his butt, the decorative pattern around $his ass stretched open. When you pull out, $his gape leaves the pattern distorted. -<<elseif (getSlave($AS).anusTat == "degradation")>> - As you fucked $his butt, the offensive language around $his ass stretched and distorted. -<</if>> - -<<if (random(1,100) > (100 + getSlave($AS).devotion))>> - <<if (getSlave($AS).fetish != "buttslut") && (getSlave($AS).energy <= 95) && (getSlave($AS).sexualFlaw != "hates anal")>> - Being assraped has given $him a @@.flaw.gain;hatred of anal sex.@@ - <<set getSlave($AS).sexualFlaw = "hates anal">> - <</if>> -<<elseif (random(1,100) > (110-getSlave($AS).devotion))>> - <<if (getSlave($AS).fetish == "none") && (getSlave($AS).sexualFlaw != "hates anal")>> - Orgasming to the sensation of your member in $his bottom @@.fetish.gain;has $him eager for anal.@@ - <<set getSlave($AS).fetish = "buttslut", getSlave($AS).fetishKnown = 1>> - <</if>> -<</if>> - -<<if ($PC.dick != 0)>> - - <<if getSlave($AS).cervixImplant == 2 || getSlave($AS).cervixImplant == 3>> - <<set getSlave($AS).bellyImplant += random(10,20)>> - <</if>> - - <<if (getSlave($AS).anus > 3)>> - Your cum falls out of $his gaping hole. - <<elseif (getSlave($AS).anus > 2)>> - Cum flows out of $his gaped butthole. - <<elseif (getSlave($AS).anus == 2)>> - Cum drips out of $his newly gaped anus. - <<elseif (getSlave($AS).anus == 1)>> - $His still-tight ass keeps your load inside $him. - <</if>> - - <<if canImpreg(getSlave($AS), $PC)>> - <<= knockMeUp(getSlave($AS), 5, 1, -1)>> - <</if>> - - <<if $postSexCleanUp > 0>> - <<if canMove(getSlave($AS))>> - <<if getSlave($AS).anus < 2>> - <<set _Anus = "tight butt">> - <<elseif getSlave($AS).anus < 3>> - <<set _Anus = "used butthole">> - <<elseif getSlave($AS).anus < 4>> - <<set _Anus = "gaping butthole">> - <<else>> - <<set _Anus = "anal gape">> - <</if>> - <<switch getSlave($AS).assignment>> - <<case "work in the brothel">> - $He goes to wash $his _Anus so $his next customer can have the illusion that he's the first to use it today. - <<case "serve in the club">> - $He goes to wash and delicately perfume $his _Anus so it can gratify the finest citizen. - <<case "work in the dairy">> - $He goes off to carefully wash $his _Anus to avoid besmirching the nice clean dairy. - <<case "work as a farmhand">> - $He goes off to wash $his _Anus to avoid tainting the food in $farmyardName. - <<case "work as a servant">> - $He rushes to wash $his _Anus, impatient to get back to $his many chores. - <<case "work as a nanny">> - $He goes off to wash $his _Anus, before hurrying to continue taking care of the children in $nurseryName. - <<case "whore">> - $He uses an enema to clean $his _Anus before returning to offering it for sale. - <<case "serve the public">> - $He uses an enema to clean $his _Anus before returning to offering it for free. - <<case "be a servant">> - $He uses an enema to clean $his _Anus, since $his chores didn't perform themselves while you used $his backdoor. - <<case "rest">> - $He uses an enema to clean $his _Anus before crawling back into bed, face-down. - <<case "get milked">> - $He uses an enema to clean $his _Anus <<if getSlave($AS).lactation > 0>>before going to get $his uncomfortably milk-filled tits drained<<else>>and then rests until $his balls are ready to be drained again<</if>>. - <<case "please you">> - $He uses an enema to clean $his _Anus before returning to await your next use of $his backdoor, as though nothing had happened. - <<case "be a subordinate slave">> - $He uses an enema to clean $his _Anus, though it's only a matter of time before another slave decides to play with $his backdoor. - <<case "be your Head Girl">> - $He uses an enema to clean $his _Anus, worried that $his charges got up to trouble while $he enjoyed the buttsex. - <<case "guard you">> - $He hurries off to wash $his _Anus so you'll be unguarded for as little time as possible. - <<case "train slaves">> - $He uses an enema to clean $his _Anus before $he returns to teaching $his classes, a little bow-legged. - <<default>> - $He hurries off to wash $his _Anus before going back to <<= getSlave($AS).assignment>>. - <</switch>> - <<set _Anus = "">> - <</if>> - <</if>> -<</if>> diff --git a/src/npc/interaction/fAssistedSex.js b/src/npc/interaction/fAssistedSex.js new file mode 100644 index 0000000000000000000000000000000000000000..ac12ad4d45bad666f66eb589bf3eaf9d908310d4 --- /dev/null +++ b/src/npc/interaction/fAssistedSex.js @@ -0,0 +1,143 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fAssistedSex = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, + he, his, him, himself + } = getPronouns(slave); + + addPartner(slave, -1); + + r.push(`You order ${his} servants forward so that ${he} can tease you with ${his} enormously swollen body.`); + if (slave.devotion > 95) { + r.push(`Smirking, ${he} leans backwards,`); + if (hasBothArms(slave)) { + r.push(`raising ${his} hands above ${his} head`); + } else if (hasAnyArms(slave)) { + r.push(`raising ${his} hand above ${his} head`); + } else { + r.push(`with two slender arms rising upward behind ${him}, making it look like ${he} has limbs once more`); + } + r.push(`as a gaggle of ${his} trained menials slide underneath ${his} belly, lifting the monolithic organ off the ground and setting the tightly packed orb to wobbling.`); + } else if (slave.trust < -20 && slave.devotion > -10) { + r.push(`Smiling nervously, ${he} leans backwards,`); + if (hasBothArms(slave)) { + r.push(`raising ${his} hands above ${his} head`); + } else if (hasAnyArms(slave)) { + r.push(`raising ${his} hand above ${his} head`); + } else { + r.push(`with two slender arms rising upward behind ${him}, making it look like ${he} has limbs once more`); + } + r.push(`as a gaggle of ${his} trained menials slide underneath ${his} belly, lifting the monolithic organ off the ground and setting the tightly packed orb to wobbling.`); + } else { + if (hasBothArms(slave)) { + r.push(`${He} covers ${his}`); + if (canSee(slave)) { + r.push(`eyes`); + } else { + r.push(`face`); + } + r.push(`with ${his} hands,`); + } else if (hasAnyArms(slave)) { + r.push(`${He} tries to cover ${his}`); + if (canSee(slave)) { + r.push(`eyes`); + } else { + r.push(`face`); + } + r.push(`with ${his} hand,`); + } else { + r.push(`Two slender arms snake around from behind ${him}, almost making it look like ${he} has limbs once more. They cover ${his} quivering`); + if (canSee(slave)) { + r.push(`eyes`); + } else { + r.push(`expression`); + } + } + r.push(`as a gaggle of ${his} trained menials slide underneath ${his} belly, lifting the monolithic organ off the ground and setting the tightly packed orb to wobbling.`); + if (hasBothArms(slave)) { + r.push(`Two more servants take hold of ${his} arms, forcing ${him} to lift them above ${his} head.`); + } else if (hasAnyArms(slave)) { + r.push(`Another servant takes hold of ${his} arm, forcing ${him} to lift it above ${his} head.`); + } else { + r.push(`The hands covering ${his}`); + if (canSee(slave)) { + r.push(`eyes`); + } else { + r.push(`head`); + } + r.push(`draw away, revealing ${his} crying face, then lift above ${his} head in a deliberately provocative pose.`); + } + r.push(`${He} tenses in a moment of instinctive resistance, then surrenders ${his} body to ${his} aids' total control, clearly afraid of punishment.`); + } + r.push(`You remove your clothes and lie back on the office couch,`); + if (V.PC.dick !== 0) { + r.push(`allowing your exposed, full-mast dick to loll in front of you.`); + } else { + r.push(`spreading your exposed, oozing twat.`); + } + if (slave.devotion > 95) { + r.push(`Licking ${his} lips,`); + } else if (slave.trust < -20 && slave.devotion > -10) { + r.push(`Breathing heavily,`); + } else { + r.push(`Smiling fakely,`); + } + r.push(`${he} draws toward you, half-floating on a river of silent, groping hands. When ${he} is mere`); + if (V.showInches === 2) { + r.push(`inches`); + } else { + r.push(`centimeters`); + } + r.push(`away from you, ${his} servants lift ${him} higher, and ${he}`); + if (V.PC.dick !== 0) { + r.push(`teases your dick with a series of masterful — and carefully balanced — belly isolations, rubbing the thick nub of ${his} belly button in small semicircles around your oozing cockhead as ${he} does so. Right when you feel ready to explode, ${he} rotates around, bringing`); + if (slave.butt > 11) { + r.push(`${his} overgrown, wobbling ass cheeks`); + } else if (slave.butt > 5) { + r.push(`${his} huge, wobbling ass cheeks`); + } else if (Math.floor(slave.buttImplant/slave.butt) > .60) { + r.push(`${his} saline inflated ass cheeks`); + } else if (slave.butt > 2) { + r.push(`${his} wobbling ass cheeks`); + } else { + r.push(`the shallow inverted bowls of ${his} petite ass cheeks`); + } + r.push(`level with your erection. Two of ${his} servants reach around ${his} inflated profile and push ${his} cheeks together, wrapping your dick in a firm layer of butt cleavage. ${He} lifts ${his} ass, then drops it, again and again, smacking your chest on the downswing as ${his} servants manipulate ${his} hotdogging to maximize your pleasure.`); + if (canDoVaginal(slave)) { + r.push(`When you feel the tension within you reaching its apex, you signal to ${his} servants to hold ${him} in place. With ${his} silent menials, still as statues, anchoring ${his} bloated body at the perfect angle for fucking while contorting their anonymous bodies to frame ${him} in a manner that maximizes ${his} visual attractiveness, you grab hold of ${his} flanks and ram into ${his} pregnant pussy, driving ${him} to the first of many orgasms in just a few casual thrusts.`); + r.push(`${VCheck.Vaginal(slave, 1)}`); + r.push(`When you feel your own orgasm approaching, you pull out, ejaculating`); + } else if (canDoAnal(slave)) { + r.push(`When you feel the tension within you reaching its apex, you signal to ${his} servants to hold ${him} in place. With ${his} silent menials, still as statues, anchoring ${his} bloated body at the perfect angle for fucking while contorting their anonymous bodies to frame ${him} in a manner that maximizes ${his} visual attractiveness, you grab hold of ${his} flanks and ram into ${his} asshole, driving ${him} to the first of many orgasms with just a few casual thrusts.`); + r.push(`${VCheck.Anal(slave, 1)}`); + r.push(`When you feel your own orgasm approaching, you pull out, ejaculating`); + } else { + r.push(`When you feel the tension with your reaching its apex, you signal to ${his} servants and they pull ${him} forward. You ejaculate`); + } + r.push(`a thick stream of semen all over ${his} ass and back, ${he} shifts into a kneeling position on the ground in front of you, tilted sideways so that ${his} massive fecundity can pool on the ground beside ${him}, and gently sucks you off, cleaning your dick with ${his} mouth.`); + slave.counter.oral++; + V.oralTotal++; + } else { + r.push(`Presses the thick nub of ${his} belly button into your pussy, rubbing it back and forth against your engorged clit as ${he} performs a series of masterful — and carefully balanced — belly isolations. After ${he} has you quaking at the edge of release, ${he} rolls forward and buries ${his} head in your lap, plying you with ${his}`); + if (slave.devotion > 95) { + r.push(`devoted tongue`); + } else if (slave.trust < -20 && slave.devotion > -10) { + r.push(`dedicated tongue`); + } else { + r.push(`tongue`); + } + r.push(`and driving you into a series of crashing orgasms. When ${his} tongue tires, ${he} tries to draw away, but you grab hold of ${his} head and hold ${him} in place until you are finished.`); + slave.counter.oral++; + V.oralTotal++; + } + r.push(`Once you are satisfied, you send ${him} away to clean ${himself} up before returning to ${his} duties.`); + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fAssistedSex.tw b/src/npc/interaction/fAssistedSex.tw deleted file mode 100644 index 839bc2b97f65ae47e81e16893ae61944d5a0bcca..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fAssistedSex.tw +++ /dev/null @@ -1,98 +0,0 @@ -:: FAssistedSex [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> - -You order $his servants forward so that $he can tease you with $his enormously swollen body. -<<if getSlave($AS).devotion > 95>> - Smirking, $he leans backwards, - <<if hasBothArms(getSlave($AS))>> - raising $his hands above $his head - <<elseif hasAnyArms(getSlave($AS))>> - raising $his hand above $his head - <<else>> - with two slender arms rising upward behind $him, making it look like $he has limbs once more - <</if>> - as a gaggle of $his trained menials slide underneath $his belly, lifting the monolithic organ off the ground and setting the tightly packed orb to wobbling. -<<elseif (getSlave($AS).trust < -20) && (getSlave($AS).devotion > -10)>> - Smiling nervously, $he leans backwards, - <<if hasBothArms(getSlave($AS))>> - raising $his hands above $his head - <<elseif hasAnyArms(getSlave($AS))>> - raising $his hand above $his head - <<else>> - with two slender arms rising upward behind $him, making it look like $he has limbs once more - <</if>> - as a gaggle of $his trained menials slide underneath $his belly, lifting the monolithic organ off the ground and setting the tightly packed orb to wobbling. -<<else>> - <<if hasBothArms(getSlave($AS))>> - $He covers $his <<if canSee(getSlave($AS))>>eyes<<else>>face<</if>> with $his hands, - <<elseif hasAnyArms(getSlave($AS))>> - $He tries to cover $his <<if canSee(getSlave($AS))>>eyes<<else>>face<</if>> with $his hand, - <<else>> - Two slender arms snake around from behind $him, almost making it look like $he has limbs once more. They cover $his quivering <<if canSee(getSlave($AS))>>eyes<<else>>expression<</if>> - <</if>> - as a gaggle of $his trained menials slide underneath $his belly, lifting the monolithic organ off the ground and setting the tightly packed orb to wobbling. - <<if hasBothArms(getSlave($AS))>> - Two more servants take hold of $his arms, forcing $him to lift them above $his head. - <<elseif hasAnyArms(getSlave($AS))>> - Another servant takes hold of $his arm, forcing $him to lift it above $his head. - <<else>> - The hands covering $his <<if canSee(getSlave($AS))>>eyes<<else>>head<</if>> draw away, revealing $his crying face, then lift above $his head in a deliberately provocative pose. - <</if>> - $He tenses in a moment of instinctive resistance, then surrenders $his body to $his aids' total control, clearly afraid of punishment. -<</if>> -You remove your clothes and lie back on the office couch, -<<if $PC.dick != 0>> - allowing your exposed, full-mast dick to loll in front of you. -<<else>> - spreading your exposed, oozing twat. -<</if>> -<<if getSlave($AS).devotion > 95>> - Licking $his lips, -<<elseif (getSlave($AS).trust < -20) && (getSlave($AS).devotion > -10)>> - Breathing heavily, -<<else>> - Smiling fakely, -<</if>> -$he draws toward you, half-floating on a river of silent, groping hands. When $he is mere <<if $showInches == 2>>inches<<else>>centimeters<</if>> away from you, $his servants lift $him higher, and $he -<<if $PC.dick != 0>> - teases your dick with a series of masterful — and carefully balanced — belly isolations, rubbing the thick nub of $his belly button in small semicircles around your oozing cockhead as $he does so. Right when you feel ready to explode, $he rotates around, bringing - <<if getSlave($AS).butt > 11>> - $his overgrown, wobbling ass cheeks - <<elseif getSlave($AS).butt > 5>> - $his huge, wobbling ass cheeks - <<elseif Math.floor(getSlave($AS).buttImplant/getSlave($AS).butt) > .60>> - $his saline inflated ass cheeks - <<elseif getSlave($AS).butt > 2>> - $his wobbling ass cheeks - <<else>> - the shallow inverted bowls of $his petite ass cheeks - <</if>> - level with your erection. Two of $his servants reach around $his inflated profile and push $his cheeks together, wrapping your dick in a firm layer of butt cleavage. $He lifts $his ass, then drops it, again and again, smacking your chest on the downswing as $his servants manipulate $his hotdogging to maximize your pleasure. - <<if canDoVaginal(getSlave($AS))>> - When you feel the tension within you reaching its apex, you signal to $his servants to hold $him in place. With $his silent menials, still as statues, anchoring $his bloated body at the perfect angle for fucking while contorting their anonymous bodies to frame $him in a manner that maximizes $his visual attractiveness, you grab hold of $his flanks and ram into $his pregnant pussy, driving $him to the first of many orgasms in just a few casual thrusts. - <<= VCheck.Vaginal(getSlave($AS), 1)>> - When you feel your own orgasm approaching, you pull out, ejaculating - <<elseif canDoAnal(getSlave($AS))>> - When you feel the tension within you reaching its apex, you signal to $his servants to hold $him in place. With $his silent menials, still as statues, anchoring $his bloated body at the perfect angle for fucking while contorting their anonymous bodies to frame $him in a manner that maximizes $his visual attractiveness, you grab hold of $his flanks and ram into $his asshole, driving $him to the first of many orgasms with just a few casual thrusts. - <<= VCheck.Anal(getSlave($AS), 1)>> - When you feel your own orgasm approaching, you pull out, ejaculating - <<else>> - When you feel the tension with your reaching its apex, you signal to $his servants and they pull $him forward. You ejaculate - <</if>> - a thick stream of semen all over $his ass and back, $he shifts into a kneeling position on the ground in front of you, tilted sideways so that $his massive fecundity can pool on the ground beside $him, and gently sucks you off, cleaning your dick with $his mouth. - <<set getSlave($AS).counter.oral++, $oralTotal++>> -<<else>> - Presses the thick nub of $his belly button into your pussy, rubbing it back and forth against your engorged clit as $he performs a series of masterful — and carefully balanced — belly isolations. After $he has you quaking at the edge of release, $he rolls forward and buries $his head in your lap, plying you with $his - <<if getSlave($AS).devotion > 95>> - devoted tongue - <<elseif (getSlave($AS).trust < -20) && (getSlave($AS).devotion > -10)>> - dedicated tongue - <<else>> - tongue - <</if>> - and driving you into a series of crashing orgasms. When $his tongue tires, $he tries to draw away, but you grab hold of $his head and hold $him in place until you are finished. - <<set getSlave($AS).counter.oral++, $oralTotal++>> -<</if>> -Once you are satisfied, you send $him away to clean $himself up before returning to $his duties. diff --git a/src/npc/interaction/fBeg.js b/src/npc/interaction/fBeg.js new file mode 100644 index 0000000000000000000000000000000000000000..b61f3732d8074fcb953272110a847990f41793ba --- /dev/null +++ b/src/npc/interaction/fBeg.js @@ -0,0 +1,710 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fBeg = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself, woman, girl + } = getPronouns(slave); + + const {title: Master, say: say} = getEnunciation(slave); + + const { + hisP, + } = getPronouns(V.PC).appendSuffix("P"); + + const {womenU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U"); + + /* things I need: checks for canWalk() to see how easily she can move, blindness checks, replacement for BoobsDesc, maybe devotion catches for certain flaws */ + /* priority! femPC support! */ + + r.push(`You call ${him} over to you for inspection. ${App.Desc.boobs(slave)}`); /* this part needs expansion */ + r.push(`You look at ${him} lustfully and instruct ${him} to strip.`); + if (slave.sexualFlaw === "shamefast") { + r.push(`Tears well up in ${his} eyes at the idea of showing ${his} naked body.`); + } else if (slave.sexualQuirk === "tease") { + r.push(`${He} blushes with arousal. ${He} has kept ${his} innate embarrassment at the thought of being naked, but you have infused this with overwhelming arousal. ${His} cheeks are red as ${he} removes ${his} clothes, giving quite a strip tease as ${he} does.`); + } else if (slave.sexualFlaw === "repressed") { + r.push(`${He} subconsciously uses ${his} ${hasBothArms(slave) ? `hands` : `hand`} to try to cover ${his} body. ${He} is still repressing ${his} own sexuality. That type of behavior may have been allowed in the old world, but it has no place in a Free City.`); + } else if (slave.sexualFlaw === "idealistic") { + r.push( + `${He} shakes ${his} head pleadingly.`, + Spoken(slave, `"But I don't consent,"`), + `${he} responds. You laugh in such a way that tells ${him} that ${his} consent is irrelevant. ${He} is still idealistic, believing that sex should be a consensual expression of love and intimacy. Such ideas were common in the Old World, but they have no place in a Free City. You decide to grab ${him} and forcefully rip ${his} clothes from ${his} body, since obedience could simply be seen as consent. ${He} screams and plead as you pin ${his} arms, ripping and tearing at the cloth that keeps ${his} beauty from sight.` + ); + } else if (slave.sexualFlaw === "neglectful") { + r.push( + `${He} replies`, + Spoken(slave, `"Yes, ${slave.rudeTitle === 1 ? PoliteRudeTitle(slave) : Master},""`), + `${he} replies contritely. ${He} has no sense of self beyond your usefulness of ${him}, and selflessly sacrifices ${his} own comfort for your pleasure.` + ); + } else if (slave.sexualFlaw === "attention whore") { + r.push(`${He} eagerly begins to shirk ${his} wear, drawing as much attention to the process as possible.`); + } else { + if (slave.devotion < -20) { + r.push(`${He} resists, forcing you to undress ${him} yourself.`); + } else if (slave.devotion >= -20) { + r.push(`${He} obeys, and moves to the center of your office to disrobe for you.`); + } + } + if (slave.devotion >= -20) { + r.push(`${He} begins to undress with`); + if (slave.skill.entertainment >= 100) { + r.push(`masterful skill, teasing and taunting all the way down. ${He} rolls ${his} hips and most sexual parts as ${he} removes ${his} clothing.`); + } else if (slave.skill.entertainment >= 80) { + r.push(`arousing skill. Even though the goal is just to get ${him} naked, your slave knows that ${his} job is to entertain you with ${his} every move.`); + } else if (slave.skill.entertainment >= 50) { + r.push(`notable skill. ${He} takes the opportunity to give you a light strip tease as ${he} undresses.`); + } else if (slave.skill.entertainment >= 20) { + r.push(`a decent effort. ${He} isn't your most entertaining slave, but ${he} still makes an effort to arouse you with ${his} undressing.`); + } else if (slave.skill.entertainment >= 9) { + r.push(`some effort to be sexy. ${His} moves are less than skillful and the undressing is more pragmatic than arousing.`); + } else { + r.push(`no effort to be sexy. ${He} has no entertainment skill, and the only goal of ${his} actions is to go from clothed to naked.`); + } + } + + if (slave.fetishStrength > 60) { + switch (slave.fetish) { + case "submissive": + r.push(`As ${he} begins to strip you grab ${him} without warning and begin to tear off ${his} clothes. Your slave expected you to allow ${him} to obey your command, and so ${he} is initially taken aback by the sudden force but ${his} submissive nature keeps ${him} from resisting. ${He} is such a submissive slut that you feel obligation to push ${his} status even further. You bind ${his} arms tightly behind ${his} back in a leather monoglove, lacing it tighter until ${his} elbows are touching. ${He} gives a soft whimper, but you both know that this is for your benefit and not a protest.`); + if (slave.nipplesPiercing >= 1) { + r.push(`You then retrieve heavy bells and attach them to ${his} nipple rings.`); + } else { + r.push(`You reach into your pocket and retrieve two weighted and belled nipple clamps, attaching them tightly to your slave's delicate nipples.`); + } + r.push(`You tell ${him} to bounce so that they jingle, reminding ${him} of ${his} status.`); + break; + case "masochist": + r.push( + `Once ${he} is fully exposed you give ${him} a firm slap across the tits. ${He}'s a masochist and relishes the pain with sexual arousal. You ask your painslut if ${he} deserves to be punished.`, + Spoken(slave, `"Oh yes, ${slave.rudeTitle === 1 ? PoliteRudeTitle(slave) : Master}. Please punish your little slut."`), + `Sensing that your slave is getting too much enjoyment from ${his} beating, you cease.` + ); + break; + } + } + + r.push(`You stare at the naked figure standing before you.`); + + if (canSee(slave)) { + if (slave.boobsTat === "rude words") { + r.push( + `The words on ${his} chest stand out at you. You ask ${him} what ${his} tits say.`, + Spoken(slave, `"Fuckslave,"`), + `${he} replies. You ask if that's what ${he} is.` + ); + if (slave.behavioralFlaw === "liberated") { + r.push( + Spoken(slave, `"I'm nobody's property. I'm a free ${woman}!"`), + `${he} shoots back.`, + Spoken(slave, `"We shall see," you reply.`) + ); + } else if (slave.devotion < -20) { + r.push(`${He} does ${his} best to shake ${his} head.`); + } else { + r.push(Spoken(slave, `"Yes ${Master}, that's what I am."`)); + } + } else if (slave.boobsTat === "possessive") { + r.push( + `The words on ${his} chest stand out at you. You ask ${him} what ${his} tits say.`, + Spoken(slave, `"It's your personal symbol,"`), + `${he} replies. You ask if that's what ${he} is.` + ); + if (slave.behavioralFlaw === "liberated") { + r.push( + Spoken(slave, `"I'm nobody's property. I'm a free ${woman}!"`), + `${he} shoots back.`, + Spoken(slave, `"We shall see," you reply.`) + ); + } else if (slave.devotion < -20) { + r.push(`${He} does ${his} best to shake ${his} head.`); + } else { + r.push(Spoken(slave, `"Yes, ${Master} that's what I am."`)); + } + } else if (slave.boobsTat === "degradation") { + r.push( + `The words on ${his} chest stand out at you. You ask ${him} what ${his} tits say. "`, + Spoken(slave, `${Master}'s Bitch,"`), + `${he} replies. You ask if that's what ${he} is.`); + if (slave.behavioralFlaw === "liberated") { + r.push( + Spoken(slave, `"I'm nobody's property. I'm a free ${woman}!"`), + `${he} shoots back.`, + Spoken(slave, `"We shall see," you reply.`) + ); + } else if (slave.devotion < -20) { + r.push(`${He} does ${his} best to shake ${his} head.`); + } else { + r.push(Spoken(slave, `"Yes ${Master}, that's what I am."`)); + } + } else { + r.push(`${His} body belongs to you, and your slave needs to remember that.`); + } + } else { + r.push(`${His} body belongs to you, and your slave needs to remember that.`); + } + + r.push(`You then tell your slave to kneel at your feet.`); + if (slave.behavioralFlaw === "bitchy") { + r.push( + `${He} rolls ${his} eyes sasses you a bit,`, + Spoken(slave, `"Whatever,"`), + `${he} scoffs and` + ); + } else if (slave.behavioralFlaw === "arrogant") { + r.push(`${He} stands up even straighter than before,`); + if (hasBothArms(slave)) { + r.push(`crossing ${his} arms and`); + } + r.push(`widening ${his} stance. ${His} arrogance makes obeying commands like this difficult, but that is not your concern. You give ${him} a look that tells ${him} that pain will await if ${he} does not obey. ${He}`); + } else if (slave.behavioralQuirk === "confident") { + r.push(`${He} confidently moves to obey. ${He}`); + } else if (slave.behavioralFlaw === "liberated") { + r.push(`${He} stands up even straighter than before,`); + if (hasBothArms(slave)) { + r.push(`crossing ${his} arms and`); + } + r.push( + `widening ${his} stance.`, + Spoken(slave, `"I am not some animal,"`), + `${he} protests,`, + Spoken(slave, `"I am a free ${woman}."`), + `You laugh at ${his} continued delusions. Liberated ${womenU} have no place in a Free City. You remind ${him} that pain awaits ${him} should ${he} defy you further and ${he}` + ); + } else if (slave.behavioralQuirk === "advocate") { + r.push(`${He} smiles at the demonstration of ${his} rightful place as a lowly slave. ${He}`); + } else if (slave.behavioralFlaw === "odd") { + r.push(`${He} sticks ${his} tongue out at you, blowing raspberries in an act of futile defiance. ${He} really is an odd one. ${He}`); + } else if (slave.behavioralQuirk === "funny") { + r.push(`${He} smiles and turns ${his} butt to you, swaying it cutely as ${his} silly way of acknowledging your command. ${He}`); + } else { + r.push(`${He}`); + } + + if (slave.devotion < -20) { + if (slave.trust < -50) { + r.push(`drops terrified to the ground.`); + } else { + if (!canTalk(slave)) { + r.push(`gestures`); + } else if (SlaveStatsChecker.checkForLisp(slave)) { + r.push(`lisps`); + } else { + r.push(`declares`); + } + r.push(`angrily that slavery is wrong and ${he} will not bow. You look at your assistant who silently summons two other, more obedient slaves from their duties.`); + if (slave.nipplesPiercing > 1) { + r.push(`You reach out and grab ${him} by ${his} nipple chain, pulling ${him} in harshly. ${He} yelps in pain, but knows better than to pull away.`); + } else if (slave.nosePiercing > 1) { + r.push(`You reach out and grab ${him} by ${his} nose ring, pulling ${him} in harshly. ${He} yelps in pain, but knows better than to pull away.`); + } else { + r.push(`You reach out and grab ${him} firmly by the collar.`); + } + r.push(`"One more chance, slut." By now, the other slaves have arrived and are standing loyally by your side. Your loyal slaves force ${him} to`); + if (hasAnyLegs(slave)) { + r.push(`${his} ${hasBothLegs(slave) ? `knees` : `knee`}.`); + } else { + r.push(`the ground.`); + } + } + r.push(`"Head at crotch level," you clarify. "Remember your purpose."`); + } else if (slave.devotion < 20) { + r.push(`is not enthusiastic, but is obedient enough to go down without much threat of discipline.`); + } else if (slave.devotion > 20) { + if (slave.fetishKnown === 1) { + switch (slave.fetish) { + case "submissive": + r.push(`bows ${his} head and humbly assumes ${his} rightful position at ${his} ${getWrittenTitle(slave)}'s feet.`); + break; + case "dom": + r.push(`would rather be standing by your side making your other sluts bow, but ${he} still knows that you are ${his} ${getWrittenTitle(slave)}.`); + break; + case "sadist": + r.push(`would rather be pushing one of your other whores painfully to their knees, but ${he} still obeys.`); + break; + case "masochist": + r.push(`waits just long enough to receive a disciplinary slap, making ${him} blush with arousal as ${he} kneels before you.`); + break; + case "cumslut": + r.push(`is excited to be closer to your`); + if (canTaste(slave)) { + r.push(`delicious`); + } else { + r.push(`heavenly`); + } + r.push(`crotch, and hurries to match ${his} eyes to your`); + if (V.PC.dick > 0) { + r.push(`package.`); + } else { + r.push(`crotch.`); + } + break; + case "humiliation": + r.push(`makes a big show of it as ${he} lowers ${himself} dramatically before you.`); + break; + case "buttslut": + r.push(`leans heavily forward so that ${his} ass sticks out ridiculously far as ${he}`); + if (hasAnyLegs(slave)) { + r.push(`bends ${his} ${hasBothLegs(slave) ? `knees` : `knee`} and`); + } + r.push(`goes to the floor.`); + break; + case "pregnancy": + r.push(`obeys your command and goes to`); + if (hasBothLegs(slave)) { + r.push(`${his} knees.`); + } else { + r.push(`the floor.`); + } + break; + case "boobs": + r.push(`pulls ${his} shoulders back strongly while leaning far enough forward to drag ${his}`); + if (slave.boobs >= 10000) { + r.push(`weighty mammaries`); + } else if (slave.boobs >= 2000) { + r.push(`cumbersome udders`); + } else if (slave.boobs >= 1000) { + r.push(`massive slave tits`); + } else if (slave.boobs >= 800) { + r.push(`forward-thrust breasts`); + } else if (slave.boobs >= 500) { + r.push(`meager chest`); + } else if (slave.boobs <= 400) { + r.push(`pathetic slave boobs`); + } else { + r.push(`tits`); + } + r.push(`across your body as ${he} goes down.`); + break; + default: + r.push(`obeys your command and goes to`); + if (hasBothLegs(slave)) { + r.push(`${his} knees.`); + } else { + r.push(`the floor.`); + } + } + } else { + r.push(`obeys your command and goes to`); + if (hasBothLegs(slave)) { + r.push(`${his} knees.`); + } else { + r.push(`the floor.`); + } + } + } + if (slave.devotion < -20) { + r.push(`The other slaves guide ${him} to adjust ${his} posture so ${his} eyes are directly in line with your`); + if (V.PC.dick > 0) { + r.push(`package.`); + } else { + r.push(`crotch.`); + } + } else { + r.push(`${He} kneels so that ${his} eyes are directly level with your`); + if (V.PC.dick > 0) { + r.push(`package.`); + } else { + r.push(`crotch.`); + } + } + + if (V.PC.dick > 0) { + if (slave.energy > 50) { + r.push(`${He} cant help but stare in lust at your`); + if (V.PC.balls >= 30) { + r.push(`monstrous, massive pair of watermelon sized balls.`); + } else if (V.PC.balls >= 14) { + r.push(`enormous, heavy pair of balls.`); + } else if (V.PC.balls >= 9) { + r.push(`huge pair of balls, bulging like softballs from behind your suit.`); + } else if (V.PC.balls >= 5) { + r.push(`large pair of balls, swinging heavily as you move.`); + } else { + r.push(`manly package.`); + } + } else if (V.PC.scrotum > 0) { + r.push(`Your balls loom directly in front of ${his} face.`); + } + } + + r.push(`Now kneeling at your feet naked before you, your slave waits for ${his} ${getWrittenTitle(slave)}'s command. You take some time to survey the slut's properly displayed body.`); + + if (slave.butt > 6) { + r.push(`${His} massive ass is so huge that ${he} it squishes around ${his} ${hasBothLegs(slave) ? `heels` : `heel`}, almost reaching the floor.`); + } else if (slave.butt > 4) { + r.push(`${His} ${either("ass", "rear end")} is so round and large it rolls out from ${his} back in two perfect mounds. The cheeks are so thick it forms a perfect crevice between them, more than a couple`); + if (V.showInches === 2) { + r.push(`inches`); + } else { + r.push(`centimeters`); + } + r.push(`deep.`); + } else if (slave.butt > 2) { + r.push(`${His} nice ${either("plump", "thick")} ${either("ass", "butt")} curves out noticeably, even while ${he} sits on ${his} ${hasBothLegs(slave) ? `knees` : `knee`}.`); + } else { + r.push(`${His} cute and tight ass rests gently on ${his} ${hasBothLegs(slave) ? `ankles` : `ankle`}.`); + } + + + if (slave.energy > 95) { + r.push(`${His} eyes fill with lust at the helplessness of kneeling at your crotch.`); + } + if (slave.fetishKnown === 1) { + if (slave.fetishStrength > 60) { + switch (slave.fetish) { + case "submissive": + r.push(`${He} keeps ${his} eyes down and poises ${his} body to be fully available to ${his} ${getWrittenTitle(slave)}, trying to model for you the image of the perfect submissive.`); + break; + case "dom": + r.push(`Despite ${his} kneeling stature, ${his} back is straight and shoulders back.`); + break; + case "masochist": + r.push(`${He} positions ${himself} uncomfortably, bringing visual pleasure to you and pain to ${himself}. ${He} accentuates ${his} most sensitive parts, inviting you to slap or spank them.`); + break; + case "cumslut": + r.push(`${he} goes to ${his} ${hasBothLegs(slave) ? `knees` : `knee`}, all the while staring at your`); + const pcCrotch = []; + if (V.PC.dick !== 0) { + pcCrotch.push(`manly bulge`); + } + if (V.PC.vagina !== -1) { + pcCrotch.push(`feminine mound`); + } + r.push(`${toSentence(pcCrotch)}.`); + break; + case "humiliation": + r.push(`${He} eagerly takes to this humiliating position, hoping to demonstrate ${his} willingness to be degraded by ${his} ${getWrittenTitle(slave)}.`); + break; + case "buttslut": + r.push(`${He} positions ${himself}, sticking ${his} butt out as far as ${he} can manage, hoping to draw your attention to ${his} favorite area.`); + break; + case "boobs": + r.push(`${he} kneels with ${his} back strongly arching far back and diligently works to touch ${his} elbows behind ${his} back to best display ${his}`); + if (slave.boobs >= 10000) { + r.push(`colossal mammaries`); + } else if (slave.boobs >= 2000) { + r.push(`gigantic udders`); + } else if (slave.boobs >= 1000) { + r.push(`massive slave tits`); + } else if (slave.boobs >= 800) { + r.push(`prominent breasts`); + } else if (slave.boobs >= 400) { + r.push(`modest chest`); + } else if (slave.boobs <= 400) { + r.push(`pathetic slave boobs`); + } + r.push(`for ${his} ${getWrittenTitle(slave)}.`); + if (slave.lactation > 0) { + r.push(`Milk dribbles down the soft curves of ${his} chest as a further sign of ${his} arousal.`); + } + r.push(`This is, of course, how all slaves are supposed to kneel, but ${he} takes the pose with added dedication.`); + break; + default: + r.push(`${He} positions ${himself} with ${his} ${hasBothLegs(slave) ? `knees` : `knee`} spread wide, hoping that you will turn your attention to`); + if (canDoVaginal(slave)) { + r.push(`${his} wet pussy.`); + } else if (canAchieveErection(slave)) { + r.push(`${his} hard cock.`); + } else { + r.push(`${him}.`); + } + } + } + } + r.push(`You give ${him} permission to speak, and tell ${him} that ${he} may beg ${his} ${getWrittenTitle(slave)}.`); + + if (slave.devotion < -20) { + if (slave.trust < -50) { + switch (slave.rules.punishment) { + case "confinement": + r.push(`Your slave simply`); + if (hasAnyArms(slave)) { + r.push(`presses ${his} ${hasBothArms(slave) ? `hands` : `hand`} together and`); + } + r.push(`begs you not to lock ${him} up in the bad-${girl} box.`); + break; + case "whipping": + r.push(`Your slave simply`); + if (hasAnyArms(slave)) { + r.push(`presses ${his} ${hasBothArms(slave) ? `hands` : `hand`} together and`); + } + r.push(`begs you not to whip ${him}.`); + break; + case "chastity": + if (slave.energy > 60) { + r.push(`Your slave simply presses ${his} ${hasBothArms(slave) ? `hands` : `hand`} together and begs you not to take away ${his} next orgasm`); + } else { + r.push(`Your slave simply asks that you not change ${his} punishment. ${He} fears you, but using chastity as a punishment is not an efficient way to command ${his} obedience, since ${he} has no sexual energy.`); + } + } + } else { + if (slave.behavioralFlaw === "bitchy") { + r.push( + `${He} turns ${his} nose up in utter disgust.`, + Spoken(slave, `"Why, to feed your ${girl === "boy" ? `misandristic` : `misogynistic`} ego? Thanks, but no."`), + `${He} looks at your other slaves holding ${him} down,`, + Spoken(slave, `"Why don't you get one of these mindless cunts to do it? Or are they not hot enough?"`), + `${He} is disobedient and bitchy, a bad combo.`); + } else if (slave.behavioralFlaw === "arrogant") { + r.push( + `${He} tries to cock ${his} shoulders back, giving a death glare to the slaves holding ${him} in place,`, + Spoken(slave, `"I don't need anything from you,"`), + `${he} hisses. ${He} is disobedient and arrogant, a bad combo.` + ); + } else if (slave.behavioralFlaw === "liberated") { + r.push( + `${He} does ${his} best to spit in your face, but the height difference means ${he} only stains your shirt.`, + Spoken(slave, `"I demand you release me!"`), + `${he} scowls,`, + Spoken(slave, `"Or I'm going to call the police!"`), + `You smile at ${his} pathetically outdated worldview. You tell ${him} that's a good idea, since you know how rebellious slaves fare in jail.` + ); + } else if (slave.behavioralFlaw === "odd") { + r.push( + `${He} purses ${his} lips and bounces on ${his} heels in futile rebellion.`, + Spoken(slave, `"Nuh-uh."`), + `${he} puffs, shaking ${his} head wildly.` + ); + } else { + r.push(`${He} simply sits there, struggling against the hands holding ${him} down.`); + } + } + r.push(`This is clearly the best you are going to get out of ${him} until ${he} is better trained. You`); + if (slave.trust >= -50) { + r.push(`signal your loyal slaves to lift ${him} to ${his} feet, and`); + } + r.push(`send ${him} away for now.`); + } else if (slave.devotion < 20) { + if (slave.behavioralFlaw === "bitchy") { + r.push( + `${He} turns ${his} nose up in utter disgust.`, + Spoken(slave, `"Why, to feed your ${girl === "boy" ? `misandristic` : `misogynistic`} ego? Thanks, but no."`), + `${He} looks at your other slaves holding ${him} down,`, + Spoken(slave, `"Why don't you get one of these mindless cunts to do it? Or are they not hot enough?"`), + `${He} is disobedient and bitchy, a bad combo.`); + } else if (slave.behavioralFlaw === "arrogant") { + r.push( + `${He} tries to cock ${his} shoulders back, giving a death glare to the slaves holding ${him} in place,`, + Spoken(slave, `"I don't need anything from you,"`), + `${he} hisses. ${He} is disobedient and arrogant, a bad combo.` + ); + } else if (slave.behavioralFlaw === "liberated") { + r.push(`${He} does ${his} best to spit in your face, but the height difference means ${he} only stains your shirt.`, + Spoken(slave, `"I demand you release me!"`), + `${he} scowls,`, + Spoken(slave, `"Or I'm going to call the police!"`), + `You smile at ${his} pathetically outdated worldview. You tell ${him} that's a good idea, since you know how rebellious slaves fair in jail.` + ); + } else if (slave.behavioralFlaw === "odd") { + r.push( + `${He} purses ${his} lips and bounces on ${his} heels in futile rebellion.`, + Spoken(slave, `"Nuh-uh."`), + `${he} puffs, shaking ${his} head wildly.` + ); + } else if (slave.sexualFlaw === "shamefast") { + r.push( + `${He} tries to cover ${his} naked body from your gaze`, + Spoken(slave, `"Please, can I just put some clothes on?"`) + ); + } else { + r.push( + `${He} looks up at you with a sudden glimpse of hope, and begins to plead,`, + Spoken(slave, `"Please, sir, please set me free. I don't want to be here.`) + ); + if (slave.energy < 50) { + r.push(Spoken(slave, `I have no desire for sex. I don't want to be your toy! Please let me go."`)); + } else { + r.push(Spoken(slave, `I might even come back to share consensual love with you. I just don't want to be property. Please, let me go."`)); + } + } + r.push(`You tell your slave to rise to ${his} feet. Even though ${he} desired the impossible, it wasn't a total waste. You feel as though you have a pretty good understanding of where your slave stands. You send ${him} away with ${his} request denied, and you resolve to break ${him} more in the coming weeks.`); + } else if (slave.devotion <= 60) { + r.push(`Your slave looks at ${his} ${getWrittenTitle(slave)} with obedient eyes.`); + } else if (slave.devotion <= 100) { + r.push(`Your devoted slave takes the begging position,`); + if (slave.fetish !== "submissive") { + r.push(`${he} even brings ${his} ${hasBothArms(slave) ? `hands` : `hand`} up like a dog's paws.`); + } else { + if (slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`and ${he} bows ${his} head in total submission.`); + if (slave.nipplesPiercing > 0) { + r.push(`The armbinder thrusts ${his} tits out nicely, and ${his} nipple rings are pulled tight by the weighted bells weighing them down.`); + } else if (slave.nipplesPiercing > 1) { + r.push(`The armbinder thrusts ${his} tits out nicely, and ensures that ${his} nipple chains are pulled tight by the angle of ${his} shoulders. The bells on ${his} nipple piercings jungle sweetly as ${he} breathes.`); + } else { + r.push(`The armbinder thrusts ${his} tits out nicely and ${his} nipples are now red from the clamps pressing down hard on ${his} sensitive flesh. Every painful shudder makes the bells jungle ever so sweetly.`); + } + } else { + r.push(`${he} even brings ${his} ${hasBothArms(slave) ? `hands` : `hand`} up like a dog's paws.`); + } + } + + r.push(Spoken(slave, `"Yes Master. Thank you, ${Master}."`)); + r.push(`${He} is fully subservient to you, and would do anything to please you.`); + } + + if (slave.devotion > 20) { + /* eventually plan to make a string of Paraphilia text, which will be stronger versions of their fetish counterparts. */ + if (slave.fetishKnown === 1) { + if (slave.fetishStrength > 60) { + switch (slave.fetish) { + case "submissive": + r.push( + `${He} adjusts ${his} monoglove behind ${his} back, jingling ${his} nipple bells as ${he} does.`, + Spoken(slave, `"Please ${Master},"`), + `${he} begs with genuine humility,`, + Spoken(slave, `"please use your slave in whatever way you see fit. This slave has no purpose but to please ${his} ${Master}."`) + ); + break; + case "dom": + r.push( + `${He} looks up at you. Even from ${his} kneeling position ${his} eyes carry confident domination.`, + Spoken(slave, `"${Master}, I know my place is beneath you. Give me the authority to lord over your other slaves and I will force them to serve you as I do."`) + ); + break; + case "masochist": + r.push( + Spoken(slave, `"I know I haven't disobeyed,"`), + `${he} begins,`, + Spoken(slave, `"but I just need to be punished."`), + `You smile down at your little painslut, running your finger along ${his} chin.`, + Spoken(slave, `"Please ${Master}, beat me. Beat my ass until it's red and clamp my nipples until they bleed. Please! I need to feel your strength!"`) + ); + break; + case "cumslut": + r.push(`Your little cumslut can't stop staring at your`); + if (V.PC.balls >= 30) { + r.push(`monstrous, massive pair of watermelon sized balls.`); + } else if (V.PC.balls >= 14) { + r.push(`enormous, heavy pair of balls.`); + } else if (V.PC.balls >= 9) { + r.push(`huge pair of balls, bulging like softballs from behind your suit.`); + } else if (V.PC.balls >= 5) { + r.push(`large pair of balls, swinging heavily as you move.`); + } else { + r.push(`crotch.`); + } + r.push( + `Drool begins to drip from ${his} lips, and you have to remind your slave that ${he} is here to beg.`, + Spoken(slave, `"${Master},"`), + `${he} breathes heavily,`, + Spoken(slave, `"Please let me`) + ); + if (V.PC.dick !== 0) { + r.push(Spoken(slave, `suck your magnificent`)); + if (V.PC.vagina !== -1) { + r.push(Spoken(slave, `cock and eat you out,`)); + } else { + r.push(Spoken(slave, `cock,`)); + } + } else { + r.push(Spoken(slave, `eat your delicious pussy,`)); + } + r.push(Spoken(slave, `please."`)); + r.push(`You smile at the little cocksucker, so eager to please.`); + break; + case "humiliation": + r.push(`${He} sits so that ${his} body is on full display,`); + r.push(Spoken(slave, `"Please ${Master}, use me and humiliate me. Take me out to the public square so that everyone can see you overpower me."`)); + break; + case "buttslut": + r.push( + `${He} positions ${his} back so ${his} ass sticks out even further`, + Spoken(slave, `"${Master},"`), + `${he} begs,`, + Spoken(slave, `"use my ass! ${(slave.sexualQuirk === "painal queen") ? `Make me squeal! ` : ``}I just need your cock in my most useful fuckhole, please!"`) + ); + break; + case "boobs": + r.push(`${He}`); + if (!hasAnyArms(slave)) { + r.push(`leans ${his} head back and juts out ${his} tits, raising`); + } else { + r.push(`takes ${his} ${hasBothArms(slave) ? `hands` : `hand`} and presses ${his} tits together, lifting`); + } + r.push(`them to display for you ${his} primary purpose in life.`); + if (slave.lactation > 0) { + r.push(`More milk`); + if (!hasAnyArms(slave)) { + r.push(`dribbles`); + } else { + r.push(`squirts`); + } + r.push(`from each teat as ${he} bears them.`); + } + r.push(Spoken(slave, `"I beg of you, ${Master}, I need you to use my tits. Suck them, squeeze them, fuck them, I cannot cum without you using my slave tits! I am nothing more than a ${canWalk(slave) ? `walking ` : ``}tit-carrier, and my only purpose is to offer these breasts to you."`)); + break; + case "pregnancy": + r.push(`${He} begins to`); + if (hasAnyArms(slave)) { + r.push(`caress`); + } else { + r.push(`stick out`); + } + r.push( + `${his} stomach.`, + Spoken(slave, `"Use me as your breeder, ${Master}, please! I just want to be filled with your seed forever!"`) + ); + break; + default: + r.push(`${He} kneels`); + if (hasBothLegs(slave)) { + r.push(`with ${his} legs far spread.`); + } else { + r.push(`on the floor.`); + } + r.push(Spoken(slave, `"Use my fuckhole ${Master}, I beg you. Please, I need you to fuck me!"`)); + } + } else { + r.push( + Spoken(slave, `"${Master}, I exist to serve you."`), + `${He} ${say}s,`, + Spoken(slave, `"I have no other purpose in life. I beg of you, please never let me leave your service. Let me wait on you forever. I swear I will always be obedient. Let me cook your meals, clean your penthouse, care for your other slaves, even make me a cow. I don't care, as long as I'm here serving you."`), + `${He} knows that ${his} rightful place is a slave, and ${he} is dedicated to living out that role to the fullest.` + ); + if (slave.behavioralQuirk === "advocate") { + r.push(Spoken(slave, `"I see now," ${he} continues, "that slavery really is a ${woman}'s rightful place. ${He} has no purpose except to serve ${his} ${Master}."`)); + } + } + } else { + r.push( + Spoken(slave, `"${Master}, I exist to serve you."`), + `${He} says,`, + Spoken(slave, `"I have no other purpose in life. I beg of you, please never let me leave your service. Let me wait on you forever. I swear I will always be obedient. Let me cook your meals, clean your penthouse, care for your other slaves, even make me a cow. I don't care, as long as I'm here serving you."`), + `${He} knows that ${his} rightful place is a slave, and ${he} is dedicated to living out that role to the fullest.` + ); + if (slave.behavioralQuirk === "advocate") { + r.push( + Spoken(slave, `"I see now,"`), + `${he} continues,`, + Spoken(slave, `"that slavery really is a ${woman}'s rightful place. ${He} has no purpose except to serve ${his} ${Master}."`) + ); + } + } + r.push(`You smile at your obedient little slave, and agree to grant ${his} request.`); + } + + if (random(1, 100) > (100 + slave.devotion)) { + if (slave.fetish !== "submissive" && slave.energy <= 95 && slave.behavioralFlaw !== "liberated") { + r.push(`Seeing the humiliating acts your slaves are expected to perform has made ${him} <span class="red">determined to be free.</span>`); + slave.behavioralFlaw = "liberated"; + } + } else if (random(1, 100) > (110 - slave.devotion)) { + if (slave.fetish === "none" && slave.behavioralFlaw !== "liberated") { + r.push(`Feeling the joy of kneeling before such a powerful ${getWrittenTitle(slave)}`); + + r.push(`and begging at ${hisP} feet has <span class="lightcoral">encouraged ${him} to be more submissive.</span>`); + slave.fetish = "submissive"; + slave.fetishKnown = 1; + } + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fBeg.tw b/src/npc/interaction/fBeg.tw deleted file mode 100644 index 67a2bb7eb50e4dd41922a5692c2afbf059978eb8..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fBeg.tw +++ /dev/null @@ -1,440 +0,0 @@ -:: FBeg [nobr no-history] - -/* things I need: checks for canWalk() to see how easily she can move, blindness checks, replacement for BoobsDesc, maybe devotion catches for certain flaws */ -/* priority! femPC support! */ - -<<setPlayerPronouns>> -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run Enunciate(getSlave($AS))>> -<<set _temp = getSlave($AS)>> -<<setSpokenLocalPronouns _temp _temp>> - -You call $him over to you for inspection. -<<print App.Desc.boobs(getSlave($AS))>> /* this part needs expansion */ -You look at $him lustfully and instruct $him to strip. -<<if (getSlave($AS).sexualFlaw == "shamefast")>> - Tears well up in $his eyes at the idea of showing $his naked body. -<<elseif (getSlave($AS).sexualQuirk == "tease")>> - $He blushes with arousal. $He has kept $his innate embarrassment at the thought of being naked, but you have infused this with overwhelming arousal. $His cheeks are red as $he removes $his clothes, giving quite a strip tease as $he does. -<<elseif (getSlave($AS).sexualFlaw == "repressed")>> - $He subconsciously uses $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> to try to cover $his body. $He is still repressing $his own sexuality. That type of behavior may have been allowed in the old world, but it has no place in a Free City. -<<elseif (getSlave($AS).sexualFlaw == "idealistic")>> - $He shakes $his head pleadingly. "But I don't con<<s>>ent," $he responds. You laugh in such a way that tells $him that $his consent is irrelevant. $He is still idealistic, believing that sex should be a consensual expression of love and intimacy. Such ideas were common in the Old World, but they have no place in a Free City. You decide to grab $him and forcefully rip $his clothes from $his body, since obedience could simply be seen as consent. $He screams and plead as you pin $his arms, ripping and tearing at the cloth that keeps $his beauty from sight. -<<elseif (getSlave($AS).sexualFlaw == "neglectful")>> - $He replies "Ye<<s>>, - <<if getSlave($AS).rudeTitle == 1>> - <<= PoliteRudeTitle(getSlave($AS))>>," - <<else>> - <<Master>>," - <</if>> - $he replies contritely. $He has no sense of self beyond your usefulness of $him, and selflessly sacrifices $his own comfort for your pleasure. -<<elseif (getSlave($AS).sexualFlaw == "attention whore")>> - $He eagerly begins to shirk $his wear, drawing as much attention to the process as possible. -<<else>> - <<if (getSlave($AS).devotion < -20)>> - $He resists, forcing you to undress $him yourself. - <<elseif (getSlave($AS).devotion >= -20)>> - $He obeys, and moves to the center of your office to disrobe for you. - <</if>> -<</if>> -<<if (getSlave($AS).devotion >= -20)>> - $He begins to undress with - <<if (getSlave($AS).skill.entertainment >= 100)>> - masterful skill, teasing and taunting all the way down. $He rolls $his hips and most sexual parts as $he removes $his clothing. - <<elseif (getSlave($AS).skill.entertainment >= 80)>> - arousing skill. Even though the goal is just to get $him naked, your slave knows that $his job is to entertain you with $his every move. - <<elseif (getSlave($AS).skill.entertainment >= 50)>> - notable skill. $He takes the opportunity to give you a light strip tease as $he undresses. - <<elseif (getSlave($AS).skill.entertainment >= 20)>> - a decent effort. $He isn't your most entertaining slave, but $he still makes an effort to arouse you with $his undressing. - <<elseif (getSlave($AS).skill.entertainment >= 9)>> - some effort to be sexy. $His moves are less than skillful and the undressing is more pragmatic than arousing. - <<else>> - no effort to be sexy. $He has no entertainment skill, and the only goal of $his actions is to go from clothed to naked. - <</if>> -<</if>> - -<<if (getSlave($AS).fetishStrength > 60)>> - <<switch getSlave($AS).fetish>> - <<case "submissive">> - As $he begins to strip you grab $him without warning and begin to tear off $his clothes. Your slave expected you to allow $him to obey your command, and so $he is initially taken aback by the sudden force but $his submissive nature keeps $him from resisting. $He is such a submissive slut that you feel obligation to push $his status even further. You bind $his arms tightly behind $his back in a leather monoglove, lacing it tighter until $his elbows are touching. $He gives a soft whimper, but you both know that this is for your benefit and not a protest. - <<if (getSlave($AS).nipplesPiercing >= 1)>> - You then retrieve heavy bells and attach them to $his nipple rings. - <<else>> - You reach into your pocket and retrieve two weighted and belled nipple clamps, attaching them tightly to your slave's delicate nipples. - <</if>> - You tell $him to bounce so that they jingle, reminding $him of $his status. - <<case "masochist">> - Once $he is fully exposed you give $him a firm slap across the tits. $He's a masochist and relishes the pain with sexual arousal. You ask your painslut if $he deserves to be punished. "Oh ye<<s>>, - <<if getSlave($AS).rudeTitle == 1>> - <<= PoliteRudeTitle(getSlave($AS))>>. - <<else>> - <<Master>>. - <</if>> - Plea<<s>>e puni<<sh>> your little <<s>>lut." Sensing that your slave is getting too much enjoyment from $his beating, you cease. - <</switch>> -<</if>> - -You stare at the naked figure standing before you. - -<<if canSee(getSlave($AS))>> - <<if (getSlave($AS).boobsTat == "rude words")>> - The words on $his chest stand out at you. You ask $him what $his tits say. "Fuck<<s>>lave," $he replies. You ask if that's what $he is. - <<if (getSlave($AS).behavioralFlaw == "liberated")>> - "I'm nobody'<<s>> property. I'm a free $woman!" $he shoots back. "We shall see," you reply. - <<elseif (getSlave($AS).devotion < -20)>> - $He does $his best to shake $his head. - <<else>> - "Yes <<Master>>, that'<<s>> what I am." - <</if>> - <<elseif (getSlave($AS).boobsTat == "possessive")>> - The words on $his chest stand out at you. You ask $him what $his tits say. "It'<<s>> your per<<s>>onal <<s>>ymbol," $he replies. You ask if that's what $he is. - <<if (getSlave($AS).behavioralFlaw == "liberated")>> - "I'm nobody'<<s>> property. I'm a free $woman!" $he shoots back. "We shall see," you reply. - <<elseif (getSlave($AS).devotion < -20)>> - $He does $his best to shake $his head. - <<else>> - "Ye<<s>> <<Master>>, that'<<s>> what I am." - <</if>> - <<elseif (getSlave($AS).boobsTat == "degradation")>> - The words on $his chest stand out at you. You ask $him what $his tits say. "<<Master>>'<<s>> Bitch," $he replies. You ask if that's what $he is. - <<if (getSlave($AS).behavioralFlaw == "liberated")>> - "I'm nobody'<<s>> property. I'm a free $woman!" $he shoots back. "We shall see," you reply. - <<elseif (getSlave($AS).devotion < -20)>> - $He does $his best to shake $his head. - <<else>> - "Ye<<s>> <<Master>>, that'<<s>> what I am." - <</if>> - <<else>> - $His body belongs to you, and your slave needs to remember that. - <</if>> -<<else>> - $His body belongs to you, and your slave needs to remember that. -<</if>> - -You then tell your slave to kneel at your feet. -<<if (getSlave($AS).behavioralFlaw == "bitchy")>> - $He rolls $his eyes sasses you a bit, "Whatever," $he scoffs and -<<elseif (getSlave($AS).behaviorFlaw == "arrogant")>> - $He stands up even straighter than before, <<if (hasBothArms(getSlave($AS)))>>crossing $his arms and <</if>>widening $his stance. $His arrogance makes obeying commands like this difficult, but that is not your concern. You give $him a look that tells $him that pain will await if $he does not obey. $He -<<elseif (getSlave($AS).behavioralQuirk == "confident")>> - $He confidently moves to obey. $He -<<elseif (getSlave($AS).behavioralFlaw == "liberated")>> - $He stands up even straighter than before, <<if (hasBothArms(getSlave($AS)))>>crossing $his arms and <</if>>widening $his stance. "I am not <<s>>ome animal," $he protests, "I am a free $woman." You laugh at $his continued delusions. Liberated $women have no place in a Free City. You remind $him that pain awaits $him should $he defy you further and $he -<<elseif (getSlave($AS).behavioralQuirk == "advocate")>> - $He smiles at the demonstration of $his rightful place as a lowly slave. $He -<<elseif (getSlave($AS).behavioralFlaw == "odd")>> - $He sticks $his tongue out at you, blowing raspberries in an act of futile defiance. $He really is an odd one. $He -<<elseif (getSlave($AS).behavioralQuirk == "funny")>> - $He smiles and turns $his butt to you, swaying it cutely as $his silly way of acknowledging your command. $He -<<else>> - $He -<</if>> - -<<if (getSlave($AS).devotion < -20)>> - <<if (getSlave($AS).trust < -50)>> - drops terrified to the ground. - <<else>> - <<if !canTalk(getSlave($AS))>> - gestures - <<elseif (_lisping == 1)>> - lisps - <<else>> - declares - <</if>> - angrily that slavery is wrong and $he will not bow. You look at your assistant who silently summons two other, more obedient slaves from their duties. - <<if (getSlave($AS).nipplesPiercing > 1)>> - You reach out and grab $him by $his nipple chain, pulling $him in harshly. $He yelps in pain, but knows better than to pull away. - <<elseif (getSlave($AS).nosePiercing > 1)>> - You reach out and grab $him by $his nose ring, pulling $him in harshly. $He yelps in pain, but knows better than to pull away. - <<else>> - You reach out and grab $him firmly by the collar. - <</if>> - "One more chance, slut." By now, the other slaves have arrived and are standing loyally by your side. Your loyal slaves force $him to <<if hasAnyLegs(getSlave($AS))>>$his knee<<if hasBothLegs(getSlave($AS))>>s<</if>><<else>>the ground<</if>>. - <</if>> - "Head at crotch level," you clarify. "Remember your purpose." -<<elseif (getSlave($AS).devotion < 20)>> - is not enthusiastic, but is obedient enough to go down without much threat of discipline. -<<elseif (getSlave($AS).devotion > 20)>> - <<if (getSlave($AS).fetishKnown == 1)>> - <<switch getSlave($AS).fetish>> - <<case "submissive">> - bows $his head and humbly assumes $his rightful position at $his <<= getWrittenTitle(getSlave($AS))>>'s feet. - <<case "dom">> - would rather be standing by your side making your other sluts bow, but $he still knows that you are $his <<= getWrittenTitle(getSlave($AS))>>. - <<case "sadist">> - would rather be pushing one of your other whores painfully to their knees, but $he still obeys. - <<case "masochist">> - waits just long enough to receive a disciplinary slap, making $him blush with arousal as $he kneels before you. - <<case "cumslut">> - is excited to be closer to your <<if canTaste(getSlave($AS))>>delicious<<else>>heavenly<</if>> crotch, and hurries to match $his eyes to your <<if $PC.dick > 0>>package<<else>>crotch<</if>>. - <<case "humiliation">> - makes a big show of it as $he lowers $himself dramatically before you. - <<case "buttslut">> - leans heavily forward so that $his ass sticks out ridiculously far as $he <<if hasAnyLegs(getSlave($AS))>>bends $his knee<<if hasBothLegs(getSlave($AS))>>s<</if>> and <</if>>goes to the floor. - <<case "pregnancy">> - obeys your command and goes to <<if hasBothLegs(getSlave($AS))>>$his knees<<else>>the floor<</if>>. - <<case "boobs">> - pulls $his shoulders back strongly while leaning far enough forward to drag $his - <<if (getSlave($AS).boobs >= 10000)>> - weighty mammaries - <<elseif (getSlave($AS).boobs >= 2000)>> - cumbersome udders - <<elseif (getSlave($AS).boobs >= 1000)>> - massive slave tits - <<elseif (getSlave($AS).boobs >= 800)>> - forward-thrust breasts - <<elseif (getSlave($AS).boobs >= 500)>> - meager chest - <<elseif (getSlave($AS).boobs <= 400)>> - pathetic slave boobs - <<else>> - tits - <</if>> - across your body as $he goes down. - <<default>> - obeys your command and goes to <<if hasBothLegs(getSlave($AS))>>$his knees<<else>>the floor<</if>>. - <</switch>> - <<else>> - obeys your command and goes to <<if hasBothLegs(getSlave($AS))>>$his knees<<else>>the floor<</if>>. - <</if>> -<</if>> -<<if (getSlave($AS).devotion < -20)>> - The other slaves guide $him to adjust $his posture so $his eyes are directly in line with your <<if $PC.dick > 0>>package<<else>>crotch<</if>>. -<<else>> - $He kneels so that $his eyes are directly level with your <<if $PC.dick > 0>>package<<else>>crotch<</if>>. -<</if>> - -<<if $PC.dick > 0>> - <<if (getSlave($AS).energy > 50)>> - $He cant help but stare in lust at your - <<if $PC.balls >= 30>> - monstrous, massive pair of watermelon sized balls. - <<elseif $PC.balls >= 14>> - enormous, heavy pair of balls. - <<elseif $PC.balls >= 9>> - huge pair of balls, bulging like softballs from behind your suit. - <<elseif $PC.balls >= 5>> - large pair of balls, swinging heavily as you move. - <<else>> - manly package. - <</if>> - <<elseif $PC.scrotum > 0>> - Your balls loom directly in front of $his face. - <</if>> -<</if>> - -Now kneeling at your feet naked before you, your slave waits for $his <<= getWrittenTitle(getSlave($AS))>>'s command. You take some time to survey the slut's properly displayed body. -<<if getSlave($AS).butt > 6>> - $His massive ass is so huge that $he it squishes around $his heel<<if hasBothLegs(getSlave($AS))>>s<</if>>, almost reaching the floor. -<<elseif getSlave($AS).butt > 4>> - $His <<print either("ass", "rear end")>> is so round and large it rolls out from $his back in two perfect mounds. The cheeks are so thick it forms a perfect crevice between them, more than a couple <<if $showInches == 2>>inches<<else>>centimeters<</if>> deep. -<<elseif getSlave($AS).butt > 2>> - $His nice <<print either("plump", "thick")>> <<print either("ass", "butt")>> curves out noticeably, even while $he sits on $his knee<<if hasBothLegs(getSlave($AS))>>s<</if>>. -<<else>> - $His cute and tight ass rests gently on $his ankle<<if hasBothLegs(getSlave($AS))>>s<</if>>. -<</if>> - - -<<if (getSlave($AS).energy > 95)>> - $His eyes fill with lust at the helplessness of kneeling at your crotch. -<</if>> -<<if (getSlave($AS).fetishKnown == 1)>> - <<if (getSlave($AS).fetishStrength > 60)>> - <<switch getSlave($AS).fetish>> - <<case "submissive">> - $He keeps $his eyes down and poises $his body to be fully available to $his <<= getWrittenTitle(getSlave($AS))>>, trying to model for you the image of the perfect submissive. - <<case "dom">> - Despite $his kneeling stature, $his back is straight and shoulders back. - <<case "masochist">> - $He positions $himself uncomfortably, bringing visual pleasure to you and pain to $himself. $He accentuates $his most sensitive parts, inviting you to slap or spank them. - <<case "cumslut">> - $he goes to $his knee<<if hasBothLegs(getSlave($AS))>>s<</if>>, all the while staring at your <<if $PC.dick != 0>>manly bulge<<if $PC.vagina != -1>> and <</if>><</if>><<if $PC.vagina != -1>>feminine mound<</if>>. - <<case "humiliation">> - $He eagerly takes to this humiliating position, hoping to demonstrate $his willingness to be degraded by $his <<= getWrittenTitle(getSlave($AS))>>. - <<case "buttslut">> - $He positions $himself, sticking $his butt out as far as $he can manage, hoping to draw your attention to $his favorite area. - <<case "boobs">> - $he kneels with $his back strongly arching far back and diligently works to touch $his elbows behind $his back to best display $his - <<if (getSlave($AS).boobs >= 10000)>> - colossal mammaries - <<elseif (getSlave($AS).boobs >= 2000)>> - gigantic udders - <<elseif (getSlave($AS).boobs >= 1000)>> - massive slave tits - <<elseif (getSlave($AS).boobs >= 800)>> - prominent breasts - <<elseif (getSlave($AS).boobs >= 400)>> - modest chest - <<elseif (getSlave($AS).boobs <= 400)>> - pathetic slave boobs - <</if>> - for $his <<= getWrittenTitle(getSlave($AS))>>. - <<if (getSlave($AS).lactation > 0)>> - Milk dribbles down the soft curves of $his chest as a further sign of $his arousal. - <</if>> - This is, of course, how all slaves are supposed to kneel, but $he takes the pose with added dedication. - <<default>> - $He positions $himself with $his knee<<if hasBothLegs(getSlave($AS))>>s<</if>> spread wide, hoping that you will turn your attention to <<if canDoVaginal(getSlave($AS))>>$his wet pussy<<elseif canAchieveErection(getSlave($AS))>>$his hard cock<<else>>$him<</if>>. - <</switch>> - <</if>> -<</if>> -You give $him permission to speak, and tell $him that $he may beg $his <<= getWrittenTitle(getSlave($AS))>>. - -<<if (getSlave($AS).devotion < -20)>> - <<if (getSlave($AS).trust < -50)>> - <<switch getSlave($AS).rules.punishment>> - <<case "confinement">> - Your slave simply <<if hasAnyArms(getSlave($AS))>>presses $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> together and <</if>>begs you not to lock $him up in the bad-<<= $girl>> box. - <<case "whipping">> - Your slave simply <<if hasAnyArms(getSlave($AS))>>presses $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> together and <</if>>begs you not to whip $him. - <<case "chastity">> - <<if (getSlave($AS).energy > 60)>> - Your slave simply presses $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> together and begs you not to take away $his next orgasm - <<else>> - Your slave simply asks that you not change $his punishment. $He fears you, but using chastity as a punishment is not an efficient way to command $his obedience, since $he has no sexual energy. - <</if>> - <</switch>> - <<else>> - <<if (getSlave($AS).behavioralFlaw == "bitchy")>> - $He turns $his nose up in utter disgust. "Why, to feed your <<if $girl == "boy">>mi<<s>>andri<<s>>tic<<else>>mi<<s>>ogyni<<s>>tic<</if>> ego? Thank<<s>>, but no." $He looks at your other slaves holding $him down, "Why don't you get one of these mindle<<ss>> cunt<<s>> to do it? Or are they not hot enough?" $He is disobedient and bitchy, a bad combo. - <<elseif (getSlave($AS).behaviorFlaw == "arrogant")>> - $He tries to cock $his shoulders back, giving a death glare to the slaves holding $him in place, "I don't need anything from you," $he hisses. $He is disobedient and arrogant, a bad combo. - <<elseif (getSlave($AS).behavioralFlaw == "liberated")>> - $He does $his best to spit in your face, but the height difference means $he only stains your shirt. "I demand you relea<<s>>e me!" $he scowls, "Or I'm going to call the poli<<c>>e!" You smile at $his pathetically outdated worldview. You tell $him that's a good idea, since you know how rebellious slaves fare in jail. - <<elseif (getSlave($AS).behavioralFlaw == "odd")>> - $He purses $his lips and bounces on $his heels in futile rebellion. "Nuh-uh." $he puffs, shaking $his head wildly. - <<else>> - $He simply sits there, struggling against the hands holding $him down. - <</if>> - <</if>> - This is clearly the best you are going to get out of $him until $he is better trained. You - <<if (getSlave($AS).trust >= -50)>> - signal your loyal slaves to lift $him to $his feet, and - <</if>> - send $him away for now. -<<elseif (getSlave($AS).devotion < 20)>> - <<if (getSlave($AS).behavioralFlaw == "bitchy")>> - $He turns $his nose up in utter disgust. "Why, to feed your <<if $girl == "boy">>mi<<s>>andri<<s>>tic<<else>>mi<<s>>ogyni<<s>>tic<</if>> ego? Thank<<s>>, but no." $He looks at your other slaves holding $him down, "Why don't you get one of the<<s>>e mindle<<ss>> cunt<<s>> to do it? Or are they not hot enough?" $He is disobedient and bitchy, a bad combo. - <<elseif (getSlave($AS).behaviorFlaw == "arrogant")>> - $He tries to cock $his shoulders back, giving a death glare to the slaves holding $him in place, "I don't need anything from you," $he hisses. $He is disobedient and arrogant, a bad combo. - <<elseif (getSlave($AS).behavioralFlaw == "liberated")>> - $He does $his best to spit in your face, but the height difference means $he only stains your shirt. "I demand you relea<<s>>e me!" $he scowls, "Or I'm going to call the poli<<c>>e!" You smile at $his pathetically outdated worldview. You tell $him that's a good idea, since you know how rebellious slaves fair in jail. - <<elseif (getSlave($AS).behavioralFlaw == "odd")>> - $He purses $his lips and bounces on $his heels in futile rebellion. "Nuh-uh." $he puffs, shaking $his head wildly. - <<elseif (getSlave($AS).sexualFlaw == "shamefast")>> - $He tries to cover $his naked body from your gaze "Plea<<s>>e, can I ju<<s>>t put <<s>>ome clothe<<s>> on?" - <<else>> - $He looks up at you with a sudden glimpse of hope, and begins to plead, "Plea<<s>>e, <<s>>ir, plea<<s>>e <<s>>et me free. I don't want to be here. - <<if (getSlave($AS).energy < 50)>> - I have no de<<s>>ire for <<s>>e<<x>>. I don't want to be your toy! Plea<<s>>e let me go." - <<else>> - I might even come back to <<sh>>are con<<s>>en<<s>>ual love with you. I ju<<s>>t don't want to be property. Plea<<s>>e, let me go." - <</if>> - <</if>> - You tell your slave to rise to $his feet. Even though $he desired the impossible, it wasn't a total waste. You feel as though you have a pretty good understanding of where your slave stands. You send $him away with $his request denied, and you resolve to break $him more in the coming weeks. -<<elseif (getSlave($AS).devotion <= 60)>> - Your slave looks at $his <<= getWrittenTitle(getSlave($AS))>> with obedient eyes. -<<elseif (getSlave($AS).devotion <= 100)>> - Your devoted slave takes the begging position, - <<if (getSlave($AS).fetish != "submissive")>> - $he even brings $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> up like a dog's paws. - <<else>> - <<if (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>> - and $he bows $his head in total submission. - <<if (getSlave($AS).nipplesPiercing > 0)>> - The armbinder thrusts $his tits out nicely, and $his nipple rings are pulled tight by the weighted bells weighing them down. - <<elseif (getSlave($AS).nipplesPiercing > 1)>> - The armbinder thrusts $his tits out nicely, and ensures that $his nipple chains are pulled tight by the angle of $his shoulders. <<BoobWatch>> The bells on $his nipple piercings jungle sweetly as $he breathes. - <<else>> - The armbinder thrusts $his tits out nicely and $his nipples are now red from the clamps pressing down hard on $his sensitive flesh. Every painful shudder makes the bells jungle ever so sweetly. - <</if>> - <<else>> - $he even brings $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> up like a dog's paws. - <</if>> - <</if>> - "Ye<<s>> Ma<<s>>ter. Thank you, <<Master>>." $He is fully subservient to you, and would do anything to please you. -<</if>> - -<<if (getSlave($AS).devotion > 20)>> -/*eventually plan to make a string of Paraphilia text, which will be stronger versions of their fetish counterparts. */ - <<if (getSlave($AS).fetishKnown == 1)>> - <<if (getSlave($AS).fetishStrength > 60)>> - <<switch getSlave($AS).fetish>> - <<case "submissive">> - $He adjusts $his monoglove behind $his back, jingling $his nipple bells as $he does "Plea<<s>>e <<Master>>," $he begs with genuine humility, "Plea<<s>>e use your slave in whatever way you see fit. This <<s>>lave has no purpose but to please $his <<Master>>" - <<case "dom">> - $He looks up at you. Even from $his kneeling position $his eyes carry confident domination. "<<Master>>, I know my pla<<c>>e i<<s>> beneath you. Give me the authority to lord over your other <<s>>lave<<s>> and I will for<<c>>e them to <<s>>erve you a<<s>> I do." - <<case "masochist">> - "I know I haven't di<<s>>obeyed," $he begins, "but I ju<<s>>t need to be puni<<sh>>ed." You smile down at your little painslut, running your finger along $his chin. "Plea<<s>>e <<Master>>, beat me. Beat my a<<ss>> until it'<<s>> red and clamp my nipple<<s>> until they bleed. Plea<<s>>e! I need to feel your <<s>>trength!" - <<case "cumslut">> - Your little cumslut can't stop staring at your - <<if $PC.balls >= 30>> - monstrous, massive pair of watermelon sized balls. - <<elseif $PC.balls >= 14>> - enormous, heavy pair of balls. - <<elseif $PC.balls >= 9>> - huge pair of balls, bulging like softballs from behind your suit. - <<elseif $PC.balls >= 5>> - large pair of balls, swinging heavily as you move. - <<else>> - crotch. - <</if>> - Drool begins to drip from $his lips, and you have to remind your slave that $he is here to beg. - "<<Master>>," $he breathes heavily, "Plea<<s>>e let me - <<if $PC.dick != 0>> - <<s>>uck your magnifi<<c>>ent - <<if $PC.vagina != -1>> - cock and eat you out, - <<else>> - cock, - <</if>> - <<else>> - eat your deli<<c>>iou<<s>> pu<<ss>>y, - <</if>> - plea<<s>>e." You smile at the little cocksucker, so eager to please. - <<case "humiliation">> - $He sits so that $his body is on full display, "Plea<<s>>e <<Master>>, u<<s>>e me and humiliate me. Take me out to the public <<s>>quare <<s>>o that everyone can <<s>>ee you overpower me." - <<case "buttslut">> - $He positions $his back so $his ass sticks out even further "<<Master>>," $he begs, "u<<s>>e my a<<ss>>! - <<if (getSlave($AS).sexualQuirk == "painal")>> - Make me <<s>>queal! - <</if>> - I ju<<s>>t need your cock in my mo<<s>>t u<<s>>eful fuckhole, plea<<s>>e!" - <<case "boobs">> - $He <<if (!hasAnyArms(getSlave($AS)))>>leans $his head back and juts out $his tits, raising<<else>>takes $his hand<<if (hasBothArms(getSlave($AS)))>>s<</if>> and presses $his tits together, lifting<</if>> them to display for you $his primary purpose in life. - <<if (getSlave($AS).lactation > 0)>> - More milk <<if (!hasAnyArms(getSlave($AS)))>>dribbles<<else>>squirts<</if>> from each teat as $he bears them. - <</if>> - "I beg of you, <<Master>>, I need you to u<<s>>e my tit<<s>>. <<S>>uck them, <<s>>queeze them, fuck them, I cannot cum without you u<<s>>ing my <<s>>lave tit<<s>>! I am nothing more than a <<if canWalk(getSlave($AS))>>walking <</if>>tit-carrier, and my only purpo<<s>>e i<<s>> to offer the<<s>>e brea<<s>>t<<s>> to you." - <<case "pregnant">> - $He begins to <<if (hasAnyArms(getSlave($AS)))>>caress<<else>>stick out<</if>> $his stomach. "U<<s>>e me a<<s>> your breeder, <<Master>>, plea<<s>>e! I ju<<s>>t want to be filled with your <<s>>eed forever!" - <<default>> - $He kneels <<if hasBothLegs(getSlave($AS))>>with $his legs far spread<<else>>on the floor<</if>>. "U<<s>>e my fuckhole <<Master>>, I beg you. Plea<<s>>e, I need you to fuck me!" - <</switch>> - <<else>> - "<<Master>>, I e<<x>>i<<s>>t to <<s>>erve you." $He say, "I have no other purpo<<s>>e in life. I beg of you, plea<<s>>e never let me leave your <<s>>ervi<<c>>e. Let me wait on you forever. I <<s>>wear I will alway<<s>> be obedient. Let me cook your meal<<s>>, clean your penthou<<s>>e, care for your other <<s>>lave<<s>>, even make me a cow. I don't care, a<<s>> long a<<s>> I'm here <<s>>erving you." $He knows that $his rightful place is a slave, and $he is dedicated to living out that role to the fullest. - <<if (getSlave($AS).behavioralQuirk == "advocate")>> - "I <<s>>ee now," $he continues, "that <<s>>lavery really i<<s>> a $woman'<<s>> rightful pla<<c>>e. <<He>> ha<<s>> no purpo<<s>>e e<<x>><<c>>ept to <<s>>erve <<his>> <<Master>>." - <</if>> - <</if>> - <<else>> - "<<Master>>, I exi<<s>>t to <<s>>erve you." $He says, "I have no other purpo<<s>>e in life. I beg of you, plea<<s>>e never let me leave your <<s>>ervi<<c>>e. Let me wait on you forever. I <<s>>wear I will alway<<s>> be obedient. Let me cook your meal<<s>>, clean your penthou<<s>>e, care for your other <<s>>lave<<s>>, even make me a cow. I don't care, a<<s>> long a<<s>> I'm here <<s>>erving you." $He knows that $his rightful place is a slave, and $he is dedicated to living out that role to the fullest. - <<if (getSlave($AS).behavioralQuirk == "advocate")>> - "I <<s>>ee now," $he continues, "that <<s>>lavery really i<<s>> a $woman'<<s>> rightful pla<<c>>e. <<He>> ha<<s>> no purpo<<s>>e e<<x>><<c>>ept to <<s>>erve <<his>> <<Master>>." - <</if>> - <</if>> - You smile at your obedient little slave, and agree to grant $his request. -<</if>> - -<<if (random(1,100) > (100 + getSlave($AS).devotion))>> - <<if (getSlave($AS).fetish != "submissive") && (getSlave($AS).energy <= 95) && (getSlave($AS).behavioralFlaw != "liberated")>> - Seeing the humiliating acts your slaves are expected to perform has made $him @@.red;determined to be free.@@ - <<set getSlave($AS).behavioralFlaw = "liberated">> - <</if>> -<<elseif (random(1,100) > (110 - getSlave($AS).devotion))>> - <<if (getSlave($AS).fetish == "none") && (getSlave($AS).behavioralFlaw != "liberated")>> - Feeling the joy of kneeling before such a powerful <<= getWrittenTitle(getSlave($AS))>> and begging at _hisP feet has @@.lightcoral;encouraged $him to be more submissive.@@ - <<set getSlave($AS).fetish = "submissive", getSlave($AS).fetishKnown = 1>> - <</if>> -<</if>> diff --git a/src/npc/interaction/fBellyFuck.js b/src/npc/interaction/fBellyFuck.js new file mode 100644 index 0000000000000000000000000000000000000000..9456db3fa582b319c5f17227620a98510e586625 --- /dev/null +++ b/src/npc/interaction/fBellyFuck.js @@ -0,0 +1,128 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fBellyFuck = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, + he, his, him, himself + } = getPronouns(slave); + + slave.partners.add(-1); + + r.push(`You have ${him} brought to you so that you can fuck ${his} hyperpregnant body.`); + if (tooBigBelly(slave)) { + r.push(`${He} is pinned to the ground by ${his}`); + if (slave.bellyPreg >= 1000000) { + r.push(`impossibly exploded baby bump,`); + } else if (slave.bellyPreg >= 750000) { + r.push(`massively swollen baby bump,`); + } else if (slave.bellyPreg >= 600000) { + r.push(`titanic baby belly,`); + } else { + r.push(`massive belly,`); + } + r.push(`and won't be a particularly able lover because of this, but enjoying ${his} immobility is half the point.`); + } else if (!hasAnyLegs(slave)) { + r.push(`${He} has no limbs to stand on, so ${he} is left resting atop ${his}`); + if (slave.bellyPreg >= 1000000) { + r.push(`impossibly exploded baby bump.`); + } else if (slave.bellyPreg >= 750000) { + r.push(`massively swollen baby bump.`); + } else if (slave.bellyPreg >= 600000) { + r.push(`titanic baby belly.`); + } else { + r.push(`massive belly.`); + } + r.push(`${He} won't be a particularly able lover, but enjoying ${his} immobility is half the point.`); + } else if (!canStand(slave)) { + r.push(`${He} can't support ${himself}, so ${he} is left leaning against ${his}`); + if (slave.bellyPreg >= 1000000) { + r.push(`impossibly exploded baby bump.`); + } else if (slave.bellyPreg >= 750000) { + r.push(`massively swollen baby bump.`); + } else if (slave.bellyPreg >= 600000) { + r.push(`titanic baby belly.`); + } else { + r.push(`massive belly.`); + } + r.push(`${He} won't be a particularly able lover, but enjoying ${his} immobility is half the point.`); + } else { + r.push(`${He} can still stand despite ${his}`); + if (slave.bellyPreg >= 1000000) { + r.push(`impossibly exploded baby bump,`); + } else if (slave.bellyPreg >= 750000) { + r.push(`massively swollen baby bump,`); + } else if (slave.bellyPreg >= 600000) { + r.push(`titanic baby belly,`); + } else { + r.push(`massive belly,`); + } + r.push(`and won't be a particularly able lover because of this, but enjoying this obstacle is half the point.`); + } + r.push(`Once ${he} is situated in the center of your office, you walk a circle around ${him}, taking special care to`); + if (slave.bellyTat === "a heart") { + r.push(`trace a hand over the obliterated heart shaped tattoo on the front of ${his} immensely stretched belly.`); + } else if (slave.bellyTat === "a star") { + r.push(`trace a hand over the obliterated star shaped tattoo on the front of ${his} immensely stretched belly.`); + } else if (slave.bellyTat === "a butterfly") { + r.push(`trace a hand over the obliterated butterfly tattoo on the front of ${his} immensely stretched belly.`); + } else { + r.push(`trace a hand over the obliterated, stretched out expanse of slightly darker flesh where ${his} belly button used to be.`); + } + if (slave.devotion > 95) { + r.push(`${He} purrs in response to your touch, leaning forward against ${his} belly and`); + if (!hasAnyLegs(slave)) { + r.push(`wiggles`); + } else { + r.push(`lifts ${his} toes off the ground as ${he}`); + if (hasBothLegs(slave)) { + r.push(`spreads ${his} legs`); + } else { + r.push(`moves ${his} leg`); + } + } + r.push(`in preparation for you.`); + } else if (slave.trust < -20 && slave.devotion > -10) { + r.push(`${He} groans at your touch.`); + } else { + r.push(`${He} winces at your touch.`); + } + r.push(`When you get to ${his} rear, you slap ${his}`); + if (slave.butt > 11) { + r.push(`insanely enormous ass,`); + } else if (slave.butt > 5) { + r.push(`huge ass,`); + } else if (Math.floor(slave.buttImplant/slave.butt) > .60) { + r.push(`jiggly, saline filled ass,`); + } else if (slave.butt > 2) { + r.push(`thick ass,`); + } else { + r.push(`pert ass,`); + } + r.push(`and then spread ${his} cheeks for easier access to ${his}`); + if (canDoVaginal(slave)) { + r.push(`cunt.`); + r.push(VCheck.Vaginal(slave, 1)); + } else { + r.push(`asshole.`); + r.push(VCheck.Anal(slave, 1)); + } + r.push(`Heaving upward, you push ${him} fully onto ${his} belly, then lean into ${him}, fucking ${him} in a unique spin on the wheelbarrow position`); + if (V.PC.dick === 0) { + r.push(`with your strap-on`); + } + r.push(`and setting ${his} tightly packed gut to jiggling. ${He} moans in mixed pain and pleasure as you bring ${him} over the edge and, by the time you finish with ${him} and allow ${him} to return to ${his} duties, it's clear`); + if (slave.belly > slave.pregAdaptation*2000) { + r.push(`that your recent escapades <span class="health dec">have done lasting damage to ${his} body.</span>`); + healthDamage(slave, 10); + } else { + r.push(`that you've left ${him} thoroughly exhausted.`); + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fBellyFuck.tw b/src/npc/interaction/fBellyFuck.tw deleted file mode 100644 index 68727e032729475ad599ba4575b4b6cee67f1468..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fBellyFuck.tw +++ /dev/null @@ -1,91 +0,0 @@ -:: FBellyFuck [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run getSlave($AS).partners.add(-1)>> - -You have $him brought to you so that you can fuck $his hyperpregnant body. -<<if tooBigBelly(getSlave($AS))>> - $He is pinned to the ground by $his - <<if getSlave($AS).bellyPreg >= 1000000>> - impossibly exploded baby bump, - <<elseif getSlave($AS).bellyPreg >= 750000>> - massively swollen baby bump, - <<elseif getSlave($AS).bellyPreg >= 600000>> - titanic baby belly, - <<else>> - massive belly, - <</if>> - and won't be a particularly able lover because of this, but enjoying $his immobility is half the point. -<<elseif !hasAnyLegs(getSlave($AS))>> - $He has no limbs to stand on, so $he is left resting atop $his - <<if getSlave($AS).bellyPreg >= 1000000>> - impossibly exploded baby bump. - <<elseif getSlave($AS).bellyPreg >= 750000>> - massively swollen baby bump. - <<elseif getSlave($AS).bellyPreg >= 600000>> - titanic baby belly. - <<else>> - massive belly. - <</if>> - $He won't be a particularly able lover, but enjoying $his immobility is half the point. -<<elseif !canStand(getSlave($AS))>> - $He can't support $himself, so $he is left leaning against $his - <<if getSlave($AS).bellyPreg >= 1000000>> - impossibly exploded baby bump. - <<elseif getSlave($AS).bellyPreg >= 750000>> - massively swollen baby bump. - <<elseif getSlave($AS).bellyPreg >= 600000>> - titanic baby belly. - <<else>> - massive belly. - <</if>> - $He won't be a particularly able lover, but enjoying $his immobility is half the point. -<<else>> - $He can still stand despite $his - <<if getSlave($AS).bellyPreg >= 1000000>> - impossibly exploded baby bump, - <<elseif getSlave($AS).bellyPreg >= 750000>> - massively swollen baby bump, - <<elseif getSlave($AS).bellyPreg >= 600000>> - titanic baby belly, - <<else>> - massive belly, - <</if>> - and won't be a particularly able lover because of this, but enjoying this obstacle is half the point. -<</if>> -Once $he is situated in the center of your office, you walk a circle around $him, taking special care to -<<if (getSlave($AS).bellyTat == "a heart")>> - trace a hand over the obliterated heart shaped tattoo on the front of $his immensely stretched belly. -<<elseif (getSlave($AS).bellyTat == "a star")>> - trace a hand over the obliterated star shaped tattoo on the front of $his immensely stretched belly. -<<elseif (getSlave($AS).bellyTat == "a butterfly")>> - trace a hand over the obliterated butterfly tattoo on the front of $his immensely stretched belly. -<<else>> - trace a hand over the obliterated, stretched out expanse of slightly darker flesh where $his belly button used to be. -<</if>> -<<if getSlave($AS).devotion > 95>> - $He purrs in response to your touch, leaning forward against $his belly and <<if !hasAnyLegs(getSlave($AS))>>wiggles<<else>>lifts $his toes off the ground as $he <<if hasBothLegs(getSlave($AS))>>spreads $his legs<<else>>moves $his leg<</if>><</if>> in preparation for you. -<<elseif (getSlave($AS).trust < -20) && (getSlave($AS).devotion > -10)>> - $He groans at your touch. -<<else>> - $He winces at your touch. -<</if>> -When you get to $his rear, you slap $his -<<if getSlave($AS).butt > 11>> - insanely enormous ass, -<<elseif getSlave($AS).butt > 5>> - huge ass, -<<elseif Math.floor(getSlave($AS).buttImplant/getSlave($AS).butt) > .60>> - jiggly, saline filled ass, -<<elseif getSlave($AS).butt > 2>> - thick ass, -<<else>> - pert ass, -<</if>> -and then spread $his cheeks for easier access to $his <<if canDoVaginal(getSlave($AS))>>cunt. <<= VCheck.Vaginal(getSlave($AS), 1)>><<else>>asshole. <<= VCheck.Anal(getSlave($AS), 1)>><</if>> Heaving upward, you push $him fully onto $his belly, then lean into $him, fucking $him in a unique spin on the wheelbarrow position<<if $PC.dick == 0>> with your strap-on<</if>> and setting $his tightly packed gut to jiggling. $He moans in mixed pain and pleasure as you bring $him over the edge and, by the time you finish with $him and allow $him to return to $his duties, it's clear -<<if getSlave($AS).belly > getSlave($AS).pregAdaptation*2000>> - that your recent escapades <span class="health dec">have done lasting damage to $his body.</span> - <<run healthDamage(getSlave($AS), 10)>> -<<else>> - that you've left $him thoroughly exhausted. -<</if>> diff --git a/src/npc/interaction/fBoobs.js b/src/npc/interaction/fBoobs.js new file mode 100644 index 0000000000000000000000000000000000000000..825740bf56a2c4f92539676453e0e34817f3ae59 --- /dev/null +++ b/src/npc/interaction/fBoobs.js @@ -0,0 +1,521 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fBoobs = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself, hers + } = getPronouns(slave); + + addPartner(slave, -1); + seX(slave, "mammary", V.PC, "penetrative"); + + r.push(`You call ${him} over so you can play with ${his}`); + if (slave.boobs >= 20000) { + r.push(`colossal`); + } else if (slave.boobs >= 10000) { + r.push(`massive`); + } else if (slave.boobs >= 5000) { + r.push(`monster`); + } else if (slave.boobs >= 1000) { + r.push(`huge`); + } else if (slave.boobsImplant > 250) { + r.push(`fake`); + } else if (slave.boobs >= 650) { + r.push(`big`); + } else if (slave.boobs >= 300) { + r.push(`small`); + } else { + r.push(`flat`); + } + r.push(`tits.`); + + if (slave.boobsTat === "tribal patterns") { + r.push(`The tattoos on ${his} breasts certainly draw attention to ${his} nipples.`); + } else if (slave.boobsTat === "scenes") { + r.push(`The tattoos on ${his} abdomen nicely illustrate what you mean to do with ${him}: a titfuck.`); + } else if (slave.boobsTat === "degradation") { + r.push(`The tattoos on ${his} chest are asking you to use those breasts, after all.`); + } + + if (slave.nipples === "huge") { + r.push(`${His} nipples are so large they give ${his} breasts an unavoidably lewd appeal as they jut outward.`); + } else if (slave.nipples === "puffy") { + r.push(`${His} puffy nipples beg to be sucked.`); + } else if (slave.nipples === "flat") { + r.push(`${His} nipples are stretched nearly flat by ${his} implants, reducing them to two lewd little buttons.`); + } else if (slave.nipples === "partially inverted" && slave.nipplesPiercing === 0) { + r.push(`${His} partially inverted nipples should protrude at the slightest stimulation.`); + } else if (slave.nipples === "inverted" && slave.nipplesPiercing === 0) { + r.push(`${His} inverted nipples form lewd little creases across ${his} areolae.`); + } else if (slave.nipples === "fuckable") { + if (slave.lactation) { + r.push(`${His} nipplecunts are leaking milk and begging to be penetrated.`); + } else { + r.push(`${His} nipplecunts form lewd little slits across ${his} areolae.`); + } + } + + if (slave.nipplesPiercing > 1 && !hasAnyLegs(slave)) { + r.push(`You carry ${him} over, playing with the chain between ${his} nipples.`); + } else if (slave.nipplesPiercing > 1) { + r.push(`You pull ${him} over by the chain between ${his} nipples.`); + } else if (slave.nipplesPiercing === 1) { + r.push(`${His} nipple piercings glint enticingly.`); + } + + if (V.PC.belly >= 5000) { + if (V.PC.dick !== 0) { + r.push(`You lay ${him} down on the couch on ${his} back, lather oil onto ${his} breasts and gingerly straddle ${his} face; your stiff prick between ${his} tits and under your belly, and your needy cunt over ${his} mouth.`); + if (slave.boobs >= 20000) { + r.push(`${His} breasts are so colossal you can barely maintain this position. They completely devour your dick and threaten to swallow up your pregnant belly as well. Between ${his} licking, and the fleshy prison surrounding your privates, it doesn't take long for you to soak ${his} face and plant your seed deep into ${his} cleavage.`); + } else if (slave.boobs >= 10000) { + r.push(`${His} breasts are so massive you can barely maintain this position. They completely devour your dick and swell around the sides of your pregnancy as well. Between ${his} licking, and the fleshy prison surrounding your privates, it doesn't take long for you to soak ${his} face and plant your seed deep into ${his} cleavage.`); + } else if (slave.boobs >= 5000) { + r.push(`${His} breasts are so monstrous they completely devour your dick and tickle your pregnant belly. Pushing ${his} breasts together under your gravidness, you thrust between them and the underside of your middle, all the while rubbing your pussy into ${his} face. With ${his} licking, and all the flesh against your cock, it doesn't take long for you to soak ${his} face and plant your seed deep into ${his} cleavage.`); + } else if (slave.boobs >= 1000) { + r.push(`${His} huge breasts fill the area under your pregnancy nicely. Pushing them together under your gravidness, you thrust between them and the underside of your middle, all the while rubbing your pussy into ${his} face. With ${his} licking, and all the flesh against your cock, it doesn't take long for you to soak ${his} face and plant your seed deep into ${his} cleavage.`); + } else if (slave.boobsImplant > 250) { + r.push(`${His} fake breasts fill the area under your pregnancy nicely. Pushing them together under your gravidness, you thrust between them and the underside of your middle, all the while rubbing your pussy into ${his} face. With ${his} licking, and all the flesh against your cock, it doesn't take long for you to soak ${his} face and plant your seed deep into ${his} cleavage.`); + } else if (slave.boobs >= 650) { + r.push(`${His} big breasts fill the area under your pregnancy nicely. You thrust between them and the underside of your middle, all the while rubbing your pussy into ${his} face. With ${his} licking, and all the flesh against your cock, it doesn't take long for you to soak ${his} face and plant your seed deep into ${his} cleavage.`); + } else if (slave.boobs >= 300) { + r.push(`You have to feel around under your pregnancy to hold your cock against ${his} tiny breasts. You thrust against them and your hand, while the other teases your middle, all the while rubbing your pussy against ${his} face. Between ${his} licking, and your own teasing, it doesn't take long for you to soak ${his} face and splatter your seed across ${his} front.`); + } else { + r.push(`You have to lean forward and pin your cock against ${his} flat chest with the underside of your own pregnancy to make any real channel to thrust into. You fondle your belly${(V.PC.boobs >= 300) ? `and breasts` : ``}, all the while rubbing your pussy against ${his} face. Between ${his} licking, and your own teasing, it doesn't take long for you to soak ${his} face and splatter your seed across your underbelly and ${his} front. You turn around and have ${his} lick you clean before pulling your gravid bulk off of ${him}.`); + } + } else { + r.push(`You lay ${him} down on the couch on ${his} back, lather oil onto ${his} breasts and gingerly straddle ${his} face; your needy cunt over ${his} mouth.`); + if (slave.boobs >= 20000) { + r.push(`${His} breasts are so colossal you can barely maintain this position, but they are massively fun to play with as ${he} eats you out. You massage your pregnancy with ${his} acres of breast flesh, teasing your own stretched skin with ${hers}. You can visibly see the vibrations running through ${his} tits as you quiver from the mouth working your pussy. Thoroughly soaking ${him}, you fall into ${his} endless cleavage for a short rest.`); + } else if (slave.boobs >= 10000) { + r.push(`${His} breasts are so massive you can barely maintain this position, but they are fun to play with as ${he} eats you out. You massage the edges of your pregnancy with ${his} breast flesh, teasing your own stretched skin with ${hers}. You can visibly see the vibrations running through ${his} tits as you quiver from the mouth working your pussy. Thoroughly soaking ${him}, you fall into ${his} immense cleavage for a short rest.`); + } else if (slave.boobs >= 5000) { + r.push(`${His} breasts are so monstrous they make a fabulous rest for your pregnancy as ${he} eats you out. You tease ${his} breasts using your baby bump, rubbing it against them and vice versa. You can visibly see the vibrations running through ${his} tits as you quiver from the mouth working your pussy. Thoroughly soaking ${him}, you dismount and lean against ${his} monster breasts for a quick rest.`); + } else if (slave.boobs >= 1000) { + r.push(`${His} breasts are huge enough to support your pregnancy as ${he} eats you out. You press your belly more and more into them as ${his} tongue delves deeper into your folds. You can visibly see the vibrations running through the breast flesh forced to the sides of your middle as you quiver from the mouth working your pussy. Thoroughly soaking ${him}, you dismount and lean against ${his} huge breasts for a quick rest.`); + } else if (slave.boobs >= 650) { + r.push(`${His} big breasts fill the area under your pregnancy nicely. You press your belly more and more into them as ${his} tongue delves deeper into your folds. You can visibly see the vibrations running through the breast flesh forced to the sides of your middle as you quiver from the mouth working your pussy. Thoroughly soaking ${him}, you dismount and lean against ${his} big breasts for a quick rest.`); + } else if (slave.boobs >= 300) { + r.push(`${His} tiny breasts are completely covered by your pregnancy. You reach under yourself, grabbing what you can of ${his} breasts and pushing them against your crotch. Between rubbing ${his} breasts against your self and ${his} tongue in your pussy, you quickly climax, thoroughly soaking ${him}.`); + } else { + r.push(`${His} flat chest is completely covered by your pregnancy. Reach under yourself, you feel around until you find ${his} nipples. You tease ${his} flat chest until you're at you limit, thoroughly soaking ${him}, before dismounting and returning to your desk.`); + } + } + } else if (isAmputee(slave)) { + if (V.PC.dick !== 0) { + r.push(`${His} limbless`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`torso makes ${him} a unique appliance for mammary intercourse. You lay ${him} down on the ground on ${his} back, lube ${his} cleavage, and straddle ${his} torso. With your cock between ${his} breasts, you`); + if (slave.boobs >= 650) { + r.push(`squash ${his} tits together to form a nice lubricated channel,`); + } else { + r.push(`hold your cock in place,`); + } + r.push(`and ride back and forth on ${him}.`); + if (V.PC.vagina !== -1) { + r.push(`Your pussylips rub deliciously across ${his} sternum.`); + } + r.push(`${He} has some trouble breathing under the assault, but ${he} manages. And for the finale, ${he}'s totally unable to avoid a perfect cumshot.`); + } else if (V.PC.boobs >= 300) { + r.push(`You set ${his} limbless torso upright on your lap, facing you, so that your breasts and ${hers} are resting heavily against one another. ${He} turns ${his} head to avoid getting splashed in the eyes as you add a generous coating of oil to the heaving breastflesh. You reach around to grab ${him} by the hips and slide ${him} up and down, giving you both a wonderful mammary oil massage.`); + } else { + r.push(`You set ${his} limbless torso on the floor, and tease ${him} for a while until ${his} nipples are rock hard. This done, you kneel down on ${him} with each of your legs aside ${his} torso, and hump your pussy back and forth on the stiff nub of one nipple. ${He} lies there, unable to do anything but comply, squirming with the stimulation.`); + } + } else if (tooBigBelly(slave)) { + if (V.PC.dick !== 0) { + r.push(`${His} excessively large belly makes ${him} a unique appliance for mammary intercourse. You lay ${him} down on the ground on ${his} back, lube ${his} cleavage, and gingerly fit yourself between ${his} belly and ${his} breasts. With your cock between ${his} breasts, you`); + if (slave.boobs >= 650) { + r.push(`squash ${his} tits together to form a nice lubricated channel,`); + } else { + r.push(`hold your cock in place,`); + } + r.push(`and ride back and forth on ${him}. You blast ${him} in the face with your cum in no time${(V.PC.vagina !== -1) ? `, leaving your pussyjuice on ${his} belly where you rubbed against ${him}` :``}.`); + } else if (V.PC.boobs >= 300) { + r.push(`You lie down on top of ${him}, face to face, forced high into the air by ${his} excessively large belly, so that your breasts press into ${his}`); + if (slave.boobs >= 20000) { + r.push(`colossal tits.`); + } else if (slave.boobs >= 10000) { + r.push(`massive tits.`); + } else if (slave.boobs >= 5000) { + r.push(`monster tits.`); + } else if (slave.boobs >= 1000) { + r.push(`huge tits.`); + } else if (slave.boobsImplant > 250) { + r.push(`fake tits.`); + } else if (slave.boobs >= 650) { + r.push(`big tits.`); + } else if (slave.boobs >= 300) { + r.push(`small tits.`); + } else { + r.push(`flat chest.`); + } + r.push(`Scooting around to stimulate your nipples against ${his} warm breastflesh, you kiss the slave while pushing a hand down between you to schlick yourself against ${him}.`); + } else { + r.push(`You set ${his} massively distended body on the floor, and tease ${him} for a while until ${his} nipples are rock hard. This done, you kneel down on ${him} with each of your legs aside ${his} torso, rear against the top of ${his} belly, and hump your pussy back and forth on the stiff nub of one nipple. ${He} lies there, desperately trying to reach around ${his} bulk to ${his} own pussy, but unable to do so, resorts to squirming with the stimulation.`); + } + } else if (tooBigBreasts(slave)) { + if (V.PC.dick !== 0) { + r.push(`${His} excessive breasts make ${him} a unique appliance for mammary intercourse. You lay ${him} down on the ground on ${his} back, lube ${his} cleavage, and straddle ${his} torso. ${He} holds ${his} udders together, creating a warm, wet channel as fuckable as any hole. You blast ${him} in the face with your cum in no time${(V.PC.vagina !== -1) ? `, leaving your pussyjuice on ${his} chest where you rubbed against ${him}` : ``}.`); + } else if (V.PC.boobs >= 300) { + r.push(`You lie down on top of ${him}, face to face, so that your much smaller breasts press into the massive pillows formed by ${his} chest. Scooting around to stimulate your nipples against ${his} warm breastflesh, you kiss the slave while pushing a hand down between you to schlick yourself against ${him}.`); + } else { + r.push(`You set ${his} nearly helpless body on the floor and then scoot your hips under the massive weight of ${his} tits. The heft feels nice against you, and you worm a naughty hand under there to play with yourself in the warm cave formed by your pelvis and ${his} udders.`); + } + } else if (tooBigButt(slave)) { + if (V.PC.dick !== 0) { + r.push(`${His} excessive butt makes ${him} a unique appliance for mammary intercourse. You lay ${him} down on the ground on ${his} back, ${his} butt hoisting ${his} crotch high above ${his} head, lube ${his} cleavage, and straddle ${his} torso. With your cock between ${his} breasts, you`); + if (slave.boobs >= 650) { + r.push(`squash ${his} tits together to form a nice lubricated channel,`); + } else { + r.push(`hold your cock in place,`); + } + r.push(`and ride back and forth on ${him}${(V.PC.vagina !== -1) ? `, leaving your pussyjuice on ${his} chest where you rubbed against ${him}` : ``}. ${He} has some trouble breathing under the assault, but ${he} manages. And for the finale, ${he}'s totally unable to avoid a perfect cumshot.`); + } else if (V.PC.boobs >= 300) { + r.push(`You set ${him} upright on your lap, facing you, so that your breasts and ${hers} are resting heavily against one another and ${his} massive ass covers your lap. ${He} turns ${his} head to avoid getting splashed in the eyes as you add a generous coating of oil to the combined breastflesh. You reach around to grab ${his} luxurious ass and jiggle ${him} up and down, giving you both a wonderful mammary oil massage.`); + } else { + r.push(`You set ${his} nearly helpless body on the floor and then scoot your hips under the massive weight of ${his} tits. The heft feels nice against you, and you worm a naughty hand under there to play with yourself in the warm cave formed by your pelvis and ${his} udders.`); + } + } else if (slave.fetish === "boobs" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && V.PC.dick !== 0) { + r.push(`${He} comes over hurriedly, already presenting ${his} breasts. ${He} gives you a titjob with ${his} lubricated cleavage while you sit at your desk, playing with ${his} own nipples and moaning with pleasure.`); + if (V.PC.vagina !== -1) { + r.push(`${He} does ${his} best to push ${his} sternum hard against you, giving your pussy some stimulation, too.`); + } + r.push(`As you get close to orgasm, you push ${his} ${hasBothArms(slave) ? `hands` : `hand`} away and take over,`); + if (slave.nipples === "fuckable") { + r.push(`running your fingers around the lip of ${his} ${slave.nipples} nipples. When you finish, you drive them in, hard,`); + } else { + r.push(`rolling ${his} ${slave.nipples} nipples between your fingers and thumbs. When you finish, you give them a hard pull,`); + } + r.push(`sending ${him} gasping over the edge as well.`); + } else if (slave.fetish === "cumslut" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && slave.chastityPenis === 1) { + r.push(`${He} comes over eagerly, with hunger in ${his} eyes. ${He} gives you a titjob with ${his} lubricated cleavage while you sit at your desk. As a cumslut ${he}'s almost desperate to get your cum into ${him}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`mouth and rubs a nipple with one hand and ${his} anal opening with the other, since ${he} can't touch ${his} cock. The situation brings ${him} some pleasure, but the first twitches of ${his} cock against ${his} chastity cage are so uncomfortable that ${he} subsides into busy mechanical dick sucking. ${He} writhes uncomfortably, frustrated beyond belief.`); + } else if (slave.fetish === "cumslut" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && slave.dick !== 0 && V.PC.dick !== 0) { + r.push(`${He} comes over eagerly, with hunger in ${his} eyes. ${He} gives you a titjob with ${his} lubricated cleavage while you sit at your desk. As a cumslut ${he}'s almost desperate to get your cum into ${him}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`mouth and`); + if (canAchieveErection(slave)) { + r.push(`jacks ${himself} off`); + } else { + r.push(`rubs ${his} sadly limp member`); + } + r.push(`in anticipation. When you finish, ${he} sits back with an ecstatic look on ${his} face and lets your cum rest in ${his} mouth as ${he} climaxes into ${his} hand. ${He} pours ${his} own cum from ${his} hand into ${his} mouth so it can mingle with yours.`); + } else if (slave.fetish === "cumslut" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && V.PC.dick !== 0) { + r.push(`${He} comes over eagerly, with hunger in ${his} eyes. ${He} gives you a titjob with ${his} lubricated cleavage while you sit at your desk. As a cumslut ${he}'s almost desperate to get your cum into ${him}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`mouth and rubs ${himself} in anticipation. When you finish, ${he}`); + if (V.PC.vagina !== -1) { + r.push(`quickly swallows and then runs ${his} hot tongue down to your wet pussy, eagerly licking your juices.`); + } else { + r.push(`sits back with an ecstatic look on ${his} face and lets your cum rest in ${his} mouth as ${he} climaxes.`); + } + } else if (slave.devotion < -20) { + r.push(`${He} tries to refuse you, so you throw ${him} down on the couch next to your desk and`); + if (V.PC.dick !== 0) { + r.push(`squeeze lubricant between ${his} ${slave.skin} breasts. You straddle ${his} torso, hold ${his} boobs together, and fuck ${his} cleavage${(V.PC.vagina !== -1) ? `, grinding your hips down against ${him} to stimulate your pussy` : ``}. Your cum splashes ${his} crying face.`); + } else if (V.PC.boobs >= 300) { + r.push(`squirt lubricant all over ${his} ${slave.skin} breasts. Then, you lie down atop ${him} with your breasts meshing with ${hers} and begin to slide up and down, stimulating your nipples wonderfully. ${He} tries to turn ${his} head away, but you reach up to force ${his} unwilling mouth to accept your insistent tongue.`); + } else { + r.push(`straddle ${his} face, grinding your pussy against ${his} unwilling mouth. You begin to grope ${his} breasts and pinch ${his} nipples to hardness, and when ${he}'s slow at eating you out, you twist them cruelly. The pain makes ${him} squeal into your pussy, a lovely sensation, so you manhandle ${him} without mercy until you climax against ${his} gasping face.`); + } + } else if (slave.devotion <= 20 && slave.lactation > 0) { + r.push(`${He} lies on the couch next to your`); + if (V.PC.dick !== 0) { + r.push(`desk and rubs lube over ${his} ${slave.skin} chest so you can fuck ${his} tits. You straddle ${his} torso, hold ${his} boobs together, and fuck ${his} cleavage. As you do, the pressure of your grip causes a thin rivulet of milk to run from each of ${his} nipples. Your cum covers ${his} reluctant face; between your semen${(V.PC.vagina !== -1) ? `, the pussyjuice you left on ${his} chest,` : ``}and ${his} milk ${he}'s quite a mess.`); + } else if (V.PC.boobs >= 300) { + r.push(`desk and rubs lube over ${his} ${slave.skin} breasts. Then, you lie down atop ${him} with your breasts meshing with ${hers} and begin to slide up and down, titillating your nipples wonderfully. ${He} cannot ignore the slippery stimulation ${his} nipples are receiving, and you find ${his} mouth quite willing to receive your insistent tongue. ${He} begins to leak milk, adding ${his} cream to the lube between your breasts, and by the time you're done there's quite a mess.`); + } else { + r.push(`desk, and you've straddled ${his} face before ${he} can do anything more. You begin to grope ${his} breasts and pinch ${his} nipples to hardness as ${he} eats you out, your ministrations producing prompt jets of creamy milk, straight up into the air. You milk ${him} without mercy, shooting some of the stronger streams into your mouth as you ride ${him}, leaving ${him} to massage ${his} breasts gingerly as you get off ${his} face.`); + } + } else if (slave.devotion <= 20) { + r.push(`${He} lies on the couch next to your`); + if (V.PC.dick !== 0) { + r.push(`desk and rubs lube over ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`chest so you can fuck ${his} ${slave.skin} tits. You straddle ${his} torso, hold ${his} boobs together, and fuck ${his} cleavage. Your cum covers ${his} reluctant face${(V.PC.vagina !== -1) ? `, and you hike yourself up a little higher to grind your pussy against ${his} mouth` : ``}.`); + } else if (V.PC.boobs >= 300) { + r.push(`desk and rubs lube over ${his} ${slave.skin} breasts. Then, you lie down atop ${him} with your breasts meshing with ${hers} and begin to slide up and down, titillating your nipples wonderfully. ${He} cannot ignore the slippery stimulation ${his} nipples are receiving, and you find ${his} mouth quite willing to receive your insistent tongue.`); + } else { + r.push(`desk, and you've straddled ${his} face before ${he} can do anything more. You begin to grope ${his} breasts and pinch ${his} nipples to hardness as ${he} eats you out, your ministrations producing moans that feel quite nice against your clit. You maul ${his} boobs without mercy as you reach your climax, leaving ${him} to massage ${his} breasts gingerly as you get off ${him}.`); + } + } else if (slave.lactation > 0) { + r.push(`Since ${he}'s producing milk, ${he} gets an emotional high from breastfeeding, and ${he} sits on the edge of your desk for a while so you can use ${him} as a beverage dispenser while you work. Once ${he}'s empty, ${he} gets down to`); + if (V.PC.dick === 0) { + r.push(`eat you out.`); + if (hasAnyArms(slave)) { + r.push(`As ${he} buries ${his} face between your legs, ${he} gently rolls ${his} sore nipples around in ${his} fingers, quietly moaning and whining.`); + } + } else { + r.push(`give you a titjob.`); + if (hasAnyArms(slave)) { + r.push(`As you titfuck ${him}, ${he} gently rolls ${his} sore nipples around in ${his} fingers, quietly moaning and whining.`); + } + r.push(`Your cum covers ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`face in no time, and ${he}'s left with a spectacular mess to clean. ${He} laps it all up.`); + } + } else { + if (V.PC.dick !== 0) { + r.push(`${He} massages and toys with ${his} chest for your benefit, languidly rubbing lubricant over not only ${his} cleavage but ${his} entire chest, making sure every`); + if (V.showInches === 2) { + r.push(`inch`); + } else { + r.push(`centimeter`); + } + r.push(`of ${his} ${slave.skin} breasts are nice and shiny. ${He} gives you a titjob with ${his} lubricated cleavage while you sit at your desk${(V.PC.vagina !== -1) ? `, doing ${his} best to run ${his} hard nipples between your pussylips whenever ${he} can` : ``}. Your cum covers ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`face, and ${he} carefully licks it all off while continuing to play with ${his} erect nipples.`); + } else if (V.PC.boobs >= 300) { + r.push(`${He} rubs lube over ${his} ${slave.skin} breasts, flirting with you and sticking out ${his} chest, before lying down on the couch. You lie down atop ${him} with your breasts meshing with ${hers} and begin to slide up and down, titillating your nipples wonderfully. You find ${his} mouth quite willing to receive your insistent`); + if (hasAnyArms(slave)) { + r.push(`tongue, and while you make out, ${he} slips`); + if (hasBothArms(slave)) { + r.push(`a`); + } else { + r.push(`${his}`); + } + r.push(`hand down between your legs to give you a handjob, too.`); + } else { + r.push(`tongue.`); + } + } else { + r.push(`${He} flirts with you and sticks out ${his} chest before lying down on the couch. You've straddled ${his} face before ${he} can do anything more, and ${he} begins to eat you out with enthusiasm. You begin to grope ${his} breasts and pinch ${his} nipples to hardness as ${he} gives you oral, your ministrations producing moans that feel quite nice against your clit. You maul ${his} boobs without mercy as you reach your climax, but ${he} loves it all.`); + } + } + + if (random(1, 100) > (100+slave.devotion)) { + if (slave.fetish !== "boobs" && slave.energy <= 95 && slave.behavioralFlaw === "none") { + if (V.PC.vagina >= 0 && V.PC.dick === 0) { + r.push(`Being manhandled and used by you has given ${him} a <span class="flaw gain">hatred of women.</span>`); + slave.behavioralFlaw = "hates women"; + } else { + r.push(`Being manhandled and used has given ${him} a <span class="flaw gain">hatred of men.</span>`); + slave.behavioralFlaw = "hates men"; + } + } + } else if (random(1, 100) > (110-slave.devotion)) { + if (slave.fetish === "none" && + (slave.behavioralFlaw !== "hates men" || V.PC.dick === 0) && + (slave.behavioralFlaw !== "hates women" || V.PC.dick > 0) + ) { + r.push(`Having attention and love lavished on ${his} boobs by ${his} ${getWrittenTitle(slave)} has ${him} thinking of ${his} <span class="fetish gain">breasts as sexual organs.</span>`); + slave.fetish = "boobs"; + slave.fetishKnown = 1; + } + } + + if (slave.lactation > 0) { + slave.lactationDuration = 2; + slave.boobs -= slave.boobsMilk; + slave.boobsMilk = 0; + } else { + r.push(induceLactation(slave)); + } + + if (hasAnyLegs(slave)) { + switch (slave.assignment) { + case "work in the dairy": + r.push(`${He} goes off to carefully wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage`); + } else { + r.push(`chest`); + } + r.push(`to keep production in ${V.dairyName} nice and sanitary.`); + break; + case "work as a farmhand": + r.push(`${He} goes off to carefully wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage`); + } else { + r.push(`chest`); + } + r.push(`to make sure ${he} doesn't taint the food in ${V.farmyardName}.`); + break; + case "whore": + r.push(`${He} heads off to wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage`); + } else { + r.push(`chest`); + } + r.push(`before ${he} returns to prostituting ${himself}.`); + break; + case "work in the brothel": + r.push(`${He} goes to wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage,`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage,`); + } else { + r.push(`chest,`); + } + r.push(`even though it's likely to be splashed with customers' cum soon after ${he} returns to work.`); + break; + case "serve the public": + r.push(`${He} heads off to wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage`); + } else { + r.push(`chest`); + } + r.push(`before ${he} goes back out to fuck passersby.`); + break; + case "serve in the club": + r.push(`${He} goes to beautify ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage`); + } else { + r.push(`chest`); + } + r.push(`so it can again serve as an ornament to ${V.clubName}.`); + break; + case "work as a servant": + r.push(`${He} rushes to wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage,`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage,`); + } else { + r.push(`chest,`); + } + r.push(`afraid ${he}'s fallen behind on the chores while you used ${him}.`); + break; + case "work as a nanny": + r.push(`${He} rushes to wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage,`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage,`); + } else { + r.push(`chest,`); + } + r.push(`before hurrying to continue taking care of the children in ${V.nurseryName}.`); + break; + case "rest": + r.push(`${He} stumbles off to wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage`); + } else { + r.push(`chest`); + } + r.push(`before crawling back into bed.`); + break; + case "train slaves": + r.push(`${He} heads off to wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage`); + } else { + r.push(`chest`); + } + r.push(`before ${he} returns to ${his} classes.`); + break; + case "get milked": + r.push(`${He} hurries off to wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage`); + } else { + r.push(`chest`); + } + if (slave.lactation > 0) { + r.push(`before going to get ${his} uncomfortably milk-filled tits drained.`); + } else { + r.push(`and then rests until ${his} balls are ready to be drained again.`); + } + break; + case "please you": + r.push(`${He} hurries off to wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage`); + } else { + r.push(`chest`); + } + r.push(`before returning to await use, as though nothing had happened.`); + break; + case "be a subordinate slave": + r.push(`${He} moves off to wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage,`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage,`); + } else { + r.push(`chest,`); + } + r.push(`though it's only a matter of time before another slave decides to play with ${his} tits.`); + break; + case "be a servant": + r.push(`${He} hurries off to wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage,`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage,`); + } else { + r.push(`chest,`); + } + r.push(`since ${his} chores didn't perform themselves while you titfucked ${him}.`); + break; + case "be your Head Girl": + r.push(`${He} hurries off to wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage,`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage,`); + } else { + r.push(`chest,`); + } + r.push(`worried that ${his} charges got up to trouble while ${he} had ${his} breasts around your cock.`); + break; + case "guard you": + r.push(`${He} hurries off to wash ${his}`); + if (slave.boobs > 1500) { + r.push(`acre of cleavage`); + } else if (slave.boobs > 500) { + r.push(`generous cleavage`); + } else { + r.push(`chest`); + } + r.push(`so that you will be unguarded for as little time as possible.`); + } + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fBoobs.tw b/src/npc/interaction/fBoobs.tw deleted file mode 100644 index 41519cf99ca9870fe6b4a959804df1ab83f13d4a..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fBoobs.tw +++ /dev/null @@ -1,244 +0,0 @@ -:: FBoobs [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> -<<set getSlave($AS).counter.mammary++, $mammaryTotal++>> - -You call $him over so you can play with $his -<<if (getSlave($AS).boobs >= 20000)>> - colossal -<<elseif (getSlave($AS).boobs >= 10000)>> - massive -<<elseif (getSlave($AS).boobs >= 5000)>> - monster -<<elseif (getSlave($AS).boobs >= 1000)>> - huge -<<elseif (getSlave($AS).boobsImplant > 250)>> - fake -<<elseif (getSlave($AS).boobs >= 650)>> - big -<<elseif (getSlave($AS).boobs >= 300)>> - small -<<else>> - flat -<</if>> -tits. - -<<if (getSlave($AS).boobsTat == "tribal patterns")>> - The tattoos on $his breasts certainly draw attention to $his nipples. -<<elseif (getSlave($AS).boobsTat == "scenes")>> - The tattoos on $his abdomen nicely illustrate what you mean to do with $him: a titfuck. -<<elseif (getSlave($AS).boobsTat == "degradation")>> - The tattoos on $his chest are asking you to use those breasts, after all. -<</if>> - -<<if (getSlave($AS).nipples == "huge")>> - $His nipples are so large they give $his breasts an unavoidably lewd appeal as they jut outward. -<<elseif (getSlave($AS).nipples == "puffy")>> - $His puffy nipples beg to be sucked. -<<elseif (getSlave($AS).nipples == "flat")>> - $His nipples are stretched nearly flat by $his implants, reducing them to two lewd little buttons. -<<elseif (getSlave($AS).nipples == "partially inverted") && (getSlave($AS).nipplesPiercing == 0)>> - $His partially inverted nipples should protrude at the slightest stimulation. -<<elseif (getSlave($AS).nipples == "inverted") && (getSlave($AS).nipplesPiercing == 0)>> - $His inverted nipples form lewd little creases across $his areolae. -<<elseif getSlave($AS).nipples == "fuckable">> - <<if getSlave($AS).lactation>> - $His nipplecunts are leaking milk and begging to be penetrated. - <<else>> - $His nipplecunts form lewd little slits across $his areolae. - <</if>> -<</if>> - -<<if (getSlave($AS).nipplesPiercing > 1) && !hasAnyLegs(getSlave($AS))>> - You carry $him over, playing with the chain between $his nipples. -<<elseif (getSlave($AS).nipplesPiercing > 1)>> - You pull $him over by the chain between $his nipples. -<<elseif (getSlave($AS).nipplesPiercing == 1)>> - $His nipple piercings glint enticingly. -<</if>> - -<<if $PC.belly >= 5000>> - <<if $PC.dick != 0>> - You lay $him down on the couch on $his back, lather oil onto $his breasts and gingerly straddle $his face; your stiff prick between $his tits and under your belly, and your needy cunt over $his mouth. - <<if (getSlave($AS).boobs >= 20000)>> - $His breasts are so colossal you can barely maintain this position. They completely devour your dick and threaten to swallow up your pregnant belly as well. Between $his licking, and the fleshy prison surrounding your privates, it doesn't take long for you to soak $his face and plant your seed deep into $his cleavage. - <<elseif (getSlave($AS).boobs >= 10000)>> - $His breasts are so massive you can barely maintain this position. They completely devour your dick and swell around the sides of your pregnancy as well. Between $his licking, and the fleshy prison surrounding your privates, it doesn't take long for you to soak $his face and plant your seed deep into $his cleavage. - <<elseif (getSlave($AS).boobs >= 5000)>> - $His breasts are so monstrous they completely devour your dick and tickle your pregnant belly. Pushing $his breasts together under your gravidness, you thrust between them and the underside of your middle, all the while rubbing your pussy into $his face. With $his licking, and all the flesh against your cock, it doesn't take long for you to soak $his face and plant your seed deep into $his cleavage. - <<elseif (getSlave($AS).boobs >= 1000)>> - $His huge breasts fill the area under your pregnancy nicely. Pushing them together under your gravidness, you thrust between them and the underside of your middle, all the while rubbing your pussy into $his face. With $his licking, and all the flesh against your cock, it doesn't take long for you to soak $his face and plant your seed deep into $his cleavage. - <<elseif (getSlave($AS).boobsImplant > 250)>> - $His fake breasts fill the area under your pregnancy nicely. Pushing them together under your gravidness, you thrust between them and the underside of your middle, all the while rubbing your pussy into $his face. With $his licking, and all the flesh against your cock, it doesn't take long for you to soak $his face and plant your seed deep into $his cleavage. - <<elseif (getSlave($AS).boobs >= 650)>> - $His big breasts fill the area under your pregnancy nicely. You thrust between them and the underside of your middle, all the while rubbing your pussy into $his face. With $his licking, and all the flesh against your cock, it doesn't take long for you to soak $his face and plant your seed deep into $his cleavage. - <<elseif (getSlave($AS).boobs >= 300)>> - You have to feel around under your pregnancy to hold your cock against $his tiny breasts. You thrust against them and your hand, while the other teases your middle, all the while rubbing your pussy against $his face. Between $his licking, and your own teasing, it doesn't take long for you to soak $his face and splatter your seed across $his front. - <<else>> - You have to lean forward and pin your cock against $his flat chest with the underside of your own pregnancy to make any real channel to thrust into. You fondle your belly<<if $PC.boobs >= 300>> and breasts<</if>>, all the while rubbing your pussy against $his face. Between $his licking, and your own teasing, it doesn't take long for you to soak $his face and splatter your seed across your underbelly and $his front. You turn around and have $his lick you clean before pulling your gravid bulk off of $him. - <</if>> - <<else>> - You lay $him down on the couch on $his back, lather oil onto $his breasts and gingerly straddle $his face; your needy cunt over $his mouth. - <<if (getSlave($AS).boobs >= 20000)>> - $His breasts are so colossal you can barely maintain this position, but they are massively fun to play with as $he eats you out. You massage your pregnancy with $his acres of breast flesh, teasing your own stretched skin with $hers. You can visibly see the vibrations running through $his tits as you quiver from the mouth working your pussy. Thoroughly soaking $him, you fall into $his endless cleavage for a short rest. - <<elseif (getSlave($AS).boobs >= 10000)>> - $His breasts are so massive you can barely maintain this position, but they are fun to play with as $he eats you out. You massage the edges of your pregnancy with $his breast flesh, teasing your own stretched skin with $hers. You can visibly see the vibrations running through $his tits as you quiver from the mouth working your pussy. Thoroughly soaking $him, you fall into $his immense cleavage for a short rest. - <<elseif (getSlave($AS).boobs >= 5000)>> - $His breasts are so monstrous they make a fabulous rest for your pregnancy as $he eats you out. You tease $his breasts using your baby bump, rubbing it against them and vice versa. You can visibly see the vibrations running through $his tits as you quiver from the mouth working your pussy. Thoroughly soaking $him, you dismount and lean against $his monster breasts for a quick rest. - <<elseif (getSlave($AS).boobs >= 1000)>> - $His breasts are huge enough to support your pregnancy as $he eats you out. You press your belly more and more into them as $his tongue delves deeper into your folds. You can visibly see the vibrations running through the breast flesh forced to the sides of your middle as you quiver from the mouth working your pussy. Thoroughly soaking $him, you dismount and lean against $his huge breasts for a quick rest. - <<elseif (getSlave($AS).boobs >= 650)>> - $His big breasts fill the area under your pregnancy nicely. You press your belly more and more into them as $his tongue delves deeper into your folds. You can visibly see the vibrations running through the breast flesh forced to the sides of your middle as you quiver from the mouth working your pussy. Thoroughly soaking $him, you dismount and lean against $his big breasts for a quick rest. - <<elseif (getSlave($AS).boobs >= 300)>> - $His tiny breasts are completely covered by your pregnancy. You reach under yourself, grabbing what you can of $his breasts and pushing them against your crotch. Between rubbing $his breasts against your self and $his tongue in your pussy, you quickly climax, thoroughly soaking $him. - <<else>> - $His flat chest is completely covered by your pregnancy. Reach under yourself, you feel around until you find $his nipples. You tease $his flat chest until you're at you limit, thoroughly soaking $him, before dismounting and returning to your desk. - <</if>> - <</if>> -<<elseif isAmputee(getSlave($AS))>> - <<if $PC.dick != 0>> - $His limbless <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>torso makes $him a unique appliance for mammary intercourse. You lay $him down on the ground on $his back, lube $his cleavage, and straddle $his torso. With your cock between $his breasts, you <<if (getSlave($AS).boobs >= 650)>>squash $his tits together to form a nice lubricated channel,<<else>>hold your cock in place,<</if>> and ride back and forth on $him.<<if $PC.vagina != -1>> Your pussylips rub deliciously across $his sternum.<</if>> $He has some trouble breathing under the assault, but $he manages. And for the finale, $he's totally unable to avoid a perfect cumshot. - <<elseif $PC.boobs >= 300>> - You set $his limbless torso upright on your lap, facing you, so that your breasts and $hers are resting heavily against one another. $He turns $his head to avoid getting splashed in the eyes as you add a generous coating of oil to the heaving breastflesh. You reach around to grab $him by the hips and slide $him up and down, giving you both a wonderful mammary oil massage. - <<else>> - You set $his limbless torso on the floor, and tease $him for a while until $his nipples are rock hard. This done, you kneel down on $him with each of your legs aside $his torso, and hump your pussy back and forth on the stiff nub of one nipple. $He lies there, unable to do anything but comply, squirming with the stimulation. - <</if>> - -<<elseif tooBigBelly(getSlave($AS))>> - <<if $PC.dick != 0>> - $His excessively large belly makes $him a unique appliance for mammary intercourse. You lay $him down on the ground on $his back, lube $his cleavage, and gingerly fit yourself between $his belly and $his breasts. With your cock between $his breasts, you <<if (getSlave($AS).boobs >= 650)>>squash $his tits together to form a nice lubricated channel,<<else>>hold your cock in place,<</if>> and ride back and forth on $him. You blast $him in the face with your cum in no time<<if $PC.vagina != -1>>, leaving your pussyjuice on $his belly where you rubbed against $him<</if>>. - <<elseif $PC.boobs >= 300>> - You lie down on top of $him, face to face, forced high into the air by $his excessively large belly, so that your breasts press into $his<<if (getSlave($AS).boobs >= 20000)>> colossal tits.<<elseif (getSlave($AS).boobs >= 10000)>> massive tits.<<elseif (getSlave($AS).boobs >= 5000)>> monster tits.<<elseif (getSlave($AS).boobs >= 1000)>> huge tits.<<elseif (getSlave($AS).boobsImplant > 250)>> fake tits.<<elseif (getSlave($AS).boobs >= 650)>> big tits.<<elseif (getSlave($AS).boobs >= 300)>> small tits.<<else>> flat chest.<</if>> Scooting around to stimulate your nipples against $his warm breastflesh, you kiss the slave while pushing a hand down between you to schlick yourself against $him. - <<else>> - You set $his massively distended body on the floor, and tease $him for a while until $his nipples are rock hard. This done, you kneel down on $him with each of your legs aside $his torso, rear against the top of $his belly, and hump your pussy back and forth on the stiff nub of one nipple. $He lies there, desperately trying to reach around $his bulk to $his own pussy, but unable to do so, resorts to squirming with the stimulation. - <</if>> -<<elseif tooBigBreasts(getSlave($AS))>> - <<if $PC.dick != 0>> - $His excessive breasts make $him a unique appliance for mammary intercourse. You lay $him down on the ground on $his back, lube $his cleavage, and straddle $his torso. $He holds $his udders together, creating a warm, wet channel as fuckable as any hole. You blast $him in the face with your cum in no time<<if $PC.vagina != -1>>, leaving your pussyjuice on $his chest where you rubbed against $him<</if>>. - <<elseif $PC.boobs >= 300>> - You lie down on top of $him, face to face, so that your much smaller breasts press into the massive pillows formed by $his chest. Scooting around to stimulate your nipples against $his warm breastflesh, you kiss the slave while pushing a hand down between you to schlick yourself against $him. - <<else>> - You set $his nearly helpless body on the floor and then scoot your hips under the massive weight of $his tits. The heft feels nice against you, and you worm a naughty hand under there to play with yourself in the warm cave formed by your pelvis and $his udders. - <</if>> -<<elseif tooBigButt(getSlave($AS))>> - <<if $PC.dick != 0>> - $His excessive butt makes $him a unique appliance for mammary intercourse. You lay $him down on the ground on $his back, $his butt hoisting $his crotch high above $his head, lube $his cleavage, and straddle $his torso. With your cock between $his breasts, you <<if (getSlave($AS).boobs >= 650)>>squash $his tits together to form a nice lubricated channel,<<else>>hold your cock in place,<</if>> and ride back and forth on $him<<if $PC.vagina != -1>>, leaving your pussyjuice on $his chest where you rubbed against $him<</if>>. $He has some trouble breathing under the assault, but $he manages. And for the finale, $he's totally unable to avoid a perfect cumshot. - <<elseif $PC.boobs >= 300>> - You set $him upright on your lap, facing you, so that your breasts and $hers are resting heavily against one another and $his massive ass covers your lap. $He turns $his head to avoid getting splashed in the eyes as you add a generous coating of oil to the combined breastflesh. You reach around to grab $his luxurious ass and jiggle $him up and down, giving you both a wonderful mammary oil massage. - <<else>> - You set $his nearly helpless body on the floor and then scoot your hips under the massive weight of $his tits. The heft feels nice against you, and you worm a naughty hand under there to play with yourself in the warm cave formed by your pelvis and $his udders. - <</if>> -<<elseif (getSlave($AS).fetish == "boobs") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1) && ($PC.dick != 0)>> - $He comes over hurriedly, already presenting $his breasts. $He gives you a titjob with $his lubricated cleavage while you sit at your desk, playing with $his own nipples and moaning with pleasure.<<if $PC.vagina != -1>> $He does $his best to push $his sternum hard against you, giving your pussy some stimulation, too.<</if>> As you get close to orgasm, you push $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> away and take over, - <<if getSlave($AS).nipples == "fuckable">> - running your fingers around the lip of $his <<= getSlave($AS).nipples>> nipples. When you finish, you drive them in, hard, - <<else>> - rolling $his <<= getSlave($AS).nipples>> nipples between your fingers and thumbs. When you finish, you give them a hard pull, - <</if>> - sending $him gasping over the edge as well. -<<elseif (getSlave($AS).fetish == "cumslut") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).chastityPenis == 1)>> - $He comes over eagerly, with hunger in $his eyes. $He gives you a titjob with $his lubricated cleavage while you sit at your desk. As a cumslut $he's almost desperate to get your cum into $him <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>mouth and rubs a nipple with one hand and $his anal opening with the other, since $he can't touch $his cock. The situation brings $him some pleasure, but the first twitches of $his cock against $his chastity cage are so uncomfortable that $he subsides into busy mechanical dick sucking. $He writhes uncomfortably, frustrated beyond belief. -<<elseif (getSlave($AS).fetish == "cumslut") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).dick !== 0) && ($PC.dick != 0)>> - $He comes over eagerly, with hunger in $his eyes. $He gives you a titjob with $his lubricated cleavage while you sit at your desk. As a cumslut $he's almost desperate to get your cum into $him <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>mouth and <<if canAchieveErection(getSlave($AS))>>jacks $himself off<<else>>rubs $his sadly limp member<</if>> in anticipation. When you finish, $he sits back with an ecstatic look on $his face and lets your cum rest in $his mouth as $he climaxes into $his hand. $He pours $his own cum from $his hand into $his mouth so it can mingle with yours. -<<elseif (getSlave($AS).fetish == "cumslut") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1) && ($PC.dick != 0)>> - $He comes over eagerly, with hunger in $his eyes. $He gives you a titjob with $his lubricated cleavage while you sit at your desk. As a cumslut $he's almost desperate to get your cum into $him <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>mouth and rubs $himself in anticipation. When you finish, $he <<if $PC.vagina != -1>>quickly swallows and then runs $his hot tongue down to your wet pussy, eagerly licking your juices<<else>>sits back with an ecstatic look on $his face and lets your cum rest in $his mouth as $he climaxes<</if>>. -<<elseif getSlave($AS).devotion < -20>> - $He tries to refuse you, so you throw $him down on the couch next to your desk and - <<if $PC.dick != 0>> - squeeze lubricant between $his <<= getSlave($AS).skin>> breasts. You straddle $his torso, hold $his boobs together, and fuck $his cleavage<<if $PC.vagina != -1>>, grinding your hips down against $him to stimulate your pussy<</if>>. Your cum splashes $his crying face. - <<elseif $PC.boobs >= 300>> - squirt lubricant all over $his <<= getSlave($AS).skin>> breasts. Then, you lie down atop $him with your breasts meshing with $hers and begin to slide up and down, stimulating your nipples wonderfully. $He tries to turn $his head away, but you reach up to force $his unwilling mouth to accept your insistent tongue. - <<else>> - straddle $his face, grinding your pussy against $his unwilling mouth. You begin to grope $his breasts and pinch $his nipples to hardness, and when $he's slow at eating you out, you twist them cruelly. The pain makes $him squeal into your pussy, a lovely sensation, so you manhandle $him without mercy until you climax against $his gasping face. - <</if>> -<<elseif (getSlave($AS).devotion <= 20) && (getSlave($AS).lactation > 0)>> - $He lies on the couch next to your - <<if $PC.dick != 0>> - desk and rubs lube over $his <<= getSlave($AS).skin>> chest so you can fuck $his tits. You straddle $his torso, hold $his boobs together, and fuck $his cleavage. As you do, the pressure of your grip causes a thin rivulet of milk to run from each of $his nipples. Your cum covers $his reluctant face; between your semen<<if $PC.vagina != -1>>, the pussyjuice you left on $his chest,<</if>> and $his milk $he's quite a mess. - <<elseif $PC.boobs >= 300>> - desk and rubs lube over $his <<= getSlave($AS).skin>> breasts. Then, you lie down atop $him with your breasts meshing with $hers and begin to slide up and down, titillating your nipples wonderfully. $He cannot ignore the slippery stimulation $his nipples are receiving, and you find $his mouth quite willing to receive your insistent tongue. $He begins to leak milk, adding $his cream to the lube between your breasts, and by the time you're done there's quite a mess. - <<else>> - desk, and you've straddled $his face before $he can do anything more. You begin to grope $his breasts and pinch $his nipples to hardness as $he eats you out, your ministrations producing prompt jets of creamy milk, straight up into the air. You milk $him without mercy, shooting some of the stronger streams into your mouth as you ride $him, leaving $him to massage $his breasts gingerly as you get off $his face. - <</if>> -<<elseif getSlave($AS).devotion <= 20>> - $He lies on the couch next to your - <<if $PC.dick != 0>> - desk and rubs lube over $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>chest so you can fuck $his <<= getSlave($AS).skin>> tits. You straddle $his torso, hold $his boobs together, and fuck $his cleavage. Your cum covers $his reluctant face<<if $PC.vagina != -1>>, and you hike yourself up a little higher to grind your pussy against $his mouth<</if>>. - <<elseif $PC.boobs >= 300>> - desk and rubs lube over $his <<= getSlave($AS).skin>> breasts. Then, you lie down atop $him with your breasts meshing with $hers and begin to slide up and down, titillating your nipples wonderfully. $He cannot ignore the slippery stimulation $his nipples are receiving, and you find $his mouth quite willing to receive your insistent tongue. - <<else>> - desk, and you've straddled $his face before $he can do anything more. You begin to grope $his breasts and pinch $his nipples to hardness as $he eats you out, your ministrations producing moans that feel quite nice against your clit. You maul $his boobs without mercy as you reach your climax, leaving $him to massage $his breasts gingerly as you get off $him. - <</if>> -<<elseif (getSlave($AS).lactation > 0)>> - Since $he's producing milk, $he gets an emotional high from breastfeeding, and $he sits on the edge of your desk for a while so you can use $him as a beverage dispenser while you work. Once $he's empty, $he gets down to <<if ($PC.dick == 0)>>eat you out.<<if hasAnyArms(getSlave($AS))>> As $he buries $his face between your legs, $he gently rolls $his sore nipples around in $his fingers, quietly moaning and whining.<</if>><<else>>give you a titjob.<<if hasAnyArms(getSlave($AS))>> As you titfuck $him, $he gently rolls $his sore nipples around in $his fingers, quietly moaning and whining.<</if>> Your cum covers $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>face in no time, and $he's left with a spectacular mess to clean. $He laps it all up.<</if>> -<<else>> - <<if $PC.dick != 0>> - $He massages and toys with $his chest for your benefit, languidly rubbing lubricant over not only $his cleavage but $his entire chest, making sure every <<if $showInches == 2>>inch<<else>>centimeter<</if>> of $his <<= getSlave($AS).skin>> breasts are nice and shiny. $He gives you a titjob with $his lubricated cleavage while you sit at your desk<<if $PC.vagina != -1>>, doing $his best to run $his hard nipples between your pussylips whenever $he can<</if>>. Your cum covers $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>face, and $he carefully licks it all off while continuing to play with $his erect nipples. - <<elseif $PC.boobs >= 300>> - $He rubs lube over $his <<= getSlave($AS).skin>> breasts, flirting with you and sticking out $his chest, before lying down on the couch. You lie down atop $him with your breasts meshing with $hers and begin to slide up and down, titillating your nipples wonderfully. You find $his mouth quite willing to receive your insistent tongue<<if hasAnyArms(getSlave($AS))>>, and while you make out, $he slips <<if hasBothArms(getSlave($AS))>>a<<else>>$his<</if>> hand down between your legs to give you a handjob, too<</if>>. - <<else>> - $He flirts with you and sticks out $his chest before lying down on the couch. You've straddled $his face before $he can do anything more, and $he begins to eat you out with enthusiasm. You begin to grope $his breasts and pinch $his nipples to hardness as $he gives you oral, your ministrations producing moans that feel quite nice against your clit. You maul $his boobs without mercy as you reach your climax, but $he loves it all. - <</if>> -<</if>> - -<<if (random(1,100) > (100+getSlave($AS).devotion))>> - <<if (getSlave($AS).fetish !== "boobs") && (getSlave($AS).energy <= 95) && (getSlave($AS).behavioralFlaw == "none")>> - <<if $PC.vagina >= 0 && $PC.dick == 0>> - Being manhandled and used by you has given $him a @@.flaw.gain;hatred of women.@@ - <<set getSlave($AS).behavioralFlaw = "hates women">> - <<else>> - Being manhandled and used has given $him a @@.flaw.gain;hatred of men.@@ - <<set getSlave($AS).behavioralFlaw = "hates men">> - <</if>> - <</if>> -<<elseif (random(1,100) > (110-getSlave($AS).devotion))>> - <<if (getSlave($AS).fetish == "none") && (getSlave($AS).behavioralFlaw != "hates men" || $PC.dick == 0) && (getSlave($AS).behavioralFlaw != "hates women" || $PC.dick > 0)>> - Having attention and love lavished on $his boobs by $his <<= getWrittenTitle(getSlave($AS))>> has $him thinking of $his @@.fetish.gain;breasts as sexual organs.@@ - <<set getSlave($AS).fetish = "boobs", getSlave($AS).fetishKnown = 1>> - <</if>> -<</if>> - -<<if getSlave($AS).lactation > 0>> - <<set getSlave($AS).lactationDuration = 2>> - <<set getSlave($AS).boobs -= getSlave($AS).boobsMilk, getSlave($AS).boobsMilk = 0>> -<<else>> - <<= induceLactation(getSlave($AS))>> -<</if>> - -<<if hasAnyLegs(getSlave($AS))>> - <<switch getSlave($AS).assignment>> - <<case "work in the dairy">> - $He goes off to carefully wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>> to keep production in $dairyName nice and sanitary. - <<case "work as a farmhand">> - $He goes off to carefully wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>> to make sure $he doesn't taint the food in $farmyardName. - <<case "whore">> - $He heads off to wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>> before $he returns to prostituting $himself. - <<case "work in the brothel">> - $He goes to wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>>, even though it's likely to be splashed with customers' cum soon after $he returns to work. - <<case "serve the public">> - $He heads off to wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>> before $he goes back out to fuck passersby. - <<case "serve in the club">> - $He goes to beautify $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>> so it can again serve as an ornament to $clubName. - <<case "work as a servant">> - $He rushes to wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>>, afraid $he's fallen behind on the chores while you used $him. - <<case "work as a nanny">> - $He rushes to wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>>, before hurrying to continue taking care of the children in $nurseryName. - <<case "rest">> - $He stumbles off to wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>> before crawling back into bed. - <<case "train slaves">> - $He heads off to wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>> before $he returns to $his classes. - <<case "get milked">> - $He hurries off to wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>> <<if getSlave($AS).lactation > 0>>before going to get $his uncomfortably milk-filled tits drained<<else>>and then rests until $his balls are ready to be drained again<</if>>. - <<case "please you">> - $He hurries off to wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>> before returning to await use, as though nothing had happened. - <<case "be a subordinate slave">> - $He moves off to wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>>, though it's only a matter of time before another slave decides to play with $his tits. - <<case "be a servant">> - $He hurries off to wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>>, since $his chores didn't perform themselves while you titfucked $him. - <<case "be your Head Girl">> - $He hurries off to wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>>, worried that $his charges got up to trouble while $he had $his breasts around your cock. - <<case "guard you">> - $He hurries off to wash $his <<if getSlave($AS).boobs > 1500>>acre of cleavage<<elseif getSlave($AS).boobs > 500>>generous cleavage<<else>>chest<</if>> so that you will be unguarded for as little time as possible. - <</switch>> -<</if>> diff --git a/src/npc/interaction/fButt.js b/src/npc/interaction/fButt.js new file mode 100644 index 0000000000000000000000000000000000000000..8a8868c672853bc18f09f267dad19a4c0c800b23 --- /dev/null +++ b/src/npc/interaction/fButt.js @@ -0,0 +1,498 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fButt = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, girl + } = getPronouns(slave); + + slave.partners.add(-1); + + r.push(`You call ${him} over so you can`); + if (!canDoVaginal(slave)) { + r.push(`use ${his} sole fuckhole.`); + } else if (slave.vagina > 3) { + r.push(`fuck ${his} gaping holes.`); + } else if (slave.vagina > 2) { + r.push(`fuck ${his} loose holes.`); + } else if (slave.vagina === 2) { + r.push(`use ${his} whorish holes.`); + } else if (slave.vagina === 1) { + r.push(`use ${his} tight holes.`); + } else if (slave.vagina === 0 || slave.anus === 0) { + r.push(`take ${his} virginity.`); + } + + if (slave.vagina !== -1) { + if (slave.vaginaTat === "tribal patterns") { + r.push(`The tattoos on ${his} abdomen certainly draw attention there.`); + } else if (slave.vaginaTat === "scenes") { + r.push(`The tattoos on ${his} abdomen nicely illustrate what you mean to do to ${him}.`); + } else if (slave.vaginaTat === "degradation") { + r.push(`The tattoos on ${his} abdomen are asking you to, after all.`); + } else if (slave.vaginaTat === "lewd crest") { + r.push(`The crest on ${his} abdomen screams debauchery and implores you to use ${him}.`); + } + } + + if (slave.vaginaPiercing > 1) { + r.push(`${His} pierced lips and clit have ${him} nice and wet.`); + if (slave.dick !== 0) { + r.push(`Metal glints all up and down ${his} cock.`); + } + } else if (slave.vaginaPiercing === 1) { + r.push(`${His} pierced clit has ${his} nice and moist.`); + if (slave.dick !== 0) { + r.push(`Metal glints at the head of ${his} cock.`); + } + } + + if (slave.anusPiercing > 1) { + r.push(`The ring of stud piercings around ${his} anus should massage you delightfully as you sodomize ${him}.`); + } else if (slave.anusPiercing === 1) { + r.push(`${His} perineum piercing has a big ring in it, which you should be able to feel when you hilt yourself in ${his} ass.`); + } + + if (slave.anusTat !== 0 && slave.anusTat !== 4) { + r.push(`${His} anus is invitingly bleached,`); + if (slave.vagina > -1) { + r.push(`which is appropriate: rather than looking like ${he} has a hole for fucking and an ass, it looks like ${he} has two fuckholes.`); + } else { + r.push(`making ${his} sole fuckable hole look nice and natural.`); + } + } + + if (slave.vagina === 0 && slave.anus === 0 && canDoVaginal(slave)) { + if (V.PC.dick === 0) { + r.push(`You step into a strap-on, lubricate it, and break in ${his} holes in quick succession.`); + } else { + r.push(`Brooking no resistance, you take ${his} virginity and then break in ${his} virgin butt.`); + } + if (slave.devotion > 50) { + r.push(`You ease yourself into ${his} pussy before gradually working your way into ${his} ass and alternate between the two holes while ${he} begins to moan. In just a few minutes, ${he} has lost ${his} virginity and been assfucked for the first time. ${He} <span class="devotion inc">submits utterly</span> to your spoilage of ${his} innocence and thanks you meekly for introducing ${him} to proper sexual slavery. <span class="virginity loss">${His} holes have been broken in.</span>`); + slave.devotion += 10; + } else if (slave.devotion > 20) { + r.push(`You ease yourself into ${his} pussy before gradually working your way into ${his} ass and alternate between the two holes while ${he} begins to moan. In just a few minutes, ${he} has lost ${his} virginity and been assfucked for the first time. ${He}'s so bewildered by the pain and novelty that all ${he} feels is <span class="trust dec">a little fear</span> of further use. <span class="virginity loss">${His} holes have been broken in.</span>`); + slave.trust -= 5; + } else { + r.push(`You force yourself into ${his} pussy before gradually working your way into ${his} ass. ${He} sobs and cries with disgust while you alternate between the two holes. In just a few minutes, ${he} has lost ${his} virginity to rape and ${his} anal virginity to a rough buttfuck. To say ${he} <span class="devotion dec">resents you</span> and <span class="trust dec">fears further abuse</span> would be an understatement. <span class="virginity loss">${His} holes have been broken in.</span>`); + slave.devotion -= 10; + slave.trust -= 10; + } + r.push(VCheck.Both(slave, 1)); + } else if (slave.vagina === 0 && canDoVaginal(slave)) { + if (slave.devotion > 20) { + r.push(`${He} accepts your orders without comment and presents ${his} virgin pussy for defloration${(V.PC.dick === 0) ? `, watching with some small trepidation as you don a strap-on` : ``}. You gently ease into ${his} pussy before gradually increasing the intensity of your thrusts into ${him}. Before long, ${he}'s moaning loudly as you pound away. Since ${he} is already well broken, this new connection with ${his} ${getWrittenTitle(slave)} <span class="devotion inc">increases ${his} devotion to you.</span> <span class="virginity loss">${His} pussy has been broken in.</span>`); + slave.devotion += 10; + } else if (slave.devotion >= -20) { + r.push(`${He} is clearly unhappy at losing ${his} pearl of great price to you; this probably isn't what ${he} imagined ${his} first real sex would be like.`); + if (V.PC.dick === 0) { + r.push(`${His} lower lip quivers with trepidation as ${he} watches you don a strap-on and maneuver to fuck ${his} virgin hole.`); + } + r.push(`You gently ease into ${his} pussy before gradually increasing the intensity of your thrusts into ${him}. Before long, ${he}'s moaning as you pound away. Nevertheless, this new connection with ${his} ${getWrittenTitle(slave)} <span class="devotion inc">increases ${his} devotion to you.</span> <span class="virginity loss">${His} pussy has been broken in,</span> and ${he} is <span class="trust dec">fearful</span> that sex will continue to be painful.`); + slave.devotion += 5; + slave.trust -= 5; + } else { + r.push(`As you anticipated, ${he} refuses to give you ${his} virginity. And as you expected, ${he} is unable to resist you. ${He} cries as`); + if (V.PC.dick === 0) { + r.push(`your strap-on`); + } else { + r.push(`your cock`); + } + r.push(`opens ${his} fresh, tight hole. You force your way into ${his} pussy and continue thrusting into ${him}. ${He} sobs and cries with horror as you pound away. The rape <span class="devotion dec">decreases ${his} devotion to you.</span> <span class="virginity loss">${His} pussy has been broken in,</span> and ${he} <span class="trust dec">fears further abuse.</span>`); + slave.devotion -= 10; + slave.trust -= 15; + } + r.push(VCheck.Vaginal(slave, 1)); + } else if (slave.anus === 0) { + if (slave.devotion > 20) { + r.push(`${He} accepts your orders without comment and presents ${his} virgin anus for defloration. You`); + if (V.PC.dick === 0) { + r.push(`don a strap-on and`); + } + r.push(`gently sodomize ${him}. You gently ease yourself into ${his} butthole and gradually speed up your thrusts while ${he} slowly learns to move ${his} hips along with you. Since ${he} is already well broken, this new connection with ${his} ${getWrittenTitle(slave)} <span class="devotion inc">increases ${his} devotion to you.</span> <span class="virginity loss">${His} tight little ass has been broken in.</span>`); + slave.devotion += 4; + } else if (slave.devotion >= -20) { + r.push(`${He} is clearly unhappy at the idea of taking a dick up ${his} butt. ${He} obeys orders anyway, and lies there wincing and moaning as you`); + if (V.PC.dick === 0) { + r.push(`don a strap-on and`); + } + r.push(`fuck ${his} ass. <span class="virginity loss">${His} tight little ass has been broken in,</span> and ${he} <span class="trust dec">fears further anal pain.</span>`); + slave.trust -= 5; + } else { + r.push(`${He} is appalled at the idea of taking it up the ass${(V.PC.dick === 0) ? `and cries with fear as you don a strap-on` : ``}. ${He} does anyway though, sobbing into the cushions`); + if (hasAnyArms(slave)) { + r.push(`while you hold ${his} ${hasBothArms(slave) ? `arms` : `arm`} behind ${him}`); + } + r.push(r.pop() + `.`); + r.push(`You force yourself into ${his} butthole. ${He} sobs and cries with disgust while you continue thrusting into ${his} ass. The painful anal rape <span class="devotion dec">decreases ${his} devotion to you.</span> <span class="virginity loss">${His} tight little ass has been broken in,</span> and ${he} is <span class="trust dec">terrified of further anal pain.</span>`); + slave.devotion -= 5; + slave.trust -= 5; + } + r.push(VCheck.Anal(slave, 1)); + } else if (slave.devotion < -20) { + if (V.PC.dick === 0) { + r.push(`You don a cruelly large strap-on, and you do it so ${he} can`); + if (canSee(slave)) { + r.push(`see`); + } else if (canHear(slave)) { + r.push(`hear`); + } else { + r.push(`notice`); + } + r.push(`it.`); + } + r.push(`${He} tries to refuse you, so you throw ${him} across the back of the couch next to your desk with ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass in the air. You finger ${his} anus`); + if (slave.vagina !== -1) { + r.push(`while fucking ${his} pussy`); + } else if (hasBothLegs(slave)) { + r.push(`while frotting ${his} thighs`); + } + r.push(`for a bit and then switch to ${his} now-ready anus. ${He} sobs as you penetrate ${his} rectum.`); + if (slave.dick !== 0 && canAchieveErection(slave)) { + if (slave.prostate === 0) { + r.push(`${He} lacks a prostate, denying ${him} any real pleasure. ${His} dick stays flaccid as you rape ${him}.`); + } else if (slave.chastityPenis === 1) { + r.push(`Despite ${his} unwillingness to be sodomized, the prostate stimulation starts to give ${him} an erection, which ${his} dick chastity makes horribly uncomfortable. ${He} bucks with the pain, ${his} asshole spasming delightfully.`); + } else { + r.push(`Despite ${his} unwillingness to be sodomized, the prostate stimulation gives ${him} an erection. ${He}'s mortified that ${he} would get hard while being anally raped.`); + } + } else if (slave.chastityPenis === 1) { + r.push(`${His} dick chastity keeps ${his} bitch cock hidden away while you use ${his} anus like a pussy.`); + } else if (slave.dick !== 0) { + r.push(`${His} flaccid dick is ground into the back of the couch as you rape ${him}.`); + } + r.push(VCheck.Both(slave, 1)); + } else if (slave.devotion <= 50) { + r.push(`You throw ${him} across the back of the couch next to your desk with ${his} ass in the air${(V.PC.dick === 0) ? `, and don a strap-on` : ``}. You finger ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass while`); + if (slave.vagina !== -1) { + r.push(`fucking ${his} pussy`); + } else { + r.push(`frotting ${his} thighs`); + } + r.push(`for a bit and then switch to ${his} now-ready anus.`); + if (slave.anus === 1) { + r.push(`${His} ass is so tight that you have to work yourself in.`); + } else if (slave.anus === 2) { + r.push(`Your`); + if (V.PC.dick === 0) { + r.push(`fake dick`); + } else { + r.push(`cock`); + } + r.push(`slides easily up ${his} ass.`); + } else { + r.push(`You slide into ${his} already-gaping asspussy with ease.`); + } + r.push(`${He} gasps as you penetrate ${his} rectum, but you timed the switch so that ${he} was on the verge of orgasm, and ${he} comes immediately.`); + if (slave.dick !== 0 && canAchieveErection(slave)) { + if (slave.chastityPenis) { + r.push(`${He} managed to stay soft within ${his} dick chastity, but ${he} dribbled a lot of precum onto the couch. You make ${his} lick it up, and ${he} obeys, shuddering with unsatisfied arousal.`); + } else { + r.push(`${His} cock spatters the couch with cum, and you make ${his} lick it up.`); + } + } else if (slave.clit > 2) { + r.push(`${His} clit is so large that it bobs slightly with each thrust.`); + } + r.push(VCheck.Both(slave, 1)); + } else { + if (hasAnyLegs(slave)) { + r.push(`${He} kneels on the floor`); + } else { + r.push(`You lay ${him} on the floor`); + } + r.push(`so you can take ${him} at will${(V.PC.dick === 0) ? `, and don a strap-on` : ``}. You finger ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass while`); + if (canDoVaginal(slave)) { + r.push(`fucking ${his} pussy`); + } else { + r.push(`frotting ${his}`); + } + r.push(`for a bit and then switch to ${his} now-ready anus.`); + if (slave.anus === 1) { + r.push(`${His} ass is so tight that you have to work yourself in.`); + } else if (slave.anus === 2) { + r.push(`Your cock slides easily up ${his} ass.`); + } else { + r.push(`You slide into ${his} already-gaping asspussy with ease.`); + } + r.push(`You fuck ${him} there for a while before repeatedly pulling out and stuffing yourself back in. ${He} moans each time you fill`); + if (canDoVaginal(slave)) { + r.push(`a`); + } else { + r.push(his); + } + r.push(`waiting hole.`); + if (slave.dick !== 0 && canAchieveErection(slave)) { + if (slave.chastityPenis === 1) { + r.push(`Whenever ${he} starts to get hard, ${his} dick chastity gives ${him} an awful twinge of pain. You do your best to be up ${his} butt when this happens so you can experience the resulting spasm.`); + } else { + r.push(`Every time you penetrate, ${his} erect dick jerks up and slaps ${his} stomach.`); + } + } else if (slave.dick !== 0) { + if (slave.chastityPenis === 1) { + r.push(`${His} dick chastity keeps ${his} girly bitchclit hidden, just like it belongs.`); + } else { + r.push(`Every time you penetrate, ${his} limp dick flops around lamely.`); + } + } else if (slave.clit > 2) { + r.push(`${His} clit is so large that it bobs slightly with each thrust.`); + } + r.push(VCheck.Both(slave, 1)); + } + + if (slave.bellyPreg >= 1500) { + r.push(`The poor ${girl}'s pregnant belly makes taking a rough fuck in both ${his} holes uncomfortable for ${him}.`); + } else if (slave.bellyImplant >= 1500) { + r.push(`The poor ${girl}'s implant filled belly makes taking a rough fuck in both ${his} holes uncomfortable for ${him}.`); + } else if (slave.bellyFluid >= 1500) { + r.push(`The poor ${girl}'s sloshing belly makes taking a rough fuck in both ${his} holes uncomfortable for ${him}, though the lewd jiggling the pounding sends through it is quite a sight.`); + } + + if (slave.anusTat === "scenes" && slave.anus === 1) { + r.push(`As you fucked ${his} butt, the decorative pattern around ${his} ass stretched open. When you pull out, ${his} momentary gape closes the pattern up quickly.`); + } else if (slave.anusTat === "scenes") { + r.push(`As you fucked ${his} butt, the decorative pattern around ${his} ass stretched open. When you pull out, ${his} gape leaves the pattern distorted.`); + } else if (slave.anusTat === "degradation") { + r.push(`As you fucked ${his} butt, the offensive language around ${his} ass stretched and distorted.`); + } + + if (random(1, 100) > (100+slave.devotion)) { + if (slave.fetish !== "buttslut" && slave.energy <= 95 && slave.sexualFlaw !== "hates penetration") { + r.push(`Being brutally used has given ${him} a <span class="flaw gain">hatred of penetration.</span>`); + slave.sexualFlaw = "hates penetration"; + } + } else if (random(1, 100) > (110-slave.devotion)) { + if (slave.fetish === "none" && slave.sexualFlaw !== "hates penetration") { + r.push(`Orgasming to your use of ${his} fuckhole <span class="fetish gain">has ${him} eager for more buttsex.</span>`); + slave.fetish = "buttslut"; + slave.fetishKnown = 1; + } + } + + if (V.PC.dick !== 0) { + if (slave.cervixImplant === 2 || slave.cervixImplant === 3) { + slave.bellyImplant += random(10, 20); + } + + if (slave.anus > 3) { + r.push(`${His} gaping hole drips your cum right out again.`); + } else if (slave.anus > 2) { + r.push(`Cum drips out of ${his} loose hole.`); + } else if (slave.anus === 2) { + r.push(`Cum drips out of ${his} loosened anus.`); + } else if (slave.anus === 1) { + r.push(`${His} still-tight ass keeps your load inside ${him}.`); + } + + if (canMove(slave) && V.postSexCleanUp > 0) { + switch (slave.assignment) { + case "whore": + r.push(`${He} heads to the bathroom to clean ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes before returning to selling them publicly.`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole before returning to selling it publicly.`); + } else { + r.push(`face before returning to selling ${his} mouth publicly.`); + } + break; + case "serve the public": + r.push(`${He} heads to the bathroom to clean ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes before returning to offering it for free.`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole before returning to offering it for free.`); + } else { + r.push(`face before returning to offering ${his} mouth for free.`); + } + break; + case "rest": + r.push(`${He} stumbles to the bathroom to clean ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole`); + } else { + r.push(`face`); + } + r.push(`before crawling back into bed.`); + break; + case "train slaves": + r.push(`${He} heads to the bathroom to clean ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole`); + } else { + r.push(`face`); + } + r.push(`before ${he} returns to teaching ${his} classes.`); + break; + case "get milked": + r.push(`${He} hurries to the bathroom to clean ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole`); + } else { + r.push(`face`); + } + if (slave.lactation > 0) { + r.push(`before going to get ${his} uncomfortably milk-filled tits drained.`); + } else { + r.push(`and then rests until ${his} balls are ready to be drained again.`); + } + break; + case "please you": + r.push(`${He} hurries to the bathroom to clean ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole`); + } else { + r.push(`face`); + } + r.push(`before returning to await your next use of ${his} body, as though nothing had happened.`); + break; + case "be a subordinate slave": + r.push(`${He} moves to the bathroom to clean ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes,`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole,`); + } else { + r.push(`face,`); + } + r.push(`though it's only a matter of time before another slave decides to play with ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`pussy or asshole.`); + } else if (canDoVaginal(slave)) { + r.push(`pussy.`); + } else if (canDoAnal(slave)) { + r.push(`asshole.`); + } else { + r.push(`face.`); + } + break; + case "be a servant": + r.push(`${He} hurries to the bathroom to clean ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes,`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole,`); + } else { + r.push(`face,`); + } + r.push(`since ${his} chores didn't perform themselves while you used ${him}.`); + break; + case "be your Head Girl": + r.push(`${He} hurries to the bathroom to clean ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes,`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole,`); + } else { + r.push(`face,`); + } + r.push(`worried that ${his} charges got up to trouble while you had your cock in ${him}.`); + break; + case "guard you": + r.push(`${He} hurries off to wash ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole`); + } else { + r.push(`face`); + } + r.push(`so you'll be unguarded for as little time as possible.`); + break; + case "work in the brothel": + r.push(`${He} goes to wash ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole`); + } else { + r.push(`face`); + } + r.push(`so ${his} next customer can have the illusion that he's the first to use it today.`); + break; + case "serve in the club": + r.push(`${He} goes to wash and delicately perfume ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes so they`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole so it`); + } else { + r.push(`face so it`); + } + r.push(`can gratify the finest citizen.`); + break; + case "work in the dairy": + r.push(`${He} goes off to carefully wash ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole`); + } else { + r.push(`face`); + } + r.push(`to avoid besmirching the nice clean dairy.`); + break; + case "work as a farmhand": + r.push(`${He} goes off to wash ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole`); + } else { + r.push(`face`); + } + r.push(`to avoid tainting the food in ${V.farmyardName}.`); + break; + case "work as a servant": + r.push(`${He} rushes to wash ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes,`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole,`); + } else { + r.push(`face,`); + } + r.push(`impatient to get back to ${his} undiminished chores.`); + break; + case "work as a nanny": + r.push(`${He} rushes to wash ${his}`); + if (canDoVaginal(slave) && canDoAnal(slave)) { + r.push(`holes,`); + } else if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`fuckhole,`); + } else { + r.push(`face,`); + } + r.push(`before hurrying to continue taking care of the children in ${V.nurseryName}.`); + } + } + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fButt.tw b/src/npc/interaction/fButt.tw deleted file mode 100644 index 093304ad8ea15210e6923881cdae7c55b6465fa6..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fButt.tw +++ /dev/null @@ -1,248 +0,0 @@ -:: FButt [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run getSlave($AS).partners.add(-1)>> - -You call $him over so you can -<<if !canDoVaginal(getSlave($AS))>> - use $his sole fuckhole. -<<elseif (getSlave($AS).vagina > 3)>> - fuck $his gaping holes. -<<elseif (getSlave($AS).vagina > 2)>> - fuck $his loose holes. -<<elseif (getSlave($AS).vagina == 2)>> - use $his whorish holes. -<<elseif (getSlave($AS).vagina == 1)>> - use $his tight holes. -<<elseif (getSlave($AS).vagina == 0) || (getSlave($AS).anus == 0)>> - take $his virginity. -<</if>> - -<<if (getSlave($AS).vagina !== -1)>> - <<if (getSlave($AS).vaginaTat == "tribal patterns")>> - The tattoos on $his abdomen certainly draw attention there. - <<elseif (getSlave($AS).vaginaTat == "scenes")>> - The tattoos on $his abdomen nicely illustrate what you mean to do to $him. - <<elseif (getSlave($AS).vaginaTat == "degradation")>> - The tattoos on $his abdomen are asking you to, after all. - <<elseif (getSlave($AS).vaginaTat == "lewd crest")>> - The crest on $his abdomen screams debauchery and implores you to use $him. - <</if>> -<</if>> - -<<if (getSlave($AS).vaginaPiercing > 1)>> - $His pierced lips and clit have $him nice and wet. - <<if (getSlave($AS).dick !== 0)>> - Metal glints all up and down $his cock. - <</if>> -<<elseif (getSlave($AS).vaginaPiercing == 1)>> - $His pierced clit has $his nice and moist. - <<if (getSlave($AS).dick !== 0)>> - Metal glints at the head of $his cock. - <</if>> -<</if>> - -<<if (getSlave($AS).anusPiercing > 1)>> - The ring of stud piercings around $his anus should massage you delightfully as you sodomize $him. -<<elseif (getSlave($AS).anusPiercing == 1)>> - $His perineum piercing has a big ring in it, which you should be able to feel when you hilt yourself in $his ass. -<</if>> - -<<if (getSlave($AS).anusTat !== 0) && (getSlave($AS).anusTat !== 4)>> - $His anus is invitingly bleached, - <<if (getSlave($AS).vagina > -1)>> - which is appropriate: rather than looking like $he has a hole for fucking and an ass, it looks like $he has two fuckholes. - <<else>> - making $his sole fuckable hole look nice and natural. - <</if>> -<</if>> - -<<if (getSlave($AS).vagina == 0) && (getSlave($AS).anus == 0) && canDoVaginal(getSlave($AS))>> - <<if ($PC.dick == 0)>> - You step into a strap-on, lubricate it, and break in $his holes in quick succession. - <<else>> - Brooking no resistance, you take $his virginity and then break in $his virgin butt. - <</if>> - <<if (getSlave($AS).devotion > 50)>> - You ease yourself into $his pussy before gradually working your way into $his ass and alternate between the two holes while $he begins to moan. In just a few minutes, $he has lost $his virginity and been assfucked for the first time. $He <span class="devotion inc">submits utterly</span> to your spoilage of $his innocence and thanks you meekly for introducing $him to proper sexual slavery. <span class="virginity loss">$His holes have been broken in.</span> - <<set getSlave($AS).devotion += 10>> - <<elseif (getSlave($AS).devotion > 20)>> - You ease yourself into $his pussy before gradually working your way into $his ass and alternate between the two holes while $he begins to moan. In just a few minutes, $he has lost $his virginity and been assfucked for the first time. $He's so bewildered by the pain and novelty that all $he feels is <span class="trust dec">a little fear</span> of further use. <span class="virginity loss">$His holes have been broken in.</span> - <<set getSlave($AS).trust -= 5>> - <<else>> - You force yourself into $his pussy before gradually working your way into $his ass. $He sobs and cries with disgust while you alternate between the two holes. In just a few minutes, $he has lost $his virginity to rape and $his anal virginity to a rough buttfuck. To say $he @@.devotion.dec;resents you@@ and <span class="trust dec">fears further abuse</span> would be an understatement. <span class="virginity loss">$His holes have been broken in.</span> - <<set getSlave($AS).devotion -= 10, getSlave($AS).trust -= 10>> - <</if>> - <<set getSlave($AS).vagina++, getSlave($AS).anus++>> - <<= VCheck.Both(getSlave($AS), 1)>> -<<elseif (getSlave($AS).vagina == 0) && canDoVaginal(getSlave($AS))>> - <<if (getSlave($AS).devotion > 20)>> - $He accepts your orders without comment and presents $his virgin pussy for defloration<<if ($PC.dick == 0)>>, watching with some small trepidation as you don a strap-on<</if>>. You gently ease into $his pussy before gradually increasing the intensity of your thrusts into $him. Before long, $he's moaning loudly as you pound away. Since $he is already well broken, this new connection with $his <<= getWrittenTitle(getSlave($AS))>> <span class="devotion inc">increases $his devotion to you.</span> <span class="virginity loss">$His pussy has been broken in.</span> - <<set getSlave($AS).devotion += 10>> - <<elseif (getSlave($AS).devotion >= -20)>> - $He is clearly unhappy at losing $his pearl of great price to you; this probably isn't what $he imagined $his first real sex would be like.<<if ($PC.dick == 0)>>$His lower lip quivers with trepidation as $he watches you don a strap-on and maneuver to fuck $his virgin hole.<</if>> You gently ease into $his pussy before gradually increasing the intensity of your thrusts into $him. Before long, $he's moaning as you pound away. Nevertheless, this new connection with $his <<= getWrittenTitle(getSlave($AS))>> <span class="devotion inc">increases $his devotion to you.</span> <span class="virginity loss">$His pussy has been broken in,</span> and $he is <span class="trust dec">fearful</span> that sex will continue to be painful. - <<set getSlave($AS).devotion += 5>> - <<set getSlave($AS).trust -= 5>> - <<else>> - As you anticipated, $he refuses to give you $his virginity. And as you expected, $he is unable to resist you. $He cries as <<if ($PC.dick == 0)>>your strap-on<<else>>your cock<</if>> opens $his fresh, tight hole. You force your way into $his pussy and continue thrusting into $him. $He sobs and cries with horror as you pound away. The rape @@.devotion.dec;decreases $his devotion to you.@@ <span class="virginity loss">$His pussy has been broken in,</span> and $he <span class="trust dec">fears further abuse.</span> - <<set getSlave($AS).devotion -= 10, getSlave($AS).trust -= 15>> - <</if>> - <<set getSlave($AS).vagina++>> - <<= VCheck.Vaginal(getSlave($AS), 1)>> -<<elseif (getSlave($AS).anus == 0)>> - <<if (getSlave($AS).devotion > 20)>> - $He accepts your orders without comment and presents $his virgin anus for defloration. You<<if ($PC.dick == 0)>> don a strap-on and<</if>> gently sodomize $him. You gently ease yourself into $his butthole and gradually speed up your thrusts while $he slowly learns to move $his hips along with you. Since $he is already well broken, this new connection with $his <<= getWrittenTitle(getSlave($AS))>> <span class="devotion inc">increases $his devotion to you.</span> <span class="virginity loss">$His tight little ass has been broken in.</span> - <<set getSlave($AS).devotion += 4>> - <<elseif (getSlave($AS).devotion >= -20)>> - $He is clearly unhappy at the idea of taking a dick up $his butt. $He obeys orders anyway, and lies there wincing and moaning as you<<if ($PC.dick == 0)>> don a strap-on and<</if>> fuck $his ass. <span class="virginity loss">$His tight little ass has been broken in,</span> and $he <span class="trust dec">fears further anal pain.</span> - <<set getSlave($AS).trust -= 5>> - <<else>> - $He is appalled at the idea of taking it up the ass<<if ($PC.dick == 0)>> and cries with fear as you don a strap-on<</if>>. $He does anyway though, sobbing into the cushions<<if hasAnyArms(getSlave($AS))>> while you hold $his arm<<if hasBothArms(getSlave($AS))>>s<</if>> behind $him<</if>>. You force yourself into $his butthole. $He sobs and cries with disgust while you continue thrusting into $his ass. The painful anal rape @@.devotion.dec;decreases $his devotion to you.@@ <span class="virginity loss">$His tight little ass has been broken in,</span> and $he is <span class="trust dec">terrified of further anal pain.</span> - <<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 5>> - <</if>> - <<set getSlave($AS).anus++>> - <<= VCheck.Anal(getSlave($AS), 1)>> -<<elseif getSlave($AS).devotion < -20>> - <<if ($PC.dick == 0)>>You don a cruelly large strap-on, and you do it so $he can <<if canSee(getSlave($AS))>>see<<elseif canHear(getSlave($AS))>>hear<<else>>notice<</if>> it. <</if>>$He tries to refuse you, so you throw $him across the back of the couch next to your desk with $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>ass in the air. You finger $his anus<<if (getSlave($AS).vagina != -1)>> while fucking $his pussy<<elseif hasBothLegs(getSlave($AS))>> while frotting $his thighs<</if>> for a bit and then switch to $his now-ready anus. $He sobs as you penetrate $his rectum. - <<if (getSlave($AS).dick != 0) && canAchieveErection(getSlave($AS))>> - <<if getSlave($AS).prostate == 0>> - $He lacks a prostate, denying $him any real pleasure. $His dick stays flaccid as you rape $him. - <<elseif (getSlave($AS).chastityPenis == 1)>> - Despite $his unwillingness to be sodomized, the prostate stimulation starts to give $him an erection, which $his dick chastity makes horribly uncomfortable. $He bucks with the pain, $his asshole spasming delightfully. - <<else>> - Despite $his unwillingness to be sodomized, the prostate stimulation gives $him an erection. $He's mortified that $he would get hard while being anally raped. - <</if>> - <<elseif (getSlave($AS).chastityPenis == 1)>> - $His dick chastity keeps $his bitch cock hidden away while you use $his anus like a pussy. - <<elseif (getSlave($AS).dick !== 0)>> - $His flaccid dick is ground into the back of the couch as you rape $him. - <</if>> - <<= VCheck.Both(getSlave($AS), 1)>> -<<elseif getSlave($AS).devotion <= 50>> - You throw $him across the back of the couch next to your desk with $his ass in the air<<if ($PC.dick == 0)>>, and don a strap-on<</if>>. You finger $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>ass while <<if (getSlave($AS).vagina !== -1)>>fucking $his pussy<<else>>frotting $his thighs<</if>> for a bit and then switch to $his now-ready anus. <<if (getSlave($AS).anus == 1)>>$His ass is so tight that you have to work yourself in.<<elseif (getSlave($AS).anus == 2)>>Your <<if ($PC.dick == 0)>>fake dick<<else>>cock<</if>> slides easily up $his ass.<<else>>You slide into $his already-gaping asspussy with ease.<</if>> $He gasps as you penetrate $his rectum, but you timed the switch so that $he was on the verge of orgasm, and $he comes immediately. - <<if (getSlave($AS).dick !== 0) && canAchieveErection(getSlave($AS))>> - <<if getSlave($AS).chastityPenis>> - $He managed to stay soft within $his dick chastity, but $he dribbled a lot of precum onto the couch. You make $his lick it up, and $he obeys, shuddering with unsatisfied arousal. - <<else>> - $His cock spatters the couch with cum, and you make $his lick it up. - <</if>> - <<elseif (getSlave($AS).clit > 2)>> - $His clit is so large that it bobs slightly with each thrust. - <</if>> - <<= VCheck.Both(getSlave($AS), 1)>> -<<else>> - <<if hasAnyLegs(getSlave($AS))>>$He kneels on the floor<<else>>You lay $him on the floor<</if>> so you can take $him at will<<if ($PC.dick == 0)>>, and don a strap-on<</if>>. You finger $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>ass while - <<if canDoVaginal(getSlave($AS))>> - fucking $his pussy - <<else>> - frotting $his - <</if>> - for a bit and then switch to $his now-ready anus. - <<if (getSlave($AS).anus == 1)>> - $His ass is so tight that you have to work yourself in. - <<elseif (getSlave($AS).anus == 2)>> - Your cock slides easily up $his ass. - <<else>> - You slide into $his already-gaping asspussy with ease. - <</if>> - You fuck $him there for a while before repeatedly pulling out and stuffing yourself back in. $He moans each time you fill <<if canDoVaginal(getSlave($AS))>>a<<else>>$his<</if>> waiting hole. - <<if (getSlave($AS).dick != 0) && canAchieveErection(getSlave($AS))>> - <<if (getSlave($AS).chastityPenis == 1)>> - Whenever $he starts to get hard, $his dick chastity gives $him an awful twinge of pain. You do your best to be up $his butt when this happens so you can experience the resulting spasm. - <<else>> - Every time you penetrate, $his erect dick jerks up and slaps $his stomach. - <</if>> - <<elseif (getSlave($AS).dick !== 0)>> - <<if (getSlave($AS).chastityPenis == 1)>> - $His dick chastity keeps $his girly bitchclit hidden, just like it belongs. - <<else>> - Every time you penetrate, $his limp dick flops around lamely. - <</if>> - <<elseif (getSlave($AS).clit > 2)>> - $His clit is so large that it bobs slightly with each thrust. - <</if>> - <<= VCheck.Both(getSlave($AS), 1)>> -<</if>> - -<<if (getSlave($AS).bellyPreg >= 1500)>> - The poor $girl's pregnant belly makes taking a rough fuck in both $his holes uncomfortable for $him. -<<elseif (getSlave($AS).bellyImplant >= 1500)>> - The poor $girl's implant filled belly makes taking a rough fuck in both $his holes uncomfortable for $him. -<<elseif (getSlave($AS).bellyFluid >= 1500)>> - The poor $girl's sloshing belly makes taking a rough fuck in both $his holes uncomfortable for $him, though the lewd jiggling the pounding sends through it is quite a sight. -<</if>> - -<<if (getSlave($AS).anusTat == "scenes") && (getSlave($AS).anus == 1)>> - As you fucked $his butt, the decorative pattern around $his ass stretched open. When you pull out, $his momentary gape closes the pattern up quickly. -<<elseif (getSlave($AS).anusTat == "scenes")>> - As you fucked $his butt, the decorative pattern around $his ass stretched open. When you pull out, $his gape leaves the pattern distorted. -<<elseif (getSlave($AS).anusTat == "degradation")>> - As you fucked $his butt, the offensive language around $his ass stretched and distorted. -<</if>> - -<<if (random(1,100) > (100+getSlave($AS).devotion))>> - <<if (getSlave($AS).fetish !== "buttslut") && (getSlave($AS).energy <= 95) && (getSlave($AS).sexualFlaw !== "hates penetration")>> - Being brutally used has given $him a @@.flaw.gain;hatred of penetration.@@ - <<set getSlave($AS).sexualFlaw = "hates penetration">> - <</if>> -<<elseif (random(1,100) > (110-getSlave($AS).devotion))>> - <<if (getSlave($AS).fetish == "none") && (getSlave($AS).sexualFlaw !== "hates penetration")>> - Orgasming to your use of $his fuckhole @@.fetish.gain;has $him eager for more buttsex.@@ - <<set getSlave($AS).fetish = "buttslut", getSlave($AS).fetishKnown = 1>> - <</if>> -<</if>> - -<<if ($PC.dick != 0)>> - -<<if getSlave($AS).cervixImplant == 2 || getSlave($AS).cervixImplant == 3>> - <<set getSlave($AS).bellyImplant += random(10,20)>> -<</if>> - -<<if (getSlave($AS).anus > 3)>> - $His gaping hole drips your cum right out again. -<<elseif (getSlave($AS).anus > 2)>> - Cum drips out of $his loose hole. -<<elseif (getSlave($AS).anus == 2)>> - Cum drips out of $his loosened anus. -<<elseif (getSlave($AS).anus == 1)>> - $His still-tight ass keeps your load inside $him. -<</if>> - -<<if canMove(getSlave($AS)) && $postSexCleanUp > 0>> -<<switch getSlave($AS).assignment>> -<<case "whore">> - $He heads to the bathroom to clean $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes before returning to selling them publicly.<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole before returning to selling it publicly.<<else>>face before returning to selling $his mouth publicly.<</if>> -<<case "serve the public">> - $He heads to the bathroom to clean $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes before returning to offering it for free.<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole before returning to offering it for free.<<else>>face before returning to offering $his mouth for free.<</if>> -<<case "rest">> - $He stumbles to the bathroom to clean $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole<<else>>face<</if>> before crawling back into bed. -<<case "train slaves">> - $He heads to the bathroom to clean $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole<<else>>face<</if>> before $he returns to teaching $his classes. -<<case "get milked">> - $He hurries to the bathroom to clean $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole<<else>>face<</if>> <<if getSlave($AS).lactation > 0>>before going to get $his uncomfortably milk-filled tits drained<<else>>and then rests until $his balls are ready to be drained again<</if>>. -<<case "please you">> - $He hurries to the bathroom to clean $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole<<else>>face<</if>> before returning to await your next use of $his body, as though nothing had happened. -<<case "be a subordinate slave">> - $He moves to the bathroom to clean $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole<<else>>face<</if>>, though it's only a matter of time before another slave decides to play with $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>pussy or asshole<<elseif canDoVaginal(getSlave($AS))>>pussy<<elseif canDoAnal(getSlave($AS))>>asshole<<else>>face<</if>>. -<<case "be a servant">> - $He hurries to the bathroom to clean $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole<<else>>face<</if>>, since $his chores didn't perform themselves while you used $him. -<<case "be your Head Girl">> - $He hurries to the bathroom to clean $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole<<else>>face<</if>>, worried that $his charges got up to trouble while you had your cock in $him. -<<case "guard you">> - $He hurries off to wash $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole<<else>>face<</if>> so you'll be unguarded for as little time as possible. -<<case "work in the brothel">> - $He goes to wash $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole<<else>>face<</if>> so $his next customer can have the illusion that he's the first to use it today. -<<case "serve in the club">> - $He goes to wash and delicately perfume $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes so they<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole so it<<else>>face so it<</if>> can gratify the finest citizen. -<<case "work in the dairy">> - $He goes off to carefully wash $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole<<else>>face<</if>> to avoid besmirching the nice clean dairy. -<<case "work as a farmhand">> - $He goes off to wash $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole<<else>>face<</if>> to avoid tainting the food in $farmyardName. -<<case "work as a servant">> - $He rushes to wash $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole<<else>>face<</if>>, impatient to get back to $his undiminished chores. -<<case "work as a nanny">> - $He rushes to wash $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole<<else>>face<</if>>, before hurrying to continue taking care of the children in $nurseryName. -<</switch>> -<</if>> - -<</if>> diff --git a/src/npc/interaction/fCaress.js b/src/npc/interaction/fCaress.js new file mode 100644 index 0000000000000000000000000000000000000000..dda4abb1e66d05d06b4de20d382357e880203845 --- /dev/null +++ b/src/npc/interaction/fCaress.js @@ -0,0 +1,379 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fCaress = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself, hers, woman, girl + } = getPronouns(slave); + + const {title: Master, say: say} = getEnunciation(slave); + + const {womanP} = getPronouns(V.PC).appendSuffix("P"); + + r.push(`You tell ${slave.slaveName} to`); + if (!hasAnyLegs(slave)) { + r.push(`have another slave set ${him} down on your desk.`); + } else if (tooBigBreasts(slave)) { + r.push(`have another slave help ${him} heft ${his} tits so ${he} can be near you.`); + } else if (tooBigBelly(slave)) { + r.push(`have another slave help ${him} heft ${his} belly so ${he} can be near you.`); + } else if (tooBigButt(slave)) { + r.push(`have another slave help ${him} heft ${his} ass cheeks so ${he} can be near you.`); + } else if (tooBigDick(slave)) { + r.push(`have another slave help ${him} heft ${his} cock so ${he} can be near you.`); + } else if (tooBigBalls(slave)) { + r.push(`have another slave help ${him} heft ${his} balls so ${he} can be near you.`); + } else if (tooFatSlave(slave)) { + r.push(`have another slave help ${him} up so ${he} can be near you.`); + } else { + r.push(`move closer towards you.`); + } + + if (slave.fetish === "mindbroken" && slave.relationship !== -3) { + r.push(`${He} complies mechanically. ${He} remembers that when getWrittenTitle(slave)'s commands are not obeyed, there is punishment.`); + } else if (slave.relationship === -2) { + r.push(`${He} eagerly complies, happy to be near the object of ${his} longing. Once ${he}'s close, you hold ${his} face in your palms and gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he} loves overwhelming, and ${his} eyes flick downward after a moment.`); + } else { + r.push(`upon ${his} face. ${He} senses the intense look from the ${womanP} ${he} loves and finds it overwhelming, and after a moment glances away.`); + } + r.push(`${He} blushes furiously.`); + } else if (slave.relationship === -3) { + if (slave.fetish === "mindbroken") { + r.push(`${He} complies mechanically. ${He} remembers that when ${getWrittenTitle(slave)}'s commands are not obeyed, there is punishment. Once ${he}'s close, you hold ${his} face in your palms and look into ${his} blank ${App.Desc.eyesColor(slave)}. ${He} doesn't react.`); + } else if (slave.devotion+slave.trust >= 175) { + r.push(`${He} happily complies, eager to be close to the ${womanP} who married ${him}. Once ${he}'s close, you hold ${his} face in your palms and look into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s married to affirming, and looks down with a `); + if (canSee(slave)) { + r.push(`smile, running ${his} eyes over your`); + if (V.PC.boobs >= 300) { + r.push(`bosom.`); + } else { + r.push(`chest.`); + } + } else { + r.push(`smile.`); + } + } else if (slave.devotion < -20 && slave.trust > 20) { + r.push(`${He} complies. Once ${he}'s close, you hold ${his} face in your palms and look into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s forcibly married to disturbing, and`); + if (canSee(slave)) { + r.push(`breaks eye contact.`); + } else { + r.push(`turns ${his} face away.`); + } + } else if (slave.devotion < -20) { + r.push(`${He} complies out of fear. Once ${he}'s close, you hold ${his} shaking face in your palms and look into ${his} teary ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s forcibly married to terrifying, and`); + if (canSee(slave)) { + r.push(`breaks eye contact.`); + } else { + r.push(`turns ${his} face away.`); + } + } else { + r.push(`${He} complies obediently. Once ${he}'s close, you hold ${his} face in your palms and look into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s married to reassuring, and looks down with a slight`); + if (canSee(slave)) { + r.push(`smile, running ${his} eyes over your`); + if (V.PC.boobs >= 300) { + r.push(`bosom.`); + } else { + r.push(`chest.`); + } + } else { + r.push(`smile.`); + } + } + } else if (slave.devotion > 75) { + r.push(`${He} hurriedly complies, happy to be near you. Once ${he}'s close, you hold ${his} face in your palms and look into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from ${his} beloved ${getWrittenTitle(slave)} disconcerting, and ${his} eyes flick downward after a moment. ${He} blushes furiously.`); + } else if (slave.devotion > 50) { + r.push(`${He} hurriedly complies, happy to be near you. Once ${he}'s close, you hold ${his} face in your palms and look into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} disconcerting, and ${he} looks down after a moment, blushing.`); + } else if (slave.devotion > 20) { + r.push(`${He} hurriedly complies, happy to be near you. Once ${he}'s close, you hold ${his} face in your palms and look into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and ${he} looks down after a moment, blushing nervously.`); + } else if (slave.devotion >= -20 && slave.trust >= -20) { + r.push(`${He} visibly considers disobedience, but decides that complying with such an apparently harmless order is safe, for now. Once ${he}'s close, you hold ${his} face in your palms and look into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and ${he} looks down after a moment, ${his} lower lip trembling with nervousness.`); + } else if (slave.trust < -20) { + r.push(`The command terrifies ${him}, but ${he}'s more frightened still of the consequences of disobedience, and ${he} complies. Once ${he}'s close, you hold ${his} face in your palms and look into ${his} ${App.Desc.eyesColor(slave)}. ${He} looks down fearfully, and begins to shake with terror, tears leaking silently down ${his} cheeks.`); + } else { + r.push(`${He} pauses, obviously considering whether to resist, but eventually decides to save ${his} strength to fight more onerous orders, and gives in. Once ${he}'s close, you hold ${his} face in your palms and look into ${his} ${App.Desc.eyesColor(slave)}. ${He} stares back, but after a few moments ${he} loses the contest of wills and looks down.`); + } + + r.push(`You delicately lift ${his} head and touch your fingertips to ${his} chin, tenderly brushing along the line of ${his} mouth with your`); + if (V.PC.title === 1) { + r.push(`manly`); + } else { + r.push(`feminine`); + } + r.push(`thumb.`); + if (slave.lipsTat !== 0) { + r.push(`Your fingers trace ${his} facial tattoos, slowly picking out the patterns against ${his} ${slave.skin} skin.`); + } + if (slave.lipsPiercing+slave.tonguePiercing > 2) { + r.push(`You touch each of ${his} facial piercings, one by one, feeling the hard metal contrast with ${his} pliant flesh.`); + } + r.push(`Then, you gently tilt ${his}`); + if (slave.face > 95) { + r.push(`overwhelmingly stunning`); + } else if (slave.face > 10) { + r.push(`alluring`); + } else if (slave.face >= -10) { + r.push(`appealing`); + } else if (slave.face >= -40) { + r.push(`plain`); + } else { + r.push(`rough`); + } + r.push(`head back and lightly touch ${his}`); + if (slave.lips > 95) { + r.push(`facepussy`); + } else { + if (slave.lips > 70) { + r.push(`pillowlike`); + } else if (slave.lips > 40) { + r.push(`generous`); + } else if (slave.lips > 20) { + r.push(`plush`); + } + r.push(`lips`); + } + r.push(`with your fingertips. You use your fingers and thumbs to slowly slide along ${his} mouth, ${his} chin, ${his} cheeks then around ${his} face. You use a deft touch to thoroughly explore the shape of ${his}`); + if (slave.face > 95) { + r.push(`gorgeous`); + } else if (slave.face > 10) { + r.push(`nice`); + } else if (slave.face >= -10) { + r.push(`cute`); + } else if (slave.face >= -40) { + r.push(`fair`); + } else { + r.push(`prominent`); + } + r.push(`cheekbones. Grazing ${his} temple and brushing ${his} forehead simultaneously, you smoothly motion along ${his} eyelids and nose, and tenderly stroke ${his} face with both hands as you take ${his} head lightly and trace around it, gently massaging as you go. You work your way down, slowly and gradually, along ${his} neck with one hand, then the other, briefly pausing before continuing your path down to ${his} shoulders and`); + if (slave.fetish !== "mindbroken") { + r.push(`${he} starts to gasp as`); + } else { + r.push(`starts to shudder as`); + } + r.push(`you slide your hands down ${his} side, across ${his} back and along ${his} belly taking every moment to savor the contours of ${his} body before going back up again to ${his} face.`); + + if (slave.fetish === "mindbroken") { + r.push(`${His} posture doesn't change. ${He} initially only reacts slightly to your physical touch but then stops reacting completely. When you stop, ${his} ${App.Desc.eyesColor(slave)} track the movements of your hands briefly but then stare blankly ahead of ${him}, awaiting further use of ${his} body.`); + } else if (slave.relationship === -2) { + r.push(`${His} eyes gradually close and ${he} slowly leans ${his} head back, relaxing as ${he} feels your caress. ${He} gently gasps as ${he} feels your warm`); + if (V.PC.title === 1) { + r.push(`manly`); + } else { + r.push(`feminine`); + } + r.push(`hand. When you finally stop gently caressing ${him}, ${his} eyes remain closed and ${his} mouth still in a rapturous shape for a moment before ${he} slowly opens ${his} eyes and smiles at you, ${he} has an eager look on ${his} face.`); + if (hasAnyArms(slave)) { + r.push(`A hand reaches dumbly up to ${his} face mimicking your last movements.`); + } + r.push(``); + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate love with ${his} ${App.Desc.eyesColor(slave)}, since ${he} does not speak ${V.language} well enough to express ${himself}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate love with ${his} ${App.Desc.eyesColor(slave)}.`); + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves you.`); + } else { + r.push( + Spoken(slave, `"I love you, ${Master},"`), + `${he} ${say}s dreamily.` + ); + } + r.push(`${He} looks as though ${he} wants much more than your mere caress.`); + } else if (slave.devotion > 50 && slave.fetish === "dom" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`As you start to touch ${his}`); + if (slave.face > 95) { + r.push(`gorgeous`); + } else if (slave.face > 10) { + r.push(`lovely`); + } else if (slave.face >= -10) { + r.push(`pretty`); + } else if (slave.face >= -40) { + r.push(`homely`); + } else { + r.push(`ugly`); + } + r.push(`face, ${he} smiles at you and takes your hand in ${hers}, following its movements. ${He} tries hard to stop ${himself} from losing ${himself} in your masterful hands. ${He} takes ${his} tendency towards sexual dominance right up to the edge of insubordination, when ${he} starts to caress your face in turn. When you finally stop, ${his} eyes are closed and ${he}'s smiling.`); + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate excitement with ${his} ${App.Desc.eyesColor(slave)}, since ${he} does not speak ${V.language} well enough to express ${himself}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate excitement with ${his} ${App.Desc.eyesColor(slave)}.`); + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} liked that.`); + } else { + r.push( + Spoken(slave, `"That was fun, ${Master},"`), + `${he} ${say}s cheerfully.` + ); + } + r.push(`${He} looks at you, ${his} eyes almost begging you to give ${him} more than your mere caress.`); + } else if (slave.devotion > 50 && slave.fetish === "cumslut" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`${He} stiffens at your touch but slowly relaxes to your fingers on ${his} face. As you move your fingers along ${his} lips, ${he} reacts almost as though ${he}'s receiving oral. ${He} starts to gently suck your fingers, moaning into your hand and pressing ${himself} lewdly against your`); + if (V.PC.boobs >= 1400) { + r.push(`giant tits.`); + } else if (V.PC.boobs >= 1200) { + r.push(`huge breasts.`); + } else if (V.PC.boobs >= 1000) { + r.push(`big breasts.`); + } else if (V.PC.boobs >= 800) { + r.push(`prominent breasts.`); + } else if (V.PC.boobs >= 650) { + r.push(`unremarkable breasts.`); + } else if (V.PC.boobs >= 500) { + r.push(`breasts.`); + } else if (V.PC.boobs >= 300) { + r.push(`tiny breasts.`); + } else if (V.PC.title > 0) { + r.push(`manly chest.`); + } else { + r.push(`non-existent breasts.`); + } + if (slave.teeth === "pointy") { + r.push(`${He}'s very careful to avoid spearing your finger with ${his} sharp teeth.`); + } else if (slave.teeth === "fangs") { + r.push(`${He} holds perfectly still so you may trace ${his} fangs without getting poked.`); + } else if (slave.teeth === "fang") { + r.push(`You give ${his} lone fang a little extra attention as you work.`); + } + r.push(`${He} achieves a weak orgasm before you stop caressing ${him}.`); + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate undiminished lust with ${his} ${App.Desc.eyesColor(slave)}, since ${he} does not speak ${V.language} well enough to express ${himself}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate undiminished lust with ${his} ${App.Desc.eyesColor(slave)}.`); + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} liked that.`); + } else { + r.push( + Spoken(slave, `"That was fun, ${Master},"`), + `${he} ${say}s lustfully.` + ); + } + r.push(`${He} looks at you as if ${he} wants more than your hands touching ${him}.`); + } else if (slave.devotion > 50) { + r.push(`${He} accepts your touch with devotion, leaning ${his} head back at your gentle caress along ${his} face. ${He} leans ${his} body forward, pressing ${himself} against you, and you feel the intense heat from ${his} body against your`); + if (V.PC.boobs >= 1400) { + r.push(`expansive`); + if (V.PC.boobsImplant/V.PC.boobs >= .60) { + r.push(`firm`); + } else { + r.push(`soft`); + } + r.push(`chest.`); + } else if (V.PC.boobs >= 1200) { + r.push(`huge`); + if (V.PC.boobsImplant/V.PC.boobs >= .60) { + r.push(`firm`); + } else { + r.push(`soft`); + } + r.push(`breasts.`); + } else if (V.PC.boobs >= 1000) { + r.push(`big`); + if (V.PC.boobsImplant/V.PC.boobs >= .60) { + r.push(`firm`); + } else { + r.push(`soft`); + } + r.push(`breasts.`); + } else if (V.PC.boobs >= 800) { + r.push(`soft breasts.`); + } else if (V.PC.boobs >= 500) { + r.push(`breasts.`); + } else if (V.PC.boobs >= 300) { + r.push(`small chest.`); + } else if (V.PC.title > 0) { + r.push(`manly chest.`); + } else { + r.push(`flat chest.`); + } + r.push(`${He} gradually closes ${his} eyes and when you finally stop,`); + if (hasAnyArms(slave)) { + r.push(`${he} runs ${his} hand delightfully across ${his} face where you last touched ${him},`); + } else { + r.push(`there is`); + } + r.push(`a euphoric look on ${his} ${slave.skin} face.`); + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate devotion with ${his} ${App.Desc.eyesColor(slave)}, since ${he}'s not confident in ${his} ability to express it in ${V.language}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate devotion with ${his} ${App.Desc.eyesColor(slave)}.`); + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves you.`); + } else { + r.push( + Spoken(slave, `"I love you, ${Master},"`), + `${he} ${say}s jubilantly.` + ); + } + r.push(`${He} looks at you longingly, almost as if ${he}'s bursting to say that ${he} wants more than your mere caress.`); + } else if (slave.devotion > 20) { + r.push(`${He} accepts your touch willingly. As you are so close to ${him}, you sense considerable turmoil in the`); + if (slave.physicalAge > 30) { + r.push(`${woman};`); + } else { + r.push(`${girl};`); + } + r.push(`${he}'s doing ${his} duty as a slave by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of ${his} mind by your touch across ${his} face. When you finally move your hand away, ${his} ${App.Desc.eyesColor(slave)} gaze into yours searchingly, looking for answers that are not there.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His} eyes beg for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs hesitantly, asking if that's it.`); + } else { + r.push( + `${He} asks hesitantly,`, + Spoken(slave, `"I-is that it, ${Master}?"`) + ); + } + } else if (slave.devotion >= -20 && slave.trust < -20) { + r.push(`${He} shakes at your touch fearfully. As you move your hand along ${his} unresisting face, ${his} eagerness to avoid punishment leads ${him} to stiffen, ${his} nervousness is made apparent. You continue stroking ${his} cheek, enjoying ${his} fear, and the physical intimacy slowly does its work. ${He} starts to relax, ${his} resistance easing and ${his} eyes start to close. When finally move your hand away, ${he} looks at you for a long moment, ${his} eyes darting up at you, before visibly catching ${himself} with a reminder that ${he}'s a slave and you're ${his} owner.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His} eyes beg for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs hesitantly, asking if that's it.`); + } else { + r.push( + `${He} asks hesitantly,`, + Spoken(slave, `"I-is that it, ${Master}?"`) + ); + } + } else if (slave.trust < -50) { + r.push(`${He} is nearly frozen with fear, and does not resist as you start to caress ${his} face. In fact, ${he} barely reacts at all. ${He} stares at you as you move your fingers across ${his} stiff face, but it's like touching a statue. ${He} is so filled with terror that ${he} remains stiff even as it becomes clear to ${him} you're not going to hurt ${him}. When you bore of touching the`); + if (slave.physicalAge > 30) { + r.push(`${woman}`); + } else { + r.push(`${girl}`); + } + r.push(`and move your hand away, ${he} stares at you in utter incomprehension.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His} eyes beg for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs spastically, begging fearfully to know if that's it.`); + } else { + r.push( + `${He} asks nervously,`, + Spoken(slave, `"I-is that it, ${Master}?"`) + ); + } + r.push(`Then ${he} cringes.`); + } else { + r.push(`${He} reflexively turns away from you, but you catch ${his} head with one hand and slowly but gently move your other hand along ${his} face. Spluttering, ${he} leans backwards, but you tip forward with ${him} and pin ${him} against your desk, not stopping your gentle touch on ${his} head. ${He} tries to wriggle out of your grasp desperately, but ${his} struggles slowly subside as ${he} realizes that you're not taking this any farther. When you bore of it and move your hand away, ${he} stares at you in utter incomprehension.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His} eyes demand an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs irritably, asking whether that's it.`); + } else { + r.push( + `${He} splutters,`, + Spoken(slave, `"Is that it, ${Master}!?"`) + ); + } + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fCaress.tw b/src/npc/interaction/fCaress.tw deleted file mode 100644 index 27da29bfb74a6da7868aa27a36acab58dc51bbdd..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fCaress.tw +++ /dev/null @@ -1,141 +0,0 @@ -:: FCaress [nobr no-history] - -<<setPlayerPronouns>> -<<run App.Utils.setLocalPronouns(getSlave($AS))>> - -You tell <<= getSlave($AS).slaveName>> to -<<if !hasAnyLegs(getSlave($AS))>> - have another slave set $him down on your desk. -<<elseif tooBigBreasts(getSlave($AS))>> - have another slave help $him heft $his tits so $he can be near you. -<<elseif tooBigBelly(getSlave($AS))>> - have another slave help $him heft $his belly so $he can be near you. -<<elseif tooBigButt(getSlave($AS))>> - have another slave help $him heft $his ass cheeks so $he can be near you. -<<elseif tooBigDick(getSlave($AS))>> - have another slave help $him heft $his cock so $he can be near you. -<<elseif tooBigBalls(getSlave($AS))>> - have another slave help $him heft $his balls so $he can be near you. -<<elseif tooFatSlave(getSlave($AS))>> - have another slave help $him up so $he can be near you. -<<else>> - move closer towards you. -<</if>> - -<<if (getSlave($AS).fetish == "mindbroken") && (getSlave($AS).relationship != -3)>> - $He complies mechanically. $He remembers that when <<= getWrittenTitle(getSlave($AS))>>'s commands are not obeyed, there is punishment. -<<elseif (getSlave($AS).relationship == -2)>> - $He eagerly complies, happy to be near the object of $his longing. Once $he's close, you hold $his face in your palms and gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he loves overwhelming, and $his eyes flick downward after a moment. - <<else>> - upon $his face. $He senses the intense look from the _womanP $he loves and finds it overwhelming, and after a moment glances away. - <</if>> - $He blushes furiously. -<<elseif (getSlave($AS).relationship == -3)>> - <<if getSlave($AS).fetish == "mindbroken">> - $He complies mechanically. $He remembers that when <<= getWrittenTitle(getSlave($AS))>>'s commands are not obeyed, there is punishment. Once $he's close, you hold $his face in your palms and look into $his blank <<= App.Desc.eyesColor(getSlave($AS))>>. $He doesn't react. - <<elseif getSlave($AS).devotion+getSlave($AS).trust >= 175>> - $He happily complies, eager to be close to the _womanP who married $him. Once $he's close, you hold $his face in your palms and look into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's married to affirming, and looks down with a smile<<if canSee(getSlave($AS))>>, running $his eyes over your <<if $PC.boobs >= 300>>bosom<<else>>chest<</if>><</if>>. - <<elseif getSlave($AS).devotion < -20 && getSlave($AS).trust > 20>> - $He complies. Once $he's close, you hold $his face in your palms and look into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's forcibly married to disturbing, and <<if canSee(getSlave($AS))>> breaks eye contact<<else>> turns $his face away<</if>>. - <<elseif getSlave($AS).devotion < -20>> - $He complies out of fear. Once $he's close, you hold $his shaking face in your palms and look into $his teary <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's forcibly married to terrifying, and <<if canSee(getSlave($AS))>> breaks eye contact<<else>> turns $his face away<</if>>. - <<else>> - $He complies obediently. Once $he's close, you hold $his face in your palms and look into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's married to reassuring, and looks down with a slight smile<<if canSee(getSlave($AS))>>, running $his eyes over your <<if $PC.boobs >= 300>>bosom<<else>>chest<</if>><</if>>. - <</if>> -<<elseif (getSlave($AS).devotion > 75)>> - $He hurriedly complies, happy to be near you. Once $he's close, you hold $his face in your palms and look into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from $his beloved <<= getWrittenTitle(getSlave($AS))>> disconcerting, and $his eyes flick downward after a moment. $He blushes furiously. -<<elseif (getSlave($AS).devotion > 50)>> - $He hurriedly complies, happy to be near you. Once $he's close, you hold $his face in your palms and look into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> disconcerting, and $he looks down after a moment, blushing. -<<elseif (getSlave($AS).devotion > 20)>> - $He hurriedly complies, happy to be near you. Once $he's close, you hold $his face in your palms and look into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and $he looks down after a moment, blushing nervously. -<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).trust >= -20)>> - $He visibly considers disobedience, but decides that complying with such an apparently harmless order is safe, for now. Once $he's close, you hold $his face in your palms and look into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and $he looks down after a moment, $his lower lip trembling with nervousness. -<<elseif (getSlave($AS).trust < -20)>> - The command terrifies $him, but $he's more frightened still of the consequences of disobedience, and $he complies. Once $he's close, you hold $his face in your palms and look into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He looks down fearfully, and begins to shake with terror, tears leaking silently down $his cheeks. -<<else>> - $He pauses, obviously considering whether to resist, but eventually decides to save $his strength to fight more onerous orders, and gives in. Once $he's close, you hold $his face in your palms and look into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He stares back, but after a few moments $he loses the contest of wills and looks down. -<</if>> - -You delicately lift $his head and touch your fingertips to $his chin, tenderly brushing along the line of $his mouth with your <<if $PC.title == 1>>manly<<else>>feminine<</if>> thumb. -<<if (getSlave($AS).lipsTat != 0)>> - Your fingers trace $his facial tattoos, slowly picking out the patterns against $his <<= getSlave($AS).skin>> skin. -<</if>> -<<if (getSlave($AS).lipsPiercing+getSlave($AS).tonguePiercing > 2)>> - You touch each of $his facial piercings, one by one, feeling the hard metal contrast with $his pliant flesh. -<</if>> -Then, you gently tilt $his <<if getSlave($AS).face > 95>>overwhelmingly stunning<<elseif getSlave($AS).face > 10>>alluring<<elseif getSlave($AS).face >= -10>>appealing<<elseif getSlave($AS).face >= -40>>plain<<else>>rough<</if>> head back and lightly touch $his -<<if getSlave($AS).lips > 95>>facepussy -<<else>> - <<if getSlave($AS).lips > 70>>pillowlike - <<elseif getSlave($AS).lips > 40>>generous - <<elseif getSlave($AS).lips > 20>>plush - <</if>> - lips -<</if>> with your fingertips. You use your fingers and thumbs to slowly slide along $his mouth, $his chin, $his cheeks then around $his face. You use a deft touch to thoroughly explore the shape of $his <<if getSlave($AS).face > 95>>gorgeous<<elseif getSlave($AS).face > 10>>nice<<elseif getSlave($AS).face >= -10>>cute<<elseif getSlave($AS).face >= -40>>fair<<else>>prominent<</if>> cheekbones. Grazing $his temple and brushing $his forehead simultaneously, you smoothly motion along $his eyelids and nose, and tenderly stroke $his face with both hands as you take $his head lightly and trace around it, gently massaging as you go. You work your way down, slowly and gradually, along $his neck with one hand, then the other, briefly pausing before continuing your path down to $his shoulders and<<if (getSlave($AS).fetish != "mindbroken")>> $he starts to gasp as<<else>> starts to shudder as<</if>> you slide your hands down $his side, across $his back and along $his belly taking every moment to savor the contours of $his body before going back up again to $his face. - -<<if (getSlave($AS).fetish == "mindbroken")>> - $His posture doesn't change. $He initially only reacts slightly to your physical touch but then stops reacting completely. When you stop, $his <<= App.Desc.eyesColor(getSlave($AS))>> track the movements of your hands briefly but then stare blankly ahead of $him, awaiting further use of $his body. -<<elseif (getSlave($AS).relationship == -2)>> - $His eyes gradually close and $he slowly leans $his head back, relaxing as $he feels your caress. $He gently gasps as $he feels your warm <<if $PC.title == 1>>manly<<else>>feminine<</if>> hand. When you finally stop gently caressing $him, $his eyes remain closed and $his mouth still in a rapturous shape for a moment before $he slowly opens $his eyes and smiles at you, $he has an eager look on $his face.<<if (hasAnyArms(getSlave($AS)))>> A hand reaches dumbly up to $his face mimicking your last movements.<</if>> <<if (getSlave($AS).accent >= 3)>>$He does $his best to communicate love with $his <<= App.Desc.eyesColor(getSlave($AS))>>, since $he does not speak $language well enough to express $himself.<<elseif (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>>$He does $his best to communicate love with $his <<= App.Desc.eyesColor(getSlave($AS))>>.<<elseif !canTalk(getSlave($AS))>>$He signs that $he loves you.<<else>>"I love you, <<Master>>," $he <<say>>s dreamily.<</if>> $He looks as though $he wants much more than your mere caress. -<<elseif (getSlave($AS).devotion > 50) && (getSlave($AS).fetish == "dom") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>> - As you start to touch $his <<if getSlave($AS).face > 95>>gorgeous<<elseif getSlave($AS).face > 10>>lovely<<elseif getSlave($AS).face >= -10>>pretty<<elseif getSlave($AS).face >= -40>>homely<<else>>ugly<</if>> face, $he smiles at you and takes your hand in $hers, following its movements. $He tries hard to stop $himself from losing $himself in your masterful hands. $He takes $his tendency towards sexual dominance right up to the edge of insubordination, when $he starts to caress your face in turn. When you finally stop, $his eyes are closed and $he's smiling. <<if (getSlave($AS).accent >= 3)>>$He does $his best to communicate excitement with $his <<= App.Desc.eyesColor(getSlave($AS))>>, since $he does not speak $language well enough to express $himself.<<elseif (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>>$He does $his best to communicate excitement with $his <<= App.Desc.eyesColor(getSlave($AS))>>.<<elseif !canTalk(getSlave($AS))>>$He signs that $he liked that.<<else>>"That wa<<s>> fun, <<Master>>," $he <<say>>s cheerfully.<</if>> $He looks at you, $his eyes almost begging you to give $him more than your mere caress. -<<elseif (getSlave($AS).devotion > 50) && (getSlave($AS).fetish == "cumslut") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>> - $He stiffens at your touch but slowly relaxes to your fingers on $his face. As you move your fingers along $his lips, $he reacts almost as though $he's receiving oral. $He starts to gently suck your fingers, moaning into your hand and pressing $himself lewdly against your - <<if $PC.boobs >= 1400>> - giant tits. - <<elseif $PC.boobs >= 1200>> - huge breasts. - <<elseif $PC.boobs >= 1000>> - big breasts. - <<elseif $PC.boobs >= 800>> - prominent breasts. - <<elseif $PC.boobs >= 650>> - unremarkable breasts. - <<elseif $PC.boobs >= 500>> - breasts. - <<elseif $PC.boobs >= 300>> - tiny breasts. - <<elseif $PC.title > 0>> - manly chest. - <<else>> - non-existent breasts. - <</if>> - <<if (getSlave($AS).teeth == "pointy")>> - $He's very careful to avoid spearing your finger with $his sharp teeth. - <<elseif (getSlave($AS).teeth == "fangs")>> - $He holds perfectly still so you may trace $his fangs without getting poked. - <<elseif (getSlave($AS).teeth == "fang")>> - You give $his lone fang a little extra attention as you work. - <</if>> - $He achieves a weak orgasm before you stop caressing $him. <<if (getSlave($AS).accent >= 3)>>$He does $his best to communicate undiminished lust with $his <<= App.Desc.eyesColor(getSlave($AS))>>, since $he does not speak $language well enough to express $himself.<<elseif (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>>$He does $his best to communicate undiminished lust with $his <<= App.Desc.eyesColor(getSlave($AS))>>.<<elseif !canTalk(getSlave($AS))>>$He signs that $he liked that.<<else>>"That wa<<s>> fun, <<Master>>," $he <<say>>s lustfully.<</if>> $He looks at you as if $he wants more than your hands touching $him. -<<elseif (getSlave($AS).devotion > 50)>> - $He accepts your touch with devotion, leaning $his head back at your gentle caress along $his face. $He leans $his body forward, pressing $himself against you, and you feel the intense heat from $his body against your - <<if $PC.boobs >= 1400>> - expansive <<if $PC.boobsImplant/$PC.boobs >= .60>>firm<<else>>soft<</if>> chest. - <<elseif $PC.boobs >= 1200>> - huge <<if $PC.boobsImplant/$PC.boobs >= .60>>firm<<else>>soft<</if>> breasts. - <<elseif $PC.boobs >= 1000>> - big <<if $PC.boobsImplant/$PC.boobs >= .60>>firm<<else>>soft<</if>> breasts. - <<elseif $PC.boobs >= 800>> - soft breasts. - <<elseif $PC.boobs >= 500>> - breasts. - <<elseif $PC.boobs >= 300>> - small chest. - <<elseif $PC.title > 0>> - manly chest. - <<else>> - flat chest. - <</if>> - $He gradually closes $his eyes and when you finally stop, <<if (hasAnyArms(getSlave($AS)))>>$he runs $his hand delightfully across $his face where you last touched $him,<<else>>there is<</if>> a euphoric look on $his <<= getSlave($AS).skin>> face. <<if (getSlave($AS).accent >= 3)>>$He does $his best to communicate devotion with $his <<= App.Desc.eyesColor(getSlave($AS))>>, since $he's not confident in $his ability to express it in $language.<<elseif (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>>$He does $his best to communicate devotion with $his <<= App.Desc.eyesColor(getSlave($AS))>>.<<elseif !canTalk(getSlave($AS))>>$He signs that $he loves you.<<else>>"I love you, <<Master>>," $he <<say>>s jubilantly.<</if>> $He looks at you longingly, almost as if $he's bursting to say that $he wants more than your mere caress. -<<elseif (getSlave($AS).devotion > 20)>> - $He accepts your touch willingly. As you are so close to $him, you sense considerable turmoil in the <<if (getSlave($AS).physicalAge > 30)>>$woman<<else>>$girl<</if>>; $he's doing $his duty as a slave by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of $his mind by your touch across $his face. When you finally move your hand away, $his <<= App.Desc.eyesColor(getSlave($AS))>> gaze into yours searchingly, looking for answers that are not there. <<if ((!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS))))>>$His eyes beg for an answer: is that it?<<elseif !canTalk(getSlave($AS))>>$He signs hesitantly, asking if that's it.<<else>>$He asks hesitantly, "I-i<<s>> that it, <<Master>>?"<</if>> -<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).trust < -20)>> - $He shakes at your touch fearfully. As you move your hand along $his unresisting face, $his eagerness to avoid punishment leads $him to stiffen, $his nervousness is made apparent. You continue stroking $his cheek, enjoying $his fear, and the physical intimacy slowly does its work. $He starts to relax, $his resistance easing and $his eyes start to close. When finally move your hand away, $he looks at you for a long moment, $his eyes darting up at you, before visibly catching $himself with a reminder that $he's a slave and you're $his owner. <<if ((!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS))))>>$His eyes beg for an answer: is that it?<<elseif !canTalk(getSlave($AS))>>$He signs hesitantly, asking if that's it.<<else>>$He asks hesitantly, "I-i<<s>> that it, <<Master>>?"<</if>> -<<elseif (getSlave($AS).trust < -50)>> - $He is nearly frozen with fear, and does not resist as you start to caress $his face. In fact, $he barely reacts at all. $He stares at you as you move your fingers across $his stiff face, but it's like touching a statue. $He is so filled with terror that $he remains stiff even as it becomes clear to $him you're not going to hurt $him. When you bore of touching the <<if (getSlave($AS).physicalAge > 30)>>$woman<<else>>$girl<</if>> and move your hand away, $he stares at you in utter incomprehension. <<if ((!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS))))>>$His eyes beg for an answer: is that it?<<elseif !canTalk(getSlave($AS))>>$He signs spastically, begging fearfully to know if that's it.<<else>>$He asks nervously, "I-i<<s>> that it, <<Master>>?"<</if>> Then $he cringes. -<<else>> - $He reflexively turns away from you, but you catch $his head with one hand and slowly but gently move your other hand along $his face. Spluttering, $he leans backwards, but you tip forward with $him and pin $him against your desk, not stopping your gentle touch on $his head. $He tries to wriggle out of your grasp desperately, but $his struggles slowly subside as $he realizes that you're not taking this any farther. When you bore of it and move your hand away, $he stares at you in utter incomprehension. <<if ((!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS))))>>$His eyes demand an answer: is that it?<<elseif !canTalk(getSlave($AS))>>$He signs irritably, asking whether that's it.<<else>>$He splutters, "I<<s>> that it, <<Master>>!?"<</if>> -<</if>> diff --git a/src/npc/interaction/fDance.js b/src/npc/interaction/fDance.js index 1c2d60f969112e95f728837574cc71c793adedeb..9fa5693990ef457de39bd39c5e1109e88ab81c67 100644 --- a/src/npc/interaction/fDance.js +++ b/src/npc/interaction/fDance.js @@ -349,9 +349,7 @@ App.Interact.fDance = function(slave) { r.push(`${He} dances, but makes sure that the disgust on ${his} face shows clearly that ${he} is not into it.`); } } - r.push(`The atmosphere of your office is a testament to masculine opulence. Few ${womenP} in the old world would have the pleasure of completing their work while an attractive ${woman} flaunts ${himself} for ${hisP} pleasure. - You allow the situation to continue for about an hour, before deciding it's time to escalate. - You look up once more at your slave and take some time to review ${his} dancing performance.`); + r.push(`The atmosphere of your office is a testament to masculine opulence. Few ${womenP} in the old world would have the pleasure of completing their work while an attractive ${woman} flaunts ${himself} for ${hisP} pleasure. You allow the situation to continue for about an hour, before deciding it's time to escalate. You look up once more at your slave and take some time to review ${his} dancing performance.`); if (slave.devotion >= -20) { if (slave.skill.entertainment >= 100) { r.push(`Your slave has a level of skill previously unseen in the old world. Even ${his} blinks have the seductive pull of a goddess. As you watch ${him} perform, you think how no${womanP} of the old world would ever get to see pure sexuality like this. And not only do you get to watch ${him}, you OWN ${him}. ${His} body moves like water, with hips that ebb and flow as if the tides themselves panged for a rock hard cock to come and take them. You try to get some work done, but can't take your eyes off ${him} for even a second. You promise to reward your slave for bringing so much sensuality and beauty into your office; transforming your place of work into a shrine of Masculine dominance.`); diff --git a/src/npc/interaction/fDick.js b/src/npc/interaction/fDick.js new file mode 100644 index 0000000000000000000000000000000000000000..987b2df37034a70f320bf55a7de03c0bc3dca9ac --- /dev/null +++ b/src/npc/interaction/fDick.js @@ -0,0 +1,460 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fDick = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself + } = getPronouns(slave); + + /* TODO: .pregMood and more amp variants */ + + addPartner(slave, -1); + + const _belly = bellyAdjective(slave); + const _amount = cumAmount(slave); + let _load; + if (_amount <= 30) { + _load = "a few timid spurts"; + } else if (_amount <= 60) { + _load = "an average load"; + } else if (_amount <= 80) { + _load = "a large load"; + } else if (_amount <= 100) { + _load = "a massive spurt of seed"; + } else if (_amount <= 140) { + _load = "a huge spurt of seed"; + } else if (_amount <= 160) { + _load = "a giant and drawn out gush"; + } else if (_amount <= 180) { + _load = "an enormous and belly swelling load"; + } else if (_amount <= 200) { + _load = "a monstrous, drawn out and belly swelling load"; + } else { + _load = "an overly massive and unending gush of seed"; + } + + let _nutte; + if (slave.balls === 1) { + _nutte = "vestigial"; + } else if (slave.balls === 2) { + _nutte = "small"; + } else if (slave.balls === 3) { + _nutte = "average"; + } else if (slave.balls === 4) { + _nutte = "large"; + } else if (slave.balls === 5) { + _nutte = "massive"; + } else if (slave.balls === 6) { + _nutte = "huge"; + } else if (slave.balls === 7) { + _nutte = "giant"; + } else if (slave.balls === 8) { + _nutte = "enormous"; + } else if (slave.balls === 9) { + _nutte = "monstrous"; + } else { + _nutte = "overly massive"; + } + + + /* CHECK*/ + + /* NON-AMPUTEE*/ + if (!isAmputee(slave)) { + r.push(`You direct ${slave.slaveName} to lie down and ready ${himself} as you step over to ${him} and align your`); + if (V.PC.vagina !== -1) { + r.push(`vagina`); + } else { + r.push(`ass`); + } + r.push(`with ${his}`); + if (slave.vaginaPiercing > 1 && slave.dick !== 0) { + r.push(`pierced cock-head.`); + } else if (slave.vaginaPiercing === 1 && slave.dick !== 0) { + r.push(`pierced cock.`); + } else { + r.push(`cock.`); + } + + if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { + if (slave.devotion > 20) { + r.push(`${He} thought ${he} would be fucking another slave, not ${his} ${getWrittenTitle(slave)}, so to say ${he}'s pleasantly surprised would be an understatement.`); + } else if (slave.devotion >= -20) { + r.push(`${He} thought ${he} would fucking another slave, not ${his} ${getWrittenTitle(slave)} ${he} has mixed feelings about this, but ${his} body can't wait to plunge your depths.`); + } else { + if (slave.trust < -20) { + r.push(`${He} was already horrified at the thought of being ordered to lie down and let another slave rape ${his} dick, but when ${he} realized it would be you instead, that horror turned to a mix of confusion and sheer terror.`); + } else { + r.push(`${His} dick springs to life at the prospect of plunging into your depths; this may be ${his} chance to one up you for a change.`); + } + } + } + + r.push(`You slowly lower yourself onto ${his}`); + if (slave.dick === 1) { + r.push(`tiny`); + } else if (slave.dick === 2) { + r.push(`cute`); + } else if (slave.dick === 3) { + r.push(`average`); + } else if (slave.dick === 4) { + r.push(`big`); + } else if (slave.dick === 5) { + r.push(`impressive`); + } else if (slave.dick === 6) { + r.push(`huge`); + } else if (slave.dick === 7) { + r.push(`gigantic`); + } else if (slave.dick === 8) { + r.push(`titanic`); + } else if (slave.dick === 9) { + r.push(`absurd`); + } else if (slave.dick === 10) { + r.push(`inhuman`); + } else { + r.push(`hypertrophied`); + } + r.push(`dick, savoring every`); + if (V.showInches === 2) { + r.push(`inch,`); + } else { + r.push(`centimeter,`); + } + if (slave.dick <= 6) { + r.push(`until you find yourself hilted and sitting on ${his} pelvis.`); + } else { + r.push(`until you feel that you can't take any more of ${him} inside you.`); + } + + r.push(`Making eye contact${!canSee(slave) ? `(inasmuch as you can)` : ``}, you reach`); + if (V.PC.belly < 5000 && slave.belly < 5000) { + r.push(`back`); + } else { + r.push(`down`); + } + if (slave.scrotum > 0) { + r.push(`and stroke ${his} ${_nutte} balls,`); + } else if (slave.vagina > -1) { + r.push(`and tease ${his} neglected pussy,`); + } else { + r.push(`and stroke ${his} soft perineum,`); + } + r.push(`making it abundantly clear that you want ${his} cum.`); + + if (slave.fetish === "mindbroken") { + r.push(`Like a doll, ${he} dumbly remains still, completely indifferent that ${he}'s deep in ${his} ${getWrittenTitle(slave)}'s`); + + if (V.PC.vagina !== -1) { + r.push(`pussy.`); + } else { + r.push(`butt.`); + } + r.push(`You start moving up and on ${his} shaft, continuing until you climax and lift yourself off of ${him}. A strand of cum slips from your`); + if (V.PC.vagina !== -1) { + r.push(`slit;`); + } else { + r.push(`anus;`); + } + + + r.push(`it seems ${slave.slaveName} came too.`); + r.push(`Since ${he} is mindbroken, ${his} responses to you are purely physiological and your actions have no affect on ${him} mentally. You leave your toy for one of your other slaves to clean and maintain.`); + } else if (slave.devotion > 50) { + if (slave.trust < -20) { + r.push(`Having followed your instructions as quickly as ${he} could in fear of your wrath, ${he} tries ${his} best to please you while you bounce`); + if (V.PC.belly >= 5000) { + r.push(`your gravid bulk`); + } + r.push(`on ${his} obedient cock. ${He} timidly warns you that ${he} is about to cum; in response you speed up your pace and clamp down hard on ${his} throbbing shaft. ${He} squeaks lewdly, overwhelmed by your orgasmic`); + if (V.PC.vagina !== -1) { + r.push(`cunt`); + } else { + r.push(`rectal`); + } + r.push(`spasms, and unloads${_load} inside of you before apologizing submissively.`); + } else if (slave.trust <= 20) { + r.push(`Having followed your instructions quickly and obediently, ${he} tries ${his} best to please you while you bounce`); + if (V.PC.belly >= 5000) { + r.push(`your gravid bulk`); + } + r.push(`on ${his} eager cock. ${He} grabs your hips and warns you ${he} is about to cum; in response you speed up your pace, encouraging ${him} to impale you on ${his} throbbing shaft. ${He} squeals lewdly, overwhelmed by your orgasmic`); + if (V.PC.vagina !== -1) { + r.push(`cunt`); + } else { + r.push(`rectal`); + } + r.push(`spasms, and unloads${_load} into you before helping you up.`); + } else { + r.push(`Having followed your instructions with gusto, ${he} energetically pounds you while you bounce`); + if (V.PC.belly >= 5000) { + r.push(`your gravid bulk`); + } + r.push(`on ${his} eager cock. ${He} grabs your hips and desperately warns you ${he} can't hold out any longer; in response you speed up your pace, tipping ${him} over the edge and forcing ${him} to impale you on ${his} twitching shaft. ${He} moans loudly, overwhelmed by your orgasmic`); + if (V.PC.vagina !== -1) { + r.push(`cunt`); + } else { + r.push(`rectal`); + } + r.push(`spasms, and unloads${_load} into you before pulling you into a post coitus embrace.`); + } + } else if (slave.devotion >= -20) { + if (slave.trust < -20) { + r.push(`Having hesitatingly followed your instructions, ${he} lies as still as ${he} can beneath you while you bounce`); + if (V.PC.belly >= 5000) { + r.push(`your gravid bulk`); + } + r.push(`on ${his} terrified cock. While ${he} is too afraid to enjoy pleasuring you, ${he} obediently thrusts into you. ${He} timidly warns you that ${he} is about to cum; in response you speed up your pace and clamp down hard on ${his} throbbing shaft. ${He} cries out in surprise, overwhelmed by your orgasmic`); + if (V.PC.vagina !== -1) { + r.push(`cunt`); + } else { + r.push(`rectal`); + } + r.push(`spasms, and blows${_load} in you like a good little slave.`); + } else if (slave.trust <= 20) { + r.push(`Having obediently followed your instructions, ${he} lies as still as ${he} can beneath you while you bounce`); + if (V.PC.belly >= 5000) { + r.push(`your gravid bulk`); + } + r.push(`on ${his} willing cock. While ${he} is too uncertain of ${his} position in the hierarchy to really enjoy ${himself}, ${he} hesitatingly thrusts into you. When ${he} feels ${he} is nearing ${his} limit, ${he} gives you proper warning that ${he} is about to cum; in response you speed up your pace and clamp down hard on ${his} throbbing shaft. ${He} cries out in surprise, overwhelmed by your orgasmic`); + if (V.PC.vagina !== -1) { + r.push(`cunt`); + } else { + r.push(`rectal`); + } + r.push(`spasms and boldness, and blows${_load} in you during the confusion.`); + } else { + r.push(`Having obediently followed your instructions, ${he} energetically pounds you while you bounce`); + if (V.PC.belly >= 5000) { + r.push(`your gravid bulk`); + } + r.push(`on ${his} eager cock. ${He} grabs your hips and pounds you a little too eagerly, not even slowing down as you begin to feel ${him} tense with orgasm. Without so much as a warning to you, ${he} trembles with orgasm, pumping ${his} load deep into your`); + if (V.PC.vagina !== -1) { + r.push(`cunt`); + } else { + r.push(`rectum`); + } + r.push(`and setting off your own. You glare daggers at ${him} as ${he} profusely apologizes for ${his} lack of restraint.`); + } + } else { + if (slave.trust < -20) { + r.push(`Having followed your instructions as quickly as ${he} could, ${he} lies as still as ${he} can beneath you while you bounce`); + if (V.PC.belly >= 5000) { + r.push(`your gravid bulk`); + } + r.push(`on ${his} reluctant cock. While ${he} is too afraid to be an active participant in pleasuring you, you make do with what ${he}'s giving. ${He} timidly warns you that ${he} is about to cum; in response you speed up your pace and clamp down hard on ${his} throbbing shaft. ${He} cries out lewdly, overwhelmed by your orgasmic`); + if (V.PC.vagina !== -1) { + r.push(`cunt`); + } else { + r.push(`rectal`); + } + r.push(`spasms, and unloads${_load} inside of you despite ${his} fear.`); + } else if (slave.trust <= 20) { + r.push(`Having followed your instructions as quickly as ${he} could, ${he} lies as still as ${he} can beneath you while you bounce`); + if (V.PC.belly >= 5000) { + r.push(`your gravid bulk`); + } + r.push(`on ${his} reluctant cock. While ${he} is too hateful to be an active participant in pleasuring you, you make do with what ${he}'s got. ${He} cries out lewdly, overwhelmed by your orgasmic`); + if (V.PC.vagina !== -1) { + r.push(`cunt`); + } else { + r.push(`rectal`); + } + r.push(`spasms, and unloads${_load} deep inside you without warning. ${He} <span class="orangered">smirks a little</span> as you glare daggers at ${him}.`); + slave.trust++; + } else if (overpowerCheck(slave, V.PC) < random(1, 100)) { + r.push(`Without warning, ${he} flips you onto your side and, still hilted,`); + if (slave.belly >= 300000) { + r.push(`repositions you onto your hands and knees while using ${his}${_belly} belly to pin you under ${him}.`); + } else if (V.PC.belly >= 5000) { + r.push(`rolls you into missionary while pinning your arms and legs.`); + } else if (V.PC.boobs >= 1000) { + r.push(`pushes your face down into your`); + if (V.PC.boobsImplant > 0) { + r.push(`fake`); + } + r.push(`cleavage while pinning your arms and legs.`); + } else { + r.push(`rolls you into missionary while pinning your arms and forcing you into a mating press.`); + } + r.push(`Such audacity takes you entirely by surprise and gives ${him} the edge ${he} needs to pull it off. ${He} vigorously pistons in and out of you with little regard for you${(V.PC.pregKnown === 1) ? `or your pregnancy` : ``}, fucking you senseless until ${he} has had enough and cums deep inside your`); + if (V.PC.vagina !== -1) { + r.push(`pussy.`); + } else { + r.push(`ass.`); + } + if (canImpreg(V.PC, slave) && slave.fetish === "pregnancy") { + if (hasAnyArms(slave)) { + r.push(`Running a hand across`); + } else { + r.push(`Grinding against`); + } + r.push(`your firm belly, ${he} decides ${his} job is not yet done and begins reaming you once more, dead set on taking this opportunity to <span class="orangered">show you your place by knocking you up with ${his} child.</span> ${He} manages to empty ${his} balls in your womb several more times before exhaustion kicks in, forcing ${him} to leave you twitching and drooling cum.`); + r.push(knockMeUp(V.PC, 100, 0, slave.ID)); + seX(V.PC, "vaginal", slave, "penetrative", 5); + } else { + r.push(`Contently sighing, ${he} pulls ${his} still very hard cock from your overwhelmed body and forces it into your mouth, ready to blow a second load and give you a <span class="orangered">taste of your place,</span> before leaving you twitching and drooling cum.`); + seX(V.PC, "oral", slave, "penetrative"); + } + slave.trust += 5; + } else { + r.push(`You feel ${him} shift dominantly beneath you and in response`); + if (slave.scrotum > 0) { + r.push(`clamp down on ${his} balls`); + } else { + r.push(`twist ${his} dick at an odd angle`); + } + r.push(`until ${he} behaves. ${He} groans with a mix of disgust and pleasure while you bounce`); + if (V.PC.belly >= 5000) { + r.push(`your gravid bulk`); + } + r.push(`on ${his} traitorous cock. ${He} might not want to bend to your will, but you have ${his} body wrapped around your little finger, even though it still leaves you doing all the work. ${He} cries out lewdly, overwhelmed by your orgasmic`); + if (V.PC.vagina !== -1) { + r.push(`cunt`); + } else { + r.push(`rectal`); + } + r.push(`spasms, and unloads deep inside you without warning. ${He} <span class="orangered">smirks a little</span> as you glare daggers at ${him}.`); + slave.trust++; + } + } + /* AMPUTEE*/ + } else { + r.push(`You step over to pick up ${slave.slaveName}, lie ${him} down and get ${him} ready. Then you align your`); + if (V.PC.vagina !== -1) { + r.push(`vagina`); + } else { + r.push(`ass`); + } + r.push(`with`); + if (slave.vaginaPiercing > 1 && slave.dick !== 0) { + r.push(`${his} pierced cock-head.`); + } else if (slave.vaginaPiercing === 1 && slave.dick !== 0) { + r.push(`${his} pierced cock`); + } else { + r.push(`${his} cock`); + } + r.push(`and lower yourself onto ${his}`); + + if (slave.dick === 1) { + r.push(`tiny dick`); + } else if (slave.dick === 2) { + r.push(`cute dick`); + } else if (slave.dick === 3) { + r.push(`dick`); + } else if (slave.dick === 4) { + r.push(`big dick`); + } else if (slave.dick === 5) { + r.push(`impressive dick`); + } else if (slave.dick === 6) { + r.push(`huge dick`); + } else if (slave.dick === 7) { + r.push(`gigantic dick`); + } else if (slave.dick === 8) { + r.push(`titanic dick`); + } else if (slave.dick === 9) { + r.push(`absurd dick`); + } else if (slave.dick === 10) { + r.push(`inhuman dick`); + } else { + r.push(`hypertrophied dick`); + } + if (slave.dick <= 6) { + r.push(`until you are sitting on ${his} loins.`); + } else { + r.push(`until you feel that you can't take any more of ${him} inside you.`); + } + + r.push(`You reach back`); + + if (slave.scrotum > 0) { + r.push(`and stroke ${his}${_nutte} balls.`); + } else if (slave.vagina > -1) { + r.push(`and tease ${his} neglected pussy.`); + } else { + r.push(`and stroke ${his} soft perineum.`); + } + if (slave.fetish === "mindbroken") { + r.push(`Like a broken doll, ${he} dumbly remains still, watching you without interest.`); + r.push(`You start moving up and on ${his} shaft, until you climax and notice that so did ${slave.slaveName}.`); + r.push(`Since ${he} is mindbroken, ${his} responses to you are purely physiological and your actions have no affect on ${him} mentally. You leave your toy for one of your other slaves to clean and maintain.`); + } else { + r.push(`You ride your helpless slave until you both climax.`); + } + } + + if (canMove(slave) && slave.fetish !== "mindbroken" && V.postSexCleanUp > 0) { + switch (slave.assignment) { + case "whore": + r.push(`${He} heads to the bathroom to clean ${his} dick before returning to selling ${his} body publicly.`); + break; + case "serve the public": + r.push(`${He} heads to the bathroom to clean ${his} dick before returning to allowing the public to use ${his} body.`); + break; + case "rest": + r.push(`${He} heads to the bathroom to clean ${his} dick before crawling back into bed.`); + break; + case "get milked": + r.push(`${He} hurries to the bathroom to clean ${his} dick`); + if (slave.lactation > 0) { + r.push(`before going to get ${his} uncomfortably milk-filled tits drained.`); + } else { + r.push(`and then rests until ${his} balls are ready to be drained again.`); + } + break; + case "please you": + r.push(`${He} hurries to the bathroom to clean ${his} dick before returning to await your next use of ${his} body, as though nothing had happened.`); + break; + case "be a subordinate slave": + r.push(`${He} moves to the bathroom to clean ${his} dick, though it's only a matter of time before another slave decides to take their turn with ${his} cock.`); + break; + case "be a servant": + r.push(`${He} hurries to the bathroom to clean ${his} dick, since ${his} chores didn't perform themselves while you used ${him}.`); + break; + case "be your Head Girl": + r.push(`${He} hurries to the bathroom to clean ${his} dick, worried that ${his} charges got up to trouble while you were using ${him}.`); + break; + case "guard you": + r.push(`${He} hurries off to wash ${his} dick so you'll be unguarded for as little time as possible.`); + break; + case "work in the brothel": + r.push(`${He} goes to wash ${his} dick so ${his} next customer has no idea what ${he}'s been up to.`); + break; + case "serve in the club": + r.push(`${He} goes to wash ${his} dick to make it appear unused.`); + break; + case "work in the dairy": + r.push(`${He} goes off to carefully wash ${his} dick to avoid besmirching the nice clean dairy.`); + break; + case "work as a farmhand": + r.push(`${He} goes off to wash ${his} dick to avoid tainting the food in ${V.farmyardName}.`); + break; + case "work as a servant": + r.push(`${He} rushes to wash ${his} dick, impatient to get back to ${his} undiminished chores.`); + break; + case "work as a nanny": + r.push(`${He} hurries off to wash off ${his} dick before heading back to the ${V.nurseryName}.`); + } + } + + if (canImpreg(V.PC, slave)) { + if (slave.diet === "cum production") { + const _pregChance = (slave.balls * 5 * 1.2); + r.push(knockMeUp(V.PC, _pregChance, 0, slave.ID)); + } else { + const _pregChance = (slave.balls * 5); + r.push(knockMeUp(V.PC, _pregChance, 0, slave.ID)); + } + } + if (V.policies.sexualOpenness === 0) { + r.push(`Rumors spread that you <span class="red">enjoy taking it from slaves.</span>`); + V.PC.degeneracy += 2; + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fDick.tw b/src/npc/interaction/fDick.tw deleted file mode 100644 index a7e11705f9a09e0d25d5020477d568e45e3e80c2..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fDick.tw +++ /dev/null @@ -1,288 +0,0 @@ -:: FDick [nobr no-history] -/* TODO: .pregMood and more amp variants */ - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> - - -<<set _belly = bellyAdjective(getSlave($AS))>> -<<set _amount = cumAmount(getSlave($AS))>> -<<if _amount <= 30>> - <<set _load = "a few timid spurts">> -<<elseif _amount <= 60>> - <<set _load = "an average load">> -<<elseif _amount <= 80>> - <<set _load = "a large load">> -<<elseif _amount <= 100>> - <<set _load = "a massive spurt of seed">> -<<elseif _amount <= 140>> - <<set _load = "a huge spurt of seed">> -<<elseif _amount <= 160>> - <<set _load = "a giant and drawn out gush">> -<<elseif _amount <= 180>> - <<set _load = "an enormous and belly swelling load">> -<<elseif _amount <= 200>> - <<set _load = "a monstrous, drawn out and belly swelling load">> -<<else>> - <<set _load = "an overly massive and unending gush of seed">> -<</if>> - - - -<<if getSlave($AS).balls == 1>> - <<set _nutte = "vestigial">> -<<elseif getSlave($AS).balls == 2>> - <<set _nutte = "small">> -<<elseif getSlave($AS).balls == 3>> - <<set _nutte = "average">> -<<elseif getSlave($AS).balls == 4>> - <<set _nutte = "large">> -<<elseif getSlave($AS).balls == 5>> - <<set _nutte = "massive">> -<<elseif getSlave($AS).balls == 6>> - <<set _nutte = "huge">> -<<elseif getSlave($AS).balls == 7>> - <<set _nutte = "giant">> -<<elseif getSlave($AS).balls == 8>> - <<set _nutte = "enormous">> -<<elseif getSlave($AS).balls == 9>> - <<set _nutte = "monstrous">> -<<else>> - <<set _nutte = "overly massive">> -<</if>> - - -/*CHECK*/ - -/*NON-AMPUTEE*/ -<<if !isAmputee(getSlave($AS))>> - You direct <<= getSlave($AS).slaveName>> to lie down and ready $himself as you step over to $him and align your <<if $PC.vagina != -1>>vagina<<else>>ass<</if>> with $his - <<if (getSlave($AS).vaginaPiercing > 1) && (getSlave($AS).dick != 0)>> - pierced cock-head. - <<elseif (getSlave($AS).vaginaPiercing == 1) && (getSlave($AS).dick != 0)>> - pierced cock. - <<else>> - cock. - <</if>> - - <<if getSlave($AS).fetish != "mindbroken" && getSlave($AS).fuckdoll == 0>> - <<if getSlave($AS).devotion > 20>> - $He thought $he would be fucking another slave, not $his <<= getWrittenTitle(getSlave($AS))>>, so to say $he's pleasantly surprised would be an understatement. - <<elseif getSlave($AS).devotion >= -20>> - $He thought $he would fucking another slave, not $his <<= getWrittenTitle(getSlave($AS))>>; $he has mixed feelings about this, but $his body can't wait to plunge your depths. - <<else>> - <<if getSlave($AS).trust < -20>> - $He was already horrified at the thought of being ordered to lie down and let another slave rape $his dick, but when $he realized it would be you instead, that horror turned to a mix of confusion and sheer terror. - <<else>> - $His dick springs to life at the prospect of plunging into your depths; this may be $his chance to one up you for a change. - <</if>> - <</if>> - <</if>> - - You slowly lower yourself onto $his - <<if getSlave($AS).dick == 1>> - tiny - <<elseif getSlave($AS).dick == 2>> - cute - <<elseif getSlave($AS).dick == 3>> - average - <<elseif getSlave($AS).dick == 4>> - big - <<elseif getSlave($AS).dick == 5>> - impressive - <<elseif getSlave($AS).dick == 6>> - huge - <<elseif getSlave($AS).dick == 7>> - gigantic - <<elseif getSlave($AS).dick == 8>> - titanic - <<elseif getSlave($AS).dick == 9>> - absurd - <<elseif getSlave($AS).dick == 10>> - inhuman - <<else>> - hypertrophied - <</if>> - dick, savoring every <<if $showInches == 2>>inch<<else>>centimeter<</if>>, - <<if getSlave($AS).dick <= 6>> - until you find yourself hilted and sitting on $his pelvis. - <<else>> - until you feel that you can't take any more of $him inside you. - <</if>> - - Making eye contact<<if !canSee(getSlave($AS))>> (inasmuch as you can)<</if>>, you reach <<if $PC.belly < 5000 && getSlave($AS).belly < 5000>>back<<else>>down<</if>> - <<if getSlave($AS).scrotum > 0>> - and stroke $his _nutte balls, - <<elseif getSlave($AS).vagina > -1>> - and tease $his neglected pussy, - <<else>> - and stroke $his soft perineum, - <</if>> - making it abundantly clear that you want $his cum. - - <<if (getSlave($AS).fetish == "mindbroken")>> - Like a doll, $he dumbly remains still, completely indifferent that $he's deep in $his <<= getWrittenTitle(getSlave($AS))>>'s <<if $PC.vagina != -1>>pussy<<else>>butt<</if>>. - You start moving up and on $his shaft, continuing until you climax and lift yourself off of $him. A strand of cum slips from your <<if $PC.vagina != -1>>slit<<else>>anus<</if>>; it seems <<= getSlave($AS).slaveName>> came too. - Since $he is mindbroken, $his responses to you are purely physiological and your actions have no affect on $him mentally. You leave your toy for one of your other slaves to clean and maintain. - <<elseif getSlave($AS).devotion > 50>> - <<if getSlave($AS).trust < -20>> - Having followed your instructions as quickly as $he could in fear of your wrath, $he tries $his best to please you while you bounce<<if $PC.belly >= 5000>> your gravid bulk<</if>> on $his obedient cock. $He timidly warns you that $he is about to cum; in response you speed up your pace and clamp down hard on $his throbbing shaft. $He squeaks lewdly, overwhelmed by your orgasmic <<if $PC.vagina != -1>>cunt<<else>>rectal<</if>> spasms, and unloads _load inside of you before apologizing submissively. - <<elseif getSlave($AS).trust <= 20>> - Having followed your instructions quickly and obediently, $he tries $his best to please you while you bounce<<if $PC.belly >= 5000>> your gravid bulk<</if>> on $his eager cock. $He grabs your hips and warns you $he is about to cum; in response you speed up your pace, encouraging $him to impale you on $his throbbing shaft. $He squeals lewdly, overwhelmed by your orgasmic <<if $PC.vagina != -1>>cunt<<else>>rectal<</if>> spasms, and unloads _load into you before helping you up. - <<else>> - Having followed your instructions with gusto, $he energetically pounds you while you bounce<<if $PC.belly >= 5000>> your gravid bulk<</if>> on $his eager cock. $He grabs your hips and desperately warns you $he can't hold out any longer; in response you speed up your pace, tipping $him over the edge and forcing $him to impale you on $his twitching shaft. $He moans loudly, overwhelmed by your orgasmic <<if $PC.vagina != -1>>cunt<<else>>rectal<</if>> spasms, and unloads _load into you before pulling you into a post coitus embrace. - <</if>> - <<elseif getSlave($AS).devotion >= -20>> - <<if getSlave($AS).trust < -20>> - Having hesitatingly followed your instructions, $he lies as still as $he can beneath you while you bounce<<if $PC.belly >= 5000>> your gravid bulk<</if>> on $his terrified cock. While $he is too afraid to enjoy pleasuring you, $he obediently thrusts into you. $He timidly warns you that $he is about to cum; in response you speed up your pace and clamp down hard on $his throbbing shaft. $He cries out in surprise, overwhelmed by your orgasmic <<if $PC.vagina != -1>>cunt<<else>>rectal<</if>> spasms, and blows _load in you like a good little slave. - <<elseif getSlave($AS).trust <= 20>> - Having obediently followed your instructions, $he lies as still as $he can beneath you while you bounce<<if $PC.belly >= 5000>> your gravid bulk<</if>> on $his willing cock. While $he is too uncertain of $his position in the hierarchy to really enjoy $himself, $he hesitatingly thrusts into you. When $he feels $he is nearing $his limit, $he gives you proper warning that $he is about to cum; in response you speed up your pace and clamp down hard on $his throbbing shaft. $He cries out in surprise, overwhelmed by your orgasmic <<if $PC.vagina != -1>>cunt<<else>>rectal<</if>> spasms and boldness, and blows _load in you during the confusion. - <<else>> - Having obediently followed your instructions, $he energetically pounds you while you bounce<<if $PC.belly >= 5000>> your gravid bulk<</if>> on $his eager cock. $He grabs your hips and pounds you a little too eagerly, not even slowing down as you begin to feel $him tense with orgasm. Without so much as a warning to you, $he trembles with orgasm, pumping $his load deep into your <<if $PC.vagina != -1>>cunt<<else>>rectum<</if>> and setting off your own. You glare daggers at $him as $he profusely apologizes for $his lack of restraint. - <</if>> - <<else>> - <<if getSlave($AS).trust < -20>> - Having followed your instructions as quickly as $he could, $he lies as still as $he can beneath you while you bounce<<if $PC.belly >= 5000>> your gravid bulk<</if>> on $his reluctant cock. While $he is too afraid to be an active participant in pleasuring you, you make do with what $he's giving. $He timidly warns you that $he is about to cum; in response you speed up your pace and clamp down hard on $his throbbing shaft. $He cries out lewdly, overwhelmed by your orgasmic <<if $PC.vagina != -1>>cunt<<else>>rectal<</if>> spasms, and unloads _load inside of you despite $his fear. - <<elseif getSlave($AS).trust <= 20>> - Having followed your instructions as quickly as $he could, $he lies as still as $he can beneath you while you bounce<<if $PC.belly >= 5000>> your gravid bulk<</if>> on $his reluctant cock. While $he is too hateful to be an active participant in pleasuring you, you make do with what $he's got. $He cries out lewdly, overwhelmed by your orgasmic <<if $PC.vagina != -1>>cunt<<else>>rectal<</if>> spasms, and unloads _load deep inside you without warning. $He @@.orangered;smirks a little@@ as you glare daggers at $him. - <<set getSlave($AS).trust++>> - <<elseif overpowerCheck(getSlave($AS), $PC) < random(1,100)>> - Without warning, $he flips you onto your side and, still hilted, - <<if getSlave($AS).belly >= 300000>> - repositions you onto your hands and knees while using $his _belly belly to pin you under $him. - <<elseif $PC.belly >= 5000>> - rolls you into missionary while pinning your arms and legs. - <<elseif $PC.boobs >= 1000>> - pushes your face down into your <<if $PC.boobsImplant > 0>>fake <</if>>cleavage while pinning your arms and legs. - <<else>> - rolls you into missionary while pinning your arms and forcing you into a mating press. - <</if>> - Such audacity takes you entirely by surprise and gives $him the edge $he needs to pull it off. $He vigorously pistons in and out of you with little regard for you<<if $PC.pregKnown == 1>> or your pregnancy<</if>>, fucking you senseless until $he has had enough and cums deep inside your <<if $PC.vagina != -1>>pussy<<else>>ass<</if>>. - <<if canImpreg($PC, getSlave($AS)) && getSlave($AS).fetish == "pregnancy">> - <<if hasAnyArms(getSlave($AS))>>Running a hand across<<else>>Grinding against<</if>> your firm belly, $he decides $his job is not yet done and begins reaming you once more, dead set on taking this opportunity to @@.orangered;show you your place by knocking you up with $his child.@@ $He manages to empty $his balls in your womb several more times before exhaustion kicks in, forcing $him to leave you twitching and drooling cum. - <<= knockMeUp($PC, 100, 0, $AS)>> - <<set getSlave($AS).counter.penetrative += 5, $penetrativeTotal += 5>> - <<else>> - Contently sighing, $he pulls $his still very hard cock from your overwhelmed body and forces it into your mouth, ready to blow a second load and give you a @@.orangered;taste of your place,@@ before leaving you twitching and drooling cum. - <<set getSlave($AS).counter.penetrative++, $penetrativeTotal++>> - <</if>> - <<set getSlave($AS).trust += 5>> - <<else>> - You feel $him shift dominantly beneath you and in response - <<if getSlave($AS).scrotum > 0>> - clamp down on $his balls - <<else>> - twist $his dick at an odd angle - <</if>> - until $he behaves. $He groans with a mix of disgust and pleasure while you bounce<<if $PC.belly >= 5000>> your gravid bulk<</if>> on $his traitorous cock. $He might not want to bend to your will, but you have $his body wrapped around your little finger, even though it still leaves you doing all the work. $He cries out lewdly, overwhelmed by your orgasmic <<if $PC.vagina != -1>>cunt<<else>>rectal<</if>> spasms, and unloads deep inside you without warning. $He @@.orangered;smirks a little@@ as you glare daggers at $him. - <<set getSlave($AS).trust++>> - <</if>> - <</if>> -/*AMPUTEE*/ -<<else>> - You step over to pick up <<= getSlave($AS).slaveName>>, lie $him down and get $him ready. Then you align your <<if $PC.vagina != -1>> vagina <<else>> ass <</if>> with - <<if (getSlave($AS).vaginaPiercing > 1) && (getSlave($AS).dick != 0)>> - $his pierced cock-head. - <<elseif (getSlave($AS).vaginaPiercing == 1) && (getSlave($AS).dick != 0)>> - $his pierced cock - <<else>> - $his cock - <</if>> - and lower yourself onto $his - - <<if getSlave($AS).dick == 1>> - tiny dick - <<elseif getSlave($AS).dick == 2>> - cute dick - <<elseif getSlave($AS).dick == 3>> - dick - <<elseif getSlave($AS).dick == 4>> - big dick - <<elseif getSlave($AS).dick == 5>> - impressive dick - <<elseif getSlave($AS).dick == 6>> - huge dick - <<elseif getSlave($AS).dick == 7>> - gigantic dick - <<elseif getSlave($AS).dick == 8>> - titanic dick - <<elseif getSlave($AS).dick == 9>> - absurd dick - <<elseif getSlave($AS).dick == 10>> - inhuman dick - <<else>> - hypertrophied dick - <</if>> - <<if getSlave($AS).dick <= 6>> - until you are sitting on $his loins. - <<else>> - until you feel that you can't take any more of $him inside you. - <</if>> - - You reach back - - <<if getSlave($AS).scrotum > 0>> - and stroke $his _nutte balls. - <<elseif getSlave($AS).vagina > -1>> - and tease $his neglected pussy. - <<else>> - and stroke $his soft perineum. - <</if>> - <<if (getSlave($AS).fetish == "mindbroken")>> - Like a broken doll, $he dumbly remains still, watching you without interest. - You start moving up and on $his shaft, until you climax and notice that so did <<= getSlave($AS).slaveName>>. - Since $he is mindbroken, $his responses to you are purely physiological and your actions have no affect on $him mentally. You leave your toy for one of your other slaves to clean and maintain. - <<else>> - You ride your helpless slave until you both climax. - <</if>> -<</if>> - -<<if canMove(getSlave($AS)) && getSlave($AS).fetish != "mindbroken" && $postSexCleanUp > 0>> - <<switch getSlave($AS).assignment>> - <<case "whore">> - $He heads to the bathroom to clean $his dick before returning to selling $his body publicly. - <<case "serve the public">> - $He heads to the bathroom to clean $his dick before returning to allowing the public to use $his body. - <<case "rest">> - $He heads to the bathroom to clean $his dick before crawling back into bed. - <<case "get milked">> - $He hurries to the bathroom to clean $his dick <<if getSlave($AS).lactation > 0>>before going to get $his uncomfortably milk-filled tits drained<<else>>and then rests until $his balls are ready to be drained again<</if>>. - <<case "please you">> - $He hurries to the bathroom to clean $his dick before returning to await your next use of $his body, as though nothing had happened. - <<case "be a subordinate slave">> - $He moves to the bathroom to clean $his dick, though it's only a matter of time before another slave decides to take their turn with $his cock. - <<case "be a servant">> - $He hurries to the bathroom to clean $his dick, since $his chores didn't perform themselves while you used $him. - <<case "be your Head Girl">> - $He hurries to the bathroom to clean $his dick, worried that $his charges got up to trouble while you were using $him. - <<case "guard you">> - $He hurries off to wash $his dick so you'll be unguarded for as little time as possible. - <<case "work in the brothel">> - $He goes to wash $his dick so $his next customer has no idea what $he's been up to. - <<case "serve in the club">> - $He goes to wash $his dick to make it appear unused. - <<case "work in the dairy">> - $He goes off to carefully wash $his dick to avoid besmirching the nice clean dairy. - <<case "work as farmhand">> - $He goes off to wash $his dick to avoid tainting the food in $farmyardName. - <<case "work as a servant">> - $He rushes to wash $his dick, impatient to get back to $his undiminished chores. - <<case "work as a nanny">> - $He hurries off to wash off $his dick before heading back to the $nurseryName. - <</switch>> -<</if>> - -<<set getSlave($AS).counter.penetrative++, $penetrativeTotal++>> -<<if canImpreg($PC, getSlave($AS))>> - <<if getSlave($AS).diet == "cum production">> - <<set _pregChance = (getSlave($AS).balls * 5 * 1.2)>> - <<= knockMeUp($PC, _pregChance, 0, $AS)>> - <<else>> - <<set _pregChance = (getSlave($AS).balls * 5)>> - <<= knockMeUp($PC, _pregChance, 0, $AS)>> - <</if>> -<</if>> -<<if $policies.sexualOpenness == 0>> - Rumors spread that you @@.red;enjoy taking it from slaves.@@ - <<set $PC.degeneracy += 2>> -<</if>> diff --git a/src/npc/interaction/fEmbrace.js b/src/npc/interaction/fEmbrace.js new file mode 100644 index 0000000000000000000000000000000000000000..b6c80d961b39d2b54cf8cf1e0b4f2178dbc9e9f9 --- /dev/null +++ b/src/npc/interaction/fEmbrace.js @@ -0,0 +1,321 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fEmbrace = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself, wife, hers, woman, girl + } = getPronouns(slave); + + const {title: Master, say: say} = getEnunciation(slave); + + const {womanP} = getPronouns(V.PC).appendSuffix("P"); + + slave.partners.add(-1); + + r.push(`You tell ${slave.slaveName} to`); + if (hasAnyLegs(slave)) { + r.push(`stand in front of you.`); + } else { + r.push(`have another slave set ${him} down on your desk.`); + } + + if (slave.fetish === "mindbroken" && slave.relationship !== -3) { + r.push(`${He} complies automatically. ${He} remembers that when ${getWrittenTitle(slave)}'s commands are not obeyed, there is punishment.`); + } else if (slave.relationship === -2) { + r.push(`${He} excitedly complies, happy to be near the object of ${his} longing. Once ${he}'s close, you take ${his} completely relaxed head in your hands and gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he} loves overwhelming, and ${his} eyes flick downward after a moment.`); + } else { + r.push(`upon ${his} face. ${He} senses the intense look from the ${womanP} ${he} loves and finds it overwhelming, and after a moment glances away.`); + } + r.push(`${He} blushes furiously.`); + } else if (slave.relationship === -3) { + if (slave.fetish === "mindbroken") { + r.push(`${He} complies mechanically. ${He} remembers that when ${getWrittenTitle(slave)}'s commands are not obeyed, there is punishment. Once ${he}'s close, you hold ${his} face in your palms and look into ${his} blank ${App.Desc.eyesColor(slave)}. ${He} shows no reaction.`); + } else if (slave.devotion+slave.trust >= 175) { + r.push(`${He} lovingly complies, hurrying to come close to the ${womanP} who married ${him}. Once ${he}'s close, you take your willing ${wife}'s head in your hands and gaze deeply into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s married to affirming, and looks down with a`); + if (canSee(slave)) { + r.push(`smile, running ${his} eyes over your`); + if (V.PC.boobs >= 300) { + r.push(`bosom.`); + } else { + r.push(`chest.`); + } + } else { + r.push(`smile.`); + } + } else if (slave.devotion < -20 && slave.trust > 20) { + r.push(`${He} complies. Once ${he}'s close, you take your reluctant ${wife}'s head in your hands and gaze deeply into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s forcibly married to disturbing, and`); + if (canSee(slave)) { + r.push(`breaks eye contact.`); + } else { + r.push(`turns ${his} face away.`); + } + } else if (slave.devotion < -20) { + r.push(`${He} complies out of fear. Once ${he}'s close, you take your unwilling ${wife}'s head in your hands and gaze deeply into ${his} teary ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s forcibly married to terrifying, and`); + if (canSee(slave)) { + r.push(`breaks eye contact.`); + } else { + r.push(`turns ${his} face away.`); + } + } else { + r.push(`${He} complies obediently. Once ${he}'s close, you take your willing ${wife}'s head in your hands and gaze deeply into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s married to reassuring, and looks down with a slight `); + if (canSee(slave)) { + r.push(`smile, running ${his} eyes over your`); + if (V.PC.boobs >= 300) { + r.push(`bosom.`); + } else { + r.push(`chest.`); + } + } else { + r.push(`smile.`); + } + } + } else if (slave.devotion > 75) { + r.push(`${He} elatedly complies, joyful at being near to you. Once ${he}'s close, you take ${his} completely relaxed head in your hands and gaze deeply into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from ${his} beloved ${getWrittenTitle(slave)} disconcerting, and ${his} eyes flick downward after a moment. ${He} blushes furiously.`); + } else if (slave.devotion > 50) { + r.push(`${He} dotingly complies, being near you filling ${him} with delight. Once ${he}'s close, you take ${his} completely relaxed head in your hands and gaze deeply into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} disconcerting, and ${he} looks down after a moment, blushing.`); + } else if (slave.devotion > 20) { + r.push(`${He} joyfully complies, happy to be near you. Once ${he}'s close, you take ${his} willing head in your hands and gaze deeply into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and ${he} looks down after a moment, blushing nervously.`); + } else if (slave.devotion >= -20 && slave.trust >= -20) { + r.push(`${He} visibly considers disobedience, but decides that complying with such an apparently harmless order is safe, for now. Once ${he}'s close, you take ${his} head in your hands and gaze deeply into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and ${he} looks down after a moment, ${his} lower lip trembling with nervousness.`); + } else if (slave.trust < -20) { + r.push(`The command terrifies ${him}, but ${he}'s more frightened still of the consequences of disobedience, and ${he} complies. Once ${he}'s close, you take ${his} trembling head in your hands and gaze deeply into ${his} ${App.Desc.eyesColor(slave)} for a moment. ${He} looks down fearfully, and begins to shake with terror, tears streaking down ${his} cheeks.`); + } else { + r.push(`${He} pauses, obviously considering whether to resist, but eventually decides to save ${his} strength to fight more onerous orders, and gives in. Once ${he}'s close, you take a moment to gaze deeply into ${his} ${App.Desc.eyesColor(slave)}. ${He} stares back, but after a few moments ${he} loses the contest of wills and looks down.`); + } + + r.push(`You walk around ${him} and put your hands around ${his} abdomen,`); + if (hasAnyLegs(slave)) { + r.push(`to gently pull ${him} close towards you`); + } else { + r.push(`moving close towards ${him} on your desk`); + } + r.push(`and then wrap your arms around ${his} shoulders.`); + if (hasAnyLegs(slave)) { + r.push(`When you press your hips against ${hers},`); + } else { + r.push(`You use your arms to prop ${him} up against you,`); + } + r.push(``); + if (slave.trust > 20) { + r.push(`letting ${him} lean while taking the weight of ${him} against you.`); + } else { + r.push(`${he} tries to lean away from you, pushing against your arms.`); + } + r.push(`You lovingly squeeze ${him} in your long, cradling embrace.`); + + if (slave.boobs < 2600) { + if (slave.nipples === "huge") { + r.push(`You feel ${his} large, erect nipples against your`); + } else if (slave.nipples === "puffy") { + r.push(`You feel ${his} erect, puffy nipples against your`); + } else if (slave.nipples === "flat") { + r.push(`You feel the bumps of ${his} flat nipples against your`); + } else if (slave.nipples === "partially inverted") { + r.push(`You feel ${his} partially inverted nipples against your`); + } else if (slave.nipples === "inverted") { + r.push(`You feel ${his} inverted nipples against your`); + } else if (slave.nipples === "fuckable") { + r.push(`You feel the slits of ${his} nipples against your`); + } else { + r.push(`You feel ${his} erect nipples against your`); + } + r.push(`hands as you move your arms down around ${his} breasts.`); + if (slave.devotion > 20) { + r.push(`You take your time to stay in this position, feeling ${his} heart beat against you. ${He} starts to breathe faster before you keep one arm wrapped around ${him} as you move to ${his} front.`); + } else { + r.push(`As you move to ${his} front, with one arm still around ${him}, ${he} again tries to break away but you keep ${him} held tightly and you whisper the alternatives to ${him}, reminding ${him}.`); + } + r.push(`You wrap your arms around ${his} back as you press ${his} breasts against your`); + if (V.PC.boobs >= 300) { + r.push(`bosom.`); + } else { + r.push(`chest.`); + } + } else { + r.push(`${His} massive tits are too large for you to wrap your arms around so you start to wrap your arms around ${his} waist. You feel ${his} heart beat against your chest, ${he} starts to breathe faster as you press ${his} back against your`); + if (V.PC.boobs >= 300) { + r.push(`bosom.`); + } else { + r.push(`chest.`); + } + } + + if (slave.fetish === "mindbroken") { + r.push(`${His} posture doesn't change. ${He} initially only reacts slightly to your physical touch but eventually ${he} relaxes in the warmth of your embrace against ${him}. You know that this may only be a physiological reaction, nothing more. For a brief moment you think you detect a spark of life in ${his} dull eyes but just as quickly, it is gone. When you stop, ${his} ${App.Desc.eyesColor(slave)} track the movements of your hands briefly but then ${he} stares blankly ahead of ${him}, not understanding what is happening.`); + } else if (slave.relationship === -2) { + r.push(`In the warmth of your embrace, ${he} turns towards you, ${his} passionate ${App.Desc.eyesColor(slave)} staring intently at your face. ${He} leans closer to you and kisses you as you hold ${him}. ${His} heart beats faster and then gradually slows as ${he} grows accustomed to your body against ${hers}. Eventually, ${he} relaxes totally and ${his} eyes gradually close, melting in your arms. When you finally stop and relax your embrace, ${his} eyes remain closed and ${his} mouth still in a rapturous shape for a moment before ${he} slowly opens ${his} eyes and smiles at you with a blissful look on ${his} face.`); + if (hasAnyArms(slave)) { + r.push(`${His} hand reaches to your arms and ${he} strokes them longingly.`); + } + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} slowly opens them and does ${his} best to communicate love with ${his} ${App.Desc.eyesColor(slave)}.`); + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves you.`); + } else { + r.push( + Spoken(slave, `"I love you, ${Master},"`), + `${he} ${say}s dreamily.` + ); + } + r.push(`${He} looks at you, almost begging you with ${his} eyes that ${he} wants much more than a mere embrace.`); + } else if (slave.devotion > 50 && slave.fetish === "dom" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`In your soft, warm embrace, ${he} tries hard to stop ${himself} from losing ${himself} in your arms.`); + if (hasAnyArms(slave)) { + r.push(`${He} starts to embrace you`); + if (hasBothArms(slave)) { + r.push(`in ${his} arms`); + } else { + r.push(`with ${his} arm`); + } + r.push(`as well. When you gently squeeze ${him} in your arms, ${he} breathes more heavily and starts to lovingly squeeze you as well, ${his} tendency towards sexual dominance encouraging ${him} to compete with you in embraces against each other.`); + } else { + r.push(`When you gently squeeze ${him} in your arms, ${he} breathes more heavily before relaxing against you.`); + } + r.push(`When you finally stop and relax your embrace, ${his} eyes are closed and ${he}'s smiling blissfully.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} slowly opens them and does ${his} best to communicate excitement with ${his} ${App.Desc.eyesColor(slave)}.`); + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} liked that.`); + } else { + r.push( + Spoken(slave, `"I love you, ${Master},"`), + `${he} ${say}s cheerfully.` + ); + } + r.push(`${He} eagerly looks at you, ${his} eyes almost seem to say that ${he} wants you to give ${his} ${Master} more than a mere hug.`); + } else if (slave.devotion > 50) { + r.push(`${He} sighs devotedly in your arms and slowly relaxes. ${He} turns towards you, ${his} doting ${App.Desc.eyesColor(slave)} staring intently at your face. You feel ${his} heart beating faster against your chest as you softly squeeze your arms tighter.`); + if (hasAnyArms(slave)) { + r.push(`${His} ${hasBothArms(slave) ? `hands` : `hand`} reach to your arms and ${he} strokes them longingly as you squeeze.`); + } + r.push(`${He} gradually closes ${his} eyes as ${he} leans ${his} body against yours, melting in your warm embrace, and you feel the intense heat from ${his} body against your`); + if (V.PC.boobs >= 1400) { + r.push(`expansive`); + if (V.PC.boobsImplant/V.PC.boobs >= .60) { + r.push(`firm`); + } else { + r.push(`soft`); + } + r.push(`chest.`); + } else if (V.PC.boobs >= 1200) { + r.push(`huge`); + if (V.PC.boobsImplant/V.PC.boobs >= .60) { + r.push(`firm`); + } else { + r.push(`soft`); + } + r.push(`breasts.`); + } else if (V.PC.boobs >= 1000) { + r.push(`big`); + if (V.PC.boobsImplant/V.PC.boobs >= .60) { + r.push(`firm`); + } else { + r.push(`soft`); + } + r.push(`breasts.`); + } else if (V.PC.boobs >= 800) { + r.push(`soft breasts.`); + } else if (V.PC.boobs >= 500) { + r.push(`breasts.`); + } else if (V.PC.boobs >= 300) { + r.push(`small chest.`); + } else if (V.PC.title > 0) { + r.push(`manly chest.`); + } else { + r.push(`flat chest.`); + } + r.push(`When you finally stop,`); + if (hasAnyArms(slave)) { + r.push(`${he} reaches to your face with ${his} hand and gently strokes your cheek,`); + } else { + r.push(`${he} turns to you,`); + } + r.push(`a euphoric look on ${his} ${slave.skin} face.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate devotion with ${his} ${App.Desc.eyesColor(slave)}.`); + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves you.`); + } else if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate devotion with ${his} ${App.Desc.eyesColor(slave)}, since ${he}'s not confident in ${his} ability to express it in ${V.language}.`); + } else { + r.push( + Spoken(slave, `"I love you, ${Master}," ${he} `), + `${say}s elatedly.` + ); + } + r.push(`${He} looks at you longingly, almost as if ${he}'s bursting to say that ${he} wants more than a mere embrace.`); + } else if (slave.devotion > 20) { + r.push(`${He} willingly gives ${himself} up to your embracing arms. As you are so close to ${him}, you sense considerable uneasiness in the`); + if (slave.physicalAge > 30) { + r.push(`${woman};`); + } else { + r.push(`${girl};`); + } + r.push(`${he}'s doing ${his} duty as a slave by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of ${his} mind by your soft embrace against ${his} body. ${He} gradually closes ${his} eyes in the feeling of your gentle arms. When you finally stop and relax your embrace, ${his} + ${App.Desc.eyesColor(slave)} open to gaze puzzlingly at you. Even though ${he} has accepted life as a sex slave, ${he} looks as though ${he} is unsure of what to make of this non-sexual physical contact.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His} eyes beg for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs hesitantly, asking if that's it.`); + } else { + r.push( + `${He} asks hesitantly,`, + Spoken(slave, `"I-is that it, ${Master}?"`) + ); + } + } else if (slave.devotion >= -20 && slave.trust < -20) { + r.push(`${He} shakes at your touch fearfully. As you softly press ${his} trembling body against you, ${his} eagerness to avoid punishment leads ${him} to stiffen in your arms. While ${he} continues to shudder, you continue embracing ${him}, enjoying ${his} fear, and the physical intimacy slowly does its work. ${He} starts to relax, ${his} resistance easing and ${his} eyes start to close. When you relax your arms for a moment, ${he} opens ${his} eyes to look at you for a long moment, ${his} eyes darting up to your face, before visibly catching ${himself} with a reminder that ${he}'s a slave and you're ${his} owner.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His} eyes beg for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs hesitantly, asking if that's it.`); + } else { + r.push( + `${He} asks hesitantly,`, + Spoken(slave, `"I-is that it, ${Master}?"`) + ); + } + } else if (slave.trust < -50) { + r.push(`${He} is nearly frozen with fear, and does not resist as you start to squeeze your arms around ${him}. In fact, ${he} barely reacts at all. ${He} stares at your arms as they continue squeezing, but it's like touching a statue. ${He} is so filled with terror that ${he} remains stiff even as it becomes clear to ${him} you're not going to hurt ${him}. When you bore of embracing the still`); + if (slave.physicalAge > 30) { + r.push(`${woman}`); + } else { + r.push(`${girl}`); + } + r.push(`and release ${him}, ${he} stares at you in utter incomprehension.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His} eyes beg for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs spastically, begging fearfully to know if that's it.`); + } else { + r.push( + `${He} asks nervously,`, + Spoken(slave, `"I-is that it, ${Master}?"`) + ); + } + r.push(`Then ${he} cringes, unsure of what you are going to do next.`); + } else { + r.push(`${He} reflexively tries to break free from your arms, but you keep ${him} wrapped in them. Shuddering, ${he} desperately leans away from you, but you tip forward with ${him} and pin ${him} against your desk, continuing your hold on ${him}. ${He} tries to wriggle out of your grasp desperately, but ${his} struggles slowly subside as ${he} realizes that you're not taking this any farther. When you bore of it and release ${him}, ${he} stares at you in utter incomprehension.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His} eyes demand an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs irritably, asking whether that's it.`); + } else { + r.push( + `${He} splutters,`, + Spoken(slave, `"Is that it, ${Master}!?"`) + ); + } + r.push(`${He} shakes uncontrollably, apprehensive at what you are going to do next.`); + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fEmbrace.tw b/src/npc/interaction/fEmbrace.tw deleted file mode 100644 index 83e30f78c00d17b76749f12b370b742bec20c172..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fEmbrace.tw +++ /dev/null @@ -1,170 +0,0 @@ -:: FEmbrace [nobr no-history] - -<<setPlayerPronouns>> -<<run Enunciate(getSlave($AS))>> -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run getSlave($AS).partners.add(-1)>> - -You tell <<= getSlave($AS).slaveName>> to -<<if (hasAnyLegs(getSlave($AS)))>> - stand in front of you. -<<else>> - have another slave set $him down on your desk. -<</if>> - -<<if (getSlave($AS).fetish == "mindbroken") && (getSlave($AS).relationship != -3)>> - $He complies automatically. $He remembers that when <<= getWrittenTitle(getSlave($AS))>>'s commands are not obeyed, there is punishment. -<<elseif (getSlave($AS).relationship == -2)>> - $He excitedly complies, happy to be near the object of $his longing. Once $he's close, you take $his completely relaxed head in your hands and gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he loves overwhelming, and $his eyes flick downward after a moment. - <<else>> - upon $his face. $He senses the intense look from the _womanP $he loves and finds it overwhelming, and after a moment glances away. - <</if>> - $He blushes furiously. -<<elseif (getSlave($AS).relationship == -3)>> - <<if getSlave($AS).fetish == "mindbroken">> - $He complies mechanically. $He remembers that when <<= getWrittenTitle(getSlave($AS))>>'s commands are not obeyed, there is punishment. Once $he's close, you hold $his face in your palms and look into $his blank <<= App.Desc.eyesColor(getSlave($AS))>>. $He shows no reaction. - <<elseif getSlave($AS).devotion+getSlave($AS).trust >= 175>> - $He lovingly complies, hurrying to come close to the _womanP who married $him. Once $he's close, you take your willing $wife's head in your hands and gaze deeply into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's married to affirming, and looks down with a smile<<if canSee(getSlave($AS))>>, running $his eyes over your <<if $PC.boobs >= 300>>bosom<<else>>chest<</if>><</if>>. - <<elseif getSlave($AS).devotion < -20 && getSlave($AS).trust > 20>> - $He complies. Once $he's close, you take your reluctant $wife's head in your hands and gaze deeply into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's forcibly married to disturbing, and <<if canSee(getSlave($AS))>> breaks eye contact<<else>> turns $his face away<</if>>. - <<elseif getSlave($AS).devotion < -20>> - $He complies out of fear. Once $he's close, you take your unwilling $wife's head in your hands and gaze deeply into $his teary <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's forcibly married to terrifying, and <<if canSee(getSlave($AS))>> breaks eye contact<<else>> turns $his face away<</if>>. - <<else>> - $He complies obediently. Once $he's close, you take your willing $wife's head in your hands and gaze deeply into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's married to reassuring, and looks down with a slight smile<<if canSee(getSlave($AS))>>, running $his eyes over your <<if $PC.boobs >= 300>>bosom<<else>>chest<</if>><</if>>. - <</if>> -<<elseif (getSlave($AS).devotion > 75)>> - $He elatedly complies, joyful at being near to you. Once $he's close, you take $his completely relaxed head in your hands and gaze deeply into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from $his beloved <<= getWrittenTitle(getSlave($AS))>> disconcerting, and $his eyes flick downward after a moment. $He blushes furiously. -<<elseif (getSlave($AS).devotion > 50)>> - $He dotingly complies, being near you filling $him with delight. Once $he's close, you take $his completely relaxed head in your hands and gaze deeply into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> disconcerting, and $he looks down after a moment, blushing. -<<elseif (getSlave($AS).devotion > 20)>> - $He joyfully complies, happy to be near you. Once $he's close, you take $his willing head in your hands and gaze deeply into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and $he looks down after a moment, blushing nervously. -<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).trust >= -20)>> - $He visibly considers disobedience, but decides that complying with such an apparently harmless order is safe, for now. Once $he's close, you take $his head in your hands and gaze deeply into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and $he looks down after a moment, $his lower lip trembling with nervousness. -<<elseif (getSlave($AS).trust < -20)>> - The command terrifies $him, but $he's more frightened still of the consequences of disobedience, and $he complies. Once $he's close, you take $his trembling head in your hands and gaze deeply into $his <<= App.Desc.eyesColor(getSlave($AS))>> for a moment. $He looks down fearfully, and begins to shake with terror, tears streaking down $his cheeks. -<<else>> - $He pauses, obviously considering whether to resist, but eventually decides to save $his strength to fight more onerous orders, and gives in. Once $he's close, you take a moment to gaze deeply into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He stares back, but after a few moments $he loses the contest of wills and looks down. -<</if>> - -You walk around $him and put your hands around $his abdomen,<<if (hasAnyLegs(getSlave($AS)))>> to gently pull $him close towards you<<else>> moving close towards $him on your desk<</if>> and then wrap your arms around $his shoulders.<<if (hasAnyLegs(getSlave($AS)))>> When you press your hips against $hers,<<else>> You use your arms to prop $him up against you,<</if>> <<if (getSlave($AS).trust > 20)>>letting $him lean while taking the weight of $him against you<<else>>$he tries to lean away from you, pushing against your arms<</if>>. You lovingly squeeze $him in your long, cradling embrace. - -<<if (getSlave($AS).boobs < 2600)>> - <<if (getSlave($AS).nipples == "huge")>> - You feel $his large, erect nipples against your - <<elseif (getSlave($AS).nipples == "puffy")>> - You feel $his erect, puffy nipples against your - <<elseif (getSlave($AS).nipples == "flat")>> - You feel the bumps of $his flat nipples against your - <<elseif getSlave($AS).nipples == "partially inverted">> - You feel $his partially inverted nipples against your - <<elseif getSlave($AS).nipples == "inverted">> - You feel $his inverted nipples against your - <<elseif getSlave($AS).nipples == "fuckable">> - You feel the slits of $his nipples against your - <<else>> - You feel $his erect nipples against your - <</if>> - hands as you move your arms down around $his breasts. <<if (getSlave($AS).devotion > 20)>>You take your time to stay in this position, feeling $his heart beat against you. $He starts to breathe faster before you keep one arm wrapped around $him as you move to $his front<<else>>As you move to $his front, with one arm still around $him, $he again tries to break away but you keep $him held tightly and you whisper the alternatives to $him, reminding $him<</if>>. You wrap your arms around $his back as you press $his breasts against your <<if $PC.boobs >= 300>>bosom<<else>>chest<</if>>. -<<else>> - $His massive tits are too large for you to wrap your arms around so you start to wrap your arms around $his waist. You feel $his heart beat against your chest, $he starts to breathe faster as you press $his back against your <<if $PC.boobs >= 300>>bosom<<else>>chest<</if>>. -<</if>> - -<<if (getSlave($AS).fetish == "mindbroken")>> - $His posture doesn't change. $He initially only reacts slightly to your physical touch but eventually $he relaxes in the warmth of your embrace against $him. You know that this may only be a physiological reaction, nothing more. For a brief moment you think you detect a spark of life in $his dull eyes but just as quickly, it is gone. When you stop, $his <<= App.Desc.eyesColor(getSlave($AS))>> track the movements of your hands briefly but then $he stares blankly ahead of $him, not understanding what is happening. -<<elseif (getSlave($AS).relationship == -2)>> - In the warmth of your embrace, $he turns towards you, $his passionate <<= App.Desc.eyesColor(getSlave($AS))>> staring intently at your face. $He leans closer to you and kisses you as you hold $him. $His heart beats faster and then gradually slows as $he grows accustomed to your body against $hers. Eventually, $he relaxes totally and $his eyes gradually close, melting in your arms. When you finally stop and relax your embrace, $his eyes remain closed and $his mouth still in a rapturous shape for a moment before $he slowly opens $his eyes and smiles at you with a blissful look on $his face. <<if (hasAnyArms(getSlave($AS)))>> $His hand reaches to your arms and $he strokes them longingly.<</if>> - <<if (!hasAnyArms(getSlave($AS))) && !canTalk(getSlave($AS))>> - $He slowly opens them and does $his best to communicate love with $his <<= App.Desc.eyesColor(getSlave($AS))>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he loves you. - <<else>> - "I love you, <<Master>>," $he <<say>>s dreamily. - <</if>> - $He looks at you, almost begging you with $his eyes that $he wants much more than a mere embrace. -<<elseif (getSlave($AS).devotion > 50) && (getSlave($AS).fetish == "dom") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>> - In your soft, warm embrace, $he tries hard to stop $himself from losing $himself in your arms. - <<if (hasAnyArms(getSlave($AS)))>> - $He starts to embrace you <<if (hasBothArms(getSlave($AS)))>>in $his arms<<else>>with $his arm<</if>> as well. When you gently squeeze $him in your arms, $he breathes more heavily and starts to lovingly squeeze you as well, $his tendency towards sexual dominance encouraging $him to compete with you in embraces against each other. - <<else>> - When you gently squeeze $him in your arms, $he breathes more heavily before relaxing against you. - <</if>> - When you finally stop and relax your embrace, $his eyes are closed and $he's smiling blissfully. - <<if (!hasAnyArms(getSlave($AS))) && !canTalk(getSlave($AS))>> - $He slowly opens them and does $his best to communicate excitement with $his <<= App.Desc.eyesColor(getSlave($AS))>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he liked that. - <<else>> - "That wa<<s>> fun, <<Master>>," $he <<say>>s cheerfully. - <</if>> - $He eagerly looks at you, $his eyes almost seem to say that $he wants you to give $his <<Master>> more than a mere hug. -<<elseif (getSlave($AS).devotion > 50)>> - $He sighs devotedly in your arms and slowly relaxes. $He turns towards you, $his doting <<= App.Desc.eyesColor(getSlave($AS))>> staring intently at your face. You feel $his heart beating faster against your chest as you softly squeeze your arms tighter.<<if hasAnyArms(getSlave($AS))>> $His hand<<if hasBothArms(getSlave($AS))>>s<</if>> reach to your arms and $he strokes them longingly as you squeeze.<</if>> $He gradually closes $his eyes as $he leans $his body against yours, melting in your warm embrace, and you feel the intense heat from $his body against your - <<if $PC.boobs >= 1400>> - expansive <<if $PC.boobsImplant/$PC.boobs >= .60>>firm<<else>>soft<</if>> chest. - <<elseif $PC.boobs >= 1200>> - huge <<if $PC.boobsImplant/$PC.boobs >= .60>>firm<<else>>soft<</if>> breasts. - <<elseif $PC.boobs >= 1000>> - big <<if $PC.boobsImplant/$PC.boobs >= .60>>firm<<else>>soft<</if>> breasts. - <<elseif $PC.boobs >= 800>> - soft breasts. - <<elseif $PC.boobs >= 500>> - breasts. - <<elseif $PC.boobs >= 300>> - small chest. - <<elseif $PC.title > 0>> - manly chest. - <<else>> - flat chest. - <</if>> - When you finally stop, <<if (hasAnyArms(getSlave($AS)))>>$he reaches to your face with $his hand and gently strokes your cheek<<else>>$he turns to you<</if>>, a euphoric look on $his <<= getSlave($AS).skin>> face. - <<if (!hasAnyArms(getSlave($AS))) && !canTalk(getSlave($AS))>> - $He does $his best to communicate devotion with $his <<= App.Desc.eyesColor(getSlave($AS))>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he loves you. - <<elseif (getSlave($AS).accent >= 3)>> - $He does $his best to communicate devotion with $his <<= App.Desc.eyesColor(getSlave($AS))>>, since $he's not confident in $his ability to express it in $language. - <<else>> - "I love you, <<Master>>," $he <<say>>s elatedly. - <</if>> - $He looks at you longingly, almost as if $he's bursting to say that $he wants more than a mere embrace. -<<elseif (getSlave($AS).devotion > 20)>> - $He willingly gives $himself up to your embracing arms. As you are so close to $him, you sense considerable uneasiness in the <<if (getSlave($AS).physicalAge > 30)>>$woman<<else>>$girl<</if>>; $he's doing $his duty as a slave by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of $his mind by your soft embrace against $his body. $He gradually closes $his eyes in the feeling of your gentle arms. When you finally stop and relax your embrace, $his <<= App.Desc.eyesColor(getSlave($AS))>> open to gaze puzzlingly at you. Even though $he has accepted life as a sex slave, $he looks as though $he is unsure of what to make of this non-sexual physical contact. - <<if (!hasAnyArms(getSlave($AS))) && !canTalk(getSlave($AS))>> - $His eyes beg for an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs hesitantly, asking if that's it. - <<else>> - $He asks hesitantly, "I-i<<s>> that it, <<Master>>?" - <</if>> -<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).trust < -20)>> - $He shakes at your touch fearfully. As you softly press $his trembling body against you, $his eagerness to avoid punishment leads $him to stiffen in your arms. While $he continues to shudder, you continue embracing $him, enjoying $his fear, and the physical intimacy slowly does its work. $He starts to relax, $his resistance easing and $his eyes start to close. When you relax your arms for a moment, $he opens $his eyes to look at you for a long moment, $his eyes darting up to your face, before visibly catching $himself with a reminder that $he's a slave and you're $his owner. - <<if (!hasAnyArms(getSlave($AS))) && !canTalk(getSlave($AS))>> - $His eyes beg for an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs hesitantly, asking if that's it. - <<else>> - $He asks hesitantly, "I-i<<s>> that it, <<Master>>?" - <</if>> -<<elseif (getSlave($AS).trust < -50)>> - $He is nearly frozen with fear, and does not resist as you start to squeeze your arms around $him. In fact, $he barely reacts at all. $He stares at your arms as they continue squeezing, but it's like touching a statue. $He is so filled with terror that $he remains stiff even as it becomes clear to $him you're not going to hurt $him. When you bore of embracing the still <<if (getSlave($AS).physicalAge > 30)>>$woman<<else>>$girl<</if>> and release $him, $he stares at you in utter incomprehension. - <<if (!hasAnyArms(getSlave($AS))) && !canTalk(getSlave($AS))>> - $His eyes beg for an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs spastically, begging fearfully to know if that's it. - <<else>> - $He asks nervously, "I-i<<s>> that it, <<Master>>?" - <</if>> - Then $he cringes, unsure of what you are going to do next. -<<else>> - $He reflexively tries to break free from your arms, but you keep $him wrapped in them. Shuddering, $he desperately leans away from you, but you tip forward with $him and pin $him against your desk, continuing your hold on $him. $He tries to wriggle out of your grasp desperately, but $his struggles slowly subside as $he realizes that you're not taking this any farther. When you bore of it and release $him, $he stares at you in utter incomprehension. - <<if (!hasAnyArms(getSlave($AS))) && !canTalk(getSlave($AS))>> - $His eyes demand an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs irritably, asking whether that's it. - <<else>> - $He splutters, "I<<s>> that it, <<Master>>!?" - <</if>> - $He shakes uncontrollably, apprehensive at what you are going to do next. -<</if>> diff --git a/src/npc/interaction/fFeelings.js b/src/npc/interaction/fFeelings.js index ec234dcc57f62699a061c20991d654842fad5977..75bf2dfd82d28c6f774805479af441bc645d700d 100644 --- a/src/npc/interaction/fFeelings.js +++ b/src/npc/interaction/fFeelings.js @@ -807,9 +807,16 @@ App.Interact.feelings = function(slave) { r.push(`I'm so horny, ${Master}.`); if (plugWidth(slave) === 1 && slave.anus > 2) { r.push(`I wear the buttplug you gave me, but it is so small... It reminds me of being fucked in the ass, but I can barely feel it. It drives me crazy.`); - } else if (((plugWidth(slave) === 1 && slave.anus < 3) || (plugWidth(slave) === 2 && slave.anus === 3) || plugWidth(slave) === 3 && slave.anus >= 4) ) { + } else if ( + (plugWidth(slave) === 1 && slave.anus < 3) || + (plugWidth(slave) === 2 && slave.anus === 3) || + (plugWidth(slave) === 3 && slave.anus >= 4) + ) { r.push(`Thank you for the buttplug. It is really fun to have my ass filled all day long.`); - } else if ((plugWidth(slave) === 2 && slave.anus < 3) || (plugWidth(slave) > 2 && slave.anus < 4) ) { + } else if ( + (plugWidth(slave) === 2 && slave.anus < 3) || + (plugWidth(slave) > 2 && slave.anus < 4) + ) { r.push(`I like it up the ass, but the plug you make me wear is too big. It really hurts. Not in the good way.`); } else { r.push(`My anus is killing me, all I want to do is touch it and massage it and fill it.`); @@ -1330,7 +1337,11 @@ App.Interact.feelings = function(slave) { break; case "intensive testicle enhancement": r.push(Spoken(slave, `My balls feel incredibly full, ${Master}. They're really uncomfortable.`)); - if (slave.fetishKnown === 1 && (slave.fetish === "dom") || (slave.fetish === "sadist") && slave.fetishStrength > 60) { + if ( + slave.fetishKnown === 1 && + (slave.fetish === "dom" || slave.fetish === "sadist") && + slave.fetishStrength > 60 + ) { r.push(Spoken(slave, `But I can't wait to force a bitch to take the whole load.`)); } else if (slave.fetishKnown === 1 && slave.fetish === "pregnancy" && slave.fetishStrength > 60) { r.push(Spoken(slave, `I feel like I could fill a girl's womb with cum with one orgasm.`)); @@ -1340,7 +1351,11 @@ App.Interact.feelings = function(slave) { break; case "hyper testicle enhancement": r.push(Spoken(slave, `My balls feel so incredibly full, ${Master}. They're really painful.`)); - if (slave.fetishKnown === 1 && (slave.fetish === "dom") || (slave.fetish === "sadist") && slave.fetishStrength > 60) { + if ( + slave.fetishKnown === 1 && + (slave.fetish === "dom" || slave.fetish === "sadist") && + slave.fetishStrength > 60 + ) { r.push(Spoken(slave, `But I can't wait to fill a bitch with my load. Bet they'll look pregnant when I'm done.`)); } else if (slave.fetishKnown === 1 && slave.fetish === "pregnancy" && slave.fetishStrength > 60) { r.push(Spoken(slave, `I feel like I could fertilize all of a girl's eggs with my cum.`)); @@ -1349,7 +1364,7 @@ App.Interact.feelings = function(slave) { } break; case "intensive breast injections": - if (slave.fetishKnown === 1 && (slave.fetish === "boobs") || (slave.energy > 95)) { + if (slave.fetishKnown === 1 && (slave.fetish === "boobs" || slave.energy > 95)) { r.push(Spoken(slave, `I can almost feel my boobs swelling, ${Master}. Thank you for injecting them with hormones, and please, never stop.`)); } else { r.push(Spoken(slave, `I can almost feel my boobs swelling, ${Master}. It's kind of uncomfortable.`)); @@ -1367,7 +1382,7 @@ App.Interact.feelings = function(slave) { } break; case "intensive butt injections": - if (slave.fetishKnown === 1 && (slave.fetish === "buttslut") || (slave.energy > 95)) { + if (slave.fetishKnown === 1 && (slave.fetish === "buttslut" || slave.energy > 95)) { r.push(Spoken(slave, `I can almost feel my butt growing, ${Master}. I can't wait to feel a dick sliding up in between my buttocks.`)); } else { r.push(Spoken(slave, `I can almost feel my butt growing, ${Master}. It's kind of uncomfortable.`)); @@ -1385,7 +1400,7 @@ App.Interact.feelings = function(slave) { } break; case "lip injections": - if (slave.fetishKnown === 1 && (slave.fetish === "cumslut") || (slave.energy > 95)) { + if (slave.fetishKnown === 1 && (slave.fetish === "cumslut" || slave.energy > 95)) { r.push(Spoken(slave, `I can almost feel my lips swelling, ${Master}. I can't wait to wrap them around a cock.`)); } else { r.push(Spoken(slave, `I can almost feel my lips swelling, ${Master}. It's kind of uncomfortable.`)); @@ -1724,11 +1739,11 @@ App.Interact.feelings = function(slave) { r.push(Spoken(slave, `I — I'm fucking my father,"`)); r.push(`${he} bursts out, blushing even harder.`); r.push(Spoken(slave, `"It's so fucking wrong, but ${he2} knows so much about penetration, I can't stop.`)); - } else if (_partner.mother === V.AS) { + } else if (_partner.mother === slave.ID) { r.push(Spoken(slave, `I — I'm fucking my ${daughter2},"`)); r.push(`${he} bursts out, blushing even harder.`); r.push(Spoken(slave, `"It's so fucking wrong, but ${he2} has such a hot little body, I can't stop.`)); - } else if (_partner.father === V.AS) { + } else if (_partner.father === slave.ID) { r.push(Spoken(slave, `I — I'm fucking my ${daughter2},"`)); r.push(`${he} bursts out, blushing even harder.`); r.push(Spoken(slave, `"It's so fucking wrong, but ${he2} has such a hot little body. ${He2} looks so much like ${his2} mother, I can't stop.`)); @@ -2094,9 +2109,9 @@ App.Interact.feelings = function(slave) { } // closes FS if (slave.devotion > 75) { - if (slave.tankBaby > 0|| slave.mother === -1 || (areSisters(slave, V.PC) && slave.actualAge <= V.PC.actualAge)) { + if (slave.tankBaby > 0 || isParentP(slave, V.PC) || (areSisters(slave, V.PC) && slave.actualAge <= V.PC.actualAge)) { r.push(Spoken(slave, `I've known you my whole life, ${Master}, I can't really think of any times you weren't there for me.`)); - } else if ((areSisters(slave, V.PC) && slave.actualAge > V.PC.actualAge) || V.PC.mother === V.AS || V.PC.father === V.AS) { + } else if ((areSisters(slave, V.PC) && slave.actualAge > V.PC.actualAge) || isParentP(V.PC, slave)) { r.push(Spoken(slave, `You're my dear ${Master}. I've known you since you were born, and I will always be watching out for you, no matter what.`)); } else if (slave.weekAcquired === 0 && V.week > 104) { r.push(Spoken(slave, `I feel like I've known you my whole life, ${Master}, and I would follow you to the end of the earth.`)); diff --git a/src/npc/interaction/fFeet.js b/src/npc/interaction/fFeet.js new file mode 100644 index 0000000000000000000000000000000000000000..e6535bd7d33a23640186a511b5f6cd4f6b355955 --- /dev/null +++ b/src/npc/interaction/fFeet.js @@ -0,0 +1,973 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fFeet = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself, wife + } = getPronouns(slave); + const {title: Master} = getEnunciation(slave); + + slave.partners.add(-1); + + const _footSeed = random(1, 100); + let thighsAdj; + let _belly; + let legsAdj; + let boobsDesc; + let _boobs; + let ballsDesc; + let dickAdj; + let buttAdj; + let _hips; + let skin; + + if (slave.weight > 190) { + thighsAdj = "massive flabby"; + } else if (slave.weight > 160) { + thighsAdj = "thick flabby"; + } else if (slave.weight > 130) { + thighsAdj = "flabby"; + } else if (slave.weight > 95) { + thighsAdj = "fat"; + } else if (slave.weight > 30) { + if (slave.muscles > 75) { + thighsAdj = "toned fat"; + } else if (slave.muscles < 15) { + thighsAdj = "fat"; + } else { + thighsAdj = "plush"; + } + } else if (slave.weight > 10) { + if (slave.muscles > 70) { + thighsAdj = "thick muscular"; + } else if (slave.muscles > 20) { + thighsAdj = "soft toned"; + } else { + thighsAdj = "soft"; + } + } else if (slave.weight >= -10) { + if (slave.muscles > 70) { + thighsAdj = "muscular"; + } else if (slave.muscles > 20) { + thighsAdj = "toned"; + } else { + thighsAdj = "average"; + } + } else if (slave.weight >= -30) { + if (slave.muscles > 40) { + thighsAdj = "thin muscular"; + } else if (slave.muscles > 20) { + thighsAdj = "toned model's"; + } else { + thighsAdj = "model's"; + } + } else { + if (slave.muscles > 5) { + thighsAdj = "emaciated toned"; + } else { + thighsAdj = "emaciated"; + } + } + + if (slave.belly < 1500) { + _belly = thighsAdj; + } else { + _belly = bellyAdjective(slave); + } + + if (slave.height >= 185) { + legsAdj = "wonderfully long"; + } else if (slave.height >= 170) { + legsAdj = "long"; + } else if (slave.height >= 160) { + legsAdj = "nice"; + } else if (slave.height >= 150) { + legsAdj = "short"; + } else { + legsAdj = "short little"; + } + + if (slave.boobs >= 30000) { + boobsDesc = "skip"; + _boobs = "room filling"; + } else if (slave.boobs >= 20000) { + boobsDesc = "beanbag sized"; + } else if (slave.boobs >= 8500) { + boobsDesc = "obscenely massive"; + } else if (slave.boobs >= 8000) { + boobsDesc = "Z-cup"; + } else if (slave.boobs >= 7500) { + boobsDesc = "Y-cup"; + } else if (slave.boobs >= 7000) { + boobsDesc = "X-cup"; + } else if (slave.boobs >= 6500) { + boobsDesc = "V-cup"; + } else if (slave.boobs >= 5500) { + boobsDesc = "U-cup"; + } else if (slave.boobs >= 5100) { + boobsDesc = "T-cup"; + } else if (slave.boobs >= 4700) { + boobsDesc = "S-cup"; + } else if (slave.boobs >= 4300) { + boobsDesc = "R-cup"; + } else if (slave.boobs >= 3950) { + boobsDesc = "Q-cup"; + } else if (slave.boobs >= 3600) { + boobsDesc = "P-cup"; + } else if (slave.boobs >= 3250) { + boobsDesc = "O-cup"; + } else if (slave.boobs >= 2900) { + boobsDesc = "N-cup"; + } else if (slave.boobs >= 2600) { + boobsDesc = "M-cup"; + } else if (slave.boobs >= 2300) { + boobsDesc = "L-cup"; + } else if (slave.boobs >= 2050) { + boobsDesc = "K-cup"; + } else if (slave.boobs >= 1800) { + boobsDesc = "J-cup"; + } else if (slave.boobs >= 1600) { + boobsDesc = "I-cup"; + } else if (slave.boobs >= 1400) { + boobsDesc = "H-cup"; + } else if (slave.boobs >= 1200) { + boobsDesc = "G-cup"; + } else if (slave.boobs >= 1000) { + boobsDesc = "F-cup"; + } else if (slave.boobs >= 800) { + boobsDesc = "DD-cup"; + } else if (slave.boobs >= 650) { + boobsDesc = "D-cup"; + } else if (slave.boobs >= 400) { + boobsDesc = "C-cup"; + } else if (slave.boobs >= 300) { + boobsDesc = "B-cup"; + } else { + boobsDesc = "skip"; + _boobs = "flat"; + } + if (boobsDesc !== "skip") { + _boobs = boobsDesc + " " + slave.boobShape; + } + + if (slave.balls === 1) { + ballsDesc = "vestigial"; + } else if (slave.balls === 2) { + ballsDesc = "small"; + } else if (slave.balls === 3) { + ballsDesc = "average"; + } else if (slave.balls === 4) { + ballsDesc = "large"; + } else if (slave.balls === 5) { + ballsDesc = "massive"; + } else if (slave.balls === 6) { + ballsDesc = "huge"; + } else if (slave.balls === 7) { + ballsDesc = "giant"; + } else if (slave.balls === 8) { + ballsDesc = "enormous"; + } else if (slave.balls === 9) { + ballsDesc = "monstrous"; + } else { + ballsDesc = "overly massive"; + } + + if (slave.dick === 1) { + dickAdj = "tiny"; + } else if (slave.dick === 2) { + dickAdj = "little"; + } else if (slave.dick === 3) { + dickAdj = "average"; + } else if (slave.dick === 4) { + dickAdj = "big"; + } else if (slave.dick === 5) { + dickAdj = "huge"; + } else if (slave.dick === 6) { + dickAdj = "gigantic"; + } else if (slave.dick === 7) { + dickAdj = "massive"; + } else if (slave.dick === 8) { + dickAdj = "horse-sized"; + } else if (slave.dick === 9) { + dickAdj = "monstrous"; + } else if (slave.dick === 10) { + dickAdj = "inhuman"; + } else { + dickAdj = "hypertrophied"; + } + + if (slave.butt < 1) { + buttAdj = "flat"; + } else if (slave.butt < 2) { + buttAdj = "small"; + } else if (slave.butt < 3) { + buttAdj = "plump"; + } else if (slave.butt < 4) { + buttAdj = "big bubble"; + } else if (slave.butt < 5) { + buttAdj = "huge"; + } else if (slave.butt < 6) { + buttAdj = "enormous"; + } else if (slave.butt < 7) { + buttAdj = "gigantic"; + } else if (slave.butt < 8) { + buttAdj = "ridiculous"; + } else if (slave.butt < 10) { + buttAdj = "immense"; + } else { + buttAdj = "inhuman"; + } + + if (slave.hips > 2) { + _hips = "inhumanly wide"; + } else if (slave.hips > 1) { + _hips = "very wide"; + } else if (slave.hips > 0) { + _hips = "wide"; + } else if (slave.hips > -1) { + _hips = "ample"; + } else if (slave.hips > -2) { + _hips = "narrow"; + } else { + _hips = "very narrow"; + } + + if (slave.skin === slave.race || slave.race === "white" || slave.race === "black" || V.seeRace === 0) { + skin = slave.skin; + } else { + skin = `${slave.skin} ${slave.race}`; + } + + const legs = hasBothLegs(slave) ? "legs" : "leg"; + const feet = hasBothLegs(slave) ? "feet" : "foot"; + + // Part 1: Order and reaction + + r.push(`You call ${slave.slaveName} to your office, telling ${him} to use ${his} ${feet} to please you.`); + if (slave.fetish === "mindbroken") { + r.push(`${He} is brought to you and stands blankly by your desk.`); + } else if (slave.relationship === -3 && slave.devotion >= 60 ) { + r.push(`Your devoted slave ${wife} is delighted to get another chance to pleasure you.`); + } else if (slave.relationship === -2 && slave.devotion >= 60 ) { + r.push(`${He} considers ${himself} your lover, and is delighted to spend time with you.`); + } else if (slave.devotion < -50) { + r.push(`${He} strongly refuses, and you have to restrain ${him} to get ${him} to obey.`); + } else if (slave.devotion < -20) { + r.push(`${He} tries to refuse, but decides it will just be easier to comply than risk punishment.`); + } else if (slave.devotion <= 20) { + r.push(`${He} doesn't seem eager to comply, but fears being punished enough to obey.`); + } else if (slave.devotion < 60) { + r.push(`${He} complies quietly.`); + } else { + if (slave.trust < -50) { + r.push(`Although ${he} just barely trusts that you will not harm ${him}, ${he} is still unsure about what you are going to do which makes ${him} pause.`); + } else { + r.push(`${He} rushes to comply.`); + } + } + + // Extra 1 if tease/perverted and not mindbroken + if ((slave.sexualQuirk === "tease" || slave.sexualQuirk === "perverted") && slave.devotion > 60 && slave.fetish !== "mindbroken") { + r.push(`Before you can begin, ${he} arches`); + if (hasBothLegs(slave)) { + r.push(`a`); + } else { + r.push(`${his}`); + } + r.push(`leg in a seductive tease.`); + } + // Part 2: lube and reaction + if (!canWalk(slave)) { + if (tooBigBreasts(slave)) { + r.push(`Since ${he} is immobilized by ${his} ${_boobs} boobs, you have ${him} lay on ${his} side on the floor,`); + } else if (tooBigBelly(slave)) { + r.push(`Since ${he} is immobilized by ${his}`); + if (slave.bellyPreg >= 3000) { + r.push(`hugely gravid`); + } else if (slave.bellyImplant >= 3000) { + r.push(`${_belly} protruding`); + } else { + r.push(`heavy ${slave.inflationType}-filled`); + } + r.push(`belly, you have ${he} lay on ${his} side on the floor,`); + } else if (tooBigDick(slave)) { + r.push(`Since ${he} is immobilized by ${his} ${dickAdj} dick, you have ${him} lay on ${his} side on the floor,`); + } else if (tooBigButt(slave)) { + r.push(`Since ${he} is immobilized by ${his} ${dickAdj} dick, you have ${him} sit on your desk to present ${his} ${legsAdj} ${legs} and ${feet},`); + } else if (tooBigBalls(slave)) { + r.push(`Since ${he} is immobilized by ${his} ${ballsDesc} balls, you have ${him} lay on ${his} back on the floor with ${his} ${legs} over ${his} nuts,`); + } else { + r.push(`You have ${him} sit on the edge of your desk to present ${his} ${legsAdj} ${legs} and ${feet},`); + } + } else { + r.push(`You have ${him} sit on the edge of your desk to present ${his} ${legsAdj} ${legs} and ${feet},`); + } + if (getLegCount(slave, 4) + getLegCount(slave, 6) === 2) { + r.push(`then pour lubricant onto your hands, applying it to ${his} elegant artificial ${feet}.`); + } else if (getLegCount(slave, 5) === 2) { + r.push(`then pour lubricant onto your hands, applying it to ${his} deadly artificial ${feet}.`); + } else if (hasBothLegs(slave) && !hasAnyNaturalLegs(slave)) { + r.push(`then pour lubricant onto your hands, applying it to ${his} artificial ${feet}.`); + } else { + r.push(`then pour lubricant onto your hands, massaging it into ${his} ${slave.skin} ${feet}: rubbing ${his} ${hasBothLegs(slave) ? `arches` : `arch`}, ${hasBothLegs(slave) ? `soles` : `sole`}, and toes.`); + } + if (slave.fetish === "mindbroken") { + r.push(`${He} shows little reaction to your efforts.`); + } else { // not mindbroken + if (slave.devotion < -50) { + r.push(`${He} tries to stay hateful despite the pleasurable stimulation.`); + } else if (slave.devotion < -20) { + r.push(`${He} is mostly quiet, but occasionally stifles a moan.`); + } else if (slave.devotion > 20 && slave.sexualFlaw === "shamefast") { + r.push(`${He}`); + if (hasAnyArms(slave)) { + r.push(`hides ${his} face in ${his} ${hasBothArms(slave) ? `hands` : `hand`}`); + } else { + r.push(`attempts to hide ${his} face`); + } + r.push(`in shame at ${his} nudity, but occasionally a moan breaks out.`); + } else if (slave.devotion <= 20) { + r.push(`${He} seems a bit surprised by the attention, occasionally letting out a moan.`); + } else { + if (slave.trust < -50) { + r.push(`${He} seems uncomfortable at your touch and frequently jerks away, spoiling the moment.`); + } else { + r.push(`${He} enjoys the massage, moaning in pleasure at your touch.`); + } + } + } // close lube and reaction + + // Part 3: Actions, attraction/devotion and fetishes + if (slave.fetish === "mindbroken") { + r.push(`You hold ${his} ${feet} and thrust between them as ${he}`); + if (canSee(slave)) { + r.push(`watches you blankly.`); + } else { + r.push(`points ${his} blind gaze at you.`); + } + } else if (!(canWalk(slave))) { + if (slave.devotion < -50) { + r.push(`When ${he} refuses to serve, you take`); + if (hasBothLegs(slave)) { + r.push(`both of`); + } + r.push(`${his} ${feet} and start thrusting between them.`); + } else if (slave.devotion < -20) { + r.push(`${He} seems a bit reluctant when massaging you with ${his} ${feet} so you have to do most of the work.`); + } else if (slave.devotion <= 20) { + r.push(`${He} tries to make it pleasurable for you, but the combination of the awkward angle and ${his} nervousness makes ${him} lose ${his} pacing often.`); + } else if (slave.devotion < 60 || (slave.sexualQuirk === "unflinching" && slave.devotion <= 20)) { + r.push(`${He} does ${his} best to please you from ${his} position on ${his} side, massaging your cock nicely.`); + } else { + if (slave.trust < -50) { + r.push(`${His} lack of trust causes ${him} to ask "${Master}, is this pleasurable for you?", spoiling the moment.`); + } else { + r.push(`${He} moves ${his} ${feet} hypnotically, trying ${his} hardest to make you cum. Being on ${his} side doesn't affect ${his} footjob, and you get a nice view of ${his} ${legsAdj} ${legs} as ${he} runs ${his} ${feet} across your cock.`); + } + } + if (!canWalk(slave)) { + if (slave.boobs > slave.belly ) { + r.push(`${His} ${_boobs} breasts wobble as ${his} ${feet} service you.`); + } else { + r.push(`${His} ${_belly} belly wobbles as ${his} ${feet} service you.`); + } + } + } else if (slave.devotion < -50) { + r.push(`When ${he} refuses to comply, you take both ${his} ${feet} and start thrusting between them.`); + } else if (slave.devotion < -20) { + r.push(`${He} seems a bit reluctant when massaging you with ${his} ${feet} so you have to do most of the work.`); + } else if (slave.devotion <= 20) { + r.push(`${He} tries to make it pleasurable for you, trying to find the right angle and speed, but ${he} seems a bit tense and ruins ${his} pacing.`); + } else if (slave.devotion < 60 || (slave.sexualQuirk === "unflinching" && slave.devotion <= 20)) { + r.push(`${He} does ${his} best to please you, massaging you nicely with ${his} ${feet}.`); + } else if (slave.attrXY < 16) { + r.push(`${He} tries to make it pleasurable for you, but ${his} great distaste for men is obvious on ${his} expression.`); + } else { + if (slave.sexualQuirk === "perverted") { + r.push(`As a devoted pervert, ${slave.slaveName} gives an enthusiastic footjob, with ${his}`); + if (slave.dick > 0) { + if (canAchieveErection(slave)) { + if (slave.chastityPenis === 1) { + r.push(`erect caged ${dickAdj} cock,`); + } else { + r.push(`erect ${dickAdj} cock,`); + } + } else { + r.push(`soft and dripping ${dickAdj}`); + if (slave.chastityPenis === 1) { + r.push(`caged`); + } + r.push(`dick,`); + } + if (slave.balls > 0 && slave.scrotum > 0) { + if (slave.vagina >= 0) { + r.push(`and pulsing ${ballsDesc} balls`); + if (slave.vaginaLube > 0 && slave.vagina >= 0) { + r.push(`that are wet from ${his} feminine arousal`); + } + } + } else if (slave.vagina >= 0) { + r.push(`and`); + if (slave.vaginaLube === 1) { + r.push(`wet`); + } else if (slave.vaginaLube === 2) { + r.push(`dripping wet`); + } + r.push(`aroused vagina`); + } + } else if (slave.vagina >= 0) { + if (slave.vaginaLube === 1) { + r.push(`wet`); + } else if (slave.vaginaLube === 2) { + r.push(`dripping wet`); + } + r.push(`aroused vagina`); + } else { + r.push(`perverted smile`); + } + r.push(`showing ${his} sexual excitement to service your cock with ${his} ${feet}.`); + } else if (slave.fetish === "cumslut" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) { + r.push(`As a devoted cumslut, ${slave.slaveName} eagerly strokes your cock with ${his} ${feet}, delightedly smearing your precum on ${his} ${hasBothLegs(slave) ? `soles` : `sole`}. ${He}`); + if (canSee(slave)) { + if (V.PC.balls >= 10) { + r.push(`stares at your massive balls with a ravenous gaze,`); + } else if (V.PC.balls >= 5) { + r.push(`stares at your large balls with a hungry gaze,`); + } else if (V.PC.scrotum > 0) { + r.push(`stares at your balls with a steady gaze,`); + } else { + r.push(`practically stares through you to your internal balls,`); + } + } else { + r.push(`gingerly feels the`); + if (V.PC.balls >= 10) { + r.push(`weight of your massive balls`); + } else if (V.PC.balls >= 5) { + r.push(`weight of your large balls`); + } else if (V.PC.scrotum > 0) { + r.push(`weight of your balls`); + } else { + r.push(`tender skin at your base`); + } + r.push(`with ${his} ${feet},`); + } + r.push(`shivering in anticipation.`); + } else if (slave.fetish === "humiliation" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) { + r.push(`${slave.slaveName}`); + r.push(`slowly strokes your cock with ${his} ${feet}, getting off on the degrading use of ${his} ${feet} and avoiding your gaze. ${He} is showing an embarrassed smile${skinToneLevel(slave.skin) > 22 ? `, and if ${his} skin was any lighter you would see ${his}` : `and`} bright blushing cheeks.`); + } else if (slave.fetish === "boobs" && slave.fetishKnown === 1 && slave.fetishStrength >= 60 && hasAnyArms(slave)) { + r.push(`As ${slave.slaveName} deftly strokes your cock with ${his} ${feet}, ${his} ${hasBothArms(slave) ? `hands play` : `hand plays`} with ${his}`); + if (slave.boobs < 300) { + r.push(`erect nipples.`); + } else if (slave.boobs < 500) { + r.push(`small chest.`); + } else if (slave.boobs >= 18000) { + r.push(`${_boobs} breasts, though ${he} can't reach ${his} nipples.`); + } else { + r.push(`${_boobs} breasts and erect nipples.`); + } + r.push(`${He} is certainly giving you plenty of sexy options for you to watch.`); + } else if (slave.fetish === "sadist" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) { + r.push(`${slave.slaveName} is a sadist, and ${his} deft footjob toys with the boundaries of pain and pleasure. ${His} devoted yet belittling`); + if (canSee(slave)) { + r.push(`gaze carefully watches your face`); + } else { + r.push(`expressions are clear as ${he} feels`); + } + r.push(`for every reaction.`); + } else if (slave.fetish === "dom" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) { + r.push(`${slave.slaveName} is a dominant and ${his} skilled ${feet} roughly stroke your erect cock, but ${he} pauses often to rub ${his} ${hasBothLegs(slave) ? `soles` : `sole`}`); + if (V.PC.balls >= 10) { + r.push(`on your massive balls`); + } else if (V.PC.balls >= 5) { + r.push(`on your large balls`); + } else if (V.PC.scrotum > 0) { + r.push(`on your balls`); + } else { + r.push(`around your hidden balls`); + } + r.push(`so ${he} doesn't get too aggressive with ${his} ${getWrittenTitle(slave)}.`); + } else if (slave.fetish === "pregnancy" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) { + r.push(`${slave.slaveName} skillfully strokes your cock with ${his} `); + if (hasAnyArms(slave)) { + r.push(`${feet},`); + if (hasBothArms(slave)) { + r.push(`one of`); + } + r.push(`${his} ${hasBothArms(slave) ? `hands` : `hand`} roaming across ${his} ${_belly} belly as ${he} happily services you.`); + } else { + r.push(`${feet}.`); + } + r.push(`${He} occasionally pauses to`); + if (canSee(slave)) { + r.push(`watch`); + } else { + r.push(`feel`); + } + r.push(`your`); + if (V.PC.balls >= 10) { + r.push(`massive balls`); + } else if (V.PC.balls >= 5) { + r.push(`large balls`); + } else if (V.PC.scrotum > 0) { + r.push(`balls`); + } else { + r.push(`pubic mound`); + } + r.push(`churn with sperm, clearly lost in a pregnancy fantasy.`); + } else { + r.push(`${slave.slaveName} skillfully strokes your cock with ${his} ${feet}, trying ${his} best to bring you pleasure.`); + } + } + if (getLegCount(slave, 3) + getLegCount(slave, 6) > 0) { + r.push(`As you enjoy your footjob ${his} capable prosthetics begin to vibrate on your cock.`); + } else if (getLegCount(slave, 4)) { + r.push(`The hard angles of ${his} metal ${feet} provide extra stimulation.`); + } + + // Extra 2: if not mindbroken/immobile, tease with a flash. + if (slave.fetish !== "mindbroken" && canWalk(slave) && slave.sexualQuirk === "tease" && slave.devotion >= 60) { + if (canSee(slave)) { + r.push(`Seeing`); + } else { + r.push(`Feeling`); + } + r.push(`you near your orgasm, ${he}`); + if (_footSeed < 40 && hasAnyArms(slave)) { + if (slave.boobs < 300) { + r.push(`presses ${his} ${hasBothArms(slave) ? `hands` : `hand`} on ${his} flat chest,`); + } else if (slave.boobs < 500) { + r.push(`puts ${his} ${hasBothArms(slave) ? `hands` : `hand`} under ${his} small chest,`); + } else { + r.push(`cups ${his} ${_boobs} breasts with ${his} ${hasBothArms(slave) ? `hands` : `hand`},`); + } + r.push(`then sticks out ${his} tongue, posing like a Free Cities whore who wants a cumshot.`); + } else if (_footSeed < 70 && !(slave.chastityPenis) && !(slave.chastityVagina) && (slave.dick > 0 || slave.vagina >= 0 )) { + r.push(`spreads ${his} ${legsAdj} ${legs}`); + if (slave.dick > 0) { + if (slave.vagina >= 0) { + r.push(`and raises ${his} ${dickAdj}`); + if (canAchieveErection(slave)) { + r.push(`erect`); + } else { + r.push(`soft`); + } + r.push(`cock`); + if (slave.balls > 0 && slave.scrotum > 0) { + r.push(`and ${ballsDesc} balls`); + } + r.push(`to reveal ${his}`); + if (slave.vaginaLube === 1) { + r.push(`wet`); + } else if (slave.vaginaLube === 2) { + r.push(`dripping wet`); + } + r.push(`aroused vagina`); + } else { + r.push(`and teases the tip of ${his} ${dickAdj}`); + if (canAchieveErection(slave)) { + r.push(`throbbing`); + } else { + r.push(`soft`); + } + r.push(`dick`); + } + } else { + r.push(`to reveal ${his}`); + if (slave.vaginaLube === 1) { + r.push(`wet`); + } else if (slave.vaginaLube === 2) { + r.push(`dripping wet`); + } + r.push(`aroused vagina, then ${he} spreads ${his}`); + if (slave.labia === 3) { + r.push(`extremely large`); + } else if (slave.labia === 2) { + r.push(`large`); + } else if (slave.labia === 1) { + r.push(`pretty`); + } else { + r.push(`minimal`); + } + r.push(`pussylips`); + } + r.push(`with a sultry smile.`); + } else { + r.push(`rolls onto ${his} side while still stroking your dick, revealing ${his} ${buttAdj} ass, ${_hips} hips and ${thighsAdj} thighs with a sultry smile.`); + } + } + + // PC orgasms + if (slave.fetish === "mindbroken") { + r.push(`You eventually cum all over ${his} ${skin}`); + if (V.PC.balls >= 9) { + r.push(`${feet} ${legsAdj} ${legs}, and even ${_belly} belly with your massive load.`); + } else if (V.PC.balls >= 5) { + r.push(`${feet} and ${legsAdj} ${legs} with your large load.`); + } else { + r.push(`${feet}.`); + } + } else if (!canWalk(slave)) { + if (slave.devotion < -50) { + r.push(`You eventually cum all over ${his} ${skin} ${feet}`); + if (V.PC.balls >= 9) { + r.push(`${legsAdj} ${legs}, and even ${his} side with your massive load`); + } else if (V.PC.balls >= 5) { + r.push(`and ${legsAdj} ${legs} with your large load`); + } + r.push(`as ${he} struggles in your grasp. ${He} is furious that ${he} is now covered in cum ${he} can't easily reach to clean.`); + } else if (slave.devotion < -20) { + r.push(`You eventually cum all over ${his} ${skin}`); + if (V.PC.balls >= 9) { + r.push(`${feet} ${legsAdj} ${legs}, and even ${his} side with your massive load`); + } else if (V.PC.balls >= 5) { + r.push(`${feet} and ${legsAdj} ${legs} with your large load`); + } else { + r.push(`${feet}.`); + } + r.push(`${He} was startled by your orgasm and now wears a conflicted expression, but you are done using ${him} for now. ${He} is left covered in cum ${he} can't easily reach to clean.`); + } else if (slave.devotion <= 20) { + r.push(`You eventually cum all over ${his} ${skin} ${feet}`); + if (V.PC.balls >= 9) { + r.push(`${legsAdj} ${legs}, and even ${his} side with your massive load`); + } else if (V.PC.balls >= 5) { + r.push(`and ${legsAdj} ${legs} with your large load`); + } + r.push(`as ${he} sighs in nervous relief.`); + } else if (slave.devotion < 60 || (slave.sexualQuirk === "unflinching" && slave.devotion <= 20)) { + r.push(`You eventually cum all over ${his} ${skin} ${feet}`); + if (V.PC.balls >= 9) { + r.push(`${legsAdj} ${legs}, and even ${his} side with your massive load`); + } else if (V.PC.balls >= 5) { + r.push(`and ${legsAdj} ${legs} with your large load`); + } + r.push(`as ${he} rises to an elbow to smile at you.`); + } else { + if (slave.trust < -50) { + r.push(`${His} lack of trust causes ${his} eyes to glaze over in fear.`); + } else { + r.push(`You eventually cum all over ${his} ${skin} ${feet}`); + if (V.PC.balls >= 9) { + r.push(`${legsAdj} ${legs}, and even ${his} side with your massive load`); + } else if (V.PC.balls >= 5) { + r.push(`and ${legsAdj} ${legs} with your large load`); + } + r.push(`as ${he} moans in pleasure.`); + } + } + } else if (slave.devotion < -50) { + r.push(`You eventually cum all over ${his} ${skin} ${feet}`); + if (V.PC.balls >= 9) { + r.push(`${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`); + } else if (V.PC.balls >= 5) { + r.push(`and ${legsAdj} ${legs} with your large load`); + } + r.push(`as ${he} struggles in your grasp with a look of disgust.`); + } else if (slave.devotion < -20) { + r.push(`You eventually cum all over ${his} ${skin}`); + if (V.PC.balls >= 9) { + r.push(`${feet} ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load,`); + } else if (V.PC.balls >= 5) { + r.push(`${feet} and ${legsAdj} ${legs} with your large load,`); + } else { + r.push(`${feet},`); + } + r.push(`${He} was startled by your orgasm and now wears a conflicted expression, as well as your cum, but you are done using ${him} for now.`); + } else if (slave.devotion <= 20) { + r.push(`You eventually cum all over ${his} ${skin} ${feet}`); + if (V.PC.balls >= 9) { + r.push(`${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`); + } else if (V.PC.balls >= 5) { + r.push(`and ${legsAdj} ${legs} with your large load`); + } + r.push(`as ${he} sighs in nervous relief.`); + } else if (slave.devotion < 60 || slave.attrXY < 16 || (slave.sexualQuirk === "unflinching" && slave.devotion <= 20)) { + r.push(`You eventually cum all over ${his} ${skin}`); + if (V.PC.balls >= 9) { + r.push(`${feet} ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load,`); + } else if (V.PC.balls >= 5) { + r.push(`${feet} and ${legsAdj} ${legs} with your large load,`); + } else { + r.push(`${feet},`); + } + r.push(`and ${he} does ${his} best to catch your semen on ${his} ${legs}.`); + } else { + if (slave.fetish === "cumslut" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) { + r.push(`When you eventually cum, ${slave.slaveName} giggles in lustful joy as your hot cum coats ${his} ${skin}`); + if (V.PC.balls >= 5) { + r.push(`${feet} and quickly slides from your desk to kneel in front of your pulsating cock.`); + if (V.PC.balls >= 9) { + r.push(`Your massive load quickly covers ${his} face as ${he} moans and twitches in pleasure, semen dripping down ${his}`); + if (slave.boobs < 300) { + r.push(`flat chest`); + } else if (slave.boobs < 500) { + r.push(`small chest`); + } else { + r.push(`${_boobs} breasts`); + } + r.push(`and ${_belly} belly onto ${his} thighs.`); + } else { + r.push(`Your large load coats ${his} face in sticky semen, some dripping onto ${his}`); + if (slave.boobs < 300) { + r.push(`flat chest.`); + } else if (slave.boobs < 500) { + r.push(`small chest.`); + } else { + r.push(`${_boobs} breasts.`); + } + } + } else { + r.push(`${feet}.`); + } + } else if (slave.fetish === "humiliation" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) { + r.push(`You eventually cum all over ${his} ${skin}`); + if (V.PC.balls >= 9) { + r.push(`${feet} ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`); + } else if (V.PC.balls >= 5) { + r.push(`${feet} and ${legsAdj} ${legs} with your large load`); + } else { + r.push(`${feet},`); + } + r.push(`and ${he} whimpers as even ${his} ${feet} used as a sex object.`); + } else if (slave.fetish === "submissive" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) { + r.push(`You eventually cum all over ${his} ${skin}`); + if (V.PC.balls >= 9) { + r.push(`${feet} ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`); + } else if (V.PC.balls >= 5) { + r.push(`${feet} and ${legsAdj} ${legs} with your large load`); + } else { + r.push(`${feet},`); + } + r.push(`and ${he} gasps as ${he} submissively accepts your semen on ${his} skin.`); + } else if (slave.fetish === "buttslut" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) { + r.push(`When you eventually cum, ${slave.slaveName} moans as your semen lands on ${his} ${skin} ${feet},`); + if (V.PC.balls >= 5) { + r.push(`but quickly turns to present ${his} ${buttAdj} ass and ${_hips} hips as a new target.`); + if (V.PC.balls >= 9) { + r.push(`Your massive load quickly covers ${his} ${thighsAdj} ass and thighs, sticky cum dripping all the way to ${his} calves.`); + } else { + r.push(`Your large load soaks ${his} ${thighsAdj} ass and thighs in sticky semen, which drips down ${his} ${legsAdj} ${legs}.`); + } + } else { + r.push(`but you know ${he} wanted to involve ${his} ${buttAdj} butt and your cum, if your orgasm had more volume.`); + } + } else if (slave.fetish === "boobs" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) { + r.push(`You eventually cum all over ${his} ${skin} ${feet}`); + if (V.PC.balls >= 9) { + r.push(r.pop() + `, ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`); + } else if (V.PC.balls >= 5) { + r.push(`and ${legsAdj} ${legs} with your large load`); + } + r.push(r.pop() + `, and ${he}`); + if (slave.boobs < 300) { + r.push(`pinches both ${his} erect nipples`); + } else if (slave.boobs < 500) { + r.push(`rubs ${his} ${hasBothArms(slave) ? `hands` : `hand`} across ${his} small chest`); + } else { + r.push(`squeezes ${his} ${_boobs} breasts tightly`); + } + r.push(`while moaning in pleasure.`); + } else if (slave.fetish === "sadist" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) { + r.push(`You eventually cum all over ${his} ${skin} ${feet}`); + if (V.PC.balls >= 9) { + r.push(r.pop() + `, ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`); + } else if (V.PC.balls >= 5) { + r.push(`and ${legsAdj} ${legs} with your large load`); + } + r.push(r.pop() + `, and ${he} gasps slightly and condescendingly smiles as you soil ${his} ${feet} with semen.`); + } else if (slave.fetish === "dom" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) { + r.push(`You eventually cum all over ${his} ${skin} ${feet}`); + if (V.PC.balls >= 9) { + r.push(r.pop() + `, ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`); + } else if (V.PC.balls >= 5) { + r.push(`and ${legsAdj} ${legs} with your large load`); + } + r.push(r.pop() + `, and ${he} gasps slightly and holds your cock between ${his} ${feet} tightly as you soil ${him} with semen.`); + } else if (slave.fetish === "pregnancy" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) { + r.push(`When you start to cum, ${slave.slaveName} moves ${his} hand from ${his} belly to`); + if (slave.vagina >= 0) { + r.push(`expose ${his} vagina and spreads ${his}`); + if (slave.labia === 3) { + r.push(`extremely large`); + } else if (slave.labia === 2) { + r.push(`large`); + } else if (slave.labia === 1) { + r.push(`pretty`); + } else { + r.push(`minimal`); + } + r.push(`pussylips to show where ${he} wants cum.`); + } else if (slave.mpreg === 1) { + r.push(`expose ${his}`); + if (slave.anus > 3 ) { + r.push(`gaping`); + } else if (slave.anus > 2 ) { + r.push(`very loose`); + } else if (slave.anus > 1 ) { + r.push(`loose`); + } else if (slave.anus > 0 ) { + r.push(`tight`); + } else { + r.push(`virgin`); + } + r.push(`asshole to show where ${he} wants cum.`); + } else { + r.push(`hug ${his} stomach.`); + } + r.push(`Your orgasm shoots across ${his} ${skin}`); + if (V.PC.balls >= 9) { + r.push(`${feet}, ${legsAdj} ${legs}, and even ${his} ${_belly} belly is marked with your massive load. ${He} runs ${his} ${hasBothArms(slave) ? `hands` : `hand`} through the cum on ${his} belly, massaging the semen into ${his} skin.`); + } else if (V.PC.balls >= 5) { + r.push(`${feet} and ${legsAdj} ${legs}.`); + } else { + r.push(`${feet}.`); + } + } else { + r.push(`You eventually cum all over ${his} ${skin} ${feet}`); + if (V.PC.balls >= 9) { + r.push(r.pop() + `, ${legsAdj} ${legs}, and even ${his} ${_belly} belly with your massive load`); + } else if (V.PC.balls >= 5) { + r.push(`and ${legsAdj} ${legs} with your large load`); + } + r.push(r.pop() + `, and ${he} moans softly in pleasure as ${he} feels your hot semen run down ${his} ${hasBothLegs(slave) ? `soles` : `sole`}.`); + } + } + + // Extra 3: devoted perverted slave giggles and orgasms + if (slave.fetish !== "mindbroken" && canWalk(slave) && slave.sexualQuirk === "perverted" && slave.devotion >= 60 && !(slave.fetish === "cumslut" && slave.fetishKnown === 1 && slave.fetishStrength >= 60)) { + r.push(`${He} was getting off on the footjob, but the feeling of your cum on`); + if (slave.fetish === "buttslut" && slave.fetishKnown === 1 && slave.fetishStrength >= 60 && V.PC.balls >= 5) { + r.push(`${his} ass and thighs sets off a strong orgasm of ${his} own, ${his} ${thighsAdj} ${legs} quivering as`); + if (slave.dick > 0) { + if (slave.vagina >= 0) { + if (cumAmount(slave) > 20) { + r.push(`${his} ${dickAdj} dick unloads a massive amount of cum, swollen ${ballsDesc} testicles bulging between ${his} thighs,`); + if (slave.vaginaLube === 1) { + r.push(`wet`); + } else if (slave.vaginaLube === 2) { + r.push(`dripping wet`); + } + r.push(`pussy and asshole clenching as ${he} makes a cum puddle on the floor which splashes with every spasm.`); + } else { + r.push(`${his} ${dickAdj} dick spurts ${his} load, ${his}`); + if (slave.vaginaLube === 1) { + r.push(`wet`); + } else if (slave.vaginaLube === 2) { + r.push(`dripping wet`); + } + r.push(`pussy and asshole clenching.`); + } + } else { + if (cumAmount(slave) > 20) { + r.push(`${he} strokes ${his} ${dickAdj} penis, swollen ${ballsDesc} testicles bulging between ${his} thighs, asshole clenching as ${his} massive cumshot splashes noisily onto the floor.`); + } else { + r.push(`${he} strokes ${his} ${dickAdj} penis, asshole clenching as ${his} cum spurts onto the floor.`); + } + } + } else if (slave.vagina >= 0) { + r.push(`${he} moans in pleasure, ${his}`); + if (slave.vaginaLube === 1) { + r.push(`wet`); + } else if (slave.vaginaLube === 2) { + r.push(`dripping wet`); + } + r.push(`pussy and asshole clenching as ${he} tries to remain standing.`); + } else { + r.push(`${he} moans in pleasure, asshole pulsating as ${he} tries to remain standing.`); + } + } else { + r.push(`${his} ${legs}`); + if (V.PC.balls >= 2) { + r.push(`and belly`); + } + r.push(`sets off a strong orgasm of ${his} own, even without masturbating.`); + if (slave.dick > 0) { // dick shoots + if (cumAmount(slave) > 20) { // huge load + r.push(`${His} ${dickAdj} dick unloads a massive amount of cum, adding ${his} own semen to ${his} body, resulting in a slave covered nearly head to toe in spunk.`); + } else { + r.push(`${His} ${dickAdj} dick unloads onto ${his} belly and ${_boobs} chest, and ${he} giggles and gasps as it rains down.`); + } + } else if (slave.vagina >= 0) { + r.push(`${He} leans back and moans in pleasure, showing ${his}`); + if (slave.vaginaLube === 1) { + r.push(`wet`); + } else if (slave.vaginaLube === 2) { + r.push(`dripping wet`); + } + r.push(`pussy and asshole clenching.`); + } else { + r.push(`${He} leans back and moans in pleasure, showing ${his} asshole pulsating.`); + } + } + if (slave.vaginaLube >= 1) { + r.push(`After ${he} leaves, you find a`); + if (slave.vaginaLube >= 2) { + r.push(`large`); + } + r.push(`puddle of pussyjuice on your desk where ${he} was sitting.`); + } + } + + if (slave.fetish === "cumslut" && slave.fetishKnown === 1 && slave.fetishStrength >= 60) { + if (V.PC.balls > 5) { + if (slave.dick > 0) { + if (cumAmount(slave) > 20) { + r.push(`${His} ${ballsDesc} balls visibly throb as ${dickAdj} dick unloads a massive amount of cum, adding ${his} own semen to ${his} body, resulting in a slave utterly plastered in spunk. ${His} eyes are held shut with a thick layer of cum, and judging by how`); + if (slave.chastityPenis === 1) { + r.push(`${his} dick is still shooting cum even in a cage with no stimulation,`); + } else { + r.push(`furiously ${he} is masturbating,`); + } + r.push(`${he} couldn't be happier.`); + } else { + r.push(`${His} ${dickAdj} dick unloads onto ${his} belly and ${_boobs} chest, and ${he} giggles and gasps as it rains down with audible splats. ${He} is splattered in semen, face coated in your cum, and judging by`); + if (canSmell(slave)) { + r.push(`${his} nostrils desperately taking in the heady smell and`); + } + r.push(`how`); + if (slave.chastityPenis === 1) { + r.push(`${his} dick is still throbbing in orgasm even in a cage with no stimulation,`); + } else { + r.push(`${he} can't stop masturbating,`); + } + r.push(`${he} couldn't be happier.`); + } + } else if (slave.vagina >= 0) { + r.push(`${He} leans back and moans in pleasure, ${his}`); + if (slave.vaginaLube === 1) { + r.push(`wet`); + } else if (slave.vaginaLube === 2) { + r.push(`dripping wet`); + } + r.push(`pussy and asshole clenching. ${He} is splattered in semen, face coated in your cum, and judging by`); + if (canSmell(slave)) { + r.push(`${his} nostrils desperately taking in your scent and`); + } + r.push(`how ${he} can't stop masturbating, ${he} couldn't be happier.`); + } else { + r.push(`${He} leans back and moans in pleasure, asshole pulsating. ${He} is splattered in semen, face coated in your cum, and judging by`); + if (canSmell(slave)) { + r.push(`${his} nostrils desperately taking in your scent and`); + } + r.push(`how ${he} can't stop masturbating, ${he} couldn't be happier.`); + } + } else { + r.push(`${slave.slaveName}`); + r.push(`leans down to wipe semen off ${his} ${feet}, quickly bringing it into ${his} mouth with a blissful look as ${he}`); + if (canTaste(slave)) { + r.push(`tastes`); + } else { + r.push(`feels`); + } + r.push(`your cum and sighs in pleasure.`); + } + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fFeet.tw b/src/npc/interaction/fFeet.tw deleted file mode 100644 index 5b5f1ed9b97def92033f104e473565f3d2dd8b31..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fFeet.tw +++ /dev/null @@ -1,617 +0,0 @@ -:: FFeet [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run getSlave($AS).partners.add(-1)>> - -<<set _footSeed = random(1,100)>> - -<<if getSlave($AS).weight > 190>> - <<set _thighs = "massive flabby">> -<<elseif getSlave($AS).weight > 160>> - <<set _thighs = "thick flabby">> -<<elseif getSlave($AS).weight > 130>> - <<set _thighs = "flabby">> -<<elseif getSlave($AS).weight > 95>> - <<set _thighs = "fat">> -<<elseif getSlave($AS).weight > 30>> - <<if getSlave($AS).muscles > 75>> - <<set _thighs = "toned fat">> - <<elseif getSlave($AS).muscles < 15>> - <<set _thighs = "fat">> - <<else>> - <<set _thighs = "plush">> - <</if>> -<<elseif getSlave($AS).weight > 10>> - <<if getSlave($AS).muscles > 70>> - <<set _thighs = "thick muscular">> - <<elseif getSlave($AS).muscles > 20>> - <<set _thighs = "soft toned">> - <<else>> - <<set _thighs = "soft">> - <</if>> -<<elseif getSlave($AS).weight >= -10>> - <<if getSlave($AS).muscles > 70>> - <<set _thighs = "muscular">> - <<elseif getSlave($AS).muscles > 20>> - <<set _thighs = "toned">> - <<else>> - <<set _thighs = "average">> - <</if>> -<<elseif getSlave($AS).weight >= -30>> - <<if getSlave($AS).muscles > 40>> - <<set _thighs = "thin muscular">> - <<elseif getSlave($AS).muscles > 20>> - <<set _thighs = "toned model's">> - <<else>> - <<set _thighs = "model's">> - <</if>> -<<else>> - <<if getSlave($AS).muscles > 5>> - <<set _thighs = "emaciated toned">> - <<else>> - <<set _thighs = "emaciated">> - <</if>> -<</if>> - -<<if getSlave($AS).belly < 1500>> - <<set _belly = _thighs>> -<<else>> - <<set _belly = bellyAdjective(getSlave($AS))>> -<</if>> - -<<if getSlave($AS).height >= 185>> - <<set _legs = "wonderfully long">> -<<elseif getSlave($AS).height >= 170>> - <<set _legs = "long">> -<<elseif getSlave($AS).height >= 160>> - <<set _legs = "nice">> -<<elseif getSlave($AS).height >= 150>> - <<set _legs = "short">> -<<else>> - <<set _legs = "short little">> -<</if>> - -<<if getSlave($AS).boobs >= 30000>> - <<set _boobsA = "skip">> - <<set _boobs = "room filling">> -<<elseif getSlave($AS).boobs >= 20000>> - <<set _boobsA = "beanbag sized">> -<<elseif getSlave($AS).boobs >= 8500>> - <<set _boobsA = "obscenely massive">> -<<elseif getSlave($AS).boobs >= 8000>> - <<set _boobsA = "Z-cup">> -<<elseif getSlave($AS).boobs >= 7500>> - <<set _boobsA = "Y-cup">> -<<elseif getSlave($AS).boobs >= 7000>> - <<set _boobsA = "X-cup">> -<<elseif getSlave($AS).boobs >= 6500>> - <<set _boobsA = "V-cup">> -<<elseif getSlave($AS).boobs >= 5500>> - <<set _boobsA = "U-cup">> -<<elseif getSlave($AS).boobs >= 5100>> - <<set _boobsA = "T-cup">> -<<elseif getSlave($AS).boobs >= 4700>> - <<set _boobsA = "S-cup">> -<<elseif getSlave($AS).boobs >= 4300>> - <<set _boobsA = "R-cup">> -<<elseif getSlave($AS).boobs >= 3950>> - <<set _boobsA = "Q-cup">> -<<elseif getSlave($AS).boobs >= 3600>> - <<set _boobsA = "P-cup">> -<<elseif getSlave($AS).boobs >= 3250>> - <<set _boobsA = "O-cup">> -<<elseif getSlave($AS).boobs >= 2900>> - <<set _boobsA = "N-cup">> -<<elseif getSlave($AS).boobs >= 2600>> - <<set _boobsA = "M-cup">> -<<elseif getSlave($AS).boobs >= 2300>> - <<set _boobsA = "L-cup">> -<<elseif getSlave($AS).boobs >= 2050>> - <<set _boobsA = "K-cup">> -<<elseif getSlave($AS).boobs >= 1800>> - <<set _boobsA = "J-cup">> -<<elseif getSlave($AS).boobs >= 1600>> - <<set _boobsA = "I-cup">> -<<elseif getSlave($AS).boobs >= 1400>> - <<set _boobsA = "H-cup">> -<<elseif getSlave($AS).boobs >= 1200>> - <<set _boobsA = "G-cup">> -<<elseif getSlave($AS).boobs >= 1000>> - <<set _boobsA = "F-cup">> -<<elseif getSlave($AS).boobs >= 800>> - <<set _boobsA = "DD-cup">> -<<elseif getSlave($AS).boobs >= 650>> - <<set _boobsA = "D-cup">> -<<elseif getSlave($AS).boobs >= 400>> - <<set _boobsA = "C-cup">> -<<elseif getSlave($AS).boobs >= 300>> - <<set _boobsA = "B-cup">> -<<else>> - <<set _boobsA = "skip">> - <<set _boobs = "flat">> -<</if>> -<<if _boobsA != "skip">> - <<set _boobs = _boobsA + " " + getSlave($AS).boobShape>> -<</if>> - -<<if getSlave($AS).balls == 1>> - <<set _balls = "vestigial">> -<<elseif getSlave($AS).balls == 2>> - <<set _balls = "small">> -<<elseif getSlave($AS).balls == 3>> - <<set _balls = "average">> -<<elseif getSlave($AS).balls == 4>> - <<set _balls = "large">> -<<elseif getSlave($AS).balls == 5>> - <<set _balls = "massive">> -<<elseif getSlave($AS).balls == 6>> - <<set _balls = "huge">> -<<elseif getSlave($AS).balls == 7>> - <<set _balls = "giant">> -<<elseif getSlave($AS).balls == 8>> - <<set _balls = "enormous">> -<<elseif getSlave($AS).balls == 9>> - <<set _balls = "monstrous">> -<<else>> - <<set _balls = "overly massive">> -<</if>> - -<<if getSlave($AS).dick == 1>> - <<set _dick = "tiny">> -<<elseif getSlave($AS).dick == 2>> - <<set _dick = "little">> -<<elseif getSlave($AS).dick == 3>> - <<set _dick = "average">> -<<elseif getSlave($AS).dick == 4>> - <<set _dick = "big">> -<<elseif getSlave($AS).dick == 5>> - <<set _dick = "huge">> -<<elseif getSlave($AS).dick == 6>> - <<set _dick = "gigantic">> -<<elseif getSlave($AS).dick == 7>> - <<set _dick = "massive">> -<<elseif getSlave($AS).dick == 8>> - <<set _dick = "horse-sized">> -<<elseif getSlave($AS).dick == 9>> - <<set _dick = "monstrous">> -<<elseif getSlave($AS).dick == 10>> - <<set _dick = "inhuman">> -<<else>> - <<set _dick = "hypertrophied">> -<</if>> - -<<if getSlave($AS).butt < 1>> - <<set _butt = "flat">> -<<elseif getSlave($AS).butt < 2>> - <<set _butt = "small">> -<<elseif getSlave($AS).butt < 3>> - <<set _butt = "plump">> -<<elseif getSlave($AS).butt < 4>> - <<set _butt = "big bubble">> -<<elseif getSlave($AS).butt < 5>> - <<set _butt = "huge">> -<<elseif getSlave($AS).butt < 6>> - <<set _butt = "enormous">> -<<elseif getSlave($AS).butt < 7>> - <<set _butt = "gigantic">> -<<elseif getSlave($AS).butt < 8>> - <<set _butt = "ridiculous">> -<<elseif getSlave($AS).butt < 10>> - <<set _butt = "immense">> -<<else>> - <<set _butt = "inhuman">> -<</if>> - -<<if getSlave($AS).hips > 2>> - <<set _hips = "inhumanly wide">> -<<elseif getSlave($AS).hips > 1>> - <<set _hips = "very wide">> -<<elseif getSlave($AS).hips > 0>> - <<set _hips = "wide">> -<<elseif getSlave($AS).hips > -1>> - <<set _hips = "ample">> -<<elseif getSlave($AS).hips > -2>> - <<set _hips = "narrow">> -<<else>> - <<set _hips = "very narrow">> -<</if>> - -<<if (getSlave($AS).skin == getSlave($AS).race) || (getSlave($AS).race == "white") || (getSlave($AS).race == "black") || ($seeRace == 0)>> - <<set _skin = getSlave($AS).skin>> -<<else>> - <<set _skin = getSlave($AS).skin + " " + getSlave($AS).race>> -<</if>> - -<<if hasBothLegs(getSlave($AS))>> - <<set _nounL = "legs">> - <<set _nounF = "feet">> -<<else>> - <<set _nounL = "leg">> - <<set _nounF = "foot">> -<</if>> - - -/*Part 1: Order and reaction*/ -You call <<= getSlave($AS).slaveName>> to your office, telling $him to use $his _nounF to please you. -<<if (getSlave($AS).fetish == "mindbroken")>> - $He is brought to you and stands blankly by your desk. -<<elseif (getSlave($AS).relationship == -3 && getSlave($AS).devotion >= 60 )>> - Your devoted slave $wife is delighted to get another chance to pleasure you. -<<elseif (getSlave($AS).relationship == -2 && getSlave($AS).devotion >= 60 )>> - $He considers $himself your lover, and is delighted to spend time with you. -<<elseif (getSlave($AS).devotion < -50)>> - $He strongly refuses, and you have to restrain $him to get $him to obey. -<<elseif (getSlave($AS).devotion < -20)>> - $He tries to refuse, but decides it will just be easier to comply than risk punishment. -<<elseif (getSlave($AS).devotion <= 20)>> - $He doesn't seem eager to comply, but fears being punished enough to obey. -<<elseif (getSlave($AS).devotion < 60)>> - $He complies quietly. -<<else>> - <<if (getSlave($AS).trust < -50)>> - Although $he just barely trusts that you will not harm $him, $he is still unsure about what you are going to do which makes $him pause. - <<else>> - $He rushes to comply. - <</if>> -<</if>> - -/*Extra 1 if tease/perverted and not mindbroken*/ -<<if (getSlave($AS).sexualQuirk == "tease" || getSlave($AS).sexualQuirk == "perverted") && getSlave($AS).devotion > 60 && getSlave($AS).fetish != "mindbroken">> - Before you can begin, $he arches <<if hasBothLegs(getSlave($AS))>>a<<else>>$his<</if>> leg in a seductive tease. -<</if>> -/*Part 2: lube and reaction*/ -<<if !canWalk(getSlave($AS))>> - <<if tooBigBreasts(getSlave($AS))>> - Since $he is immobilized by $his _boobs boobs, you have $him lay on $his side on the floor, - <<elseif tooBigBelly(getSlave($AS))>> - Since $he is immobilized by $his <<if getSlave($AS).bellyPreg >= 3000>>hugely gravid<<elseif getSlave($AS).bellyImplant >= 3000>>_belly protruding<<else>>heavy <<print getSlave($AS).inflationType>>-filled<</if>> belly, you have $he lay on $his side on the floor, - <<elseif tooBigDick(getSlave($AS))>> - Since $he is immobilized by $his _dick dick, you have $him lay on $his side on the floor, - <<elseif tooBigButt(getSlave($AS))>> - Since $he is immobilized by $his _dick dick, you have $him sit on your desk to present $his _legs _nounL and _nounF, - <<elseif tooBigBalls(getSlave($AS))>> - Since $he is immobilized by $his _balls balls, you have $him lay on $his back on the floor with $his _nounL over $his nuts, - <<else>> - You have $him sit on the edge of your desk to present $his _legs _nounL and _nounF, - <</if>> -<<else>> - You have $him sit on the edge of your desk to present $his _legs _nounL and _nounF, -<</if>> -<<if getLegCount(getSlave($AS), 4) + getLegCount(getSlave($AS), 6) === 2>> - then pour lubricant onto your hands, applying it to $his elegant artificial _nounF. -<<elseif getLegCount(getSlave($AS), 5) === 2>> - then pour lubricant onto your hands, applying it to $his deadly artificial _nounF. -<<elseif hasBothLegs(getSlave($AS)) && !hasAnyNaturalLegs(getSlave($AS))>> - then pour lubricant onto your hands, applying it to $his artificial _nounF. -<<else>> - then pour lubricant onto your hands, massaging it into $his <<= getSlave($AS).skin>> _nounF: rubbing $his arch<<if hasBothLegs(getSlave($AS))>>es<</if>>, sole<<if hasBothLegs(getSlave($AS))>>s<</if>>, and toes. -<</if>> -<<if getSlave($AS).fetish == "mindbroken">> - $He shows little reaction to your efforts. -<<else>>/*not mindbroken*/ - <<if (getSlave($AS).devotion < -50)>> - $He tries to stay hateful despite the pleasurable stimulation. - <<elseif (getSlave($AS).devotion < -20)>> - $He is mostly quiet, but occasionally stifles a moan. - <<elseif (getSlave($AS).devotion > 20 && getSlave($AS).sexualFlaw == "shamefast")>> - $He <<if (hasAnyArms(getSlave($AS)))>>hides $his face in $his hand<<if (hasBothArms(getSlave($AS)))>>s<</if>><<else>>attempts to hide $his face<</if>> in shame at $his nudity, but occasionally a moan breaks out. - <<elseif (getSlave($AS).devotion <= 20)>> - $He seems a bit surprised by the attention, occasionally letting out a moan. - <<else>> - <<if (getSlave($AS).trust < -50)>> - $He seems uncomfortable at your touch and frequently jerks away, spoiling the moment. - <<else>> - $He enjoys the massage, moaning in pleasure at your touch. - <</if>> - <</if>> -<</if>> /*close lube and reaction*/ - -/*Part 3: Actions, attraction/devotion and fetishes*/ -<<if getSlave($AS).fetish == "mindbroken">> - You hold $his _nounF and thrust between them as $he <<if canSee(getSlave($AS))>>watches you blankly. <<else>>points $his blind gaze at you. <</if>> -<<elseif !(canWalk(getSlave($AS)))>> - <<if (getSlave($AS).devotion < -50)>> - When $he refuses to serve, you take<<if hasBothLegs(getSlave($AS))>> both of<</if>> $his _nounF and start thrusting between them. - <<elseif (getSlave($AS).devotion < -20)>> - $He seems a bit reluctant when massaging you with $his _nounF so you have to do most of the work. - <<elseif (getSlave($AS).devotion <= 20)>> - $He tries to make it pleasurable for you, but the combination of the awkward angle and $his nervousness makes $him lose $his pacing often. - <<elseif (getSlave($AS).devotion < 60 || (getSlave($AS).sexualQuirk == "unflinching" && getSlave($AS).devotion <= 20))>> - $He does $his best to please you from $his position on $his side, massaging your cock nicely. - <<else>> - <<if (getSlave($AS).trust < -50)>> - $His lack of trust causes $him to ask "<<Master>>, is this pleasurable for you?", spoiling the moment. - <<else>> - $He moves $his _nounF hypnotically, trying $his hardest to make you cum. Being on $his side doesn't affect $his footjob, and you get a nice view of $his _legs _nounL as $he runs $his _nounF across your cock. - <</if>> - <</if>> - <<if !canWalk(getSlave($AS))>> - <<if getSlave($AS).boobs > getSlave($AS).belly >> - $His _boobs breasts wobble as $his _nounF service you. - <<else>> - $His _belly belly wobbles as $his _nounF service you. - <</if>> - <</if>> -<<elseif (getSlave($AS).devotion < -50)>> - When $he refuses to comply, you take both $his _nounF and start thrusting between them. -<<elseif (getSlave($AS).devotion < -20)>> - $He seems a bit reluctant when massaging you with $his _nounF so you have to do most of the work. -<<elseif (getSlave($AS).devotion <= 20)>> - $He tries to make it pleasurable for you, trying to find the right angle and speed, but $he seems a bit tense and ruins $his pacing. -<<elseif (getSlave($AS).devotion < 60 || (getSlave($AS).sexualQuirk == "unflinching" && getSlave($AS).devotion <= 20))>> - $He does $his best to please you, massaging you nicely with $his _nounF. -<<elseif (getSlave($AS).attrXY < 16)>> - $He tries to make it pleasurable for you, but $his great distaste for men is obvious on $his expression. -<<else>> - <<if getSlave($AS).sexualQuirk == "perverted">> - As a devoted pervert, <<= getSlave($AS).slaveName>> gives an enthusiastic footjob, with $his - <<if getSlave($AS).dick > 0>> - <<if canAchieveErection(getSlave($AS))>> - <<if (getSlave($AS).chastityPenis == 1)>> - erect caged _dick cock, - <<else>> - erect _dick cock, - <</if>> - <<else>> - soft and dripping _dick <<if (getSlave($AS).chastityPenis == 1)>>caged <</if>>dick, - <</if>> - <<if getSlave($AS).balls > 0 && getSlave($AS).scrotum > 0>> - <<if getSlave($AS).vagina >= 0>> - and pulsing _balls balls <<if getSlave($AS).vaginaLube > 0 && getSlave($AS).vagina >= 0>>that are wet from $his feminine arousal <</if>> - <</if>> - <<elseif getSlave($AS).vagina >= 0>> - and <<if getSlave($AS).vaginaLube == 1>>wet <<elseif getSlave($AS).vaginaLube == 2>>dripping wet <</if>>aroused vagina - <</if>> - <<elseif getSlave($AS).vagina >= 0>> - <<if getSlave($AS).vaginaLube == 1>>wet <<elseif getSlave($AS).vaginaLube == 2>>dripping wet <</if>>aroused vagina - <<else>> - perverted smile - <</if>> - showing $his sexual excitement to service your cock with $his _nounF. - <<elseif getSlave($AS).fetish == "cumslut" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60>> - As a devoted cumslut, <<= getSlave($AS).slaveName>> eagerly strokes your cock with $his _nounF, delightedly smearing your precum on $his sole<<if hasBothLegs(getSlave($AS))>>s<</if>>. $He - <<if canSee(getSlave($AS))>> - <<if $PC.balls >= 10>> - stares at your massive balls with a ravenous gaze, - <<elseif $PC.balls >= 5>> - stares at your large balls with a hungry gaze, - <<elseif $PC.scrotum > 0>> - stares at your balls with a steady gaze, - <<else>> - practically stares through you to your internal balls, - <</if>> - <<else>> - gingerly feels the - <<if $PC.balls >= 10>> - weight of your massive balls - <<elseif $PC.balls >= 5>> - weight of your large balls - <<elseif $PC.scrotum > 0>> - weight of your balls - <<else>> - tender skin at your base - <</if>> - with $his _nounF, - <</if>> - shivering in anticipation. - <<elseif getSlave($AS).fetish == "humiliation" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60>> - <<= getSlave($AS).slaveName>> slowly strokes your cock with $his _nounF, getting off on the degrading use of $his _nounF and avoiding your gaze. $He is showing an embarrassed smile<<if (skinToneLevel(getSlave($AS).skin) > 22)>>, and if $his skin was any lighter you would see $his<<else>> and<</if>> bright blushing cheeks. - <<elseif getSlave($AS).fetish == "boobs" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60 && hasAnyArms(getSlave($AS))>> - As <<= getSlave($AS).slaveName>> deftly strokes your cock with $his _nounF, $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> play<<if !hasBothArms(getSlave($AS))>>s<</if>> with $his <<if getSlave($AS).boobs < 300>>erect nipples. <<elseif getSlave($AS).boobs < 500>>small chest. <<elseif getSlave($AS).boobs >= 18000>>_boobs breasts, though $he can't reach $his nipples. <<else>>_boobs breasts and erect nipples. <</if>> $He is certainly giving you plenty of sexy options for you to watch. - <<elseif getSlave($AS).fetish == "sadist" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60>> - <<= getSlave($AS).slaveName>> is a sadist, and $his deft footjob toys with the boundaries of pain and pleasure. $His devoted yet belittling <<if canSee(getSlave($AS))>>gaze carefully watches your face<<else>>expressions are clear as $he feels<</if>> for every reaction. - <<elseif getSlave($AS).fetish == "dom" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60>> - <<= getSlave($AS).slaveName>> is a dominant and $his skilled _nounF roughly stroke your erect cock, but $he pauses often to rub $his sole<<if hasBothLegs(getSlave($AS))>>s<</if>> - <<if $PC.balls >= 10>> - on your massive balls - <<elseif $PC.balls >= 5>> - on your large balls - <<elseif $PC.scrotum > 0>> - on your balls - <<else>> - around your hidden balls - <</if>> - so $he doesn't get too aggressive with $his <<= getWrittenTitle(getSlave($AS))>>. - <<elseif getSlave($AS).fetish == "pregnancy" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60>> - <<= getSlave($AS).slaveName>> skillfully strokes your cock with $his _nounF<<if hasAnyArms(getSlave($AS))>>,<<if hasBothArms(getSlave($AS))>> one of<</if>> $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> roaming across $his _belly belly as $he happily services you<</if>>. $He occasionally pauses to <<if canSee(getSlave($AS))>>watch <<else>>feel <</if>>your - <<if $PC.balls >= 10>> - massive balls - <<elseif $PC.balls >= 5>> - large balls - <<elseif $PC.scrotum > 0>> - balls - <<else>> - pubic mound - <</if>> - churn with sperm, clearly lost in a pregnancy fantasy. - <<else>> - <<= getSlave($AS).slaveName>> skillfully strokes your cock with $his _nounF, trying $his best to bring you pleasure. - <</if>> -<</if>> -<<if getLegCount(getSlave($AS), 3) + getLegCount(getSlave($AS), 6) > 0>> - As you enjoy your footjob $his capable prosthetics begin to vibrate on your cock. -<<elseif getLegCount(getSlave($AS), 4)>> - The hard angles of $his metal _nounF provide extra stimulation. -<</if>> - -/*Extra 2: if not mindbroken/immobile, tease with a flash.*/ -<<if getSlave($AS).fetish != "mindbroken" && canWalk(getSlave($AS)) && getSlave($AS).sexualQuirk == "tease" && getSlave($AS).devotion >= 60>> - <<if canSee(getSlave($AS))>>Seeing <<else>>Feeling <</if>>you near your orgasm, $he - <<if _footSeed < 40 && hasAnyArms(getSlave($AS))>> - <<if getSlave($AS).boobs < 300>> - presses $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> on $his flat chest, - <<elseif getSlave($AS).boobs < 500>> - puts $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> under $his small chest, - <<else>> - cups $his _boobs breasts with $his hand<<if hasBothArms(getSlave($AS))>>s<</if>>, - <</if>> - then sticks out $his tongue, posing like a Free Cities whore who wants a cumshot. - <<elseif _footSeed < 70 && !(getSlave($AS).chastityPenis) && !(getSlave($AS).chastityVagina) && (getSlave($AS).dick > 0 || getSlave($AS).vagina >= 0 )>> - spreads $his _legs _nounL - <<if getSlave($AS).dick > 0>> - <<if getSlave($AS).vagina >= 0>> - and raises $his _dick <<if canAchieveErection(getSlave($AS))>>erect <<else>>soft <</if>>cock <<if getSlave($AS).balls > 0 && getSlave($AS).scrotum > 0>>and _balls balls <</if>> to reveal $his <<if getSlave($AS).vaginaLube == 1>>wet <<elseif getSlave($AS).vaginaLube == 2>>dripping wet <</if>>aroused vagina - <<else>> - and teases the tip of $his _dick <<if canAchieveErection(getSlave($AS))>>throbbing <<else>>soft <</if>>dick - <</if>> - <<else>> - to reveal $his <<if getSlave($AS).vaginaLube == 1>>wet <<elseif getSlave($AS).vaginaLube == 2>>dripping wet <</if>>aroused vagina, then $he spreads $his <<if getSlave($AS).labia == 3>>extremely large <<elseif getSlave($AS).labia == 2>>large <<elseif getSlave($AS).labia == 1>>pretty <<else>>minimal <</if>>pussylips - <</if>> - with a sultry smile. - <<else>> - rolls onto $his side while still stroking your dick, revealing $his _butt ass, _hips hips and _thighs thighs with a sultry smile. - <</if>> -<</if>> - -/*PC orgasms*/ -<<if (getSlave($AS).fetish == "mindbroken")>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>> _legs _nounL, and even _belly belly with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>>. -<<elseif !canWalk(getSlave($AS))>> - <<if (getSlave($AS).devotion < -50)>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>> _legs _nounL, and even $his side with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>> as $he struggles in your grasp. $He is furious that $he is now covered in cum $he can't easily reach to clean. - <<elseif (getSlave($AS).devotion < -20)>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>> _legs _nounL, and even $his side with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>>. $He was startled by your orgasm and now wears a conflicted expression, but you are done using $him for now. $He is left covered in cum $he can't easily reach to clean. - <<elseif (getSlave($AS).devotion <= 20)>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>> _legs _nounL, and even $his side with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>> as $he sighs in nervous relief. - <<elseif (getSlave($AS).devotion < 60 || (getSlave($AS).sexualQuirk == "unflinching" && getSlave($AS).devotion <= 20))>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>> _legs _nounL, and even $his side with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>> as $he rises to an elbow to smile at you. - <<else>> - <<if (getSlave($AS).trust < -50)>> - $His lack of trust causes $his eyes to glaze over in fear. - <<else>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>> _legs _nounL, and even $his side with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>> as $he moans in pleasure. - <</if>> - <</if>> -<<elseif (getSlave($AS).devotion < -50)>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>> _legs _nounL, and even $his _belly belly with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>> as $he struggles in your grasp with a look of disgust. -<<elseif (getSlave($AS).devotion < -20)>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>> _legs _nounL, and even $his _belly belly with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>>. $He was startled by your orgasm and now wears a conflicted expression, as well as your cum, but you are done using $him for now. -<<elseif (getSlave($AS).devotion <= 20)>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>> _legs _nounL, and even $his _belly belly with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>> as $he sighs in nervous relief. -<<elseif (getSlave($AS).devotion < 60 || getSlave($AS).attrXY < 16 || (getSlave($AS).sexualQuirk == "unflinching" && getSlave($AS).devotion <= 20))>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>> _legs _nounL, and even $his _belly belly with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>>, and $he does $his best to catch your semen on $his _nounL. -<<else>> - <<if getSlave($AS).fetish == "cumslut" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60>> - When you eventually cum, <<= getSlave($AS).slaveName>> giggles in lustful joy as your hot cum coats $his _skin - <<if $PC.balls >= 5>> - _nounF and quickly slides from your desk to kneel in front of your pulsating cock. - <<if $PC.balls >= 9>> - Your massive load quickly covers $his face as $he moans and twitches in pleasure, semen dripping down $his - <<if getSlave($AS).boobs < 300>> - flat chest - <<elseif getSlave($AS).boobs < 500>> - small chest - <<else>> - _boobs breasts - <</if>> - and _belly belly onto $his thighs. - <<else>> - Your large load coats $his face in sticky semen, some dripping onto $his - <<if getSlave($AS).boobs < 300>> - flat chest. - <<elseif getSlave($AS).boobs < 500>> - small chest. - <<else>> - _boobs breasts. - <</if>> - <</if>> - <<else>> - _nounF. - <</if>> - <<elseif getSlave($AS).fetish == "humiliation" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>> _legs _nounL, and even $his _belly belly with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>>, and $he whimpers as even $his _nounF used as a sex object. - <<elseif getSlave($AS).fetish == "submissive" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>> _legs _nounL, and even $his _belly belly with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>>, and $he gasps as $he submissively accepts your semen on $his skin. - <<elseif getSlave($AS).fetish == "buttslut" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60>> - When you eventually cum, <<= getSlave($AS).slaveName>> moans as your semen lands on $his _skin _nounF, - <<if $PC.balls >= 5>> - but quickly turns to present $his _butt ass and _hips hips as a new target. - <<if $PC.balls >= 9>> - Your massive load quickly covers $his _thighs ass and thighs, sticky cum dripping all the way to $his calves. - <<else>> - Your large load soaks $his _thighs ass and thighs in sticky semen, which drips down $his _legs _nounL. - <</if>> - <<else>> - but you know $he wanted to involve $his _butt butt and your cum, if your orgasm had more volume. - <</if>> - <<elseif getSlave($AS).fetish == "boobs" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>>, _legs _nounL, and even $his _belly belly with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>>, and $he <<if getSlave($AS).boobs < 300>>pinches both $his erect nipples <<elseif getSlave($AS).boobs < 500>>rubs $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> across $his small chest <<else>>squeezes $his _boobs breasts tightly <</if>>while moaning in pleasure. - <<elseif getSlave($AS).fetish == "sadist" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>>, _legs _nounL, and even $his _belly belly with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>>, and $he gasps slightly and condescendingly smiles as you soil $his _nounF with semen. - <<elseif getSlave($AS).fetish == "dom" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>>, _legs _nounL, and even $his _belly belly with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>>, and $he gasps slightly and holds your cock between $his _nounF tightly as you soil $him with semen. - <<elseif getSlave($AS).fetish == "pregnancy" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60>> - When you start to cum, <<= getSlave($AS).slaveName>> moves $his hand from $his belly to - <<if getSlave($AS).vagina >= 0>> - expose $his vagina and spreads $his <<if getSlave($AS).labia == 3>>extremely large <<elseif getSlave($AS).labia == 2>>large <<elseif getSlave($AS).labia == 1>>pretty <<else>>minimal <</if>>pussylips to show where $he wants cum. - <<elseif getSlave($AS).mpreg == 1>> - expose $his <<if getSlave($AS).anus > 3 >>gaping <<elseif getSlave($AS).anus > 2 >>very loose <<elseif getSlave($AS).anus > 1 >>loose <<elseif getSlave($AS).anus > 0 >>tight <<else>>virgin <</if>>asshole to show where $he wants cum. - <<else>> - hug $his stomach. - <</if>> - Your orgasm shoots across $his _skin _nounF<<if $PC.balls >= 9>>, _legs _nounL, and even $his _belly belly is marked with your massive load. $He runs $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> through the cum on $his belly, massaging the semen into $his skin<<elseif $PC.balls >= 5>> and _legs _nounL<</if>>. - <<else>> - You eventually cum all over $his _skin _nounF<<if $PC.balls >= 9>>, _legs _nounL, and even $his _belly belly with your massive load<<elseif $PC.balls >= 5>> and _legs _nounL with your large load<</if>>, and $he moans softly in pleasure as $he feels your hot semen run down $his sole<<if hasBothLegs(getSlave($AS))>>s<</if>>. - <</if>> -<</if>> - -/*Extra 3: devoted perverted slave giggles and orgasms*/ -<<if (getSlave($AS).fetish != "mindbroken" && canWalk(getSlave($AS)) && getSlave($AS).sexualQuirk == "perverted" && getSlave($AS).devotion >= 60 && !(getSlave($AS).fetish == "cumslut" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60))>> - $He was getting off on the footjob, but the feeling of your cum on - <<if getSlave($AS).fetish == "buttslut" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60 && $PC.balls >= 5>> - $his ass and thighs sets off a strong orgasm of $his own, $his _thighs _nounL quivering as - <<if getSlave($AS).dick > 0>> - <<if getSlave($AS).vagina >= 0>> - <<if cumAmount(getSlave($AS)) > 20>> - $his _dick dick unloads a massive amount of cum, swollen _balls testicles bulging between $his thighs, <<if getSlave($AS).vaginaLube == 1>>wet <<elseif getSlave($AS).vaginaLube == 2>>dripping wet <</if>> pussy and asshole clenching as $he makes a cum puddle on the floor which splashes with every spasm. - <<else>> - $his _dick dick spurts $his load, $his <<if getSlave($AS).vaginaLube == 1>>wet <<elseif getSlave($AS).vaginaLube == 2>>dripping wet <</if>>pussy and asshole clenching. - <</if>> - <<else>> - <<if cumAmount(getSlave($AS)) > 20>> - $he strokes $his _dick penis, swollen _balls testicles bulging between $his thighs, asshole clenching as $his massive cumshot splashes noisily onto the floor. - <<else>> - $he strokes $his _dick penis, asshole clenching as $his cum spurts onto the floor. - <</if>> - <</if>> - <<elseif getSlave($AS).vagina >= 0>> - $he moans in pleasure, $his <<if getSlave($AS).vaginaLube == 1>>wet <<elseif getSlave($AS).vaginaLube == 2>>dripping wet <</if>>pussy and asshole clenching as $he tries to remain standing. - <<else>> - $he moans in pleasure, asshole pulsating as $he tries to remain standing. - <</if>> - <<else>> - $his _nounL<<if $PC.balls >= 2>> and belly<</if>> sets off a strong orgasm of $his own, even without masturbating. - <<if getSlave($AS).dick > 0>> /*dick shoots*/ - <<if cumAmount(getSlave($AS)) > 20>>/*huge load*/ - $His _dick dick unloads a massive amount of cum, adding $his own semen to $his body, resulting in a slave covered nearly head to toe in spunk. - <<else>> - $His _dick dick unloads onto $his belly and _boobs chest, and $he giggles and gasps as it rains down. - <</if>> - <<elseif getSlave($AS).vagina >= 0>> - $He leans back and moans in pleasure, showing $his <<if getSlave($AS).vaginaLube == 1>>wet <<elseif getSlave($AS).vaginaLube == 2>>dripping wet <</if>>pussy and asshole clenching. - <<else>> - $He leans back and moans in pleasure, showing $his asshole pulsating. - <</if>> - <</if>> - <<if getSlave($AS).vaginaLube >= 1>> - After $he leaves, you find a <<if getSlave($AS).vaginaLube >= 2>>large <</if>>puddle of pussyjuice on your desk where $he was sitting. - <</if>> -<</if>> - -<<if getSlave($AS).fetish == "cumslut" && getSlave($AS).fetishKnown == 1 && getSlave($AS).fetishStrength >= 60>> - <<if $PC.balls > 5>> - <<if getSlave($AS).dick > 0>> - <<if cumAmount(getSlave($AS)) > 20>> - $His _balls balls visibly throb as _dick dick unloads a massive amount of cum, adding $his own semen to $his body, resulting in a slave utterly plastered in spunk. $His eyes are held shut with a thick layer of cum, and judging by how <<if (getSlave($AS).chastityPenis == 1)>>$his dick is still shooting cum even in a cage with no stimulation,<<else>>furiously $he is masturbating,<</if>> $he couldn't be happier. - <<else>> - $His _dick dick unloads onto $his belly and _boobs chest, and $he giggles and gasps as it rains down with audible splats. $He is splattered in semen, face coated in your cum, and judging by <<if canSmell(getSlave($AS))>>$his nostrils desperately taking in the heady smell and <</if>>how <<if (getSlave($AS).chastityPenis == 1)>>$his dick is still throbbing in orgasm even in a cage with no stimulation,<<else>>$he can't stop masturbating,<</if>> $he couldn't be happier. - <</if>> - <<elseif getSlave($AS).vagina >= 0>> - $He leans back and moans in pleasure, $his <<if getSlave($AS).vaginaLube == 1>>wet <<elseif getSlave($AS).vaginaLube == 2>>dripping wet <</if>>pussy and asshole clenching. $He is splattered in semen, face coated in your cum, and judging by <<if canSmell(getSlave($AS))>>$his nostrils desperately taking in your scent and <</if>>how $he can't stop masturbating, $he couldn't be happier. - <<else>> - $He leans back and moans in pleasure, asshole pulsating. $He is splattered in semen, face coated in your cum, and judging by <<if canSmell(getSlave($AS))>>$his nostrils desperately taking in your scent and <</if>>how $he can't stop masturbating, $he couldn't be happier. - <</if>> - <<else>> - <<= getSlave($AS).slaveName>> leans down to wipe semen off $his _nounF, quickly bringing it into $his mouth with a blissful look as $he <<if canTaste(getSlave($AS))>>tastes<<else>>feels<</if>> your cum and sighs in pleasure. - <</if>> -<</if>> diff --git a/src/npc/interaction/fKiss.js b/src/npc/interaction/fKiss.js new file mode 100644 index 0000000000000000000000000000000000000000..de04aa1bc29f27b83168f40e2fc49a96be40c8f1 --- /dev/null +++ b/src/npc/interaction/fKiss.js @@ -0,0 +1,579 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fKiss = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself, wife, woman, girl + } = getPronouns(slave); + + const {title: Master, say: say} = getEnunciation(slave); + + const {womanP} = getPronouns(V.PC).appendSuffix("P"); + let assignedGag = ""; + r.push(`You tell ${slave.slaveName} to`); + switch (slave.mouthAccessory) { + case "none": + if (canMove(slave)) { + r.push(`approach you.`); + } else { + r.push(`have another slave help ${him} to your desk.`); + } + break; + case "dildo gag": + if (hasAnyArms(slave) && canMove(slave)) { + r.push(`remove ${his} dildo gag and approach you.`); + } else { + r.push(`have another slave remove ${his} dildo gag and set ${him} down on your desk.`); + } + assignedGag = slave.mouthAccessory; + slave.mouthAccessory = "none"; + break; + case "massive dildo gag": + if (hasAnyArms(slave) && canMove(slave)) { + r.push(`pull ${his} enormous dildo gag out of the depths of ${his} throat and approach you.`); + } else { + r.push(`have another slave pull the enormous dildo gag out of the depths of ${his} throat and set ${him} down on your desk.`); + } + assignedGag = slave.mouthAccessory; + slave.mouthAccessory = "none"; + break; + default: + if (hasAnyArms(slave) && canMove(slave)) { + r.push(`undo ${his} gag and approach you.`); + } else { + r.push(`have another slave undo ${his} gag and set ${him} down on your desk.`); + } + assignedGag = slave.mouthAccessory; + slave.mouthAccessory = "none"; + } + + if (slave.fetish === "mindbroken" && slave.relationship !== -3) { + r.push(`${He} complies mechanically. ${He} remembers that when ${getWrittenTitle(slave)}'s commands are not obeyed, there is punishment.`); + } else if (slave.relationship === -2) { + r.push(`${He} hurriedly complies, happy to be near the object of ${his} longing. Once ${he}'s close, you take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he} loves overwhelming, and ${his} eyes flick downward after a moment.`); + } else { + r.push(`upon ${his} face. ${He} senses the intense look from the ${womanP} ${he} loves and finds it overwhelming, and after a moment glances away.`); + } + r.push(`${He} blushes furiously.`); + } else if (slave.relationship === -3) { + if (slave.fetish === "mindbroken") { + r.push(`${He} complies mechanically. ${He} remembers that when ${getWrittenTitle(slave)}'s commands are not obeyed, there is punishment. You kiss ${him} deeply and intensely; ${he} doesn't understand why.`); + } else if (slave.devotion + slave.trust >= 175) { + r.push(`${He} complies in a ${wife}ly fashion, moving ${his} body as ${he} approaches to best catch your desire. Once ${he}'s close, you take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s married to affirming, and looks down with a smile, running ${his} eyes over your`); + if (V.PC.boobs >= 300) { + r.push(`bosom.`); + } else { + r.push(`chest.`); + } + } else { + r.push(`upon ${his} face. ${He} senses the intense look from the ${womanP} ${he}'s married to and finds it affirming, and looks down with a smile.`); + } + } else if (slave.devotion < -20 && slave.trust > 20) { + r.push(`${He} complies. Once ${he}'s close, you take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s forcibly married to disturbing, and quickly breaks eye contact.`); + } else { + r.push(`upon ${his} face. ${He} senses the intense look from the ${womanP} ${he}'s forcibly married to and finds it disturbing, and quickly turns ${his} face away.`); + } + } else if (slave.devotion < -20) { + r.push(`${He} complies fearfully. Once ${he}'s close, you take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} tearing ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s forcibly married to horrifying, and quickly breaks eye contact.`); + } else { + r.push(`upon ${his} tear-streaked face. ${He} senses the intense look from the ${womanP} ${he}'s forcibly married to and finds it horrifying, and quickly turns ${his} face away.`); + } + } else { + r.push(`${He} complies obediently. Once ${he}'s close, you take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s married to reassuring, and looks down with a slight smile, running ${his} eyes over your`); + if (V.PC.boobs >= 300) { + r.push(`bosom.`); + } else { + r.push(`chest.`); + } + } else { + r.push(`upon ${his} face. ${He} senses the intense look from the ${womanP} ${he}'s married to and finds it reassuring, and looks down with a slight smile.`); + } + } + } else if (slave.devotion > 75) { + r.push(`${He} hurriedly complies, happy to be near you. Once ${he}'s close, you take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from ${his} beloved ${getWrittenTitle(slave)} disconcerting, and ${his} eyes flick downward after a moment.`); + } else { + r.push(`upon ${his} face. ${He} senses the intense look from ${his} beloved ${getWrittenTitle(slave)} and finds it disconcerting, and after a moment glances away.`); + } + r.push(`${He} blushes furiously.`); + } else if (slave.devotion > 50) { + r.push(`${He} hurriedly complies, happy to be near you. Once ${he}'s close, you take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} disconcerting, and ${he} looks down after a moment, blushing.`); + } else { + r.push(`upon ${his} face. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} disconcerting, and ${he} looks down after a moment, blushing.`); + } + } else if (slave.devotion > 20) { + r.push(`${He} hurriedly complies, happy to be near you. Once ${he}'s close, you take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and ${he} looks down after a moment, blushing nervously.`); + } else { + r.push(`upon ${his} face. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and ${he} looks down after a moment, blushing nervously.`); + } + } else if (slave.devotion >= -20 && slave.trust >= -20) { + r.push(`${He} visibly considers disobedience, but decides that complying with such an apparently harmless order is safe, for now. Once ${he}'s close, you take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and ${he} looks down after a moment, ${his} lower lip trembling with nervousness.`); + } else { + r.push(`upon ${his} face. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and turns away after a moment, ${his} lower lip trembling with nervousness.`); + } + } else if (slave.trust < -20) { + r.push(`The command terrifies ${him}, but ${he}'s more frightened still of the consequences of disobedience, and ${he} complies. Once ${he}'s close, you take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. After a mere instant of locked gazes, ${he} looks down fearfully, and begins to shake with terror, tears leaking silently down ${his} cheeks.`); + } else { + r.push(`upon ${his} face. After a mere instant of locked faces, ${he} looks down fearfully, and begins to shake with terror, tears leaking silently down ${his} cheeks.`); + } + } else { + r.push(`${He} pauses, obviously considering whether to resist, but eventually decides to save ${his} strength to fight more onerous orders, and gives in. Once ${he}'s close, you take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} stares back, but after a few moments ${he} loses the contest of wills and looks down.`); + } else { + r.push(`upon ${his} face. ${He} faces you defiantly, but after a few moments ${he} loses the contest of wills and looks down.`); + } + } + + r.push(`You extend a`); + if (V.PC.title === 1) { + r.push(`manly`); + } else { + r.push(`feminine`); + } + r.push(`hand and graze your fingertips along the line of ${his} cheekbone.`); + if (slave.lipsTat !== 0) { + r.push(`Your fingers trace ${his} facial tattoos, slowly picking out the patterns against ${his} ${slave.skin} skin.`); + } + if (slave.lipsPiercing + slave.tonguePiercing > 2) { + r.push(`You touch each of ${his} facial piercings, one by one, feeling the hard metal contrast with ${his} pliant flesh.`); + } + r.push(`Then, you gently raise ${his}`); + if (slave.face > 95) { + r.push(`heartrendingly beautiful`); + } else if (slave.face > 10) { + r.push(`lovely`); + } else if (slave.face >= -10) { + r.push(`pretty`); + } else if (slave.face >= -40) { + r.push(`homely`); + } else { + r.push(`ugly`); + } + r.push(`chin and kiss ${him} right on ${his}`); + if (slave.lips > 95) { + r.push(`facepussy.`); + } else { + if (slave.lips > 70) { + r.push(`pillowlike`); + } else if (slave.lips > 40) { + r.push(`generous`); + } else if (slave.lips > 20) { + r.push(`plush`); + } + r.push(`lips.`); + } + + if (slave.relationship === -3) { + if (slave.fetish === "mindbroken") { + r.push(`${His} mouth opens to accept the kiss, and is compliant with your questing tongue. You kiss your broken ${wife} deeply. ${His} posture remains completely unchanged. Being kissed affects ${him} as little as being penetrated, being struck, being loved, or being your V.wife: not at all. When you pull away,`); + if (canSee(slave)) { + r.push(`${his} ${App.Desc.eyesColor(slave)} track you carefully, awaiting further use of ${his} body.`); + } else { + r.push(`${he} exposes ${himself} to you, awaiting further use of ${his} body.`); + } + } else if (slave.devotion + slave.trust >= 175) { + r.push(`${His} mouth accepts yours with love, matching itself perfectly to your insistent lips and tongue.`); + if (App.Medicine.Modification.teeth.get(slave.teeth).sharp) { + r.push(`(Though you're quite careful around ${his} sharp dentition.)`); + } + r.push(`${He} melts into you, sighing ever so gently. When you finally break the kiss, ${his} mouth freezes in the shape it was in when last your lips touched, and a momentary look of longing crosses ${his} face.`); + if (hasAnyArms(slave)) { + r.push(`A hand reaches dumbly up to ${his} mouth to trace ${his} lips where yours last touched.`); + } + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate love with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)},`); + } else { + r.push(`facial expressions,`); + } + r.push(`since ${he} does not speak ${V.language} well enough to express ${himself}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate love with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)}.`); + } else { + r.push(`facial expressions.`); + } + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves you.`); + } else { + r.push(Spoken(slave, `"I love you, ${Master}," ${he} says dreamily.`)); + } + } else if (slave.devotion < -20 && slave.trust > 20) { + r.push(`${He} reflexively turns ${his} head away from you, but you catch your ${wife} by ${his} jaw and kiss ${him} harder. You wrap your arms around ${him} so ${he} cannot escape. ${He} wriggles desperately, but ${his} struggles slowly subside as ${he} realizes that you're not taking this any farther. When you bore of it and pull away, ${he} glares at you.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes demand`); + } else { + r.push(`expression demands`); + } + r.push(`an answer: are you done?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs irritably, asking if you're done.`); + } else { + r.push(`${He} splutters, "Are you done, ${Master}?"`); + } + } else if (slave.devotion < -20) { + r.push(`${He} is nearly frozen with fear, and does not resist as you kiss ${him} deeply. In fact, ${he} barely reacts at all. ${He} opens ${his} mouth mechanically in response to your insistent tongue, but it's like kissing a doll. ${He} is so filled with terror that ${he} remains stiff even as it becomes clear to ${him} you're not going to hurt ${him}. When you bore of making out with your ${wife} and pull away, ${he} stares at you in utter incomprehension.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes beg`); + } else { + r.push(`expression begs`); + } + r.push(`for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs spastically, begging fearfully to know if that's it.`); + } else { + r.push(`${He} asks nervously before cringing, "I-is that it, ${Master}?"`); + } + } else { + r.push(`${He} accepts the kiss willingly. As you are so close to ${him}, you sense considerable turmoil in the`); + if (slave.physicalAge > 30) { + r.push(`${woman};`); + } else { + r.push(`${girl};`); + } + r.push(`${he}'s doing ${his} duty as a ${wife} by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of ${his} mind by your lips and tongue. When you finally break the kiss,`); + if (canSee(slave)) { + r.push(`${his} ${App.Desc.eyesColor(slave)} gaze into yours searchingly,`); + } else { + r.push(`${he} gazes at you,`); + } + r.push(`looking for answers that are not there.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes beg`); + } else { + r.push(`expression begs`); + } + r.push(`for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs hesitantly, asking if that's it.`); + } else { + r.push(`${He} asks hesitantly, "I-is that it, ${Master}?"`); + } + } + } else if (slave.fetish === "mindbroken") { + r.push(`${His} mouth opens to accept the kiss, and is compliant with your questing tongue. ${His} posture remains completely unchanged. Being kissed affects ${him} as little as being penetrated, being struck, or being loved: not at all. When you pull away,`); + if (canSee(slave)) { + r.push(`${his} ${App.Desc.eyesColor(slave)} track you carefully, awaiting further use of ${his} body.`); + } else { + r.push(`${he} exposes ${himself} to you, awaiting further use of ${his} body.`); + } + } else if (slave.relationship === -2) { + r.push(`${His} mouth accepts yours with love, matching itself perfectly to your insistent lips and tongue.`); + if (App.Medicine.Modification.teeth.get(slave.teeth).sharp) { + r.push(`(Though you're quite careful around ${his} sharp dentition.)`); + } + r.push(`${He} melts into you, sighing ever so gently. When you finally break the kiss, ${his} mouth freezes in the shape it was in when last your lips touched, and a momentary look of longing crosses ${his} face.`); + if (hasAnyArms(slave)) { + r.push(`A hand reaches dumbly up to ${his} mouth to trace ${his} lips where yours last touched.`); + } + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate love with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)},`); + } else { + r.push(`facial expressions,`); + } + r.push(`since ${he} does not speak ${V.language} well enough to express ${himself}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate love with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)}.`); + } else { + r.push(`facial expressions.`); + } + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves you.`); + } else { + r.push(Spoken(slave, `"I love you, ${Master},"`)); + r.push(`${he} ${say}s dreamily.`); + } + } else if (slave.devotion > 50 && slave.fetish === "dom" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`${He} giggles into you and kisses you back with vigor, ${his} head pressing insistently forward. The two of you make out rather`); + if (slave.teeth === "pointy") { + r.push(`aggressively, ${his} sharp teeth drawing a bit of blood from your lips and tongue.`); + } else if (slave.teeth === "fangs") { + r.push(`aggressively, ${his} fangs drawing a bit of blood from your lips and tongue.`); + } else if (slave.teeth === "fang") { + r.push(`aggressively, ${his} pointy fang drawing a bit of blood from your lips and tongue.`); + } else { + r.push(`aggressively.`); + } + r.push(`${He} takes ${his} tendency towards sexual dominance right up to the edge of insubordination, ${his} active tongue only retreating when yours presses against it. When you finally shove ${him} away, ${he}'s breathing hard through ${his} grin.`); + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate excitement with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)},`); + } else { + r.push(`facial expressions,`); + } + r.push(`since ${he} does not speak ${V.language} well enough to express ${himself}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate excitement with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)}.`); + } else { + r.push(`facial expressions.`); + } + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} liked that.`); + } else { + r.push(Spoken(slave, `"That was fun, ${Master},"`)); + r.push(`${he} ${say}s cheerfully.`); + } + } else if (slave.devotion > 50 && slave.fetish === "cumslut" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`${He} stiffens with arousal. ${His} sexuality is complex, focusing on cum, but with a heavy layer of oral fixation. As your tongue plunders ${his} mouth, ${he} reacts almost as though ${he}'s receiving oral, whimpering and moaning into you and pressing ${himself} lewdly against your`); + if (V.PC.boobs >= 1400) { + r.push(`giant tits.`); + } else if (V.PC.boobs >= 1200) { + r.push(`huge breasts.`); + } else if (V.PC.boobs >= 1000) { + r.push(`big breasts.`); + } else if (V.PC.boobs >= 800) { + r.push(`prominent breasts.`); + } else if (V.PC.boobs >= 650) { + r.push(`unremarkable breasts.`); + } else if (V.PC.boobs >= 500) { + r.push(`breasts.`); + } else if (V.PC.boobs >= 300) { + r.push(`tiny breasts.`); + } else if (V.PC.title > 0) { + r.push(`manly chest.`); + } else { + r.push(`non-existent breasts.`); + } + if (App.Medicine.Modification.teeth.get(slave.teeth).sharp) { + if (slave.teeth === "pointy") { + r.push(`${He}'s very careful to avoid spearing your tongue with ${his} sharp teeth.`); + } else if (slave.teeth === "fangs") { + r.push(`${He}'s very careful to avoid spearing your tongue with ${his} fangs.`); + } else if (slave.teeth === "fang") { + r.push(`${He}'s very careful to avoid poking you with ${his} fang.`); + } + } + r.push(`${He} achieves a weak orgasm before you tire of making out with ${him}.`); + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate undiminished lust with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)},`); + } else { + r.push(`facial expressions,`); + } + r.push(`since ${he} does not speak ${V.language} well enough to express ${himself}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate undiminished lust with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)}.`); + } else { + r.push(`facial expressions.`); + } + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} liked that.`); + } else { + r.push(Spoken(slave, `"That was fun, ${Master},"`)); + r.push(`${he} ${say}s lustfully.`); + } + } else if (slave.devotion > 50) { + r.push(`${His} mouth accepts yours with devotion, matching itself carefully to your insistent lips and tongue.`); + if (App.Medicine.Modification.teeth.get(slave.teeth).sharp) { + if (slave.teeth === "pointy") { + r.push(`${He} is exquisitely careful to keep ${his} sharp teeth clear of you.`); + } else if (slave.teeth === "fangs") { + r.push(`${He} is exquisitely careful to keep ${his} fangs from poking you.`); + } else if (slave.teeth === "fang") { + r.push(`${He} is exquisitely careful to keep ${his} fang from getting into trouble.`); + } + } + r.push(`${He} presses ${himself} against you, ${his} warmth wonderful against your`); + if (V.PC.boobs >= 1400) { + r.push(`expansive`); + if (V.PC.boobsImplant / V.PC.boobs >= .60) { + r.push(`firm`); + } else { + r.push(`soft`); + } + r.push(`chest.`); + } else if (V.PC.boobs >= 1200) { + r.push(`huge`); + if (V.PC.boobsImplant / V.PC.boobs >= .60) { + r.push(`firm`); + } else { + r.push(`soft`); + } + r.push(`breasts.`); + } else if (V.PC.boobs >= 1000) { + r.push(`big`); + if (V.PC.boobsImplant / V.PC.boobs >= .60) { + r.push(`firm`); + } else { + r.push(`soft`); + } + r.push(`breasts.`); + } else if (V.PC.boobs >= 800) { + r.push(`soft breasts.`); + } else if (V.PC.boobs >= 500) { + r.push(`breasts.`); + } else if (V.PC.boobs >= 300) { + r.push(`small chest.`); + } else if (V.PC.title > 0) { + r.push(`manly chest.`); + } else { + r.push(`flat chest.`); + } + r.push(`When you finally break the kiss, ${he} runs ${his} tongue rapturously across ${his} moistened lips${hasAnyArms(slave) ? ` and then runs a finger across them as well` : ``}, an openly sexual look on ${his} ${slave.skin} face.`); + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate devotion with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)},`); + } else { + r.push(`facial expressions,`); + } + r.push(`since ${he}'s not confident in ${his} ability to express it in ${V.language}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate devotion with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)}.`); + } else { + r.push(`facial expressions.`); + } + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves you.`); + } else { + r.push(Spoken(slave, `"I love you, ${Master},"`)); + r.push(`${he} ${say}s forthrightly.`); + } + } else if (slave.devotion > 20) { + r.push(`${He} accepts the kiss willingly. As you are so close to ${him}, you sense considerable turmoil in the`); + if (slave.physicalAge > 30) { + r.push(`${woman};`); + } else { + r.push(`${girl};`); + } + r.push(`${he}'s doing ${his} duty as a slave by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of ${his} mind by your lips and tongue. When you finally break the kiss,`); + if (canSee(slave)) { + r.push(`${his} ${App.Desc.eyesColor(slave)} gaze into yours searchingly,`); + } else { + r.push(`${he} gazes at you,`); + } + r.push(`looking for answers that are not there.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes beg`); + } else { + r.push(`expression begs`); + } + r.push(`for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs hesitantly, asking if that's it.`); + } else { + r.push(`${He} asks hesitantly,`); + r.push(Spoken(slave, `"I-is that it, ${Master}?"`)); + } + } else if (slave.devotion >= -20 && slave.trust < -20) { + r.push(`${He} accepts the kiss fearfully. As you kiss ${his} unresisting mouth, ${his} eagerness to avoid punishment leads ${him} to kiss you back, though nervousness makes ${him} mechanical. You kiss ${him} harder, enjoying ${his} fear, and the physical intimacy slowly does its work. ${He} becomes softer and more natural, ${his} resistance easing. When you pull away from ${him} for a moment, ${he}`); + if (canSee(slave)) { + r.push(`looks`); + } else { + r.push(`gazes`); + } + r.push(`at you for a long moment, ${his} mouth still hanging open, before visibly catching ${himself} with a reminder that ${he}'s a slave and you're ${his} owner.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes beg`); + } else { + r.push(`expression begs`); + } + r.push(`for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs hesitantly, asking if that's it.`); + } else { + r.push( + `${He} asks hesitantly,`, + Spoken(slave, `"I-is that it, ${Master}?"`) + ); + } + } else if (slave.trust < -50) { + r.push(`${He} is nearly frozen with fear, and does not resist as you kiss ${him}. In fact, ${he} barely reacts at all. ${He} opens ${his} mouth mechanically in response to your insistent tongue, but it's like kissing a doll. ${He} is so filled with terror that ${he} remains stiff even as it becomes clear to ${him} you're not going to hurt ${him}. When you bore of making out with the poor`); + if (slave.physicalAge > 30) { + r.push(`${woman}`); + } else { + r.push(`${girl}`); + } + r.push(`and pull away, ${he} stares at you in utter incomprehension.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes beg`); + } else { + r.push(`expression begs`); + } + r.push(`for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs spastically, begging fearfully to know if that's it.`); + } else { + r.push( + `${He} asks nervously before cringing,`, + Spoken(slave, `"I-is that it, ${Master}?"`) + ); + } + } else { + r.push(`${He} reflexively turns ${his} head away from you, but you catch ${his} jaw and kiss ${him} harder. Spluttering, ${he} flees backwards, but you tip forward with ${him} and pin ${him} against your desk, plundering ${his} mouth without mercy. ${He} wriggles desperately, but ${his} struggles slowly subside as ${he} realizes that you're not taking this any farther. When you bore of it and pull away, ${he} stares at you in utter incomprehension.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes demand`); + } else { + r.push(`expression demands`); + } + r.push(`an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs irritably, asking whether that's it.`); + } else { + r.push( + `${He} splutters,`, + Spoken(slave, `"Is that it, ${Master}!?"`) + ); + } + } + + if (assignedGag) { + slave.mouthAccessory = assignedGag; + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fKiss.tw b/src/npc/interaction/fKiss.tw deleted file mode 100644 index 1019969fc2f190078084e6c7309f362bd8ea417a..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fKiss.tw +++ /dev/null @@ -1,326 +0,0 @@ -:: FKiss [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<setPlayerPronouns>> - -You tell <<= getSlave($AS).slaveName>> to -<<switch getSlave($AS).mouthAccessory>> -<<case "none">> - <<if canMove(getSlave($AS))>> - approach you. - <<else>> - have another slave help $him to your desk. - <</if>> -<<case "dildo gag">> - <<if hasAnyArms(getSlave($AS)) && canMove(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).mouthAccessory, getSlave($AS).mouthAccessory = "none">> -<<case "massive dildo gag">> - <<if hasAnyArms(getSlave($AS)) && canMove(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).mouthAccessory, getSlave($AS).mouthAccessory = "none">> -<<default>> - <<if hasAnyArms(getSlave($AS)) && canMove(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).mouthAccessory, getSlave($AS).mouthAccessory = "none">> -<</switch>> - -<<run Enunciate(getSlave($AS))>> - -<<if (getSlave($AS).fetish == "mindbroken") && (getSlave($AS).relationship != -3)>> - $He complies mechanically. $He remembers that when <<= getWrittenTitle(getSlave($AS))>>'s commands are not obeyed, there is punishment. -<<elseif (getSlave($AS).relationship == -2)>> - $He hurriedly complies, happy to be near the object of $his longing. Once $he's close, you take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he loves overwhelming, and $his eyes flick downward after a moment. - <<else>> - upon $his face. $He senses the intense look from the _womanP $he loves and finds it overwhelming, and after a moment glances away. - <</if>> - $He blushes furiously. -<<elseif (getSlave($AS).relationship == -3)>> - <<if getSlave($AS).fetish == "mindbroken">> - $He complies mechanically. $He remembers that when <<= getWrittenTitle(getSlave($AS))>>'s commands are not obeyed, there is punishment. You kiss $him deeply and intensely; $he doesn't understand why. - <<elseif getSlave($AS).devotion+getSlave($AS).trust >= 175>> - $He complies in a <<= $wife>>ly fashion, moving $his body as $he approaches to best catch your desire. Once $he's close, you take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's married to affirming, and looks down with a smile, running $his eyes over your <<if $PC.boobs >= 300>>bosom<<else>>chest<</if>>. - <<else>> - upon $his face. $He senses the intense look from the _womanP $he's married to and finds it affirming, and looks down with a smile. - <</if>> - <<elseif getSlave($AS).devotion < -20 && getSlave($AS).trust > 20>> - $He complies. Once $he's close, you take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's forcibly married to disturbing, and quickly breaks eye contact. - <<else>> - upon $his face. $He senses the intense look from the _womanP $he's forcibly married to and finds it disturbing, and quickly turns $his face away. - <</if>> - <<elseif getSlave($AS).devotion < -20>> - $He complies fearfully. Once $he's close, you take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his tearing <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's forcibly married to horrifying, and quickly breaks eye contact. - <<else>> - upon $his tear-streaked face. $He senses the intense look from the _womanP $he's forcibly married to and finds it horrifying, and quickly turns $his face away. - <</if>> - <<else>> - $He complies obediently. Once $he's close, you take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's married to reassuring, and looks down with a slight smile, running $his eyes over your <<if $PC.boobs >= 300>>bosom<<else>>chest<</if>>. - <<else>> - upon $his face. $He senses the intense look from the _womanP $he's married to and finds it reassuring, and looks down with a slight smile. - <</if>> - <</if>> -<<elseif (getSlave($AS).devotion > 75)>> - $He hurriedly complies, happy to be near you. Once $he's close, you take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from $his beloved <<= getWrittenTitle(getSlave($AS))>> disconcerting, and $his eyes flick downward after a moment. - <<else>> - upon $his face. $He senses the intense look from $his beloved <<= getWrittenTitle(getSlave($AS))>> and finds it disconcerting, and after a moment glances away. - <</if>> - $He blushes furiously. -<<elseif (getSlave($AS).devotion > 50)>> - $He hurriedly complies, happy to be near you. Once $he's close, you take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> disconcerting, and $he looks down after a moment, blushing. - <<else>> - upon $his face. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> disconcerting, and $he looks down after a moment, blushing. - <</if>> -<<elseif (getSlave($AS).devotion > 20)>> - $He hurriedly complies, happy to be near you. Once $he's close, you take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and $he looks down after a moment, blushing nervously. - <<else>> - upon $his face. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and $he looks down after a moment, blushing nervously. - <</if>> -<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).trust >= -20)>> - $He visibly considers disobedience, but decides that complying with such an apparently harmless order is safe, for now. Once $he's close, you take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and $he looks down after a moment, $his lower lip trembling with nervousness. - <<else>> - upon $his face. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and turns away after a moment, $his lower lip trembling with nervousness. - <</if>> -<<elseif (getSlave($AS).trust < -20)>> - The command terrifies $him, but $he's more frightened still of the consequences of disobedience, and $he complies. Once $he's close, you take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. After a mere instant of locked gazes, $he looks down fearfully, and begins to shake with terror, tears leaking silently down $his cheeks. - <<else>> - upon $his face. After a mere instant of locked faces, $he looks down fearfully, and begins to shake with terror, tears leaking silently down $his cheeks. - <</if>> -<<else>> - $He pauses, obviously considering whether to resist, but eventually decides to save $his strength to fight more onerous orders, and gives in. Once $he's close, you take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He stares back, but after a few moments $he loses the contest of wills and looks down. - <<else>> - upon $his face. $He faces you defiantly, but after a few moments $he loses the contest of wills and looks down. - <</if>> -<</if>> - -You extend a <<if $PC.title == 1>>manly<<else>>feminine<</if>> hand and graze your fingertips along the line of $his cheekbone. -<<if (getSlave($AS).lipsTat != 0)>> - Your fingers trace $his facial tattoos, slowly picking out the patterns against $his <<= getSlave($AS).skin>> skin. -<</if>> -<<if (getSlave($AS).lipsPiercing+getSlave($AS).tonguePiercing > 2)>> - You touch each of $his facial piercings, one by one, feeling the hard metal contrast with $his pliant flesh. -<</if>> -Then, you gently raise $his <<if getSlave($AS).face > 95>>heartrendingly beautiful<<elseif getSlave($AS).face > 10>>lovely<<elseif getSlave($AS).face >= -10>>pretty<<elseif getSlave($AS).face >= -40>>homely<<else>>ugly<</if>> chin and kiss $him right on $his <<if getSlave($AS).lips > 95>>facepussy<<else>><<if getSlave($AS).lips > 70>>pillowlike <<elseif getSlave($AS).lips > 40>>generous <<elseif getSlave($AS).lips > 20>>plush <</if>>lips<</if>>. - -<<if (getSlave($AS).relationship == -3)>> - <<if getSlave($AS).fetish == "mindbroken">> - $His mouth opens to accept the kiss, and is compliant with your questing tongue. You kiss your broken $wife deeply. $His posture remains completely unchanged. Being kissed affects $him as little as being penetrated, being struck, being loved, or being your $wife: not at all. When you pull away, - <<if canSee(getSlave($AS))>> - $his <<= App.Desc.eyesColor(getSlave($AS))>> track you carefully, awaiting further use of $his body. - <<else>> - $he exposes $himself to you, awaiting further use of $his body. - <</if>> - <<elseif getSlave($AS).devotion+getSlave($AS).trust >= 175>> - $His mouth accepts yours with love, matching itself perfectly to your insistent lips and tongue.<<if (getSlave($AS).teeth == "pointy") || (getSlave($AS).teeth == "fangs") || (getSlave($AS).teeth == "fang")>> (Though you're quite careful around $his sharp dentition.)<</if>> $He melts into you, sighing ever so gently. When you finally break the kiss, $his mouth freezes in the shape it was in when last your lips touched, and a momentary look of longing crosses $his face.<<if hasAnyArms(getSlave($AS))>> A hand reaches dumbly up to $his mouth to trace $his lips where yours last touched.<</if>> - <<if (getSlave($AS).accent >= 3)>> - $He does $his best to communicate love with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>, since $he does not speak $language well enough to express $himself. - <<elseif !hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS)))>> - $He does $his best to communicate love with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he loves you. - <<else>> - "I love you, <<Master>>," $he <<say>>s dreamily. - <</if>> - <<elseif getSlave($AS).devotion < -20 && getSlave($AS).trust > 20>> - $He reflexively turns $his head away from you, but you catch your $wife by $his jaw and kiss $him harder. You wrap your arms around $him so $he cannot escape. $He wriggles desperately, but $his struggles slowly subside as $he realizes that you're not taking this any farther. When you bore of it and pull away, $he glares at you. - <<if (!hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS))))>> - $His <<if canSee(getSlave($AS))>>eyes demand<<else>>expression demands<</if>> an answer: are you done? - <<elseif !canTalk(getSlave($AS))>> - $He signs irritably, asking if you're done. - <<else>> - $He splutters, "Are you done, <<Master>>?" - <</if>> - <<elseif getSlave($AS).devotion < -20>> - $He is nearly frozen with fear, and does not resist as you kiss $him deeply. In fact, $he barely reacts at all. $He opens $his mouth mechanically in response to your insistent tongue, but it's like kissing a doll. $He is so filled with terror that $he remains stiff even as it becomes clear to $him you're not going to hurt $him. When you bore of making out with your $wife and pull away, $he stares at you in utter incomprehension. - <<if (!hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS))))>> - $His <<if canSee(getSlave($AS))>>eyes beg<<else>>expression begs<</if>> for an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs spastically, begging fearfully to know if that's it. - <<else>> - $He asks nervously before cringing, "I-i<<s>> that it, <<Master>>?" - <</if>> - <<else>> - $He accepts the kiss willingly. As you are so close to $him, you sense considerable turmoil in the <<if (getSlave($AS).physicalAge > 30)>>$woman<<else>>$girl<</if>>; $he's doing $his duty as a $wife by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of $his mind by your lips and tongue. When you finally break the kiss, <<if canSee(getSlave($AS))>>$his <<= App.Desc.eyesColor(getSlave($AS))>> gaze into yours searchingly<<else>>$he gazes at you<</if>>, looking for answers that are not there. - <<if (!hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS))))>> - $His <<if canSee(getSlave($AS))>>eyes beg<<else>>expression begs<</if>> for an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs hesitantly, asking if that's it. - <<else>> - $He asks hesitantly, "I-i<<s>> that it, <<Master>>?" - <</if>> - <</if>> -<<elseif (getSlave($AS).fetish == "mindbroken")>> - $His mouth opens to accept the kiss, and is compliant with your questing tongue. $His posture remains completely unchanged. Being kissed affects $him as little as being penetrated, being struck, or being loved: not at all. When you pull away, - <<if canSee(getSlave($AS))>> - $his <<= App.Desc.eyesColor(getSlave($AS))>> track you carefully, awaiting further use of $his body. - <<else>> - $he exposes $himself to you, awaiting further use of $his body. - <</if>> -<<elseif (getSlave($AS).relationship == -2)>> - $His mouth accepts yours with love, matching itself perfectly to your insistent lips and tongue.<<if (getSlave($AS).teeth == "pointy") || (getSlave($AS).teeth == "fangs") || (getSlave($AS).teeth == "fang")>> (Though you're quite careful around $his sharp dentition.)<</if>> $He melts into you, sighing ever so gently. When you finally break the kiss, $his mouth freezes in the shape it was in when last your lips touched, and a momentary look of longing crosses $his face.<<if hasAnyArms(getSlave($AS))>> A hand reaches dumbly up to $his mouth to trace $his lips where yours last touched.<</if>> - <<if (getSlave($AS).accent >= 3)>> - $He does $his best to communicate love with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>, since $he does not speak $language well enough to express $himself. - <<elseif !hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS)))>> - $He does $his best to communicate love with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he loves you. - <<else>> - "I love you, <<Master>>," $he <<say>>s dreamily. - <</if>> -<<elseif (getSlave($AS).devotion > 50) && (getSlave($AS).fetish == "dom") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>> - $He giggles into you and kisses you back with vigor, $his head pressing insistently forward. The two of you make out rather aggressively<<if (getSlave($AS).teeth == "pointy")>>, $his sharp teeth drawing a bit of blood from your lips and tongue<<elseif (getSlave($AS).teeth == "fangs")>>, $his fangs drawing a bit of blood from your lips and tongue<<elseif (getSlave($AS).teeth == "fang")>>, $his pointy fang drawing a bit of blood from your lips and tongue<</if>>. $He takes $his tendency towards sexual dominance right up to the edge of insubordination, $his active tongue only retreating when yours presses against it. When you finally shove $him away, $he's breathing hard through $his grin. - <<if (getSlave($AS).accent >= 3)>> - $He does $his best to communicate excitement with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>, since $he does not speak $language well enough to express $himself. - <<elseif !hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS)))>> - $He does $his best to communicate excitement with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he liked that. - <<else>> - "That wa<<s>> fun, <<Master>>," $he <<say>>s cheerfully. - <</if>> -<<elseif (getSlave($AS).devotion > 50) && (getSlave($AS).fetish == "cumslut") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>> - $He stiffens with arousal. $His sexuality is complex, focusing on cum, but with a heavy layer of oral fixation. As your tongue plunders $his mouth, $he reacts almost as though $he's receiving oral, whimpering and moaning into you and pressing $himself lewdly against your - <<if $PC.boobs >= 1400>> - giant tits. - <<elseif $PC.boobs >= 1200>> - huge breasts. - <<elseif $PC.boobs >= 1000>> - big breasts. - <<elseif $PC.boobs >= 800>> - prominent breasts. - <<elseif $PC.boobs >= 650>> - unremarkable breasts. - <<elseif $PC.boobs >= 500>> - breasts. - <<elseif $PC.boobs >= 300>> - tiny breasts. - <<elseif $PC.title > 0>> - manly chest. - <<else>> - non-existent breasts. - <</if>> - <<if (getSlave($AS).teeth == "pointy")>> - $He's very careful to avoid spearing your tongue with $his sharp teeth. - <<elseif (getSlave($AS).teeth == "fangs")>> - $He's very careful to avoid spearing your tongue with $his fangs. - <<elseif (getSlave($AS).teeth == "fang")>> - $He's very careful to avoid poking you with $his fang. - <</if>> - $He achieves a weak orgasm before you tire of making out with $him. - <<if (getSlave($AS).accent >= 3)>> - $He does $his best to communicate undiminished lust with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>, since $he does not speak $language well enough to express $himself. - <<elseif !hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS)))>> - $He does $his best to communicate undiminished lust with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he liked that. - <<else>> - "That wa<<s>> fun, <<Master>>," $he <<say>>s lustfully. - <</if>> -<<elseif (getSlave($AS).devotion > 50)>> - $His mouth accepts yours with devotion, matching itself carefully to your insistent lips and tongue. - <<if (getSlave($AS).teeth == "pointy")>> - $He is exquisitely careful to keep $his sharp teeth clear of you. - <<elseif (getSlave($AS).teeth == "fangs")>> - $He is exquisitely careful to keep $his fangs from poking you. - <<elseif (getSlave($AS).teeth == "fang")>> - $He is exquisitely careful to keep $his fang from getting into trouble. - <</if>> - $He presses $himself against you, $his warmth wonderful against your - <<if $PC.boobs >= 1400>> - expansive <<if $PC.boobsImplant/$PC.boobs >= .60>>firm<<else>>soft<</if>> chest. - <<elseif $PC.boobs >= 1200>> - huge <<if $PC.boobsImplant/$PC.boobs >= .60>>firm<<else>>soft<</if>> breasts. - <<elseif $PC.boobs >= 1000>> - big <<if $PC.boobsImplant/$PC.boobs >= .60>>firm<<else>>soft<</if>> breasts. - <<elseif $PC.boobs >= 800>> - soft breasts. - <<elseif $PC.boobs >= 500>> - breasts. - <<elseif $PC.boobs >= 300>> - small chest. - <<elseif $PC.title > 0>> - manly chest. - <<else>> - flat chest. - <</if>> - When you finally break the kiss, $he runs $his tongue rapturously across $his moistened lips<<if hasAnyArms(getSlave($AS))>> and then runs a finger across them as well<</if>>, an openly sexual look on $his <<= getSlave($AS).skin>> face. - <<if (getSlave($AS).accent >= 3)>> - $He does $his best to communicate devotion with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>, since $he's not confident in $his ability to express it in $language. - <<elseif !hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS)))>> - $He does $his best to communicate devotion with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he loves you. - <<else>> - "I love you, <<Master>>," $he <<say>>s forthrightly. - <</if>> -<<elseif (getSlave($AS).devotion > 20)>> - $He accepts the kiss willingly. As you are so close to $him, you sense considerable turmoil in the <<if (getSlave($AS).physicalAge > 30)>>$woman<<else>>$girl<</if>>; $he's doing $his duty as a slave by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of $his mind by your lips and tongue. When you finally break the kiss, <<if canSee(getSlave($AS))>>$his <<= App.Desc.eyesColor(getSlave($AS))>> gaze into yours searchingly<<else>>$he gazes at you<</if>>, looking for answers that are not there. - <<if (!hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS))))>> - $His <<if canSee(getSlave($AS))>>eyes beg<<else>>expression begs<</if>> for an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs hesitantly, asking if that's it. - <<else>> - $He asks hesitantly, "I-i<<s>> that it, <<Master>>?" - <</if>> -<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).trust < -20)>> - $He accepts the kiss fearfully. As you kiss $his unresisting mouth, $his eagerness to avoid punishment leads $him to kiss you back, though nervousness makes $him mechanical. You kiss $him harder, enjoying $his fear, and the physical intimacy slowly does its work. $He becomes softer and more natural, $his resistance easing. When you pull away from $him for a moment, $he <<if canSee(getSlave($AS))>>looks<<else>>gazes<</if>> at you for a long moment, $his mouth still hanging open, before visibly catching $himself with a reminder that $he's a slave and you're $his owner. - <<if (!hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS))))>> - $His <<if canSee(getSlave($AS))>>eyes beg<<else>>expression begs<</if>> for an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs hesitantly, asking if that's it. - <<else>> - $He asks hesitantly, "I-i<<s>> that it, <<Master>>?" - <</if>> -<<elseif (getSlave($AS).trust < -50)>> - $He is nearly frozen with fear, and does not resist as you kiss $him. In fact, $he barely reacts at all. $He opens $his mouth mechanically in response to your insistent tongue, but it's like kissing a doll. $He is so filled with terror that $he remains stiff even as it becomes clear to $him you're not going to hurt $him. When you bore of making out with the poor <<if (getSlave($AS).physicalAge > 30)>>$woman<<else>>$girl<</if>> and pull away, $he stares at you in utter incomprehension. - <<if (!hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS))))>> - $His <<if canSee(getSlave($AS))>>eyes beg<<else>>expression begs<</if>> for an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs spastically, begging fearfully to know if that's it. - <<else>> - $He asks nervously before cringing, "I-i<<s>> that it, <<Master>>?" - <</if>> -<<else>> - $He reflexively turns $his head away from you, but you catch $his jaw and kiss $him harder. Spluttering, $he flees backwards, but you tip forward with $him and pin $him against your desk, plundering $his mouth without mercy. $He wriggles desperately, but $his struggles slowly subside as $he realizes that you're not taking this any farther. When you bore of it and pull away, $he stares at you in utter incomprehension. - <<if (!hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS))))>> - $His <<if canSee(getSlave($AS))>>eyes demand<<else>>expression demands<</if>> an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs irritably, asking whether that's it. - <<else>> - $He splutters, "I<<s>> that it, <<Master>>!?" - <</if>> -<</if>> - -<<if def _tempGag>> - <<set getSlave($AS).mouthAccessory = _tempGag>> -<</if>> diff --git a/src/npc/interaction/fLickPussy.js b/src/npc/interaction/fLickPussy.js new file mode 100644 index 0000000000000000000000000000000000000000..62ce7af0d79b9d3685f0921ae0df19e82f98a79b --- /dev/null +++ b/src/npc/interaction/fLickPussy.js @@ -0,0 +1,134 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fLickPussy = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, + he, his, him + } = getPronouns(slave); + + const {womanP} = getPronouns(V.PC).appendSuffix("P"); + + App.Utils.setLocalPronouns(slave); + addPartner(slave, -1); + + const _devotion = slave.devotion; /* for brevity*/ + + if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { + r.push(`You summon ${slave.slaveName} to your office and order ${him} to lie down on the couch. ${He} does so`); + if (_devotion > 95) { + r.push(`with a smile, skipping over to give you a quick kiss before ${he} complies with your request.`); + } else if (_devotion > 50) { + r.push(`without hesitation, ready to serve and obey.`); + } else if (_devotion > -50) { + r.push(`with a look of trepidation, as though afraid you're going to hurt ${him}.`); + } else if (_devotion <= -50) { + r.push(`with a look of hatred, though only after you threaten to punish ${him}.`); + } + } else { + r.push(`You have ${slave.slaveName} brought into your office and placed on your couch.`); + } + + r.push(`After ${he} is situated, you go over to `); + if (slave.clothes !== "no clothing") { + r.push(`${him} and take off ${his} clothing, causing ${him} to`); + if (_devotion > 50) { + r.push(`give you a soft smile.`); + } else { + r.push(`give you an angry glare.`); + } + } else { + r.push(`${him}.`); + } + r.push(`You suddenly grab ${his} hips and pull ${his} crotch to your face, causing ${him} to`); + if (canTalk(slave)) { + r.push(`give a shriek of surprise`); + } else { + r.push(`shudder in surprise`); + } + + if (slave.belly >= 30000) { + if (slave.bellyPreg > 1000) { + r.push(`as you get familiar under ${his} huge life-swollen baby bump.`); + } else { + r.push(`as you get familiar under ${his} hugely swollen belly.`); + } + } else if (slave.belly >= 10000) { + if (slave.bellyPreg >= 8000) { + r.push(`as you get under ${his} baby bump.`); + } else if (slave.bellyImplant >= 8000) { + r.push(`as you get under the swollen orb that is ${his} stomach.`); + } else { + r.push(`as you get under the bloated container of ${slave.inflationType} that is ${his} middle.`); + } + } else if (slave.belly >= 1000) { + if (slave.bellyPreg >= 1000) { + r.push(`as you get not far below the life growing within ${him}.`); + } else if (slave.bellyImplant >= 1000) { + r.push(`as you get not far below the curve of ${his} stomach.`); + } else { + r.push(`as you get not far below the groaning container of ${slave.inflationType} within ${him}.`); + } + } else if (slave.weight > 95) { + r.push(`as you get familiar with ${his} fat belly.`); + } + + r.push(`Looking at ${him} directly in the eyes, you begin to run your tongue along ${his} labia, drawing a`); + if (canTalk(slave)) { + r.push(`soft`); + } else { + r.push(`silent`); + } + r.push(`moan from ${him}. The combination of the pleasure and the intense look from`); + if (areRelated(slave, V.PC)) { + r.push(`${his} ${relativeTerm(slave, V.PC)}`); + } else { + r.push(`the ${womanP} ${he}`); + if (_devotion > 95) { + r.push(`loves`); + } else if (_devotion > 50) { + r.push(`'s accepted as ${his} ${getWrittenTitle(slave)}`); + } else { + r.push(`hates`);/* not sure what to use for "reluctant"*/ + } + } + r.push(`makes ${him} blush, but you don't let up.`); + if (slave.dick === 0) { + r.push(`You give ${his} clit a few experimental tweaks, causing ${his}`); + if (canTalk(slave)) { + r.push(`moans`); + } else { + r.push(`squirming`); + } + r.push(`to intensify${(hasBothLegs(slave)) ? `and ${his} legs to tighten around your head` : ``}.`); + } + r.push(`Before ${he} cums, though, you pull back, causing ${him} to whine in frustration. You begin again, then pull back again just before ${he} orgasms. You repeat this several more times, each time causing ${him} to become more and more frustrated. Finally, one last stroke of your tongue causes ${him} to go over the edge, making ${him}`); + if (canTalk(slave)) { + r.push(`scream out`); + if (_devotion > 50) { + r.push(`your name`); + } + } else { + r.push(`spasm`); + } + if (slave.dick > 0) { + if (canAchieveErection(slave)) { + r.push(`in ecstasy and spray cum across ${his} chest.`); + } else { + r.push(`in ecstasy and dribble cum from ${his} limp dick.`); + } + } else { + r.push(`in ecstasy.`); + } + r.push(`You send ${him} back to ${his} assignment before calling in another slave to clean up the mess.`); + + slave.counter.vaginal++; + V.vaginalTotal++; + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fLickPussy.tw b/src/npc/interaction/fLickPussy.tw deleted file mode 100644 index d9de79b39c7af799cff48be6d4db973b30b009d0..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fLickPussy.tw +++ /dev/null @@ -1,60 +0,0 @@ -:: FLickPussy [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> -<<setPlayerPronouns>> - -<<set _devotion = getSlave($AS).devotion>> /*for brevity*/ - -<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>> - You summon <<= getSlave($AS).slaveName>> to your office and order $him to lie down on the couch. $He does so - <<if _devotion > 95>> - with a smile, skipping over to give you a quick kiss before $he complies with your request. - <<elseif _devotion > 50>> - without hesitation, ready to serve and obey. - <<elseif _devotion > -50>> - with a look of trepidation, as though afraid you're going to hurt $him. - <<elseif _devotion <= -50>> - with a look of hatred, though only after you threaten to punish $him. - <</if>> -<<else>> - You have <<= getSlave($AS).slaveName>> brought into your office and placed on your couch. -<</if>> - -After $he is situated, you go over to $him<<if getSlave($AS).clothes != "no clothing">> and take off $his clothing, causing $him to <<if _devotion > 50>>give you a soft smile<<else>>give you an angry glare<</if>><</if>>. You suddenly grab $his hips and pull $his crotch to your face, causing $him to <<if canTalk(getSlave($AS))>>give a shriek of surprise<<else>>shudder in surprise<</if>> - -<<if getSlave($AS).belly >= 30000>> - <<if getSlave($AS).bellyPreg > 1000>> - as you get familiar under $his huge life-swollen baby bump. - <<else>> - as you get familiar under $his hugely swollen belly. - <</if>> - -<<elseif getSlave($AS).belly >= 10000>> - <<if getSlave($AS).bellyPreg >= 8000>> - as you get under $his baby bump. - <<elseif getSlave($AS).bellyImplant >= 8000>> - as you get under the swollen orb that is $his stomach. - <<else>> - as you get under the bloated container of <<= getSlave($AS).inflationType>> that is $his middle. - <</if>> - -<<elseif getSlave($AS).belly >= 1000>> - <<if getSlave($AS).bellyPreg >= 1000>> - as you get not far below the life growing within $him. - <<elseif getSlave($AS).bellyImplant >= 1000>> - as you get not far below the curve of $his stomach. - <<else>> - as you get not far below the groaning container of <<= getSlave($AS).inflationType>> within $him. - <</if>> -<<elseif getSlave($AS).weight > 95>> - as you get familiar with $his fat belly. -<</if>> - -Looking at $him directly in the eyes, you begin to run your tongue along $his labia, drawing a <<if canTalk(getSlave($AS))>>soft<<else>>silent<</if>> moan from $him. The combination of the pleasure and the intense look from <<if areRelated(getSlave($AS), $PC)>>$his <<=relativeTerm(getSlave($AS), $PC)>><<else>>the _womanP $he<<if _devotion > 95>> loves <<elseif _devotion > 50>>'s accepted as $his <<= getWrittenTitle(getSlave($AS))>><<else>> hates/*not sure what to use for "reluctant"*/<</if>><</if>> makes $him blush, but you don't let up. -<<if getSlave($AS).dick == 0>> - You give $his clit a few experimental tweaks, causing $his <<if canTalk(getSlave($AS))>>moans<<else>>squirming<</if>> to intensify<<if hasBothLegs(getSlave($AS))>> and $his legs to tighten around your head<</if>>. -<</if>> -Before $he cums, though, you pull back, causing $him to whine in frustration. You begin again, then pull back again just before $he orgasms. You repeat this several more times, each time causing $him to become more and more frustrated. Finally, one last stroke of your tongue causes $him to go over the edge, making $him <<if canTalk(getSlave($AS))>>scream out <<if _devotion > 50>>your name<</if>><<else>>spasm<</if>> in ecstasy<<if getSlave($AS).dick > 0>><<if canAchieveErection(getSlave($AS))>> and spray cum across $his chest<<else>> and dribble cum from $his limp dick<</if>><</if>>. You send $him back to $his assignment before calling in another slave to clean up the mess. - -<<set getSlave($AS).counter.vaginal++, $vaginalTotal++>> diff --git a/src/npc/interaction/fLips.js b/src/npc/interaction/fLips.js new file mode 100644 index 0000000000000000000000000000000000000000..d90063293fe09b7391503d56b3a7c20750c48d24 --- /dev/null +++ b/src/npc/interaction/fLips.js @@ -0,0 +1,432 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fLips = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself, girl + } = getPronouns(slave); + + addPartner(slave, -1); + seX(slave, "oral", V.PC, "penetrative"); + + r.push(`You tell ${slave.slaveName} to`); + if (V.PC.dick !== 0) { + r.push(`blow you with ${his}`); + } else { + r.push(`please your pussy with ${his}`); + } + if (slave.lips > 95) { + r.push(`facepussy.`); + } else if (slave.lips > 70) { + r.push(`cartoonish lips.`); + } else if (slave.lips > 20) { + r.push(`dick-sucking lips.`); + } else if (slave.lips > 10) { + r.push(`pretty mouth.`); + } else { + r.push(`whore mouth.`); + } + + if (slave.fetish === "cumslut" && slave.devotion >= -20) { + r.push(`${He}'s delighted at the prospect of ${his} favorite activity.`); + } + + switch (slave.mouthAccessory) { + case "dildo gag": + if (hasAnyArms(slave)) { + r.push(`${He} removes the dildo from ${his} throat, leaving the ring gag in place.`); + } else { + r.push(`As an amputee, ${he} requires your assistance to get the dildo out of ${his} throat.`); + } + r.push(`Able to breathe through ${his} mouth for the first time in a while, ${he} gasps gratefully, knowing the respite will be brief.`); + break; + case "massive dildo gag": + if (hasAnyArms(slave)) { + r.push(`${He} struggles to remove the dildo from ${his} throat, leaving ${his} mouth agape.`); + } else { + r.push(`As an amputee, ${he} requires your assistance to get the dildo out of ${his} throat.`); + } + r.push(`Able to breathe through ${his} mouth for the first time in a while, ${he} gasps gratefully, knowing the respite will be brief.`); + break; + case "ball gag": + case "bit gag": + if (hasAnyArms(slave)) { + r.push(`${He} unfastens ${his} gag and pulls it from ${his} mouth.`); + } else { + r.push(`As an amputee, ${he} requires your assistance to get the gag unfastened.`); + } + r.push(`Able to breathe through ${his} mouth for the first time in a while, ${he} gasps gratefully, knowing the respite will be brief.`); + break; + case "ring gag": + if (hasAnyArms(slave)) { + r.push(`${He} unfastens ${his} gag.`); + } else { + r.push(`As an amputee, ${he} requires your assistance to get the gag unfastened.`); + } + r.push(`Able to flew ${his} jaw for the first time in a while, ${he} swallows gratefully, knowing the respite will be brief.`); + } + + if (slave.lipsTat === "tribal patterns") { + r.push(`The tribal patterns on ${his} face enhance ${his} beauty.`); + } else if (slave.lipsTat === "permanent makeup") { + r.push(`${His} tattooed-on makeup encourages it.`); + } else if (slave.lipsTat === "degradation") { + r.push(`The tattoos on ${his} face are asking for it, after all.`); + } + + if (slave.lipsPiercing + slave.tonguePiercing > 2) { + r.push(`The stimulation from ${his} many oral piercings should be great.`); + } else if (slave.lipsPiercing + slave.tonguePiercing > 0) { + r.push(`The sensation of ${his} oral piercings should be quite nice.`); + } + + if (slave.teeth === "removable") { + if (slave.devotion <= 20) { + r.push(`You pull ${his} prosthetic teeth out of ${his} mouth so you can enjoy an extra-soft throatfuck.`); + } else { + r.push(`${He} slides ${his} prosthetic teeth out of ${his} mouth so ${he} can give you an extra-soft suck.`); + } + } + + if (isAmputee(slave)) { + r.push(`You set ${his} limbless torso on the`); + if (V.PC.dick !== 0) { + r.push(`edge of your desk with ${him} on ${his} back. ${His} head dangles off the edge of the desk, leaving ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`mouth at the perfect angle for use. As an amputee ${he} has absolutely no control over the depth or quickness of oral sex, so you are careful not to hurt ${him}. Even so, you take ${him} to the edge of gagging, enjoying the sight of ${his} ${slave.skin} throat bulging. Eventually you shoot your load directly down ${his} gullet.`); + if (V.PC.vagina !== -1) { + r.push(`If ${he} thought that was it, ${he}'s soon corrected: you hike yourself up further, and grind your pussy against ${his} face.`); + } + } else { + r.push(`floor next to your desk and kneel on ${him} with your legs on either side of ${him}, so your pussylips are hard against ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`mouth. ${He} desperately eats you out, trying to get you off as fast as possible so ${he} can get a bit more air, but you grind down without mercy, taking your pleasure.`); + } + } else if (tooBigBelly(slave)) { + r.push(`You get ${him} situated on the edge of your desk, on ${his} back. This pins ${him} down, the massive weight of ${his} belly stopping ${him} from going anywhere at all. ${His} head dangles off the edge of the desk, leaving ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`mouth at the perfect angle for use.`); + if (V.PC.dick !== 0) { + if (slave.bellyImplant >= 1500) { + r.push(`${He} has absolutely no control over the depth or quickness of oral sex, so you are careful not to hurt ${him}. Even so, you take ${him} to the edge of gagging, enjoying the sight of the spasms running through ${his} stomach as ${he} struggles to breathe. Eventually you shoot your load directly down ${his} gullet.`); + } else { + r.push(`${He} has absolutely no control over the depth or quickness of oral sex, so you are careful not to hurt ${him}. Even so, you take ${him} to the edge of gagging, enjoying the sight of ${his} ${slave.skin} throat bulging and every movement within ${his} overstuffed womb as ${he} struggles to breathe. Eventually you shoot your load directly down ${his} gullet.`); + } + if (V.PC.vagina !== -1) { + r.push(`If ${he} thought that was it, ${he}'s soon corrected: you hike yourself up further, and grind your pussy against ${his} face.`); + } + } else { + if (slave.bellyImplant >= 1500) { + r.push(`${He} has absolutely no control over how hard you grind your cunt against ${his} face, so you are careful not to suffocate ${him}. Even so, you take ${him} to the edge, enjoying the sight of the spasms running through ${his} stomach as ${he} struggles to breathe. Eventually you climax, giving ${him} a good`); + if (canTaste(slave)) { + r.push(`taste`); + } else { + r.push(`dose`); + } + r.push(`of your femcum.`); + } else { + r.push(`${He} has absolutely no control over how hard you grind your cunt against ${his} face, so you are careful not to suffocate ${him}. Even so, you take ${him} to the edge, enjoying the sight of the movement within ${his} overstuffed womb as ${he} struggles to breathe. Eventually you climax, giving ${him} a good`); + if (canTaste(slave)) { + r.push(`taste`); + } else { + r.push(`dose`); + } + r.push(`of your femcum.`); + } + } + } else if (tooBigBreasts(slave)) { + r.push(`You get ${him} situated on the edge of your desk, on ${his} back. This pins ${him} down, the massive weight of ${his} tits stopping ${him} from going anywhere at all. ${His} head dangles off the edge of the desk, leaving ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`mouth at the perfect angle for use.`); + r.push(`${He} has absolutely no control over`); + if (V.PC.dick !== 0) { + r.push(`the depth or quickness of oral sex, so you are careful not to hurt ${him}. Even so, you take ${him} to the edge of gagging, enjoying the sight of ${his} ${slave.skin} throat bulging and ${his} absurd boobs jiggling as ${he} struggles to breathe. Eventually you shoot your load directly down ${his} gullet.`); + if (V.PC.vagina !== -1) { + r.push(`If ${he} thought that was it, ${he}'s soon corrected: you hike yourself up further, and grind your pussy against ${his} face.`); + } + } else { + r.push(`how hard you grind your cunt against ${his} face, so you are careful not to suffocate ${him}. Even so, you take ${him} to the edge, enjoying the sight of ${his} absurd boobs jiggling as ${he} struggles to breathe. Eventually you climax, giving ${him} a good`); + if (canTaste(slave)) { + r.push(`taste`); + } else { + r.push(`dose`); + } + r.push(`of your femcum.`); + } + } else if (tooBigButt(slave)) { + r.push(`You get ${him} situated on the edge of your desk, on ${his} back. This anchors ${him}, the massive weight of ${his} ass stopping ${him} from going anywhere at all. ${His} head dangles off the edge of the desk, leaving ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`mouth at the perfect angle for use.`); + if (V.PC.dick !== 0) { + r.push(`${He} has absolutely no control over the depth or quickness of oral sex, so you are careful not to hurt ${him}. Even so, you take ${him} to the edge of gagging, enjoying the sight of ${his} ${slave.skin} throat bulging and ${his} absurd rear jiggling as ${he} struggles to breathe. Eventually you shoot your load directly down ${his} gullet.`); + if (V.PC.vagina !== -1) { + r.push(`If ${he} thought that was it, ${he}'s soon corrected: you hike yourself up further, and grind your pussy against ${his} face.`); + } + } else { + r.push(`${He} has absolutely no control over how hard you grind your cunt against ${his} face, so you are careful not to suffocate ${him}. Even so, you take ${him} to the edge, enjoying the sight of ${his} absurd rear jiggling as ${he} struggles to breathe. Eventually you climax, giving ${him} a good`); + if (canTaste(slave)) { + r.push(`taste`); + } else { + r.push(`dose`); + } + r.push(`of your femcum.`); + } + } else if (slave.fetish === "cumslut" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && slave.dick !== 0 && V.PC.dick !== 0) { + r.push(`${He} comes over eagerly, with hunger`); + if (canSee(slave)) { + r.push(`in ${his} eyes.`); + } else { + r.push(`on ${his} face.`); + } + r.push(`${He} gets to`); + if (hasBothLegs(slave)) { + r.push(`${his} knees,`); + } else { + r.push(`the floor,`); + } + r.push(`hurriedly takes you into ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`mouth, and gives the blowjob ${his} all. As a cumslut ${he}'s almost desperate to get your cum into ${his} mouth and`); + if (slave.chastityPenis === 1) { + r.push(`(since ${his} cock is off limits) frantically rubs ${his} nipples and asspussy`); + } else if (canAchieveErection(slave)) { + r.push(`jacks ${himself} off`); + } else { + r.push(`rubs ${his} sadly limp member`); + } + r.push(`in anticipation.`); + if (V.PC.vagina !== -1) { + r.push(`You have more than one variety of deliciousness for ${him}, and ${he}'s careful not to neglect your wet cunt.`); + } + r.push(`When you finish, ${he} sits back with an ecstatic look on ${his} face and lets your cum rest in ${his} mouth as ${he} climaxes into ${his} ${slave.skin} hand. ${He} pours ${his} own cum from ${his} hand into ${his} mouth so it can mingle with yours.`); + } else if (slave.fetish === "cumslut" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && V.PC.dick !== 0) { + r.push(`${He} comes over eagerly, with hunger`); + if (canSee(slave)) { + r.push(`in ${his} eyes.`); + } else { + r.push(`on ${his} face.`); + } + r.push(`${He} gets to`); + if (hasAnyLegs(slave)) { + r.push(`${his} ${hasBothLegs(slave) ? `knees` : `knee`},`); + } else { + r.push(`the ground,`); + } + r.push(`hurriedly takes you into ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`mouth, and gives the blowjob ${his} all. As a cumslut ${he}'s almost desperate to get your cum into ${his} mouth and rubs ${himself} in anticipation.`); + if (V.PC.vagina !== -1) { + r.push(`You have more than one variety of deliciousness for ${him}, and ${he}'s careful not to neglect your wet cunt.`); + } + r.push(`When you finish, ${he} sits back with an ecstatic look on ${his} face and lets your cum rest in ${his} mouth as ${he} climaxes.`); + } else if (slave.devotion < -20) { + r.push(`${He} tries to back away, so you`); + if (V.PC.dick !== 0) { + if (slave.mouthAccessory === "dildo gag") { + r.push(`grab ${him}; ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`mouth is already held invitingly open by ${his} gag, and ${he}'s prevented from biting. You push ${him} down to`); + if (hasAnyLegs(slave)) { + r.push(`${his} ${hasBothLegs(slave) ? `knees` : `knee`}`); + } else { + r.push(`the ground`); + } + r.push(`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} ${slave.skin} throat ${he} retches through ${his} tears.`); + if (V.PC.vagina !== -1) { + r.push(`${He} has a mere moment to get ${his} breath back before you press your pussy against ${his} unwilling mouth.`); + } + } else if (slave.mouthAccessory === "massive dildo gag") { + r.push(`grab ${him}; ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`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(slave)) { + r.push(`${his} ${hasBothLegs(slave) ? `knees` : `knee`}`); + } else { + r.push(`the ground`); + } + r.push(`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} ${slave.skin} throat ${he} retches through ${his} tears.`); + if (V.PC.vagina !== -1) { + r.push(`${He} has a mere moment to get ${his} breath back before you press your pussy against ${his} unwilling mouth.`); + } + } else { + r.push(`grab ${him} and force a ring gag into ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`mouth. Once you have the straps secured behind ${his} head, ${he}'s prevented from biting. You push ${him} down to`); + if (hasAnyLegs(slave)) { + r.push(`${his} ${hasBothLegs(slave) ? `knees` : `knee`}`); + } else { + r.push(`the ground`); + } + r.push(`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} ${slave.skin} throat ${he} retches through ${his} tears.`); + if (V.PC.vagina !== -1) { + r.push(`${He} has a mere moment to get ${his} breath back before you press your pussy against ${his} unwilling mouth.`); + } + } + } else { + r.push(`seize ${him} and throw ${him} onto the couch face-up, and then kneel on ${him} with your legs on either side of ${his} crying body, so your pussylips are hard against ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`mouth. ${He} desperately eats you out, trying to get you off as fast as possible so ${he} can get a bit more air, but you grind down without mercy, taking your pleasure.`); + } + } else if (slave.devotion <= 20) { + r.push(`${He} comes over reluctantly and begins to`); + if (V.PC.dick !== 0) { + r.push(`give you a blowjob. Deciding that ${he} isn't showing the necessary enthusiasm, you hold ${his} head and fuck ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`face instead${(V.PC.vagina !== -1) ? `, occasionally jerking your dick free to shove your pussy against ${his} face instead` : ``}. ${He} does ${his} best to follow your motions but still splutters and gags. You pull free to cum across ${his} ${slave.skin} face and hair.`); + } else { + r.push(`eat you out. Deciding that ${he} isn't showing the necessary enthusiasm, you hold ${his} head and grind your pussy against ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`face instead. ${He} does ${his} best to follow your motions but still splutters and gasps for air. You climax quickly and haul ${him}`); + if (hasBothLegs(slave)) { + r.push(`to ${his} feet,`); + } else { + r.push(`upright,`); + } + r.push(`kissing the bewildered ${girl} full on the mouth. You can taste yourself on ${his} lips.`); + } + } else { + r.push(`${He} licks ${his} lips`); + if (canSee(slave)) { + r.push(`and looks you in the eyes`); + } + r.push(`as ${he} gets to`); + if (hasBothLegs(slave)) { + r.push(`${his} knees.`); + } else { + r.push(`the floor.`); + } + r.push(He); + if (V.PC.dick !== 0) { + r.push(`gives you a long, deep blowjob. ${He} massages your balls`); + if (V.PC.vagina !== -1) { + r.push(`and pussy`); + } + r.push(`with one hand and ${his} breasts with the other, giving you a show. ${He} sucks your head until you climax, letting your cock pop free of ${his} mouth to shoot pearly cum all across ${his} ${slave.skin} face.`); + } else { + r.push(`eats you out like ${he}'s starving, moaning into your pussy to show off ${his} arousal and add to your pleasure. ${He} massages your perineum with one hand and ${his} breasts with the other, giving you a show. ${He} slowly concentrates more and more attention on your clit until you climax convulsively. You pull ${him}`); + if (hasBothLegs(slave)) { + r.push(`to ${his} feet,`); + } else { + r.push(`upright,`); + } + r.push(`kissing the compliant ${girl} full on the mouth. You can taste yourself on ${his} lips.`); + } + } + + if (["cosmetic braces", "fang", "fangs", "pointy", "straightening braces"].includes(slave.teeth)) { + if (slave.skill.oral >= 100) { + r.push(`${He}'s so orally skilled that ${he} had the confidence to lightly graze you with`); + if (slave.teeth === "pointy") { + r.push(`${his} sharp teeth`); + } else if (slave.teeth === "fangs") { + r.push(`a fang`); + } else if (slave.teeth === "fang") { + r.push(`${his} fang`); + } else { + r.push(`${his} braces`); + } + r.push(`on occasion, a delightfully scary sensation.`); + } else if (slave.skill.oral > 30) { + r.push(`${He}'s sufficiently orally skilled that ${he} managed to accomplish all that without`); + if (slave.teeth === "pointy") { + r.push(`${his} sharp teeth`); + } else if (slave.teeth === "fangs") { + r.push(`any fangs`); + } else if (slave.teeth === "fang") { + r.push(`${his} fang`); + } else { + r.push(`${his} braces`); + } + r.push(`contacting your`); + if (V.PC.dick !== 0) { + r.push(`dick`); + } else { + r.push(`pussy`); + } + r.push(`once.`); + } else if (slave.skill.oral > 10) { + r.push(`With ${his} basic oral skills, ${he} accidentally grazed you with ${his}`); + if (slave.teeth === "pointy") { + r.push(`sharp teeth`); + } else if (slave.teeth === "fangs") { + r.push(`fangs`); + } else if (slave.teeth === "fang") { + r.push(`fang`); + } else { + r.push(`braces`); + } + r.push(`a few times, leaving your`); + if (V.PC.dick !== 0) { + r.push(`dick`); + } else { + r.push(`pussy`); + } + r.push(`slightly the worse for wear.`); + } else { + r.push(`Since ${he} is orally unskilled, you were sporting with your`); + if (V.PC.dick !== 0) { + r.push(`dick`); + } else { + r.push(`pussy`); + } + r.push(`by using ${his} mouth. ${He} did ${his} best to keep ${his}`); + if (slave.teeth === "pointy") { + r.push(`sharp teeth off`); + } else if (slave.teeth === "fangs") { + r.push(`fangs out of`); + } else if (slave.teeth === "fang") { + r.push(`fang out of`); + } else { + r.push(`braces off`); + } + r.push(`you, but you're bleeding a bit down there.`); + } + } + + if (random(1, 100) > (100 + slave.devotion)) { + if (slave.fetish !== "cumslut" && slave.energy <= 95 && slave.sexualFlaw !== "hates oral") { + r.push(`Being facefucked by force has given ${him} a <span class="flaw gain">hatred of oral sex.</span>`); + slave.sexualFlaw = "hates oral"; + } + } else if (random(1, 100) > (110 - slave.devotion)) { + if (V.PC.dick !== 0 && slave.fetish === "none" && slave.sexualFlaw !== "hates oral") { + r.push(`Consummating an enjoyable sexual encounter by drinking your cum has <span class="fetish gain">encouraged ${him} to focus on oral sex.</span>`); + slave.fetish = "cumslut"; + slave.fetishKnown = 1; + } + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fLips.tw b/src/npc/interaction/fLips.tw deleted file mode 100644 index 98cbe6ea37199563dcb410517e306085a7217348..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fLips.tw +++ /dev/null @@ -1,221 +0,0 @@ -:: FLips [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> -<<set getSlave($AS).counter.oral++, $oralTotal++>> - -You tell <<= getSlave($AS).slaveName>> to -<<if ($PC.dick != 0)>> - blow you with $his -<<else>> - please your pussy with $his -<</if>> -<<if (getSlave($AS).lips > 95)>> - facepussy. -<<elseif (getSlave($AS).lips > 70)>> - cartoonish lips. -<<elseif (getSlave($AS).lips > 20)>> - dick-sucking lips. -<<elseif (getSlave($AS).lips > 10)>> - pretty mouth. -<<else>> - whore mouth. -<</if>> - -<<if (getSlave($AS).fetish == "cumslut") && (getSlave($AS).devotion >= -20)>> - $He's delighted at the prospect of $his favorite activity. -<</if>> - -<<switch getSlave($AS).mouthAccessory>> -<<case "dildo gag">> - <<if hasAnyArms(getSlave($AS))>> - $He removes the dildo from $his throat, leaving the ring gag in place. - <<else>> - As an amputee, $he requires your assistance to get the dildo out of $his throat. - <</if>> - Able to breathe through $his mouth for the first time in a while, $he gasps gratefully, knowing the respite will be brief. -<<case "massive dildo gag">> - <<if hasAnyArms(getSlave($AS))>> - $He struggles to remove the dildo from $his throat, leaving $his mouth agape. - <<else>> - As an amputee, $he requires your assistance to get the dildo out of $his throat. - <</if>> - Able to breathe through $his mouth for the first time in a while, $he gasps gratefully, knowing the respite will be brief. -<<case "ball gag" "bit gag">> - <<if hasAnyArms(getSlave($AS))>> - $He unfastens $his gag and pulls it from $his mouth. - <<else>> - 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")>> - The tribal patterns on $his face enhance $his beauty. -<<elseif (getSlave($AS).lipsTat == "permanent makeup")>> - $His tattooed-on makeup encourages it. -<<elseif (getSlave($AS).lipsTat == "degradation")>> - The tattoos on $his face are asking for it, after all. -<</if>> - -<<if (getSlave($AS).lipsPiercing + getSlave($AS).tonguePiercing > 2)>> - The stimulation from $his many oral piercings should be great. -<<elseif (getSlave($AS).lipsPiercing + getSlave($AS).tonguePiercing > 0)>> - The sensation of $his oral piercings should be quite nice. -<</if>> - -<<if (getSlave($AS).teeth == "removable")>> - <<if (getSlave($AS).devotion <= 20)>> - You pull $his prosthetic teeth out of $his mouth so you can enjoy an extra-soft throatfuck. - <<else>> - $He slides $his prosthetic teeth out of $his mouth so $he can give you an extra-soft suck. - <</if>> -<</if>> - -<<if isAmputee(getSlave($AS))>> - You set $his limbless torso on the - <<if ($PC.dick != 0)>> - edge of your desk with $him on $his back. $His head dangles off the edge of the desk, leaving $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>mouth at the perfect angle for use. As an amputee $he has absolutely no control over the depth or quickness of oral sex, so you are careful not to hurt $him. Even so, you take $him to the edge of gagging, enjoying the sight of $his <<= getSlave($AS).skin>> throat bulging. Eventually you shoot your load directly down $his gullet. - <<if $PC.vagina != -1>>If $he thought that was it, $he's soon corrected: you hike yourself up further, and grind your pussy against $his face.<</if>> - <<else>> - floor next to your desk and kneel on $him with your legs on either side of $him, so your pussylips are hard against $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>mouth. $He desperately eats you out, trying to get you off as fast as possible so $he can get a bit more air, but you grind down without mercy, taking your pleasure. - <</if>> -<<elseif tooBigBelly(getSlave($AS))>> - You get $him situated on the edge of your desk, on $his back. This pins $him down, the massive weight of $his belly stopping $him from going anywhere at all. $His head dangles off the edge of the desk, leaving $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>mouth at the perfect angle for use. - <<if ($PC.dick != 0)>> - <<if getSlave($AS).bellyImplant >= 1500>> - $He has absolutely no control over the depth or quickness of oral sex, so you are careful not to hurt $him. Even so, you take $him to the edge of gagging, enjoying the sight of the spasms running through $his stomach as $he struggles to breathe. Eventually you shoot your load directly down $his gullet. - <<else>> - $He has absolutely no control over the depth or quickness of oral sex, so you are careful not to hurt $him. Even so, you take $him to the edge of gagging, enjoying the sight of $his <<= getSlave($AS).skin>> throat bulging and every movement within $his overstuffed womb as $he struggles to breathe. Eventually you shoot your load directly down $his gullet. - <</if>> - <<if $PC.vagina != -1>>If $he thought that was it, $he's soon corrected: you hike yourself up further, and grind your pussy against $his face.<</if>> - <<else>> - <<if getSlave($AS).bellyImplant >= 1500>> - $He has absolutely no control over how hard you grind your cunt against $his face, so you are careful not to suffocate $him. Even so, you take $him to the edge, enjoying the sight of the spasms running through $his stomach as $he struggles to breathe. Eventually you climax, giving $him a good <<if canTaste(getSlave($AS))>>taste<<else>>dose<</if>> of your femcum. - <<else>> - $He has absolutely no control over how hard you grind your cunt against $his face, so you are careful not to suffocate $him. Even so, you take $him to the edge, enjoying the sight of the movement within $his overstuffed womb as $he struggles to breathe. Eventually you climax, giving $him a good <<if canTaste(getSlave($AS))>>taste<<else>>dose<</if>> of your femcum. - <</if>> - <</if>> -<<elseif tooBigBreasts(getSlave($AS))>> - You get $him situated on the edge of your desk, on $his back. This pins $him down, the massive weight of $his tits stopping $him from going anywhere at all. $His head dangles off the edge of the desk, leaving $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>mouth at the perfect angle for use. - $He has absolutely no control over - <<if ($PC.dick != 0)>> - the depth or quickness of oral sex, so you are careful not to hurt $him. Even so, you take $him to the edge of gagging, enjoying the sight of $his <<= getSlave($AS).skin>> throat bulging and $his absurd boobs jiggling as $he struggles to breathe. Eventually you shoot your load directly down $his gullet. - <<if $PC.vagina != -1>>If $he thought that was it, $he's soon corrected: you hike yourself up further, and grind your pussy against $his face.<</if>> - <<else>> - how hard you grind your cunt against $his face, so you are careful not to suffocate $him. Even so, you take $him to the edge, enjoying the sight of $his absurd boobs jiggling as $he struggles to breathe. Eventually you climax, giving $him a good <<if canTaste(getSlave($AS))>>taste<<else>>dose<</if>> of your femcum. - <</if>> -<<elseif tooBigButt(getSlave($AS))>> - You get $him situated on the edge of your desk, on $his back. This anchors $him, the massive weight of $his ass stopping $him from going anywhere at all. $His head dangles off the edge of the desk, leaving $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>mouth at the perfect angle for use. - <<if ($PC.dick != 0)>> - $He has absolutely no control over the depth or quickness of oral sex, so you are careful not to hurt $him. Even so, you take $him to the edge of gagging, enjoying the sight of $his <<= getSlave($AS).skin>> throat bulging and $his absurd rear jiggling as $he struggles to breathe. Eventually you shoot your load directly down $his gullet. - <<if $PC.vagina != -1>>If $he thought that was it, $he's soon corrected: you hike yourself up further, and grind your pussy against $his face.<</if>> - <<else>> - $He has absolutely no control over how hard you grind your cunt against $his face, so you are careful not to suffocate $him. Even so, you take $him to the edge, enjoying the sight of $his absurd rear jiggling as $he struggles to breathe. Eventually you climax, giving $him a good <<if canTaste(getSlave($AS))>>taste<<else>>dose<</if>> of your femcum. - <</if>> -<<elseif (getSlave($AS).fetish == "cumslut") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).dick != 0) && ($PC.dick != 0)>> - $He comes over eagerly, with hunger <<if canSee(getSlave($AS))>>in $his eyes<<else>>on $his face<</if>>. $He gets to <<if hasBothLegs(getSlave($AS))>>$his knees<<else>>the floor<</if>>, hurriedly takes you into $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>mouth, and gives the blowjob $his all. As a cumslut $he's almost desperate to get your cum into $his mouth and <<if (getSlave($AS).chastityPenis == 1)>>(since $his cock is off limits) frantically rubs $his nipples and asspussy<<elseif canAchieveErection(getSlave($AS))>>jacks $himself off<<else>>rubs $his sadly limp member<</if>> in anticipation.<<if $PC.vagina != -1>> You have more than one variety of deliciousness for $him, and $he's careful not to neglect your wet cunt.<</if>> When you finish, $he sits back with an ecstatic look on $his face and lets your cum rest in $his mouth as $he climaxes into $his <<= getSlave($AS).skin>> hand. $He pours $his own cum from $his hand into $his mouth so it can mingle with yours. -<<elseif (getSlave($AS).fetish == "cumslut") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1) && ($PC.dick != 0)>> - $He comes over eagerly, with hunger <<if canSee(getSlave($AS))>>in $his eyes<<else>>on $his face<</if>>. $He gets to <<if hasAnyLegs(getSlave($AS))>>$his knee<<if hasBothLegs(getSlave($AS))>>s<</if>><<else>>the ground<</if>>, hurriedly takes you into $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>mouth, and gives the blowjob $his all. As a cumslut $he's almost desperate to get your cum into $his mouth and rubs $himself in anticipation.<<if $PC.vagina != -1>> You have more than one variety of deliciousness for $him, and $he's careful not to neglect your wet cunt.<</if>> When you finish, $he sits back with an ecstatic look on $his face and lets your cum rest in $his mouth as $he climaxes. -<<elseif getSlave($AS).devotion < -20>> - $He tries to back away, so you - <<if ($PC.dick != 0)>> - <<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).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>> - grab $him and force a ring gag into $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>mouth. Once you have the straps secured behind $his head, $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>> - <</if>> - <<else>> - seize $him and throw $him onto the couch face-up, and then kneel on $him with your legs on either side of $his crying body, so your pussylips are hard against $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>mouth. $He desperately eats you out, trying to get you off as fast as possible so $he can get a bit more air, but you grind down without mercy, taking your pleasure. - <</if>> -<<elseif getSlave($AS).devotion <= 20>> - $He comes over reluctantly and begins to - <<if ($PC.dick != 0)>> - give you a blowjob. Deciding that $he isn't showing the necessary enthusiasm, you hold $his head and fuck $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>face instead<<if $PC.vagina != -1>>, occasionally jerking your dick free to shove your pussy against $his face instead<</if>>. $He does $his best to follow your motions but still splutters and gags. You pull free to cum across $his <<= getSlave($AS).skin>> face and hair. - <<else>> - eat you out. Deciding that $he isn't showing the necessary enthusiasm, you hold $his head and grind your pussy against $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>face instead. $He does $his best to follow your motions but still splutters and gasps for air. You climax quickly and haul $him <<if hasBothLegs(getSlave($AS))>>to $his feet<<else>>upright<</if>>, kissing the bewildered $girl full on the mouth. You can taste yourself on $his lips. - <</if>> -<<else>> - $He licks $his lips <<if canSee(getSlave($AS))>>and looks you in the eyes <</if>>as $he gets to <<if hasBothLegs(getSlave($AS))>>$his knees<<else>>the floor<</if>>. $He - <<if ($PC.dick != 0)>> - gives you a long, deep blowjob. $He massages your balls<<if $PC.vagina != -1>> and pussy<</if>> with one hand and $his breasts with the other, giving you a show. $He sucks your head until you climax, letting your cock pop free of $his mouth to shoot pearly cum all across $his <<= getSlave($AS).skin>> face. - <<else>> - eats you out like $he's starving, moaning into your pussy to show off $his arousal and add to your pleasure. $He massages your perineum with one hand and $his breasts with the other, giving you a show. $He slowly concentrates more and more attention on your clit until you climax convulsively. You pull $him <<if hasBothLegs(getSlave($AS))>>to $his feet<<else>>upright<</if>>, kissing the compliant $girl full on the mouth. You can taste yourself on $his lips. - <</if>> -<</if>> - -<<if ["cosmetic braces", "fang", "fangs", "pointy", "straightening braces"].includes(getSlave($AS).teeth)>> - <<if (getSlave($AS).skill.oral >= 100)>> - $He's so orally skilled that $he had the confidence to lightly graze you with - <<if (getSlave($AS).teeth == "pointy")>> - $his sharp teeth - <<elseif (getSlave($AS).teeth == "fangs")>> - a fang - <<elseif (getSlave($AS).teeth == "fang")>> - $his fang - <<else>> - $his braces - <</if>> - on occasion, a delightfully scary sensation. - <<elseif (getSlave($AS).skill.oral > 30)>> - $He's sufficiently orally skilled that $he managed to accomplish all that without - <<if (getSlave($AS).teeth == "pointy")>> - $his sharp teeth - <<elseif (getSlave($AS).teeth == "fangs")>> - any fangs - <<elseif (getSlave($AS).teeth == "fang")>> - $his fang - <<else>> - $his braces - <</if>> - contacting your <<if ($PC.dick != 0)>>dick<<else>>pussy<</if>> once. - <<elseif (getSlave($AS).skill.oral > 10)>> - With $his basic oral skills, $he accidentally grazed you with $his - <<if (getSlave($AS).teeth == "pointy")>> - sharp teeth - <<elseif (getSlave($AS).teeth == "fangs")>> - fangs - <<elseif (getSlave($AS).teeth == "fang")>> - fang - <<else>> - braces - <</if>> - a few times, leaving your <<if ($PC.dick != 0)>>dick<<else>>pussy<</if>> slightly the worse for wear. - <<else>> - Since $he is orally unskilled, you were sporting with your <<if ($PC.dick != 0)>>dick<<else>>pussy<</if>> by using $his mouth. $He did $his best to keep $his - <<if (getSlave($AS).teeth == "pointy")>> - sharp teeth off - <<elseif (getSlave($AS).teeth == "fangs")>> - fangs out of - <<elseif (getSlave($AS).teeth == "fang")>> - fang out of - <<else>> - braces off - <</if>> - you, but you're bleeding a bit down there. - <</if>> -<</if>> - -<<if (random(1,100) > (100 + getSlave($AS).devotion))>> - <<if (getSlave($AS).fetish != "cumslut") && (getSlave($AS).energy <= 95) && (getSlave($AS).sexualFlaw != "hates oral")>> - Being facefucked by force has given $him a @@.flaw.gain;hatred of oral sex.@@ - <<set getSlave($AS).sexualFlaw = "hates oral">> - <</if>> -<<elseif (random(1,100) > (110 - getSlave($AS).devotion))>> - <<if ($PC.dick != 0) && (getSlave($AS).fetish == "none") && (getSlave($AS).sexualFlaw != "hates oral")>> - Consummating an enjoyable sexual encounter by drinking your cum has @@.fetish.gain;encouraged $him to focus on oral sex.@@ - <<set getSlave($AS).fetish = "cumslut", getSlave($AS).fetishKnown = 1>> - <</if>> -<</if>> diff --git a/src/npc/interaction/fMaternitySwing.js b/src/npc/interaction/fMaternitySwing.js new file mode 100644 index 0000000000000000000000000000000000000000..7f0c52f240d90a8aa729cf62fa01c1d85307f53d --- /dev/null +++ b/src/npc/interaction/fMaternitySwing.js @@ -0,0 +1,78 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fMaternitySwing = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, + he, his, him, himself + } = getPronouns(slave); + + slave.partners.add(-1); + + r.push(`You call ${him} over and hook ${him} into the reinforced silk maternity swing built into your office, then lift ${him} into the air so that you can toy with ${his} hyperfecund body. Once you have ${him} properly situated with ${his}`); + if (slave.boobs >= 20000) { + r.push(`obscenely bloated boobs`); + } else if (Math.floor(slave.boobsImplant/slave.boobs) >= .60) { + r.push(`augmented balloon boobies`); + } else if (slave.boobs >= 3000) { + r.push(`enormous breasts`); + } else { + r.push(`cute tits`); + } + r.push(`and`); + if (slave.bellyPreg >= 1000000) { + r.push(`ridiculously enormous, baby packed belly`); + } else if (slave.bellyPreg >= 750000) { + r.push(`mountainous, baby-stuffed gut`); + } else if (slave.bellyPreg >= 600000) { + r.push(`titanic, baby swollen womb`); + } else { + r.push(`massive belly`); + } + r.push(`hanging above the floor of your office, you turn your attention to molesting ${his} ripe protuberances. Running your tongue along the distended nub of ${his} belly button, you kiss your way up the fertile curve of ${his} belly, making your way to ${his} tits so that you can suck on ${his} ${slave.nipples} nipples. ${He} squirms in ${his} restraints and`); + if (slave.devotion > 95) { + if (!canTalk(slave)) { + r.push(`begs you to fuck ${him} already`); + } else { + r.push(`groans inchoately, obviously desperate for you to fuck ${him}`); + } + } else if (slave.trust < -20 && slave.devotion > -10) { + r.push(`groans with barely restrained lust.`); + } else { + r.push(`groans in lust and terror.`); + } + r.push(`You strap into your own customized version of the device, then elevate your body so that`); + if (V.PC.dick !== 0) { + r.push(`your dick`); + } else { + r.push(`the device's built-in strap-on`); + } + r.push(`is at the perfect angle to drive yourself and your`); + if (slave.bellyPreg >= 600000) { + r.push(`brood-slave`); + } else { + r.push(`glorified belly balloon`); + } + r.push(`into a string of mutual orgasms with some truly astounding aerial sex.`); + if (canDoVaginal(slave)) { + r.push(VCheck.Vaginal(slave, 1)); + } else { + r.push(VCheck.Anal(slave, 1)); + } + r.push(`The sight of ${his} swollen body wobbling in mid-air as you pound away at ${him} never gets old,`); + if (slave.devotion > 95) { + r.push(`and ${he} certainly seems to enjoy your ministrations, too.`); + } else if (slave.trust < -20 && slave.devotion > -10) { + r.push(`and, by the end of your session, ${he} seems to be enjoying ${himself}, too.`); + } else { + r.push(`and the sight of ${his} ugly tears rolling down ${his} face to hit the ground far below is one hell of a bonus.`); + } + r.push(`Once finished, you release ${him} from ${his} restraints and have ${him} carried away to clean ${himself} up before returning to ${his} duties.`); + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fMaternitySwing.tw b/src/npc/interaction/fMaternitySwing.tw deleted file mode 100644 index 7fc101b9ba4be4591aa825c919d961b5ed29ee9a..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fMaternitySwing.tw +++ /dev/null @@ -1,54 +0,0 @@ -:: FMaternitySwing [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run getSlave($AS).partners.add(-1)>> - -You call $him over and hook $him into the reinforced silk maternity swing built into your office, then lift $him into the air so that you can toy with $his hyperfecund body. Once you have $him properly situated with $his -<<if getSlave($AS).boobs >= 20000>> - obscenely bloated boobs -<<elseif Math.floor(getSlave($AS).boobsImplant/getSlave($AS).boobs) >= .60>> - augmented balloon boobies -<<elseif getSlave($AS).boobs >= 3000>> - enormous breasts -<<else>> - cute tits -<</if>> -and -<<if getSlave($AS).bellyPreg >= 1000000>> - ridiculously enormous, baby packed belly -<<elseif getSlave($AS).bellyPreg >= 750000>> - mountainous, baby-stuffed gut -<<elseif getSlave($AS).bellyPreg >= 600000>> - titanic, baby swollen womb -<<else>> - massive belly -<</if>> -hanging above the floor of your office, you turn your attention to molesting $his ripe protuberances. Running your tongue along the distended nub of $his belly button, you kiss your way up the fertile curve of $his belly, making your way to $his tits so that you can suck on $his <<= getSlave($AS).nipples>> nipples. $He squirms in $his restraints and -<<if getSlave($AS).devotion > 95>> - <<if !canTalk(getSlave($AS))>> - begs you to fuck $him already - <<else>> - groans inchoately, obviously desperate for you to fuck $him - <</if>> -<<elseif (getSlave($AS).trust < -20) && (getSlave($AS).devotion > -10)>> - groans with barely restrained lust. -<<else>> - groans in lust and terror. -<</if>> -You strap into your own customized version of the device, then elevate your body so that <<if $PC.dick != 0>>your dick<<else>>the device's built-in strap-on<</if>> is at the perfect angle to drive yourself and your -<<if getSlave($AS).bellyPreg >= 600000>> - brood-slave -<<else>> - glorified belly balloon -<</if>> -into a string of mutual orgasms with some truly astounding aerial sex. -<<if canDoVaginal(getSlave($AS))>><<= VCheck.Vaginal(getSlave($AS), 1)>><<else>><<= VCheck.Anal(getSlave($AS), 1)>><</if>> -The sight of $his swollen body wobbling in mid-air as you pound away at $him never gets old, -<<if getSlave($AS).devotion > 95>> - and $he certainly seems to enjoy your ministrations, too. -<<elseif (getSlave($AS).trust < -20) && (getSlave($AS).devotion > -10)>> - and, by the end of your session, $he seems to be enjoying $himself, too. -<<else>> - and the sight of $his ugly tears rolling down $his face to hit the ground far below is one hell of a bonus. -<</if>> -Once finished, you release $him from $his restraints and have $him carried away to clean $himself up before returning to $his duties. diff --git a/src/npc/interaction/fNippleFuck.js b/src/npc/interaction/fNippleFuck.js new file mode 100644 index 0000000000000000000000000000000000000000..4559f648a891f41b0832d59d5f47c4536f3774ba --- /dev/null +++ b/src/npc/interaction/fNippleFuck.js @@ -0,0 +1,111 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fNippleFuck = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself + } = getPronouns(slave); + + addPartner(slave, -1); + + slave.counter.mammary += 2; + V.mammaryTotal += 2; + + r.push(`You call ${him} over to make use of ${his} lewd nipple cunts.`); + if (slave.fetish === "boobs" && slave.fetishKnown === 1) { + r.push(`${He} practically vibrates with excitement at the prospect of getting ${his} tits fucked.`); + } else if (slave.boobs >= 40000) { + r.push(`You set out a few cushions on the floor for ${him} and let ${his} breasts spill across them.`); + } else if (slave.boobs >= 20000) { + r.push(`It takes a moment to find a table that can support ${his} breasts and withstand your lovemaking.`); + } else { + r.push(`You settle ${him} on a couch and have ${him} present ${his} chest to you.`); + } + + r.push(`Once ${he} seems comfortable, you turn your attention to ${his} chest. You start by groping and nuzzling ${his} breasts, teasing ${his} nipples with your tongue.`); + + if (slave.lactation > 0) { + r.push(`It doesn't take much stimulation before milk starts dribbling onto your tongue.`); + } + + if (slave.devotion > 20 || slave.trust > 20) { + r.push(`${He} starts making soft noises of pleasure and luxuriates in your attentions.`); + } else { + r.push(`${He} fidgets at your ministrations, but doesn't say anything.`); + } + r.push(`Once you're satisfied, you line up your dick with ${his} right nipple and slowly ease yourself into ${him}.`); + + if (slave.lactation > 0) { + r.push(`Milk gushes around your length and soaks your crotch, the feeling almost like a waterjet, as ${his}`); + } else { + r.push(`${His}`); + } + r.push(`breast flesh grips you tightly. A few experimental pumps draws gasps from ${him} before you start to thrust in earnest. Soon, the room is filled with ${his} moaning and the sound of flesh on flesh.`); + + + if (slave.fetish === "boobs" && slave.fetishKnown === 1) { + r.push(`${He} has a glassy-eyed expression as ${he}`); + if (hasAnyArms(slave)) { + r.push(`gropes ${his} breasts with`); + if (hasBothArms(slave)) { + r.push(`both hands`); + } else { + r.push(`${his} hand`); + } + r.push(`, fingering ${his} unoccupied nipple in time with your thrusts.`); + } else { + r.push(`savors the sensations running through ${his} breast.`); + } + } else if (slave.devotion > 20 || slave.trust > 20) { + r.push(`${He} has a glassy-eyed expression as ${he}`); + if (hasBothArms(slave)) { + r.push(`gropes ${his} breasts with one hand and furiously abuses ${his} clit with the other.`); + } else if (hasAnyArms(slave)) { + r.push(`fingers ${his} pussy while rubbing ${his} arm alongside ${his} breasts.`); + } else { + r.push(`tries ${his} hardest to pleasure ${himself} with no hands.`); + } + } else { + r.push(`${He} turns ${his} gaze away from you as a blush suffuses ${his} cheeks and does ${his} best to suppress ${his} moans.`); + } + + r.push(`As your orgasm begins to build, you roughly grasp ${his} shoulders and begin to pick up the pace.`); + + if (slave.fetish === "boobs" && slave.fetishKnown === 1) { + r.push(`As ${he} reaches ${his} climax, ${his} eyes roll back into ${his} head and ${he} quivers in delight at the intense breastgasm ${he} just sustained.`); + } else if (slave.devotion > 20 || slave.trust > 20) { + r.push(`Eager for release, ${his} moaning grows louder and higher in pitch`); + if (hasAnyArms(slave)) { + r.push(`, and ${his} self-molesting becomes furious and desperate`); + } + r.push(`.`); + } else { + r.push(`As ${he} reaches ${his} climax, ${his} body seems to tense and ${he} bites ${his} lip.`); + } + + r.push(`It only takes few more thrusts before you bottom out inside ${his} breast and release your load deep inside ${him}. You pull yourself free with a lewd sound and proudly survey what you've wrought. Cum`); + if (slave.lactation > 0) { + r.push(`and milk dribble`); + } else { + r.push(`dribbles`); + } + r.push(`from ${his} gaping nipple. Enjoying the sight, you begin to feel yourself hardening and line up your dick at ${his} left nipple for a repeat performance.`); + + if (slave.lactation > 0) { + slave.lactationDuration = 2; + slave.boobs -= slave.boobsMilk; + slave.boobsMilk = 0; + } else { + r.push(induceLactation(slave)); + } + + r.push(`Once both ${his} breasts have been thoroughly fucked, you send ${him} away to clean ${himself} up.`); + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fNippleFuck.tw b/src/npc/interaction/fNippleFuck.tw deleted file mode 100644 index c24bc0e0700cb4ae2311d58eb17109ac4d3bc297..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fNippleFuck.tw +++ /dev/null @@ -1,81 +0,0 @@ -:: FNippleFuck [nobr no-history] - -<<run Enunciate(getSlave($AS))>> -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> - -<<set getSlave($AS).counter.mammary += 2>> -<<set $mammaryTotal += 2>> - -You call $him over to make use of $his lewd nipple cunts. -<<if getSlave($AS).fetish == "boobs" && getSlave($AS).fetishKnown == 1>> - $He practically vibrates with excitement at the prospect of getting $his tits fucked. -<<elseif getSlave($AS).boobs >= 40000>> - You set out a few cushions on the floor for $him and let $his breasts spill across them. -<<elseif getSlave($AS).boobs >= 20000>> - It takes a moment to find a table that can support $his breasts and withstand your lovemaking. -<<else>> - You settle $him on a couch and have $him present $his chest to you. -<</if>> - -Once $he seems comfortable, you turn your attention to $his chest. You start by groping and nuzzling $his breasts, teasing $his nipples with your tongue. - -<<if getSlave($AS).lactation > 0>> - It doesn't take much stimulation before milk starts dribbling onto your tongue. -<</if>> - -<<if getSlave($AS).devotion > 20 || getSlave($AS).trust > 20>> - $He starts making soft noises of pleasure and luxuriates in your attentions. -<<else>> - $He fidgets at your ministrations, but doesn't say anything. -<</if>> -Once you're satisfied, you line up your dick with $his right nipple and slowly ease yourself into $him. - -<<if getSlave($AS).lactation > 0>> - Milk gushes around your length and soaks your crotch, the feeling almost like a waterjet, as $his -<<else>> - $His -<</if>> -breast flesh grips you tightly. A few experimental pumps draws gasps from $him before you start to thrust in earnest. Soon, the room is filled with $his moaning and the sound of flesh on flesh. - - -<<if getSlave($AS).fetish == "boobs" && getSlave($AS).fetishKnown == 1>> - $He has a glassy-eyed expression as $he - <<if hasAnyArms(getSlave($AS))>> - gropes $his breasts with <<if hasBothArms(getSlave($AS))>>both hands<<else>>$his hand<</if>>, fingering $his unoccupied nipple in time with your thrusts. - <<else>> - savors the sensations running through $his breast. - <</if>> -<<elseif getSlave($AS).devotion > 20 || getSlave($AS).trust > 20>> - $He has a glassy-eyed expression as $he - <<if hasBothArms(getSlave($AS))>> - gropes $his breasts with one hand and furiously abuses $his clit with the other. - <<elseif hasAnyArms(getSlave($AS))>> - fingers $his pussy while rubbing $his arm alongside $his breasts. - <<else>> - tries $his hardest to pleasure $himself with no hands. - <</if>> -<<else>> - $He turns $his gaze away from you as a blush suffuses $his cheeks and does $his best to suppress $his moans. -<</if>> - -As your orgasm begins to build, you roughly grasp $his shoulders and begin to pick up the pace. - -<<if getSlave($AS).fetish == "boobs" && getSlave($AS).fetishKnown == 1>> - As $he reaches $his climax, $his eyes roll back into $his head and $he quivers in delight at the intense breastgasm $he just sustained. -<<elseif getSlave($AS).devotion > 20 || getSlave($AS).trust > 20>> - Eager for release, $his moaning grows louder and higher in pitch<<if hasAnyArms(getSlave($AS))>>, and $his self-molesting becomes furious and desperate<</if>>. -<<else>> - As $he reaches $his climax, $his body seems to tense and $he bites $his lip. -<</if>> - -It only takes few more thrusts before you bottom out inside $his breast and release your load deep inside $him. You pull yourself free with a lewd sound and proudly survey what you've wrought. Cum <<if getSlave($AS).lactation > 0>>and milk dribble<<else>>dribbles<</if>> from $his gaping nipple. Enjoying the sight, you begin to feel yourself hardening and line up your dick at $his left nipple for a repeat performance. - -<<if getSlave($AS).lactation > 0>> - <<set getSlave($AS).lactationDuration = 2>> - <<set getSlave($AS).boobs -= getSlave($AS).boobsMilk, getSlave($AS).boobsMilk = 0>> -<<else>> - <<= induceLactation(getSlave($AS))>> -<</if>> - -Once both $his breasts have been thoroughly fucked, you send $him away to clean $himself up. diff --git a/src/npc/interaction/fPCImpreg.js b/src/npc/interaction/fPCImpreg.js index 2d326bdfe4a115e34e6192567af5be5f2a5cc6ea..88d1caa54decb7540485368b697a0d0624048a8a 100644 --- a/src/npc/interaction/fPCImpreg.js +++ b/src/npc/interaction/fPCImpreg.js @@ -264,7 +264,7 @@ App.Interact.fPCImpreg = function(slave) { text.push(`is <span class="pregnant">carrying your child.</span>`); } - if (V.arcologies[0].FSRestart !== 'unset' && (!slave.breedingMark || !V.propOutcome) && V.eugenicsFullControl) { + if (V.arcologies[0].FSRestart !== 'unset' && (!slave.breedingMark || V.propOutcome === 0) && V.eugenicsFullControl !== 1) { text.push(`Rumors spread about you fucking your slaves pregnant; the Societal Elite are <span class="reputation dec">very displeased</span> by these rumors.`); V.failedElite += 5; @@ -273,30 +273,24 @@ App.Interact.fPCImpreg = function(slave) { if (V.arcologies[0].FSGenderRadicalist !== 'unset' && slave.mpreg) { text.push(`Society <span class="reputation inc">approves</span> of your fucking your slaves' asses pregnant; this advances the ideal all a slave needs is ${his} rear.`); - // FIXME: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. repX(V.FSSingleSlaveRep * (V.arcologies[0].FSGenderRadicalist / V.FSLockinLevel), 'futureSocieties', slave); - // FIXME: Operator '+=' cannot be applied to types 'string | number' and 'number'. V.arcologies[0].FSGenderRadicalist += 0.05 * V.FSSingleSlaveRep; } else if (V.arcologies[0].FSGenderFundamentalist !== 'unset') { if (slave.mpreg) { text.push(`Society <span class="reputation inc">approves</span> of your putting a new slave in ${him}; this advances the idea that all slaves should bear their masters' babies.`); - // FIXME: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. repX(forceNeg(V.FSSingleSlaveRep * (V.arcologies[0].FSGenderFundamentalist / V.FSLockinLevel)), 'futureSocieties', slave); - // FIXME: Operator '+=' cannot be applied to types 'string | number' and 'number'. V.arcologies[0].FSGenderFundamentalist -= 0.05 * V.FSSingleSlaveRep; } else { text.push(`Society <span class="reputation dec">is disgusted</span> by this degenerate form of reproduction.`); - // FIXME: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. repX(V.FSSingleSlaveRep * (V.arcologies[0].FSGenderFundamentalist / V.FSLockinLevel), 'futureSocieties', slave); - // FIXME: Operator '+=' cannot be applied to types 'string | number' and 'number'. V.arcologies[0].FSGenderFundamentalist += 0.05 * V.FSSingleSlaveRep; } } addPartner(slave, -1); - knockMeUp(slave, 100, 2, -1, true); + knockMeUp(slave, 100, 2, -1); App.Events.addNode(frag, text); diff --git a/src/npc/interaction/fPat.js b/src/npc/interaction/fPat.js new file mode 100644 index 0000000000000000000000000000000000000000..567d9de68f27606fcce7e66a9b31048b39b402c3 --- /dev/null +++ b/src/npc/interaction/fPat.js @@ -0,0 +1,584 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fPat = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself, woman, girl, wife + } = getPronouns(slave); + + const {title: Master, say: say} = getEnunciation(slave); + + const { + hisP, womanP, + } = getPronouns(V.PC).appendSuffix("P"); + + slave.partners.add(-1); + const isBald = slave.hStyle.includes("bald") || slave.bald === 1; + + r.push(`You tell ${slave.slaveName} to`); + if (!hasAnyLegs(slave)) { + r.push(`have another slave set ${him} up onto your desk.`); + } else if (tooBigBreasts(slave)) { + r.push(`have another slave help ${him} heft ${his} tits so ${he} can be near you.`); + } else if (tooBigBelly(slave)) { + r.push(`have another slave help ${him} heft ${his} belly so ${he} can be near you.`); + } else if (tooBigButt(slave)) { + r.push(`have another slave help ${him} heft ${his} ass cheeks so ${he} can be near you.`); + } else if (tooBigDick(slave)) { + r.push(`have another slave help ${him} heft ${his} cock so ${he} can be near you.`); + } else if (tooBigBalls(slave)) { + r.push(`have another slave help ${him} heft ${his} balls so ${he} can be near you.`); + } else if (tooFatSlave(slave)) { + r.push(`have another slave help ${him} up so ${he} can be near you.`); + } else { + r.push(`move closer towards you.`); + } + + /* approach*/ + + if (slave.fetish === "mindbroken" && slave.relationship !== -3) { + r.push(`${He} complies robotically. ${He} remembers that when ${getWrittenTitle(slave)}'s commands are not obeyed, there is punishment.`); + } else if (slave.relationship === -2) { + r.push(`${He} eagerly complies, happy to be near the object of ${his} longing. Once ${he}'s close, you hold ${his} face in your palms and gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he} loves overwhelming, and ${his} eyes flick downward after a moment.`); + } else { + r.push(`upon ${his} face. ${He} finds the intense look from the ${womanP} ${he} loves overwhelming, and after a moment glances away.`); + } + r.push(`${He} blushes furiously.`); + } else if (slave.relationship === -3) { + if (slave.fetish === "mindbroken") { + r.push(`${He} complies mechanically. ${He} remembers that when ${getWrittenTitle(slave)}'s commands are not obeyed, there is punishment. Once ${he}'s close, you hold ${his} face in your palms and look into ${his} empty ${App.Desc.eyesColor(slave)}. ${He} shows no reaction`); + } else if (slave.devotion+slave.trust >= 175) { + r.push(`${He} complies in a ${wife}ly fashion, moving ${his} body as ${he} approaches to best enflame your desire, eager to be close to the ${womanP} who married ${him}. Once ${he}'s close, you hold ${his} face in your palms and gaze`); + if (canSee(slave)) { + r.push(`deeply into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s married to affirming, and looks down with a smile, running ${his} eyes over your`); + if (V.PC.boobs >= 300) { + r.push(`bosom.`); + } else { + r.push(`chest.`); + } + } else { + r.push(`upon ${his} face. ${He} finds the intense look from the ${womanP} ${he}'s married to affirming, and looks down with a smile.`); + } + } else if (slave.devotion < -20 && slave.trust > 20) { + r.push(`${He} complies. Once ${he}'s close, you hold ${his} face in your palms and take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} tearful ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s forcibly married too disturbing, and breaks eye contact.`); + } else { + r.push(`upon ${his} face. ${He} can feel the intense gaze of the ${womanP} ${he}'s forcibly married to, and finds it disturbing. ${He} quickly turns ${his} face away.`); + } + } else if (slave.devotion < -20) { + r.push(`${He} complies out of fear. Once ${he}'s close, you hold ${his} quivering face in your palms and take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} teary ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s forcibly married to terrifying, and quickly breaks eye contact.`); + } else { + r.push(`upon ${his} tear-streaked face. ${He} can feel the intense look from the ${womanP} ${he}'s forcibly married to, and it is horrifying, causing ${him} to turn ${his} face away after only a moment.`); + } + } else { + r.push(`${He} complies obediently. Once ${he}'s close, you hold ${his} face in your palms and take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s married to reassuring, and looks down with a slight smile, running ${his} eyes over your`); + if (V.PC.boobs >= 300) { + r.push(`bosom.`); + } else { + r.push(`chest.`); + } + } else { + r.push(`upon ${his} face. The intense look from the ${womanP} ${he}'s married to is reassuring to ${him}, and ${he} looks down with a slight smile.`); + } + } + } else if (slave.devotion > 75) { + r.push(`${He} hurriedly complies, happy to be near you. Once ${he}'s close, you hold ${his} face in your palms and take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from ${his} beloved ${getWrittenTitle(slave)} disconcerting, and ${his} eyes flick downward after a moment.`); + } else { + r.push(`upon ${his} face. ${He} can feel the intense look from ${his} beloved ${Master} and it is disconcerting, causing ${him} to glance away after only a moment, ${his} face flushed.`); + } + r.push(`${He} blushes furiously.`); + } else if (slave.devotion > 50) { + r.push(`${He} hurriedly complies, happy to be near you. Once ${he}'s close, you hold ${his} face in your palms and take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} disconcerting, and ${he} looks down after a moment, blushing.`); + } else { + r.push(`upon ${his} face. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} disconcerting, and it causes ${him} to glance away after only a moment, blushing.`); + } + } else if (slave.devotion > 20) { + r.push(`${He} hurriedly complies, happy to be near you. Once ${he}'s close, you hold ${his} face in your palms and take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and ${he} looks down after a moment, blushing nervously.`); + } else { + r.push(`upon ${his} face. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and ${he} looks down after a moment, blushing nervously.`); + } + } else if (slave.devotion < -20 && slave.trust >= 20) { + r.push(`${He} seems to visibly consider disobedience, but apparently decides your order is harmless enough. ${He} does as ${he} is told,`); + if (canSee(slave)) { + r.push(`giving you a defiant stare as ${he} does so.`); + } else { + r.push(`defiantly staring in your direction.`); + } + } else if (slave.devotion >= -20 && slave.trust >= -20) { + r.push(`${He} visibly considers disobedience, but decides that complying with such an apparently harmless order is safe, for now. Once ${he}'s close, you hold ${his} face in your palms and take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his}`); + getWrittenTitle(slave); + r.push(`troubling, and ${he} looks down after a moment, ${his} lower lip trembling with nervousness.`); + } else { + r.push(`upon ${his} face. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and turns away after a moment, ${his} lower lip trembling with nervousness.`); + } + } else if (slave.trust < -20) { + r.push(`The command terrifies ${him}, but ${he}'s more frightened still of the consequences of disobedience, and ${he} complies. Once ${he}'s close, you hold ${his} face in your palms and take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. After a mere instant of locked faces, ${he} looks down fearfully and begins to shake with terror, tears leaking silently down ${his} cheeks.`); + } else { + r.push(`upon ${his} face. After a mere instant of locked faces, ${he} looks down fearfully and begins to shake with terror, tears leaking silently down ${his} cheeks.`); + } + } else { + r.push(`${He} pauses, obviously considering whether to resist, but eventually decides to save ${his} strength to fight more onerous orders, and gives in. Once ${he}'s close, you hold ${his} face in your palms and take a moment to gaze deeply`); + if (canSee(slave)) { + r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} stares back, but after a few moments ${he} loses the contest of wills and looks down.`); + } else { + r.push(`upon ${his} face. ${He} faces you defiantly, but after a few moments ${he} loses the contest of wills and looks down.`); + } + } + + /* action */ + + r.push(`You walk around ${him}, drawing closer and slowly resting your hand on ${his} head. You let it rest for a few seconds to get ${him} accustomed to your touch.`); + if (slave.fetish === "mindbroken") { + r.push(`Tenderly and lovingly you brush your fingers along ${his} head, enjoying the feeling of your poor mentally shattered slave's inability to resist you. ${He} initially reacts slightly to your physical touch, but soon stops reacting completely. Nevertheless, you continue to gingerly stroke ${his}`); + if (isBald) { + r.push(`shaven scalp,`); + } else { + r.push(`hair,`); + } + r.push(`as you gently press ${his} body into your chest${!hasAnyLegs(slave) ? ` and onto your lap` : ``}. The warmth from your slave's body, and the action of petting ${his} head, combined with the sound of ${his} breathing, allow you to feel more relaxed by the minute.`); + } else if ((slave.relationship === -3) && slave.devotion+slave.trust >= 175) { + r.push(`Tenderly and lovingly you brush your fingers along ${his} head, enjoying the feeling of your slave's utterly willing submission. ${He} slowly leans ${his} body closer and closer to you${!hasAnyLegs(slave) ? ` and finally onto your lap` : ``}, relaxing as ${he} feels your caress. As ${he} shifts ${his} weight to your chest, ${he} feels all of the daily stresses of the day melt away, and a deep, happy sigh escapes ${his} lips. You smile fondly, allowing all of the troubles of being an arcology owner dissipate, in a similar fashion to your slave. For now, just for now, you are just a ${womanP} and ${hisP} devoted and content ${wife}.`); + } else if (slave.relationship === -2) { + r.push(`Tenderly and lovingly you brush your fingers along ${his} head, for a moment, appreciating how easily your slave submits to your desire to pat ${his} head. ${He} slowly leans ${his} body closer and closer to you${!hasAnyLegs(slave) ? `allowing you to move ${him} onto your lap` : ``}, relaxing as ${he} feels your caresses. As ${his} weight falls onto you, all of the stress from ${his} body melts away, and a small, respectful sigh escapes ${his} pursed lips. You smile fondly, allowing all of the troubles of being an arcology owner drift away, in a similar fashion to your slave. For now, just for now, you are just a ${womanP} and ${hisP} devoted and content servant.`); + } else if (slave.devotion > 50 && slave.fetish === "dom" && slave.fetishKnown === 1 && slave.fetishStrength > 60 && hasAnyArms(slave)) { + r.push(`As you start to touch ${him} ${he} smiles at you and takes your hand, following its movements. You tenderly and lovingly kiss it and let it rest on the side of ${his} head, before continuing with your ministrations. As opposed to your more submissive slaves, ${slave.slaveName} takes an active role in your petting, gently guiding where your hand goes along ${his} head. You enjoy the feel of ${his} hand on yours, as well as ${his}`); + if (isBald) { + r.push(`smooth scalp.`); + } else { + r.push(`hair.`); + } + } else if (slave.devotion > 50 && slave.fetish === "submissive" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`${He} stiffens at your touch but slowly relaxes at the sensation of your hand on ${his} head. You tenderly and lovingly stroke your fingers along ${his} scalp, enjoying the feeling of your slave's subservience. ${He} gently, submissively, presses ${his} head against your hand, like a dog. As you continue`); + if (isBald) { + r.push(`kneading ${his} shaved scalp,`); + } else { + r.push(`stroking ${his} hair,`); + } + r.push(`${he} starts to clutch ${his} thighs, and if you listen you can hear subdued whimpers. ${He} looks up at you with adoring eyes, and relishes in the pureness of this act as ${his} master's pet to ${his} beloved ${getWrittenTitle(slave)}.`); + } else if (slave.devotion > 50) { + r.push(`${He} accepts it with devotion, leaning back into your gentle caresses. You tenderly and lovingly brush your fingers along ${his} head, enjoying the feeling of your slave's willingness to set aside ${his} dignity for headpats. ${He} leans ${his} body backward, pressing ${himself} against you. You can feel the intense heat from ${his} body against your`); + if (V.PC.boobs >= 300) { + r.push(`soft breasts.`); + } else { + r.push(`manly chest.`); + } + r.push(`You take your time enjoying the sensation of`); + if (isBald) { + r.push(`rubbing your slave's smooth scalp,`); + } else { + r.push(`gently running your fingers through your slave's hair,`); + } + r.push(`and your slave smiles happily as you do. As you continue with your ministrations, you can see all of the stress present in your slave's shoulders dissipate, and you feel a good deal of your own tension start to melt away as well.`); + } else if (slave.devotion > 20) { + r.push(`${He} willingly accepts it. As you tenderly and lovingly brush your fingers along ${his} head, enjoying the feeling of your slave's roiling emotions, and finally submission. You can still sense considerable turmoil in the`); + if (slave.physicalAge > 30) { + r.push(`${woman};`); + } else { + r.push(`${girl};`); + } + r.push(`${he}'s doing ${his} duty as a slave by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of ${his} mind by your touch. As you continue your ministrations, your slave slowly, and with more then a bit of uncertainty, finally starts to relax. ${He} looks at you with confusion and trepidation. Your eyes betray nothing however — you simply smile and press ${his} head into your`); + if (V.PC.boobs >= 300) { + r.push(`soft breasts,`); + } else { + r.push(`masculine chest,`); + } + r.push(`all the while enjoying the feeling of your`); + if (isBald) { + r.push(`hands gliding over ${his} smooth head.`); + } else { + r.push(`fingers gliding through ${his} hair.`); + } + } else if (slave.devotion < -20 && slave.trust >= 20) { + r.push(`${He} doesn't react to your touch, remaining as still as statue, the same defiant expression on ${his} face. ${He} still doesn't react when you brush your fingers down the side of ${his} head or when you`); + if (isBald) { + r.push(`stroke ${his} smooth head.`); + } else { + r.push(`run your fingers through ${his} hair.`); + } + r.push(`${He} does react when you gently rest your thumb on ${his} lips, however, by suddenly giving you a fierce bite. Cursing, you pull your hand back and examine it — ${he} didn't bite deep enough to draw blood, but the area is now red and puffy. Furious, you backhand ${him} across the`); + if (random(1, 100) > 80) { + slave.minorInjury = either("black eye", "bruise", "split lip"); + r.push(`face, giving ${him} a <span class="health dec">${slave.minorInjury}</span>.`); + } else { + r.push(`face.`); + } + } else if (slave.devotion >= -20 && slave.trust < -20) { + r.push(`${He} shakes at your touch fearfully. As you tenderly brush your fingers down ${his} unresisting head, you appreciate this expression of your slave's subservience, ${his} eagerness to avoid punishment making ${him} stiffen, ${his} nervousness easily apparent. You continue stroking ${him}, enjoying ${his} fear, as the physical intimacy slowly does its work. ${He} starts to relax, ${his} resistance easing as ${his} eyes start to close. Your hands continue to gently scratch at ${his} scalp, and you enjoy the sensation as well as the feeling of power over your hapless slave. Gently, slowly, so not as to spook ${him}, you ease your property's head back into your`); + if (V.PC.boobs >= 300) { + r.push(`breasts.`); + } else { + r.push(`chest.`); + } + r.push(`Nevertheless your slave starts at the action, but at your insistence finally gives in to the motion, and finally relaxes against you.`); + } else if (slave.trust < -50) { + r.push(`${He} is nearly frozen with fear and does not resist as you tenderly and lovingly brush your fingers along ${his} head, enjoying your slave's complete and utter submission to you. In fact, ${he} barely reacts at all. But being an arcology owner has taught you many things, not least of which is patience. With time and a gentle hand, your slave's shoulders slowly start to relax, so slowly if you weren't paying attention you wouldn't have noticed. With a sense of satisfaction, you continue your actions, enjoying the feeling of your`); + if (isBald) { + r.push(`hand gliding over ${his} smooth head.`); + } else { + r.push(`fingers combing through ${his} hair and gently scritching ${his} scalp.`); + } + r.push(`You settle with this for now, knowing that any attempt at further intimacy will likely scare your slave off, but you enjoy it nonetheless.`); + } else { + r.push(`${He} reflexively turns away from you, but you tenderly hold ${his} chin and maneuver ${him} in position with one hand and slowly but gently move your other hand to the top of ${his} head. Spluttering, ${he} leans backwards, but you catch ${him} by the shoulder and pin ${him} against you, where you feel the intense heat from ${his} body against your`); + if (V.PC.boobs >= 300) { + r.push(`soft breasts,`); + } else { + r.push(`manly chest,`); + } + r.push(`before resuming your gentle stroking. ${He} desperately tries to wriggle out of your grasp, but ${his} struggles slowly subside as ${he} realizes that you're not taking this any farther. Tenderly and lovingly you stroke your fingers over ${his} head, appreciating the feeling of your slave's rebelliousness.`); + } + + r.push(`You pat ${him} softly move your palm down the side of ${his} head with a soothing touch as you pet ${him}. Gently you start to run your hand down the back of ${his} head, softly stroking and caressing ${him}. You delicately lift ${his} head and touch your fingertips to ${his} chin, tenderly brushing along the line of ${his} mouth with your`); + if (V.PC.title === 1) { + r.push(`manly`); + } else { + r.push(`feminine`); + } + r.push(`thumb.`); + + if (isBald) { + r.push(`Then, you gently touch ${his}`); + } else { + r.push(`You hold a strand of ${his} hair and softly place it behind ${his} ear, taking the chance to gently caress ${his}`); + } + if (slave.face > 95) { + r.push(`overwhelmingly stunning`); + } else if (slave.face > 10) { + r.push(`alluring`); + } else if (slave.face >= -10) { + r.push(`appealing`); + } else if (slave.face >= -40) { + r.push(`plain`); + } else { + r.push(`rough`); + } + r.push(`face and lightly touch ${his}`); + if (slave.lips > 95) { + r.push(`facepussy`); + } else { + if (slave.lips > 70) { + r.push(`pillowlike`); + } else if (slave.lips > 40) { + r.push(`generous`); + } else if (slave.lips > 20) { + r.push(`plush`); + } + r.push(`lips`); + } + r.push(`with your fingertips. You move your hand to the side of your slave's head, stroking ${his} temple gently.`); + if (slave.fetish === "mindbroken") { + r.push(`This causes an unconscious shiver to travel down ${his} spine.`); + } else if (slave.devotion > 50) { + r.push(`This causes ${him} to shudder in delight and to move ${his} hand to your hip, squeezing it gently.`); + } else if (slave.devotion > 20) { + r.push(`This causes ${him} to shudder in delight.`); + } else if (slave.devotion >= -20) { + r.push(`This causes ${him} to shiver unconsciously.`); + } else if (slave.trust <= -50) { + r.push(`This forces ${his} back rigid, in an effort not to move`); + if (V.showInches === 2) { + r.push(`an inch,`); + } else { + r.push(`a centimeter,`); + } + r.push(`out of fear.`); + } else if (slave.trust < -20) { + r.push(`This would cause ${him} to shiver with delight, but ${his} distaste for the situation makes that impossible.`); + } + + r.push(`You move your hand down to caress ${his} forehead, and then slide your hand along ${his} cheek. The last thing you do is take ${his} head lightly and trace around it, gently massaging as you go. Finally you pat ${him} a few times before letting ${him} up.`); + + /* outro + reaction */ + + if (slave.fetish === "mindbroken") { + r.push(`When you stop,`); + if (canSee(slave)) { + r.push(`${his} ${App.Desc.eyesColor(slave)} track the movements of your hands briefly before returning to their usual stare,`); + } else { + r.push(`${he} stands at attention before you,`); + } + r.push(`awaiting further use of ${his} body.`); + } else if (slave.relationship === -2) { + r.push(`When you finally stop petting ${him},`); + if (canSee(slave)) { + r.push(`${his} eyes remain closed just for a second`); + } + r.push(`and ${his} mouth stands open in slack-jawed joy, before ${he} slowly`); + if (canSee(slave)) { + r.push(`opens ${his} eyes`); + } else { + r.push(`turns ${his} gaze towards you`); + } + r.push(`and smiles warmly at you. Pleasure lights up ${his} face`); + if (hasAnyArms(slave)) { + r.push(`as ${his} hand traces the path yours took up to ${his} head and mimics your last movements.`); + } else { + r.push(`as ${his} gaze drifts off to the right in memory, tilting ${his} head from side to side in sympathetic memory of how it felt to have your hand on ${his} head.`); + } + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate love with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)},`); + } else { + r.push(`facial expressions,`); + } + r.push(`since ${he} does not speak ${V.language} well enough to express ${himself}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate love with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)}.`); + } else { + r.push(`facial expressions.`); + } + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves you.`); + } else { + r.push( + Spoken(slave, `"I love you, ${Master},"`), + `${he} ${say}s, dreamily.` + ); + } + r.push(`${He} looks as though ${he} wants much more than your mere caress.`); + } else if (slave.devotion > 50 && slave.fetish === "dom" && slave.fetishKnown === 1 && slave.fetishStrength > 60 && hasAnyArms(slave)) { + r.push(`${He} tries hard to stop from losing ${himself} in your incredibly skilled hands. ${He} takes ${his} tendency towards sexual dominance right up to the edge of insubordination, when ${he} starts to caress your face in turn. When you finally stop, ${his} eyes are closed and ${he}'s smiling. When you are finally finished stroking your slave, they remove their hand from yours. Then you give them a playful flick on the nose, and the mischievous twinkle in your eye is only half playful, reminding ${him} of ${his} place in these walls.`); + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate enjoyment with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)},`); + } else { + r.push(`facial expressions,`); + } + r.push(`since ${he} does not speak ${V.language} well enough to express ${himself}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate enjoyment with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)}.`); + } else { + r.push(`facial expressions.`); + } + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} liked that and would love to pet you next time.`); + } else { + r.push( + Spoken(slave, `"That was nice, ${Master},"`), + `${he} ${say}s cheerfully.`, + Spoken(slave, `"Maybe next time I can stroke you..."`) + ); + } + r.push(`${He} looks at you, ${his}`); + if (canSee(slave)) { + r.push(`lovely ${App.Desc.eyesColor(slave)}`); + } else { + r.push(`face`); + } + r.push(`practically begging you to let ${him} take this farther.`); + } else if (slave.devotion > 50 && slave.fetish === "submissive" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`As you stroke ${his} head, ${he} reacts almost as though you're stroking ${his} nether regions, and begins to moan and press ${himself} lewdly against your`); + if (V.PC.boobs >= 1400) { + r.push(`giant tits.`); + } else if (V.PC.boobs >= 1200) { + r.push(`huge breasts.`); + } else if (V.PC.boobs >= 1000) { + r.push(`big breasts.`); + } else if (V.PC.boobs >= 800) { + r.push(`prominent breasts.`); + } else if (V.PC.boobs >= 650) { + r.push(`unremarkable breasts.`); + } else if (V.PC.boobs >= 500) { + r.push(`breasts.`); + } else if (V.PC.boobs >= 300) { + r.push(`tiny breasts.`); + } else if (V.PC.title > 0) { + r.push(`manly chest.`); + } else { + r.push(`non-existent breasts.`); + } + r.push(`${He} achieves a weak orgasm before you finally stop caressing ${his} head; ${he} is your pet, after all.`); + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate undiminished lust with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)},`); + } else { + r.push(`facial expressions,`); + } + r.push(`since ${he} does not speak ${V.language} well enough to express ${himself}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate undiminished lust with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)}.`); + } else { + r.push(`facial expressions.`); + } + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} liked that.`); + } else { + r.push( + Spoken(slave, `"That was fun, ${Master},"`), + `${he} ${say}s lustfully.`, + Spoken(slave, `"But why stop there?"`) + ); + } + r.push(`${He} looks at you as if ${he} wants more than your hands touching ${his} head.`); + } else if (slave.devotion > 50) { + r.push(`${He} gradually closes ${his} eyes and when you finally stop,`); + if (hasAnyArms(slave)) { + r.push(`${he} runs ${his} hand delightedly across ${his} face and`); + } + r.push(`a euphoric look quickly lights up ${his} features.`); + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate devotion with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)},`); + } else { + r.push(`facial expressions,`); + } + r.push(`since ${he}'s not confident in ${his} ability to express it in ${V.language}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate devotion with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)}.`); + } else { + r.push(`facial expressions.`); + } + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves you.`); + } else { + r.push( + Spoken(slave, `"I love you, ${Master},"`), + `${he} ${say}s jubilantly.` + ); + } + r.push(`${He}`); + if (canSee(slave)) { + r.push(`looks`); + } else { + r.push(`gazes`); + } + r.push(`at you longingly, almost as if ${he}'s bursting to say that ${he} wants more than your mere caress.`); + } else if (slave.devotion > 20) { + r.push(`When you finally move your hand away,`); + if (canSee(slave)) { + r.push(`${his} ${App.Desc.eyesColor(slave)} gaze into yours searchingly,`); + } else { + r.push(`${he} gazes at you,`); + } + r.push(`looking for answers that are not there.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes beg`); + } else { + r.push(`expression begs`); + } + r.push(`for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs hesitantly, asking if that's all.`); + } else { + r.push( + `${He} asks hesitantly,`, + Spoken(slave, `"I-is that all, ${Master}?"`) + ); + } + } else if (slave.devotion < -20 && slave.trust >= 20) { + r.push(`${He} does little more than give another defiant glare as you pull away.`); + /* TODO: write this */ + } else if (slave.devotion >= -20 && slave.trust < -20) { + r.push(`When you finally move your hand away, ${he}`); + if (canSee(slave)) { + r.push(`looks`); + } else { + r.push(`gazes`); + } + r.push(`at you for a long moment, as if looking for answers, before visibly catching ${himself} with a reminder that ${he}'s a slave and you're ${his} owner.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes hesitantly question`); + } else { + r.push(`expression hesitantly questions`); + } + r.push(`for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs hesitantly, asking if that's all.`); + } else { + r.push( + `${He} asks hesitantly,`, + Spoken(slave, `"I-is that all, ${Master}?"`) + ); + } + } else if (slave.trust < -50) { + r.push(`${He} stares`); + if (canSee(slave)) { + r.push(`at you`); + } else { + r.push(`blankly`); + } + r.push(`as you move your fingers across ${his} stiff head, but it's like touching a statue. ${He} is so filled with terror that ${he} remains rigid even as it becomes clear to ${him} you're not going to hurt ${him}. When you bore of touching the`); + if (slave.physicalAge > 30) { + r.push(`${woman}`); + } else { + r.push(`${girl}`); + } + r.push(`and move your hand away, ${he} turns to you in utter incomprehension.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes beg`); + } else { + r.push(`expression begs`); + } + r.push(`beg for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs spastically, asking fearfully to know if that's all.`); + } else { + r.push( + `${He} stammers fearfully, although somewhat less then before this session,`, + Spoken(slave, `"I-is that all, ${Master}?"`) + ); + } + r.push(`${He} then cringes.`); + } else { + r.push(`When you bore of it and take your hand away, ${he} faces you in utter incomprehension.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes demand`); + } else { + r.push(`expression demands`); + } + r.push(`an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs irritably, asking whether that's all.`); + } else { + r.push( + `${He} scowls, muttering,`, + Spoken(slave, `"Is that all, ${Master}?"`) + ); + } + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fPat.tw b/src/npc/interaction/fPat.tw deleted file mode 100644 index a201c35c55fbd04f057d82b5ba6673d358cb5ecb..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fPat.tw +++ /dev/null @@ -1,316 +0,0 @@ -:: FPat [nobr no-history] - -<<run Enunciate(getSlave($AS))>> -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run getSlave($AS).partners.add(-1)>> -<<setPlayerPronouns>> - -You tell <<= getSlave($AS).slaveName>> to -<<if !hasAnyLegs(getSlave($AS))>> - have another slave set $him up onto your desk. -<<elseif tooBigBreasts(getSlave($AS))>> - have another slave help $him heft $his tits so $he can be near you. -<<elseif tooBigBelly(getSlave($AS))>> - have another slave help $him heft $his belly so $he can be near you. -<<elseif tooBigButt(getSlave($AS))>> - have another slave help $him heft $his ass cheeks so $he can be near you. -<<elseif tooBigDick(getSlave($AS))>> - have another slave help $him heft $his cock so $he can be near you. -<<elseif tooBigBalls(getSlave($AS))>> - have another slave help $him heft $his balls so $he can be near you. -<<elseif tooFatSlave(getSlave($AS))>> - have another slave help $him up so $he can be near you. -<<else>> - move closer towards you. -<</if>> - -/*approach*/ - -<<if (getSlave($AS).fetish == "mindbroken") && (getSlave($AS).relationship != -3)>> - $He complies robotically. $He remembers that when <<= getWrittenTitle(getSlave($AS))>>'s commands are not obeyed, there is punishment. -<<elseif (getSlave($AS).relationship == -2)>> - $He eagerly complies, happy to be near the object of $his longing. Once $he's close, you hold $his face in your palms and gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he loves overwhelming, and $his eyes flick downward after a moment. - <<else>> - upon $his face. $He finds the intense look from the _womanP $he loves overwhelming, and after a moment glances away. - <</if>> - $He blushes furiously. -<<elseif getSlave($AS).relationship == -3>> - <<if getSlave($AS).fetish == "mindbroken">> - $He complies mechanically. $He remembers that when <<= getWrittenTitle(getSlave($AS))>>'s commands are not obeyed, there is punishment. Once $he's close, you hold $his face in your palms and look into $his empty <<= App.Desc.eyesColor(getSlave($AS))>>. $He shows no reaction - <<elseif getSlave($AS).devotion+getSlave($AS).trust >= 175>> - $He complies in a <<= $wife>>ly fashion, moving $his body as $he approaches to best enflame your desire, eager to be close to the _womanP who married $him. Once $he's close, you hold $his face in your palms and gaze - <<if canSee(getSlave($AS))>> - deeply into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's married to affirming, and looks down with a smile, running $his eyes over your <<if $PC.boobs >= 300>>bosom<<else>>chest<</if>>. - <<else>> - upon $his face. $He finds the intense look from the _womanP $he's married to affirming, and looks down with a smile. - <</if>> - <<elseif getSlave($AS).devotion < -20 && getSlave($AS).trust > 20>> - $He complies. Once $he's close, you hold $his face in your palms and take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his tearful <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's forcibly married to disturbing, and breaks eye contact. - <<else>> - upon $his face. $He can feel the intense gaze of the _womanP $he's forcibly married to, and finds it disturbing. $He quickly turns $his face away. - <</if>> - <<elseif getSlave($AS).devotion < -20>> - $He complies out of fear. Once $he's close, you hold $his quivering face in your palms and take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his teary <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's forcibly married to terrifying, and quickly breaks eye contact. - <<else>> - upon $his tear-streaked face. $He can feel the intense look from the _womanP $he's forcibly married to, and it is horrifying, causing $him to turn $his face away after only a moment. - <</if>> - <<else>> - $He complies obediently. Once $he's close, you hold $his face in your palms and take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's married to reassuring, and looks down with a slight smile, running $his eyes over your <<if $PC.boobs >= 300>>bosom<<else>>chest<</if>>. - <<else>> - upon $his face. The intense look from the _womanP $he's married to is reassuring to $him, and $he looks down with a slight smile. - <</if>> - <</if>> -<<elseif (getSlave($AS).devotion > 75)>> - $He hurriedly complies, happy to be near you. Once $he's close, you hold $his face in your palms and take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from $his beloved <<= getWrittenTitle(getSlave($AS))>> disconcerting, and $his eyes flick downward after a moment. - <<else>> - upon $his face. $He can feel the intense look from $his beloved <<Master>> and it is disconcerting, causing $him to glance away after only a moment, $his face flushed. - <</if>> - $He blushes furiously. -<<elseif (getSlave($AS).devotion > 50)>> - $He hurriedly complies, happy to be near you. Once $he's close, you hold $his face in your palms and take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> disconcerting, and $he looks down after a moment, blushing. - <<else>> - upon $his face. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> disconcerting, and it causes $him to glance away after only a moment, blushing. - <</if>> -<<elseif (getSlave($AS).devotion > 20)>> - $He hurriedly complies, happy to be near you. Once $he's close, you hold $his face in your palms and take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and $he looks down after a moment, blushing nervously. - <<else>> - upon $his face. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and $he looks down after a moment, blushing nervously. - <</if>> -<<elseif (getSlave($AS).devotion < -20) && (getSlave($AS).trust >= 20)>> - $He seems to visibly consider disobedience, but apparently decides your order is harmless enough. $He does as $he is told, - <<if canSee(getSlave($AS))>> - giving you a defiant stare as $he does so. - <<else>> - defiantly staring in your direction. - <</if>> -<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).trust >= -20)>> - $He visibly considers disobedience, but decides that complying with such an apparently harmless order is safe, for now. Once $he's close, you hold $his face in your palms and take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> troubling, and $he looks down after a moment, $his lower lip trembling with nervousness. - <<else>> - upon $his face. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and turns away after a moment, $his lower lip trembling with nervousness. - <</if>> -<<elseif (getSlave($AS).trust < -20)>> - The command terrifies $him, but $he's more frightened still of the consequences of disobedience, and $he complies. Once $he's close, you hold $his face in your palms and take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. After a mere instant of locked faces, $he looks down fearfully and begins to shake with terror, tears leaking silently down $his cheeks. - <<else>> - upon $his face. After a mere instant of locked faces, $he looks down fearfully and begins to shake with terror, tears leaking silently down $his cheeks. - <</if>> -<<else>> - $He pauses, obviously considering whether to resist, but eventually decides to save $his strength to fight more onerous orders, and gives in. Once $he's close, you hold $his face in your palms and take a moment to gaze deeply - <<if canSee(getSlave($AS))>> - into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He stares back, but after a few moments $he loses the contest of wills and looks down. - <<else>> - upon $his face. $He faces you defiantly, but after a few moments $he loses the contest of wills and looks down. - <</if>> -<</if>> - -/* action */ - -You walk around $him, drawing closer and slowly resting your hand on $his head. You let it rest for a few seconds to get $him accustomed to your touch. -<<if (getSlave($AS).fetish == "mindbroken")>> - Tenderly and lovingly you brush your fingers along $his head, enjoying the feeling of your poor mentally shattered slave's inability to resist you. $He initially reacts slightly to your physical touch, but soon stops reacting completely. Nevertheless, you continue to gingerly stroke $his <<if getSlave($AS).hStyle == "shaved bald" || getSlave($AS).bald == 1>>shaven scalp <<else>>hair <</if>>, as you gently press $his body into your chest<<if !hasAnyLegs(getSlave($AS))>> and onto your lap<</if>>. The warmth from your slave's body, and the action of petting $his head, combined with the sound of $his breathing, allow you to feel more relaxed by the minute. -<<elseif (getSlave($AS).relationship == -3) && getSlave($AS).devotion+getSlave($AS).trust >= 175>> - Tenderly and lovingly you brush your fingers along $his head, enjoying the feeling of your slave's utterly willing submission. $He slowly leans $his body closer and closer to you<<if !hasAnyLegs(getSlave($AS))>> and finally onto your lap<</if>>, relaxing as $he feels your caress. As $he shifts $his weight to your chest, $he feels all of the daily stresses of the day melt away, and a deep, happy sigh escapes $his lips. You smile fondly, allowing all of the troubles of being an arcology owner dissipate, in a similar fashion to your slave. For now, just for now, you are just a _womanP and _hisP devoted and content $wife. -<<elseif (getSlave($AS).relationship == -2)>> - Tenderly and lovingly you brush your fingers along $his head, for a moment, appreciating how easily your slave submits to your desire to pat $his head. $He slowly leans $his body closer and closer to you<<if !hasAnyLegs(getSlave($AS))>> allowing you to move $him onto your lap<</if>>, relaxing as $he feels your caresses. As $his weight falls onto you, all of the stress from $his body melts away, and a small, respectful sigh escapes $his pursed lips. You smile fondly, allowing all of the troubles of being an arcology owner drift away, in a similar fashion to your slave. For now, just for now, you are just a _womanP and _hisP devoted and content servant. -<<elseif (getSlave($AS).devotion > 50) && (getSlave($AS).fetish == "dom") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60) && (hasAnyArms(getSlave($AS)))>> - As you start to touch $him $he smiles at you and takes your hand, following its movements. You tenderly and lovingly kiss it and let it rest on the side of $his head, before continuing with your ministrations. As opposed to your more submissive slaves, <<= getSlave($AS).slaveName>> takes an active role in your petting, gently guiding where your hand goes along $his head. You enjoy the feel of $his hand on yours, as well as $his <<if getSlave($AS).hStyle == "shaved bald" || getSlave($AS).bald == 1>>smooth scalp<<else>> hair<</if>>. -<<elseif (getSlave($AS).devotion > 50) && (getSlave($AS).fetish == "submissive") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>> - $He stiffens at your touch but slowly relaxes at the sensation of your hand on $his head. You tenderly and lovingly stroke your fingers along $his scalp, enjoying the feeling of your slave's subservience. $He gently, submissively, presses $his head against your hand, like a dog. As you continue <<if getSlave($AS).hStyle == "shaved bald" || getSlave($AS).bald == 1>>kneading $his shaved scalp<<else>>stroking $his hair<</if>>, $he starts to clutch $his thighs, and if you listen you can hear subdued whimpers. $He looks up at you with adoring eyes, and relishes in the pureness of this act as $his master's pet to $his beloved <<= getWrittenTitle(getSlave($AS))>>. -<<elseif getSlave($AS).devotion > 50>> - $He accepts it with devotion, leaning back into your gentle caresses. You tenderly and lovingly brush your fingers along $his head, enjoying the feeling of your slave's willingness to set aside $his dignity for headpats. $He leans $his body backward, pressing $himself against you. You can feel the intense heat from $his body against your <<if $PC.boobs >= 300>>soft breasts<<else>>manly chest<</if>>. You take your time enjoying the sensation of <<if getSlave($AS).hStyle == "shaved bald" || getSlave($AS).bald == 1>>rubbing your slave's smooth scalp<<else>>gently running your fingers through your slave's hair<</if>>, and your slave smiles happily as you do. As you continue with your ministrations, you can see all of the stress present in your slave's shoulders dissipate, and you feel a good deal of your own tension start to melt away as well. -<<elseif getSlave($AS).devotion > 20>> - $He willingly accepts it. As you tenderly and lovingly brush your fingers along $his head, enjoying the feeling of your slave's roiling emotions, and finally submission. You can still sense considerable turmoil in the <<if (getSlave($AS).physicalAge > 30)>>$woman<<else>>$girl<</if>>; $he's doing $his duty as a slave by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of $his mind by your touch. As you continue your ministrations, your slave slowly, and with more then a bit of uncertainty, finally starts to relax. $He looks at you with confusion and trepidation. Your eyes betray nothing however — you simply smile and press $his head into your <<if $PC.boobs >= 300>>soft breasts<<else>>masculine chest<</if>>, all the while enjoying the feeling of your <<if getSlave($AS).hStyle == "shaven bald" || getSlave($AS).bald == 1>>hands gliding over $his smooth head<<else>>fingers gliding through $his hair<</if>>. -<<elseif (getSlave($AS).devotion < -20) && (getSlave($AS).trust >= 20)>> - $He doesn't react to your touch, remaining as still as statue, the same defiant expression on $his face. $He still doesn't react when you brush your fingers down the side of $his head or when you <<if getSlave($AS).hStyle == "shaven bald" || getSlave($AS).bald == 1>>stroke $his smooth head<<else>>run your fingers through $his hair<</if>>. $He does react when you gently rest your thumb on $his lips, however, by suddenly giving you a fierce bite. Cursing, you pull your hand back and examine it — $he didn't bite deep enough to draw blood, but the area is now red and puffy. Furious, you backhand $him across the face<<if random(1,100) > 80>><<set getSlave($AS).minorInjury = either("black eye", "bruise", "split lip")>>, giving $him a @@.health.dec;<<= getSlave($AS).minorInjury>>@@<</if>>. -<<elseif getSlave($AS).devotion >= -20 && getSlave($AS).trust < -20>> - $He shakes at your touch fearfully. As you tenderly brush your fingers down $his unresisting head, you appreciate this expression of your slave's subservience, $his eagerness to avoid punishment making $him stiffen, $his nervousness easily apparent. You continue stroking $him, enjoying $his fear, as the physical intimacy slowly does its work. $He starts to relax, $his resistance easing as $his eyes start to close. Your hands continue to gently scratch at $his scalp, and you enjoy the sensation as well as the feeling of power over your hapless slave. Gently, slowly, so not as to spook $him, you ease your property's head back into your <<if $PC.boobs >= 300>>breasts<<else>>chest<</if>>. Nevertheless your slave starts at the action, but at your insistence finally gives in to the motion, and finally relaxes against you. -<<elseif getSlave($AS).trust < -50>> - $He is nearly frozen with fear and does not resist as you tenderly and lovingly brush your fingers along $his head, enjoying your slave's complete and utter submission to you. In fact, $he barely reacts at all. But being an arcology owner has taught you many things, not least of which is patience. With time and a gentle hand, your slave's shoulders slowly start to relax, so slowly if you weren't paying attention you wouldn't have noticed. With a sense of satisfaction, you continue your actions, enjoying the feeling of your <<if getSlave($AS).hStyle == "shaven bald" || getSlave($AS).bald == 1>>hand gliding over $his smooth head<<else>>fingers combing through $his hair and gently scritching $his scalp<</if>>. You settle with this for now, knowing that any attempt at further intimacy will likely scare your slave off, but you enjoy it nonetheless. -<<else>> - $He reflexively turns away from you, but you tenderly hold $his chin and maneuver $him in position with one hand and slowly but gently move your other hand to the top of $his head. Spluttering, $he leans backwards, but you catch $him by the shoulder and pin $him against you, where you feel the intense heat from $his body against your <<if $PC.boobs >= 300>>soft breasts<<else>>manly chest<</if>>, before resuming your gentle stroking. $He desperately tries to wriggle out of your grasp, but $his struggles slowly subside as $he realizes that you're not taking this any farther. Tenderly and lovingly you stroke your fingers over $his head, appreciating the feeling of your slave's rebelliousness. -<</if>> - -You pat $him softly move your palm down the side of $his head with a soothing touch as you pet $him. Gently you start to run your hand down the back of $his head, softly stroking and caressing $him. You delicately lift $his head and touch your fingertips to $his chin, tenderly brushing along the line of $his mouth with your <<if $PC.title == 1>>manly<<else>>feminine<</if>> thumb. - -<<if getSlave($AS).hStyle == "shaved bald">> - Then, you gently touch $his -<<else>> - You hold a strand of $his hair and softly place it behind $his ear, taking the chance to gently caress $his -<</if>> -<<if getSlave($AS).face > 95>> - overwhelmingly stunning -<<elseif getSlave($AS).face > 10>> - alluring -<<elseif getSlave($AS).face >= -10>> - appealing -<<elseif getSlave($AS).face >= -40>> - plain -<<else>> - rough -<</if>> -face and lightly touch $his -<<if getSlave($AS).lips > 95>> - facepussy -<<else>> - <<if getSlave($AS).lips > 70>> - pillowlike - <<elseif getSlave($AS).lips > 40>> - generous - <<elseif getSlave($AS).lips > 20>> - plush - <</if>> - lips -<</if>> -with your fingertips. You move your hand to the side of your slave's head, stroking $his temple gently. -<<if getSlave($AS).fetish == "mindbroken">> - This causes an unconscious shiver to travel down $his spine. -<<elseif getSlave($AS).devotion > 50>> - This causes $him to shudder in delight and to move $his hand to your hip, squeezing it gently. -<<elseif getSlave($AS).devotion > 20>> - This causes $him to shudder in delight. -<<elseif getSlave($AS).devotion >= -20>> - This causes $him to shiver unconsciously. -<<elseif getSlave($AS).trust <= -50>> - This forces $his back rigid, in an effort not to move <<if $showInches == 2>>an inch<<else>>a centimeter<</if>>, out of fear. -<<elseif getSlave($AS).trust < -20>> - This would cause $him to shiver with delight, but $his distaste for the situation makes that impossible. -<</if>> - -You move your hand down to caress $his forehead, and then slide your hand along $his cheek. The last thing you do is take $his head lightly and trace around it, gently massaging as you go. Finally you pat $him a few times before letting $him up. - -/* outro + reaction */ - -<<if (getSlave($AS).fetish == "mindbroken")>> - When you stop, - <<if canSee(getSlave($AS))>> - $his <<= App.Desc.eyesColor(getSlave($AS))>> track the movements of your hands briefly before returning to their usual stare, - <<else>> - $he stands at attention before you, - <</if>> - awaiting further use of $his body. -<<elseif (getSlave($AS).relationship == -2)>> - When you finally stop petting $him, <<if canSee(getSlave($AS))>>$his eyes remain closed just for a second <</if>>and $his mouth stands open in slack-jawed joy, before $he slowly <<if canSee(getSlave($AS))>> opens $his eyes<<else>> turns $his gaze towards you<</if>> and smiles warmly at you. Pleasure lights up $his face<<if (hasAnyArms(getSlave($AS)))>> as $his hand traces the path yours took up to $his head and mimics your last movements<<else>> as $his gaze drifts off to the right in memory, tilting $his head from side to side in sympathetic memory of how it felt to have your hand on $his head<</if>>. - <<if (getSlave($AS).accent >= 3)>> - $He does $his best to communicate love with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>, since $he does not speak $language well enough to express $himself. - <<elseif (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $He does $his best to communicate love with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he loves you. - <<else>> - "I love you, <<Master>>," $he <<say>>s dreamily. - <</if>> - $He looks as though $he wants much more than your mere caress. -<<elseif (getSlave($AS).devotion > 50) && (getSlave($AS).fetish == "dom") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60) && (hasAnyArms(getSlave($AS)))>> - $He tries hard to stop from losing $himself in your incredibly skilled hands. $He takes $his tendency towards sexual dominance right up to the edge of insubordination, when $he starts to caress your face in turn. When you finally stop, $his eyes are closed and $he's smiling. When you are finally finished stroking your slave, they remove their hand from yours. Then you give them a playful flick on the nose, and the mischievous twinkle in your eye is only half playful, reminding $him of $his place in these walls. - <<if (getSlave($AS).accent >= 3)>> - $He does $his best to communicate enjoyment with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>, since $he does not speak $language well enough to express $himself. - <<elseif (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $He does $his best to communicate enjoyment with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he liked that and would love to pet you next time. - <<else>> - "That wa<<s>> ni<<c>>e, <<Master>>," $he <<say>>s cheerfully. "Maybe next time I can <<s>>troke you..." - <</if>> - $He looks at you, $his <<if canSee(getSlave($AS))>>lovely <<= App.Desc.eyesColor(getSlave($AS))>><<else>>face<</if>> practically begging you to let $him take this farther. -<<elseif (getSlave($AS).devotion > 50) && (getSlave($AS).fetish == "submissive") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>> - As you stroke $his head, $he reacts almost as though you're stroking $his nether regions, and begins to moan and press $himself lewdly against your - <<if $PC.boobs >= 1400>> - giant tits. - <<elseif $PC.boobs >= 1200>> - huge breasts. - <<elseif $PC.boobs >= 1000>> - big breasts. - <<elseif $PC.boobs >= 800>> - prominent breasts. - <<elseif $PC.boobs >= 650>> - unremarkable breasts. - <<elseif $PC.boobs >= 500>> - breasts. - <<elseif $PC.boobs >= 300>> - tiny breasts. - <<elseif $PC.title > 0>> - manly chest. - <<else>> - non-existent breasts. - <</if>> - $He achieves a weak orgasm before you finally stop caressing $his head; $he is your pet, after all. - <<if (getSlave($AS).accent >= 3)>> - $He does $his best to communicate undiminished lust with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>, since $he does not speak $language well enough to express $himself. - <<elseif (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $He does $his best to communicate undiminished lust with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he liked that. - <<else>> - "That wa<<s>> fun, <<Master>>," $he <<say>>s lustfully. "But why <<s>>top there?" - <</if>> - $He looks at you as if $he wants more than your hands touching $his head. -<<elseif (getSlave($AS).devotion > 50)>> - $He gradually closes $his eyes and when you finally stop, <<if (hasAnyArms(getSlave($AS)))>>$he runs $his hand delightedly across $his face and <</if>>a euphoric look quickly lights up $his features. - <<if (getSlave($AS).accent >= 3)>> - $He does $his best to communicate devotion with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>, since $he's not confident in $his ability to express it in $language. - <<elseif (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $He does $his best to communicate devotion with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he loves you. - <<else>> - "I love you, <<Master>>," $he <<say>>s jubilantly. - <</if>> - $He <<if canSee(getSlave($AS))>>looks<<else>>gazes<</if>> at you longingly, almost as if $he's bursting to say that $he wants more than your mere caress. -<<elseif (getSlave($AS).devotion > 20)>> - When you finally move your hand away, <<if canSee(getSlave($AS))>>$his <<= App.Desc.eyesColor(getSlave($AS))>> gaze into yours searchingly<<else>>$he gazes at you<</if>>, looking for answers that are not there. - <<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $His <<if canSee(getSlave($AS))>>eyes beg<<else>>expression begs<</if>> for an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs hesitantly, asking if that's all. - <<else>> - $He asks hesitantly, "I-i<<s>> that all, <<Master>>?" - <</if>> -<<elseif (getSlave($AS).devotion < -20) && (getSlave($AS).trust >= 20)>> - $He does little more than give another defiant glare as you pull away. - /* TODO: write this */ -<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).trust < -20)>> - When you finally move your hand away, $he <<if canSee(getSlave($AS))>>looks<<else>>gazes<</if>> at you for a long moment, as if looking for answers, before visibly catching $himself with a reminder that $he's a slave and you're $his owner. - <<if ((!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS))))>> - $His <<if canSee(getSlave($AS))>>eyes hesitantly question<<else>>expression hesitantly questions<</if>> for an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs hesitantly, asking if that's all. - <<else>> - $He asks hesitantly, "I-is that all, <<Master>>?" - <</if>> -<<elseif (getSlave($AS).trust < -50)>> - $He stares <<if canSee(getSlave($AS))>>at you<<else>>blankly<</if>> as you move your fingers across $his stiff head, but it's like touching a statue. $He is so filled with terror that $he remains rigid even as it becomes clear to $him you're not going to hurt $him. When you bore of touching the <<if (getSlave($AS).physicalAge > 30)>>$woman<<else>>$girl<</if>> and move your hand away, $he turns to you in utter incomprehension. - <<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $His <<if canSee(getSlave($AS))>>eyes beg<<else>>expression begs<</if>> beg for an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs spastically, asking fearfully to know if that's all. - <<else>> - $He stammers fearfully, although somewhat less then before this session, "I-i<<s>> that all, <<Master>>?" - <</if>> - $He then cringes. -<<else>> - When you bore of it and take your hand away, $he faces you in utter incomprehension. - <<if (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $His <<if canSee(getSlave($AS))>>eyes demand<<else>>expression demands<</if>> an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs irritably, asking whether that's all. - <<else>> - $He scowls, muttering, "I<<s>> that all, <<Master>>?" - <</if>> -<</if>> diff --git a/src/npc/interaction/fPoolSex.js b/src/npc/interaction/fPoolSex.js new file mode 100644 index 0000000000000000000000000000000000000000..c4c7cbf8983b158b259e2395cd1c085d985a881c --- /dev/null +++ b/src/npc/interaction/fPoolSex.js @@ -0,0 +1,271 @@ + + + + +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fPoolSex = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, + he, his, him, himself, hers + } = getPronouns(slave); + + addPartner(slave, -1); + + r.push(`You order ${him} to meet you in the spa for some quality time in the penthouse's rejuvenating gelatin pool. When you get there, ${he}'s already in ${his} bathing attire, reclined at the side of the pool farthest from you with ${his} massive ${slave.skin} stomach hanging over the edge and half sunk in the thick, steaming ooze, flushed and sweaty.`); + if (slave.devotion > 95) { + if (!isAmputee(slave)) { + r.push(`${He}'s resting ${his} head on one arm, but ${he} gives you a little wave`); + if (!hasBothArms(slave)) { + r.push(`anyway`); + } else { + r.push(`with the other`); + } + r.push(`before setting it to rubbing the flank of one`); + if (slave.boobs >= 20000) { + r.push(`massively overgrown tit`); + } else if (Math.floor(slave.boobsImplant / slave.boobs) >= .60) { + r.push(`fat, augmented tit`); + } else if (slave.boobs >= 3000) { + r.push(`huge breast`); + } else { + r.push(`petite breast`); + } + r.push(`as ${he}`); + } else { + r.push(`${He}'s resting on a small pile of pillows, enjoying the feeling against the flanks of ${his} colossal belly. ${He} wiggles a welcome to you and then`); + } + if (canSee(slave)) { + r.push(`watches`); + } else { + r.push(`waits patiently as`); + } + r.push(`you strip down and change into your swimming outfit. When it's clear that you're ready to join ${him}, ${he} motions at the pool's holographic console and coos in delight as its mobility assistance devices kick in, rolling ${him} into the curative gel. You sink yourself into the pool, taking a moment to bask in the feeling of the warm, curative laced goo as it relaxes your muscles${(V.PC.preg > 30) ? ` and soothes your stretched skin` : ``} , then wade toward your waiting slave.`); + App.Events.addParagraph(node, r); + r = []; + r.push(`${He} smiles and beckons you toward ${him}, rubbing circles in the exploded sides of ${his} colossal belly, then gasps as you take a handful of the ooze and shove it right in ${his} face. ${He} sputters indignantly and then`); + if (hasAnyArms(slave)) { + r.push(`scoops up a handful ${himself}, flinging it at you. The two of you spend several minutes goo fighting before, eventually, you decide that your`); + } else { + r.push(`wobbles back and forth, ineffectually trying to fight back as you cover ${him} in thick wads of gel, over and over. After several minutes of this, you decide that your`); + } + if (V.PC.dick !== 0) { + r.push(`solid, quivering erection is in need of ${his} tender care.`); + if (canSee(slave)) { + r.push(`Seeing`); + } else { + r.push(`Sensing`); + } + r.push(`the change in your demeanor, ${he} rolls back to recline at the pool's edge and, once you've joined ${him},`); + if (hasAnyArms(slave)) { + r.push(`reaches down to masturbate your ooze lubricated dick.`); + } else { + r.push(`rolls forward and reaches down to tease your cockhead with ${his} mouth${(slave.boobs > 600) ? ` and tits` : ``}.`); + } + r.push(`When you feel yourself at the edge of orgasm, you slide in between ${his}`); + if (slave.butt > 11) { + r.push(`debilitatingly enormous, cushiony ass`); + } else if (slave.butt > 5) { + r.push(`massive, cushiony ass`); + } else if (Math.floor(slave.buttImplant / slave.butt) > .60) { + r.push(`implant swollen ass`); + } else if (slave.butt > 2) { + r.push(`plush ass`); + } else { + r.push(`back`); + } + r.push(`and the pool's silk-lined wall. Reaching, you tease ${his}`); + if (canDoVaginal(slave)) { + r.push(`kitty`); + } else { + r.push(`asshole`); + } + r.push(`with your fingers and ${he} crushes backward into you, moaning and rotating ${his} hips in response to your attention. Once you're certain ${he}'s ready, you slide into ${him}, driving you both to orgasm.`); + if (canDoVaginal(slave)) { + r.push(VCheck.Vaginal(slave, 1)); + } else { + r.push(VCheck.Anal(slave, 1)); + } + } else { + r.push(`ooze stimulated quim is in need of ${his} tender care. Seeing the change in your demeanor, ${he} rolls back to recline at the pool's edge and, once you've joined ${him},`); + if (hasAnyArms(slave)) { + r.push(`reaches down to masturbate your pussy, squeezing and rubbing your clit.`); + } else { + r.push(`rolls sideways and rubs your vulva as best ${he} can.`); + } + if (slave.dick >= 1) { + r.push(`When you feel yourself at the edge of orgasm, you have the pool's mobility aids rotate ${him} into a position level with the pool's edge, then hop up on that ledge yourself so that you can don a dildo and ream ${his}`); + if (canDoVaginal(slave)) { + r.push(`pussy. ${VCheck.Vaginal(slave, 1)}`); + } else { + r.push(`asshole. ${VCheck.Anal(slave, 1)}`); + } + r.push(`Satisfied that the angles are right, you grab hold of ${his} hips and slide half on top of ${him}, resting your lower half on the rear swell of ${his} obscenely bloated belly. Pressing your strap-on to ${his} needy hole, you tease ${him} for a moment before ramming home, driving the both of you to repeated orgasm.`); + } else { + r.push(`When you feel yourself at the edge of orgasm, you have the pool's mobility aids rotate ${him} into a position level with the pool's edge, then hop up on that ledge yourself so that your pussies are level. Satisfied that the angles are right, you grab hold of ${his} hips and slide half on top of ${him}, resting your lower half on the rear swell of ${his} obscenely bloated belly. Pressing your lower lips to ${hers}, you rub your clits together, driving the both of you to repeated orgasm.`); + slave.counter.vaginal++; + V.vaginalTotal++; + } + } + } else if (slave.trust < -20 && slave.devotion > -10) { + if (hasAnyArms(slave)) { + r.push(`${He}'s resting ${his} head on one arm, but ${he} nods at you in acknowledgment as`); + } else { + r.push(`${He}'s resting on a small pile of pillows, enjoying the sensations against the flanks of ${his} colossal belly. ${He} nods as you enter, not stopping ${his} rubbing, and`); + if (canSee(slave)) { + r.push(`watches`); + } else { + r.push(`waits patiently as`); + } + } + r.push(`you strip down and change into your swimming outfit. When it's clear that you're ready to join ${him}, ${he} motions at the pool's holographic console and its mobility assistance devices kick in, rolling ${him} into the curative gel. You sink yourself into the pool, taking a moment to bask in the feeling of the warm, curative laced goo as it relaxes your muscles${(V.PC.preg > 30) ? `and soothes your stretched skin` : ``}, then wade toward your waiting slave.`); + App.Events.addParagraph(node, r); + r = []; + r.push(`${He} smiles politely, rubbing circles in the exploded sides of ${his} colossal belly, then gasps as you take a handful of the ooze and shove it right in ${his} face. ${He} sputters indignantly and then`); + if (hasAnyArms(slave)) { + r.push(`scoops up a handful ${himself}, flinging it at you. The two of you spend several minutes goo fighting before, eventually, you decide that your`); + } else { + r.push(`wobbles back and forth, ineffectually trying to fight back as you cover ${him} in thick wads of gel, over and over. After several minutes of this, you decide that your`); + } + if (V.PC.dick !== 0) { + r.push(`solid, quivering erection is in need of ${his} tender care.`); + if (canSee(slave)) { + r.push(`Seeing`); + } else { + r.push(`Sensing`); + } + r.push(`the change in your demeanor, ${he} rolls back to recline at the pool's edge and, once you've joined ${him},`); + if (hasAnyArms(slave)) { + r.push(`reaches down to masturbate your ooze lubricated dick.`); + } else { + r.push(`rolls forward and reaches down to tease your cockhead with ${his} mouth${(slave.boobs > 600) ? ` and tits` : ``}.`); + } + r.push(`When you feel yourself at the edge of orgasm, you slide in between ${his}`); + if (slave.butt > 11) { + r.push(`debilitatingly enormous, cushiony ass`); + } else if (slave.butt > 5) { + r.push(`massive, cushiony ass`); + } else if (Math.floor(slave.buttImplant / slave.butt) > .60) { + r.push(`implant swollen ass`); + } else if (slave.butt > 2) { + r.push(`plush ass`); + } else { + r.push(`back`); + } + r.push(`and the pool's silk-lined wall. Reaching, you tease ${his}`); + if (canDoVaginal(slave)) { + r.push(`kitty`); + } else { + r.push(`asshole`); + } + r.push(`with your fingers and ${he} crushes backward into you, moaning and rotating ${his} hips in response to your attention. Once you're certain ${he}'s ready, you slide into ${him}, driving you both to orgasm.`); + if (canDoVaginal(slave)) { + r.push(VCheck.Vaginal(slave, 1)); + } else { + r.push(VCheck.Anal(slave, 1)); + } + } else { + r.push(`ooze stimulated quim is in need of ${his} tender care. Seeing the change in your demeanor, ${he} rolls back to recline at the pool's edge and, once you've joined ${him},`); + if (hasAnyArms(slave)) { + r.push(`reaches down to masturbate your pussy, squeezing and rubbing your clit.`); + } else { + r.push(`rolls sideways and rubs your vulva as best ${he} can.`); + } + if (slave.dick >= 1) { + r.push(`When you feel yourself at the edge of orgasm, you have the pool's mobility aids rotate ${him} into a position level with the pool's edge, then hop up on that ledge yourself so that you can don a dildo and ream ${his}`); + if (canDoVaginal(slave)) { + r.push(`pussy. ${VCheck.Vaginal(slave, 1)}`); + } else { + r.push(`asshole. ${VCheck.Anal(slave, 1)}`); + } + r.push(`Satisfied that the angles are right, you grab hold of ${his} hips and slide half on top of ${him}, resting your lower half on the rear swell of ${his} obscenely bloated belly. Pressing your strap-on to ${his} needy hole, you tease ${him} for a moment before ramming home, driving the both of you to repeated orgasm.`); + } else { + r.push(`When you feel yourself at the edge of orgasm, you have the pool's mobility aids rotate ${him} into a position level with the pool's edge, then hop up on that ledge yourself so that your pussies are level. Satisfied that the angles are right, you grab hold of ${his} hips and slide half on top of ${him}, resting your lower half on the rear swell of ${his} obscenely bloated belly. Pressing your lower lips to ${hers}, you rub your clits together, driving the both of you to repeated orgasm.`); + slave.counter.vaginal++; + V.vaginalTotal++; + } + } + } else { + if (hasAnyArms(slave)) { + r.push(`${He}'s resting ${his} head on one arm, but ${he} starts as you enter, watching tensely as`); + } else { + r.push(`${He}'s resting on a small pile of pillows, savoring the sensations against the flanks of ${his} colossal belly and`); + if (slave.boobs >= 20000) { + r.push(`massively overgrown tits`); + } else if (Math.floor(slave.boobsImplant / slave.boobs) >= .60) { + r.push(`fat, augmented tits`); + } else if (slave.boobs >= 3000) { + r.push(`huge breasts`); + } else { + r.push(`petite breasts`); + } + r.push(`${He} starts as you enter, watching tensely as`); + } + r.push(`you strip down and change into your swimming outfit. When you're ready to join ${him}, you motion at the pool's holographic console and its mobility assistance devices kick in, rolling ${him} into the curative gel. You sink yourself into the pool, taking a moment to bask in the feeling of the warm, curative laced goo as it relaxes your muscles${(V.PC.preg > 30) ? ` and soothes your stretched skin` : ``}, then wade toward your worried looking slave.`); + App.Events.addParagraph(node, r); + r = []; + r.push(`${He} smiles politely, rubbing circles in the exploded sides of ${his} colossal belly, then cries out in surprise as you take a handful of the ooze and shove it right in ${his} face. ${He} sputters, blushing, and wobbles back and forth, clearly trying not to react as you cover ${him} in thick wads of gel, over and over. After several minutes of this, you decide that your`); + if (V.PC.dick !== 0) { + r.push(`solid, quivering erection is in need of ${his} tender care. You force ${him} back into a reclining position at the pool's edge and order ${him} to`); + if (hasAnyArms(slave)) { + r.push(`masturbate your ooze lubricated dick.`); + } else { + r.push(`tease your cockhead with ${his} mouth.`); + } + r.push(`${He} complies, bringing you to the edge of orgasm, and, before ${he} can fully push you over the edge, you slide in between ${his}`); + if (slave.butt > 7) { + r.push(`debilitatingly enormous, cushiony ass`); + } else if (slave.butt > 4) { + r.push(`massive, cushiony ass`); + } else if (slave.butt > 2) { + r.push(`implant swollen ass`); + } else if (slave.buttImplant === 1) { + r.push(`plush ass`); + } else { + r.push(`back`); + } + r.push(`and the pool's silk lined wall. Reaching, you tease ${his}`); + if (canDoVaginal(slave)) { + r.push(`kitty`); + } else { + r.push(`asshole`); + } + r.push(`with your fingers and rub one hand back and forth along the line of ${his} tensed shoulders as ${he} slowly gives in to lust. Once you're certain ${he}'s ready, you slide into ${him}, driving you both to orgasm.`); + if (canDoVaginal(slave)) { + r.push(VCheck.Vaginal(slave, 1)); + } else { + r.push(VCheck.Anal(slave, 1)); + } + } else { + r.push(`ooze stimulated quim is in need of ${his} tender care. You force ${him} back to recline at the pool's edge and, once you've joined ${him},`); + if (hasAnyArms(slave)) { + r.push(`set ${him} to masturbating your pussy, squeezing and rubbing your clit.`); + } else { + r.push(`set ${him} to rubbing your vulva with ${his} belly button.`); + } + if (slave.dick >= 1) { + r.push(`When you feel yourself at the edge of orgasm, you have the pool's mobility aids rotate ${him} into a position level with the pool's edge, then hop up on that ledge yourself so that you can don a dildo and ream ${his}`); + if (canDoVaginal(slave)) { + r.push(`pussy. ${VCheck.Vaginal(slave, 1)}`); + } else { + r.push(`asshole. ${VCheck.Anal(slave, 1)}`); + } + r.push(`Satisfied that the angles are right, you grab hold of ${his} hips and slide half on top of ${him}, resting your lower half on the rear swell of ${his} obscenely bloated belly. Pressing your strap-on to ${his} needy hole, you tease ${him} for a moment before ramming home, driving the both of you to repeated orgasm.`); + r.push(VCheck.Anal(slave, 1)); + } else { + r.push(`When you feel yourself at the edge of orgasm, you have the pool's mobility aids rotate ${him} into a position level with the pool's edge, then hop up on that ledge yourself so that your pussies are level. Satisfied that the angles are right, you grab hold of ${his} hips and slide half on top of ${him}, resting your lower half on the rear swell of ${his} obscenely bloated belly. Pressing your lower lips to ${hers}, you rub your clits together, driving the both of you to repeated orgasm.`); + slave.counter.vaginal++; + V.vaginalTotal++; + } + } + } + r.push(`After you've finished with ${him}, you escort ${him} to the spa's attached showers so that the two of you can enjoy a bit more time together as you clean off, then allow ${him} to return to ${his} duties as you return to your own.`); + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fPoolSex.tw b/src/npc/interaction/fPoolSex.tw deleted file mode 100644 index e83c02225701e2adbcb15fd5a5b01eb5f9585ac8..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fPoolSex.tw +++ /dev/null @@ -1,171 +0,0 @@ -:: FPoolSex [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> - -You order $him to meet you in the spa for some quality time in the penthouse's rejuvenating gelatin pool. When you get there, $he's already in $his bathing attire, reclined at the side of the pool farthest from you with $his massive <<= getSlave($AS).skin>> stomach hanging over the edge and half sunk in the thick, steaming ooze, flushed and sweaty. -<<if getSlave($AS).devotion > 95>> - <<if !isAmputee(getSlave($AS))>> - $He's resting $his head on one arm, but $he gives you a little wave <<if !hasBothArms(getSlave($AS))>>anyway<<else>>with the other<</if>> before setting it to rubbing the flank of one - <<if getSlave($AS).boobs >= 20000>> - massively overgrown tit - <<elseif Math.floor(getSlave($AS).boobsImplant/getSlave($AS).boobs) >= .60>> - fat, augmented tit - <<elseif getSlave($AS).boobs >= 3000>> - huge breast - <<else>> - petite breast - <</if>> - as $he - <<else>> - $He's resting on a small pile of pillows, enjoying the feeling against the flanks of $his colossal belly. $He wiggles a welcome to you and then - <</if>> - <<if canSee(getSlave($AS))>>watches<<else>>waits patiently as<</if>> you strip down and change into your swimming outfit. When it's clear that you're ready to join $him, $he motions at the pool's holographic console and coos in delight as its mobility assistance devices kick in, rolling $him into the curative gel. You sink yourself into the pool, taking a moment to bask in the feeling of the warm, curative laced goo as it relaxes your muscles<<if $PC.preg > 30>> and soothes your stretched skin<</if>>, then wade toward your waiting slave. - <br><br> - $He smiles and beckons you toward $him, rubbing circles in the exploded sides of $his colossal belly, then gasps as you take a handful of the ooze and shove it right in $his face. $He sputters indignantly and then - <<if hasAnyArms(getSlave($AS))>> - scoops up a handful $himself, flinging it at you. The two of you spend several minutes goo fighting before, eventually, you decide that your - <<else>> - wobbles back and forth, ineffectually trying to fight back as you cover $him in thick wads of gel, over and over. After several minutes of this, you decide that your - <</if>> - <<if $PC.dick != 0>> - solid, quivering erection is in need of $his tender care. <<if canSee(getSlave($AS))>>Seeing<<else>>Sensing<</if>> the change in your demeanor, $he rolls back to recline at the pool's edge and, once you've joined $him, - <<if hasAnyArms(getSlave($AS))>> - reaches down to masturbate your ooze lubricated dick. - <<else>> - rolls forward and reaches down to tease your cockhead with $his mouth<<if getSlave($AS).boobs > 600>> and tits<</if>>. - <</if>> - When you feel yourself at the edge of orgasm, you slide in between $his - <<if getSlave($AS).butt > 11>> - debilitatingly enormous, cushiony ass - <<elseif getSlave($AS).butt > 5>> - massive, cushiony ass - <<elseif Math.floor(getSlave($AS).buttImplant/getSlave($AS).butt) > .60>> - implant swollen ass - <<elseif getSlave($AS).butt > 2>> - plush ass - <<else>> - back - <</if>> - and the pool's silk-lined wall. Reaching, you tease $his <<if canDoVaginal(getSlave($AS))>>kitty<<else>>asshole<</if>> with your fingers and $he crushes backward into you, moaning and rotating $his hips in response to your attention. Once you're certain $he's ready, you slide into $him, driving you both to orgasm. - <<if canDoVaginal(getSlave($AS))>><<= VCheck.Vaginal(getSlave($AS), 1)>><<else>><<= VCheck.Anal(getSlave($AS), 1)>><</if>> - <<else>> - ooze stimulated quim is in need of $his tender care. Seeing the change in your demeanor, $he rolls back to recline at the pool's edge and, once you've joined $him, - <<if hasAnyArms(getSlave($AS))>> - reaches down to masturbate your pussy, squeezing and rubbing your clit. - <<else>> - rolls sideways and rubs your vulva as best $he can. - <</if>> - <<if getSlave($AS).dick >= 1>> - When you feel yourself at the edge of orgasm, you have the pool's mobility aids rotate $him into a position level with the pool's edge, then hop up on that ledge yourself so that you can don a dildo and ream $his <<if canDoVaginal(getSlave($AS))>>pussy. <<= VCheck.Vaginal(getSlave($AS), 1)>><<else>>asshole. <<= VCheck.Anal(getSlave($AS), 1)>><</if>> Satisfied that the angles are right, you grab hold of $his hips and slide half on top of $him, resting your lower half on the rear swell of $his obscenely bloated belly. Pressing your strap-on to $his needy hole, you tease $him for a moment before ramming home, driving the both of you to repeated orgasm. - <<else>> - When you feel yourself at the edge of orgasm, you have the pool's mobility aids rotate $him into a position level with the pool's edge, then hop up on that ledge yourself so that your pussies are level. Satisfied that the angles are right, you grab hold of $his hips and slide half on top of $him, resting your lower half on the rear swell of $his obscenely bloated belly. Pressing your lower lips to $hers, you rub your clits together, driving the both of you to repeated orgasm. - <<set getSlave($AS).counter.vaginal++, $vaginalTotal++>> - <</if>> - <</if>> -<<elseif (getSlave($AS).trust < -20) && (getSlave($AS).devotion > -10)>> - <<if hasAnyArms(getSlave($AS))>> - $He's resting $his head on one arm, but $he nods at you in acknowledgment as - <<else>> - $He's resting on a small pile of pillows, enjoying the sensations against the flanks of $his colossal belly. $He nods as you enter, not stopping $his rubbing, and <<if canSee(getSlave($AS))>>watches<<else>>waits patiently as<</if>> - <</if>> - you strip down and change into your swimming outfit. When it's clear that you're ready to join $him, $he motions at the pool's holographic console and its mobility assistance devices kick in, rolling $him into the curative gel. You sink yourself into the pool, taking a moment to bask in the feeling of the warm, curative laced goo as it relaxes your muscles<<if $PC.preg > 30>> and soothes your stretched skin<</if>>, then wade toward your waiting slave. - <br><br> - $He smiles politely, rubbing circles in the exploded sides of $his colossal belly, then gasps as you take a handful of the ooze and shove it right in $his face. $He sputters indignantly and then - <<if hasAnyArms(getSlave($AS))>> - scoops up a handful $himself, flinging it at you. The two of you spend several minutes goo fighting before, eventually, you decide that your - <<else>> - wobbles back and forth, ineffectually trying to fight back as you cover $him in thick wads of gel, over and over. After several minutes of this, you decide that your - <</if>> - <<if $PC.dick != 0>> - solid, quivering erection is in need of $his tender care. <<if canSee(getSlave($AS))>>Seeing<<else>>Sensing<</if>> the change in your demeanor, $he rolls back to recline at the pool's edge and, once you've joined $him, - <<if hasAnyArms(getSlave($AS))>> - reaches down to masturbate your ooze lubricated dick. - <<else>> - rolls forward and reaches down to tease your cockhead with $his mouth<<if getSlave($AS).boobs > 600>> and tits<</if>>. - <</if>> - When you feel yourself at the edge of orgasm, you slide in between $his - <<if getSlave($AS).butt > 11>> - debilitatingly enormous, cushiony ass - <<elseif getSlave($AS).butt > 5>> - massive, cushiony ass - <<elseif Math.floor(getSlave($AS).buttImplant/getSlave($AS).butt) > .60>> - implant swollen ass - <<elseif getSlave($AS).butt > 2>> - plush ass - <<else>> - back - <</if>> - and the pool's silk-lined wall. Reaching, you tease $his <<if canDoVaginal(getSlave($AS))>>kitty<<else>>asshole<</if>> with your fingers and $he crushes backward into you, moaning and rotating $his hips in response to your attention. Once you're certain $he's ready, you slide into $him, driving you both to orgasm. - <<if canDoVaginal(getSlave($AS))>><<= VCheck.Vaginal(getSlave($AS), 1)>><<else>><<= VCheck.Anal(getSlave($AS), 1)>><</if>> - <<else>> - ooze stimulated quim is in need of $his tender care. Seeing the change in your demeanor, $he rolls back to recline at the pool's edge and, once you've joined $him, - <<if hasAnyArms(getSlave($AS))>> - reaches down to masturbate your pussy, squeezing and rubbing your clit. - <<else>> - rolls sideways and rubs your vulva as best $he can. - <</if>> - <<if getSlave($AS).dick >= 1>> - When you feel yourself at the edge of orgasm, you have the pool's mobility aids rotate $him into a position level with the pool's edge, then hop up on that ledge yourself so that you can don a dildo and ream $his <<if canDoVaginal(getSlave($AS))>>pussy. <<= VCheck.Vaginal(getSlave($AS), 1)>><<else>>asshole. <<= VCheck.Anal(getSlave($AS), 1)>><</if>> Satisfied that the angles are right, you grab hold of $his hips and slide half on top of $him, resting your lower half on the rear swell of $his obscenely bloated belly. Pressing your strap-on to $his needy hole, you tease $him for a moment before ramming home, driving the both of you to repeated orgasm. - <<else>> - When you feel yourself at the edge of orgasm, you have the pool's mobility aids rotate $him into a position level with the pool's edge, then hop up on that ledge yourself so that your pussies are level. Satisfied that the angles are right, you grab hold of $his hips and slide half on top of $him, resting your lower half on the rear swell of $his obscenely bloated belly. Pressing your lower lips to $hers, you rub your clits together, driving the both of you to repeated orgasm. - <<set getSlave($AS).counter.vaginal++, $vaginalTotal++>> - <</if>> - <</if>> -<<else>> - <<if hasAnyArms(getSlave($AS))>> - $He's resting $his head on one arm, but $he starts as you enter, watching tensely as - <<else>> - $He's resting on a small pile of pillows, savoring the sensations against the flanks of $his colossal belly and - <<if getSlave($AS).boobs >= 20000>> - massively overgrown tits - <<elseif Math.floor(getSlave($AS).boobsImplant/getSlave($AS).boobs) >= .60>> - fat, augmented tits - <<elseif getSlave($AS).boobs >= 3000>> - huge breasts - <<else>> - petite breasts - <</if>> - $He starts as you enter, watching tensely as - <</if>> - you strip down and change into your swimming outfit. When you're ready to join $him, you motion at the pool's holographic console and its mobility assistance devices kick in, rolling $him into the curative gel. You sink yourself into the pool, taking a moment to bask in the feeling of the warm, curative laced goo as it relaxes your muscles<<if $PC.preg > 30>> and soothes your stretched skin<</if>>, then wade toward your worried looking slave. - <br><br> - $He smiles politely, rubbing circles in the exploded sides of $his colossal belly, then cries out in surprise as you take a handful of the ooze and shove it right in $his face. $He sputters, blushing, and wobbles back and forth, clearly trying not to react as you cover $him in thick wads of gel, over and over. After several minutes of this, you decide that your - <<if $PC.dick != 0>> - solid, quivering erection is in need of $his tender care. You force $him back into a reclining position at the pool's edge and order $him to - <<if hasAnyArms(getSlave($AS))>> - masturbate your ooze lubricated dick. - <<else>> - tease your cockhead with $his mouth. - <</if>> - $He complies, bringing you to the edge of orgasm, and, before $he can fully push you over the edge, you slide in between $his - <<if getSlave($AS).butt > 7>> - debilitatingly enormous, cushiony ass - <<elseif getSlave($AS).butt > 4>> - massive, cushiony ass - <<elseif getSlave($AS).butt > 2>> - implant swollen ass - <<elseif getSlave($AS).buttImplant == 1>> - plush ass - <<else>> - back - <</if>> - and the pool's silk lined wall. Reaching, you tease $his <<if canDoVaginal(getSlave($AS))>>kitty<<else>>asshole<</if>> with your fingers and rub one hand back and forth along the line of $his tensed shoulders as $he slowly gives in to lust. Once you're certain $he's ready, you slide into $him, driving you both to orgasm. - <<if canDoVaginal(getSlave($AS))>><<= VCheck.Vaginal(getSlave($AS), 1)>><<else>><<= VCheck.Anal(getSlave($AS), 1)>><</if>> - <<else>> - ooze stimulated quim is in need of $his tender care. You force $him back to recline at the pool's edge and, once you've joined $him, - <<if hasAnyArms(getSlave($AS))>> - set $him to masturbating your pussy, squeezing and rubbing your clit. - <<else>> - set $him to rubbing your vulva with $his belly button. - <</if>> - <<if getSlave($AS).dick >= 1>> - When you feel yourself at the edge of orgasm, you have the pool's mobility aids rotate $him into a position level with the pool's edge, then hop up on that ledge yourself so that you can don a dildo and ream $his <<if canDoVaginal(getSlave($AS))>>pussy. <<= VCheck.Vaginal(getSlave($AS), 1)>><<else>>asshole. <<= VCheck.Anal(getSlave($AS), 1)>><</if>> Satisfied that the angles are right, you grab hold of $his hips and slide half on top of $him, resting your lower half on the rear swell of $his obscenely bloated belly. Pressing your strap-on to $his needy hole, you tease $him for a moment before ramming home, driving the both of you to repeated orgasm. - <<= VCheck.Anal(getSlave($AS), 1)>> - <<else>> - When you feel yourself at the edge of orgasm, you have the pool's mobility aids rotate $him into a position level with the pool's edge, then hop up on that ledge yourself so that your pussies are level. Satisfied that the angles are right, you grab hold of $his hips and slide half on top of $him, resting your lower half on the rear swell of $his obscenely bloated belly. Pressing your lower lips to $hers, you rub your clits together, driving the both of you to repeated orgasm. - <<set getSlave($AS).counter.vaginal++, $vaginalTotal++>> - <</if>> - <</if>> -<</if>> -After you've finished with $him, you escort $him to the spa's attached showers so that the two of you can enjoy a bit more time together as you clean off, then allow $him to return to $his duties as you return to your own. diff --git a/src/npc/interaction/fRelation.js b/src/npc/interaction/fRelation.js new file mode 100644 index 0000000000000000000000000000000000000000..3f2b35d66c9eb562fe42ba5ca7803a5ae3dd3110 --- /dev/null +++ b/src/npc/interaction/fRelation.js @@ -0,0 +1,283 @@ +/** + * @param {App.Entity.SlaveState} slave - slave to fuck with partner. + * @param {App.Entity.SlaveState} partner - partner to fuck slave with. must be a close relative or relationship target of slave. + * @returns {DocumentFragment} + */ +App.Interact.fRelation = function(slave, partner) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, girl, daughter + } = getPronouns(slave); + const {title: Master} = getEnunciation(slave); + + let activeSlaveRel; + let partnerRel; + if (areRelated(slave, partner)) { + activeSlaveRel = relativeTerm(partner, slave); + partnerRel = relativeTerm(slave, partner); + } else if (partner.ID === slave.relationshipTarget) { + switch (slave.relationship) { + case 1: + activeSlaveRel = "friend"; + partnerRel = "friend"; + break; + case 2: + activeSlaveRel = "best friend"; + partnerRel = "best friend"; + break; + case 3: + activeSlaveRel = "friend with benefits"; + partnerRel = "friend with benefits"; + break; + case 4: + activeSlaveRel = "lover"; + partnerRel = "lover"; + break; + case 5: + activeSlaveRel = "slave wife"; + partnerRel = "slave wife"; + break; + } + } else { + throw new Error(`Invalid partner for fRelation: main ${slave ? slave.ID : "undefined"}, partner ${partner ? partner.ID : "undefined"}.`); + } + addPartner(slave, -1); + addPartner(slave, partner); + const { + He2, + he2, his2, him2, himself2, daughter2 + } = getPronouns(partner).appendSuffix("2"); + + r.push(`You call both ${slave.slaveName} and ${partner.slaveName} to your office.`); + if (canMove(slave) && canMove(partner) && (slave.devotion > 50 && partner.devotion > 50) && canPenetrate(slave) && canPenetrate(partner) && (partner.anus > 0 && slave.anus > 0 && V.PC.dick !== 0)) { + r.push(`There are three stiff pricks available. Since ${slave.slaveName} was already in your office, ${he} goes on the bottom. ${He} lies on the floor, spreads ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`buttocks, relaxes ${his} anus, and then begs ${his} ${partnerRel} to buttfuck ${him}. ${partner.slaveName} does, slipping ${his2} cock into ${his2} ${activeSlaveRel}'s ass. ${He2} then stops and waits for you to buttfuck ${him2} in turn. It isn't a particularly convenient way to fuck, but it's got the virtue of being uncommon. ${partner.slaveName}, both fucking and getting fucked, comes in ${his2} ${activeSlaveRel}'s rectum first. They switch places so ${slave.slaveName} can have a turn in the middle, leaving you to finish into ${slave.slaveName}'s already cum-soaked hole.`); + + seX(slave, "anal", partner, "penetrative", 2); + seX(slave, "penetrative", partner, "anal", 2); + } else if (partner.devotion - slave.devotion > 20 && partner.devotion <= 50) { + r.push(`${partner.slaveName} is a lot more ready and willing for this than ${slave.slaveName}, so`); + if (V.PC.dick === 0) { + r.push(`while getting into a strap-on,`); + } + r.push(`you sit ${him2} on the couch and make ${slave.slaveName} sit on ${his2} lap, facing ${him2}. In this position, ${partner.slaveName} can reach around and spread ${his2} ${activeSlaveRel}'s`); + if (V.seeRace === 1) { + r.push(`${partner.race}`); + } + r.push(`buttocks for ${him}, controlling ${him} all the while in case ${he} has hesitations about this. ${slave.slaveName} knows that ${he}'s trapped, and lets ${his} ${partnerRel} hold ${his} ass wide so you can use ${him}. They're face to face, and it's not hard to tell that ${slave.slaveName} is glaring daggers at ${partner.slaveName}. You reward ${partner.slaveName} for ${his2} obedience and punish ${slave.slaveName} for ${his} resistance by forcing ${him} to orally service ${partner.slaveName} while you finish using ${slave.slaveName}.`); + seX(slave, "oral", partner, "oral"); + r.push(VCheck.Both(slave, 1)); + } else if (slave.devotion - partner.devotion > 20 && partner.devotion <= 50) { + r.push(`${slave.slaveName} is a lot more ready and willing for this than ${partner.slaveName}, so`); + if (V.PC.dick === 0) { + r.push(`while getting into a strap-on,`); + } + r.push(`you sit ${him} on the couch and make ${partner.slaveName} sit on ${his} lap, facing ${him}. In this position, ${slave.slaveName} can reach around and spread ${his} ${partnerRel}'s`); + if (V.seeRace === 1) { + r.push(`${partner.race}`); + } + r.push(`buttocks for ${him2}, controlling ${him2} all the while in case ${he2} has hesitations about this. ${partner.slaveName} knows that ${he2}'s trapped, and lets ${his2} ${activeSlaveRel} hold ${his2} ass wide so you can use ${him2}. They're face to face, and it's not hard to tell that ${partner.slaveName} is glaring daggers at ${slave.slaveName}. You reward ${slave.slaveName} for ${his} obedience and punish ${partner.slaveName} for ${his2} resistance by forcing ${him2} to suck ${slave.slaveName} off while you finish using ${partner.slaveName}.`); + seX(slave, "oral", partner, "oral"); + r.push(VCheck.Partner(partner, 1)); + } else if (canMove(slave) && canMove(partner) && (slave.devotion > 50 && partner.devotion > 20 && hasAnyArms(slave) && ["mother", "father", "sole parent"].includes(activeSlaveRel))) { + r.push(`${slave.slaveName} gives you a little smile when ${he}`); + if (canHear(slave)) { + r.push(`hears`); + } else { + r.push(`learns`); + } + r.push(`you wish to fuck ${him} and ${his} ${daughter2} ${partner.slaveName}`); + if (V.PC.dick === 0) { + r.push(`and`); + if (canSee(slave)) { + r.push(`sees`); + } else { + r.push(`acknowledges`); + } + r.push(`your strap-on`); + } + r.push(r.pop() + `.`); + r.push(`On your direction, ${slave.slaveName} sits on the couch. When ${partner.slaveName} enters, ${his2} ${activeSlaveRel} spreads ${his} arms and tells ${him2} to sit on ${his} lap. ${partner.slaveName} gets the idea and straddles ${him} so they're face to face. You take ${partner.slaveName} from behind; ${he2} gasps as ${he2} feels ${his2} ${activeSlaveRel}'s ${hasBothArms(partner) ? `hands` : `hand`}stimulate ${him2} from the front. They make out shamelessly while you take your pleasure. When you finish, ${slave.slaveName} lies down on the couch so ${partner.slaveName} can ride ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`face. As ${he} sucks the cum out of ${his} ${daughter2}'s sopping fuckhole, ${partner.slaveName} sucks you hard again. In the mood for something harder this time, you jam yourself into the older ${slave.slaveName}. ${partner.slaveName} gets off ${slave.slaveName}'s face so ${he2} can offer ${himself2} for fondling and groping while you pound ${slave.slaveName}. After you're done, ${partner.slaveName} returns ${his2} ${activeSlaveRel}'s affection and gives ${him} some gentle oral as the older slave lies there exhausted.`); + seX(slave, "oral", partner, "oral", 2); + r.push(VCheck.Both(slave, 1)); + r.push(VCheck.Partner(partner, 1)); + } else if (canMove(slave) && canMove(partner) && (slave.devotion > 50 && partner.devotion > 20 && ["daughter", "son"].includes(activeSlaveRel))) { + r.push(`${slave.slaveName} is enthusiastic when ${he}`); + if (canHear(slave)) { + r.push(`hears`); + } else { + r.push(`notices`); + } + r.push(`you order ${partner.slaveName} to come over. ${His} total immersion in sexual slavery has clearly uncovered a willingness to get very close to ${his} ${partnerRel}. You`); + if (V.PC.dick === 0) { + r.push(`don a strap-on,`); + } + r.push(`lie on the floor and instruct ${partner.slaveName} to ride you. ${He2} complies, and finds ${his2} ${daughter} ${slave.slaveName}`); + if (partner.dick > 0) { + r.push(`stroking ${his2} cock while ${he2} humps ${his2}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`butt up and down on your cock.`); + } else { + r.push(`licking ${his2} anus while ${he2} humps ${himself2} up and down on your cock.`); + } + r.push(`Your use of ${partner.slaveName}'s`); + if (partner.physicalAge >= 24) { + r.push(`mature`); + } else { + r.push(`surprisingly young`); + } + r.push(`body is the focus. ${He2} finds ${himself2} caught up in a miasma of sexual pleasure and perversion, moaning and blushing as your`); + if (V.PC.dick === 0) { + r.push(`strap-on and fingers`); + } else { + r.push(`cock`); + } + r.push(`and ${slave.slaveName}'s mouth tour ${his2} body. When you finish in ${his2}`); + if (partner.dick > 0) { + r.push(`asshole, ${his2} ${daughter} hastens to lavish attention on ${his} ${partnerRel}'s well fucked, cum filled butt.`); + } else { + r.push(`pussy, ${his2} ${daughter} hastens to lavish attention on ${his} ${partnerRel}'s well fucked, cum filled cunt.`); + } + seX(slave, "oral", partner, "oral", 2); + r.push(VCheck.Partner(partner, 1)); + } else if (canDoVaginal(slave) && canDoVaginal(partner) && canMove(slave) && canMove(partner) && (slave.devotion > 50 && partner.devotion > 50 && ["twin brother", "twin sister"].includes(activeSlaveRel))) { + r.push(`${slave.slaveName}`); + r.push(`and ${partner.slaveName} are such devoted sex slaves that they've long since lost any hesitations about their partnership, and generally approach sex as though their bodies were interchangeable. (This means that they almost never masturbate, for one thing, preferring to have sex with each other, instead.) Giggling and kissing each other, they eagerly kneel before your chair and give you simultaneous oral sex, making an effort to play with their symmetry. They kiss around your`); + if (V.PC.dick === 0) { + r.push(`pussy,`); + } else { + r.push(`cock, making a complete seal around you with their lips`); + } + r.push(`one on each side. Then they jump up on your desk and press their,`); + if (slave.dick > 0 && partner.dick > 0) { + r.push(`cocks`); + } else if (slave.dick > 0 || partner.dick > 0) { + r.push(`cock and pussy`); + } else { + r.push(`pussies`); + } + r.push(`against one another${(V.PC.dick === 0) ? `while you don a strap-on` : ``}, spreading their legs to offer you everything. You switch back and forth, with the twin you're not in rubbing and grinding against the one you are, until both of ${partner.slaveName} and ${slave.slaveName} are lying on the desk${(V.PC.dick !== 0) ? `with cum dripping out of them` : ``}, making out tiredly.`); + seX(slave, "oral", partner, "oral"); + r.push(VCheck.Both(slave, 1)); + r.push(VCheck.Partner(partner, 1)); + } else if (canMove(slave) && canMove(partner) && (slave.devotion > 50 && partner.devotion > 20 && ["sister", "brother", "half-sister", "half-brother", "twin sister", "twin brother"].includes(activeSlaveRel))) { + r.push(`You call ${slave.slaveName}'s ${partnerRel} ${partner.slaveName} in for some incestuous fun, but see no reason to wait for ${him2}. When ${he2} arrives, it's to the`); + + if (canSee(partner)) { + r.push(`sight`); + } else { + r.push(`scene`); + } + r.push(`of ${slave.slaveName} sitting on the`); + if (canDoVaginal(slave) || canDoAnal(slave)) { + r.push(`couch with ${his} ${hasBothLegs(slave) ? `legs` : `leg`} spread with you`); + if (canDoVaginal(slave)) { + r.push(`gently fucking ${his} pussy`); + } else { + r.push(`using ${his} asshole`); + } + if (V.PC.dick === 0) { + r.push(`with a strap-on`); + } + r.push(r.pop() + `. You pull out`); + } else { + r.push(`floor with`); + if (V.PC.dick === 0) { + r.push(`${his} face buried in your pussy. You pull away`); + } else { + r.push(`your dick down ${his} throat. You pull out`); + } + } + r.push(`and order ${partner.slaveName} to orally service ${his2} ${activeSlaveRel}. ${He2} gets down before the spread-eagled slave ${girl} to get to work. After watching ${slave.slaveName} enjoy the attention for a while, you move behind the busy ${partner.slaveName} and pull ${him2} into a good position so you can fuck ${him2} while ${he2} sucks. After a few thrusts, ${slave.slaveName}'s eyes roll back.`); + + if (slave.voice === 0 || slave.accent >= 3) { + r.push(`${He} gestures that it feels really good when you make ${his} ${partnerRel} moan into ${him}.`); + } else { + r.push( + Spoken(slave, `"Oh ${Master},"`), + `${he} squeals,`, + Spoken(slave, `"it feels so good when you make ${him2} moan into me!"`) + ); + seX(slave, "oral", partner, "oral"); + r.push(VCheck.Both(slave, 1)); + r.push(VCheck.Partner(partner, 1)); + } + } else if (["daughter", "son", "father", "mother", "sole parent", "half-sister", "half-brother", "sister", "brother", "twin brother", "twin sister"].includes(activeSlaveRel)) { + r.push(`Since between them they aren't able to enthusiastically perform an incestuous threesome, you simply line ${slave.slaveName} and ${partner.slaveName} up next to one another on the couch next to your desk,`); + if (V.PC.dick === 0) { + r.push(`don a strap-on,`); + } + r.push(`and fuck`); + if (V.seeRace === 1) { + r.push(`${slave.race} holes`); + } + r.push(`at will. Whenever a hole begins to pall you just switch to another. ${slave.slaveName} tries hard to ignore the fact that ${he}'s getting fucked next to ${his} ${partnerRel}, and ${partner.slaveName} pretends the cock getting shoved into ${him2} isn't slick from ${his2} ${activeSlaveRel}'s fuckhole.`); + r.push(VCheck.Both(slave, 1)); + r.push(VCheck.Partner(partner, 1)); + } else if ( + (activeSlaveRel === "friend" || activeSlaveRel === "best friend") && + slave.devotion > 20 && + partner.devotion > 20 + ) { + r.push(`${slave.slaveName}`); + r.push(`and ${partner.slaveName} line up next to one another on the couch next to your desk`); + if (V.PC.dick === 0) { + r.push(`while you don a strap-on,`); + } + r.push(`and offer you their holes. They're just friends, but they're sex slaves and they see nothing wrong with enjoying sex with you, together. They keep up a constant stream of giggling, gasping, and smiling as each of them in turn feels a cock, warm and wet from their friend's body, transferred into them. Each of them does their best to help the other do well, even manually stimulating their friend when necessary${(V.PC.boobs >= 300 || V.PC.title === 0) ? `and spinning around to lavish attention on your nipples` : ``}.`); + r.push(VCheck.Both(slave, 1)); + r.push(VCheck.Partner(partner, 1)); + } else if (["friend with benefits", "lover", "slave wife"].includes(activeSlaveRel) && slave.devotion > 20 && partner.devotion > 20) { + r.push(`${slave.slaveName} and ${partner.slaveName} eagerly retire to the couch and arrange themselves face to face so they can make out and enjoy each other's bodies as you enjoy theirs. You decide not to set up an elaborate threesome, and just`); + if (V.PC.dick === 0) { + r.push(`engage in a little tribadism with`); + } else { + r.push(`fuck`); + } + r.push(`whatever hole catches your eye next. They rarely break their intimate kissing, forming between the two of them a loving entity on the couch with all sorts of interesting parts to experience. They're sex slaves, and you're fucking them, but they're also lovers who are very comfortable in each others'`); + if (hasBothArms(slave) && hasBothArms(partner)) { + r.push(`arms,`); + } else if ((hasAnyArms(slave) && hasAnyArms(partner))) { + r.push(`embrace,`); + } else { + r.push(`presence,`); + } + r.push(`kissing, fondling each other, and`); + if (V.PC.dick === 0) { + r.push(`enjoying your pussy loving.`); + } else { + r.push(`taking your dick.`); + } + r.push(VCheck.Both(slave, 1)); + r.push(VCheck.Partner(partner, 1)); + } else { + r.push(`Since between them they aren't able to enthusiastically perform a threesome, you simply line ${slave.slaveName} and ${partner.slaveName} up next to one another on the couch next to your desk, and fuck`); + if (V.seeRace === 1) { + r.push(`${slave.race} holes`); + } + r.push(`at will. Whenever a hole begins to pall you just switch to another. ${slave.slaveName} tries hard to ignore the fact that ${he}'s getting fucked next to ${his} ${partnerRel}, and ${partner.slaveName} pretends the`); + if (V.PC.dick === 0) { + r.push(`strap-on`); + } else { + r.push(`cock`); + } + r.push(`getting shoved into ${him2} isn't slick from ${his2} ${activeSlaveRel}'s fuckhole.`); + r.push(VCheck.Both(slave, 1)); + r.push(VCheck.Partner(partner, 1)); + } + + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fRelation.tw b/src/npc/interaction/fRelation.tw deleted file mode 100644 index 846812904a821ab55eeddbf8c26a8b3b6e53b788..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fRelation.tw +++ /dev/null @@ -1,118 +0,0 @@ -:: FRelation [nobr no-history] - -<<if ($partner == "mother")>> - <<set $partner = $slaveIndices[getSlave($AS).mother]>> - <<set _activeSlaveRel = relativeTerm($slaves[$partner], getSlave($AS)), _partnerRel = relativeTerm(getSlave($AS), $slaves[$partner])>> -<<elseif ($partner == "father")>> - <<set $partner = $slaveIndices[getSlave($AS).father]>> - <<set _activeSlaveRel = relativeTerm($slaves[$partner], getSlave($AS)), _partnerRel = relativeTerm(getSlave($AS), $slaves[$partner])>> -<<elseif ($partner == "daughter")>> - <<set $partner = $slaveIndices[randomAvailableDaughter(getSlave($AS)).ID]>> - <<set _activeSlaveRel = relativeTerm($slaves[$partner], getSlave($AS)), _partnerRel = relativeTerm(getSlave($AS), $slaves[$partner])>> -<<elseif ($partner == "sister")>> - <<set $partner = $slaveIndices[randomAvailableSister(getSlave($AS)).ID]>> - <<set _activeSlaveRel = relativeTerm($slaves[$partner], getSlave($AS)), _partnerRel = relativeTerm(getSlave($AS), $slaves[$partner])>> -<<elseif ($partner == "relation")>> - <<set $partner = $slaveIndices[$relation]>> - <<set _activeSlaveRel = relativeTerm($slaves[$partner], getSlave($AS)), _partnerRel = relativeTerm(getSlave($AS), $slaves[$partner])>> -<<else>> - <<set $partner = $slaveIndices[getSlave($AS).relationshipTarget]>> - <<switch getSlave($AS).relationship>> - <<case 1>> - <<set _activeSlaveRel = "friend", _partnerRel = "friend">> - <<case 2>> - <<set _activeSlaveRel = "best friend", _partnerRel = "best friend">> - <<case 3>> - <<set _activeSlaveRel = "friend with benefits", _partnerRel = "friend with benefits">> - <<case 4>> - <<set _activeSlaveRel = "lover", _partnerRel = "lover">> - <<case 5>> - <<set _activeSlaveRel = "slave wife", _partnerRel = "slave wife">> - <</switch>> -<</if>> -<<run Enunciate(getSlave($AS))>> -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> -<<run addPartner(getSlave($AS), $partner)>> - -<<setLocalPronouns $slaves[$partner] 2>> - -You call both <<= getSlave($AS).slaveName>> and $slaves[$partner].slaveName to your office. - -<<if canMove(getSlave($AS)) && canMove($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 50) && canPenetrate(getSlave($AS)) && canPenetrate($slaves[$partner]) && ($slaves[$partner].anus > 0) && (getSlave($AS).anus > 0) && ($PC.dick != 0)>> - There are three stiff pricks available. Since <<= getSlave($AS).slaveName>> was already in your office, $he goes on the bottom. $He lies on the floor, spreads $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>buttocks, relaxes $his anus, and then begs $his _partnerRel to buttfuck $him. $slaves[$partner].slaveName does, slipping _his2 cock into _his2 _activeSlaveRel's ass. _He2 then stops and waits for you to buttfuck _him2 in turn. It isn't a particularly convenient way to fuck, but it's got the virtue of being uncommon. $slaves[$partner].slaveName, both fucking and getting fucked, comes in _his2 _activeSlaveRel's rectum first. They switch places so <<= getSlave($AS).slaveName>> can have a turn in the middle, leaving you to finish into <<= getSlave($AS).slaveName>>'s already cum-soaked hole. - <<set getSlave($AS).counter.anal += 2, getSlave($AS).counter.penetrative++, $slaves[$partner].counter.anal += 2, $slaves[$partner].counter.penetrative++, $analTotal += 4, $penetrativeTotal += 2>> -<<elseif ($slaves[$partner].devotion - getSlave($AS).devotion > 20) && ($slaves[$partner].devotion <= 50)>> - $slaves[$partner].slaveName is a lot more ready and willing for this than <<= getSlave($AS).slaveName>>, so<<if ($PC.dick == 0)>>while getting into a strap-on,<</if>> you sit _him2 on the couch and make <<= getSlave($AS).slaveName>> sit on _his2 lap, facing _him2. In this position, $slaves[$partner].slaveName can reach around and spread _his2 _activeSlaveRel's <<if $seeRace == 1>>$slaves[$partner].race <</if>>buttocks for $him, controlling $him all the while in case $he has hesitations about this. <<= getSlave($AS).slaveName>> knows that $he's trapped, and lets $his _partnerRel hold $his ass wide so you can use $him. They're face to face, and it's not hard to tell that <<= getSlave($AS).slaveName>> is glaring daggers at $slaves[$partner].slaveName. You reward $slaves[$partner].slaveName for _his2 obedience and punish <<= getSlave($AS).slaveName>> for $his resistance by forcing $him to orally service $slaves[$partner].slaveName while you finish using <<= getSlave($AS).slaveName>>. - <<set getSlave($AS).counter.oral++, $slaves[$partner].counter.oral++, $oralTotal++>> - <<= VCheck.Both(getSlave($AS), 1)>> -<<elseif (getSlave($AS).devotion - $slaves[$partner].devotion > 20) && ($slaves[$partner].devotion <= 50)>> - <<= getSlave($AS).slaveName>> is a lot more ready and willing for this than $slaves[$partner].slaveName, so<<if ($PC.dick == 0)>>while getting into a strap-on,<</if>> you sit $him on the couch and make $slaves[$partner].slaveName sit on $his lap, facing $him. In this position, <<= getSlave($AS).slaveName>> can reach around and spread $his _partnerRel's <<if $seeRace == 1>>$slaves[$partner].race <</if>>buttocks for _him2, controlling _him2 all the while in case _he2 has hesitations about this. $slaves[$partner].slaveName knows that _he2's trapped, and lets _his2 _activeSlaveRel hold _his2 ass wide so you can use _him2. They're face to face, and it's not hard to tell that $slaves[$partner].slaveName is glaring daggers at <<= getSlave($AS).slaveName>>. You reward <<= getSlave($AS).slaveName>> for $his obedience and punish $slaves[$partner].slaveName for _his2 resistance by forcing _him2 to suck <<= getSlave($AS).slaveName>> off while you finish using $slaves[$partner].slaveName. - <<set getSlave($AS).counter.oral++, $slaves[$partner].counter.oral++, $oralTotal++>> - <<= VCheck.Partner($slaves[$partner], 1)>> -<<elseif canMove(getSlave($AS)) && canMove($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 20) && (hasAnyArms(getSlave($AS))) && (["mother", "father", "sole parent"].includes(_activeSlaveRel))>> - <<= getSlave($AS).slaveName>> gives you a little smile when $he <<if canHear(getSlave($AS))>>hears<<else>>learns<</if>> you wish to fuck $him and $his _daughter2 $slaves[$partner].slaveName<<if ($PC.dick == 0)>> and <<if canSee(getSlave($AS))>>sees<<else>>acknowledges<</if>> your strap-on<</if>>. On your direction, <<= getSlave($AS).slaveName>> sits on the couch. When $slaves[$partner].slaveName enters, _his2 _activeSlaveRel spreads $his arms and tells _him2 to sit on $his lap. $slaves[$partner].slaveName gets the idea and straddles $him so they're face to face. You take $slaves[$partner].slaveName from behind; _he2 gasps as _he2 feels _his2 _activeSlaveRel's hand<<if (hasBothArms($slaves[$partner]))>>s<</if>> stimulate _him2 from the front. They make out shamelessly while you take your pleasure. When you finish, <<= getSlave($AS).slaveName>> lies down on the couch so $slaves[$partner].slaveName can ride $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>face. As $he sucks the cum out of $his _daughter2's sopping fuckhole, $slaves[$partner].slaveName sucks you hard again. In the mood for something harder this time, you jam yourself into the older <<= getSlave($AS).slaveName>>. $slaves[$partner].slaveName gets off <<= getSlave($AS).slaveName>>'s face so _he2 can offer _himself2 for fondling and groping while you pound <<= getSlave($AS).slaveName>>. After you're done, $slaves[$partner].slaveName returns _his2 _activeSlaveRel's affection and gives $him some gentle oral as the older slave lies there exhausted. - <<set getSlave($AS).counter.oral += 2, $slaves[$partner].counter.oral += 2, $oralTotal += 2>> - <<= VCheck.Both(getSlave($AS), 1)>> - <<= VCheck.Partner($slaves[$partner], 1)>> -<<elseif canMove(getSlave($AS)) && canMove($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 20) && (["daughter", "son"].includes(_activeSlaveRel))>> - <<= getSlave($AS).slaveName>> is enthusiastic when $he <<if canHear(getSlave($AS))>>hears<<else>>notices<</if>> you order $slaves[$partner].slaveName to come over. $His total immersion in sexual slavery has clearly uncovered a willingness to get very close to $his _partnerRel. You<<if ($PC.dick == 0)>> don a strap-on,<</if>> lie on the floor and instruct $slaves[$partner].slaveName to ride you. _He2 complies, and finds _his2 $daughter <<= getSlave($AS).slaveName>> - <<if ($slaves[$partner].dick > 0)>> - stroking _his2 cock while _he2 humps _his2 <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>butt up and down on your cock. - <<else>> - licking _his2 anus while _he2 humps _himself2 up and down on your cock. - <</if>> - Your use of $slaves[$partner].slaveName's <<if $slaves[$partner].physicalAge >= 24>>mature<<else>>surprisingly young<</if>> body is the focus. _He2 finds _himself2 caught up in a miasma of sexual pleasure and perversion, moaning and blushing as your <<if ($PC.dick == 0)>>strap-on and fingers<<else>>cock<</if>> and <<= getSlave($AS).slaveName>>'s mouth tour _his2 body. When you finish in _his2 <<if ($slaves[$partner].dick > 0)>>asshole, _his2 $daughter hastens to lavish attention on $his _partnerRel's well fucked, cum filled butt.<<else>>pussy, _his2 $daughter hastens to lavish attention on $his _partnerRel's well fucked, cum filled cunt.<</if>> - <<set getSlave($AS).counter.oral += 2, $slaves[$partner].counter.oral += 2, $oralTotal += 2>> - <<= VCheck.Partner($slaves[$partner], 1)>> -<<elseif canDoVaginal(getSlave($AS)) && canDoVaginal($slaves[$partner]) && canMove(getSlave($AS)) && canMove($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 50) && (["twin brother", "twin sister"].includes(_activeSlaveRel))>> - <<= getSlave($AS).slaveName>> and $slaves[$partner].slaveName are such devoted sex slaves that they've long since lost any hesitations about their partnership, and generally approach sex as though their bodies were interchangeable. (This means that they almost never masturbate, for one thing, preferring to have sex with each other, instead.) Giggling and kissing each other, they eagerly kneel before your chair and give you simultaneous oral sex, making an effort to play with their symmetry. They kiss around your <<if ($PC.dick == 0)>>pussy<<else>>cock, making a complete seal around you with their lips<</if>>, one on each side. Then they jump up on your desk and press their <<if (getSlave($AS).dick > 0) && ($slaves[$partner].dick > 0)>>cocks<<elseif (getSlave($AS).dick > 0) || ($slaves[$partner].dick > 0)>>cock and pussy<<else>>pussies<</if>> against one another<<if ($PC.dick == 0)>> while you don a strap-on<</if>>, spreading their legs to offer you everything. You switch back and forth, with the twin you're not in rubbing and grinding against the one you are, until both of $slaves[$partner].slaveName and <<= getSlave($AS).slaveName>> are lying on the desk<<if ($PC.dick != 0)>> with cum dripping out of them<</if>>, making out tiredly. - <<set $slaves[$partner].counter.oral++, getSlave($AS).counter.oral++, $oralTotal++>> - <<= VCheck.Both(getSlave($AS), 1)>> - <<= VCheck.Partner($slaves[$partner], 1)>> -<<elseif canMove(getSlave($AS)) && canMove($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 20) && (["sister", "brother", "half-sister", "half-brother", "twin sister", "twin brother"].includes(_activeSlaveRel))>> - You call <<= getSlave($AS).slaveName>>'s _partnerRel $slaves[$partner].slaveName in for some incestuous fun, but see no reason to wait for _him2. When _he2 arrives, it's to the <<if canSee($slaves[$partner])>>sight<<else>>scene<</if>> of <<= getSlave($AS).slaveName>> sitting on the - <<if canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>> - couch with $his leg<<if hasBothLegs(getSlave($AS))>>s<</if>> spread with you - <<if canDoVaginal(getSlave($AS))>>gently fucking $his pussy<<else>>using $his asshole<</if>><<if ($PC.dick == 0)>> with a strap-on<</if>>. - You pull out - <<else>> - floor with - <<if ($PC.dick == 0)>> - $his face buried in your pussy. You pull away - <<else>> - your dick down $his throat. You pull out - <</if>> - <</if>> - and order $slaves[$partner].slaveName to orally service _his2 _activeSlaveRel. _He2 gets down before the spread-eagled slave $girl to get to work. After watching <<= getSlave($AS).slaveName>> enjoy the attention for a while, you move behind the busy $slaves[$partner].slaveName and pull _him2 into a good position so you can fuck _him2 while _he2 sucks. After a few thrusts, <<= getSlave($AS).slaveName>>'s eyes roll back. <<if (getSlave($AS).voice == 0) || (getSlave($AS).accent >= 3)>>$He gestures that it feels really good when you make $his _partnerRel moan into $him.<<else>>"Oh <<Master>>," $he squeals, "it feel<<s>> <<s>>o good when you make _him2 moan into me!"<</if>> - <<set $slaves[$partner].counter.oral++, getSlave($AS).counter.oral++, $oralTotal++>> - <<= VCheck.Both(getSlave($AS), 1)>> - <<= VCheck.Partner($slaves[$partner], 1)>> -<<elseif ["daughter", "son", "father", "mother", "sole parent", "half-sister", "half-brother", "sister", "brother", "twin brother", "twin sister"].includes(_activeSlaveRel)>> - Since between them they aren't able to enthusiastically perform an incestuous threesome, you simply line <<= getSlave($AS).slaveName>> and $slaves[$partner].slaveName up next to one another on the couch next to your desk,<<if ($PC.dick == 0)>> don a strap-on,<</if>> and fuck <<if $seeRace == 1>><<= getSlave($AS).race>> holes <</if>>at will. Whenever a hole begins to pall you just switch to another. <<= getSlave($AS).slaveName>> tries hard to ignore the fact that $he's getting fucked next to $his _partnerRel, and $slaves[$partner].slaveName pretends the cock getting shoved into _him2 isn't slick from _his2 _activeSlaveRel's fuckhole. - <<= VCheck.Both(getSlave($AS), 1)>> - <<= VCheck.Partner($slaves[$partner], 1)>> -<<elseif ((_activeSlaveRel == "friend") || (_activeSlaveRel == "best friend")) && (getSlave($AS).devotion > 20) && ($slaves[$partner].devotion > 20)>> - <<= getSlave($AS).slaveName>> and $slaves[$partner].slaveName line up next to one another on the couch next to your desk<<if ($PC.dick == 0)>> while you don a strap-on,<</if>> and offer you their holes. They're just friends, but they're sex slaves and they see nothing wrong with enjoying sex with you, together. They keep up a constant stream of giggling, gasping, and smiling as each of them in turn feels a cock, warm and wet from their friend's body, transferred into them. Each of them does their best to help the other do well, even manually stimulating their friend when necessary<<if ($PC.boobs >= 300 || $PC.title == 0)>> and spinning around to lavish attention on your nipples<</if>>. - <<= VCheck.Both(getSlave($AS), 1)>> - <<= VCheck.Partner($slaves[$partner], 1)>> -<<elseif ["friend with benefits", "lover", "slave wife"].includes(_activeSlaveRel) && (getSlave($AS).devotion > 20) && ($slaves[$partner].devotion > 20)>> - <<= getSlave($AS).slaveName>> and $slaves[$partner].slaveName eagerly retire to the couch and arrange themselves face to face so they can make out and enjoy each other's bodies as you enjoy theirs. You decide not to set up an elaborate threesome, and just <<if ($PC.dick == 0)>>engage in a little tribadism with<<else>>fuck<</if>> whatever hole catches your eye next. They rarely break their intimate kissing, forming between the two of them a loving entity on the couch with all sorts of interesting parts to experience. They're sex slaves, and you're fucking them, but they're also lovers who are very comfortable in each others' - <<if ((hasBothArms(getSlave($AS))) && (hasBothArms($slaves[$partner])))>> - arms, - <<elseif ((hasAnyArms(getSlave($AS))) && (hasAnyArms($slaves[$partner])))>> - embrace, - <<else>> - presence, - <</if>> - kissing, fondling each other, and <<if ($PC.dick == 0)>>enjoying your pussy loving<<else>>taking your dick<</if>>. - <<= VCheck.Both(getSlave($AS), 1)>> - <<= VCheck.Partner($slaves[$partner], 1)>> -<<else>> - Since between them they aren't able to enthusiastically perform a threesome, you simply line <<= getSlave($AS).slaveName>> and $slaves[$partner].slaveName up next to one another on the couch next to your desk, and fuck <<if $seeRace == 1>><<= getSlave($AS).race>> holes <</if>>at will. Whenever a hole begins to pall you just switch to another. <<= getSlave($AS).slaveName>> tries hard to ignore the fact that $he's getting fucked next to $his _partnerRel, and $slaves[$partner].slaveName pretends the <<if ($PC.dick == 0)>>strap-on<<else>>cock<</if>> getting shoved into _him2 isn't slick from _his2 _activeSlaveRel's fuckhole. - <<= VCheck.Both(getSlave($AS), 1)>> - <<= VCheck.Partner($slaves[$partner], 1)>> -<</if>> - -<<set $partner = 0>> -<<set $relation = 0>> diff --git a/src/npc/interaction/fRival.js b/src/npc/interaction/fRival.js new file mode 100644 index 0000000000000000000000000000000000000000..b0776e7e26517f180796f748814293d7095bb9e0 --- /dev/null +++ b/src/npc/interaction/fRival.js @@ -0,0 +1,219 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fRival = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, + he, his, him, himself + } = getPronouns(slave); + + const rival = getSlave(slave.rivalryTarget); + const { + He2, + he2, his2, him2 + } = getPronouns(rival).appendSuffix("2"); + addPartner(slave, -1); + addPartner(slave, slave.rivalryTarget); + + r.push(`You call ${slave.slaveName} to your office and let ${him} know you'll be abusing ${rival.slaveName} together.`); + if (slave.fetish === "sadist" && slave.fetishStrength > 60 && slave.fetishKnown === 1) { + r.push(`${He} looks overjoyed at the prospect of getting to hurt someone.`); + } + + r.push(rival.slaveName); + if (canSee(rival)) { + r.push(`sees`); + } else { + r.push(`senses`); + } + + r.push(`${slave.slaveName} as ${he2} enters and looks worried.`); + + if (rival.anus === 0 && rival.vagina < 0) { + r.push(`Since ${he2}'s a sissy bitch and an anal virgin, you tell ${him2} to bend over and`); + if (V.PC.dick === 0) { + r.push(`give you head.`); + } else { + r.push(`suck your dick.`); + } + r.push(`${He2} does, and once ${he2}'s working away, you tell ${slave.slaveName} to come over and start spanking. ${rival.slaveName} begins to lift ${his2} head as though to protest, so you shove ${him2} back down onto your`); + if (V.PC.dick === 0) { + r.push(`pussy,`); + } else { + r.push(`cock,`); + } + r.push(`gagging and struggling. ${slave.slaveName} administers a series of cruel slaps to the quivering`); + if (V.seeRace === 1) { + r.push(`${rival.race}`); + } + r.push(`buttocks in front of ${him}, making your victim yell delightfully into your`); + if (V.PC.dick === 0) { + r.push(`womanhood.`); + } else { + r.push(`member.`); + } + r.push(`After a short time ${slave.slaveName} decides to be even crueler, and begins to 'miss' frequently, hitting ${rival.slaveName}'s limp dick instead of ${his2} ass.`); + + seX(slave, "oral", rival, "oral"); + } else if (rival.anus === 0 && rival.vagina === 0 && hasAnyArms(slave)) { + r.push(`Since ${he2}'s a virgin, you tell ${him2} to bend over and`); + if (V.PC.dick === 0) { + r.push(`give you head.`); + } else { + r.push(`suck your dick.`); + } + r.push(`${He2} does, and once ${he2}'s working away, you tell ${slave.slaveName} to come over and start spanking. ${rival.slaveName} begins to lift ${his2} head as though to protest, so you shove ${him2} back down onto your`); + if (V.PC.dick === 0) { + r.push(`pussy,`); + } else { + r.push(`cock,`); + } + r.push(`gagging and struggling. ${slave.slaveName} administers a series of cruel slaps to the quivering`); + if (V.seeRace === 1) { + r.push(`${rival.race}`); + } + r.push(`buttocks in front of ${him}, making your victim yell delightfully into your`); + if (V.PC.dick === 0) { + r.push(`womanhood.`); + } else { + r.push(`member.`); + } + r.push(`After a short time ${slave.slaveName} decides to be even crueler, and begins to 'miss' frequently, hitting ${rival.slaveName}'s poor pussy instead of ${his2} ass.`); + + seX(slave, "oral", rival, "oral"); + } else if (rival.anus === 0 && rival.vagina > 0 && canPenetrate(slave) && hasAnyArms(slave)) { + r.push(`You tell ${him2} to bend over and`); + if (V.PC.dick === 0) { + r.push(`give you head.`); + } else { + r.push(`suck your dick.`); + } + + r.push(`${He2} does, and once ${he2}'s working away, you tell ${slave.slaveName} to use the bitch. ${rival.slaveName} begins to lift ${his2} head as though to protest, so you shove ${him2} back down onto your`); + if (V.PC.dick === 0) { + r.push(`pussy,`); + } else { + r.push(`cock,`); + } + r.push(`gagging and struggling. ${slave.slaveName} lands a slap on the`); + if (V.seeRace === 1) { + r.push(`rival.race`); + } + r.push(`butt in front of ${him} as ${he} lines ${his} turgid dick up with ${rival.slaveName}'s pussy. ${He} sinks in with a sigh and begins to enjoy ${himself}, using slaps and pinches to ensure that of the two slaves, the fun is entirely on ${his} side.`); + seX(V.PC, "penetrative", rival, "vaginal"); + seX(slave, "penetrative", rival, "oral"); + } else if (rival.anus === 0 && rival.vagina > 0 && slave.dick > 0) { + r.push(`You`); + if (V.PC.dick === 0) { + r.push(`step into a strap-on and tell ${him2} to ride it,`); + } else { + r.push(`tell ${him2} to ride your dick,`); + } + r.push(`facing away from you. ${He2} does, not without trepidation, which increases when you hold ${him2} securely in place. Once ${he2}'s humping away, you tell ${slave.slaveName} to use ${his2} face. ${slave.slaveName} comes over slowly, unsure what to do with the offer since ${his} dick is so useless. ${He} forces ${rival.slaveName}'s face against ${his} useless member anyway. After a bit of this, ${slave.slaveName}, clearly unsatisfied, turns around and rides ${rival.slaveName} with ${his} ass instead. ${rival.slaveName} tries to avoid orally servicing ${his2} rival's asshole, but you hold ${him2} in place and ${slave.slaveName} sighs in contentment.`); + seX(slave, "anal", rival, "oral"); + seX(V.PC, "penetrative", rival, "vaginal"); + } else if (rival.anus === 0 && rival.vagina > 0) { + r.push(`You`); + if (V.PC.dick === 0) { + r.push(`step into a strap-on and tell ${him2} to ride it,`); + } else { + r.push(`tell ${him2} to ride your dick,`); + } + r.push(`facing away from you. ${He} does, not without trepidation, which increases when you hold ${him} securely in place. Once ${he2}'s humping away, you tell ${slave.slaveName} to ride ${his2} face. ${slave.slaveName} comes over, gently rubbing ${his} pussy. ${He} forces ${rival.slaveName}'s face against ${his} slick cunt, ignoring ${his2} reluctance. ${rival.slaveName} eventually realizes that ${he2}'s better off getting it over with, and applies ${his2} tongue as best ${he2} can.`); + seX(V.PC, "penetrative", rival, "vaginal"); + seX(slave, "penetrative", rival, "oral"); + } else if (rival.anus > 0 && rival.vagina < 0 && canPenetrate(slave)) { + r.push(`You `); + if (V.PC.dick === 0) { + r.push(`step into a strap-on and tell ${him2} to ride it,`); + } else { + r.push(`tell ${him2} to ride your dick,`); + } + r.push(`facing you. ${He2} lowers ${his2} butthole down onto your cock, not without trepidation, which increases when you reach behind ${him2} and spread ${his2} buttocks as wide as they'll go. With ${him2} pinned, you tell ${slave.slaveName} to come over and join you. ${slave.slaveName} comes over, stroking ${himself} hard, not certain what you mean. To make it clear, you hook a single finger up into poor ${rival.slaveName}'s rectum alongside `); + + if (V.PC.dick === 0) { + r.push(`the fake phallus.`); + } else { + r.push(`your dick.`); + } + r.push(`It takes ${slave.slaveName} a while to jam ${his} cock up the struggling and sobbing ${rival.slaveName}'s anus. Of the three phalli present, ${rival.slaveName}'s is the only one that's soft as ${he2} cries ${his2} way through a brutal double anal rape.`); + seX(V.PC, "penetrative", rival, "anal"); + seX(slave, "penetrative", rival, "anal"); + } else if (rival.anus > 0 && rival.vagina === 0 && canPenetrate(slave)) { + r.push(`You `); + if (V.PC.dick === 0) { + r.push(`step into a strap-on and tell ${him2} to ride it`); + } else { + r.push(`tell ${him2} to ride your dick`); + } + r.push(` anally, facing you. ${He2} lowers ${his2} butthole down onto your cock, not without trepidation, which increases when you reach behind ${him2} and spread ${his2} buttocks as wide as they'll go. With ${him2} pinned, you tell ${slave.slaveName} to come over and join you. ${slave.slaveName} comes over, stroking ${himself} hard, not certain what you mean. To make it clear, you hook a single finger up into poor ${rival.slaveName}'s rectum alongside `); + + if (V.PC.dick === 0) { + r.push(`the fake phallus.`); + } else { + r.push(`your dick.`); + } + r.push(`It takes ${slave.slaveName} a while to jam ${his} cock up the struggling and sobbing ${rival.slaveName}'s anus. ${rival.slaveName} buys continued vaginal virginity by taking a brutal double anal rape.`); + seX(V.PC, "penetrative", rival, "anal"); + seX(slave, "penetrative", rival, "anal"); + } else if (rival.anus > 0 && rival.vagina < 1 && slave.dick > 0) { + r.push(`You `); + if (V.PC.dick === 0) { + r.push(`step into a strap-on and tell ${him2} to ride it`); + } else { + r.push(`tell ${him2} to ride your dick`); + } + r.push(` anally, facing away from you. ${He2} does, not without trepidation, which increases when you hold ${him2} securely in place as you pump yourself in and out of ${his2} asshole. You tell ${slave.slaveName} to ride ${his2} face. ${slave.slaveName} comes over slowly, unsure what to do with the offer since ${his} dick is so useless. ${He} forces ${rival.slaveName}'s face against ${his} useless member anyway. After a bit of this, ${slave.slaveName}, clearly unsatisfied, turns around and rides ${rival.slaveName} with ${his} ass instead. ${rival.slaveName} tries to avoid orally servicing ${his2} rival's asshole, but you hold ${him2} in place and ${slave.slaveName} sighs in contentment.`); + seX(V.PC, "penetrative", rival, "anal"); + seX(slave, "penetrative", rival, "oral"); + } else if (rival.anus > 0 && rival.vagina < 1) { + r.push(`You `); + if (V.PC.dick === 0) { + r.push(`step into a strap-on and tell ${him2} to ride it`); + } else { + r.push(`tell ${him2} to ride your dick`); + } + r.push(` anally, facing away from you. ${He2} does, not without trepidation, which increases when you hold ${him2} securely in place as you pump yourself in and out of ${his2} asshole. You tell ${slave.slaveName} to ride ${his2} face. ${slave.slaveName} comes over, gently rubbing ${his} pussy. ${He} forces ${rival.slaveName}'s face against ${his} slick cunt, ignoring ${his2} reluctance. ${rival.slaveName} eventually realizes that ${he2}'s better off getting it over with, and applies ${his2} tongue as best ${he2} can.`); + seX(V.PC, "penetrative", rival, "anal"); + seX(slave, "penetrative", rival, "oral"); + } else if (rival.anus > 0 && rival.vagina > 0 && canPenetrate(slave)) { + r.push(`You `); + if (V.PC.dick === 0) { + r.push(`step into a strap-on and tell ${him2} to ride it,`); + } else { + r.push(`tell ${him2} to ride your dick,`); + } + r.push(`facing you. ${He2} does, with some trepidation, which increases when you reach behind ${him2} and spread ${his2} buttocks as wide as they'll go. With ${him2} pinned, you tell ${slave.slaveName} to come over and join you. ${slave.slaveName} comes over, stroking ${himself} hard. You squeeze ${rival.slaveName}'s buttocks together and then spread them again, forcing ${his2} anus to wink invitingly. You stop ${rival.slaveName}'s abortive humping and hold ${his2} hips in place while ${slave.slaveName} gets ${his} cock up ${his} ass. Once ${he}'s set, off the two of you go, with poor ${rival.slaveName} gasping and grimacing as ${he2} gets it rough in both holes.`); + seX(V.PC, "penetrative", rival, "anal"); + seX(slave, "penetrative", rival, "anal"); + } else if (rival.anus > 0 && rival.vagina > 0 && slave.dick > 0 && hasAnyArms(slave)) { + r.push(`You `); + if (V.PC.dick === 0) { + r.push(`step into a strap-on and tell ${him2} to ride it,`); + } else { + r.push(`tell ${him2} to ride your dick,`); + } + r.push(`facing you. ${He2} does, with some trepidation, which increases when you reach behind ${him2} and spread ${his2} buttocks as wide as they'll go. With ${him2} pinned, you tell ${slave.slaveName} to come over and join you. ${slave.slaveName} comes over, stroking ${himself} hard, not certain what you mean, since ${his} cock is useless. To make it clear, you push two fingers into ${rival.slaveName}'s butt, finger fucking ${his2} asshole until ${slave.slaveName} takes over. Once ${he}'s set, off the two of you go, with poor ${rival.slaveName} gasping and grimacing as ${he2} gets it rough in both holes. ${slave.slaveName} uses as many fingers as ${he} can, always at least one more than ${rival.slaveName} would like.`); + seX(V.PC, "penetrative", rival, "vaginal"); + seX(slave, "penetrative", rival, "anal"); + } else if (rival.anus > 0 && rival.vagina > 0) { + r.push(`You `); + if (V.PC.dick === 0) { + r.push(`step into a strap-on and tell ${him2} to ride it,`); + } else { + r.push(`tell ${him2} to ride your dick,`); + } + r.push(`facing you. ${He2} does, with some trepidation, which increases when you reach behind ${him2} and spread ${his2} buttocks as wide as they'll go. With ${him2} pinned, you tell ${slave.slaveName} to come over and join you, indicating a strap-on for slave use, on a side shelf. ${slave.slaveName} hurries into it and comes over. You stop ${rival.slaveName}'s abortive humping and hold ${his2} hips in place while ${slave.slaveName} gets ${his} fake cock up ${his2} ass. Once ${he}'s set, off the two of you go, with poor ${rival.slaveName} gasping and grimacing as ${he2} gets it rough in both holes. ${slave.slaveName} murmurs calumnies in ${rival.slaveName}'s ear, pinches ${his2} nipples, and generally adds humiliation above and beyond being double penetrated by ${his2} owner and ${his2} rival.`); + seX(V.PC, "penetrative", rival, "vaginal"); + seX(slave, "penetrative", rival, "anal"); + } else { + r.push(`Unforeseen combination of rival stats; yell at FC Dev to write a scene for these slaves.`); + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fRival.tw b/src/npc/interaction/fRival.tw deleted file mode 100644 index 262c53f0ad89261d74d2411644b6940483dcc61d..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fRival.tw +++ /dev/null @@ -1,125 +0,0 @@ -:: FRival [nobr no-history] - -<<set _partnerID = getSlave($AS).rivalryTarget>> -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> -<<run App.Utils.setLocalPronouns(getSlave(_partnerID), '2')>> -<<run addPartner(getSlave($AS), _partnerID)>> - -You call <<= getSlave($AS).slaveName>> to your office and let $him know you'll be abusing <<= getSlave(_partnerID).slaveName>> together. - -<<if (getSlave($AS).fetish == "sadist") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1)>> - $He looks overjoyed at the prospect of getting to hurt someone. -<</if>> - -<<= getSlave(_partnerID).slaveName>> <<if canSee(getSlave(_partnerID))>>sees<<else>>senses<</if>> <<= getSlave($AS).slaveName>> as _he2 enters and looks worried. - -<<if (getSlave(_partnerID).anus == 0) && (getSlave(_partnerID).vagina < 0)>> - Since _he2's a sissy bitch and an anal virgin, you tell _him2 to bend over and - <<if ($PC.dick == 0)>> - give you head. - <<else>> - suck your dick. - <</if>> - _He2 does, and once _he2's working away, you tell <<= getSlave($AS).slaveName>> to come over and start spanking. <<= getSlave(_partnerID).slaveName>> begins to lift _his2 head as though to protest, so you shove _him2 back down onto your - <<if ($PC.dick == 0)>> - pussy, - <<else>> - cock, - <</if>>gagging and struggling. <<= getSlave($AS).slaveName>> administers a series of cruel slaps to the quivering - <<if $seeRace == 1>> - <<= getSlave(_partnerID).race>> - <</if>> - buttocks in front of $him, making your victim yell delightfully into your - <<if ($PC.dick == 0)>> - womanhood. - <<else>> - member. - <</if>> - After a short time <<= getSlave($AS).slaveName>> decides to be even crueler, and begins to 'miss' frequently, hitting <<= getSlave(_partnerID).slaveName>>'s limp dick instead of _his2 ass. - <<set getSlave(_partnerID).counter.oral++, $oralTotal++>> -<<elseif (getSlave(_partnerID).anus == 0) && (getSlave(_partnerID).vagina == 0) && (hasAnyArms(getSlave($AS)))>> - Since _he2's a virgin, you tell _him2 to bend over and - <<if ($PC.dick == 0)>> - give you head. - <<else>> - suck your dick. - <</if>> - _He2 does, and once _he2's working away, you tell <<= getSlave($AS).slaveName>> to come over and start spanking. <<= getSlave(_partnerID).slaveName>> begins to lift _his2 head as though to protest, so you shove _him2 back down onto your - <<if ($PC.dick == 0)>> - pussy, - <<else>> - cock, - <</if>> - gagging and struggling. <<= getSlave($AS).slaveName>> administers a series of cruel slaps to the quivering - <<if $seeRace == 1>> - <<= getSlave(_partnerID).race>> - <</if>> - buttocks in front of $him, making your victim yell delightfully into your - <<if ($PC.dick == 0)>> - womanhood. - <<else>> - member. - <</if>> - After a short time <<= getSlave($AS).slaveName>> decides to be even crueler, and begins to 'miss' frequently, hitting <<= getSlave(_partnerID).slaveName>>'s poor pussy instead of _his2 ass. - <<set getSlave(_partnerID).counter.oral++, $oralTotal++>> -<<elseif (getSlave(_partnerID).anus == 0) && (getSlave(_partnerID).vagina > 0) && canPenetrate(getSlave($AS)) && (hasAnyArms(getSlave($AS)))>> - You tell _him2 to bend over and - <<if ($PC.dick == 0)>> - give you head. - <<else>> - suck your dick. - <</if>> - _He2 does, and once _he2's working away, you tell <<= getSlave($AS).slaveName>> to use the bitch. <<= getSlave(_partnerID).slaveName>> begins to lift _his2 head as though to protest, so you shove _him2 back down onto your - <<if ($PC.dick == 0)>> - pussy, - <<else>> - cock, - <</if>>gagging and struggling. <<= getSlave($AS).slaveName>> lands a slap on the - <<if $seeRace == 1>> - getSlave(_partnerID).race - <</if>> - butt in front of $him as $he lines $his turgid dick up with <<= getSlave(_partnerID).slaveName>>'s pussy. $He sinks in with a sigh and begins to enjoy $himself, using slaps and pinches to ensure that of the two slaves, the fun is entirely on $his side. - <<set getSlave(_partnerID).counter.vaginal++, getSlave(_partnerID).counter.oral++, getSlave($AS).counter.penetrative++, $vaginalTotal++, $oralTotal++, $penetrativeTotal++>> -<<elseif (getSlave(_partnerID).anus == 0) && (getSlave(_partnerID).vagina > 0) && (getSlave($AS).dick > 0)>> - You - <<if ($PC.dick == 0)>> - step into a strap-on and tell _him2 to ride it, - <<else>> - tell _him2 to ride your dick, - <</if>> - facing away from you. _He2 does, not without trepidation, which increases when you hold _him2 securely in place. Once _he2's humping away, you tell <<= getSlave($AS).slaveName>> to use _his2 face. <<= getSlave($AS).slaveName>> comes over slowly, unsure what to do with the offer since $his dick is so useless. $He forces <<= getSlave(_partnerID).slaveName>>'s face against $his useless member anyway. After a bit of this, <<= getSlave($AS).slaveName>>, clearly unsatisfied, turns around and rides <<= getSlave(_partnerID).slaveName>> with $his ass instead. <<= getSlave(_partnerID).slaveName>> tries to avoid orally servicing _his2 rival's asshole, but you hold _him2 in place and <<= getSlave($AS).slaveName>> sighs in contentment. - <<set getSlave(_partnerID).counter.oral++, getSlave(_partnerID).counter.vaginal++, getSlave($AS).counter.oral++, $vaginalTotal++, $oralTotal += 2>> -<<elseif (getSlave(_partnerID).anus == 0) && (getSlave(_partnerID).vagina > 0)>> - You - <<if ($PC.dick == 0)>> - step into a strap-on and tell _him2 to ride it, - <<else>> - tell _him2 to ride your dick, - <</if>> - facing away from you. $He does, not without trepidation, which increases when you hold $him securely in place. Once _he2's humping away, you tell <<= getSlave($AS).slaveName>> to ride _his2 face. <<= getSlave($AS).slaveName>> comes over, gently rubbing $his pussy. $He forces <<= getSlave(_partnerID).slaveName>>'s face against $his slick cunt, ignoring _his2 reluctance. <<= getSlave(_partnerID).slaveName>> eventually realizes that _he2's better off getting it over with, and applies _his2 tongue as best _he2 can. - <<set getSlave(_partnerID).counter.oral++, getSlave(_partnerID).counter.vaginal++, getSlave($AS).counter.oral++, $vaginalTotal++, $oralTotal += 2>> -<<elseif (getSlave(_partnerID).anus > 0) && (getSlave(_partnerID).vagina < 0) && canPenetrate(getSlave($AS))>> - You <<if ($PC.dick == 0)>>step into a strap-on and tell _him2 to ride it<<else>>tell _him2 to ride your dick<</if>>, facing you. _He2 lowers _his2 butthole down onto your cock, not without trepidation, which increases when you reach behind _him2 and spread _his2 buttocks as wide as they'll go. With _him2 pinned, you tell <<= getSlave($AS).slaveName>> to come over and join you. <<= getSlave($AS).slaveName>> comes over, stroking $himself hard, not certain what you mean. To make it clear, you hook a single finger up into poor <<= getSlave(_partnerID).slaveName>>'s rectum alongside <<if ($PC.dick == 0)>>the fake phallus<<else>>your dick<</if>>. It takes <<= getSlave($AS).slaveName>> a while to jam $his cock up the struggling and sobbing <<= getSlave(_partnerID).slaveName>>'s anus. Of the three phalli present, <<= getSlave(_partnerID).slaveName>>'s is the only one that's soft as _he2 cries _his2 way through a brutal double anal rape. - <<set getSlave(_partnerID).counter.anal++, getSlave($AS).counter.penetrative++, $analTotal++, $penetrativeTotal++>> -<<elseif (getSlave(_partnerID).anus > 0) && (getSlave(_partnerID).vagina == 0) && canPenetrate(getSlave($AS))>> - You <<if ($PC.dick == 0)>>step into a strap-on and tell _him2 to ride it<<else>>tell _him2 to ride your dick<</if>> anally, facing you. _He2 lowers _his2 butthole down onto your cock, not without trepidation, which increases when you reach behind _him2 and spread _his2 buttocks as wide as they'll go. With _him2 pinned, you tell <<= getSlave($AS).slaveName>> to come over and join you. <<= getSlave($AS).slaveName>> comes over, stroking $himself hard, not certain what you mean. To make it clear, you hook a single finger up into poor <<= getSlave(_partnerID).slaveName>>'s rectum alongside <<if ($PC.dick == 0)>>the fake phallus<<else>>your dick<</if>>. It takes <<= getSlave($AS).slaveName>> a while to jam $his cock up the struggling and sobbing <<= getSlave(_partnerID).slaveName>>'s anus. <<= getSlave(_partnerID).slaveName>> buys continued vaginal virginity by taking a brutal double anal rape. - <<set getSlave(_partnerID).counter.anal++, getSlave($AS).counter.penetrative++, $analTotal++, $penetrativeTotal++>> -<<elseif (getSlave(_partnerID).anus > 0) && (getSlave(_partnerID).vagina < 1) && (getSlave($AS).dick > 0)>> - You <<if ($PC.dick == 0)>>step into a strap-on and tell _him2 to ride it<<else>>tell _him2 to ride your dick<</if>> anally, facing away from you. _He2 does, not without trepidation, which increases when you hold _him2 securely in place as you pump yourself in and out of _his2 asshole. You tell <<= getSlave($AS).slaveName>> to ride _his2 face. <<= getSlave($AS).slaveName>> comes over slowly, unsure what to do with the offer since $his dick is so useless. $He forces <<= getSlave(_partnerID).slaveName>>'s face against $his useless member anyway. After a bit of this, <<= getSlave($AS).slaveName>>, clearly unsatisfied, turns around and rides <<= getSlave(_partnerID).slaveName>> with $his ass instead. <<= getSlave(_partnerID).slaveName>> tries to avoid orally servicing _his2 rival's asshole, but you hold _him2 in place and <<= getSlave($AS).slaveName>> sighs in contentment. - <<set getSlave(_partnerID).counter.anal++, getSlave(_partnerID).counter.oral++, getSlave($AS).counter.oral++, $analTotal++, $oralTotal += 2>> -<<elseif (getSlave(_partnerID).anus > 0) && (getSlave(_partnerID).vagina < 1)>> - You <<if ($PC.dick == 0)>>step into a strap-on and tell _him2 to ride it<<else>>tell _him2 to ride your dick<</if>> anally, facing away from you. _He2 does, not without trepidation, which increases when you hold _him2 securely in place as you pump yourself in and out of _his2 asshole. You tell <<= getSlave($AS).slaveName>> to ride _his2 face. <<= getSlave($AS).slaveName>> comes over, gently rubbing $his pussy. $He forces <<= getSlave(_partnerID).slaveName>>'s face against $his slick cunt, ignoring _his2 reluctance. <<= getSlave(_partnerID).slaveName>> eventually realizes that _he2's better off getting it over with, and applies _his2 tongue as best _he2 can. - <<set getSlave(_partnerID).counter.oral++, getSlave(_partnerID).counter.anal++, getSlave($AS).counter.oral++, $analTotal++, $oralTotal += 2>> -<<elseif (getSlave(_partnerID).anus > 0) && (getSlave(_partnerID).vagina > 0) && canPenetrate(getSlave($AS))>> - You <<if ($PC.dick == 0)>>step into a strap-on and tell _him2 to ride it<<else>>tell _him2 to ride your dick<</if>>, facing you. _He2 does, with some trepidation, which increases when you reach behind _him2 and spread _his2 buttocks as wide as they'll go. With _him2 pinned, you tell <<= getSlave($AS).slaveName>> to come over and join you. <<= getSlave($AS).slaveName>> comes over, stroking $himself hard. You squeeze <<= getSlave(_partnerID).slaveName>>'s buttocks together and then spread them again, forcing _his2 anus to wink invitingly. You stop <<= getSlave(_partnerID).slaveName>>'s abortive humping and hold _his2 hips in place while <<= getSlave($AS).slaveName>> gets $his cock up $his ass. Once $he's set, off the two of you go, with poor <<= getSlave(_partnerID).slaveName>> gasping and grimacing as _he2 gets it rough in both holes. - <<set getSlave(_partnerID).counter.vaginal++, getSlave(_partnerID).counter.anal++, getSlave($AS).counter.penetrative++, $vaginalTotal++, $analTotal++, $penetrativeTotal++>> -<<elseif (getSlave(_partnerID).anus > 0) && (getSlave(_partnerID).vagina > 0) && (getSlave($AS).dick > 0) && (hasAnyArms(getSlave($AS)))>> - You <<if ($PC.dick == 0)>>step into a strap-on and tell _him2 to ride it<<else>>tell _him2 to ride your dick<</if>>, facing you. _He2 does, with some trepidation, which increases when you reach behind _him2 and spread _his2 buttocks as wide as they'll go. With _him2 pinned, you tell <<= getSlave($AS).slaveName>> to come over and join you. <<= getSlave($AS).slaveName>> comes over, stroking $himself hard, not certain what you mean, since $his cock is useless. To make it clear, you push two fingers into <<= getSlave(_partnerID).slaveName>>'s butt, finger fucking _his2 asshole until <<= getSlave($AS).slaveName>> takes over. Once $he's set, off the two of you go, with poor <<= getSlave(_partnerID).slaveName>> gasping and grimacing as _he2 gets it rough in both holes. <<= getSlave($AS).slaveName>> uses as many fingers as $he can, always at least one more than <<= getSlave(_partnerID).slaveName>> would like. - <<set getSlave(_partnerID).counter.vaginal++, getSlave(_partnerID).counter.anal++, getSlave($AS).counter.penetrative++, $vaginalTotal++, $analTotal++, $penetrativeTotal++>> -<<elseif (getSlave(_partnerID).anus > 0) && (getSlave(_partnerID).vagina > 0)>> - You <<if ($PC.dick == 0)>>step into a strap-on and tell _him2 to ride it<<else>>tell _him2 to ride your dick<</if>>, facing you. _He2 does, with some trepidation, which increases when you reach behind _him2 and spread _his2 buttocks as wide as they'll go. With _him2 pinned, you tell <<= getSlave($AS).slaveName>> to come over and join you, indicating a strap-on for slave use, on a side shelf. <<= getSlave($AS).slaveName>> hurries into it and comes over. You stop <<= getSlave(_partnerID).slaveName>>'s abortive humping and hold _his2 hips in place while <<= getSlave($AS).slaveName>> gets $his fake cock up _his2 ass. Once $he's set, off the two of you go, with poor <<= getSlave(_partnerID).slaveName>> gasping and grimacing as _he2 gets it rough in both holes. <<= getSlave($AS).slaveName>> murmurs calumnies in <<= getSlave(_partnerID).slaveName>>'s ear, pinches _his2 nipples, and generally adds humiliation above and beyond being double penetrated by _his2 owner and _his2 rival. - <<set getSlave(_partnerID).counter.vaginal++, getSlave(_partnerID).counter.anal++, getSlave($AS).counter.penetrative++, $vaginalTotal++, $analTotal++, $penetrativeTotal++>> -<<else>> - Unforeseen combination of rival stats; yell at FC Dev to write a scene for these slaves. -<</if>> diff --git a/src/npc/interaction/fSlaveImpregConsummate.tw b/src/npc/interaction/fSlaveImpregConsummate.tw deleted file mode 100644 index d6e5358394488580b855dc654dc24771568f23ee..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fSlaveImpregConsummate.tw +++ /dev/null @@ -1,395 +0,0 @@ -:: FSlaveImpreg Consummate [nobr no-history] - -The first necessary step is to prepare the donatrix. -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> -<<set _belly = bellyAdjective(getSlave($AS))>> -<<set _superfetation = (getSlave($AS).geneticQuirks.superfetation == 2 && getSlave($AS).pregKnown == 1) ? 1 : 0>> -<<set _penCountBonus = random(6,20), _analCountBonus = _penCountBonus, _vagCountBonus = _penCountBonus>> -<<set $impregnatrix.counter.penetrative += _penCountBonus+1, $penetrativeTotal += _penCountBonus+1>> -<<setLocalPronouns $impregnatrix 2>> -<<setPlayerPronouns>> - -<<if ($impregnatrix.fetish == "pregnancy") && ($impregnatrix.fetishKnown == 1) && ($impregnatrix.fetishStrength > 60) && ($impregnatrix.devotion >= -20)>> - This is very easy, since $impregnatrix.slaveName has an impregnation fetish. - <<if $impregnatrix.pregKnown == 1>> - _He2's pregnant, and as far as _he2's concerned, everyone should be pregnant. $He's @@.hotpink;happy to spread the love.@@ - <<elseif isFertile($impregnatrix)>> - _He2'd love to get pregnant _himself2, but as far as _he2's concerned, putting a baby in someone else is the @@.hotpink;next best thing.@@ - <<else>> - _He2's been deeply unhappy that there's no prospect of _him2 ever being able to carry a child, and this is the @@.hotpink;next best thing@@ for _him2. - <</if>> - <<set $impregnatrix.devotion += 4>> - <<if ($impregnatrix.preg == -3)>>_His2 member remains limp despite the prospect of getting another slave pregnant, but a direct injection of vasodilators quickly fixes that for this special occasion. - <<else>>_His2 member springs instantly to attention at the prospect of getting another slave pregnant. - <</if>> - -<<elseif ($impregnatrix.attrXX > 65) && ($impregnatrix.attrKnown == 1) && ($impregnatrix.devotion >= -20)>> - Since $impregnatrix.slaveName likes sticking _his2 cock in girls, _he2 doesn't take much convincing. - <<if ($impregnatrix.preg == -3)>>_His2 member remains limp despite the prospect of <<if getSlave($AS).mpreg == 1>>ass<<else>>pussy<</if>>, but a direct injection of vasodilators quickly fixes that for this special occasion. - <<else>>_His2 member springs instantly to attention at the prospect of pussy. - <</if>> - -<<elseif ($impregnatrix.devotion > 50)>> - Since $impregnatrix.slaveName is devoted to you, _he2'll eagerly fuck anything you tell _him2 to fuck. - <<if ($impregnatrix.preg == -3)>>_He2 accepts a direct injection of vasodilators to counteract the hormones keeping _him2 soft, - <<else>>_He2 quickly gets _himself2 hard, - <</if>> - only a certain confusion in _his2 look betraying that _he2 realizes how special an occasion this is. - -<<elseif ($impregnatrix.devotion > 20)>> - Since $impregnatrix.slaveName is obedient, _he2'll fuck anything you tell _him2 to fuck. - <<if ($impregnatrix.preg == -3)>>_He2 accepts a direct injection of vasodilators to counteract the hormones keeping _him2 soft, - <<else>>_He2 hurriedly gets _himself2 hard, - <</if>> - only a slight hesitation betraying _his2 realization that this is a special occasion. - -<<elseif ($impregnatrix.devotion >= -20)>> - Since $impregnatrix.slaveName does not resist your will, _he2 should comply reasonably well. - <<if ($impregnatrix.preg == -3)>>_He2 accepts a direct injection of vasodilators to counteract the hormones keeping _him2 soft, - <<else>>_He2 has to work to get _himself2 hard despite _his2 doubts, - <</if>> - fear and disgust showing on _his2 face as _he2 absorbs the perversion of the natural order of things _he2's about to experience. - -<<else>> - Since $impregnatrix.slaveName is unlikely to comply willingly, you simply restrain _him2 and administer a massive dose of vasodilators, directly where they will do the most good. $impregnatrix.slaveName writhes with the pain of the injection, which is compounded as _he2 springs agonizingly erect. - -<</if>> - -<br><br> - -Next, you see to <<= getSlave($AS).slaveName>>. - -<<if getSlave($AS).mpreg == 1>> - <<set getSlave($AS).counter.anal += _analCountBonus+1>> - <<set $analTotal += _analCountBonus+1>> -<<else>> - <<set getSlave($AS).counter.vaginal += _vagCountBonus+1>> - <<set $vaginalTotal += _vagCountBonus+1>> -<</if>> - -<<if (getSlave($AS).fetish == "pregnancy") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1) && ((getSlave($AS).vagina == 0) || ((getSlave($AS).anus == 0) && (getSlave($AS).mpreg == 1)))>> - $He cries with joy and presents $his virgin <<if getSlave($AS).mpreg == 1>>ass<<else>>pussy<</if>> to $impregnatrix.slaveName for <<if _superfetation == 1>>repeat <</if>>fertilization. @@.hotpink;$He is grateful@@ for this fulfillment of $his fondest wish and naturally @@.lime;will break in $his <<if getSlave($AS).mpreg == 1>>ass<<else>>pussy<</if>>.@@ - <<if getSlave($AS).mpreg == 1>> - <<set getSlave($AS).anus = 1>> - <<else>> - <<set getSlave($AS).vagina = 1>> - <</if>> - <<set getSlave($AS).devotion += 10>> - -<<elseif (getSlave($AS).fetish == "pregnancy") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>> - $He cries with joy and presents $his fertile <<if getSlave($AS).mpreg == 1>>ass<<else>>pussy<</if>> to $impregnatrix.slaveName for <<if _superfetation == 1>>further <</if>>breeding. @@.hotpink;$He is grateful@@ for this fulfillment of $his fondest wish. - <<set getSlave($AS).devotion += 4>> - -<<elseif (getSlave($AS).devotion > 20) && ((getSlave($AS).vagina == 0) || ((getSlave($AS).anus == 0) && (getSlave($AS).mpreg == 1)))>> - $He accepts your orders without comment and presents $his virgin <<if getSlave($AS).mpreg == 1>>ass<<else>>pussy<</if>> to $impregnatrix.slaveName for fertilization. $He gasps in shock when $he feels _his2 hot seed. @@.hotpink;$He is broken to slavery@@ by this application of $his body, which naturally @@.lime;will break in $his <<if getSlave($AS).mpreg == 1>>ass<<else>>pussy<</if>>.@@ - <<if getSlave($AS).mpreg == 1>> - <<set getSlave($AS).anus = 1>> - <<else>> - <<set getSlave($AS).vagina = 1>> - <</if>> - <<set getSlave($AS).devotion += 10>> - -<<elseif (getSlave($AS).devotion >= -20) && ((getSlave($AS).vagina == 0) || ((getSlave($AS).anus == 0) && (getSlave($AS).mpreg == 1)))>> - $He is clearly unhappy at the idea of losing $his pearl of great price to $impregnatrix.slaveName; this probably isn't what $he imagined $his first real sex would be like. Worse, $he knows $he's fertile and realizes - <<if _superfetation == 1>> - $his existing pregnancy is of little concern to the new life likely to take root in $him. - <<else>> - $he'll likely get pregnant. - <</if>> - Nevertheless, @@.hotpink;$he is broken to slavery@@ by this application of $his body, which naturally @@.lime;will break in $his <<if getSlave($AS).mpreg == 1>>ass<<else>>pussy<</if>>.@@ - <<if getSlave($AS).mpreg == 1>> - <<set getSlave($AS).anus = 1>> - <<else>> - <<set getSlave($AS).vagina = 1>> - <</if>> - <<set getSlave($AS).devotion += 4>> - -<<elseif ((getSlave($AS).vagina == 0) || ((getSlave($AS).anus == 0) && (getSlave($AS).mpreg == 1)))>> - As you anticipated, $he refuses to give $impregnatrix.slaveName $his virginity. You restrain $him despite $his @@.mediumorchid;horrified tears@@ and @@.gold;frightened begging.@@ Naturally, this cruel tableau @@.lime;will break in $his <<if getSlave($AS).mpreg == 1>>ass<<else>>pussy<</if>>.@@ - <<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 5>> - <<if getSlave($AS).mpreg == 1>> - <<set getSlave($AS).anus = 1>> - <<else>> - <<set getSlave($AS).vagina = 1>> - <</if>> - -<<elseif isAmputee(getSlave($AS))>> - You set $his limbless torso up for $impregnatrix.slaveName. -<<elseif tooBigBelly(getSlave($AS))>> - You set $him up for $impregnatrix.slaveName, face-down so $he may rest helplessly against $his _belly belly. -<<elseif tooBigBreasts(getSlave($AS))>> - You set $him up for $impregnatrix.slaveName, face-<<if getSlave($AS).belly >= 60000>>up<<else>>down<</if>> so the weight of $his tits pins $him helplessly in place. -<<elseif tooBigButt(getSlave($AS))>> - You set $him up for $impregnatrix.slaveName, face-down so the weight of $his giant ass pins $him helplessly in place and gives $impregnatrix.slaveName a lovely cushion to thrust against. -<<elseif tooBigDick(getSlave($AS))>> - You set $him up for $impregnatrix.slaveName, face-up so $he is pinned under the weight of $his giant cock. -<<elseif tooBigBalls(getSlave($AS))>> - You set $him up for $impregnatrix.slaveName, face-<<if getSlave($AS).belly >= 60000>>up<<else>>down<</if>> so the weight of $his giant balls anchor $him helplessly in place. -<<elseif (getSlave($AS).fetish == "submissive") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1)>> - $He is accustomed to submit to you, but as a natural submissive $he doesn't have much trouble submitting to $impregnatrix.slaveName's seed instead. -<<elseif getSlave($AS).devotion < -20>> - $He tries to refuse, so you restrain $him despite $his resistance to the idea of being made a breeder. -<<elseif getSlave($AS).devotion <= 20>> - $He obeys your orders reluctantly, arranging $himself for <<if getSlave($AS).mpreg == 1>>anal<<else>>vaginal<</if>> sex despite $his obvious hesitation to be made a breeder. -<<elseif getSlave($AS).devotion < 10>> - $He obeys your orders, arranging $himself for <<if getSlave($AS).mpreg == 1>>anal<<else>>vaginal<</if>> sex despite $his slight hesitation at the idea of being made a breeder. -<<else>> - $He happily obeys your orders, getting ready to serve $his <<= getWrittenTitle(getSlave($AS))>> by making _himP another slave. -<</if>> - -<<= knockMeUp(getSlave($AS), 100, 2, $impregnatrix.ID, 1)>> - -<br><br> - -<<if (getSlave($AS).devotion < -20) && ($impregnatrix.devotion < -20)>> - Since you have two restrained slaves, it's up to you to do all the work. You put <<= getSlave($AS).slaveName>> on the couch with $his <<if getSlave($AS).mpreg == 1>>ass<<else>>pussy<</if>> available, and then maneuver $impregnatrix.slaveName's dick into place. The two slaves make no further moves until you deal $impregnatrix.slaveName a terrific swat across the ass and promise to give _him2 more of the same until _he2 gets going. After watching them mechanically go at it for a while, you stop $impregnatrix.slaveName, insert an electrostimulator up _his2 rectum, and administer a shock to _his2 <<if $impregnatrix.prostate != 0>>prostate<<else>>internals<</if>> that forces _him2 to empty _his2 nuts into <<= getSlave($AS).slaveName>>. Both slaves @@.mediumorchid;resent@@ what you made them do and @@.gold;fear you@@ as a result. - <<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 5>> - <<set $impregnatrix.devotion -= 5, $impregnatrix.trust -= 5>> - <<set $impregnatrix.counter.anal += 1, $analTotal += 1>> - <<if ($impregnatrix.anus == 0)>> - $impregnatrix.slaveName would have been reluctant to @@.lime;lose _his2 anal virginity@@ in any case, but being assraped by a metal probe that shocked _him2 into orgasm so that _he2 would impregnate another slave is @@.mediumorchid;a special level@@ of violation for _him2. - <<set $impregnatrix.devotion -= 5, $impregnatrix.anus = 1>> - <</if>> - -<<elseif ($impregnatrix.devotion < -20)>> - Since your semen donatrix is restrained, you order <<= getSlave($AS).slaveName>> to present $himself on the couch, and then maneuver $impregnatrix.slaveName's dick into place. <<= getSlave($AS).slaveName>> does $his best to hump $himself against the unwilling cock until you deal $impregnatrix.slaveName a terrific swat across the ass and promise to give _him2 more of the same until _he2 gets going. After watching _him2 mechanically fuck for a while, you stop _him2, push an electrostimulator up _his2 butt, and administer a shock to _his2 <<if $impregnatrix.prostate != 0>>prostate<<else>>internals<</if>> that forces _him2 to empty _his2 nuts into <<= getSlave($AS).slaveName>>. $He @@.mediumorchid;resents@@ what you made _him2 do and @@.gold;fears you@@ as a result. Though <<= getSlave($AS).slaveName>> accepts the situation, $he looks into $impregnatrix.slaveName's eyes with obvious apology. - <<set $impregnatrix.devotion -= 5, $impregnatrix.trust -= 5>> - <<set $impregnatrix.counter.anal += 1, $analTotal += 1>> - <<if ($impregnatrix.anus == 0)>> - $impregnatrix.slaveName would have been reluctant to @@.lime;lose _his2 anal virginity@@ in any case, but being assraped by a metal probe that shocked _him2 into orgasm so that _he2 would impregnate another slave is @@.mediumorchid;a special level@@ of violation for _him2. - <<set $impregnatrix.devotion -= 5, $impregnatrix.anus = 1>> - <</if>> - -<<elseif ($impregnatrix.fetish == "pregnancy") && ($impregnatrix.fetishStrength > 60) && ($impregnatrix.devotion > 20) && (getSlave($AS).devotion < -20)>> - You arrange <<= getSlave($AS).slaveName>> on the couch with $his fertile pussy defenseless and available, and then tell the randy $impregnatrix.slaveName that it's all _hers2. The slave life has so affected $impregnatrix.slaveName that _he2 is quite eager to rape another slave pregnant<<if _superfetation == 1>>, even more so since $he is already with child<</if>> to fulfill _his2 desire to reproduce. _He2 finishes with indecent speed and looks almost disappointed until you tell _him2 to take _his2 time and be thorough. By the end of the day <<= getSlave($AS).slaveName>>'s <<if getSlave($AS).mpreg == 1>>ass<<else>>cunt<</if>> is dripping cum, to $his @@.gold;horror@@ and @@.mediumorchid;resentment,@@ while $impregnatrix.slaveName is lying next to $him on the couch in a state of obvious @@.hotpink;satiation and bliss.@@ $impregnatrix.slaveName kisses <<= getSlave($AS).slaveName>>'s _belly stomach and expresses the hope that $he'll produce a good new slave. - <<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 5>> - <<set $impregnatrix.devotion += 4>> - -<<elseif ($impregnatrix.energy > 95) && ($impregnatrix.devotion > 20) && (getSlave($AS).devotion < -20)>> - You arrange <<= getSlave($AS).slaveName>> on the couch with $his fertile <<if getSlave($AS).mpreg == 1>>ass<<else>>pussy<</if>> defenseless and available, and then tell the randy $impregnatrix.slaveName that it's all _hers2. The slave life has so affected $impregnatrix.slaveName that _he2 is quite eager to rape another slave pregnant<<if _superfetation == 1>>, especially since $he is already with child<</if>>, just for the perverted novelty of the act. _He2 blows _his2 load with indecent speed and looks crushed until you tell _him2 to take _his2 time and be thorough. By the end of the day <<= getSlave($AS).slaveName>>'s <<if getSlave($AS).mpreg == 1>>anus<<else>>cunt<</if>> is dripping cum, to $his @@.gold;horror@@ and @@.mediumorchid;resentment,@@ while $impregnatrix.slaveName is lying next to $him on the couch in a state of obvious @@.hotpink;satiation and bliss.@@ $impregnatrix.slaveName kisses <<= getSlave($AS).slaveName>>'s _belly stomach and expresses the hope that you'll let _him2 do this again <<if _superfetation == 1>>soon<<else>>sometime<</if>>. - <<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 5>> - <<set $impregnatrix.devotion += 4>> - -<<elseif (getSlave($AS).devotion <= 20) || ($impregnatrix.devotion <= 20)>> - You order <<= getSlave($AS).slaveName>> onto the couch and tell $impregnatrix.slaveName to get on with it. They fuck mechanically, gazing with roiling emotions into each others' eyes. They do seem to come to some sort of a nonverbal understanding on the necessity of getting it done, and there is no real unhappiness in either of them when they finish and disentangle themselves, with $impregnatrix.slaveName's rapidly softening dick slipping easily out of <<= getSlave($AS).slaveName>>'s cum-filled <<if getSlave($AS).mpreg == 1>>ass<<else>>pussy<</if>>. - -<<elseif (getSlave($AS).devotion <= 50) || ($impregnatrix.devotion <= 50)>> - You order <<= getSlave($AS).slaveName>> and $impregnatrix.slaveName to get on with it. They fuck mechanically at first, gazing with roiling emotions into each others' eyes. Eventually, they begin to enjoy the extreme intimacy of the act, finding between themselves a hint of a life before slavery, when men and women had sex within the bonds of marriage for the purpose of procreation<<if _superfetation == 1>>, even though one of them is already heavy with child<</if>>. They finish and resume life as slaves, the light of this intimacy diminishing, softening with $impregnatrix.slaveName's dick and dripping away with the contents of <<= getSlave($AS).slaveName>>'s cum-filled <<if getSlave($AS).mpreg == 1>>ass<<else>>pussy<</if>>. - -<<elseif getSlave($AS).mpreg == 1>> - The parents-to-be need little encouragement. They embrace happily and turn eagerly to the business of anal sex in <<if getSlave($AS).belly+$impregnatrix.belly >= 5000>>an awkward<<else>>the<</if>> cowgirl position. They take their time, humping slowly and gazing into each others' eyes. After a little while, though, <<= getSlave($AS).slaveName>> looks over to where you're sitting, the invitation clear in $his eyes. As soon as you stand to come over, <<= getSlave($AS).slaveName>> turns around on $impregnatrix.slaveName's cock and opens wide for you. You and $impregnatrix.slaveName enjoy the <<if _superfetation == 1>>gravid $girl<<else>>mother-to-be<</if>> gently until $he climaxes, $his eager oral reaching a fever pitch, bringing you to your own climax. - <<if $PC.dick != 0>> - <<if canDoVaginal($impregnatrix)>> - Pulling out, you flip them again so that $impregnatrix.slaveName is on top and switch to _his2 pussy instead, stimulating _his2 <<if $impregnatrix.prostate != 0>>prostate<<else>>internals<</if>> with a good fucking until _he2 blows _his2 load into <<= getSlave($AS).slaveName>>'s fertile <<if getSlave($AS).mpreg == 1>>ass<<else>>cunt<</if>>. The two of them collapse into an exhausted, @@.hotpink;happy@@ pile of slave flesh with three loads inside them. - <<if ($impregnatrix.vagina == 0)>> - $impregnatrix.slaveName will certainly remember this @@.hotpink;very special@@ day for many reasons, including it being _his2 @@.lime;first time@@ as _he2 inseminated <<= getSlave($AS).slaveName>>. - <<set $impregnatrix.devotion += 4, $impregnatrix.vagina = 1>> - <</if>> - <<if canImpreg($impregnatrix, $PC)>> - <<= knockMeUp($impregnatrix, 10, 0, -1, 1)>> - <</if>> - <<set $impregnatrix.counter.vaginal += _penCountBonus, $vaginalTotal += _penCountBonus>> - <<elseif canDoAnal($impregnatrix)>> - Pulling out, you flip them again so that $impregnatrix.slaveName is on top and switch to _his2 ass instead, stimulating _his2 <<if $impregnatrix.prostate != 0>>prostate<<else>>internals<</if>> with a good assfuck until _he2 blows _his2 load into <<= getSlave($AS).slaveName>>'s fertile <<if getSlave($AS).mpreg == 1>>ass<<else>>cunt<</if>>. The two of them collapse into an exhausted, @@.hotpink;happy@@ pile of slave flesh with three loads inside them. - <<if ($impregnatrix.anus == 0)>> - $impregnatrix.slaveName will certainly remember this @@.hotpink;very special@@ day for many reasons, including taking _his2 @@.lime;first buttfuck@@ as _he2 inseminated <<= getSlave($AS).slaveName>>. - <<set $impregnatrix.devotion += 4, $impregnatrix.anus = 1>> - <</if>> - <<if canImpreg($impregnatrix, $PC)>> - <<= knockMeUp($impregnatrix, 10, 1, -1, 1)>> - <</if>> - <<set $impregnatrix.counter.anal += _penCountBonus, $analTotal += _penCountBonus>> - <<else>> - The two of them collapse into an exhausted, @@.hotpink;happy@@ pile of slave flesh. - <</if>> - <<else>> - <<if canDoVaginal($impregnatrix)>> - Pulling back, you flip them again so that $impregnatrix.slaveName is on top and don a strap-on. You begin stimulating _his2 <<if $impregnatrix.prostate != 0>>prostate<<else>>internals<</if>> with a good fucking until _he2 blows _his2 load into <<= getSlave($AS).slaveName>>'s fertile <<if getSlave($AS).mpreg == 1>>ass<<else>>cunt<</if>>. The two of them collapse into an exhausted, @@.hotpink;happy@@ pile of slave flesh. - <<if ($impregnatrix.vagina == 0)>> - $impregnatrix.slaveName will certainly remember this @@.hotpink;very special@@ day for many reasons, including it being _his2 @@.lime;first time@@ as _he2 inseminated <<= getSlave($AS).slaveName>>. - <<set $impregnatrix.devotion += 4, $impregnatrix.vagina = 1>> - <</if>> - <<set $impregnatrix.counter.vaginal += _penCountBonus, $vaginalTotal += _penCountBonus>> - <<elseif canDoAnal($impregnatrix)>> - Pulling back, you flip them again so that $impregnatrix.slaveName is on top and don a strap-on. You begin stimulating _his2 <<if $impregnatrix.prostate != 0>>prostate<<else>>internals<</if>> with a good assfuck until _he2 blows _his2 load into <<= getSlave($AS).slaveName>>'s fertile <<if getSlave($AS).mpreg == 1>>ass<<else>>cunt<</if>>. The two of them collapse into an exhausted, @@.hotpink;happy@@ pile of slave flesh. - <<set $impregnatrix.counter.anal += _penCountBonus, $analTotal += _penCountBonus>> - <<if ($impregnatrix.anus == 0)>> - $impregnatrix.slaveName will certainly remember this @@.hotpink;very special@@ day for many reasons, including taking _his2 @@.lime;first buttfuck@@ as _he2 inseminated <<= getSlave($AS).slaveName>>. - <<set $impregnatrix.devotion += 4, $impregnatrix.anus = 1>> - <</if>> - <<else>> - The two of them collapse into an exhausted, @@.hotpink;happy@@ pile of slave flesh. - <</if>> - <</if>> - <<set $impregnatrix.counter.oral += _penCountBonus, $oralTotal += _penCountBonus>> - <<set getSlave($AS).devotion += 4>> - <<set $impregnatrix.devotion += 4>> - -<<else>> - <<set _didImpregnatrix = 0>> - The parents-to-be need little encouragement. They embrace happily and turn eagerly to the business of vanilla sex in <<if getSlave($AS).belly+$impregnatrix.belly >= 5000>>an awkward<<else>>the<</if>> missionary position. They take their time, humping slowly and gazing into each others' eyes. After a little while, though, <<= getSlave($AS).slaveName>> looks over $impregnatrix.slaveName's shoulder to where you're sitting, the invitation clear in $his eyes. As soon as you stand to come over, they roll over without being ordered to - <<if canDoAnal(getSlave($AS))>> - present <<= getSlave($AS).slaveName>>'s butthole. - <<set getSlave($AS).counter.anal += _penCountBonus, $analTotal += _penCountBonus>> - <<else>> - invite you into <<= getSlave($AS).slaveName>>'s crowded pussy. - <<set getSlave($AS).counter.vaginal += _penCountBonus, $vaginalTotal += _penCountBonus>> - <</if>> - You and $impregnatrix.slaveName double penetrate the <<if _superfetation == 1>>gravid $girl<<else>>mother-to-be<</if>> gently until $he climaxes, clenching you to orgasm in turn with $his spasms. Pulling out, you offer <<if $PC.dick != 0>>yourself<<else>>your strap-on<</if>> to <<= getSlave($AS).slaveName>>'s gasping mouth so $he can <<if $PC.dick != 0>>suck you hard again<<else>>lube the phallus with some saliva<</if>> as $he continues riding cock. Once <<if $PC.dick != 0>>stiff<<else>>the strap-on is nice and wet<</if>>, you flip them again so that $impregnatrix.slaveName is back on top and switch to _his2 - <<if canDoVaginal($impregnatrix)>> - feminine slit instead, stimulating _his2 <<if $impregnatrix.prostate != 0>>prostate<<else>>internals<</if>> with a hard fucking - <<set _didImpregnatrix = 1>> - <<elseif canDoAnal($impregnatrix)>> - ass instead, stimulating _his2 <<if $impregnatrix.prostate != 0>>prostate<<else>>internals<</if>> with a good assfuck - <<set _didImpregnatrix = 2>> - <<else>> - mouth instead, giving _him2 a good facefuck - <<set $impregnatrix.counter.oral += _penCountBonus, $oralTotal += _penCountBonus>> - <</if>> - until _he2 blows _his2 load into <<= getSlave($AS).slaveName>>'s fertile cunt. The two of them collapse into an exhausted, @@.hotpink;happy@@ pile of slave flesh with three loads inside them. - <<set getSlave($AS).devotion += 4>> - <<set $impregnatrix.devotion += 4>> - <<if _didImpregnatrix == 1>> - <<if ($impregnatrix.vagina == 0)>> - $impregnatrix.slaveName will certainly remember this @@.hotpink;very special@@ day for many reasons, including losing _his2 @@.lime;virginity@@ as _he2 inseminated <<= getSlave($AS).slaveName>>. - <<set $impregnatrix.devotion += 4, $impregnatrix.vagina = 1>> - <</if>> - <<set $impregnatrix.counter.vaginal += _penCountBonus, $vaginalTotal += _penCountBonus>> - <<if canImpreg($impregnatrix, $PC)>> - <<= knockMeUp($impregnatrix, 10, 0, -1, 1)>> - <</if>> - <<elseif _didImpregnatrix == 2>> - <<if ($impregnatrix.anus == 0)>> - $impregnatrix.slaveName will certainly remember this @@.hotpink;very special@@ day for many reasons, including taking _his2 @@.lime;first buttfuck@@ as _he2 inseminated <<= getSlave($AS).slaveName>>. - <<set $impregnatrix.devotion += 4, $impregnatrix.anus = 1>> - <</if>> - <<set $impregnatrix.counter.anal += _penCountBonus, $analTotal += _penCountBonus>> - <<if canImpreg($impregnatrix, $PC)>> - <<= knockMeUp($impregnatrix, 10, 1, -1, 1)>> - <</if>> - <</if>> - <<if (getSlave($AS).anus == 0) && canDoAnal(getSlave($AS))>> - <<= getSlave($AS).slaveName>> has been used as a slave in a truly thorough way today: $he has @@.hotpink;accepted@@ both $his @@.lime;first anal@@ and insemination by $impregnatrix.slaveName. - <<set getSlave($AS).devotion += 4, getSlave($AS).anus = 1>> - <</if>> - -<</if>> - -Throughout the week, you keep <<= getSlave($AS).slaveName>>'s <<if getSlave($AS).mpreg == 1>>ass<<else>>pussy<</if>> intimate with $impregnatrix.slaveName's cock. In the end, you are certain <<= getSlave($AS).slaveName>> -<<if _superfetation == 1>> - has @@.lime;added $impregnatrix.slaveName's child@@ to $his pregnancy. -<<else>> - is @@.lime;carrying $impregnatrix.slaveName's child.@@ -<</if>> - - -<<if $arcologies[0].FSRestart != "unset" && $eugenicsFullControl != 1>> - Rumors spread about you breeding your slaves; the Societal Elite are @@.red;displeased@@ by these rumors. - <<set $failedElite += 1>> -<</if>> -<<if $arcologies[0].FSGenderRadicalist != "unset" && getSlave($AS).mpreg == 1>> - Society @@.green;approves@@ of your breeding your slave's ass; this advances the ideal all a slave needs is their rear. - <<run repX($FSSingleSlaveRep*($arcologies[0].FSGenderRadicalist/$FSLockinLevel), "futureSocieties", getSlave($AS))>> - <<set $arcologies[0].FSGenderRadicalist += 0.05*$FSSingleSlaveRep>> -<<elseif $arcologies[0].FSGenderFundamentalist != "unset" && getSlave($AS).mpreg == 1>> - Society @@.red;is disgusted@@ by this degenerate form of reproduction. - <<run repX(forceNeg($FSSingleSlaveRep*($arcologies[0].FSGenderFundamentalist/$FSLockinLevel), "futureSocieties", getSlave($AS))>> - <<set $arcologies[0].FSGenderFundamentalist -= 0.05*$FSSingleSlaveRep>> -<<elseif $arcologies[0].FSGenderFundamentalist != "unset">> - Society @@.green;approves@@ of your breeding your slaves; this advances the ideal of a durable, self propagating race of slaves. - <<run repX($FSSingleSlaveRep*($arcologies[0].FSGenderFundamentalist/$FSLockinLevel), "futureSocieties", getSlave($AS))>> - <<set $arcologies[0].FSGenderFundamentalist += 0.05*$FSSingleSlaveRep>> -<</if>> - -<br><br> - -You prepare the necessary file on their possible offspring. Upon birth, it will be remanded to a slave orphanage to be raised to the age of $minimumSlaveAge and then sold, but its likely appearance and traits are already worth noting. - -<<= getSlave($AS).slaveName>> and $impregnatrix.slaveName are likely to produce - -<<if ($seeRace == 1)>> - - <<if (getSlave($AS).race == "white") && ($impregnatrix.race == "white")>> - a pure white, - <<elseif (getSlave($AS).race == "asian") && ($impregnatrix.race == "asian")>> - a pure Asian, - <<elseif (getSlave($AS).race == "latina") && ($impregnatrix.race == "latina")>> - a pure latina, - <<elseif (getSlave($AS).race == "black") && ($impregnatrix.race == "black")>> - a pure black, - <<elseif (getSlave($AS).race == "middle eastern") && ($impregnatrix.race == "middle eastern")>> - a pure Middle Eastern, - <<elseif (getSlave($AS).race == "malay") && ($impregnatrix.race == "malay")>> - a pure malay, - <<elseif (getSlave($AS).race == "white") && ($impregnatrix.race == "black")>> - a mulatto, - <<elseif (getSlave($AS).race == "black") && ($impregnatrix.race == "white")>> - a mulatto, - <<elseif (getSlave($AS).race == "white") && ($impregnatrix.race == "latina")>> - a mestizo, - <<elseif (getSlave($AS).race == "latina") && ($impregnatrix.race == "white")>> - a mestizo, - <<elseif (getSlave($AS).race == "asian") && ($impregnatrix.race == "black")>> - an Afro-Asian, - <<elseif (getSlave($AS).race == "black") && ($impregnatrix.race == "asian")>> - an Afro-Asian, - <<elseif (getSlave($AS).race == "middle eastern") && ($impregnatrix.race == "black")>> - an Afro-Arab, - <<elseif (getSlave($AS).race == "black") && ($impregnatrix.race == "middle eastern")>> - an Afro-Arab, - <<elseif (getSlave($AS).race == "indo-aryan") && ($impregnatrix.race == "black")>> - an Afro-Indian, - <<elseif (getSlave($AS).race == "black") && ($impregnatrix.race == "indo-aryan")>> - an Afro-Indian, - <<elseif (getSlave($AS).race == "amerindian") && ($impregnatrix.race == "white")>> - a mestizo, - <<elseif (getSlave($AS).race == "white") && ($impregnatrix.race == "amerindian")>> - a mestizo, - <<elseif (getSlave($AS).race == "catgirl" || $impregnatrix.race == "catgirl")>> - a catgirl, - <<elseif (getSlave($AS).race == $impregnatrix.race) && (getSlave($AS).race != "mixed race") && ($impregnatrix.race != "mixed race")>> - an ethnically pure, - <<elseif (getSlave($AS).race != $impregnatrix.race) && (getSlave($AS).race != "mixed race") && ($impregnatrix.race != "mixed race")>> - a biracial, - <<else>> - mixed ethnicity, - <</if>> - -<</if>> - -<<if ((getSlave($AS).intelligence+$impregnatrix.intelligence)/2 > 95)>> - brilliant, -<<elseif ((getSlave($AS).intelligence+$impregnatrix.intelligence)/2 > 15)>> - smart, -<<elseif ((getSlave($AS).intelligence+$impregnatrix.intelligence)/2 < -95)>> - cretinous, -<<elseif ((getSlave($AS).intelligence+$impregnatrix.intelligence)/2 < -15)>> - stupid, -<</if>> - -<<if ((getSlave($AS).height+$impregnatrix.height) > 185)>> - tall, -<<elseif ((getSlave($AS).height+$impregnatrix.height) < 160)>> - short, -<<else>> - middle height, -<</if>> - -<<if ((getSlave($AS).boobs+$impregnatrix.boobs-getSlave($AS).boobsImplant-$impregnatrix.boobsImplant-$impregnatrix.boobsMilk) > 1500)>> - big-titted -<<elseif ((getSlave($AS).boobs+$impregnatrix.boobs-getSlave($AS).boobsImplant-$impregnatrix.boobsImplant-$impregnatrix.boobsMilk) < 700)>> - flat-chested -<<else>> - moderately-breasted -<</if>> - -<<if ((getSlave($AS).butt+$impregnatrix.butt-getSlave($AS).buttImplant-$impregnatrix.buttImplant) > 9)>> - slave with a huge ass. -<<elseif ((getSlave($AS).butt+$impregnatrix.butt-getSlave($AS).buttImplant-$impregnatrix.buttImplant) < 5)>> - slave with a flat ass. -<<else>> - slave with a decent ass. -<</if>> - -<<set $slaves[$slaveIndices[$impregnatrix.ID]] = $impregnatrix>> /* save changes */ diff --git a/src/npc/interaction/fSlaveSelfImpreg.js b/src/npc/interaction/fSlaveSelfImpreg.js new file mode 100644 index 0000000000000000000000000000000000000000..12033dbe456fe89bf62d5633ed05899e001ea6ef --- /dev/null +++ b/src/npc/interaction/fSlaveSelfImpreg.js @@ -0,0 +1,420 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fSlaveSelfImpreg = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself + } = getPronouns(slave); + + addPartner(slave, -1); + + const _pfh = (slave.fetish === "pregnancy" && slave.fetishStrength > 50); + const _pfk = (_pfh && slave.fetishKnown === 1) || slave.sexualFlaw === "breeder"; + let _coop = true; + let _enjoy = true; + const _superfetation = (slave.geneticQuirks.superfetation === 2 && slave.pregKnown === 1) ? 1 : 0; + + if (slave.fetish === "mindbroken") { + } else { + if (slave.devotion <= 20) { + if (slave.devotion < -20) { + r.push(`${slave.slaveName}`); + r.push(`despises you, and tends to resent everything you do on principle,`); + } else if (slave.devotion <= 20) { + r.push(`${slave.slaveName}`); + r.push(`dislikes you,`); + } + if (slave.sexualFlaw === "breeder" || (_pfh && slave.fetishStrength > 90)) { + r.push(`but the idea of simultaneously impregnating and being impregnated is <span class="hotpink">so tempting</span> that ${he}'s <span class="mediumaquamarine">grateful</span> to you despite ${himself}.`); + slave.devotion += 2; + slave.trust += 1; + } else if (_pfk) { + r.push(`but ${his} obvious predilection for being pregnant significantly lessens the <span class="mediumorchid">indignity</span> of the situation.`); + _coop = false; + slave.devotion -= 2; + } else if (_pfh) { + r.push(`but, despite the <span class="mediumorchid">indignity</span> of the situation, ${his} resistance seems strangely muted. It's fairly obvious that something about the idea of being impregnated is <span class="hotpink">strangely appealing</span> to ${him}.`); + _coop = false; + slave.devotion -= 4; + } else { + if (isAmputee(slave)) { + r.push(`and this <span class="gold">uniquely degrading</span> violation of ${his} person only reinforces ${his} <span class="mediumorchid">hatred</span> towards you. The fact that ${he} is <span class="gold">utterly immobile</span> makes a terrifying situation <span class="mediumorchid">even worse.</span>`); + slave.devotion -= 1; + slave.trust -= 1; + } else { + r.push(`and this <span class="gold">uniquely degrading</span> violation of ${his} person only reinforces ${his} <span class="mediumorchid">hatred</span> towards you. ${He} resists so violently that you must <span class="health.dec">physically coerce ${him}</span> into cooperating with the procedure.`); + } + _coop = false; + _enjoy = false; + slave.devotion -= 5; + slave.trust -= 6; + } + } else if (_pfk) { + r.push(`${slave.slaveName}`); + r.push(`<span class="hotpink">genuinely enjoys</span> impregnation and pregnancy, so ${he} is <span class="mediumaquamarine">grateful</span> that you're giving ${him} a chance to become so intimately acquainted with both aspects of ${his} fetish at the same time.`); + slave.devotion += 4; + slave.trust += 2; + if (slave.devotion > 50 && V.arcologies[0].FSRepopulationFocus > 10) { + r.push(`${He} also feels <span class="hotpink">proud</span> that ${he} can be a <span class="mediumaquamarine">self-sustaining</span> source of offspring to support your vision of the future.`); + slave.devotion += 1; + slave.trust += 1; + } + } else { + if (_pfh) { + r.push(`Even though you aren't aware of any special fondness for pregnancy, ${slave.slaveName} seems <span class="hotpink">oddly eager</span> to cooperate with you. It quickly becomes obvious that ${he} is <span class="lightcoral">fascinated with pregnancy</span> and you've <span class="mediumaquamarine">helped ${him} discover this</span> about ${himself}.`); + slave.devotion += 1; + slave.trust += 1; + slave.fetishKnown = 1; + } else if (slave.sexualQuirk === "perverted") { + r.push(`Despite having no particular interest in pregnancy, the <span class="hotpink">sheer perversity</span> of impregnating ${himself} is palpably arousing to ${slave.slaveName}.`); + slave.trust += 1; + } else if (slave.energy > 90) { + r.push(`Despite having no particular interest in pregnancy, ${slave.slaveName}'s overwhelming sex drive causes ${him} to be aroused at the prospect of any sex, even if it happens to be with ${himself}.`); + } else if (slave.devotion > 50) { + r.push(`Despite having no particular interest in pregnancy, ${slave.slaveName} is eager to <span class="hotpink">submit to your vision</span> of ${him}.`); + slave.trust += 1; + if (slave.devotion > 50 && V.arcologies[0].FSRepopulationFocus > 10) { + r.push(`${He} also feels <span class="hotpink">proud</span> that ${he} can be a <span class="mediumaquamarine">self-sustaining</span> source of offspring to support your vision of the future.`); + slave.devotion += 1; + slave.trust += 1; + } + _enjoy = false; + } else { + r.push(`${slave.slaveName}`); + r.push(`cooperates without any protest. ${He} may not particularly enjoy pregnancy or impregnation, but ${he}'s too well-broken to resist or speak against you.`); + _enjoy = false; + } + } + } + + if (slave.fetish === "mindbroken") { + r.push(`${slave.slaveName} is dully cooperative as you ensure ${he} is positioned conveniently on a bench to give you access to both aspects of ${his} genitalia. A quick dose of vasodilators ensures that ${he} is ready to perform, even if ${he} is unable to fully comprehend what is about to happen. Once ${he} is fully erect, your personal assistant uses a mechanical toy to efficiently stimulate ${him} to climax, while you hold a small container in place to collect ${his} emission. Moments later, you've loaded ${slave.slaveName}'s seed into a syringe and dispensed the contents deep within ${his}`); + if (slave.mpreg === 1) { + r.push(`ass.`); + } else { + r.push(`vagina.`); + } + } else if (isAmputee(slave)) { + if (_coop && _enjoy) { + r.push(`Although ${slave.slaveName} is unable to do much to help, ${his} expression is visibly excited as you place ${him} on a bench, and produce a sample container and syringe.`); + } else if (_enjoy) { + r.push(`A maelstrom of emotions fill ${slave.slaveName}'s face as you carry ${him} to a bench, and produce a sample cup and syringe.`); + + if (slave.dick > 6) { + r.push(`You can't tell if ${he}'s relieved or disappointed when ${his} excessive size interferes, as usual, with ${his} erection, but an injection of vasodilators quickly makes the question moot.`); + } + r.push(`At your instruction, your personal assistant descends with a selection of toys to ensure quick ejaculation. Pleasure, lust, terror, and loathing play across ${slave.slaveName}'s face as ${his} arousal mounts and ${his} hips begin to buck. By the time ${he} begins to ejaculate, pleasure and lust have won out and ${he} throws ${his} head back in abandon as ${his} emission fills the cup in your hands.`); + if (!canSee(slave)) { + r.push(`Although ${he} cannot see what you are doing, ${his} expression is rapt, almost dreamlike,`); + } else { + r.push(`${He} watches with rapt fascination`); + } + r.push(`as you load the syringe with ${his} sperm, slide it into ${his}`); + if (slave.mpreg === 1) { + r.push(`ass,`); + } else { + r.push(`vagina,`); + } + r.push(`and shoot the contents home, deep against ${his} waiting cervix.`); + } else if (_coop) { + r.push(`${slave.slaveName} is calm and docile as you place ${him} on a bench, and produce a sample container and syringe. With no other option, ${he} throws back ${his} head and enjoys the stimulation as your personal assistant, at your instruction, begins stimulating ${him} to orgasm. When ${he} ejaculates, you carefully catch every drop in the sample cup, load the syringe, and inject the contents directly against ${his} cervix.`); + } else { + r.push(`Although ${slave.slaveName} frantically squirms in a futile attempt to resist as you place ${him} on a bench, and produce a sample cup and syringe. Without limbs to aid ${his} escape, ${he} can only`); + if (!canSee(slave)) { + r.push(`blindly wait`); + } else { + r.push(`watch`); + } + r.push(`in helpless horror as the vasodilators you inject bring ${his} manhood to complete erectness and your personal assistant, at your instruction, begins stimulating ${him}. ${He} sobs in helpless despair as ${his} rigid shaft begins to throb, filling the cup with a terribly potent load of ${his} seed; ${he} frantically shakes ${his} head, face streaked with tears, as you dip the syringe into the cup, withdraw the plunger, insert it into ${his} exposed`); + if (slave.mpreg === 1) { + r.push(`ass,`); + } else { + r.push(`vagina,`); + } + r.push(`and shoot the contents directly against the opening to ${his} womb.`); + } + } else if (_coop) { + if (_enjoy) { + if (slave.dick > 6 && slave.balls <= 4) { + r.push(`Although ${he} is aroused by the idea of impregnating ${himself}, ${slave.slaveName}'s cock is simply too large to easily become erect. A quick injection of vasodilators later, and ${he}'s ready to go. Because ${he}'s so eager, you simply stand back and let the magic happen.`); + if ( + (slave.vagina === 0 && slave.mpreg !== 1) || + (slave.anus === 0 && slave.mpreg === 1) + ) { + r.push(`As ways to lose one's virginity go, this is one hell of a way to do it. Without needing any instruction, ${slave.slaveName} grasps ${his} massive shaft`); + if (hasBothArms(slave)) { + r.push(`in both hands`); + } else if (!hasAnyArms(slave)) { + r.push(`as best ${he} can with the stumps of ${his} arms`); + } else { + r.push(`with ${his} hand`); + } + r.push(`and feeds it around so the head is`); + if (slave.mpreg === 1) { + r.push(`kissing ${his} anus.`); + } else { + r.push(`nestled between ${his} own labia.`); + } + r.push(`${He} shows only the tiniest hesitation before easing ${his} cock inside ${his} own body, <span class="lime">`); + if (slave.mpreg === 1) { + r.push(`through ${his} virgin backdoor,</span> `); + } else { + r.push(`past ${his} maidenhead,</span> `); + } + r.push(`until you can tell the head is nestled snugly against ${his} own cervix.`); + if (slave.mpreg === 1) { + slave.anus = 1; + } else { + slave.vagina = 1; + } + } else { + r.push(`Without needing any instruction, ${slave.slaveName} grasps ${his} massive shaft`); + if (hasBothArms(slave)) { + r.push(`in both hands`); + } else if (!hasAnyArms(slave)) { + r.push(`as best ${he} can with the stumps of ${his} arms`); + } else { + r.push(`with ${his} hand`); + } + r.push(`and feeds it around so the head is`); + if (slave.mpreg === 1) { + r.push(`kissing ${his} anus.`); + } else { + r.push(`nestled between ${his} own labia.`); + } + r.push(`${He} works it up and down for a second, relishing the sensation, and then plunges ${his} cock into ${his} own body until you can tell the tip is wedged against ${his} own cervix.`); + } + r.push(`Without another partner to rut against, ${slave.slaveName} has to rely on`); + if (hasBothArms(slave)) { + r.push(`${his} own hands,`); + } else { + r.push(`the floor tiles${hasAnyArms(slave) ? ` and ${his} hand` : ``},`); + } + r.push(`bucking ${his} hips up against them to drive the impressively curved shaft into ${his} own body with increasing desperation until ${his} whole body shudders; ${his} cock throbs as ${his}`); + if (slave.mpreg === 1) { + r.push(`ass`); + } else { + r.push(`vagina`); + } + r.push(`eagerly drinks up ${his} own seed.`); + } else { + if (slave.trust < -20) { + r.push(`Although ${he} is aroused by the idea of impregnating ${himself}, ${slave.slaveName} is too terrified to achieve an erection without assistance. It takes an injection of vasodilators to overcome ${his} nerves and restore ${his} manhood to proper functioning.`); + } else { + r.push(`Merely thinking about what you're about to do has ${slave.slaveName} fully erect, with a small bead of precum running down ${his} shaft and blending with the`); + if (slave.mpreg === 1) { + r.push(`lubricant dripping from between ${his} cheeks.`); + } else { + r.push(`feminine wetness dripping from`); + if (hasBothLegs(slave)) { + r.push(`between ${his} legs.`); + } else { + r.push(`${his} crotch.`); + } + } + } + // todo: if slave has lover/wife, let them "do the honors" + if (slave.balls > 4) { + r.push(`Since ${his} balls are too large to permit any other options, you produce a special toy for ${slave.slaveName} — an onahole attached by a flexible tube to a dildo, with an embedded micro-pump to ensure any fluid in the onahole makes its way out of the dildo.`); + } else { + r.push(`Since ${he}'s not large enough to simply fuck ${himself}, you produce a special toy for ${slave.slaveName} — an onahole attached by a flexible tube to a dildo, with an embedded micro-pump to ensure any fluid in the onahole makes its way out of the dildo.`); + } + if ((slave.vagina === 0 && slave.mpreg !== 1) || (slave.anus === 0 && slave.mpreg === 1)) { + r.push(`As ways to lose one's virginity go, this is one hell of a way to do it. ${slave.slaveName} trembles with excitement as ${he} brings the synthetic shaft`); + if (hasBothLegs(slave)) { + r.push(`between ${his} legs`); + } else { + r.push(`to ${his} groin`); + } + r.push(`and slowly works it <span class="lime">into ${his} virgin`); + if (slave.mpreg === 1) { + r.push(`anus.</span>`); + } else { + r.push(`pussy.</span>`); + } + if (slave.mpreg === 1) { + slave.anus = 1; + } else { + slave.vagina = 1; + } + } else { + r.push(`${slave.slaveName} eagerly rams the synthetic shaft as deeply into ${his}`); + if (slave.mpreg === 1) { + r.push(`ass`); + } else { + r.push(`pussy`); + } + r.push(`as it will go, obviously fantasizing that ${he}'s driving ${his} own dick into ${his}`); + if (slave.mpreg === 1) { + r.push(`winking anus.`); + } else { + r.push(`dripping pussy.`); + } + } + r.push(`You help ${him} keep the dildo in place while ${he} works the onahole onto ${his} cock and begins stroking up and down. The stimulation of being filled and having ${his} dick stroked doesn't give ${him} much time to enjoy what ${he}'s doing before ${his} hips buck wildly and you see semen traveling from the pump, along the clear plastic tube, and into the base of the dildo embedded deeply in ${slave.slaveName}'s throbbing`); + if (slave.mpreg === 1) { + r.push(`asshole.`); + } else { + r.push(`vagina.`); + } + } + } else { + if (slave.devotion > 50) { + if (slave.dick > 6) { + r.push(`No matter how hard ${he} tries, ${slave.slaveName}'s dick is simply too large for ${him} to achieve erection on ${his} own. You're about to inject ${him} with a vasodilator to remedy the problem, when ${he} tries to take the syringe from your hand. Normally such impudence would be a grave violation, but it's obvious that ${his} actions are only motivated by loyalty — ${he} wants to fix this problem ${himself} so ${he} can feel like ${he} isn't failing you because of a physical inadequacy that is, admittedly, not ${his} fault. You relinquish the syringe and watch as ${he} injects ${himself} with the drugs necessary to achieve a full erection.`); + } else { + r.push(`Despite a complete lack of sexual interest in the procedure, ${slave.slaveName} is able to quickly bring ${himself} to full erectness without any help.`); + } + } else { + if (slave.dick > 6) { + r.push(`${slave.slaveName}`); + r.push(`doesn't try all that hard to achieve erection, but it's obvious that the sheer size of ${his} cock would make it impossible anyway. ${He} silently cooperates as you inject ${him} with vasodilators to forcibly make ${him} erect.`); + } else { + r.push(`Despite a complete lack of sexual interest in the procedure, ${slave.slaveName} is able to eventually bring ${himself} to full erectness without any help.`); + } + } + // todo: if slave has lover/wife, let them "do the honors" + r.push(`You produce a sample container and syringe; ${slave.slaveName} gets the idea and immediately begins jacking off. When ${he} ejaculates, ${he} carefully holds the cup`); + if (hasBothArms(slave)) { + r.push(`with one hand`); + } else { + r.push(`in front of ${him}`); + } + r.push(`to catch every drop of ${his} virile seed. A moment later ${he} dips the syringe into the container and withdraws the plunger.`); + if (slave.devotion > 50) { + r.push(`${He} blushes a bit, hands you the syringe, and lies back on the bench,`); + if (hasBothLegs(slave)) { + r.push(`spreading ${his} legs invitingly.`); + } else { + r.push(`presenting ${himself}.`); + } + r.push(`You insert the syringe carefully into ${his}`); + if (slave.mpreg === 1) { + r.push(`ass`); + } else { + r.push(`vagina`); + } + r.push(`as far as it will go, and spray ${his} sperm directly against ${his} waiting cervix.`); + } else { + r.push(`You take the syringe from ${him} and gesture for ${him} to lie back; once ${he}'s in position, you insert the syringe carefully into ${his}`); + if (slave.mpreg === 1) { + r.push(`ass`); + } else { + r.push(`vagina`); + } + r.push(`and spray ${his} sperm directly against ${his} waiting cervix.`); + } + } + } else { + if (_enjoy) { + r.push(`Although ${slave.slaveName} is anything but eager to cooperate, you don't have to drag ${him}. It's obvious that ${his} resistance is conflicting with the raw desire to fill ${himself} with ${his} own seed.`); + if (slave.dick > 6 && slave.balls <= 4) { + r.push(`While the size of ${his} cock makes it necessary for you to inject ${him} with vasodilators for ${him} to become properly erect, ${his} resistance is minimal.`); + if (slave.vagina === 0) { + r.push(`You instruct ${him} to fuck ${himself}; by this point, ${he}'s too far gone to object, even though obeying will rob ${him} of ${his} virginity. ${His}`); + if (hasBothArms(slave)) { + r.push(`hands shake`); + } else { + r.push(`lip quivers`); + } + r.push(`with roiling emotions as ${he} lines ${his} cock up with ${his} own opening and gingerly works it into ${his} <span class="lime">virgin`); + if (slave.mpreg === 1) { + r.push(`anus.</span>`); + } else { + r.push(`pussy.</span>`); + } + if (slave.mpreg === 1) { + slave.anus = 1; + } else { + slave.vagina = 1; + } + } else { + r.push(`You instruct ${him} to fuck ${himself}; by this point, ${he}'s too far gone to object. ${His}`); + if (hasBothArms(slave)) { + r.push(`hands shake`); + } else { + r.push(`lip quivers`); + } + r.push(`as ${he} lines ${his} cock up with ${his} own opening; ${he} lets out a sound halfway between a sob and a moan as ${he} penetrates ${himself}.`); + } + r.push(`Without another partner to thrust against, ${slave.slaveName} has to use ${his} remarkable shaft like a dildo, sliding it in and out of ${his} increasingly dripping sex. The potent mix of shame and arousal drives ${him} to orgasm quickly, and only a couple of minutes pass before you see ${his} shaft throbbing as ${he} fucks a baby into ${his} own belly.`); + } else { + if (slave.dick > 6) { + r.push(`${slave.slaveName}'s balls are too large to make any other options possible, but ${he} is still too large to achieve erection easily. You can't tell if ${he} is disappointed, or relieved, by this fact, but a quick injection of vasodilators makes the question moot either way.`); + } else { + r.push(`${His} cock is rigidly erect almost immediately, a fact which brings a confusing mixture of shame and arousal to ${his} face.`); + } + r.push(`You produce a sample container and syringe; ${slave.slaveName} gets the idea and reluctantly begins jacking off. When ${he} ejaculates, ${he} carefully holds the cup with one hand to catch every drop of ${his} seed. A moment later ${he} dips the syringe into the container and withdraws the plunger. ${He} hesitates, likely because the release has restored some of ${his} self control to ${him}, but before ${he} can do anything to escape, you press ${him} down with one hand and feed the syringe into ${his}`); + if (slave.mpreg === 1) { + r.push(`anus,`); + } else { + r.push(`pussy,`); + } + r.push(`depressing the plunger as soon as it's deeply inside ${him}.`); + // possible todo: allow Head Girl to do this part? + } + } else { + r.push(`The repulsion ${slave.slaveName} feels toward both you and what you're about to force ${him} to do make ${his} cooperation entirely out of the question. You are forced to restrain ${him} with straps, kicking and sobbing; the sobbing only gets louder when ${he} feels the prick of a needle shooting vasodilators into ${his} crotch. Moments later, despite ${his} best efforts, ${he} is painfully erect and ready for you to proceed. Since ${he}'s guaranteed to make this as difficult as possible, you opt for the simplest solution: you take a condom and apply it to ${his} penis; once ${he}'s sheathed, you instruct your personal assistant, using toys, to forcibly stimulate ${him} until ${he} ejaculates and remove the condom. Loading the contents into a syringe and injecting them into ${his}`); + if (slave.mpreg === 1) { + r.push(`ass`); + } else { + r.push(`vagina`); + } + r.push(`is a simple matter, because of the straps, and moments later ${he} sobs in despair as ${his} sperm begins racing into ${his} waiting womb.`); + } + } + + const _actCount = random(2, 8)+1; + slave.counter.penetrative += _actCount; + V.penetrativeTotal += _actCount; + if (slave.mpreg === 1) { + slave.counter.anal += _actCount; + V.analTotal += _actCount; + } else { + slave.counter.vaginal += _actCount; + V.vaginalTotal += _actCount; + } + + r.push(`You repeat this ritual throughout the week, ensuring that ${slave.slaveName}`); + + if (_superfetation === 1) { + r.push(`has <span class="lime">added another child</span> to ${his} pregnancy.`); + } else { + r.push(`is <span class="lime">carrying ${his} own child.</span>`); + } + + knockMeUp(slave, 100, 2, V.AS); + + if (V.arcologies[0].FSRestart !== "unset") { + if ((slave.breedingMark !== 1 || V.propOutcome === 0) && V.eugenicsFullControl !== 1) { + r.push(`Rumors spread about you having your slaves breed; the Societal Elite are <span class="red"> very displeased</span> by these rumors.`); + V.failedElite += 5; + } + } + + if (V.arcologies[0].FSRepopulationFocus !== "unset" && (V.arcologies[0].FSGenderFundamentalist === "unset" || V.arcologies[0].FSRepopulationFocus >= V.arcologies[0].FSGenderFundamentalist)) { + // seems logical that repop would trump anything else if it's equal-or-more advanced than fundamentalism. + const _delt = (V.arcologies[0].FSGenderFundamentalist !== "unset") ? + V.arcologies[0].FSRepopulationFocus - V.arcologies[0].FSGenderFundamentalist : + V.arcologies[0].FSRepopulationFocus; + + if (_delt > 0) { + r.push(`Society is <span class="green">pleased</span> by the addition of a new slave, no matter the means by which it was produced.`); + repX(V.FSSingleSlaveRep*(V.arcologies[0].FSRepopulationFocus/V.FSLockinLevel), "futureSocieties", slave); + } else { + r.push(`The traditional elements of your society disapprove of this degenerate form of reproduction, but their complaints are countered by those who believe producing more slaves by any means necessary.`); + } + } else if (V.arcologies[0].FSGenderFundamentalist !== "unset") { + r.push(`Society <span class="red">is disgusted</span> by this degenerate form of reproduction.`); + repX(forceNeg(V.FSSingleSlaveRep*(V.arcologies[0].FSGenderFundamentalist/V.FSLockinLevel)), "futureSocieties", slave); + V.arcologies[0].FSGenderFundamentalist -= 0.05*V.FSSingleSlaveRep; + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fSlaveSelfImpreg.tw b/src/npc/interaction/fSlaveSelfImpreg.tw deleted file mode 100644 index 649f87ea8025b2ea3247d05ab7fce75d95357d7c..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fSlaveSelfImpreg.tw +++ /dev/null @@ -1,219 +0,0 @@ -:: FSlaveSelfImpreg [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> - -<<set _pfh = (getSlave($AS).fetish == "pregnancy" && getSlave($AS).fetishStrength > 50)>> -<<set _pfk = (_pfh && getSlave($AS).fetishKnown == 1) || getSlave($AS).sexualFlaw == "breeder">> -<<set _coop = true, _enjoy = true>> -<<set _superfetation = (getSlave($AS).geneticQuirks.superfetation == 2 && getSlave($AS).pregKnown == 1) ? 1 : 0>> - -<<if (getSlave($AS).fetish == "mindbroken")>> -<<else>> - <<if (getSlave($AS).devotion <= 20)>> - <<if (getSlave($AS).devotion < -20)>> - <<= getSlave($AS).slaveName>> despises you, and tends to resent everything you do on principle, - <<elseif (getSlave($AS).devotion <= 20)>> - <<= getSlave($AS).slaveName>> dislikes you, - <</if>> - <<if (getSlave($AS).sexualFlaw == "breeder" || (_pfh && getSlave($AS).fetishStrength > 90))>> - but the idea of simultaneously impregnating and being impregnated is @@.hotpink;so tempting@@ that $he's @@.mediumaquamarine;grateful@@ to you despite $himself. - <<set getSlave($AS).devotion += 2, getSlave($AS).trust += 1>> - <<elseif (_pfk)>> - but $his obvious predilection for being pregnant significantly lessens the @@.mediumorchid;indignity@@ of the situation. - <<set _coop = false>> - <<set getSlave($AS).devotion -= 2>> - <<elseif (_pfh)>> - but, despite the @@.mediumorchid;indignity@@ of the situation, $his resistance seems strangely muted. It's fairly obvious that something about the idea of being impregnated is @@.hotpink;strangely appealing@@ to $him. - <<set _coop = false>> - <<set getSlave($AS).devotion -= 4>> - <<else>> - <<if (isAmputee(getSlave($AS)))>> - and this @@.gold;uniquely degrading@@ violation of $his person only reinforces $his @@.mediumorchid;hatred@@ towards you. The fact that $he is @@.gold;utterly immobile@@ makes a terrifying situation @@.mediumorchid;even worse.@@ - <<set getSlave($AS).devotion -= 1, getSlave($AS).trust -= 1>> - <<else>> - and this @@.gold;uniquely degrading@@ violation of $his person only reinforces $his @@.mediumorchid;hatred@@ towards you. $He resists so violently that you must @@.health.dec;physically coerce $him@@ into cooperating with the procedure. - <</if>> - <<set _coop = false, _enjoy = false>> - <<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 6>> - <</if>> - <<elseif (_pfk)>> - <<= getSlave($AS).slaveName>> @@.hotpink;genuinely enjoys@@ impregnation and pregnancy, so $he is @@.mediumaquamarine;grateful@@ that you're giving $him a chance to become so intimately acquainted with both aspects of $his fetish at the same time. - <<set getSlave($AS).devotion += 4, getSlave($AS).trust += 2>> - <<if (getSlave($AS).devotion > 50 && $arcologies[0].FSRepopulationFocus > 10)>> - $He also feels @@.hotpink;proud@@ that $he can be a @@.mediumaquamarine;self-sustaining@@ source of offspring to support your vision of the future. - <<set getSlave($AS).devotion += 1, getSlave($AS).trust += 1>> - <</if>> - <<else>> - <<if (_pfh)>> - Even though you aren't aware of any special fondness for pregnancy, <<= getSlave($AS).slaveName>> seems @@.hotpink;oddly eager@@ to cooperate with you. It quickly becomes obvious that $he is @@.lightcoral;fascinated with pregnancy@@ and you've @@.mediumaquamarine;helped $him discover this@@ about $himself. - <<set getSlave($AS).devotion += 1, getSlave($AS).trust += 1, getSlave($AS).fetishKnown = 1>> - <<elseif (getSlave($AS).behavioralQuirk == "perverted")>> - Despite having no particular interest in pregnancy, the @@.hotpink;sheer perversity@@ of impregnating $himself is palpably arousing to <<= getSlave($AS).slaveName>>. - <<set getSlave($AS).trust += 1>> - <<elseif (getSlave($AS).energy > 90)>> - Despite having no particular interest in pregnancy, <<= getSlave($AS).slaveName>>'s overwhelming sex drive causes $him to be aroused at the prospect of any sex, even if it happens to be with $himself. - <<elseif (getSlave($AS).devotion > 50)>> - Despite having no particular interest in pregnancy, <<= getSlave($AS).slaveName>> is eager to @@.hotpink;submit to your vision@@ of $him. - <<set getSlave($AS).trust += 1>> - <<if (getSlave($AS).devotion > 50 && $arcologies[0].FSRepopulationFocus > 10)>> - $He also feels @@.hotpink;proud@@ that $he can be a @@.mediumaquamarine;self-sustaining@@ source of offspring to support your vision of the future. - <<set getSlave($AS).devotion += 1, getSlave($AS).trust += 1>> - <</if>> - <<set _enjoy = false>> - <<else>> - <<= getSlave($AS).slaveName>> cooperates without any protest. $He may not particularly enjoy pregnancy or impregnation, but $he's too well-broken to resist or speak against you. - <<set _enjoy = false>> - <</if>> - <</if>> -<</if>> - -<<if (getSlave($AS).fetish == "mindbroken")>> - <<= getSlave($AS).slaveName>> is dully cooperative as you ensure $he is positioned conveniently on a bench to give you access to both aspects of $his genitalia. A quick dose of vasodilators ensures that $he is ready to perform, even if $he is unable to fully comprehend what is about to happen. Once $he is fully erect, your personal assistant uses a mechanical toy to efficiently stimulate $him to climax, while you hold a small container in place to collect $his emission. Moments later, you've loaded <<= getSlave($AS).slaveName>>'s seed into a syringe and dispensed the contents deep within $his <<if getSlave($AS).mpreg == 1>>ass<<else>>vagina<</if>>. -<<elseif (isAmputee(getSlave($AS)))>> - <<if (_coop && _enjoy)>> - Although <<= getSlave($AS).slaveName>> is unable to do much to help, $his expression is visibly excited as you place $him on a bench, and produce a sample container and syringe. - <<elseif (_enjoy)>> - A maelstrom of emotions fill <<= getSlave($AS).slaveName>>'s face as you carry $him to a bench, and produce a sample cup and syringe. - <<if (getSlave($AS).dick > 6)>> - You can't tell if $he's relieved or disappointed when $his excessive size interferes, as usual, with $his erection, but an injection of vasodilators quickly makes the question moot. - <</if>> - At your instruction, your personal assistant descends with a selection of toys to ensure quick ejaculation. Pleasure, lust, terror, and loathing play across <<= getSlave($AS).slaveName>>'s face as $his arousal mounts and $his hips begin to buck. By the time $he begins to ejaculate, pleasure and lust have won out and $he throws $his head back in abandon as $his emission fills the cup in your hands. <<if !canSee(getSlave($AS))>>Although $he cannot see what you are doing, $his expression is rapt, almost dreamlike,<<else>>$He watches with rapt fascination<</if>> as you load the syringe with $his sperm, slide it into $his <<if getSlave($AS).mpreg == 1>>ass<<else>>vagina<</if>>, and shoot the contents home, deep against $his waiting cervix. - <<elseif (_coop)>> - <<= getSlave($AS).slaveName>> is calm and docile as you place $him on a bench, and produce a sample container and syringe. With no other option, $he throws back $his head and enjoys the stimulation as your personal assistant, at your instruction, begins stimulating $him to orgasm. When $he ejaculates, you carefully catch every drop in the sample cup, load the syringe, and inject the contents directly against $his cervix. - <<else>> - Although <<= getSlave($AS).slaveName>> frantically squirms in a futile attempt to resist as you place $him on a bench, and produce a sample cup and syringe. Without limbs to aid $his escape, $he can only <<if !canSee(getSlave($AS))>>blindly wait<<else>>watch<</if>> in helpless horror as the vasodilators you inject bring $his manhood to complete erectness and your personal assistant, at your instruction, begins stimulating $him. $He sobs in helpless despair as $his rigid shaft begins to throb, filling the cup with a terribly potent load of $his seed; $he frantically shakes $his head, face streaked with tears, as you dip the syringe into the cup, withdraw the plunger, insert it into $his exposed <<if getSlave($AS).mpreg == 1>>ass<<else>>vagina<</if>>, and shoot the contents directly against the opening to $his womb. - <</if>> -<<elseif (_coop)>> - <<if (_enjoy)>> - <<if (getSlave($AS).dick > 6 && getSlave($AS).balls <= 4)>> - Although $he is aroused by the idea of impregnating $himself, <<= getSlave($AS).slaveName>>'s cock is simply too large to easily become erect. A quick injection of vasodilators later, and $he's ready to go. Because $he's so eager, you simply stand back and let the magic happen. - <<if (getSlave($AS).vagina == 0 && getSlave($AS).mpreg != 1) || (getSlave($AS).anus == 0 && getSlave($AS).mpreg == 1)>> - As ways to lose one's virginity go, this is one hell of a way to do it. Without needing any instruction, <<= getSlave($AS).slaveName>> grasps $his massive shaft <<if hasBothArms(getSlave($AS))>>in both hands<<elseif !hasAnyArms(getSlave($AS))>>as best $he can with the stumps of $his arms<<else>>with $his hand<</if>> and feeds it around so the head is <<if getSlave($AS).mpreg == 1>>kissing $his anus<<else>>nestled between $his own labia<</if>>. $He shows only the tiniest hesitation before easing $his cock inside $his own body, @@.lime;<<if getSlave($AS).mpreg == 1>>through $his virgin backdoor<<else>>past $his maidenhead<</if>>,@@ until you can tell the head is nestled snugly against $his own cervix. - <<if getSlave($AS).mpreg == 1>> - <<set getSlave($AS).anus = 1>> - <<else>> - <<set getSlave($AS).vagina = 1>> - <</if>> - <<else>> - Without needing any instruction, <<= getSlave($AS).slaveName>> grasps $his massive shaft <<if hasBothArms(getSlave($AS))>>in both hands<<elseif !hasAnyArms(getSlave($AS))>>as best $he can with the stumps of $his arms<<else>>with $his hand<</if>> and feeds it around so the head is <<if getSlave($AS).mpreg == 1>>kissing $his anus<<else>>nestled between $his own labia<</if>>. $He works it up and down for a second, relishing the sensation, and then plunges $his cock into $his own body until you can tell the tip is wedged against $his own cervix. - <</if>> - Without another partner to rut against, <<= getSlave($AS).slaveName>> has to rely on <<if hasBothArms(getSlave($AS))>>$his own hands<<else>>the floor tiles<<if hasAnyArms(getSlave($AS))>> and $his hand<</if>><</if>>, bucking $his hips up against them to drive the impressively curved shaft into $his own body with increasing desperation until $his whole body shudders; $his cock throbs as $his <<if getSlave($AS).mpreg == 1>>ass<<else>>vagina<</if>> eagerly drinks up $his own seed. - <<else>> - <<if (getSlave($AS).trust < -20)>> - Although $he is aroused by the idea of impregnating $himself, <<= getSlave($AS).slaveName>> is too terrified to achieve an erection without assistance. It takes an injection of vasodilators to overcome $his nerves and restore $his manhood to proper functioning. - <<else>> - Merely thinking about what you're about to do has <<= getSlave($AS).slaveName>> fully erect, with a small bead of precum running down $his shaft and blending with the <<if getSlave($AS).mpreg == 1>>lubricant dripping from between $his cheeks<<else>>feminine wetness dripping from <<if hasBothLegs(getSlave($AS))>>between $his legs<<else>>$his crotch<</if>><</if>>. - <</if>> - <!-- todo: if slave has lover/wife, let them "do the honors" --> - <<if (getSlave($AS).balls > 4)>> - Since $his balls are too large to permit any other options, you produce a special toy for <<= getSlave($AS).slaveName>> — an onahole attached by a flexible tube to a dildo, with an embedded micro-pump to ensure any fluid in the onahole makes its way out of the dildo. - <<else>> - Since $he's not large enough to simply fuck $himself, you produce a special toy for <<= getSlave($AS).slaveName>> — an onahole attached by a flexible tube to a dildo, with an embedded micro-pump to ensure any fluid in the onahole makes its way out of the dildo. - <</if>> - <<if (getSlave($AS).vagina == 0 && getSlave($AS).mpreg != 1) || (getSlave($AS).anus == 0 && getSlave($AS).mpreg == 1)>> - As ways to lose one's virginity go, this is one hell of a way to do it. <<= getSlave($AS).slaveName>> trembles with excitement as $he brings the synthetic shaft <<if hasBothLegs(getSlave($AS))>>between $his legs<<else>>to $his groin<</if>> and slowly works it @@.lime;into $his virgin <<if getSlave($AS).mpreg == 1>>anus<<else>>pussy<</if>>.@@ - <<if getSlave($AS).mpreg == 1>> - <<set getSlave($AS).anus = 1>> - <<else>> - <<set getSlave($AS).vagina = 1>> - <</if>> - <<else>> - <<= getSlave($AS).slaveName>> eagerly rams the synthetic shaft as deeply into $his <<if getSlave($AS).mpreg == 1>>ass<<else>>pussy<</if>> as it will go, obviously fantasizing that $he's driving $his own dick into $his <<if getSlave($AS).mpreg == 1>>winking anus<<else>>dripping pussy<</if>>. - <</if>> - You help $him keep the dildo in place while $he works the onahole onto $his cock and begins stroking up and down. The stimulation of being filled and having $his dick stroked doesn't give $him much time to enjoy what $he's doing before $his hips buck wildly and you see semen traveling from the pump, along the clear plastic tube, and into the base of the dildo embedded deeply in <<= getSlave($AS).slaveName>>'s throbbing <<if getSlave($AS).mpreg == 1>>asshole<<else>>vagina<</if>>. - <</if>> - <<else>> - <<if (getSlave($AS).devotion > 50)>> - <<if (getSlave($AS).dick > 6)>> - No matter how hard $he tries, <<= getSlave($AS).slaveName>>'s dick is simply too large for $him to achieve erection on $his own. You're about to inject $him with a vasodilator to remedy the problem, when $he tries to take the syringe from your hand. Normally such impudence would be a grave violation, but it's obvious that $his actions are only motivated by loyalty — $he wants to fix this problem $himself so $he can feel like $he isn't failing you because of a physical inadequacy that is, admittedly, not $his fault. You relinquish the syringe and watch as $he injects $himself with the drugs necessary to achieve a full erection. - <<else>> - Despite a complete lack of sexual interest in the procedure, <<= getSlave($AS).slaveName>> is able to quickly bring $himself to full erectness without any help. - <</if>> - <<else>> - <<if (getSlave($AS).dick > 6)>> - <<= getSlave($AS).slaveName>> doesn't try all that hard to achieve erection, but it's obvious that the sheer size of $his cock would make it impossible anyway. $He silently cooperates as you inject $him with vasodilators to forcibly make $him erect. - <<else>> - Despite a complete lack of sexual interest in the procedure, <<= getSlave($AS).slaveName>> is able to eventually bring $himself to full erectness without any help. - <</if>> - <</if>> - <!-- todo: if slave has lover/wife, let them "do the honors" --> - You produce a sample container and syringe; <<= getSlave($AS).slaveName>> gets the idea and immediately begins jacking off. When $he ejaculates, $he carefully holds the cup <<if hasBothArms(getSlave($AS))>>with one hand<<else>>in front of $him<</if>> to catch every drop of $his virile seed. A moment later $he dips the syringe into the container and withdraws the plunger. - <<if (getSlave($AS).devotion > 50)>> - $He blushes a bit, hands you the syringe, and lies back on the bench, <<if hasBothLegs(getSlave($AS))>>spreading $his legs invitingly<<else>>presenting $himself<</if>>. You insert the syringe carefully into $his <<if getSlave($AS).mpreg == 1>>ass<<else>>vagina<</if>> as far as it will go, and spray $his sperm directly against $his waiting cervix. - <<else>> - You take the syringe from $him and gesture for $him to lie back; once $he's in position, you insert the syringe carefully into $his <<if getSlave($AS).mpreg == 1>>ass<<else>>vagina<</if>> and spray $his sperm directly against $his waiting cervix. - <</if>> - <</if>> -<<else>> - <<if (_enjoy)>> - Although <<= getSlave($AS).slaveName>> is anything but eager to cooperate, you don't have to drag $him. It's obvious that $his resistance is conflicting with the raw desire to fill $himself with $his own seed. - <<if (getSlave($AS).dick > 6 && getSlave($AS).balls <= 4)>> - While the size of $his cock makes it necessary for you to inject $him with vasodilators for $him to become properly erect, $his resistance is minimal. - <<if getSlave($AS).vagina == 0>> - You instruct $him to fuck $himself; by this point, $he's too far gone to object, even though obeying will rob $him of $his virginity. $His <<if hasBothArms(getSlave($AS))>>hands shake<<else>>lip quivers<</if>> with roiling emotions as $he lines $his cock up with $his own opening and gingerly works it into $his @@.lime;virgin <<if getSlave($AS).mpreg == 1>>anus<<else>>pussy<</if>>.@@ - <<if getSlave($AS).mpreg == 1>> - <<set getSlave($AS).anus = 1>> - <<else>> - <<set getSlave($AS).vagina = 1>> - <</if>> - <<else>> - You instruct $him to fuck $himself; by this point, $he's too far gone to object. $His <<if hasBothArms(getSlave($AS))>>hands shake<<else>>lip quivers<</if>> as $he lines $his cock up with $his own opening; $he lets out a sound halfway between a sob and a moan as $he penetrates $himself. - <</if>> - Without another partner to thrust against, <<= getSlave($AS).slaveName>> has to use $his remarkable shaft like a dildo, sliding it in and out of $his increasingly dripping sex. The potent mix of shame and arousal drives $him to orgasm quickly, and only a couple of minutes pass before you see $his shaft throbbing as $he fucks a baby into $his own belly. - <<else>> - <<if (getSlave($AS).dick > 6)>> - <<= getSlave($AS).slaveName>>'s balls are too large to make any other options possible, but $he is still too large to achieve erection easily. You can't tell if $he is disappointed, or relieved, by this fact, but a quick injection of vasodilators makes the question moot either way. - <<else>> - $His cock is rigidly erect almost immediately, a fact which brings a confusing mixture of shame and arousal to $his face. - <</if>> - You produce a sample container and syringe; <<= getSlave($AS).slaveName>> gets the idea and reluctantly begins jacking off. When $he ejaculates, $he carefully holds the cup with one hand to catch every drop of $his seed. A moment later $he dips the syringe into the container and withdraws the plunger. $He hesitates, likely because the release has restored some of $his self control to $him, but before $he can do anything to escape, you press $him down with one hand and feed the syringe into $his <<if getSlave($AS).mpreg == 1>>anus<<else>>pussy<</if>>, depressing the plunger as soon as it's deeply inside $him. - <!-- possible todo: allow Head Girl to do this part?--> - <</if>> - <<else>> - The repulsion <<= getSlave($AS).slaveName>> feels toward both you and what you're about to force $him to do make $his cooperation entirely out of the question. You are forced to restrain $him with straps, kicking and sobbing; the sobbing only gets louder when $he feels the prick of a needle shooting vasodilators into $his crotch. Moments later, despite $his best efforts, $he is painfully erect and ready for you to proceed. Since $he's guaranteed to make this as difficult as possible, you opt for the simplest solution: you take a condom and apply it to $his penis; once $he's sheathed, you instruct your personal assistant, using toys, to forcibly stimulate $him until $he ejaculates and remove the condom. Loading the contents into a syringe and injecting them into $his <<if getSlave($AS).mpreg == 1>>ass<<else>>vagina<</if>> is a simple matter, because of the straps, and moments later $he sobs in despair as $his sperm begins racing into $his waiting womb. - <</if>> -<</if>> - -<<set _actCount = random(2,8)+1>> -<<set getSlave($AS).counter.penetrative += _actCount, $penetrativeTotal += _actCount>> -<<if getSlave($AS).mpreg == 1>> - <<set getSlave($AS).counter.anal += _actCount, $analTotal += _actCount>> -<<else>> - <<set getSlave($AS).counter.vaginal += _actCount, $vaginalTotal += _actCount>> -<</if>> - -You repeat this ritual throughout the week, ensuring that <<= getSlave($AS).slaveName>> -<<if _superfetation == 1>> - has @@.lime;added another child@@ to $his pregnancy. -<<else>> - is @@.lime;carrying $his own child.@@ -<</if>> - -<<= knockMeUp(getSlave($AS), 100, 2, $AS, 1)>> - -<<if $arcologies[0].FSRestart != "unset">> - <<if (getSlave($AS).breedingMark != 1 || $propOutcome == 0) && $eugenicsFullControl != 1>> - Rumors spread about you having your slaves breed; the Societal Elite are @@.red; very displeased@@ by these rumors. - <<set $failedElite += 5>> - <</if>> -<</if>> - -<<if ($arcologies[0].FSRepopulationFocus != "unset" && ($arcologies[0].FSGenderFundamentalist == "unset" || $arcologies[0].FSRepopulationFocus >= $arcologies[0].FSGenderFundamentalist))>> - <!-- seems logical that repop would trump anything else if it's equal-or-more advanced than fundamentalism.--> - <<if $arcologies[0].FSGenderFundamentalist != "unset">> - <<set _delt = $arcologies[0].FSRepopulationFocus - $arcologies[0].FSGenderFundamentalist>> - <<else>> - <<set _delt = $arcologies[0].FSRepopulationFocus>> - <</if>> - <<if _delt > 0>> - Society is @@.green;pleased@@ by the addition of a new slave, no matter the means by which it was produced. - <<run repX($FSSingleSlaveRep*($arcologies[0].FSRepopulationFocus/$FSLockinLevel), "futureSocieties", getSlave($AS))>> - <<else>> - The traditional elements of your society disapprove of this degenerate form of reproduction, but their complaints are countered by those who believe producing more slaves by any means necessary. - <</if>> -<<elseif $arcologies[0].FSGenderFundamentalist != "unset">> - Society @@.red;is disgusted@@ by this degenerate form of reproduction. - <<run repX(forceNeg($FSSingleSlaveRep*($arcologies[0].FSGenderFundamentalist/$FSLockinLevel)), "futureSocieties", getSlave($AS))>> - <<set $arcologies[0].FSGenderFundamentalist -= 0.05*$FSSingleSlaveRep>> -<</if>> diff --git a/src/npc/interaction/fSlaveSlaveVagConsummate.tw b/src/npc/interaction/fSlaveSlaveVagConsummate.tw deleted file mode 100644 index bbd23679f1f1bddcea4c32e391535405831f2268..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fSlaveSlaveVagConsummate.tw +++ /dev/null @@ -1,250 +0,0 @@ -:: FSlaveSlaveVag Consummate [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> -<<setLocalPronouns $slaverapistx 2>> - -<<set getSlave($AS).counter.vaginal += 1>> -<<set $vaginalTotal += 1>> -<<set $slaverapistx.counter.penetrative++, $penetrativeTotal++>> - -<<if $slaverapistx.dick == 1>> - <<set _dickSize = "pathetic">> -<<elseif ($slaverapistx.dick == 2)>> - <<set _dickSize = "tiny">> -<<elseif ($slaverapistx.dick == 3)>> - <<set _dickSize = "average">> -<<elseif ($slaverapistx.dick == 4)>> - <<set _dickSize = "big">> -<<elseif ($slaverapistx.dick == 5)>> - <<set _dickSize = "huge">> -<<elseif ($slaverapistx.dick == 6)>> - <<set _dickSize = "gigantic">> -<<elseif ($slaverapistx.dick == 7)>> - <<set _dickSize = "titanic">> -<<elseif ($slaverapistx.dick == 8)>> - <<set _dickSize = "absurd">> -<<elseif ($slaverapistx.dick == 9)>> - <<set _dickSize = "inhuman">> -<<else>> - <<set _dickSize = "obscene">> -<</if>> - -<<if areRelated(getSlave($AS), $slaverapistx)>> - <<set _isIncest = 1>> -<</if>> - -You take a look at the slave you selected. - -<<if ($slaverapistx.fetish == "dom") && ($slaverapistx.fetishStrength > 20) && ($slaverapistx.devotion >= -20)>> - Since $slaverapistx.slaveName loves to dominate others it's not hard to get _his2 <<if $slaverapistx.dick > 0>>_dickSize dick<<else>>massive clit<</if>> ready. - <<if ($slaverapistx.attrXX > 65)>> - With _his2 love of pussy, _he2 becomes aroused indecently fast. - <<else>> - _His2 <<if $slaverapistx.dick > 0>>_dickSize cock<<else>>massive clit<</if>> quickly swells to a throbbing erection at the prospect of forcing _himself2 on another slave. - <</if>> -<<elseif ($slaverapistx.fetish == "sadist") && ($slaverapistx.fetishStrength > 20) && ($slaverapistx.devotion >= -20)>> - With the prospect of torturing another slave <<if $slaverapistx.dick > 0>>_his2 _dickSize cock swells to a throbbing erection in seconds<<else>>_his2 huge clit becomes fully engorged in seconds<</if>>. -<<elseif ($slaverapistx.fetish == "pregnancy") && ($slaverapistx.fetishStrength > 20) && ($slaverapistx.devotion >= -20) && $slaverapistx.dick > 0>> - With the prospect of raping another slave bareback, _his2 _dickSize cock swells to a throbbing erection in seconds. -<<elseif ($slaverapistx.attrXX > 65) && ($slaverapistx.devotion >= -20)>> - Since $slaverapistx.slaveName likes sticking _his2 <<if $slaverapistx.dick > 0>>_dickSize penis<<else>>massive clit<</if>> in girls, _he2 doesn't take much convincing. -<<elseif ($slaverapistx.devotion > 50)>> - Since $slaverapistx.slaveName is devoted to you, _he2'll eagerly fuck anything you tell _him2 to fuck. -<<elseif ($slaverapistx.devotion > 20)>> - Since $slaverapistx.slaveName is obedient, _he2'll fuck anything you tell _him2 to fuck. -<<elseif ($slaverapistx.devotion >= -20)>> - Since $slaverapistx.slaveName does not resist your will, _he2 should comply reasonably well. _He2 has to work to get _his2 <<if $slaverapistx.dick > 0>>_dickSize penis<<else>>massive clit<</if>> hard despite _his2 doubts, visibly disturbed that you are ordering _him2 to fuck someone for your entertainment. -<<else>> - Since $slaverapistx.slaveName is unlikely to comply willingly, you simply restrain _him2 and administer a massive dose of vasodilators, directly where they will do the most good. $slaverapistx.slaveName writhes with the pain of the injection, which is compounded as _his2 <<if $slaverapistx.dick > 0>>_dickSize penis<<else>>massive clit<</if>> quickly reaches an agonizingly full erection. -<</if>> - -<<if _isIncest == 1>> - $slaverapistx.slaveName is well aware that _he2 is about to rape - <<if $slaverapistx.father == $AS && $slaverapistx.mother == $AS>> - the slave that is both _his2 mother and _his2 father, - <<elseif getSlave($AS).mother == $slaverapistx.ID || getSlave($AS).father == $slaverapistx.ID>> - _his2 own <<print relativeTerm($slaverapistx, getSlave($AS))>>, - <<elseif $slaverapistx.mother == $AS>> - _his2 own mother, - <<elseif $slaverapistx.mother == $AS>> - the slave that fathered _him2, - <<else>> - _his2 <<print relativeTerm($slaverapistx, getSlave($AS))>>, - <</if>> - <<if ($slaverapistx.sexualQuirk == "perverted") || ($slaverapistx.sexualQuirk == "sinful")>> - <<if ($slaverapistx.energy > 60)>> - and seems quite aroused at just how <<if ($slaverapistx.sexualQuirk == "perverted")>>perverted<<else>>sinful<</if>> that is. <<if canSee($slaverapistx)>>$slaverapistx.slaveName's eyes seemed locked on <<= getSlave($AS).slaveName>>'s inviting pussy, thoroughly aroused and waiting for your order.<</if>> - <<else>> - but despite _his2 conflicted feelings _his2 arousal is clear. - <</if>> - <<set _incestMood = "Top">> - <<elseif ($slaverapistx.relationshipTarget == $AS) && ($slaverapistx.relationship > 2)>> - but since _he2's already in a sexual relationship with $him, it's only special because _his2 <<= getWrittenTitle($slaverapistx)>> is watching. - <<set _incestMood = "Top">> - <<else>> - <<if $slaverapistx.devotion > 95>> - but _his2 deep acceptance of slavery means _he2 can't help but be eager to please everyone involved with _his2 performance. - <<set _incestMood = "Top">> - <<elseif $slaverapistx.devotion > 60>> - but _his2 experience as a slave means _he2 can mostly ignore it and focus on sex. - <<else>> - and is understandably disturbed. - <</if>> - <</if>> -<</if>> - -<br><br> - -Next, you see to <<= getSlave($AS).slaveName>>. - -<<if _isIncest == 1>> - <<= getSlave($AS).slaveName>> is fully naked and <<if canSee(getSlave($AS))>>looking up at<<else>>waiting in front of<</if>> - <<if getSlave($AS).father == $slaverapistx.ID && getSlave($AS).mother == $slaverapistx.ID>> - the slave that is both $his mother and $his father, - <<elseif $slaverapistx.mother == $AS || $slaverapistx.father == $AS>> - $his own <<print relativeTerm(getSlave($AS), $slaverapistx)>>, - <<elseif getSlave($AS).mother == $slaverapistx.ID>> - $his own mother, - <<elseif getSlave($AS).father == $slaverapistx.ID>> - the slave that fathered $him, - <<else>> - $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>, - <</if>> - <<if (getSlave($AS).sexualQuirk == "perverted") || (getSlave($AS).sexualQuirk == "sinful")>> - <<if (getSlave($AS).energy > 60)>> - whose <<if $slaverapistx.dick > 0>>_dickSize penis<<else>>massive clit<</if>> is standing firm above $him. $He seems indecently aroused, flushed and shivering in anticipation. - <<else>> - but despite $his conflicted feelings $his growing arousal is clear as $he <<if canSee(getSlave($AS))>>stares at<<else>>imagines<</if>> the <<if $slaverapistx.dick > 0>>_dickSize penis<<else>>massive clit<</if>> that's soon going inside $him. - <</if>> - <<if _incestMood == "Top">> - <<set _incestMood = "Both">> - <<else>> - <<set _incestMood = "Bottom">> - <</if>> - <<elseif (getSlave($AS).relationshipTarget == $slaverapistx.ID) && (getSlave($AS).relationship > 2)>> - and seems calm and inviting to $his - <<if getSlave($AS).relationship == 3>> - sex friend's - <<elseif getSlave($AS).relationship == 4>> - lover's - <<else>> - slave _wife2's - <</if>> - <<if $slaverapistx.dick > 0>>_dickSize penis<<else>>massive clit<</if>> that will be penetrating $him. - <<if _incestMood == "Top">> - <<set _incestMood = "Both">> - <<else>> - <<set _incestMood = "Bottom">> - <</if>> - <<else>> - <<if getSlave($AS).devotion > 95>> - and $his deep acceptance of $his status as a slave has $him staring <<if canSee(getSlave($AS))>>at<<else>>blindly towards<</if>> the <<if $slaverapistx.dick > 0>>_dickSize penis<<else>>massive clit<</if>> above $him with a lusty smile. - <<if _incestMood == "Top">> - <<set _incestMood = "Both">> - <<else>> - <<set _incestMood = "Bottom">> - <</if>> - <<elseif getSlave($AS).devotion > 60>> - and if $he focuses, $he can forget the <<if $slaverapistx.dick > 0>>_dickSize penis<<else>>massive clit<</if>> standing erect in front of $him belongs to someone related to $him. - <<else>> - and is understandably disturbed, <<if canSee(getSlave($AS))>>eyes glued to the <<if $slaverapistx.dick > 0>>_dickSize penis<<else>>massive clit<</if>> throbbing before $him.<<elseif canHear(getSlave($AS))>>listening to the heavy breathing of $his relative whose <<if $slaverapistx.dick > 0>>_dickSize penis<<else>>massive clit<</if>> will be entering $him soon.<<else>>imagining how the <<if $slaverapistx.dick > 0>>_dickSize penis<<else>>massive clit<</if>> of $his relative will feel inside $him<</if>> - <</if>> - <</if>> -<</if>> - -<<if (getSlave($AS).fetish == "submissive") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).vagina == 0)>> - $He presents $his virgin pussy to $slaverapistx.slaveName without protest. This act @@.lime; breaks in $his pussy,@@ and @@.hotpink;reminds $him@@ of $his status as a submissive slave. - <<set getSlave($AS).vagina = 1>> - <<set getSlave($AS).devotion += 4>> - <<set getSlave($AS).fetishStrength += 1>> -<<elseif (getSlave($AS).fetish == "submissive") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1)>> - $He smiles as $he lays back and presents $his pussy to $slaverapistx.slaveName. $He openly enjoys submitting $himself for others to make use of. -<<elseif (getSlave($AS).devotion > 20) && (getSlave($AS).vagina == 0) >> - $He accepts your orders without comment and presents $his virgin pussy to $slaverapistx.slaveName. $He gasps in shock when $he feels the <<if $slaverapistx.dick > 0>>_dickSize dick<<else>>massive clit<</if>> enter $him. @@.hotpink;$He is broken to slavery@@ by this application of $his body, which naturally @@.lime;will break in $his pussy.@@ - <<set getSlave($AS).vagina = 1>> - <<set getSlave($AS).devotion += 10>> -<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).vagina == 0)>> - $He is clearly unhappy at the idea of losing $his pearl of great price to $slaverapistx.slaveName; this probably isn't what $he imagined $his first real sexual encounter would be like. Nevertheless, $he is @@.hotpink;broken to slavery@@ by this application of $his body, which naturally @@.lime;will break in $his pussy.@@ - <<set getSlave($AS).vagina = 1>> - <<set getSlave($AS).devotion += 4>> -<<elseif (getSlave($AS).vagina == 0)>> - As you anticipated, $he refuses to give $slaverapistx.slaveName $his virginity. Since $he is restrained, $his @@.mediumorchid;horrified tears@@ and @@.gold;frightened begging@@ are $his only signs on rebellion. Naturally, this cruel act @@.lime;will break in $his pussy.@@ - <<set getSlave($AS).devotion -= 5>> - <<set getSlave($AS).trust -= 5>> - <<set getSlave($AS).vagina = 1>> -<</if>> - -<<if isAmputee(getSlave($AS))>> - You set $his limbless torso up for $slaverapistx.slaveName. -<<elseif tooBigBreasts(getSlave($AS))>> - You set $him up for $slaverapistx.slaveName, face-down so the weight of $his tits pins $him helplessly in place. -<<elseif tooBigButt(getSlave($AS))>> - You set $him up for $slaverapistx.slaveName, face-down so the weight of $his giant ass pins $him helplessly in place and gives $slaverapistx.slaveName a lovely cushion to thrust against. -<<elseif tooBigDick(getSlave($AS))>> - You set $him up for $slaverapistx.slaveName, face-up so $he is pinned under the weight of $his giant cock. -<<elseif tooBigBalls(getSlave($AS))>> - You set $him up for $slaverapistx.slaveName, face-down so the weight of $his giant balls anchor $him helplessly in place. -<<elseif getSlave($AS).devotion < -20>> - $He tries to refuse, so you restrain $him despite $his resistance to the idea of being raped by another slave. -<<elseif getSlave($AS).devotion <= 20>> - $He obeys your orders reluctantly, arranging $himself for vaginal sex despite $his obvious hesitation to be raped by another slave. -<<elseif getSlave($AS).devotion < 10>> - $He obeys your orders, arranging $himself for vaginal sex despite $his slight hesitation at the idea of being another's slave sex toy. -<<else>> - $He happily obeys your orders, getting ready to serve another slave. -<</if>> - -<br><br> - -<<if (getSlave($AS).devotion < -20) && ($slaverapistx.devotion < -20)>> - Since you have two restrained slaves, it's up to you to do all the work. <<= getSlave($AS).slaveName>> is tied up on the bed with $his pussy available, so you maneuver $slaverapistx.slaveName's <<if $slaverapistx.dick > 0>>_dickSize dick<<else>>strap-on<</if>> into place. The two slaves make no further moves until you deal $slaverapistx.slaveName a terrific swat across the ass and promise to give _him2 more of the same until _he2 gets going. $slaverapistx.slaveName starts moving very slowly, barely prodding. After watching them mechanically go at it for a while, you use your leg to suddenly push _him2 deep into <<= getSlave($AS).slaveName>>, fully hilting _him2 in one motion. You occasionally prod them with an electrical jolt to keep them going at a faster pace. Both slaves resent what you made them do for you and fear you'll make them do it again. - -<<elseif ($slaverapistx.devotion < -20)>> - Since your dick slave is restrained, you order <<= getSlave($AS).slaveName>> to present $himself on the bed, and then maneuver $slaverapistx.slaveName's <<if $slaverapistx.dick > 0>>_dickSize dick<<else>>strap-on<</if>> into place. <<= getSlave($AS).slaveName>> does $his best to hump $himself against the unwilling cock until you deal $slaverapistx.slaveName a terrific swat across the ass and promise to give _him2 more of the same until _he2 gets going. _He2 is still unenthusiastic, so you have _him2 lie down and have <<= getSlave($AS).slaveName>> ride $himself to orgasm. _He2 resents what you made _him2 do and fears you'll force _him2 to do it again. Though <<= getSlave($AS).slaveName>> accepts the situation, $he looks into $slaverapistx.slaveName's eyes with obvious apology. - -<<elseif ($slaverapistx.fetish == "dom") && ($slaverapistx.fetishStrength > 20) && ($slaverapistx.devotion > 20)>> - <<= getSlave($AS).slaveName>> is tied and placed on the bed with $his pussy defenseless and available, and then you tell the randy $slaverapistx.slaveName that it's all _hers2. The slave life has so affected $slaverapistx.slaveName that _he2 is quite eager to rape another slave for _his2 pleasure. _He2 penetrates _him2 immediately, fondling, pinching and licking while pistoning away, fully enjoying _his2 dominant role, edging _his2 poor toy again and again and making _him2 beg for release. - <<if (getSlave($AS).fetish == "dom")>> - <<if (getSlave($AS).devotion < -20)>> - By the end of the day <<= getSlave($AS).slaveName>>'s abused cunt is <<if $slaverapistx.dick > 0>>dripping with cum<<else>>overflowing with juices<</if>>, leaving $him horrified and disgusted at $his lack of control. - <<else>> - By the end of the day <<= getSlave($AS).slaveName>>'s abused cunt is <<if $slaverapistx.dick > 0>>dripping with cum<<else>>overflowing with juices<</if>>, leaving $him annoyed at $his lack of control, though $he still somewhat enjoyed $himself. - <</if>> - <<elseif (getSlave($AS).fetish == "submissive")>> - <<if (getSlave($AS).devotion < -20)>> - By the end of the day <<= getSlave($AS).slaveName>>'s abused cunt is <<if $slaverapistx.dick > 0>>dripping with cum<<else>>overflowing with juices<</if>>, leaving the submissive slave horrified that $he found the experience sexually satisfying. - <<else>> - By the end of the day <<= getSlave($AS).slaveName>>'s abused cunt is <<if $slaverapistx.dick > 0>>dripping with cum<<else>>overflowing with juices<</if>>. This sexual encounter is everything $he dreamed of, leaving $him utterly satisfied. - <</if>> - <</if>> - $slaverapistx.slaveName is lying next to $him on the bed in a state of obvious satiation and bliss. - - -<<elseif ($slaverapistx.energy > 95) && ($slaverapistx.devotion > 20) && (getSlave($AS).devotion < -20)>> - <<= getSlave($AS).slaveName>> is tied and placed on the bed with $his pussy defenseless and available, and then you tell the randy $slaverapistx.slaveName that it's all _hers2. The slave life has so affected $slaverapistx.slaveName that _he2 is quite eager to rape another slave, just for the perverted novelty of the act. $His high libido keeps $him going for a long time, bringing the helpless toy to one forced orgasm after another. By the end of the day <<= getSlave($AS).slaveName>> is lying on the bed, all worn out, $his cunt <<if $slaverapistx.dick > 0>>dripping with cum<<else>>overflowing with juices<</if>> to $his horror and resentment, while $slaverapistx.slaveName is sleeping next to $him in a state of obvious satiation and bliss. - -<<elseif (getSlave($AS).devotion <= 20) || ($slaverapistx.devotion <= 20)>> - You order <<= getSlave($AS).slaveName>> onto the couch and tell $slaverapistx.slaveName to get on with it. They fuck mechanically, gazing with roiling emotions into each others' eyes. They do seem to come to some sort of a non-verbal understanding on the necessity of getting it done, and there is no real unhappiness in either of them when they finish and disentangle themselves. As they clean themselves and exit, you notice $slaverapistx.slaveName's looking a little more longingly at <<= getSlave($AS).slaveName>>. - -<<elseif (getSlave($AS).devotion <= 50) || ($slaverapistx.devotion <= 50)>> - You order <<= getSlave($AS).slaveName>> and $slaverapistx.slaveName to get on with it. They fuck mechanically at first, gazing with roiling emotions into each others' eyes. Eventually, they begin to enjoy the intimacy of the act, finding the shared pleasure between them comforting. They finish and resume life as slaves, the light of this intimacy diminishing, softening with $slaverapistx.slaveName's dick and dripping away with the contents of <<= getSlave($AS).slaveName>>'s cum-filled pussy. - -<<else>> - The two slaves happily and eagerly get down to business. They take their time with foreplay, humping slowly and gazing into each others' eyes, exchanging kisses almost constantly. After a little while, <<= getSlave($AS).slaveName>> looks over $slaverapistx.slaveName's shoulder to where you're sitting, the invitation clear in $his eyes. As soon as you stand to come over, they roll over without being ordered to - <<if canDoAnal(getSlave($AS)) && getSlave($AS).anus > 0>> - present <<= getSlave($AS).slaveName>>'s butthole. - <<set getSlave($AS).counter.anal++, $analTotal++>> - <<else>> - invite you into <<= getSlave($AS).slaveName>>'s crowded pussy. - <<set getSlave($AS).counter.vaginal++, $vaginalTotal++>> - <</if>> - You take up the offer and penetrate <<= getSlave($AS).slaveName>> with your <<if $PC.dick > 0>>dick<<else>>strap-on<</if>>. With the added stimulus of penetrating a tight hole alongside _his2 dear <<= getWrittenTitle($slaverapistx)>>, $slaverapistx.slaveName comes indecently hard, but no where near as hard as the completely overloaded <<= getSlave($AS).slaveName>>. All of you collapse into an exhausted, happy pile of flesh. - -<</if>> - -<<if canImpreg(getSlave($AS), $slaverapistx)>> - <<= knockMeUp(getSlave($AS), 25, 0, $slaverapistx.ID)>> -<</if>> - -<<set $slaves[$slaveIndices[$slaverapistx.ID]] = $slaverapistx>> diff --git a/src/npc/interaction/fVagina.js b/src/npc/interaction/fVagina.js new file mode 100644 index 0000000000000000000000000000000000000000..4f5fe9f844968cd979a82f4c7251d8de242802d3 --- /dev/null +++ b/src/npc/interaction/fVagina.js @@ -0,0 +1,1258 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fVagina = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself, girl + } = getPronouns(slave); + + addPartner(slave, -1); + + r.push(`You call ${him} over so you can`); + if (slave.vagina >= 10) { + r.push(`tickle ${his} cavernous hole.`); + } else if (slave.vagina > 3) { + r.push(`use ${his} gaping vagina.`); + } else if (slave.vagina === 3) { + r.push(`fuck ${his} loose cunt.`); + } else if (slave.vagina === 2) { + r.push(`fuck ${his} whorish cunt.`); + } else if (slave.vagina === 1) { + r.push(`fuck ${his} tight cunt.`); + } else if (slave.vagina === 0) { + r.push(`take ${his} virginity.`); + } + + if (slave.vaginaTat === "tribal patterns") { + r.push(`The tattoos on ${his} abdomen certainly drawn attention there.`); + } else if (slave.vaginaTat === "scenes") { + r.push(`The tattoos on ${his} abdomen nicely illustrate what you mean to do to ${him}.`); + } else if (slave.vaginaTat === "degradation") { + r.push(`The tattoos on ${his} abdomen ask you to, after all.`); + } else if (slave.vaginaTat === "lewd crest") { + r.push(`The crest on ${his} abdomen screams debauchery and implores you to use ${him}.`); + } + + if (slave.devotion <= 20) { + if (slave.clit === 1 && slave.foreskin) { + r.push(`${His} big clit peeks out from under its hood.`); + } else if (slave.clit === 2) { + r.push(`${His} huge clit is impossible to miss.`); + } else if (slave.clit > 2) { + r.push(`${His} pseudophallus-sized clit is soft.`); + } + if (slave.labia === 1) { + r.push(`${His} lovely petals are quite inviting.`); + } else if (slave.labia === 2) { + r.push(`${His} prominent petals are inviting.`); + } else if (slave.labia > 2) { + r.push(`${His} labia are so large they present a slight obstacle to entry.`); + } + if (slave.vaginaLube > 1) { + r.push(`${He} may not want it, but that doesn't stop ${his} pussy from getting nice and wet for you.`); + } + } else { + if (slave.clit === 1 && slave.foreskin) { + r.push(`${His} big, hard clit peeks out from under its hood.`); + } else if (slave.clit === 2) { + r.push(`${His} huge, stiff clit is impossible to miss.`); + } else if (slave.clit > 2) { + r.push(`${His} pseudophallus-sized clit is engorged with arousal.`); + } + if (slave.labia === 1) { + r.push(`${His} lovely petals are moist with arousal.`); + } else if (slave.labia === 2) { + r.push(`${His} prominent petals bear a sheen of arousal.`); + } else if (slave.labia > 2) { + r.push(`${His} huge labia are almost dripping with arousal.`); + } + if (slave.vaginaLube > 1) { + r.push(`A steady stream of lube leaks from ${his} pussy in preparation to receive you.`); + } + } + + if (slave.vaginaPiercing > 1) { + if (slave.vagina !== -1) { + r.push(`${His} pierced lips and clit have ${him} nice and wet.`); + } + if (slave.dick !== 0) { + r.push(`Metal glints all up and down ${his} cock.`); + } + } else if (slave.vaginaPiercing === 1) { + if (slave.vagina !== -1) { + r.push(`${His} pierced clit has ${him} nice and moist.`); + } + if (slave.dick !== 0) { + r.push(`Metal glints at the head of ${his} cock.`); + } + } + let fPosition; + let fSpeed; + if (V.PC.pregMood === 2 && V.PC.preg >= 28) { + fPosition = either(50, 50, 50, 90); + fSpeed = 90; + } else if (V.PC.pregMood === 1 && V.PC.preg >= 28) { + fPosition = random(1, 40); + fSpeed = 10; + } else if (V.PC.belly >= 3000) { + fPosition = random(1, 80); + fSpeed = random(1, 75); + } else { + fPosition = random(1, 100); + fSpeed = random(1, 100); + } + + if (canMove(slave) && slave.fetish !== "mindbroken") { + r.push(`You decide to fuck ${him}`); + if (fPosition <= 20) { + r.push(`in the missionary position.`); + if (slave.bellyPreg >= 600000) { + r.push(`A position that will be a challenge due to ${his} immense pregnancy.`); + } else if (slave.belly >= 600000) { + r.push(`A position that will be a challenge due to ${his} immense stomach.`); + } else if (slave.bellyPreg >= 300000) { + r.push(`A position that will be difficult due to ${his} massive pregnancy.`); + } else if (slave.belly >= 300000) { + r.push(`A position that will be difficult due to ${his} massive stomach.`); + } else if (slave.belly+V.PC.belly >= 20000 && slave.belly >= 1500 && V.PC.belly >= 1500) { + r.push(`A position that will be difficult with the combined size of your rounded middles.`); + } + r.push(`You tell ${him} to lie down on the couch next to your desk.`); + } else if (fPosition <= 40) { + r.push(`in the cowgirl position. You lie on the couch beside your desk and tell ${him} to straddle you, facing towards you.`); + if (slave.bellyPreg >= 600000) { + r.push(`A position that will smother you with ${his} immense pregnancy.`); + } else if (slave.belly >= 600000) { + r.push(`A position that will smother you with ${his} immense stomach.`); + } else if (slave.bellyPreg >= 300000) { + r.push(`A position that will allow you to tease ${his} massive pregnancy as you fuck ${him}.`); + } else if (slave.belly >= 300000) { + r.push(`A position that will allow you to tease ${his} massive belly as you fuck ${him}.`); + } else if (slave.belly+V.PC.belly >= 20000 && slave.belly >= 1500 && V.PC.belly >= 1500) { + r.push(`A position that will be awkward with the combined size of your rounded middles.`); + } + } else if (fPosition <= 60) { + r.push(`doggy-style. You tell ${him} to get on the couch beside your desk on ${his}`); + if (hasAnyArms(slave)) { + r.push(hasBothArms(slave) ? `hands` : `hand`); + if (hasAnyLegs(slave)) { + r.push(`and`); + } + } + if (hasAnyLegs(slave)) { + r.push(hasBothLegs(slave) ? `knees` : `knee`); + } + r.push(r.pop() + `.`); + if (slave.bellyPreg >= 600000) { + r.push(`As ${he} struggles to fit on the couch, you tell ${him} to just lean over ${his} immense pregnancy instead.`); + } else if (slave.belly >= 600000) { + r.push(`As ${he} struggles to fit on the couch, you tell ${him} to just lean over ${his} immense belly instead.`); + } else if (slave.bellyPreg >= 300000) { + r.push(`A position that leaves ${his} rear high in the air thanks to ${his} massive pregnancy.`); + } else if (slave.belly >= 300000) { + r.push(`A position that leaves ${his} rear high in the air thanks to ${his} massive stomach.`); + } + if (V.PC.belly >= 5000) { + r.push(`${His} back will make a good rest for your gravid middle.`); + } + } else if (fPosition <= 80) { + r.push(`in the reverse cowgirl position. You lie on the couch beside your desk and tell ${him} to straddle you facing away from you.`); + if (slave.bellyPreg >= 600000) { + r.push(`A position that will much more comfortable for ${his} immense pregnancy and won't crush you under its mass.`); + } else if (slave.belly >= 600000) { + r.push(`A position that will much more comfortable for ${his} immense belly and won't crush you under its mass.`); + } else if (slave.bellyPreg >= 300000) { + r.push(`A position that will much more comfortable for ${his} massive pregnancy.`); + } else if (slave.belly >= 300000) { + r.push(`A position that will much more comfortable for ${his} massive belly.`); + } + } else { + r.push(`in the wheelbarrow position. You tell ${him} to get on the couch beside your desk, stand next to ${him} and lift ${his} legs up into the air.`); + if (slave.bellyPreg >= 600000) { + r.push(`${His} pregnancy is so immense it reaches the floor even as you hold ${him} saving you the trouble of bearing its weight.`); + } else if (slave.belly >= 600000) { + r.push(`${His} belly is so immense it reaches the floor even as you hold ${him} saving you the trouble of bearing its weight.`); + } else if (slave.bellyPreg >= 300000) { + r.push(`You hope you don't strain something supporting ${his} massive pregnancy.`); + } else if (slave.belly >= 300000) { + r.push(`You hope you don't strain something supporting ${his} massive belly.`); + } + } + } + + if (slave.vagina === 0 && canDoVaginal(slave)) { + if (slave.fetish === "mindbroken") { + r.push(`${He} accepts your orders dumbly and presents ${his} virgin pussy for defloration${(V.PC.dick === 0) ? `, watching without real interest as you don a strap-on` : ``}. Since ${he} is mindbroken, <span class="virginity loss">losing ${his} virginity</span> has no impact on any part of ${him} other than ${his} vagina.`); + } else if (slave.devotion > 20) { + r.push(`${He} accepts your orders without comment and presents ${his} virgin pussy for defloration${(V.PC.dick === 0) ? `, watching with some small trepidation as you don a strap-on` : ``}. You gently ease into ${his} pussy before gradually increasing the intensity of your thrusts into ${him}. Before long, ${he}'s moaning loudly as you pound away. Since ${he} is already well broken, this new connection with ${his} ${getWrittenTitle(slave)} <span class="devotion inc">increases ${his} devotion to you.</span> <span class="virginity loss">${His} pussy has been broken in.</span> ${He} looks forward to having ${his} pussy fucked by you again.`); + slave.devotion += 10; + } else if (slave.devotion >= -20) { + r.push(`${He} is clearly unhappy at losing ${his} pearl of great price to you; this probably isn't what ${he} imagined ${his} first real sex would be like.`); + if (V.PC.dick === 0) { + r.push(`${His} lower lip quivers with trepidation as ${he} watches you don a strap-on and maneuver to fuck ${his} virgin hole.`); + } + r.push(`You gently ease into ${his} pussy before gradually increasing the intensity of your thrusts into ${him}. Before long, ${he}'s moaning as you pound away. Nevertheless, this new connection with ${his} ${getWrittenTitle(slave)} <span class="devotion inc">increases ${his} devotion to you.</span> <span class="virginity loss">${His} pussy has been broken in,</span> and ${he} is <span class="trust dec">fearful</span> that sex will continue to be painful.`); + slave.devotion += 4; + slave.trust -= 4; + } else { + r.push(`As you anticipated, ${he} refuses to give you ${his} virginity. And as you expected, ${he} is unable to resist you. ${He} cries as`); + if (V.PC.dick === 0) { + r.push(`your strap-on`); + } else { + r.push(`your cock`); + } + r.push(`opens ${his} fresh, tight hole. You force your way into ${his} pussy and continue thrusting into ${him}. ${He} sobs and cries with horror as you pound away. The rape <span class="devotion dec">decreases ${his} devotion to you.</span> <span class="virginity loss">${His} pussy has been broken in,</span> and ${he} <span class="trust dec">fears further abuse.</span>`); + slave.devotion -= 4; + slave.trust -= 4; + } + slave.vagina++; + } else if (slave.fetish === "mindbroken") { + r.push(`Since ${his} mind is gone, ${he}'s yours to use as a human sex doll. You throw ${him} over the couch and amuse yourself with ${him} for a while; ${his} body retains its instinctual responses, at least. You finish inside ${him} and leave your toy for one of your other slaves to clean and maintain.`); + } else if (isAmputee(slave)) { + r.push(`Since ${he}'s a quadruple amputee, ${he}'s yours to use as a human sex toy. You set ${him}`); + if (V.PC.dick !== 0) { + if (slave.belly >= 300000) { + r.push(`atop ${his} massive stomach and`); + if (fSpeed > 75) { + r.push(`fuck ${him} hard and fast,`); + } else if (fSpeed > 50) { + r.push(`fuck ${him} firmly and vigorously,`); + } else if (fSpeed > 25) { + r.push(`fuck ${him} steadily and controlled,`); + } else { + r.push(`fuck ${him} slowly and tenderly,`); + } + r.push(`managing ${him} with your arms as you go.`); + } else { + r.push(`atop your cock and slide ${him} up and down,`); + if (fSpeed > 75) { + r.push(`hard and fast,`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously,`); + } else if (fSpeed > 25) { + r.push(`steadily and controlled,`); + } else { + r.push(`slowly and tenderly,`); + } + r.push(`managing ${him} with your arms.`); + } + if (slave.dick > 0) { + if (slave.chastityPenis === 1) { + r.push(`${His} dick chastity keeps ${his} useless bitchclit out of the way.`); + } else if (!canAchieveErection(slave)) { + r.push(`As you use ${him} as a helpless cock jacket, ${his}`); + if (slave.dick < 7) { + r.push(`flaccid dick flops around, ignored.`); + } else { + r.push(`massive dick flops against you, no longer able to get hard.`); + } + } else { + r.push(`As you use ${him} as a helpless cock jacket, your pounding keeps ${his} prick stiff.`); + } + } + r.push(`You finish inside ${him} and leave your toy for one of your other slaves to clean and maintain.`); + } else { + r.push(`on the couch and straddle ${his} hips, bringing your already-wet pussy`); + if (fSpeed > 75) { + r.push(`hard against ${him}. You grind powerfully`); + } else if (fSpeed > 50) { + r.push(`firmly against ${him}. You grind vigorously`); + } else if (fSpeed > 25) { + r.push(`against ${him}. You grind steadily`); + } else { + r.push(`softly against ${him}. You grind gently`); + } + r.push(`against ${his} helpless body, using ${him} as a living sybian until ${his} warmth and movement brings you to orgasm.`); + } + } else if (tooBigBelly(slave)) { + r.push(`You tell ${him} to get situated on the couch, face-down. This position pins ${him} down by the massive weight of ${his} belly, pushing ${his} face in amongst the cushions and keeping ${his} crotch in the ideal position to penetrate. ${His} belly serves as an anchor, allowing you to take ${him} doggy style without any real contribution from ${him}. The position muffles ${his} reaction entirely, other than the rhythmic jiggling of ${his} bulging belly as it sticks out from either side of ${his} torso as you`); + if (fSpeed > 75) { + r.push(`pound ${him} hard and fast.`); + } else if (fSpeed > 50) { + r.push(`pound ${him} firmly and vigorously.`); + } else if (fSpeed > 25) { + r.push(`fuck ${him} steadily.`); + } else { + r.push(`fuck ${him} slowly and tenderly.`); + } + } else if (tooBigBreasts(slave)) { + r.push(`You tell ${him} to get situated on the couch, face-down. This position pins ${him} down by the massive weight of ${his} tits, pushing ${his} face in amongst the cushions. ${His} tits serve as an anchor, allowing you to take ${him} doggy style without any real contribution from ${him}. The position muffles ${his} reaction entirely, other than the rhythmic jiggling of the breastflesh that sticks out to either side of ${his} torso as you`); + if (fSpeed > 75) { + r.push(`pound ${him} hard and fast.`); + } else if (fSpeed > 50) { + r.push(`pound ${him} firmly and vigorously.`); + } else if (fSpeed > 25) { + r.push(`fuck ${him} steadily.`); + } else { + r.push(`fuck ${him} slowly and tenderly.`); + } + } else if (tooBigButt(slave)) { + r.push(`You tell ${him} to get situated on the couch, face-up. This position pins ${him} down by the massive weight of ${his} rear, causing ${him} to sink into the cushions. ${His} ass serves as an anchor, allowing you to take ${him} in the missionary position without any real contribution from ${him}. This lets you clearly see ${his} reaction, as well as the rhythmic jiggling of the buttflesh that sticks out to either side of ${his} hips as you`); + if (fSpeed > 75) { + r.push(`pound ${him} hard and fast.`); + } else if (fSpeed > 50) { + r.push(`pound ${him} firmly and vigorously.`); + } else if (fSpeed > 25) { + r.push(`fuck ${him} steadily.`); + } else { + r.push(`fuck ${him} slowly and tenderly.`); + } + } else if (tooBigBalls(slave)) { + r.push(`You tell ${him} to get situated on the couch, doggy style. This position pins ${him} down by the massive weight of ${his} balls. ${His} testicles serve as an anchor, allowing you to take ${him} doggy style without any real concern of getting struck by ${his} massive nuts. The position keeps ${his} balls completely still where they rest on the couch, so you don't have to worry about them getting in the way as you`); + if (fSpeed > 75) { + r.push(`pound ${him} hard and fast.`); + } else if (fSpeed > 50) { + r.push(`pound ${him} firmly and vigorously.`); + } else if (fSpeed > 25) { + r.push(`fuck ${him} steadily.`); + } else { + r.push(`fuck ${him} slowly and tenderly.`); + } + } else if (slave.fetish === "submissive" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && V.PC.dick !== 0) { + r.push(`${He} comes over, smiling a little submissive smile, and spreads ${himself} for you. You take ${him} on the couch next to your desk after ${he} gets into position.`); + if (fPosition <= 20) { // missionary + if (slave.bellyPreg >= 600000) { + if (V.PC.belly >= 5000) { + r.push(`You have to heft ${his} gravid body up and slip under ${his} expansive middle to position yourself for penetration. With your own baby bump in the way, it's a complicated maneuver, but once you manage to get in, you rest your head against ${his} bulging belly and feel the movements within as you thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`into ${him};`); + } else { + r.push(`You have to heft ${his} gravid body up and slip under ${his} expansive middle to position yourself for penetration. But once you are seated, you rest your head against ${his} bulging belly and feel the movements within as you thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`into ${him};`); + } + } else if (slave.belly >= 600000) { + if (V.PC.belly >= 5000) { + r.push(`You have to heft ${his} weighty body up and slip under ${his} expansive middle to position yourself for penetration. With your own gravid swell in the way, it's a complicated maneuver, but once you manage to get in, you rest your head against ${his} immense belly and feel the force of your`); + if (fSpeed > 75) { + r.push(`fast, hard`); + } else if (fSpeed > 50) { + r.push(`vigorous, firm`); + } else if (fSpeed > 25) { + r.push(`steady`); + } else { + r.push(`slow, tender`); + } + r.push(`thrusts running through ${him};`); + } else { + r.push(`You have to heft ${his} weighty body up and slip under ${his} expansive middle to position yourself for penetration. But once you are seated, you rest your head against ${his} immense belly and feel the force of your`); + if (fSpeed > 75) { + r.push(`fast, hard`); + } else if (fSpeed > 50) { + r.push(`vigorous, firm`); + } else if (fSpeed > 25) { + r.push(`steady`); + } else { + r.push(`slow, tender`); + } + r.push(`thrusts running through ${him};`); + } + } else if (slave.bellyPreg >= 300000) { + r.push(`You have to heft ${his} gravid body up to position yourself for penetration. But once you are mounted, you rest your head against ${his} bulging belly and feel the movements within as you thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`into ${him};`); + } else if (slave.belly >= 300000) { + r.push(`You have to heft ${his} weighty body up to position yourself for penetration. But once you are mounted, you rest your head against ${his} massive stomach and feel the force of your`); + if (fSpeed > 75) { + r.push(`fast, hard`); + } else if (fSpeed > 50) { + r.push(`vigorous, firm`); + } else if (fSpeed > 25) { + r.push(`steady`); + } else { + r.push(`slow, tender`); + } + r.push(`thrusts running through ${him};`); + } else { + r.push(`${He} hugs ${his} torso to you and`); + if (slave.belly+V.PC.belly >= 20000 && slave.belly >= 1500 && V.PC.belly >= 1500) { + r.push(`your bellies bulge lewdly against each other;`); + } else if (slave.belly >= 5000) { + r.push(`pushes ${his} belly against your stomach;`); + } else if (V.PC.belly >= 5000) { + r.push(`pushes your belly into ${his} stomach;`); + } else if (V.PC.boobs >= 1400) { + r.push(`${his} breasts press against your own enormous,`); + if (V.PC.boobsImplant/V.PC.boobs >= .60) { + r.push(`hard`); + } else { + r.push(`soft`); + } + r.push(`breasts;`); + } else if (V.PC.boobs >= 1200) { + r.push(`${his} breasts press against your own huge,`); + if (V.PC.boobsImplant/V.PC.boobs >= .60) { + r.push(`firm`); + } else { + r.push(`soft`); + } + r.push(`breasts;`); + } else if (V.PC.boobs >= 1000) { + r.push(`${his} breasts press against your own big${(V.PC.boobsImplant/V.PC.boobs >= .60) ? `, perky` : ``} breasts;`); + } else if (V.PC.boobs >= 800) { + r.push(`${his} breasts press against your own generous breasts;`); + } else if (V.PC.boobs >= 650) { + r.push(`${his} breasts press against your own breasts;`); + } else if (V.PC.boobs >= 500) { + r.push(`${his} breasts press against your own average breasts;`); + } else if (V.PC.boobs >= 300) { + r.push(`${his} breasts press against your own small breasts;`); + } else if (V.PC.title === 0) { + r.push(`${his} breasts press against your flat breasts;`); + } else { + r.push(`${his} breasts press against your chest;`); + } + } + } else if (fPosition <= 40) { // cowgirl + if (slave.bellyPreg >= 600000) { + r.push(`You wrap your arms around ${his} boundless pregnancy as you thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`into ${him} and enjoy the feeling of so much movement squirming against your face;`); + } else if (slave.belly >= 600000) { + r.push(`You wrap your arms around ${his} boundless stomach as you thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`into ${him} and enjoy the feeling of your every move running through ${his} belly;`); + } else if (slave.bellyPreg >= 300000) { + r.push(`${He} does ${his} best to not suffocate you with ${his} massive belly or knock you out with it as you thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`into ${him}. You get a face full of pregnancy with each downward motion;`); + } else if (slave.belly >= 300000) { + r.push(`${He} does ${his} best to not suffocate you with ${his} massive belly or knock you out with it as you thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`into ${him}. You get a face full of implant with each downward motion;`); + } else { + r.push(`${He}`); + if (hasAnyArms(slave)) { + r.push(`puts ${his} hand`); + if (hasBothArms(slave)) { + r.push(`s`); + } + r.push(`on your chest and`); + } + r.push(`leans forward as you continue to thrust`); + if (fSpeed > 75) { + r.push(`hard`); + } else if (fSpeed > 50) { + r.push(`vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`tenderly`); + } + r.push(`upwards;`); + } + } else if (fPosition <= 60) { // doggy-style + if (slave.bellyPreg >= 300000) { + r.push(`${He} arches ${his} back as you continue to pound ${him}`); + if (fSpeed > 75) { + r.push(`hard and fast,`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously,`); + } else if (fSpeed > 25) { + r.push(`steadily,`); + } else { + r.push(`slowly and tenderly,`); + } + r.push(`${his} occupants enjoying the attention. As you rest your weight on ${him}, you run your hands along ${his} distended sides;`); + } else if (slave.belly >= 300000) { + r.push(`${He} arches ${his} back as you continue to pound ${him}`); + if (fSpeed > 75) { + r.push(`hard and fast,`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously,`); + } else if (fSpeed > 25) { + r.push(`steadily,`); + } else { + r.push(`slowly and tenderly,`); + } + r.push(`${his} belly jiggling just slightly with each thrust. As you rest your weight on ${him}, you run your hands along ${his} distended sides;`); + } else { + r.push(`${He} arches ${his} back as you continue to pound ${him}`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + } + } else if (fPosition <= 80) { // reverse cowgirl + if (slave.bellyPreg >= 300000) { + r.push(`You may have to spread your legs extra wide to accommodate ${his} impressive baby bump, but the angle and pressure it puts on you feels amazing. ${He}`); + if (hasAnyArms(slave)) { + r.push(`puts ${his} hand`); + if (hasBothArms(slave)) { + r.push(`s`); + } + r.push(`on your chest and`); + } + r.push(`starts to lean back as you continue to thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`upwards, in return you caress ${his} distended sides;`); + } else if (slave.belly >= 300000) { + r.push(`You may have to spread your legs extra wide to accommodate ${his} impressive belly, but the angle and pressure it puts on you feels amazing. ${He}`); + if (hasAnyArms(slave)) { + r.push(`puts ${his} hand`); + if (hasBothArms(slave)) { + r.push(`s`); + } + r.push(`on your chest and`); + } + r.push(`starts to lean back as you continue to thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`upwards, in return you caress ${his} distended sides;`); + } else { + r.push(`${He}`); + if (hasAnyArms(slave)) { + r.push(`puts ${his} hand`); + if (hasBothArms(slave)) { + r.push(`s`); + } + r.push(`on your chest and`); + } + r.push(`starts to lean back as you continue to thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`upwards;`); + } + } else { // wheelbarrow + if (slave.belly >= 600000) { + r.push(`With all ${his} weight handled, you can keep`); + if (fSpeed > 75) { + r.push(`furiously`); + } else if (fSpeed > 50) { + r.push(`vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`pounding without your arms getting tired;`); + } else if (slave.bellyPreg >= 300000) { + r.push(`Before long both of your strength begins to wane, causing ${his} belly to touch the floor. With some of the weight off of the both of you, you keep on`); + if (fSpeed > 75) { + r.push(`furiously`); + } else if (fSpeed > 50) { + r.push(`vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`pounding;`); + } else if (slave.belly >= 300000) { + r.push(`Before long both of your strength begins to wane, causing ${his} belly to touch the floor. With some of the weight off of the both of you, you keep on`); + if (fSpeed > 75) { + r.push(`furiously`); + } else if (fSpeed > 50) { + r.push(`vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`pounding;`); + } else { + r.push(`${He} begins to tire as you keep`); + if (fSpeed > 75) { + r.push(`furiously`); + } else if (fSpeed > 50) { + r.push(`vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`pounding;`); + } + } + r.push(`you can feel`); + if (slave.bellyPreg >= 300000) { + r.push(`${his} child`); + if (slave.pregType > 0) { + r.push(`ren`); + } + r.push(`begin to squirm in reaction to their mother's lust.`); + } else { + r.push(`${his} heart beating hard.`); + } + r.push(`As the sex reaches its climax, ${he} begs you to cum inside ${his} unworthy body.`); + if (slave.dick !== 0 && canAchieveErection(slave)) { + if (slave.chastityPenis === 1) { + r.push(`${He} does ${his} submissive best to stay completely soft within ${his} dick chastity.`); + } else { + r.push(`As a submissive ${he} spares no attention for ${his} own orgasm, so ${his} rock hard erection swings untended.`); + } + } else if (slave.chastityPenis === 1) { + r.push(`${His} cock is forgotten inside its chastity cage as you take what you want from ${him}.`); + } else if (slave.dick !== 0) { + r.push(`As a submissive ${he} spares no attention for ${his} own orgasm, so ${his} flaccid cock swings untended.`); + } + if (V.PC.vagina !== -1) { + r.push(`When you finally climax, you pull out and press your wet cunt against ${his} mouth, letting ${his} lavish attention on you that brings you to another quick orgasm.`); + seX(slave, "oral", V.PC, "penetrative"); + } + } else if (slave.devotion < -20) { + r.push(`${He} tries to refuse, so you`); + if (V.PC.dick !== 0) { + r.push(`bend the disobedient slave over your desk and take ${him} hard from behind. ${His} breasts`); + if (slave.dick !== 0) { + r.push(`and cock`); + } + r.push(`slide back and forth across the desk. You give ${his} buttocks some nice hard swats as you pound ${him}. ${He} grunts and moans but knows better than to try to get away.`); + if (slave.dick !== 0 && canAchieveErection(slave)) { + r.push(`Despite ${his} unwillingness to be raped, the stimulation`); + if (slave.chastityPenis) { + r.push(`starts to give ${him} an erection, which ${his} dick chastity makes horribly uncomfortable. ${He} bucks with the pain, ${his} hole spasming delightfully.`); + } else { + r.push(`gives ${him} an erection. ${He}'s mortified that ${he} would get hard while being raped.`); + } + } else if (slave.chastityPenis === 1) { + r.push(`${His} dick chastity keeps ${his} bitch cock hidden away while you use ${his} whore hole.`); + } else if (slave.dick !== 0) { + r.push(`${His} flaccid dick is ground into the back of the couch as you rape ${him}.`); + } + if (V.PC.vagina !== -1) { + r.push(`After your first orgasm, you pull out and grind your pussy against ${his} face for another, enjoying the stimulation of ${his} muffled crying.`); + seX(slave, "oral", V.PC, "penetrative"); + } + } else { + r.push(`stand and seize ${him}, shoving ${him} down to sit in your chair. You jump atop ${his} hips, pinning ${him} down into the chair with your legs and pressing your pussy hard against ${his} groin. ${He} struggles and whimpers, but you give ${him} a hard warning slap to the cheek and kiss ${his} unwilling mouth, forcing your tongue past ${his} lips as you grind against ${him}.`); + } + } else if (slave.devotion <= 20) { + if (V.PC.dick !== 0) { + r.push(`${He} obeys, lying on the couch next to your desk`); + if (hasAnyLegs(slave)) { + r.push(`with ${his} ${hasBothLegs(slave) ? `legs spread` : `leg moved aside`}`); + } + r.push(r.pop() + `.`); + r.push(`You kneel on the ground and enter ${him}${hasAnyLegs(slave) ? `, a hand on` : ``}`); + if (hasAnyLegs(slave)) { + if (hasBothLegs(slave)) { + r.push(`each of ${his} legs`); + } else { + r.push(`${his} leg`); + } + r.push(`to give you a good grip`); + } + r.push(r.pop() + `.`); + if (fSpeed > 75) { + r.push(`The pounding is hard and fast,`); + } else if (fSpeed > 50) { + r.push(`You pound ${him} firmly and vigorously,`); + } else if (fSpeed > 25) { + r.push(`You fuck ${him} steadily and controlled,`); + } else { + r.push(`You fuck ${him} slowly and tenderly,`); + } + r.push(`and ${he} gasps and`); + if (fSpeed > 50) { + r.push(`whines.`); + } else { + r.push(`moans.`); + } + r.push(`You reach a hand down to maul ${his} breasts.`); + if (slave.dick !== 0 && canAchieveErection(slave)) { + if (slave.chastityPenis === 1) { + r.push(`${He} enjoys ${himself}, even though ${his} dick chastity keeps ${him} soft by making the beginnings of erection very uncomfortable.`); + } else { + r.push(`${He} bites ${his} lip and moans as ${he} climaxes. You fill ${his} squeezing fuckhole with your cum. ${He} already dribbled ${his} own weak load all over ${his} stomach.`); + } + } else if (slave.chastityPenis === 1) { + r.push(`${He} bites ${his} lip and moans as ${he} climaxes. You fill ${his} squeezing fuckhole with your cum. Precum has been dribbling out of ${his} dick chastity for some time, apparently the best ${his} soft bitchclit can manage.`); + } else if (slave.dick !== 0) { + r.push(`${He} bites ${his} lip and moans as ${he} climaxes. You fill ${his} squeezing fuckhole with your cum. ${He} already blew ${his} own load all over ${his} stomach despite ${his} inability to get hard.`); + } + if (V.PC.vagina !== -1) { + r.push(`You got so wet fucking ${him} that when you climax, you stand up and let ${him} clean your pussy with ${his} mouth. The oral attention brings you to a quick aftershock orgasm.`); + seX(slave, "oral", V.PC, "penetrative"); + } + } else { + r.push(`You pat the tops of your thighs, and ${he} obediently comes over to sit atop them, wrapping ${his} legs around you. Your hands reach around ${him} and seize ${his} buttocks, drawing ${him} in even closer so that the warmth between ${his} legs is pressed hard against your pussy. ${He} grinds dutifully against you, only pausing for a moment when ${he} finds your insistent tongue probing past ${his} lips.`); + } + } else { + if (V.PC.dick !== 0) { + r.push(`${He} skips over smiling and gives you a quick kiss. You take ${him} on the couch next to your desk after ${he} gets into position.`); + if (fPosition <= 20) { // missionary + if (slave.bellyPreg >= 600000) { + if (V.PC.belly >= 5000) { + r.push(`You have to heft ${his} gravid body up and slip under ${his} expansive middle to position yourself for penetration. With your own baby bump in the way, it's a complicated maneuver, but once you manage to get in, you rest your head against ${his} bulging belly and feel the movements within as you thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`into ${him};`); + } else { + r.push(`You have to heft ${his} gravid body up and slip under ${his} expansive middle to position yourself for penetration. But once you are seated, you rest your head against ${his} bulging belly and feel the movements within as you thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`into ${him};`); + } + } else if (slave.belly >= 600000) { + if (V.PC.belly >= 5000) { + r.push(`You have to heft ${his} weighty body up and slip under ${his} expansive middle to position yourself for penetration. With your own gravid swell in the way, it's a complicated maneuver, but once you manage to get in, you rest your head against ${his} immense belly and feel the force of your`); + if (fSpeed > 75) { + r.push(`fast, hard`); + } else if (fSpeed > 50) { + r.push(`vigorous, firm`); + } else if (fSpeed > 25) { + r.push(`steady`); + } else { + r.push(`slow, tender`); + } + r.push(`thrusts running through ${him};`); + } else { + r.push(`You have to heft ${his} weighty body up and slip under ${his} expansive middle to position yourself for penetration. But once you are seated, you rest your head against ${his} immense belly and feel the force of your`); + if (fSpeed > 75) { + r.push(`fast, hard`); + } else if (fSpeed > 50) { + r.push(`vigorous, firm`); + } else if (fSpeed > 25) { + r.push(`steady`); + } else { + r.push(`slow, tender`); + } + r.push(`thrusts running through ${him};`); + } + } else if (slave.bellyPreg >= 300000) { + r.push(`You have to heft ${his} gravid body up to position yourself for penetration. But once you are mounted, you rest your head against ${his} bulging belly and feel the movements within as you thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`into ${him};`); + } else if (slave.belly >= 300000) { + r.push(`You have to heft ${his} weighty body up to position yourself for penetration. But once you are mounted, you rest your head against ${his} massive stomach and feel the force of your`); + if (fSpeed > 75) { + r.push(`fast, hard`); + } else if (fSpeed > 50) { + r.push(`vigorous, firm`); + } else if (fSpeed > 25) { + r.push(`steady`); + } else { + r.push(`slow, tender`); + } + r.push(`thrusts running through ${him};`); + } else { + r.push(`${He} hugs ${his} torso to you and`); + if (slave.belly+V.PC.belly >= 20000 && slave.belly >= 1500 && V.PC.belly >= 1500) { + r.push(`your bellies bulge lewdly against each other;`); + } else if (slave.belly >= 5000) { + r.push(`pushes ${his} belly against your stomach;`); + } else if (V.PC.belly >= 5000) { + r.push(`pushes your belly into ${his} stomach;`); + } else if (V.PC.boobs >= 1400) { + r.push(`${his} breasts press against your own enormous,`); + if (V.PC.boobsImplant/V.PC.boobs >= .60) { + r.push(`hard`); + } else { + r.push(`soft`); + } + r.push(`breasts;`); + } else if (V.PC.boobs >= 1200) { + r.push(`${his} breasts press against your own huge,`); + if (V.PC.boobsImplant/V.PC.boobs >= .60) { + r.push(`firm`); + } else { + r.push(`soft`); + } + r.push(`breasts;`); + } else if (V.PC.boobs >= 1000) { + r.push(`${his} breasts press against your own big${(V.PC.boobsImplant/V.PC.boobs >= .60) ? `, perky` : ``} breasts;`); + } else if (V.PC.boobs >= 800) { + r.push(`${his} breasts press against your own generous breasts;`); + } else if (V.PC.boobs >= 650) { + r.push(`${his} breasts press against your own breasts;`); + } else if (V.PC.boobs >= 500) { + r.push(`${his} breasts press against your own average breasts;`); + } else if (V.PC.boobs >= 300) { + r.push(`${his} breasts press against your own small breasts;`); + } else if (V.PC.title === 0) { + r.push(`${his} breasts press against your flat breasts;`); + } else { + r.push(`${his} breasts press against your chest;`); + } + } + } else if (fPosition <= 40) { // cowgirl + if (slave.bellyPreg >= 600000) { + r.push(`You wrap your arms around ${his} boundless pregnancy as you thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`into ${him} and enjoy the feeling of so much movement squirming against your face;`); + } else if (slave.belly >= 600000) { + r.push(`You wrap your arms around ${his} boundless stomach as you thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`into ${him} and enjoy the feeling of your every move running through ${his} belly;`); + } else if (slave.bellyPreg >= 300000) { + r.push(`${He} does ${his} best to not suffocate you with ${his} massive belly or knock you out with it as you thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`into ${him}. You get a face full of pregnancy with each downward motion;`); + } else if (slave.belly >= 300000) { + r.push(`${He} does ${his} best to not suffocate you with ${his} massive belly or knock you out with it as you thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`into ${him}. You get a face full of implant with each downward motion;`); + } else { + r.push(`${He}`); + if (hasAnyArms(slave)) { + r.push(`puts ${his} hand`); + if (hasBothArms(slave)) { + r.push(`s`); + } + r.push(`on your chest and`); + } + r.push(`leans forward as you continue to thrust`); + if (fSpeed > 75) { + r.push(`hard`); + } else if (fSpeed > 50) { + r.push(`vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`tenderly`); + } + r.push(`upwards;`); + } + } else if (fPosition <= 60) { // doggy-style + if (slave.bellyPreg >= 300000) { + r.push(`${He} arches ${his} back as you continue to pound ${him}`); + if (fSpeed > 75) { + r.push(`hard and fast,`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously,`); + } else if (fSpeed > 25) { + r.push(`steadily,`); + } else { + r.push(`slowly and tenderly,`); + } + r.push(`${his} occupants enjoying the attention. As you rest your weight on ${him}, you run your hands along ${his} distended sides;`); + } else if (slave.belly >= 300000) { + r.push(`${He} arches ${his} back as you continue to pound ${him}`); + if (fSpeed > 75) { + r.push(`hard and fast,`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously,`); + } else if (fSpeed > 25) { + r.push(`steadily,`); + } else { + r.push(`slowly and tenderly,`); + } + r.push(`${his} belly jiggling just slightly with each thrust. As you rest your weight on ${him}, you run your hands along ${his} distended sides;`); + } else { + r.push(`${He} arches ${his} back as you continue to pound ${him}`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + } + } else if (fPosition <= 80) { // reverse cowgirl + if (slave.bellyPreg >= 300000) { + r.push(`You may have to spread your legs extra wide to accommodate ${his} impressive baby bump, but the angle and pressure it puts on you feels amazing. ${He}`); + if (hasAnyArms(slave)) { + r.push(`puts ${his} hand`); + if (hasBothArms(slave)) { + r.push(`s`); + } + r.push(`on your chest and`); + } + r.push(`starts to lean back as you continue to thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`upwards, in return you caress ${his} distended sides;`); + } else if (slave.belly >= 300000) { + r.push(`You may have to spread your legs extra wide to accommodate ${his} impressive belly, but the angle and pressure it puts on you feels amazing. ${He}`); + if (hasAnyArms(slave)) { + r.push(`puts ${his} hand`); + if (hasBothArms(slave)) { + r.push(`s`); + } + r.push(`on your chest and`); + } + r.push(`starts to lean back as you continue to thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`upwards, in return you caress ${his} distended sides;`); + } else { + r.push(`${He}`); + if (hasAnyArms(slave)) { + r.push(`puts ${his} hand`); + if (hasBothArms(slave)) { + r.push(`s`); + } + r.push(`on your chest and`); + } + r.push(`starts to lean back as you continue to thrust`); + if (fSpeed > 75) { + r.push(`hard and fast`); + } else if (fSpeed > 50) { + r.push(`firmly and vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`upwards;`); + } + } else { // wheelbarrow + if (slave.belly >= 600000) { + r.push(`With all ${his} weight handled, you can keep`); + if (fSpeed > 75) { + r.push(`furiously`); + } else if (fSpeed > 50) { + r.push(`vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`pounding without your arms getting tired;`); + } else if (slave.bellyPreg >= 300000) { + r.push(`Before long both of your strength begins to wane, causing ${his} belly to touch the floor. With some of the weight off of the both of you, you keep on`); + if (fSpeed > 75) { + r.push(`furiously`); + } else if (fSpeed > 50) { + r.push(`vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`pounding;`); + } else if (slave.belly >= 300000) { + r.push(`Before long both of your strength begins to wane, causing ${his} belly to touch the floor. With some of the weight off of the both of you, you keep on`); + if (fSpeed > 75) { + r.push(`furiously`); + } else if (fSpeed > 50) { + r.push(`vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`pounding;`); + } else { + r.push(`${He} begins to tire as you keep`); + if (fSpeed > 75) { + r.push(`furiously`); + } else if (fSpeed > 50) { + r.push(`vigorously`); + } else if (fSpeed > 25) { + r.push(`steadily`); + } else { + r.push(`slowly and tenderly`); + } + r.push(`pounding;`); + } + } + r.push(`you can feel`); + if (slave.bellyPreg >= 300000) { + r.push(`${his} child`); + if (slave.pregType > 0) { + r.push(`ren`); + } + r.push(`begin to squirm in reaction to their mother's lust.`); + } else { + r.push(`${his} heart beating hard.`); + } + if (fPosition <= 40 && slave.belly+V.PC.belly < 20000) { + r.push(`As the sex reaches its climax, ${his} kisses grow urgent and passionate.`); + } + if (slave.dick !== 0 && canAchieveErection(slave)) { + if (slave.chastityPenis === 1) { + r.push(`${He} enjoys ${himself}, even though ${his} dick chastity keeps ${him} soft by making the beginnings of erection very uncomfortable.`); + } else { + r.push(`When you orgasm together, ${his} erect cock squirts cum up towards ${his} tits while your cock fills ${him} with cum.`); + } + } else if (slave.chastityPenis === 1) { + r.push(`${He} bites ${his} lip and moans as ${he} climaxes. You fill ${his} squeezing fuckhole with your cum. Precum has been dribbling out of ${his} dick chastity for some time, apparently the best ${his} soft bitchclit can manage.`); + } else if (slave.dick !== 0) { + r.push(`When you orgasm together, ${his} limp, neglected cock dribbles weakly while your cock fills ${him} with cum.`); + } else if (slave.clit > 2) { + r.push(`As you fuck ${him}, ${he} plays with ${his} huge clit. It's so large it almost looks like ${he}'s jacking off a cock.`); + } + if (V.PC.vagina !== -1) { + r.push(`You got so wet fucking ${him} that when you climax, you stand up; ${he} knows what that means, and hurries to eat you out. The oral attention brings you to a quick aftershock orgasm.`); + seX(slave, "oral", V.PC, "penetrative"); + } + } else { + r.push(`You pat the tops of your thighs, and ${he} skips over smiling and gives you a quick kiss. Without breaking the lip lock, ${he} sits down, wrapping ${his} legs around you. Your hands reach around ${him} and seize ${his} buttocks, drawing ${him} in even closer so that the warmth between ${his} legs is pressed hard against your pussy, and you can play with ${his} asshole. ${He} grinds enthusiastically against you, moaning into your mouth with pleasure.`); + } + } + + r.push(VCheck.Vaginal(slave, 1)); + + if (slave.bellyPreg >= 1500) { + r.push(`The poor slave's belly gets in the way, but the added perversion of fucking a pregnant hole makes the inconvenience worthwhile.`); + } else if (slave.bellyImplant >= 1500) { + r.push(`The poor slave's implant filled belly gets in the way, but the added perversion of fucking a ${girl} with such a round stomach makes the inconvenience worthwhile.`); + } else if (slave.bellyFluid >= 1500) { + r.push(`The poor slave's sloshing belly gets in the way, but the added perversion of seeing it jiggle makes the inconvenience worthwhile.`); + } + + if (random(1, 100) > (100 + slave.devotion)) { + if (slave.fetish !== "pregnancy" && slave.energy <= 95 && slave.sexualFlaw !== "hates penetration") { + r.push(`Being taken by force has given ${him} a <span class="flaw gain">hatred of penetration.</span>`); + slave.sexualFlaw = "hates penetration"; + } + } else if (random(1, 100) > (110 - slave.devotion)) { + if (slave.fetish === "none" && slave.energy <= 95 && slave.sexualFlaw !== "hates penetration" && slave.ovaries === 1 || slave.mpreg === 1) { + r.push(`Enjoying sex with you seems to have <span class="fetish gain">encouraged ${his} biological clock.</span>`); + slave.fetish = "pregnancy"; + slave.fetishKnown = 1; + slave.fetishStrength = 10; + } + } + + if (V.PC.dick !== 0) { + if (slave.cervixImplant === 1 || slave.cervixImplant === 3) { + slave.bellyImplant += random(10, 20); + } + + if (slave.vagina === 3) { + r.push(`Cum drips out of ${his} fucked-out hole.`); + } else if (slave.vagina === 2) { + r.push(`Cum drips out of ${his} stretched vagina.`); + } else if (slave.vagina === 1) { + r.push(`${His} still-tight vagina keeps your load inside ${him}.`); + } else if (slave.vagina < 0) { + r.push(`Cum drips out of ${his} girly ass.`); + } else { + r.push(`Your cum slides right out of ${his} gaping hole.`); + } + + if (canMove(slave) && V.postSexCleanUp > 0) { + r.push(`${He} uses`); + if (slave.vagina > 0) { + r.push(`a quick douche to clean ${his}`); + if (slave.vagina < 2) { + r.push(`tight`); + } else if (slave.vagina > 3) { + r.push(`loose`); + } + r.push(`pussy,`); + } else { + r.push(`an enema to clean ${his}`); + if (slave.anus < 2) { + r.push(`tight`); + } else if (slave.anus < 3) { + r.push(`used`); + } else { + r.push(`gaping`); + } + r.push(`butthole,`); + } + switch (slave.assignment) { + case "work in the brothel": + r.push(`just like ${he} does between each customer.`); + break; + case "serve in the club": + r.push(`just like ${he} does in the club.`); + break; + case "work in the dairy": + r.push(`to avoid besmirching the nice clean dairy.`); + break; + case "work as a farmhand": + r.push(`to avoid tainting the food in ${V.farmyardName}.`); + break; + case "work as a servant": + r.push(`mostly to keep everything ${he} has to clean from getting any dirtier.`); + break; + case "work as a nanny": + r.push(`before hurrying to continue taking care of the children in ${V.nurseryName}.`); + break; + case "whore": + r.push(`before returning to offering it for sale.`); + break; + case "serve the public": + r.push(`before returning to offering it for free.`); + break; + case "rest": + r.push(`before crawling back into bed.`); + break; + case "get milked": + if (slave.lactation > 0) { + r.push(`before going to get ${his} uncomfortably milk-filled tits drained.`); + } else { + r.push(`and then rests until ${his} balls are ready to be drained again.`); + } + break; + case "be a servant": + r.push(`since ${his} chores didn't perform themselves while you used ${his} fuckhole.`); + break; + case "please you": + r.push(`before returning to await your next use of ${his} fuckhole, as though nothing had happened.`); + break; + case "be a subordinate slave": + r.push(`though it's only a matter of time before another slave decides to play with ${his} fuckhole.`); + break; + case "be your Head Girl": + r.push(`worried that ${his} charges got up to trouble while ${he} enjoyed ${his} ${getWrittenTitle(slave)}'s use.`); + break; + case "guard you": + r.push(`so ${he} can be fresh and ready for more sexual use even as ${he} guards your person.`); + break; + case "train slaves": + r.push(`before ${he} returns to teaching ${his} classes.`); + break; + default: + r.push(`before ${he} returns to ${slave.assignment}.`); + } + } + } + App.Events.addParagraph(node, r); + return node; +}; + diff --git a/src/npc/interaction/fVagina.tw b/src/npc/interaction/fVagina.tw deleted file mode 100644 index ce7f8a76e85719e63c4a72885c06d51de5c93611..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fVagina.tw +++ /dev/null @@ -1,557 +0,0 @@ -:: FVagina [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> - -You call $him over so you can -<<if (getSlave($AS).vagina >= 10)>> - tickle $his cavernous hole. -<<elseif (getSlave($AS).vagina > 3)>> - use $his gaping vagina. -<<elseif (getSlave($AS).vagina == 3)>> - fuck $his loose cunt. -<<elseif (getSlave($AS).vagina == 2)>> - fuck $his whorish cunt. -<<elseif (getSlave($AS).vagina == 1)>> - fuck $his tight cunt. -<<elseif (getSlave($AS).vagina == 0)>> - take $his virginity. -<</if>> - -<<if (getSlave($AS).vaginaTat == "tribal patterns")>> - The tattoos on $his abdomen certainly drawn attention there. -<<elseif (getSlave($AS).vaginaTat == "scenes")>> - The tattoos on $his abdomen nicely illustrate what you mean to do to $him. -<<elseif (getSlave($AS).vaginaTat == "degradation")>> - The tattoos on $his abdomen ask you to, after all. -<<elseif (getSlave($AS).vaginaTat == "lewd crest")>> - The crest on $his abdomen screams debauchery and implores you to use $him. -<</if>> - -<<if getSlave($AS).devotion <= 20>> - <<if getSlave($AS).clit == 1 && getSlave($AS).foreskin>> - $His big clit peeks out from under its hood. - <<elseif getSlave($AS).clit == 2>> - $His huge clit is impossible to miss. - <<elseif getSlave($AS).clit > 2>> - $His pseudophallus-sized clit is soft. - <</if>> - <<if getSlave($AS).labia == 1>> - $His lovely petals are quite inviting. - <<elseif getSlave($AS).labia == 2>> - $His prominent petals are inviting. - <<elseif getSlave($AS).labia > 2>> - $His labia are so large they present a slight obstacle to entry. - <</if>> - <<if getSlave($AS).vaginaLube > 1>> - $He may not want it, but that doesn't stop $his pussy from getting nice and wet for you. - <</if>> -<<else>> - <<if getSlave($AS).clit == 1 && getSlave($AS).foreskin>> - $His big, hard clit peeks out from under its hood. - <<elseif getSlave($AS).clit == 2>> - $His huge, stiff clit is impossible to miss. - <<elseif getSlave($AS).clit > 2>> - $His pseudophallus-sized clit is engorged with arousal. - <</if>> - <<if getSlave($AS).labia == 1>> - $His lovely petals are moist with arousal. - <<elseif getSlave($AS).labia == 2>> - $His prominent petals bear a sheen of arousal. - <<elseif getSlave($AS).labia > 2>> - $His huge labia are almost dripping with arousal. - <</if>> - <<if getSlave($AS).vaginaLube > 1>> - A steady stream of lube leaks from $his pussy in preparation to receive you. - <</if>> -<</if>> - -<<if (getSlave($AS).vaginaPiercing > 1)>> - <<if (getSlave($AS).vagina != -1)>> - $His pierced lips and clit have $him nice and wet. - <</if>> - <<if (getSlave($AS).dick != 0)>> - Metal glints all up and down $his cock. - <</if>> -<<elseif (getSlave($AS).vaginaPiercing == 1)>> - <<if (getSlave($AS).vagina != -1)>> - $His pierced clit has $him nice and moist. - <</if>> - <<if (getSlave($AS).dick != 0)>> - Metal glints at the head of $his cock. - <</if>> -<</if>> - -<<if $PC.pregMood == 2 && $PC.preg >= 28>> - <<set _fPosition = either(50,50,50,90)>> - <<set _fSpeed = 90>> -<<elseif $PC.pregMood == 1 && $PC.preg >= 28>> - <<set _fPosition = random(1,40)>> - <<set _fSpeed = 10>> -<<elseif $PC.belly >= 3000>> - <<set _fPosition = random(1,80)>> - <<set _fSpeed = random(1,75)>> -<<else>> - <<set _fPosition = random(1,100)>> - <<set _fSpeed = random(1,100)>> -<</if>> - -<<if canMove(getSlave($AS)) && getSlave($AS).fetish != "mindbroken">> - You decide to fuck $him - <<if (_fPosition <= 20)>> - in the missionary position. - <<if getSlave($AS).bellyPreg >= 600000>> - A position that will be a challenge due to $his immense pregnancy. - <<elseif getSlave($AS).belly >= 600000>> - A position that will be a challenge due to $his immense stomach. - <<elseif getSlave($AS).bellyPreg >= 300000>> - A position that will be difficult due to $his massive pregnancy. - <<elseif getSlave($AS).belly >= 300000>> - A position that will be difficult due to $his massive stomach. - <<elseif getSlave($AS).belly+$PC.belly >= 20000 && getSlave($AS).belly >= 1500 && $PC.belly >= 1500>> - A position that will be difficult with the combined size of your rounded middles. - <</if>> - You tell $him to lie down on the couch next to your desk. - <<elseif (_fPosition <= 40)>> - in the cowgirl position. You lie on the couch beside your desk and tell $him to straddle you, facing towards you. - <<if getSlave($AS).bellyPreg >= 600000>> - A position that will smother you with $his immense pregnancy. - <<elseif getSlave($AS).belly >= 600000>> - A position that will smother you with $his immense stomach. - <<elseif getSlave($AS).bellyPreg >= 300000>> - A position that will allow you to tease $his massive pregnancy as you fuck $him. - <<elseif getSlave($AS).belly >= 300000>> - A position that will allow you to tease $his massive belly as you fuck $him. - <<elseif getSlave($AS).belly+$PC.belly >= 20000 && getSlave($AS).belly >= 1500 && $PC.belly >= 1500>> - A position that will be awkward with the combined size of your rounded middles. - <</if>> - <<elseif (_fPosition <= 60)>> - doggy-style. You tell $him to get on the couch beside your desk on $his <<if hasAnyArms(getSlave($AS))>>hand<<if hasBothArms(getSlave($AS))>>s<</if>><<if hasAnyLegs(getSlave($AS))>> and <</if>><</if>><<if hasAnyLegs(getSlave($AS))>>knee<<if hasBothLegs(getSlave($AS))>>s<</if>><</if>>. - <<if getSlave($AS).bellyPreg >= 600000>> - As $he struggles to fit on the couch, you tell $him to just lean over $his immense pregnancy instead. - <<elseif getSlave($AS).belly >= 600000>> - As $he struggles to fit on the couch, you tell $him to just lean over $his immense belly instead. - <<elseif getSlave($AS).bellyPreg >= 300000>> - A position that leaves $his rear high in the air thanks to $his massive pregnancy. - <<elseif getSlave($AS).belly >= 300000>> - A position that leaves $his rear high in the air thanks to $his massive stomach. - <</if>> - <<if $PC.belly >= 5000>> - $His back will make a good rest for your gravid middle. - <</if>> - <<elseif (_fPosition <= 80)>> - in the reverse cowgirl position. You lie on the couch beside your desk and tell $him to straddle you facing away from you. - <<if getSlave($AS).bellyPreg >= 600000>> - A position that will much more comfortable for $his immense pregnancy and won't crush you under its mass. - <<elseif getSlave($AS).belly >= 600000>> - A position that will much more comfortable for $his immense belly and won't crush you under its mass. - <<elseif getSlave($AS).bellyPreg >= 300000>> - A position that will much more comfortable for $his massive pregnancy. - <<elseif getSlave($AS).belly >= 300000>> - A position that will much more comfortable for $his massive belly. - <</if>> - <<else>> - in the wheelbarrow position. You tell $him to get on the couch beside your desk, stand next to $him and lift $his legs up into the air. - <<if getSlave($AS).bellyPreg >= 600000>> - $His pregnancy is so immense it reaches the floor even as you hold $him saving you the trouble of bearing its weight. - <<elseif getSlave($AS).belly >= 600000>> - $His belly is so immense it reaches the floor even as you hold $him saving you the trouble of bearing its weight. - <<elseif getSlave($AS).bellyPreg >= 300000>> - You hope you don't strain something supporting $his massive pregnancy. - <<elseif getSlave($AS).belly >= 300000>> - You hope you don't strain something supporting $his massive belly. - <</if>> - <</if>> -<</if>> - -<<if (getSlave($AS).vagina == 0) && canDoVaginal(getSlave($AS))>> - <<if (getSlave($AS).fetish == "mindbroken")>> - $He accepts your orders dumbly and presents $his virgin pussy for defloration<<if ($PC.dick == 0)>>, watching without real interest as you don a strap-on<</if>>. Since $he is mindbroken, <span class="virginity loss">losing $his virginity</span> has no impact on any part of $him other than $his vagina. - <<elseif (getSlave($AS).devotion > 20)>> - $He accepts your orders without comment and presents $his virgin pussy for defloration<<if ($PC.dick == 0)>>, watching with some small trepidation as you don a strap-on<</if>>. You gently ease into $his pussy before gradually increasing the intensity of your thrusts into $him. Before long, $he's moaning loudly as you pound away. Since $he is already well broken, this new connection with $his <<= getWrittenTitle(getSlave($AS))>> <span class="devotion inc">increases $his devotion to you.</span> <span class="virginity loss">$His pussy has been broken in.</span> $He looks forward to having $his pussy fucked by you again. - <<set getSlave($AS).devotion += 10>> - <<elseif (getSlave($AS).devotion >= -20)>> - $He is clearly unhappy at losing $his pearl of great price to you; this probably isn't what $he imagined $his first real sex would be like.<<if ($PC.dick == 0)>>$His lower lip quivers with trepidation as $he watches you don a strap-on and maneuver to fuck $his virgin hole.<</if>> You gently ease into $his pussy before gradually increasing the intensity of your thrusts into $him. Before long, $he's moaning as you pound away. Nevertheless, this new connection with $his <<= getWrittenTitle(getSlave($AS))>> <span class="devotion inc">increases $his devotion to you.</span> <span class="virginity loss">$His pussy has been broken in,</span> and $he is <span class="trust dec">fearful</span> that sex will continue to be painful. - <<set getSlave($AS).devotion += 4, getSlave($AS).trust -= 4>> - <<else>> - As you anticipated, $he refuses to give you $his virginity. And as you expected, $he is unable to resist you. $He cries as <<if ($PC.dick == 0)>>your strap-on<<else>>your cock<</if>> opens $his fresh, tight hole. You force your way into $his pussy and continue thrusting into $him. $He sobs and cries with horror as you pound away. The rape @@.devotion.dec;decreases $his devotion to you.@@ <span class="virginity loss">$His pussy has been broken in,</span> and $he <span class="trust dec">fears further abuse.</span> - <<set getSlave($AS).devotion -= 4, getSlave($AS).trust -= 4>> - <</if>> - <<set getSlave($AS).vagina++>> -<<elseif (getSlave($AS).fetish == "mindbroken")>> - Since $his mind is gone, $he's yours to use as a human sex doll. You throw $him over the couch and amuse yourself with $him for a while; $his body retains its instinctual responses, at least. You finish inside $him and leave your toy for one of your other slaves to clean and maintain. -<<elseif isAmputee(getSlave($AS))>> - Since $he's a quadruple amputee, $he's yours to use as a human sex toy. You set $him - <<if ($PC.dick != 0)>> - <<if getSlave($AS).belly >= 300000>> - atop $his massive stomach and <<if _fSpeed > 75>>fuck $him hard and fast<<elseif _fSpeed > 50>>fuck $him firmly and vigorously<<elseif _fSpeed > 25>>fuck $him steadily and controlled<<else>>fuck $him slowly and tenderly<</if>>, managing $him with your arms as you go. - <<else>> - atop your cock and slide $him up and down<<if _fSpeed > 75>>, hard and fast<<elseif _fSpeed > 50>>, firmly and vigorously<<elseif _fSpeed > 25>>, steadily and controlled<<else>>, slowly and tenderly<</if>>, managing $him with your arms. - <</if>> - <<if getSlave($AS).dick > 0>> - <<if getSlave($AS).chastityPenis == 1>> - $His dick chastity keeps $his useless bitchclit out of the way. - <<elseif !canAchieveErection(getSlave($AS))>> - As you use $him as a helpless cock jacket, $his - <<if getSlave($AS).dick < 7>> - flaccid dick flops around, ignored. - <<else>> - massive dick flops against you, no longer able to get hard. - <</if>> - <<else>> - As you use $him as a helpless cock jacket, your pounding keeps $his prick stiff. - <</if>> - <</if>> - You finish inside $him and leave your toy for one of your other slaves to clean and maintain. - <<else>> - on the couch and straddle $his hips, bringing your already-wet pussy <<if _fSpeed > 75>>hard against $him. You grind powerfully<<elseif _fSpeed > 50>>firmly against $him. You grind vigorously<<elseif _fSpeed > 25>>against $him. You grind steadily<<else>>softly against $him. You grind gently<</if>> against $his helpless body, using $him as a living sybian until $his warmth and movement brings you to orgasm. - <</if>> -<<elseif tooBigBelly(getSlave($AS))>> - You tell $him to get situated on the couch, face-down. This position pins $him down by the massive weight of $his belly, pushing $his face in amongst the cushions and keeping $his crotch in the ideal position to penetrate. $His belly serves as an anchor, allowing you to take $him doggy style without any real contribution from $him. The position muffles $his reaction entirely, other than the rhythmic jiggling of $his bulging belly as it sticks out from either side of $his torso as you <<if _fSpeed > 75>>pound $him hard and fast<<elseif _fSpeed > 50>>pound $him firmly and vigorously<<elseif _fSpeed > 25>>fuck $him steadily<<else>>fuck $him slowly and tenderly<</if>>. -<<elseif tooBigBreasts(getSlave($AS))>> - You tell $him to get situated on the couch, face-down. This position pins $him down by the massive weight of $his tits, pushing $his face in amongst the cushions. $His tits serve as an anchor, allowing you to take $him doggy style without any real contribution from $him. The position muffles $his reaction entirely, other than the rhythmic jiggling of the breastflesh that sticks out to either side of $his torso as you <<if _fSpeed > 75>>pound $him hard and fast<<elseif _fSpeed > 50>>pound $him firmly and vigorously<<elseif _fSpeed > 25>>fuck $him steadily<<else>>fuck $him slowly and tenderly<</if>>. -<<elseif tooBigButt(getSlave($AS))>> - You tell $him to get situated on the couch, face-up. This position pins $him down by the massive weight of $his rear, causing $him to sink into the cushions. $His ass serves as an anchor, allowing you to take $him in the missionary position without any real contribution from $him. This lets you clearly see $his reaction, as well as the rhythmic jiggling of the buttflesh that sticks out to either side of $his hips as you <<if _fSpeed > 75>>pound $him hard and fast<<elseif _fSpeed > 50>>pound $him firmly and vigorously<<elseif _fSpeed > 25>>fuck $him steadily<<else>>fuck $him slowly and tenderly<</if>>. -<<elseif tooBigBalls(getSlave($AS))>> - You tell $him to get situated on the couch, doggy style. This position pins $him down by the massive weight of $his balls. $His testicles serve as an anchor, allowing you to take $him doggy style without any real concern of getting struck by $his massive nuts. The position keeps $his balls completely still where they rest on the couch, so you don't have to worry about them getting in the way as you <<if _fSpeed > 75>>pound $him hard and fast<<elseif _fSpeed > 50>>pound $him firmly and vigorously<<elseif _fSpeed > 25>>fuck $him steadily<<else>>fuck $him slowly and tenderly<</if>>. -<<elseif (getSlave($AS).fetish == "submissive") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1) && ($PC.dick != 0)>> - $He comes over, smiling a little submissive smile, and spreads $himself for you. You take $him on the couch next to your desk after $he gets into position. - <<if (_fPosition <= 20)>> /* missionary */ - <<if getSlave($AS).bellyPreg >= 600000>> - <<if $PC.belly >= 5000>> - You have to heft $his gravid body up and slip under $his expansive middle to position yourself for penetration. With your own baby bump in the way, it's a complicated maneuver, but once you manage to get in, you rest your head against $his bulging belly and feel the movements within as you thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> into $him; - <<else>> - You have to heft $his gravid body up and slip under $his expansive middle to position yourself for penetration. But once you are seated, you rest your head against $his bulging belly and feel the movements within as you thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> into $him; - <</if>> - <<elseif getSlave($AS).belly >= 600000>> - <<if $PC.belly >= 5000>> - You have to heft $his weighty body up and slip under $his expansive middle to position yourself for penetration. With your own gravid swell in the way, it's a complicated maneuver, but once you manage to get in, you rest your head against $his immense belly and feel the force of your <<if _fSpeed > 75>>fast, hard<<elseif _fSpeed > 50>>vigorous, firm<<elseif _fSpeed > 25>>steady<<else>>slow, tender<</if>> thrusts running through $him; - <<else>> - You have to heft $his weighty body up and slip under $his expansive middle to position yourself for penetration. But once you are seated, you rest your head against $his immense belly and feel the force of your <<if _fSpeed > 75>>fast, hard<<elseif _fSpeed > 50>>vigorous, firm<<elseif _fSpeed > 25>>steady<<else>>slow, tender<</if>> thrusts running through $him; - <</if>> - <<elseif getSlave($AS).bellyPreg >= 300000>> - You have to heft $his gravid body up to position yourself for penetration. But once you are mounted, you rest your head against $his bulging belly and feel the movements within as you thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> into $him; - <<elseif getSlave($AS).belly >= 300000>> - You have to heft $his weighty body up to position yourself for penetration. But once you are mounted, you rest your head against $his massive stomach and feel the force of your <<if _fSpeed > 75>>fast, hard<<elseif _fSpeed > 50>>vigorous, firm<<elseif _fSpeed > 25>>steady<<else>>slow, tender<</if>> thrusts running through $him; - <<else>> - $He hugs $his torso to you and - <<if getSlave($AS).belly+$PC.belly >= 20000 && getSlave($AS).belly >= 1500 && $PC.belly >= 1500>> - your bellies bulge lewdly against each other; - <<elseif getSlave($AS).belly >= 5000>> - pushes $his belly against your stomach; - <<elseif $PC.belly >= 5000>> - pushes your belly into $his stomach; - <<elseif $PC.boobs >= 1400>> - $his breasts press against your own enormous<<if $PC.boobsImplant/$PC.boobs >= .60>>, hard<<else>>, soft<</if>> breasts; - <<elseif $PC.boobs >= 1200>> - $his breasts press against your own huge<<if $PC.boobsImplant/$PC.boobs >= .60>>, firm<<else>>, soft<</if>> breasts; - <<elseif $PC.boobs >= 1000>> - $his breasts press against your own big<<if $PC.boobsImplant/$PC.boobs >= .60>>, perky<</if>> breasts; - <<elseif $PC.boobs >= 800>> - $his breasts press against your own generous breasts; - <<elseif $PC.boobs >= 650>> - $his breasts press against your own breasts; - <<elseif $PC.boobs >= 500>> - $his breasts press against your own average breasts; - <<elseif $PC.boobs >= 300>> - $his breasts press against your own small breasts; - <<elseif $PC.title == 0>> - $his breasts press against your flat breasts; - <<else>> - $his breasts press against your chest; - <</if>> - <</if>> - <<elseif (_fPosition <= 40)>> /* cowgirl */ - <<if getSlave($AS).bellyPreg >= 600000>> - You wrap your arms around $his boundless pregnancy as you thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> into $him and enjoy the feeling of so much movement squirming against your face; - <<elseif getSlave($AS).belly >= 600000>> - You wrap your arms around $his boundless stomach as you thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> into $him and enjoy the feeling of your every move running through $his belly; - <<elseif getSlave($AS).bellyPreg >= 300000>> - $He does $his best to not suffocate you with $his massive belly or knock you out with it as you thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> into $him. You get a face full of pregnancy with each downward motion; - <<elseif getSlave($AS).belly >= 300000>> - $He does $his best to not suffocate you with $his massive belly or knock you out with it as you thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> into $him. You get a face full of implant with each downward motion; - <<else>> - $He <<if hasAnyArms(getSlave($AS))>>puts $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> on your chest and <</if>>leans forward as you continue to thrust <<if _fSpeed > 75>>hard<<elseif _fSpeed > 50>>vigorously<<elseif _fSpeed > 25>>steadily<<else>>tenderly<</if>> upwards; - <</if>> - <<elseif (_fPosition <= 60)>> /* doggy-style */ - <<if getSlave($AS).bellyPreg >= 300000>> - $He arches $his back as you continue to pound $him <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>>, $his occupants enjoying the attention. As you rest your weight on $him, you run your hands along $his distended sides; - <<elseif getSlave($AS).belly >= 300000>> - $He arches $his back as you continue to pound $him <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>>, $his belly jiggling just slightly with each thrust. As you rest your weight on $him, you run your hands along $his distended sides; - <<else>> - $He arches $his back as you continue to pound $him <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>>; - <</if>> - <<elseif (_fPosition <= 80)>> /* reverse cowgirl */ - <<if getSlave($AS).bellyPreg >= 300000>> - You may have to spread your legs extra wide to accommodate $his impressive baby bump, but the angle and pressure it puts on you feels amazing. $He <<if hasAnyArms(getSlave($AS))>>puts $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> on your chest and <</if>>starts to lean back as you continue to thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> upwards, in return you caress $his distended sides; - <<elseif getSlave($AS).belly >= 300000>> - You may have to spread your legs extra wide to accommodate $his impressive belly, but the angle and pressure it puts on you feels amazing. $He <<if hasAnyArms(getSlave($AS))>>puts $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> on your chest and <</if>>starts to lean back as you continue to thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> upwards, in return you caress $his distended sides; - <<else>> - $He <<if hasAnyArms(getSlave($AS))>>puts $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> on your chest and <</if>>starts to lean back as you continue to thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> upwards; - <</if>> - <<else>> /* wheelbarrow */ - <<if getSlave($AS).belly >= 600000>> - With all $his weight handled, you can keep <<if _fSpeed > 75>>furiously<<elseif _fSpeed > 50>>vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> pounding without your arms getting tired; - <<elseif getSlave($AS).bellyPreg >= 300000>> - Before long both of your strength begins to wane, causing $his belly to touch the floor. With some of the weight off of the both of you, you keep on <<if _fSpeed > 75>>furiously<<elseif _fSpeed > 50>>vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> pounding; - <<elseif getSlave($AS).belly >= 300000>> - Before long both of your strength begins to wane, causing $his belly to touch the floor. With some of the weight off of the both of you, you keep on <<if _fSpeed > 75>>furiously<<elseif _fSpeed > 50>>vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> pounding; - <<else>> - $He begins to tire as you keep <<if _fSpeed > 75>>furiously<<elseif _fSpeed > 50>>vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> pounding; - <</if>> - <</if>> - you can feel <<if getSlave($AS).bellyPreg >= 300000>>$his child<<if getSlave($AS).pregType > 0>>ren<</if>> begin to squirm in reaction to their mother's lust<<else>>$his heart beating hard<</if>>. As the sex reaches its climax, $he begs you to cum inside $his unworthy body. - <<if (getSlave($AS).dick != 0) && canAchieveErection(getSlave($AS))>> - <<if getSlave($AS).chastityPenis == 1>> - $He does $his submissive best to stay completely soft within $his dick chastity. - <<else>> - As a submissive $he spares no attention for $his own orgasm, so $his rock hard erection swings untended. - <</if>> - <<elseif (getSlave($AS).chastityPenis == 1)>> - $His cock is forgotten inside its chastity cage as you take what you want from $him. - <<elseif (getSlave($AS).dick != 0)>> - As a submissive $he spares no attention for $his own orgasm, so $his flaccid cock swings untended. - <</if>> - <<if $PC.vagina != -1>> - When you finally climax, you pull out and press your wet cunt against $his mouth, letting $his lavish attention on you that brings you to another quick orgasm. - <<set getSlave($AS).counter.oral += 1>> - <<set $oralTotal += 1>> - <</if>> -<<elseif getSlave($AS).devotion < -20>> - $He tries to refuse, so you - <<if ($PC.dick != 0)>> - bend the disobedient slave over your desk and take $him hard from behind. $His breasts <<if (getSlave($AS).dick != 0)>>and cock <</if>>slide back and forth across the desk. You give $his buttocks some nice hard swats as you pound $him. $He grunts and moans but knows better than to try to get away. - <<if (getSlave($AS).dick != 0) && canAchieveErection(getSlave($AS))>> - Despite $his unwillingness to be raped, the stimulation - <<if getSlave($AS).chastityPenis>> - starts to give $him an erection, which $his dick chastity makes horribly uncomfortable. $He bucks with the pain, $his hole spasming delightfully. - <<else>> - gives $him an erection. $He's mortified that $he would get hard while being raped. - <</if>> - <<elseif (getSlave($AS).chastityPenis == 1)>> - $His dick chastity keeps $his bitch cock hidden away while you use $his whore hole. - <<elseif (getSlave($AS).dick != 0)>> - $His flaccid dick is ground into the back of the couch as you rape $him. - <</if>> - <<if $PC.vagina != -1>> - After your first orgasm, you pull out and grind your pussy against $his face for another, enjoying the stimulation of $his muffled crying. - <<set getSlave($AS).counter.oral += 1>> - <<set $oralTotal += 1>> - <</if>> - <<else>> - stand and seize $him, shoving $him down to sit in your chair. You jump atop $his hips, pinning $him down into the chair with your legs and pressing your pussy hard against $his groin. $He struggles and whimpers, but you give $him a hard warning slap to the cheek and kiss $his unwilling mouth, forcing your tongue past $his lips as you grind against $him. - <</if>> -<<elseif getSlave($AS).devotion <= 20>> - <<if ($PC.dick != 0)>> - $He obeys, lying on the couch next to your desk<<if hasAnyLegs(getSlave($AS))>> with $his leg<<if hasBothLegs(getSlave($AS))>>s spread<<else>> moved aside<</if>><</if>>. You kneel on the ground and enter $him<<if hasAnyLegs(getSlave($AS))>>, a hand on <<if hasBothLegs(getSlave($AS))>>each of $his legs<<else>>$his leg<</if>> to give you a good grip<</if>>. <<if _fSpeed > 75>>The pounding is hard and fast<<elseif _fSpeed > 50>>You pound $him firmly and vigorously<<elseif _fSpeed > 25>>You fuck $him steadily and controlled<<else>>You fuck $him slowly and tenderly<</if>>, and $he gasps and <<if _fSpeed > 50>>whines<<else>>moans<</if>>. You reach a hand down to maul $his breasts. - <<if (getSlave($AS).dick != 0) && canAchieveErection(getSlave($AS))>> - <<if (getSlave($AS).chastityPenis == 1)>> - $He enjoys $himself, even though $his dick chastity keeps $him soft by making the beginnings of erection very uncomfortable. - <<else>> - $He bites $his lip and moans as $he climaxes. You fill $his squeezing fuckhole with your cum. $He already dribbled $his own weak load all over $his stomach. - <</if>> - <<elseif (getSlave($AS).chastityPenis == 1)>> - $He bites $his lip and moans as $he climaxes. You fill $his squeezing fuckhole with your cum. Precum has been dribbling out of $his dick chastity for some time, apparently the best $his soft bitchclit can manage. - <<elseif (getSlave($AS).dick != 0)>> - $He bites $his lip and moans as $he climaxes. You fill $his squeezing fuckhole with your cum. $He already blew $his own load all over $his stomach despite $his inability to get hard. - <</if>> - <<if $PC.vagina != -1>> - You got so wet fucking $him that when you climax, you stand up and let $him clean your pussy with $his mouth. The oral attention brings you to a quick aftershock orgasm. - <<set getSlave($AS).counter.oral += 1>> - <<set $oralTotal += 1>> - <</if>> - <<else>> - You pat the tops of your thighs, and $he obediently comes over to sit atop them, wrapping $his legs around you. Your hands reach around $him and seize $his buttocks, drawing $him in even closer so that the warmth between $his legs is pressed hard against your pussy. $He grinds dutifully against you, only pausing for a moment when $he finds your insistent tongue probing past $his lips. - <</if>> -<<else>> - <<if ($PC.dick != 0)>> - $He skips over smiling and gives you a quick kiss. You take $him on the couch next to your desk after $he gets into position. - <<if (_fPosition <= 20)>> /* missionary */ - <<if getSlave($AS).bellyPreg >= 600000>> - <<if $PC.belly >= 5000>> - You have to heft $his gravid body up and slip under $his expansive middle to position yourself for penetration. With your own baby bump in the way, it's a complicated maneuver, but once you manage to get in, you rest your head against $his bulging belly and feel the movements within as you thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> into $him; - <<else>> - You have to heft $his gravid body up and slip under $his expansive middle to position yourself for penetration. But once you are seated, you rest your head against $his bulging belly and feel the movements within as you thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> into $him; - <</if>> - <<elseif getSlave($AS).belly >= 600000>> - <<if $PC.belly >= 5000>> - You have to heft $his weighty body up and slip under $his expansive middle to position yourself for penetration. With your own gravid swell in the way, it's a complicated maneuver, but once you manage to get in, you rest your head against $his immense belly and feel the force of your <<if _fSpeed > 75>>fast, hard<<elseif _fSpeed > 50>>vigorous, firm<<elseif _fSpeed > 25>>steady<<else>>slow, tender<</if>> thrusts running through $him; - <<else>> - You have to heft $his weighty body up and slip under $his expansive middle to position yourself for penetration. But once you are seated, you rest your head against $his immense belly and feel the force of your <<if _fSpeed > 75>>fast, hard<<elseif _fSpeed > 50>>vigorous, firm<<elseif _fSpeed > 25>>steady<<else>>slow, tender<</if>> thrusts running through $him; - <</if>> - <<elseif getSlave($AS).bellyPreg >= 300000>> - You have to heft $his gravid body up to position yourself for penetration. But once you are mounted, you rest your head against $his bulging belly and feel the movements within as you thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> into $him; - <<elseif getSlave($AS).belly >= 300000>> - You have to heft $his weighty body up to position yourself for penetration. But once you are mounted, you rest your head against $his massive stomach and feel the force of your <<if _fSpeed > 75>>fast, hard<<elseif _fSpeed > 50>>vigorous, firm<<elseif _fSpeed > 25>>steady<<else>>slow, tender<</if>> thrusts running through $him; - <<else>> - $He hugs $his torso to you and - <<if getSlave($AS).belly+$PC.belly >= 20000 && getSlave($AS).belly >= 1500 && $PC.belly >= 1500>> - your bellies bulge lewdly against each other; - <<elseif getSlave($AS).belly >= 5000>> - pushes $his belly against your stomach; - <<elseif $PC.belly >= 5000>> - pushes your belly into $his stomach; - <<elseif $PC.boobs >= 1400>> - $his breasts press against your own enormous<<if $PC.boobsImplant/$PC.boobs >= .60>>, hard<<else>>, soft<</if>> breasts; - <<elseif $PC.boobs >= 1200>> - $his breasts press against your own huge<<if $PC.boobsImplant/$PC.boobs >= .60>>, firm<<else>>, soft<</if>> breasts; - <<elseif $PC.boobs >= 1000>> - $his breasts press against your own big<<if $PC.boobsImplant/$PC.boobs >= .60>>, perky<</if>> breasts; - <<elseif $PC.boobs >= 800>> - $his breasts press against your own generous breasts; - <<elseif $PC.boobs >= 650>> - $his breasts press against your own breasts; - <<elseif $PC.boobs >= 500>> - $his breasts press against your own average breasts; - <<elseif $PC.boobs >= 300>> - $his breasts press against your own small breasts; - <<elseif $PC.title == 0>> - $his breasts press against your flat breasts; - <<else>> - $his breasts press against your chest; - <</if>> - <</if>> - <<elseif (_fPosition <= 40)>> /* cowgirl */ - <<if getSlave($AS).bellyPreg >= 600000>> - You wrap your arms around $his boundless pregnancy as you thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> into $him and enjoy the feeling of so much movement squirming against your face; - <<elseif getSlave($AS).belly >= 600000>> - You wrap your arms around $his boundless stomach as you thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> into $him and enjoy the feeling of your every move running through $his belly; - <<elseif getSlave($AS).bellyPreg >= 300000>> - $He does $his best to not suffocate you with $his massive belly or knock you out with it as you thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> into $him. You get a face full of pregnancy with each downward motion; - <<elseif getSlave($AS).belly >= 300000>> - $He does $his best to not suffocate you with $his massive belly or knock you out with it as you thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> into $him. You get a face full of implant with each downward motion; - <<else>> - $He <<if hasAnyArms(getSlave($AS))>>puts $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> on your chest and <</if>>leans forward as you continue to thrust <<if _fSpeed > 75>>hard<<elseif _fSpeed > 50>>vigorously<<elseif _fSpeed > 25>>steadily<<else>>tenderly<</if>> upwards; - <</if>> - <<elseif (_fPosition <= 60)>> /* doggy-style */ - <<if getSlave($AS).bellyPreg >= 300000>> - $He arches $his back as you continue to pound $him <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>>, $his occupants enjoying the attention. As you rest your weight on $him, you run your hands along $his distended sides; - <<elseif getSlave($AS).belly >= 300000>> - $He arches $his back as you continue to pound $him <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>>, $his belly jiggling just slightly with each thrust. As you rest your weight on $him, you run your hands along $his distended sides; - <<else>> - $He arches $his back as you continue to pound $him <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>>; - <</if>> - <<elseif (_fPosition <= 80)>> /* reverse cowgirl */ - <<if getSlave($AS).bellyPreg >= 300000>> - You may have to spread your legs extra wide to accommodate $his impressive baby bump, but the angle and pressure it puts on you feels amazing. $He <<if hasAnyArms(getSlave($AS))>>puts $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> on your chest and <</if>>starts to lean back as you continue to thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> upwards, in return you caress $his distended sides; - <<elseif getSlave($AS).belly >= 300000>> - You may have to spread your legs extra wide to accommodate $his impressive belly, but the angle and pressure it puts on you feels amazing. $He <<if hasAnyArms(getSlave($AS))>>puts $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> on your chest and <</if>>starts to lean back as you continue to thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> upwards, in return you caress $his distended sides; - <<else>> - $He <<if hasAnyArms(getSlave($AS))>>puts $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> on your chest and <</if>>starts to lean back as you continue to thrust <<if _fSpeed > 75>>hard and fast<<elseif _fSpeed > 50>>firmly and vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> upwards; - <</if>> - <<else>> /* wheelbarrow */ - <<if getSlave($AS).belly >= 600000>> - With all $his weight handled, you can keep <<if _fSpeed > 75>>furiously<<elseif _fSpeed > 50>>vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> pounding without your arms getting tired; - <<elseif getSlave($AS).bellyPreg >= 300000>> - Before long both of your strength begins to wane, causing $his belly to touch the floor. With some of the weight off of the both of you, you keep on <<if _fSpeed > 75>>furiously<<elseif _fSpeed > 50>>vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> pounding; - <<elseif getSlave($AS).belly >= 300000>> - Before long both of your strength begins to wane, causing $his belly to touch the floor. With some of the weight off of the both of you, you keep on <<if _fSpeed > 75>>furiously<<elseif _fSpeed > 50>>vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> pounding; - <<else>> - $He begins to tire as you keep <<if _fSpeed > 75>>furiously<<elseif _fSpeed > 50>>vigorously<<elseif _fSpeed > 25>>steadily<<else>>slowly and tenderly<</if>> pounding; - <</if>> - <</if>> - you can feel <<if getSlave($AS).bellyPreg >= 300000>>$his child<<if getSlave($AS).pregType > 0>>ren<</if>> begin to squirm in reaction to their mother's lust<<else>>$his heart beating hard<</if>>. - <<if (_fPosition <= 40) && getSlave($AS).belly+$PC.belly < 20000>> As the sex reaches its climax, $his kisses grow urgent and passionate. <</if>> - <<if (getSlave($AS).dick != 0) && canAchieveErection(getSlave($AS))>> - <<if (getSlave($AS).chastityPenis == 1)>> - $He enjoys $himself, even though $his dick chastity keeps $him soft by making the beginnings of erection very uncomfortable. - <<else>> - When you orgasm together, $his erect cock squirts cum up towards $his tits while your cock fills $him with cum. - <</if>> - <<elseif (getSlave($AS).chastityPenis == 1)>> - $He bites $his lip and moans as $he climaxes. You fill $his squeezing fuckhole with your cum. Precum has been dribbling out of $his dick chastity for some time, apparently the best $his soft bitchclit can manage. - <<elseif (getSlave($AS).dick != 0)>> - When you orgasm together, $his limp, neglected cock dribbles weakly while your cock fills $him with cum. - <<elseif (getSlave($AS).clit > 2)>> - As you fuck $him, $he plays with $his huge clit. It's so large it almost looks like $he's jacking off a cock. - <</if>> - <<if $PC.vagina != -1>> - You got so wet fucking $him that when you climax, you stand up; $he knows what that means, and hurries to eat you out. The oral attention brings you to a quick aftershock orgasm. - <<set getSlave($AS).counter.oral += 1>> - <<set $oralTotal += 1>> - <</if>> - <<else>> - You pat the tops of your thighs, and $he skips over smiling and gives you a quick kiss. Without breaking the lip lock, $he sits down, wrapping $his legs around you. Your hands reach around $him and seize $his buttocks, drawing $him in even closer so that the warmth between $his legs is pressed hard against your pussy, and you can play with $his asshole. $He grinds enthusiastically against you, moaning into your mouth with pleasure. - <</if>> -<</if>> - -<<= VCheck.Vaginal(getSlave($AS), 1)>> - -<<if (getSlave($AS).bellyPreg >= 1500)>> - The poor slave's belly gets in the way, but the added perversion of fucking a pregnant hole makes the inconvenience worthwhile. -<<elseif (getSlave($AS).bellyImplant >= 1500)>> - The poor slave's implant filled belly gets in the way, but the added perversion of fucking a $girl with such a round stomach makes the inconvenience worthwhile. -<<elseif (getSlave($AS).bellyFluid >= 1500)>> - The poor slave's sloshing belly gets in the way, but the added perversion of seeing it jiggle makes the inconvenience worthwhile. -<</if>> - -<<if (random(1,100) > (100 + getSlave($AS).devotion))>> - <<if (getSlave($AS).fetish != "pregnancy") && (getSlave($AS).energy <= 95) && (getSlave($AS).sexualFlaw != "hates penetration")>> - Being taken by force has given $him a @@.flaw.gain;hatred of penetration.@@ - <<set getSlave($AS).sexualFlaw = "hates penetration">> - <</if>> -<<elseif (random(1,100) > (110 - getSlave($AS).devotion))>> - <<if (getSlave($AS).fetish == "none") && (getSlave($AS).energy <= 95) && (getSlave($AS).sexualFlaw != "hates penetration") && (getSlave($AS).ovaries == 1 || getSlave($AS).mpreg == 1)>> - Enjoying sex with you seems to have @@.fetish.gain;encouraged $his biological clock.@@ - <<set getSlave($AS).fetish = "pregnancy", getSlave($AS).fetishKnown = 1, getSlave($AS).fetishStrength = 10>> - <</if>> -<</if>> - -<<if ($PC.dick != 0)>> - - <<if getSlave($AS).cervixImplant == 1 || getSlave($AS).cervixImplant == 3>> - <<set getSlave($AS).bellyImplant += random(10,20)>> - <</if>> - - <<if (getSlave($AS).vagina == 3)>> - Cum drips out of $his fucked-out hole. - <<elseif (getSlave($AS).vagina == 2)>> - Cum drips out of $his stretched vagina. - <<elseif (getSlave($AS).vagina == 1)>> - $His still-tight vagina keeps your load inside $him. - <<elseif (getSlave($AS).vagina < 0)>> - Cum drips out of $his girly ass. - <<else>> - Your cum slides right out of $his gaping hole. - <</if>> - - <<if canMove(getSlave($AS)) && $postSexCleanUp > 0>> - $He uses <<if getSlave($AS).vagina > 0>>a quick douche to clean $his <<if getSlave($AS).vagina < 2>>tight<<elseif getSlave($AS).vagina > 3>>loose<</if>> pussy<<else>>an enema to clean $his <<if getSlave($AS).anus < 2>>tight<<elseif getSlave($AS).anus < 3>>used<<else>>gaping<</if>> butthole<</if>>, - <<switch getSlave($AS).assignment>> - <<case "work in the brothel">> - just like $he does between each customer. - <<case "serve in the club">> - just like $he does in the club. - <<case "work in the dairy">> - to avoid besmirching the nice clean dairy. - <<case "work as a farmhand">> - to avoid tainting the food in $farmyardName. - <<case "work as a servant">> - mostly to keep everything $he has to clean from getting any dirtier. - <<case "work as a nanny">> - before hurrying to continue taking care of the children in $nurseryName. - <<case "whore">> - before returning to offering it for sale. - <<case "serve the public">> - before returning to offering it for free. - <<case "rest">> - before crawling back into bed. - <<case "get milked">> - <<if getSlave($AS).lactation > 0>>before going to get $his uncomfortably milk-filled tits drained<<else>>and then rests until $his balls are ready to be drained again<</if>>. - <<case "be a servant">> - since $his chores didn't perform themselves while you used $his fuckhole. - <<case "please you">> - before returning to await your next use of $his fuckhole, as though nothing had happened. - <<case "be a subordinate slave">> - though it's only a matter of time before another slave decides to play with $his fuckhole. - <<case "be your Head Girl">> - worried that $his charges got up to trouble while $he enjoyed $his <<= getWrittenTitle(getSlave($AS))>>'s use. - <<case "guard you">> - so $he can be fresh and ready for more sexual use even as $he guards your person. - <<case "train slaves">> - before $he returns to teaching $his classes. - <<default>> - before $he returns to <<= getSlave($AS).assignment>>. - <</switch>> - <</if>> -<</if>> diff --git a/src/npc/interaction/fillUpButt.js b/src/npc/interaction/fillUpButt.js new file mode 100644 index 0000000000000000000000000000000000000000..89c4f5087fc3b276af88a0d4b787bf61ac95d325 --- /dev/null +++ b/src/npc/interaction/fillUpButt.js @@ -0,0 +1,756 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fillUpButt = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself + } = getPronouns(slave); + + slave.bellyAccessory = "none"; + let _pregDiscovery = 0; + r.push(`You`); + switch (slave.inflationType) { + case "water": + case "aphrodisiac": + case "curative": + case "tightener": + r.push(`pull out an enema bag and`); + if (slave.inflation < 2) { + r.push(`a two liter bag of solution,`); + } else { + r.push(`a one gallon bag of solution,`); + } + break; + case "cum": + case "milk": + r.push(`attach a hose to ${V.dairyName} tap with the pipes set to pump ${slave.inflationType},`); + break; + case "urine": + r.push(`attach a hose to your penthouse's plumbing tap,`); + } + r.push(`before calling ${him} over so you can play with ${his}`); + if (slave.butt < 2) { + r.push(`flat, tight ass`); + } else if (slave.butt <= 2) { + r.push(`cute bottom`); + } else if (slave.butt <= 3) { + r.push(`round, firm rump`); + } else if (slave.butt <= 4) { + r.push(`curvy, enticing butt`); + } else if (slave.butt <= 5) { + r.push(`huge rear end`); + } else if (slave.butt <= 6) { + r.push(`massive, alluring rump`); + } else if (slave.butt <= 7) { + r.push(`enormous, hypnotic ass`); + } else if (slave.butt <= 10) { + r.push(`gigantic, jiggly rear`); + } else if (slave.butt <= 14) { + r.push(`inhuman, cushiony butt cheeks`); + } else if (slave.butt <= 20) { + r.push(`couch-like, super jiggly ass cheeks`); + } + r.push(`before shoving the equipment into ${his}`); + if (slave.anus > 3) { + r.push(`gaping anus.`); + } else if (slave.anus === 3) { + r.push(`loose anus.`); + } else if (slave.anus === 2) { + r.push(`well-used asshole.`); + } else if (slave.anus === 1) { + r.push(`tight butthole.`); + } else if (slave.anus === 0) { + r.push(`virgin butthole.`); + } + + if (slave.inflation > 1 && slave.preg > 1) { + r.push(`${He} looks uneasy at the prospect of that much fluid entering ${his} rear, far more than could be considered normal.`); + _pregDiscovery = 1; + } else { + if (slave.fetish === "buttslut" && slave.devotion >= -20) { + r.push(`${He}'s pleased at the prospect of you touching ${his} favorite body part.`); + } else if (slave.fetish === "cumslut" && slave.devotion >= -20 && slave.inflationType === "cum") { + r.push(`${He}'s pleased at the idea of turning into a cum balloon.`); + } + if (slave.inflationType === "cum" || slave.inflationType === "milk") { + if (slave.behavioralFlaw === "gluttonous" && slave.devotion >= -20) { + r.push(`${He}'s thrilled that you are going to give ${him} such a filling meal.`); + } else if (slave.behavioralFlaw === "anorexic" && slave.devotion >= -20) { + r.push(`${He}'s hesitant about whether or not you are trying to make ${him} gain weight.`); + } + } + } + + if (_pregDiscovery === 1) { + r.push(`Not wanting to risk such a mess, you send ${him} for a medical examination. While most of the tests come back normal, one in particular catches your eye; <span class="lime">${he} is pregnant${(slave.preg > slave.pregData.normalBirth/4) ? `and surprisingly far along` : ``}.</span> ${He} should be able to still handle at least two liters of ${slave.inflationType} up ${his} ass, however.`); + deflate(slave); + slave.pregKnown = 1; + } else if (slave.fetish === "mindbroken") { + if (canMove(slave)) { + r.push(`You instruct ${him} to present ${his} buttocks and anus but ${he} remains still and unresponsive. Talking to a broken mind is pointless.`); + } + r.push(`You reach around and grab ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`buttocks before rubbing along them, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. ${He} reacts to your initial touch as you rub fingers around ${his}`); + if (slave.anus > 3) { + r.push(`gaping anus,`); + } else if (slave.anus === 3) { + r.push(`loose anus,`); + } else if (slave.anus === 2) { + r.push(`well-used asshole,`); + } else if (slave.anus === 1) { + r.push(`tight butthole,`); + } else if (slave.anus === 0) { + r.push(`virgin butthole,`); + } + r.push(`but you understand it is only physiological. You continue to move around ${his} posterior gently reaching to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. You circle around ${his} anus but ${he} remains still. You keep squeezing ${his} buttocks tenderly — first one, then the other and then both but ${he} is like a doll in your grasp. You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and bend ${him} over your lap,`); + if (slave.inflation === 2) { + r.push(`${his} soft and jiggly ${slave.inflationType}-filled belly spilling over your legs.`); + } else if (slave.inflation === 1) { + r.push(`${his} ${slave.inflationType} distended belly resting on your legs.`); + } else { + r.push(`${his} belly resting on your legs.`); + } + r.push(`You look at ${his} rear while you squeeze ${his} cheeks and rub them with your firm hands. You explore the contours of ${his} posterior with both your eyes and hands, before picking up the hose and inserting it into ${his}`); + if (slave.anus > 3) { + r.push(`gaping`); + } else if (slave.anus === 3) { + r.push(`loose`); + } else if (slave.anus === 2) { + r.push(`well-used`); + } else if (slave.anus === 1) { + r.push(`tight`); + } else if (slave.anus === 0) { + r.push(`virgin`); + } + r.push(`butthole.`); + if (slave.inflation === 2) { + r.push(`${His} sloshing belly slowly grows even larger with ${slave.inflationType}. You rest a hand on ${his} back as ${his} swelling belly forces ${him} to rise off your lap. Once the enema is complete and ${he} is plugged, you push ${him} onto your desk and admire ${his} taut, ${slave.skin} stomach. You give the firm orb a slap, eliciting a slight grunt from the broken slave and no motion at all from ${his} gut. You order ${him} to keep ${himself} filled with two gallons of ${slave.inflationType} until you say otherwise.`); + } else if (slave.inflation === 1) { + r.push(`${His} bloated belly slowly swells even larger with ${slave.inflationType}. You slip a hand under ${his} stomach to feel it grow in your palm. Once the enema is complete and ${he} is plugged, you push ${him} onto your desk and admire ${his} jiggly, soft, ${slave.skin} stomach. You give the gut orb a slap, eliciting a slight grunt from the broken slave and whole bunch of wiggling and sloshing from ${his} middle. You order ${him} to keep ${himself} filled with four liters of ${slave.inflationType} until you say otherwise.`); + } else { + r.push(`${His} belly slowly swells with ${slave.inflationType}. You slip a hand under ${his} stomach to feel it grow in your palm. Once the enema is complete and ${he} is plugged, you push ${him} onto your desk and admire ${his} distended, ${slave.skin} stomach. You give the gut orb a slap, eliciting a slight grunt from the broken slave and touch of wiggling and sloshing from ${his} middle. You order ${him} to keep ${himself} filled with two liters of ${slave.inflationType} until you say otherwise.`); + } + } else if (slave.devotion < -20) { + if (canMove(slave)) { + r.push(`You instruct ${him} to present ${his} anus for a ${slave.inflationType} enema. Opposed to the thought of being filled`); + if (slave.inflation > 0) { + r.push(`more`); + } + r.push(`with ${slave.inflationType}, ${he} tries to`); + if (canWalk(slave)) { + r.push(`step back,`); + } else { + r.push(`crawl away,`); + } + r.push(`but you catch ${him} and pull ${him} closer to you as you reach around and grab ${his}`); + } else if (!isAmputee(slave)) { + r.push(`You instruct ${him} to present ${his} anus for a ${slave.inflationType} enema. ${He}'s opposed to the thought of being filled`); + if (slave.inflation > 0) { + r.push(`more`); + } + r.push(`with ${slave.inflationType}, but since ${he} is immobile, can't escape. You reach around and grab ${his}`); + } else { + r.push(`${He}'s opposed to the thought of being filled with`); + if (slave.inflation > 0) { + r.push(`more`); + } + r.push(`${slave.inflationType}, but as an amputee can do nothing about it. You reach around and grab ${his}`); + } + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`buttocks.`); + if (hasAnyArms(slave)) { + r.push(`${He} tries to grab your`); + if (hasBothArms(slave)) { + r.push(`wrists to keep them`); + } else { + r.push(`wrist to keep it`); + } + r.push(`away but ${he} cannot resist for long.`); + } + r.push(`You start rubbing along ${his} cheeks, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. ${He} tries to break out of your grasp as you rub fingers around ${his}`); + if (slave.anus > 3) { + r.push(`gaping anus.`); + } else if (slave.anus === 3) { + r.push(`loose anus.`); + } else if (slave.anus === 2) { + r.push(`well-used asshole.`); + } else if (slave.anus === 1) { + r.push(`tight butthole.`); + } else if (slave.anus === 0) { + r.push(`virgin butthole.`); + } + r.push(`${He} writhes as you continue to move around ${his} posterior, gently reaching to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. ${He} struggles to stay still while you circle around ${his} anus with your fingers, not breaking contact with ${him}. You look at ${his} face and ${he} has`); + if (!canSee(slave)) { + r.push(`reflexively`); + } + r.push(`shut ${his} eyes, trying not to think about what's about to happen.`); + if (hasAnyLegs(slave)) { + r.push(`You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and bend ${him} over your lap,`); + if (slave.inflation === 2) { + r.push(`${his} soft and jiggly ${slave.inflationType}-filled belly spilling over your legs,`); + } else if (slave.inflation === 1) { + r.push(`${his} ${slave.inflationType} distended belly resting on your legs,`); + } else { + r.push(`${his} belly resting on your legs,`); + } + r.push(`while ${he} tries to push away.`); + } else { + r.push(`You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and place ${him} on your lap,`); + if (slave.inflation === 2) { + r.push(`${his} soft and jiggly ${slave.inflationType}-filled belly spilling over your legs,`); + } else if (slave.inflation === 1) { + r.push(`${his} ${slave.inflationType} distended belly resting on your legs,`); + } else { + r.push(`${his} belly resting on your legs,`); + } + r.push(`while ${he} tries to squirm away.`); + } + r.push(`You look at ${his} rear while you squeeze ${his} cheeks and rub them with your firm hands. You explore the contours of ${his} posterior with both your eyes and hands, before picking up the hose and inserting it into ${his}`); + if (slave.anus > 3) { + r.push(`gaping`); + } else if (slave.anus === 3) { + r.push(`loose`); + } else if (slave.anus === 2) { + r.push(`well-used`); + } else if (slave.anus === 1) { + r.push(`tight`); + } else if (slave.anus === 0) { + r.push(`virgin`); + } + r.push(`butthole, and setting it on low.`); + if (slave.inflation === 2) { + r.push(`${His} sloshing belly slowly grows even larger with ${slave.inflationType}. You rest a hand on ${his} back as ${his} swelling belly forces ${him} to rise off your lap. Once the enema is complete and ${he} is plugged, you`); + if (canStand(slave)) { + r.push(`push ${him} to ${his}`); + if (hasBothLegs(slave)) { + r.push(`feet`); + } else { + r.push(`foot`); + } + } else { + r.push(`help ${him} onto your desk`); + } + r.push(`and admire ${his} taut, ${slave.skin} stomach. ${He}`); + if (canSee(slave)) { + r.push(`looks in your eyes,`); + } else { + r.push(`faces you,`); + } + r.push(`as though almost demanding answers. ${He} looks apprehensive about what you will do next. You order ${him} to keep ${himself} filled with two gallons of ${slave.inflationType} until you say otherwise.`); + } else if (slave.inflation === 1) { + r.push(`${His} bloated belly slowly swells even larger with ${slave.inflationType}. You slip a hand under ${his} stomach to feel it grow in your palm. Once the enema is complete and ${he} is plugged, you`); + if (canStand(slave)) { + r.push(`push ${him} to ${his}`); + if (hasBothLegs(slave)) { + r.push(`feet`); + } else { + r.push(`foot`); + } + } else { + r.push(`help ${him} onto your desk`); + } + r.push(`and admire ${his} jiggly, soft, ${slave.skin} stomach. ${He}`); + if (canSee(slave)) { + r.push(`looks in your eyes,`); + } else { + r.push(`faces you,`); + } + r.push(`as though almost demanding answers. ${He} looks apprehensive about what you will do next. You order ${him} to keep ${himself} filled with four liters of ${slave.inflationType} until you say otherwise.`); + } else { + r.push(`${His} belly slowly swells with ${slave.inflationType}. You slip a hand under ${his} stomach to feel it grow in your palm. Once the enema is complete and ${he} is plugged, you`); + if (canStand(slave)) { + r.push(`push ${him} to ${his}`); + if (hasBothLegs(slave)) { + r.push(`feet`); + } else { + r.push(`foot`); + } + } else { + r.push(`help ${him} onto your desk`); + } + r.push(`and admire ${his} distended, ${slave.skin} stomach. ${He}`); + if (canSee(slave)) { + r.push(`looks in your eyes,`); + } else { + r.push(`faces you,`); + } + r.push(`as though almost demanding answers. ${He} looks apprehensive about what you will do next. You order ${him} to keep ${himself} filled with two liters of ${slave.inflationType} until you say otherwise.`); + } + } else if (slave.devotion <= 20) { + if (canMove(slave)) { + r.push(`You instruct ${him} to present ${his} anus for a ${slave.inflationType} enema. ${He} complies without comment,`); + if (canStand(slave)) { + r.push(`standing in front of you.`); + } else { + r.push(`turning ${his} rear to you.`); + } + } else if (!isAmputee(slave)) { + r.push(`You instruct ${him} to present ${his} anus for a ${slave.inflationType} enema. ${He} complies without comment, readying ${his} ass for you.`); + } else { + r.push(`${he}'s hesitant of being filled with`); + if (slave.inflation > 0) { + r.push(`more`); + } + r.push(`${slave.inflationType}, but as an amputee can do nothing about it.`); + } + r.push(`You reach around and grab ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`buttocks. ${He} can't stop ${himself} from becoming aroused as you start rubbing along ${his} cheeks, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. You rub your fingers around ${his}`); + if (slave.anus > 3) { + r.push(`gaping anus.`); + } else if (slave.anus === 3) { + r.push(`loose anus.`); + } else if (slave.anus === 2) { + r.push(`well-used asshole.`); + } else if (slave.anus === 1) { + r.push(`tight butthole.`); + } else if (slave.anus === 0) { + r.push(`virgin butthole.`); + } + r.push(`${He} writhes as you continue to move around ${his} posterior, gently reaching to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. ${He} struggles to stay still while you circle around ${his} anus with your fingers. You look at ${his} face and ${he} has`); + if (!canSee(slave)) { + r.push(`reflexively`); + } + r.push(`shut ${his} eyes, trying not to get aroused by your touch on ${his} butt. This only encourages you to continue. You keep squeezing ${his} buttocks tenderly — first one, then the other and then finally both and ${he} can't help but quiver while in your grasp.`); + if (hasAnyLegs(slave)) { + r.push(`You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and bend ${him} over your lap,`); + if (slave.inflation === 2) { + r.push(`${his} soft and jiggly ${slave.inflationType}-filled belly spilling over your legs.`); + } else if (slave.inflation === 1) { + r.push(`${his} ${slave.inflationType} distended belly resting on your legs.`); + } else { + r.push(`${his} belly resting on your legs.`); + } + } else { + r.push(`You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and place ${his} wriggling body on your lap,`); + if (slave.inflation === 2) { + r.push(`${his} soft and jiggly ${slave.inflationType}-filled belly spilling over your legs.`); + } else if (slave.inflation === 1) { + r.push(`${his} ${slave.inflationType} distended belly resting on your legs.`); + } else { + r.push(`${his} belly resting on your legs.`); + } + } + r.push(`You look at ${his} rear while you squeeze ${his} cheeks and rub them with your firm hands. You explore the contours of ${his} posterior with both your eyes and hands, before picking up the hose and inserting it into ${his}`); + if (slave.anus > 3) { + r.push(`gaping`); + } else if (slave.anus === 3) { + r.push(`loose`); + } else if (slave.anus === 2) { + r.push(`well-used`); + } else if (slave.anus === 1) { + r.push(`tight`); + } else if (slave.anus === 0) { + r.push(`virgin`); + } + r.push(`butthole, and setting it on low.`); + if (slave.inflation === 2) { + r.push(`${His} sloshing belly slowly grows even larger with ${slave.inflationType}. You rest a hand on ${his} back as ${his} swelling belly forces ${him} to rise off your lap. Once the enema is complete and ${he} is plugged, you`); + if (canStand(slave)) { + r.push(`push ${him} to ${his}`); + if (hasBothLegs(slave)) { + r.push(`feet`); + } else { + r.push(`foot`); + } + } else { + r.push(`help ${him} onto your desk`); + } + r.push(`and admire ${his} taut, ${slave.skin} stomach. ${He} looks up at you quizzically, unsure about what you will do next. You order ${him} to keep ${himself} filled with two gallons of ${slave.inflationType} until you say otherwise.`); + } else if (slave.inflation === 1) { + r.push(`${His} bloated belly slowly swells even larger with ${slave.inflationType}. You slip a hand under ${his} stomach to feel it grow in your palm. Once the enema is complete and ${he} is plugged, you`); + if (canStand(slave)) { + r.push(`push ${him} to ${his}`); + if (hasBothLegs(slave)) { + r.push(`feet`); + } else { + r.push(`foot`); + } + } else { + r.push(`help ${him} onto your desk`); + } + r.push(`and admire ${his} jiggly, soft, ${slave.skin} stomach. ${He} looks up at you quizzically, unsure about what you will do next. You order ${him} to keep ${himself} filled with four liters of ${slave.inflationType} until you say otherwise.`); + } else { + r.push(`${His} belly slowly swells with ${slave.inflationType}. You slip a hand under ${his} stomach to feel it grow in your palm. Once the enema is complete and ${he} is plugged, you`); + if (canStand(slave)) { + r.push(`push ${him} to ${his}`); + if (hasBothLegs(slave)) { + r.push(`feet`); + } else { + r.push(`foot`); + } + } else { + r.push(`help ${him} onto your desk`); + } + r.push(`and admire ${his} distended, ${slave.skin} stomach. ${He} looks up at you quizzically, unsure about what you will do next. You order ${him} to keep ${himself} filled with two liters of ${slave.inflationType} until you say otherwise.`); + } + } else if (slave.devotion <= 50) { + if (canMove(slave)) { + r.push(`You instruct ${him} to present ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`anus for a ${slave.inflationType} enema. ${He} hesitates but eventually`); + if (canStand(slave)) { + r.push(`stands`); + } else { + r.push(`crawls`); + } + r.push(`in front of you showing ${his} buttocks before presenting ${his} anus.`); + } else if (!isAmputee(slave)) { + r.push(`You instruct ${him} to present ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`anus for a ${slave.inflationType} enema. ${He} hesitates but eventually shifts ${his} buttocks to face you before presenting ${his} anus.`); + } else { + r.push(`${he}'s mildly hesitant of being filled with`); + if (slave.inflation > 0) { + r.push(`more`); + } + r.push(`${slave.inflationType}, but as an amputee can do nothing about it.`); + } + r.push(`You reach around and grab ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + r.push(`buttocks. You start rubbing along ${his} cheeks, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. As you rub your fingers around ${his} anus, ${he} starts to relax. ${He} quivers as you continue to move around ${his} posterior gently reaching to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. ${He} purses ${his} lips while you circle around ${his} anus with your fingers. You look at ${his} face and ${he} is`); + if (canSee(slave)) { + r.push(`looking back at you doe-eyed,`); + } else { + r.push(`smiling pleasantly at you,`); + } + r.push(`trying but failing not to get aroused by your soft touch on ${his} butt. You keep squeezing ${his} buttocks tenderly — first one, then the other and then finally both and ${he} can't help but let out a moan while in your grasp.`); + if (hasAnyLegs(slave)) { + r.push(`You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and bend ${him} over your lap,`); + if (slave.inflation === 2) { + r.push(`${his} soft and jiggly ${slave.inflationType}-filled belly spilling over your legs.`); + } else if (slave.inflation === 1) { + r.push(`${his} ${slave.inflationType} distended belly resting on your legs.`); + } else { + r.push(`${his} belly resting on your legs.`); + } + } else { + r.push(`You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and place ${him} wriggling body on your lap,`); + if (slave.inflation === 2) { + r.push(`${his} soft and jiggly ${slave.inflationType}-filled belly spilling over your legs.`); + } else if (slave.inflation === 1) { + r.push(`${his} ${slave.inflationType} distended belly resting on your legs.`); + } else { + r.push(`${his} belly resting on your legs.`); + } + } + r.push(`You look at ${his} rear while you squeeze ${his} cheeks and rub them with your firm hands. You wander along the outline of ${his} posterior with both your eyes and hands, before picking up the hose and inserting it into ${his}`); + if (slave.anus > 3) { + r.push(`gaping`); + } else if (slave.anus === 3) { + r.push(`loose`); + } else if (slave.anus === 2) { + r.push(`well-used`); + } else if (slave.anus === 1) { + r.push(`tight`); + } else if (slave.anus === 0) { + r.push(`virgin`); + } + r.push(`butthole, and setting it on low.`); + if (slave.inflation === 2) { + r.push(`${His} sloshing belly slowly grows even larger with ${slave.inflationType}. You rest a hand on ${his} back as ${his} swelling belly forces ${him} to rise off your lap. Once the enema is complete and ${he} is plugged, you`); + if (canStand(slave)) { + r.push(`push ${him} to ${his}`); + if (hasBothLegs(slave)) { + r.push(`feet`); + } else { + r.push(`foot`); + } + } else { + r.push(`help ${him} onto your desk`); + } + r.push(`and admire ${his} taut, ${slave.skin} stomach. ${He} sighs contently, hoping you'll give ${him} more attention. You pat ${his} belly and tell ${him} to keep ${himself} filled with two gallons of ${slave.inflationType} until you say otherwise.`); + } else if (slave.inflation === 1) { + r.push(`${His} bloated belly slowly swells even larger with ${slave.inflationType}. You slip a hand under ${his} stomach to feel it grow in your palm. Once the enema is complete and ${he} is plugged, you`); + if (canStand(slave)) { + r.push(`push ${him} to ${his}`); + if (hasBothLegs(slave)) { + r.push(`feet`); + } else { + r.push(`foot`); + } + } else { + r.push(`help ${him} onto your desk`); + } + r.push(`and admire ${his} jiggly, soft, ${slave.skin} stomach. ${He} sighs contently, hoping you'll give ${him} more attention. You pat ${his} belly and tell ${him} to keep ${himself} filled with four liters of ${slave.inflationType} until you say otherwise.`); + } else { + r.push(`${His} belly slowly swells with ${slave.inflationType}. You slip a hand under ${his} stomach to feel it grow in your palm. Once the enema is complete and ${he} is plugged, you`); + if (canStand(slave)) { + r.push(`push ${him} to ${his}`); + if (hasBothLegs(slave)) { + r.push(`feet`); + } else { + r.push(`foot`); + } + } else { + r.push(`help ${him} onto your desk`); + } + r.push(`and admire ${his} distended, ${slave.skin} stomach. ${He} sighs contently, hoping you'll give ${him} more attention. You pat ${his} belly and tell ${him} to keep ${himself} filled with two liters of ${slave.inflationType} until you say otherwise.`); + } + } else { + if (canMove(slave)) { + r.push(`You instruct ${him} to present ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`anus for a ${slave.inflationType} enema. ${He} eagerly`); + if (canStand(slave)) { + r.push(`stands in front of you showing ${his} buttocks before happily presenting ${his} anus to you, spreading ${his} butt cheeks and turning to face you.`); + } else { + r.push(`crawls to you, showing ${his} buttocks in motion before happily presenting ${his} anus to you.`); + } + } else if (!isAmputee(slave)) { + r.push(`You instruct ${him} to present ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`anus for a ${slave.inflationType} enema. ${He} eagerly shifts around to show ${his} buttocks before happily presenting ${his} anus to you, spreading ${his} butt cheeks and turning to face you.`); + } else { + r.push(`${He} devotedly`); + if (canSee(slave)) { + r.push(`looks`); + } else { + r.push(`smiles`); + } + r.push(`at you, awaiting the warm liquids entering ${his} bowels.`); + } + r.push(`You reach around and grab ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + r.push(`buttocks. You start rubbing along ${his} cheeks, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. As you rub your fingers around ${his} anus, ${he} sighs audibly. ${He} moans as you continue to move around ${his} posterior gently reaching to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. ${He} quivers while you circle around ${his} anus with your fingers. You look at ${his} face and ${he} is`); + if (canSee(slave)) { + r.push(`looking`); + } else { + r.push(`gazing`); + } + r.push(`back at you longingly, getting aroused by your continued touch on ${his} butt. You keep squeezing ${his} buttocks tenderly — first one, then the other and then finally both and ${he} can't help but let out a moan while in your grasp.`); + if (hasAnyLegs(slave)) { + r.push(`You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and bend ${him} over your lap,`); + if (slave.inflation === 2) { + r.push(`${his} soft and jiggly ${slave.inflationType}-filled belly spilling over your legs.`); + } else if (slave.inflation === 1) { + r.push(`${his} ${slave.inflationType} distended belly resting on your legs.`); + } else { + r.push(`${his} belly resting on your legs.`); + } + } else { + r.push(`You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and place ${his} wriggling body on your lap,`); + if (slave.inflation === 2) { + r.push(`${his} soft and jiggly ${slave.inflationType}-filled belly spilling over your legs.`); + } else if (slave.inflation === 1) { + r.push(`${his} ${slave.inflationType} distended belly resting on your legs.`); + } else { + r.push(`${his} belly resting on your legs.`); + } + } + r.push(`You look at ${his} rear while you squeeze ${his} cheeks and rub them with your firm hands. You wander along the outline of ${his} posterior with both your eyes and hands, before picking up the hose and inserting it into ${his}`); + if (slave.anus > 3) { + r.push(`gaping`); + } else if (slave.anus === 3) { + r.push(`loose`); + } else if (slave.anus === 2) { + r.push(`well-used`); + } else if (slave.anus === 1) { + r.push(`tight`); + } else if (slave.anus === 0) { + r.push(`virgin`); + } + r.push(`butthole, and setting it on low.`); + if (slave.inflation === 2) { + r.push(`${His} sloshing belly slowly grows even larger with ${slave.inflationType}. You rest a hand on ${his} back as ${his} swelling belly forces ${him} to rise off your lap. Once the enema is complete and ${he} is plugged, you`); + if (canStand(slave)) { + r.push(`push ${him} to ${his}`); + if (hasBothLegs(slave)) { + r.push(`feet`); + } else { + r.push(`foot`); + } + } else { + r.push(`help ${him} onto your desk`); + } + r.push(`and admire ${his} taut, ${slave.skin} stomach. ${He} sighs contently, before eagerly begging for more. You pat ${his} belly and tell ${him} to keep ${himself} filled with two gallons of ${slave.inflationType} until you say otherwise.`); + } else if (slave.inflation === 1) { + r.push(`${His} bloated belly slowly swells even larger with ${slave.inflationType}. You slip a hand under ${his} stomach to feel it grow in your palm. Once the enema is complete and ${he} is plugged, you`); + if (canStand(slave)) { + r.push(`push ${him} to ${his}`); + if (hasBothLegs(slave)) { + r.push(`feet`); + } else { + r.push(`foot`); + } + } else { + r.push(`help ${him} onto your desk`); + } + r.push(`and admire ${his} jiggly, soft, ${slave.skin} stomach. ${He} sighs contently, before eagerly begging for more. You pat ${his} belly and tell ${him} to keep ${himself} filled with four liters of ${slave.inflationType} until you say otherwise.`); + } else { + r.push(`${His} belly slowly swells with ${slave.inflationType}. You slip a hand under ${his} stomach to feel it grow in your palm. Once the enema is complete and ${he} is plugged, you`); + if (canStand(slave)) { + r.push(`push ${him} to ${his}`); + if (hasBothLegs(slave)) { + r.push(`feet`); + } else { + r.push(`foot`); + } + } else { + r.push(`help ${him} onto your desk`); + } + r.push(`and admire ${his} distended, ${slave.skin} stomach. ${He} sighs contently, before eagerly begging for more. You pat ${his} belly and tell ${him} to keep ${himself} filled with two liters of ${slave.inflationType} until you say otherwise.`); + } + } + if (_pregDiscovery === 0) { + slave.inflation += 1; + if (slave.inflation === 3) { + if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { + r.push(`${He} gingerly leaves your office, massaging ${his} bloated guts as ${he} goes.`); + } else { + r.push(`${His} belly wobbles heavily as ${he} is helped from your office.`); + } + r.push(`Being filled so full <span class="health.dec">surely had negative effects</span> on ${his} health.`); + healthDamage(slave, 10); + } else if (slave.inflation === 2) { + if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { + r.push(`${He} gingerly leaves your office, massaging ${his} full guts as ${he} goes.`); + } else { + r.push(`${His} belly wobbles heavily as ${he} is helped from your office.`); + } + } else if (slave.inflation === 1) { + if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { + r.push(`${He} gingerly leaves your office, massaging ${his} distended belly as ${he} goes.`); + } else { + r.push(`${His} belly wobbles as ${he} is helped from your office.`); + } + } + SetBellySize(slave); + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fillUpButt.tw b/src/npc/interaction/fillUpButt.tw deleted file mode 100644 index 760b1f617c6694fe09710858cc52905d2d3f9479..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fillUpButt.tw +++ /dev/null @@ -1,389 +0,0 @@ -:: FillUpButt [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<set getSlave($AS).bellyAccessory = "none">> -<<set _pregDiscovery = 0>> -You -<<switch getSlave($AS).inflationType>> -<<case "water" "aphrodisiac" "curative" "tightener">> - pull out an enema bag and - <<if getSlave($AS).inflation < 2>> - a two liter bag of solution, - <<else>> - a one gallon bag of solution, - <</if>> -<<case "cum" "milk">> - attach a hose to $dairyName tap with the pipes set to pump <<= getSlave($AS).inflationType>>, -<<case "urine">> - attach a hose to your penthouse's plumbing tap, -<</switch>> -before calling $him over so you can play with $his -<<if getSlave($AS).butt < 2>> - flat, tight ass -<<elseif getSlave($AS).butt <= 2>> - cute bottom -<<elseif getSlave($AS).butt <= 3>> - round, firm rump -<<elseif getSlave($AS).butt <= 4>> - curvy, enticing butt -<<elseif getSlave($AS).butt <= 5>> - huge rear end -<<elseif getSlave($AS).butt <= 6>> - massive, alluring rump -<<elseif getSlave($AS).butt <= 7>> - enormous, hypnotic ass -<<elseif getSlave($AS).butt <= 10>> - gigantic, jiggly rear -<<elseif getSlave($AS).butt <= 14>> - inhuman, cushiony butt cheeks -<<elseif getSlave($AS).butt <= 20>> - couch-like, super jiggly ass cheeks -<</if>> -before shoving the equipment into $his -<<if (getSlave($AS).anus > 3)>> - gaping anus. -<<elseif (getSlave($AS).anus == 3)>> - loose anus. -<<elseif (getSlave($AS).anus == 2)>> - well-used asshole. -<<elseif (getSlave($AS).anus == 1)>> - tight butthole. -<<elseif (getSlave($AS).anus == 0)>> - virgin butthole. -<</if>> - -<<if getSlave($AS).inflation > 1 && getSlave($AS).preg > 1>> - $He looks uneasy at the prospect of that much fluid entering $his rear, far more than could be considered normal. - <<set _pregDiscovery = 1>> -<<else>> - <<if (getSlave($AS).fetish == "buttslut") && (getSlave($AS).devotion >= -20)>> - $He's pleased at the prospect of you touching $his favorite body part. - <<elseif (getSlave($AS).fetish == "cumslut") && (getSlave($AS).devotion >= -20) && (getSlave($AS).inflationType == "cum")>> - $He's pleased at the idea of turning into a cum balloon. - <</if>> - <<if (getSlave($AS).behavioralFlaw == "gluttonous") && (getSlave($AS).devotion >= -20) && ((getSlave($AS).inflationType == "cum") || (getSlave($AS).inflationType == "milk"))>> - $He's thrilled that you are going to give $him such a filling meal. - <<elseif (getSlave($AS).behavioralFlaw == "anorexic") && (getSlave($AS).devotion >= -20) && ((getSlave($AS).inflationType == "cum") || (getSlave($AS).inflationType == "milk"))>> - $He's hesitant about whether or not you are trying to make $him gain weight. - <</if>> -<</if>> - -<<if _pregDiscovery == 1>> - Not wanting to risk such a mess, you send $him for a medical examination. While most of the tests come back normal, one in particular catches your eye; @@.lime;$he is pregnant<<if getSlave($AS).preg > getSlave($AS).pregData.normalBirth/4>> and surprisingly far along<</if>>.@@ $he should be able to still handle at least two liters of <<= getSlave($AS).inflationType>> up $his ass, however. - <<run deflate(getSlave($AS))>> - <<set getSlave($AS).pregKnown = 1>> -<<elseif getSlave($AS).fetish == "mindbroken">> - <<if canMove(getSlave($AS))>> - You instruct $him to present $his buttocks and anus but $he remains still and unresponsive. Talking to a broken mind is pointless. - <</if>> - You reach around and grab $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>buttocks before rubbing along them, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. $He reacts to your initial touch as you rub fingers around $his - <<if (getSlave($AS).anus > 3)>> - gaping anus, - <<elseif (getSlave($AS).anus == 3)>> - loose anus, - <<elseif (getSlave($AS).anus == 2)>> - well-used asshole, - <<elseif (getSlave($AS).anus == 1)>> - tight butthole, - <<elseif (getSlave($AS).anus == 0)>> - virgin butthole, - <</if>> - but you understand it is only physiological. You continue to move around $his posterior gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. You circle around $his anus but $he remains still. You keep squeezing $his buttocks tenderly — first one, then the other and then both but $he is like a doll in your grasp. You pull $his body closer towards you by $his buttocks, turn $him around, and bend $him over your lap, <<if getSlave($AS).inflation == 2>>$his soft and jiggly <<print getSlave($AS).inflationType>>-filled belly spilling over your legs<<elseif getSlave($AS).inflation == 1>>$his <<print getSlave($AS).inflationType>> distended belly resting on your legs<<else>>$his belly resting on your legs<</if>>. You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You explore the contours of $his posterior with both your eyes and hands, before picking up the hose and inserting it into $his - <<if (getSlave($AS).anus > 3)>> - gaping - <<elseif (getSlave($AS).anus == 3)>> - loose - <<elseif (getSlave($AS).anus == 2)>> - well-used - <<elseif (getSlave($AS).anus == 1)>> - tight - <<elseif (getSlave($AS).anus == 0)>> - virgin - <</if>> - butthole. - <<if getSlave($AS).inflation == 2>> - $His sloshing belly slowly grows even larger with <<= getSlave($AS).inflationType>>. You rest a hand on $his back as $his swelling belly forces $him to rise off your lap. Once the enema is complete and $he is plugged, you push $him onto your desk and admire $his taut, <<= getSlave($AS).skin>> stomach. You give the firm orb a slap, eliciting a slight grunt from the broken slave and no motion at all from $his gut. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise. - <<elseif getSlave($AS).inflation == 1>> - $His bloated belly slowly swells even larger with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you push $him onto your desk and admire $his jiggly, soft, <<= getSlave($AS).skin>> stomach. You give the gut orb a slap, eliciting a slight grunt from the broken slave and whole bunch of wiggling and sloshing from $his middle. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise. - <<else>> - $His belly slowly swells with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you push $him onto your desk and admire $his distended, <<= getSlave($AS).skin>> stomach. You give the gut orb a slap, eliciting a slight grunt from the broken slave and touch of wiggling and sloshing from $his middle. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise.<</if>> -<<elseif getSlave($AS).devotion < -20>> - <<if canMove(getSlave($AS))>> - You instruct $him to present $his anus for a <<= getSlave($AS).inflationType>> enema. Opposed to the thought of being filled <<if getSlave($AS).inflation > 0>>more <</if>>with <<= getSlave($AS).inflationType>>, $he tries to <<if canWalk(getSlave($AS))>>step back<<else>>crawl away<</if>>, but you catch $him and pull $him closer to you as you reach around and grab $his - <<elseif !isAmputee(getSlave($AS))>> - You instruct $him to present $his anus for a <<= getSlave($AS).inflationType>> enema. $He's opposed to the thought of being filled <<if getSlave($AS).inflation > 0>>more <</if>>with <<= getSlave($AS).inflationType>>, but since $he is immobile, can't escape. You reach around and grab $his - <<else>> - $He's opposed to the thought of being filled with <<if getSlave($AS).inflation > 0>>more <</if>><<= getSlave($AS).inflationType>>, but as an amputee can do nothing about it. You reach around and grab $his - <</if>> - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>> buttocks. - <<if (hasAnyArms(getSlave($AS)))>> - $He tries to grab your <<if (hasBothArms(getSlave($AS)))>>wrists to keep them<<else>>wrist to keep it<</if>> away but $he cannot resist for long. - <</if>> - You start rubbing along $his cheeks, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. $He tries to break out of your grasp as you rub fingers around $his - <<if (getSlave($AS).anus > 3)>> - gaping anus. - <<elseif (getSlave($AS).anus == 3)>> - loose anus. - <<elseif (getSlave($AS).anus == 2)>> - well-used asshole. - <<elseif (getSlave($AS).anus == 1)>> - tight butthole. - <<elseif (getSlave($AS).anus == 0)>> - virgin butthole. - <</if>> - $He writhes as you continue to move around $his posterior, gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He struggles to stay still while you circle around $his anus with your fingers, not breaking contact with $him. You look at $his face and $he has <<if !canSee(getSlave($AS))>>reflexively <</if>>shut $his eyes, trying not to think about what's about to happen. - <<if (hasAnyLegs(getSlave($AS)))>> - You pull $his body closer towards you by $his buttocks, turn $him around, and bend $him over your lap, <<if getSlave($AS).inflation == 2>>$his soft and jiggly <<print getSlave($AS).inflationType>>-filled belly spilling over your legs<<elseif getSlave($AS).inflation == 1>>$his <<print getSlave($AS).inflationType>> distended belly resting on your legs<<else>>$his belly resting on your legs<</if>>, while $he tries to push away. - <<else>> - You pull $his body closer towards you by $his buttocks, turn $him around, and place $him on your lap, <<if getSlave($AS).inflation == 2>>$his soft and jiggly <<print getSlave($AS).inflationType>>-filled belly spilling over your legs<<elseif getSlave($AS).inflation == 1>>$his <<print getSlave($AS).inflationType>> distended belly resting on your legs<<else>>$his belly resting on your legs<</if>>, while $he tries to squirm away. - <</if>> - You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You explore the contours of $his posterior with both your eyes and hands, before picking up the hose and inserting it into $his - <<if (getSlave($AS).anus > 3)>> - gaping - <<elseif (getSlave($AS).anus == 3)>> - loose - <<elseif (getSlave($AS).anus == 2)>> - well-used - <<elseif (getSlave($AS).anus == 1)>> - tight - <<elseif (getSlave($AS).anus == 0)>> - virgin - <</if>> - butthole, and setting it on low. - <<if getSlave($AS).inflation == 2>> - $His sloshing belly slowly grows even larger with <<= getSlave($AS).inflationType>>. You rest a hand on $his back as $his swelling belly forces $him to rise off your lap. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his taut, <<= getSlave($AS).skin>> stomach. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise. - <<elseif getSlave($AS).inflation == 1>> - $His bloated belly slowly swells even larger with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his jiggly, soft, <<= getSlave($AS).skin>> stomach. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise. - <<else>> - $His belly slowly swells with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his distended, <<= getSlave($AS).skin>> stomach. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise.<</if>> -<<elseif (getSlave($AS).devotion <= 20)>> - <<if canMove(getSlave($AS))>> - You instruct $him to present $his anus for a <<= getSlave($AS).inflationType>> enema. $He complies without comment, <<if canStand(getSlave($AS))>>standing in front of you.<<else>>turning $his rear to you.<</if>> - <<elseif !isAmputee(getSlave($AS))>> - You instruct $him to present $his anus for a <<= getSlave($AS).inflationType>> enema. $He complies without comment, readying $his ass for you. - <<else>> - $he's hesitant of being filled with <<if getSlave($AS).inflation > 0>>more <</if>><<= getSlave($AS).inflationType>>, but as an amputee can do nothing about it. - <</if>> - You reach around and grab $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>> buttocks. $He can't stop $himself from becoming aroused as you start rubbing along $his cheeks, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. You rub your fingers around $his - <<if (getSlave($AS).anus > 3)>> - gaping anus. - <<elseif (getSlave($AS).anus == 3)>> - loose anus. - <<elseif (getSlave($AS).anus == 2)>> - well-used asshole. - <<elseif (getSlave($AS).anus == 1)>> - tight butthole. - <<elseif (getSlave($AS).anus == 0)>> - virgin butthole. - <</if>> - $He writhes as you continue to move around $his posterior, gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He struggles to stay still while you circle around $his anus with your fingers. You look at $his face and $he has <<if !canSee(getSlave($AS))>>reflexively <</if>>shut $his eyes, trying not to get aroused by your touch on $his butt. This only encourages you to continue. You keep squeezing $his buttocks tenderly — first one, then the other and then finally both and $he can't help but quiver while in your grasp. - <<if (hasAnyLegs(getSlave($AS)))>> - You pull $his body closer towards you by $his buttocks, turn $him around, and bend $him over your lap, <<if getSlave($AS).inflation == 2>>$his soft and jiggly <<print getSlave($AS).inflationType>>-filled belly spilling over your legs<<elseif getSlave($AS).inflation == 1>>$his <<print getSlave($AS).inflationType>> distended belly resting on your legs<<else>>$his belly resting on your legs<</if>>. - <<else>> - You pull $his body closer towards you by $his buttocks, turn $him around, and place $his wriggling body on your lap, <<if getSlave($AS).inflation == 2>>$his soft and jiggly <<print getSlave($AS).inflationType>>-filled belly spilling over your legs<<elseif getSlave($AS).inflation == 1>>$his <<print getSlave($AS).inflationType>> distended belly resting on your legs<<else>>$his belly resting on your legs<</if>>. - <</if>> - You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You explore the contours of $his posterior with both your eyes and hands, before picking up the hose and inserting it into $his - <<if (getSlave($AS).anus > 3)>> - gaping - <<elseif (getSlave($AS).anus == 3)>> - loose - <<elseif (getSlave($AS).anus == 2)>> - well-used - <<elseif (getSlave($AS).anus == 1)>> - tight - <<elseif (getSlave($AS).anus == 0)>> - virgin - <</if>> - butthole, and setting it on low. - <<if getSlave($AS).inflation == 2>> - $His sloshing belly slowly grows even larger with <<= getSlave($AS).inflationType>>. You rest a hand on $his back as $his swelling belly forces $him to rise off your lap. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his taut, <<= getSlave($AS).skin>> stomach. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise. - <<elseif getSlave($AS).inflation == 1>> - $His bloated belly slowly swells even larger with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his jiggly, soft, <<= getSlave($AS).skin>> stomach. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise. - <<else>> - $His belly slowly swells with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his distended, <<= getSlave($AS).skin>> stomach. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise. - <</if>> -<<elseif getSlave($AS).devotion <= 50>> - <<if canMove(getSlave($AS))>> - You instruct $him to present $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>anus for a <<= getSlave($AS).inflationType>> enema. $He hesitates but eventually <<if canStand(getSlave($AS))>>stands<<else>>crawls<</if>> in front of you showing $his buttocks before presenting $his anus. - <<elseif !isAmputee(getSlave($AS))>> - You instruct $him to present $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>anus for a <<= getSlave($AS).inflationType>> enema. $He hesitates but eventually shifts $his buttocks to face you before presenting $his anus. - <<else>> - $he's mildly hesitant of being filled with <<if getSlave($AS).inflation > 0>>more <</if>><<= getSlave($AS).inflationType>>, but as an amputee can do nothing about it. - <</if>> - You reach around and grab $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - buttocks. You start rubbing along $his cheeks, feeling the shape of $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>ass with your fingers and squeezing gently. As you rub your fingers around $his anus, $he starts to relax. $He quivers as you continue to move around $his posterior gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He purses $his lips while you circle around $his anus with your fingers. You look at $his face and $he is <<if canSee(getSlave($AS))>>looking back at you doe-eyed<<else>>smiling pleasantly at you<</if>>, trying but failing not to get aroused by your soft touch on $his butt. You keep squeezing $his buttocks tenderly — first one, then the other and then finally both and $he can't help but let out a moan while in your grasp. - <<if (hasAnyLegs(getSlave($AS)))>> - You pull $his body closer towards you by $his buttocks, turn $him around, and bend $him over your lap, <<if getSlave($AS).inflation == 2>>$his soft and jiggly <<print getSlave($AS).inflationType>>-filled belly spilling over your legs<<elseif getSlave($AS).inflation == 1>>$his <<print getSlave($AS).inflationType>> distended belly resting on your legs<<else>>$his belly resting on your legs<</if>>. - <<else>> - You pull $his body closer towards you by $his buttocks, turn $him around, and place $him wriggling body on your lap, <<if getSlave($AS).inflation == 2>>$his soft and jiggly <<print getSlave($AS).inflationType>>-filled belly spilling over your legs<<elseif getSlave($AS).inflation == 1>>$his <<print getSlave($AS).inflationType>> distended belly resting on your legs<<else>>$his belly resting on your legs<</if>>. - <</if>> - You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You wander along the outline of $his posterior with both your eyes and hands, before picking up the hose and inserting it into $his - <<if (getSlave($AS).anus > 3)>> - gaping - <<elseif (getSlave($AS).anus == 3)>> - loose - <<elseif (getSlave($AS).anus == 2)>> - well-used - <<elseif (getSlave($AS).anus == 1)>> - tight - <<elseif (getSlave($AS).anus == 0)>> - virgin - <</if>> - butthole, and setting it on low. - <<if getSlave($AS).inflation == 2>> - $His sloshing belly slowly grows even larger with <<= getSlave($AS).inflationType>>. You rest a hand on $his back as $his swelling belly forces $him to rise off your lap. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his taut, <<= getSlave($AS).skin>> stomach. $He sighs contently, hoping you'll give $him more attention. You pat $his belly and tell $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise. - <<elseif getSlave($AS).inflation == 1>> - $His bloated belly slowly swells even larger with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his jiggly, soft, <<= getSlave($AS).skin>> stomach. $He sighs contently, hoping you'll give $him more attention. You pat $his belly and tell $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise. - <<else>> - $His belly slowly swells with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his distended, <<= getSlave($AS).skin>> stomach. $He sighs contently, hoping you'll give $him more attention. You pat $his belly and tell $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise. - <</if>> -<<else>> - <<if canMove(getSlave($AS))>> - You instruct $him to present $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>anus for a <<= getSlave($AS).inflationType>> enema. $He eagerly - <<if canStand(getSlave($AS))>> - stands in front of you showing $his buttocks before happily presenting $his anus to you, spreading $his butt cheeks and turning to face you. - <<else>> - crawls to you, showing $his buttocks in motion before happily presenting $his anus to you. - <</if>> - <<elseif !isAmputee(getSlave($AS))>> - You instruct $him to present $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>anus for a <<= getSlave($AS).inflationType>> enema. $He eagerly shifts around to show $his buttocks before happily presenting $his anus to you, spreading $his butt cheeks and turning to face you. - <<else>> - $He devotedly <<if canSee(getSlave($AS))>>looks<<else>>smiles<</if>> at you, awaiting the warm liquids entering $his bowels. - <</if>> - You reach around and grab $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - buttocks. You start rubbing along $his cheeks, feeling the shape of $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>ass with your fingers and squeezing gently. As you rub your fingers around $his anus, $he sighs audibly. $He moans as you continue to move around $his posterior gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He quivers while you circle around $his anus with your fingers. You look at $his face and $he is <<if canSee(getSlave($AS))>>looking<<else>>gazing<</if>> back at you longingly, getting aroused by your continued touch on $his butt. You keep squeezing $his buttocks tenderly — first one, then the other and then finally both and $he can't help but let out a moan while in your grasp. - <<if (hasAnyLegs(getSlave($AS)))>> - You pull $his body closer towards you by $his buttocks, turn $him around, and bend $him over your lap, <<if getSlave($AS).inflation == 2>>$his soft and jiggly <<print getSlave($AS).inflationType>>-filled belly spilling over your legs<<elseif getSlave($AS).inflation == 1>>$his <<print getSlave($AS).inflationType>> distended belly resting on your legs<<else>>$his belly resting on your legs<</if>>. - <<else>> - You pull $his body closer towards you by $his buttocks, turn $him around, and place $his wriggling body on your lap, <<if getSlave($AS).inflation == 2>>$his soft and jiggly <<print getSlave($AS).inflationType>>-filled belly spilling over your legs<<elseif getSlave($AS).inflation == 1>>$his <<print getSlave($AS).inflationType>> distended belly resting on your legs<<else>>$his belly resting on your legs<</if>>. - <</if>> - You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You wander along the outline of $his posterior with both your eyes and hands, before picking up the hose and inserting it into $his - <<if (getSlave($AS).anus > 3)>> - gaping - <<elseif (getSlave($AS).anus == 3)>> - loose - <<elseif (getSlave($AS).anus == 2)>> - well-used - <<elseif (getSlave($AS).anus == 1)>> - tight - <<elseif (getSlave($AS).anus == 0)>> - virgin - <</if>> - butthole, and setting it on low. - <<if getSlave($AS).inflation == 2>> - $His sloshing belly slowly grows even larger with <<= getSlave($AS).inflationType>>. You rest a hand on $his back as $his swelling belly forces $him to rise off your lap. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his taut, <<= getSlave($AS).skin>> stomach. $He sighs contently, before eagerly begging for more. You pat $his belly and tell $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise. - <<elseif getSlave($AS).inflation == 1>> - $His bloated belly slowly swells even larger with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his jiggly, soft, <<= getSlave($AS).skin>> stomach. $He sighs contently, before eagerly begging for more. You pat $his belly and tell $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise. - <<else>> - $His belly slowly swells with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his distended, <<= getSlave($AS).skin>> stomach. $He sighs contently, before eagerly begging for more. You pat $his belly and tell $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise. - <</if>> -<</if>> -<<if _pregDiscovery == 0>> - <<set getSlave($AS).inflation += 1>> - <<if getSlave($AS).inflation == 3>> - <<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>$He gingerly leaves your office, massaging $his bloated guts as $he goes<<else>>$His belly wobbles heavily as $he is helped from your office<</if>>. Being filled so full @@.health.dec;surely had negative effects@@ on $his health. - <<run healthDamage(getSlave($AS), 10)>> - <<elseif getSlave($AS).inflation == 2>> - <<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>$He gingerly leaves your office, massaging $his full guts as $he goes<<else>>$His belly wobbles heavily as $he is helped from your office<</if>>. - <<elseif getSlave($AS).inflation == 1>> - <<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>$He gingerly leaves your office, massaging $his distended belly as $he goes<<else>>$His belly wobbles as $he is helped from your office<</if>>. - <</if>> - <<run SetBellySize(getSlave($AS))>> -<</if>> diff --git a/src/npc/interaction/fillUpFace.js b/src/npc/interaction/fillUpFace.js new file mode 100644 index 0000000000000000000000000000000000000000..62ce48dec28af5f4e211fbc21d74bc0ea0e1fb3a --- /dev/null +++ b/src/npc/interaction/fillUpFace.js @@ -0,0 +1,355 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fillUpFace = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself + } = getPronouns(slave); + + slave.bellyAccessory = "none"; + let pregDiscovery = 0; + const belly = bellyAdjective(slave); + r.push(`You attach a hose to ${V.dairyName} tap with the pipes set to pump ${slave.inflationType} and affix a special nozzle to it, one with straps useful for anchoring it to resisting slaves, before calling ${him} over so you can feel ${him} up while you force-feed ${him} ${slave.inflationType}.`); + + if (slave.inflation > 1 && slave.preg > 1) { + r.push(`${He} looks uneasy at the prospect of taking in that much, far more than could be considered normal.`); + pregDiscovery = 1; + } else { + if (slave.fetish === "submissive" && slave.devotion >= -20) { + r.push(`${He} blushes at the thought of being forcibly fed.`); + } else if (slave.fetish === "cumslut" && slave.devotion >= -20 && slave.inflationType === "cum") { + r.push(`${He}'s pleased at the idea of turning into a cum balloon.`); + } + if (slave.devotion >= -20 && (slave.inflationType === "cum" || slave.inflationType === "milk")) { + if (slave.behavioralFlaw === "gluttonous") { + r.push(`${He}'s thrilled that you are going to give ${him} such a filling meal.`); + } else if (slave.behavioralFlaw === "anorexic") { + r.push(`${He}'s hesitant about whether or not you are trying to make ${him} gain weight.`); + } + } + } + + if (pregDiscovery === 1) { + r.push(`Not wanting to risk such a mess, you send ${him} for a medical examination. While most of the tests come back normal, one in particular catches your eye; <span class="lime">${He} is pregnant${(slave.preg > slave.pregData.normalBirth/4) ? `` : ` and surprisingly far along`}.</span> ${He} should be able to still handle at least two liters of ${slave.inflationType}, however.`); + deflate(slave); + slave.pregKnown = 1; + } else if (slave.fetish === "mindbroken") { + if (canMove(slave)) { + r.push(`You instruct ${him} to take a seat on your lap and open ${his} mouth wide for the hose, but ${he} remains still and unresponsive. Talking to a broken mind is pointless.`); + } + r.push(`You reach out and wrap your arms around ${his}`); + if (slave.weight > 190) { + r.push(`immensely soft`); + } else if (slave.belly >= 150000) { + r.push(belly); + } else if (slave.weight > 160) { + r.push(`massive soft`); + } else if (slave.weight > 130) { + r.push(`giant soft`); + } else if (slave.inflation === 2) { + r.push(`sloshing, ${slave.inflationType}-filled`); + } else if (slave.belly >= 1500) { + r.push(belly); + } else if (slave.weight > 95) { + r.push(`huge soft`); + } else if (slave.inflation === 1) { + r.push(`${slave.inflationType}-bloated`); + } else if (slave.weight > 30) { + r.push(`big soft`); + } else if (slave.weight > 10) { + r.push(`soft`); + } else if (slave.muscles > 95) { + r.push(`chiseled`); + } else if (slave.muscles > 30) { + r.push(`muscular`); + } else if (slave.muscles > 5) { + r.push(`firm, ripped`); + } else { + r.push(`firm, flat`); + } + r.push(`belly, pulling ${him} into your lap. You force the hose down ${his} throat, strapping it to ${his} head to prevent it from slipping out, and turn the flow to low. With everything in place, you return your hands to ${his} gurgling stomach.`); + if (slave.inflation === 2) { + r.push(`You can feel ${his} ${slave.skin} belly growing taut with ${slave.inflationType} as it pushes out against your hands. Once you have given ${him} ${his} fill, you give the firm orb of ${his} belly a slap, eliciting a large belch from the broken slave and no motion at all from ${his} gut. You order ${him} to keep ${himself} filled with two gallons of ${slave.inflationType} until you say otherwise, before helping ${his} hiccupping bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears ${his} meal might be coming back up, is the groaning ${slave.slaveName} ready to be moved.`); + } else if (slave.inflation === 1) { + r.push(`You can feel ${his} ${slave.skin} belly growing larger with ${slave.inflationType} as it pushes out against your hands. Once you have given ${him} ${his} fill, you give the jiggling orb of ${his} belly a slap, eliciting a burp from the broken slave and tons of motion from ${his} gut. You order ${him} to keep ${himself} filled with four liters of ${slave.inflationType} until you say otherwise, before helping ${his} hiccupping bulk onto the couch to recover, After a few minutes of rest, and several glares from you when it appears ${his} meal might be coming back up, is the groaning ${slave.slaveName} ready to be moved.`); + } else { + r.push(`You can feel ${his} ${slave.skin} belly swelling with ${slave.inflationType} as it pushes out against your hands. Once you have given ${him} ${his} fill, you give ${his} bloated belly a slap, eliciting a small burp from the broken slave and a little jiggle from ${his} gut. You order ${him} to keep ${himself} filled with two liters of ${slave.inflationType} until you say otherwise, before helping ${his} sloshing bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears ${his} meal might be coming back up, is the hiccupping ${slave.slaveName} ready to be moved.`); + } + } else if (slave.devotion < -20) { + if (canMove(slave)) { + r.push(`You instruct ${him} to take a seat on your lap and open ${his} mouth wide for the hose. Opposed to the thought of being filled `); + if (slave.inflation > 0) { + r.push(`more `); + } + r.push(`with ${slave.inflationType}, ${he} tries to `); + if (canWalk(slave)) { + r.push(`step back,`); + } else { + r.push(`crawl away,`); + } + r.push(`but you catch ${him} and pull ${him} into your lap, wrapping your arms around ${his}`); + } else if (hasAnyLimbs(slave)) { + r.push(`You inform ${him} ${he}'ll be taking a seat on your lap, opening ${his} mouth wide for the hose, and drinking until you tell ${him} ${he} is full enough. ${He}'s opposed to the thought of being filled with`); + if (slave.inflation > 0) { + r.push(` more`); + } + r.push(` ${slave.inflationType}, but since ${he} is immobile, ${he} can't escape. You heft ${him} onto your lap, wrapping your arms around ${his}`); + } else { + r.push(`${He}'s opposed to the thought of being filled with `); + if (slave.inflation > 0) { + r.push(`more `); + } + r.push(`${slave.inflationType}, but as an amputee can do nothing about it. You heft ${him} onto your lap, wrapping your arms around ${him}`); + } + if (slave.weight > 190) { + r.push(`immensely soft`); + } else if (slave.belly >= 150000) { + r.push(belly); + } else if (slave.weight > 160) { + r.push(`massive soft`); + } else if (slave.weight > 130) { + r.push(`giant soft`); + } else if (slave.inflation === 2) { + r.push(`sloshing, ${slave.inflationType}-filled`); + } else if (slave.belly >= 1500) { + r.push(belly); + } else if (slave.weight > 95) { + r.push(`huge soft`); + } else if (slave.inflation === 1) { + r.push(`${slave.inflationType}-bloated`); + } else if (slave.weight > 30) { + r.push(`big soft`); + } else if (slave.weight > 10) { + r.push(`soft`); + } else if (slave.muscles > 95) { + r.push(`chiseled`); + } else if (slave.muscles > 30) { + r.push(`muscular`); + } else if (slave.muscles > 5) { + r.push(`firm, ripped`); + } else { + r.push(`firm, flat`); + } + r.push(`belly. You force the hose down ${his} throat, strapping it to ${his} head to prevent ${him} from removing it, and turn the flow to low. With everything in place, you return your hands to ${his} gurgling stomach.`); + if (slave.inflation === 2) { + r.push(`You can feel ${his} ${slave.skin} belly growing taut with ${slave.inflationType} as it pushes out against your hands. Once you have given ${him} ${his} fill, you give the firm orb of ${his} belly a slap, eliciting gagging from the overfilled slave and no motion at all from ${his} gut. ${He} `); + if (canSee(slave)) { + r.push(`looks in your eyes,`); + } else { + r.push(`faces you,`); + } + r.push(`as though almost demanding answers. ${He} looks apprehensive about what you will do next. You order ${him} to keep ${himself} filled with two gallons of ${slave.inflationType} until you say otherwise, before helping ${his} hiccupping bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears ${his} meal might be coming back up, is the groaning ${slave.slaveName} ready to be moved.`); + } else if (slave.inflation === 1) { + r.push(`You can feel ${his} ${slave.skin} belly growing larger with ${slave.inflationType} as it pushes out against your hands. Once you have given ${him} ${his} fill, you give the jiggling orb of ${his} belly a slap, eliciting a burp from the full slave and tons of motion from ${his} gut. ${He} `); + if (canSee(slave)) { + r.push(`looks in your eyes,`); + } else { + r.push(`faces you,`); + } + r.push(`as though almost demanding answers. ${He} looks apprehensive about what you will do next. You order ${him} to keep ${himself} filled with four liters of ${slave.inflationType} until you say otherwise, before helping ${his} hiccupping bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears ${his} meal might be coming back up, is the groaning ${slave.slaveName} ready to be moved.`); + } else { + r.push(`You can feel ${his} ${slave.skin} belly swelling with ${slave.inflationType} as it pushes out against your hands. Once you have given ${him} ${his} fill, you give ${his} bloated belly a slap, eliciting a shudder from the bloated slave and a little jiggle from ${his} gut. ${He} `); + if (canSee(slave)) { + r.push(`looks in your eyes,`); + } else { + r.push(`faces you,`); + } + r.push(`as though almost demanding answers. ${He} looks apprehensive about what you will do next. You order ${him} to keep ${himself} filled with two liters of ${slave.inflationType} until you say otherwise, before helping ${his} sloshing bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears ${his} meal might be coming back up, is the hiccupping ${slave.slaveName} ready to be moved.`); + } + } else if (slave.devotion <= 20) { + if (canMove(slave)) { + r.push(`You instruct ${him} to take a seat on your lap and open ${his} mouth wide for the hose. ${He} complies without comment and settles ${himself} onto your lap, shuddering slightly as you wrap your arms around ${his}`); + } else if (hasAnyLimbs(slave)) { + r.push(`You inform ${him} ${he}'ll be taking a seat on your lap, opening ${his} mouth wide for the hose, and drinking until you tell ${him} ${he} is full enough. ${He} complies without comment. You heft ${him} onto your lap, wrapping your arms around ${his}`); + } else { + r.push(`${He}'s hesitant of being filled with `); + if (slave.inflation > 0) { + r.push(`more `); + } + r.push(`${slave.inflationType}, but as an amputee can do nothing about it. You heft ${him} onto your lap, wrapping your arms around ${his}`); + } + if (slave.weight > 190) { + r.push(`immensely soft`); + } else if (slave.belly >= 150000) { + r.push(belly); + } else if (slave.weight > 160) { + r.push(`massive soft`); + } else if (slave.weight > 130) { + r.push(`giant soft`); + } else if (slave.inflation === 2) { + r.push(`sloshing, ${slave.inflationType}-filled`); + } else if (slave.belly >= 1500) { + r.push(belly); + } else if (slave.weight > 95) { + r.push(`huge soft`); + } else if (slave.inflation === 1) { + r.push(`${slave.inflationType}-bloated`); + } else if (slave.weight > 30) { + r.push(`big soft`); + } else if (slave.weight > 10) { + r.push(`soft`); + } else if (slave.muscles > 95) { + r.push(`chiseled`); + } else if (slave.muscles > 30) { + r.push(`muscular`); + } else if (slave.muscles > 5) { + r.push(`firm, ripped`); + } else { + r.push(`firm, flat`); + } + r.push(`belly. You insert the hose down ${his} throat, choosing to hold it place instead of strapping it to ${him}, and turn the flow to low. With everything in place, you place your free hand on ${his} gurgling stomach.`); + if (slave.inflation === 2) { + r.push(`You can feel ${his} ${slave.skin} belly growing taut with ${slave.inflationType} as it pushes out against your hand. Once you have given ${him} ${his} fill, you give the firm orb of ${his} belly a slap, eliciting a restrained gag from the overfilled slave and no motion at all from ${his} gut. ${He} looks up at you quizzically, unsure about what you will do next. You order ${him} to keep ${himself} filled with two gallons of ${slave.inflationType} until you say otherwise, before helping ${his} hiccupping bulk onto the couch to recover. ${His} meal attempts to come back up on ${his} several times, but ${he} holds it down for fear of punishment should ${he} vomit. Only after a few minutes of rest is the groaning ${slave.slaveName} ready to be moved.`); + } else if (slave.inflation === 1) { + r.push(`You can feel ${his} ${slave.skin} belly growing larger with ${slave.inflationType} as it pushes out against your hand. Once you have given ${him} ${his} fill, you give the jiggling orb of ${his} belly a slap, eliciting a strained burp from the full slave and tons of motion from ${his} gut. ${He} looks up at you quizzically, unsure about what you will do next. You order ${him} to keep ${himself} filled with four liters of ${slave.inflationType} until you say otherwise, before helping ${his} hiccupping bulk onto the couch to recover. ${His} meal attempts to come back up on ${his} several times, but ${he} holds it down for fear of punishment should ${he} vomit. Only after a few minutes of rest is the groaning ${slave.slaveName} ready to be moved.`); + } else { + r.push(`You can feel ${his} ${slave.skin} belly swelling with ${slave.inflationType} as it pushes out against your hand. Once you have given ${him} ${his} fill, you give ${his} bloated belly a slap, eliciting a small shudder from the bloated slave and a little jiggle from ${his} gut. ${He} looks up at you quizzically, unsure about what you will do next. You order ${him} to keep ${himself} filled with two liters of ${slave.inflationType} until you say otherwise, before helping ${his} sloshing bulk onto the couch to recover. ${His} meal attempts to come back up on ${his} several times, but ${he} holds it down for fear of punishment should ${he} vomit. Only after a few minutes of rest is the groaning ${slave.slaveName} ready to be moved.`); + } + } else if (slave.devotion <= 50) { + if (canMove(slave)) { + r.push(`You instruct ${him} to take a seat on your lap and open ${his} mouth wide for the hose. ${He} hesitates but eventually settles ${himself} onto your lap as you wrap your arms around ${his}`); + } else if (hasAnyLimbs(slave)) { + r.push(`You inform ${him} ${he}'ll be taking a seat on your lap, opening ${his} mouth wide for the hose, and drinking until you tell ${him} ${he} is full enough. ${He} hesitates for a moment, before demonstrating acceptance. You heft ${him} onto your lap, wrapping your arms around ${his}`); + } else { + r.push(`${He}'s mildly hesitant of being filled with `); + if (slave.inflation > 0) { + r.push(`more `); + } + r.push(`${slave.inflationType}, but as an amputee can do nothing about it. You heft ${him} onto your lap, wrapping your arms around ${his}`); + } + if (slave.weight > 190) { + r.push(`immensely soft`); + } else if (slave.belly >= 150000) { + r.push(belly); + } else if (slave.weight > 160) { + r.push(`massive soft`); + } else if (slave.weight > 130) { + r.push(`giant soft`); + } else if (slave.inflation === 2) { + r.push(`sloshing, ${slave.inflationType}-filled`); + } else if (slave.belly >= 1500) { + r.push(belly); + } else if (slave.weight > 95) { + r.push(`huge soft`); + } else if (slave.inflation === 1) { + r.push(`${slave.inflationType}-bloated`); + } else if (slave.weight > 30) { + r.push(`big soft`); + } else if (slave.weight > 10) { + r.push(`soft`); + } else if (slave.muscles > 95) { + r.push(`chiseled`); + } else if (slave.muscles > 30) { + r.push(`muscular`); + } else if (slave.muscles > 5) { + r.push(`firm, ripped`); + } else { + r.push(`firm, flat`); + } + r.push(`belly. You `); + if (hasAnyArms(slave)) { + r.push(`hand ${him} the hose,`); + } else { + r.push(`place the hose in ${his} mouth,`); + } + r.push(`allowing ${him} to drink from it at ${his} own pace, as you keep a hand on the tap to control the flow. With everything in place, you place your free hand on ${his} gurgling stomach.`); + if (slave.inflation === 2) { + r.push(`You can feel ${his} ${slave.skin} belly growing taut with ${slave.inflationType} as it pushes out against your hand. Once you have given ${him} ${his} fill, you give the firm orb of ${his} belly a couple gentle pats, eliciting a small hiccup, that ${he} immediately apologizes for, from the overfilled slave and no motion at all from ${his} gut. ${He} sighs contently, hoping you'll give ${him} more attention. You order ${him} to keep ${himself} filled with two gallons of ${slave.inflationType} until you say otherwise, before helping ${his} heavy body onto the couch to recover. ${His} meal attempts to come back up on ${his} several times, but ${he} dutifully holds it down. Only after a few minutes of rest is the groaning ${slave.slaveName} ready to be moved.`); + } else if (slave.inflation === 1) { + r.push(`You can feel ${his} ${slave.skin} belly growing larger with ${slave.inflationType} as it pushes out against your hand. Once you have given ${him} ${his} fill, you give the jiggling orb of ${his} belly a couple pats, eliciting a small hiccup, that ${he} immediately apologizes for, from the full slave and tons of motion from ${his} gut. ${He} sighs contently, hoping you'll give ${him} more attention. You order ${him} to keep ${himself} filled with four liters of ${slave.inflationType} until you say otherwise, before helping ${his} heavy body onto the couch to recover. ${His} meal attempts to come back up on ${him} several times, but ${he} dutifully holds it down. Only after a few minutes of rest is the groaning ${slave.slaveName} ready to be moved.`); + } else { + r.push(`You can feel ${his} ${slave.skin} belly swelling with ${slave.inflationType} as it pushes out against your hand. Once you have given ${him} ${his} fill, you give ${his} bloated belly a couple pats, eliciting a small hiccup, that ${he} immediately apologizes for, from the bloated slave and a little jiggle from ${his} gut. ${He} sighs contently, hoping you'll give ${him} more attention. You order ${him} to keep ${himself} filled with two liters of ${slave.inflationType} until you say otherwise, before helping ${his} sloshing body onto the couch to recover. ${His} meal attempts to come back up on ${his} several times, but ${he} dutifully holds it down. Only after a few minutes of rest is the groaning ${slave.slaveName} ready to be moved.`); + } + } else { + if (canMove(slave)) { + r.push(`You instruct ${him} to take a seat on your lap and open ${his} mouth wide for the hose. ${He} eagerly settles ${himself} onto your lap as you wrap your arms around ${his}`); + } else if (hasAnyLimbs(slave)) { + r.push(`You inform ${him} ${he}'ll be taking a seat on your lap, opening ${his} mouth wide for the hose, and drinking until you tell ${him} ${he} is full enough. ${He} squirms with excitement as you heft ${him} onto your lap, wrapping your arms around ${his}`); + } else { + r.push(`${He}'s devotedly `); + if (canSee(slave)) { + r.push(`looks`); + } else { + r.push(`smiles`); + } + r.push(` at you as you heft ${him} onto your lap, wrapping your arms around ${his}`); + } + if (slave.weight > 190) { + r.push(`immensely soft`); + } else if (slave.belly >= 150000) { + r.push(belly); + } else if (slave.weight > 160) { + r.push(`massive soft`); + } else if (slave.weight > 130) { + r.push(`giant soft`); + } else if (slave.inflation === 2) { + r.push(`sloshing, ${slave.inflationType}-filled`); + } else if (slave.belly >= 1500) { + r.push(belly); + } else if (slave.weight > 95) { + r.push(`huge soft`); + } else if (slave.inflation === 1) { + r.push(`${slave.inflationType}-bloated`); + } else if (slave.weight > 30) { + r.push(`big soft`); + } else if (slave.weight > 10) { + r.push(`soft`); + } else if (slave.muscles > 95) { + r.push(`chiseled`); + } else if (slave.muscles > 30) { + r.push(`muscular`); + } else if (slave.muscles > 5) { + r.push(`firm, ripped`); + } else { + r.push(`firm, flat`); + } + r.push(`belly. You `); + if (hasAnyArms(slave)) { + r.push(`hand ${him} the hose,`); + } else { + r.push(`place the hose in ${his} mouth,`); + } + r.push(`allowing ${him} to drink from it at ${his} own pace, as you keep a hand on the tap to control the flow. With everything in place, you place your free hand on ${his} gurgling stomach.`); + if (slave.inflation === 2) { + r.push(`You can feel ${his} ${slave.skin} belly growing taut with ${slave.inflationType} as it pushes out against your hand. Once you have given ${him} ${his} fill, you give the firm orb of ${his} belly a couple gentle pats, eliciting a cute burp followed by ${his} tongue running over ${his} lips, from the overfilled slave and no motion at all from ${his} gut. ${He} sighs contently, before eagerly begging for more. You tell ${him} to keep ${himself} filled with two gallons of ${slave.inflationType} until you say otherwise, before helping ${his} heavy body onto the couch to recover. Apart from a few hiccups, ${he} spends ${his} time settling ${his} stomach and teasing ${his} near-bursting belly. Only after a few minutes of rest is the groaning ${slave.slaveName} ready to be moved.`); + } else if (slave.inflation === 1) { + r.push(`You can feel ${his} ${slave.skin} belly growing larger with ${slave.inflationType} as it pushes out against your hand. Once you have given ${him} ${his} fill, you give the jiggling orb of ${his} belly a couple pats, eliciting a cute burp followed by ${his} tongue running over ${his} lips, from the full slave and tons of motion from ${his} gut. ${He} sighs contently, before eagerly begging for more. You tell ${him} to keep ${himself} filled with four liters of ${slave.inflationType} until you say otherwise, before helping ${his} heavy body onto the couch to recover. Apart from a few hiccups, ${he} spends ${his} time settling ${his} stomach and teasing ${his} overfilled belly. Only after a few minutes of rest is the groaning ${slave.slaveName} ready to be moved.`); + } else { + r.push(`You can feel ${his} ${slave.skin} belly swelling with ${slave.inflationType} as it pushes out against your hand. Once you have given ${him} ${his} fill, you give ${his} bloated belly a couple pats, eliciting a cute burp followed by ${his} tongue running over ${his} lips, from the bloated slave and a little jiggle from ${his} gut. ${He} sighs contently, before eagerly begging for more. You tell ${him} to keep ${himself} filled with two liters of ${slave.inflationType} until you say otherwise, before helping ${his} sloshing body onto the couch to recover. Apart from a few hiccups, ${he} spends ${his} time settling ${his} stomach and teasing ${his} bloated belly. Only after a few minutes of rest is the groaning ${slave.slaveName} ready to be moved.`); + } + } + + if (pregDiscovery === 0) { + slave.inflation += 1; + if (slave.inflation === 3) { + if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { + r.push(`${He} gingerly leaves your office, massaging ${his} over-stuffed belly as ${he} goes.`); + } else { + r.push(`${His} belly wobbles heavily as ${he} is helped from your office.`); + } + r.push(`Being filled so full <span class="health dec">surely had negative effects</span> on ${his} health.`); + healthDamage(slave, 10); + } else if (slave.inflation === 2) { + if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { + r.push(`${He} gingerly leaves your office, massaging ${his} stuffed belly as ${he} goes.`); + } else { + r.push(`${His} belly wobbles heavily as ${he} is helped from your office.`); + } + } else if (slave.inflation === 1) { + if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { + r.push(`${He} gingerly leaves your office, massaging ${his} distended belly as ${he} goes.`); + } else { + r.push(`${His} belly wobbles as ${he} is helped from your office.`); + } + } + SetBellySize(slave); + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fillUpFace.tw b/src/npc/interaction/fillUpFace.tw deleted file mode 100644 index 090b91f86f5e48c644978a59c2dce32a9c269e2c..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fillUpFace.tw +++ /dev/null @@ -1,229 +0,0 @@ -:: FillUpFace [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<set getSlave($AS).bellyAccessory = "none">> -<<set _pregDiscovery = 0>> -<<set _belly = bellyAdjective(getSlave($AS))>> -You attach a hose to $dairyName tap with the pipes set to pump <<= getSlave($AS).inflationType>> and affix a special nozzle to it, one with straps useful for anchoring it to resisting slaves, before calling $him over so you can feel $him up while you force-feed $him <<= getSlave($AS).inflationType>>. - -<<if getSlave($AS).inflation > 1 && getSlave($AS).preg > 1>> - $He looks uneasy at the prospect of taking in that much, far more than could be considered normal. - <<set _pregDiscovery = 1>> -<<else>> - <<if (getSlave($AS).fetish == "submissive") && (getSlave($AS).devotion >= -20)>> - $He blushes at the thought of being forcibly fed. - <<elseif (getSlave($AS).fetish == "cumslut") && (getSlave($AS).devotion >= -20) && (getSlave($AS).inflationType == "cum")>> - $He's pleased at the idea of turning into a cum balloon. - <</if>> - <<if (getSlave($AS).behavioralFlaw == "gluttonous") && (getSlave($AS).devotion >= -20) && ((getSlave($AS).inflationType == "cum") || (getSlave($AS).inflationType == "milk"))>> - $He's thrilled that you are going to give $him such a filling meal. - <<elseif (getSlave($AS).behavioralFlaw == "anorexic") && (getSlave($AS).devotion >= -20) && ((getSlave($AS).inflationType == "cum") || (getSlave($AS).inflationType == "milk"))>> - $He's hesitant about whether or not you are trying to make $him gain weight. - <</if>> -<</if>> - -<<if _pregDiscovery == 1>> - Not wanting to risk such a mess, you send $him for a medical examination. While most of the tests come back normal, one in particular catches your eye; @@.lime;$He is pregnant<<if getSlave($AS).preg > getSlave($AS).pregData.normalBirth/4>> and surprisingly far along<</if>>.@@ $He should be able to still handle at least two liters of <<= getSlave($AS).inflationType>>, however. - <<run deflate(getSlave($AS))>> - <<set getSlave($AS).pregKnown = 1>> -<<elseif getSlave($AS).fetish == "mindbroken">> - <<if canMove(getSlave($AS))>> - You instruct $him to take a seat on your lap and open $his mouth wide for the hose, but $he remains still and unresponsive. Talking to a broken mind is pointless. - <</if>> - You reach out and wrap your arms around $his - <<if getSlave($AS).weight > 190>> - immensely soft - <<elseif getSlave($AS).belly >= 150000>> - _belly - <<elseif getSlave($AS).weight > 160>> - massive soft - <<elseif getSlave($AS).weight > 130>> - giant soft - <<elseif getSlave($AS).inflation == 2>> - sloshing, <<print getSlave($AS).inflationType>>-filled - <<elseif getSlave($AS).belly >= 1500>> - _belly - <<elseif getSlave($AS).weight > 95>> - huge soft - <<elseif getSlave($AS).inflation == 1>> - <<print getSlave($AS).inflationType>>-bloated - <<elseif getSlave($AS).weight > 30>> - big soft - <<elseif getSlave($AS).weight > 10>> - soft - <<elseif getSlave($AS).muscles > 95>> - chiseled - <<elseif getSlave($AS).muscles > 30>> - muscular - <<elseif getSlave($AS).muscles > 5>> - firm, ripped - <<else>> - firm, flat - <</if>> - belly, pulling $him into your lap. You force the hose down $his throat, strapping it to $his head to prevent it from slipping out, and turn the flow to low. With everything in place, you return your hands to $his gurgling stomach.<<if getSlave($AS).inflation == 2>>You can feel $his <<= getSlave($AS).skin>> belly growing taut with <<= getSlave($AS).inflationType>> as it pushes out against your hands. Once you have given $him $his fill, you give the firm orb of $his belly a slap, eliciting a large belch from the broken slave and no motion at all from $his gut. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his hiccupping bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears $his meal might be coming back up, is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<elseif getSlave($AS).inflation == 1>>You can feel $his <<= getSlave($AS).skin>> belly growing larger with <<= getSlave($AS).inflationType>> as it pushes out against your hands. Once you have given $him $his fill, you give the jiggling orb of $his belly a slap, eliciting a burp from the broken slave and tons of motion from $his gut. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his hiccupping bulk onto the couch to recover, After a few minutes of rest, and several glares from you when it appears $his meal might be coming back up, is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<else>>You can feel $his <<= getSlave($AS).skin>> belly swelling with <<= getSlave($AS).inflationType>> as it pushes out against your hands. Once you have given $him $his fill, you give $his bloated belly a slap, eliciting a small burp from the broken slave and a little jiggle from $his gut. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his sloshing bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears $his meal might be coming back up, is the hiccupping <<= getSlave($AS).slaveName>> ready to be moved<</if>>. -<<elseif getSlave($AS).devotion < -20>> - <<if canMove(getSlave($AS))>> - You instruct $him to take a seat on your lap and open $his mouth wide for the hose. Opposed to the thought of being filled <<if getSlave($AS).inflation > 0>>more <</if>>with <<= getSlave($AS).inflationType>>, $he tries to <<if canWalk(getSlave($AS))>>step back<<else>>crawl away<</if>>, but you catch $him and pull $him into your lap, wrapping your arms around $his - <<elseif (hasAnyLimbs(getSlave($AS)))>> - You inform $him $he'll be taking a seat on your lap, opening $his mouth wide for the hose, and drinking until you tell $him $he is full enough. $He's opposed to the thought of being filled with<<if getSlave($AS).inflation > 0>> more<</if>> <<= getSlave($AS).inflationType>>, but since $he is immobile, $he can't escape. You heft $him onto your lap, wrapping your arms around $his - <<else>> - $He's opposed to the thought of being filled with <<if getSlave($AS).inflation > 0>>more <</if>><<= getSlave($AS).inflationType>>, but as an amputee can do nothing about it. You heft $him onto your lap, wrapping your arms around $him - <</if>> - <<if getSlave($AS).weight > 190>> - immensely soft - <<elseif getSlave($AS).belly >= 150000>> - _belly - <<elseif getSlave($AS).weight > 160>> - massive soft - <<elseif getSlave($AS).weight > 130>> - giant soft - <<elseif getSlave($AS).inflation == 2>> - sloshing, <<print getSlave($AS).inflationType>>-filled - <<elseif getSlave($AS).belly >= 1500>> - _belly - <<elseif getSlave($AS).weight > 95>> - huge soft - <<elseif getSlave($AS).inflation == 1>> - <<print getSlave($AS).inflationType>>-bloated - <<elseif getSlave($AS).weight > 30>> - big soft - <<elseif getSlave($AS).weight > 10>> - soft - <<elseif getSlave($AS).muscles > 95>> - chiseled - <<elseif getSlave($AS).muscles > 30>> - muscular - <<elseif getSlave($AS).muscles > 5>> - firm, ripped - <<else>> - firm, flat - <</if>> - belly. You force the hose down $his throat, strapping it to $his head to prevent $him from removing it, and turn the flow to low. With everything in place, you return your hands to $his gurgling stomach.<<if getSlave($AS).inflation == 2>>You can feel $his <<= getSlave($AS).skin>> belly growing taut with <<= getSlave($AS).inflationType>> as it pushes out against your hands. Once you have given $him $his fill, you give the firm orb of $his belly a slap, eliciting gagging from the overfilled slave and no motion at all from $his gut. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his hiccupping bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears $his meal might be coming back up, is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<elseif getSlave($AS).inflation == 1>>You can feel $his <<= getSlave($AS).skin>> belly growing larger with <<= getSlave($AS).inflationType>> as it pushes out against your hands. Once you have given $him $his fill, you give the jiggling orb of $his belly a slap, eliciting a burp from the full slave and tons of motion from $his gut. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his hiccupping bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears $his meal might be coming back up, is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<else>>You can feel $his <<= getSlave($AS).skin>> belly swelling with <<= getSlave($AS).inflationType>> as it pushes out against your hands. Once you have given $him $his fill, you give $his bloated belly a slap, eliciting a shudder from the bloated slave and a little jiggle from $his gut. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his sloshing bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears $his meal might be coming back up, is the hiccupping <<= getSlave($AS).slaveName>> ready to be moved<</if>>. -<<elseif getSlave($AS).devotion <= 20>> - <<if canMove(getSlave($AS))>> - You instruct $him to take a seat on your lap and open $his mouth wide for the hose. $He complies without comment and settles $himself onto your lap, shuddering slightly as you wrap your arms around $his - <<elseif (hasAnyLimbs(getSlave($AS)))>> - You inform $him $he'll be taking a seat on your lap, opening $his mouth wide for the hose, and drinking until you tell $him $he is full enough. $He complies without comment. You heft $him onto your lap, wrapping your arms around $his - <<else>> - $He's hesitant of being filled with <<if getSlave($AS).inflation > 0>>more <</if>><<= getSlave($AS).inflationType>>, but as an amputee can do nothing about it. You heft $him onto your lap, wrapping your arms around $his - <</if>> - <<if getSlave($AS).weight > 190>> - immensely soft - <<elseif getSlave($AS).belly >= 150000>> - _belly - <<elseif getSlave($AS).weight > 160>> - massive soft - <<elseif getSlave($AS).weight > 130>> - giant soft - <<elseif getSlave($AS).inflation == 2>> - sloshing, <<print getSlave($AS).inflationType>>-filled - <<elseif getSlave($AS).belly >= 1500>> - _belly - <<elseif getSlave($AS).weight > 95>> - huge soft - <<elseif getSlave($AS).inflation == 1>> - <<print getSlave($AS).inflationType>>-bloated - <<elseif getSlave($AS).weight > 30>> - big soft - <<elseif getSlave($AS).weight > 10>> - soft - <<elseif getSlave($AS).muscles > 95>> - chiseled - <<elseif getSlave($AS).muscles > 30>> - muscular - <<elseif getSlave($AS).muscles > 5>> - firm, ripped - <<else>> - firm, flat - <</if>> - belly. You insert the hose down $his throat, choosing to hold it place instead of strapping it to $him, and turn the flow to low. With everything in place, you place your free hand on $his gurgling stomach.<<if getSlave($AS).inflation == 2>>You can feel $his <<= getSlave($AS).skin>> belly growing taut with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give the firm orb of $his belly a slap, eliciting a restrained gag from the overfilled slave and no motion at all from $his gut. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his hiccupping bulk onto the couch to recover. $His meal attempts to come back up on $his several times, but $he holds it down for fear of punishment should $he vomit. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<elseif getSlave($AS).inflation == 1>>You can feel $his <<= getSlave($AS).skin>> belly growing larger with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give the jiggling orb of $his belly a slap, eliciting a strained burp from the full slave and tons of motion from $his gut. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his hiccupping bulk onto the couch to recover. $His meal attempts to come back up on $his several times, but $he holds it down for fear of punishment should $he vomit. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<else>>You can feel $his <<= getSlave($AS).skin>> belly swelling with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give $his bloated belly a slap, eliciting a small shudder from the bloated slave and a little jiggle from $his gut. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his sloshing bulk onto the couch to recover. $His meal attempts to come back up on $his several times, but $he holds it down for fear of punishment should $he vomit. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<</if>>. -<<elseif getSlave($AS).devotion <= 50>> - <<if canMove(getSlave($AS))>> - You instruct $him to take a seat on your lap and open $his mouth wide for the hose. $He hesitates but eventually settles $himself onto your lap as you wrap your arms around $his - <<elseif (hasAnyLimbs(getSlave($AS)))>> - You inform $him $he'll be taking a seat on your lap, opening $his mouth wide for the hose, and drinking until you tell $him $he is full enough. $He hesitates for a moment, before demonstrating acceptance. You heft $him onto your lap, wrapping your arms around $his - <<else>> - $He's mildly hesitant of being filled with <<if getSlave($AS).inflation > 0>>more <</if>><<= getSlave($AS).inflationType>>, but as an amputee can do nothing about it. You heft $him onto your lap, wrapping your arms around $his - <</if>> - <<if getSlave($AS).weight > 190>> - immensely soft - <<elseif getSlave($AS).belly >= 150000>> - _belly - <<elseif getSlave($AS).weight > 160>> - massive soft - <<elseif getSlave($AS).weight > 130>> - giant soft - <<elseif getSlave($AS).inflation == 2>> - sloshing, <<print getSlave($AS).inflationType>>-filled - <<elseif getSlave($AS).belly >= 1500>> - _belly - <<elseif getSlave($AS).weight > 95>> - huge soft - <<elseif getSlave($AS).inflation == 1>> - <<print getSlave($AS).inflationType>>-bloated - <<elseif getSlave($AS).weight > 30>> - big soft - <<elseif getSlave($AS).weight > 10>> - soft - <<elseif getSlave($AS).muscles > 95>> - chiseled - <<elseif getSlave($AS).muscles > 30>> - muscular - <<elseif getSlave($AS).muscles > 5>> - firm, ripped - <<else>> - firm, flat - <</if>> - belly. You <<if hasAnyArms(getSlave($AS))>>hand $him the hose<<else>>place the hose in $his mouth<</if>>, allowing $him to drink from it at $his own pace, as you keep a hand on the tap to control the flow. With everything in place, you place your free hand on $his gurgling stomach.<<if getSlave($AS).inflation == 2>>You can feel $his <<= getSlave($AS).skin>> belly growing taut with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give the firm orb of $his belly a couple gentle pats, eliciting a small hiccup, that $he immediately apologizes for, from the overfilled slave and no motion at all from $his gut. $He sighs contently, hoping you'll give $him more attention. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his heavy body onto the couch to recover. $His meal attempts to come back up on $his several times, but $he dutifully holds it down. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<elseif getSlave($AS).inflation == 1>>You can feel $his <<= getSlave($AS).skin>> belly growing larger with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give the jiggling orb of $his belly a couple pats, eliciting a small hiccup, that $he immediately apologizes for, from the full slave and tons of motion from $his gut. $He sighs contently, hoping you'll give $him more attention. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his heavy body onto the couch to recover. $His meal attempts to come back up on $him several times, but $he dutifully holds it down. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<else>>You can feel $his <<= getSlave($AS).skin>> belly swelling with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give $his bloated belly a couple pats, eliciting a small hiccup, that $he immediately apologizes for, from the bloated slave and a little jiggle from $his gut. $He sighs contently, hoping you'll give $him more attention. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his sloshing body onto the couch to recover. $His meal attempts to come back up on $his several times, but $he dutifully holds it down. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<</if>>. -<<else>> - <<if canMove(getSlave($AS))>> - You instruct $him to take a seat on your lap and open $his mouth wide for the hose. $He eagerly settles $himself onto your lap as you wrap your arms around $his - <<elseif (hasAnyLimbs(getSlave($AS)))>> - You inform $him $he'll be taking a seat on your lap, opening $his mouth wide for the hose, and drinking until you tell $him $he is full enough. $He squirms with excitement as you heft $him onto your lap, wrapping your arms around $his - <<else>> - $He's devotedly <<if canSee(getSlave($AS))>>looks<<else>>smiles<</if>> at you as you heft $him onto your lap, wrapping your arms around $his - <</if>> - <<if getSlave($AS).weight > 190>> - immensely soft - <<elseif getSlave($AS).belly >= 150000>> - _belly - <<elseif getSlave($AS).weight > 160>> - massive soft - <<elseif getSlave($AS).weight > 130>> - giant soft - <<elseif getSlave($AS).inflation == 2>> - sloshing, <<print getSlave($AS).inflationType>>-filled - <<elseif getSlave($AS).belly >= 1500>> - _belly - <<elseif getSlave($AS).weight > 95>> - huge soft - <<elseif getSlave($AS).inflation == 1>> - <<print getSlave($AS).inflationType>>-bloated - <<elseif getSlave($AS).weight > 30>> - big soft - <<elseif getSlave($AS).weight > 10>> - soft - <<elseif getSlave($AS).muscles > 95>> - chiseled - <<elseif getSlave($AS).muscles > 30>> - muscular - <<elseif getSlave($AS).muscles > 5>> - firm, ripped - <<else>> - firm, flat - <</if>> - belly. You <<if hasAnyArms(getSlave($AS))>>hand $him the hose<<else>>place the hose in $his mouth<</if>>, allowing $him to drink from it at $his own pace, as you keep a hand on the tap to control the flow. With everything in place, you place your free hand on $his gurgling stomach.<<if getSlave($AS).inflation == 2>>You can feel $his <<= getSlave($AS).skin>> belly growing taut with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give the firm orb of $his belly a couple gentle pats, eliciting a cute burp followed by $his tongue running over $his lips, from the overfilled slave and no motion at all from $his gut. $He sighs contently, before eagerly begging for more. You tell $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his heavy body onto the couch to recover. Apart from a few hiccups, $he spends $his time settling $his stomach and teasing $his near-bursting belly. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<elseif getSlave($AS).inflation == 1>>You can feel $his <<= getSlave($AS).skin>> belly growing larger with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give the jiggling orb of $his belly a couple pats, eliciting a cute burp followed by $his tongue running over $his lips, from the full slave and tons of motion from $his gut. $He sighs contently, before eagerly begging for more. You tell $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his heavy body onto the couch to recover. Apart from a few hiccups, $he spends $his time settling $his stomach and teasing $his overfilled belly. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<else>>You can feel $his <<= getSlave($AS).skin>> belly swelling with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give $his bloated belly a couple pats, eliciting a cute burp followed by $his tongue running over $his lips, from the bloated slave and a little jiggle from $his gut. $He sighs contently, before eagerly begging for more. You tell $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his sloshing body onto the couch to recover. Apart from a few hiccups, $he spends $his time settling $his stomach and teasing $his bloated belly. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<</if>>. -<</if>> - -<<if _pregDiscovery == 0>> - <<set getSlave($AS).inflation += 1>> - <<if getSlave($AS).inflation == 3>> - <<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>$He gingerly leaves your office, massaging $his over-stuffed belly as $he goes<<else>>$His belly wobbles heavily as $he is helped from your office<</if>>. Being filled so full @@.health.dec;surely had negative effects@@ on $his health. - <<run healthDamage(getSlave($AS), 10)>> - <<elseif getSlave($AS).inflation == 2>> - <<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>$He gingerly leaves your office, massaging $his stuffed belly as $he goes<<else>>$His belly wobbles heavily as $he is helped from your office<</if>>. - <<elseif getSlave($AS).inflation == 1>> - <<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>$He gingerly leaves your office, massaging $his distended belly as $he goes<<else>>$His belly wobbles as $he is helped from your office<</if>>. - <</if>> - <<run SetBellySize(getSlave($AS))>> -<</if>> diff --git a/src/npc/interaction/fondleBoobs.js b/src/npc/interaction/fondleBoobs.js new file mode 100644 index 0000000000000000000000000000000000000000..cb63b1051d66269c5d878e0af6820a1c635ceab3 --- /dev/null +++ b/src/npc/interaction/fondleBoobs.js @@ -0,0 +1,685 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fondleBoobs = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, hers, him, himself, woman, girl + } = getPronouns(slave); + + const {title: Master, say: say} = getEnunciation(slave); + + r.push(`You call ${him} over so you can fondle ${his}`); + if (slave.boobs >= 20000) { + r.push(`colossal tits.`); + } else if (slave.boobs >= 10000) { + r.push(`massive tits.`); + } else if (slave.boobs >= 5000) { + r.push(`monster tits.`); + } else if (slave.boobs >= 1000) { + r.push(`huge tits.`); + } else if (slave.boobsImplant > 250) { + r.push(`fake tits.`); + } else if (slave.boobs >= 650) { + r.push(`big tits.`); + } else if (slave.boobs >= 300) { + r.push(`small tits.`); + } else { + r.push(`flat tits.`); + } + + if (slave.nipples === "huge") { + r.push(`${His} nipples are so large they give ${his} breasts an unavoidably lewd appeal as they jut outward.`); + } else if (slave.nipples === "puffy") { + r.push(`${His} puffy nipples beg to be sucked.`); + } else if (slave.nipples === "flat") { + r.push(`${His} nipples form lewd little circles amid ${his} areolae.`); + } else if (slave.nipples === "partially inverted" && slave.nipplesPiercing === 0) { + r.push(`${His} partially inverted nipples should protrude at the slightest stimulation.`); + } else if (slave.nipples === "inverted" && slave.nipplesPiercing === 0) { + r.push(`${His} inverted nipples form lewd little creases across ${his} areolae.`); + } else if (slave.nipples === "fuckable") { + if (slave.lactation) { + r.push(`${His} nipplecunts are leaking milk and begging to be penetrated.`); + } else { + r.push(`${His} nipplecunts form lewd little slits across ${his} areolae.`); + } + } else { + r.push(`${His} erect nipples point enticingly outwards.`); + } + + if (slave.boobsTat === "tribal patterns") { + r.push(`The tattoos on ${his} breasts certainly draw attention to ${his} nipples.`); + } + + if (slave.nipplesPiercing > 1 && !hasAnyLegs(slave)) { + r.push(`You play with the chain between ${his} nipples.`); + } else if (slave.nipplesPiercing > 1) { + r.push(`You pull ${him} over by the chain between ${his} nipples.`); + } else if (slave.nipplesPiercing === 1) { + r.push(`${His} nipple piercings glint enticingly.`); + } + + if (isAmputee(slave)) { + r.push(`${His} limbless`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`torso is a sight to behold. You place your hands on ${his} breasts and you gently massage`); + if (slave.boobs >= 20000) { + r.push(`${his} colossal tits, doing your best to not miss`); + if (V.showInches === 2) { + r.push(`an inch`); + } else { + r.push(`a centimeter`); + } + r.push(`of their immense size,`); + } else if (slave.boobs >= 10000) { + r.push(`${his} massive tits, your hands sinking deep into their soft flesh,`); + } else if (slave.boobs >= 5000) { + r.push(`${his} monster tits, bouncing their weighty mass in your hands,`); + } else if (slave.boobs > 1000) { + r.push(`${his} huge tits, bouncing them up and down in your hands, while simultaneously`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} ${slave.nipples} nipples,`); + } else { + r.push(`rubbing ${his} ${slave.nipples} nipples with your fingers and thumbs,`); + } + } else if (slave.boobs > 650) { + r.push(`${his} large tits, jiggling them enticingly with your hands,`); + } else if (slave.boobs > 300) { + r.push(`${his} cute breasts, cupping them and gently`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} ${slave.nipples} nipples,`); + } else { + r.push(`playing with ${his} nipples between your fingers and thumbs,`); + } + } else { + r.push(`${his} flat breasts, gently`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} ${slave.nipples} nipples,`); + } else { + r.push(`playing with ${his} nipples between your fingers and thumbs,`); + } + } + r.push(`teasing them and pulling them gently towards you. Moving your head close to ${his} breasts, you nuzzle on a nipple with your lips and even lick it delicately with your tongue.`); + if (slave.nipples !== "fuckable") { + r.push(`Then you alternate, gently nibbling with your teeth on the other nipple. You squeeze the tips of ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`nipples with your thumbs and fingers and tweak them in your fingertips, then you dab ${his} nipples with your thumbs, flicking them in different directions.`); + } else { + r.push(`Then you alternate, gently probing the depths of the other nipple. You dig deep into both ${his} breasts, teasing what was once the tips of ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`nipples with your fingers before vigorously fingering ${his} tits.`); + } + r.push(`${He} starts to pant heavily while ${he} lies helpless at your playing with ${his} breasts and ${he} cannot do anything against the relentless fondling. ${He} wriggles and squirms at the continued stimulation, getting aroused at the expert way you move around ${his} tits and nipples.`); + } else if (slave.fetish === "boobs" && slave.fetishStrength > 60 && slave.fetishKnown === 1) { + r.push(`${He} comes over excitedly at the thought of ${his} breasts getting touched. ${He} stands in between you and your desk, already presenting ${his} breasts for you. You place your hands on ${his} breasts and you gently massage`); + if (slave.boobs >= 20000) { + r.push(`${his} colossal tits, before sinking your body into their immense softness,`); + } else if (slave.boobs >= 10000) { + r.push(`${his} massive tits, before sinking your arms into their soft mass,`); + } else if (slave.boobs >= 5000) { + r.push(`${his} monster tits, bouncing their weighty mass in your hands,`); + } else if (slave.boobs > 1000) { + r.push(`${his} huge tits, bouncing them up and down in your hands, while simultaneously`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} ${slave.nipples} nipples,`); + } else { + r.push(`rubbing ${his} ${slave.nipples} nipples with your fingers and thumbs,`); + } + } else if (slave.boobs > 650) { + r.push(`${his} large tits, jiggling them enticingly with your hands,`); + } else if (slave.boobs > 300) { + r.push(`${his} cute breasts, cupping them and gently`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} ${slave.nipples} nipples,`); + } else { + r.push(`playing with ${his} nipples between your fingers and thumbs,`); + } + } else { + r.push(`${his} flat breasts gently`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} engorged ${slave.nipples} nipples,`); + } else { + r.push(`playing with ${his} hard, erect nipples between your fingers and thumbs,`); + } + } + r.push(`teasing them and pulling them gently towards you. Moving your head close to ${his} breasts, you nuzzle on a nipple with your lips and even lick it delicately with your tongue.`); + if (slave.nipples !== "fuckable") { + r.push(`Then you alternate, gently nibbling with your teeth on the other nipple. You squeeze the tips of ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`nipples with your thumbs and fingers and tweak them in your fingertips, then you dab ${his} nipples with your thumbs, flicking them in different directions. ${He} moans at your playing with ${his} breasts, ${He} rubs ${himself} while you do, getting intensely aroused at the expert way you move around ${his} tits and nipples. You continue, rolling ${his} ${slave.nipples} nipples between your fingers and thumbs while ${he} gets increasingly frenzied at the continued stimulation. When it seems like ${he}'s close, you give them a hard pull, sending ${him} gasping over the edge of ecstasy.`); + } else { + r.push(`Then you alternate, gently probing the depths of the other nipple. You dig deep into both ${his} breasts, teasing what was once the tips of ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`nipples with your fingers before vigorously fingering ${his} tits. ${He} moans at your playing with ${his} breasts, ${He} rubs ${himself} while you do, getting intensely aroused at the expert way you move around ${his} tits and nipples. You continue, adding more fingers into ${his} ${slave.nipples} nipples while ${he} gets increasingly frenzied at the continued stimulation. When it seems like ${he}'s close, you cram your whole fist in, sending ${him} gasping over the edge of ecstasy.`); + } + } else if (slave.devotion > 50 && slave.fetish === "dom" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`${He} eagerly comes over to you, puffing ${his} chest out at you. When you place your hands on ${his}`); + if (slave.boobs >= 20000) { + r.push(`colossal tits,`); + } else if (slave.boobs >= 10000) { + r.push(`massive tits,`); + } else if (slave.boobs >= 5000) { + r.push(`monster tits,`); + } else if (slave.boobs >= 1000) { + r.push(`huge tits,`); + } else if (slave.boobsImplant > 250) { + r.push(`fake tits,`); + } else if (slave.boobs >= 650) { + r.push(`big tits,`); + } else if (slave.boobs >= 300) { + r.push(`cute breasts,`); + } else { + r.push(`flat breasts,`); + } + if (hasAnyArms(slave)) { + r.push(`${he} places ${his} hand`); + if (hasBothArms(slave)) { + r.push(`s`); + } + r.push(`on your`); + if (V.PC.boobs >= 300) { + r.push(`bosom`); + } else if (V.PC.title === 0) { + r.push(`flat chest`); + } else { + r.push(`manly chest`); + } + r.push(`in turn, ${his} tendency towards sexual dominance encouraging ${him} to compete with you in fondling each other.`); + } + r.push(`You both alternate between taking your mouth to ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`nipples and ${hers} to yours, gently nuzzling and nibbling while simultaneously fondling each other all the while. Both of you continue to passionately lick, nibble, stroke and fondle one other until tiredly, ${he} slows down. When you eventually stop, ${he} looks up at you happily.`); + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate excitement with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)},`); + } else { + r.push(`face,`); + } + r.push(`since ${he} does not speak ${V.language} well enough to express ${himself}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate excitement with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)}.`); + } else { + r.push(`face.`); + } + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} liked that.`); + } else { + r.push(Spoken(slave, `"That was fun, ${Master},"`)); + r.push(`${he} ${say}s cheerfully.`); + } + if (canSee(slave)) { + r.push(`${He} looks at you with ${his} ${App.Desc.eyesColor(slave)}, smiling.`); + } else { + r.push(`${He} smiles at you.`); + } + } else if (slave.fetish === "submissive" && slave.fetishStrength > 60 && slave.fetishKnown === 1) { + r.push(`${He} eagerly comes over to you, to stand between you and your desk. You lean over while ${he} submissively lies down upon it, face-up, with ${his} breasts pointed to the air. You place your hands on ${his}`); + if (slave.boobs >= 20000) { + r.push(`colossal tits, before sinking your body into their immense softness,`); + } else if (slave.boobs >= 10000) { + r.push(`massive tits, before sinking your arms into their soft mass,`); + } else if (slave.boobs >= 5000) { + r.push(`monster tits, bouncing their weighty mass in your hands,`); + } else if (slave.boobs > 1000) { + r.push(`huge tits, bouncing them up and down in your hands, while simultaneously`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} ${slave.nipples} nipples,`); + } else { + r.push(`rubbing ${his} ${slave.nipples} nipples with your fingers and thumbs,`); + } + } else if (slave.boobs > 650) { + r.push(`large tits, jiggling them enticingly with your hands,`); + } else if (slave.boobs > 300) { + r.push(`cute breasts, cupping them and gently`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} ${slave.nipples} nipples,`); + } else { + r.push(`playing with ${his} nipples between your fingers and thumbs,`); + } + } else { + r.push(`flat breasts, gently`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} engorged ${slave.nipples} nipples,`); + } else { + r.push(`playing with ${his} hard, erect nipples between your fingers and thumbs,`); + } + } + r.push(`teasing them and pulling them gently towards you. Moving your head close to ${his} breasts, you nuzzle on a nipple with your lips and even lick it delicately with your tongue.`); + if (slave.nipples !== "fuckable") { + r.push(`Then you alternate, gently nibbling with your teeth on the other nipple. You squeeze the tips of ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`nipples with your thumbs and fingers and tweak them in your fingertips, then you dab ${his} nipples with your thumbs, flicking them in different directions.`); + } else { + r.push(`Then you alternate, gently probing the depths of the other nipple. You dig deep into both ${his} breasts, teasing what was once the tips of ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`nipples with your fingers before vigorously fingering ${his} tits.`); + } + r.push(`${He} moans passionately at the continued stimulation of ${his} breasts and nipples. When you finally stop, ${he} reaches up to your face with ${his} hand and lovingly strokes it, a blissful look on ${his} ${slave.skin} face.`); + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate devotion with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)},`); + } else { + r.push(`face,`); + } + r.push(`since ${he}'s not confident in ${his} ability to express it in ${V.language}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate devotion with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)}.`); + } else { + r.push(`face.`); + } + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves you.`); + } else { + r.push(Spoken(slave, `"Please don't stop, ${Master},"`)); + r.push(`${he} ${say}s quietly.`); + } + r.push(`${He}`); + if (canSee(slave)) { + r.push(`looks`); + } else { + r.push(`gazes`); + } + r.push(`at you longingly, eager for more.`); + } else if (slave.fetish === "masochist" && slave.fetishStrength > 60 && slave.fetishKnown === 1) { + r.push(`${He} hurriedly comes over to you, to stand between you and your desk. You lean over while ${he} lies down upon it, face-up, with ${his} breasts pointed to the air. ${He} gasps as you slap your hands on ${his}`); + if (slave.boobs >= 20000) { + r.push(`colossal tits, before sinking your body into their immense softness before pulling back and struggling to grasp both nipples at once,`); + } else if (slave.boobs >= 10000) { + r.push(`massive tits, using your entire arms to roughly jiggle them before pulling back to maul ${his} nipples,`); + } else if (slave.boobs >= 5000) { + r.push(`monster tits, bouncing their weighty mass roughly with all your might before sliding your hands to ${his} nipples,`); + } else if (slave.boobs > 1000) { + r.push(`huge tits, bouncing them roughly up and down in your hands, while simultaneously`); + if (slave.nipples === "fuckable") { + r.push(`shoving your fingers in and out of ${his} ${slave.nipples} nipples,`); + } else { + r.push(`flicking ${his} nipples hard with your fingers and thumbs,`); + } + } else if (slave.boobs > 650) { + r.push(`large tits, jiggling them enticingly with your hands,`); + } else if (slave.boobs > 300) { + r.push(`cute breasts, cupping them and roughly`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} ${slave.nipples} nipples,`); + } else { + r.push(`playing with ${his} nipples between your fingers and thumbs,`); + } + } else { + r.push(`flat breasts, roughly`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} engorged ${slave.nipples} nipples,`); + } else { + r.push(`playing with ${his} hard, erect nipples between your fingers and thumbs,`); + } + } + r.push(`teasing them and firmly pulling them in all directions.`); + if (slave.nipples !== "fuckable") { + r.push(`Moving your head close to ${his} breasts, you put your lips on a nipple and close your lips firmly around it to pull strongly on it. Then you alternate, bite hard with your teeth on the other. You firmly squeeze the tips of ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`nipples with your thumbs and fingers and tweak them in your fingertips, then you push ${his} nipples with your thumbs, flicking them hard in different directions.`); + } else { + r.push(`Moving your head close to ${his} breasts, you put your lips over a nipple and close your lips firmly over the slit to suck strongly on it. Then you alternate, bite hard with your teeth on the other. You firmly push the tips of your fingers down into the depths of ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`nipples to tweak what was once their tip.`); + } + r.push(`${He} moans passionately at the continued punishment of ${his} breasts and nipples. Your rough play leaves red marks on ${his} breasts and nipples and ${he} becomes even more aroused. When you finally stop ${he} rubs the marks on ${his} breasts with ${his} hands, an ecstatic look on ${his} ${slave.skin} face.`); + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate pleasure with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)},`); + } else { + r.push(`face,`); + } + r.push(`since ${he}'s not confident in ${his} ability to express it in ${V.language}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate ${his} pleasure with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)}.`); + } else { + r.push(`face.`); + } + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves it.`); + } else { + r.push(Spoken(slave, `"Please punish me more, ${Master},"`)); + r.push(`${he} ${say}s quietly.`); + } + r.push(`${He}`); + if (canSee(slave)) { + r.push(`looks`); + } else { + r.push(`gazes`); + } + r.push(`at you longingly, hungry for more.`); + } else if (slave.devotion > 50) { + r.push(`${He} devotedly comes over to you, to stand between you and your desk. ${His} doting`); + r.push(App.Desc.eyesColor(slave)); + r.push(`looking in yours. You place your hands on ${his}`); + if (slave.boobs >= 20000) { + r.push(`colossal tits, before sinking your body into their immense softness,`); + } else if (slave.boobs >= 10000) { + r.push(`massive tits, before sinking into your arms around their soft mass,`); + } else if (slave.boobs >= 5000) { + r.push(`monster tits, bouncing their weighty mass in your hands,`); + } else if (slave.boobs > 1000) { + r.push(`huge tits, bouncing them up and down in your hands, while simultaneously`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} ${slave.nipples} nipples,`); + } else { + r.push(`rubbing ${his} ${slave.nipples} nipples with your fingers and thumbs,`); + } + } else if (slave.boobs > 650) { + r.push(`large tits, jiggling them enticingly with your hands,`); + } else if (slave.boobs > 300) { + r.push(`cute breasts, cupping them and gently`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} ${slave.nipples} nipples,`); + } else { + r.push(`playing with ${his} nipples between your fingers and thumbs,`); + } + } else { + r.push(`flat breasts, gently`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} engorged ${slave.nipples} nipples,`); + } else { + r.push(`playing with ${his} hard, erect nipples between your fingers and thumbs,`); + } + } + r.push(`teasing them and pulling them gently towards you.`); + if (slave.nipples !== "fuckable") { + r.push(`Moving your head close to ${his} breasts, you nuzzle on a nipple with your lips and even lick it delicately with your tongue. Then you alternate, gently nibbling with your teeth on the other nipple. You squeeze the tips of ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`nipples with your thumbs and fingers and tweak them in your fingertips, then you dab ${his} nipples with your thumbs, flicking them in different directions.`); + } else { + r.push(`Moving your head close to ${his} breasts, you nuzzle on a nipple slit with your lips and even lick it delicately with your tongue. Then you alternate, gently probing the depths of the other nipple. You dig deep into both ${his} breasts, teasing what was once the tips of ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`nipples with your fingers before vigorously fingering ${his} tits.`); + } + r.push(`${He} moans passionately at the continued stimulation of ${his} breasts and nipples. When you finally stop, ${he} reaches up to your face with ${his} hand and lovingly strokes it, a blissful look on ${his} ${slave.skin} face.`); + if (slave.accent >= 3) { + r.push(`${He} does ${his} best to communicate devotion with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)},`); + } else { + r.push(`face,`); + } + r.push(`since ${he}'s not confident in ${his} ability to express it in ${V.language}.`); + } else if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate devotion with ${his}`); + if (canSee(slave)) { + r.push(`${App.Desc.eyesColor(slave)}.`); + } else { + r.push(`face.`); + } + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves you.`); + } else { + r.push(Spoken(slave, `"I love you, ${Master},"`)); + r.push(`${he} ${say}s euphorically.`); + } + r.push(`${He}`); + if (canSee(slave)) { + r.push(`looks`); + } else { + r.push(`gazes`); + } + r.push(`at you longingly, eager for more.`); + } else if (slave.devotion > 20) { + r.push(`${He} willingly gives ${himself} up to you. You place your hands on ${his}`); + if (slave.boobs >= 20000) { + r.push(`colossal tits, before sinking your body into their immense softness,`); + } else if (slave.boobs >= 10000) { + r.push(`massive tits, before sinking into your arms around their soft mass,`); + } else if (slave.boobs >= 5000) { + r.push(`monster tits, bouncing their weighty mass in your hands,`); + } else if (slave.boobs > 1000) { + r.push(`huge tits, bouncing them up and down in your hands, while simultaneously`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} ${slave.nipples} nipples,`); + } else { + r.push(`rubbing ${his} ${slave.nipples} nipples with your fingers and thumbs,`); + } + } else if (slave.boobs > 650) { + r.push(`large tits, jiggling them enticingly with your hands,`); + } else if (slave.boobs > 300) { + r.push(`cute breasts, cupping them and gently`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} ${slave.nipples} nipples,`); + } else { + r.push(`playing with ${his} nipples between your fingers and thumbs,`); + } + } else { + r.push(`flat breasts, gently`); + if (slave.nipples === "fuckable") { + r.push(`slipping your fingers in and out of ${his} engorged ${slave.nipples} nipples,`); + } else { + r.push(`playing with ${his} hard, erect nipples between your fingers and thumbs,`); + } + } + r.push(`teasing them and pulling them towards you.`); + if (slave.nipples !== "fuckable") { + r.push(`Moving your head close to ${his} breasts, you nuzzle on a nipple with your lips and even lick it delicately with your tongue. Then you alternate, gently nibbling with your teeth on the other nipple. You squeeze the tips of ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`nipples with your thumbs and fingers and tweak them in your fingertips, then you dab ${his} nipples with your thumbs, flicking them in different directions.`); + } else { + r.push(`Moving your head close to ${his} breasts, you nuzzle on a nipple slit with your lips and even lick it delicately with your tongue. Then you alternate, gently probing the depths of the other nipple. You dig deep into both ${his} breasts, teasing what was once the tips of ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`nipples with your fingers before vigorously fingering ${his} tits.`); + } + r.push(`You sense considerable uneasiness in the`); + if (slave.physicalAge > 30) { + r.push(`${woman};`); + } else { + r.push(`${girl};`); + } + r.push(`${he}'s doing ${his} duty as a slave by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of ${his} mind by your hands on ${his} breasts. ${He} gradually loses ${himself} in the feeling of your gentle hands. When you finally stop, ${his}`); + if (canSee(slave)) { + r.push(App.Desc.eyesColor(slave)); + r.push(`gaze`); + } else { + r.push(`face gazes`); + } + r.push(`puzzlingly at you. Even though ${he} has accepted life as a sex slave, ${he} looks as though ${he} is unsure of what to make of this.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${His}`); + if (canSee(slave)) { + r.push(`eyes beg`); + } else { + r.push(`expression begs`); + } + r.push(`for an answer: is that it?`); + } else if (!canTalk(slave)) { + r.push(`${He} signs hesitantly, asking if that's it.`); + } else { + r.push(`${He} asks hesitantly, "I-is that it, ${Master}?"`); + } + } else if (slave.devotion >= -20 && slave.trust < -20) { + r.push(`${He} shakes at your touch fearfully. As you softly place your hands on ${his}`); + if (slave.boobs >= 20000) { + r.push(`colossal tits,`); + } else if (slave.boobs >= 10000) { + r.push(`massive tits,`); + } else if (slave.boobs >= 5000) { + r.push(`monster tits,`); + } else if (slave.boobs >= 1000) { + r.push(`huge tits,`); + } else if (slave.boobs > 650) { + r.push(`large tits,`); + } else if (slave.boobs > 300) { + r.push(`cute breasts,`); + } else { + r.push(`flat breasts,`); + } + r.push(`${his} eagerness to avoid punishment leads ${him} to stiffen as you start to massage them. ${He} finally starts to relax as you continue to massage ${his} breasts with your`); + if (V.PC.title === 1) { + r.push(`manly`); + } else { + r.push(`feminine`); + } + r.push(`hands,`); + if (slave.nipples !== "fuckable") { + r.push(`playing with ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`${slave.nipples} nipples so that they become hard in between your fingers and thumbs. You squeeze the tips of ${his} nipples with your thumbs and fingers and tweak them in your fingertips, then you dab ${his} nipples with your thumbs, flicking them in different directions. When you firmly pull ${his} nipples`); + if (slave.lactation > 0) { + r.push(`milk streams out of them and`); + } + r.push(`${he} lets out a gasp.`); + } else { + r.push(`playing with ${his}`); + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`${slave.nipples} nipples so that they become sodden with fluid around your fingers. You plunge the depths of ${his} nipple cunts and vigorously work the unusual orifice. When you finally withdraw from ${his} nipples,`); + if (slave.lactation > 0) { + r.push(`a stream of pent-up milk flows out after you and`); + } + r.push(`${he} lets out a gasp.`); + } + r.push(`${His} body softens as`); + if (canSee(slave)) { + r.push(`${his} ${App.Desc.eyesColor(slave)} dart up to your face, before visibly catching ${himself} with a reminder`); + } else { + r.push(`${he} remembers`); + } + r.push(`that ${he}'s a slave and you're ${his} owner. When you finally stop, ${he} shivers but says nothing, uneasy at what you are going to do next.`); + } else if (slave.trust < -50) { + r.push(`${He} is nearly frozen with fear, and does not resist as you start to massage ${his}`); + if (slave.boobs >= 20000) { + r.push(`colossal tits.`); + } else if (slave.boobs >= 10000) { + r.push(`massive tits.`); + } else if (slave.boobs >= 5000) { + r.push(`monster tits.`); + } else if (slave.boobs >= 1000) { + r.push(`huge tits.`); + } else if (slave.boobs > 650) { + r.push(`large tits.`); + } else if (slave.boobs > 300) { + r.push(`cute breasts.`); + } else { + r.push(`flat breasts.`); + } + r.push(`In fact, ${he} barely reacts at all. ${He}`); + if (canSee(slave)) { + r.push(`stares`); + } else { + r.push(`glowers`); + } + r.push(`at you, but ${he} remains motionless. ${He} is so filled with terror that ${he} remains stiff even as it becomes clear to ${him} you're not going to hurt ${him}. ${He} trembles as you continue to massage ${his} breasts with your`); + if (V.PC.title === 1) { + r.push(`manly`); + } else { + r.push(`feminine`); + } + r.push(`hands, playing with ${his}`); + if (slave.nipples !== "fuckable") { + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`${slave.nipples} nipples so that they become hard in between your fingers and thumbs. You squeeze the tips of ${his} nipples with your thumbs and fingers and tweak them in your fingertips, then you dab ${his} nipples with your thumbs, flicking them in different directions. When you firmly pull ${his} nipples,`); + if (slave.lactation > 0) { + r.push(`milk streams out of them and`); + } + r.push(`${he} gasps audibly, unable to contain ${himself} at your relentless assault upon ${his} areola. When you put your mouth on ${his} breasts to nibble on ${his} nipples, ${he} bites ${his} lip, desperately trying to hide ${his} arousal at ${his} stimulated nipples.`); + } else { + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`${slave.nipples} nipples so that they tighten around your fingers. You push deeper in, rubbing their sides gently before forcing the entirety of your hands into ${his} breasts. When you cease fisting ${his} nipples and pull out${(slave.lactation > 0) ? `alongside a stream of backed up milk` : ``}, ${he} gasps audibly, unable to contain ${himself} at your relentless assault upon ${his} boobs. When you put your mouth on ${his} breasts to lick ${his} slit, ${he} bites ${his} lip, desperately trying to hide ${his} arousal at ${his} stimulated nipples.`); + } + r.push(`When you finally stop, ${he} shakes uncontrollably but says nothing, apprehensive at what you are going to do next.`); + } else { + r.push(`${He} tries to refuse you, so you push ${him} down on top of your desk and squeeze ${his} ${slave.skin} breasts in your`); + if (V.PC.title === 1) { + r.push(`manly`); + } else { + r.push(`feminine`); + } + r.push(`hands. ${He} tries to push you off ${his}`); + if (slave.boobs >= 20000) { + r.push(`colossal tits.`); + } else if (slave.boobs >= 10000) { + r.push(`massive tits.`); + } else if (slave.boobs >= 5000) { + r.push(`monster tits.`); + } else if (slave.boobs >= 1000) { + r.push(`huge tits,`); + } else if (slave.boobs > 650) { + r.push(`large tits,`); + } else if (slave.boobs > 300) { + r.push(`cute breasts,`); + } else { + r.push(`flat breasts,`); + } + r.push(`but you continue to massage them, playing with ${his}`); + if (slave.nipples !== "fuckable") { + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`${slave.nipples} nipples so that they become hard in between your fingers and thumbs. You squeeze the tips of ${his} nipples with your thumbs and fingers and tweak them in your fingertips, then you dab ${his} nipples with your thumbs, flicking them in different directions. When you firmly pull ${his} nipples,`); + if (slave.lactation > 0) { + r.push(`milk streams out of them and`); + } + r.push(`${he} gasps audibly, unable to contain ${himself} at your relentless assault upon ${his} areola. When you put your mouth on ${his} breasts to nibble on ${his} nipples, ${he} bites ${his} lip, desperately trying to hide ${his} arousal at ${his} stimulated nipples.`); + } else { + if (slave.lactation > 0) { + r.push(`milky`); + } + r.push(`${slave.nipples} nipples so that they tighten around your fingers. You push deeper in, rubbing their sides gently before forcing the entirety of your hands into ${his} breasts. When you cease fisting ${his} nipples and pull out${(slave.lactation > 0) ? `alongside a stream of backed up milk` : ``}, ${he} gasps audibly, unable to contain ${himself} at your relentless assault upon ${his} boobs. When you put your mouth on ${his} breasts to lick ${his} slit, ${he} bites ${his} lip, desperately trying to hide ${his} arousal at ${his} stimulated nipples.`); + } + r.push(`When you finally stop, ${he} shakes uncontrollably, apprehensive at what you are going to do next.`); + } + + if (slave.lactation > 0) { + slave.lactationDuration = 2; + slave.boobs -= slave.boobsMilk; + slave.boobsMilk = 0; + } else { + r.push(induceLactation(slave)); + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fondleBoobs.tw b/src/npc/interaction/fondleBoobs.tw deleted file mode 100644 index 5b8512a2cfcaabda5a81e19c30c1b3b069b38293..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fondleBoobs.tw +++ /dev/null @@ -1,440 +0,0 @@ -:: FondleBoobs [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> - -You call $him over so you can fondle $his -<<if (getSlave($AS).boobs >= 20000)>> - colossal tits. -<<elseif (getSlave($AS).boobs >= 10000)>> - massive tits. -<<elseif (getSlave($AS).boobs >= 5000)>> - monster tits. -<<elseif (getSlave($AS).boobs >= 1000)>> - huge tits. -<<elseif (getSlave($AS).boobsImplant > 250)>> - fake tits. -<<elseif (getSlave($AS).boobs >= 650)>> - big tits. -<<elseif (getSlave($AS).boobs >= 300)>> - small tits. -<<else>> - flat tits. -<</if>> - -<<if (getSlave($AS).nipples == "huge")>> - $His nipples are so large they give $his breasts an unavoidably lewd appeal as they jut outward. -<<elseif (getSlave($AS).nipples == "puffy")>> - $His puffy nipples beg to be sucked. -<<elseif (getSlave($AS).nipples == "flat")>> - $His nipples form lewd little circles amid $his areolae. -<<elseif (getSlave($AS).nipples == "partially inverted") && (getSlave($AS).nipplesPiercing == 0)>> - $His partially inverted nipples should protrude at the slightest stimulation. -<<elseif (getSlave($AS).nipples == "inverted") && (getSlave($AS).nipplesPiercing == 0)>> - $His inverted nipples form lewd little creases across $his areolae. -<<elseif getSlave($AS).nipples == "fuckable">> - <<if getSlave($AS).lactation>> - $His nipplecunts are leaking milk and begging to be penetrated. - <<else>> - $His nipplecunts form lewd little slits across $his areolae. - <</if>> -<<else>> - $His erect nipples point enticingly outwards. -<</if>> - -<<if (getSlave($AS).boobsTat == "tribal patterns")>> - The tattoos on $his breasts certainly draw attention to $his nipples. -<</if>> - -<<if (getSlave($AS).nipplesPiercing > 1) && !hasAnyLegs(getSlave($AS))>> - You play with the chain between $his nipples. -<<elseif (getSlave($AS).nipplesPiercing > 1)>> - You pull $him over by the chain between $his nipples. -<<elseif (getSlave($AS).nipplesPiercing == 1)>> - $His nipple piercings glint enticingly. -<</if>> - -<<if isAmputee(getSlave($AS))>> - $His limbless <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>torso is a sight to behold. You place your hands on $his breasts and you gently massage - <<if (getSlave($AS).boobs >= 20000)>> - $his colossal tits, doing your best to not miss <<if $showInches == 2>>an inch<<else>>a centimeter<</if>> of their immense size, - <<elseif (getSlave($AS).boobs >= 10000)>> - $his massive tits, your hands sinking deep into their soft flesh, - <<elseif (getSlave($AS).boobs >= 5000)>> - $his monster tits, bouncing their weighty mass in your hands, - <<elseif (getSlave($AS).boobs > 1000)>> - $his huge tits, bouncing them up and down in your hands, while simultaneously - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his <<= getSlave($AS).nipples>> nipples, - <<else>> - rubbing $his <<= getSlave($AS).nipples>> nipples with your fingers and thumbs, - <</if>> - <<elseif (getSlave($AS).boobs > 650)>> - $his large tits, jiggling them enticingly with your hands, - <<elseif (getSlave($AS).boobs > 300)>> - $his cute breasts, cupping them and gently - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his <<= getSlave($AS).nipples>> nipples, - <<else>> - playing with $his nipples between your fingers and thumbs, - <</if>> - <<else>> - $his flat breasts, gently - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his <<= getSlave($AS).nipples>> nipples, - <<else>> - playing with $his nipples between your fingers and thumbs, - <</if>> - <</if>> - teasing them and pulling them gently towards you. Moving your head close to $his breasts, you nuzzle on a nipple with your lips and even lick it delicately with your tongue. - <<if getSlave($AS).nipples != "fuckable">> - Then you alternate, gently nibbling with your teeth on the other nipple. You squeeze the tips of $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> nipples with your thumbs and fingers and tweak them in your fingertips, then you dab $his nipples with your thumbs, flicking them in different directions. - <<else>> - Then you alternate, gently probing the depths of the other nipple. You dig deep into both $his breasts, teasing what was once the tips of $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> nipples with your fingers before vigorously fingering $his tits. - <</if>> - $He starts to pant heavily while $he lies helpless at your playing with $his breasts and $he cannot do anything against the relentless fondling. $He wriggles and squirms at the continued stimulation, getting aroused at the expert way you move around $his tits and nipples. -<<elseif (getSlave($AS).fetish == "boobs") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1)>> - $He comes over excitedly at the thought of $his breasts getting touched. $He stands in between you and your desk, already presenting $his breasts for you. You place your hands on $his breasts and you gently massage - <<if (getSlave($AS).boobs >= 20000)>> - $his colossal tits, before sinking your body into their immense softness, - <<elseif (getSlave($AS).boobs >= 10000)>> - $his massive tits, before sinking your arms into their soft mass, - <<elseif (getSlave($AS).boobs >= 5000)>> - $his monster tits, bouncing their weighty mass in your hands, - <<elseif (getSlave($AS).boobs > 1000)>> - $his huge tits, bouncing them up and down in your hands, while simultaneously - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his <<= getSlave($AS).nipples>> nipples, - <<else>> - rubbing $his <<= getSlave($AS).nipples>> nipples with your fingers and thumbs, - <</if>> - <<elseif (getSlave($AS).boobs > 650)>> - $his large tits, jiggling them enticingly with your hands, - <<elseif (getSlave($AS).boobs > 300)>> - $his cute breasts, cupping them and gently - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his <<= getSlave($AS).nipples>> nipples, - <<else>> - playing with $his nipples between your fingers and thumbs, - <</if>> - <<else>> - $his flat breasts gently - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his engorged <<= getSlave($AS).nipples>> nipples, - <<else>> - playing with $his hard, erect nipples between your fingers and thumbs, - <</if>> - <</if>> - teasing them and pulling them gently towards you. Moving your head close to $his breasts, you nuzzle on a nipple with your lips and even lick it delicately with your tongue. - <<if getSlave($AS).nipples != "fuckable">> - Then you alternate, gently nibbling with your teeth on the other nipple. You squeeze the tips of $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> nipples with your thumbs and fingers and tweak them in your fingertips, then you dab $his nipples with your thumbs, flicking them in different directions. $He moans at your playing with $his breasts, $He rubs $himself while you do, getting intensely aroused at the expert way you move around $his tits and nipples. You continue, rolling $his <<= getSlave($AS).nipples>> nipples between your fingers and thumbs while $he gets increasingly frenzied at the continued stimulation. When it seems like $he's close, you give them a hard pull, sending $him gasping over the edge of ecstasy. - <<else>> - Then you alternate, gently probing the depths of the other nipple. You dig deep into both $his breasts, teasing what was once the tips of $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> nipples with your fingers before vigorously fingering $his tits. $He moans at your playing with $his breasts, $He rubs $himself while you do, getting intensely aroused at the expert way you move around $his tits and nipples. You continue, adding more fingers into $his <<= getSlave($AS).nipples>> nipples while $he gets increasingly frenzied at the continued stimulation. When it seems like $he's close, you cram your whole fist in, sending $him gasping over the edge of ecstasy. - <</if>> -<<elseif (getSlave($AS).devotion > 50) && (getSlave($AS).fetish == "dom") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>> - $He eagerly comes over to you, puffing $his chest out at you. When you place your hands on $his - <<if (getSlave($AS).boobs >= 20000)>> - colossal tits, - <<elseif (getSlave($AS).boobs >= 10000)>> - massive tits, - <<elseif (getSlave($AS).boobs >= 5000)>> - monster tits, - <<elseif (getSlave($AS).boobs >= 1000)>> - huge tits, - <<elseif (getSlave($AS).boobsImplant > 250)>> - fake tits, - <<elseif (getSlave($AS).boobs >= 650)>> - big tits, - <<elseif (getSlave($AS).boobs >= 300)>> - cute breasts, - <<else>> - flat breasts, - <</if>> - <<if (hasAnyArms(getSlave($AS)))>> - $he places $his hand<<if (hasBothArms(getSlave($AS)))>>s<</if>> on your <<if $PC.boobs >= 300>>bosom<<elseif $PC.title == 0>>flat chest<<else>>manly chest<</if>> in turn, $his tendency towards sexual dominance encouraging $him to compete with you in fondling each other. - <</if>> - You both alternate between taking your mouth to $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> nipples and $hers to yours, gently nuzzling and nibbling while simultaneously fondling each other all the while. Both of you continue to passionately lick, nibble, stroke and fondle one other until tiredly, $he slows down. When you eventually stop, $he looks up at you happily. - <<if (getSlave($AS).accent >= 3)>> - $He does $his best to communicate excitement with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>face<</if>>, since $he does not speak $language well enough to express $himself. - <<elseif (!hasAnyArms(getSlave($AS))) && (!canTalk(getSlave($AS)))>> - $He does $his best to communicate excitement with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>face<</if>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he liked that. - <<else>> - "That wa<<s>> fun, <<Master>>," $he <<say>>s cheerfully. - <</if>> - <<if canSee(getSlave($AS))>> - $He looks at you with $his <<= App.Desc.eyesColor(getSlave($AS))>>, smiling. - <<else>> - $He smiles at you. - <</if>> -<<elseif (getSlave($AS).fetish == "submissive") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1)>> - $He eagerly comes over to you, to stand between you and your desk. You lean over while $he submissively lies down upon it, face-up, with $his breasts pointed to the air. You place your hands on $his - <<if (getSlave($AS).boobs >= 20000)>> - colossal tits, before sinking your body into their immense softness, - <<elseif (getSlave($AS).boobs >= 10000)>> - massive tits, before sinking your arms into their soft mass, - <<elseif (getSlave($AS).boobs >= 5000)>> - monster tits, bouncing their weighty mass in your hands, - <<elseif (getSlave($AS).boobs > 1000)>> - huge tits, bouncing them up and down in your hands, while simultaneously - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his <<= getSlave($AS).nipples>> nipples, - <<else>> - rubbing $his <<= getSlave($AS).nipples>> nipples with your fingers and thumbs, - <</if>> - <<elseif (getSlave($AS).boobs > 650)>> - large tits, jiggling them enticingly with your hands, - <<elseif (getSlave($AS).boobs > 300)>> - cute breasts, cupping them and gently - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his <<= getSlave($AS).nipples>> nipples, - <<else>> - playing with $his nipples between your fingers and thumbs, - <</if>> - <<else>> - flat breasts, gently - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his engorged <<= getSlave($AS).nipples>> nipples, - <<else>> - playing with $his hard, erect nipples between your fingers and thumbs, - <</if>> - <</if>> - teasing them and pulling them gently towards you. Moving your head close to $his breasts, you nuzzle on a nipple with your lips and even lick it delicately with your tongue. - <<if getSlave($AS).nipples != "fuckable">> - Then you alternate, gently nibbling with your teeth on the other nipple. You squeeze the tips of $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> nipples with your thumbs and fingers and tweak them in your fingertips, then you dab $his nipples with your thumbs, flicking them in different directions. - <<else>> - Then you alternate, gently probing the depths of the other nipple. You dig deep into both $his breasts, teasing what was once the tips of $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> nipples with your fingers before vigorously fingering $his tits. - <</if>> - $He moans passionately at the continued stimulation of $his breasts and nipples. When you finally stop, $he reaches up to your face with $his hand and lovingly strokes it, a blissful look on $his <<= getSlave($AS).skin>> face. - <<if (getSlave($AS).accent >= 3)>> - $He does $his best to communicate devotion with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>face<</if>>, since $he's not confident in $his ability to express it in $language. - <<elseif (!hasAnyArms(getSlave($AS))) && !canTalk(getSlave($AS))>> - $He does $his best to communicate devotion with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>face<</if>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he loves you. - <<else>> - "Plea<<s>>e don't <<s>>top, <<Master>>," $he <<say>>s quietly. - <</if>> - $He <<if canSee(getSlave($AS))>>looks<<else>>gazes<</if>> at you longingly, eager for more. -<<elseif (getSlave($AS).fetish == "masochist") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1)>> - $He hurriedly comes over to you, to stand between you and your desk. You lean over while $he lies down upon it, face-up, with $his breasts pointed to the air. $He gasps as you slap your hands on $his - <<if (getSlave($AS).boobs >= 20000)>> - colossal tits, before sinking your body into their immense softness before pulling back and struggling to grasp both nipples at once, - <<elseif (getSlave($AS).boobs >= 10000)>> - massive tits, using your entire arms to roughly jiggle them before pulling back to maul $his nipples, - <<elseif (getSlave($AS).boobs >= 5000)>> - monster tits, bouncing their weighty mass roughly with all your might before sliding your hands to $his nipples, - <<elseif (getSlave($AS).boobs > 1000)>> - huge tits, bouncing them roughly up and down in your hands, while simultaneously - <<if getSlave($AS).nipples == "fuckable">> - shoving your fingers in and out of $his <<= getSlave($AS).nipples>> nipples, - <<else>> - flicking $his nipples hard with your fingers and thumbs, - <</if>> - <<elseif (getSlave($AS).boobs > 650)>> - large tits, jiggling them enticingly with your hands, - <<elseif (getSlave($AS).boobs > 300)>> - cute breasts, cupping them and roughly - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his <<= getSlave($AS).nipples>> nipples, - <<else>> - playing with $his nipples between your fingers and thumbs, - <</if>> - <<else>> - flat breasts, roughly - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his engorged <<= getSlave($AS).nipples>> nipples, - <<else>> - playing with $his hard, erect nipples between your fingers and thumbs, - <</if>> - <</if>> - teasing them and firmly pulling them in all directions. - <<if getSlave($AS).nipples != "fuckable">> - Moving your head close to $his breasts, you put your lips on a nipple and close your lips firmly around it to pull strongly on it. Then you alternate, bite hard with your teeth on the other. You firmly squeeze the tips of $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> nipples with your thumbs and fingers and tweak them in your fingertips, then you push $his nipples with your thumbs, flicking them hard in different directions. - <<else>> - Moving your head close to $his breasts, you put your lips over a nipple and close your lips firmly over the slit to suck strongly on it. Then you alternate, bite hard with your teeth on the other. You firmly push the tips of your fingers down into the depths of $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> nipples to tweak what was once their tip. - <</if>> - $He moans passionately at the continued punishment of $his breasts and nipples. Your rough play leaves red marks on $his breasts and nipples and $he becomes even more aroused. When you finally stop $he rubs the marks on $his breasts with $his hands, an ecstatic look on $his <<= getSlave($AS).skin>> face. - <<if (getSlave($AS).accent >= 3)>> - $He does $his best to communicate pleasure with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>face<</if>>, since $he's not confident in $his ability to express it in $language. - <<elseif (!hasAnyArms(getSlave($AS))) && !canTalk(getSlave($AS))>> - $He does $his best to communicate $his pleasure with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>face<</if>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he loves it. - <<else>> - "Plea<<s>>e puni<<sh>> me more, <<Master>>," $he <<say>>s quietly. - <</if>> - $He <<if canSee(getSlave($AS))>>looks<<else>>gazes<</if>> at you longingly, hungry for more. -<<elseif (getSlave($AS).devotion > 50)>> - $He devotedly comes over to you, to stand between you and your desk. $His doting <<= App.Desc.eyesColor(getSlave($AS))>> looking in yours. You place your hands on $his - <<if (getSlave($AS).boobs >= 20000)>> - colossal tits, before sinking your body into their immense softness, - <<elseif (getSlave($AS).boobs >= 10000)>> - massive tits, before sinking into your arms around their soft mass, - <<elseif (getSlave($AS).boobs >= 5000)>> - monster tits, bouncing their weighty mass in your hands, - <<elseif (getSlave($AS).boobs > 1000)>> - huge tits, bouncing them up and down in your hands, while simultaneously - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his <<= getSlave($AS).nipples>> nipples, - <<else>> - rubbing $his <<= getSlave($AS).nipples>> nipples with your fingers and thumbs, - <</if>> - <<elseif (getSlave($AS).boobs > 650)>> - large tits, jiggling them enticingly with your hands, - <<elseif (getSlave($AS).boobs > 300)>> - cute breasts, cupping them and gently - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his <<= getSlave($AS).nipples>> nipples, - <<else>> - playing with $his nipples between your fingers and thumbs, - <</if>> - <<else>> - flat breasts, gently - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his engorged <<= getSlave($AS).nipples>> nipples, - <<else>> - playing with $his hard, erect nipples between your fingers and thumbs, - <</if>> - <</if>> - teasing them and pulling them gently towards you. - <<if getSlave($AS).nipples != "fuckable">> - Moving your head close to $his breasts, you nuzzle on a nipple with your lips and even lick it delicately with your tongue. Then you alternate, gently nibbling with your teeth on the other nipple. You squeeze the tips of $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> nipples with your thumbs and fingers and tweak them in your fingertips, then you dab $his nipples with your thumbs, flicking them in different directions. - <<else>> - Moving your head close to $his breasts, you nuzzle on a nipple slit with your lips and even lick it delicately with your tongue. Then you alternate, gently probing the depths of the other nipple. You dig deep into both $his breasts, teasing what was once the tips of $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> nipples with your fingers before vigorously fingering $his tits. - <</if>> - $He moans passionately at the continued stimulation of $his breasts and nipples. When you finally stop, $he reaches up to your face with $his hand and lovingly strokes it, a blissful look on $his <<= getSlave($AS).skin>> face. - <<if (getSlave($AS).accent >= 3)>> - $He does $his best to communicate devotion with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>face<</if>>, since $he's not confident in $his ability to express it in $language. - <<elseif (!hasAnyArms(getSlave($AS))) && !canTalk(getSlave($AS))>> - $He does $his best to communicate devotion with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>face<</if>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he loves you.<<else>>"I love you, <<Master>>," $he <<say>>s euphorically. - <</if>> - $He <<if canSee(getSlave($AS))>>looks<<else>>gazes<</if>> at you longingly, eager for more. -<<elseif (getSlave($AS).devotion > 20)>> - $He willingly gives $himself up to you. You place your hands on $his - <<if (getSlave($AS).boobs >= 20000)>> - colossal tits, before sinking your body into their immense softness, - <<elseif (getSlave($AS).boobs >= 10000)>> - massive tits, before sinking into your arms around their soft mass, - <<elseif (getSlave($AS).boobs >= 5000)>> - monster tits, bouncing their weighty mass in your hands, - <<elseif (getSlave($AS).boobs > 1000)>> - huge tits, bouncing them up and down in your hands, while simultaneously - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his <<= getSlave($AS).nipples>> nipples, - <<else>> - rubbing $his <<= getSlave($AS).nipples>> nipples with your fingers and thumbs, - <</if>> - <<elseif (getSlave($AS).boobs > 650)>> - large tits, jiggling them enticingly with your hands, - <<elseif (getSlave($AS).boobs > 300)>> - cute breasts, cupping them and gently - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his <<= getSlave($AS).nipples>> nipples, - <<else>> - playing with $his nipples between your fingers and thumbs, - <</if>> - <<else>> - flat breasts, gently - <<if getSlave($AS).nipples == "fuckable">> - slipping your fingers in and out of $his engorged <<= getSlave($AS).nipples>> nipples, - <<else>> - playing with $his hard, erect nipples between your fingers and thumbs, - <</if>> - <</if>> - teasing them and pulling them towards you. - <<if getSlave($AS).nipples != "fuckable">> - Moving your head close to $his breasts, you nuzzle on a nipple with your lips and even lick it delicately with your tongue. Then you alternate, gently nibbling with your teeth on the other nipple. You squeeze the tips of $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> nipples with your thumbs and fingers and tweak them in your fingertips, then you dab $his nipples with your thumbs, flicking them in different directions. - <<else>> - Moving your head close to $his breasts, you nuzzle on a nipple slit with your lips and even lick it delicately with your tongue. Then you alternate, gently probing the depths of the other nipple. You dig deep into both $his breasts, teasing what was once the tips of $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> nipples with your fingers before vigorously fingering $his tits. - <</if>> - You sense considerable uneasiness in the <<if (getSlave($AS).physicalAge > 30)>>$woman<<else>>$girl<</if>>; $he's doing $his duty as a slave by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of $his mind by your hands on $his breasts. $He gradually loses $himself in the feeling of your gentle hands. When you finally stop, $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>> gaze<<else>>face gazes<</if>> puzzlingly at you. Even though $he has accepted life as a sex slave, $he looks as though $he is unsure of what to make of this. - <<if (!hasAnyArms(getSlave($AS))) && !canTalk(getSlave($AS))>> - $His <<if canSee(getSlave($AS))>>eyes beg<<else>>expression begs<</if>> for an answer: is that it? - <<elseif !canTalk(getSlave($AS))>> - $He signs hesitantly, asking if that's it. - <<else>> - $He asks hesitantly, "I-i<<s>> that it, <<Master>>?" - <</if>> -<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).trust < -20)>> - $He shakes at your touch fearfully. As you softly place your hands on $his - <<if (getSlave($AS).boobs >= 20000)>> - colossal tits, - <<elseif (getSlave($AS).boobs >= 10000)>> - massive tits, - <<elseif (getSlave($AS).boobs >= 5000)>> - monster tits, - <<elseif (getSlave($AS).boobs >= 1000)>> - huge tits, - <<elseif (getSlave($AS).boobs > 650)>> - large tits, - <<elseif (getSlave($AS).boobs > 300)>> - cute breasts, - <<else>> - flat breasts, - <</if>> - $his eagerness to avoid punishment leads $him to stiffen as you start to massage them. $He finally starts to relax as you continue to massage $his breasts with your <<if $PC.title == 1>>manly<<else>>feminine<</if>> hands, - <<if getSlave($AS).nipples != "fuckable">> - playing with $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> <<= getSlave($AS).nipples>> nipples so that they become hard in between your fingers and thumbs. You squeeze the tips of $his nipples with your thumbs and fingers and tweak them in your fingertips, then you dab $his nipples with your thumbs, flicking them in different directions. When you firmly pull $his nipples<<if (getSlave($AS).lactation > 0)>> milk streams out of them and<</if>> $he lets out a gasp. - <<else>> - playing with $his<<if (getSlave($AS).lactation > 0)>> milky<</if>> <<= getSlave($AS).nipples>> nipples so that they become sodden with fluid around your fingers. You plunge the depths of $his nipple cunts and vigorously work the unusual orifice. When you finally withdraw from $his nipples<<if (getSlave($AS).lactation > 0)>>, a stream of pent-up milk flows out after you and<<else>>,<</if>> $he lets out a gasp. - <</if>> - $His body softens as <<if canSee(getSlave($AS))>>$his <<= App.Desc.eyesColor(getSlave($AS))>> dart up to your face, before visibly catching $himself with a reminder<<else>>$he remembers<</if>> that $he's a slave and you're $his owner. When you finally stop, $he shivers but says nothing, uneasy at what you are going to do next. -<<elseif (getSlave($AS).trust < -50)>> - $He is nearly frozen with fear, and does not resist as you start to massage $his - <<if (getSlave($AS).boobs >= 20000)>> - colossal tits. - <<elseif (getSlave($AS).boobs >= 10000)>> - massive tits. - <<elseif (getSlave($AS).boobs >= 5000)>> - monster tits. - <<elseif (getSlave($AS).boobs >= 1000)>> - huge tits. - <<elseif (getSlave($AS).boobs > 650)>> - large tits. - <<elseif (getSlave($AS).boobs > 300)>> - cute breasts. - <<else>> - flat breasts. - <</if>> - In fact, $he barely reacts at all. $He <<if canSee(getSlave($AS))>>stares<<else>>glowers<</if>> at you, but $he remains motionless. $He is so filled with terror that $he remains stiff even as it becomes clear to $him you're not going to hurt $him. $He trembles as you continue to massage $his breasts with your <<if $PC.title == 1>>manly<<else>>feminine<</if>> hands, playing with $his - <<if getSlave($AS).nipples != "fuckable">> - <<if (getSlave($AS).lactation > 0)>> milky<</if>> <<= getSlave($AS).nipples>> nipples so that they become hard in between your fingers and thumbs. You squeeze the tips of $his nipples with your thumbs and fingers and tweak them in your fingertips, then you dab $his nipples with your thumbs, flicking them in different directions. When you firmly pull $his nipples,<<if (getSlave($AS).lactation > 0)>> milk streams out of them and<</if>> $he gasps audibly, unable to contain $himself at your relentless assault upon $his areola. When you put your mouth on $his breasts to nibble on $his nipples, $he bites $his lip, desperately trying to hide $his arousal at $his stimulated nipples. - <<else>> - <<if (getSlave($AS).lactation > 0)>> milky<</if>> <<= getSlave($AS).nipples>> nipples so that they tighten around your fingers. You push deeper in, rubbing their sides gently before forcing the entirety of your hands into $his breasts. When you cease fisting $his nipples and pull out<<if (getSlave($AS).lactation > 0)>> alongside a stream of backed up milk<</if>>, $he gasps audibly, unable to contain $himself at your relentless assault upon $his boobs. When you put your mouth on $his breasts to lick $his slit, $he bites $his lip, desperately trying to hide $his arousal at $his stimulated nipples. - <</if>> - When you finally stop, $he shakes uncontrollably but says nothing, apprehensive at what you are going to do next. -<<else>> - $He tries to refuse you, so you push $him down on top of your desk and squeeze $his <<= getSlave($AS).skin>> breasts in your <<if $PC.title == 1>>manly<<else>>feminine<</if>> hands. $He tries to push you off $his - <<if (getSlave($AS).boobs >= 20000)>> - colossal tits. - <<elseif (getSlave($AS).boobs >= 10000)>> - massive tits. - <<elseif (getSlave($AS).boobs >= 5000)>> - monster tits. - <<elseif (getSlave($AS).boobs >= 1000)>> - huge tits, - <<elseif (getSlave($AS).boobs > 650)>> - large tits, - <<elseif (getSlave($AS).boobs > 300)>> - cute breasts, - <<else>> - flat breasts, - <</if>> - but you continue to massage them, playing with $his - <<if getSlave($AS).nipples != "fuckable">> - <<if (getSlave($AS).lactation > 0)>> milky<</if>> <<= getSlave($AS).nipples>> nipples so that they become hard in between your fingers and thumbs. You squeeze the tips of $his nipples with your thumbs and fingers and tweak them in your fingertips, then you dab $his nipples with your thumbs, flicking them in different directions. When you firmly pull $his nipples,<<if (getSlave($AS).lactation > 0)>> milk streams out of them and<</if>> $he gasps audibly, unable to contain $himself at your relentless assault upon $his areola. When you put your mouth on $his breasts to nibble on $his nipples, $he bites $his lip, desperately trying to hide $his arousal at $his stimulated nipples. - <<else>> - <<if (getSlave($AS).lactation > 0)>> milky<</if>> <<= getSlave($AS).nipples>> nipples so that they tighten around your fingers. You push deeper in, rubbing their sides gently before forcing the entirety of your hands into $his breasts. When you cease fisting $his nipples and pull out<<if (getSlave($AS).lactation > 0)>> alongside a stream of backed up milk<</if>>, $he gasps audibly, unable to contain $himself at your relentless assault upon $his boobs. When you put your mouth on $his breasts to lick $his slit, $he bites $his lip, desperately trying to hide $his arousal at $his stimulated nipples. - <</if>> - When you finally stop, $he shakes uncontrollably, apprehensive at what you are going to do next. -<</if>> - -<<if getSlave($AS).lactation > 0>> - <<set getSlave($AS).lactationDuration = 2>> - <<set getSlave($AS).boobs -= getSlave($AS).boobsMilk, getSlave($AS).boobsMilk = 0>> -<<else>> - <<= induceLactation(getSlave($AS))>> -<</if>> diff --git a/src/npc/interaction/fondleButt.js b/src/npc/interaction/fondleButt.js new file mode 100644 index 0000000000000000000000000000000000000000..a4a94dd2040c472ba90e9e993d3481fb3aa753d6 --- /dev/null +++ b/src/npc/interaction/fondleButt.js @@ -0,0 +1,667 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fondleButt = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, + } = getPronouns(slave); + + const {title: Master} = getEnunciation(slave); + + r.push(`You call ${him} over so you can fondle ${his}`); + if (slave.butt < 2) { + r.push(`flat, tight ass`); + } else if (slave.butt <= 2) { + r.push(`cute bottom`); + } else if (slave.butt <= 3) { + r.push(`round, firm rump`); + } else if (slave.butt <= 4) { + r.push(`curvy, enticing butt`); + } else if (slave.butt <= 5) { + r.push(`huge rear end`); + } else if (slave.butt <= 6) { + r.push(`massive, alluring rump`); + } else if (slave.butt <= 7) { + r.push(`enormous, hypnotic ass`); + } else if (slave.butt <= 10) { + r.push(`gigantic, jiggly rear`); + } else if (slave.butt <= 14) { + r.push(`inhuman, cushiony butt cheeks`); + } else if (slave.butt <= 20) { + r.push(`couch-like, super jiggly ass cheeks`); + } + r.push(`as well as ${his}`); + if (slave.anus > 3) { + r.push(`gaping anus.`); + } else if (slave.anus === 3) { + r.push(`loose anus.`); + } else if (slave.anus === 2) { + r.push(`well-used asshole.`); + } else if (slave.anus === 1) { + r.push(`tight butthole.`); + } else if (slave.anus === 0) { + r.push(`virgin butthole.`); + } + + if (slave.fetish === "buttslut" && slave.devotion >= -20) { + r.push(`${He}'s pleased at the prospect of you touching ${his} favorite body part.`); + } + + if (slave.fetish === "masochist" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && slave.anus === 0 && slave.devotion >= -20) { + if (canWalk(slave)) { + r.push(`${He} approaches you eagerly and waves ${his} butt, then presents ${his} virgin anus in front of you, spreading ${his} butt cheeks towards you with ${his} hands before turning to face you.`); + } + r.push(`You reach around and firmly grab ${his} buttocks with both hands. ${He} gasps as you smack both of ${his} cheeks, you feel the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeeze hard. ${He} moans with arousal as you spank ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + r.push(`buttocks. ${He} looks longingly into your eyes as you continue to move around ${his} posterior, pinching with your fingers and slapping with your palms before reaching to touch your fingertips against ${his} sphincter. ${He} moans and quivers slightly when you rub your fingers around ${his} virgin anus. ${He} starts to wiggle ${his} ass while you circle around ${his} anus, not breaking contact with ${him} with your fingers. You keep squeezing ${his} buttocks firmly — first one, then the other and then finally both. ${He} can't resist gyrating ${his} hips in arousal while in your grasp.`); + if (canStand(slave)) { + r.push(`You strongly pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and push ${him} down to bend ${him} over your desk.`); + } else { + r.push(`You move closer towards ${him}, turn ${him} around and firmly hold ${him} down on desk, face-down so that ${his} butt is facing you up into the air.`); + } + r.push(`${He} pretends to be unwilling but cannot disguise ${his} obvious joy. You see that ${his} rear has reddened in your rough play and you continue to squeeze ${his} cheeks hard and spank them with your firm hands. ${He} moans harder at you squeezing along the contours of ${his} posterior with both your hands and at ${his} virgin butthole as you push against it with your fingers and thumb. Eventually you decide to stop and ${he} squeals with delight after you give ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + r.push(`buttocks a few hard smacks for good measure. ${His} face is in ecstasy as ${he} stands and turns to face you, gently rubbing the red spots on ${his} buttocks and looking at you hungrily as if ${he} wants more.`); + } else if (slave.devotion > 50 && slave.anus === 0) { + if (canStand(slave)) { + r.push(`${He} accepts your orders happily and waves ${his} virgin anus to you, spreading ${his} butt cheeks in front of you with ${his} hands before turning to face you.`); + } + r.push(`You reach around and grab ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + r.push(`buttocks with both hands before rubbing along them, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. ${He} looks passionately into your eyes as you continue to move around ${his} posterior gently reaching to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. ${He} sighs as you rub your fingertips around ${his} virgin anus. ${He} starts to wiggle ${his} ass while you circle around ${his} anus, not breaking contact with ${him} with your fingers. You keep squeezing ${his} buttocks tenderly — first one, then the other and then both and ${he} can't resist gyrating ${his} hips enticingly while in your grasp.`); + if (canStand(slave)) { + r.push(`You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and bend ${him} over your desk.`); + } else { + r.push(`You move closer towards ${him}, turn ${him} around and push ${him} down on desk, face-down so that ${his} butt is facing you up into the air.`); + } + r.push(`You look at ${his} rear while you squeeze ${his} cheeks and rub them with your firm hands. You explore the contours of ${his} posterior with both your eyes and hands, then look at ${his} virgin butthole as you trace it with your fingers and thumb. Eventually you decide to stop and ${he} squeals with delight after you give ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + r.push(`buttocks a gentle smack. ${He} turns to face you, kissing you, but looking at you longingly as if ${he} wants more.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate love with ${his} ${App.Desc.eyesColor(slave)}.`); + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves you.`); + } else if (SlaveStatsChecker.checkForLisp(slave)) { + r.push(Spoken(slave, `"I love you, ${Master},"`)); + r.push(`${he} lisps happily.`); + } else { + r.push(Spoken(slave, `"I love you, ${Master},"`)); + r.push(`${he} says happily.`); + } + } else if (slave.devotion > 20 && slave.anus === 0) { + if (canStand(slave)) { + r.push(`${He} accepts your orders without comment and presents ${his} virgin anus to you before turning to face you.`); + } + r.push(`You reach around and grab ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + r.push(`buttocks with both hands before rubbing along them, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. ${He} gasps as you rub fingers around ${his} virgin anus. You watch ${his} face as you continue to move around ${his} posterior and ${he} clearly enjoys the contact on ${his} bare skin. You gently reach to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. ${He} starts to wiggle ${his} ass while you circle around ${his} anus, not breaking contact with ${him} with your fingers. You keep squeezing ${his} buttocks tenderly — first one, then the other and then both and ${he} can't help but gyrate ${his} hips enticingly while in your grasp. You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and bend ${him} over your desk. You look at ${his} rear while you squeeze ${his} cheeks and rub them with your firm hands. You explore the contours of ${his} posterior with both your eyes and hands, then look at ${his} virgin butthole as you trace it with your fingers and thumb. Eventually you decide to stop and ${he} squeals in surprise after you give ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + r.push(`buttocks a gentle smack. You tell ${him} to stand as you are finished. ${He} stands and looks at you quizzically. Though ${he} has accepted life as a sex slave, ${he} cannot help but feel a conflicted mixture of enjoyment and mild embarrassment.`); + } else if (slave.devotion >= -20 && slave.anus === 0) { + r.push(`${He} obeys your harmless order but ${he} can't help but feel slight trepidation and trembles slightly at the thought of you groping ${his} butt.`); + if (hasAnyLegs(slave)) { + r.push(`${He} stands in front of you as you`); + } else { + r.push(`You`); + } + r.push(`reach around and grab ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + r.push(`buttocks before rubbing along them, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. ${He} gasps as you rub fingers around ${his} virgin anus. You study ${his} face as you continue to move around ${his} posterior gently reaching to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. ${He} starts to wiggle ${his} ass while you circle around ${his} anus, not breaking contact with ${him} with your fingers. You keep squeezing ${his} buttocks tenderly — first one, then the other and then both and ${he} can't help but wiggle ${his} hips while in your grasp. You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and bend ${him} over your desk. You look at ${his} rear while you squeeze ${his} cheeks and rub them with your firm hands. You explore the contours of ${his} posterior with both your eyes and hands, then look at ${his} virgin butthole as you trace it with your fingers and thumb. Eventually you decide to stop and ${he} squeals in surprise after you give ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + r.push(`buttocks a gentle smack. You tell ${him} to stand as you are finished. ${He} stands and looks at you quizzically, ${his} eyes searching in yours for answers that ${he} cannot find.`); + } else if (slave.trust < -50 && slave.anus === 0) { + r.push(`${He} is nearly frozen with fear, and does not resist as you kiss ${him}. In fact, ${he} barely reacts at all. ${He} stands in front of you and visibly stiffens as you reach around and grab ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + r.push(`buttocks before rubbing along them, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. ${He} gasps and shivers as you rub fingers around ${his} virgin anus. ${He} remains frozen as you continue to move around ${his} posterior gently reaching to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. ${He} shudders more while you circle around ${his} anus, not breaking contact with ${him} with your fingers. You keep squeezing ${his} buttocks tenderly — first one, then the other and then finally both. ${He} is so filled with terror that ${he} remains stiff while in your grasp, even as it becomes clear to ${him} you're not going to hurt ${him}. You pull ${his} quivering body closer towards you by ${his} buttocks, turn ${him} around, and bend ${him} over your desk. You look at ${his} quaking rear while you squeeze ${his} cheeks and rub them with your firm hands. You explore the contours of ${his} posterior with both your eyes and hands, then look at ${his} virgin butthole as you trace it with your fingers and thumb. Eventually, you decide to stop. ${He} gradually stands and looks in your eyes with utter incomprehension, but ${he} is frightened about what you will do next.`); + } else if (slave.anus === 0) { + r.push(`While you grope ${his} butt, ${he} tries hard to resist. ${He}`); + if (hasAnyArms(slave)) { + r.push(`grabs`); + if (hasBothArms(slave)) { + r.push(`your wrists and tugs on your arms`); + } else { + r.push(`your wrist and tugs on your arm`); + } + } else { + r.push(`writhes under your fingers`); + } + r.push(`but stops, helpless, when you tell ${him} what the alternatives are. You reach around and grab ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + r.push(`buttocks before rubbing along them, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. ${He} tries to break out of your grasp as you rub fingers around ${his} virgin anus. ${He} writhes as you continue to move around ${his} posterior, gently reaching to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. ${He} struggles to stay still while you circle around ${his} unbroken anus, not breaking contact with ${him} with your fingers. You look at ${his} face and ${he} has`); + if (!canSee(slave)) { + r.push(`reflexively`); + } + r.push(`shut ${his} eyes, trying not to think about what's happening to ${his} butt. This only encourages you to continue. You keep squeezing ${his} buttocks tenderly — first one, then the other and then finally both and ${he} can't help but quiver while in your grasp. You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and push ${him} down, bending ${him} over your desk while ${he} tries to push away. You look at ${his} rear while you squeeze ${his} cheeks and rub them with your firm hands. You wander along the outline of ${his} posterior with both your eyes and hands, then look at ${his} virgin butthole as you trace it with your fingers and thumb. Eventually, you decide to stop. ${He} slowly stands and looks in your eyes, as though almost demanding answers. ${He} looks apprehensive about what you will do next.`); + } else if (slave.fetish === "mindbroken") { + if (canMove(slave)) { + r.push(`You instruct ${him} to present ${his} buttocks and anus but ${he} remains still and unresponsive. Talking to a broken mind is pointless.`); + } + r.push(`You reach around and grab ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`buttocks before rubbing along them, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. ${He} reacts to your initial touch as you rub fingers around ${his}`); + if (slave.anus > 3) { + r.push(`gaping anus,`); + } else if (slave.anus === 3) { + r.push(`loose anus,`); + } else if (slave.anus === 2) { + r.push(`well-used asshole,`); + } else if (slave.anus === 1) { + r.push(`tight butthole,`); + } else if (slave.anus === 0) { + r.push(`virgin butthole,`); + } + r.push(`but you understand it is only physiological. You continue to move around ${his} posterior gently reaching to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. You circle around ${his} anus but ${he} remains still. You keep squeezing ${his} buttocks tenderly — first one, then the other and then both but ${he} is like a doll in your grasp. You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and bend ${him} over your desk. You look at ${his} rear while you squeeze ${his} cheeks and rub them with your firm hands. You explore the contours of ${his} posterior with both your eyes and hands, then look at ${his}`); + if (slave.anus > 3) { + r.push(`gaping`); + } else if (slave.anus === 3) { + r.push(`loose`); + } else if (slave.anus === 2) { + r.push(`well-used`); + } else if (slave.anus === 1) { + r.push(`tight`); + } else if (slave.anus === 0) { + r.push(`virgin`); + } + r.push(`butthole as you trace it with your fingers and thumb. Eventually, you decide to stop but ${he} remains in position over your desk until you stand ${him} up yourself.`); + } else if (slave.devotion < -20) { + if (!isAmputee(slave)) { + r.push(`You instruct ${him} to present ${his} buttocks and anus. Opposed to the thought of your hands groping ${him}, ${he} tries to`); + if (hasAnyLegs(slave)) { + r.push(`step`); + } else { + r.push(`move`); + } + r.push(`back, but you catch ${him} and pull ${him} closer to you as you reach around and grab ${his}`); + } else { + r.push(`${He}'s opposed to the thought of your hands groping ${him}, but as an amputee can do nothing about it. You reach around and grab ${his}`); + } + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`buttocks.`); + if (hasAnyArms(slave)) { + r.push(`${He} tries to grab your wrists to keep them away but ${he} cannot resist for long.`); + } + r.push(`You start rubbing along ${his} cheeks, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. ${He} tries to break out of your grasp as you rub fingers around ${his}`); + if (slave.anus > 3) { + r.push(`gaping anus.`); + } else if (slave.anus === 3) { + r.push(`loose anus.`); + } else if (slave.anus === 2) { + r.push(`well-used asshole.`); + } else if (slave.anus === 1) { + r.push(`tight butthole.`); + } else if (slave.anus === 0) { + r.push(`virgin butthole.`); + } + r.push(`${He} writhes as you continue to move around ${his} posterior, gently reaching to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. ${He} struggles to stay still while you circle around ${his} anus, not breaking contact with ${him} with your fingers. You look at ${his} face and ${he} has`); + if (!canSee(slave)) { + r.push(`reflexively`); + } + r.push(`shut ${his} eyes, trying not to think about what's happening to ${his} butt. This only encourages you to continue. You keep squeezing ${his} buttocks tenderly — first one, then the other and then finally both and ${he} can't help but quiver while in your grasp.`); + if (hasBothLegs(slave)) { + r.push(`You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and push ${him} down, bending ${him} over your desk while ${he} tries to push away.`); + } else { + r.push(`You move closer to ${him}, turn ${him} around and push ${him} down, face-down on your desk while ${he} tries to wriggle desperately.`); + } + r.push(`You look at ${his} rear while you squeeze ${his} cheeks and rub them with your firm hands. You wander along the outline of ${his} posterior with both your eyes and hands, then look at ${his}`); + if (slave.anus > 3) { + r.push(`gaping`); + } else if (slave.anus === 3) { + r.push(`loose`); + } else if (slave.anus === 2) { + r.push(`well-used`); + } else if (slave.anus === 1) { + r.push(`tight`); + } else if (slave.anus === 0) { + r.push(`virgin`); + } + r.push(`butthole as you trace it with your fingers and thumb. Eventually, you decide to stop. ${He} slowly stands and looks in your eyes, as though almost demanding answers. ${He} looks apprehensive about what you will do next.`); + } else if (slave.devotion <= 20 && slave.vagina < 0) { + if (!isAmputee(slave)) { + r.push(`You instruct ${him} to present ${his} anus. ${He} complies without comment, standing in front of you.`); + } else { + r.push(`${He}'s hesitant at the thought of your hands groping ${him}, but as an amputee can do nothing about it.`); + } + r.push(`You reach around and grab ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`buttocks. ${His} dick cannot stop twitching as you start rubbing along ${his} cheeks, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. You rub your fingers around ${his}`); + if (slave.anus > 3) { + r.push(`gaping anus.`); + } else if (slave.anus === 3) { + r.push(`loose anus.`); + } else if (slave.anus === 2) { + r.push(`well-used asshole.`); + } else if (slave.anus === 1) { + r.push(`tight butthole.`); + } else if (slave.anus === 0) { + r.push(`virgin butthole.`); + } + r.push(`${He} writhes as you continue to move around ${his} posterior, gently reaching to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. ${He} struggles to stay still while you circle around ${his} anus with your fingers. You look at ${his} face and ${he} has`); + if (!canSee(slave)) { + r.push(`reflexively`); + } + r.push(`shut ${his} eyes, trying not to get aroused by your touch on ${his} butt. This only encourages you to continue. You keep squeezing ${his} buttocks tenderly — first one, then the other and then finally both and ${he} can't help but quiver while in your grasp.`); + if (hasBothLegs(slave)) { + r.push(`You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and push ${him} down, bending ${him} over your desk.`); + } else { + r.push(`You move closer to ${him}, turn ${him} around and push ${him} down, face-down on your desk while ${he} wriggles.`); + } + r.push(`You look at ${his} rear while you squeeze ${his} cheeks and rub them with your firm hands. You wander along the outline of ${his} posterior with both your eyes and hands, then look at ${his}`); + if (slave.anus > 3) { + r.push(`gaping`); + } else if (slave.anus === 3) { + r.push(`loose`); + } else if (slave.anus === 2) { + r.push(`well-used`); + } else if (slave.anus === 1) { + r.push(`tight`); + } else if (slave.anus === 0) { + r.push(`virgin`); + } + r.push(`butthole as you trace it with your fingers and thumb. Eventually, you decide to stop and ${he} looks up at you quizzically, unsure about what you will do next.`); + } else if (slave.devotion <= 50) { + if (!isAmputee(slave)) { + r.push(`You instruct ${him} to present ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`anus. ${He} hesitates but eventually stands in front of you showing ${his} buttocks before presenting ${his}`); + if (slave.anus > 3) { + r.push(`gaping`); + } else if (slave.anus === 3) { + r.push(`loose`); + } else if (slave.anus === 2) { + r.push(`well-used`); + } else if (slave.anus === 1) { + r.push(`tight`); + } else if (slave.anus === 0) { + r.push(`virgin`); + } + r.push(`anus to you and turning to face you.`); + } else { + r.push(`${He}'s mildly hesitant at the thought of your hands groping ${him}, but as an amputee can do nothing about it.`); + } + r.push(`You reach around and grab ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + r.push(`buttocks. You start rubbing along ${his} cheeks, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. As you rub your fingers around ${his} anus, ${he} starts to relax. ${He} quivers as you continue to move around ${his} posterior gently reaching to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. ${He} purses ${his} lips while you circle around ${his} anus with your fingers. You look at ${his} face and ${he} is looking back at you doe-eyed, trying but failing not to get aroused by your soft touch on ${his} butt. You keep squeezing ${his} buttocks tenderly — first one, then the other and then finally both and ${he} can't help but let out a moan while in your grasp.`); + if (hasBothLegs(slave)) { + r.push(`You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and push ${him} down, bending ${him} over your desk.`); + } else { + r.push(`You move closer to ${him}, turn ${him} around and push ${him} down, face-down on your desk while ${he} tries to wriggle desperately.`); + } + r.push(`You look at ${his} rear while you squeeze ${his} cheeks and rub them with your firm hands. You wander along the outline of ${his} posterior with both your eyes and hands, then look at ${his} butthole as you trace it with your fingers and thumb. Eventually, you decide to stop, and ${he}`); + if (canSee(slave)) { + r.push(`looks up into your eyes`); + } else { + r.push(`angles ${his} head to face you`); + } + r.push(`longingly, as if ${he} wants more.`); + } else { + if (!isAmputee(slave)) { + r.push(`You instruct ${him} to present ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`anus. ${He} eagerly stands in front of you showing ${his} buttocks before happily presenting ${his}`); + if (slave.anus > 3) { + r.push(`gaping`); + } else if (slave.anus === 3) { + r.push(`loose`); + } else if (slave.anus === 2) { + r.push(`well-used`); + } else if (slave.anus === 1) { + r.push(`tight`); + } else if (slave.anus === 0) { + r.push(`virgin`); + } + r.push(`anus to you, spreading ${his} butt cheeks and turning to face you.`); + } else { + r.push(`${He} devotedly looks at you, awaiting your touch on ${his} body.`); + } + r.push(`You reach around and grab ${his}`); + if (slave.butt < 2) { + r.push(`flat`); + } else if (slave.butt <= 2) { + r.push(`cute`); + } else if (slave.butt <= 3) { + r.push(`firm`); + } else if (slave.butt <= 4) { + r.push(`generous`); + } else if (slave.butt <= 5) { + r.push(`massive`); + } else if (slave.butt <= 7) { + r.push(`enormous`); + } else if (slave.butt <= 10) { + r.push(`gigantic`); + } else if (slave.butt <= 14) { + r.push(`inhuman`); + } else if (slave.butt <= 20) { + r.push(`couch-like`); + } + r.push(`buttocks. You start rubbing along ${his} cheeks, feeling the shape of ${his}`); + if (V.seeRace === 1) { + r.push(slave.race); + } + r.push(`ass with your fingers and squeezing gently. As you rub your fingers around ${his} anus, ${he} sighs audibly. ${He} moans as you continue to move around ${his} posterior gently reaching to touch your fingertips against ${his} sphincter while rubbing ${his} ass at the same time. ${He} quivers while you circle around ${his} anus with your fingers. You look at ${his} face and ${he} is looking back at you longingly, getting aroused by your continued touch on ${his} butt. You keep squeezing ${his} buttocks tenderly — first one, then the other and then finally both and ${he} can't help but let out a moan while in your grasp.`); + if (hasAnyLegs(slave)) { + r.push(`You pull ${his} body closer towards you by ${his} buttocks, turn ${him} around, and push ${him} down, bending ${him} over your desk.`); + } else { + r.push(`You move closer to ${him}, turn ${him} around and push ${him} down, face-down on your desk so that ${his} butt is up facing towards you.`); + } + r.push(`You look at ${his} rear while you squeeze ${his} cheeks and rub them with your firm hands. You wander along the outline of ${his} posterior with both your eyes and hands, then look at ${his} butthole as you trace it with your fingers and thumb. Eventually, you decide to stop, and ${he}`); + if (canSee(slave)) { + r.push(`looks up into your eyes`); + } else { + r.push(`angles ${his} head to face you`); + } + r.push(`ecstatically${hasAnyLegs(slave) ? `as ${he} stands up` : ``}, eager for more.`); + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fondleButt.tw b/src/npc/interaction/fondleButt.tw deleted file mode 100644 index 32089424763ce83d86bc4b2c482d01b0f0b1151f..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fondleButt.tw +++ /dev/null @@ -1,539 +0,0 @@ -:: FondleButt [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> - -You call $him over so you can fondle $his -<<if getSlave($AS).butt < 2>> - flat, tight ass -<<elseif getSlave($AS).butt <= 2>> - cute bottom -<<elseif getSlave($AS).butt <= 3>> - round, firm rump -<<elseif getSlave($AS).butt <= 4>> - curvy, enticing butt -<<elseif getSlave($AS).butt <= 5>> - huge rear end -<<elseif getSlave($AS).butt <= 6>> - massive, alluring rump -<<elseif getSlave($AS).butt <= 7>> - enormous, hypnotic ass -<<elseif getSlave($AS).butt <= 10>> - gigantic, jiggly rear -<<elseif getSlave($AS).butt <= 14>> - inhuman, cushiony butt cheeks -<<elseif getSlave($AS).butt <= 20>> - couch-like, super jiggly ass cheeks -<</if>> -as well as $his -<<if (getSlave($AS).anus > 3)>> - gaping anus. -<<elseif (getSlave($AS).anus == 3)>> - loose anus. -<<elseif (getSlave($AS).anus == 2)>> - well-used asshole. -<<elseif (getSlave($AS).anus == 1)>> - tight butthole. -<<elseif (getSlave($AS).anus == 0)>> - virgin butthole. -<</if>> - -<<if (getSlave($AS).fetish == "buttslut") && (getSlave($AS).devotion >= -20)>> - $He's pleased at the prospect of you touching $his favorite body part. -<</if>> - -<<if (getSlave($AS).fetish == "masochist") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).anus == 0) && (getSlave($AS).devotion >= -20)>> - <<if canWalk(getSlave($AS))>> - $He approaches you eagerly and waves $his butt, then presents $his virgin anus in front of you, spreading $his butt cheeks towards you with $his hands before turning to face you. - <</if>> - You reach around and firmly grab $his buttocks with both hands. $He gasps as you smack both of $his cheeks, you feel the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeeze hard. $He moans with arousal as you spank $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - buttocks. $He looks longingly into your eyes as you continue to move around $his posterior, pinching with your fingers and slapping with your palms before reaching to touch your fingertips against $his sphincter. $He moans and quivers slightly when you rub your fingers around $his virgin anus. $He starts to wiggle $his ass while you circle around $his anus, not breaking contact with $him with your fingers. You keep squeezing $his buttocks firmly — first one, then the other and then finally both. $He can't resist gyrating $his hips in arousal while in your grasp. - <<if canStand(getSlave($AS))>> - You strongly pull $his body closer towards you by $his buttocks, turn $him around, and push $him down to bend $him over your desk. - <<else>> - You move closer towards $him, turn $him around and firmly hold $him down on desk, face-down so that $his butt is facing you up into the air. - <</if>> - $He pretends to be unwilling but cannot disguise $his obvious joy. You see that $his rear has reddened in your rough play and you continue to squeeze $his cheeks hard and spank them with your firm hands. $He moans harder at you squeezing along the contours of $his posterior with both your hands and at $his virgin butthole as you push against it with your fingers and thumb. Eventually you decide to stop and $he squeals with delight after you give $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - buttocks a few hard smacks for good measure. $His face is in ecstasy as $he stands and turns to face you, gently rubbing the red spots on $his buttocks and looking at you hungrily as if $he wants more. -<<elseif (getSlave($AS).devotion > 50) && (getSlave($AS).anus == 0)>> - <<if canStand(getSlave($AS))>> - $He accepts your orders happily and waves $his virgin anus to you, spreading $his butt cheeks in front of you with $his hands before turning to face you. - <</if>> - You reach around and grab $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - buttocks with both hands before rubbing along them, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. $He looks passionately into your eyes as you continue to move around $his posterior gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He sighs as you rub your fingertips around $his virgin anus. $He starts to wiggle $his ass while you circle around $his anus, not breaking contact with $him with your fingers. You keep squeezing $his buttocks tenderly — first one, then the other and then both and $he can't resist gyrating $his hips enticingly while in your grasp. - <<if canStand(getSlave($AS))>> - You pull $his body closer towards you by $his buttocks, turn $him around, and bend $him over your desk. - <<else>> - You move closer towards $him, turn $him around and push $him down on desk, face-down so that $his butt is facing you up into the air. - <</if>> - You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You explore the contours of $his posterior with both your eyes and hands, then look at $his virgin butthole as you trace it with your fingers and thumb. Eventually you decide to stop and $he squeals with delight after you give $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - buttocks a gentle smack. $He turns to face you, kissing you, but looking at you longingly as if $he wants more. - <<if (!hasAnyArms(getSlave($AS))) && !canTalk(getSlave($AS))>> - $He does $his best to communicate love with $his <<= App.Desc.eyesColor(getSlave($AS))>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he loves you. - <<elseif SlaveStatsChecker.checkForLisp(getSlave($AS))>> "I love you, - <<Master>>," $he lisps happily. - <<else>> "I love you, - <<Master>>," $he says happily. - <</if>> -<<elseif (getSlave($AS).devotion > 20) && (getSlave($AS).anus == 0)>> - <<if canStand(getSlave($AS))>> - $He accepts your orders without comment and presents $his virgin anus to you before turning to face you. - <</if>> - You reach around and grab $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - buttocks with both hands before rubbing along them, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. $He gasps as you rub fingers around $his virgin anus. You watch $his face as you continue to move around $his posterior and $he clearly enjoys the contact on $his bare skin. You gently reach to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He starts to wiggle $his ass while you circle around $his anus, not breaking contact with $him with your fingers. You keep squeezing $his buttocks tenderly — first one, then the other and then both and $he can't help but gyrate $his hips enticingly while in your grasp. You pull $his body closer towards you by $his buttocks, turn $him around, and bend $him over your desk. You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You explore the contours of $his posterior with both your eyes and hands, then look at $his virgin butthole as you trace it with your fingers and thumb. Eventually you decide to stop and $he squeals in surprise after you give $his <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - buttocks a gentle smack. You tell $him to stand as you are finished. $He stands and looks at you quizzically. Though $he has accepted life as a sex slave, $he cannot help but feel a conflicted mixture of enjoyment and mild embarrassment. -<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).anus == 0)>> - $He obeys your harmless order but $he can't help but feel slight trepidation and trembles slightly at the thought of you groping $his butt. <<if (hasAnyLegs(getSlave($AS)))>>$He stands in front of you as you <<else>>You <</if>>reach around and grab $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - buttocks before rubbing along them, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. $He gasps as you rub fingers around $his virgin anus. You study $his face as you continue to move around $his posterior gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He starts to wiggle $his ass while you circle around $his anus, not breaking contact with $him with your fingers. You keep squeezing $his buttocks tenderly — first one, then the other and then both and $he can't help but wiggle $his hips while in your grasp. You pull $his body closer towards you by $his buttocks, turn $him around, and bend $him over your desk. You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You explore the contours of $his posterior with both your eyes and hands, then look at $his virgin butthole as you trace it with your fingers and thumb. Eventually you decide to stop and $he squeals in surprise after you give $his <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - buttocks a gentle smack. You tell $him to stand as you are finished. $He stands and looks at you quizzically, $his eyes searching in yours for answers that $he cannot find. -<<elseif (getSlave($AS).trust < -50) && (getSlave($AS).anus == 0)>> - $He is nearly frozen with fear, and does not resist as you kiss $him. In fact, $he barely reacts at all. $He stands in front of you and visibly stiffens as you reach around and grab $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - buttocks before rubbing along them, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. $He gasps and shivers as you rub fingers around $his virgin anus. $He remains frozen as you continue to move around $his posterior gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He shudders more while you circle around $his anus, not breaking contact with $him with your fingers. You keep squeezing $his buttocks tenderly — first one, then the other and then finally both. $He is so filled with terror that $he remains stiff while in your grasp, even as it becomes clear to $him you're not going to hurt $him. You pull $his quivering body closer towards you by $his buttocks, turn $him around, and bend $him over your desk. You look at $his quaking rear while you squeeze $his cheeks and rub them with your firm hands. You explore the contours of $his posterior with both your eyes and hands, then look at $his virgin butthole as you trace it with your fingers and thumb. Eventually, you decide to stop. $He gradually stands and looks in your eyes with utter incomprehension, but $he is frightened about what you will do next. -<<elseif (getSlave($AS).anus == 0)>> - While you grope $his butt, $he tries hard to resist. $He <<if hasAnyArms(getSlave($AS))>>grabs <<if (hasBothArms(getSlave($AS)))>>your wrists and tugs on your arms<<else>>your wrist and tugs on your arm<</if>><<else>>writhes under your fingers<</if>> but stops, helpless, when you tell $him what the alternatives are. You reach around and grab $his <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - buttocks before rubbing along them, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. $He tries to break out of your grasp as you rub fingers around $his virgin anus. $He writhes as you continue to move around $his posterior, gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He struggles to stay still while you circle around $his unbroken anus, not breaking contact with $him with your fingers. You look at $his face and $he has <<if !canSee(getSlave($AS))>>reflexively <</if>>shut $his eyes, trying not to think about what's happening to $his butt. This only encourages you to continue. You keep squeezing $his buttocks tenderly — first one, then the other and then finally both and $he can't help but quiver while in your grasp. You pull $his body closer towards you by $his buttocks, turn $him around, and push $him down, bending $him over your desk while $he tries to push away. You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You wander along the outline of $his posterior with both your eyes and hands, then look at $his virgin butthole as you trace it with your fingers and thumb. Eventually, you decide to stop. $He slowly stands and looks in your eyes, as though almost demanding answers. $He looks apprehensive about what you will do next. -<<elseif getSlave($AS).fetish == "mindbroken">> - <<if canMove(getSlave($AS))>> - You instruct $him to present $his buttocks and anus but $he remains still and unresponsive. Talking to a broken mind is pointless. - <</if>> - You reach around and grab $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>buttocks before rubbing along them, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. $He reacts to your initial touch as you rub fingers around $his - <<if (getSlave($AS).anus > 3)>> - gaping anus, - <<elseif (getSlave($AS).anus == 3)>> - loose anus, - <<elseif (getSlave($AS).anus == 2)>> - well-used asshole, - <<elseif (getSlave($AS).anus == 1)>> - tight butthole, - <<elseif (getSlave($AS).anus == 0)>> - virgin butthole, - <</if>> - but you understand it is only physiological. You continue to move around $his posterior gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. You circle around $his anus but $he remains still. You keep squeezing $his buttocks tenderly — first one, then the other and then both but $he is like a doll in your grasp. You pull $his body closer towards you by $his buttocks, turn $him around, and bend $him over your desk. You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You explore the contours of $his posterior with both your eyes and hands, then look at $his - <<if (getSlave($AS).anus > 3)>> - gaping - <<elseif (getSlave($AS).anus == 3)>> - loose - <<elseif (getSlave($AS).anus == 2)>> - well-used - <<elseif (getSlave($AS).anus == 1)>> - tight - <<elseif (getSlave($AS).anus == 0)>> - virgin - <</if>> - butthole as you trace it with your fingers and thumb. Eventually, you decide to stop but $he remains in position over your desk until you stand $him up yourself. -<<elseif getSlave($AS).devotion < -20>> - <<if !isAmputee(getSlave($AS))>> - You instruct $him to present $his buttocks and anus. Opposed to the thought of your hands groping $him, $he tries to <<if (hasAnyLegs(getSlave($AS)))>>step<<else>>move<</if>> back, but you catch $him and pull $him closer to you as you reach around and grab $his - <<else>> - $He's opposed to the thought of your hands groping $him, but as an amputee can do nothing about it. You reach around and grab $his - <</if>> - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>> buttocks. - <<if hasAnyArms(getSlave($AS))>> - $He tries to grab your wrists to keep them away but $he cannot resist for long. - <</if>> - You start rubbing along $his cheeks, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. $He tries to break out of your grasp as you rub fingers around $his - <<if (getSlave($AS).anus > 3)>> - gaping anus. - <<elseif (getSlave($AS).anus == 3)>> - loose anus. - <<elseif (getSlave($AS).anus == 2)>> - well-used asshole. - <<elseif (getSlave($AS).anus == 1)>> - tight butthole. - <<elseif (getSlave($AS).anus == 0)>> - virgin butthole. - <</if>> - $He writhes as you continue to move around $his posterior, gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He struggles to stay still while you circle around $his anus, not breaking contact with $him with your fingers. You look at $his face and $he has <<if !canSee(getSlave($AS))>>reflexively <</if>>shut $his eyes, trying not to think about what's happening to $his butt. This only encourages you to continue. You keep squeezing $his buttocks tenderly — first one, then the other and then finally both and $he can't help but quiver while in your grasp. - <<if hasBothLegs(getSlave($AS))>> - You pull $his body closer towards you by $his buttocks, turn $him around, and push $him down, bending $him over your desk while $he tries to push away. - <<else>> - You move closer to $him, turn $him around and push $him down, face-down on your desk while $he tries to wriggle desperately. - <</if>> - You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You wander along the outline of $his posterior with both your eyes and hands, then look at $his - <<if (getSlave($AS).anus > 3)>> - gaping - <<elseif (getSlave($AS).anus == 3)>> - loose - <<elseif (getSlave($AS).anus == 2)>> - well-used - <<elseif (getSlave($AS).anus == 1)>> - tight - <<elseif (getSlave($AS).anus == 0)>> - virgin - <</if>> - butthole as you trace it with your fingers and thumb. Eventually, you decide to stop. $He slowly stands and looks in your eyes, as though almost demanding answers. $He looks apprehensive about what you will do next. -<<elseif (getSlave($AS).devotion <= 20) && (getSlave($AS).vagina < 0)>> - <<if !isAmputee(getSlave($AS))>> - You instruct $him to present $his anus. $He complies without comment, standing in front of you. - <<else>> - $He's hesitant at the thought of your hands groping $him, but as an amputee can do nothing about it. - <</if>> - You reach around and grab $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>> buttocks. $His dick cannot stop twitching as you start rubbing along $his cheeks, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. You rub your fingers around $his - <<if (getSlave($AS).anus > 3)>> - gaping anus. - <<elseif (getSlave($AS).anus == 3)>> - loose anus. - <<elseif (getSlave($AS).anus == 2)>> - well-used asshole. - <<elseif (getSlave($AS).anus == 1)>> - tight butthole. - <<elseif (getSlave($AS).anus == 0)>> - virgin butthole. - <</if>> - $He writhes as you continue to move around $his posterior, gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He struggles to stay still while you circle around $his anus with your fingers. You look at $his face and $he has <<if !canSee(getSlave($AS))>>reflexively <</if>>shut $his eyes, trying not to get aroused by your touch on $his butt. This only encourages you to continue. You keep squeezing $his buttocks tenderly — first one, then the other and then finally both and $he can't help but quiver while in your grasp. - <<if hasBothLegs(getSlave($AS))>> - You pull $his body closer towards you by $his buttocks, turn $him around, and push $him down, bending $him over your desk. - <<else>> - You move closer to $him, turn $him around and push $him down, face-down on your desk while $he wriggles. - <</if>> - You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You wander along the outline of $his posterior with both your eyes and hands, then look at $his - <<if (getSlave($AS).anus > 3)>> - gaping - <<elseif (getSlave($AS).anus == 3)>> - loose - <<elseif (getSlave($AS).anus == 2)>> - well-used - <<elseif (getSlave($AS).anus == 1)>> - tight - <<elseif (getSlave($AS).anus == 0)>> - virgin - <</if>> - butthole as you trace it with your fingers and thumb. Eventually, you decide to stop and $he looks up at you quizzically, unsure about what you will do next. -<<elseif (getSlave($AS).devotion <= 50)>> - <<if !isAmputee(getSlave($AS))>> - You instruct $him to present $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>anus. $He hesitates but eventually stands in front of you showing $his buttocks before presenting $his - <<if (getSlave($AS).anus > 3)>> - gaping - <<elseif (getSlave($AS).anus == 3)>> - loose - <<elseif (getSlave($AS).anus == 2)>> - well-used - <<elseif (getSlave($AS).anus == 1)>> - tight - <<elseif (getSlave($AS).anus == 0)>> - virgin - <</if>> - anus to you and turning to face you. - <<else>> - $He's mildly hesitant at the thought of your hands groping $him, but as an amputee can do nothing about it. - <</if>> - You reach around and grab $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - buttocks. You start rubbing along $his cheeks, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. As you rub your fingers around $his anus, $he starts to relax. $He quivers as you continue to move around $his posterior gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He purses $his lips while you circle around $his anus with your fingers. You look at $his face and $he is looking back at you doe-eyed, trying but failing not to get aroused by your soft touch on $his butt. You keep squeezing $his buttocks tenderly — first one, then the other and then finally both and $he can't help but let out a moan while in your grasp. - <<if hasBothLegs(getSlave($AS))>> - You pull $his body closer towards you by $his buttocks, turn $him around, and push $him down, bending $him over your desk. - <<else>> - You move closer to $him, turn $him around and push $him down, face-down on your desk while $he tries to wriggle desperately. - <</if>> - You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You wander along the outline of $his posterior with both your eyes and hands, then look at $his butthole as you trace it with your fingers and thumb. Eventually, you decide to stop, and $he <<if canSee(getSlave($AS))>>looks up into your eyes<<else>>angles $his head to face you<</if>> longingly, as if $he wants more. -<<else>> - <<if !isAmputee(getSlave($AS))>> - You instruct $him to present $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>anus. $He eagerly stands in front of you showing $his buttocks before happily presenting $his - <<if (getSlave($AS).anus > 3)>> - gaping - <<elseif (getSlave($AS).anus == 3)>> - loose - <<elseif (getSlave($AS).anus == 2)>> - well-used - <<elseif (getSlave($AS).anus == 1)>> - tight - <<elseif (getSlave($AS).anus == 0)>> - virgin - <</if>> - anus to you, spreading $his butt cheeks and turning to face you. - <<else>> - $He devotedly looks at you, awaiting your touch on $his body. - <</if>> - You reach around and grab $his - <<if getSlave($AS).butt < 2>> - flat - <<elseif getSlave($AS).butt <= 2>> - cute - <<elseif getSlave($AS).butt <= 3>> - firm - <<elseif getSlave($AS).butt <= 4>> - generous - <<elseif getSlave($AS).butt <= 5>> - massive - <<elseif getSlave($AS).butt <= 7>> - enormous - <<elseif getSlave($AS).butt <= 10>> - gigantic - <<elseif getSlave($AS).butt <= 14>> - inhuman - <<elseif getSlave($AS).butt <= 20>> - couch-like - <</if>> - buttocks. You start rubbing along $his cheeks, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. As you rub your fingers around $his anus, $he sighs audibly. $He moans as you continue to move around $his posterior gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He quivers while you circle around $his anus with your fingers. You look at $his face and $he is looking back at you longingly, getting aroused by your continued touch on $his butt. You keep squeezing $his buttocks tenderly — first one, then the other and then finally both and $he can't help but let out a moan while in your grasp. - <<if (hasAnyLegs(getSlave($AS)))>> - You pull $his body closer towards you by $his buttocks, turn $him around, and push $him down, bending $him over your desk. - <<else>> - You move closer to $him, turn $him around and push $him down, face-down on your desk so that $his butt is up facing towards you. - <</if>> - You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You wander along the outline of $his posterior with both your eyes and hands, then look at $his butthole as you trace it with your fingers and thumb. Eventually, you decide to stop, and $he <<if canSee(getSlave($AS))>>looks up into your eyes<<else>>angles $his head to face you<</if>> ecstatically<<if (hasAnyLegs(getSlave($AS)))>> as $he stands up<</if>>, eager for more. -<</if>> diff --git a/src/npc/interaction/fondleDick.js b/src/npc/interaction/fondleDick.js new file mode 100644 index 0000000000000000000000000000000000000000..75beb924afdc2006be6d96aaecb5e61821206e1b --- /dev/null +++ b/src/npc/interaction/fondleDick.js @@ -0,0 +1,205 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fondleDick = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him + } = getPronouns(slave); + + + r.push(`You call ${him} over so you can fondle ${his}`); + if (slave.dick === 1) { + r.push(`tiny dick`); + } else if (slave.dick === 2) { + r.push(`cute dick`); + } else if (slave.dick === 3) { + r.push(`dick`); + } else if (slave.dick === 4) { + r.push(`big dick`); + } else if (slave.dick === 5) { + r.push(`impressive dick`); + } else if (slave.dick === 6) { + r.push(`huge dick`); + } else if (slave.dick === 7) { + r.push(`gigantic dick`); + } else if (slave.dick === 8) { + r.push(`titanic dick`); + } else if (slave.dick === 9) { + r.push(`absurd dick`); + } else if (slave.dick === 10) { + r.push(`inhuman dick`); + } else { + r.push(`hypertrophied dick`); + } + r.push(`and`); + if (slave.scrotum > 0) { + if (slave.balls === 0) { + r.push(`soft scrotum.`); + } else if (slave.balls === 1) { + r.push(`tiny balls.`); + } else if (slave.balls === 2) { + r.push(`cute balls.`); + } else if (slave.balls === 3) { + r.push(`balls.`); + } else if (slave.balls === 4) { + r.push(`large balls.`); + } else if (slave.balls === 5) { + r.push(`huge balls.`); + } else { + r.push(`monstrous balls.`); + } + } else { + r.push(`soft perineum.`); + } + + if (slave.vaginaTat === "tribal patterns") { + r.push(`The tattoos on ${his} abdomen certainly draw attention there.`); + } else if (slave.vaginaTat === "lewd crest") { + r.push(`The crest on ${his} abdomen invokes lewd thoughts, after all.`); + } + + if (slave.dick !== 0) { + if (slave.vaginaPiercing > 1) { + r.push(`Metal glints all up and down ${his} cock.`); + } else if (slave.vaginaPiercing === 1) { + r.push(`Metal glints at the head of ${his} cock.`); + } + } + + if (slave.fetish === "mindbroken") { + r.push(`Like a doll, ${he} dumbly remains still, watching your hands move towards ${him} without any real interest. You gently trace your fingers along ${his} ${dickDesc()} before taking it gently in one hand and tenderly stroking your hand along its`); + strokeAndSqueeze(); + if (!canAchieveErection(slave)) { + r.push(`${His} dick remains flaccid as it cannot get stiff and you continue tenderly stroking ${his} soft dick but, ${he} does not respond.`); + } else { + r.push(`${His} prick stiffens like a rod in your hands and you continue your expert strokes along the erect shaft but, except for the cockmilk leaking out of ${his} dick, ${he} does not respond.`); + } + r.push(`Since ${he} is mindbroken, ${his} responses to you are purely physiological and your actions have no affect on ${him} mentally. You leave your toy for one of your other slaves to clean and maintain.`); + } else if (isAmputee(slave)) { + r.push(`Since ${he}'s a quadruple amputee, ${he}'s yours to use as a human finger toy. While ${he}'s lying there helpless, you move your hands towards ${him}. You gently trace your fingers along ${his} ${dickDesc()} before taking it gently in one hand and tenderly stroking your hand along its`); + strokeAndSqueeze(); + if (!canAchieveErection(slave)) { + r.push(`${His} dick remains flaccid as it cannot get stiff and you continue tenderly stroking ${his} soft dick but, except for the cockmilk leaking out of ${his} dick, ${he} does not respond.`); + } else { + r.push(`${His} prick stiffens like a rod in your hands and you continue your expert strokes along the erect shaft but, except for the cockmilk leaking out of ${his} dick, ${he} does not respond.`); + } + r.push(`Soon, ${his} movements indicate that ${he} is orgasming. ${He} shudders and leaks ${his} cockmilk as ${he} orgasms in your hand, looking at you as you stop moving your hands. You leave your toy for one of your other slaves to clean and maintain.`); + } else if (slave.fetish === "submissive" && slave.fetishStrength > 60 && slave.fetishKnown === 1) { + r.push(`${He} comes submissively over, smiling a little submissive smile, and points ${his} dick towards you. You gently trace your fingers along ${his} ${dickDesc()} before taking it gently in one hand and tenderly stroking your hand along its`); + strokeAndSqueeze(); + standardStiffy(); + r.push(`Soon, ${his} movements indicate that ${he} is orgasming. ${He} shudders and leaks ${his} cockmilk as ${he} orgasms in your hands before submissively avoiding your gaze as you get cleaned up.`); + } else if (slave.devotion < -20) { + r.push(`${He} clearly dislikes the thought of getting ${his} dick fondled by you. ${His} lower lip quivers with trepidation as ${he} watches your hands move towards ${him}. ${He} has no choice but to obey if ${he} wants to avoid punishment. ${He} gasps and shakes as you gently trace along ${his} ${dickDesc()} before taking it gently in one hand and tenderly stroking your hand along its`); + strokeAndSqueeze(); + standardStiffy(); + r.push(`${He}`); + if (hasAnyArms(slave)) { + r.push(`grabs your wrist with ${his} ${hasBothArms(slave) ? `hands` : `hand`}`); + } else { + r.push(`jostles against your arm`); + } + r.push(`and tries to stop it from moving but is unable to and despite ${his} resistant pulling against you. ${He} bites ${his} lip but ${he} cannot help but moan. Soon ${he} shudders and leaks ${his} cockmilk as ${he} orgasms in your hands. ${He} looks at you shamefully as you stop moving your hands and get cleaned up.`); + } else if (slave.fetish === "masochist" && slave.fetishStrength > 60 && slave.fetishKnown === 1) { + r.push(`${He} hurriedly comes over to you, to stand between you and your desk. You lean over while ${he} lies down upon it, face-up, with ${his} dick pointed towards you. ${He} gasps when you slap ${his} ${dickDesc()} with your hand. You firmly grab it and tightly squeeze it with your fingers, stroking your hand along its shaft.`); + if (slave.balls > 0) { + r.push(`Simultaneously, you slap ${his} ${ballDesc()} with your other hand.`); + } + r.push(`You firmly wrap your fingers, thumb and palm around ${his} dick, rhythmically stroking along with both hands, starting slow but gradually increasing the speed of your movements. You occasionally squeeze and pinch the tip and head of ${his} dick between your fingers and thumb.`); + standardStiffy(); + r.push(`Your rough play leaves red marks on ${his} breasts and nipples and ${he} becomes even more aroused. Soon, ${his} movements indicate that ${he} is orgasming. ${He} shudders and leaks ${his} cockmilk as ${he} orgasms in your hands. ${He} rubs the marks on ${his} dick and balls with ${his} hands, an ecstatic look on ${his} ${slave.skin} face. ${He} looks at you longingly as you get cleaned up, hungry for more.`); + } else if (slave.devotion <= 20) { + r.push(`${He} obeys silently, standing in front of you as you move your hands towards ${him}. You gently trace your fingers along ${his} ${dickDesc()} before taking it gently in one hand and tenderly stroking your hand along its`); + strokeAndSqueeze(); + standardStiffy(); + r.push(`${He}`); + if (canSee(slave)) { + r.push(`looks into your eyes`); + } else { + r.push(`faces you`); + } + r.push(`furtively while ${he}`); + if (hasAnyArms(slave)) { + r.push(`grabs your ${hasBothArms(slave) ? `wrists` : `wrist`} with ${his} ${hasBothArms(slave) ? `hands` : `hand`},`); + } else { + r.push(`moves ${his} hips ever so slightly,`); + } + r.push(`moving to match your hand movements. ${He} moans and shudders, leaking ${his} cockmilk as ${he} orgasms in your hands. ${He} dutifully looks at you as you stop moving your hands and get cleaned up.`); + } else { + r.push(`${He} devotedly comes over and gives you an impassioned kiss. ${He} smiles and points ${his} dick towards you. You gently trace your fingers along ${his} ${dickDesc()} before taking it gently in one hand and tenderly stroking your hand along its shaft`); + strokeAndSqueeze(); + standardStiffy(); + r.push(`${He} begs you not to stop. Soon, ${he} moans and ${his} movements indicate that ${he} is about to orgasm. ${He} shudders and leaks ${his} cockmilk as ${he} orgasms in your hands. ${He} looks at you passionately as you stop moving your hands and get cleaned up.`); + } + App.Events.addParagraph(node, r); + return node; + + function ballDesc() { + if (slave.scrotum === 0) { + return `soft skin beneath ${his} base and ${his} butthole`; + } else if (slave.balls === 1) { + return `tiny balls`; + } else if (slave.balls === 2) { + return `small balls`; + } else if (slave.balls === 3) { + return `balls`; + } else if (slave.balls === 4) { + return `big balls`; + } else if (slave.balls === 5) { + return `lemon-sized balls`; + } else if (slave.balls < 10) { + return `fist-sized balls`; + } else { + return `hypertrophied balls`; + } + } + + function dickDesc() { + if (slave.dick === 1) { + return `tiny dick`; + } else if (slave.dick === 2) { + return `cute dick`; + } else if (slave.dick === 3) { + return `dick`; + } else if (slave.dick === 4) { + return `big dick`; + } else if (slave.dick === 5) { + return `impressive dick`; + } else if (slave.dick === 6) { + return `huge dick`; + } else if (slave.dick === 7) { + return `gigantic dick`; + } else if (slave.dick === 8) { + return `titanic dick`; + } else if (slave.dick === 9) { + return `absurd dick`; + } else if (slave.dick === 10) { + return `inhuman dick`; + } else { + return `hypertrophied dick`; + } + } + + function strokeAndSqueeze() { + if (slave.balls > 0) { + r.push(`shaft, while simultaneously cupping ${his} ${ballDesc()} with your other hand.`); + } else { + r.push(`shaft.`); + } + r.push(`You firmly wrap your fingers, thumb and palm around ${his} dick, rhythmically stroking along with both hands, starting slow but gradually increasing the speed of your movements. You occasionally squeeze the tip and head of ${his} dick between your fingers and thumb.`); + } + + function standardStiffy() { + if (canAchieveErection(slave)) { + r.push(`${His} prick stiffens like a rod in your hands and you continue your expert strokes along the erect shaft.`); + } else { + r.push(`${His} dick remains flaccid as it cannot get stiff and you continue tenderly stroking ${his} soft dick.`); + } + } +}; diff --git a/src/npc/interaction/fondleDick.tw b/src/npc/interaction/fondleDick.tw deleted file mode 100644 index 1542b6e295055354fe56a379b18dce74de183341..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fondleDick.tw +++ /dev/null @@ -1,428 +0,0 @@ -:: FondleDick [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> - -You call $him over so you can fondle $his -<<if getSlave($AS).dick == 1>> - tiny dick -<<elseif getSlave($AS).dick == 2>> - cute dick -<<elseif getSlave($AS).dick == 3>> - dick -<<elseif getSlave($AS).dick == 4>> - big dick -<<elseif getSlave($AS).dick == 5>> - impressive dick -<<elseif getSlave($AS).dick == 6>> - huge dick -<<elseif getSlave($AS).dick == 7>> - gigantic dick -<<elseif getSlave($AS).dick == 8>> - titanic dick -<<elseif getSlave($AS).dick == 9>> - absurd dick -<<elseif getSlave($AS).dick == 10>> - inhuman dick -<<else>> - hypertrophied dick -<</if>> -and -<<if getSlave($AS).scrotum > 0>> - <<if getSlave($AS).balls == 0>> - soft scrotum. - <<elseif getSlave($AS).balls == 1>> - tiny balls. - <<elseif getSlave($AS).balls == 2>> - cute balls. - <<elseif getSlave($AS).balls == 3>> - balls. - <<elseif getSlave($AS).balls == 4>> - large balls. - <<elseif getSlave($AS).balls == 5>> - huge balls. - <<else>> - monstrous balls. - <</if>> -<<else>> - soft perineum. -<</if>> - -<<if (getSlave($AS).vaginaTat == "tribal patterns")>> - The tattoos on $his abdomen certainly draw attention there. -<<elseif (getSlave($AS).vaginaTat == "lewd crest")>> - The crest on $his abdomen invokes lewd thoughts, after all. -<</if>> - -<<if (getSlave($AS).vaginaPiercing > 1) && (getSlave($AS).dick != 0)>> - Metal glints all up and down $his cock. -<<elseif (getSlave($AS).vaginaPiercing == 1) && (getSlave($AS).dick != 0)>> - Metal glints at the head of $his cock. -<</if>> - -<<if (getSlave($AS).fetish == "mindbroken")>> - Like a doll, $he dumbly remains still, watching your hands move towards $him without any real interest. You gently trace your fingers along $his - <<if getSlave($AS).dick == 1>> - tiny dick - <<elseif getSlave($AS).dick == 2>> - cute dick - <<elseif getSlave($AS).dick == 3>> - dick - <<elseif getSlave($AS).dick == 4>> - big dick - <<elseif getSlave($AS).dick == 5>> - impressive dick - <<elseif getSlave($AS).dick == 6>> - huge dick - <<elseif getSlave($AS).dick == 7>> - gigantic dick - <<elseif getSlave($AS).dick == 8>> - titanic dick - <<elseif getSlave($AS).dick == 9>> - absurd dick - <<elseif getSlave($AS).dick == 10>> - inhuman dick - <<else>> - hypertrophied dick - <</if>> before taking it gently in one hand and tenderly stroking your hand along its shaft<<if getSlave($AS).balls > 0>>,<<else>>.<</if>> - <<if getSlave($AS).balls > 0>> - while simultaneously cupping - <<if getSlave($AS).scrotum == 0>> - the soft skin between $his base and $his butthole - <<elseif getSlave($AS).balls == 1>> - $his tiny balls - <<elseif getSlave($AS).balls == 2>> - $his small balls - <<elseif getSlave($AS).balls == 3>> - $his balls - <<elseif getSlave($AS).balls == 4>> - $his big balls - <<elseif getSlave($AS).balls == 5>> - $his lemon-sized balls - <<elseif getSlave($AS).balls < 10>> - $his fist-sized balls - <<else>> - $his hypertrophied balls - <</if>> - with your other hand. - <</if>> - You firmly wrap your fingers, thumb and palm around $his dick, rhythmically stroking along with both hands, starting slow but gradually increasing the speed of your movements. You occasionally squeeze the tip and head of $his dick between your fingers and thumb. - <<if !canAchieveErection(getSlave($AS))>> - $His dick remains flaccid as it cannot get stiff and you continue tenderly stroking $his soft dick but, $he does not respond. - <<else>> - $His prick stiffens like a rod in your hands and you continue your expert strokes along the erect shaft but, except for the cockmilk leaking out of $his dick, $he does not respond. - <</if>> - Since $he is mindbroken, $his responses to you are purely physiological and your actions have no affect on $him mentally. You leave your toy for one of your other slaves to clean and maintain. -<<elseif isAmputee(getSlave($AS))>> - Since $he's a quadruple amputee, $he's yours to use as a human finger toy. While $he's lying there helpless, you move your hands towards $him. You gently trace your fingers along $his - <<if getSlave($AS).dick == 1>> - tiny dick - <<elseif getSlave($AS).dick == 2>> - cute dick - <<elseif getSlave($AS).dick == 3>> - dick - <<elseif getSlave($AS).dick == 4>> - big dick - <<elseif getSlave($AS).dick == 5>> - impressive dick - <<elseif getSlave($AS).dick == 6>> - huge dick - <<elseif getSlave($AS).dick == 7>> - gigantic dick - <<elseif getSlave($AS).dick == 8>> - titanic dick - <<elseif getSlave($AS).dick == 9>> - absurd dick - <<elseif getSlave($AS).dick == 10>> - inhuman dick - <<else>> - hypertrophied dick - <</if>> before taking it gently in one hand and tenderly stroking your hand along its shaft<<if getSlave($AS).balls > 0>>,<<else>>.<</if>> - <<if getSlave($AS).balls > 0>> - while simultaneously cupping $his - <<if getSlave($AS).scrotum == 0>> - soft skin beneath $his base and $his butthole - <<elseif getSlave($AS).balls == 1>> - tiny balls - <<elseif getSlave($AS).balls == 2>> - small balls - <<elseif getSlave($AS).balls == 3>> - balls - <<elseif getSlave($AS).balls == 4>> - big balls - <<elseif getSlave($AS).balls == 5>> - lemon-sized balls - <<elseif getSlave($AS).balls < 10>> - fist-sized balls - <<else>> - hypertrophied balls - <</if>> - with your other hand. - <</if>> - You firmly wrap your fingers, thumb and palm around $his dick, rhythmically stroking along with both hands, starting slow but gradually increasing the speed of your movements. You occasionally squeeze the tip and head of $his dick between your fingers and thumb. - <<if !canAchieveErection(getSlave($AS))>> - $His dick remains flaccid as it cannot get stiff and you continue tenderly stroking $his soft dick but, except for the cockmilk leaking out of $his dick, $he does not respond. - <<else>> - $His prick stiffens like a rod in your hands and you continue your expert strokes along the erect shaft but, except for the cockmilk leaking out of $his dick, $he does not respond. - <</if>> Soon, $his movements indicate that $he is orgasming. $He shudders and leaks $his cockmilk as $he orgasms in your hand, looking at you as you stop moving your hands. You leave your toy for one of your other slaves to clean and maintain. -<<elseif (getSlave($AS).fetish == "submissive") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1)>> - $He comes submissively over, smiling a little submissive smile, and points $his dick towards you. You gently trace your fingers along $his - <<if getSlave($AS).dick == 1>> - tiny dick - <<elseif getSlave($AS).dick == 2>> - cute dick - <<elseif getSlave($AS).dick == 3>> - dick - <<elseif getSlave($AS).dick == 4>> - big dick - <<elseif getSlave($AS).dick == 5>> - impressive dick - <<elseif getSlave($AS).dick == 6>> - huge dick - <<elseif getSlave($AS).dick == 7>> - gigantic dick - <<elseif getSlave($AS).dick == 8>> - titanic dick - <<elseif getSlave($AS).dick == 9>> - absurd dick - <<elseif getSlave($AS).dick == 10>> - inhuman dick - <<else>> - hypertrophied dick - <</if>> before taking it gently in one hand and tenderly stroking your hand along its shaft<<if getSlave($AS).balls > 0>>,<<else>>.<</if>> - <<if getSlave($AS).balls > 0>> - while simultaneously cupping $his - <<if getSlave($AS).scrotum == 0>> - soft skin beneath $his base and $his butthole - <<elseif getSlave($AS).balls == 1>> - tiny balls - <<elseif getSlave($AS).balls == 2>> - small balls - <<elseif getSlave($AS).balls == 3>> - balls - <<elseif getSlave($AS).balls == 4>> - big balls - <<elseif getSlave($AS).balls == 5>> - lemon-sized balls - <<elseif getSlave($AS).balls < 10>> - fist-sized balls - <<else>> - hypertrophied balls - <</if>> - with your other hand. - <</if>> - You firmly wrap your fingers, thumb and palm around $his dick, rhythmically stroking along with both hands, starting slow but gradually increasing the speed of your movements. You occasionally squeeze the tip and head of $his dick between your fingers and thumb. - <<if !canAchieveErection(getSlave($AS))>> - $His dick remains flaccid as it cannot get stiff and you continue tenderly stroking $his soft dick. - <<else>> - $His prick stiffens like a rod in your hands and you continue your expert strokes along the erect shaft. - <</if>> Soon, $his movements indicate that $he is orgasming. $He shudders and leaks $his cockmilk as $he orgasms in your hands before submissively avoiding your gaze as you get cleaned up. -<<elseif getSlave($AS).devotion < -20>> - $He clearly dislikes the thought of getting $his dick fondled by you. $His lower lip quivers with trepidation as $he watches your hands move towards $him. $He has no choice but to obey if $he wants to avoid punishment. $He gasps and shakes as you gently trace along $his - <<if getSlave($AS).dick == 1>> - tiny dick - <<elseif getSlave($AS).dick == 2>> - cute dick - <<elseif getSlave($AS).dick == 3>> - dick - <<elseif getSlave($AS).dick == 4>> - big dick - <<elseif getSlave($AS).dick == 5>> - impressive dick - <<elseif getSlave($AS).dick == 6>> - huge dick - <<elseif getSlave($AS).dick == 7>> - gigantic dick - <<elseif getSlave($AS).dick == 8>> - titanic dick - <<elseif getSlave($AS).dick == 9>> - absurd dick - <<elseif getSlave($AS).dick == 10>> - inhuman dick - <<else>> - hypertrophied dick - <</if>> before taking it gently in one hand and tenderly stroking your hand along its shaft<<if getSlave($AS).balls > 0>>,<<else>>.<</if>> - <<if getSlave($AS).balls > 0>> - while simultaneously cupping $his - <<if getSlave($AS).scrotum == 0>> - soft skin beneath $his base and $his butthole - <<elseif getSlave($AS).balls == 1>> - tiny balls - <<elseif getSlave($AS).balls == 2>> - small balls - <<elseif getSlave($AS).balls == 3>> - balls - <<elseif getSlave($AS).balls == 4>> - big balls - <<elseif getSlave($AS).balls == 5>> - lemon-sized balls - <<elseif getSlave($AS).balls < 10>> - fist-sized balls - <<else>> - hypertrophied balls - <</if>> - with your other hand. - <</if>> - You firmly wrap your fingers, thumb and palm around $his dick, rhythmically stroking along with both hands, starting slow but gradually increasing the speed of your movements. You occasionally squeeze the tip and head of $his dick between your fingers and thumb. - <<if !canAchieveErection(getSlave($AS))>> - $His dick remains flaccid as it cannot get stiff and you continue tenderly stroking $his soft dick. - <<else>> - $His prick stiffens like a rod in your hand and you continue your expert strokes along the erect shaft. - <</if>> - $He <<if hasAnyArms(getSlave($AS))>>grabs your wrist with $his hand<<if hasBothArms(getSlave($AS))>>s<</if>><<else>>jostles against your arm<</if>> and tries to stop it from moving but is unable to and despite $his resistant pulling against you. $He bites $his lip but $he cannot help but moan. Soon $he shudders and leaks $his cockmilk as $he orgasms in your hands. $He looks at you shamefully as you stop moving your hands and get cleaned up. -<<elseif (getSlave($AS).fetish == "masochist") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1)>> - $He hurriedly comes over to you, to stand between you and your desk. You lean over while $he lies down upon it, face-up, with $his dick pointed towards you. $He gasps when you slap $his - <<if getSlave($AS).dick == 1>> - tiny dick - <<elseif getSlave($AS).dick == 2>> - cute dick - <<elseif getSlave($AS).dick == 3>> - dick - <<elseif getSlave($AS).dick == 4>> - big dick - <<elseif getSlave($AS).dick == 5>> - impressive dick - <<elseif getSlave($AS).dick == 6>> - huge dick - <<elseif getSlave($AS).dick == 7>> - gigantic dick - <<elseif getSlave($AS).dick == 8>> - titanic dick - <<elseif getSlave($AS).dick == 9>> - absurd dick - <<elseif getSlave($AS).dick == 10>> - inhuman dick - <<else>> - hypertrophied dick - <</if>> - with your hand. You firmly grab it and tightly squeeze it with your fingers, stroking your hand along its shaft. - <<if getSlave($AS).balls > 0>>, - Simultaneously, you slap $his - <<if getSlave($AS).balls == 1>> - tiny balls - <<elseif getSlave($AS).balls == 2>> - small balls - <<elseif getSlave($AS).balls == 3>> - balls - <<elseif getSlave($AS).balls == 4>> - big balls - <<elseif getSlave($AS).balls == 5>> - lemon-sized balls - <<elseif getSlave($AS).balls < 10>> - fist-sized balls - <<else>> - hypertrophied balls - <</if>> - with your other hand. - <</if>> - You firmly wrap your fingers, thumb and palm around $his dick, rhythmically stroking along with both hands, starting slow but gradually increasing the speed of your movements. You occasionally squeeze and pinch the tip and head of $his dick between your fingers and thumb. - <<if !canAchieveErection(getSlave($AS))>> - $His dick remains flaccid as it cannot get stiff and you continue tenderly stroking $his soft dick. - <<else>> - $His prick stiffens like a rod in your hands and you continue your expert strokes along the erect shaft. - <</if>> Your rough play leaves red marks on $his breasts and nipples and $he becomes even more aroused. Soon, $his movements indicate that $he is orgasming. $He shudders and leaks $his cockmilk as $he orgasms in your hands. $He rubs the marks on $his dick and balls with $his hands, an ecstatic look on $his <<= getSlave($AS).skin>> face. $He looks at you longingly as you get cleaned up, hungry for more. -<<elseif getSlave($AS).devotion <= 20>> - $He obeys silently, standing in front of you as you move your hands towards $him. You gently trace your fingers along $his - <<if getSlave($AS).dick == 1>> - tiny dick - <<elseif getSlave($AS).dick == 2>> - cute dick - <<elseif getSlave($AS).dick == 3>> - dick - <<elseif getSlave($AS).dick == 4>> - big dick - <<elseif getSlave($AS).dick == 5>> - impressive dick - <<elseif getSlave($AS).dick == 6>> - huge dick - <<elseif getSlave($AS).dick == 7>> - gigantic dick - <<elseif getSlave($AS).dick == 8>> - titanic dick - <<elseif getSlave($AS).dick == 9>> - absurd dick - <<elseif getSlave($AS).dick == 10>> - inhuman dick - <<else>> - hypertrophied dick - <</if>> before taking it gently in one hand and tenderly stroking your hand along its shaft<<if getSlave($AS).balls > 0>>,<<else>>.<</if>> - <<if getSlave($AS).balls > 0>> - while simultaneously cupping $his - <<if getSlave($AS).scrotum == 0>> - soft skin beneath $his base and $his butthole - <<elseif getSlave($AS).balls == 1>> - tiny balls - <<elseif getSlave($AS).balls == 2>> - small balls - <<elseif getSlave($AS).balls == 3>> - balls - <<elseif getSlave($AS).balls == 4>> - big balls - <<elseif getSlave($AS).balls == 5>> - lemon-sized balls - <<elseif getSlave($AS).balls < 10>> - fist-sized balls - <<else>> - hypertrophied balls - <</if>> - with your other hand. - <</if>> - You firmly wrap your fingers, thumb and palm around $his dick, rhythmically stroking along with both hands, starting slow but gradually increasing the speed of your movements. You occasionally squeeze the tip and head of $his dick between your fingers and thumb. - <<if !canAchieveErection(getSlave($AS))>> - $His dick remains flaccid as it cannot get stiff and you continue tenderly stroking $his soft dick. - <<else>> - $His prick stiffens like a rod in your hands and you continue your expert strokes along the erect shaft. - <</if>> - $He <<if canSee(getSlave($AS))>>looks into your eyes<<else>>faces you<</if>> furtively while $he <<if hasAnyArms(getSlave($AS))>>grabs your wrist<<if hasBothArms(getSlave($AS))>>s<</if>> with $his hand<<if hasBothArms(getSlave($AS))>>s<</if>><<else>>moves $his hips ever so slightly<</if>>, moving to match your hand movements. $He moans and shudders, leaking $his cockmilk as $he orgasms in your hands. $He dutifully looks at you as you stop moving your hands and get cleaned up. -<<else>> - $He devotedly comes over and gives you an impassioned kiss. $He smiles and points $his dick towards you. You gently trace your fingers along $his - <<if getSlave($AS).dick == 1>> - tiny dick - <<elseif getSlave($AS).dick == 2>> - cute dick - <<elseif getSlave($AS).dick == 3>> - dick - <<elseif getSlave($AS).dick == 4>> - big dick - <<elseif getSlave($AS).dick == 5>> - impressive dick - <<elseif getSlave($AS).dick == 6>> - huge dick - <<elseif getSlave($AS).dick == 7>> - gigantic dick - <<elseif getSlave($AS).dick == 8>> - titanic dick - <<elseif getSlave($AS).dick == 9>> - absurd dick - <<elseif getSlave($AS).dick == 10>> - inhuman dick - <<else>> - hypertrophied dick - <</if>> before taking it gently in one hand and tenderly stroking your hand along its shaft<<if getSlave($AS).balls > 0>>,<<else>>.<</if>> - <<if getSlave($AS).balls > 0>> - while simultaneously cupping $his - <<if getSlave($AS).scrotum == 0>> - soft skin beneath $his base and $his butthole - <<elseif getSlave($AS).balls == 1>> - tiny balls - <<elseif getSlave($AS).balls == 2>> - small balls - <<elseif getSlave($AS).balls == 3>> - balls - <<elseif getSlave($AS).balls == 4>> - big balls - <<elseif getSlave($AS).balls == 5>> - lemon-sized balls - <<elseif getSlave($AS).balls < 10>> - fist-sized balls - <<else>> - hypertrophied balls - <</if>> - with your other hand. - <</if>> - You firmly wrap your fingers, thumb and palm around $his dick, rhythmically stroking along with both hands, starting slow but gradually increasing the speed of your movements. You occasionally squeeze the tip and head of $his dick between your fingers and thumb. - <<if !canAchieveErection(getSlave($AS))>> - $His dick remains flaccid as it cannot get stiff and you continue tenderly stroking $his soft dick. - <<else>> - $His prick stiffens like a rod in your hands and you continue your expert strokes along the erect shaft. - <</if>> $He begs you not to stop. Soon, $he moans and $his movements indicate that $he is about to orgasm. $He shudders and leaks $his cockmilk as $he orgasms in your hands. $He looks at you passionately as you stop moving your hands and get cleaned up. -<</if>> diff --git a/src/npc/interaction/fondleVagina.js b/src/npc/interaction/fondleVagina.js new file mode 100644 index 0000000000000000000000000000000000000000..aee78367708ab2e79673088c0bbedc9edb333e38 --- /dev/null +++ b/src/npc/interaction/fondleVagina.js @@ -0,0 +1,671 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fondleVagina = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself + } = getPronouns(slave); + + const {title: Master, say: say} = getEnunciation(slave); + + r.push(`You call ${him} over so you can fondle ${his}`); + if (slave.vagina > 3) { + r.push(`gaping vagina.`); + } else if (slave.vagina === 3) { + r.push(`loose vagina.`); + } else if (slave.vagina === 2) { + r.push(`well-used pussy.`); + } else if (slave.vagina === 1) { + r.push(`tight pussy.`); + } else if (slave.vagina === 0) { + r.push(`virgin pussy.`); + } + + if (slave.vaginaTat === "tribal patterns") { + r.push(`The tattoos on ${his} abdomen certainly draw attention there.`); + } else if (slave.vaginaTat === "lewd crest") { + r.push(`The crest on ${his} abdomen invokes lewd thoughts, after all.`); + } + + if (slave.devotion <= 20) { + if (slave.clit === 1) { + r.push(`${His} big clit peeks out from under its hood`); + } else if (slave.clit === 2) { + r.push(`${His} huge clit is impossible to miss`); + } else if (slave.clit > 1) { + r.push(`${His} pseudophallus-sized clit is soft`); + } else if (slave.chastityPenis) { + r.push(`${His} useless penis is properly caged`); + } else if (slave.dick > 0) { + r.push(`${His} dick is soft`); + } else { + r.push(`${His} pretty little clit is barely visible`); + } + r.push(`and`); + if (slave.labia === 1) { + r.push(`${his} lovely petals are quite inviting.`); + } else if (slave.labia === 2) { + r.push(`${his} prominent petals are inviting.`); + } else if (slave.labia > 1) { + r.push(`${his} labia are so large they present a slight obstacle to entry.`); + } else { + r.push(`${his} cute labia are barely noticeable.`); + } + } else { + if (slave.clit === 1) { + r.push(`${His} big clit peeks out from under its hood`); + } else if (slave.clit === 2) { + r.push(`${His} huge clit is impossible to miss`); + } else if (slave.clit > 1) { + r.push(`${His} pseudophallus-sized clit is soft`); + } else if (slave.chastityPenis) { + r.push(`${His} chastity cage is uncomfortably full`); + } else if (canAchieveErection(slave)) { + r.push(`${His} dick vies for attention`); + } else if (slave.dick > 0) { + r.push(`${His} soft dick dribbles excitedly`); + } else { + r.push(`${His} pretty little clit is ready for you,`); + } + r.push(`and`); + if (slave.labia === 1) { + r.push(`${his} lovely petals are moist with arousal.`); + } else if (slave.labia === 2) { + r.push(`${his} prominent petals bear a sheen of arousal.`); + } else if (slave.labia > 1) { + r.push(`${his} huge labia are almost dripping with arousal.`); + } else { + r.push(`${he}'s becoming moist.`); + } + } + + if (slave.vaginaPiercing > 1 && slave.clitPiercing > 0) { + r.push(`${His} pierced lips and clit have ${his} nice and wet.`); + } else if (slave.clitPiercing > 0) { + r.push(`${His} pierced clit has ${him} nice and moist.`); + } + + if (slave.vagina === 0) { + if (slave.fetish === "mindbroken") { + r.push(`${He} accepts your orders dumbly and presents ${his} virgin pussy to you,`); + if (canSee(slave)) { + r.push(`watching your hands move towards ${him}`); + } else { + r.push(`waiting`); + } + r.push(`without any real interest. You`); + if (slave.balls >= 60) { + r.push(`struggle to shove ${his} oversized nuts out of the way and`); + } else if (slave.balls >= 30) { + r.push(`struggle to lift ${his} oversized nuts and`); + } else if (slave.balls >= 14) { + r.push(`palm one of ${his} giant testicles and`); + } else if (slave.balls >= 9) { + r.push(`cup ${his} huge balls and`); + } else if (slave.balls >= 5) { + r.push(`lift ${his} big balls out of the way and`); + } else if (slave.scrotum > 0) { + r.push(`reach under ${his} dangling scrotum and`); + } + r.push(`gently trace along ${his}`); + if (slave.labia === 1) { + r.push(`lovely petals`); + } else if (slave.labia === 2) { + r.push(`prominent petals`); + } else if (slave.labia > 1) { + r.push(`huge labia`); + } + r.push(`with your outstretched fingers, strumming up and down the edges of ${his} pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally flick ${his}`); + if (slave.clit === 1) { + r.push(`erect clit`); + } else if (slave.clit === 2) { + r.push(`large clit`); + } else if (slave.clit > 1) { + r.push(`massive clit`); + } else if (slave.chastityPenis) { + r.push(`${his} cage`); + } else if (canAchieveErection(slave)) { + r.push(`${his} erection`); + } else if (slave.dick > 0) { + r.push(`soft dick`); + } else { + r.push(`pretty little clit`); + } + r.push(`and rub it with your fingertips as your hand nears it but outside of the pussy juices`); + if (hasAnyLegs(slave)) { + r.push(`trickling down ${his} leg,`); + } else { + r.push(`pooling beneath ${him},`); + } + r.push(`${he} does not respond. Since ${he} is mindbroken, ${his} responses to you are purely physiological and your actions have no affect on ${him} mentally.`); + } else if (slave.devotion > 50) { + r.push(`${He} accepts your orders happily and presents ${his} virgin pussy to you,`); + if (slave.scrotum > 0) { + r.push(`shifting ${his} balls out of the way and`); + } + if (canSee(slave)) { + r.push(`watching your hands with eagerness.`); + } else { + r.push(`eagerly awaiting your touch.`); + } + r.push(`${He} gasps and quivers with pleasure as you gently trace along ${his}`); + if (slave.labia === 1) { + r.push(`lovely petals`); + } else if (slave.labia === 2) { + r.push(`prominent petals`); + } else if (slave.labia > 1) { + r.push(`huge labia`); + } else { + r.push(`cute labia`); + } + r.push(`with your outstretched fingers, strumming up and down the edges of ${his} pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements.`); + if (hasAnyArms(slave)) { + if (slave.fetish === "boobs") { + r.push(`${He} fondles ${his} breasts and plays with ${his} nipples at the same time.`); + } else if ((slave.fetish === "pregnancy") && slave.belly >= 1500) { + r.push(`${He} strokes the curve of ${his} belly at the same time.`); + } + } + r.push(`You occasionally`); + if (slave.clit === 1) { + r.push(`flick ${his} large clit and rub it with your fingertips`); + } else if (slave.clit === 2) { + r.push(`flick ${his} huge clit and rub it with your fingertips`); + } else if (slave.clit > 1) { + r.push(`flick ${his} massive clit and rub it with your fingertips`); + } else if (slave.chastityPenis) { + r.push(`caress ${his} chastity cage with your palm`); + } else if (canAchieveErection(slave)) { + r.push(`flick ${his} erection and give it a stroke`); + } else if (slave.dick > 0) { + r.push(`flick ${his} soft dick and rub it with your fingertips`); + } else { + r.push(`flick ${his} pretty little clit and rub it with your fingertips`); + } + r.push(`as your hand nears it. As ${he} becomes more aroused, ${he}`); + if (hasAnyArms(slave)) { + r.push(`grabs hold of your wrist lightly, moving ${his} hands along with the motion of your own.`); + } else { + r.push(`begins to move ${his} body to the rhythm of your motions.`); + } + r.push(`${His} pussy juices`); + if (hasAnyLegs(slave)) { + r.push(`run down ${his} leg`); + } else { + r.push(`pool beneath ${him}`); + } + r.push(`as ${he} begins to moan audibly${hasAnyLegs(slave) ? `, gently clamping your hand between ${his} thighs` : ``} as you continue to move your hand along ${his} pussy. ${He} moans loudly as ${he} shudders in orgasmic joy.`); + if (!hasAnyArms(slave) && !canTalk(slave)) { + r.push(`${He} does ${his} best to communicate love with ${his} ${App.Desc.eyesColor(slave)}.`); + } else if (!canTalk(slave)) { + r.push(`${He} signs that ${he} loves you.`); + } else { + r.push( + Spoken(slave, `"I love you, ${Master},"`), + `${he} ${say}s rapturously.` + ); + } + } else if (slave.devotion > 20) { + r.push(`${He} accepts your orders without comment and presents ${his} virgin pussy to you,`); + if (slave.scrotum > 0) { + r.push(`shifting ${his} balls out of the way and`); + } + if (canSee(slave)) { + r.push(`watching your hands with some slight trepidation.`); + } else { + r.push(`nervously anticipating your touch.`); + } + r.push(`${He} gasps as you gently trace along ${his}`); + if (slave.labia === 1) { + r.push(`lovely petals`); + } else if (slave.labia === 2) { + r.push(`prominent petals`); + } else if (slave.labia > 1) { + r.push(`huge labia`); + } + r.push(`with your outstretched fingers, strumming up and down the edges of ${his} pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally`); + if (slave.clit === 1) { + r.push(`flick ${his} large clit and rub it with your fingertips`); + } else if (slave.clit === 2) { + r.push(`flick ${his} huge clit and rub it with your fingertips`); + } else if (slave.clit > 1) { + r.push(`flick ${his} massive clit and rub it with your fingertips`); + } else if (slave.chastityPenis) { + r.push(`caress ${his} chastity cage with your palm`); + } else if (canAchieveErection(slave)) { + r.push(`flick ${his} erection and give it a stroke`); + } else if (slave.dick > 0) { + r.push(`flick ${his} soft dick and rub it with your fingertips`); + } else { + r.push(`flick ${his} pretty little clit and rub it with your fingertips`); + } + r.push(`as your hand nears it. ${His} pussy juices`); + if (hasAnyLegs(slave)) { + r.push(`run down ${his} leg`); + } else { + r.push(`pool beneath ${him}`); + } + r.push(`as ${he} begins to moan`); + if (hasAnyArms(slave)) { + r.push(`audibly, grasping your wrist with ${his} ${hasBothArms(slave) ? `hands` : `hand`} tightly`); + } else { + r.push(`audibly`); + } + if (hasAnyLegs(slave)) { + r.push(`and clamping ${his} thighs together`); + } + r.push(`as you continue to move your hand along ${his} pussy. ${He} moans as ${he} shudders in an orgasm, almost embarrassed.`); + if (canSee(slave)) { + r.push(`${He} looks into your eyes expectantly.`); + } else { + r.push(`${He} pants expectantly, bracing for more.`); + } + } else if (slave.devotion >= -20) { + r.push(`${He} clearly dislikes the thought of getting fondled by you. ${His} lower lip quivers with trepidation as ${he}`); + if (canSee(slave)) { + r.push(`watches your hands move towards ${him}.`); + } else { + r.push(`waits for your hand to touch ${him}.`); + } + r.push(`${He} has no choice but to`); + if (slave.scrotum > 0) { + r.push(`shift ${his} balls out of the way and`); + } + r.push(`obey if ${he} wants to avoid punishment. ${He} gasps and shakes as you gently trace along ${his}`); + if (slave.labia === 1) { + r.push(`lovely petals`); + } else if (slave.labia === 2) { + r.push(`prominent petals`); + } else if (slave.labia > 1) { + r.push(`huge labia`); + } else { + r.push(`cute labia`); + } + r.push(`with your outstretched fingers, strumming up and down the edges of ${his} pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally`); + if (slave.clit === 1) { + r.push(`flick ${his} large clit and rub it with your fingertips`); + } else if (slave.clit === 2) { + r.push(`flick ${his} huge clit and rub it with your fingertips`); + } else if (slave.clit > 1) { + r.push(`flick ${his} massive clit and rub it with your fingertips`); + } else if (slave.chastityPenis) { + r.push(`caress ${his} chastity cage with your palm`); + } else if (canAchieveErection(slave)) { + r.push(`flick ${his} growing erection and give it a stroke`); + } else if (slave.dick > 0) { + r.push(`flick ${his} soft dick and rub it with your fingertips`); + } else { + r.push(`flick ${his} pretty little clit and rub it with your fingertips`); + } + r.push(`as your hand nears it. ${His} pussy juices`); + if (hasAnyLegs(slave)) { + r.push(`run down ${his} leg`); + } else { + r.push(`pool beneath ${him}`); + } + r.push(`as ${he} begins to moan`); + if (hasAnyArms(slave)) { + r.push(`audibly, grasping your wrist with ${his} ${hasBothArms(slave) ? `hands` : `hand`} tightly`); + } else { + r.push(`audibly`); + } + if (hasBothLegs(slave)) { + r.push(`and clamping ${his} thighs together`); + } + r.push(`as you continue to move your hand along ${his} pussy. ${He} moans as ${he} shudders in an orgasm, clearly embarrassed to end up in this position as ${he} loses control.`); + } else { + r.push(`As you anticipated, ${he} refuses to let ${himself} be groped by you. ${He} is unable to resist you, also as you expected, when you mention some of the alternatives. ${He} gasps and shakes as you gently trace along ${his}`); + if (slave.labia === 1) { + r.push(`lovely petals`); + } else if (slave.labia === 2) { + r.push(`prominent petals`); + } else if (slave.labia > 1) { + r.push(`huge labia`); + } else { + r.push(`cute labia`); + } + r.push(`with your outstretched fingers, strumming up and down the edges of ${his} pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements.`); + if (hasAnyArms(slave)) { + r.push(`${He} grabs your wrist with ${his} hand`); + if (hasBothArms(slave)) { + r.push(`s`); + } + r.push(`in an effort to stop you but ${he} is unable to stop your hand from moving for long.`); + } + r.push(`You occasionally`); + if (slave.clit === 1) { + r.push(`flick ${his} large clit and rub it with your fingertips`); + } else if (slave.clit === 2) { + r.push(`flick ${his} huge clit and rub it with your fingertips`); + } else if (slave.clit > 1) { + r.push(`flick ${his} massive clit and rub it with your fingertips`); + } else if (slave.chastityPenis) { + r.push(`caress ${his} chastity cage with your palm`); + } else if (canAchieveErection(slave)) { + r.push(`flick ${his} unwilling erection and give it a stroke`); + } else if (slave.dick > 0) { + r.push(`flick ${his} soft dick and rub it with your fingertips`); + } else { + r.push(`flick ${his} pretty little clit and rub it with your fingertips`); + } + r.push(`as your hand nears it. ${He}`); + if (hasAnyArms(slave)) { + r.push(`tightly grasps your wrist`); + if (hasBothLegs(slave)) { + r.push(`and`); + } + } + if (hasBothLegs(slave)) { + r.push(`clamps ${his} thighs together`); + } + if (!hasAnyArms(slave) && !hasBothLegs(slave)) { + r.push(`squirms uncomfortably a little`); + } + r.push(`as you continue to move your hand along ${his} pussy. ${He} moans as ${he} shudders in an orgasm, gripping tighter and shamefully looking at you as you stop moving your hand.`); + } + } else if (slave.fetish === "mindbroken") { + r.push(`Like a doll, ${he} dumbly remains still,`); + if (canSee(slave)) { + r.push(`watching your hands move towards ${him}`); + } else { + r.push(`waiting`); + } + r.push(`without any real interest. You`); + if (slave.balls >= 60) { + r.push(`struggle to shove ${his} oversized nuts out of the way and`); + } else if (slave.balls >= 30) { + r.push(`struggle to lift ${his} oversized nuts and`); + } else if (slave.balls >= 14) { + r.push(`palm one of ${his} giant testicles and`); + } else if (slave.balls >= 9) { + r.push(`cup ${his} huge balls and`); + } else if (slave.balls >= 5) { + r.push(`lift ${his} big balls out of the way and`); + } else if (slave.scrotum > 0) { + r.push(`reach under ${his} dangling scrotum and`); + } + r.push(`gently trace along ${his}`); + if (slave.labia === 1) { + r.push(`lovely petals`); + } else if (slave.labia === 2) { + r.push(`prominent petals`); + } else if (slave.labia > 1) { + r.push(`huge labia`); + } else { + r.push(`cute labia`); + } + r.push(`with your outstretched fingers, strumming up and down the edges of ${his} pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally flick ${his}`); + if (slave.clit === 1) { + r.push(`erect clit`); + } else if (slave.clit === 2) { + r.push(`large clit`); + } else if (slave.clit > 1) { + r.push(`massive clit`); + } else if (slave.chastityPenis) { + r.push(`${his} cage`); + } else if (canAchieveErection(slave)) { + r.push(`${his} erection`); + } else if (slave.dick > 0) { + r.push(`soft dick`); + } else { + r.push(`pretty little clit`); + } + r.push(`and rub it with your fingertips as your hand nears it. Except for the pussy juices`); + if (hasAnyLegs(slave)) { + r.push(`trickling down ${his} leg,`); + } else { + r.push(`pooling beneath ${him},`); + } + r.push(`${he} does not respond. Since ${he} is mindbroken, ${his} responses to you are purely physiological and your actions have no affect on ${him} mentally. You leave your toy for one of your other slaves to clean and maintain.`); + } else if (isAmputee(slave)) { + r.push(`Since ${he}'s a quadruple amputee, ${he}'s yours to use as a human finger toy. While ${he}'s lying there helpless, you move your hands towards`); + if (slave.balls >= 60) { + r.push(`${him} and struggle to shove ${his} oversized nuts out of the way.`); + } else if (slave.balls >= 30) { + r.push(`${him} and strain to lift ${his} oversized nuts out of the way.`); + } else if (slave.balls >= 14) { + r.push(`${him}, palming one of ${his} giant testicles to make way.`); + } else if (slave.balls >= 9) { + r.push(`${him}, cupping ${his} huge balls to keep them out of the way.`); + } else if (slave.balls >= 5) { + r.push(`${him}, lifting ${his} big balls out of the way in the process.`); + } else if (slave.scrotum > 0) { + r.push(`${him}, slipping under ${his} dangling scrotum in the process.`); + } else { + r.push(`${him}.`); + } + r.push(`You gently trace along ${his}`); + if (slave.labia === 1) { + r.push(`lovely petals`); + } else if (slave.labia === 2) { + r.push(`prominent petals`); + } else if (slave.labia > 1) { + r.push(`huge labia`); + } else { + r.push(`cute labia`); + } + r.push(`with your outstretched fingers, strumming up and down the edges of ${his} pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally`); + if (slave.clit === 1) { + r.push(`flick ${his} large clit and rub it with your fingertips`); + } else if (slave.clit === 2) { + r.push(`flick ${his} huge clit and rub it with your fingertips`); + } else if (slave.clit > 1) { + r.push(`flick ${his} massive clit and rub it with your fingertips`); + } else if (slave.chastityPenis) { + r.push(`caress ${his} chastity cage with your palm`); + } else if (canAchieveErection(slave)) { + r.push(`flick ${his} erection and give it a stroke`); + } else if (slave.dick > 0) { + r.push(`flick ${his} soft dick and rub it with your fingertips`); + } else { + r.push(`flick ${his} pretty little clit and rub it with your fingertips`); + } + r.push(`as your hand nears it. Soon ${he} shudders in an orgasm,`); + if (canSee(slave)) { + r.push(`looking at you`); + } else { + r.push(`facing`); + } + r.push(`as you stop moving your hand. You leave your toy for one of your other slaves to clean and maintain.`); + } else if (slave.fetish === "submissive" && slave.fetishStrength > 60 && slave.fetishKnown === 1) { + r.push(`${He} comes submissively over, smiling a little submissive smile, and points ${his} pussy towards you${(slave.scrotum > 0) ? `, shifting ${his} balls out of the way and` : ``}. You gently trace along ${his}`); + if (slave.labia === 1) { + r.push(`lovely petals`); + } else if (slave.labia === 2) { + r.push(`prominent petals`); + } else if (slave.labia > 1) { + r.push(`huge labia`); + } else { + r.push(`cute labia`); + } + r.push(`with your outstretched fingers, strumming up and down the edges of ${his} pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally`); + if (slave.clit === 1) { + r.push(`flick ${his} large clit and rub it with your fingertips`); + } else if (slave.clit === 2) { + r.push(`flick ${his} huge clit and rub it with your fingertips`); + } else if (slave.clit > 1) { + r.push(`flick ${his} massive clit and rub it with your fingertips`); + } else if (slave.chastityPenis) { + r.push(`caress ${his} chastity cage with your palm`); + } else if (canAchieveErection(slave)) { + r.push(`flick ${his} erection and give it a stroke`); + } else if (slave.dick > 0) { + r.push(`flick ${his} soft dick and rub it with your fingertips`); + } else { + r.push(`flick ${his} pretty little clit and rub it with your fingertips`); + } + r.push(`as your hand nears it. ${He} begs you not to stop as ${he}`); + if (canSee(slave)) { + r.push(`looks into your eyes`); + } else { + r.push(`faces`); + } + r.push(`expectantly as ${he} shudders in an orgasm.`); + } else if (slave.devotion < -20) { + r.push(`${He} tries to refuse, so you push the disobedient slave down`); + if (canStand(slave)) { + r.push(`over your desk`); + } + r.push(`as you move your hands towards ${him}. You gently`); + if (slave.scrotum > 0) { + r.push(`shift ${his} balls out of the way and`); + } + r.push(`trace along ${his}`); + if (slave.labia === 1) { + r.push(`lovely petals`); + } else if (slave.labia === 2) { + r.push(`prominent petals`); + } else if (slave.labia > 1) { + r.push(`huge labia`); + } else { + r.push(`cute labia`); + } + r.push(`with your outstretched fingers, strumming up and down the edges of ${his} pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. ${He}`); + if (hasAnyArms(slave)) { + r.push(`grabs your wrist`); + } else { + r.push(`twists and turns`); + } + r.push(`to try to stop you but ${he} is unable to. You occasionally`); + if (slave.clit === 1) { + r.push(`flick ${his} large clit and rub it with your fingertips`); + } else if (slave.clit === 2) { + r.push(`flick ${his} huge clit and rub it with your fingertips`); + } else if (slave.clit > 1) { + r.push(`flick ${his} massive clit and rub it with your fingertips`); + } else if (slave.chastityPenis) { + r.push(`caress ${his} chastity cage with your palm`); + } else if (canAchieveErection(slave)) { + r.push(`flick ${his} unwilling erection and give it a stroke`); + } else if (slave.dick > 0) { + r.push(`flick ${his} soft dick and rub it with your fingertips`); + } else { + r.push(`flick ${his} pretty little clit and rub it with your fingertips`); + } + r.push(`as your hand nears it, despite ${his} resistant pulling against you. ${He} bites ${his} lip but ${he} cannot help but moan and ${he} shudders in an orgasm. ${He}`); + if (canSee(slave)) { + r.push(`looks at you`); + } else { + r.push(`faces`); + } + r.push(`shamefully as you stop moving your hand.`); + } else if (slave.devotion <= 20) { + r.push(`${He} obeys silently,`); + if (canStand(slave)) { + r.push(`standing`); + } else { + r.push(`resting`); + } + r.push(`in front of you as you move your hands towards ${him}. You gently`); + if (slave.scrotum > 0) { + r.push(`shift ${his} balls out of the way and`); + } + r.push(`trace along ${his}`); + if (slave.labia === 1) { + r.push(`lovely petals`); + } else if (slave.labia === 2) { + r.push(`prominent petals`); + } else if (slave.labia > 1) { + r.push(`huge labia`); + } else { + r.push(`cute labia`); + } + r.push(`with your outstretched fingers, strumming up and down the edges of ${his} pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally`); + if (slave.clit === 1) { + r.push(`flick ${his} large clit and rub it with your fingertips`); + } else if (slave.clit === 2) { + r.push(`flick ${his} huge clit and rub it with your fingertips`); + } else if (slave.clit > 1) { + r.push(`flick ${his} massive clit and rub it with your fingertips`); + } else if (slave.chastityPenis) { + r.push(`caress ${his} chastity cage with your palm`); + } else if (canAchieveErection(slave)) { + r.push(`flick ${his} growing erection and give it a stroke`); + } else if (slave.dick > 0) { + r.push(`flick ${his} soft dick and rub it with your fingertips`); + } else { + r.push(`flick ${his} pretty little clit and rub it with your fingertips`); + } + r.push(`as your hand nears it. ${He}`); + if (canSee(slave)) { + r.push(`looks into your eyes`); + } else { + r.push(`faces you`); + } + r.push(`furtively while ${he}`); + if (hasAnyArms(slave)) { + r.push(`grabs your wrist with ${his} hand`); + if (hasBothLegs(slave)) { + r.push(`and`); + } + } + if (hasBothLegs(slave)) { + r.push(`squeezes ${his} thighs together`); + } + if (!hasAnyArms(slave) && !hasBothLegs(slave)) { + r.push(`squirms a little`); + } + r.push(`as ${he} moans and shudders in an orgasm. ${He} dutifully`); + if (canSee(slave)) { + r.push(`looks at you`); + } else { + r.push(`faces`); + } + r.push(`as you stop moving your hand.`); + } else { + r.push(`${He} devotedly`); + if (canMove(slave)) { + r.push(`comes over and gives you an impassioned kiss. ${He}`); + } + r.push(`smiles${(slave.scrotum > 0) ? `, shifts ${his} balls to the side,` : ``} and points ${his} pussy towards you. You gently trace along ${his}`); + if (slave.labia === 1) { + r.push(`lovely petals`); + } else if (slave.labia === 2) { + r.push(`prominent petals`); + } else if (slave.labia > 1) { + r.push(`huge labia`); + } else { + r.push(`cute labia`); + } + r.push(`with your outstretched fingers, strumming up and down the edges of ${his} pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally`); + if (slave.clit === 1) { + r.push(`flick ${his} large clit and rub it with your fingertips`); + } else if (slave.clit === 2) { + r.push(`flick ${his} huge clit and rub it with your fingertips`); + } else if (slave.clit > 1) { + r.push(`flick ${his} massive clit and rub it with your fingertips`); + } else if (slave.chastityPenis) { + r.push(`caress ${his} chastity cage with your palm`); + } else if (canAchieveErection(slave)) { + r.push(`flick ${his} erection and give it a stroke`); + } else if (slave.dick > 0) { + r.push(`flick ${his} soft dick and rub it with your fingertips`); + } else { + r.push(`flick ${his} pretty little clit and rub it with your fingertips`); + } + r.push(`as your hand nears it. ${He}`); + if (hasAnyLegs(slave)) { + r.push(`squeezes ${his} thigh`); + if (hasBothLegs(slave)) { + r.push(`s`); + } + } else { + r.push(`pushes`); + } + r.push(`lightly against your hand as ${he} moans and shudders in orgasmic bliss. ${He}`); + if (canSee(slave)) { + r.push(`looks at you`); + } else { + r.push(`faces`); + } + r.push(`passionately as you stop moving your hand.`); + } + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/fondleVagina.tw b/src/npc/interaction/fondleVagina.tw deleted file mode 100644 index 3d541e2fa2ac0c8d9f8c146037c9e65a114bb399..0000000000000000000000000000000000000000 --- a/src/npc/interaction/fondleVagina.tw +++ /dev/null @@ -1,577 +0,0 @@ -:: FondleVagina [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> - -You call $him over so you can fondle $his -<<if (getSlave($AS).vagina > 3)>> - gaping vagina. -<<elseif (getSlave($AS).vagina == 3)>> - loose vagina. -<<elseif (getSlave($AS).vagina == 2)>> - well-used pussy. -<<elseif (getSlave($AS).vagina == 1)>> - tight pussy. -<<elseif (getSlave($AS).vagina == 0)>> - virgin pussy. -<<elseif (getSlave($AS).vagina == -1)>> - dick. -<</if>> - -<<if (getSlave($AS).vaginaTat == "tribal patterns")>> - The tattoos on $his abdomen certainly draw attention there. -<<elseif (getSlave($AS).vaginaTat == "lewd crest")>> - The crest on $his abdomen invokes lewd thoughts, after all. -<</if>> - -<<if (getSlave($AS).vagina != -1)>> - <<if getSlave($AS).devotion <= 20>> - <<if getSlave($AS).clit == 1>> - $His big clit peeks out from under its hood - <<elseif getSlave($AS).clit == 2>> - $His huge clit is impossible to miss - <<elseif getSlave($AS).clit > 1>> - $His pseudophallus-sized clit is soft - <<elseif getSlave($AS).chastityPenis>> - $His useless penis is properly caged - <<elseif getSlave($AS).dick > 0>> - $His dick is soft - <<else>> - $His pretty little clit is barely visible - <</if>> - and - <<if getSlave($AS).labia == 1>> - $his lovely petals are quite inviting. - <<elseif getSlave($AS).labia == 2>> - $his prominent petals are inviting. - <<elseif getSlave($AS).labia > 1>> - $his labia are so large they present a slight obstacle to entry. - <<else>> - $his cute labia are barely noticeable. - <</if>> - <<else>> - <<if getSlave($AS).clit == 1>> - $His big clit peeks out from under its hood - <<elseif getSlave($AS).clit == 2>> - $His huge clit is impossible to miss - <<elseif getSlave($AS).clit > 1>> - $His pseudophallus-sized clit is soft - <<elseif getSlave($AS).chastityPenis>> - $His chastity cage is uncomfortably full - <<elseif canAchieveErection(getSlave($AS))>> - $His dick vies for attention - <<elseif getSlave($AS).dick > 0>> - $His soft dick dribbles excitedly - <<else>> - $His pretty little clit is ready for you, - <</if>> - and - <<if getSlave($AS).labia == 1>> - $his lovely petals are moist with arousal. - <<elseif getSlave($AS).labia == 2>> - $his prominent petals bear a sheen of arousal. - <<elseif getSlave($AS).labia > 1>> - $his huge labia are almost dripping with arousal. - <<else>> - $he's becoming moist. - <</if>> - <</if>> -<</if>> - -<<if (getSlave($AS).vaginaPiercing > 1) && (getSlave($AS).vagina != -1) && getSlave($AS).clitPiercing > 0>> - $His pierced lips and clit have $his nice and wet. -<<elseif (getSlave($AS).clitPiercing > 0) && (getSlave($AS).vagina != -1)>> - $His pierced clit has $him nice and moist. -<</if>> - -<<if (getSlave($AS).vagina == 0)>> - <<if (getSlave($AS).fetish == "mindbroken")>> - $He accepts your orders dumbly and presents $his virgin pussy to you, <<if canSee(getSlave($AS))>>watching your hands move towards $him<<else>>waiting<</if>> without any real interest. - You - <<if getSlave($AS).balls >= 60>> - struggle to shove $his oversized nuts out of the way and - <<elseif getSlave($AS).balls >= 30>> - struggle to lift $his oversized nuts and - <<elseif getSlave($AS).balls >= 14>> - palm one of $his giant testicles and - <<elseif getSlave($AS).balls >= 9>> - cup $his huge balls and - <<elseif getSlave($AS).balls >= 5>> - lift $his big balls out of the way and - <<elseif getSlave($AS).scrotum > 0>> - reach under $his dangling scrotum and - <</if>> - gently trace along $his - <<if getSlave($AS).labia == 1>> - lovely petals - <<elseif getSlave($AS).labia == 2>> - prominent petals - <<elseif getSlave($AS).labia > 1>> - huge labia - <</if>> - with your outstretched fingers, strumming up and down the edges of $his pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally flick $his - <<if getSlave($AS).clit == 1>> - erect clit - <<elseif getSlave($AS).clit == 2>> - large clit - <<elseif getSlave($AS).clit > 1>> - massive clit - <<elseif getSlave($AS).chastityPenis>> - $his cage - <<elseif canAchieveErection(getSlave($AS))>> - $his erection - <<elseif getSlave($AS).dick > 0>> - soft dick - <<else>> - pretty little clit - <</if>> - and rub it with your fingertips as your hand nears it but outside of the pussy juices - <<if hasAnyLegs(getSlave($AS))>> - trickling down $his leg, - <<else>> - pooling beneath $him, - <</if>> - $he does not respond. Since $he is mindbroken, $his responses to you are purely physiological and your actions have no affect on $him mentally. - <<elseif (getSlave($AS).devotion > 50)>> - $He accepts your orders happily and presents $his virgin pussy to you, - <<if getSlave($AS).scrotum > 0>> - shifting $his balls out of the way and - <</if>> - <<if canSee(getSlave($AS))>> - watching your hands with eagerness. - <<else>> - eagerly awaiting your touch. - <</if>> - $He gasps and quivers with pleasure as you gently trace along $his - <<if getSlave($AS).labia == 1>> - lovely petals - <<elseif getSlave($AS).labia == 2>> - prominent petals - <<elseif getSlave($AS).labia > 1>> - huge labia - <<else>> - cute labia - <</if>> - with your outstretched fingers, strumming up and down the edges of $his pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. - <<if hasAnyArms(getSlave($AS))>> - <<if (getSlave($AS).fetish == "boobs")>> - $He fondles $his breasts and plays with $his nipples at the same time. - <<elseif (getSlave($AS).fetish == "pregnancy") && getSlave($AS).belly >= 1500>> - $He strokes the curve of $his belly at the same time. - <</if>> - <</if>> - You occasionally - <<if getSlave($AS).clit == 1>> - flick $his large clit and rub it with your fingertips - <<elseif getSlave($AS).clit == 2>> - flick $his huge clit and rub it with your fingertips - <<elseif getSlave($AS).clit > 1>> - flick $his massive clit and rub it with your fingertips - <<elseif getSlave($AS).chastityPenis>> - caress $his chastity cage with your palm - <<elseif canAchieveErection(getSlave($AS))>> - flick $his erection and give it a stroke - <<elseif getSlave($AS).dick > 0>> - flick $his soft dick and rub it with your fingertips - <<else>> - flick $his pretty little clit and rub it with your fingertips - <</if>> - as your hand nears it. As $he becomes more aroused, $he - <<if hasAnyArms(getSlave($AS))>> - grabs hold of your wrist lightly, moving $his hands along with the motion of your own. - <<else>> - begins to move $his body to the rhythm of your motions. - <</if>> - $His pussy juices - <<if hasAnyLegs(getSlave($AS))>> - run down $his leg - <<else>> - pool beneath $him - <</if>> - as $he begins to moan audibly<<if (hasAnyLegs(getSlave($AS)))>>, gently clamping your hand between $his thighs<</if>> as you continue to move your hand along $his pussy. $He moans loudly as $he shudders in orgasmic joy. - <<if ((!hasAnyArms(getSlave($AS))) && !canTalk(getSlave($AS)))>> - $He does $his best to communicate love with $his <<= App.Desc.eyesColor(getSlave($AS))>>. - <<elseif !canTalk(getSlave($AS))>> - $He signs that $he loves you. - <<else>> - "I love you, <<Master>>," $he <<say>>s rapturously. - <</if>> - <<elseif (getSlave($AS).devotion > 20)>> - $He accepts your orders without comment and presents $his virgin pussy to you, - <<if getSlave($AS).scrotum > 0>> - shifting $his balls out of the way and - <</if>> - <<if canSee(getSlave($AS))>> - watching your hands with some slight trepidation. - <<else>> - nervously anticipating your touch. - <</if>> - $He gasps as you gently trace along $his - <<if getSlave($AS).labia == 1>> - lovely petals - <<elseif getSlave($AS).labia == 2>> - prominent petals - <<elseif getSlave($AS).labia > 1>> - huge labia - <</if>> - with your outstretched fingers, strumming up and down the edges of $his pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally - <<if getSlave($AS).clit == 1>> - flick $his large clit and rub it with your fingertips - <<elseif getSlave($AS).clit == 2>> - flick $his huge clit and rub it with your fingertips - <<elseif getSlave($AS).clit > 1>> - flick $his massive clit and rub it with your fingertips - <<elseif getSlave($AS).chastityPenis>> - caress $his chastity cage with your palm - <<elseif canAchieveErection(getSlave($AS))>> - flick $his erection and give it a stroke - <<elseif getSlave($AS).dick > 0>> - flick $his soft dick and rub it with your fingertips - <<else>> - flick $his pretty little clit and rub it with your fingertips - <</if>> - as your hand nears it. $His pussy juices - <<if hasAnyLegs(getSlave($AS))>> - run down $his leg - <<else>> - pool beneath $him - <</if>> - as $he begins to moan audibly<<if (hasAnyArms(getSlave($AS)))>>, grasping your wrist with $his hand<<if (hasBothArms(getSlave($AS)))>>s<</if>> tightly<</if>><<if (hasAnyLegs(getSlave($AS)))>> and clamping $his thighs together<</if>> as you continue to move your hand along $his pussy. $He moans as $he shudders in an orgasm, almost embarrassed. - <<if canSee(getSlave($AS))>> - $He looks into your eyes expectantly. - <<else>> - $He pants expectantly, bracing for more. - <</if>> - <<elseif (getSlave($AS).devotion >= -20)>> - $He clearly dislikes the thought of getting fondled by you. $His lower lip quivers with trepidation as $he - <<if canSee(getSlave($AS))>> - watches your hands move towards $him. - <<else>> - waits for your hand to touch $him. - <</if>> - $He has no choice but to - <<if getSlave($AS).scrotum > 0>> - shift $his balls out of the way and - <</if>> - obey if $he wants to avoid punishment. $He gasps and shakes as you gently trace along $his - <<if getSlave($AS).labia == 1>> - lovely petals - <<elseif getSlave($AS).labia == 2>> - prominent petals - <<elseif getSlave($AS).labia > 1>> - huge labia - <<else>> - cute labia - <</if>> - with your outstretched fingers, strumming up and down the edges of $his pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally - <<if getSlave($AS).clit == 1>> - flick $his large clit and rub it with your fingertips - <<elseif getSlave($AS).clit == 2>> - flick $his huge clit and rub it with your fingertips - <<elseif getSlave($AS).clit > 1>> - flick $his massive clit and rub it with your fingertips - <<elseif getSlave($AS).chastityPenis>> - caress $his chastity cage with your palm - <<elseif canAchieveErection(getSlave($AS))>> - flick $his growing erection and give it a stroke - <<elseif getSlave($AS).dick > 0>> - flick $his soft dick and rub it with your fingertips - <<else>> - flick $his pretty little clit and rub it with your fingertips - <</if>> - as your hand nears it. $His pussy juices - <<if hasAnyLegs(getSlave($AS))>> - run down $his leg - <<else>> - pool beneath $him - <</if>> - as $he begins to moan audibly<<if (hasAnyArms(getSlave($AS)))>>, grasping your wrist with $his hand<<if (hasBothArms(getSlave($AS)))>>s<</if>> tightly<</if>><<if (hasBothLegs(getSlave($AS)))>> and clamping $his thighs together<</if>> as you continue to move your hand along $his pussy. $He moans as $he shudders in an orgasm, clearly embarrassed to end up in this position as $he loses control. - <<else>> - As you anticipated, $he refuses to let $himself be groped by you. $He is unable to resist you, also as you expected, when you mention some of the alternatives. $He gasps and shakes as you gently trace along $his - <<if getSlave($AS).labia == 1>> - lovely petals - <<elseif getSlave($AS).labia == 2>> - prominent petals - <<elseif getSlave($AS).labia > 1>> - huge labia - <<else>> - cute labia - <</if>> - with your outstretched fingers, strumming up and down the edges of $his pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements.<<if (hasAnyArms(getSlave($AS)))>> $He grabs your wrist with $his hand<<if (hasBothArms(getSlave($AS)))>>s<</if>> in an effort to stop you but $he is unable to stop your hand from moving for long.<</if>> You occasionally - <<if getSlave($AS).clit == 1>> - flick $his large clit and rub it with your fingertips - <<elseif getSlave($AS).clit == 2>> - flick $his huge clit and rub it with your fingertips - <<elseif getSlave($AS).clit > 1>> - flick $his massive clit and rub it with your fingertips - <<elseif getSlave($AS).chastityPenis>> - caress $his chastity cage with your palm - <<elseif canAchieveErection(getSlave($AS))>> - flick $his unwilling erection and give it a stroke - <<elseif getSlave($AS).dick > 0>> - flick $his soft dick and rub it with your fingertips - <<else>> - flick $his pretty little clit and rub it with your fingertips - <</if>> - as your hand nears it. $He - <<if (hasAnyArms(getSlave($AS)))>> - tightly grasps your wrist <<if (hasBothLegs(getSlave($AS)))>> and<</if>> - <</if>> - <<if (hasBothLegs(getSlave($AS)))>> - clamps $his thighs together - <</if>> - <<if !hasAnyArms(getSlave($AS)) && !hasBothLegs(getSlave($AS))>> - squirms uncomfortably a little - <</if>> - as you continue to move your hand along $his pussy. $He moans as $he shudders in an orgasm, gripping tighter and shamefully looking at you as you stop moving your hand. - <</if>> -<<elseif (getSlave($AS).fetish == "mindbroken")>> - Like a doll, $he dumbly remains still, <<if canSee(getSlave($AS))>>watching your hands move towards $him<<else>>waiting<</if>> without any real interest. - <<if (getSlave($AS).vagina != -1)>> - You - <<if getSlave($AS).balls >= 60>> - struggle to shove $his oversized nuts out of the way and - <<elseif getSlave($AS).balls >= 30>> - struggle to lift $his oversized nuts and - <<elseif getSlave($AS).balls >= 14>> - palm one of $his giant testicles and - <<elseif getSlave($AS).balls >= 9>> - cup $his huge balls and - <<elseif getSlave($AS).balls >= 5>> - lift $his big balls out of the way and - <<elseif getSlave($AS).scrotum > 0>> - reach under $his dangling scrotum and - <</if>> - gently trace along $his - <<if getSlave($AS).labia == 1>> - lovely petals - <<elseif getSlave($AS).labia == 2>> - prominent petals - <<elseif getSlave($AS).labia > 1>> - huge labia - <<else>> - cute labia - <</if>> - with your outstretched fingers, strumming up and down the edges of $his pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally flick $his - <<if getSlave($AS).clit == 1>> - erect clit - <<elseif getSlave($AS).clit == 2>> - large clit - <<elseif getSlave($AS).clit > 1>> - massive clit - <<elseif getSlave($AS).chastityPenis>> - $his cage - <<elseif canAchieveErection(getSlave($AS))>> - $his erection - <<elseif getSlave($AS).dick > 0>> - soft dick - <<else>> - pretty little clit - <</if>> - and rub it with your fingertips as your hand nears it. Except for the pussy juices - <<if hasAnyLegs(getSlave($AS))>> - trickling down $his leg, - <<else>> - pooling beneath $him, - <</if>> - $he does not respond. - <</if>> - Since $he is mindbroken, $his responses to you are purely physiological and your actions have no affect on $him mentally. You leave your toy for one of your other slaves to clean and maintain. -<<elseif isAmputee(getSlave($AS))>> - Since $he's a quadruple amputee, $he's yours to use as a human finger toy. While $he's lying there helpless, you move your hands towards - <<if (getSlave($AS).vagina != -1)>> - <<if getSlave($AS).balls >= 60>> - $him and struggle to shove $his oversized nuts out of the way. - <<elseif getSlave($AS).balls >= 30>> - $him and strain to lift $his oversized nuts out of the way. - <<elseif getSlave($AS).balls >= 14>> - $him, palming one of $his giant testicles to make way. - <<elseif getSlave($AS).balls >= 9>> - $him, cupping $his huge balls to keep them out of the way. - <<elseif getSlave($AS).balls >= 5>> - $him, lifting $his big balls out of the way in the process. - <<elseif getSlave($AS).scrotum > 0>> - $him, slipping under $his dangling scrotum in the process. - <<else>> - $him. - <</if>> - <<else>> - $him. - <</if>> - <<if (getSlave($AS).vagina != -1)>> - You gently trace along $his - <<if getSlave($AS).labia == 1>> - lovely petals - <<elseif getSlave($AS).labia == 2>> - prominent petals - <<elseif getSlave($AS).labia > 1>> - huge labia - <<else>> - cute labia - <</if>> - with your outstretched fingers, strumming up and down the edges of $his pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally - <<if getSlave($AS).clit == 1>> - flick $his large clit and rub it with your fingertips - <<elseif getSlave($AS).clit == 2>> - flick $his huge clit and rub it with your fingertips - <<elseif getSlave($AS).clit > 1>> - flick $his massive clit and rub it with your fingertips - <<elseif getSlave($AS).chastityPenis>> - caress $his chastity cage with your palm - <<elseif canAchieveErection(getSlave($AS))>> - flick $his erection and give it a stroke - <<elseif getSlave($AS).dick > 0>> - flick $his soft dick and rub it with your fingertips - <<else>> - flick $his pretty little clit and rub it with your fingertips - <</if>> - as your hand nears it. - <</if>> - Soon $he shudders in an orgasm, <<if canSee(getSlave($AS))>>looking at you<<else>>facing<</if>> as you stop moving your hand. You leave your toy for one of your other slaves to clean and maintain. -<<elseif (getSlave($AS).fetish == "submissive") && (getSlave($AS).fetishStrength > 60) && (getSlave($AS).fetishKnown == 1)>> - $He comes submissively over, smiling a little submissive smile, and points $his pussy towards you<<if getSlave($AS).scrotum > 0>>, shifting $his balls out of the way and<</if>>. - <<if (getSlave($AS).vagina != -1)>> - You gently trace along $his - <<if getSlave($AS).labia == 1>> - lovely petals - <<elseif getSlave($AS).labia == 2>> - prominent petals - <<elseif getSlave($AS).labia > 1>> - huge labia - <<else>> - cute labia - <</if>> - with your outstretched fingers, strumming up and down the edges of $his pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally - <<if getSlave($AS).clit == 1>> - flick $his large clit and rub it with your fingertips - <<elseif getSlave($AS).clit == 2>> - flick $his huge clit and rub it with your fingertips - <<elseif getSlave($AS).clit > 1>> - flick $his massive clit and rub it with your fingertips - <<elseif getSlave($AS).chastityPenis>> - caress $his chastity cage with your palm - <<elseif canAchieveErection(getSlave($AS))>> - flick $his erection and give it a stroke - <<elseif getSlave($AS).dick > 0>> - flick $his soft dick and rub it with your fingertips - <<else>> - flick $his pretty little clit and rub it with your fingertips - <</if>> - as your hand nears it. $He begs you not to stop as $he <<if canSee(getSlave($AS))>>looks into your eyes<<else>>faces<</if>> expectantly as $he shudders in an orgasm. - <</if>> -<<elseif getSlave($AS).devotion < -20>> - $He tries to refuse, so you push the disobedient slave down<<if canStand(getSlave($AS)))>> over your desk<</if>> as you move your hands towards $him. - <<if (getSlave($AS).vagina != -1)>> - You gently<<if getSlave($AS).scrotum > 0>> shift $his balls out of the way and<</if>> trace along $his - <<if getSlave($AS).labia == 1>> - lovely petals - <<elseif getSlave($AS).labia == 2>> - prominent petals - <<elseif getSlave($AS).labia > 1>> - huge labia - <<else>> - cute labia - <</if>> - with your outstretched fingers, strumming up and down the edges of $his pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. $He <<if hasAnyArms(getSlave($AS))>>grabs your wrist<<else>>twists and turns<</if>> to try to stop you but $he is unable to. You occasionally - <<if getSlave($AS).clit == 1>> - flick $his large clit and rub it with your fingertips - <<elseif getSlave($AS).clit == 2>> - flick $his huge clit and rub it with your fingertips - <<elseif getSlave($AS).clit > 1>> - flick $his massive clit and rub it with your fingertips - <<elseif getSlave($AS).chastityPenis>> - caress $his chastity cage with your palm - <<elseif canAchieveErection(getSlave($AS))>> - flick $his unwilling erection and give it a stroke - <<elseif getSlave($AS).dick > 0>> - flick $his soft dick and rub it with your fingertips - <<else>> - flick $his pretty little clit and rub it with your fingertips - <</if>> - as your hand nears it, despite $his resistant pulling against you. $He bites $his lip but $he cannot help but moan and $he shudders in an orgasm. - <</if>> - $He <<if canSee(getSlave($AS))>>looks at you<<else>>faces<</if>> shamefully as you stop moving your hand. -<<elseif getSlave($AS).devotion <= 20>> - $He obeys silently, <<if canStand(getSlave($AS)))>>standing<<else>>resting<</if>> in front of you as you move your hands towards $him. - <<if (getSlave($AS).vagina != -1)>> - You gently<<if getSlave($AS).scrotum > 0>> shift $his balls out of the way and<</if>> trace along $his - <<if getSlave($AS).labia == 1>> - lovely petals - <<elseif getSlave($AS).labia == 2>> - prominent petals - <<elseif getSlave($AS).labia > 1>> - huge labia - <<else>> - cute labia - <</if>> - with your outstretched fingers, strumming up and down the edges of $his pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally - <<if getSlave($AS).clit == 1>> - flick $his large clit and rub it with your fingertips - <<elseif getSlave($AS).clit == 2>> - flick $his huge clit and rub it with your fingertips - <<elseif getSlave($AS).clit > 1>> - flick $his massive clit and rub it with your fingertips - <<elseif getSlave($AS).chastityPenis>> - caress $his chastity cage with your palm - <<elseif canAchieveErection(getSlave($AS))>> - flick $his growing erection and give it a stroke - <<elseif getSlave($AS).dick > 0>> - flick $his soft dick and rub it with your fingertips - <<else>> - flick $his pretty little clit and rub it with your fingertips - <</if>> - as your hand nears it. $He <<if canSee(getSlave($AS))>>looks into your eyes<<else>>faces you<</if>> furtively while $he - <<if (hasAnyArms(getSlave($AS)))>> - grabs your wrist with $his hand<<if (hasBothLegs(getSlave($AS)))>> and<</if>> - <</if>> - <<if (hasBothLegs(getSlave($AS)))>> - squeezes $his thighs together - <</if>> - <<if !hasAnyArms(getSlave($AS)) && !hasBothLegs(getSlave($AS))>> - squirms a little - <</if>> - as $he moans and shudders in an orgasm. - <</if>> - $He dutifully <<if canSee(getSlave($AS))>>looks at you<<else>>faces<</if>> as you stop moving your hand. -<<else>> - $He devotedly - <<if canMove(getSlave($AS))>> - comes over and gives you an impassioned kiss. $He - <</if>> - smiles<<if getSlave($AS).scrotum > 0>>, shifts $his balls to the side,<</if>> and points $his pussy towards you. - <<if (getSlave($AS).vagina != -1)>> - You gently trace along $his - <<if getSlave($AS).labia == 1>> - lovely petals - <<elseif getSlave($AS).labia == 2>> - prominent petals - <<elseif getSlave($AS).labia > 1>> - huge labia - <<else>> - cute labia - <</if>> - with your outstretched fingers, strumming up and down the edges of $his pussylips, then softly rub your fingers along the inner walls with a tender touch, starting slow but gradually increasing the speed of your movements. You occasionally - <<if getSlave($AS).clit == 1>> - flick $his large clit and rub it with your fingertips - <<elseif getSlave($AS).clit == 2>> - flick $his huge clit and rub it with your fingertips - <<elseif getSlave($AS).clit > 1>> - flick $his massive clit and rub it with your fingertips - <<elseif getSlave($AS).chastityPenis>> - caress $his chastity cage with your palm - <<elseif canAchieveErection(getSlave($AS))>> - flick $his erection and give it a stroke - <<elseif getSlave($AS).dick > 0>> - flick $his soft dick and rub it with your fingertips - <<else>> - flick $his pretty little clit and rub it with your fingertips - <</if>> - as your hand nears it. $He - <<if hasAnyLegs(getSlave($AS))>> - squeezes $his thigh<<if hasBothLegs(getSlave($AS))>>s<</if>> - <<else>> - pushes - <</if>> - lightly against your hand as $he moans and shudders in orgasmic bliss. - <</if>> - $He <<if canSee(getSlave($AS))>>looks at you<<else>>faces<</if>> passionately as you stop moving your hand. -<</if>> diff --git a/src/npc/interaction/forceFeeding.js b/src/npc/interaction/forceFeeding.js new file mode 100644 index 0000000000000000000000000000000000000000..525ff0b15930ad73c6a4da61c664bf38418b6ce8 --- /dev/null +++ b/src/npc/interaction/forceFeeding.js @@ -0,0 +1,677 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.forceFeeding = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him, himself, girl + } = getPronouns(slave); + + addPartner(slave, -1); + let _doMe; + + const _belly = bellyAdjective(slave); + slave.bellyAccessory = "none"; + let _isDone = slave.inflation-1; + let _pregDiscovery = 0; + r.push(`You call ${him} over and ask ${him} to wait patiently for a moment.`); + if (slave.fetish === "mindbroken") { + r.push(`${He} shows no response as`); + } else { + r.push(`${He} barely has time to ponder why you called for ${him} when`); + } + r.push(`another slave carries in a pair of`); + if (slave.inflation === 3) { + r.push(`one gallon`); + } else if (slave.inflation === 2) { + r.push(`two liter`); + } else { + r.push(`one liter`); + } + r.push(`buckets overflowing with slave food. ${He} is going to eat it all and you're going to enjoy ${him} as ${he} does it.`); + + if (slave.inflation > 1 && slave.preg > 1) { + r.push(`${He} looks nauseated by the`); + if (canSee(slave)) { + r.push(`sight`); + } else if (canSmell(slave)) { + r.push(`smell`); + } else { + r.push(`very existence`); + } + r.push(`of the food.`); + } else if (slave.fetish === "submissive" && slave.devotion >= -20) { + r.push(`${He} blushes at the thought of being forced to eat for another's amusement.`); + } else if (slave.behavioralFlaw === "gluttonous" && slave.devotion >= -20) { + r.push(`${He}'s awestruck that you approve of ${his} gluttony enough to present ${him} a feast.`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`${He}'s hesitant about your intent, but ${he} gives in as ${his} belly begins to growl at the`); + if (canSee(slave)) { + r.push(`sight`); + } else if (canSmell(slave)) { + r.push(`smell`); + } else { + r.push(`anticipation`); + } + r.push(`of ${his} waiting meal.`); + } else if (slave.behavioralFlaw === "anorexic") { + r.push(`${He} grimaces at the`); + if (canSee(slave)) { + r.push(`sight`); + } else if (canSmell(slave)) { + r.push(`smell`); + } else { + r.push(`thought`); + } + r.push(`of the food that will soon be going into ${him}. ${He} knows you won't let it come back up later.`); + } + + if (canMove(slave)) { + r.push(`You instruct ${him} to take a seat on your lap and open`); + if (slave.fetish === "mindbroken") { + r.push(`wide, but ${he} remains still and unresponsive. Talking to a broken mind is pointless.`); + } else { + r.push(`wide.`); + } + if (slave.devotion < -20) { + r.push(`Opposed to the thought of being forced to eat all that food, ${he} tries to`); + if (canWalk(slave)) { + r.push(`step back,`); + } else { + r.push(`crawl away,`); + } + r.push(`but you catch ${him} and pull ${him} into your lap, wrapping an arm`); + } else if (slave.fetish === "submissive") { + r.push(`${He} meekly settles into your lap and shudders as ${he} feels your dominant hand wrap`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`${He} wastes no time getting into position with ${his} mouth agape as you wrap your hand`); + } else if (slave.devotion <= 20) { + r.push(`${He} complies without comment and settles ${himself} onto your lap, shuddering slightly as you wrap your arm`); + } else if (slave.devotion <= 50) { + r.push(`${He} hesitates but eventually settles onto your lap as you wrap your arm`); + } else { + r.push(`${He} eagerly settles ${himself} onto your lap as you wrap your arm`); + } + } else if (isAmputee(slave)) { + if (slave.devotion < -20) { + r.push(`${He}'s opposed to the thought of being forced to eat all that food, but as an amputee can do nothing about it. You heft ${him} onto your lap, wrapping an arm`); + } else if (slave.fetish === "submissive") { + r.push(`${He}'s opposed to the thought of being forced to eat all that food, but as an amputee can do nothing about it; not that ${he}'d go against your orders anyway. ${He} shudders with pleasure as you heft ${him} onto your lap, wrapping a dominant arm`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`${He} can't wait to chow down, but as an amputee can do nothing to get in position. ${He} shudders with anticipation as you heft ${him} onto your lap, wrapping an arm`); + } else if (slave.devotion <= 20) { + r.push(`${He}'s hesitant of being force-fed, but as an amputee can do nothing about it. You heft ${him} onto your lap, wrapping your arm`); + } else if (slave.devotion <= 50) { + r.push(`${He}'s mildly hesitant of being force-fed, but as an amputee can do nothing about it. You heft ${him} onto your lap, wrapping your arm`); + } else { + r.push(`${He} devotedly`); + if (canSee(slave)) { + r.push(`looks`); + } else { + r.push(`smiles`); + } + r.push(`at you as you heft ${him} onto your lap, wrapping your arm`); + } + } else { + r.push(`You inform ${him} ${he}'ll be taking a seat on your lap and opening wide for ${his} meal.`); + if (slave.devotion < -20) { + r.push(`${He}'s opposed to the thought of being forced to eat all that food, but since ${he} is immobile, can't escape. You heft ${him} onto your lap, wrapping an arm`); + } else if (slave.fetish === "submissive") { + r.push(`${He} accepts your orders without question. ${He} shudders with pleasure as you heft ${him} onto your lap, wrapping a dominant arm`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`${He} eagerly tries to get to your lap faster. ${He} shudders with anticipation as you heft ${him} onto your lap, wrapping your arm`); + } else if (slave.devotion <= 20) { + r.push(`${He} complies without comment. You heft ${him} onto your lap, wrapping an arm`); + } else if (slave.devotion <= 50) { + r.push(`${He} hesitates for a moment, before demonstrating acceptance. You heft ${him} onto your lap, wrapping an arm`); + } else { + r.push(`${He} squirms with excitement as you heft ${him} onto your lap, wrapping an arm`); + } + } + if (slave.fetish === "mindbroken") { + r.push(`You reach out and wrap your arms`); + } + + r.push(`around ${his}`); + if (slave.weight > 190) { + r.push(`immensely soft`); + } else if (slave.belly >= 150000) { + r.push(_belly); + } else if (slave.weight > 160) { + r.push(`massive soft`); + } else if (slave.weight > 130) { + r.push(`giant soft`); + } else if (slave.belly >= 1500) { + r.push(_belly); + } else if (slave.weight > 95) { + r.push(`huge soft`); + } else if (slave.weight > 30) { + r.push(`big soft`); + } else if (slave.weight > 10) { + r.push(`soft`); + } else if (slave.muscles > 95) { + r.push(`chiseled`); + } else if (slave.muscles > 30) { + r.push(`muscular`); + } else if (slave.muscles > 5) { + r.push(`firm, ripped`); + } else { + r.push(`firm, flat`); + } + if (slave.fetish === "mindbroken") { + r.push(`belly, pulling ${him} into your lap.`); + } else { + r.push(`belly.`); + } + + r.push(`You hold ${him} tight as you pull ${his} meal closer, dip in a cup and bring it to ${his} lips.`); + if (slave.fetish === "mindbroken") { + r.push(`It takes little effort to get ${him} to gulp down the contents`); + } else if (slave.devotion < -20) { + r.push(`${He} struggles in your lap and refuses to open ${his} mouth. You drop the cup back into the bucket and lean in close. You quickly clip ${his} nose shut, eliciting a panicked thrash from the ${girl}.`); + if (hasAnyLegs(slave)) { + r.push(`You warn ${him} that ${his} punishment will be severe if ${he} comes that close to kicking over the buckets again.`); + } + r.push(`With ${his} mouth forced open, you now have a clear avenue with which to pour the slave food into ${his} mouth. ${He} sputters as ${he} struggles to swallow with ${his} nose shut. After several cups, tears are streaming down ${his} face from the discomfort. Weeping, ${he} implores you to remove the clamp so that ${he} may drink like a good ${girl}.`); + } else if (slave.fetish === "submissive") { + r.push(`${He} submissively drinks the contents and readies ${his} lips for the next,`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`${He} hurriedly gulps down the contents and opens wide for the next,`); + } else if (slave.devotion <= 20) { + r.push(`${He} wordless drinks the contents,`); + } else if (slave.devotion <= 50) { + r.push(`${He} drinks the contents without hesitation,`); + } else { + r.push(`${He} happily downs the contents,`); + } + + if (slave.fetish !== "mindbroken" && slave.devotion < -20) { + r.push(`You readily comply and waste no time in bring cupful after cupful to ${his} lips.`); + } else { + r.push(`so you keep the cupfuls coming.`); + } + + r.push(`You can feel ${his} ${slave.skin} belly swelling with ${slave.inflationType} as it pushes out against your hand. Once ${he} has downed two liters, you give ${his} bloated belly a slap, eliciting`); + if (slave.fetish === "mindbroken") { + r.push(`a small burp from the broken slave`); + } else if (slave.devotion < -20) { + r.push(`a shudder from the groaning slave`); + } else if (slave.fetish === "submissive") { + r.push(`a subtle belch that the moaning slave quickly apologizes for,`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`a subtle belch from the moaning slave`); + } else if (slave.devotion <= 20) { + r.push(`a small shudder from the bloated slave`); + } else if (slave.devotion <= 50) { + r.push(`a small hiccup that the overfilled slave immediately apologizes for,`); + } else { + r.push(`a cute burp from the bloated slave, followed by ${his} tongue running over ${his} lips`); + } + r.push(`and a little jiggle from ${his} gut.`); + + App.Events.addParagraph(node, r); + r = []; + + if (slave.pregKnown === 0 && slave.preg > slave.pregData.normalBirth/13.33 && _isDone > 0) { + r.push(`As soon as the next helping enters ${him} you feel something is wrong. ${He} begins to heave,`); + if (slave.fetish !== "mindbroken" && slave.devotion > 50) { + r.push(`struggling to keep down the slave food, however ${he} shortly expels the entirety of ${his} stomach across the floor.`); + } else { + r.push(`shortly expelling the entirety of ${his} stomach`); + } + if (slave.fetish === "mindbroken") { + r.push(`all over ${himself} and your lap.`); + } else if (slave.devotion < -20) { + r.push(`all over ${himself} and your lap.`); + } else if (slave.fetish === "submissive") { + r.push(`onto your floor.`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`all over ${himself} and your lap.`); + } else if (slave.devotion <= 20) { + r.push(`all over ${himself} and your lap.`); + } else if (slave.devotion <= 50) { + r.push(`across the floor.`); + } + r.push(`It didn't seem to be willful,`); + if (slave.fetish === "mindbroken") { + r.push(`not that much is with ${him}, but is still unacceptable.`); + } else if (slave.devotion < -20) { + r.push(`given how pathetically ${he} is cowering from your wrath, but is completely unacceptable.`); + } else if (slave.fetish === "submissive") { + r.push(`given how ${he} is begging to clean it up with ${his} tongue, but is completely unacceptable.`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`given how ${he} is in tears over the loss of such a meal, but is completely unacceptable.`); + } else if (slave.devotion <= 20) { + r.push(`given how ${he} is begging you to try again, but is completely unacceptable.`); + } else if (slave.devotion <= 50) { + r.push(`given how disappointed ${he} is in failing you, but is completely unacceptable.`); + } else { + r.push(`given how disappointed ${he} is in failing you, but is worrying. Such a good slave shouldn't do such bad things.`); + } + _pregDiscovery = 1; + } else { + if (_isDone > 0) { + _isDone--; + r.push(`But ${he} isn't done`); + if (slave.fetish === "mindbroken") { + r.push(`yet.`); + } else if (slave.devotion < -20) { + r.push(`yet.`); + } else if (slave.fetish === "submissive") { + r.push(`yet, not that ${he} minds.`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`yet, much to ${his} delight.`); + } else if (slave.devotion <= 20) { + r.push(`yet, much to ${his} dismay.`); + } else if (slave.devotion <= 50) { + r.push(`yet, not that ${he}'d risk complaining.`); + } else { + r.push(`yet, not that ${he}'d complain about fulfilling your desires.`); + } + r.push(`More and more you feed ${him}; ${his} belly swelling ever larger and growing even heavier as ${he}`); + if (slave.fetish === "mindbroken") { + r.push(`guzzles`); + } else if (slave.devotion < -20) { + r.push(`painstakingly drinks`); + } else if (slave.fetish === "submissive") { + r.push(`diligently drinks`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`desperately sucks down`); + } else if (slave.devotion <= 20) { + r.push(`diligently drinks`); + } else if (slave.devotion <= 50) { + r.push(`diligently drinks`); + } else { + r.push(`diligently drinks`); + } + r.push(`the slave food. You reposition yourself to bet a better hold on ${his} bulging food baby. As ${he} passes the gallon mark, you give the swollen orb a good jiggle, eliciting`); + if (slave.fetish === "mindbroken") { + r.push(`a burp from the broken slave and tons of motion under your arm.`); + } else if (slave.devotion < -20) { + r.push(`a pained burp from the crying slave and tons of motion under your arm.`); + } else if (slave.fetish === "submissive") { + r.push(`a moan of arousal over your control and tons of motion under your arm.`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`a load hiccup, tons of motion under your arm, and a plea for more food.`); + } else if (slave.devotion <= 20) { + r.push(`a strained burp from the full slave and tons of motion under your arm.`); + } else if (slave.devotion <= 50) { + r.push(`a small hiccup, which the bloated slave immediately apologizes for, and tons of motion under your arm.`); + } else { + r.push(`a small sigh followed by a request for more, from the bloated slave and tons of motion under your arm.`); + } + App.Events.addParagraph(node, r); + r = []; + } + if (_isDone > 0) { + if (slave.fetish === "mindbroken") { + r.push(`${He} squirms a little in discomfort, but ${he} still has another gallon to go, so you continue feeding food into ${his} mouth.`); + } else if (slave.devotion < -20) { + r.push(`${He} squirms in discomfort, but ${he} still has another gallon to go and ${he} knows it. You remind ${him} of the ways you can torment ${him} in this state so you can continue feeding food into ${his} mouth without too much resistance.`); + } else if (slave.fetish === "submissive") { + r.push(`${He} gets comfortable as ${he} still has another gallon to go and ${he} knows it. Gulping, ${he} opens ${his} mouth in preparation, eager to obey ${his} dom.`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`${He} still has another gallon to go and ${he} knows it, so ${he} wastes no time in letting you know ${he}'s ready.`); + } else if (slave.devotion <= 20) { + r.push(`${He} begins to struggle when ${he} realizes ${he} still has another gallon to go. Gulping, ${he} opens up as another helping approaches ${his} mouth.`); + } else if (slave.devotion <= 50) { + r.push(`${He} still has another gallon to go and ${he} knows it, so ${he} tries ${his} best to get comfortable and give ${his} belly room to grow. Gulping, ${he} diligently opens up for the next serving.`); + } else { + r.push(`${He} still has another gallon to go and ${he} knows it, but if ${getWrittenTitle(slave)} wants ${him} to be stuffed like a turkey, ${he}'ll happily comply. ${He} wastes no time in opening up for your next helping.`); + } + r.push(`You can feel the pressure growing in ${his} middle as it fills out under your arm more and more. ${He}`); + if (slave.fetish === "mindbroken") { + r.push(`mechanically downs every sip you give ${him} with no concern for ${his} own health.`); + } else if (slave.devotion < -20) { + r.push(`struggles to down every sip you give ${him} and pants heavily whenever ${he} gets the chance.`); + } else if (slave.fetish === "submissive") { + r.push(`struggles to down every sip you give ${him} and pants heavily whenever ${he} gets the chance.`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`forces down every sip you give ${him} and pants heavily when ${his} mouth isn't full.`); + } else if (slave.devotion <= 20) { + r.push(`struggles to down every sip you give ${him} and pants heavily whenever ${he} gets the chance.`); + } else if (slave.devotion <= 50) { + r.push(`obediently downs every gulp you give ${him} and pants heavily between helpings.`); + } else { + r.push(`devotedly downs every gulp you give ${him} and catches ${his} breath, while being a tease, between helpings.`); + } + r.push(`Once the last of the slave food is in ${his} stomach, you give the firm globe a`); + if (slave.devotion > 20) { + r.push(`gentle`); + } + r.push(`slap, eliciting`); + if (slave.fetish === "mindbroken") { + r.push(`a large belch from the broken slave.`); + } else if (slave.devotion < -20) { + r.push(`a large belch and a glare from the straining slave.`); + } else if (slave.fetish === "submissive") { + r.push(`a large belch and a squeak of shame from the submissive slave.`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`a large belch and a content sigh from the bloated glutton.`); + } else if (slave.devotion <= 20) { + r.push(`a restrained gag from the overfilled slave.`); + } else if (slave.devotion <= 50) { + r.push(`a small hiccup from the overfilled slave, which ${he} immediately apologizes for.`); + } else { + r.push(`a large belch and a playfully stuck out tongue from the stuffed slave.`); + } + r.push(`${His} belly is as taut as a drum; you`); + if (slave.devotion > 20) { + r.push(`rub it some more`); + } else { + r.push(`pat it several more times`); + } + r.push(`as you appreciate its size.`); + _doMe = 1; + App.Events.addParagraph(node, r); + r = []; + } + r.push(`Knocking the empty buckets aside, you help ${his}`); + if (slave.fetish === "mindbroken") { + r.push(`hiccupping`); + } else if (slave.devotion < -20) { + r.push(`hiccupping`); + } else if (slave.fetish === "submissive") { + r.push(`hiccupping`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`hiccupping`); + } else if (slave.devotion <= 20) { + r.push(`heaving`); + } else if (slave.devotion <= 50) { + r.push(`hefty`); + } else { + r.push(`hefty`); + } + r.push(`bulk onto the couch to recover.`); + if (slave.fetish === "mindbroken") { + r.push(`After a few minutes of rest, and several glares from you when it appears ${his} meal might be coming back up,`); + } else if (slave.devotion < -20) { + r.push(`${He}`); + if (canSee(slave)) { + r.push(`looks in your eyes,`); + } else { + r.push(`faces you,`); + } + r.push(`as though almost demanding answers. ${He} looks apprehensive about what you will do next. After a few minutes of rest, and several glares from you when it appears ${his} meal might be coming back up,`); + } else if (slave.fetish === "submissive") { + r.push(`${He}`); + if (canSee(slave)) { + r.push(`looks in your eyes;`); + } else { + r.push(`faces you;`); + } + r.push(`a satisfied smile on ${his} face. ${He} almost looks sad that it's over, though ${his} gurgling middle says otherwise. After a few minutes of rest,`); + } else if (slave.behavioralFlaw === "gluttonous") { + r.push(`${He}`); + if (canSee(slave)) { + r.push(`looks in your eyes;`); + } else { + r.push(`faces you;`); + } + r.push(`a satisfied smile on ${his} face. ${He} almost looks sad that it's over, and ${his} stomach audibly grumbles its displeasure that no more food is working down ${his} throat. After a few minutes of rest,`); + } else if (slave.devotion <= 20) { + r.push(`${He} looks up at you quizzically, unsure about what you will do next. ${His} meal attempts to come back up on ${him} several times, but ${he} holds it down for fear of punishment should ${he} vomit. After a few minutes of rest,`); + } else if (slave.devotion <= 50) { + r.push(`${He} sighs contently, hoping you'll give ${him} more attention. ${His} meal attempts to come back up on ${him} several times, but ${he} dutifully holds it down. After a few minutes of rest,`); + } else { + r.push(`${He} sighs contently, hoping you'll give ${him} more attention. ${He} is proud to let you know that you could fit even more in ${him} if you wanted. After a few minutes of rest,`); + } + r.push(`you order ${him} to continue stuffing ${himself} to maintain ${his} current size until you say otherwise.`); + if (slave.fetish !== "mindbroken" && slave.devotion >= -20 && slave.behavioralFlaw === "gluttonous") { + r.push(`${He} squeals with glee at the order.`); + } + r.push(`You spend ${his} remaining time in recovery`); + if (slave.fetish === "mindbroken") { + r.push(`teasing ${his} belly until you tire of ${him} and send ${him} on ${his} way.`); + } else if (slave.devotion < -20) { + r.push(`tormenting ${his} gurgling belly until you tire of ${his} sobbing and send ${him} on ${his} way.`); + } else if (slave.fetish === "submissive" && slave.devotion <= 20) { + r.push(`toying with ${his} belly until you tire of moaning and send ${him} on ${his} way.`); + } else if (slave.behavioralFlaw === "gluttonous" && slave.devotion <= 20) { + r.push(`massaging ${his} stuffed belly until you tire of ${him} and send ${him} on ${his} way.`); + } else if (slave.devotion <= 20) { + r.push(`tormenting ${his} gurgling belly until you tire of ${his} groaning and send ${him} on ${his} way.`); + } else if (slave.devotion <= 50) { + r.push(`lavishing attention on ${his} gurgling belly, much to ${his} delight, until you tire of ${him} and send ${him} on ${his} way.`); + } else { + r.push(`playing with ${his} belly. ${He} joins you in the endeavor, happy that you are pleased with the`); + if (_doMe !== 1) { + r.push(`outcome.`); + } else { + r.push(`outcome, but ${his}`); + if (canSee(slave)) { + r.push(`eyes tell`); + } else { + r.push(`face tells`); + } + r.push(`you ${he} wants more.`); + } + // Fuckings for devoted slaves. + _doMe = 1; + let _sexType; + if (canDoVaginal(slave) && slave.vagina > 0) { + _sexType = "vaginal"; + } else if (canDoAnal(slave) && slave.anus > 0) { + _sexType = "anal"; + } else { + _sexType = "none"; + } + if (_sexType !== "none") { + if (V.PC.belly >= 10000) { + _doMe = 0; + r.push(`${His}`); + if (_sexType === "vaginal") { + r.push(`pussy`); + } else { + r.push(`ass`); + } + r.push(`is under a lot of pressure from ${his} swollen middle and surely would feel amazing; it's even`); + if (_sexType === "vaginal") { + r.push(`sopping wet for`); + } else { + r.push(`eagerly winking at`); + } + r.push(`you. Unfortunately, no matter how hard you try, you can't find a position that will accommodate both ${his} food-stuffed stomach and your own gravid middle. Sighing, you settle for ${his} mouth instead.`); + } else { + if (V.PC.dick !== 0) { + r.push(`You're already rock hard so you`); + } else { + if (_sexType === "vaginal") { + r.push(`You don a strap-on and`); + } else { + r.push(`You don a strap-on, lube up,`); + } + } + r.push(`pull ${his} legs apart,`); + if (_sexType === "vaginal") { + r.push(`revealing ${his}`); + if (slave.vaginaLube > 1) { + r.push(`sopping wet,`); + } else if (slave.vaginaLube > 0) { + r.push(`moist,`); + } else { + r.push(`moist, relative to its usual dryness,`); + } + if (slave.vagina >= 10) { + r.push(`devastated`); + } else if (slave.vagina > 3) { + r.push(`cavernous`); + } else if (slave.vagina > 2) { + r.push(`loose`); + } else if (slave.vagina > 1) { + r.push(`used`); + } else { + r.push(`tight`); + } + r.push(`pussy.`); + } else { + r.push(`and heft ${his} bulk up to reveal ${his}`); + if (slave.anus > 3) { + r.push(`gaping asshole.`); + } else if (slave.anus > 2) { + r.push(`loose anus.`); + } else if (slave.anus > 1) { + r.push(`used asshole.`); + } else { + r.push(`tight asshole.`); + } + } + r.push(`${His} belly is putting so much pressure on it that`); + const _looseness = (_sexType === "vaginal") ? slave.vagina : slave.anus; + if (_sexType === "vaginal" && _looseness >= 10) { + r.push(`you might be able to get some decent friction now.`); + if (V.PC.dick !== 0) { + r.push(`You can actually feel the sides of ${his} cunt as you slide in.`); + } else { + r.push(`You slide in like it's still nothing.`); + } + } else if (_looseness > 3) { + r.push(`you should be able to get a decent fuck out of it.`); + if (V.PC.dick !== 0) { + r.push(`You can't help but be amazed that you're getting some resistance as you slide in.`); + } else { + r.push(`You slide in like it's nothing.`); + } + } else if (_looseness > 2) { + r.push(`it won't feel so`); + if (_sexType === "vaginal") { + r.push(`worn out.`); + } else { + r.push(`stretched.`); + } + if (V.PC.dick !== 0) { + r.push(`${He} gives some nice resistance as you squeeze into ${him}.`); + } else { + r.push(`You squeeze in without problem.`); + } + } else if (_looseness > 1) { + r.push(`it'll feel positively tight.`); + if (V.PC.dick !== 0) { + r.push(`${His}`); + if (_sexType === "vaginal") { + r.push(`pussy`); + } else { + r.push(`anus`); + } + r.push(`feels great, you practically had to squeeze in.`); + } else { + r.push(`You squeeze in with a little effort.`); + } + } else { + r.push(`you'll barely be able to fit it in.`); + if (V.PC.dick !== 0) { + r.push(`${His}`); + if (_sexType === "vaginal") { + r.push(`vagina`); + } else { + r.push(`rear`); + } + r.push(`is so tight you can barely get it in, but with a little work, you manage to squeeze into its tight confines. ${He}'s tighter than any`); + if (_sexType === "anal") { + r.push(`anal`); + } + r.push(`virgin you've ever fucked.`); + } else { + r.push(`You have to`); + if (_sexType === "vaginal") { + r.push(`lube up some,`); + } else { + r.push(`get a little rough,`); + } + r.push(`but eventually you manage to slide into ${his} extremely tight`); + if (_sexType === "vaginal") { + r.push(`vagina.`); + } else { + r.push(`anus.`); + } + } + } + r.push(`Once you're hilted, you bring your hands to ${his} distended belly, eager to feel it move as you fuck ${him}.`); + if (hasAnyArms(slave)) { + r.push(`${His} own join`); + if (hasBothArms(slave)) { + r.push(`s`); + } + r.push(`yours atop the taut dome.`); + } + r.push(`Every thrust into the stuffed ${SlaveTitle(slave)} forces ${his} full middle to leap back before slamming into your stomach alongside a moaning groan. As you pick up the pace, ${he} begins to buck against you, adding even more motion to ${his} body. It doesn't take long for you to reach your peak and, after cumming, catch sight of ${his} own climax. Watching ${his} middle attempt to contract around the mass of slave food inside ${him} invigorates you for a second round.`); + if (V.PC.balls >= 30) { + r.push(`By the time you're done, ${he}'s positively massive; your copious seed flows out of ${him} in spurts as ${his} body desperately struggles to relieve the extra pressure your huge balls pumped into ${him}.`); + } + r.push(`Once you are spent,`); + if (V.PC.balls >= 30) { + r.push(`and ${he}'s forced out all your cum,`); + } + r.push(`you settle down beside ${him} and rest your head against ${his} belly; it almost feels like a water-filled pillow, albeit a little noisy. You and ${slave.slaveName} doze off together for a much needed nap. You don't get much rest; ${his} stomach's constant groaning and burbling keeping you up, so you send ${him} on ${his} way. ${He} blows you one last kiss and eagerly looks forward to next time.`); + if (_sexType === "vaginal") { + r.push(VCheck.Vaginal(slave, 2)); + } else { + r.push(VCheck.Anal(slave, 2)); + } + } + } else { + _doMe = 0; + } + if (_doMe === 0) { + if (V.PC.dick !== 0) { + r.push(`You crawl onto the couch above ${his} head and lower your erect cock straight into ${his} waiting mouth. ${He} eagerly sucks you off, ${his} belly wobbling with every thrust into ${his} throat. You cum fast and hard into ${him}, a product of being on the edge during ${his} feeding;`); + if (slave.behavioralFlaw === "gluttonous") { + r.push(`${he} takes it like nothing and resumes sucking, ${his} gluttony showing no bounds.`); + } else { + r.push(`${he} swallows it promptly and keeps sucking. You'd swear ${he} was a glutton at this point.`); + } + } else { + r.push(`You crawl onto the couch above ${his} head and lower your needy pussy straight onto ${his} outstretched tongue. ${He} eagerly eats you out, ${his} belly wobbling along to ${his} vigorous licking. You cum fast and hard onto ${him}, a product of being on the edge during ${his} feeding;`); + if (slave.behavioralFlaw === "gluttonous") { + r.push(`${he} laps it all up and resumes pleasuring you, ${his} gluttony showing no bounds.`); + } else { + r.push(`${he} laps it promptly and resumes pleasuring you. You'd swear ${he} was a glutton at this point.`); + } + } + r.push(`Once you are spent, you slide down beside ${him} and rest your head against ${his} belly; it almost feels like a water-filled pillow, albeit a little noisy. You and ${slave.slaveName} doze off together for a much needed nap. You don't get much rest; ${his} stomach's constant groaning and burbling keeping you up, so you send ${him} on ${his} way. ${He} blows you one last kiss and eagerly looks forward to next time.`); + slave.counter.oral += 2; + V.oralTotal += 2; + } + } + } + + if (_pregDiscovery === 1) { + r.push(`Once you've managed to stop ${his} heaving and clean up, you decide to get to the root of this mess. While most of the tests come back normal, one in particular catches your eye; <span class="lime">${he} is pregnant${(slave.preg > slave.pregData.normalBirth/4) ? `and surprisingly far along` : ``}.</span>`); + deflate(slave); + slave.pregKnown = 1; + } else { + if (slave.inflation === 3) { + if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { + r.push(`${He} gingerly leaves your office, massaging ${his} over-stuffed belly as ${he} goes.`); + } else { + r.push(`${His} belly wobbles heavily as ${he} is helped from your office.`); + } + r.push(`Being filled so full <span class="health.dec">surely had negative effects</span> on ${his} health.`); + healthDamage(slave, 10); + } else if (slave.inflation === 2) { + if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { + r.push(`${He} gingerly leaves your office, massaging ${his} stuffed belly as ${he} goes.`); + } else { + r.push(`${His} belly wobbles heavily as ${he} is helped from your office.`); + } + } else if (slave.inflation === 1) { + if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { + r.push(`${He} gingerly leaves your office, massaging ${his} distended belly as ${he} goes.`); + } else { + r.push(`${His} belly wobbles as ${he} is helped from your office.`); + } + } + if (slave.fetish === "mindbroken") { + r.push(`You question if the broken ${girl} understood your commands, but relish the idea of force-feeding ${him} even more should ${he} fail you.`); + } + } + + SetBellySize(slave); + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/forceFeeding.tw b/src/npc/interaction/forceFeeding.tw deleted file mode 100644 index 27b5a8be97d4ab9b4d537486b7514ee7e5fb4709..0000000000000000000000000000000000000000 --- a/src/npc/interaction/forceFeeding.tw +++ /dev/null @@ -1,556 +0,0 @@ -:: forceFeeding [nobr no-history] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run addPartner(getSlave($AS), -1)>> -<<set $desc = SlaveTitle(getSlave($AS))>> - -<<set _belly = bellyAdjective(getSlave($AS))>> -<<set getSlave($AS).bellyAccessory = "none", _isDone = getSlave($AS).inflation-1, _pregDiscovery = 0>> -You call $him over and ask $him to wait patiently for a moment. -<<if getSlave($AS).fetish == "mindbroken">> - $He shows no response as -<<else>> - $He barely has time to ponder why you called for $him when -<</if>> -another slave carries in a pair of -<<if getSlave($AS).inflation == 3>> - one gallon -<<elseif getSlave($AS).inflation == 2>> - two liter -<<else>> - one liter -<</if>> -buckets overflowing with slave food. $He is going to eat it all and you're going to enjoy $him as $he does it. - -<<if getSlave($AS).inflation > 1 && getSlave($AS).preg > 1>> - $He looks nauseated by the <<if canSee(getSlave($AS))>>sight<<elseif canSmell(getSlave($AS))>>smell<<else>>very existence<</if>> of the food. -<<elseif getSlave($AS).fetish == "submissive" && getSlave($AS).devotion >= -20>> - $He blushes at the thought of being forced to eat for another's amusement. -<<elseif getSlave($AS).behavioralFlaw == "gluttonous" && getSlave($AS).devotion >= -20>> - $He's awestruck that you approve of $his gluttony enough to present $him a feast. -<<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - $He's hesitant about your intent, but $he gives in as $his belly begins to growl at the <<if canSee(getSlave($AS))>>sight<<elseif canSmell(getSlave($AS))>>smell<<else>>anticipation<</if>> of $his waiting meal. -<<elseif getSlave($AS).behavioralFlaw == "anorexic">> - $He grimaces at the <<if canSee(getSlave($AS))>>sight<<elseif canSmell(getSlave($AS))>>smell<<else>>thought<</if>> of the food that will soon be going into $him. $He knows you won't let it come back up later. -<</if>> - -<<if canMove(getSlave($AS))>> - You instruct $him to take a seat on your lap and open - <<if getSlave($AS).fetish == "mindbroken">> - wide, but $he remains still and unresponsive. Talking to a broken mind is pointless. - <<else>> - wide. - <</if>> - <<if getSlave($AS).devotion < -20>> - Opposed to the thought of being forced to eat all that food, $he tries to <<if canWalk(getSlave($AS))>>step back<<else>>crawl away<</if>>, but you catch $him and pull $him into your lap, wrapping an arm - <<elseif getSlave($AS).fetish == "submissive">> - $He meekly settles into your lap and shudders as $he feels your dominant hand wrap - <<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - $He wastes no time getting into position with $his mouth agape as you wrap your hand - <<elseif getSlave($AS).devotion <= 20>> - $He complies without comment and settles $himself onto your lap, shuddering slightly as you wrap your arm - <<elseif getSlave($AS).devotion <= 50>> - $He hesitates but eventually settles onto your lap as you wrap your arm - <<else>> - $He eagerly settles $himself onto your lap as you wrap your arm - <</if>> -<<elseif (isAmputee(getSlave($AS)))>> - <<if getSlave($AS).devotion < -20>> - $He's opposed to the thought of being forced to eat all that food, but as an amputee can do nothing about it. You heft $him onto your lap, wrapping an arm - <<elseif getSlave($AS).fetish == "submissive">> - $He's opposed to the thought of being forced to eat all that food, but as an amputee can do nothing about it; not that $he'd go against your orders anyway. $He shudders with pleasure as you heft $him onto your lap, wrapping a dominant arm - <<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - $He can't wait to chow down, but as an amputee can do nothing to get in position. $He shudders with anticipation as you heft $him onto your lap, wrapping an arm - <<elseif getSlave($AS).devotion <= 20>> - $He's hesitant of being force-fed, but as an amputee can do nothing about it. You heft $him onto your lap, wrapping your arm - <<elseif getSlave($AS).devotion <= 50>> - $He's mildly hesitant of being force-fed, but as an amputee can do nothing about it. You heft $him onto your lap, wrapping your arm - <<else>> - $He devotedly <<if canSee(getSlave($AS))>>looks<<else>>smiles<</if>> at you as you heft $him onto your lap, wrapping your arm - <</if>> -<<else>> - You inform $him $he'll be taking a seat on your lap and opening wide for $his meal. - <<if getSlave($AS).devotion < -20>> - $He's opposed to the thought of being forced to eat all that food, but since $he is immobile, can't escape. You heft $him onto your lap, wrapping an arm - <<elseif getSlave($AS).fetish == "submissive">> - $He accepts your orders without question. $He shudders with pleasure as you heft $him onto your lap, wrapping a dominant arm - <<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - $He eagerly tries to get to your lap faster. $He shudders with anticipation as you heft $him onto your lap, wrapping your arm - <<elseif getSlave($AS).devotion <= 20>> - $He complies without comment. You heft $him onto your lap, wrapping an arm - <<elseif getSlave($AS).devotion <= 50>> - $He hesitates for a moment, before demonstrating acceptance. You heft $him onto your lap, wrapping an arm - <<else>> - $He squirms with excitement as you heft $him onto your lap, wrapping an arm - <</if>> -<</if>> -<<if getSlave($AS).fetish == "mindbroken">> - You reach out and wrap your arms -<</if>> - -around $his -<<if getSlave($AS).weight > 190>> - immensely soft -<<elseif getSlave($AS).belly >= 150000>> - _belly -<<elseif getSlave($AS).weight > 160>> - massive soft -<<elseif getSlave($AS).weight > 130>> - giant soft -<<elseif getSlave($AS).belly >= 1500>> - _belly -<<elseif getSlave($AS).weight > 95>> - huge soft -<<elseif getSlave($AS).weight > 30>> - big soft -<<elseif getSlave($AS).weight > 10>> - soft -<<elseif getSlave($AS).muscles > 95>> - chiseled -<<elseif getSlave($AS).muscles > 30>> - muscular -<<elseif getSlave($AS).muscles > 5>> - firm, ripped -<<else>> - firm, flat -<</if>> -<<if getSlave($AS).fetish == "mindbroken">> - belly, pulling $him into your lap. -<<else>> - belly. -<</if>> - -You hold $him tight as you pull $his meal closer, dip in a cup and bring it to $his lips. -<<if getSlave($AS).fetish == "mindbroken">> - It takes little effort to get $him to gulp down the contents -<<elseif getSlave($AS).devotion < -20>> - $He struggles in your lap and refuses to open $his mouth. You drop the cup back into the bucket and lean in close. You quickly clip $his nose shut, eliciting a panicked thrash from the $girl. - <<if hasAnyLegs(getSlave($AS))>> - You warn $him that $his punishment will be severe if $he comes that close to kicking over the buckets again. - <</if>> - With $his mouth forced open, you now have a clear avenue with which to pour the slave food into $his mouth. $He sputters as $he struggles to swallow with $his nose shut. After several cups, tears are streaming down $his face from the discomfort. Weeping, $he implores you to remove the clamp so that $he may drink like a good $girl. -<<elseif getSlave($AS).fetish == "submissive">> - $He submissively drinks the contents and readies $his lips for the next, -<<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - $He hurriedly gulps down the contents and opens wide for the next, -<<elseif getSlave($AS).devotion <= 20>> - $He wordless drinks the contents, -<<elseif getSlave($AS).devotion <= 50>> - $He drinks the contents without hesitation, -<<else>> - $He happily downs the contents, -<</if>> - -<<if getSlave($AS).fetish != "mindbroken" && getSlave($AS).devotion < -20>> - You readily comply and waste no time in bring cupful after cupful to $his lips. -<<else>> - so you keep the cupfuls coming. -<</if>> - -You can feel $his <<= getSlave($AS).skin>> belly swelling with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once $he has downed two liters, you give $his bloated belly a slap, eliciting -<<if getSlave($AS).fetish == "mindbroken">> - a small burp from the broken slave -<<elseif getSlave($AS).devotion < -20>> - a shudder from the groaning slave -<<elseif getSlave($AS).fetish == "submissive">> - a subtle belch that the moaning slave quickly apologizes for, -<<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - a subtle belch from the moaning slave -<<elseif getSlave($AS).devotion <= 20>> - a small shudder from the bloated slave -<<elseif getSlave($AS).devotion <= 50>> - a small hiccup that the overfilled slave immediately apologizes for, -<<else>> - a cute burp from the bloated slave, followed by $his tongue running over $his lips -<</if>> -and a little jiggle from $his gut. - -<br><br> - -<<if getSlave($AS).pregKnown == 0 && getSlave($AS).preg > getSlave($AS).pregData.normalBirth/13.33 && _isDone > 0>> - As soon as the next helping enters $him you feel something is wrong. $He begins to heave, - <<if getSlave($AS).fetish != "mindbroken" && getSlave($AS).devotion > 50>> - struggling to keep down the slave food, however $he shortly expels the entirety of $his stomach across the floor. - <<else>> - shortly expelling the entirety of $his stomach - <</if>> - <<if getSlave($AS).fetish == "mindbroken">> - all over $himself and your lap. - <<elseif getSlave($AS).devotion < -20>> - all over $himself and your lap. - <<elseif getSlave($AS).fetish == "submissive">> - onto your floor. - <<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - all over $himself and your lap. - <<elseif getSlave($AS).devotion <= 20>> - all over $himself and your lap. - <<elseif getSlave($AS).devotion <= 50>> - across the floor. - <</if>> - It didn't seem to be willful, - <<if getSlave($AS).fetish == "mindbroken">> - not that much is with $him, but is still unacceptable. - <<elseif getSlave($AS).devotion < -20>> - given how pathetically $he is cowering from your wrath, but is completely unacceptable. - <<elseif getSlave($AS).fetish == "submissive">> - given how $he is begging to clean it up with $his tongue, but is completely unacceptable. - <<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - given how $he is in tears over the loss of such a meal, but is completely unacceptable. - <<elseif getSlave($AS).devotion <= 20>> - given how $he is begging you to try again, but is completely unacceptable. - <<elseif getSlave($AS).devotion <= 50>> - given how disappointed $he is in failing you, but is completely unacceptable. - <<else>> - given how disappointed $he is in failing you, but is worrying. Such a good slave shouldn't do such bad things. - <</if>> - <<set _pregDiscovery = 1>> -<<else>> - <<if _isDone > 0>> - <<set _isDone-->> - But $he isn't done - <<if getSlave($AS).fetish == "mindbroken">> - yet. - <<elseif getSlave($AS).devotion < -20>> - yet. - <<elseif getSlave($AS).fetish == "submissive">> - yet, not that $he minds. - <<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - yet, much to $his delight. - <<elseif getSlave($AS).devotion <= 20>> - yet, much to $his dismay. - <<elseif getSlave($AS).devotion <= 50>> - yet, not that $he'd risk complaining. - <<else>> - yet, not that $he'd complain about fulfilling your desires. - <</if>> - More and more you feed $him; $his belly swelling ever larger and growing even heavier as $he - <<if getSlave($AS).fetish == "mindbroken">> - guzzles - <<elseif getSlave($AS).devotion < -20>> - painstakingly drinks - <<elseif getSlave($AS).fetish == "submissive">> - diligently drinks - <<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - desperately sucks down - <<elseif getSlave($AS).devotion <= 20>> - diligently drinks - <<elseif getSlave($AS).devotion <= 50>> - diligently drinks - <<else>> - diligently drinks - <</if>> - the slave food. You reposition yourself to bet a better hold on $his bulging food baby. As $he passes the gallon mark, you give the swollen orb a good jiggle, eliciting - <<if getSlave($AS).fetish == "mindbroken">> - a burp from the broken slave and tons of motion under your arm. - <<elseif getSlave($AS).devotion < -20>> - a pained burp from the crying slave and tons of motion under your arm. - <<elseif getSlave($AS).fetish == "submissive">> - a moan of arousal over your control and tons of motion under your arm. - <<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - a load hiccup, tons of motion under your arm, and a plea for more food. - <<elseif getSlave($AS).devotion <= 20>> - a strained burp from the full slave and tons of motion under your arm. - <<elseif getSlave($AS).devotion <= 50>> - a small hiccup, which the bloated slave immediately apologizes for, and tons of motion under your arm. - <<else>> - a small sigh followed by a request for more, from the bloated slave and tons of motion under your arm. - <</if>> - <br><br> - <</if>> - <<if _isDone > 0>> - <<if getSlave($AS).fetish == "mindbroken">> - $He squirms a little in discomfort, but $he still has another gallon to go, so you continue feeding food into $his mouth. - <<elseif getSlave($AS).devotion < -20>> - $He squirms in discomfort, but $he still has another gallon to go and $he knows it. You remind $him of the ways you can torment $him in this state so you can continue feeding food into $his mouth without too much resistance. - <<elseif getSlave($AS).fetish == "submissive">> - $He gets comfortable as $he still has another gallon to go and $he knows it. Gulping, $he opens $his mouth in preparation, eager to obey $his dom. - <<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - $He still has another gallon to go and $he knows it, so $he wastes no time in letting you know $he's ready. - <<elseif getSlave($AS).devotion <= 20>> - $He begins to struggle when $he realizes $he still has another gallon to go. Gulping, $he opens up as another helping approaches $his mouth. - <<elseif getSlave($AS).devotion <= 50>> - $He still has another gallon to go and $he knows it, so $he tries $his best to get comfortable and give $his belly room to grow. Gulping, $he diligently opens up for the next serving. - <<else>> - $He still has another gallon to go and $he knows it, but if <<= getWrittenTitle(getSlave($AS))>> wants $him to be stuffed like a turkey, $he'll happily comply. $He wastes no time in opening up for your next helping. - <</if>> - You can feel the pressure growing in $his middle as it fills out under your arm more and more. $He - <<if getSlave($AS).fetish == "mindbroken">> - mechanically downs every sip you give $him with no concern for $his own health. - <<elseif getSlave($AS).devotion < -20>> - struggles to down every sip you give $him and pants heavily whenever $he gets the chance. - <<elseif getSlave($AS).fetish == "submissive">> - struggles to down every sip you give $him and pants heavily whenever $he gets the chance. - <<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - forces down every sip you give $him and pants heavily when $his mouth isn't full. - <<elseif getSlave($AS).devotion <= 20>> - struggles to down every sip you give $him and pants heavily whenever $he gets the chance. - <<elseif getSlave($AS).devotion <= 50>> - obediently downs every gulp you give $him and pants heavily between helpings. - <<else>> - devotedly downs every gulp you give $him and catches $his breath, while being a tease, between helpings. - <</if>> - Once the last of the slave food is in $his stomach, you give the firm globe a <<if getSlave($AS).devotion > 20>>gentle <</if>>slap, eliciting - <<if getSlave($AS).fetish == "mindbroken">> - a large belch from the broken slave. - <<elseif getSlave($AS).devotion < -20>> - a large belch and a glare from the straining slave. - <<elseif getSlave($AS).fetish == "submissive">> - a large belch and a squeak of shame from the submissive slave. - <<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - a large belch and a content sigh from the bloated glutton. - <<elseif getSlave($AS).devotion <= 20>> - a restrained gag from the overfilled slave. - <<elseif getSlave($AS).devotion <= 50>> - a small hiccup from the overfilled slave, which $he immediately apologizes for. - <<else>> - a large belch and a playfully stuck out tongue from the stuffed slave. - <</if>> - $His belly is as taut as a drum; you - <<if getSlave($AS).devotion > 20>> - rub it some more - <<else>> - pat it several more times - <</if>> - as you appreciate its size. - <br><br> - <</if>> - Knocking the empty buckets aside, you help $his - <<if getSlave($AS).fetish == "mindbroken">> - hiccupping - <<elseif getSlave($AS).devotion < -20>> - hiccupping - <<elseif getSlave($AS).fetish == "submissive">> - hiccupping - <<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - hiccupping - <<elseif getSlave($AS).devotion <= 20>> - heaving - <<elseif getSlave($AS).devotion <= 50>> - hefty - <<else>> - hefty - <</if>> - bulk onto the couch to recover. - <<if getSlave($AS).fetish == "mindbroken">> - After a few minutes of rest, and several glares from you when it appears $his meal might be coming back up, - <<elseif getSlave($AS).devotion < -20>> - $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. After a few minutes of rest, and several glares from you when it appears $his meal might be coming back up, - <<elseif getSlave($AS).fetish == "submissive">> - $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>; a satisfied smile on $his face. $He almost looks sad that it's over, though $his gurgling middle says otherwise. After a few minutes of rest, - <<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>; a satisfied smile on $his face. $He almost looks sad that it's over, and $his stomach audibly grumbles its displeasure that no more food is working down $his throat. After a few minutes of rest, - <<elseif getSlave($AS).devotion <= 20>> - $He looks up at you quizzically, unsure about what you will do next. $His meal attempts to come back up on $him several times, but $he holds it down for fear of punishment should $he vomit. After a few minutes of rest, - <<elseif getSlave($AS).devotion <= 50>> - $He sighs contently, hoping you'll give $him more attention. $His meal attempts to come back up on $him several times, but $he dutifully holds it down. After a few minutes of rest, - <<else>> - $He sighs contently, hoping you'll give $him more attention. $He is proud to let you know that you could fit even more in $him if you wanted. After a few minutes of rest, - <</if>> - you order $him to continue stuffing $himself to maintain $his current size until you say otherwise. - <<if getSlave($AS).fetish != "mindbroken" && getSlave($AS).devotion >= -20 && getSlave($AS).behavioralFlaw == "gluttonous">> - $He squeals with glee at the order. - <</if>> - You spend $his remaining time in recovery - <<if getSlave($AS).fetish == "mindbroken">> - teasing $his belly until you tire of $him and send $him on $his way. - <<elseif getSlave($AS).devotion < -20>> - tormenting $his gurgling belly until you tire of $his sobbing and send $him on $his way. - <<elseif getSlave($AS).fetish == "submissive">> - toying with $his belly until you tire of moaning and send $him on $his way. - <<elseif getSlave($AS).behavioralFlaw == "gluttonous">> - massaging $his stuffed belly until you tire of $him and send $him on $his way. - <<elseif getSlave($AS).devotion <= 20>> - tormenting $his gurgling belly until you tire of $his groaning and send $him on $his way. - <<elseif getSlave($AS).devotion <= 50>> - lavishing attention on $his gurgling belly, much to $his delight, until you tire of $him and send $him on $his way. - <<else>> - playing with $his belly. $He joins you in the endeavor, happy that you are pleased with the - <<if _doMe != 1>> - outcome. - <<else>> - outcome, but $his - <<if canSee(getSlave($AS))>>eyes tell<<else>>face tells<</if>> - you $he wants more. - <</if>> - <!-- Fuckings for devoted slaves. --> - <<set _doMe = 1>> - <<if canDoVaginal(getSlave($AS)) && getSlave($AS).vagina > 0>> - <<set _sexType = "vaginal">> - <<elseif canDoAnal(getSlave($AS)) && getSlave($AS).anus > 0>> - <<set _sexType = "anal">> - <<else>> - <<set _sexType = "none">> - <</if>> - <<if _sexType != "none">> - <<if $PC.belly >= 10000>> - <<set _doMe = 0>> - $His <<if _sexType == "vaginal">>pussy<<else>>ass<</if>> is under a lot of pressure from $his swollen middle and surely would feel amazing; it's even <<if _sexType == "vaginal">>sopping wet for<<else>>eagerly winking at<</if>> you. Unfortunately, no matter how hard you try, you can't find a position that will accommodate both $his food-stuffed stomach and your own gravid middle. Sighing, you settle for $his mouth instead. - <<else>> - <<if $PC.dick != 0>> - You're already rock hard so you - <<else>> - <<if _sexType == "vaginal">> - You don a strap-on and - <<else>> - You don a strap-on, lube up, - <</if>> - <</if>> - pull $his legs apart, - <<if _sexType == "vaginal">> - revealing $his - <<if getSlave($AS).vaginaLube > 1>> - sopping wet, - <<elseif getSlave($AS).vaginaLube > 0>> - moist, - <<else>> - moist, relative to its usual dryness, - <</if>> - <<if getSlave($AS).vagina >= 10>> - devastated - <<elseif getSlave($AS).vagina > 3>> - cavernous - <<elseif getSlave($AS).vagina > 2>> - loose - <<elseif getSlave($AS).vagina > 1>> - used - <<else>> - tight - <</if>> - pussy. - <<else>> - and heft $his bulk up to reveal $his - <<if getSlave($AS).anus > 3>> - gaping asshole. - <<elseif getSlave($AS).anus > 2>> - loose anus. - <<elseif getSlave($AS).anus > 1>> - used asshole. - <<else>> - tight asshole. - <</if>> - <</if>> - $His belly is putting so much pressure on it that - <<if _sexType == "vaginal">> - <<set _looseness = getSlave($AS).vagina>> - <<else>> - <<set _looseness = getSlave($AS).anus>> - <</if>> - <<if _sexType == "vaginal" && _looseness >= 10>> - you might be able to get some decent friction now. - <<if $PC.dick != 0>> - You can actually feel the sides of $his cunt as you slide in. - <<else>> - You slide in like it's still nothing. - <</if>> - <<elseif _looseness > 3>> - you should be able to get a decent fuck out of it. - <<if $PC.dick != 0>> - You can't help but be amazed that you're getting some resistance as you slide in. - <<else>> - You slide in like it's nothing. - <</if>> - <<elseif _looseness > 2>> - it won't feel so - <<if _sexType == "vaginal">> - worn out. - <<else>> - stretched. - <</if>> - <<if $PC.dick != 0>> - $He gives some nice resistance as you squeeze into $him. - <<else>> - You squeeze in without problem. - <</if>> - <<elseif _looseness > 1>> - it'll feel positively tight. - <<if $PC.dick != 0>> - $His <<if _sexType == "vaginal">>pussy<<else>>anus<</if>> feels great, you practically had to squeeze in. - <<else>> - You squeeze in with a little effort. - <</if>> - <<else>> - you'll barely be able to fit it in. - <<if $PC.dick != 0>> - $His <<if _sexType == "vaginal">>vagina<<else>>rear<</if>> is so tight you can barely get it in, but with a little work, you manage to squeeze into its tight confines. $He's tighter than any <<if _sexType == "anal">>anal<</if>> virgin you've ever fucked. - <<else>> - You have to - <<if _sexType == "vaginal">> - lube up some, - <<else>> - get a little rough, - <</if>> - but eventually you manage to slide into $his extremely tight <<if _sexType == "vaginal">>vagina<<else>>anus<</if>>. - <</if>> - <</if>> - Once you're hilted, you bring your hands to $his distended belly, eager to feel it move as you fuck $him. - <<if hasAnyArms(getSlave($AS))>> - $His own join<<if hasBothArms(getSlave($AS))>>s<</if>> yours atop the taut dome. - <</if>> - Every thrust into the stuffed $desc forces $his full middle to leap back before slamming into your stomach alongside a moaning groan. As you pick up the pace, $he begins to buck against you, adding even more motion to $his body. It doesn't take long for you to reach your peak and, after cumming, catch sight of $his own climax. Watching $his middle attempt to contract around the mass of slave food inside $him invigorates you for a second round. - <<if $PC.balls >= 30>> - By the time you're done, $he's positively massive; your copious seed flows out of $him in spurts as $his body desperately struggles to relieve the extra pressure your huge balls pumped into $him. - <</if>> - Once you are spent, <<if $PC.balls >= 30>>and $he's forced out all your cum,<</if>> you settle down beside $him and rest your head against $his belly; it almost feels like a water-filled pillow, albeit a little noisy. You and <<= getSlave($AS).slaveName>> doze off together for a much needed nap. You don't get much rest; $his stomach's constant groaning and burbling keeping you up, so you send $him on $his way. $He blows you one last kiss and eagerly looks forward to next time. - <<if _sexType == "vaginal">> - <<= VCheck.Vaginal(getSlave($AS), 2)>> - <<else>> - <<= VCheck.Anal(getSlave($AS), 2)>> - <</if>> - <</if>> - <<else>> - <<set _doMe = 0>> - <</if>> - <<if _doMe == 0>> - <<if $PC.dick != 0>> - You crawl onto the couch above $his head and lower your erect cock straight into $his waiting mouth. $He eagerly sucks you off, $his belly wobbling with every thrust into $his throat. You cum fast and hard into $him, a product of being on the edge during $his feeding; - <<if getSlave($AS).behavioralFlaw == "gluttonous">> - $he takes it like nothing and resumes sucking, $his gluttony showing no bounds. - <<else>> - $he swallows it promptly and keeps sucking. You'd swear $he was a glutton at this point. - <</if>> - <<else>> - You crawl onto the couch above $his head and lower your needy pussy straight onto $his outstretched tongue. $He eagerly eats you out, $his belly wobbling along to $his vigorous licking. You cum fast and hard onto $him, a product of being on the edge during $his feeding; - <<if getSlave($AS).behavioralFlaw == "gluttonous">> - $he laps it all up and resumes pleasuring you, $his gluttony showing no bounds. - <<else>> - $he laps it promptly and resumes pleasuring you. You'd swear $he was a glutton at this point. - <</if>> - <</if>> - Once you are spent, you slide down beside $him and rest your head against $his belly; it almost feels like a water-filled pillow, albeit a little noisy. You and <<= getSlave($AS).slaveName>> doze off together for a much needed nap. You don't get much rest; $his stomach's constant groaning and burbling keeping you up, so you send $him on $his way. $He blows you one last kiss and eagerly looks forward to next time. - <<set getSlave($AS).counter.oral += 2, $oralTotal += 2>> - <</if>> - <</if>> -<</if>> - -<<if _pregDiscovery == 1>> - Once you've managed to stop $his heaving and clean up, you decide to get to the root of this mess. While most of the tests come back normal, one in particular catches your eye; @@.lime;$he is pregnant <<if getSlave($AS).preg > getSlave($AS).pregData.normalBirth/4>> and surprisingly far along<</if>>.@@ - <<run deflate(getSlave($AS))>> - <<set getSlave($AS).pregKnown = 1>> -<<else>> - <<if getSlave($AS).inflation == 3>> - <<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>> - $He gingerly leaves your office, massaging $his over-stuffed belly as $he goes. - <<else>> - $His belly wobbles heavily as $he is helped from your office. - <</if>> - Being filled so full @@.health.dec;surely had negative effects@@ on $his health. - <<run healthDamage(getSlave($AS), 10)>> - <<elseif getSlave($AS).inflation == 2>> - <<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>> - $He gingerly leaves your office, massaging $his stuffed belly as $he goes. - <<else>> - $His belly wobbles heavily as $he is helped from your office. - <</if>> - <<elseif getSlave($AS).inflation == 1>> - <<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>> - $He gingerly leaves your office, massaging $his distended belly as $he goes. - <<else>> - $His belly wobbles as $he is helped from your office. - <</if>> - <</if>> - <<if getSlave($AS).fetish == "mindbroken">> - You question if the broken $girl understood your commands, but relish the idea of force-feeding $him even more should $he fail you. - <</if>> -<</if>> - -<<run SetBellySize(getSlave($AS))>> diff --git a/src/npc/interaction/passage/abort.js b/src/npc/interaction/passage/abort.js new file mode 100644 index 0000000000000000000000000000000000000000..2251293e14c8d450b5c779daf213ba6862dc68ae --- /dev/null +++ b/src/npc/interaction/passage/abort.js @@ -0,0 +1,70 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.abort = function(slave) { + const node = new DocumentFragment(); + let r = []; + + const { + He, His, + he, his, him + } = getPronouns(slave); + + r.push(`The remote surgery makes aborting a pregnancy quick and efficient.`); + + if (slave.preg < 4) { + r.push(`It was so early in ${his} pregnancy that the potential mental effects are diminished.`); + } else { + r.push(`${slave.slaveName} is`); + if (slave.fuckdoll > 0 || slave.fetish === "mindbroken") { + r.push(`completely unmoved by the development.`); + } else if (slave.sexualFlaw === "breeder") { + r.push(`<span class="red">fundamentally broken.</span> ${His} entire concept of self and sexuality was wrapped up in the life growing within ${him}, and now it is gone.`); + slave.fetish = "mindbroken"; + slave.behavioralQuirk = "none"; + slave.behavioralFlaw = "none"; + slave.sexualQuirk = "none"; + slave.sexualFlaw = "none"; + slave.devotion = 0; + slave.trust = 0; + } else if (slave.devotion < -50) { + r.push(`<span class="devotion dec">filled with violent, consuming hatred.</span> Even though ${he} knew ${his} baby was destined for a slave orphanage, it seems ${he} cared for it and views you as its killer. ${He} is <span class="trust dec">terrified of your power</span> over ${his} body.`); + slave.trust -= 10; + slave.devotion -= 25; + } else if (slave.devotion < -20) { + r.push(`<span class="devotion dec">afflicted by desperate, inconsolable sobbing.</span> Even though ${he} knew ${his} baby was destined for a slave orphanage, it seems ${he} cared for it. ${He} is <span class="trust dec">terrified of your power</span> over ${his} body.`); + slave.trust -= 10; + slave.devotion -= 10; + } else if (slave.fetish === "pregnancy") { + r.push(`<span class="devotion dec">filled with a deep sorrow.</span> To a pregnancy fetishist, having a pregnancy end like this hurts far worse than birth ever would. ${He} is <span class="trust dec">terrified of a repeat performance.</span>`); + const _fetishModifier = slave.fetishStrength/2; + slave.devotion -= 1*_fetishModifier; + slave.trust -= 1*_fetishModifier; + } else if (slave.devotion <= 20) { + r.push(`<span class="devotion dec">consumed by muted weeping and enduring sorrow.</span> Even though ${he} knew ${his} baby was destined for a slave orphanage, it seems ${he} cared for it. ${He} is <span class="trust dec">terrified of your power</span> over ${his} body.`); + slave.trust -= 10; + slave.devotion -= 5; + } else if (slave.devotion <= 50) { + r.push(`dully obedient. ${He} has been broken to slave life so thoroughly that even this is neither surprising nor affecting. ${He} is <span class="trust dec">terrified of your power</span> over ${his} body.`); + slave.trust -= 10; + } else { + r.push(`<span class="devotion inc">pleased by this stark development,</span> since ${he} is so attentive to your will. ${He} also expects ${he}'ll be able to fuck better now.`); + slave.devotion += 4; + } + } + + if (slave.abortionTat > -1) { + slave.abortionTat++; + r.push(`The temporary tattoo of a child has been replaced with ${his} ${ordinalSuffix(slave.abortionTat)} crossed out infant.`); + cashX(forceNeg(V.modCost), "slaveMod", slave); + } + + slave.preg = (lastPregRule(slave, V.defaultRules)) ? -1 : 0; + + TerminatePregnancy(slave); + actX(slave, "abortions"); + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/npc/interaction/passage/abort.tw b/src/npc/interaction/passage/abort.tw deleted file mode 100644 index a1a7a7b2d5b1c8d0a36ac8f719a5b8c324e8d636..0000000000000000000000000000000000000000 --- a/src/npc/interaction/passage/abort.tw +++ /dev/null @@ -1,48 +0,0 @@ -:: Abort [nobr] - -<<set $nextButton = "Back", $nextLink = "Slave Interact">> - -The remote surgery makes aborting a pregnancy quick and efficient. - -<<if getSlave($AS).preg < 4>> - It was so early in $his pregnancy that the potential mental effects are diminished. -<<else>> - <<= getSlave($AS).slaveName>> is - <<if (getSlave($AS).fuckdoll > 0) || (getSlave($AS).fetish == "mindbroken")>> - completely unmoved by the development. - <<elseif getSlave($AS).sexualFlaw == "breeder">> - @@.red;fundamentally broken.@@ $His entire concept of self and sexuality was wrapped up in the life growing within $him, and now it is gone. - <<set getSlave($AS).fetish = "mindbroken", getSlave($AS).behavioralQuirk = "none", getSlave($AS).behavioralFlaw = "none", getSlave($AS).sexualQuirk = "none", getSlave($AS).sexualFlaw = "none", getSlave($AS).devotion = 0, getSlave($AS).trust = 0>> - <<elseif getSlave($AS).devotion < -50>> - @@.mediumorchid;filled with violent, consuming hatred.@@ Even though $he knew $his baby was destined for a slave orphanage, it seems $he cared for it and views you as its killer. $He is @@.gold;terrified of your power@@ over $his body. - <<set getSlave($AS).trust -= 10, getSlave($AS).devotion -= 25>> - <<elseif getSlave($AS).devotion < -20>> - @@.mediumorchid;afflicted by desperate, inconsolable sobbing.@@ Even though $he knew $his baby was destined for a slave orphanage, it seems $he cared for it. $He is @@.gold;terrified of your power@@ over $his body. - <<set getSlave($AS).trust -= 10, getSlave($AS).devotion -= 10>> - <<elseif getSlave($AS).fetish == "pregnancy">> - @@.mediumorchid;filled with a deep sorrow.@@ To a pregnancy fetishist, having a pregnancy end like this hurts far worse than birth ever would. $He is @@.gold;terrified of a repeat performance.@@ - <<set _fetishModifier = getSlave($AS).fetishStrength/2>> - <<set getSlave($AS).devotion -= 1*_fetishModifier, getSlave($AS).trust -= 1*_fetishModifier>> - <<elseif getSlave($AS).devotion <= 20>> - @@.mediumorchid;consumed by muted weeping and enduring sorrow.@@ Even though $he knew $his baby was destined for a slave orphanage, it seems $he cared for it. $He is @@.gold;terrified of your power@@ over $his body. - <<set getSlave($AS).trust -= 10, getSlave($AS).devotion -= 5>> - <<elseif getSlave($AS).devotion <= 50>> - dully obedient. $He has been broken to slave life so thoroughly that even this is neither surprising nor affecting. $He is @@.gold;terrified of your power@@ over $his body. - <<set getSlave($AS).trust -= 10>> - <<else>> - @@.hotpink;pleased by this stark development,@@ since $he is so attentive to your will. $He also expects $he'll be able to fuck better now. - <<set getSlave($AS).devotion += 4>> - <</if>> -<</if>> - -<<if getSlave($AS).abortionTat > -1>> - <<set getSlave($AS).abortionTat++>> - The temporary tattoo of a child has been replaced with $his <<= ordinalSuffix(getSlave($AS).abortionTat)>> crossed out infant. - <<run cashX(forceNeg($modCost), "slaveMod", getSlave($AS))>> -<</if>> - -<<if lastPregRule(getSlave($AS),$defaultRules)>><<set getSlave($AS).preg = -1>><<else>><<set getSlave($AS).preg = 0>><</if>> - -<<run TerminatePregnancy(getSlave($AS))>> -<<set getSlave($AS).counter.abortions++>> -<<set $abortionsTotal++>> diff --git a/src/npc/interaction/passage/fAnimalImpreg.js b/src/npc/interaction/passage/fAnimalImpreg.js new file mode 100644 index 0000000000000000000000000000000000000000..56ff0874f9144d834e38d2ed4b3b3e09c62b18d2 --- /dev/null +++ b/src/npc/interaction/passage/fAnimalImpreg.js @@ -0,0 +1,66 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {HTMLElement} + */ +App.Interact.fAnimalImpreg = function(slave) { + const node = document.createElement("div"); + let r = []; + let eligibility; + const {him} = getPronouns(slave); + + App.UI.DOM.appendNewElement("h2", node, `Select an eligible animal to knock ${him} up`); + + /* FIXME: this might not work */ + for (const canine of V.canine) { + if (canBreed(getSlave(V.AS), canine)) { + App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link( + `Have a ${canine.species !== "dog" ? canine.species : canine.breed} knock ${him} up`, + () => jQuery(node).empty().append(content(canine)) + )); + eligibility = true; + } + } + for (const hooved of V.hooved) { + if (canBreed(getSlave(V.AS), hooved)) { + App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link( + `Have a ${hooved.species} knock ${him} up`, + () => jQuery(node).empty().append(content(hooved)) + )); + eligibility = true; + } + } + for (const feline of V.feline) { + if (canBreed(getSlave(V.AS), feline)) { + App.UI.DOM.appendNewElement("div", node, App.UI.DOM.link( + `Have a ${feline.species !== "dog" ? feline.species : feline.breed} knock ${him} up`, + () => jQuery(node).empty().append(content(feline)) + )); + eligibility = true; + } + } + if (!eligibility) { + App.UI.DOM.appendNewElement("div", node, `You have no animals capable of inseminating ${him}`, `note`); + } + App.Events.addParagraph(node, r); + return node; + + function content(animal) { + const el = new DocumentFragment(); + r.push(`You have a servant lead the`); + if (animal.species !== "dog" || animal.species !== "cat") { + r.push(animal.species); + } else { + r.push(animal.breed); + } + r.push(`in on a leash and feed him a special treat, one laced with high amounts of aphrodisiacs and vasodilators. They have an effect very rapidly, and the`); + if (animal.species !== "dog" && animal.species !== "cat") { + r.push(`${animal.species}'s`); + } else { + r.push(`${animal.breed}'s`); + } + r.push(`${animal.dickSize} cock quickly stands at attention.`); + + return el; + } +}; diff --git a/src/npc/interaction/passage/fAnimalImpreg.tw b/src/npc/interaction/passage/fAnimalImpreg.tw deleted file mode 100644 index 3132a6973e53927841363eee766c7516434fb0af..0000000000000000000000000000000000000000 --- a/src/npc/interaction/passage/fAnimalImpreg.tw +++ /dev/null @@ -1,46 +0,0 @@ -:: FAnimalImpreg [nobr] - -<<set $nextButton = "Back", $nextLink = "Slave Interact", $impregnatrix = 0, $eligibility = 0>> - -<<set _CL = $canine.length, _HL = $hooved.length, _FL = $feline.length>> - -<br><br> - -__Select an eligible animal to knock $him up:__ - -<br> - -/* FIXME: this might not work */ - -<<for _c = 0; _c < _CL; _c++>> - <<if canBreed(getSlave($AS), $canine[_c])>> - <<if $canine[_c].species != "dog">> - <<set _canine = $canine[_c].species>> - <<else>> - <<set _canine = $canine[_c].breed>> - <</if>> - <br><<link "Have a _canine knock $him up" "FAnimalImpreg Consummate">><<set $impregnatrix = $canine[_c]>><</link>> - <<set $eligibility = 1>> - <</if>> -<</for>> -<<for _h = 0; _h < _HL; _h++>> - <<if canBreed(getSlave($AS), $hooved[_h])>> - <<set _hooved = $hooved[_h].species>> - <br><<link "Have a _hooved knock $him up" "FAnimalImpreg Consummate">><<set $impregnatrix = $hooved[_h]>><</link>> - <<set $eligibility = 1>> - <</if>> -<</for>> -<<for _f = 0; _f < _fL; _f++>> - <<if canBreed(getSlave($AS), $feline[_f])>> - <<if $feline[_f].species != "cat">> - <<set _feline = $feline[_f].species>> - <<else>> - <<set _feline = $feline[_f].breed>> - <</if>> - <br><<link "Have a _feline knock $him up" "FAnimalImpreg Consummate">><<set $impregnatrix = $feline[_f]>><</link>> - <<set $eligibility = 1>> - <</if>> -<</for>> -<<if ($eligibility == 0)>> - //You have no animals capable of inseminating $him.// -<</if>> diff --git a/src/npc/interaction/passage/fAnimalImpregConsummate.tw b/src/npc/interaction/passage/fAnimalImpregConsummate.tw deleted file mode 100644 index f8d8ada254c2427da6b91ba76ba052f47834aaf7..0000000000000000000000000000000000000000 --- a/src/npc/interaction/passage/fAnimalImpregConsummate.tw +++ /dev/null @@ -1,6 +0,0 @@ -:: FAnimalImpreg Consummate [nobr] - -/* TODO: all of this */ - -<<set _animal = $impregnatrix>> -You have a servant lead the <<if _animal.species != "dog" || _animal.species != "cat">><<print _animal.species>><<else>><<print _animal.breed>><</if>> in on a leash and feed him a special treat, one laced with high amounts of aphrodisiacs and vasodilators. They have an effect very rapidly, and the <<if _animal.species != "dog" && _animal.species != "cat">><<print _animal.species>><<else>><<print _animal.breed>><</if>>'s <<print _animal.dickSize>> cock quickly stands at attention. diff --git a/src/npc/interaction/passage/fMarry.js b/src/npc/interaction/passage/fMarry.js index 5116ed69223e4839c601d721307865ffa4c15bf2..b3f185781c359931081bd7bd5377f3d54a203c39 100644 --- a/src/npc/interaction/passage/fMarry.js +++ b/src/npc/interaction/passage/fMarry.js @@ -1,721 +1,775 @@ -new App.DomPassage("FMarry", - () => { - V.nextButton = "Back"; - V.nextLink = "Slave Interact"; - const slave = getSlave(V.AS); - const { - His, He, - his, he, him, himself, wife, girl, women - } = getPronouns(slave); - const {title: Master, say: say} = getEnunciation(slave); - const el = new DocumentFragment(); - let r = []; - const belly = bellyAdjective(slave); - const relSlave = getSlave(slave.relationshipTarget); - const { - he2, him2, his2 - } = getPronouns(relSlave ? relSlave : {pronoun: App.Data.Pronouns.Kind.plural}).appendSuffix("2"); - const { - hisP - } = getPronouns(V.PC).appendSuffix("P"); - const groom = V.PC.title === 1 ? `groom` : `bride`; - const { - HeA, HisA, - heA, hisA, himA, girlA, himselfA, womanA, loliA - } = getPronouns(assistant.pronouns().main).appendSuffix("A"); - const myName = (SlaveStatsChecker.checkForLisp(slave)) ? lispReplace(slave.slaveName) : slave.slaveName; - const playerSurname = (SlaveStatsChecker.checkForLisp(slave)) ? lispReplace(V.PC.slaveSurname) : V.PC.slaveSurname; - let reactionType; - r.push(`You tell ${slave.slaveName} that you're going to marry ${him}. (A proposal, of course, would be inappropriate, even in so enlightened a place as your arcology.)`); - if (slave.fetish === "mindbroken") { - r.push(`${He} doesn't react.`); - reactionType = 0; - } else if (slave.devotion+slave.trust >= 175) { - r.push(`You're not exactly lacking in ways to make`); - if (slave.physicalAge > 30) { - r.push(`${women}`); - } else { - r.push(`${girl}s`); - } - r.push(`burst into tears, but this one is unusually effective. When ${he}'s gotten ${himself} under control again,`); - if (!hasAnyArms(slave)) { - r.push(`looking somewhat embarrassed that ${he} can't wipe ${his} own tears`); - } else { - r.push(`distractedly cuffing away ${his} tears`); - } - r.push(`and consciously breathing deeply,`); - if (canTalk(slave)) { - r.push(`${he} ${say}s,`); - if (slave.relationship !== 0) { - if (slave.relationship === -1) { - r.push(`"I promise I'll try to stop sleeping around so much."`); - } else if (slave.relationship === 4) { - r.push(`"I'll have to break up with ${relSlave.slaveName}... I'll try to let ${him2} down gently, ${he2}'ll understand."`); - } else if (slave.relationship === 3) { - r.push(`"${relSlave.slaveName} will miss having sex with me, but ${he2}'ll understand."`); - } else if (slave.relationship > 0) { - r.push(`"I'll have to stop hanging out with ${relSlave.slaveName}; I'm sure ${he2}'ll understand."`); - } else { - r.push(`"I've been waiting for this day! I'm so happy!"`); - } - r.push(`${He} continues,`); +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {DocumentFragment} + */ +App.Interact.fMarry = function(slave) { + const { + His, He, + his, he, him, himself, wife, girl, women + } = getPronouns(slave); + const {title: Master, say: say} = getEnunciation(slave); + const el = new DocumentFragment(); + let r = []; + const belly = bellyAdjective(slave); + const relSlave = getSlave(slave.relationshipTarget); + const { + he2, him2, his2 + } = getPronouns(relSlave ? relSlave : {pronoun: App.Data.Pronouns.Kind.plural}).appendSuffix("2"); + const { + hisP + } = getPronouns(V.PC).appendSuffix("P"); + const groom = V.PC.title === 1 ? `groom` : `bride`; + const { + HeA, HisA, + heA, hisA, himA, girlA, himselfA, womanA, loliA + } = getPronouns(assistant.pronouns().main).appendSuffix("A"); + const myName = (SlaveStatsChecker.checkForLisp(slave)) ? lispReplace(slave.slaveName) : slave.slaveName; + const playerSurname = (SlaveStatsChecker.checkForLisp(slave)) ? lispReplace(V.PC.slaveSurname) : V.PC.slaveSurname; + let reactionType; + r.push(`You tell ${slave.slaveName} that you're going to marry ${him}. (A proposal, of course, would be inappropriate, even in so enlightened a place as your arcology.)`); + if (slave.fetish === "mindbroken") { + r.push(`${He} doesn't react.`); + reactionType = 0; + } else if (slave.devotion+slave.trust >= 175) { + r.push(`You're not exactly lacking in ways to make`); + if (slave.physicalAge > 30) { + r.push(`${women}`); + } else { + r.push(`${girl}s`); + } + r.push(`burst into tears, but this one is unusually effective. When ${he}'s gotten ${himself} under control again,`); + if (!hasAnyArms(slave)) { + r.push(`looking somewhat embarrassed that ${he} can't wipe ${his} own tears`); + } else { + r.push(`distractedly cuffing away ${his} tears`); + } + r.push(`and consciously breathing deeply,`); + if (canTalk(slave)) { + r.push(`${he} ${say}s,`); + if (slave.relationship !== 0) { + if (slave.relationship === -1) { + r.push(`"I promise I'll try to stop sleeping around so much."`); + } else if (slave.relationship === 4) { + r.push(`"I'll have to break up with ${relSlave.slaveName}... I'll try to let ${him2} down gently, ${he2}'ll understand."`); + } else if (slave.relationship === 3) { + r.push(`"${relSlave.slaveName} will miss having sex with me, but ${he2}'ll understand."`); + } else if (slave.relationship > 0) { + r.push(`"I'll have to stop hanging out with ${relSlave.slaveName}; I'm sure ${he2}'ll understand."`); + } else { + r.push(`"I've been waiting for this day! I'm so happy!"`); } - r.push(`"Thank you, ${Master}. I am going to do my best to be a`); - if (slave.fetishKnown === 1 && slave.fetishStrength > 60) { - if (slave.fetish === "submissive") { - r.push(`perfect submissive ${wife} to you,`); - } else if (slave.fetish === "cumslut") { - r.push(`perfect oral ${wife},`); - } else if (slave.fetish === "humiliation") { - r.push(`hot ${wife} for you,`); - } else if (slave.fetish === "buttslut") { - r.push(`perfect little anal ${wife},`); - } else if (slave.fetish === "boobs") { - if (slave.boobs > 800) { - r.push(`perfect big-boobed`); - } else { - r.push(`perfect-boobed`); - } - r.push(`${wife}`); - } else if (slave.fetish === "pregnancy") { - r.push(`perfect barefoot breeding ${wife},`); - } else if (slave.fetish === "dom") { - r.push(`perfect, you know, sharing ${wife} with other slaves,`); - } else if (slave.fetish === "sadist") { - r.push(`perfect ${wife} to use on other slaves,`); - } else if (slave.fetish === "masochist") { - r.push(`good, beaten ${wife},`); + r.push(`${He} continues,`); + } + r.push(`"Thank you, ${Master}. I am going to do my best to be a`); + if (slave.fetishKnown === 1 && slave.fetishStrength > 60) { + if (slave.fetish === "submissive") { + r.push(`perfect submissive ${wife} to you,`); + } else if (slave.fetish === "cumslut") { + r.push(`perfect oral ${wife},`); + } else if (slave.fetish === "humiliation") { + r.push(`hot ${wife} for you,`); + } else if (slave.fetish === "buttslut") { + r.push(`perfect little anal ${wife},`); + } else if (slave.fetish === "boobs") { + if (slave.boobs > 800) { + r.push(`perfect big-boobed`); } else { - r.push(`good ${wife},`); + r.push(`perfect-boobed`); } + r.push(`${wife}`); + } else if (slave.fetish === "pregnancy") { + r.push(`perfect barefoot breeding ${wife},`); + } else if (slave.fetish === "dom") { + r.push(`perfect, you know, sharing ${wife} with other slaves,`); + } else if (slave.fetish === "sadist") { + r.push(`perfect ${wife} to use on other slaves,`); + } else if (slave.fetish === "masochist") { + r.push(`good, beaten ${wife},`); } else { r.push(`good ${wife},`); } - r.push(`${Master}. Oh, thank you, ${Master}," ${he} blubbers, and starts crying again.`); - } else if (!hasAnyArms(slave)) { - r.push(`${he} painstakingly mouths ${his} thanks, since ${he} cannot speak or use hands to sign.`); - if (slave.relationship !== 0) { - r.push(`${He} struggles to tell you`); - if (slave.relationship === -1) { - r.push(`that ${he}'ll try to be less of a slut.`); - } else if (slave.relationship === 4) { - r.push(`that ${he}'ll try to let ${his} lover ${relSlave.slaveName} down gently.`); - } else if (slave.relationship === 3) { - r.push(`that ${he}'ll try to let ${his} FWB ${relSlave.slaveName} down gently.`); - } else if (slave.relationship > 0) { - r.push(`that ${he}'ll have to stop hanging around ${relSlave.slaveName}.`); - } else { - r.push(`that ${he} has never been happier.`); - } - } } else { - r.push(`${he} shakily signs ${his} thanks twice in a row before breaking down again.`); - if (slave.relationship !== 0) { - r.push(`${He} regains composure enough to continue signing out`); - if (slave.relationship === -1) { - r.push(`that ${he}'ll try to be less of a slut.`); - } else if (slave.relationship === 4) { - r.push(`that ${he}'ll try to let ${his} lover ${relSlave.slaveName} down gently.`); - } else if (slave.relationship === 3) { - r.push(`that ${he}'ll try to let ${his} FWB ${relSlave.slaveName} down gently.`); - } else if (slave.relationship > 0) { - r.push(`that ${he}'ll have to stop hanging around ${relSlave.slaveName}.`); - } else { - r.push(`that ${he} has never been happier.`); - } - } + r.push(`good ${wife},`); } - r.push(`Despite ${his} devotion and trust, ${he} is still a slave, and probably knows that ${his} position could always change. This brings ${him} one step closer to true permanence, and ${he} knows it.`); - reactionType = 1; - } else if (slave.devotion < -20 && slave.trust > 20) { - r.push(`You're not exactly lacking in ways to make`); - if (slave.physicalAge > 30) { - r.push(`${women}`); - } else { - r.push(`${girl}s`); - } - r.push(`burst into tears, but this one is surprisingly effective. It seems ${slave.slaveName} does not want to marry you, if ${his} prolonged, anguished sobbing is anything to go by. However, ${he} would have to be a fool to think there's any way out of it.`); - if (canTalk(slave)) { - r.push(`${He} ${say}s, "Please ${Master}, I don't want to`); - if (slave.fetishKnown === 1 && slave.fetishStrength > 60) { - if (slave.fetish === "submissive") { - r.push(`be your little submissive fucktoy,`); - } else if (slave.fetish === "cumslut") { - r.push(`be your cum sucker,`); - } else if (slave.fetish === "humiliation") { - r.push(`be stripped bare and shown off,`); - } else if (slave.fetish === "buttslut") { - r.push(`have things shoved up my butt,`); - } else if (slave.fetish === "boobs") { - r.push(`have my tits teased every night,`); - } else if (slave.fetish === "pregnancy") { - if (canGetPregnant(slave)) { - r.push(`get knocked up by you,`); - } else { - r.push(`be your pregnant toy,`); - } - } else if (slave.fetish === "dom") { - r.push(`have to rule your sissy dick,`); - } else if (slave.fetish === "sadist") { - r.push(`spank your ass,`); - } else if (slave.fetish === "masochist") { - r.push(`get beaten by you,`); - } else { - r.push(`stay in your nice room,`); - } + r.push(`${Master}. Oh, thank you, ${Master}," ${he} blubbers, and starts crying again.`); + } else if (!hasAnyArms(slave)) { + r.push(`${he} painstakingly mouths ${his} thanks, since ${he} cannot speak or use hands to sign.`); + if (slave.relationship !== 0) { + r.push(`${He} struggles to tell you`); + if (slave.relationship === -1) { + r.push(`that ${he}'ll try to be less of a slut.`); + } else if (slave.relationship === 4) { + r.push(`that ${he}'ll try to let ${his} lover ${relSlave.slaveName} down gently.`); + } else if (slave.relationship === 3) { + r.push(`that ${he}'ll try to let ${his} FWB ${relSlave.slaveName} down gently.`); + } else if (slave.relationship > 0) { + r.push(`that ${he}'ll have to stop hanging around ${relSlave.slaveName}.`); } else { - r.push(`stay in your nice room,`); - } - - r.push(`${Master}. You're a terrible person, ${Master}," ${he} blubbers, and starts crying again.`); - if (slave.relationship !== 0) { - if (slave.relationship === -1) { - r.push(`"I'll never be satisfied by just you!"`); - } else if (slave.relationship === 4) { - r.push(`"I love ${relSlave.slaveName}, not you ${Master}! You'll never be as good as ${him2}!"`); - } else if (slave.relationship === 3) { - r.push(`"But I like having sex with ${relSlave.slaveName}, not you ${Master}! You'll never be ss good as ${him2}!"`); - } else if (slave.relationship > 0) { - r.push(`"But I like spending time with ${relSlave.slaveName}, ${he2}'s so much nicer to be around than you, ${Master}.`); - } else { - r.push(`"I need you in my life, ${Master}, so why don't you bend down like the bitch you are and`); - if (slave.dick > 0) { - r.push(`suck my dick,`); - } else if (slave.vagina > -1) { - r.push(`eat me out,`); - } else { - r.push(`lick my ass,`); - } - r.push(`${Master}?"`); - } - } - } else if (!hasAnyArms(slave)) { - r.push(`${he} painstakingly mouths ${his} displeasure, since ${he} cannot speak or use hands to sign.`); - if (slave.relationship !== 0) { - if (slave.relationship === -1) { - r.push(`${He} desperately tries to explain that you'll never satisfy ${him}.`); - } else if (slave.relationship === 4) { - r.push(`${He} desperately tries to explain that ${his} love, ${relSlave.slaveName}, is better than you'll ever be.`); - } else if (slave.relationship === 3) { - r.push(`${He} desperately tries to explain that ${his} lover, ${relSlave.slaveName}, satisfies ${his} far better than you can.`); - } else if (slave.relationship > 0) { - r.push(`${He} desperately tries to explain ${his} friend, ${relSlave.slaveName}, is so much more enjoyable to be around than you.`); - } else { - r.push(`${He} wiggles ${his} nethers at you, as if trying to tell you to do something.`); - } - } - } else { - r.push(`${he} shakily makes a rather rude hand gesture before crying more.`); - if (slave.relationship !== 0) { - if (slave.relationship === -1) { - r.push(`${He} also makes it clear that you'll never satisfy ${him}.`); - } else if (slave.relationship === 4) { - r.push(`${He} also makes it clear that ${his} love, ${relSlave.slaveName}, is better than you'll ever be.`); - } else if (slave.relationship === 3) { - r.push(`${He} also makes it clear that ${his} lover, ${relSlave.slaveName}, satisfies ${him} far better than you can.`); - } else if (slave.relationship > 0) { - r.push(`${He} also makes it clear ${his} friend, ${relSlave.slaveName}, is so much more enjoyable to be around than you.`); - } else { - r.push(`On top of the prior gesturing, ${he} adds another, lewder one involving you and ${his} crotch.`); - } + r.push(`that ${he} has never been happier.`); } } - r.push(`Despite ${his} "fortune", ${he} is still a slave, and undoubtedly knows that ${his} position could easily change should you tire of ${him}. ${His} tears may not all be genuine either, you have a feeling ${he} may be trying to take advantage of you.`); - reactionType = 2; - } else if (slave.devotion < -20) { - r.push(`You're not exactly lacking in ways to make`); - if (slave.physicalAge > 30) { - r.push(`${women}`); - } else { - r.push(`${girl}s`); + } else { + r.push(`${he} shakily signs ${his} thanks twice in a row before breaking down again.`); + if (slave.relationship !== 0) { + r.push(`${He} regains composure enough to continue signing out`); + if (slave.relationship === -1) { + r.push(`that ${he}'ll try to be less of a slut.`); + } else if (slave.relationship === 4) { + r.push(`that ${he}'ll try to let ${his} lover ${relSlave.slaveName} down gently.`); + } else if (slave.relationship === 3) { + r.push(`that ${he}'ll try to let ${his} FWB ${relSlave.slaveName} down gently.`); + } else if (slave.relationship > 0) { + r.push(`that ${he}'ll have to stop hanging around ${relSlave.slaveName}.`); + } else { + r.push(`that ${he} has never been happier.`); + } } - r.push(`burst into tears, but this one is unusually effective. It seems ${slave.slaveName} does not want to marry you, if ${his} prolonged, anguished sobbing is anything to go by. However, ${he} would have to be a fool to think there's any way out of it. You lean in and whisper that`); + } + r.push(`Despite ${his} devotion and trust, ${he} is still a slave, and probably knows that ${his} position could always change. This brings ${him} one step closer to true permanence, and ${he} knows it.`); + reactionType = 1; + } else if (slave.devotion < -20 && slave.trust > 20) { + r.push(`You're not exactly lacking in ways to make`); + if (slave.physicalAge > 30) { + r.push(`${women}`); + } else { + r.push(`${girl}s`); + } + r.push(`burst into tears, but this one is surprisingly effective. It seems ${slave.slaveName} does not want to marry you, if ${his} prolonged, anguished sobbing is anything to go by. However, ${he} would have to be a fool to think there's any way out of it.`); + if (canTalk(slave)) { + r.push(`${He} ${say}s, "Please ${Master}, I don't want to`); if (slave.fetishKnown === 1 && slave.fetishStrength > 60) { if (slave.fetish === "submissive") { - r.push(`${he}'ll make the perfect submissive ${wife} for you dominate.`); + r.push(`be your little submissive fucktoy,`); } else if (slave.fetish === "cumslut") { - r.push(`${he}'ll make the perfect oral ${wife} for your`); - if (V.PC.dick > 0 && V.PC.vagina >= 0) { - r.push(`dick and pussy`); - } else if (V.PC.dick > 0) { - r.push(`cock`); - } else { - r.push(`pussy`); - } - r.push(`to enjoy.`); + r.push(`be your cum sucker,`); } else if (slave.fetish === "humiliation") { - r.push(`${he}'ll make a hot ${wife} for you to parade around naked.`); + r.push(`be stripped bare and shown off,`); } else if (slave.fetish === "buttslut") { - r.push(`${he}'ll make the perfect little anal ${wife}`); - if (V.PC.dick > 0) { - r.push(`to keep your dick warm.`); - } else { - r.push(`stick things in.`); - } + r.push(`have things shoved up my butt,`); } else if (slave.fetish === "boobs") { - r.push(`${he}'ll make the`); - if (slave.boobs > 800) { - r.push(`perfect big-boobed`); - } else { - r.push(`perfect-boobed`); - } - r.push(`${wife} for you to bury your head into.`); + r.push(`have my tits teased every night,`); } else if (slave.fetish === "pregnancy") { - r.push(`${he}'ll make the perfect barefoot breeding ${wife}.`); - if (V.PC.dick > 0 && canGetPregnant(slave)) { - r.push(`You poke ${him} with your erection, letting ${him} know what ${he}'s in for.`); + if (canGetPregnant(slave)) { + r.push(`get knocked up by you,`); + } else { + r.push(`be your pregnant toy,`); } } else if (slave.fetish === "dom") { - r.push(`${he}'ll make the perfect dominant ${wife} to force upon ${his} closest friends.`); + r.push(`have to rule your sissy dick,`); } else if (slave.fetish === "sadist") { - r.push(`${he}'ll make the perfect cruel ${wife} to force upon ${his} closest friends.`); + r.push(`spank your ass,`); } else if (slave.fetish === "masochist") { - r.push(`${he}'ll make a good, beaten ${wife}.`); + r.push(`get beaten by you,`); } else { - r.push(`${he}'ll make a good ${wife}.`); + r.push(`stay in your nice room,`); } } else { - r.push(`${he}'ll make a good ${wife}.`); + r.push(`stay in your nice room,`); } - if (canTalk(slave)) { - r.push(`"${Master}. Please, ${Master}, don't make me do this. I don't want this!" ${he} blubbers, and starts crying again.`); - if (slave.relationship !== 0) { - if (slave.relationship === -1) { - r.push(`"I need a new dick in me every night! How can I be satisfied like this?!"`); - } else if (slave.relationship === 4) { - r.push(`"I love ${name}! Please don't split us up ${Master}! I'll be a good ${girl}, ${Master}, please!"`); - } else if (slave.relationship === 3) { - r.push(`"I love playing around with ${relSlave.slaveName}! Please don't split us up ${Master}! I'll be a good ${girl}, ${Master}, please!"`); - } else if (slave.relationship > 0) { - r.push(`"But I like spending time with ${relSlave.slaveName}! Please don't split us up ${Master}! I'll be a good ${girl}, ${Master}, please!"`); + + r.push(`${Master}. You're a terrible person, ${Master}," ${he} blubbers, and starts crying again.`); + if (slave.relationship !== 0) { + if (slave.relationship === -1) { + r.push(`"I'll never be satisfied by just you!"`); + } else if (slave.relationship === 4) { + r.push(`"I love ${relSlave.slaveName}, not you ${Master}! You'll never be as good as ${him2}!"`); + } else if (slave.relationship === 3) { + r.push(`"But I like having sex with ${relSlave.slaveName}, not you ${Master}! You'll never be ss good as ${him2}!"`); + } else if (slave.relationship > 0) { + r.push(`"But I like spending time with ${relSlave.slaveName}, ${he2}'s so much nicer to be around than you, ${Master}.`); + } else { + r.push(`"I need you in my life, ${Master}, so why don't you bend down like the bitch you are and`); + if (slave.dick > 0) { + r.push(`suck my dick,`); + } else if (slave.vagina > -1) { + r.push(`eat me out,`); } else { - r.push(`"I need you in my life, ${Master}, but not like this, please?"`); + r.push(`lick my ass,`); } + r.push(`${Master}?"`); } - } else if (!hasAnyArms(slave)) { - r.push(`${He} painstakingly pleads with you, since ${he} cannot speak or use hands to sign.`); - if (slave.relationship !== 0) { - if (slave.relationship === -1) { - r.push(`${He} desperately tries to explain that ${he} needs multiple partners.`); - } else if (slave.relationship === 4) { - r.push(`${He} desperately begs you to not separate ${him} from ${his} love, ${relSlave.slaveName}.`); - } else if (slave.relationship === 3) { - r.push(`${He} desperately begs you to not separate ${him} from ${his} lover, ${relSlave.slaveName}.`); - } else if (slave.relationship > 0) { - r.push(`${He} desperately begs you to not separate ${him} from ${his} friend, ${relSlave.slaveName}.`); - } else { - r.push(`${He} desperately begs you to not marry ${him}, despite ${his} emotional connection with you.`); - } + } + } else if (!hasAnyArms(slave)) { + r.push(`${he} painstakingly mouths ${his} displeasure, since ${he} cannot speak or use hands to sign.`); + if (slave.relationship !== 0) { + if (slave.relationship === -1) { + r.push(`${He} desperately tries to explain that you'll never satisfy ${him}.`); + } else if (slave.relationship === 4) { + r.push(`${He} desperately tries to explain that ${his} love, ${relSlave.slaveName}, is better than you'll ever be.`); + } else if (slave.relationship === 3) { + r.push(`${He} desperately tries to explain that ${his} lover, ${relSlave.slaveName}, satisfies ${his} far better than you can.`); + } else if (slave.relationship > 0) { + r.push(`${He} desperately tries to explain ${his} friend, ${relSlave.slaveName}, is so much more enjoyable to be around than you.`); + } else { + r.push(`${He} wiggles ${his} nethers at you, as if trying to tell you to do something.`); } + } + } else { + r.push(`${he} shakily makes a rather rude hand gesture before crying more.`); + if (slave.relationship !== 0) { + if (slave.relationship === -1) { + r.push(`${He} also makes it clear that you'll never satisfy ${him}.`); + } else if (slave.relationship === 4) { + r.push(`${He} also makes it clear that ${his} love, ${relSlave.slaveName}, is better than you'll ever be.`); + } else if (slave.relationship === 3) { + r.push(`${He} also makes it clear that ${his} lover, ${relSlave.slaveName}, satisfies ${him} far better than you can.`); + } else if (slave.relationship > 0) { + r.push(`${He} also makes it clear ${his} friend, ${relSlave.slaveName}, is so much more enjoyable to be around than you.`); + } else { + r.push(`On top of the prior gesturing, ${he} adds another, lewder one involving you and ${his} crotch.`); + } + } + } + r.push(`Despite ${his} "fortune", ${he} is still a slave, and undoubtedly knows that ${his} position could easily change should you tire of ${him}. ${His} tears may not all be genuine either, you have a feeling ${he} may be trying to take advantage of you.`); + reactionType = 2; + } else if (slave.devotion < -20) { + r.push(`You're not exactly lacking in ways to make`); + if (slave.physicalAge > 30) { + r.push(`${women}`); + } else { + r.push(`${girl}s`); + } + r.push(`burst into tears, but this one is unusually effective. It seems ${slave.slaveName} does not want to marry you, if ${his} prolonged, anguished sobbing is anything to go by. However, ${he} would have to be a fool to think there's any way out of it. You lean in and whisper that`); + if (slave.fetishKnown === 1 && slave.fetishStrength > 60) { + if (slave.fetish === "submissive") { + r.push(`${he}'ll make the perfect submissive ${wife} for you dominate.`); + } else if (slave.fetish === "cumslut") { + r.push(`${he}'ll make the perfect oral ${wife} for your`); + if (V.PC.dick > 0 && V.PC.vagina >= 0) { + r.push(`dick and pussy`); + } else if (V.PC.dick > 0) { + r.push(`cock`); + } else { + r.push(`pussy`); + } + r.push(`to enjoy.`); + } else if (slave.fetish === "humiliation") { + r.push(`${he}'ll make a hot ${wife} for you to parade around naked.`); + } else if (slave.fetish === "buttslut") { + r.push(`${he}'ll make the perfect little anal ${wife}`); + if (V.PC.dick > 0) { + r.push(`to keep your dick warm.`); + } else { + r.push(`stick things in.`); + } + } else if (slave.fetish === "boobs") { + r.push(`${he}'ll make the`); + if (slave.boobs > 800) { + r.push(`perfect big-boobed`); + } else { + r.push(`perfect-boobed`); + } + r.push(`${wife} for you to bury your head into.`); + } else if (slave.fetish === "pregnancy") { + r.push(`${he}'ll make the perfect barefoot breeding ${wife}.`); + if (V.PC.dick > 0 && canGetPregnant(slave)) { + r.push(`You poke ${him} with your erection, letting ${him} know what ${he}'s in for.`); + } + } else if (slave.fetish === "dom") { + r.push(`${he}'ll make the perfect dominant ${wife} to force upon ${his} closest friends.`); + } else if (slave.fetish === "sadist") { + r.push(`${he}'ll make the perfect cruel ${wife} to force upon ${his} closest friends.`); + } else if (slave.fetish === "masochist") { + r.push(`${he}'ll make a good, beaten ${wife}.`); } else { - r.push(`${He} desperately struggles to plead with you before breaking down again.`); - if (slave.relationship !== 0) { - if (slave.relationship === -1) { - r.push(`${He} tries to explain that ${he} needs multiple partners.`); - } else if (slave.relationship === 4) { - r.push(`${He} begs you to not separate ${him} from ${his} love, ${relSlave.slaveName}.`); - } else if (slave.relationship === 3) { - r.push(`${He} begs you to not separate ${him} from ${his} lover, ${relSlave.slaveName}.`); - } else if (slave.relationship > 0) { - r.push(`${He} begs you to not separate ${him} from ${his} friend, ${relSlave.slaveName}.`); - } else { - r.push(`${He} begs you to not marry ${him}, despite ${his} emotional connection with you.`); - } + r.push(`${he}'ll make a good ${wife}.`); + } + } else { + r.push(`${he}'ll make a good ${wife}.`); + } + if (canTalk(slave)) { + r.push(`"${Master}. Please, ${Master}, don't make me do this. I don't want this!" ${he} blubbers, and starts crying again.`); + if (slave.relationship !== 0) { + if (slave.relationship === -1) { + r.push(`"I need a new dick in me every night! How can I be satisfied like this?!"`); + } else if (slave.relationship === 4) { + r.push(`"I love ${name}! Please don't split us up ${Master}! I'll be a good ${girl}, ${Master}, please!"`); + } else if (slave.relationship === 3) { + r.push(`"I love playing around with ${relSlave.slaveName}! Please don't split us up ${Master}! I'll be a good ${girl}, ${Master}, please!"`); + } else if (slave.relationship > 0) { + r.push(`"But I like spending time with ${relSlave.slaveName}! Please don't split us up ${Master}! I'll be a good ${girl}, ${Master}, please!"`); + } else { + r.push(`"I need you in my life, ${Master}, but not like this, please?"`); + } + } + } else if (!hasAnyArms(slave)) { + r.push(`${He} painstakingly pleads with you, since ${he} cannot speak or use hands to sign.`); + if (slave.relationship !== 0) { + if (slave.relationship === -1) { + r.push(`${He} desperately tries to explain that ${he} needs multiple partners.`); + } else if (slave.relationship === 4) { + r.push(`${He} desperately begs you to not separate ${him} from ${his} love, ${relSlave.slaveName}.`); + } else if (slave.relationship === 3) { + r.push(`${He} desperately begs you to not separate ${him} from ${his} lover, ${relSlave.slaveName}.`); + } else if (slave.relationship > 0) { + r.push(`${He} desperately begs you to not separate ${him} from ${his} friend, ${relSlave.slaveName}.`); + } else { + r.push(`${He} desperately begs you to not marry ${him}, despite ${his} emotional connection with you.`); } } - r.push(`You leave ${him} to weep and consider ${his} fate. Despite ${his} "fortune", ${he} is still a slave, and undoubtedly knows that ${his} position could easily change should you tire of ${him}.`); - reactionType = 2; } else { - r.push(`${He} doesn't really react to this. By no means does ${he} want to be your ${wife}, but ${he}'s obedient enough to know that you are in charge. You leave ${him} to ${his} business, and go back to yours.`); + r.push(`${He} desperately struggles to plead with you before breaking down again.`); if (slave.relationship !== 0) { if (slave.relationship === -1) { - r.push(`${He} sighs at the realization that ${he} won't be allowed to be so promiscuous and will have to learn to focus ${his} attention on you.`); + r.push(`${He} tries to explain that ${he} needs multiple partners.`); } else if (slave.relationship === 4) { - r.push(`${He} sighs at the realization that ${he}'ll have to stop seeing ${his} love, ${relSlave.slaveName}.`); + r.push(`${He} begs you to not separate ${him} from ${his} love, ${relSlave.slaveName}.`); } else if (slave.relationship === 3) { - r.push(`${He} sighs at the realization that ${he}'ll have to stop spending so much time with ${his} lover, ${relSlave.slaveName}.`); + r.push(`${He} begs you to not separate ${him} from ${his} lover, ${relSlave.slaveName}.`); } else if (slave.relationship > 0) { - r.push(`${He} sighs at the realization that ${he}'ll have to stop spending so much time with ${his} friend, ${relSlave.slaveName}.`); + r.push(`${He} begs you to not separate ${him} from ${his} friend, ${relSlave.slaveName}.`); } else { - r.push(`Deep down, ${he} dreamed of this. But now that it's happening ${he} can't shake the feeling of regret.`); + r.push(`${He} begs you to not marry ${him}, despite ${his} emotional connection with you.`); } } - reactionType = 3; } - App.Events.addParagraph(el, r); - r = []; + r.push(`You leave ${him} to weep and consider ${his} fate. Despite ${his} "fortune", ${he} is still a slave, and undoubtedly knows that ${his} position could easily change should you tire of ${him}.`); + reactionType = 2; + } else { + r.push(`${He} doesn't really react to this. By no means does ${he} want to be your ${wife}, but ${he}'s obedient enough to know that you are in charge. You leave ${him} to ${his} business, and go back to yours.`); + if (slave.relationship !== 0) { + if (slave.relationship === -1) { + r.push(`${He} sighs at the realization that ${he} won't be allowed to be so promiscuous and will have to learn to focus ${his} attention on you.`); + } else if (slave.relationship === 4) { + r.push(`${He} sighs at the realization that ${he}'ll have to stop seeing ${his} love, ${relSlave.slaveName}.`); + } else if (slave.relationship === 3) { + r.push(`${He} sighs at the realization that ${he}'ll have to stop spending so much time with ${his} lover, ${relSlave.slaveName}.`); + } else if (slave.relationship > 0) { + r.push(`${He} sighs at the realization that ${he}'ll have to stop spending so much time with ${his} friend, ${relSlave.slaveName}.`); + } else { + r.push(`Deep down, ${he} dreamed of this. But now that it's happening ${he} can't shake the feeling of regret.`); + } + } + reactionType = 3; + } + App.Events.addParagraph(el, r); + r = []; + + r.push(`${capFirstChar(V.assistant.name)} prompts you for wedding`); + if (V.assistant.personality <= 0) { + r.push(`instructions.`); + } else { + r.push(`instructions, ${hisA}`); + if (V.assistant.appearance === "monstergirl") { + r.push(`monster${girlA} avatar appearing in a surprisingly conventional surplice that covers ${himA} up decently. All except for hisA horns, which protrude from under the headpiece.`); + } else if (V.assistant.appearance === "shemale") { + r.push(`shemale avatar appears in a collar patterned to look like a minister's, and absolutely nothing else, stroking ${himselfA} with anticipation.`); + } else if (V.assistant.appearance === "amazon") { + r.push(`amazon avatar wearing a tribal shaman's cape and carrying a medicine stick adorned with all sorts of little charms and baubles.`); + } else if (V.assistant.appearance === "businesswoman") { + r.push(`business${womanA} avatar looking rather severe in a minister's collar.`); + } else if (V.assistant.appearance === "fairy") { + r.push(`fairy avatar looking incredibly silly, dressed in an oversized, disheveled priest's robes and looking rather smug about it.`); + } else if (V.assistant.appearance === "pregnant fairy") { + r.push(`fairy avatar looking incredibly silly, dressed in an oversized, disheveled priest's robes stretched tight by ${hisA} pregnant belly and looking rather smug about it.`); + } else if (V.assistant.appearance === "goddess") { + r.push(`goddess avatar completely unchanged, since ${heA} considers hisA usual form perfectly appropriate for a marriage.`); + } else if (V.assistant.appearance === "hypergoddess") { + r.push(`goddess avatar completely unchanged, since ${heA} considers hisA usual form perfectly appropriate for a marriage.`); + } else if (V.assistant.appearance === "loli") { + r.push(`${loliA} avatar looking surprisingly mature in a minister's collar. Though, ${heA} would rather be the flower ${girlA} in this wedding.`); + } else if (V.assistant.appearance === "preggololi") { + r.push(`${loliA} avatar looking surprisingly mature in a minister's collar. Though, heA would rather be the flower ${girlA} in this wedding.`); + } else if (V.assistant.appearance === "schoolgirl") { + r.push(`school${girlA} avatar looking willfully absurd in a minister's collar and ${hisA} usual short plaid skirt.`); + } else if (V.assistant.appearance === "angel") { + r.push(`angelic avatar looking, well, angelic in ${hisA} usual garb with an added minister's collar.`); + } else if (V.assistant.appearance === "cherub") { + r.push(`angelic avatar looking absurd in ${hisA} oversized robe, complete with wing-holes, and minister's collar.`); + } else if (V.assistant.appearance === "incubus") { + r.push(`demonic avatar completely unchanged, since ${heA} considers hisA usual form perfectly appropriate for a marriage, though heA has made sure to be fully erect for the wedding.`); + } else if (V.assistant.appearance === "succubus") { + r.push(`demonic avatar wearing nothing but a minister's collar. ${HeA} has brought several marital aids along with himA to tease the bride and groom with.`); + } else if (V.assistant.appearance === "imp") { + r.push(`demonic avatar looking absurd in ${hisA} oversized robe, complete with wing-holes, and minister's collar.`); + } else if (V.assistant.appearance === "witch") { + r.push(`witchy avatar looking rather formal in a fine robe and minister's collar.`); + } else if (V.assistant.appearance === "ERROR_1606_APPEARANCE_FILE_CORRUPT") { + r.push(`twitching avatar completely unchanged, sans a bulbous ring of flesh around ${hisA} neck that sort of resembles a minister's collar.`); + } else { + r.push(`symbol appearing in white.`); + } + } + App.Events.addParagraph(el, r); + const planned = () => { + if (V.weddingPlanned === 1) { + return `a straightforward ceremony`; + } else if (V.weddingPlanned === 2) { + return `an orgiastic ceremony`; + } else if (V.weddingPlanned === 3) { + return `an impregnation ceremony`; + } + }; - r.push(`${capFirstChar(V.assistant.name)} prompts you for wedding`); + const events = [ + new App.Events.Result(`Just redesignate ${him} as your slave wife`, designate), + new App.Events.Result(`Have your assistant marry ${him} to you`, marryNow), + ]; + events.push(new App.Events.Result(null, null, `Invite prominent citizens to a wedding: `)); + if (V.cash > 10000) { + if (V.weddingPlanned === 0 || V.weddingPlanned === 1) { + events.push(new App.Events.Result(`Straightforward ceremony`, straightforward, `This will cost ${cashFormat(10000)}`)); + } else { + events.push(new App.Events.Result(null, null, `You are already hosting ${planned()} and cannot host a straightforward ceremony`)); + } + if (slave.vagina !== 0 && slave.anus !== 0) { + if (V.weddingPlanned === 0 || V.weddingPlanned === 2) { + events.push(new App.Events.Result(`Orgiastic ceremony`, orgiastic, `This will involve the slave having sex with a very large number of citizens, and will cost ${cashFormat(10000)}`)); + } else { + events.push(new App.Events.Result(null, null, `You are already hosting ${planned()} and cannot host an orgiastic ceremony`)); + } + } + if (isFertile(slave) && V.PC.dick !== 0) { + if (V.weddingPlanned === 0 || V.weddingPlanned === 3) { + events.push(new App.Events.Result(`Impregnation ceremony`, impregnation, `This will involve you impregnating the slave, and will cost ${cashFormat(10000)}`)); + } else { + events.push(new App.Events.Result(null, null, `You are already hosting ${planned()} and cannot host an impregnation ceremony`)); + } + } + } else { + events.push(new App.Events.Result(null, null, `You cannot afford an elaborate ceremony`)); + } + App.Events.addResponses(el, events); + return el; + + function designate() { + let r = []; + const el = new DocumentFragment(); + r.push(`You order ${V.assistant.name} to simply redesignate ${slave.slaveName} as your slave ${wife}.`); if (V.assistant.personality <= 0) { - r.push(`instructions.`); + r.push(`"Slave redesignated," it responds immediately. The thing is done.`); } else { - r.push(`instructions, ${hisA}`); if (V.assistant.appearance === "monstergirl") { - r.push(`monster${girlA} avatar appearing in a surprisingly conventional surplice that covers ${himA} up decently. All except for hisA horns, which protrude from under the headpiece.`); + r.push(`${HisA} avatar snaps ${hisA} fingers and shrugs off ${hisA} surplice, revealing ${hisA} tentacle hair, pale skin, and cocks once more.`); } else if (V.assistant.appearance === "shemale") { - r.push(`shemale avatar appears in a collar patterned to look like a minister's, and absolutely nothing else, stroking ${himselfA} with anticipation.`); + r.push(`${HisA} avatar snaps ${hisA} fingers and starts to masturbate more energetically.`); } else if (V.assistant.appearance === "amazon") { - r.push(`amazon avatar wearing a tribal shaman's cape and carrying a medicine stick adorned with all sorts of little charms and baubles.`); + r.push(`${HisA} avatar gives ${hisA} medicine stick a shake.`); } else if (V.assistant.appearance === "businesswoman") { - r.push(`business${womanA} avatar looking rather severe in a minister's collar.`); - } else if (V.assistant.appearance === "fairy") { - r.push(`fairy avatar looking incredibly silly, dressed in an oversized, disheveled priest's robes and looking rather smug about it.`); - } else if (V.assistant.appearance === "pregnant fairy") { - r.push(`fairy avatar looking incredibly silly, dressed in an oversized, disheveled priest's robes stretched tight by ${hisA} pregnant belly and looking rather smug about it.`); - } else if (V.assistant.appearance === "goddess") { - r.push(`goddess avatar completely unchanged, since ${heA} considers hisA usual form perfectly appropriate for a marriage.`); - } else if (V.assistant.appearance === "hypergoddess") { - r.push(`goddess avatar completely unchanged, since ${heA} considers hisA usual form perfectly appropriate for a marriage.`); - } else if (V.assistant.appearance === "loli") { - r.push(`${loliA} avatar looking surprisingly mature in a minister's collar. Though, ${heA} would rather be the flower ${girlA} in this wedding.`); - } else if (V.assistant.appearance === "preggololi") { - r.push(`${loliA} avatar looking surprisingly mature in a minister's collar. Though, heA would rather be the flower ${girlA} in this wedding.`); + r.push(`${HisA} avatar snaps ${hisA} fingers.`); + } else if (V.assistant.appearance.includes("fairy")) { + r.push(`${HisA} avatar claps ${hisA} hands twice, looking a bit disappointed at the lack of celebration.`); + } else if (V.assistant.appearance.includes("goddess")) { + r.push(`${HisA} avatar makes a complex hand gesture, looking beatific.`); + } else if (V.assistant.appearance.includes("loli")) { + r.push(`${HisA} avatar claps ${hisA} hands together.`); } else if (V.assistant.appearance === "schoolgirl") { - r.push(`school${girlA} avatar looking willfully absurd in a minister's collar and ${hisA} usual short plaid skirt.`); + r.push(`${HisA} avatar snaps ${hisA} fingers and gives a little twirl.`); } else if (V.assistant.appearance === "angel") { - r.push(`angelic avatar looking, well, angelic in ${hisA} usual garb with an added minister's collar.`); + r.push(`${HisA} avatar spreads ${hisA} wings and arms and emits a flash of light.`); } else if (V.assistant.appearance === "cherub") { - r.push(`angelic avatar looking absurd in ${hisA} oversized robe, complete with wing-holes, and minister's collar.`); + r.push(`${HisA} avatar claps ${hisA} hands together, emitting a burst of light.`); } else if (V.assistant.appearance === "incubus") { - r.push(`demonic avatar completely unchanged, since ${heA} considers hisA usual form perfectly appropriate for a marriage, though heA has made sure to be fully erect for the wedding.`); + r.push(`${HisA} avatar flicks the tip of ${hisA} penis and blows ${hisA} load towards the both of you.`); } else if (V.assistant.appearance === "succubus") { - r.push(`demonic avatar wearing nothing but a minister's collar. ${HeA} has brought several marital aids along with himA to tease the bride and groom with.`); + r.push(`${HisA} avatar starts to masturbate furiously and orgasms lewdly.`); } else if (V.assistant.appearance === "imp") { - r.push(`demonic avatar looking absurd in ${hisA} oversized robe, complete with wing-holes, and minister's collar.`); + r.push(`${HisA} avatar claps ${hisA} hands together, emitting a burst of darkness.`); } else if (V.assistant.appearance === "witch") { - r.push(`witchy avatar looking rather formal in a fine robe and minister's collar.`); + r.push(`${HisA} avatar pulls out ${hisA} spell book and attempts a spell to bind you two; heA manages to conjure a large ring around himselfA, pinning ${hisA} arms to ${hisA} sides.`); } else if (V.assistant.appearance === "ERROR_1606_APPEARANCE_FILE_CORRUPT") { - r.push(`twitching avatar completely unchanged, sans a bulbous ring of flesh around ${hisA} neck that sort of resembles a minister's collar.`); + r.push(`${HisA} avatar splits open to reveal a number of tentacles and wraps them around each other.`); } else { - r.push(`symbol appearing in white.`); + r.push(`${HisA} symbol flashes.`); } + r.push(`"Done," heA says.`); } - App.Events.addParagraph(el, r); - const planned = () => { - if (V.weddingPlanned === 1) { - return `a straightforward ceremony`; - } else if (V.weddingPlanned === 2) { - return `an orgiastic ceremony`; - } else if (V.weddingPlanned === 3) { - return `an impregnation ceremony`; - } - }; - - const events = [ - new App.Events.Result(`Just redesignate ${him} as your slave wife`, designate), - new App.Events.Result(`Have your assistant marry ${him} to you`, marryNow), - ]; - events.push(new App.Events.Result(null, null, `Invite prominent citizens to a wedding: `)); - if (V.cash > 10000) { - if (V.weddingPlanned === 0 || V.weddingPlanned === 1) { - events.push(new App.Events.Result(`Straightforward ceremony`, straightforward, `This will cost ${cashFormat(10000)}`)); - } else { - events.push(new App.Events.Result(null, null, `You are already hosting ${planned()} and cannot host a straightforward ceremony`)); - } - if (slave.vagina !== 0 && slave.anus !== 0) { - if (V.weddingPlanned === 0 || V.weddingPlanned === 2) { - events.push(new App.Events.Result(`Orgiastic ceremony`, orgiastic, `This will involve the slave having sex with a very large number of citizens, and will cost ${cashFormat(10000)}`)); + if (slave.relationship > 0) { + slave.relationshipTarget = 0; + relSlave.relationship = 0; + relSlave.relationshipTarget = 0; + } + if (slave.devotion+slave.trust >= 175) { + if (slave.relationship > 0) { + r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">disappointed</span> that their relationship had to end and <span class="gold">worry</span> for each other's future.`); + if (slave.relationship === 4) { + relSlave.devotion -= 5; + relSlave.trust -= 5; + } else if (slave.relationship === 3) { + relSlave.devotion -= 3; + relSlave.trust -= 3; } else { - events.push(new App.Events.Result(null, null, `You are already hosting ${planned()} and cannot host an orgiastic ceremony`)); + relSlave.devotion -= 1; + relSlave.trust -= 1; } } - if (isFertile(slave) && V.PC.dick !== 0) { - if (V.weddingPlanned === 0 || V.weddingPlanned === 3) { - events.push(new App.Events.Result(`Impregnation ceremony`, impregnation, `This will involve you impregnating the slave, and will cost ${cashFormat(10000)}`)); - } else { - events.push(new App.Events.Result(null, null, `You are already hosting ${planned()} and cannot host an impregnation ceremony`)); - } + } else if (slave.devotion < -20) { + if (slave.relationship === -1) { + r.push(`${He} <span class="mediumorchid">hates</span> that ${he} has to be yours only and <span class="gold">fears</span> what will happen if ${he} strays.`); + slave.devotion -= 40; + slave.trust -= 40; + } else if (slave.relationship === 4) { + r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">fear</span> for each other's future.`); + relSlave.devotion -= 40; + relSlave.trust -= 40; + slave.devotion -= 40; + slave.trust -= 40; + } else if (slave.relationship === 3) { + r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">fear</span> for each other's future.`); + relSlave.devotion -= 30; + relSlave.trust -= 30; + slave.devotion -= 30; + slave.trust -= 30; + } else if (slave.relationship > 0) { + r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">fear</span> for each other's future.`); + relSlave.devotion -= 20; + relSlave.trust -= 20; + slave.devotion -= 20; + slave.trust -= 20; } } else { - events.push(new App.Events.Result(null, null, `You cannot afford an elaborate ceremony`)); + if (slave.relationship === -1) { + r.push(`${He} <span class="mediumorchid">dislikes</span> that ${he} has to be yours only and <span class="gold">worries</span> what will happen if ${he} strays.`); + slave.devotion -= 10; + slave.trust -= 10; + } else if (slave.relationship === 4) { + r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">worry</span> for each other.`); + relSlave.devotion -= 20; + relSlave.trust -= 20; + slave.devotion -= 20; + slave.trust -= 20; + } else if (slave.relationship === 3) { + r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">are saddened</span> that their relationship had to end and <span class="gold">worry</span> for each other.`); + relSlave.devotion -= 10; + relSlave.trust -= 10; + slave.devotion -= 10; + slave.trust -= 10; + } else if (slave.relationship > 0) { + r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">are disappointed</span> that their relationship had to end and <span class="gold">worry</span> for each other.`); + relSlave.devotion -= 5; + relSlave.trust -= 5; + slave.devotion -= 5; + slave.trust -= 5; + } } - App.Events.addResponses(el, events); - return el; - - function designate() { - let r = []; - const el = new DocumentFragment(); - r.push(`You order ${V.assistant.name} to simply redesignate ${slave.slaveName} as your slave ${wife}.`); - if (V.assistant.personality <= 0) { - r.push(`"Slave redesignated," it responds immediately. The thing is done.`); - } else { - if (V.assistant.appearance === "monstergirl") { - r.push(`${HisA} avatar snaps ${hisA} fingers and shrugs off ${hisA} surplice, revealing ${hisA} tentacle hair, pale skin, and cocks once more.`); - } else if (V.assistant.appearance === "shemale") { - r.push(`${HisA} avatar snaps ${hisA} fingers and starts to masturbate more energetically.`); - } else if (V.assistant.appearance === "amazon") { - r.push(`${HisA} avatar gives ${hisA} medicine stick a shake.`); - } else if (V.assistant.appearance === "businesswoman") { - r.push(`${HisA} avatar snaps ${hisA} fingers.`); - } else if (V.assistant.appearance.includes("fairy")) { - r.push(`${HisA} avatar claps ${hisA} hands twice, looking a bit disappointed at the lack of celebration.`); - } else if (V.assistant.appearance.includes("goddess")) { - r.push(`${HisA} avatar makes a complex hand gesture, looking beatific.`); - } else if (V.assistant.appearance.includes("loli")) { - r.push(`${HisA} avatar claps ${hisA} hands together.`); - } else if (V.assistant.appearance === "schoolgirl") { - r.push(`${HisA} avatar snaps ${hisA} fingers and gives a little twirl.`); - } else if (V.assistant.appearance === "angel") { - r.push(`${HisA} avatar spreads ${hisA} wings and arms and emits a flash of light.`); - } else if (V.assistant.appearance === "cherub") { - r.push(`${HisA} avatar claps ${hisA} hands together, emitting a burst of light.`); - } else if (V.assistant.appearance === "incubus") { - r.push(`${HisA} avatar flicks the tip of ${hisA} penis and blows ${hisA} load towards the both of you.`); - } else if (V.assistant.appearance === "succubus") { - r.push(`${HisA} avatar starts to masturbate furiously and orgasms lewdly.`); - } else if (V.assistant.appearance === "imp") { - r.push(`${HisA} avatar claps ${hisA} hands together, emitting a burst of darkness.`); - } else if (V.assistant.appearance === "witch") { - r.push(`${HisA} avatar pulls out ${hisA} spell book and attempts a spell to bind you two; heA manages to conjure a large ring around himselfA, pinning ${hisA} arms to ${hisA} sides.`); - } else if (V.assistant.appearance === "ERROR_1606_APPEARANCE_FILE_CORRUPT") { - r.push(`${HisA} avatar splits open to reveal a number of tentacles and wraps them around each other.`); + slave.relationship = -3; + App.Events.addParagraph(el, r); + if (V.PC.slaveSurname && slave.slaveSurname !== V.PC.slaveSurname) { + App.Events.addResponses(el, [new App.Events.Result(`Give ${him} your surname`, () => { + const el = new DocumentFragment(); + const r = []; + slave.slaveSurname = V.PC.slaveSurname; + r.push(`You also command ${V.assistant.name} to rename your new slave wife ${slave.slaveName} ${slave.slaveSurname}.`); + if (slave.fetish === "mindbroken") { + r.push(`The new Mrs. ${slave.slaveSurname}`); + if (canHear(slave)) { + r.push(`hears`); + } else { + r.push(`understands`); + } + r.push(`this, of course, and shows no reaction. Like many things, names mean nothing to ${him} now.`); + } else if (slave.devotion+slave.trust >= 175) { + r.push(`The new Mrs. ${slave.slaveSurname}`); + if (canHear(slave)) { + r.push(`hears`); + } else { + r.push(`understands`); + } + r.push(`this, of course, and breaks down again. Being brusquely redesignated as your slave ${wife} was such a sterile experience that ${he} wasn't sure it was real, and hearing that ${he}'s to take your surname <span class="mediumaquamarine">reassures ${him}</span> that it is. Not to mention, ${he} might be a ${SlaveTitle(slave)}, but ${he}'s still a ${girl}, and hearing that ${he} wouldn't get a decent wedding did disappoint ${him}, but this makes up for it. You might not be all that expressive, but <span class="hotpink">${he}'s your wife,</span> and that's what matters to ${him}.`); + slave.devotion += 5; + slave.trust += 5; + } else if (slave.devotion < -20 && slave.trust > 20) { + r.push(`The new Mrs. ${slave.slaveSurname}`); + if (canHear(slave)) { + r.push(`hears`); + } else { + r.push(`understands`); + } + r.push(`this, of course, and scoffs audibly. <span class="mediumorchid">${He}'ll remember ${his} name, even if you try to take it away.</span> ${He} can't hide <span class="mediumorchid">${his} annoyance</span> that you couldn't even spring for a fancy wedding.`); + slave.devotion -= 10; + } else if (slave.devotion < -20) { + r.push(`The new Mrs. ${slave.slaveSurname}`); + if (canHear(slave)) { + r.push(`hears`); + } else { + r.push(`understands`); + } + r.push(`this, of course, and breaks down again. Not only have you taken ${his} hand, but now also ${his} name; <span class="hotpink">${he}'s yours now,</span> nothing ${he} thinks can change that.`); + slave.devotion += 5; } else { - r.push(`${HisA} symbol flashes.`); - } - r.push(`"Done," heA says.`); - } - if (slave.relationship > 0) { - slave.relationshipTarget = 0; - relSlave.relationship = 0; - relSlave.relationshipTarget = 0; - } - if (slave.devotion+slave.trust >= 175) { - if (slave.relationship > 0) { - r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">disappointed</span> that their relationship had to end and <span class="gold">worry</span> for each other's future.`); - if (slave.relationship === 4) { - relSlave.devotion -= 5; - relSlave.trust -= 5; - } else if (slave.relationship === 3) { - relSlave.devotion -= 3; - relSlave.trust -= 3; + r.push(`The new Mrs. ${slave.slaveSurname}`); + if (canHear(slave)) { + r.push(`hears`); } else { - relSlave.devotion -= 1; - relSlave.trust -= 1; + r.push(`understands`); } + r.push(`this, of course, and nods acceptingly. Being trusted with your surname <span class="mediumaquamarine">reassures ${him}</span> that ${he} must mean something to you, though ${he} is a <span class="mediumorchid">little disappointed</span> by the lack of a wedding, however.`); + slave.devotion--; + slave.trust += 5; } - } else if (slave.devotion < -20) { - if (slave.relationship === -1) { - r.push(`${He} <span class="mediumorchid">hates</span> that ${he} has to be yours only and <span class="gold">fears</span> what will happen if ${he} strays.`); - slave.devotion -= 40; - slave.trust -= 40; - } else if (slave.relationship === 4) { - r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">fear</span> for each other's future.`); - relSlave.devotion -= 40; - relSlave.trust -= 40; - slave.devotion -= 40; - slave.trust -= 40; - } else if (slave.relationship === 3) { - r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">fear</span> for each other's future.`); - relSlave.devotion -= 30; - relSlave.trust -= 30; - slave.devotion -= 30; - slave.trust -= 30; - } else if (slave.relationship > 0) { - r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">fear</span> for each other's future.`); - relSlave.devotion -= 20; - relSlave.trust -= 20; - slave.devotion -= 20; - slave.trust -= 20; - } + App.Events.addParagraph(el, r); + return el; + })]); + } + + return el; + } + + function marryNow() { + let r = []; + const el = new DocumentFragment(); + r.push(`You order ${slave.slaveName} to go change into bridal lingerie.`); + if (reactionType === 0) { + if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { + r.push(`${He} hurries off, still crying. When ${he} returns, ${he}'s wearing`); } else { - if (slave.relationship === -1) { - r.push(`${He} <span class="mediumorchid">dislikes</span> that ${he} has to be yours only and <span class="gold">worries</span> what will happen if ${he} strays.`); - slave.devotion -= 10; - slave.trust -= 10; - } else if (slave.relationship === 4) { - r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">worry</span> for each other.`); - relSlave.devotion -= 20; - relSlave.trust -= 20; - slave.devotion -= 20; - slave.trust -= 20; - } else if (slave.relationship === 3) { - r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">are saddened</span> that their relationship had to end and <span class="gold">worry</span> for each other.`); - relSlave.devotion -= 10; - relSlave.trust -= 10; - slave.devotion -= 10; - slave.trust -= 10; - } else if (slave.relationship > 0) { - r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">are disappointed</span> that their relationship had to end and <span class="gold">worry</span> for each other.`); - relSlave.devotion -= 5; - relSlave.trust -= 5; - slave.devotion -= 5; - slave.trust -= 5; - } + r.push(`${He} is helped out, still crying. When ${he} is returned, ${he}'s wearing`); } - slave.relationship = -3; - App.Events.addParagraph(el, r); - if (V.PC.slaveSurname && slave.slaveSurname !== V.PC.slaveSurname) { - App.Events.addResponses(el, [new App.Events.Result(`Give ${him} your surname`, () => { - const el = new DocumentFragment(); - const r = []; - slave.slaveSurname = V.PC.slaveSurname; - r.push(`You also command ${V.assistant.name} to rename your new slave wife ${slave.slaveName} ${slave.slaveSurname}.`); - if (slave.fetish === "mindbroken") { - r.push(`The new Mrs. ${slave.slaveSurname}`); - if (canHear(slave)) { - r.push(`hears`); - } else { - r.push(`understands`); - } - r.push(`this, of course, and shows no reaction. Like many things, names mean nothing to ${him} now.`); - } else if (slave.devotion+slave.trust >= 175) { - r.push(`The new Mrs. ${slave.slaveSurname}`); - if (canHear(slave)) { - r.push(`hears`); - } else { - r.push(`understands`); - } - r.push(`this, of course, and breaks down again. Being brusquely redesignated as your slave ${wife} was such a sterile experience that ${he} wasn't sure it was real, and hearing that ${he}'s to take your surname <span class="mediumaquamarine">reassures ${him}</span> that it is. Not to mention, ${he} might be a ${SlaveTitle(slave)}, but ${he}'s still a ${girl}, and hearing that ${he} wouldn't get a decent wedding did disappoint ${him}, but this makes up for it. You might not be all that expressive, but <span class="hotpink">${he}'s your wife,</span> and that's what matters to ${him}.`); - slave.devotion += 5; - slave.trust += 5; - } else if (slave.devotion < -20 && slave.trust > 20) { - r.push(`The new Mrs. ${slave.slaveSurname}`); - if (canHear(slave)) { - r.push(`hears`); - } else { - r.push(`understands`); - } - r.push(`this, of course, and scoffs audibly. <span class="mediumorchid">${He}'ll remember ${his} name, even if you try to take it away.</span> ${He} can't hide <span class="mediumorchid">${his} annoyance</span> that you couldn't even spring for a fancy wedding.`); - slave.devotion -= 10; - } else if (slave.devotion < -20) { - r.push(`The new Mrs. ${slave.slaveSurname}`); - if (canHear(slave)) { - r.push(`hears`); - } else { - r.push(`understands`); - } - r.push(`this, of course, and breaks down again. Not only have you taken ${his} hand, but now also ${his} name; <span class="hotpink">${he}'s yours now,</span> nothing ${he} thinks can change that.`); - slave.devotion += 5; - } else { - r.push(`The new Mrs. ${slave.slaveSurname}`); - if (canHear(slave)) { - r.push(`hears`); - } else { - r.push(`understands`); - } - r.push(`this, of course, and nods acceptingly. Being trusted with your surname <span class="mediumaquamarine">reassures ${him}</span> that ${he} must mean something to you, though ${he} is a <span class="mediumorchid">little disappointed</span> by the lack of a wedding, however.`); - slave.devotion--; - slave.trust += 5; - } - App.Events.addParagraph(el, r); - return el; - })]); + } else if (reactionType === 1) { + r.push(`${He} is helped out, completely unaware of ${his} pending marriage. When ${he} is returned, ${he}'s wearing`); + } else if (reactionType === 2) { + if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { + r.push(`${He} shuffles off, still sobbing. When ${he} returns, ${he}'s wearing`); + } else { + r.push(`${He} is helped out, still sobbing. When ${he} is returned, ${he}'s wearing`); + } + } else { + if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { + r.push(`${He} hurries off to fulfill your orders. When ${he} returns, ${he}'s wearing`); + } else { + r.push(`${He} is helped out to get dressed. When ${he} is returned, ${he}'s wearing`); } - - return el; } - - function marryNow() { - let r = []; - const el = new DocumentFragment(); - r.push(`You order ${slave.slaveName} to go change into bridal lingerie.`); - if (reactionType === 0) { - if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { - r.push(`${He} hurries off, still crying. When ${he} returns, ${he}'s wearing`); - } else { - r.push(`${He} is helped out, still crying. When ${he} is returned, ${he}'s wearing`); - } - } else if (reactionType === 1) { - r.push(`${He} is helped out, completely unaware of ${his} pending marriage. When ${he} is returned, ${he}'s wearing`); - } else if (reactionType === 2) { - if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { - r.push(`${He} shuffles off, still sobbing. When ${he} returns, ${he}'s wearing`); - } else { - r.push(`${He} is helped out, still sobbing. When ${he} is returned, ${he}'s wearing`); + if (slave.vagina === 0) { + r.push(`white, since ${he}'s a virgin.`); + } else if (slave.pregKnown === 1) { + r.push(`light pink, since ${he} is pregnant.`); + } else if (slave.vagina < 0 && slave.anus === 0) { + r.push(`white, since ${he}'s an anal virgin.`); + } else if (slave.vagina < 0 && slave.boobs > 500) { + r.push(`electric blue, since ${he}'s a shemale.`); + } else if (slave.vagina < 0) { + r.push(`pale blue, since ${he}'s a sissy slave.`); + } else if (slave.dick > 0) { + r.push(`hot pink, since ${he}'s a futa slave.`); + } else { + r.push(`light pink, since ${he}'s an experienced sex slave.`); + } + r.push(`A flimsy veil covers ${his} head and shoulders.`); + if (slave.boobs > 4000) { + r.push(`On such short notice, no bridal bra for boobs of ${his} size was available, so ${he}'s topless. Not a tragedy.`); + } else if (slave.boobs > 1200) { + r.push(`${His} lacy bridal bra just barely restrains ${his} huge boobs, leaving the tops of ${his} areolae visible.`); + } else if (slave.boobs > 400) { + r.push(`${His} lacy bridal bra flatters ${his} pretty breasts.`); + } else { + r.push(`${His} lacy bridal bra flatters ${his} pretty chest.`); + } + if (slave.bellyPreg >= 600000) { + r.push(`${His} expansive, squirming pregnant belly makes ${his} bridal wear particularly obscene.`); + } else if (slave.bellyPreg >= 1500) { + r.push(`${His} ${belly} pregnant belly protrudes out the front of ${his} bridal wear.`); + } else if (slave.bellyImplant >= 1500) { + r.push(`${His} ${belly} ${slave.bellyImplant}cc belly implant protrudes ${his} middle out the front of ${his} bridal wear.`); + } else if (slave.bellyFluid >= 10000) { + r.push(`${His} hugely bloated, ${slave.inflationType}-filled belly protrudes out the front of ${his} bridal wear.`); + } else if (slave.bellyFluid >= 5000) { + r.push(`${His} bloated, ${slave.inflationType}-stuffed belly protrudes out the front of ${his} bridal wear.`); + } else if (slave.bellyFluid >= 1500) { + r.push(`${His} distended, ${slave.inflationType}-belly protrudes out the front of ${his} bridal wear.`); + } + if (slave.chastityPenis === 1) { + r.push(`${His} slave dick is hidden by its chastity cage.`); + } else if (canAchieveErection(slave)) { + if (slave.dick > 4 && slave.belly >= 5000) { + r.push(`${He}'s hugely erect, with ${his} lacy g-string only serving to hold ${his} dick agonizingly pressed against the bottom of ${his} ${belly}`); + if (slave.bellyPreg >= 3000) { + r.push(`pregnant`); } + r.push(`belly.`); + } else if (slave.dick > 4) { + r.push(`${He}'s hugely erect, with ${his} lacy g-string only serving to hold ${his} dick upright along ${his} belly.`); } else { - if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { - r.push(`${He} hurries off to fulfill your orders. When ${he} returns, ${he}'s wearing`); - } else { - r.push(`${He} is helped out to get dressed. When ${he} is returned, ${he}'s wearing`); - } + r.push(`${His} erection tents the front of ${his} lacy g-string.`); } - if (slave.vagina === 0) { - r.push(`white, since ${he}'s a virgin.`); - } else if (slave.pregKnown === 1) { - r.push(`light pink, since ${he} is pregnant.`); - } else if (slave.vagina < 0 && slave.anus === 0) { - r.push(`white, since ${he}'s an anal virgin.`); - } else if (slave.vagina < 0 && slave.boobs > 500) { - r.push(`electric blue, since ${he}'s a shemale.`); - } else if (slave.vagina < 0) { - r.push(`pale blue, since ${he}'s a sissy slave.`); - } else if (slave.dick > 0) { - r.push(`hot pink, since ${he}'s a futa slave.`); + } else if (slave.dick > 0) { + if (slave.dick > 10) { + r.push(`${His} huge soft cock is allowed to dangle freely as no g-string could hope to contain it.`); + } else if (slave.dick > 4) { + r.push(`${His} big soft cock forms a lewd mass, stuffed into ${his} lacy g-string.`); } else { - r.push(`light pink, since ${he}'s an experienced sex slave.`); + r.push(`${His} lacy g-string perfectly conceals ${his} soft dick.`); } - r.push(`A flimsy veil covers ${his} head and shoulders.`); - if (slave.boobs > 4000) { - r.push(`On such short notice, no bridal bra for boobs of ${his} size was available, so ${he}'s topless. Not a tragedy.`); - } else if (slave.boobs > 1200) { - r.push(`${His} lacy bridal bra just barely restrains ${his} huge boobs, leaving the tops of ${his} areolae visible.`); - } else if (slave.boobs > 400) { - r.push(`${His} lacy bridal bra flatters ${his} pretty breasts.`); + } else { + if (slave.clit > 1) { + r.push(`${His} huge clit is quite hard, making ${him} shift uncomfortably as ${his} lacy g-string stimulates it.`); } else { - r.push(`${His} lacy bridal bra flatters ${his} pretty chest.`); - } - if (slave.bellyPreg >= 600000) { - r.push(`${His} expansive, squirming pregnant belly makes ${his} bridal wear particularly obscene.`); - } else if (slave.bellyPreg >= 1500) { - r.push(`${His} ${belly} pregnant belly protrudes out the front of ${his} bridal wear.`); - } else if (slave.bellyImplant >= 1500) { - r.push(`${His} ${belly} ${slave.bellyImplant}cc belly implant protrudes ${his} middle out the front of ${his} bridal wear.`); - } else if (slave.bellyFluid >= 10000) { - r.push(`${His} hugely bloated, ${slave.inflationType}-filled belly protrudes out the front of ${his} bridal wear.`); - } else if (slave.bellyFluid >= 5000) { - r.push(`${His} bloated, ${slave.inflationType}-stuffed belly protrudes out the front of ${his} bridal wear.`); - } else if (slave.bellyFluid >= 1500) { - r.push(`${His} distended, ${slave.inflationType}-belly protrudes out the front of ${his} bridal wear.`); + r.push(`${His} lacy g-string is starting to look a bit moist in front.`); } - if (slave.chastityPenis === 1) { - r.push(`${His} slave dick is hidden by its chastity cage.`); - } else if (canAchieveErection(slave)) { - if (slave.dick > 4 && slave.belly >= 5000) { - r.push(`${He}'s hugely erect, with ${his} lacy g-string only serving to hold ${his} dick agonizingly pressed against the bottom of ${his} ${belly}`); - if (slave.bellyPreg >= 3000) { - r.push(`pregnant`); - } - r.push(`belly.`); - } else if (slave.dick > 4) { - r.push(`${He}'s hugely erect, with ${his} lacy g-string only serving to hold ${his} dick upright along ${his} belly.`); - } else { - r.push(`${His} erection tents the front of ${his} lacy g-string.`); + } + r.push(`${capFirstChar(V.assistant.name)} marries ${him} to you in a brief ceremony adapted for slaves and their owners. You place a`); + if (hasAnyArms(slave)) { + r.push(`simple steel ring on ${his} finger;`); + } else { + r.push(`chain with a simple steel ring around ${his} neck;`); + } + r.push(`${he} does not reciprocate, since this marriage does not bind you.`); + if (V.assistant.personality <= 0) { + r.push(`"The marriage protocol now requires you to`); + if (V.PC.dick !== 0) { + r.push(`fellate`); + if (V.PC.vagina !== -1) { + r.push(`and`); } - } else if (slave.dick > 0) { - if (slave.dick > 10) { - r.push(`${His} huge soft cock is allowed to dangle freely as no g-string could hope to contain it.`); - } else if (slave.dick > 4) { - r.push(`${His} big soft cock forms a lewd mass, stuffed into ${his} lacy g-string.`); + } + if (V.PC.vagina !== -1) { + r.push(`perform cunnilingus on`); + } + r.push(`the ${groom}, ${V.assistant.name} orders ${him}, and ${he}`); + if (reactionType === 0) { + r.push(`only starts when you push ${his} head to your crotch.`); + } else if (reactionType === 1) { + r.push(`eagerly complies.`); + } else if (reactionType === 2) { + r.push(`reluctantly obeys.`); + } else { + r.push(`hurries to obey.`); + } + } else { + const suckMy = () => { + if (V.PC.dick !== 0) { + r.push(`suck the ${groom}'s dick${(V.PC.vagina !== -1) ? ` and eat ${hisP} pussy` : ``}."`); } else { - r.push(`${His} lacy g-string perfectly conceals ${his} soft dick.`); + r.push(`eat the ${groom}'s pussy."`); } - } else { - if (slave.clit > 1) { - r.push(`${His} huge clit is quite hard, making ${him} shift uncomfortably as ${his} lacy g-string stimulates it.`); + }; + const genericCompliance = () => { + r.push(`The slave`); + if (reactionType === 0) { + r.push(`only starts when you push ${his} head to your crotch.`); + } else if (reactionType === 1) { + r.push(`eagerly complies.`); + } else if (reactionType === 2) { + r.push(`reluctantly obeys.`); } else { - r.push(`${His} lacy g-string is starting to look a bit moist in front.`); + r.push(`hurries to obey.`); } - } - r.push(`${capFirstChar(V.assistant.name)} marries ${him} to you in a brief ceremony adapted for slaves and their owners. You place a`); - if (hasAnyArms(slave)) { - r.push(`simple steel ring on ${his} finger;`); - } else { - r.push(`chain with a simple steel ring around ${his} neck;`); - } - r.push(`${he} does not reciprocate, since this marriage does not bind you.`); - if (V.assistant.personality <= 0) { - r.push(`"The marriage protocol now requires you to`); + }; + + if (V.assistant.appearance === "monstergirl") { + r.push(`"To consecrate the ceremony," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); + suckMy(); + genericCompliance(); + r.push(`Pleased by the sight, ${V.assistant.name}'s avatar begins to play with ${hisA} dicks.`); + } else if (V.assistant.appearance === "shemale") { + r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); + suckMy(); + genericCompliance(); + r.push(`Pleased by the sight, ${V.assistant.name}'s avatar starts to jill off.`); + } else if (V.assistant.appearance === "amazon") { + r.push(`"To complete this ritual," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); + suckMy(); + genericCompliance(); + r.push(`Pleased by the sight, ${V.assistant.name}'s avatar starts to jill off.`); + } else if (V.assistant.appearance === "businesswoman") { + r.push(`"To consecrate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); if (V.PC.dick !== 0) { r.push(`fellate`); - if (V.PC.vagina !== -1) { - r.push(`and`); - } - } - if (V.PC.vagina !== -1) { + } else { r.push(`perform cunnilingus on`); } - r.push(`the ${groom}, ${V.assistant.name} orders ${him}, and ${he}`); + r.push(`the ${groom}." The slave`); if (reactionType === 0) { r.push(`only starts when you push ${his} head to your crotch.`); } else if (reactionType === 1) { @@ -725,329 +779,275 @@ new App.DomPassage("FMarry", } else { r.push(`hurries to obey.`); } - } else { - const suckMy = () => { - if (V.PC.dick !== 0) { - r.push(`suck the ${groom}'s dick${(V.PC.vagina !== -1) ? ` and eat ${hisP} pussy` : ``}."`); - } else { - r.push(`eat the ${groom}'s pussy."`); - } - }; - const genericCompliance = () => { - r.push(`The slave`); - if (reactionType === 0) { - r.push(`only starts when you push ${his} head to your crotch.`); - } else if (reactionType === 1) { - r.push(`eagerly complies.`); - } else if (reactionType === 2) { - r.push(`reluctantly obeys.`); - } else { - r.push(`hurries to obey.`); - } - }; - - if (V.assistant.appearance === "monstergirl") { - r.push(`"To consecrate the ceremony," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); - suckMy(); - genericCompliance(); - r.push(`Pleased by the sight, ${V.assistant.name}'s avatar begins to play with ${hisA} dicks.`); - } else if (V.assistant.appearance === "shemale") { - r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); - suckMy(); - genericCompliance(); - r.push(`Pleased by the sight, ${V.assistant.name}'s avatar starts to jill off.`); - } else if (V.assistant.appearance === "amazon") { - r.push(`"To complete this ritual," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); - suckMy(); - genericCompliance(); - r.push(`Pleased by the sight, ${V.assistant.name}'s avatar starts to jill off.`); - } else if (V.assistant.appearance === "businesswoman") { - r.push(`"To consecrate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); - if (V.PC.dick !== 0) { - r.push(`fellate`); - } else { - r.push(`perform cunnilingus on`); - } - r.push(`the ${groom}." The slave`); - if (reactionType === 0) { - r.push(`only starts when you push ${his} head to your crotch.`); - } else if (reactionType === 1) { - r.push(`eagerly complies.`); - } else if (reactionType === 2) { - r.push(`reluctantly obeys.`); - } else { - r.push(`hurries to obey.`); - } - r.push(`Pleased by the sight, ${V.assistant.name}'s avatar sneaks a hand down ${hisA} suit skirt, blushing furiously.`); - } else if (V.assistant.appearance === "fairy") { - r.push(`"To seal the deal," ${V.assistant.name} concludes, "${slave.slaveName}, you gotta drink the ${groom}'s`); - if (V.PC.dick !== 0) { - r.push(`semen${(V.PC.vagina !== -1) ? `and pussy juices` : ``}.`); - } else { - r.push(`pussy juices.`); - } - genericCompliance(); - r.push(`Pleased by the sight, ${V.assistant.name}'s avatar spreads ${hisA} legs while still hovering in the air and masturbates eagerly through hisA half-worn robes.`); - } else if (V.assistant.appearance === "pregnant fairy") { - r.push(`"To seal the deal," ${V.assistant.name} concludes, "${slave.slaveName}, you gotta drink the ${groom}'s`); - if (V.PC.dick !== 0) { - r.push(`semen`); - if (V.PC.vagina !== -1) { - r.push(`and pussy juices`); - } - } else { - r.push(`pussy juices`); - } - genericCompliance(); - r.push(`Pleased by the sight, ${V.assistant.name}'s pregnant avatar curls while still hovering in the air and masturbates eagerly around ${hisA} large belly.`); - } else if (V.assistant.appearance === "goddess") { - r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you must now`); - if (V.PC.dick !== 0) { - r.push(`drink the ${groom}'s seed`); - } else { - r.push(`drink the ${groom}'s female juices`); - } - genericCompliance(); - r.push(`${V.assistant.name}'s avatar looks on approvingly, cradling ${hisA} perpetual pregnancy.`); - } else if (V.assistant.appearance === "hypergoddess") { - r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you must now`); - if (V.PC.dick !== 0) { - r.push(`drink the ${groom}'s seed`); - } else { - r.push(`drink the ${groom}'s female juices`); - } - genericCompliance(); - r.push(`${V.assistant.name}'s avatar looks on approvingly, cradling ${hisA} massive perpetual pregnancy.`); - } else if (V.assistant.appearance === "loli") { - r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you should now`); - if (V.PC.dick !== 0) { - r.push(`suck the ${groom}'s cock${(V.PC.vagina !== -1) ? `and lick ${hisP} cunny.` : ``}`); - } else { - r.push(`lick the ${groom}'s cunny.`); - } - genericCompliance(); - r.push(`${V.assistant.name}'s avatar sneaks a hand down ${hisA} dress, blushing furiously.`); - } else if (V.assistant.appearance === "preggololi") { - r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you should now`); - if (V.PC.dick !== 0) { - r.push(`suck the ${groom}'s lovely cock${(V.PC.vagina !== -1) ? `and eat out ${hisP} cunt` : ``}.`); - } else { - r.push(`lick the ${groom}'s cunt.`); - } - genericCompliance(); - r.push(`${V.assistant.name}'s avatar attempts to sneak a hand down ${hisA} dress, but is thwarted by hisA belly. ${HeA} instead openly rubs hisA crotch through the front of hisA dress, blushing furiously.`); - } else if (V.assistant.appearance === "schoolgirl") { - r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, the rules say you should now`); - suckMy(); - genericCompliance(); - r.push(`Pleased by the sight, ${V.assistant.name}'s avatar starts to jill off.`); - } else if (V.assistant.appearance === "angel") { - r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you must now join ${PlayerName()} in their bedroom and consummate this marriage." The slave`); - if (reactionType === 0) { - r.push(`stares blankly.`); - } else { - r.push(`looks confused.`); - } - r.push(`"After the wedding ends, would be the time." ${V.assistant.name} says, covering ${hisA} face in embarrassment at the thought.`); - } else if (V.assistant.appearance === "cherub") { - r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you should`); - if (V.PC.dick !== 0) { - r.push(`suck the ${groom}'s cock${(V.PC.vagina !== -1) ? `and lick ${hisP} pussy` : ``},`); - } else { - r.push(`lick the ${groom}'s pussy,`); - } - r.push(`in the privacy of ${PlayerName()}'s bedroom, of course." ${V.assistant.name} hides hisA face in hisA hands at the thought.`); - } else if (V.assistant.appearance === "incubus") { - r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); - suckMy(); - genericCompliance(); - r.push(`Enjoying the sight, ${V.assistant.name}'s avatar begins to furiously stroke its shaft.`); - } else if (V.assistant.appearance === "succubus") { - r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); - suckMy(); - genericCompliance(); - r.push(`Pleased by the sight, ${V.assistant.name}'s avatar pulls out a large dildo and begins ramming it into ${hisA} own pussy.`); - } else if (V.assistant.appearance === "imp") { - r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); - suckMy(); - genericCompliance(); - r.push(`Pleased by the sight, ${V.assistant.name}'s avatar hikes ${hisA} robe and vigorously rubs hisA pussy.`); - } else if (V.assistant.appearance === "witch") { - r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); - suckMy(); - genericCompliance(); - r.push(`${V.assistant.name}'s avatar begins to fidget at the sight, having summoned a vibrator beforehand and accidentally linked it to your pleasure.`); - } else if (V.assistant.appearance === "ERROR_1606_APPEARANCE_FILE_CORRUPT") { - r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); - suckMy(); - genericCompliance(); - r.push(`${V.assistant.name}'s avatar begins to swell, drawing all its gained mass to its midsection. Its gravid middles splits vertically, allowing a new mass of flesh to fall to the floor, which quickly grows and reshapes itself into a spitting image of yourself. Meanwhile, the original twists into an image of ${slave.slaveName}. ${V.assistant.name}'s two avatars begin copying you and ${slave.slaveName}'s actions perfectly.`); + r.push(`Pleased by the sight, ${V.assistant.name}'s avatar sneaks a hand down ${hisA} suit skirt, blushing furiously.`); + } else if (V.assistant.appearance === "fairy") { + r.push(`"To seal the deal," ${V.assistant.name} concludes, "${slave.slaveName}, you gotta drink the ${groom}'s`); + if (V.PC.dick !== 0) { + r.push(`semen${(V.PC.vagina !== -1) ? `and pussy juices` : ``}.`); } else { - r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, the rules say you should now`); - suckMy(); - genericCompliance(); - r.push(`With only a symbol to express ${hisA} approval, ${V.assistant.name} is forced to content himselfA with spinning the symbol and making it glow in time with your new slave wife's efforts.`); + r.push(`pussy juices.`); } - r.push(`"Done," ${heA} says when you climax. "Enjoy your`); - if (slave.fetishKnown === 1 && slave.fetishStrength > 60) { - if (slave.fetish === "submissive") { - r.push(`submissive slave ${wife}!"`); - } else if (slave.fetish === "cumslut") { - r.push(`slave ${wife}'s mouth!"`); - } else if (slave.fetish === "humiliation") { - r.push(`exhibitionist slave ${wife}!"`); - } else if (slave.fetish === "buttslut") { - r.push(`slave ${wife}'s butthole!"`); - } else if (slave.fetish === "boobs") { - r.push(`slave ${wife}'s boobs!"`); - } else if (slave.fetish === "pregnancy") { - r.push(`breeder ${wife}!"`); - } else if (slave.fetish === "dom") { - r.push(`slave ${wife}'s aggression!"`); - } else if (slave.fetish === "sadist") { - r.push(`slave ${wife}'s sadistic tendencies!"`); - } else if (slave.fetish === "masochist") { - r.push(`slave ${wife}'s pain!"`); - } else { - r.push(`slave ${wife}!"`); + genericCompliance(); + r.push(`Pleased by the sight, ${V.assistant.name}'s avatar spreads ${hisA} legs while still hovering in the air and masturbates eagerly through hisA half-worn robes.`); + } else if (V.assistant.appearance === "pregnant fairy") { + r.push(`"To seal the deal," ${V.assistant.name} concludes, "${slave.slaveName}, you gotta drink the ${groom}'s`); + if (V.PC.dick !== 0) { + r.push(`semen`); + if (V.PC.vagina !== -1) { + r.push(`and pussy juices`); } } else { - r.push(`slave ${wife}!"`); + r.push(`pussy juices`); } - } - if (slave.relationship > 0) { - slave.relationshipTarget = 0; - relSlave.relationship = 0; - relSlave.relationshipTarget = 0; - } - if (slave.devotion+slave.trust >= 175) { - if (slave.relationship > 0) { - r.push(`${His} ex is <span class="mediumorchid">disappointed</span> that their relationship had to end and <span class="gold">worries</span> for ${his2} love's future.`); - if (slave.relationship === 4) { - relSlave.devotion -= 5; - relSlave.trust -= 5; - } else if (slave.relationship === 3) { - relSlave.devotion -= 3; - relSlave.trust -= 3; - } else { - relSlave.devotion -= 1; - relSlave.trust -= 1; - } + genericCompliance(); + r.push(`Pleased by the sight, ${V.assistant.name}'s pregnant avatar curls while still hovering in the air and masturbates eagerly around ${hisA} large belly.`); + } else if (V.assistant.appearance === "goddess") { + r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you must now`); + if (V.PC.dick !== 0) { + r.push(`drink the ${groom}'s seed`); + } else { + r.push(`drink the ${groom}'s female juices`); } - } else if (slave.devotion < -20) { - if (slave.relationship === -1) { - r.push(`${He} <span class="mediumorchid">hates</span> that ${he} has to be yours only and <span class="gold">fears</span> what will happen if ${he} strays.`); - slave.devotion -= 40; - slave.trust -= 40; - } else if (slave.relationship === 4) { - r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">fear</span> for each other's future.`); - relSlave.devotion -= 40; - relSlave.trust -= 40; - slave.devotion -= 40; - slave.trust -= 40; - } else if (slave.relationship === 3) { - r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">fear</span> for each other's future.`); - relSlave.devotion -= 30; - relSlave.trust -= 30; - slave.devotion -= 30; - slave.trust -= 30; - } else if (slave.relationship > 0) { - r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">fear</span> for each other's future.`); - relSlave.devotion -= 20; - relSlave.trust -= 20; - slave.devotion -= 20; - slave.trust -= 20; + genericCompliance(); + r.push(`${V.assistant.name}'s avatar looks on approvingly, cradling ${hisA} perpetual pregnancy.`); + } else if (V.assistant.appearance === "hypergoddess") { + r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you must now`); + if (V.PC.dick !== 0) { + r.push(`drink the ${groom}'s seed`); + } else { + r.push(`drink the ${groom}'s female juices`); } + genericCompliance(); + r.push(`${V.assistant.name}'s avatar looks on approvingly, cradling ${hisA} massive perpetual pregnancy.`); + } else if (V.assistant.appearance === "loli") { + r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you should now`); + if (V.PC.dick !== 0) { + r.push(`suck the ${groom}'s cock${(V.PC.vagina !== -1) ? `and lick ${hisP} cunny.` : ``}`); + } else { + r.push(`lick the ${groom}'s cunny.`); + } + genericCompliance(); + r.push(`${V.assistant.name}'s avatar sneaks a hand down ${hisA} dress, blushing furiously.`); + } else if (V.assistant.appearance === "preggololi") { + r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you should now`); + if (V.PC.dick !== 0) { + r.push(`suck the ${groom}'s lovely cock${(V.PC.vagina !== -1) ? `and eat out ${hisP} cunt` : ``}.`); + } else { + r.push(`lick the ${groom}'s cunt.`); + } + genericCompliance(); + r.push(`${V.assistant.name}'s avatar attempts to sneak a hand down ${hisA} dress, but is thwarted by hisA belly. ${HeA} instead openly rubs hisA crotch through the front of hisA dress, blushing furiously.`); + } else if (V.assistant.appearance === "schoolgirl") { + r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, the rules say you should now`); + suckMy(); + genericCompliance(); + r.push(`Pleased by the sight, ${V.assistant.name}'s avatar starts to jill off.`); + } else if (V.assistant.appearance === "angel") { + r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you must now join ${PlayerName()} in their bedroom and consummate this marriage." The slave`); + if (reactionType === 0) { + r.push(`stares blankly.`); + } else { + r.push(`looks confused.`); + } + r.push(`"After the wedding ends, would be the time." ${V.assistant.name} says, covering ${hisA} face in embarrassment at the thought.`); + } else if (V.assistant.appearance === "cherub") { + r.push(`"To consummate the marriage," ${V.assistant.name} concludes, "${slave.slaveName}, you should`); + if (V.PC.dick !== 0) { + r.push(`suck the ${groom}'s cock${(V.PC.vagina !== -1) ? `and lick ${hisP} pussy` : ``},`); + } else { + r.push(`lick the ${groom}'s pussy,`); + } + r.push(`in the privacy of ${PlayerName()}'s bedroom, of course." ${V.assistant.name} hides hisA face in hisA hands at the thought.`); + } else if (V.assistant.appearance === "incubus") { + r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); + suckMy(); + genericCompliance(); + r.push(`Enjoying the sight, ${V.assistant.name}'s avatar begins to furiously stroke its shaft.`); + } else if (V.assistant.appearance === "succubus") { + r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); + suckMy(); + genericCompliance(); + r.push(`Pleased by the sight, ${V.assistant.name}'s avatar pulls out a large dildo and begins ramming it into ${hisA} own pussy.`); + } else if (V.assistant.appearance === "imp") { + r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); + suckMy(); + genericCompliance(); + r.push(`Pleased by the sight, ${V.assistant.name}'s avatar hikes ${hisA} robe and vigorously rubs hisA pussy.`); + } else if (V.assistant.appearance === "witch") { + r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); + suckMy(); + genericCompliance(); + r.push(`${V.assistant.name}'s avatar begins to fidget at the sight, having summoned a vibrator beforehand and accidentally linked it to your pleasure.`); + } else if (V.assistant.appearance === "ERROR_1606_APPEARANCE_FILE_CORRUPT") { + r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, you will now`); + suckMy(); + genericCompliance(); + r.push(`${V.assistant.name}'s avatar begins to swell, drawing all its gained mass to its midsection. Its gravid middles splits vertically, allowing a new mass of flesh to fall to the floor, which quickly grows and reshapes itself into a spitting image of yourself. Meanwhile, the original twists into an image of ${slave.slaveName}. ${V.assistant.name}'s two avatars begin copying you and ${slave.slaveName}'s actions perfectly.`); } else { - if (slave.relationship === -1) { - r.push(`${He} <span class="mediumorchid">dislikes</span> that ${he} has to be yours only and <span class="gold">worries</span> what will happen if ${he} strays.`); - slave.devotion -= 10; - slave.trust -= 10; - } else if (slave.relationship === 4) { - r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">worry</span> for each other.`); - relSlave.devotion -= 20; - relSlave.trust -= 20; - slave.devotion -= 20; - slave.trust -= 20; - } else if (slave.relationship === 3) { - r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">are saddened</span> that their relationship had to end and <span class="gold">worry</span> for each other.`); - relSlave.devotion -= 10; - relSlave.trust -= 10; - slave.devotion -= 10; - slave.trust -= 10; - } else if (slave.relationship > 0) { - r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">are disappointed</span> that their relationship had to end and <span class="gold">worry</span> for each other.`); + r.push(`"To get this marriage started," ${V.assistant.name} concludes, "${slave.slaveName}, the rules say you should now`); + suckMy(); + genericCompliance(); + r.push(`With only a symbol to express ${hisA} approval, ${V.assistant.name} is forced to content himselfA with spinning the symbol and making it glow in time with your new slave wife's efforts.`); + } + r.push(`"Done," ${heA} says when you climax. "Enjoy your`); + if (slave.fetishKnown === 1 && slave.fetishStrength > 60) { + if (slave.fetish === "submissive") { + r.push(`submissive slave ${wife}!"`); + } else if (slave.fetish === "cumslut") { + r.push(`slave ${wife}'s mouth!"`); + } else if (slave.fetish === "humiliation") { + r.push(`exhibitionist slave ${wife}!"`); + } else if (slave.fetish === "buttslut") { + r.push(`slave ${wife}'s butthole!"`); + } else if (slave.fetish === "boobs") { + r.push(`slave ${wife}'s boobs!"`); + } else if (slave.fetish === "pregnancy") { + r.push(`breeder ${wife}!"`); + } else if (slave.fetish === "dom") { + r.push(`slave ${wife}'s aggression!"`); + } else if (slave.fetish === "sadist") { + r.push(`slave ${wife}'s sadistic tendencies!"`); + } else if (slave.fetish === "masochist") { + r.push(`slave ${wife}'s pain!"`); + } else { + r.push(`slave ${wife}!"`); + } + } else { + r.push(`slave ${wife}!"`); + } + } + if (slave.relationship > 0) { + slave.relationshipTarget = 0; + relSlave.relationship = 0; + relSlave.relationshipTarget = 0; + } + if (slave.devotion+slave.trust >= 175) { + if (slave.relationship > 0) { + r.push(`${His} ex is <span class="mediumorchid">disappointed</span> that their relationship had to end and <span class="gold">worries</span> for ${his2} love's future.`); + if (slave.relationship === 4) { relSlave.devotion -= 5; relSlave.trust -= 5; - slave.devotion -= 5; - slave.trust -= 5; + } else if (slave.relationship === 3) { + relSlave.devotion -= 3; + relSlave.trust -= 3; + } else { + relSlave.devotion -= 1; + relSlave.trust -= 1; } } - slave.relationship = -3; - App.Events.addParagraph(el, r); - if (V.PC.slaveSurname && slave.slaveSurname !== V.PC.slaveSurname) { - App.Events.addResponses(el, [new App.Events.Result(`Give ${him} your surname`, () => { - const el = new DocumentFragment(); - const r = []; - slave.slaveSurname = V.PC.slaveSurname; - r.push(`You also command ${V.assistant.name} to rename your new slave wife ${slave.slaveName} ${slave.slaveSurname}.`); - if (slave.fetish === "mindbroken") { - r.push(`Before you get too distracted, you tell your lovely new ${wife} that ${he}'s now to be known as ${slave.slaveName} ${slave.slaveSurname}. You are uncertain if it sunk in or not.`); - } else if (slave.devotion+slave.trust >= 175) { - r.push(`Before you get too distracted, you tell your lovely new ${wife} that ${he}'s now to be known as ${slave.slaveName} ${slave.slaveSurname}. It would be an understatement to say ${he}'s delighted. ${He}'s a good ${SlaveTitle(slave)}, but even ${he} has to retain a kernel of doubt about whether a marriage between an owner and a piece of property is really worth much. This <span class="mediumaquamarine">reassures ${him}</span> that it is. ${His} special day probably wasn't exactly like ${he} might once have imagined it, but ${he} obviously thinks it's been <span class="hotpink">very nice,</span> all things considered.`); - if (canTalk(slave)) { - r.push(`"${myName} ${playerSurname},"`); - r.push(`${he} murmurs to ${himself} occasionally, smiling.`); - } - slave.devotion += 5; - slave.trust += 5; - } else if (slave.devotion < -20 && slave.trust > 20) { - r.push(`Before you get too distracted, you tell your lovely new ${wife} that ${he}'s now to be known as ${slave.slaveName} ${slave.slaveSurname}. <span class="mediumorchid">${He}'ll remember ${his} name, even if you try to take it away.</span>`); - if (canTalk(slave)) { - r.push(`"${myName} ${playerSurname},"`); - r.push(`${he} mutters to ${himself} occasionally; their is a distinct distaste to the way ${he} says it.`); - } - slave.devotion -= 10; - } else if (slave.devotion < -20) { - r.push(`Before you get too distracted, you tell your quivering new ${wife} that ${he}'s now to be known as ${slave.slaveName} ${slave.slaveSurname}. ${He} nods in terror. Not only have you taken ${his} hand, but now also ${his} name; <span class="hotpink">${he}'s yours now,</span> nothing ${he} thinks can change that.`); - if (canTalk(slave)) { - r.push(`"${myName} ${playerSurname}," ${he} mutters to ${himself} occasionally, ${his} voice wavering as ${he} struggles to hold back the tears.`); - } - slave.devotion += 5; - } else { - r.push(`Before you get too distracted, you tell your lovely new ${wife} that ${he}'s now to be known as ${slave.slaveName} ${slave.slaveSurname}. ${He} nods acceptingly. ${He}'s a good ${SlaveTitle(slave)}, but ${he} has doubts about whether a marriage between an owner and a piece of property is really worth much. That doesn't matter, <span class="mediumaquamarine">it's worth something to ${him}.</span>`); - if (canTalk(slave)) { - r.push(`"${myName} ${playerSurname},"`); - r.push(`${he} murmurs to ${himself} occasionally${(canHear(slave)) ? `, listening to how it sounds` : ``}.`); - } - slave.trust += 5; - } - App.Events.addParagraph(el, r); - return el; - })]); + } else if (slave.devotion < -20) { + if (slave.relationship === -1) { + r.push(`${He} <span class="mediumorchid">hates</span> that ${he} has to be yours only and <span class="gold">fears</span> what will happen if ${he} strays.`); + slave.devotion -= 40; + slave.trust -= 40; + } else if (slave.relationship === 4) { + r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">fear</span> for each other's future.`); + relSlave.devotion -= 40; + relSlave.trust -= 40; + slave.devotion -= 40; + slave.trust -= 40; + } else if (slave.relationship === 3) { + r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">fear</span> for each other's future.`); + relSlave.devotion -= 30; + relSlave.trust -= 30; + slave.devotion -= 30; + slave.trust -= 30; + } else if (slave.relationship > 0) { + r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">fear</span> for each other's future.`); + relSlave.devotion -= 20; + relSlave.trust -= 20; + slave.devotion -= 20; + slave.trust -= 20; + } + } else { + if (slave.relationship === -1) { + r.push(`${He} <span class="mediumorchid">dislikes</span> that ${he} has to be yours only and <span class="gold">worries</span> what will happen if ${he} strays.`); + slave.devotion -= 10; + slave.trust -= 10; + } else if (slave.relationship === 4) { + r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">resent</span> that their relationship had to end and <span class="gold">worry</span> for each other.`); + relSlave.devotion -= 20; + relSlave.trust -= 20; + slave.devotion -= 20; + slave.trust -= 20; + } else if (slave.relationship === 3) { + r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">are saddened</span> that their relationship had to end and <span class="gold">worry</span> for each other.`); + relSlave.devotion -= 10; + relSlave.trust -= 10; + slave.devotion -= 10; + slave.trust -= 10; + } else if (slave.relationship > 0) { + r.push(`Both ${him} and ${his} ex are <span class="mediumorchid">are disappointed</span> that their relationship had to end and <span class="gold">worry</span> for each other.`); + relSlave.devotion -= 5; + relSlave.trust -= 5; + slave.devotion -= 5; + slave.trust -= 5; } - return el; } - - function straightforward() { - V.weddingPlanned = 1; - V.marrying.push(V.AS); - cashX(-10000, "event", slave); - return `You order ${V.assistant.name} to invite deserving citizens to a straightforward ceremony for a slave being married to a slaveowner, and to make the arrangement. The wedding will take place during the upcoming week.`; + slave.relationship = -3; + App.Events.addParagraph(el, r); + if (V.PC.slaveSurname && slave.slaveSurname !== V.PC.slaveSurname) { + App.Events.addResponses(el, [new App.Events.Result(`Give ${him} your surname`, () => { + const el = new DocumentFragment(); + const r = []; + slave.slaveSurname = V.PC.slaveSurname; + r.push(`You also command ${V.assistant.name} to rename your new slave wife ${slave.slaveName} ${slave.slaveSurname}.`); + if (slave.fetish === "mindbroken") { + r.push(`Before you get too distracted, you tell your lovely new ${wife} that ${he}'s now to be known as ${slave.slaveName} ${slave.slaveSurname}. You are uncertain if it sunk in or not.`); + } else if (slave.devotion+slave.trust >= 175) { + r.push(`Before you get too distracted, you tell your lovely new ${wife} that ${he}'s now to be known as ${slave.slaveName} ${slave.slaveSurname}. It would be an understatement to say ${he}'s delighted. ${He}'s a good ${SlaveTitle(slave)}, but even ${he} has to retain a kernel of doubt about whether a marriage between an owner and a piece of property is really worth much. This <span class="mediumaquamarine">reassures ${him}</span> that it is. ${His} special day probably wasn't exactly like ${he} might once have imagined it, but ${he} obviously thinks it's been <span class="hotpink">very nice,</span> all things considered.`); + if (canTalk(slave)) { + r.push(`"${myName} ${playerSurname},"`); + r.push(`${he} murmurs to ${himself} occasionally, smiling.`); + } + slave.devotion += 5; + slave.trust += 5; + } else if (slave.devotion < -20 && slave.trust > 20) { + r.push(`Before you get too distracted, you tell your lovely new ${wife} that ${he}'s now to be known as ${slave.slaveName} ${slave.slaveSurname}. <span class="mediumorchid">${He}'ll remember ${his} name, even if you try to take it away.</span>`); + if (canTalk(slave)) { + r.push(`"${myName} ${playerSurname},"`); + r.push(`${he} mutters to ${himself} occasionally; their is a distinct distaste to the way ${he} says it.`); + } + slave.devotion -= 10; + } else if (slave.devotion < -20) { + r.push(`Before you get too distracted, you tell your quivering new ${wife} that ${he}'s now to be known as ${slave.slaveName} ${slave.slaveSurname}. ${He} nods in terror. Not only have you taken ${his} hand, but now also ${his} name; <span class="hotpink">${he}'s yours now,</span> nothing ${he} thinks can change that.`); + if (canTalk(slave)) { + r.push(`"${myName} ${playerSurname}," ${he} mutters to ${himself} occasionally, ${his} voice wavering as ${he} struggles to hold back the tears.`); + } + slave.devotion += 5; + } else { + r.push(`Before you get too distracted, you tell your lovely new ${wife} that ${he}'s now to be known as ${slave.slaveName} ${slave.slaveSurname}. ${He} nods acceptingly. ${He}'s a good ${SlaveTitle(slave)}, but ${he} has doubts about whether a marriage between an owner and a piece of property is really worth much. That doesn't matter, <span class="mediumaquamarine">it's worth something to ${him}.</span>`); + if (canTalk(slave)) { + r.push(`"${myName} ${playerSurname},"`); + r.push(`${he} murmurs to ${himself} occasionally${(canHear(slave)) ? `, listening to how it sounds` : ``}.`); + } + slave.trust += 5; + } + App.Events.addParagraph(el, r); + return el; + })]); } + return el; + } - function orgiastic() { - V.weddingPlanned = 2; - V.marrying.push(V.AS); - cashX(-10000, "event", slave); - return `You order ${V.assistant.name} to invite deserving citizens to an orgiastic ceremony for a slave being married to a slaveowner, and to make the arrangements. The wedding orgy will take place during the upcoming week.`; - } + function straightforward() { + V.weddingPlanned = 1; + V.marrying.push(slave.ID); + cashX(-10000, "event", slave); + return `You order ${V.assistant.name} to invite deserving citizens to a straightforward ceremony for a slave being married to a slaveowner, and to make the arrangement. The wedding will take place during the upcoming week.`; + } - function impregnation() { - V.weddingPlanned = 3; - V.marrying.push(V.AS); - cashX(-10000, "event", slave); - return `You order ${V.assistant.name} to invite deserving citizens to a ceremony for a fertile slave being married to a slaveowner, and to make the arrangements. The wedding will take place during the upcoming week.`; - } + function orgiastic() { + V.weddingPlanned = 2; + V.marrying.push(slave.ID); + cashX(-10000, "event", slave); + return `You order ${V.assistant.name} to invite deserving citizens to an orgiastic ceremony for a slave being married to a slaveowner, and to make the arrangements. The wedding orgy will take place during the upcoming week.`; + } + + function impregnation() { + V.weddingPlanned = 3; + V.marrying.push(slave.ID); + cashX(-10000, "event", slave); + return `You order ${V.assistant.name} to invite deserving citizens to a ceremony for a fertile slave being married to a slaveowner, and to make the arrangements. The wedding will take place during the upcoming week.`; } -); +}; diff --git a/src/npc/interaction/passage/fSlaveImpreg.js b/src/npc/interaction/passage/fSlaveImpreg.js new file mode 100644 index 0000000000000000000000000000000000000000..918139e487e8fe69600b8443359b84a547bc7425 --- /dev/null +++ b/src/npc/interaction/passage/fSlaveImpreg.js @@ -0,0 +1,550 @@ +/** + * + * @returns {HTMLElement} + */ +App.Interact.fSlaveImpreg = function(slave) { + const node = document.createElement("div"); + + App.UI.DOM.appendNewElement("p", node, `${slave.slaveName} is fertile; now you must select a slave with both a penis and potent testicles.`, "scene-intro"); + + App.UI.DOM.appendNewElement("h3", node, `Select an eligible slave to serve as the semen donatrix`); + + const eligibles = V.slaves.filter((s) => (s.ID !== slave.ID) && canImpreg(slave, s) && canPenetrate(s)); + const kinship = ibc.kinship_one_many(slave, eligibles); + for (const impregnatrix of eligibles) { + const div = App.UI.DOM.appendNewElement("div", node); + div.append( + App.UI.DOM.link( + SlaveFullName(impregnatrix), + () => { + jQuery(node).empty().append(consummate(impregnatrix)); + } + ) + ); + if (impregnatrix.custom.label) { + App.UI.DOM.appendNewElement("span", div, ` ${impregnatrix.custom.label}`, "yellow"); + } + if (totalRelatives(slave) > 0) { + const relTerm = relativeTerm(slave, impregnatrix); + if (relTerm !== null) { + App.UI.DOM.appendNewElement("span", div, ` ${capFirstChar(relTerm)}`, "lightgreen"); + } + } + if (V.inbreeding && kinship[impregnatrix.ID] > 0) { + const thisKinship = kinship[impregnatrix.ID]; + let adj = ""; + if (thisKinship >= 0.5) { + adj = `Extreme`; + } else if (thisKinship >= 0.25) { + adj = `Major`; + } else if (thisKinship >= 0.125) { + adj = `Some`; + } else if (thisKinship >= 0.0625) { + adj = `Minor`; + } else { + adj = `Slight`; + } + App.UI.DOM.appendNewElement("span", div, ` (${adj} inbreeding, CoI of ${thisKinship})`); + } + } + if (eligibles.length === 0) { + App.UI.DOM.appendNewElement("div", node, `You have no slaves capable of inseminating others.`, "note"); + } + return node; + + /** + * + * @param {App.Entity.SlaveState} impregnatrix + * @returns {DocumentFragment} + */ + function consummate(impregnatrix) { + const node = new DocumentFragment(); + let r = []; + V.nextLink = "Slave Interact"; + V.nextButton = "Back"; + + const { + He, + he, his, him, himself, girl + } = getPronouns(slave); + + const { + He2, His2, + he2, his2, him2, himself2, hers2 + } = getPronouns(impregnatrix).appendSuffix("2"); + + const { + himP + } = getPronouns(V.PC).appendSuffix("P"); + + r.push(`The first necessary step is to prepare the donatrix.`); + addPartner(slave, impregnatrix); + const belly = bellyAdjective(slave); + const superfetation = (slave.geneticQuirks.superfetation === 2 && slave.pregKnown === 1) ? 1 : 0; + const penCountBonus = random(6, 20); + const analCountBonus = penCountBonus; + const vagCountBonus = penCountBonus; + impregnatrix.counter.penetrative += penCountBonus + 1; + V.penetrativeTotal += penCountBonus + 1; + + const assPussy = (slave.mpreg === 1) ? `ass` : `pussy`; + const assCunt = (slave.mpreg === 1) ? `ass` : `cunt`; + const prostate = (impregnatrix.prostate !== 0) ? `prostate` : `internals`; + + if (impregnatrix.fetish === "pregnancy" && impregnatrix.fetishKnown === 1 && impregnatrix.fetishStrength > 60 && impregnatrix.devotion >= -20) { + r.push(`This is very easy, since ${impregnatrix.slaveName} has an impregnation fetish.`); + if (impregnatrix.pregKnown === 1) { + r.push(`${He2}'s pregnant, and as far as ${he2}'s concerned, everyone should be pregnant. ${He}'s <span class="hotpink">happy to spread the love.</span>`); + } else if (isFertile(impregnatrix)) { + r.push(`${He2}'d love to get pregnant ${himself2}, but as far as ${he2}'s concerned, putting a baby in someone else is the <span class="hotpink">next best thing.</span>`); + } else { + r.push(`${He2}'s been deeply unhappy that there's no prospect of ${him2} ever being able to carry a child, and this is the <span class="hotpink">next best thing</span> for ${him2}.`); + } + impregnatrix.devotion += 4; + if (impregnatrix.preg === -3) { + r.push(`${His2} member remains limp despite the prospect of getting another slave pregnant, but a direct injection of vasodilators quickly fixes that for this special occasion.`); + } else { + r.push(`${His2} member springs instantly to attention at the prospect of getting another slave pregnant.`); + } + } else if (impregnatrix.attrXX > 65 && impregnatrix.attrKnown === 1 && impregnatrix.devotion >= -20) { + r.push(`Since ${impregnatrix.slaveName} likes sticking ${his2} cock in girls, ${he2} doesn't take much convincing.`); + if (impregnatrix.preg === -3) { + r.push(`${His2} member remains limp despite the prospect of ${assPussy}, but a direct injection of vasodilators quickly fixes that for this special occasion.`); + } else { + r.push(`${His2} member springs instantly to attention at the prospect of pussy.`); + } + } else if (impregnatrix.devotion > 50) { + r.push(`Since ${impregnatrix.slaveName} is devoted to you, ${he2}'ll eagerly fuck anything you tell ${him2} to fuck.`); + if (impregnatrix.preg === -3) { + r.push(`${He2} accepts a direct injection of vasodilators to counteract the hormones keeping ${him2} soft,`); + } else { + r.push(`${He2} quickly gets ${himself2} hard,`); + } + r.push(`only a certain confusion in ${his2} look betraying that ${he2} realizes how special an occasion this is.`); + } else if (impregnatrix.devotion > 20) { + r.push(`Since ${impregnatrix.slaveName} is obedient, ${he2}'ll fuck anything you tell ${him2} to fuck.`); + if (impregnatrix.preg === -3) { + r.push(`${He2} accepts a direct injection of vasodilators to counteract the hormones keeping ${him2} soft,`); + } else { + r.push(`${He2} hurriedly gets ${himself2} hard,`); + } + r.push(`only a slight hesitation betraying ${his2} realization that this is a special occasion.`); + } else if (impregnatrix.devotion >= -20) { + r.push(`Since ${impregnatrix.slaveName} does not resist your will, ${he2} should comply reasonably well.`); + if (impregnatrix.preg === -3) { + r.push(`${He2} accepts a direct injection of vasodilators to counteract the hormones keeping ${him2} soft,`); + } else { + r.push(`${He2} has to work to get ${himself2} hard despite ${his2} doubts,`); + } + r.push(`fear and disgust showing on ${his2} face as ${he2} absorbs the perversion of the natural order of things ${he2}'s about to experience.`); + } else { + r.push(`Since ${impregnatrix.slaveName} is unlikely to comply willingly, you simply restrain ${him2} and administer a massive dose of vasodilators, directly where they will do the most good. ${impregnatrix.slaveName} writhes with the pain of the injection, which is compounded as ${he2} springs agonizingly erect.`); + } + + App.Events.addParagraph(node, r); + r = []; + + r.push(`Next, you see to ${slave.slaveName}.`); + + if (slave.mpreg === 1) { + slave.counter.anal += analCountBonus + 1; + V.analTotal += analCountBonus + 1; + } else { + slave.counter.vaginal += vagCountBonus + 1; + V.vaginalTotal += vagCountBonus + 1; + } + + if ((slave.fetish === "pregnancy" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && slave.vagina === 0) || (slave.anus === 0 && slave.mpreg === 1)) { + r.push(`${He} cries with joy and presents ${his} virgin ${assPussy} to ${impregnatrix.slaveName} for`); + if (superfetation === 1) { + r.push(`repeat`); + } + r.push(`fertilization. <span class="hotpink">${He} is grateful</span> for this fulfillment of ${his} fondest wish and naturally <span class="lime">will break in ${his} ${assPussy}.</span>`); + if (slave.mpreg === 1) { + slave.anus = 1; + } else { + slave.vagina = 1; + } + slave.devotion += 10; + } else if (slave.fetish === "pregnancy" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`${He} cries with joy and presents ${his} fertile ${assPussy} to ${impregnatrix.slaveName} for`); + if (superfetation === 1) { + r.push(`further`); + } + r.push(`breeding. <span class="hotpink">${He} is grateful</span> for this fulfillment of ${his} fondest wish.`); + slave.devotion += 4; + } else if (slave.devotion > 20 && (slave.vagina === 0 || (slave.anus === 0 && slave.mpreg === 1))) { + r.push(`${He} accepts your orders without comment and presents ${his} virgin ${assPussy} to ${impregnatrix.slaveName} for fertilization. ${He} gasps in shock when ${he} feels ${his2} hot seed. <span class="hotpink">${He} is broken to slavery</span> by this application of ${his} body, which naturally <span class="lime">will break in ${his} ${assPussy}.</span>`); + if (slave.mpreg === 1) { + slave.anus = 1; + } else { + slave.vagina = 1; + } + slave.devotion += 10; + } else if (slave.devotion >= -20 && (slave.vagina === 0 || (slave.anus === 0 && slave.mpreg === 1))) { + r.push(`${He} is clearly unhappy at the idea of losing ${his} pearl of great price to ${impregnatrix.slaveName}; this probably isn't what ${he} imagined ${his} first real sex would be like. Worse, ${he} knows ${he}'s fertile and realizes`); + if (superfetation === 1) { + r.push(`${his} existing pregnancy is of little concern to the new life likely to take root in ${him}.`); + } else { + r.push(`${he}'ll likely get pregnant.`); + } + r.push(`Nevertheless, <span class="hotpink">${he} is broken to slavery</span> by this application of ${his} body, which naturally <span class="lime">will break in ${his} ${assPussy}.</span>`); + if (slave.mpreg === 1) { + slave.anus = 1; + } else { + slave.vagina = 1; + } + slave.devotion += 4; + } else if (slave.vagina === 0 || (slave.anus === 0 && slave.mpreg === 1)) { + r.push(`As you anticipated, ${he} refuses to give ${impregnatrix.slaveName} ${his} virginity. You restrain ${him} despite ${his} <span class="mediumorchid">horrified tears</span> and <span class="gold">frightened begging.</span> Naturally, this cruel tableau <span class="lime">will break in ${his} ${assPussy}.</span>`); + slave.devotion -= 5; + slave.trust -= 5; + if (slave.mpreg === 1) { + slave.anus = 1; + } else { + slave.vagina = 1; + } + } else if (isAmputee(slave)) { + r.push(`You set ${his} limbless torso up for ${impregnatrix.slaveName}.`); + } else if (tooBigBelly(slave)) { + r.push(`You set ${him} up for ${impregnatrix.slaveName}, face-down so ${he} may rest helplessly against ${his} ${belly} belly.`); + } else if (tooBigBreasts(slave)) { + r.push(`You set ${him} up for ${impregnatrix.slaveName}, face-${(slave.belly >= 60000) ? `up` : `down`} so the weight of ${his} tits pins ${him} helplessly in place.`); + } else if (tooBigButt(slave)) { + r.push(`You set ${him} up for ${impregnatrix.slaveName}, face-down so the weight of ${his} giant ass pins ${him} helplessly in place and gives ${impregnatrix.slaveName} a lovely cushion to thrust against.`); + } else if (tooBigDick(slave)) { + r.push(`You set ${him} up for ${impregnatrix.slaveName}, face-up so ${he} is pinned under the weight of ${his} giant cock.`); + } else if (tooBigBalls(slave)) { + r.push(`You set ${him} up for ${impregnatrix.slaveName}, face-${(slave.belly >= 60000) ? `up` : `down`} so the weight of ${his} giant balls anchor ${him} helplessly in place.`); + } else if (slave.fetish === "submissive" && slave.fetishStrength > 60 && slave.fetishStrength > 60 && slave.fetishKnown === 1) { + r.push(`${He} is accustomed to submit to you, but as a natural submissive ${he} doesn't have much trouble submitting to ${impregnatrix.slaveName}'s seed instead.`); + } else if (slave.devotion < -20) { + r.push(`${He} tries to refuse, so you restrain ${him} despite ${his} resistance to the idea of being made a breeder.`); + } else if (slave.devotion <= 20) { + r.push(`${He} obeys your orders reluctantly, arranging ${himself} for ${(slave.mpreg === 1) ? `anal` : `vaginal`} sex despite ${his} obvious hesitation to be made a breeder.`); + } else if (slave.devotion < 10) { + r.push(`${He} obeys your orders, arranging ${himself} for ${(slave.mpreg === 1) ? `anal` : `vaginal`} sex despite ${his} slight hesitation at the idea of being made a breeder.`); + } else { + r.push(`${He} happily obeys your orders, getting ready to serve ${his} ${getWrittenTitle(slave)} by making ${himP} another slave.`); + } + + knockMeUp(slave, 100, 2, impregnatrix.ID); + + App.Events.addParagraph(node, r); + r = []; + + if (slave.devotion < -20 && impregnatrix.devotion < -20) { + r.push(`Since you have two restrained slaves, it's up to you to do all the work. You put ${slave.slaveName} on the couch with ${his} ${assPussy} available, and then maneuver ${impregnatrix.slaveName}'s dick into place. The two slaves make no further moves until you deal ${impregnatrix.slaveName} a terrific swat across the ass and promise to give ${him2} more of the same until ${he2} gets going. After watching them mechanically go at it for a while, you stop ${impregnatrix.slaveName}, insert an electrostimulator up ${his2} rectum, and administer a shock to ${his2} ${prostate} that forces ${him2} to empty ${his2} nuts into ${slave.slaveName}. Both slaves <span class="mediumorchid">resent</span> what you made them do and <span class="gold">fear you</span> as a result.`); + slave.devotion -= 5; + slave.trust -= 5; + impregnatrix.devotion -= 5; + impregnatrix.trust -= 5; + impregnatrix.counter.anal += 1; + V.analTotal += 1; + if (impregnatrix.anus === 0) { + r.push(`${impregnatrix.slaveName} would have been reluctant to <span class="lime">lose ${his2} anal virginity</span> in any case, but being assraped by a metal probe that shocked ${him2} into orgasm so that ${he2} would impregnate another slave is <span class="mediumorchid">a special level</span> of violation for ${him2}.`); + impregnatrix.devotion -= 5; + impregnatrix.anus = 1; + } + } else if (impregnatrix.devotion < -20) { + r.push(`Since your semen donatrix is restrained, you order ${slave.slaveName} to present ${himself} on the couch, and then maneuver ${impregnatrix.slaveName}'s dick into place. ${slave.slaveName} does ${his} best to hump ${himself} against the unwilling cock until you deal ${impregnatrix.slaveName} a terrific swat across the ass and promise to give ${him2} more of the same until ${he2} gets going. After watching ${him2} mechanically fuck for a while, you stop ${him2}, push an electrostimulator up ${his2} butt, and administer a shock to ${his2} ${prostate} that forces ${him2} to empty ${his2} nuts into ${slave.slaveName}. ${He} <span class="mediumorchid">resents</span> what you made ${him2} do and <span class="gold">fears you</span> as a result. Though ${slave.slaveName} accepts the situation, ${he} looks into ${impregnatrix.slaveName}'s eyes with obvious apology.`); + impregnatrix.devotion -= 5; + impregnatrix.trust -= 5; + impregnatrix.counter.anal += 1; + V.analTotal += 1; + if (impregnatrix.anus === 0) { + r.push(`${impregnatrix.slaveName} would have been reluctant to <span class="lime">lose ${his2} anal virginity</span> in any case, but being assraped by a metal probe that shocked ${him2} into orgasm so that ${he2} would impregnate another slave is <span class="mediumorchid">a special level</span> of violation for ${him2}.`); + impregnatrix.devotion -= 5; + impregnatrix.anus = 1; + } + } else if (impregnatrix.fetish === "pregnancy" && impregnatrix.fetishStrength > 60 && impregnatrix.devotion > 20 && slave.devotion < -20) { + r.push(`You arrange ${slave.slaveName} on the couch with ${his} fertile pussy defenseless and available, and then tell the randy ${impregnatrix.slaveName} that it's all ${hers2}. The slave life has so affected ${impregnatrix.slaveName} that ${he2} is quite eager to rape another slave pregnant${(superfetation === 1) ? `, even more so since ${he} is already with child` : ``} to fulfill ${his2} desire to reproduce. ${He2} finishes with indecent speed and looks almost disappointed until you tell ${him2} to take ${his2} time and be thorough. By the end of the day ${slave.slaveName}'s ${assCunt} is dripping cum, to ${his} <span class="gold">horror</span> and <span class="mediumorchid">resentment,</span> while ${impregnatrix.slaveName} is lying next to ${him} on the couch in a state of obvious <span class="hotpink">satiation and bliss.</span> ${impregnatrix.slaveName} kisses ${slave.slaveName}'s ${belly} stomach and expresses the hope that ${he}'ll produce a good new slave.`); + + slave.devotion -= 5; + slave.trust -= 5; + impregnatrix.devotion += 4; + } else if (impregnatrix.energy > 95 && impregnatrix.devotion > 20 && slave.devotion < -20) { + r.push(`You arrange ${slave.slaveName} on the couch with ${his} fertile ${assPussy} defenseless and available, and then tell the randy ${impregnatrix.slaveName} that it's all ${hers2}. The slave life has so affected ${impregnatrix.slaveName} that ${he2} is quite eager to rape another slave pregnant${(superfetation === 1) ? `, especially since ${he} is already with child` : ``}, just for the perverted novelty of the act. ${He2} blows ${his2} load with indecent speed and looks crushed until you tell ${him2} to take ${his2} time and be thorough. By the end of the day ${slave.slaveName}'s ${(slave.mpreg === 1) ? `anus` : `cunt`} is dripping cum, to ${his} <span class="gold">horror</span> and <span class="mediumorchid">resentment,</span> while ${impregnatrix.slaveName} is lying next to ${him} on the couch in a state of obvious <span class="hotpink">satiation and bliss.</span> ${impregnatrix.slaveName} kisses ${slave.slaveName}'s ${belly} stomach and expresses the hope that you'll let ${him2} do this again ${(superfetation === 1) ? `soon` : `sometime`}.`); + slave.devotion -= 5; + slave.trust -= 5; + impregnatrix.devotion += 4; + } else if (slave.devotion <= 20 || impregnatrix.devotion <= 20) { + r.push(`You order ${slave.slaveName} onto the couch and tell ${impregnatrix.slaveName} to get on with it. They fuck mechanically, gazing with roiling emotions into each others' eyes. They do seem to come to some sort of a nonverbal understanding on the necessity of getting it done, and there is no real unhappiness in either of them when they finish and disentangle themselves, with ${impregnatrix.slaveName}'s rapidly softening dick slipping easily out of ${slave.slaveName}'s cum-filled ${assPussy}.`); + } else if (slave.devotion <= 50 || impregnatrix.devotion <= 50) { + r.push(`You order ${slave.slaveName} and ${impregnatrix.slaveName} to get on with it. They fuck mechanically at first, gazing with roiling emotions into each others' eyes. Eventually, they begin to enjoy the extreme intimacy of the act, finding between themselves a hint of a life before slavery, when men and women had sex within the bonds of marriage for the purpose of procreation${(superfetation === 1) ? `, even though one of them is already heavy with child` : ``}. They finish and resume life as slaves, the light of this intimacy diminishing, softening with ${impregnatrix.slaveName}'s dick and dripping away with the contents of ${slave.slaveName}'s cum-filled ${assPussy}.`); + } else if (slave.mpreg === 1) { + r.push(`The parents-to-be need little encouragement. They embrace happily and turn eagerly to the business of anal sex in`); + if (slave.belly + impregnatrix.belly >= 5000) { + r.push(`an awkward`); + } else { + r.push(`the`); + } + r.push(`cowgirl position. They take their time, humping slowly and gazing into each others' eyes. After a little while, though, ${slave.slaveName} looks over to where you're sitting, the invitation clear in ${his} eyes. As soon as you stand to come over, ${slave.slaveName} turns around on ${impregnatrix.slaveName}'s cock and opens wide for you. You and ${impregnatrix.slaveName} enjoy the`); + if (superfetation === 1) { + r.push(`gravid ${girl}`); + } else { + r.push(`mother-to-be`); + } + r.push(`gently until ${he} climaxes, ${his} eager oral reaching a fever pitch, bringing you to your own climax.`); + if (V.PC.dick !== 0) { + if (canDoVaginal(impregnatrix)) { + r.push(`Pulling out, you flip them again so that ${impregnatrix.slaveName} is on top and switch to ${his2} pussy instead, stimulating ${his2} ${prostate} with a good fucking until ${he2} blows ${his2} load into ${slave.slaveName}'s fertile ${assCunt}. The two of them collapse into an exhausted, <span class="hotpink">happy</span> pile of slave flesh with three loads inside them.`); + if (impregnatrix.vagina === 0) { + r.push(`${impregnatrix.slaveName} will certainly remember this <span class="hotpink">very special</span> day for many reasons, including it being ${his2} <span class="lime">first time</span> as ${he2} inseminated ${slave.slaveName}.`); + impregnatrix.devotion += 4; + impregnatrix.vagina = 1; + } + if (canImpreg(impregnatrix, V.PC)) { + knockMeUp(impregnatrix, 10, 0, -1); + } + impregnatrix.counter.vaginal += penCountBonus; + V.vaginalTotal += penCountBonus; + } else if (canDoAnal(impregnatrix)) { + r.push(`Pulling out, you flip them again so that ${impregnatrix.slaveName} is on top and switch to ${his2} ass instead, stimulating ${his2} ${prostate} with a good assfuck until ${he2} blows ${his2} load into ${slave.slaveName}'s fertile ${assCunt}. The two of them collapse into an exhausted, <span class="hotpink">happy</span> pile of slave flesh with three loads inside them.`); + if (impregnatrix.anus === 0) { + r.push(`${impregnatrix.slaveName} will certainly remember this <span class="hotpink">very special</span> day for many reasons, including taking ${his2} <span class="lime">first buttfuck</span> as ${he2} inseminated ${slave.slaveName}.`); + impregnatrix.devotion += 4; + impregnatrix.anus = 1; + } + if (canImpreg(impregnatrix, V.PC)) { + knockMeUp(impregnatrix, 10, 1, -1); + } + impregnatrix.counter.anal += penCountBonus; + V.analTotal += penCountBonus; + } else { + r.push(`The two of them collapse into an exhausted, <span class="hotpink">happy</span> pile of slave flesh.`); + } + } else { + if (canDoVaginal(impregnatrix)) { + r.push(`Pulling back, you flip them again so that ${impregnatrix.slaveName} is on top and don a strap-on. You begin stimulating ${his2} ${prostate} with a good fucking until ${he2} blows ${his2} load into ${slave.slaveName}'s fertile ${assCunt}. The two of them collapse into an exhausted, <span class="hotpink">happy</span> pile of slave flesh.`); + if (impregnatrix.vagina === 0) { + r.push(`${impregnatrix.slaveName} will certainly remember this <span class="hotpink">very special</span> day for many reasons, including it being ${his2} <span class="lime">first time</span> as ${he2} inseminated ${slave.slaveName}.`); + impregnatrix.devotion += 4; + impregnatrix.vagina = 1; + } + impregnatrix.counter.vaginal += penCountBonus; + V.vaginalTotal += penCountBonus; + } else if (canDoAnal(impregnatrix)) { + r.push(`Pulling back, you flip them again so that ${impregnatrix.slaveName} is on top and don a strap-on. You begin stimulating ${his2} ${prostate} with a good assfuck until ${he2} blows ${his2} load into ${slave.slaveName}'s fertile ${assCunt}. The two of them collapse into an exhausted, <span class="hotpink">happy</span> pile of slave flesh.`); + impregnatrix.counter.anal += penCountBonus; + V.analTotal += penCountBonus; + if (impregnatrix.anus === 0) { + r.push(`${impregnatrix.slaveName} will certainly remember this <span class="hotpink">very special</span> day for many reasons, including taking ${his2} <span class="lime">first buttfuck</span> as ${he2} inseminated ${slave.slaveName}.`); + impregnatrix.devotion += 4; + impregnatrix.anus = 1; + } + } else { + r.push(`The two of them collapse into an exhausted, <span class="hotpink">happy</span> pile of slave flesh.`); + } + } + impregnatrix.counter.oral += penCountBonus; + V.oralTotal += penCountBonus; + slave.devotion += 4; + impregnatrix.devotion += 4; + } else { + let didImpregnatrix = 0; + r.push(`The parents-to-be need little encouragement. They embrace happily and turn eagerly to the business of vanilla sex in`); + if (slave.belly + impregnatrix.belly >= 5000) { + r.push(`an awkward`); + } else { + r.push(`the`); + } + r.push(`missionary position. They take their time, humping slowly and gazing into each others' eyes. After a little while, though, ${slave.slaveName} looks over ${impregnatrix.slaveName}'s shoulder to where you're sitting, the invitation clear in ${his} eyes. As soon as you stand to come over, they roll over without being ordered to`); + if (canDoAnal(slave)) { + r.push(`present ${slave.slaveName}'s butthole.`); + + slave.counter.anal += penCountBonus; + V.analTotal += penCountBonus; + } else { + r.push(`invite you into ${slave.slaveName}'s crowded pussy.`); + + slave.counter.vaginal += penCountBonus; + V.vaginalTotal += penCountBonus; + } + r.push(`You and ${impregnatrix.slaveName} double penetrate the`); + if (superfetation === 1) { + r.push(`gravid ${girl}`); + } else { + r.push(`mother-to-be`); + } + r.push(`gently until ${he} climaxes, clenching you to orgasm in turn with ${his} spasms. Pulling out, you offer`); + if (V.PC.dick !== 0) { + r.push(`yourself`); + } else { + r.push(`your strap-on`); + } + r.push(`to ${slave.slaveName}'s gasping mouth so ${he} can`); + + if (V.PC.dick !== 0) { + r.push(`suck you hard again`); + } else { + r.push(`lube the phallus with some saliva`); + } + r.push(`as ${he} continues riding cock. Once`); + if (V.PC.dick !== 0) { + r.push(`stiff,`); + } else { + r.push(`the strap-on is nice and wet,`); + } + r.push(`you flip them again so that ${impregnatrix.slaveName} is back on top and switch to ${his2}`); + if (canDoVaginal(impregnatrix)) { + r.push(`feminine slit instead, stimulating ${his2} ${prostate} with a hard fucking`); + didImpregnatrix = 1; + } else if (canDoAnal(impregnatrix)) { + r.push(`ass instead, stimulating ${his2} ${prostate} with a good assfuck`); + didImpregnatrix = 2; + } else { + r.push(`mouth instead, giving ${him2} a good facefuck`); + impregnatrix.counter.oral += penCountBonus; + V.oralTotal += penCountBonus; + } + r.push(`until ${he2} blows ${his2} load into ${slave.slaveName}'s fertile cunt. The two of them collapse into an exhausted, <span class="hotpink">happy</span> pile of slave flesh with three loads inside them.`); + slave.devotion += 4; + impregnatrix.devotion += 4; + if (didImpregnatrix === 1) { + if (impregnatrix.vagina === 0) { + r.push(`${impregnatrix.slaveName} will certainly remember this <span class="hotpink">very special</span> day for many reasons, including losing ${his2} <span class="lime">virginity</span> as ${he2} inseminated ${slave.slaveName}.`); + impregnatrix.devotion += 4; + impregnatrix.vagina = 1; + } + impregnatrix.counter.vaginal += penCountBonus; + V.vaginalTotal += penCountBonus; + if (canImpreg(impregnatrix, V.PC)) { + knockMeUp(impregnatrix, 10, 0, -1); + } + } else if (didImpregnatrix === 2) { + if (impregnatrix.anus === 0) { + r.push(`${impregnatrix.slaveName} will certainly remember this <span class="hotpink">very special</span> day for many reasons, including taking ${his2} <span class="lime">first buttfuck</span> as ${he2} inseminated ${slave.slaveName}.`); + impregnatrix.devotion += 4; + impregnatrix.anus = 1; + } + impregnatrix.counter.anal += penCountBonus; + V.analTotal += penCountBonus; + if (canImpreg(impregnatrix, V.PC)) { + knockMeUp(impregnatrix, 10, 1, -1); + } + } + if (slave.anus === 0 && canDoAnal(slave)) { + r.push(`${slave.slaveName}`); + r.push(`has been used as a slave in a truly thorough way today: ${he} has <span class="hotpink">accepted</span> both ${his} <span class="lime">first anal</span> and insemination by ${impregnatrix.slaveName}.`); + slave.devotion += 4; + slave.anus = 1; + } + } + + r.push(`Throughout the week, you keep ${slave.slaveName}'s ${assPussy} intimate with ${impregnatrix.slaveName}'s cock. In the end, you are certain ${slave.slaveName}`); + if (superfetation === 1) { + r.push(`has <span class="lime">added ${impregnatrix.slaveName}'s child</span> to ${his} pregnancy.`); + } else { + r.push(`is <span class="lime">carrying ${impregnatrix.slaveName}'s child.</span>`); + } + + if (V.arcologies[0].FSRestart !== "unset" && V.eugenicsFullControl !== 1) { + r.push(`Rumors spread about you breeding your slaves; the Societal Elite are <span class="red">displeased</span> by these rumors.`); + V.failedElite += 1; + } + if (V.arcologies[0].FSGenderRadicalist !== "unset" && slave.mpreg === 1) { + r.push(`Society <span class="green">approves</span> of your breeding your slave's ass; this advances the ideal all a slave needs is their rear.`); + repX(V.FSSingleSlaveRep * (V.arcologies[0].FSGenderRadicalist / V.FSLockinLevel), "futureSocieties", slave); + V.arcologies[0].FSGenderRadicalist += 0.05 * V.FSSingleSlaveRep; + } else if (V.arcologies[0].FSGenderFundamentalist !== "unset" && slave.mpreg === 1) { + r.push(`Society <span class="red">is disgusted</span> by this degenerate form of reproduction.`); + repX(forceNeg(V.FSSingleSlaveRep * (V.arcologies[0].FSGenderFundamentalist / V.FSLockinLevel)), "futureSocieties", slave); + V.arcologies[0].FSGenderFundamentalist -= 0.05 * V.FSSingleSlaveRep; + } else if (V.arcologies[0].FSGenderFundamentalist !== "unset") { + r.push(`Society <span class="green">approves</span> of your breeding your slaves; this advances the ideal of a durable, self propagating race of slaves.`); + repX(V.FSSingleSlaveRep * (V.arcologies[0].FSGenderFundamentalist / V.FSLockinLevel), "futureSocieties", slave); + V.arcologies[0].FSGenderFundamentalist += 0.05 * V.FSSingleSlaveRep; + } + + App.Events.addParagraph(node, r); + r = []; + + r.push(`You prepare the necessary file on their possible offspring. Upon birth, it will be remanded to a slave orphanage to be raised to the age of ${V.minimumSlaveAge} and then sold, but its likely appearance and traits are already worth noting. ${slave.slaveName} and ${impregnatrix.slaveName} are likely to produce`); + + if (V.seeRace === 1) { + if (slave.race === "white" && impregnatrix.race === "white") { + r.push(`a pure white,`); + } else if (slave.race === "asian" && impregnatrix.race === "asian") { + r.push(`a pure Asian,`); + } else if (slave.race === "latina" && impregnatrix.race === "latina") { + r.push(`a pure latina,`); + } else if (slave.race === "black" && impregnatrix.race === "black") { + r.push(`a pure black,`); + } else if (slave.race === "middle eastern" && impregnatrix.race === "middle eastern") { + r.push(`a pure Middle Eastern,`); + } else if (slave.race === "malay" && impregnatrix.race === "malay") { + r.push(`a pure malay,`); + } else if (slave.race === "white" && impregnatrix.race === "black") { + r.push(`a mulatto,`); + } else if (slave.race === "black" && impregnatrix.race === "white") { + r.push(`a mulatto,`); + } else if (slave.race === "white" && impregnatrix.race === "latina") { + r.push(`a mestizo,`); + } else if (slave.race === "latina" && impregnatrix.race === "white") { + r.push(`a mestizo,`); + } else if (slave.race === "asian" && impregnatrix.race === "black") { + r.push(`an Afro-Asian,`); + } else if (slave.race === "black" && impregnatrix.race === "asian") { + r.push(`an Afro-Asian,`); + } else if (slave.race === "middle eastern" && impregnatrix.race === "black") { + r.push(`an Afro-Arab,`); + } else if (slave.race === "black" && impregnatrix.race === "middle eastern") { + r.push(`an Afro-Arab,`); + } else if (slave.race === "indo-aryan" && impregnatrix.race === "black") { + r.push(`an Afro-Indian,`); + } else if (slave.race === "black" && impregnatrix.race === "indo-aryan") { + r.push(`an Afro-Indian,`); + } else if (slave.race === "amerindian" && impregnatrix.race === "white") { + r.push(`a mestizo,`); + } else if (slave.race === "white" && impregnatrix.race === "amerindian") { + r.push(`a mestizo,`); + } else if (slave.race === "catgirl" || impregnatrix.race === "catgirl") { + r.push(`a catgirl,`); + } else if (slave.race === impregnatrix.race && slave.race !== "mixed race" && impregnatrix.race !== "mixed race") { + r.push(`an ethnically pure,`); + } else if (slave.race !== impregnatrix.race && slave.race !== "mixed race" && impregnatrix.race !== "mixed race") { + r.push(`a biracial,`); + } else { + r.push(`mixed ethnicity,`); + } + } + + if ((slave.intelligence + impregnatrix.intelligence) / 2 > 95) { + r.push(`brilliant,`); + } else if ((slave.intelligence + impregnatrix.intelligence) / 2 > 15) { + r.push(`smart,`); + } else if ((slave.intelligence + impregnatrix.intelligence) / 2 < -95) { + r.push(`cretinous,`); + } else if ((slave.intelligence + impregnatrix.intelligence) / 2 < -15) { + r.push(`stupid,`); + } + + if ((slave.height + impregnatrix.height) > 185) { + r.push(`tall,`); + } else if ((slave.height + impregnatrix.height) < 160) { + r.push(`short,`); + } else { + r.push(`middle height,`); + } + + if ((slave.boobs + impregnatrix.boobs - slave.boobsImplant - impregnatrix.boobsImplant - impregnatrix.boobsMilk) > 1500) { + r.push(`big-titted`); + } else if ((slave.boobs + impregnatrix.boobs - slave.boobsImplant - impregnatrix.boobsImplant - impregnatrix.boobsMilk) < 700) { + r.push(`flat-chested`); + } else { + r.push(`moderately-breasted`); + } + + if ((slave.butt + impregnatrix.butt - slave.buttImplant - impregnatrix.buttImplant) > 9) { + r.push(`slave with a huge ass.`); + } else if ((slave.butt + impregnatrix.butt - slave.buttImplant - impregnatrix.buttImplant) < 5) { + r.push(`slave with a flat ass.`); + } else { + r.push(`slave with a decent ass.`); + } + + App.Events.addParagraph(node, r); + return node; + } +}; diff --git a/src/npc/interaction/passage/fSlaveImpreg.tw b/src/npc/interaction/passage/fSlaveImpreg.tw deleted file mode 100644 index 873c0b8f0c5866070ee866fc3186abf24273d662..0000000000000000000000000000000000000000 --- a/src/npc/interaction/passage/fSlaveImpreg.tw +++ /dev/null @@ -1,47 +0,0 @@ -:: FSlaveImpreg [nobr] - -<<set $impregnatrix = 0>> -<<set $nextLink = "Slave Interact">> -<<set $nextButton = "Back">> - -<p class="scene-intro"> - <<= getSlave($AS).slaveName>> is fertile; now you must select a slave with both a penis and potent testicles. -</p> - -<h3>Select an eligible slave to serve as the semen donatrix</h3> - -<<set _eligibles = $slaves.filter((s) => (s.ID != $AS) && canImpreg(getSlave($AS), s) && canPenetrate(s))>> -<<set _kinship = ibc.kinship_one_many(getSlave($AS), _eligibles)>> -<<for _i = 0; _i < _eligibles.length; _i++>> - <<set _name = SlaveFullName(_eligibles[_i])>> - <div> - <<print "[[_name|FSlaveImpreg Consummate][$impregnatrix = _eligibles[" + _i + "]]]">> - <<if _eligibles[_i].custom.label>> - (@@.yellow;''<<print _eligibles[_i].custom.label>>''@@) - <</if>> - <<if totalRelatives(getSlave($AS)) > 0>> - <<set _relTerm = relativeTerm(getSlave($AS), _eligibles[_i])>> - <<if _relTerm != null>> - @@.lightgreen;<<= capFirstChar(_relTerm)>>@@ - <</if>> - <</if>> /* closes extended family mode */ - <<if $inbreeding && _kinship[_eligibles[_i].ID] > 0>> - <<set _thisKinship = _kinship[_eligibles[_i].ID]>> - <<if _thisKinship >= 0.5>> - (Extreme - <<elseif _thisKinship >= 0.25>> - (Major - <<elseif _thisKinship >= 0.125>> - (Some - <<elseif _thisKinship >= 0.0625>> - (Minor - <<else>> - (Slight - <</if>> - inbreeding, CoI of <<print _thisKinship>>) - <</if>> - </div> -<</for>> -<<if (_eligibles.length === 0)>> - //You have no slaves capable of inseminating others.// -<</if>> diff --git a/src/npc/interaction/passage/fSlaveSlaveDick.js b/src/npc/interaction/passage/fSlaveSlaveDick.js new file mode 100644 index 0000000000000000000000000000000000000000..3cbb861ba7970585907e8de1c05d585f04e159ae --- /dev/null +++ b/src/npc/interaction/passage/fSlaveSlaveDick.js @@ -0,0 +1,1285 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {HTMLElement} + */ +App.Interact.fSlaveSlaveDick = function(slave) { + const node = document.createElement("div"); + + App.UI.DOM.appendNewElement("div", node, `Select a slave that will ride ${slave.slaveName}.`); + App.UI.DOM.appendNewElement("h2", node, `Select an eligible slave`); + + const _eligibles = V.slaves.filter((s) => (s.ID !== slave.ID) && isSlaveAvailable(s) && canDoVaginal(s) && canStand(s) /* amp-amp scene is not written */); + for (const eligible of _eligibles) { + const div = App.UI.DOM.appendNewElement("div", node); + div.append(App.UI.DOM.link( + SlaveFullName(eligible), + () => { + jQuery(node).empty().append(content(eligible)); + } + )); + if (eligible.custom.label) { + App.UI.DOM.appendNewElement("span", div, ` ${eligible.custom.label}`, ["yellow", "bold"]); + } + if (canImpreg(eligible, slave)) { + App.UI.DOM.appendNewElement("span", div, ` Fertile`, "green"); + } + if (totalRelatives(slave) > 0) { + const _relTerm = relativeTerm(slave, eligible); + if (_relTerm !== null) { + App.UI.DOM.appendNewElement("span", div, ` ${capFirstChar(_relTerm)}`, "lightgreen"); + } + } + } + if (_eligibles.length === 0) { + App.UI.DOM.appendNewElement("div", node, `You have no slaves capable of this act.`, "note"); + } + return node; + + function content(rapist) { + const el = new DocumentFragment(); + let r = []; + const { + He, His, + he, his, him, himself, hers + } = getPronouns(slave); + + const { + He2, + he2, his2, him2, himself2, hers2 + } = getPronouns(rapist).appendSuffix("2"); + let _bottomDrugged; + let _incestMood; + + let _dickSize; + if (slave.dick) { + if (slave.dick === 1) { + _dickSize = "tiny"; + } else if (slave.dick === 2) { + _dickSize = "tiny"; + } else if (slave.dick === 3) { + _dickSize = "average"; + } else if (slave.dick === 4) { + _dickSize = "big"; + } else if (slave.dick === 5) { + _dickSize = "huge"; + } else if (slave.dick === 6) { + _dickSize = "gigantic"; + } else if (slave.dick === 7) { + _dickSize = "titanic"; + } else if (slave.dick === 8) { + _dickSize = "absurd"; + } else if (slave.dick >= 9) { + _dickSize = "inhuman"; + } + } + + const _isIncest = areRelated(slave, rapist); + + r.push(`You take a look at the bound cock toy.`); + + if (slave.fetish === "mindbroken" && slave.career !== "a dairy cow" && slave.career !== "a breeding bull") { + r.push(`Since ${slave.slaveName} is mentally broken, the restraints don't do anything but set the scene.`); + } else if (slave.devotion > 50) { + r.push(`Since ${slave.slaveName} is devoted, ${his} restraints are more for the show than for practical purposes.`); + } else if (slave.devotion > 20) { + r.push(`${slave.slaveName} is obedient but not devoted, so ${his} restraints are firm for ${his} own good.`); + } else { + r.push(`${slave.slaveName} is unlikely to comply willingly, and is tied down tight, unable to budge more than`); + if (V.showInches === 2) { + r.push(`an inch.`); + } else { + r.push(`a centimeter.`); + } + } + + if (isAmputee(slave)) { + r.push(`${His} limbless torso lies on the bed, ready for ${rapist.slaveName}.`); + } else if (tooBigBelly(slave)) { + r.push(`${His} huge belly will limit the number of possible positions for ${rapist.slaveName} to take ${him} in.`); + } else if (tooBigBreasts(slave)) { + r.push(`The weight of ${his} tits pins ${him} helplessly in place.`); + } else if (tooBigButt(slave)) { + r.push(`${His} huge ass pushes ${his} pelvis further up, making it look as if ${he}'s trying to fuck the air.`); + } else if (tooBigDick(slave)) { + r.push(`${His} huge cock is clearly going to be a challenge.`); + } else if (tooBigBalls(slave)) { + r.push(`${His} huge balls might get a bit in the way in this position.`); + } else if (tooFatSlave(slave)) { + r.push(`${His} huge gut threatens to envelope ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit.`); + } else { + r.push(`${_dickSize} cock.`); + } + } + + if (slave.fetish === "mindbroken" && slave.career !== "a dairy cow" && slave.career !== "a breeding bull") { + if (slave.energy > 40) { + r.push(`${slave.slaveName}`); + r.push(`is broken mentally, but has a serviceable libido. After a bit of stimulation ${he}'s good to go without any further reaction on ${his} own.`); + } else { + r.push(`${slave.slaveName}`); + r.push(`is broken mentally, and ${his} low libido prevents ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} penis`); + } + r.push(`from becoming erect. A massive dose of vasodilators fixes this, and you think you see ${his} face twitch with the pain, but there is no further reaction.`); + } + } else if (slave.fetish === "mindbroken" && slave.career === "a dairy cow") { + if (slave.energy > 40) { + r.push(`${slave.slaveName}, as a good cow with a good libido, takes only a little fondling before ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} penis`); + } + r.push(`becomes erect. When you let go, ${he} gives a needy moo with a sad expression to ask you to keep going.`); + } else { + r.push(`${slave.slaveName} may be a cow, but ${his} low libido keeps ${his} mostly soft despite plenty of fondling. You inject ${him} with vasodilators so ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} cock`); + } + r.push(`becomes erect, and ${he} moos in discomfort and struggles against ${his} restraints.`); + _bottomDrugged = 1; + } + } else if (slave.fetish === "mindbroken" && slave.career === "a breeding bull") { + r.push(`${slave.slaveName}, as a good bull, was already erect while being tied down. It seems ${he} knows what's going to happen to ${him} soon. Maybe someone at the Cattle Ranch has been sampling their bulls?`); + } else { + if (slave.devotion >= -20) { + if (slave.energy > 40) { + if (slave.fetishKnown === 1) { + if (slave.fetish === "submissive") { + r.push(`${slave.slaveName}`); + r.push(`is a known sub, and seconds after ${he} is ordered to lie down to be restrained ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} cock`); + } + r.push(`is erect. ${He} knows ${he}'s going to get used, and can't hide ${his} excitement.`); + } else if (slave.fetish === "dom") { + r.push(`${slave.slaveName} is a known dom, and needs some stimulation before ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} cock`); + } + r.push(`becomes hard. Despite knowing ${he}'s going to be used, ${he} can't hide ${his} curiosity to experience what the other side feels.`); + } else if (slave.fetish === "masochist") { + r.push(`${slave.slaveName} almost gets off on being tied down tight, sporting a`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} erection`); + } + r.push(`once you have finished. ${His} nipples are firm as well, and ${he} struggles against ${his} restraints to feel them dig into ${him} tighter.`); + } else if (slave.fetish === "sadist") { + r.push(`${slave.slaveName} is a sadist, and finds ${himself} in the exact opposite position ${he}'d want to be in to get off. It's obvious ${he}'s not going to get aroused soon, so you inject ${him} with vasodilators so ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} cock`); + } + r.push(`becomes erect and hope ${he} at least learns something from being on the receiving end for once.`); + _bottomDrugged = 1; + } else if (slave.fetish === "humiliation") { + r.push(`${slave.slaveName} gets off on humiliation, and after being ordered to lay naked on a bed to be tied down, becomes flushed with arousal with ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} cock`); + } + r.push(`throbbing in anticipation at being used like a toy.`); + } else if (slave.fetish === "pregnancy" && V.arcologies[0].FSRepopulationFocus !== "unset" && canPenetrate(slave)) { + r.push(`${slave.slaveName} gets off thinking about pregnancy, and in your arcology most women are pregnant or fertile. ${He} knows someone's pussy will be around ${his} ${_dickSize} cock soon, and is clearly lost in ${his} fantasies as ${his} cock swells to a throbbing erection.`); + } + } else if (slave.attrXX > 65) { + r.push(`${slave.slaveName} has a good sex drive and likes pussy, even before ${he}'s fully bound ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} cock`); + } + r.push(`is throbbing in anticipation.`); + } else { + r.push(`Despite ${his} adequate sex drive, since ${slave.slaveName} isn't turned on by the prospect of pussy, ${he} takes some manual stimulation before ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} cock`); + } + r.push(`stands erect.`); + } + } else { + if (slave.attrXX > 65) { + r.push(`${slave.slaveName} isn't known for ${his} high libido, but since ${he} likes pussy all it takes is some teasing to get ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} cock`); + } + r.push(`erect and ready.`); + } else { + r.push(`${slave.slaveName} doesn't have a high libido, and also isn't attracted to female slaves. A dose of vasodilators injected at the base of ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} cock`); + } + r.push(`causes ${him} to quickly reach painful readiness, and the unnatural pain makes ${him} strain at ${his} bonds.`); + _bottomDrugged = 1; + } + } + } else { + if (slave.energy > 60) { + if (slave.attrXX > 65) { + r.push(`Although ${slave.slaveName} does not like being a slave, ${his} high libido and love for pussy have ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} erection`); + } + r.push(`ready for sex despite ${his} negative feelings.`); + } else { + r.push(`${slave.slaveName} does not like being a slave, and isn't attracted to women, but with ${his} high libido all it takes is simple teasing for ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} cock`); + } + r.push(`to be ready for sex.`); + } + } else { + r.push(`${slave.slaveName} does not like being a slave, and without a high sex drive ${he} is able to resist stimulation and stay soft. A quick dose of vasodilators changes that, and ${he} moans in pain and struggles against ${his} bonds in vain as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} cock`); + } + r.push(`becomes painfully hard.`); + _bottomDrugged = 1; + } + } + } + + App.Events.addParagraph(el, r); + r= []; + + r.push(`You call ${rapist.slaveName} into the room.`); + + App.Events.addParagraph(el, r); + r= []; + + if (slave.fetish === "mindbroken" && slave.career !== "a dairy cow" && slave.career !== "a breeding bull") { + r.push(`${slave.slaveName} doesn't even notice`); + if (_isIncest) { + if (slave.father === rapist.ID && slave.mother === rapist.ID) { + r.push(`the slave that is both ${his} mother and ${his} father,`); + } else if (rapist.mother === slave.ID || rapist.father === slave.ID) { + r.push(`${his} own ${relativeTerm(slave, rapist)},`); + } else if (slave.mother === rapist.ID) { + r.push(`${his} own mother,`); + } else if (slave.father === rapist.ID) { + r.push(`the slave that fathered ${him},`); + } else { + r.push(`${his} ${relativeTerm(slave, rapist)},`); + } + } else { + r.push(`the other slave,`); + } + r.push(`and simply lays still.`); + } else if (slave.fetish === "mindbroken" && (slave.career === "a dairy cow" || slave.career === "a breeding bull")) { + if (_isIncest) { + r.push(`${slave.slaveName}'s simple mind does not even acknowledge that ${rapist.slaveName} is`); + if (slave.father === rapist.ID && slave.mother === rapist.ID) { + r.push(`the slave that is both ${his} mother and ${his} father,`); + } else if (rapist.mother === slave.ID || rapist.father === slave.ID) { + r.push(`${his} own ${relativeTerm(slave, rapist)},`); + } else if (slave.mother === rapist.ID) { + r.push(`${his} own mother,`); + } else if (slave.father === rapist.ID) { + r.push(`the slave that fathered ${him},`); + } else { + r.push(`${his} ${relativeTerm(slave, rapist)},`); + } + } else { + r.push(`${slave.slaveName}`); + if (canSee(slave)) { + r.push(`sees`); + } else if (canHear(slave)) { + r.push(`hears`); + } else { + r.push(`dimly acknowledges`); + } + r.push(`the newcomer, and with ${his} simple mind`); + } + r.push(`${he} only knows that they have a pussy and ${his}`); + if (slave.clit >= 4) { + r.push(`swollen clit`); + } else { + r.push(`${_dickSize} penis`); + } + r.push(`is erect. Naturally, ${he} seems quite eager to put them together.`); + _incestMood = "Bottom"; + } else { + r.push(`${slave.slaveName} is fully naked and`); + if (canSee(slave)) { + r.push(`looking up at`); + } else { + r.push(`waiting in front of`); + } + if (_isIncest) { + if (slave.father === rapist.ID && slave.mother === rapist.ID) { + r.push(`the slave that is both ${his} mother and ${his} father,`); + } else if (rapist.mother === slave.ID || rapist.father === slave.ID) { + r.push(`${his} own ${relativeTerm(slave, rapist)},`); + } else if (slave.mother === rapist.ID) { + r.push(`${his} own mother,`); + } else if (slave.father === rapist.ID) { + r.push(`the slave that fathered ${him},`); + } else { + r.push(`${his} ${relativeTerm(slave, rapist)},`); + } + if (slave.sexualQuirk === "perverted" || slave.behavioralQuirk === "sinful") { + _incestMood = "Bottom"; + r.push(`unable to hide ${his} intense arousal at the impending`); + if (rapist.sexualQuirk === "perverted") { + r.push(`perverted`); + } else { + r.push(`sinful`); + } + r.push(`act.`); + if (canSee(slave)) { + r.push(`${His} eyes are locked on ${rapist.slaveName}'s pussy, and`); + } + r.push(`${rapist.slaveName} can hear ${him} moan in anticipation${(!canSee(slave)) ? ", which surprises the blind slave" : ""}.`); + } else if (slave.relationshipTarget === rapist.ID && slave.relationship > 2) { + _incestMood = "Both"; + r.push(`but since they're already in a sexual relationship, ${he} just shows a relaxed smile as ${he} waits for ${rapist.slaveName} to mount ${him}.`); + } else { + if (slave.devotion > 95) { + _incestMood = "Bottom"; + r.push(`but ${his} deep acceptance of slavery means ${he} is eager to please you,`); + if (slave.clit >= 4) { + r.push(`leaving ${his} massive clit flushed.`); + } else { + r.push(`making ${his} ${_dickSize} cock drip precum.`); + } + } else if (slave.devotion > 60) { + r.push(`and is clearly struggling between keeping ${himself} hard and acknowledging the incest. A small dose of vasodilators and ${his} impressive desire to please you should keep ${his}`); + if (slave.clit >= 4) { + r.push(`clit`); + } else { + r.push(`penis`); + } + r.push(`up for ${rapist.slaveName}.`); + _incestMood = "BottomFragile"; + } else { + if (!_bottomDrugged) { + r.push(`and once it becomes clear to ${him} that ${rapist.slaveName} will be the one mounting ${him}, ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} penis`); + } + r.push(`shrinks away. A direct injection of vasodilators changes that, bringing ${him} back to readiness to ${his} horror.`); + _bottomDrugged = 1; + } else { + r.push(`and to ${his} own horror the drugs ${he} was injected with keep ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} penis`); + } + r.push(`ready and waiting.`); + } + } + } + } else { + if (slave.relationshipTarget === rapist.ID) { + r.push(`${his} ${relationshipTerm(rapist)},`); + if (slave.relationship > 2) { + r.push(`but since they're already in a sexual relationship, ${he} just shows a relaxed smile as ${he} waits for ${rapist.slaveName} to mount ${him}.`); + } else if (slave.partners.has(rapist.ID)) { + r.push(`but since they're already done it before, ${he} just shows a relaxed smile as ${he} waits for ${rapist.slaveName} to mount ${him}.`); + } else { + r.push(`whom ${he} hasn't had sex with yet. ${He} smiles nervously as ${he} waits for ${rapist.slaveName} to mount ${him}.`); + } + } else if (slave.rivalryTarget === rapist.ID) { + r.push(`${his} ${rivalryTerm(rapist)}, ${rapist.slaveName}.`); + if (slave.partners.has(rapist.ID)) { + r.push(`They've already fucked in the past, and by ${his} reaction, unwillingly. A`); + } else { + r.push(`${He} doesn't much like what is to come, but a`); + } + r.push(`direct injection of vasodilators fixes that, forcing ${him} to readiness, much to ${his} chagrin.`); + } else if (slave.origBodyOwnerID === rapist.ID) { + r.push(`${rapist.slaveName}, who inhabits ${his} prior body.`); + if (slave.sexualQuirk === "perverted") { + r.push(`${He}'s enough of a pervert to get off over getting mounted by ${his} own form,`); + if (slave.clit >= 4) { + r.push(`leaving ${his} massive clit flushed.`); + } else { + r.push(`making ${his} ${_dickSize} cock drip precum.`); + } + } else if (slave.devotion > 95) { + r.push(`${His} deep acceptance of slavery means ${he} is eager to please you,`); + if (slave.clit >= 4) { + r.push(`leaving ${his} massive clit flushed,`); + } else { + r.push(`making ${his} ${_dickSize} cock drip precum,`); + } + r.push(`despite how odd it is to fuck one's own body.`); + } else if (slave.devotion > 60) { + r.push(`${He} is clearly struggling to keep ${himself} hard while acknowledging ${he} is expected to fuck ${his} former body. A small dose of vasodilators and ${his} impressive desire to please you should keep ${his}`); + if (slave.clit >= 4) { + r.push(`clit`); + } else { + r.push(`penis`); + } + r.push(`at attention.`); + } else { + if (!_bottomDrugged) { + r.push(`Once it becomes clear to ${him} that "${he}'ll" be the one mounting ${him}, ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} penis`); + } + r.push(`shrinks away. A direct injection of vasodilators changes that, bringing ${him} back to readiness to ${his} horror.`); + _bottomDrugged = 1; + } else { + r.push(`To ${his} own horror the drugs ${he} was injected with keep ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} penis`); + } + r.push(`ready and waiting.`); + } + } + } else { + if (slave.devotion > 95) { + r.push(`${His} deep acceptance of slavery means ${he} is eager to please you,`); + if (slave.clit >= 4) { + r.push(`leaving ${his} massive clit flushed,`); + } else { + r.push(`making ${his} ${_dickSize} cock drip precum,`); + } + r.push(`eager for ${rapist.slaveName}.`); + } else if (slave.devotion > 60) { + r.push(`${He} is eager enough to please you that ${his}`); + if (slave.clit >= 4) { + r.push(`clit`); + } else { + r.push(`penis`); + } + r.push(`is at attention and waiting for ${rapist.slaveName}.`); + } else { + if (!_bottomDrugged) { + r.push(`Once it becomes clear to ${him} that ${rapist.slaveName} be the one mounting ${him}, ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} penis`); + } + r.push(`shrinks away. A direct injection of vasodilators changes that, bringing ${him} back to a proper hardness.`); + _bottomDrugged = 1; + } else { + r.push(`To ${his} own horror the drugs ${he} was injected with keep ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} penis`); + } + r.push(`ready and waiting.`); + } + } + } + } + } + + App.Events.addParagraph(el, r); + r= []; + + if (rapist.fetish === "mindbroken" && rapist.career !== "a dairy cow" && rapist.career !== "a breeding bull") { + r.push(`${rapist.slaveName} stares blankly, and needs to be deliberately guided to straddle ${slave.slaveName}.`); + if (_isIncest) { + r.push(`Naturally, ${he2} isn't even aware of the impending incest.`); + } + if (slave.fetish === "mindbroken" && slave.career !== "a dairy cow" && slave.career !== "a breeding bull") { + r.push(`Since both slaves are essentially vegetables, this is shaping up to be a rather contrived sexual demonstration. The parts are all there, but the actors aren't going to contribute much to the show.`); + } + } else if (rapist.fetish === "mindbroken" && (rapist.career === "a dairy cow")) { + r.push(`${rapist.slaveName} sees the`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} penis`); + } + r.push(`ready and waiting, and catches on to why ${he2}'s here quickly. ${He2} takes it into ${his2} mouth before you stop ${him2} and tap ${his2} pussy, and after a few seconds of thinking ${he2} straddles ${slave.slaveName}'s hips with a moo.`); + if (_isIncest) { + r.push(`Naturally, since ${he2} thinks ${he2}'s a cow, incest means nothing to ${him2}.`); + } + } else if (rapist.fetish === "mindbroken" && (rapist.career === "a breeding bull")) { + r.push(`${rapist.slaveName} sees the`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} penis`); + } + r.push(`ready and waiting, but isn't quite sure what to do with it. ${He2}'s been brought up to use ${his2} dick when thinking, after all. It takes a few minutes to get ${him2} to straddle ${slave.slaveName}'s hips with the intent to get ${his2} pussy penetrated.`); + if (_isIncest) { + r.push(`Naturally, since ${he2} thinks ${he2}'s a breeding bull, incest means nothing to ${him2}.`); + } + } else { + r.push(`${rapist.slaveName} sees`); + if (_isIncest) { + if (rapist.father === slave.ID && rapist.mother === slave.ID) { + r.push(`the slave that is both ${his2} mother and ${his2} father`); + } else if (slave.mother === rapist.ID || slave.father === rapist.ID) { + r.push(`${his2} own ${relativeTerm(rapist, slave)}`); + } else if (rapist.mother === slave.ID) { + r.push(`${his2} own mother`); + } else if (rapist.father === slave.ID) { + r.push(`the slave that fathered ${him2}`); + } else { + r.push(`${his2} ${relativeTerm(rapist, slave)}`); + } + r.push(`tied to the bed,`); + if (rapist.sexualQuirk === "perverted" || rapist.sexualQuirk === "sinful") { + if (_incestMood === "Bottom") { + r.push(`and can't hide ${his2}`); + if (rapist.sexualQuirk === "perverted") { + r.push(`perverted`); + } else { + r.push(`sinful`); + } + r.push(`arousal at the excited glances they share.`); + _incestMood = "Both"; + } else { + _incestMood = "Top"; + r.push(`and becomes indecently aroused at their horrified expressions for the`); + if (rapist.sexualQuirk === "perverted") { + r.push(`perverted`); + } else { + r.push(`sinful`); + } + r.push(`incest to come.`); + } + } else if (rapist.relationshipTarget === slave.ID && rapist.relationship > 2) { + r.push(`and licks ${his2} lips involuntarily.`); + } else { + if (rapist.devotion > 95) { + if (_incestMood === "Bottom") { + r.push(`as well as ${his2} apparent lust. Since ${he2} is a perfect slave for you, ${his2} vagina becomes flushed with arousal quickly.`); + _incestMood = "Both"; + } else { + _incestMood = "Top"; + r.push(`as well as ${his} worried expressions. ${rapist.slaveName} seems aroused and determined to show ${him} how a proper slave should act.`); + } + } else if (rapist.devotion > 60) { + if (_incestMood === "BottomFragile") { + _incestMood = ""; + } + r.push(`and after figuring out they're just as superficially prepared as ${he2} is, resolves ${himself2} to forget they're related to stay aroused.`); + } else { + r.push(`and can't hide the look of horror that crosses ${his2} face. You assure ${him2} this is what ${he2} needs to do.`); + if (_incestMood === "Bottom") { + r.push(`To ${his2} growing disgust, ${he2} can tell ${slave.slaveName}'s`); + if (slave.clit >= 4) { + r.push(`erect clit`); + } else { + r.push(`${_dickSize} erection`); + } + r.push(`shows off genuine arousal despite their blood relation.`); + } else { + r.push(`${He2} might find solace in the fact that the owner of the`); + if (slave.clit >= 4) { + r.push(`erect clit`); + } else { + r.push(`${_dickSize} erection`); + } + r.push(`on display doesn't seem thrilled as well.`); + } + } + } + } else { + if (slave.relationshipTarget === rapist.ID) { + r.push(`${his} ${relationshipTerm(rapist)}`); + } else if (slave.rivalryTarget === rapist.ID) { + r.push(`${his} ${rivalryTerm(rapist)}`); + } else if (slave.origBodyOwnerID === rapist.ID) { + r.push(`${his} former body`); + } else { + r.push(`${slave.slaveName}`); + } + r.push(`tied to the bed,`); + if ((rapist.relationshipTarget === slave.ID && rapist.relationship > 2) || rapist.rivalryTarget === slave.ID) { + r.push(`and licks ${his2} lips involuntarily.`); + } else { + if (rapist.devotion > 95) { + if (_incestMood === "Bottom") { + r.push(`as well as ${his2} apparent lust. Since ${he2} is a perfect slave for you, ${his2} vagina becomes flushed with arousal quickly.`); + _incestMood = "Both"; + } else { + _incestMood = "Top"; + r.push(`as well as ${his} worried expressions. ${rapist.slaveName} seems aroused and determined to show ${him} how a proper slave should act.`); + } + } else if (rapist.devotion > 20) { + if (_incestMood === "BottomFragile") { + _incestMood = ""; + } + r.push(`and after figuring out they're just as superficially prepared as ${he2} is, resolves ${himself2} to try and make it pleasurable.`); + } else { + r.push(`and can't hide the look of horror that crosses ${his2} face. You assure ${him2} this is what ${he2} needs to do.`); + if (_incestMood === "Bottom") { + r.push(`To ${his2} growing disgust, ${he2} can tell ${slave.slaveName}'s`); + if (slave.clit >= 4) { + r.push(`erect clit`); + } else { + r.push(`${_dickSize} erection`); + } + r.push(`shows off genuine arousal despite ${his2} unwillingness.`); + } else { + r.push(`${He2} might find solace in the fact that the owner of the`); + if (slave.clit >= 4) { + r.push(`erect clit`); + } else { + r.push(`${_dickSize} erection`); + } + r.push(`on display doesn't seem thrilled as well.`); + } + } + } + } + + if (_incestMood === "Top" || _incestMood === "Both" || !(_isIncest)) { + if (rapist.fetishKnown === 1) { + if (rapist.fetish === "submissive") { + r.push(`${rapist.slaveName} usually prefers to be underneath someone with a`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} cock`); + } + r.push(`like that, which is obvious in ${his2} expressions. Knowing ${he2}'s riding it due to someone's orders is just about the only detail that plays to ${his2} fetish.`); + } else if (rapist.fetish === "dom") { + r.push(`${rapist.slaveName} can't hide ${his2} domineering smile at the`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} cock`); + } + r.push(`tied up and presented to ${him2}. Being on top and controlling everything is what gets ${him2} off, and you just gave ${him2} a nice human dildo to dominate.`); + } else if (rapist.fetish === "masochist") { + r.push(`${rapist.slaveName} usually prefers to be the one being abused, which is clear from ${his2} disappointed reaction as ${he2} considers the`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} erection`); + } + r.push(`tied before ${him2}. Maybe ${he2} can delude ${himself2} into thinking this is a denial play for ${himself2} and enjoy the human dildo, or maybe not.`); + } else if (rapist.fetish === "sadist") { + r.push(`${rapist.slaveName} is a sadist, and seeing a human dildo tied town for ${him2} to abuse and enjoy has ${him2} almost panting in arousal. The ecstatic look of devotion ${he2} flashes you makes it clear ${he2}'s going to enjoy ${himself2}, regardless of how the`); + if (slave.clit >= 4) { + r.push(`massive clit's`); + } else { + r.push(`${_dickSize} cock's`); + } + r.push(`owner feels.`); + } else if (rapist.fetish === "humiliation") { + r.push(`${rapist.slaveName} usually gets off on humiliation, and you know ${he2} wishes the roles were reversed here. Despite that, having ${his2} ${getWrittenTitle(rapist)} order ${him2} to get ${himself2} off with the human dildo beneath ${him2} is quite thrilling, sexually.`); + } + } + } + } + + App.Events.addParagraph(el, r); + r= []; + + if (slave.devotion < -20 && rapist.devotion < -20) { + r.push(`Since you have two restrained slaves, it's up to you to do all the work. Since ${slave.slaveName} is already lying on the bed, you maneuver ${rapist.slaveName}'s pussy into place. The two slaves make no further moves until you deal ${rapist.slaveName} a terrific swat across the ass and promise to give ${him2} more of the same until ${he2} gets going. ${rapist.slaveName} starts lowering ${himself2} very slowly, pulling back every time ${slave.slaveName}'s dick prods ${his2} womanhood. After watching the sad display for a while, you grab ${him2} by the hips and slam ${him2} down onto ${slave.slaveName}, hilting ${him2} in one, scream-inducing move.`); + if (rapist.vagina === 0) { /* losing virginity */ + if (rapist.devotion > 20) { + r.push(`${rapist.slaveName} accepts your orders without comment and lowers ${his2} virgin pussy on ${slave.slaveName}'s ready`); + + if (slave.clit >= 4) { + r.push(`massive clit.`); + } else { + r.push(`${_dickSize} dick.`); + } + r.push(`<span class="devotion inc">${rapist.slaveName} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">will break in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion += 10; + } else if (rapist.devotion >= -20) { + r.push(`${rapist.slaveName} is clearly unhappy at the idea of losing ${his2} pearl of great price to ${slave.slaveName}; this probably isn't what ${he2} imagined ${his2} first real sex would be like. ${He2} fears ${he2} might get pregnant. Nevertheless, <span class="devotion inc">${he} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">breaks in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion += 4; + } else { + r.push(`As you anticipated, ${rapist.slaveName} refuses to give ${slave.slaveName} ${his2} virginity. However, since ${rapist.slaveName} is restrained ${his2} resistance amounts to <span class="mediumorchid">horrified tears</span> and <span class="trust dec">frightened begging.</span> Naturally, this cruel act <span class="lime">breaks in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion -= 5; + rapist.trust -= 5; + } + if (rapist.mother === slave.ID) { + if (slave.counter.penetrative === 0) { + r.push(`${slave.slaveName}`); + r.push(`gasps and ${his} eyes widen as ${he} feels the tender folds of a pussy — and none other than ${his} ${relativeTerm(slave, rapist)}'s — embracing ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`for the first time.`); + } else { + r.push(`${slave.slaveName}'s breath quickens as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`disappears into ${his} ${relativeTerm(slave, rapist)}'s vagina.`); + } + } else if (slave.mother === rapist.ID) { + if (slave.counter.penetrative === 0) { + r.push(`${slave.slaveName}`); + r.push(`gasps and ${his} eyes widen as ${he} feels the tender folds of a pussy — and none other than ${his} mother's — embracing ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`for the first time.`); + } else { + r.push(`${slave.slaveName}'s breath quickens as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`disappears into ${his} mother's vagina.`); + } + } + }/* closes losing virginity */ + r.push(`${rapist.slaveName} seems more cooperative after that and you only have to occasionally prod them with an electrical jolt to keep them going at a faster pace. Both slaves resent what you made them do and fear you as a result.`); + } else if (rapist.fetish === "sadist" && rapist.fetishStrength > 20 && slave.devotion < -20) { + r.push(`You tell the grinning ${rapist.slaveName} that ${slave.slaveName}'s`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`is all ${hers2}. The slave life has so affected ${rapist.slaveName} that ${he2} is quite eager to hurt and rape another slave for ${his2} pleasure.`); + if (rapist.vagina === 0) { /* losing virginity */ + if (rapist.devotion > 20) { + r.push(`${rapist.slaveName} accepts your orders without comment and lowers ${his2} virgin pussy on ${slave.slaveName}'s ready`); + + if (slave.clit >= 4) { + r.push(`massive clit.`); + } else { + r.push(`${_dickSize} dick.`); + } + r.push(`<span class="devotion inc">${rapist.slaveName} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">will break in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion += 10; + } else if (rapist.devotion >= -20) { + r.push(`${rapist.slaveName} is clearly unhappy at the idea of losing ${his2} pearl of great price to ${slave.slaveName}; this probably isn't what ${he2} imagined ${his2} first real sex would be like. ${He2} fears ${he2} might get pregnant. Nevertheless, <span class="devotion inc">${he} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">breaks in ${his2} pussy.</span>`); + + rapist.vagina = 1; + rapist.devotion += 4; + } else { + r.push(`As you anticipated, ${rapist.slaveName} refuses to give ${slave.slaveName} ${his2} virginity. However, since ${rapist.slaveName} is restrained ${his2} resistance amounts to <span class="mediumorchid">horrified tears</span> and <span class="trust dec">frightened begging.</span> Naturally, this cruel act <span class="lime">breaks in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion -= 5; + rapist.trust -= 5; + } + if (rapist.mother === slave.ID) { + if (slave.counter.penetrative === 0) { + r.push(`${slave.slaveName}`); + r.push(`gasps and ${his} eyes widen as ${he} feels the tender folds of a pussy — and none other than ${his} ${relativeTerm(slave, rapist)}'s — embracing ${his}`); + + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`for the first time.`); + } else { + r.push(`${slave.slaveName}'s breath quickens as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`disappears into ${his} ${relativeTerm(slave, rapist)}'s vagina.`); + } + } else if (slave.mother === rapist.ID) { + if (slave.counter.penetrative === 0) { + r.push(`${slave.slaveName}`); + r.push(`gasps and ${his} eyes widen as ${he} feels the tender folds of a pussy — and none other than ${his} mother's — embracing ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`for the first time.`); + } else { + r.push(`${slave.slaveName}'s breath quickens as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`disappears into ${his} mother's vagina.`); + } + } + }/* closes losing virginity */ + + r.push(`${He2} begins playing with ${him} immediately, slapping, pinching and licking ${his} boobs while bouncing on the meaty shaft. Occasionally ${he2} stops, denying ${slave.slaveName} release by painfully squeezing and smacking the sensitive shaft. By the end of the session ${slave.slaveName}'s abused, pent-up penis has shot several massive and painful loads into the blissfully satisfied ${rapist.slaveName}, leaving ${him} lying on the bed, shaking in horror and <span class="health dec">utter exhaustion,</span> while rapist.slaveName reaps the opportunity to continue painfully tormenting ${him}.`); + + healthDamage(slave, 10); + slave.counter.penetrative += 3; + V.penetrativeTotal += 3; + rapist.counter.vaginal += 3; + V.vaginalTotal += 3; + } else if (slave.devotion < -20) { + r.push(`Since your dick slave is restrained, you order ${rapist.slaveName} to kneel on the bed on top of ${slave.slaveName}, and then maneuver ${his2} pussy into place. ${slave.slaveName} is uncooperative, so you prod and slap ${him} until ${he} starts to thrust ${his} cock into ${rapist.slaveName} with urgency.`); + if (rapist.vagina === 0) { /* losing virginity */ + if (rapist.devotion > 20) { + r.push(`${rapist.slaveName} accepts your orders without comment and lowers ${his2} virgin pussy on ${slave.slaveName}'s ready`); + if (slave.clit >= 4) { + r.push(`massive clit.`); + } else { + r.push(`${_dickSize} dick.`); + } + r.push(`<span class="devotion inc">${rapist.slaveName} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">will break in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion += 10; + } else if (rapist.devotion >= -20) { + r.push(`${rapist.slaveName} is clearly unhappy at the idea of losing ${his2} pearl of great price to ${slave.slaveName}; this probably isn't what ${he2} imagined ${his2} first real sex would be like. ${He2} fears _h2e might get pregnant. Nevertheless, <span class="devotion inc">${he} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">breaks in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion += 4; + } else { + r.push(`As you anticipated, ${rapist.slaveName} refuses to give ${slave.slaveName} ${his2} virginity. However, since ${rapist.slaveName} is restrained ${his2} resistance amounts to <span class="mediumorchid">horrified tears</span> and <span class="trust dec">frightened begging.</span> Naturally, this cruel act <span class="lime">breaks in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion -= 5; + rapist.trust -= 5; + } + if (rapist.mother === slave.ID) { + if (slave.counter.penetrative === 0) { + r.push(`${slave.slaveName}`); + r.push(`gasps and ${his} eyes widen as ${he} feels the tender folds of a pussy — and none other than ${his} ${relativeTerm(slave, rapist)}'s — embracing ${his}`); + + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`for the first time.`); + } else { + r.push(`${slave.slaveName}'s breath quickens as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`disappears into ${his} ${relativeTerm(slave, rapist)}'s vagina.`); + } + } else if (slave.mother === rapist.ID) { + if (slave.counter.penetrative === 0) { + r.push(`${slave.slaveName}`); + r.push(`gasps and ${his} eyes widen as ${he} feels the tender folds of a pussy — and none other than ${his} mother's — embracing ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`for the first time.`); + } else { + r.push(`${slave.slaveName}'s breath quickens as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`disappears into ${his} mother's vagina.`); + } + } + }/* closes losing virginity */ + r.push(`It doesn't take long for ${slave.slaveName} to orgasm. ${He} resents what you made ${him} do and fears you as a result.`); + } else if (rapist.fetish === "dom" && rapist.fetishStrength > 20 && rapist.devotion > 20) { + r.push(`You tell the randy ${rapist.slaveName} that ${slave.slaveName}'s`); + + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`is all ${hers2}. The slave life has so affected ${rapist.slaveName} that ${he2} is quite eager to rape another slave for ${his2} pleasure.`); + if (rapist.vagina === 0) { + r.push(`Without further instruction, ${rapist.slaveName} lowers ${his2} virgin pussy onto ${slave.slaveName} waiting`); + if (slave.clit >= 4) { + r.push(`clit-dick,`); + } else { + r.push(`${_dickSize} dick,`); + } + r.push(`impaling ${himself2} slowly and teasing ${his2} bound victim. This act <span class="lime">breaks in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.fetishStrength += 1; + } + r.push(`${He2} begins playing with ${him2} immediately, fondling, pinching and licking while bouncing on the meaty shaft. Occasionally ${he2} stops, denying ${slave.slaveName} release and teasing ${him}, fully enjoying ${his2} dominant role.`); + if (slave.dick > 0) { + if (slave.fetish === "submissive") { + r.push(`By the end of the session ${slave.slaveName}'s abused, pent-up penis has shot a massive load into ${rapist.slaveName}'s welcoming pussy. ${He} is glad to be dominated.`); + } else { + r.push(`By the end of the session ${slave.slaveName}'s abused, pent-up penis has shot a massive load, to ${his} horror and resentment, into the blissfully satisfied ${rapist.slaveName}.`); + } + } + } else if (rapist.energy > 95 && rapist.devotion > 20) { + r.push(`You tell the randy ${rapist.slaveName} that ${slave.slaveName}'s`); + + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`is all ${hers}. The slave life has so affected ${rapist.slaveName} that ${he2} is quite eager to rape another slave, just for the perverted novelty of the act.`); + if (rapist.vagina === 0) { /* losing virginity */ + if (rapist.devotion > 20) { + r.push(`${rapist.slaveName} accepts your orders without comment and lowers ${his2} virgin pussy on ${slave.slaveName}'s ready`); + + if (slave.clit >= 4) { + r.push(`massive clit.`); + } else { + r.push(`${_dickSize} dick.`); + } + r.push(`<span class="devotion inc">${rapist.slaveName} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">will break in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion += 10; + } else if (rapist.devotion >= -20) { + r.push(`${rapist.slaveName} is clearly unhappy at the idea of losing ${his2} pearl of great price to ${slave.slaveName}; this probably isn't what ${he2} imagined ${his2} first real sex would be like. ${He2} fears ${he2} might get pregnant. Nevertheless, <span class="devotion inc">${he} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">breaks in ${his2} pussy.</span>`); + + rapist.vagina = 1; + rapist.devotion += 4; + } else { + r.push(`As you anticipated, ${rapist.slaveName} refuses to give ${slave.slaveName} ${his2} virginity. However, since ${rapist.slaveName} is restrained ${his2} resistance amounts to <span class="mediumorchid">horrified tears</span> and <span class="trust dec">frightened begging.</span> Naturally, this cruel act <span class="lime">breaks in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion -= 5; + rapist.trust -= 5; + } + if (rapist.mother === slave.ID) { + if (slave.counter.penetrative === 0) { + r.push(`${slave.slaveName}`); + r.push(`gasps and ${his} eyes widen as ${he} feels the tender folds of a pussy — and none other than ${his} ${relativeTerm(slave, rapist)}'s — embracing ${his}`); + + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`for the first time.`); + } else { + r.push(`${slave.slaveName}'s breath quickens as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`disappears into ${his} ${relativeTerm(slave, rapist)}'s vagina.`); + } + } else if (slave.mother === rapist.ID) { + if (slave.counter.penetrative === 0) { + r.push(`${slave.slaveName}`); + r.push(`gasps and ${his} eyes widen as ${he} feels the tender folds of a pussy — and none other than ${his} mother's — embracing ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`for the first time.`); + } else { + r.push(`${slave.slaveName}'s breath quickens as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`disappears into ${his} mother's vagina.`); + } + } + }/* closes losing virginity */ + + r.push(`${He2} rides the helpless ${slave.slaveName} through several ejaculating orgasms. In the short breaks between them, ${he2} teases ${his} pussy. By the end of the session ${rapist.slaveName}'s cunt is dripping cum, to ${his2} obvious satiation and bliss. ${slave.slaveName} is lying next to ${him2} on the bed in a state of fatigue, the entire experience having thoroughly exhausted ${him}.`); + slave.counter.penetrative += 3; + V.penetrativeTotal += 3; + rapist.counter.vaginal += 3; + V.vaginalTotal += 3; + } else if (slave.devotion <= 20 || rapist.devotion <= 20) { + r.push(`You toss ${slave.slaveName} onto the bed and tell ${rapist.slaveName} to get on with it.`); + if (rapist.vagina === 0) { /* losing virginity */ + if (rapist.devotion > 20) { + r.push(`${rapist.slaveName} accepts your orders without comment and lowers ${his2} virgin pussy on ${slave.slaveName}'s ready`); + if (slave.clit >= 4) { + r.push(`massive clit.`); + } else { + r.push(`${_dickSize} dick.`); + } + r.push(`<span class="devotion inc">${rapist.slaveName} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">will break in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion += 10; + } else if (rapist.devotion >= -20) { + r.push(`${rapist.slaveName} is clearly unhappy at the idea of losing ${his2} pearl of great price to ${slave.slaveName}; this probably isn't what ${he2} imagined ${his2} first real sex would be like. ${He2} fears ${he2} might get pregnant. Nevertheless, <span class="devotion inc">${he2} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">breaks in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion += 4; + } else { + r.push(`As you anticipated, ${rapist.slaveName} refuses to give ${slave.slaveName} ${his2} virginity. However, since ${rapist.slaveName} is restrained ${his2} resistance amounts to <span class="mediumorchid">horrified tears</span> and <span class="trust dec">frightened begging.</span> Naturally, this cruel act <span class="lime">breaks in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion -= 5; + rapist.trust -= 5; + } + if (rapist.mother === slave.ID) { + if (slave.counter.penetrative === 0) { + r.push(`${slave.slaveName}`); + r.push(`gasps and ${his} eyes widen as ${he} feels the tender folds of a pussy — and none other than ${his} ${relativeTerm(slave, rapist)}'s — embracing ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`for the first time.`); + } else { + r.push(`${slave.slaveName}'s breath quickens as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`disappears into ${his} ${relativeTerm(slave, rapist)}'s vagina.`); + } + } else if (slave.mother === rapist.ID) { + if (slave.counter.penetrative === 0) { + r.push(`${slave.slaveName}`); + r.push(`gasps and ${his} eyes widen as ${he} feels the tender folds of a pussy — and none other than ${his} mother's — embracing ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`for the first time.`); + } else { + r.push(`${slave.slaveName}'s breath quickens as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`disappears into ${his} mother's vagina.`); + } + } + }/* closes losing virginity */ + r.push(`They fuck mechanically, gazing with roiling emotions into each others' eyes. They do seem to come to some sort of a nonverbal understanding on the necessity of getting it done, and there is no real unhappiness in either of them when they finish and disentangle themselves. As they clean themselves and exit, you notice ${rapist.slaveName}'s looking a little more longingly at ${slave.slaveName}.`); + } else if (slave.devotion <= 50 || rapist.devotion <= 50) { + r.push(`You order ${slave.slaveName} and ${rapist.slaveName} to get on with it.`); + if (rapist.vagina === 0) { /* losing virginity */ + if (rapist.devotion > 20) { + r.push(`${rapist.slaveName} accepts your orders without comment and lowers ${his2} virgin pussy on ${slave.slaveName}'s ready`); + if (slave.clit >= 4) { + r.push(`massive clit.`); + } else { + r.push(`${_dickSize} dick.`); + } + r.push(`<span class="devotion inc">${rapist.slaveName} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">will break in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion += 10; + } else if (rapist.devotion >= -20) { + r.push(`${rapist.slaveName} is clearly unhappy at the idea of losing ${his2} pearl of great price to ${slave.slaveName}; this probably isn't what ${he2} imagined ${his2} first real sex would be like. ${He2} fears ${he2} might get pregnant. Nevertheless, <span class="devotion inc">${he} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">breaks in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion += 4; + } else { + r.push(`As you anticipated, ${rapist.slaveName} refuses to give ${slave.slaveName} ${his2} virginity. However, since ${rapist.slaveName} is restrained ${his2} resistance amounts to <span class="mediumorchid">horrified tears</span> and <span class="trust dec">frightened begging.</span> Naturally, this cruel act <span class="lime">breaks in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion -= 5; + rapist.trust -= 5; + } + if (rapist.mother === slave.ID) { + if (slave.counter.penetrative === 0) { + r.push(`${slave.slaveName}`); + r.push(`gasps and ${his} eyes widen as ${he} feels the tender folds of a pussy — and none other than ${his} ${relativeTerm(slave, rapist)}'s — embracing ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`for the first time.`); + } else { + r.push(`${slave.slaveName}'s breath quickens as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`disappears into ${his} ${relativeTerm(slave, rapist)}'s vagina.`); + } + } else if (slave.mother === rapist.ID) { + if (slave.counter.penetrative === 0) { + r.push(`${slave.slaveName}`); + r.push(`gasps and ${his} eyes widen as ${he} feels the tender folds of a pussy — and none other than ${his} mother's — embracing ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`for the first time.`); + } else { + r.push(`${slave.slaveName}'s breath quickens as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`disappears into ${his} mother's vagina.`); + } + } + }/* closes losing virginity */ + r.push(`They fuck mechanically at first, gazing with roiling emotions into each others' eyes. Eventually, they begin to enjoy the intimacy of the act, finding the shared pleasure between them comforting. They finish and resume life as slaves, the light of this intimacy diminishing, softening with ${slave.slaveName}'s`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`and dripping away with the contents of ${rapist.slaveName}'s cum-filled pussy. You notice ${rapist.slaveName}'s looking a little more longingly at ${slave.slaveName}.`); + } else { + r.push(`The two slaves turn eagerly to the business of sex.`); + if (rapist.vagina === 0) { /* losing virginity */ + if (rapist.devotion > 20) { + r.push(`${rapist.slaveName} accepts your orders without comment and lowers ${his2} virgin pussy on ${slave.slaveName}'s ready`); + if (slave.clit >= 4) { + r.push(`massive clit.`); + } else { + r.push(`${_dickSize} dick.`); + } + r.push(`<span class="devotion inc">${rapist.slaveName} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">will break in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion += 10; + } else if (rapist.devotion >= -20) { + r.push(`${rapist.slaveName} is clearly unhappy at the idea of losing ${his2} pearl of great price to ${slave.slaveName}; this probably isn't what ${he2} imagined ${his2} first real sex would be like. ${He2} fears ${he2} might get pregnant. Nevertheless, <span class="devotion inc">${he} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">breaks in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion += 4; + } else { + r.push(`As you anticipated, ${rapist.slaveName} refuses to give ${slave.slaveName} ${his2} virginity. However, since ${rapist.slaveName} is restrained ${his2} resistance amounts to <span class="mediumorchid">horrified tears</span> and <span class="trust dec">frightened begging.</span> Naturally, this cruel act <span class="lime">breaks in ${his2} pussy.</span>`); + rapist.vagina = 1; + rapist.devotion -= 5; + rapist.trust -= 5; + } + if (rapist.mother === slave.ID) { + if (slave.counter.penetrative === 0) { + r.push(`${slave.slaveName}`); + r.push(`gasps and ${his} eyes widen as ${he} feels the tender folds of a pussy — and none other than ${his} ${relativeTerm(slave, rapist)}'s — embracing ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`for the first time.`); + } else { + r.push(`${slave.slaveName}'s breath quickens as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`disappears into ${his} ${relativeTerm(slave, rapist)}'s vagina.`); + } + } else if (slave.mother === rapist.ID) { + if (slave.counter.penetrative === 0) { + r.push(`${slave.slaveName}`); + r.push(`gasps and ${his} eyes widen as ${he} feels the tender folds of a pussy — and none other than ${his} mother's — embracing ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`for the first time.`); + } else { + r.push(`${slave.slaveName}'s breath quickens as ${his}`); + if (slave.clit >= 4) { + r.push(`massive clit`); + } else { + r.push(`${_dickSize} dick`); + } + r.push(`disappears into ${his} mother's vagina.`); + } + } + }/* closes losing virginity */ + r.push(`${rapist.slaveName} happily rides ${slave.slaveName}, who occasionally thrusts ${his} hips up. After a little while, when ${rapist.slaveName} bends down to engage in passionate kissing, you come over and`); + if (canDoAnal(rapist) && rapist.anus > 0) { + r.push(`penetrate ${rapist.slaveName}'s free asshole with your`); + if (V.PC.dick !== 0) { + r.push(`dick.`); + } else { + r.push(`strap-on.`); + } + r.push(`With the extra stimulus of double penetration, ${he2} comes indecently hard. The two of them collapse into an exhausted, satisfied pile of slave flesh.`); + rapist.counter.anal++; + V.analTotal++; + if (canImpreg(rapist, V.PC)) { + knockMeUp(rapist, 5, 1, -1, true); + } + } else if (canDoVaginal(slave)) { + r.push(`penetrate ${slave.slaveName}'s free pussy with your`); + if (V.PC.dick !== 0) { + r.push(`dick.`); + } else { + r.push(`strap-on.`); + } + r.push(`With the double stimulus of penetrating a tight vagina and being penetrated while restrained, ${he} comes indecently hard. The two of them collapse into an exhausted, satisfied pile of slave flesh.`); + r.push(VCheck.Vaginal(slave, 1)); + } else if (canDoAnal(slave)) { + r.push(`penetrate ${slave.slaveName}'s free asshole with your`); + if (V.PC.dick !== 0) { + r.push(`dick.`); + } else { + r.push(`strap-on.`); + } + r.push(`With the double stimulus of penetrating a tight vagina and being penetrated while restrained, ${he} comes indecently hard. The two of them collapse into an exhausted, satisfied pile of slave flesh.`); + r.push(VCheck.Anal(slave, 1)); + } else { + r.push(`pull ${his2} face to your crotch. All this penetration has got you horny and there are no free holes to fuck, so a little oral will have to do. It doesn't take long for all three of you to collapse into an exhausted, satisfied pile of flesh.`); + rapist.counter.oral++; + V.oralTotal++; + } + } + + App.Events.addParagraph(el, r); + r= []; + + slave.counter.penetrative += 1; + V.penetrativeTotal += 1; + rapist.counter.vaginal += 1; + V.vaginalTotal += 1; + addPartner(slave, rapist); + + /* Friendship/lust? */ + if (([2].includes(slave.relationship) && slave.relationshipTarget === rapist.ID) && ([2].includes(rapist.relationship) && rapist.relationshipTarget === slave.ID)) { + r.push(`You keep ${slave.slaveName}'s dick intimate with ${rapist.slaveName}'s pussy for awhile, something the two friends haven't been sharing with each other. In the end, you are certain they got closer, becoming <span class="lightgreen">friends with benefits.</span>`); + slave.relationship++; + rapist.relationship++; + } + + /* pregnancy test */ + if (canImpreg(rapist, slave)) { + r.push(knockMeUp(rapist, 25, 0, slave.ID)); + } + + /* save changes */ + V.slaves[V.slaveIndices[rapist.ID]] = rapist; + + return el; + } +}; diff --git a/src/npc/interaction/passage/fSlaveSlaveDick.tw b/src/npc/interaction/passage/fSlaveSlaveDick.tw deleted file mode 100644 index 9dba1532685f68aa04b6864a0a402887f33a7d3b..0000000000000000000000000000000000000000 --- a/src/npc/interaction/passage/fSlaveSlaveDick.tw +++ /dev/null @@ -1,34 +0,0 @@ -:: FSlaveSlaveDick [nobr] - -<<set $slaverapistx = 0>> -<<set $nextLink = "Slave Interact">> -<<set $nextButton = "Back">> - -<p class="scene-intro"> - Select a slave that will ride <<= getSlave($AS).slaveName>>. -</p> - -<h2>Select an eligible slave</h2> - -<<set _eligibles = $slaves.filter((s) => (s.ID != $AS) && isSlaveAvailable(s) && canDoVaginal(s) && canStand(s) /* amp-amp scene is not written */)>> -<<for _i = 0; _i < _eligibles.length; _i++>> - <div> - <<set _name = SlaveFullName(_eligibles[_i])>> - <<print "[[_name|FSlaveSlaveDick Consummate][$slaverapistx = _eligibles[" + _i + "]]]">> - <<if _eligibles[_i].custom.label>> (@@.yellow;''<<print _eligibles[_i].custom.label>>''@@)<</if>> - <<if (canImpreg(_eligibles[_i], getSlave($AS)))>> - @@.green;Fertile@@ - <</if>> - <<if totalRelatives(getSlave($AS)) > 0>> - <<set _relTerm = relativeTerm(getSlave($AS), _eligibles[_i])>> - <<if _relTerm != null>> - @@.lightgreen;<<= capFirstChar(_relTerm)>>@@ - <</if>> - <</if>> /* closes extended family mode */ - </div> -<</for>> -<<if (_eligibles.length === 0)>> - <div class="note> - You have no slaves capable of this act. - </div> -<</if>> diff --git a/src/npc/interaction/passage/fSlaveSlaveDickConsummate.tw b/src/npc/interaction/passage/fSlaveSlaveDickConsummate.tw deleted file mode 100644 index 4b3669575a56958c27f366f42c7ce87a7c5b5061..0000000000000000000000000000000000000000 --- a/src/npc/interaction/passage/fSlaveSlaveDickConsummate.tw +++ /dev/null @@ -1,633 +0,0 @@ -:: FSlaveSlaveDick Consummate [nobr] - -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<setLocalPronouns $slaverapistx 2>> - -<<if getSlave($AS).dick>> - <<if getSlave($AS).dick == 1>> - <<set _dickSize = "tiny">> - <<elseif (getSlave($AS).dick == 2)>> - <<set _dickSize = "tiny">> - <<elseif (getSlave($AS).dick == 3)>> - <<set _dickSize = "average">> - <<elseif (getSlave($AS).dick == 4)>> - <<set _dickSize = "big">> - <<elseif (getSlave($AS).dick == 5)>> - <<set _dickSize = "huge">> - <<elseif (getSlave($AS).dick == 6)>> - <<set _dickSize = "gigantic">> - <<elseif (getSlave($AS).dick == 7)>> - <<set _dickSize = "titanic">> - <<elseif (getSlave($AS).dick == 8)>> - <<set _dickSize = "absurd">> - <<elseif (getSlave($AS).dick >= 9)>> - <<set _dickSize = "inhuman">> - <</if>> -<</if>> - -<<if areRelated(getSlave($AS), $slaverapistx)>> - <<set _isIncest = 1>> -<</if>> - -You take a look at the bound cock toy. - - -<<if (getSlave($AS).fetish == "mindbroken") && (getSlave($AS).career != "a dairy cow") && (getSlave($AS).career != "a breeding bull")>> - Since <<= getSlave($AS).slaveName>> is mentally broken, the restraints don't do anything but set the scene. -<<elseif (getSlave($AS).devotion > 50)>> - Since <<= getSlave($AS).slaveName>> is devoted, $his restraints are more for the show than for practical purposes. -<<elseif (getSlave($AS).devotion > 20)>> - <<= getSlave($AS).slaveName>> is obedient but not devoted, so $his restraints are firm for $his own good. -<<else>> - <<= getSlave($AS).slaveName>> is unlikely to comply willingly, and is tied down tight, unable to budge more than <<if $showInches == 2>>an inch<<else>>a centimeter<</if>>. -<</if>> - -<<if isAmputee(getSlave($AS))>> - $His limbless torso lies on the bed, ready for $slaverapistx.slaveName. -<<elseif tooBigBelly(getSlave($AS))>> - $His huge belly will limit the number of possible positions for $slaverapistx.slaveName to take $him in. -<<elseif tooBigBreasts(getSlave($AS))>> - The weight of $his tits pins $him helplessly in place. -<<elseif tooBigButt(getSlave($AS))>> - $His huge ass pushes $his pelvis further up, making it look as if $he's trying to fuck the air. -<<elseif tooBigDick(getSlave($AS))>> - $His huge cock is clearly going to be a challenge. -<<elseif tooBigBalls(getSlave($AS))>> - $His huge balls might get a bit in the way in this position. -<<elseif tooFatSlave(getSlave($AS))>> - $His huge gut threatens to envelope $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>>. -<</if>> - -<<if (getSlave($AS).fetish == "mindbroken") && (getSlave($AS).career != "a dairy cow") && (getSlave($AS).career != "a breeding bull")>> - <<if getSlave($AS).energy > 40>> - <<= getSlave($AS).slaveName>> is broken mentally, but has a serviceable libido. After a bit of stimulation $he's good to go without any further reaction on $his own. - <<else>> - <<= getSlave($AS).slaveName>> is broken mentally, and $his low libido prevents $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize penis<</if>> from becoming erect. A massive dose of vasodilators fixes this, and you think you see $his face twitch with the pain, but there is no further reaction. - <</if>> -<<elseif (getSlave($AS).fetish == "mindbroken") && (getSlave($AS).career == "a dairy cow")>> - <<if getSlave($AS).energy > 40>> - <<= getSlave($AS).slaveName>>, as a good cow with a good libido, takes only a little fondling before $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize penis<</if>> becomes erect. When you let go, $he gives a needy moo with a sad expression to ask you to keep going. - <<else>> - <<= getSlave($AS).slaveName>> may be a cow, but $his low libido keeps $his mostly soft despite plenty of fondling. You inject $him with vasodilators so $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>> becomes erect, and $he moos in discomfort and struggles against $his restraints. - <<set _bottomDrugged = 1>> - <</if>> -<<elseif (getSlave($AS).fetish == "mindbroken") && (getSlave($AS).career == "a breeding bull")>> - <<= getSlave($AS).slaveName>>, as a good bull, was already erect while being tied down. It seems $he knows what's going to happen to $him soon. Maybe someone at the Cattle Ranch has been sampling their bulls? -<<else>> - <<if getSlave($AS).devotion >= -20>> - <<if getSlave($AS).energy > 40>> - <<if (getSlave($AS).fetishKnown == 1)>> - <<if (getSlave($AS).fetish == "submissive")>> - <<= getSlave($AS).slaveName>> is a known sub, and seconds after $he is ordered to lie down to be restrained $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>> is erect. $He knows $he's going to get used, and can't hide $his excitement. - <<elseif (getSlave($AS).fetish == "dom")>> - <<= getSlave($AS).slaveName>> is a known dom, and needs some stimulation before $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>> becomes hard. Despite knowing $he's going to be used, $he can't hide $his curiosity to experience what the other side feels. - <<elseif (getSlave($AS).fetish == "masochist")>> - <<= getSlave($AS).slaveName>> almost gets off on being tied down tight, sporting a <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize erection<</if>> once you have finished. $His nipples are firm as well, and $he struggles against $his restraints to feel them dig into $him tighter. - <<elseif (getSlave($AS).fetish == "sadist")>> - <<= getSlave($AS).slaveName>> is a sadist, and finds $himself in the exact opposite position $he'd want to be in to get off. It's obvious $he's not going to get aroused soon, so you inject $him with vasodilators so $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>> becomes erect and hope $he at least learns something from being on the receiving end for once. - <<set _bottomDrugged = 1>> - <<elseif (getSlave($AS).fetish == "humiliation")>> - <<= getSlave($AS).slaveName>> gets off on humiliation, and after being ordered to lay naked on a bed to be tied down, becomes flushed with arousal with $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>> throbbing in anticipation at being used like a toy. - <<elseif (getSlave($AS).fetish == "pregnancy") && ($arcologies[0].FSRepopulationFocus != "unset") && canPenetrate(getSlave($AS))>> - <<= getSlave($AS).slaveName>> gets off thinking about pregnancy, and in your arcology most women are pregnant or fertile. $He knows someone's pussy will be around $his _dickSize cock soon, and is clearly lost in $his fantasies as $his cock swells to a throbbing erection. - <</if>> - <<elseif (getSlave($AS).attrXX > 65)>> - <<= getSlave($AS).slaveName>> has a good sex drive and likes pussy, even before $he's fully bound $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>> is throbbing in anticipation. - <<else>> - Despite $his adequate sex drive, since <<= getSlave($AS).slaveName>> isn't turned on by the prospect of pussy, $he takes some manual stimulation before $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>> stands erect. - <</if>> - <<else>> - <<if (getSlave($AS).attrXX > 65)>> - <<= getSlave($AS).slaveName>> isn't known for $his high libido, but since $he likes pussy all it takes is some teasing to get $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>> erect and ready. - <<else>> - <<= getSlave($AS).slaveName>> doesn't have a high libido, and also isn't attracted to female slaves. A dose of vasodilators injected at the base of $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>> causes $him to quickly reach painful readiness, and the unnatural pain makes $him strain at $his bonds. - <<set _bottomDrugged = 1>> - <</if>> - <</if>> - <<else>> - <<if getSlave($AS).energy > 60>> - <<if (getSlave($AS).attrXX > 65)>> - Although <<= getSlave($AS).slaveName>> does not like being a slave, $his high libido and love for pussy have $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize erection<</if>> ready for sex despite $his negative feelings. - <<else>> - <<= getSlave($AS).slaveName>> does not like being a slave, and isn't attracted to women, but with $his high libido all it takes is simple teasing for $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>> to be ready for sex. - <</if>> - <<else>> - <<= getSlave($AS).slaveName>> does not like being a slave, and without a high sex drive $he is able to resist stimulation and stay soft. A quick dose of vasodilators changes that, and $he moans in pain and struggles against $his bonds in vain as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>> becomes painfully hard. - <<set _bottomDrugged = 1>> - <</if>> - <</if>> -<</if>> - -<br><br> - -You call $slaverapistx.slaveName into the room. - -<br><br> - -<<if (getSlave($AS).fetish == "mindbroken") && (getSlave($AS).career != "a dairy cow") && (getSlave($AS).career != "a breeding bull")>> - <<= getSlave($AS).slaveName>> doesn't even notice - <<if _isIncest == 1>> - <<if getSlave($AS).father == $slaverapistx.ID && getSlave($AS).mother == $slaverapistx.ID>> - the slave that is both $his mother and $his father, - <<elseif $slaverapistx.mother == $AS || $slaverapistx.father == $AS>> - $his own <<print relativeTerm(getSlave($AS), $slaverapistx)>>, - <<elseif getSlave($AS).mother == $slaverapistx.ID>> - $his own mother, - <<elseif getSlave($AS).father == $slaverapistx.ID>> - the slave that fathered $him, - <<else>> - $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>, - <</if>> - <<else>> - the other slave, - <</if>> - and simply lays still. -<<elseif (getSlave($AS).fetish == "mindbroken") && ((getSlave($AS).career == "a dairy cow") || (getSlave($AS).career == "a breeding bull"))>> - <<if _isIncest == 1>> - <<= getSlave($AS).slaveName>>'s simple mind does not even acknowledge that $slaverapistx.slaveName is - <<if getSlave($AS).father == $slaverapistx.ID && getSlave($AS).mother == $slaverapistx.ID>> - the slave that is both $his mother and $his father, - <<elseif $slaverapistx.mother == $AS || $slaverapistx.father == $AS>> - $his own <<print relativeTerm(getSlave($AS), $slaverapistx)>>, - <<elseif getSlave($AS).mother == $slaverapistx.ID>> - $his own mother, - <<elseif getSlave($AS).father == $slaverapistx.ID>> - the slave that fathered $him, - <<else>> - $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>, - <</if>> - <<else>> - <<= getSlave($AS).slaveName>> <<if canSee(getSlave($AS))>>sees<<elseif canHear(getSlave($AS))>>hears<<else>>dimly acknowledges<</if>> the newcomer, and with $his simple mind - <</if>> - $he only knows that they have a pussy and $his <<if (getSlave($AS).clit >= 4)>>swollen clit<<else>>_dickSize penis<</if>> is erect. Naturally, $he seems quite eager to put them together. - <<set _incestMood = "Bottom">> -<<else>> - <<= getSlave($AS).slaveName>> is fully naked and <<if canSee(getSlave($AS))>>looking up at<<else>>waiting in front of<</if>> - <<if _isIncest == 1>> - <<if getSlave($AS).father == $slaverapistx.ID && getSlave($AS).mother == $slaverapistx.ID>> - the slave that is both $his mother and $his father, - <<elseif $slaverapistx.mother == $AS || $slaverapistx.father == $AS>> - $his own <<print relativeTerm(getSlave($AS), $slaverapistx)>>, - <<elseif getSlave($AS).mother == $slaverapistx.ID>> - $his own mother, - <<elseif getSlave($AS).father == $slaverapistx.ID>> - the slave that fathered $him, - <<else>> - $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>, - <</if>> - <<if (getSlave($AS).sexualQuirk == "perverted") || (getSlave($AS).sexualQuirk == "sinful")>> - <<set _incestMood = "Bottom">> - unable to hide $his intense arousal at the impending <<if ($slaverapistx.sexualQuirk == "perverted")>>perverted<<else>>sinful<</if>> act.<<if canSee(getSlave($AS))>> $His eyes are locked on $slaverapistx.slaveName's pussy, and<</if>> $slaverapistx.slaveName can hear $him moan in anticipation<<if !canSee(getSlave($AS))>>, which surprises the blind slave<</if>>. - <<elseif (getSlave($AS).relationshipTarget == $slaverapistx.ID) && (getSlave($AS).relationship > 2)>> - <<set _incestMood = "Both">> - but since they're already in a sexual relationship, $he just shows a relaxed smile as $he waits for $slaverapistx.slaveName to mount $him. - <<else>> - <<if getSlave($AS).devotion > 95>> - <<set _incestMood = "Bottom">> - but $his deep acceptance of slavery means $he is eager to please you, <<if (getSlave($AS).clit >= 4)>>leaving $his massive clit flushed<<else>>making $his _dickSize cock drip precum<</if>>. - <<elseif getSlave($AS).devotion > 60>> - and is clearly struggling between keeping $himself hard and acknowledging the incest. A small dose of vasodilators and $his impressive desire to please you should keep $his <<if (getSlave($AS).clit >= 4)>>clit<<else>>penis<</if>> up for $slaverapistx.slaveName. - <<set _incestMood = "BottomFragile">> - <<else>> - <<if ndef _bottomDrugged>> - and once it becomes clear to $him that $slaverapistx.slaveName will be the one mounting $him, $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize penis<</if>> shrinks away. A direct injection of vasodilators changes that, bringing $him back to readiness to $his horror. - <<set _bottomDrugged = 1>> - <<else>> - and to $his own horror the drugs $he was injected with keep $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize penis<</if>> ready and waiting. - <</if>> - <</if>> - <</if>> - <<else>> - <<if (getSlave($AS).relationshipTarget == $slaverapistx.ID)>> - $his <<print relationshipTerm(getSlave($AS), $slaverapistx)>>, - <<if (getSlave($AS).relationship > 2)>> - but since they're already in a sexual relationship, $he just shows a relaxed smile as $he waits for $slaverapistx.slaveName to mount $him. - <<elseif getSlave($AS).partners.includes($slaverapistx.ID)>> - but since they're already done it before, $he just shows a relaxed smile as $he waits for $slaverapistx.slaveName to mount $him. - <<else>> - whom $he hasn't had sex with yet. $He smiles nervously as $he waits for $slaverapistx.slaveName to mount $him. - <</if>> - <<elseif (getSlave($AS).rivalryTarget == $slaverapistx.ID)>> - $his <<print rivalryTerm(getSlave($AS), $slaverapistx)>>, $slaverapistx.slaveName. - <<if getSlave($AS).partners.includes($slaverapistx.ID)>> - They've already fucked in the past, and by $his reaction, unwillingly. A - <<else>> - $He doesn't much like what is to come, but a - <</if>> - direct injection of vasodilators fixes that, forcing $him to readiness, much to $his chagrin. - <<elseif (getSlave($AS).origBodyOwnerID == $slaverapistx.ID)>> - $slaverapistx.slaveName, who inhabits $his prior body. - <<if (getSlave($AS).sexualQuirk == "perverted")>> - $He's enough of a pervert to get off over getting mounted by $his own form, <<if (getSlave($AS).clit >= 4)>>leaving $his massive clit flushed<<else>>making $his _dickSize cock drip precum<</if>>. - <<elseif getSlave($AS).devotion > 95>> - $His deep acceptance of slavery means $he is eager to please you, <<if (getSlave($AS).clit >= 4)>>leaving $his massive clit flushed<<else>>making $his _dickSize cock drip precum<</if>>, despite how odd it is to fuck one's own body. - <<elseif getSlave($AS).devotion > 60>> - $He is clearly struggling to keep $himself hard while acknowledging $he is expected to fuck $his former body. A small dose of vasodilators and $his impressive desire to please you should keep $his <<if (getSlave($AS).clit >= 4)>>clit<<else>>penis<</if>> at attention. - <<else>> - <<if ndef _bottomDrugged>> - Once it becomes clear to $him that "$he'll" be the one mounting $him, $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize penis<</if>> shrinks away. A direct injection of vasodilators changes that, bringing $him back to readiness to $his horror. - <<set _bottomDrugged = 1>> - <<else>> - To $his own horror the drugs $he was injected with keep $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize penis<</if>> ready and waiting. - <</if>> - <</if>> - <<else>> - <<if getSlave($AS).devotion > 95>> - $His deep acceptance of slavery means $he is eager to please you, <<if (getSlave($AS).clit >= 4)>>leaving $his massive clit flushed<<else>>making $his _dickSize cock drip precum<</if>>, eager for $slaverapistx.slaveName. - <<elseif getSlave($AS).devotion > 60>> - $He is eager enough to please you that $his <<if (getSlave($AS).clit >= 4)>>clit<<else>>penis<</if>> is at attention and waiting for $slaverapistx.slaveName. - <<else>> - <<if ndef _bottomDrugged>> - Once it becomes clear to $him that $slaverapistx.slaveName be the one mounting $him, $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize penis<</if>> shrinks away. A direct injection of vasodilators changes that, bringing $him back to a proper hardness. - <<set _bottomDrugged = 1>> - <<else>> - To $his own horror the drugs $he was injected with keep $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize penis<</if>> ready and waiting. - <</if>> - <</if>> - <</if>> - <</if>> -<</if>> - -<br><br> - -<<if $slaverapistx.fetish == "mindbroken" && ($slaverapistx.career != "a dairy cow") && ($slaverapistx.career != "a breeding bull")>> - $slaverapistx.slaveName stares blankly, and needs to be deliberately guided to straddle <<= getSlave($AS).slaveName>>. - <<if _isIncest == 1>> - Naturally, _he2 isn't even aware of the impending incest. - <</if>> - <<if (getSlave($AS).fetish == "mindbroken") && (getSlave($AS).career != "a dairy cow") && (getSlave($AS).career != "a breeding bull")>> - Since both slaves are essentially vegetables, this is shaping up to be a rather contrived sexual demonstration. The parts are all there, but the actors aren't going to contribute much to the show. - <</if>> -<<elseif $slaverapistx.fetish == "mindbroken" && ($slaverapistx.career == "a dairy cow")>> - $slaverapistx.slaveName sees the <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize penis<</if>> ready and waiting, and catches on to why _he2's here quickly. _He2 takes it into _his2 mouth before you stop _him2 and tap _his2 pussy, and after a few seconds of thinking _he2 straddles <<= getSlave($AS).slaveName>>'s hips with a moo. - <<if _isIncest == 1>> - Naturally, since _he2 thinks _he2's a cow, incest means nothing to _him2. - <</if>> -<<elseif $slaverapistx.fetish == "mindbroken" && ($slaverapistx.career == "a breeding bull")>> - $slaverapistx.slaveName sees the <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize penis<</if>> ready and waiting, but isn't quite sure what to do with it. _He2's been brought up to use _his2 dick when thinking, after all. It takes a few minutes to get _him2 to straddle <<= getSlave($AS).slaveName>>'s hips with the intent to get _his2 pussy penetrated. - <<if _isIncest == 1>> - Naturally, since _he2 thinks _he2's a breeding bull, incest means nothing to _him2. - <</if>> -<<else>> - $slaverapistx.slaveName sees - <<if _isIncest == 1>> - <<if $slaverapistx.father == $AS && $slaverapistx.mother == $AS>> - the slave that is both _his2 mother and _his2 father - <<elseif getSlave($AS).mother == $slaverapistx.ID || getSlave($AS).father == $slaverapistx.ID>> - _his2 own <<print relativeTerm($slaverapistx, getSlave($AS))>> - <<elseif $slaverapistx.mother == $AS>> - _his2 own mother - <<elseif $slaverapistx.father == $AS>> - the slave that fathered _him2 - <<else>> - _his2 <<print relativeTerm($slaverapistx, getSlave($AS))>> - <</if>> - tied to the bed, - <<if ($slaverapistx.sexualQuirk == "perverted") || ($slaverapistx.sexualQuirk == "sinful")>> - <<if _incestMood == "Bottom">> - and can't hide _his2 <<if ($slaverapistx.sexualQuirk == "perverted")>>perverted<<else>>sinful<</if>> arousal at the excited glances they share. - <<set _incestMood = "Both">> - <<else>> - <<set _incestMood = "Top">> - and becomes indecently aroused at their horrified expressions for the <<if ($slaverapistx.sexualQuirk == "perverted")>>perverted<<else>>sinful<</if>> incest to come. - <</if>> - <<elseif ($slaverapistx.relationshipTarget == $AS) && ($slaverapistx.relationship > 2)>> - and licks _his2 lips involuntarily. - <<else>> - <<if $slaverapistx.devotion > 95>> - <<if _incestMood == "Bottom">> - as well as _his2 apparent lust. Since _he2 is a perfect slave for you, _his2 vagina becomes flushed with arousal quickly. - <<set _incestMood = "Both">> - <<else>> - <<set _incestMood = "Top">> - as well as $his worried expressions. $slaverapistx.slaveName seems aroused and determined to show $him how a proper slave should act. - <</if>> - <<elseif $slaverapistx.devotion > 60>> - <<if _incestMood == "BottomFragile">> - <<unset _incestMood>> - <</if>> - and after figuring out they're just as superficially prepared as _he2 is, resolves _himself2 to forget they're related to stay aroused. - <<else>> - and can't hide the look of horror that crosses _his2 face. You assure _him2 this is what _he2 needs to do. - <<if _incestMood == "Bottom">> - To _his2 growing disgust, _he2 can tell <<= getSlave($AS).slaveName>>'s <<if (getSlave($AS).clit >= 4)>>erect clit<<else>>_dickSize erection<</if>> shows off genuine arousal despite their blood relation. - <<else>> - _He2 might find solace in the fact that the owner of the <<if (getSlave($AS).clit >= 4)>>erect clit<<else>>_dickSize erection<</if>> on display doesn't seem thrilled as well. - <</if>> - <</if>> - <</if>> - <<else>> - <<if (getSlave($AS).relationshipTarget == $slaverapistx.ID)>> - $his <<print relationshipTerm(getSlave($AS), $slaverapistx)>> - <<elseif (getSlave($AS).rivalryTarget == $slaverapistx.ID)>> - $his <<print rivalryTerm(getSlave($AS), $slaverapistx)>> - <<elseif (getSlave($AS).origBodyOwnerID == $slaverapistx.ID)>> - $his former body - <<else>> - <<= getSlave($AS).slaveName>> - <</if>> - tied to the bed, - <<if ($slaverapistx.relationshipTarget == $AS && $slaverapistx.relationship > 2) || ($slaverapistx.rivalryTarget == $AS)>> - and licks _his2 lips involuntarily. - <<else>> - <<if $slaverapistx.devotion > 95>> - <<if _incestMood == "Bottom">> - as well as _his2 apparent lust. Since _he2 is a perfect slave for you, _his2 vagina becomes flushed with arousal quickly. - <<set _incestMood = "Both">> - <<else>> - <<set _incestMood = "Top">> - as well as $his worried expressions. $slaverapistx.slaveName seems aroused and determined to show $him how a proper slave should act. - <</if>> - <<elseif $slaverapistx.devotion > 20>> - <<if _incestMood == "BottomFragile">> - <<unset _incestMood>> - <</if>> - and after figuring out they're just as superficially prepared as _he2 is, resolves _himself2 to try and make it pleasurable. - <<else>> - and can't hide the look of horror that crosses _his2 face. You assure _him2 this is what _he2 needs to do. - <<if _incestMood == "Bottom">> - To _his2 growing disgust, _he2 can tell <<= getSlave($AS).slaveName>>'s <<if (getSlave($AS).clit >= 4)>>erect clit<<else>>_dickSize erection<</if>> shows off genuine arousal despite _his2 unwillingness. - <<else>> - _He2 might find solace in the fact that the owner of the <<if (getSlave($AS).clit >= 4)>>erect clit<<else>>_dickSize erection<</if>> on display doesn't seem thrilled as well. - <</if>> - <</if>> - <</if>> - <</if>> - - <<if _incestMood == "Top" || _incestMood == "Both" || ndef(_isIncest)>> - <<if ($slaverapistx.fetishKnown == 1)>> - <<if ($slaverapistx.fetish == "submissive")>> - $slaverapistx.slaveName usually prefers to be underneath someone with a <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>> like that, which is obvious in _his2 expressions. Knowing _he2's riding it due to someone's orders is just about the only detail that plays to _his2 fetish. - <<elseif ($slaverapistx.fetish == "dom")>> - $slaverapistx.slaveName can't hide _his2 domineering smile at the <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>> tied up and presented to _him2. Being on top and controlling everything is what gets _him2 off, and you just gave _him2 a nice human dildo to dominate. - <<elseif ($slaverapistx.fetish == "masochist")>> - $slaverapistx.slaveName usually prefers to be the one being abused, which is clear from _his2 disappointed reaction as _he2 considers the <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize erection<</if>> tied before _him2. Maybe _he2 can delude _himself2 into thinking this is a denial play for _himself2 and enjoy the human dildo, or maybe not. - <<elseif ($slaverapistx.fetish == "sadist")>> - $slaverapistx.slaveName is a sadist, and seeing a human dildo tied town for _him2 to abuse and enjoy has _him2 almost panting in arousal. The ecstatic look of devotion _he2 flashes you makes it clear _he2's going to enjoy _himself2, regardless of how the <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize cock<</if>>'s owner feels. - <<elseif ($slaverapistx.fetish == "humiliation")>> - $slaverapistx.slaveName usually gets off on humiliation, and you know _he2 wishes the roles were reversed here. Despite that, having _his2 <<= getWrittenTitle($slaverapistx)>> order _him2 to get _himself2 off with the human dildo beneath _him2 is quite thrilling, sexually. - <</if>> - <</if>> - <</if>> -<</if>> - -<br><br> - - -<<if (getSlave($AS).devotion < -20) && ($slaverapistx.devotion < -20)>> - Since you have two restrained slaves, it's up to you to do all the work. Since <<= getSlave($AS).slaveName>> is already lying on the bed, you maneuver $slaverapistx.slaveName's pussy into place. The two slaves make no further moves until you deal $slaverapistx.slaveName a terrific swat across the ass and promise to give _him2 more of the same until _he2 gets going. $slaverapistx.slaveName starts lowering _himself2 very slowly, pulling back every time <<= getSlave($AS).slaveName>>'s dick prods _his2 womanhood. After watching the sad display for a while, you grab _him2 by the hips and slam _him2 down onto <<= getSlave($AS).slaveName>>, hilting _him2 in one, scream-inducing move. - <<if ($slaverapistx.vagina == 0)>> /* losing virginity */ - <<if ($slaverapistx.devotion > 20)>> - $slaverapistx.slaveName accepts your orders without comment and lowers _his2 virgin pussy on <<= getSlave($AS).slaveName>>'s ready <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>>. @@.hotpink;$slaverapistx.slaveName is further broken to slavery@@ by this application of _his2 body, which naturally @@.lime;will break in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion += 10>> - <<elseif ($slaverapistx.devotion >= -20)>> - $slaverapistx.slaveName is clearly unhappy at the idea of losing _his2 pearl of great price to <<= getSlave($AS).slaveName>>; this probably isn't what _he2 imagined _his2 first real sex would be like. _He2 fears _he2 might get pregnant. Nevertheless, @@.hotpink;$he is further broken to slavery@@ by this application of _his2 body, which naturally @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion += 4>> - <<else>> - As you anticipated, $slaverapistx.slaveName refuses to give <<= getSlave($AS).slaveName>> _his2 virginity. However, since $slaverapistx.slaveName is restrained _his2 resistance amounts to @@.mediumorchid;horrified tears@@ and @@.gold;frightened begging.@@ Naturally, this cruel act @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion -= 5, $slaverapistx.trust -= 5>> - <</if>> - <<if $slaverapistx.mother == $AS>> - <<if (getSlave($AS).counter.penetrative == 0)>> - <<= getSlave($AS).slaveName>> gasps and $his eyes widen as $he feels the tender folds of a pussy — and none other than $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>'s — embracing $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> for the first time. - <<else>> - <<= getSlave($AS).slaveName>>'s breath quickens as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> disappears into $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>'s vagina. - <</if>> - <<elseif getSlave($AS).mother == $slaverapistx.ID>> - <<if (getSlave($AS).counter.penetrative == 0)>> - <<= getSlave($AS).slaveName>> gasps and $his eyes widen as $he feels the tender folds of a pussy — and none other than $his mother's — embracing $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> for the first time. - <<else>> - <<= getSlave($AS).slaveName>>'s breath quickens as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> disappears into $his mother's vagina. - <</if>> - <</if>> - <</if>> /* closes losing virginity */ - $slaverapistx.slaveName seems more cooperative after that and you only have to occasionally prod them with an electrical jolt to keep them going at a faster pace. Both slaves resent what you made them do and fear you as a result. - -<<elseif (getSlave($AS).devotion < -20)>> - Since your dick slave is restrained, you order $slaverapistx.slaveName to kneel on the bed on top of <<= getSlave($AS).slaveName>>, and then maneuver _his2 pussy into place. <<= getSlave($AS).slaveName>> is uncooperative, so you prod and slap $him until $he starts to thrust $his cock into $slaverapistx.slaveName with urgency. - <<if ($slaverapistx.vagina == 0)>> /* losing virginity */ - <<if ($slaverapistx.devotion > 20)>> - $slaverapistx.slaveName accepts your orders without comment and lowers _his2 virgin pussy on <<= getSlave($AS).slaveName>>'s ready <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>>. @@.hotpink;$slaverapistx.slaveName is further broken to slavery@@ by this application of _his2 body, which naturally @@.lime;will break in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion += 10>> - <<elseif ($slaverapistx.devotion >= -20)>> - $slaverapistx.slaveName is clearly unhappy at the idea of losing _his2 pearl of great price to <<= getSlave($AS).slaveName>>; this probably isn't what _he2 imagined _his2 first real sex would be like. _He2 fears _h2e might get pregnant. Nevertheless, @@.hotpink;$he is further broken to slavery@@ by this application of _his2 body, which naturally @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion += 4>> - <<else>> - As you anticipated, $slaverapistx.slaveName refuses to give <<= getSlave($AS).slaveName>> _his2 virginity. However, since $slaverapistx.slaveName is restrained _his2 resistance amounts to @@.mediumorchid;horrified tears@@ and @@.gold;frightened begging.@@ Naturally, this cruel act @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion -= 5, $slaverapistx.trust -= 5>> - <</if>> - <<if $slaverapistx.mother == $AS>> - <<if (getSlave($AS).counter.penetrative == 0)>> - <<= getSlave($AS).slaveName>> gasps and $his eyes widen as $he feels the tender folds of a pussy — and none other than $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>'s — embracing $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> for the first time. - <<else>> - <<= getSlave($AS).slaveName>>'s breath quickens as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> disappears into $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>'s vagina. - <</if>> - <<elseif getSlave($AS).mother == $slaverapistx.ID>> - <<if (getSlave($AS).counter.penetrative == 0)>> - <<= getSlave($AS).slaveName>> gasps and $his eyes widen as $he feels the tender folds of a pussy — and none other than $his mother's — embracing $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> for the first time. - <<else>> - <<= getSlave($AS).slaveName>>'s breath quickens as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> disappears into $his mother's vagina. - <</if>> - <</if>> - <</if>> /* closes losing virginity */ - It doesn't take long for <<= getSlave($AS).slaveName>> to orgasm. $He resents what you made $him do and fears you as a result. - -<<elseif ($slaverapistx.fetish == "dom") && ($slaverapistx.fetishStrength > 20) && ($slaverapistx.devotion > 20)>> - You tell the randy $slaverapistx.slaveName that <<= getSlave($AS).slaveName>>'s <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> is all _hers2. The slave life has so affected $slaverapistx.slaveName that _he2 is quite eager to rape another slave for _his2 pleasure. - <<if $slaverapistx.vagina == 0>> - Without further instruction, $slaverapistx.slaveName lowers _his2 virgin pussy onto <<= getSlave($AS).slaveName>> waiting <<if (getSlave($AS).clit >= 4)>>clit-dick<<else>>_dickSize dick<</if>>, impaling _himself2 slowly and teasing _his2 bound victim. This act @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.fetishStrength += 1>> - <</if>> - _He2 begins playing with _him2 immediately, fondling, pinching and licking while bouncing on the meaty shaft. Occasionally _he2 stops, denying <<= getSlave($AS).slaveName>> release and teasing $him, fully enjoying _his2 dominant role. - <<if getSlave($AS).dick > 0>> - <<if (getSlave($AS).fetish == "submissive")>> - By the end of the session <<= getSlave($AS).slaveName>>'s abused, pent-up penis has shot a massive load into $slaverapistx.slaveName's welcoming pussy. $He is glad to be dominated. - <<else>> - By the end of the session <<= getSlave($AS).slaveName>>'s abused, pent-up penis has shot a massive load, to $his horror and resentment, into the blissfully satisfied $slaverapistx.slaveName. - <</if>> - <</if>> - -<<elseif ($slaverapistx.fetish == "sadist") && ($slaverapistx.fetishStrength > 20) && (getSlave($AS).devotion < -20)>> - You tell the grinning $slaverapistx.slaveName that <<= getSlave($AS).slaveName>>'s <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> is all _hers2. The slave life has so affected $slaverapistx.slaveName that _he2 is quite eager to hurt and rape another slave for _his2 pleasure. - <<if ($slaverapistx.vagina == 0)>> /* losing virginity */ - <<if ($slaverapistx.devotion > 20)>> - $slaverapistx.slaveName accepts your orders without comment and lowers _his2 virgin pussy on <<= getSlave($AS).slaveName>>'s ready <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>>. @@.hotpink;$slaverapistx.slaveName is further broken to slavery@@ by this application of _his2 body, which naturally @@.lime;will break in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion += 10>> - <<elseif ($slaverapistx.devotion >= -20)>> - $slaverapistx.slaveName is clearly unhappy at the idea of losing _his2 pearl of great price to <<= getSlave($AS).slaveName>>; this probably isn't what _he2 imagined _his2 first real sex would be like. _He2 fears _he2 might get pregnant. Nevertheless, @@.hotpink;$he is further broken to slavery@@ by this application of _his2 body, which naturally @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion += 4>> - <<else>> - As you anticipated, $slaverapistx.slaveName refuses to give <<= getSlave($AS).slaveName>> _his2 virginity. However, since $slaverapistx.slaveName is restrained _his2 resistance amounts to @@.mediumorchid;horrified tears@@ and @@.gold;frightened begging.@@ Naturally, this cruel act @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion -= 5, $slaverapistx.trust -= 5>> - <</if>> - <<if $slaverapistx.mother == $AS>> - <<if (getSlave($AS).counter.penetrative == 0)>> - <<= getSlave($AS).slaveName>> gasps and $his eyes widen as $he feels the tender folds of a pussy — and none other than $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>'s — embracing $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> for the first time. - <<else>> - <<= getSlave($AS).slaveName>>'s breath quickens as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> disappears into $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>'s vagina. - <</if>> - <<elseif getSlave($AS).mother == $slaverapistx.ID>> - <<if (getSlave($AS).counter.penetrative == 0)>> - <<= getSlave($AS).slaveName>> gasps and $his eyes widen as $he feels the tender folds of a pussy — and none other than $his mother's — embracing $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> for the first time. - <<else>> - <<= getSlave($AS).slaveName>>'s breath quickens as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> disappears into $his mother's vagina. - <</if>> - <</if>> - <</if>> /* closes losing virginity */ - _He2 begins playing with $him immediately, slapping, pinching and licking $his boobs while bouncing on the meaty shaft. Occasionally _he2 stops, denying <<= getSlave($AS).slaveName>> release by painfully squeezing and smacking the sensitive shaft. By the end of the session <<= getSlave($AS).slaveName>>'s abused, pent-up penis has shot several massive and painful loads into the blissfully satisfied $slaverapistx.slaveName, leaving $him lying on the bed, shaking in horror and @@.health.dec;utter exhaustion,@@ while $slaverapistx.slaveName reaps the opportunity to continue painfully tormenting $him. - <<run healthDamage(getSlave($AS), 10)>> - <<set getSlave($AS).counter.penetrative += 3, $penetrativeTotal += 3, $slaverapistx.counter.vaginal += 3, $vaginalTotal += 3>> - -<<elseif ($slaverapistx.energy > 95) && ($slaverapistx.devotion > 20)>> - You tell the randy $slaverapistx.slaveName that <<= getSlave($AS).slaveName>>'s <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> is all $hers. The slave life has so affected $slaverapistx.slaveName that _he2 is quite eager to rape another slave, just for the perverted novelty of the act. - <<if ($slaverapistx.vagina == 0)>> /* losing virginity */ - <<if ($slaverapistx.devotion > 20)>> - $slaverapistx.slaveName accepts your orders without comment and lowers _his2 virgin pussy on <<= getSlave($AS).slaveName>>'s ready <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>>. @@.hotpink;$slaverapistx.slaveName is further broken to slavery@@ by this application of _his2 body, which naturally @@.lime;will break in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion += 10>> - <<elseif ($slaverapistx.devotion >= -20)>> - $slaverapistx.slaveName is clearly unhappy at the idea of losing _his2 pearl of great price to <<= getSlave($AS).slaveName>>; this probably isn't what _he2 imagined _his2 first real sex would be like. _He2 fears _he2 might get pregnant. Nevertheless, @@.hotpink;$he is further broken to slavery@@ by this application of _his2 body, which naturally @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion += 4>> - <<else>> - As you anticipated, $slaverapistx.slaveName refuses to give <<= getSlave($AS).slaveName>> _his2 virginity. However, since $slaverapistx.slaveName is restrained _his2 resistance amounts to @@.mediumorchid;horrified tears@@ and @@.gold;frightened begging.@@ Naturally, this cruel act @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion -= 5, $slaverapistx.trust -= 5>> - <</if>> - <<if $slaverapistx.mother == $AS>> - <<if (getSlave($AS).counter.penetrative == 0)>> - <<= getSlave($AS).slaveName>> gasps and $his eyes widen as $he feels the tender folds of a pussy — and none other than $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>'s — embracing $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> for the first time. - <<else>> - <<= getSlave($AS).slaveName>>'s breath quickens as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> disappears into $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>'s vagina. - <</if>> - <<elseif getSlave($AS).mother == $slaverapistx.ID>> - <<if (getSlave($AS).counter.penetrative == 0)>> - <<= getSlave($AS).slaveName>> gasps and $his eyes widen as $he feels the tender folds of a pussy — and none other than $his mother's — embracing $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> for the first time. - <<else>> - <<= getSlave($AS).slaveName>>'s breath quickens as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> disappears into $his mother's vagina. - <</if>> - <</if>> - <</if>> /* closes losing virginity */ - _He2 rides the helpless <<= getSlave($AS).slaveName>> through several ejaculating orgasms. In the short breaks between them, _he2 teases $his pussy. By the end of the session $slaverapistx.slaveName's cunt is dripping cum, to _his2 obvious satiation and bliss. <<= getSlave($AS).slaveName>> is lying next to _him2 on the bed in a state of fatigue, the entire experience having thoroughly exhausted $him. - <<set getSlave($AS).counter.penetrative += 3, $penetrativeTotal += 3, $slaverapistx.counter.vaginal += 3, $vaginalTotal += 3>> - -<<elseif (getSlave($AS).devotion <= 20) || ($slaverapistx.devotion <= 20)>> - You toss <<= getSlave($AS).slaveName>> onto the bed and tell $slaverapistx.slaveName to get on with it. - <<if ($slaverapistx.vagina == 0)>> /* losing virginity */ - <<if ($slaverapistx.devotion > 20)>> - $slaverapistx.slaveName accepts your orders without comment and lowers _his2 virgin pussy on <<= getSlave($AS).slaveName>>'s ready <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>>. @@.hotpink;$slaverapistx.slaveName is further broken to slavery@@ by this application of _his2 body, which naturally @@.lime;will break in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion += 10>> - <<elseif ($slaverapistx.devotion >= -20)>> - $slaverapistx.slaveName is clearly unhappy at the idea of losing _his2 pearl of great price to <<= getSlave($AS).slaveName>>; this probably isn't what _he2 imagined _his2 first real sex would be like. _He2 fears _he2 might get pregnant. Nevertheless, @@.hotpink;_he2 is further broken to slavery@@ by this application of _his2 body, which naturally @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion += 4>> - <<else>> - As you anticipated, $slaverapistx.slaveName refuses to give <<= getSlave($AS).slaveName>> _his2 virginity. However, since $slaverapistx.slaveName is restrained _his2 resistance amounts to @@.mediumorchid;horrified tears@@ and @@.gold;frightened begging.@@ Naturally, this cruel act @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion -= 5, $slaverapistx.trust -= 5>> - <</if>> - <<if $slaverapistx.mother == $AS>> - <<if (getSlave($AS).counter.penetrative == 0)>> - <<= getSlave($AS).slaveName>> gasps and $his eyes widen as $he feels the tender folds of a pussy — and none other than $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>'s — embracing $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> for the first time. - <<else>> - <<= getSlave($AS).slaveName>>'s breath quickens as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> disappears into $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>'s vagina. - <</if>> - <<elseif getSlave($AS).mother == $slaverapistx.ID>> - <<if (getSlave($AS).counter.penetrative == 0)>> - <<= getSlave($AS).slaveName>> gasps and $his eyes widen as $he feels the tender folds of a pussy — and none other than $his mother's — embracing $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> for the first time. - <<else>> - <<= getSlave($AS).slaveName>>'s breath quickens as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> disappears into $his mother's vagina. - <</if>> - <</if>> - <</if>> /* closes losing virginity */ - They fuck mechanically, gazing with roiling emotions into each others' eyes. They do seem to come to some sort of a nonverbal understanding on the necessity of getting it done, and there is no real unhappiness in either of them when they finish and disentangle themselves. As they clean themselves and exit, you notice $slaverapistx.slaveName's looking a little more longingly at <<= getSlave($AS).slaveName>>. - -<<elseif (getSlave($AS).devotion <= 50) || ($slaverapistx.devotion <= 50)>> - You order <<= getSlave($AS).slaveName>> and $slaverapistx.slaveName to get on with it. - <<if ($slaverapistx.vagina == 0)>> /* losing virginity */ - <<if ($slaverapistx.devotion > 20)>> - $slaverapistx.slaveName accepts your orders without comment and lowers _his2 virgin pussy on <<= getSlave($AS).slaveName>>'s ready <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>>. @@.hotpink;$slaverapistx.slaveName is further broken to slavery@@ by this application of _his2 body, which naturally @@.lime;will break in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion += 10>> - <<elseif ($slaverapistx.devotion >= -20)>> - $slaverapistx.slaveName is clearly unhappy at the idea of losing _his2 pearl of great price to <<= getSlave($AS).slaveName>>; this probably isn't what _he2 imagined _his2 first real sex would be like. _He2 fears _he2 might get pregnant. Nevertheless, @@.hotpink;$he is further broken to slavery@@ by this application of _his2 body, which naturally @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion += 4>> - <<else>> - As you anticipated, $slaverapistx.slaveName refuses to give <<= getSlave($AS).slaveName>> _his2 virginity. However, since $slaverapistx.slaveName is restrained _his2 resistance amounts to @@.mediumorchid;horrified tears@@ and @@.gold;frightened begging.@@ Naturally, this cruel act @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion -= 5, $slaverapistx.trust -= 5>> - <</if>> - <<if $slaverapistx.mother == $AS>> - <<if (getSlave($AS).counter.penetrative == 0)>> - <<= getSlave($AS).slaveName>> gasps and $his eyes widen as $he feels the tender folds of a pussy — and none other than $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>'s — embracing $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> for the first time. - <<else>> - <<= getSlave($AS).slaveName>>'s breath quickens as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> disappears into $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>'s vagina. - <</if>> - <<elseif getSlave($AS).mother == $slaverapistx.ID>> - <<if (getSlave($AS).counter.penetrative == 0)>> - <<= getSlave($AS).slaveName>> gasps and $his eyes widen as $he feels the tender folds of a pussy — and none other than $his mother's — embracing $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> for the first time. - <<else>> - <<= getSlave($AS).slaveName>>'s breath quickens as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> disappears into $his mother's vagina. - <</if>> - <</if>> - <</if>> /* closes losing virginity */ - They fuck mechanically at first, gazing with roiling emotions into each others' eyes. Eventually, they begin to enjoy the intimacy of the act, finding the shared pleasure between them comforting. They finish and resume life as slaves, the light of this intimacy diminishing, softening with <<= getSlave($AS).slaveName>>'s <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> and dripping away with the contents of $slaverapistx.slaveName's cum-filled pussy. You notice $slaverapistx.slaveName's looking a little more longingly at <<= getSlave($AS).slaveName>>. - -<<else>> - The two slaves turn eagerly to the business of sex. - <<if ($slaverapistx.vagina == 0)>> /* losing virginity */ - <<if ($slaverapistx.devotion > 20)>> - $slaverapistx.slaveName accepts your orders without comment and lowers _his2 virgin pussy on <<= getSlave($AS).slaveName>>'s ready <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>>. @@.hotpink;$slaverapistx.slaveName is further broken to slavery@@ by this application of _his2 body, which naturally @@.lime;will break in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion += 10>> - <<elseif ($slaverapistx.devotion >= -20)>> - $slaverapistx.slaveName is clearly unhappy at the idea of losing _his2 pearl of great price to <<= getSlave($AS).slaveName>>; this probably isn't what _he2 imagined _his2 first real sex would be like. _He2 fears _he2 might get pregnant. Nevertheless, @@.hotpink;$he is further broken to slavery@@ by this application of _his2 body, which naturally @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion += 4>> - <<else>> - As you anticipated, $slaverapistx.slaveName refuses to give <<= getSlave($AS).slaveName>> _his2 virginity. However, since $slaverapistx.slaveName is restrained _his2 resistance amounts to @@.mediumorchid;horrified tears@@ and @@.gold;frightened begging.@@ Naturally, this cruel act @@.lime;breaks in _his2 pussy.@@ - <<set $slaverapistx.vagina = 1, $slaverapistx.devotion -= 5, $slaverapistx.trust -= 5>> - <</if>> - <<if $slaverapistx.mother == $AS>> - <<if (getSlave($AS).counter.penetrative == 0)>> - <<= getSlave($AS).slaveName>> gasps and $his eyes widen as $he feels the tender folds of a pussy — and none other than $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>'s — embracing $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> for the first time. - <<else>> - <<= getSlave($AS).slaveName>>'s breath quickens as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> disappears into $his <<print relativeTerm(getSlave($AS), $slaverapistx)>>'s vagina. - <</if>> - <<elseif getSlave($AS).mother == $slaverapistx.ID>> - <<if (getSlave($AS).counter.penetrative == 0)>> - <<= getSlave($AS).slaveName>> gasps and $his eyes widen as $he feels the tender folds of a pussy — and none other than $his mother's — embracing $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> for the first time. - <<else>> - <<= getSlave($AS).slaveName>>'s breath quickens as $his <<if (getSlave($AS).clit >= 4)>>massive clit<<else>>_dickSize dick<</if>> disappears into $his mother's vagina. - <</if>> - <</if>> - <</if>> /* closes losing virginity */ - $slaverapistx.slaveName happily rides <<= getSlave($AS).slaveName>>, who occasionally thrusts $his hips up. After a little while, when $slaverapistx.slaveName bends down to engage in passionate kissing, you come over and - <<if canDoAnal($slaverapistx) && $slaverapistx.anus > 0>> - penetrate $slaverapistx.slaveName's free asshole with your <<if $PC.dick != 0>>dick<<else>>strap-on<</if>>. With the extra stimulus of double penetration, _he2 comes indecently hard. The two of them collapse into an exhausted, satisfied pile of slave flesh. - <<set $slaverapistx.counter.anal++, $analTotal++>> - <<if canImpreg($slaverapistx, $PC)>> - <<= knockMeUp($slaverapistx, 5, 1, -1, 1)>> - <</if>> - <<elseif canDoVaginal(getSlave($AS))>> - penetrate <<= getSlave($AS).slaveName>>'s free pussy with your <<if $PC.dick != 0>>dick<<else>>strap-on<</if>>. With the double stimulus of penetrating a tight vagina and being penetrated while restrained, $he comes indecently hard. The two of them collapse into an exhausted, satisfied pile of slave flesh. - <<= VCheck.Vaginal(getSlave($AS), 1)>> - <<elseif canDoAnal(getSlave($AS))>> - penetrate <<= getSlave($AS).slaveName>>'s free asshole with your <<if $PC.dick != 0>>dick<<else>>strap-on<</if>>. With the double stimulus of penetrating a tight vagina and being penetrated while restrained, $he comes indecently hard. The two of them collapse into an exhausted, satisfied pile of slave flesh. - <<= VCheck.Anal(getSlave($AS), 1)>> - <<else>> - pull _his2 face to your crotch. All this penetration has got you horny and there are no free holes to fuck, so a little oral will have to do. It doesn't take long for all three of you to collapse into an exhausted, satisfied pile of flesh. - <<set $slaverapistx.counter.oral++, $oralTotal++>> - <</if>> -<</if>> - - -<br><br> - -<<set getSlave($AS).counter.penetrative += 1, $penetrativeTotal += 1, $slaverapistx.counter.vaginal += 1, $vaginalTotal += 1>> -<<run addPartner(getSlave($AS), $slaverapistx)>> - -/% Friendship/lust? %/ -<<if ([2].includes(getSlave($AS).relationship) && getSlave($AS).relationshipTarget == $slaverapistx.ID) && ([2].includes($slaverapistx.relationship) && $slaverapistx.relationshipTarget == $AS)>> - You keep <<= getSlave($AS).slaveName>>'s dick intimate with $slaverapistx.slaveName's pussy for awhile, something the two friends haven't been sharing with each other. In the end, you are certain they got closer, becoming @@.lightgreen;friends with benefits.@@ - <<set getSlave($AS).relationship++, $slaverapistx.relationship++>> -<</if>> - -/% pregnancy test %/ -<<if canImpreg($slaverapistx, getSlave($AS))>> - <<= knockMeUp($slaverapistx, 25, 0, $AS)>> -<</if>> - -/% save changes %/ -<<set $slaves[$slaveIndices[$slaverapistx.ID]] = $slaverapistx>> diff --git a/src/npc/interaction/passage/fSlaveSlaveVag.js b/src/npc/interaction/passage/fSlaveSlaveVag.js new file mode 100644 index 0000000000000000000000000000000000000000..e8a4820a47b27a432d1abecdd8ff429407949db6 --- /dev/null +++ b/src/npc/interaction/passage/fSlaveSlaveVag.js @@ -0,0 +1,476 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {HTMLElement} + */ +App.Interact.fSlaveSlaveVag = function(slave) { + const node = document.createElement("div"); + + App.UI.DOM.appendNewElement("div", node, `Select a slave that will fuck ${slave.slaveName}.`); + App.UI.DOM.appendNewElement("h2", node, `Select an eligible slave`); + + const _eligibles = V.slaves.filter((s) => (s.ID !== slave.ID) && isSlaveAvailable(s) && (canPenetrate(s) || s.clit >= 4)); + for (const eligible of _eligibles) { + const div = App.UI.DOM.appendNewElement("div", node); + div.append(App.UI.DOM.link( + SlaveFullName(eligible), + () => { + jQuery(node).empty().append(content(eligible)); + } + )); + if (eligible.custom.label) { + App.UI.DOM.appendNewElement("span", div, ` ${eligible.custom.label}`, ["yellow", "bold"]); + } + if (canImpreg(eligible, slave)) { + App.UI.DOM.appendNewElement("span", div, ` Virile`, "green"); + } + if (totalRelatives(slave) > 0) { + const _relTerm = relativeTerm(slave, eligible); + if (_relTerm !== null) { + App.UI.DOM.appendNewElement("span", div, ` ${capFirstChar(_relTerm)}`, "lightgreen"); + } + } + } + if (_eligibles.length === 0) { + App.UI.DOM.appendNewElement("div", node, `You have no slaves capable of this act.`, "note"); + } + return node; + /** + * + * @param {App.Entity.SlaveState} rapist + * @returns {DocumentFragment} + */ + function content(rapist) { + const el = new DocumentFragment(); + let r = []; + const { + He, His, + he, his, him, himself + } = getPronouns(slave); + + const { + He2, His2, + he2, his2, him2, himself2, hers2, wife2 + } = getPronouns(rapist).appendSuffix("2"); + let _incestMood; + + addPartner(slave, -1); + + slave.counter.vaginal += 1; + V.vaginalTotal += 1; + rapist.counter.penetrative++; + V.penetrativeTotal++; + + let _dickSize; + if (rapist.dick === 1) { + _dickSize = "pathetic"; + } else if (rapist.dick === 2) { + _dickSize = "tiny"; + } else if (rapist.dick === 3) { + _dickSize = "average"; + } else if (rapist.dick === 4) { + _dickSize = "big"; + } else if (rapist.dick === 5) { + _dickSize = "huge"; + } else if (rapist.dick === 6) { + _dickSize = "gigantic"; + } else if (rapist.dick === 7) { + _dickSize = "titanic"; + } else if (rapist.dick === 8) { + _dickSize = "absurd"; + } else if (rapist.dick === 9) { + _dickSize = "inhuman"; + } else { + _dickSize = "obscene"; + } + + const _isIncest = areRelated(slave, rapist); + + r.push(`You take a look at the slave you selected.`); + + if (rapist.fetish === "dom" && rapist.fetishStrength > 20 && rapist.devotion >= -20) { + r.push(`Since ${rapist.slaveName} loves to dominate others it's not hard to get ${his2}`); + if (rapist.dick > 0) { + r.push(`${_dickSize} dick`); + } else { + r.push(`massive clit`); + } + r.push(`ready.`); + if (rapist.attrXX > 65) { + r.push(`With ${his2} love of pussy, ${he2} becomes aroused indecently fast.`); + } else { + r.push(`${His2}`); + if (rapist.dick > 0) { + r.push(`${_dickSize} cock`); + } else { + r.push(`massive clit`); + } + r.push(`quickly swells to a throbbing erection at the prospect of forcing ${himself2} on another slave.`); + } + } else if (rapist.fetish === "sadist" && rapist.fetishStrength > 20 && rapist.devotion >= -20) { + r.push(`With the prospect of torturing another slave`); + if (rapist.dick > 0) { + r.push(`${his2} ${_dickSize} cock swells to a throbbing erection in seconds.`); + } else { + r.push(`${his2} huge clit becomes fully engorged in seconds.`); + } + } else if ((rapist.fetish === "pregnancy" && rapist.fetishStrength > 20 && rapist.devotion >= -20) && rapist.dick > 0) { + r.push(`With the prospect of raping another slave bareback, ${his2} ${_dickSize} cock swells to a throbbing erection in seconds.`); + } else if (rapist.attrXX > 65 && rapist.devotion >= -20) { + r.push(`Since ${rapist.slaveName} likes sticking ${his2}`); + if (rapist.dick > 0) { + r.push(`${_dickSize} penis`); + } else { + r.push(`massive clit`); + } + r.push(`in girls, ${he2} doesn't take much convincing.`); + } else if (rapist.devotion > 50) { + r.push(`Since ${rapist.slaveName} is devoted to you, ${he2}'ll eagerly fuck anything you tell ${him2} to fuck.`); + } else if (rapist.devotion > 20) { + r.push(`Since ${rapist.slaveName} is obedient, ${he2}'ll fuck anything you tell ${him2} to fuck.`); + } else if (rapist.devotion >= -20) { + r.push(`Since ${rapist.slaveName} does not resist your will, ${he2} should comply reasonably well. ${He2} has to work to get ${his2}`); + if (rapist.dick > 0) { + r.push(`${_dickSize} penis`); + } else { + r.push(`massive clit`); + } + r.push(`hard despite ${his2} doubts, visibly disturbed that you are ordering ${him2} to fuck someone for your entertainment.`); + } else { + r.push(`Since ${rapist.slaveName} is unlikely to comply willingly, you simply restrain ${him2} and administer a massive dose of vasodilators, directly where they will do the most good. ${rapist.slaveName} writhes with the pain of the injection, which is compounded as ${his2}`); + if (rapist.dick > 0) { + r.push(`${_dickSize} penis`); + } else { + r.push(`massive clit`); + } + r.push(`quickly reaches an agonizingly full erection.`); + } + + if (_isIncest) { + r.push(`${rapist.slaveName} is well aware that ${he2} is about to rape`); + if (rapist.father === slave.ID && rapist.mother === slave.ID) { + r.push(`the slave that is both ${his2} mother and ${his2} father,`); + } else if (slave.mother === rapist.ID || slave.father === rapist.ID) { + r.push(`${his2} own ${relativeTerm(rapist, slave)},`); + } else if (rapist.mother === slave.ID) { + r.push(`${his2} own mother,`); + } else if (rapist.father === slave.ID) { + r.push(`the slave that fathered ${him2},`); + } else { + r.push(`${his2} ${relativeTerm(rapist, slave)},`); + } + if (rapist.sexualQuirk === "perverted" || rapist.behavioralQuirk === "sinful") { + if (rapist.energy > 60) { + r.push(`and seems quite aroused at just how`); + if (rapist.sexualQuirk === "perverted") { + r.push(`perverted`); + } else { + r.push(`sinful`); + } + r.push(`that is.`); + if (canSee(rapist)) { + r.push(`${rapist.slaveName}'s eyes seemed locked on ${slave.slaveName}'s inviting pussy, thoroughly aroused and waiting for your order.`); + } + } else { + r.push(`but despite ${his2} conflicted feelings ${his2} arousal is clear.`); + } + _incestMood = "Top"; + } else if (rapist.relationshipTarget === slave.ID && rapist.relationship > 2) { + r.push(`but since ${he2}'s already in a sexual relationship with ${him}, it's only special because ${his2} ${getWrittenTitle(rapist)} is watching.`); + _incestMood = "Top"; + } else { + if (rapist.devotion > 95) { + r.push(`but ${his2} deep acceptance of slavery means ${he2} can't help but be eager to please everyone involved with ${his2} performance.`); + _incestMood = "Top"; + } else if (rapist.devotion > 60) { + r.push(`but ${his2} experience as a slave means ${he2} can mostly ignore it and focus on sex.`); + } else { + r.push(`and is understandably disturbed.`); + } + } + } + + App.Events.addParagraph(el, r); + r = []; + + r.push(`Next, you see to ${slave.slaveName}.`); + + if (_isIncest) { + r.push(`${slave.slaveName} is fully naked and`); + if (canSee(slave)) { + r.push(`looking up at`); + } else { + r.push(`waiting in front of`); + } + if (slave.father === rapist.ID && slave.mother === rapist.ID) { + r.push(`the slave that is both ${his} mother and ${his} father,`); + } else if (rapist.mother === slave.ID || rapist.father === slave.ID) { + r.push(`${his} own ${relativeTerm(slave, rapist)},`); + } else if (slave.mother === rapist.ID) { + r.push(`${his} own mother,`); + } else if (slave.father === rapist.ID) { + r.push(`the slave that fathered ${him},`); + } else { + r.push(`${his} ${relativeTerm(slave, rapist)},`); + } + if (slave.sexualQuirk === "perverted" || slave.behavioralQuirk === "sinful") { + if (slave.energy > 60) { + r.push(`whose`); + if (rapist.dick > 0) { + r.push(`${_dickSize} penis`); + } else { + r.push(`massive clit`); + } + r.push(`is standing firm above ${him}. ${He} seems indecently aroused, flushed and shivering in anticipation.`); + } else { + r.push(`but despite ${his} conflicted feelings ${his} growing arousal is clear as ${he}`); + if (canSee(slave)) { + r.push(`stares at`); + } else { + r.push(`imagines`); + } + r.push(`the`); + if (rapist.dick > 0) { + r.push(`${_dickSize} penis`); + } else { + r.push(`massive clit`); + } + r.push(`that's soon going inside ${him}.`); + } + if (_incestMood === "Top") { + _incestMood = "Both"; + } else { + _incestMood = "Bottom"; + } + } else if (slave.relationshipTarget === rapist.ID && slave.relationship > 2) { + r.push(`and seems calm and inviting to ${his}`); + if (slave.relationship === 3) { + r.push(`sex friend's`); + } else if (slave.relationship === 4) { + r.push(`lover's`); + } else { + r.push(`slave ${wife2}'s`); + } + if (rapist.dick > 0) { + r.push(`${_dickSize} penis`); + } else { + r.push(`massive clit`); + } + r.push(`that will be penetrating ${him}.`); + if (_incestMood === "Top") { + _incestMood = "Both"; + } else { + _incestMood = "Bottom"; + } + } else { + if (slave.devotion > 95) { + r.push(`and ${his} deep acceptance of ${his} status as a slave has ${him} staring`); + if (canSee(slave)) { + r.push(`at`); + } else { + r.push(`blindly towards`); + } + r.push(`the`); + if (rapist.dick > 0) { + r.push(`${_dickSize} penis`); + } else { + r.push(`massive clit`); + } + r.push(`above ${him} with a lusty smile.`); + if (_incestMood === "Top") { + _incestMood = "Both"; + } else { + _incestMood = "Bottom"; + } + } else if (slave.devotion > 60) { + r.push(`and if ${he} focuses, ${he} can forget the`); + if (rapist.dick > 0) { + r.push(`${_dickSize} penis`); + } else { + r.push(`massive clit`); + } + r.push(`standing erect in front of ${him} belongs to someone related to ${him}.`); + } else { + r.push(`and is understandably disturbed,`); + if (canSee(slave)) { + r.push(`eyes glued to the`); + if (rapist.dick > 0) { + r.push(`${_dickSize} penis`); + } else { + r.push(`massive clit`); + } + r.push(`throbbing before ${him}.`); + } else if (canHear(slave)) { + r.push(`listening to the heavy breathing of ${his} relative whose`); + if (rapist.dick > 0) { + r.push(`${_dickSize} penis`); + } else { + r.push(`massive clit`); + } + r.push(`will be entering ${him} soon.`); + } else { + r.push(`imagining how the`); + if (rapist.dick > 0) { + r.push(`${_dickSize} penis`); + } else { + r.push(`massive clit`); + } + r.push(`of ${his} relative will feel inside ${him}`); + } + } + } + } + + if (slave.fetish === "submissive" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && slave.vagina === 0) { + r.push(`${He} presents ${his} virgin pussy to ${rapist.slaveName} without protest. This act <span class="lime"> breaks in ${his} pussy,</span> and <span class="hotpink">reminds ${him}</span> of ${his} status as a submissive slave.`); + slave.vagina = 1; + slave.devotion += 4; + slave.fetishStrength += 1; + } else if (slave.fetish === "submissive" && slave.fetishStrength > 60 && slave.fetishKnown === 1) { + r.push(`${He} smiles as ${he} lays back and presents ${his} pussy to ${rapist.slaveName}. ${He} openly enjoys submitting ${himself} for others to make use of.`); + } else if ((slave.devotion > 20 && slave.vagina === 0) ) { + r.push(`${He} accepts your orders without comment and presents ${his} virgin pussy to ${rapist.slaveName}. ${He} gasps in shock when ${he} feels the`); + if (rapist.dick > 0) { + r.push(`${_dickSize} dick`); + } else { + r.push(`massive clit`); + } + r.push(`enter ${him}. <span class="hotpink">${He} is broken to slavery</span> by this application of ${his} body, which naturally <span class="lime">will break in ${his} pussy.</span>`); + slave.vagina = 1; + slave.devotion += 10; + } else if (slave.devotion >= -20 && slave.vagina === 0) { + r.push(`${He} is clearly unhappy at the idea of losing ${his} pearl of great price to ${rapist.slaveName}; this probably isn't what ${he} imagined ${his} first real sexual encounter would be like. Nevertheless, ${he} is <span class="hotpink">broken to slavery</span> by this application of ${his} body, which naturally <span class="lime">will break in ${his} pussy.</span>`); + slave.vagina = 1; + slave.devotion += 4; + } else if (slave.vagina === 0) { + r.push(`As you anticipated, ${he} refuses to give ${rapist.slaveName} ${his} virginity. Since ${he} is restrained, ${his} <span class="mediumorchid">horrified tears</span> and <span class="gold">frightened begging</span> are ${his} only signs on rebellion. Naturally, this cruel act <span class="lime">will break in ${his} pussy.</span>`); + slave.devotion -= 5; + slave.trust -= 5; + slave.vagina = 1; + } + + if (isAmputee(slave)) { + r.push(`You set ${his} limbless torso up for ${rapist.slaveName}.`); + } else if (tooBigBreasts(slave)) { + r.push(`You set ${him} up for ${rapist.slaveName}, face-down so the weight of ${his} tits pins ${him} helplessly in place.`); + } else if (tooBigButt(slave)) { + r.push(`You set ${him} up for ${rapist.slaveName}, face-down so the weight of ${his} giant ass pins ${him} helplessly in place and gives rapist.slaveName a lovely cushion to thrust against.`); + } else if (tooBigDick(slave)) { + r.push(`You set ${him} up for ${rapist.slaveName}, face-up so ${he} is pinned under the weight of ${his} giant cock.`); + } else if (tooBigBalls(slave)) { + r.push(`You set ${him} up for ${rapist.slaveName}, face-down so the weight of ${his} giant balls anchor ${him} helplessly in place.`); + } else if (slave.devotion < -20) { + r.push(`${He} tries to refuse, so you restrain ${him} despite ${his} resistance to the idea of being raped by another slave.`); + } else if (slave.devotion <= 20) { + r.push(`${He} obeys your orders reluctantly, arranging ${himself} for vaginal sex despite ${his} obvious hesitation to be raped by another slave.`); + } else if (slave.devotion < 10) { + r.push(`${He} obeys your orders, arranging ${himself} for vaginal sex despite ${his} slight hesitation at the idea of being another's slave sex toy.`); + } else { + r.push(`${He} happily obeys your orders, getting ready to serve another slave.`); + } + + App.Events.addParagraph(el, r); + r = []; + + if (slave.devotion < -20 && rapist.devotion < -20) { + r.push(`Since you have two restrained slaves, it's up to you to do all the work. ${slave.slaveName} is tied up on the bed with ${his} pussy available, so you maneuver ${rapist.slaveName}'s`); + if (rapist.dick > 0) { + r.push(`${_dickSize} dick`); + } else { + r.push(`strap-on`); + } + r.push(`into place. The two slaves make no further moves until you deal ${rapist.slaveName} a terrific swat across the ass and promise to give ${him2} more of the same until ${he2} gets going. rapist.slaveName starts moving very slowly, barely prodding. After watching them mechanically go at it for a while, you use your leg to suddenly push ${him2} deep into ${slave.slaveName}, fully hilting ${him2} in one motion. You occasionally prod them with an electrical jolt to keep them going at a faster pace. Both slaves resent what you made them do for you and fear you'll make them do it again.`); + } else if (rapist.devotion < -20) { + r.push(`Since your dick slave is restrained, you order ${slave.slaveName} to present ${himself} on the bed, and then maneuver ${rapist.slaveName}'s`); + if (rapist.dick > 0) { + r.push(`${_dickSize} dick`); + } else { + r.push(`strap-on`); + } + r.push(`into place. ${slave.slaveName} does ${his} best to hump ${himself} against the unwilling cock until you deal ${rapist.slaveName} a terrific swat across the ass and promise to give ${him2} more of the same until ${he2} gets going. ${He2} is still unenthusiastic, so you have ${him2} lie down and have ${slave.slaveName} ride ${himself} to orgasm. ${He2} resents what you made ${him2} do and fears you'll force ${him2} to do it again. Though ${slave.slaveName} accepts the situation, ${he} looks into ${rapist.slaveName}'s eyes with obvious apology.`); + } else if (rapist.fetish === "dom" && rapist.fetishStrength > 20 && rapist.devotion > 20) { + r.push(`${slave.slaveName} is tied and placed on the bed with ${his} pussy defenseless and available, and then you tell the randy ${rapist.slaveName} that it's all ${hers2}. The slave life has so affected rapist.slaveName that ${he2} is quite eager to rape another slave for ${his2} pleasure. ${He2} penetrates ${him2} immediately, fondling, pinching and licking while pistoning away, fully enjoying ${his2} dominant role, edging ${his2} poor toy again and again and making ${him2} beg for release.`); + if (slave.fetish === "dom") { + if (slave.devotion < -20) { + r.push(`By the end of the day ${slave.slaveName}'s abused cunt is`); + + if (rapist.dick > 0) { + r.push(`dripping with cum,`); + } else { + r.push(`overflowing with juices,`); + } + r.push(`leaving ${him} horrified and disgusted at ${his} lack of control.`); + } else { + r.push(`By the end of the day ${slave.slaveName}'s abused cunt is`); + + if (rapist.dick > 0) { + r.push(`dripping with cum,`); + } else { + r.push(`overflowing with juices,`); + } + r.push(`leaving ${him} annoyed at ${his} lack of control, though ${he} still somewhat enjoyed ${himself}.`); + } + } else if (slave.fetish === "submissive") { + if (slave.devotion < -20) { + r.push(`By the end of the day ${slave.slaveName}'s abused cunt is`); + + if (rapist.dick > 0) { + r.push(`dripping with cum,`); + } else { + r.push(`overflowing with juices,`); + } + r.push(`leaving the submissive slave horrified that ${he} found the experience sexually satisfying.`); + } else { + r.push(`By the end of the day ${slave.slaveName}'s abused cunt is`); + + if (rapist.dick > 0) { + r.push(`dripping with cum.`); + } else { + r.push(`overflowing with juices.`); + } + r.push(`This sexual encounter is everything ${he} dreamed of, leaving ${him} utterly satisfied.`); + } + } + r.push(`${rapist.slaveName} is lying next to ${him} on the bed in a state of obvious satiation and bliss.`); + } else if (rapist.energy > 95 && rapist.devotion > 20 && slave.devotion < -20) { + r.push(`${slave.slaveName} is tied and placed on the bed with ${his} pussy defenseless and available, and then you tell the randy ${rapist.slaveName} that it's all ${hers2}. The slave life has so affected rapist.slaveName that ${he2} is quite eager to rape another slave, just for the perverted novelty of the act. ${His} high libido keeps ${him} going for a long time, bringing the helpless toy to one forced orgasm after another. By the end of the day ${slave.slaveName} is lying on the bed, all worn out, ${his} cunt`); + if (rapist.dick > 0) { + r.push(`dripping with cum`); + } else { + r.push(`overflowing with juices`); + } + r.push(`to ${his} horror and resentment, while ${rapist.slaveName} is sleeping next to ${him} in a state of obvious satiation and bliss.`); + } else if (slave.devotion <= 20 || rapist.devotion <= 20) { + r.push(`You order ${slave.slaveName} onto the couch and tell ${rapist.slaveName} to get on with it. They fuck mechanically, gazing with roiling emotions into each others' eyes. They do seem to come to some sort of a non-verbal understanding on the necessity of getting it done, and there is no real unhappiness in either of them when they finish and disentangle themselves. As they clean themselves and exit, you notice rapist.slaveName's looking a little more longingly at ${slave.slaveName}.`); + } else if (slave.devotion <= 50 || rapist.devotion <= 50) { + r.push(`You order ${slave.slaveName} and ${rapist.slaveName} to get on with it. They fuck mechanically at first, gazing with roiling emotions into each others' eyes. Eventually, they begin to enjoy the intimacy of the act, finding the shared pleasure between them comforting. They finish and resume life as slaves, the light of this intimacy diminishing, softening with rapist.slaveName's dick and dripping away with the contents of ${slave.slaveName}'s cum-filled pussy.`); + } else { + r.push(`The two slaves happily and eagerly get down to business. They take their time with foreplay, humping slowly and gazing into each others' eyes, exchanging kisses almost constantly. After a little while, ${slave.slaveName} looks over ${rapist.slaveName}'s shoulder to where you're sitting, the invitation clear in ${his} eyes. As soon as you stand to come over, they roll over without being ordered to`); + if (canDoAnal(slave) && slave.anus > 0) { + r.push(`present ${slave.slaveName}'s butthole.`); + + slave.counter.anal++; + V.analTotal++; + } else { + r.push(`invite you into ${slave.slaveName}'s crowded pussy.`); + + slave.counter.vaginal++; + V.vaginalTotal++; + } + r.push(`You take up the offer and penetrate ${slave.slaveName} with your`); + if (V.PC.dick > 0) { + r.push(`dick.`); + } else { + r.push(`strap-on.`); + } + r.push(`With the added stimulus of penetrating a tight hole alongside ${his2} dear ${getWrittenTitle(rapist)}, ${rapist.slaveName} comes indecently hard, but no where near as hard as the completely overloaded ${slave.slaveName}. All of you collapse into an exhausted, happy pile of flesh.`); + } + + if (canImpreg(slave, rapist)) { + knockMeUp(slave, 25, 0, rapist.ID); + } + + App.Events.addParagraph(el, r); + return el; + } +}; diff --git a/src/npc/interaction/passage/fSlaveSlaveVag.tw b/src/npc/interaction/passage/fSlaveSlaveVag.tw deleted file mode 100644 index 865b92c388159601eb5c225d518335ae0c02680a..0000000000000000000000000000000000000000 --- a/src/npc/interaction/passage/fSlaveSlaveVag.tw +++ /dev/null @@ -1,35 +0,0 @@ -:: FSlaveSlaveVag [nobr] - -<<set $slaverapistx = 0>> -<<set $nextLink = "Slave Interact">> -<<set $nextButton = "Back">> - -<p class="scene-intro"> - Select a slave that will fuck <<= getSlave($AS).slaveName>>. -</p> - -<h2>Select an eligible slave</h2> - - -<<set _eligibles = $slaves.filter((s) => (s.ID != $AS) && isSlaveAvailable(s) && (canPenetrate(s) || s.clit >= 4))>> -<<for _i = 0; _i < _eligibles.length; _i++>> - <div> - <<set _name = SlaveFullName(_eligibles[_i])>> - <<print "[[_name|FSlaveSlaveVag Consummate][$slaverapistx = _eligibles[" + _i + "]]]">> - <<if _eligibles[_i].custom.label>> (@@.yellow;''<<print _eligibles[_i].custom.label>>''@@)<</if>> - <<if (canImpreg(getSlave($AS), _eligibles[_i]))>> - @@.green;Virile@@ - <</if>> - <<if totalRelatives(getSlave($AS)) > 0>> - <<set _relTerm = relativeTerm(getSlave($AS), _eligibles[_i])>> - <<if _relTerm != null>> - @@.lightgreen;<<= capFirstChar(_relTerm)>>@@ - <</if>> - <</if>> /* closes extended family mode */ - </div> -<</for>> -<<if (_eligibles.length === 0)>> - <div class="note"> - You have no slaves capable of this act. - </div> -<</if>> diff --git a/src/npc/interaction/passage/matchmaking.js b/src/npc/interaction/passage/matchmaking.js new file mode 100644 index 0000000000000000000000000000000000000000..c5987fe23718399781cbf7f46da678c8c497035b --- /dev/null +++ b/src/npc/interaction/passage/matchmaking.js @@ -0,0 +1,228 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @returns {HTMLElement} + */ +App.Interact.matchmaking = function(slave) { + const node = document.createElement("div"); + let r = []; + + const { + He, + he, his, him, himself, girl + } = getPronouns(slave); + + const desc = SlaveTitle(slave); + + if (V.seeImages) { + node.append( + App.UI.DOM.makeElement("div", App.Art.SlaveArtElement(slave, 2, 0), ["imageRef", "medImg"]) + ); + } + + r.push(`You order ${slave.slaveName} to come to your office. The`); + if (slave.relationship === -2) { + r.push(`worshipful`); + } else { + r.push(`slutty`); + } + r.push(`${desc} arrives promptly, greets you correctly, and waits`); + if (slave.relationship === -2) { + r.push(`adoringly for a command.`); + } else { + r.push(`eagerly for you to fuck ${him}.`); + } + r.push(`You consider the situation carefully.`); + if (slave.relationship === -2) { + r.push(`${He}'s emotionally bonded to you, and loves you with all ${his} heart. ${He} would probably do anything you command and love you all the more for it. If you were to decide that you were tired of ${his} adoration, you could probably set ${him} up with another similarly broken slave. If you ordered them to love each other like they love you, they'd obey.`); + } else { + r.push(`${He}'s an emotional slut, and worships you and values ${himself} primarily in terms of sex. ${He}'s such a perfect sex slave that ${he}'d probably fuck anyone or anything you told ${him} to, and love you all the more for giving ${him} the chance. If you were to decide that even a sex slave like ${him} needs a little more structure than constant omnisexual lust, you could probably set ${him} up with another universal slut.`); + } + r.push(`Their relationship would probably be somewhat artificial at first, and they'd have to struggle at it, but after a period of adjustment, you'd have two worshipful slaves again, except that they'd be together. It'd definitely help if they had compatible behavioral quirks and sexual fetishes.`); + App.Events.addParagraph(node, r); + r = []; + + const selections = App.UI.DOM.appendNewElement("div", node); + selections.style.float = "inline-end"; + + App.UI.DOM.appendNewElement("h2", selections, `Put ${him} with another worshipful ${(slave.relationship === -2) ? "emotionally bonded slave" : "emotional slut"}`); + selections.append(App.UI.SlaveList.slaveSelectionList( + s => s.devotion >= 100 && s.relationship === slave.relationship && s.ID !== slave.ID, + App.UI.SlaveList.SlaveInteract.stdInteract, + null, + (s) => App.UI.DOM.link("Match them", () => { + // subSlave + s.relationship = 4; + s.relationshipTarget = slave.ID; + s.devotion -= 20; + // slave + slave.relationship = 4; + slave.relationshipTarget = s.ID; + slave.devotion -= 20; + jQuery(node).empty().append(matchedScene()); + }) + )); + + App.Events.addParagraph(node, r); + return node; + + function matchedScene() { + const frag = new DocumentFragment(); + const subSlave = getSlave(slave.relationshipTarget); + const { + he2, his2, him2, girl2 + } = getPronouns(subSlave).appendSuffix("2"); + App.Events.drawEventArt(node, [slave, subSlave]); + + r.push(`You decide to set ${slave.slaveName} up with ${subSlave.slaveName}. Telling the former to wait, you have the latter hurry up to your office. When the`); + if (slave.relationship === -2) { + r.push(`slaves are waiting adoringly`); + } else { + r.push(`sluts are waiting with barely concealed lust`); + } + r.push(`in front of your desk together, you inform them of your decision.`); + if (slave.relationship === -2) { + r.push(`You commend their love for you, and let them know that it's all right for it to continue, but command them to love each other, too. They look doubtful, but at your orders they obediently take each other by the hand, and share a kiss. It will do for now. You assign them to live together as much as possible for a few days, and inform them that you'll be limiting your personal contact with them during this period. They give you identical looks of horror, and fail to notice how much of a perfect couple they already are.`); + } else { + r.push(`You praise their total commitment to sexual slavery, and let them know they'll continue to be sex slaves, but tell them that it's time for them to settle down. They give you identical looks of horror, and fail to notice how much of a perfect couple they already are. Patiently, you explain that their sex lives will remain more or less unchanged; just because two slaves are together doesn't mean they can't and won't have sex with other people. They look doubtful, but cheer up when you inform them that they'll be spending a lot of alone time together for a few days.`); + } + App.Events.addParagraph(node, r); + r = []; + r.push(`Being ordered into a relationship would be difficult for anyone, but they're so obedient that <span class="lightgreen">they do their best and make it work.</span> You ensure that they do, and your determined efforts to do so <span class="mediumorchid">reduce their devotion to you,</span> though it's mostly by redirection towards each other. And in any case, they remain devoted enough, and will likely return to their earlier worshipfulness in a few weeks at most.`); + let _matched = 1; + if (slave.fetish === "submissive" && subSlave.fetish === "dom") { + r.push(`${subSlave.slaveName} is a dom and ${slave.slaveName} is a sub. It's a match out of bad fiction.`); + } else if (subSlave.fetish === "submissive" && slave.fetish === "dom") { + r.push(`${slave.slaveName} is a dom and ${subSlave.slaveName} is a sub. It's a match out of bad fiction.`); + } else if (slave.fetish === "masochist" && subSlave.fetish === "sadist") { + r.push(`${subSlave.slaveName} is a sadist and ${slave.slaveName} is a masochist. They're a perfect ouroboros of agony.`); + } else if (subSlave.fetish === "masochist" && slave.fetish === "sadist") { + r.push(`${slave.slaveName} is a sadist and ${subSlave.slaveName} is a masochist. They're a perfect ouroboros of agony.`); + } else if (slave.fetish === "cumslut" && subSlave.balls > 0) { + r.push(`${subSlave.slaveName} has balls and ${slave.slaveName} has the appetite to drain them of every drop of cum.`); + } else if (subSlave.fetish === "cumslut" && slave.balls > 0) { + r.push(`${slave.slaveName} has balls and ${subSlave.slaveName} has the appetite to drain them of every drop of cum.`); + } else if (slave.fetish === "humiliation" && subSlave.fetish === "sadist") { + r.push(`${slave.slaveName} loves to be humiliated, and ${subSlave.slaveName} can definitely get off on another ${girl}'s shame.`); + } else if (subSlave.fetish === "humiliation" && slave.fetish === "sadist") { + r.push(`${subSlave.slaveName} loves to be humiliated, and ${slave.slaveName} can definitely get off on another ${girl2}'s shame.`); + } else if (slave.fetish === "buttslut" && subSlave.fetish === "dom") { + r.push(`${subSlave.slaveName} likes fucking other girls, so once ${slave.slaveName} asks ${him2} to just do it to ${his} ass all the time, they're both happy.`); + } else if (subSlave.fetish === "buttslut" && slave.fetish === "dom") { + r.push(`${slave.slaveName} likes fucking other girls, so once ${subSlave.slaveName} asks ${him} to just do it to ${his2} ass all the time, they're both happy.`); + } else if (slave.fetish === "boobs" && subSlave.boobs > 4000) { + r.push(`${slave.slaveName} fetishized breasts so much that ${he} thinks ${subSlave.slaveName}'s udders are one of the sexiest things ${he}'s ever seen.`); + } else if (subSlave.fetish === "boobs" && slave.boobs > 4000) { + r.push(`${subSlave.slaveName} fetishized breasts so much that ${he2} thinks ${slave.slaveName}'s udders are one of the sexiest things ${he2}'s ever seen.`); + } else if ((slave.fetish === "pregnancy" && subSlave.fetish === "pregnancy") && subSlave.bellyPreg >= 300000 && slave.bellyPreg >= 300000) { + r.push(`${slave.slaveName} and ${subSlave.slaveName} are both enormously laden with children, much to the other's delight. They can't wait to explore each other's baby filled middle.`); + } else if ((slave.fetish === "pregnancy" && subSlave.fetish === "pregnancy") && subSlave.preg > subSlave.pregData.normalBirth/2 && slave.preg > slave.pregData.normalBirth/2) { + r.push(`${slave.slaveName} and ${subSlave.slaveName} are both heavily pregnant, much to the other's delight.`); + } else if ((subSlave.fetish === "pregnancy") && slave.bellyPreg >= 300000) { + r.push(`${subSlave.slaveName} fetishizes pregnant bellies so much that ${he2} is awestruck by ${slave.slaveName}'s enormous, baby filled middle.`); + } else if ((slave.fetish === "pregnancy") && subSlave.bellyPreg >= 300000) { + r.push(`${slave.slaveName} fetishizes pregnant bellies so much that ${he} is awestruck by ${subSlave.slaveName}'s enormous, baby filled middle.`); + } else if ((subSlave.fetish === "pregnancy") && slave.preg > slave.pregData.normalBirth/2) { + r.push(`${subSlave.slaveName} fetishizes pregnant bellies so much that ${he2} thinks ${slave.slaveName} gravid middle is one of the sexiest things ${he2}'s ever seen.`); + } else if ((slave.fetish === "pregnancy") && subSlave.preg > subSlave.pregData.normalBirth/2) { + r.push(`${slave.slaveName} fetishizes pregnant bellies so much that ${he} thinks ${subSlave.slaveName}'s gravid middle is one of the sexiest things ${he}'s ever seen.`); + } else if ((slave.fetish === "pregnancy" && subSlave.fetish === "pregnancy") && subSlave.bellyPreg >= 100 && slave.bellyPreg >= 100) { + r.push(`${slave.slaveName} and ${subSlave.slaveName} are both pregnant and just beginning to show. They'll both be able to enjoy the other's swelling body.`); + } else if (slave.fetish === "pregnancy" && canAchieveErection(subSlave)) { + r.push(`${slave.slaveName} can indulge the fantasy that ${he}'s getting pregnant each and every time ${subSlave.slaveName} cums inside ${him}.`); + } else if (subSlave.fetish === "pregnancy" && canAchieveErection(slave)) { + r.push(`${subSlave.slaveName} can indulge the fantasy that ${he2}'s getting pregnant each and every time ${slave.slaveName} cums inside ${him2}.`); + } else { + _matched = 0; + } + if (_matched === 1) { + r.push(`Their sexual compatibility is excellent, and they <span class="mediumaquamarine">trust you more</span> for matching them so perfectly.`); + slave.trust += 10; + subSlave.trust += 10; + } else if (slave.fetish === subSlave.fetish) { + r.push(`They're a couple of`); + switch (slave.fetish) { + case "submissive": + r.push(`cringing submissives,`); + break; + case "cumslut": + r.push(`hungry oral fiends,`); + break; + case "humiliation": + r.push(`public sex aficionados,`); + break; + case "buttslut": + r.push(`shameless anal whores,`); + break; + case "boobs": + r.push(`breast obsessives,`); + break; + case "pregnancy": + r.push(`breeding bitches,`); + break; + case "dom": + r.push(`dominating spirits,`); + break; + case "sadist": + r.push(`inveterate sadists,`); + break; + case "masochist": + r.push(`pain sluts,`); + break; + default: + r.push(`vanilla girls,`); + } + r.push(`and they bond over their shared sexual tastes, easing their acclimation to having another slave play a major role in their sex lives. They're almost as happy sharing stories about their past sexual exploits as they are actually having sex.`); + } else { + r.push(`Their fetishes aren't very compatible, and though as a couple of inventive nymphos they do their absolute best to fuck each other senseless, they <span class="gold">trust you a less</span> out of doubt in the sexual match.`); + slave.trust -= 10; + subSlave.trust -= 10; + } + if (slave.behavioralQuirk === subSlave.behavioralQuirk && slave.behavioralQuirk !== "none") { + r.push(`They're both`); + switch (slave.behavioralQuirk) { + case "confident": + r.push(`confident, and soon come to an understanding that they'll be able to`); + if (slave.relationship === -2) { + r.push(`serve you better together.`); + } else { + r.push(`fuck third parties better as a pair.`); + } + break; + case "cutting": + r.push(`witty, and each quickly discovers that their new partner can hold up their end of a battle of quips. Their loving snippiness develops rapidly, and it's pretty cute.`); + break; + case "funny": + r.push(`a little weird. It takes a while for them to adjust to how funny their new partner is, but they learn to support each other soon enough.`); + break; + case "adores women": + r.push(`pretty crazy about ladies. They're both slave girls themselves, which helps, and they've also got a never-ending parade of female bodies to discuss together.`); + break; + case "adores men": + r.push(`guy crazy. They discuss nothing else together, and their discussions frequently turn into makeouts and then mutual masturbation.`); + break; + case "fitness": + r.push(`fitness fanatics, and being together feels natural for them, since they've already worked out together often enough.`); + break; + case "insecure": + r.push(`very insecure. Perhaps unsurprisingly, they soon grow to depend on each other, each relying on their partner to support their low self-esteem.`); + break; + case "sinful": + if (V.arcologies[0].FSChattelReligionist === "unset") { + r.push(`eagerly sinful, and they grow close by opening up and sharing their fraught histories of faith with each other.`); + } else { + r.push(`fanatical about being slave acolytes of the new faith, and their partnership is strengthened by their belief that it's divinely ordained.`); + } + break; + case "advocate": + r.push(`advocates for slavery. Not only do they share this, but they believe that your orders are good for them, including your order that they be together.`); + } + } else { + r.push(`They approach life as slaves differently, and it's <span class="gold">tough for them to reconcile their differences over their values.</span>`); + slave.trust -= 10; + subSlave.trust -= 10; + } + + return frag; + } +}; diff --git a/src/npc/interaction/passage/matchmaking.tw b/src/npc/interaction/passage/matchmaking.tw deleted file mode 100644 index b433eac905aa57a756e60b559b3b34413e0b3422..0000000000000000000000000000000000000000 --- a/src/npc/interaction/passage/matchmaking.tw +++ /dev/null @@ -1,194 +0,0 @@ -:: Matchmaking [nobr] - -<<if lastVisited("Child Interact") === 1>> - <<set $nextLink = "Incubator">> -<<else>> - <<set $nextLink = "Slave Interact">> -<</if>> -<<set $nextButton = "Continue">> - -<<if $subSlave == 0>> - -<<set $desc = SlaveTitle(getSlave($AS))>> -<<set _belly = bellyAdjective(getSlave($AS))>> -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<setPlayerPronouns>> -<<setAssistantPronouns>> - -/* 000-250-006 */ -<<if $seeImages == 1>> - <div class="imageRef medImg"> - <<SlaveArt getSlave($AS) 2 0>> - </div> -<</if>> -/* 000-250-006 */ - -You order <<= getSlave($AS).slaveName>> to come to your office. The <<if getSlave($AS).relationship == -2>>worshipful<<else>>slutty<</if>> $desc arrives promptly, greets you correctly, and waits <<if getSlave($AS).relationship == -2>>adoringly for a command<<else>>eagerly for you to fuck $him<</if>>. You consider the situation carefully. -<<if getSlave($AS).relationship == -2>> - $He's emotionally bonded to you, and loves you with all $his heart. $He would probably do anything you command and love you all the more for it. If you were to decide that you were tired of $his adoration, you could probably set $him up with another similarly broken slave. If you ordered them to love each other like they love you, they'd obey. -<<else>> - $He's an emotional slut, and worships you and values $himself primarily in terms of sex. $He's such a perfect sex slave that $he'd probably fuck anyone or anything you told $him to, and love you all the more for giving $him the chance. If you were to decide that even a sex slave like $him needs a little more structure than constant omnisexual lust, you could probably set $him up with another universal slut. -<</if>> -Their relationship would probably be somewhat artificial at first, and they'd have to struggle at it, but after a period of adjustment, you'd have two worshipful slaves again, except that they'd be together. It'd definitely help if they had compatible behavioral quirks and sexual fetishes. -<br><br> - -<span id="result"> - -<<if $seeImages == 1>><br style="clear:both"><</if>> - -<br><br>__Put $him with another worshipful <<if getSlave($AS).relationship == -2>>emotionally bonded slave<<else>>emotional slut<</if>>:__ -<<includeDOM App.UI.SlaveList.slaveSelectionList( - s => s.devotion >= 100 && s.relationship === getSlave($AS).relationship && s.ID !== $AS, - App.UI.SlaveList.SlaveInteract.stdInteract, - null, - (s) => App.UI.DOM.passageLink('Match them', 'Matchmaking', () => { variables().subSlave = s; }) -)>> -</span> - -<<else>> - -/* 000-250-006 */ -<<if $seeImages == 1>> - <div class="imageColumn"> - <div class="imageRef medImg"> - <<SlaveArt getSlave($AS) 2 0>> - </div> - <div class="imageRef medImg"> - <<SlaveArt $subSlave 2 0>> - </div> - </div> -<</if>> -/* 000-250-006 */ - -<<setLocalPronouns $subSlave 2>> - -You decide to set <<= getSlave($AS).slaveName>> up with $subSlave.slaveName. Telling the former to wait, you have the latter hurry up to your office. When the <<if getSlave($AS).relationship == -2>>slaves are waiting adoringly<<else>>sluts are waiting with barely concealed lust<</if>> in front of your desk together, you inform them of your decision. -<<if getSlave($AS).relationship == -2>> - You commend their love for you, and let them know that it's all right for it to continue, but command them to love each other, too. They look doubtful, but at your orders they obediently take each other by the hand, and share a kiss. It will do for now. You assign them to live together as much as possible for a few days, and inform them that you'll be limiting your personal contact with them during this period. They give you identical looks of horror, and fail to notice how much of a perfect couple they already are. -<<else>> - You praise their total commitment to sexual slavery, and let them know they'll continue to be sex slaves, but tell them that it's time for them to settle down. They give you identical looks of horror, and fail to notice how much of a perfect couple they already are. Patiently, you explain that their sex lives will remain more or less unchanged; just because two slaves are together doesn't mean they can't and won't have sex with other people. They look doubtful, but cheer up when you inform them that they'll be spending a lot of alone time together for a few days. -<</if>> -<br><br> -Being ordered into a relationship would be difficult for anyone, but they're so obedient that @@.lightgreen;they do their best and make it work.@@ You ensure that they do, and your determined efforts to do so @@.mediumorchid;reduce their devotion to you,@@ though it's mostly by redirection towards each other. And in any case, they remain devoted enough, and will likely return to their earlier worshipfulness in a few weeks at most. -<<set _matched = 1>> -<<if (getSlave($AS).fetish == "submissive") && ($subSlave.fetish == "dom")>> - $subSlave.slaveName is a dom and <<= getSlave($AS).slaveName>> is a sub. It's a match out of bad fiction. -<<elseif ($subSlave.fetish == "submissive") && (getSlave($AS).fetish == "dom")>> - <<= getSlave($AS).slaveName>> is a dom and $subSlave.slaveName is a sub. It's a match out of bad fiction. -<<elseif (getSlave($AS).fetish == "masochist") && ($subSlave.fetish == "sadist")>> - $subSlave.slaveName is a sadist and <<= getSlave($AS).slaveName>> is a masochist. They're a perfect ouroboros of agony. -<<elseif ($subSlave.fetish == "masochist") && (getSlave($AS).fetish == "sadist")>> - <<= getSlave($AS).slaveName>> is a sadist and $subSlave.slaveName is a masochist. They're a perfect ouroboros of agony. -<<elseif (getSlave($AS).fetish == "cumslut") && ($subSlave.balls > 0)>> - $subSlave.slaveName has balls and <<= getSlave($AS).slaveName>> has the appetite to drain them of every drop of cum. -<<elseif ($subSlave.fetish == "cumslut") && (getSlave($AS).balls > 0)>> - <<= getSlave($AS).slaveName>> has balls and $subSlave.slaveName has the appetite to drain them of every drop of cum. -<<elseif (getSlave($AS).fetish == "humiliation") && ($subSlave.fetish == "sadist")>> - <<= getSlave($AS).slaveName>> loves to be humiliated, and $subSlave.slaveName can definitely get off on another $girl's shame. -<<elseif ($subSlave.fetish == "humiliation") && (getSlave($AS).fetish == "sadist")>> - $subSlave.slaveName loves to be humiliated, and <<= getSlave($AS).slaveName>> can definitely get off on another _girl2's shame. -<<elseif (getSlave($AS).fetish == "buttslut") && ($subSlave.fetish == "dom")>> - $subSlave.slaveName likes fucking other girls, so once <<= getSlave($AS).slaveName>> asks _him2 to just do it to $his ass all the time, they're both happy. -<<elseif ($subSlave.fetish == "buttslut") && (getSlave($AS).fetish == "dom")>> - <<= getSlave($AS).slaveName>> likes fucking other girls, so once $subSlave.slaveName asks $him to just do it to _his2 ass all the time, they're both happy. -<<elseif (getSlave($AS).fetish == "boobs") && ($subSlave.boobs > 4000)>> - <<= getSlave($AS).slaveName>> fetishized breasts so much that $he thinks $subSlave.slaveName's udders are one of the sexiest things $he's ever seen. -<<elseif ($subSlave.fetish == "boobs") && (getSlave($AS).boobs > 4000)>> - $subSlave.slaveName fetishized breasts so much that _he2 thinks <<= getSlave($AS).slaveName>>'s udders are one of the sexiest things _he2's ever seen. -<<elseif (getSlave($AS).fetish == "pregnancy") && ($subSlave.fetish == "pregnancy") && $subSlave.bellyPreg >= 300000 && getSlave($AS).bellyPreg >= 300000>> - <<= getSlave($AS).slaveName>> and $subSlave.slaveName are both enormously laden with children, much to the other's delight. They can't wait to explore each other's baby filled middle. -<<elseif (getSlave($AS).fetish == "pregnancy") && ($subSlave.fetish == "pregnancy") && $subSlave.preg > $subSlave.pregData.normalBirth/2 && getSlave($AS).preg > getSlave($AS).pregData.normalBirth/2>> - <<= getSlave($AS).slaveName>> and $subSlave.slaveName are both heavily pregnant, much to the other's delight. -<<elseif ($subSlave.fetish == "pregnancy") && getSlave($AS).bellyPreg >= 300000>> - $subSlave.slaveName fetishizes pregnant bellies so much that _he2 is awestruck by <<= getSlave($AS).slaveName>>'s enormous, baby filled middle. -<<elseif (getSlave($AS).fetish == "pregnancy") && $subSlave.bellyPreg >= 300000>> - <<= getSlave($AS).slaveName>> fetishizes pregnant bellies so much that $he is awestruck by $subSlave.slaveName's enormous, baby filled middle. -<<elseif ($subSlave.fetish == "pregnancy") && getSlave($AS).preg > getSlave($AS).pregData.normalBirth/2>> - $subSlave.slaveName fetishizes pregnant bellies so much that _he2 thinks <<= getSlave($AS).slaveName>> gravid middle is one of the sexiest things _he2's ever seen. -<<elseif (getSlave($AS).fetish == "pregnancy") && $subSlave.preg > $subSlave.pregData.normalBirth/2>> - <<= getSlave($AS).slaveName>> fetishizes pregnant bellies so much that $he thinks $subSlave.slaveName's gravid middle is one of the sexiest things $he's ever seen. -<<elseif (getSlave($AS).fetish == "pregnancy") && ($subSlave.fetish == "pregnancy") && $subSlave.bellyPreg >= 100 && getSlave($AS).bellyPreg >= 100>> - <<= getSlave($AS).slaveName>> and $subSlave.slaveName are both pregnant and just beginning to show. They'll both be able to enjoy the other's swelling body. -<<elseif (getSlave($AS).fetish == "pregnancy") && canAchieveErection($subSlave)>> - <<= getSlave($AS).slaveName>> can indulge the fantasy that $he's getting pregnant each and every time $subSlave.slaveName cums inside $him. -<<elseif ($subSlave.fetish == "pregnancy") && canAchieveErection(getSlave($AS))>> - $subSlave.slaveName can indulge the fantasy that _he2's getting pregnant each and every time <<= getSlave($AS).slaveName>> cums inside _him2. -<<else>> - <<set _matched = 0>> -<</if>> -<<if _matched == 1>> - Their sexual compatibility is excellent, and they @@.mediumaquamarine;trust you more@@ for matching them so perfectly. - <<set getSlave($AS).trust += 10>> - <<set $subSlave.trust += 10>> -<<elseif getSlave($AS).fetish == $subSlave.fetish>> - They're a couple of - <<switch getSlave($AS).fetish>> - <<case "submissive">> - cringing submissives, - <<case "cumslut">> - hungry oral fiends, - <<case "humiliation">> - public sex aficionados, - <<case "buttslut">> - shameless anal whores, - <<case "boobs">> - breast obsessives, - <<case "pregnancy">> - breeding bitches, - <<case "dom">> - dominating spirits, - <<case "sadist">> - inveterate sadists, - <<case "masochist">> - pain sluts, - <<default>> - vanilla girls, - <</switch>> - and they bond over their shared sexual tastes, easing their acclimation to having another slave play a major role in their sex lives. They're almost as happy sharing stories about their past sexual exploits as they are actually having sex. -<<else>> - Their fetishes aren't very compatible, and though as a couple of inventive nymphos they do their absolute best to fuck each other senseless, they @@.gold;trust you a less@@ out of doubt in the sexual match. - <<set getSlave($AS).trust -= 10>> - <<set $subSlave.trust -= 10>> -<</if>> -<<if getSlave($AS).behavioralQuirk == $subSlave.behavioralQuirk && getSlave($AS).behavioralQuirk != "none">> - They're both - <<switch getSlave($AS).behavioralQuirk>> - <<case "confident">> - confident, and soon come to an understanding that they'll be able to <<if getSlave($AS).relationship == -2>>serve you better together<<else>>fuck third parties better as a pair<</if>>. - <<case "cutting">> - witty, and each quickly discovers that their new partner can hold up their end of a battle of quips. Their loving snippiness develops rapidly, and it's pretty cute. - <<case "funny">> - a little weird. It takes a while for them to adjust to how funny their new partner is, but they learn to support each other soon enough. - <<case "adores women">> - pretty crazy about ladies. They're both slave girls themselves, which helps, and they've also got a never-ending parade of female bodies to discuss together. - <<case "adores men">> - guy crazy. They discuss nothing else together, and their discussions frequently turn into makeouts and then mutual masturbation. - <<case "fitness">> - fitness fanatics, and being together feels natural for them, since they've already worked out together often enough. - <<case "insecure">> - very insecure. Perhaps unsurprisingly, they soon grow to depend on each other, each relying on their partner to support their low self-esteem. - <<case "sinful">> - <<if $arcologies[0].FSChattelReligionist == "unset">> - eagerly sinful, and they grow close by opening up and sharing their fraught histories of faith with each other. - <<else>> - fanatical about being slave acolytes of the new faith, and their partnership is strengthened by their belief that it's divinely ordained. - <</if>> - <<case "advocate">> - advocates for slavery. Not only do they share this, but they believe that your orders are good for them, including your order that they be together. - <</switch>> -<<else>> - They approach life as slaves differently, and it's @@.gold;tough for them to reconcile their differences over their values.@@ - <<set getSlave($AS).trust -= 10>> - <<set $subSlave.trust -= 10>> -<</if>> - -<<set $subSlave.relationship = 4>> -<<set $subSlave.relationshipTarget = $AS>> -<<set $subSlave.devotion -= 20>> -<<set getSlave($AS).relationship = 4>> -<<set getSlave($AS).relationshipTarget = $subSlave.ID>> -<<set getSlave($AS).devotion -= 20>> - -<<set $slaves[$slaveIndices[$subSlave.ID]] = $subSlave>> - -<</if>> diff --git a/src/npc/interaction/slaveOnSlaveFeeding/fSlaveFeed.js b/src/npc/interaction/slaveOnSlaveFeeding/fSlaveFeed.js index cc21d66eb5c79b5a6f22b1a4b5d59261caeb3672..438e92cb011553f36fa1651302348569d72e2392 100644 --- a/src/npc/interaction/slaveOnSlaveFeeding/fSlaveFeed.js +++ b/src/npc/interaction/slaveOnSlaveFeeding/fSlaveFeed.js @@ -297,7 +297,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) { r = []; if (slave.preg > slave.pregData.normalBirth / 13.33 && slave.pregKnown === 0 && slave.inflation > 1) { - r.push(`It becomes abundantly clear that something is wrong with ${slave.slaveName} as ${he} struggles to down ${his} milky meal. Before ${his} health can be affected further, you pull ${him} into a medical exam. While most of the tests come back normal, one in particular catches your eye; <span class="lime">${he} is pregnant${(slave.preg > slave.pregData.normalBirth / 4) ? `, and surprisingly far along` : ``}.</span> ${he} should be able to still handle at least two liters of milk, however.`); + r.push(`It becomes abundantly clear that something is wrong with ${slave.slaveName} as ${he} struggles to down ${his} milky meal. Before ${his} health can be affected further, you pull ${him} into a medical exam. While most of the tests come back normal, one in particular catches your eye; <span class="lime">${he} is pregnant${(slave.preg > slave.pregData.normalBirth / 4) ? `, and surprisingly far along` : ``}.</span> ${He} should be able to still handle at least two liters of milk, however.`); deflate(slave); slave.pregKnown = 1; _pregDiscovery = 1; @@ -1298,7 +1298,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) { r = []; if (slave.preg > 3 && slave.pregKnown === 0 && slave.inflation > 1) { - r.push(`It becomes abundantly clear that something is wrong with ${slave.slaveName} as ${he} struggles to down ${his} thick meal. Before ${his} health can be affected further, you pull ${him} into a medical exam. While most of the tests come back normal, one in particular catches your eye; <span class="lime">${he} is pregnant${(slave.preg > 10) ? `and surprisingly far along` : ``}.</span> ${he} should be able to still handle at least two liters of cum, however.`); + r.push(`It becomes abundantly clear that something is wrong with ${slave.slaveName} as ${he} struggles to down ${his} thick meal. Before ${his} health can be affected further, you pull ${him} into a medical exam. While most of the tests come back normal, one in particular catches your eye; <span class="lime">${he} is pregnant${(slave.preg > 10) ? `and surprisingly far along` : ``}.</span> ${He} should be able to still handle at least two liters of cum, however.`); deflate(slave); slave.pregKnown = 1; _pregDiscovery = 1; @@ -2025,7 +2025,7 @@ globalThis.FSlaveFeed = function(slave, milkTap) { } else { r.push(`${His} belly is so taut it barely wobbles at all as ${he} is helped from your office.`); } - r.push(`Being filled so full <span class="health.dec">surely had negative effects</span> on ${his} health.`); + r.push(`Being filled so full <span class="health dec">surely had negative effects</span> on ${his} health.`); healthDamage(slave, 1); } else if (slave.inflation === 2) { if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) { diff --git a/src/npc/interaction/slaveOnSlaveFeeding/slaveOnSlaveFeeding.js b/src/npc/interaction/slaveOnSlaveFeeding/slaveOnSlaveFeeding.js index 68742813facba6e3b517c7c4e036f8b0c0daed1a..02cd8967781ebd86622167dcdd4b350768dc806b 100644 --- a/src/npc/interaction/slaveOnSlaveFeeding/slaveOnSlaveFeeding.js +++ b/src/npc/interaction/slaveOnSlaveFeeding/slaveOnSlaveFeeding.js @@ -128,7 +128,7 @@ App.UI.SlaveInteract.slaveOnSlaveFeedingSelection = function(slave) { break; } } - if (tapSlave.rivalryTarget === V.AS) { + if (tapSlave.rivalryTarget === slave.ID) { switch (tapSlave.relationship) { case 1: el.append(`dislikes`); diff --git a/src/npc/startingGirls/editFamily.js b/src/npc/startingGirls/editFamily.js index 540c4185d1492899a4828a7ad900dd42dc1beead..607ac97d97509ea7ba58cf42f61127a72fb1735e 100644 --- a/src/npc/startingGirls/editFamily.js +++ b/src/npc/startingGirls/editFamily.js @@ -8,10 +8,6 @@ App.Intro.editFamily = function(slave, cheat) { const allowPCFamily = (V.freshPC === 1 || V.saveImported === 0); const {His, his} = getPronouns(slave); - // Checks to make sure a slave is not the active slave's parent. - const isNotMom = (s) => ((s.mother !== slave.mother) || (slave.mother === 0)); - const isNotDad = (s) => ((s.father !== slave.father) || (slave.father === 0)); - const editFamily = makeElWithID("edit-family"); editFamily.append(makeFamilyTable()); const familyTree = App.UI.DOM.makeElement("div", App.StartingGirls.uncommittedFamilyTree(slave)); @@ -20,6 +16,26 @@ App.Intro.editFamily = function(slave, cheat) { return el; + /** Can 'mother' be the mother of 'daughter'? + * @param {FC.HumanState} daughter + * @param {FC.HumanState} mother + */ + function canBecomeMotherOf(daughter, mother) { + return (mother.vagina > 0 || mother.mpreg === 1) // could give birth + && (daughter.mother !== mother.ID) // not already mother + && (mother.actualAge - daughter.actualAge >= mother.pubertyAgeXX); // old enough + } + + /** Can 'father' be the father of 'daughter'? + * @param {FC.HumanState} daughter + * @param {FC.HumanState} father + */ + function canBecomeFatherOf(daughter, father) { + return (father.dick > 0) // could knock someone up + && (daughter.father !== father.ID) // not already father + && (father.actualAge - daughter.actualAge >= father.pubertyAgeXY); // old enough + } + function makeFamilyTable() { const familyTable = makeElWithID("family-table"); if (cheat) { @@ -193,7 +209,7 @@ App.Intro.editFamily = function(slave, cheat) { ) ); - if (V.PC.vagina > 0 && isNotMom(V.PC) && ((V.PC.actualAge - slave.actualAge) >= V.fertilityAge) && allowPCFamily) { + if (canBecomeMotherOf(slave, V.PC) && allowPCFamily) { linkArray.push( App.UI.DOM.link( "You", @@ -206,7 +222,7 @@ App.Intro.editFamily = function(slave, cheat) { } for (const potentialRel of V.slaves) { - if (potentialRel.vagina > 0 && isNotMom(potentialRel) && ((potentialRel.actualAge - slave.actualAge) >= potentialRel.pubertyAgeXX) && potentialRel.newGamePlus === 0) { + if (canBecomeMotherOf(slave, potentialRel) && potentialRel.newGamePlus === 0) { linkArray.push( App.UI.DOM.link( potentialRel.slaveName, @@ -241,7 +257,7 @@ App.Intro.editFamily = function(slave, cheat) { ) ); - if (V.PC.dick > 0 && isNotDad(V.PC) && ((V.PC.actualAge - slave.actualAge) >= V.potencyAge) && allowPCFamily) { + if (canBecomeFatherOf(slave, V.PC) && allowPCFamily) { linkArray.push( App.UI.DOM.link( "You", @@ -254,7 +270,7 @@ App.Intro.editFamily = function(slave, cheat) { } for (const potentialRel of V.slaves) { - if (potentialRel.dick > 0 && isNotDad(potentialRel) && ((potentialRel.actualAge - slave.actualAge) >= potentialRel.pubertyAgeXY) && potentialRel.newGamePlus === 0) { + if (canBecomeFatherOf(slave, potentialRel) && potentialRel.newGamePlus === 0) { linkArray.push( App.UI.DOM.link( potentialRel.slaveName, @@ -295,7 +311,8 @@ App.Intro.editFamily = function(slave, cheat) { ) ); - if ((slave.mother !== V.PC.ID) && (V.PC.mother !== slave.ID) && allowPCFamily) { + const mother = slave.mother === -1 ? V.PC : getSlave(slave.mother); + if ((!mother || canBecomeMotherOf(V.PC, mother)) && allowPCFamily) { linkArray.push( App.UI.DOM.link( "You", @@ -308,7 +325,7 @@ App.Intro.editFamily = function(slave, cheat) { } for (const potentialRel of V.slaves) { - if ((slave.mother !== potentialRel.ID) && (potentialRel.mother !== slave.ID) && potentialRel.newGamePlus === 0) { + if ((!mother || canBecomeMotherOf(potentialRel, mother)) && potentialRel.newGamePlus === 0) { linkArray.push( App.UI.DOM.link( potentialRel.slaveName, @@ -363,7 +380,8 @@ App.Intro.editFamily = function(slave, cheat) { ) ); - if ((slave.father !== V.PC.ID) && (V.PC.father !== slave.ID) && allowPCFamily) { + const father = slave.father === -1 ? V.PC : getSlave(slave.father); + if ((!father || canBecomeFatherOf(V.PC, father)) && allowPCFamily) { linkArray.push( App.UI.DOM.link( "You", @@ -376,7 +394,7 @@ App.Intro.editFamily = function(slave, cheat) { } for (const potentialRel of V.slaves) { - if ((slave.father !== potentialRel.ID) && (potentialRel.father !== slave.ID) && potentialRel.newGamePlus === 0) { + if ((!father || canBecomeFatherOf(potentialRel, father)) && potentialRel.newGamePlus === 0) { linkArray.push( App.UI.DOM.link( potentialRel.slaveName, @@ -431,32 +449,30 @@ App.Intro.editFamily = function(slave, cheat) { ) ); - if (slave.vagina >= 0) { - if (isNotMom(V.PC) && (slave.actualAge - V.PC.actualAge) >= V.fertilityAge && allowPCFamily) { + if (canBecomeMotherOf(V.PC, slave) && allowPCFamily) { + linkArray.push( + App.UI.DOM.link( + "You", + () => { + setRel(V.PC); + refresh(); + } + ) + ); + } + + for (const potentialRel of V.slaves) { + if (canBecomeMotherOf(potentialRel, slave) && potentialRel.newGamePlus === 0) { linkArray.push( App.UI.DOM.link( - "You", + potentialRel.slaveName, () => { - setRel(V.PC); + setRel(potentialRel); refresh(); } ) ); } - - for (const potentialRel of V.slaves) { - if (isNotMom(potentialRel) && ((potentialRel.actualAge - slave.actualAge) >= potentialRel.pubertyAgeXX) && potentialRel.newGamePlus === 0) { - linkArray.push( - App.UI.DOM.link( - potentialRel.slaveName, - () => { - setRel(potentialRel); - refresh(); - } - ) - ); - } - } } jQuery(change).empty().append(App.UI.DOM.makeElement("div", App.UI.DOM.generateLinksStrip(linkArray))); @@ -506,32 +522,30 @@ App.Intro.editFamily = function(slave, cheat) { ) ); - if (slave.dick > 0) { - if (isNotDad(V.PC) && (slave.actualAge - V.PC.actualAge) >= V.potencyAge && allowPCFamily) { + if (canBecomeFatherOf(V.PC, slave) && allowPCFamily) { + linkArray.push( + App.UI.DOM.link( + "You", + () => { + V.PC.father = slave.ID; + refresh(); + } + ) + ); + } + + for (const potentialRel of V.slaves) { + if (canBecomeFatherOf(potentialRel, slave) && potentialRel.newGamePlus === 0) { linkArray.push( App.UI.DOM.link( - "You", + potentialRel.slaveName, () => { - V.PC.father = slave.ID; + potentialRel.father = slave.ID; refresh(); } ) ); } - - for (const potentialRel of V.slaves) { - if (isNotDad(potentialRel) && ((potentialRel.actualAge - slave.actualAge) >= potentialRel.pubertyAgeXX) && potentialRel.newGamePlus === 0) { - linkArray.push( - App.UI.DOM.link( - potentialRel.slaveName, - () => { - potentialRel.father = slave.ID; - refresh(); - } - ) - ); - } - } } jQuery(change).empty().append(App.UI.DOM.makeElement("div", App.UI.DOM.generateLinksStrip(linkArray))); diff --git a/src/npc/startingGirls/startingGirls.js b/src/npc/startingGirls/startingGirls.js index 15365d52a9491ebd7ca0c9f5fe418eb623b70515..462ed7dcdc89dad4876057982dc2230c61d0662e 100644 --- a/src/npc/startingGirls/startingGirls.js +++ b/src/npc/startingGirls/startingGirls.js @@ -780,7 +780,7 @@ App.StartingGirls.physical = function(slave, cheat = false) { () => { slave[limb][side] = null; }, - passage() + "" ); if (cheat && slave.PLimb) { option.addValueList([ @@ -799,7 +799,7 @@ App.StartingGirls.physical = function(slave, cheat = false) { () => { slave[limb][side] = new App.Entity.LimbState(); }, - passage() + "" ); } } @@ -901,7 +901,7 @@ App.StartingGirls.upper = function(slave, cheat = false) { ]); option.addValue("Cybernetic", 3, () => eyeSurgery(slave, side, "cybernetic")); if (V.seeExtreme === 1) { - option.customButton("Remove eye", () => eyeSurgery(slave, side, "remove"), passage()); + option.customButton("Remove eye", () => eyeSurgery(slave, side, "remove"), ""); } } option = options.addOption(`${capFirstChar(side)} pupil shape`, "pupil", slave.eye[side]) @@ -1037,12 +1037,12 @@ App.StartingGirls.upper = function(slave, cheat = false) { options.addOption("Breast implant type", "boobsImplantType", slave) .addValueList([ - ["None", "none"], - ["Normal", "normal"], - ["String", "string"], - ["Fillable", "fillable"], - ["Advanced Fillable", "advanced fillable"], - ["Hyper Fillable", "hyper fillable"], + ["None", "none", () => slave.boobsImplant = 0], + ["Normal", "normal", () => slave.boobsImplant = slave.boobsImplant || 200], + ["String", "string", () => slave.boobsImplant = slave.boobsImplant || 200], + ["Fillable", "fillable", () => slave.boobsImplant = slave.boobsImplant || 200], + ["Advanced Fillable", "advanced fillable", () => slave.boobsImplant = slave.boobsImplant || 200], + ["Hyper Fillable", "hyper fillable", () => slave.boobsImplant = slave.boobsImplant || 200], ]); if (slave.boobsImplantType !== "none") { @@ -2000,7 +2000,7 @@ App.StartingGirls.stats = function(slave) { ["PCKnockedUp", "Times knocked up PC"], ["bestiality", "Bestiality"] ]); - options.addOption("Set all counters to 0", "counter", slave).customButton("Reset", () => slave.counter = new App.Entity.SlaveActionsCountersState(), passage()); + options.addOption("Set all counters to 0", "counter", slave).customButton("Reset", () => slave.counter = new App.Entity.SlaveActionsCountersState(), ""); for (const key of counters) { const title = titles.get(key) || capFirstChar(key); options.addOption(title, key, slave.counter) diff --git a/src/npc/surgery/bodySwap/bodySwapReaction.js b/src/npc/surgery/bodySwap/bodySwapReaction.js index 78065ab1127ef8fc957fb6a30652a46d824e9037..f411019a59b278667a2d57236a31bb8dfa4b1bb9 100644 --- a/src/npc/surgery/bodySwap/bodySwapReaction.js +++ b/src/npc/surgery/bodySwap/bodySwapReaction.js @@ -20,9 +20,9 @@ globalThis.bodySwapReaction = function(body, soul) { let end = 0; if (body.health.health >= soul.health.health + 10) { - r.push(`The monitors indicate that ${his} <span class="health.inc">health has improved</span> from ${his} previous body. Whatever else happens, ${he} will likely appreciate this.`); + r.push(`The monitors indicate that ${his} <span class="health inc">health has improved</span> from ${his} previous body. Whatever else happens, ${he} will likely appreciate this.`); } else if (body.health.health <= soul.health.health - 10) { - r.push(`The monitors indicate that ${his} <span class="health.dec">health has degraded</span> from ${his} previous body. Whatever else happens, this will likely upset ${him}.`); + r.push(`The monitors indicate that ${his} <span class="health dec">health has degraded</span> from ${his} previous body. Whatever else happens, this will likely upset ${him}.`); } r.push(`Now you only have to wait for ${him} to wake up.`); diff --git a/src/npc/surgery/organFarm.js b/src/npc/surgery/organFarm.js index 02d5d02b20d82013add13144b3acf204a32c9bf6..62f45cc5a5caf97643a2d1517507444db111234f 100644 --- a/src/npc/surgery/organFarm.js +++ b/src/npc/surgery/organFarm.js @@ -148,10 +148,9 @@ App.Medicine.OrganFarm.implantActions = function(slave) { [], "Surgery Degradation" ); - const tooltip = action.tooltip === "" ? "" : `${capFirstChar(action.tooltip)}.`; - if (tooltip !== "") { - link.title = tooltip; - link.classList.add("hasTooltip"); + if (action.tooltip !== "") { + link.classList.add("has-tooltip"); + tippy(link, {content: `${capFirstChar(action.tooltip)}.`}); } links.push(link); if (!F.Organs.get(organ.type).displayMultipleActions) { @@ -160,11 +159,7 @@ App.Medicine.OrganFarm.implantActions = function(slave) { } else { const error = action.implantError(slave); if (error !== "") { - const disabledLink = document.createElement("span"); - disabledLink.append(action.name); - disabledLink.title = (error); - disabledLink.classList.add("hasTooltip"); - links.push(disabledLink); + links.push(App.UI.DOM.spanWithTooltip(action.name, error)); } } } diff --git a/src/npc/surgery/surgeryDegradation.js b/src/npc/surgery/surgeryDegradation.js index 9128cc8d74353f7a0fbd7053cf2324104434e449..e6c0bd91bb2dba359403a207a08fcc33e1b4ffbd 100644 --- a/src/npc/surgery/surgeryDegradation.js +++ b/src/npc/surgery/surgeryDegradation.js @@ -49,11 +49,11 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { const slaveDevotion = slave.devotion; if (slave.health.condition < random(-100, -80) && !["body hair removal", "braces", "chem castrate", "eyebrow removal", "hair removal", "insemination", "removeBraces", "removeCosmeticBraces"].includes(V.surgeryType)) { - r.push(`${slave.slaveName} <span class="health.dec">has died from complications of surgery.</span>`); + r.push(`${slave.slaveName} <span class="health dec">has died from complications of surgery.</span>`); removeSlave(slave); V.nextLink = "Main"; } else if (V.surgeryType === "breastShapePreservation" && (slave.health.condition - (slave.boobs / 1000) < random(-100, -80))) { - r.push(`${slave.slaveName}'s mesh implantation <span class="health.dec">has gone wrong, resulting in a mastectomy!</span>`); + r.push(`${slave.slaveName}'s mesh implantation <span class="health dec">has gone wrong, resulting in a mastectomy!</span>`); if (slave.boobs >= 7000) { if (slave.areolae > 2) { r.push(`The emergency mastectomy also <span class="orange">slightly reduces ${his} massive areolae.</span>`); @@ -70,7 +70,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { slave.nipples = "huge"; } if (slave.fetish === "mindbroken") { - r.push(`As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); } else if (slave.sexualFlaw === "breast growth") { if (canSee(slave)) { r.push(`${He} can hardly believe what ${he} is seeing. The immense bust ${he} managed to grow has been all but stripped from ${him}. ${His} face fills with disbelief as ${his} flatness dawns on ${him}.`); @@ -94,7 +94,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} tries to squirm, and finds ${he} is no longer pinned by ${his} tits. ${His} face twitches, ${his} mind unable to comprehend why this has happened to ${him}. ${He} sobs once as ${his} will to go on breaks apart.`); } - r.push(`${He} loved ${his} enormous breasts, and now that they are gone, ${he} has nothing to live for. <span class="red">Your apparent theft of ${his} obsession has broken ${his} mind.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`${He} loved ${his} enormous breasts, and now that they are gone, ${he} has nothing to live for. <span class="red">Your apparent theft of ${his} obsession has broken ${his} mind.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); slave.trust = -50; slave.devotion = -50; slave.fetish = "mindbroken"; @@ -114,7 +114,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${heGlaresDaggers}.`); } - r.push(`${He} loved ${his} enormous breasts, and they were apparently swiped from off ${his} chest by the person ${he} was just beginning to entrust ${himself} to. <span class="mediumorchid">${He} sees this as a betrayal by you.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is now <span class="gold">terribly afraid</span> that you may chose to steal something else ${he} loves, even though it was your intent to preserve them.`); + r.push(`${He} loved ${his} enormous breasts, and they were apparently swiped from off ${his} chest by the person ${he} was just beginning to entrust ${himself} to. <span class="mediumorchid">${He} sees this as a betrayal by you.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is now <span class="gold">terribly afraid</span> that you may chose to steal something else ${he} loves, even though it was your intent to preserve them.`); slave.trust -= 40; slave.devotion -= 20; } else if (slave.devotion > 50) { @@ -123,7 +123,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} bounces a little to feel ${his} tiny breasts move and turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't bounce too much.`); } - r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} boobs</span> and <span class="mediumaquamarine">thankful</span> that you'd consider ${his} health, well being and ability to fuck. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} boobs</span> and <span class="mediumaquamarine">thankful</span> that you'd consider ${his} health, well being and ability to fuck. As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); slave.devotion += 4; slave.trust += 4; } else if (slave.devotion >= -20) { @@ -137,7 +137,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but both your and ${him} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is <span class="mediumaquamarine">thankful</span> that you removed the literal weight off ${his} chest.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but both your and ${him} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="mediumaquamarine">thankful</span> that you removed the literal weight off ${his} chest.`); slave.trust += 5; } else { if (canSee(slave)) { @@ -150,7 +150,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${he} breathes easier without the immense weight hanging from ${him}.`); } - r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every supposed whim. For now, <span class="hotpink">${he} seems appreciative of this literal weight lifted from ${his} chest</span> and <span class="mediumaquamarine">is thankful for your consideration of ${his} health,</span> though it may be short lived. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every supposed whim. For now, <span class="hotpink">${he} seems appreciative of this literal weight lifted from ${his} chest</span> and <span class="mediumaquamarine">is thankful for your consideration of ${his} health,</span> though it may be short lived. As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); slave.trust += 10; slave.devotion += 5; } @@ -170,7 +170,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { slave.nipples = "huge"; } if (slave.fetish === "mindbroken") { - r.push(`As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); } else if (slave.sexualFlaw === "breast growth") { if (canSee(slave)) { r.push(`${He} can hardly believe what ${he} is seeing. ${His} once glorious bust has been all but stripped from ${him}. ${His} face fills with disbelief as ${his} flatness dawns on ${him}.`); @@ -194,7 +194,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} tries to squirm, and finds ${he} is no longer pinned by ${his} tits. ${His} face twitches, ${his} mind unable to comprehend why this has happened to ${him}. ${He} sobs once as ${his} will to go on breaks apart.`); } - r.push(`${He} loved ${his} huge breasts, and now that they are gone, ${he} has nothing to live for. <span class="red">Your theft of ${his} obsession has broken ${his} mind.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`${He} loved ${his} huge breasts, and now that they are gone, ${he} has nothing to live for. <span class="red">Your theft of ${his} obsession has broken ${his} mind.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); slave.trust = -50; slave.devotion = -50; slave.fetish = "mindbroken"; @@ -214,7 +214,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${heGlaresDaggers}.`); } - r.push(`${He} loved ${his} huge breasts, and they were apparently swiped from off ${his} chest by the person ${he} was just beginning to entrust ${himself} to. <span class="mediumorchid">${He} sees this as a betrayal by you.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is now <span class="gold">terribly afraid</span> that you may chose to steal something else ${he} loves, even though it was your intent to preserve them.`); + r.push(`${He} loved ${his} huge breasts, and they were apparently swiped from off ${his} chest by the person ${he} was just beginning to entrust ${himself} to. <span class="mediumorchid">${He} sees this as a betrayal by you.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is now <span class="gold">terribly afraid</span> that you may chose to steal something else ${he} loves, even though it was your intent to preserve them.`); slave.trust -= 40; slave.devotion -= 20; } else if (slave.devotion > 50) { @@ -223,7 +223,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} bounces a little to feel ${his} tiny breasts move and turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't bounce too much.`); } - r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} boobs.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} boobs.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (canSee(slave)) { @@ -236,7 +236,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but both your and ${him} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but both your and ${him} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (canSee(slave)) { @@ -249,7 +249,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${heGlaresDaggers}.`); } - r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this apparent surgical theft as a cruel imposition.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this apparent surgical theft as a cruel imposition.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } @@ -487,7 +487,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { slave.behavioralFlaw = "none"; break; case "unblind": - r.push(`The eye surgery is <span class="health.dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as ${he} is allowed to open ${his} eyes and look around, ${his} gaze flicks from object to object with manic speed as ${he} processes ${his} new vision. Seeing the world as it is is a gift that those who do not need it cannot properly understand.`); + r.push(`The eye surgery is <span class="health dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as ${he} is allowed to open ${his} eyes and look around, ${his} gaze flicks from object to object with manic speed as ${he} processes ${his} new vision. Seeing the world as it is is a gift that those who do not need it cannot properly understand.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { slave.devotion += 25; slave.trust += 25; @@ -504,7 +504,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } break; case "blind": - r.push(`The laser eye surgery is brief, with <span class="health.dec">nothing more than minor health effects.</span> As soon as ${he} is allowed to open ${his} eyes and look around, ${he} begins to glance back and forth frantically, not immediately understanding that this darkness is ${his} new reality.`); + r.push(`The laser eye surgery is brief, with <span class="health dec">nothing more than minor health effects.</span> As soon as ${he} is allowed to open ${his} eyes and look around, ${he} begins to glance back and forth frantically, not immediately understanding that this darkness is ${his} new reality.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 50) { r.push(`When ${he} finally figures it out, ${he} begins to weep, not understanding why it's necessary that ${he} be unable to see. After a short cry that trails off into a few sniffles, ${he} carries on.`); @@ -519,7 +519,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } break; case "remove eyes": - r.push(`Surgery doesn't take long, but since it was invasive there are <span class="health.dec">moderate health consequences.</span> As anesthesia wears off ${he} tries to open ${his} eyes and finds ${he} is unable to.`); + r.push(`Surgery doesn't take long, but since it was invasive there are <span class="health dec">moderate health consequences.</span> As anesthesia wears off ${he} tries to open ${his} eyes and finds ${he} is unable to.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 50) { r.push(`When ${he} realizes why, ${he} begins to weep, not understanding what ${he} did to deserve this. After a short cry that trails off into a few sniffles, ${he} carries on.`); @@ -534,7 +534,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } break; case "remove blind eyes": - r.push(`Surgery doesn't take long, but since it was invasive there are <span class="health.dec">moderate health consequences.</span> As anesthesia wears off ${he} tries to open ${his} eyes and finds ${he} is unable to.`); + r.push(`Surgery doesn't take long, but since it was invasive there are <span class="health dec">moderate health consequences.</span> As anesthesia wears off ${he} tries to open ${his} eyes and finds ${he} is unable to.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 50) { r.push(`When ${he} realizes why, ${he} seems surprised since ${he} doesn't see the point of such procedure. As ${he} was already blind, ${his} mental state remains unaffected.`); @@ -545,7 +545,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } break; case "ocular implant": - r.push(`The implant surgery is <span class="health.dec">invasive</span> and ${he} spends some time in the autosurgery recovering. When ${he} is allowed to open ${his} eyes the amount of visual information makes ${him} reel.`); + r.push(`The implant surgery is <span class="health dec">invasive</span> and ${he} spends some time in the autosurgery recovering. When ${he} is allowed to open ${his} eyes the amount of visual information makes ${him} reel.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 50) { r.push(`${He} is <span class="hotpink">grateful</span> for ${his} improved vision, and knowing how much you invested in ${him} makes ${him} <span class="mediumaquamarine">trust you more</span> as well.`); @@ -562,7 +562,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } break; case "ocular implant for blind": - r.push(`The implant surgery is <span class="health.dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as ${he} is allowed to open ${his} eyes and look around, ${his} gaze flicks from object to object with manic speed as ${his} new eyes deliver nearly overwhelming amount of visual information. Seeing the world as it is is a gift that those who do not need it cannot properly understand.`); + r.push(`The implant surgery is <span class="health dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as ${he} is allowed to open ${his} eyes and look around, ${his} gaze flicks from object to object with manic speed as ${his} new eyes deliver nearly overwhelming amount of visual information. Seeing the world as it is is a gift that those who do not need it cannot properly understand.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { slave.devotion += 25; slave.trust += 25; @@ -579,10 +579,10 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } break; case "newEyes": - r.push(`The implant surgery is <span class="health.dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as ${he} is allowed to open ${his} eyes and look around, ${he} notices nothing has changed; though the next time ${he} looks in the mirror, ${he}'ll see a pair of familiar ${App.Desc.eyesColor(slave)} peering back at ${him}.`); + r.push(`The implant surgery is <span class="health dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as ${he} is allowed to open ${his} eyes and look around, ${he} notices nothing has changed; though the next time ${he} looks in the mirror, ${he}'ll see a pair of familiar ${App.Desc.eyesColor(slave)} peering back at ${him}.`); break; case "undeafen": - r.push(`The inner ear surgery is <span class="health.dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as the bandages around ${his} ears are removed, ${his} head tilts towards any source of sound with manic speed as ${he} processes ${his} new hearing. Hearing the world as it is is a gift that those who do not need it cannot properly understand.`); + r.push(`The inner ear surgery is <span class="health dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as the bandages around ${his} ears are removed, ${his} head tilts towards any source of sound with manic speed as ${he} processes ${his} new hearing. Hearing the world as it is is a gift that those who do not need it cannot properly understand.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { slave.devotion += 25; slave.trust += 25; @@ -599,7 +599,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } break; case "deafen": - r.push(`The inner ear surgery is brief, with <span class="health.dec">nothing more than minor health effects.</span> As soon as the bandages around ${his} ears are removed, ${he} begins to twist and turn ${his} head frantically, not immediately understanding that this silence is ${his} new reality.`); + r.push(`The inner ear surgery is brief, with <span class="health dec">nothing more than minor health effects.</span> As soon as the bandages around ${his} ears are removed, ${he} begins to twist and turn ${his} head frantically, not immediately understanding that this silence is ${his} new reality.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 50) { r.push(`When ${he} finally figures it out, ${he} begins to weep, not understanding why it's necessary that ${he} be unable to hear. After a short cry that trails off into a few sniffles, ${he} carries on.`); @@ -615,7 +615,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { break; case "cochlear implant": if (slave.hears <= -2) { - r.push(`The implant surgery is <span class="health.dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as the bandages around ${his} ears are removed, ${his} head tilts towards any source of sound with manic speed as ${he} processes a nearly overwhelming amount of auditory information. Hearing the world as it is is a gift that those who do not need it cannot properly understand.`); + r.push(`The implant surgery is <span class="health dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as the bandages around ${his} ears are removed, ${his} head tilts towards any source of sound with manic speed as ${he} processes a nearly overwhelming amount of auditory information. Hearing the world as it is is a gift that those who do not need it cannot properly understand.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { slave.devotion += 25; slave.trust += 25; @@ -631,7 +631,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } } } else { - r.push(`The implant surgery is <span class="health.dec">invasive</span> and ${he} spends some time in the autosurgery recovering. When the bandages around ${his} ears are removed the amount of auditory information makes ${him} reel.`); + r.push(`The implant surgery is <span class="health dec">invasive</span> and ${he} spends some time in the autosurgery recovering. When the bandages around ${his} ears are removed the amount of auditory information makes ${him} reel.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 50) { r.push(`${He} is <span class="hotpink">grateful,</span> for ${his} improved hearing, and knowing how much you invested in ${him} makes ${him} <span class="mediumaquamarine">trust you more</span> as well.`); @@ -651,7 +651,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { break; case "earMinor": if (slave.fetish === "mindbroken") { - r.push(`${He} shows little reaction to ${his} altered ears. The modification surgery is brief, with <span class="health.dec">nothing more than minor health effects.</span>`); + r.push(`${He} shows little reaction to ${his} altered ears. The modification surgery is brief, with <span class="health dec">nothing more than minor health effects.</span>`); } else if (slave.devotion > 20) { if (canSee(slave)) { r.push(`${He} looks in the mirror and turns ${his} head side to side admiring ${his} new ears,`); @@ -661,7 +661,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { if (hasAnyArms(slave)) { r.push(`they're still a bit sore, but ${he} reaches up to feel them gently,`); } - r.push(` ${he} turns to you with a smile, tilting ${his} head at various angles to show them off. ${He} seems to think ${his} new ears are <span class="hotpink">cute.</span> The modification surgery is brief, with <span class="health.dec">nothing more than minor health effects.</span>`); + r.push(` ${he} turns to you with a smile, tilting ${his} head at various angles to show them off. ${He} seems to think ${his} new ears are <span class="hotpink">cute.</span> The modification surgery is brief, with <span class="health dec">nothing more than minor health effects.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (canSee(slave)) { @@ -672,7 +672,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { if (hasAnyArms(slave)) { r.push(`${He}'s still a bit sore, but ${he} reaches up to feel them gently.`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} isn't much affected mentally despite the surprise of having ${his} ears reshaped. The modification surgery is brief, with <span class="health.dec">nothing more than minor health effects.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} isn't much affected mentally despite the surprise of having ${his} ears reshaped. The modification surgery is brief, with <span class="health dec">nothing more than minor health effects.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (canSee(slave)) { @@ -683,14 +683,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { if (hasAnyArms(slave)) { r.push(`${He}'s still a bit sore, but ${he} reaches up to feel them gently, as if to confirm it's not some trick.`); } - r.push(`For now, <span class="mediumorchid">${he} seems to view ${his} altered ears as a cruel imposition.</span> The modification surgery is brief, with <span class="health.dec">nothing more than minor health effects.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`For now, <span class="mediumorchid">${he} seems to view ${his} altered ears as a cruel imposition.</span> The modification surgery is brief, with <span class="health dec">nothing more than minor health effects.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } break; case "earMajor": if (slave.fetish === "mindbroken") { - r.push(`${He} shows little reaction to ${his} altered ears. Since the surgery was fairly invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} shows little reaction to ${his} altered ears. Since the surgery was fairly invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { if (canSee(slave)) { r.push(`${He} looks in the mirror and turns ${his} head side to side admiring ${his} new ears and they twitch in response, surprising ${him},`); @@ -700,7 +700,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { if (hasAnyArms(slave)) { r.push(`they're still a bit sore, but ${he} reaches up to feel them gently`); } - r.push(` ${he} turns to you with a smile, tilting ${his} head at various angles to show them off. ${His} new ears seem to respond to ${his} emotional state, with time and mild electro-stimulation ${he} will learn to control ${his} new ear muscles so ${he} can move them at will, for now ${he} seems to think ${his} new ears are <span class="hotpink">cute.</span> Since the surgery was fairly invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(` ${he} turns to you with a smile, tilting ${his} head at various angles to show them off. ${His} new ears seem to respond to ${his} emotional state, with time and mild electro-stimulation ${he} will learn to control ${his} new ear muscles so ${he} can move them at will, for now ${he} seems to think ${his} new ears are <span class="hotpink">cute.</span> Since the surgery was fairly invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (canSee(slave)) { @@ -711,7 +711,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { if (hasAnyArms(slave)) { r.push(`${He}'s still a bit sore, but ${he} reaches up to feel them gently.`); } - r.push(`${His} new ears seem to respond to ${his} emotional state, with time and mild electro-stimulation ${he} will learn to control ${his} new ear muscles so ${he} can move them at will. ${He}'s come to terms with the fact that ${he}'s a slave, but ${he} is still somewhat angry that you would go this far. Since the surgery was fairly invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${His} new ears seem to respond to ${his} emotional state, with time and mild electro-stimulation ${he} will learn to control ${his} new ear muscles so ${he} can move them at will. ${He}'s come to terms with the fact that ${he}'s a slave, but ${he} is still somewhat angry that you would go this far. Since the surgery was fairly invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; slave.devotion -= 5; } else { @@ -723,35 +723,35 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { if (hasAnyArms(slave)) { r.push(`${He}'s still a bit sore, but ${he} reaches up to feel them gently.`); } - r.push(`${His} new ears seem to respond to ${his} emotional state, with time and mild electro-stimulation ${he} will learn to control ${his} new ear muscles so ${he} can move them at will. For now, <span class="mediumorchid">${he} seems to view ${his} altered ears as a cruel imposition.</span> Since the surgery was fairly invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${His} new ears seem to respond to ${his} emotional state, with time and mild electro-stimulation ${he} will learn to control ${his} new ear muscles so ${he} can move them at will. For now, <span class="mediumorchid">${he} seems to view ${his} altered ears as a cruel imposition.</span> Since the surgery was fairly invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 10; } break; case "earRestore": if (slave.fetish === "mindbroken") { - r.push(`${He} shows little reaction to ${his} altered ears. Since the surgery was fairly invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} shows little reaction to ${his} altered ears. Since the surgery was fairly invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else { /* Will expand in future*/ - r.push(`${He} is delighted to have ${his} ears back. Since the surgery was fairly invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} is delighted to have ${his} ears back. Since the surgery was fairly invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } break; case "earGone": if (slave.fetish === "mindbroken") { - r.push(`${He} shows little reaction to ${his} altered ears. Since the surgery was fairly invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} shows little reaction to ${his} altered ears. Since the surgery was fairly invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { - r.push(`${He} is horrified that you would disfigure ${him} but ultimately accepts it since ${he} is devoted to you. Since the surgery was fairly invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} is horrified that you would disfigure ${him} but ultimately accepts it since ${he} is devoted to you. Since the surgery was fairly invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion >= -20) { - r.push(`${He} is horrified that you would disfigure ${him}, ${he}'s come to terms with the fact that ${he}'s a slave, but ${he} is still <span class="mediumorchid">angry that you would go this far.</span> Since the surgery was fairly invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} is horrified that you would disfigure ${him}, ${he}'s come to terms with the fact that ${he}'s a slave, but ${he} is still <span class="mediumorchid">angry that you would go this far.</span> Since the surgery was fairly invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 10; } else { - r.push(`${He} is horrified that you would disfigure ${him} and begins to weep openly as soon as ${he} discovers the loss.<span class="mediumorchid">${He} seems to consider the loss as a cruel theft.</span> Since the surgery was fairly invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} is horrified that you would disfigure ${him} and begins to weep openly as soon as ${he} discovers the loss.<span class="mediumorchid">${He} seems to consider the loss as a cruel theft.</span> Since the surgery was fairly invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 20; slave.devotion -= 20; } break; case "newEars": - r.push(`The implant surgery is <span class="health.dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as the bandages around ${his} ears are removed, ${he}`); + r.push(`The implant surgery is <span class="health dec">invasive</span> and ${he} spends some time in the autosurgery recovering. As soon as the bandages around ${his} ears are removed, ${he}`); if (slave.fetish === "mindbroken") { r.push(`returns to ${his} normal activities, none the wiser.`); } else { @@ -759,7 +759,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } break; case "desmell": - r.push(`The nasal surgery is brief, with <span class="health.dec">nothing more than minor health effects.</span> In the sterile environment of the autosurgery, ${he}'s unable to notice any impairment to ${his} sense of smell, and so must wait to discover the change when ${he}'s released much later on.`); + r.push(`The nasal surgery is brief, with <span class="health dec">nothing more than minor health effects.</span> In the sterile environment of the autosurgery, ${he}'s unable to notice any impairment to ${his} sense of smell, and so must wait to discover the change when ${he}'s released much later on.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 50) { r.push(`When ${he} finally figures it out, ${he} begins to cry, not understanding why it's necessary that ${he} be unable to smell. After a few sniffles, ${he} carries on.`); @@ -767,14 +767,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { r.push(`When ${he} finally figures it out, ${he} begins to tear up, not understanding what ${he} did to earn this. After a short expurgation of <span class="gold">sadness and fear,</span> ${he} takes a deep breath and suppresses ${his} emotions.`); slave.trust -= 10; } else { - r.push(`When ${he} realizes what's happened, ${his} face <span class="mediumorchid">fills with anger.</span> ${he} views this as another pointless way to assert your authority over ${him}. After briefly <span class="gold">shuddering with fear</span> at that thought, ${he} morosely returns to ${his} duties.`); + r.push(`When ${he} realizes what's happened, ${his} face <span class="mediumorchid">fills with anger.</span> ${He} views this as another pointless way to assert your authority over ${him}. After briefly <span class="gold">shuddering with fear</span> at that thought, ${he} morosely returns to ${his} duties.`); slave.trust -= 4; slave.devotion -= 4; } } break; case "resmell": - r.push(`The nasal surgery is brief, with <span class="health.dec">nothing more than minor health effects.</span> In the sterile environment of the autosurgery, ${he}'s unable to notice any improvement to ${his} sense of smell, and so must wait to discover the change when ${he}'s released much later on.`); + r.push(`The nasal surgery is brief, with <span class="health dec">nothing more than minor health effects.</span> In the sterile environment of the autosurgery, ${he}'s unable to notice any improvement to ${his} sense of smell, and so must wait to discover the change when ${he}'s released much later on.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { slave.devotion += 15; slave.trust += 15; @@ -788,7 +788,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } break; case "detaste": - r.push(`The oral surgery is brief, with <span class="health.dec">nothing more than minor health effects.</span> In the sterile environment of the autosurgery, ${he}'s unable to notice any impairment to ${his} sense of taste, and so must wait to discover the change when ${he}'s released much later on.`); + r.push(`The oral surgery is brief, with <span class="health dec">nothing more than minor health effects.</span> In the sterile environment of the autosurgery, ${he}'s unable to notice any impairment to ${his} sense of taste, and so must wait to discover the change when ${he}'s released much later on.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 50) { r.push(`When ${he} finally figures it out, ${he} begins to cry, not understanding why it's necessary that ${he} be unable to taste. After a few sniffles, ${he} carries on.`); @@ -796,14 +796,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { r.push(`When ${he} finally figures it out, ${he} begins to tear up, not understanding what ${he} did to earn this. After a short expurgation of <span class="gold">sadness and fear,</span> ${he} takes a deep breath and suppresses ${his} emotions.`); slave.trust -= 10; } else { - r.push(`When ${he} realizes what's happened, ${his} face <span class="mediumorchid">fills with anger.</span> ${he} views this as another pointless way to assert your authority over ${him}. After briefly <span class="gold">shuddering with fear</span> at that thought, ${he} morosely returns to ${his} duties.`); + r.push(`When ${he} realizes what's happened, ${his} face <span class="mediumorchid">fills with anger.</span> ${He} views this as another pointless way to assert your authority over ${him}. After briefly <span class="gold">shuddering with fear</span> at that thought, ${he} morosely returns to ${his} duties.`); slave.trust -= 4; slave.devotion -= 4; } } break; case "retaste": - r.push(`The oral surgery is brief, with <span class="health.dec">nothing more than minor health effects.</span> In the sterile environment of the autosurgery, ${he}'s unable to notice any improvement to ${his} sense of taste, and so must wait to discover the change when ${he}'s released much later on.`); + r.push(`The oral surgery is brief, with <span class="health dec">nothing more than minor health effects.</span> In the sterile environment of the autosurgery, ${he}'s unable to notice any improvement to ${his} sense of taste, and so must wait to discover the change when ${he}'s released much later on.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { slave.devotion += 15; slave.trust += 15; @@ -818,7 +818,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { break; case "horn": if (slave.fetish === "mindbroken") { - r.push(`${He} shows little reaction to ${his} new head ornamentation. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`${He} shows little reaction to ${his} new head ornamentation. As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); } else if (slave.devotion > 20) { if (canSee(slave)) { r.push(`${He} looks in the mirror and turns ${his} head side to side admiring ${his} new ${slave.hornColor} ${slave.horn},`); @@ -828,7 +828,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { if (hasAnyArms(slave)) { r.push(`the base is still a bit sore, but ${he} reaches up to feel their shape,`); } - r.push(` ${he} turns to you with a smile, tilting ${his} head at various angles to show them off. ${He} seems to think ${his} new horns are <span class="hotpink">cute.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(` ${he} turns to you with a smile, tilting ${his} head at various angles to show them off. ${He} seems to think ${his} new horns are <span class="hotpink">cute.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (canSee(slave)) { @@ -839,7 +839,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { if (hasAnyArms(slave)) { r.push(`the base is still a bit sore, but ${he} reaches up to tug on them gently,`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} isn't much affected mentally despite the surprise of having horns attached to ${his} head. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} isn't much affected mentally despite the surprise of having horns attached to ${his} head. As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (canSee(slave)) { @@ -850,23 +850,23 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { if (hasAnyArms(slave)) { r.push(`The base is still a bit sore, but ${he} reaches up to tug on them, as if to confirm it's not some trick.`); } - r.push(`For now, <span class="mediumorchid">${he} seems to view ${his} head ornamentation as a cruel imposition.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`For now, <span class="mediumorchid">${he} seems to view ${his} head ornamentation as a cruel imposition.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } break; case "hornGone": if (slave.fetish === "mindbroken") { - r.push(`${He} shows little reaction to the removal of ${his} head ornamentation. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`${He} shows little reaction to the removal of ${his} head ornamentation. As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); } else if (slave.devotion > 20) { - r.push(`${He} is a little sad ${his} head ornaments are gone but since ${he} is attentive to your will it doesn't have a great impact on ${his} mental state. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`${He} is a little sad ${his} head ornaments are gone but since ${he} is attentive to your will it doesn't have a great impact on ${his} mental state. As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); } else { - r.push(`${He} is glad to be rid of the horns but any happiness is tempered by ${his} general dissatisfaction of being treated as your surgical plaything. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} is glad to be rid of the horns but any happiness is tempered by ${his} general dissatisfaction of being treated as your surgical plaything. As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } break; case "tailInterface": - r.push(`Implanting a tail socket and interfacing it with ${his} spinal column is delicate and invasive procedure <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`Implanting a tail socket and interfacing it with ${his} spinal column is delicate and invasive procedure <span class="health dec">${his} health has been greatly affected.</span>`); break; case "boobs": if (slave.areolae < 2 && random(1, 100) > 70) { @@ -895,14 +895,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { slave.boobShape = "normal"; } if (slave.fetish === "mindbroken") { - r.push(`${He} shows little reaction to the new weight on ${his} chest. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} shows little reaction to the new weight on ${his} chest. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 20 && strongKnownFet("boobs")) { if (hasAnyArms(slave)) { r.push(`${He}'s barely out of the surgery before ${he}'s playing with ${his} new assets.`); } else { r.push(`${He}'s barely out of the surgery before ${he}'s rubbing ${his} new assets against anything ${he} can reach.`); } - r.push(`${He}'s <span class="hotpink">deliriously happy</span> with your changes to what ${he} thinks of as ${his} primary sexual organs, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He}'s <span class="hotpink">deliriously happy</span> with your changes to what ${he} thinks of as ${his} primary sexual organs, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 4; } else if (slave.devotion > 50) { @@ -911,7 +911,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} bounces a little to feel ${his} new breasts move and turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't move too much, but ${he} wiggles ${himself} a little to make them bounce for you.`); } - r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} boobs.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} boobs.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (canSee(slave)) { @@ -925,7 +925,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`); } - r.push(` ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(` ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (canSee(slave)) { @@ -939,7 +939,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${heGlaresDaggers}.`); } - r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view these fake breasts as a cruel imposition.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view these fake breasts as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } @@ -947,19 +947,19 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { case "preg": r.push(`${He} leaves the surgery with a certain warmth in ${his} lower abdomen, ${he} knows that ${he} has been impregnated.`); if (slave.fetish === "mindbroken") { - r.push(`As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (strongKnownFet("pregnancy")) { - r.push(`${He} is <span class="hotpink"> filled with joy</span> about being swollen with life and gleefully rubs ${his} soon to be huge belly. ${He}'s so pleased that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} is <span class="hotpink"> filled with joy</span> about being swollen with life and gleefully rubs ${his} soon to be huge belly. ${He}'s so pleased that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 10; } else if (slave.devotion > 50) { - r.push(`${He}'s <span class="hotpink">grateful</span> that you think ${his} offspring are valuable, and a little nervous about how ${he}'ll perform as a breeder. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He}'s <span class="hotpink">grateful</span> that you think ${his} offspring are valuable, and a little nervous about how ${he}'ll perform as a breeder. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { - r.push(`${He} understands the realities of ${his} life as a slave, so it isn't much of a shock. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body and how big ${he} will get.`); + r.push(`${He} understands the realities of ${his} life as a slave, so it isn't much of a shock. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body and how big ${he} will get.`); slave.trust -= 10; } else { - r.push(`${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> that you have forced ${him} to be a broodmother. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body and ${his} rapidly filling womb.`); + r.push(`${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> that you have forced ${him} to be a broodmother. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body and ${his} rapidly filling womb.`); slave.trust -= 15; slave.devotion -= 15; } @@ -990,7 +990,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } break; case "preg1hack": - r.push(`The hacking process is brief, being little more than inserting the actuator into ${his} vagina, and leaves ${him} with <span class="health.dec">nothing more than minor health effects</span> from the altered implant functions. ${He} leaves the surgery without any specific feeling, but ${he} knows that something has been done to ${his} implant.`); + r.push(`The hacking process is brief, being little more than inserting the actuator into ${his} vagina, and leaves ${him} with <span class="health dec">nothing more than minor health effects</span> from the altered implant functions. ${He} leaves the surgery without any specific feeling, but ${he} knows that something has been done to ${his} implant.`); slave.broodmotherFetuses = either(2, 2, 2, 2, 3, 3, 4); // My testing shows that 2 or 3 relatively safe for generic adult slave with effective curatives or clinic, 4 - high risk of bursting. So there is a catch with it. if (slave.fetish === "mindbroken") { /* nothing*/ @@ -1014,19 +1014,19 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { case "pregRemove": r.push(`${He} leaves the surgery with a certain soreness and minor pain in ${his} lower abdomen, ${he} knows that ${his} days as broodmother are finished.`); if (slave.fetish === "mindbroken") { - r.push(`As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (strongKnownFet("pregnancy")) { - r.push(`${He} is <span class="red"> filled with despair</span> about missing being swollen with life and rubs ${his} flat belly with sorrow. Only one fact slightly soothes ${him} and allows ${him} to remain sane — at least ${he} will not become infertile and still can get pregnant naturally. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} is <span class="red"> filled with despair</span> about missing being swollen with life and rubs ${his} flat belly with sorrow. Only one fact slightly soothes ${him} and allows ${him} to remain sane — at least ${he} will not become infertile and still can get pregnant naturally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust -= 10; slave.devotion -= 30; } else if (slave.devotion > 50) { - r.push(`${He}'s <span class="hotpink">grateful</span> that you allowed ${his} body to be free of constant pregnancy stress, and a little nervous about if you will appreciate ${him} enough without such dedication. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He}'s <span class="hotpink">grateful</span> that you allowed ${his} body to be free of constant pregnancy stress, and a little nervous about if you will appreciate ${him} enough without such dedication. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { - r.push(`${He} understands the realities of ${his} life as a slave, so it isn't much of a shock. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} understands the realities of ${his} life as a slave, so it isn't much of a shock. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 10; } else { - r.push(`${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> that you can change ${his} body so radically just at your will. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body and ${his} now empty womb.`); + r.push(`${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> that you can change ${his} body so radically just at your will. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body and ${his} now empty womb.`); slave.trust -= 15; slave.devotion -= 15; } @@ -1085,35 +1085,35 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { case "freshOvaries": if (slave.ovaryAge >= 45 && slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (strongKnownFet("pregnancy") || slave.origin === "$He sold $himself to you in the hope of someday bearing children.") { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache, yet a familiar warmth, in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} now has a chance to get pregnant once more. ${He} is <span class="hotpink">filled with joy</span> whenever ${he} thinks about the fact that ${he}'ll have the chance to feel a life growing within ${him} again. ${He}'s so pleased that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache, yet a familiar warmth, in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} now has a chance to get pregnant once more. ${He} is <span class="hotpink">filled with joy</span> whenever ${he} thinks about the fact that ${he}'ll have the chance to feel a life growing within ${him} again. ${He}'s so pleased that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 5; } else if (slave.devotion > 50) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache, yet a familiar warmth, in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} now has the chance to get pregnant again. ${He}'s <span class="hotpink">grateful</span> that you think ${him} worthy of extending ${his} fertility, and even a little nervous about how ${he}'ll perform as a mother that has tasted menopause. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache, yet a familiar warmth, in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} now has the chance to get pregnant again. ${He}'s <span class="hotpink">grateful</span> that you think ${him} worthy of extending ${his} fertility, and even a little nervous about how ${he}'ll perform as a mother that has tasted menopause. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache, yet a familiar warmth, in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} may now be impregnated once more. ${He} understands the realities of ${his} life as a slave, but didn't expect to have ${his} waning fertility renewed. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache, yet a familiar warmth, in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} may now be impregnated once more. ${He} understands the realities of ${his} life as a slave, but didn't expect to have ${his} waning fertility renewed. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache, yet a familiar warmth, in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to believe you have forced fertility upon ${him} again. ${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> at the potential that ${he}'ll be forced to carry children. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache, yet a familiar warmth, in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to believe you have forced fertility upon ${him} again. ${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> at the potential that ${he}'ll be forced to carry children. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; slave.devotion -= 5; } } else { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen; it won't be clear to ${him} that menopause is not a concern for now. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen; it won't be clear to ${him} that menopause is not a concern for now. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } break; case "ovaImplant added": case "ovaImplant removed": r.push(`It's not immediately apparent to ${him} what kind of surgery ${he} received, since all ${he}'s left with is a terrible nonspecific ache in ${his} lower abdomen.`); if (slave.devotion > 50) { - r.push(`${He}'s <span class="hotpink">grateful</span> that you think ${him} worthy of surgically modifying. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He}'s <span class="hotpink">grateful</span> that you think ${him} worthy of surgically modifying. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { - r.push(`${He} understands the realities of ${his} life as a slave, but didn't expect to undergo a mysterious procedure like this. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} understands the realities of ${his} life as a slave, but didn't expect to undergo a mysterious procedure like this. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { - r.push(`${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> at what you could have possibly done to ${him}. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> at what you could have possibly done to ${him}. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; slave.devotion -= 5; } @@ -1121,36 +1121,36 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { case "mpreg": r.push(`${He} leaves the surgery with a certain fullness in ${his} lower abdomen, ${he} knows that, despite lacking female reproductive organs, ${he} can now become pregnant.`); if (slave.fetish === "mindbroken") { - r.push(`As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (strongKnownFet("pregnancy")) { - r.push(`${He} is <span class="hotpink"> filled with joy</span> about the possibility of becoming pregnant and gleefully rubs ${his} softer belly. ${He}'s so pleased that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} is <span class="hotpink"> filled with joy</span> about the possibility of becoming pregnant and gleefully rubs ${his} softer belly. ${He}'s so pleased that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 10; } else if (slave.devotion > 50) { - r.push(`${He}'s <span class="hotpink">grateful</span> that you think ${his} offspring are valuable enough to give ${him} this gift, and a little nervous about how ${he}'ll perform as a mother. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He}'s <span class="hotpink">grateful</span> that you think ${his} offspring are valuable enough to give ${him} this gift, and a little nervous about how ${he}'ll perform as a mother. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { - r.push(`${He} understands the realities of ${his} life as a slave, so it isn't much of a shock. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body and ${his} inevitable pregnancy.`); + r.push(`${He} understands the realities of ${his} life as a slave, so it isn't much of a shock. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body and ${his} inevitable pregnancy.`); slave.trust -= 10; } else { - r.push(`${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> that you have forced ${him} to become fertile in such an unnatural way. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body and ${his} inevitable pregnancy.`); + r.push(`${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> that you have forced ${him} to become fertile in such an unnatural way. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body and ${his} inevitable pregnancy.`); slave.trust -= 15; slave.devotion -= 15; } break; case "mpreg removed": - r.push(`${He} notices quickly that ${his} stomach is slightly flatter than before. ${He} ponders this change for a moment, unsure of what to think of this occurrence. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} notices quickly that ${his} stomach is slightly flatter than before. ${He} ponders this change for a moment, unsure of what to think of this occurrence. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "nippleCunts": if (slave.fetish === "mindbroken") { - r.push(`${He} shows no reaction to ${his} altered nipples. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} shows no reaction to ${his} altered nipples. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 20 && strongKnownFet("boobs")) { if (hasAnyArms(slave)) { r.push(`${He}'s barely out of the surgery before ${he}'s experimentally probing ${his} new nipples despite the pain.`); } else { r.push(`${He}'s barely out of the surgery before ${he}'s rubbing ${his} new nipples against anything ${he} can reach, despite the pain.`); } - r.push(`${He}'s <span class="hotpink">deliriously happy</span> with your changes to what ${he} thinks of as ${his} primary sexual organs, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He}'s <span class="hotpink">deliriously happy</span> with your changes to what ${he} thinks of as ${his} primary sexual organs, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 4; } else if (slave.devotion > 50) { @@ -1159,7 +1159,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} bounces a little to feel the new nipples capping ${his} tits turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't move too violently, but ${he} wiggles ${himself} a little to show off.`); } - r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} nipples.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} nipples.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (canSee(slave)) { @@ -1172,7 +1172,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} body still.`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} isn't much affected mentally despite the surprise of having ${his} nipples reshaped; ${he} may reconsider once ${he} realizes just what they are now capable of. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} isn't much affected mentally despite the surprise of having ${his} nipples reshaped; ${he} may reconsider once ${he} realizes just what they are now capable of. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (canSee(slave)) { @@ -1186,21 +1186,21 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} body still, but ${heGlaresDaggers}.`); } - r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim; a notion that is likely only going to strengthen once ${he} realizes just how fuckable ${his} tits have become. For now, <span class="mediumorchid">${he} seems to view ${his} altered nipples as a cruel imposition.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim; a notion that is likely only going to strengthen once ${he} realizes just how fuckable ${his} tits have become. For now, <span class="mediumorchid">${he} seems to view ${his} altered nipples as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } break; case "areolae": if (slave.fetish === "mindbroken") { - r.push(`${He} shows little reaction to ${his} altered nipples. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} shows little reaction to ${his} altered nipples. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 20 && strongKnownFet("boobs")) { if (hasAnyArms(slave)) { r.push(`${He}'s barely out of the surgery before ${he}'s playing with ${his} new nipples despite the pain.`); } else { r.push(`${He}'s barely out of the surgery before ${he}'s rubbing ${his} new nipples against anything ${he} can reach, despite the pain.`); } - r.push(`${He}'s <span class="hotpink">deliriously happy</span> with your changes to what ${he} thinks of as ${his} primary sexual organs, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He}'s <span class="hotpink">deliriously happy</span> with your changes to what ${he} thinks of as ${his} primary sexual organs, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 4; } else if (slave.devotion > 50) { @@ -1209,7 +1209,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} bounces a little to feel the new nipples capping ${his} tits turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't move too violently, but ${he} wiggles ${himself} a little to show off.`); } - r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} nipples.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} nipples.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (canSee(slave)) { @@ -1222,7 +1222,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} body still.`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} isn't much affected mentally despite the surprise of having ${his} nipples reshaped. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} isn't much affected mentally despite the surprise of having ${his} nipples reshaped. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (canSee(slave)) { @@ -1236,7 +1236,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} body still, but ${heGlaresDaggers}.`); } - r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view ${his} altered nipples as a cruel imposition.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view ${his} altered nipples as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } @@ -1262,14 +1262,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { slave.boobShape = "saggy"; } if (slave.fetish === "mindbroken") { - r.push(`${He} shows little awareness that ${his} breasts are smaller. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} shows little awareness that ${his} breasts are smaller. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { if (hasAnyArms(slave)) { r.push(`${He} hefts ${his} new, sleeker breasts experimentally and turns to you with a smile to show off ${his} new, slimmer form. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see them from all angles.`); } else { r.push(`${He} bounces a little to feel ${his} smaller breasts move and turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't bounce too much.`); } - r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} boobs.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} boobs.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (canSee(slave)) { @@ -1282,7 +1282,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (canSee(slave)) { @@ -1295,7 +1295,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${heGlaresDaggers}.`); } - r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this surgical theft as a cruel imposition.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this surgical theft as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } @@ -1320,7 +1320,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { slave.nipples = "huge"; } if (slave.fetish === "mindbroken") { - r.push(`${He} shows little awareness that ${his} breasts are gone, despite such a massive change. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`${He} shows little awareness that ${his} breasts are gone, despite such a massive change. As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); } else if (slave.sexualFlaw === "breast growth") { if (canSee(slave)) { r.push(`${He} can hardly believe what ${he} is seeing. The immense bust ${he} managed to grow has been all but stripped from ${him}. ${His} face fills with disbelief as ${his} flatness dawns on ${him}.`); @@ -1344,7 +1344,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} tries to squirm, and finds ${he} is no longer pinned by ${his} tits. ${His} face twitches, ${his} mind unable to comprehend why this has happened to ${him}. ${He} sobs once as ${his} will to go on breaks apart.`); } - r.push(`${He} loved ${his} enormous breasts, and now that they are gone, ${he} has nothing to live for. <span class="red">Your theft of ${his} obsession has broken ${his} mind.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`${He} loved ${his} enormous breasts, and now that they are gone, ${he} has nothing to live for. <span class="red">Your theft of ${his} obsession has broken ${his} mind.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); slave.trust = -50; slave.devotion = -50; slave.fetish = "mindbroken"; @@ -1364,7 +1364,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${heGlaresDaggers}.`); } - r.push(`${He} loved ${his} enormous breasts, and they were swiped from off ${his} chest by the person ${he} was just beginning to entrust ${himself} to. <span class="mediumorchid">${He} sees this as a betrayal by you.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is now <span class="gold">terribly afraid</span> that you may chose to steal something else ${he} loves.`); + r.push(`${He} loved ${his} enormous breasts, and they were swiped from off ${his} chest by the person ${he} was just beginning to entrust ${himself} to. <span class="mediumorchid">${He} sees this as a betrayal by you.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is now <span class="gold">terribly afraid</span> that you may chose to steal something else ${he} loves.`); slave.trust -= 40; slave.devotion -= 20; } else if (slave.devotion > 50) { @@ -1373,7 +1373,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} bounces a little to feel ${his} tiny breasts move and turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't bounce too much.`); } - r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} boobs</span> and <span class="mediumaquamarine">thankful</span> that you'd consider ${his} health, well being and ability to fuck. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} boobs</span> and <span class="mediumaquamarine">thankful</span> that you'd consider ${his} health, well being and ability to fuck. As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); slave.devotion += 4; slave.trust += 4; } else if (slave.devotion >= -20) { @@ -1387,7 +1387,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is <span class="mediumaquamarine">thankful</span> that you removed the literal weight off ${his} chest.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="mediumaquamarine">thankful</span> that you removed the literal weight off ${his} chest.`); slave.trust += 5; } else { if (canSee(slave)) { @@ -1400,7 +1400,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${he} breathes easier without the immense weight hanging from ${him}.`); } - r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="hotpink">${he} seems appreciative of this literal weight lifted from ${his} chest</span> and <span class="mediumaquamarine">is thankful for your consideration of ${his} health.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="hotpink">${he} seems appreciative of this literal weight lifted from ${his} chest</span> and <span class="mediumaquamarine">is thankful for your consideration of ${his} health.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); slave.trust += 10; slave.devotion += 5; } @@ -1425,7 +1425,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { slave.nipples = "huge"; } if (slave.fetish === "mindbroken") { - r.push(`${He} shows little awareness that ${his} breasts are gone. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`${He} shows little awareness that ${his} breasts are gone. As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); } else if (slave.sexualFlaw === "breast growth") { if (canSee(slave)) { r.push(`${He} can hardly believe what ${he} is seeing. ${His} once glorious bust has been all but stripped from ${him}. ${His} face fills with disbelief as ${his} flatness dawns on ${him}.`); @@ -1449,7 +1449,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} tries to squirm, and finds ${he} is no longer pinned by ${his} tits. ${His} face twitches, ${his} mind unable to comprehend why this has happened to ${him}. ${He} sobs once as ${his} will to go on breaks apart.`); } - r.push(`${He} loved ${his} huge breasts, and now that they are gone, ${he} has nothing to live for. <span class="red">Your theft of ${his} obsession has broken ${his} mind.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`${He} loved ${his} huge breasts, and now that they are gone, ${he} has nothing to live for. <span class="red">Your theft of ${his} obsession has broken ${his} mind.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); slave.trust = -50; slave.devotion = -50; slave.fetish = "mindbroken"; @@ -1469,7 +1469,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${heGlaresDaggers}.`); } - r.push(`${He} loved ${his} huge breasts, and they were swiped from off ${his} chest by the person ${he} was just beginning to entrust ${himself} to. <span class="mediumorchid">${He} sees this as a betrayal by you.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is now <span class="gold">terribly afraid</span> that you may chose to steal something else ${he} loves.`); + r.push(`${He} loved ${his} huge breasts, and they were swiped from off ${his} chest by the person ${he} was just beginning to entrust ${himself} to. <span class="mediumorchid">${He} sees this as a betrayal by you.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is now <span class="gold">terribly afraid</span> that you may chose to steal something else ${he} loves.`); slave.trust -= 40; slave.devotion -= 20; } else if (slave.devotion > 50) { @@ -1478,7 +1478,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} bounces a little to feel ${his} tiny breasts move and turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't bounce too much.`); } - r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} boobs.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} boobs.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (canSee(slave)) { @@ -1491,7 +1491,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (canSee(slave)) { @@ -1504,24 +1504,24 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${heGlaresDaggers}.`); } - r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this surgical theft as a cruel imposition.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this surgical theft as a cruel imposition.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } break; case "breastShapePreservation": - r.push(`${He} notices almost immediately the immense soreness in ${his} breasts. ${He} can't find anything off about them, but ${he} knows you did something to them. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} notices almost immediately the immense soreness in ${his} breasts. ${He} can't find anything off about them, but ${he} knows you did something to them. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "breastLift": if (slave.fetish === "mindbroken") { - r.push(`The changes to ${his} breasts are lost on ${him}. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`The changes to ${his} breasts are lost on ${him}. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 20 && strongKnownFet("boobs")) { if (hasAnyArms(slave)) { r.push(`${He}'s barely out of the surgery before ${he}'s playing with ${his} new, perkier breasts despite the pain.`); } else { r.push(`${He}'s barely out of the surgery before ${he}'s rubbing ${his} new, perkier breasts against anything ${he} can reach, despite the pain.`); } - r.push(`${He}'s <span class="hotpink">deliriously happy</span> with your changes to what ${he} thinks of as ${his} primary sexual organs, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He}'s <span class="hotpink">deliriously happy</span> with your changes to what ${he} thinks of as ${his} primary sexual organs, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 4; } else if (slave.devotion > 50) { @@ -1536,7 +1536,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} bounces a little to feel ${his} perkier tits move before ${he} turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't move too violently, but ${he} wiggles ${himself} a little to show off.`); } - r.push(` <span class="hotpink">${He}'s thrilled that you firmed up ${his} breasts.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(` <span class="hotpink">${He}'s thrilled that you firmed up ${his} breasts.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (canSee(slave)) { @@ -1549,7 +1549,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} body still.`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} is <span class="hotpink">quite happy</span> you'd take the time to make ${his} breasts prettier. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body and that this may be only the beginning of extensive breast surgery.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} is <span class="hotpink">quite happy</span> you'd take the time to make ${his} breasts prettier. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body and that this may be only the beginning of extensive breast surgery.`); slave.devotion += 3; slave.trust -= 5; } else { @@ -1564,21 +1564,21 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} body still, but ${heGlaresDaggers}.`); } - r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. Oddly, <span class="hotpink">${he} seems to like that ${his} breasts are no longer saggy</span> despite ${his} immediate reaction. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body and fears that this is only the beginning of ${his} breast surgeries.`); + r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. Oddly, <span class="hotpink">${he} seems to like that ${his} breasts are no longer saggy</span> despite ${his} immediate reaction. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body and fears that this is only the beginning of ${his} breast surgeries.`); slave.trust -= 10; slave.devotion += 2; } break; case "breastReconstruction": if (slave.fetish === "mindbroken") { - r.push(`The changes to ${his} breasts are lost on ${him}. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`The changes to ${his} breasts are lost on ${him}. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 20 && strongKnownFet("boobs")) { if (hasAnyArms(slave)) { r.push(`${He}'s barely out of the surgery before ${he}'s playing with ${his} new, ${slave.boobShape} breasts despite the pain.`); } else { r.push(`${He}'s barely out of the surgery before ${he}'s rubbing ${his} new, ${slave.boobShape} breasts against anything ${he} can reach, despite the pain.`); } - r.push(`${He}'s <span class="hotpink">deliriously happy</span> with your changes to what ${he} thinks of as ${his} primary sexual organs, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He}'s <span class="hotpink">deliriously happy</span> with your changes to what ${he} thinks of as ${his} primary sexual organs, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 4; } else if (slave.devotion > 50) { @@ -1593,7 +1593,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} bounces a little to feel ${his} ${slave.boobShape} tits move before ${he} turns ${his} torso to you with a smile to show them off. ${He}'s still sore, so ${he} doesn't move too violently, but ${he} wiggles ${himself} a little to show off.`); } - r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} breasts.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} breasts.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (canSee(slave)) { @@ -1606,7 +1606,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} body still.`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} isn't much affected mentally despite the surprise of having ${his} breasts reshaped. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} isn't much affected mentally despite the surprise of having ${his} breasts reshaped. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (canSee(slave)) { @@ -1620,13 +1620,13 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} body still, but ${heGlaresDaggers}.`); } - r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view ${his} altered breasts as a cruel imposition.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view ${his} altered breasts as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; } break; case "lactation": if (slave.fetish === "mindbroken") { - r.push(`${He} notices almost immediately that ${his} breasts feel fuller, gasping as milk begins to leak from ${his} nipples. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} notices almost immediately that ${his} breasts feel fuller, gasping as milk begins to leak from ${his} nipples. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { if (hasAnyArms(slave)) { r.push(`${He} hefts ${his} swollen breasts experimentally and turns to you with a smile to show them off.`); @@ -1651,7 +1651,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`As you carry ${him} out of the surgery, droplets of milk begin to bud from ${his} nipples, and ${he} giggles giddily.`); } - r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} boobs.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} boobs.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (hasAnyArms(slave)) { @@ -1676,7 +1676,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } r.push(`${He}'s shocked, but ${he} seems to understand that ${he}'s a lactation slave now, and that's how it is.`); } - r.push(`${He} isn't much affected mentally. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (canSee(slave)) { @@ -1690,7 +1690,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`When ${he} finally figures out ${he}'s lactating, ${he} breaks down in rage and unhappiness, dripping milk and bitter tears.`); } - r.push(`For now, <span class="mediumorchid">${he} seems to view being a lactation slave as a cruel hardship.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`For now, <span class="mediumorchid">${he} seems to view being a lactation slave as a cruel hardship.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } @@ -1698,7 +1698,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { slave.lactation = 2; break; case "endlac": - r.push(`${He} notices almost immediately that the soreness that used to tell ${him} ${he} needed to be milked has gone. ${He} bounces ${his} breasts idly; it looks like ${he} doesn't know what to think about having ${his} lactation dry up. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} notices almost immediately that the soreness that used to tell ${him} ${he} needed to be milked has gone. ${He} bounces ${his} breasts idly; it looks like ${he} doesn't know what to think about having ${his} lactation dry up. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); if (slave.assignment === "get milked" || slave.assignment === "work in the dairy") { r.push(`<span class="yellow">${His} assignment has defaulted to rest.</span>`); removeJob(slave, slave.assignment); @@ -1722,13 +1722,13 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { slave.devotion -= 5; } } - r.push(`As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "endprecum": - r.push(`${His} groin is a little sore, and ${he} examines it closely, but ${he} can't find much difference. ${His} generous production of precum won't tail off for some time, until the slow-release drugs are completely flushed from ${his} system. Even then, the only real change for ${him} will be a little less inconvenience. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${His} groin is a little sore, and ${he} examines it closely, but ${he} can't find much difference. ${His} generous production of precum won't tail off for some time, until the slow-release drugs are completely flushed from ${his} system. Even then, the only real change for ${him} will be a little less inconvenience. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "vasectomy": - r.push(`${His} groin is a little sore, and ${he} examines it closely, but ${he} can't find much difference. ${He} likely won't realize what happened${(slave.ballType === "sterile") ? ` given that ${he} couldn't get girls pregnant in the first place` : `, but may piece things together when ${he} realizes the girls ${he} fucks never get pregnant`}. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${His} groin is a little sore, and ${he} examines it closely, but ${he} can't find much difference. ${He} likely won't realize what happened${(slave.ballType === "sterile") ? ` given that ${he} couldn't get girls pregnant in the first place` : `, but may piece things together when ${he} realizes the girls ${he} fucks never get pregnant`}. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "vasectomy undo": r.push(`${His} groin is a little sore, and ${he} examines it closely, but ${he} can't find much difference. ${He} likely won't ever realize what happened`); @@ -1737,7 +1737,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`until ${he} gets a girl pregnant.`); } - r.push(`As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "chem castrate": r.push(`${He} knows something has been done to ${his} testicles, but ${he} can't feel anything off about them. Since the surgery was nothing more than a simple injection, ${he} has been spared any pain.`); @@ -1757,20 +1757,20 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { slave.devotion -= 5; } } - r.push(`As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "endejac": - r.push(`${His} groin is a little sore, and ${he} examines it closely, but ${he} can't find much difference other than the swelling in ${his} crotch has gone down. ${He}'ll realize later when ${his} next ejaculation is rather underwhelming from what ${he} has become accustomed to. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${His} groin is a little sore, and ${he} examines it closely, but ${he} can't find much difference other than the swelling in ${his} crotch has gone down. ${He}'ll realize later when ${his} next ejaculation is rather underwhelming from what ${he} has become accustomed to. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "butt": if (slave.fetish === "mindbroken") { - r.push(`${He} doesn't notice that ${his} butt has gotten larger. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} doesn't notice that ${his} butt has gotten larger. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 20 && strongKnownFet("buttslut")) { - r.push(`${He} gently flexes ${his} sore buttocks with a sigh of pleasure. ${He}'s <span class="hotpink">deliriously happy</span> to have a bigger butt, since ${he} confidently expects that this will mean more cocks being shoved up ${his} asshole. ${He}'s so pleased that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} gently flexes ${his} sore buttocks with a sigh of pleasure. ${He}'s <span class="hotpink">deliriously happy</span> to have a bigger butt, since ${he} confidently expects that this will mean more cocks being shoved up ${his} asshole. ${He}'s so pleased that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 4; } else if (slave.devotion > 50) { - r.push(`${He} rubs ${his} new butt experimentally and turns to you with a smile to show it off. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see it from all angles. <span class="hotpink">${He}'s happy with your changes to ${his} ass.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} rubs ${his} new butt experimentally and turns to you with a smile to show it off. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see it from all angles. <span class="hotpink">${He}'s happy with your changes to ${his} ass.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (canSee(slave)) { @@ -1778,7 +1778,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} shifts ${his} new butt`); } - r.push(`skeptically. ${He}'s still sore, so ${he} doesn't touch it. ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`skeptically. ${He}'s still sore, so ${he} doesn't touch it. ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (canSee(slave)) { @@ -1786,14 +1786,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`The new weight in ${his} backside fills ${him}`); } - r.push(`with resentment. ${He}'s still sore, so ${he} doesn't touch them, but ${he} glares daggers. ${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this fake ass as a cruel imposition.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`with resentment. ${He}'s still sore, so ${he} doesn't touch them, but ${he} glares daggers. ${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this fake ass as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } break; case "buttLoss": if (slave.fetish === "mindbroken") { - r.push(`${He} doesn't notice that ${his} butt has gotten smaller. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} doesn't notice that ${his} butt has gotten smaller. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He}`); if (canSee(slave)) { @@ -1801,7 +1801,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} jiggles`); } - r.push(` ${his} new, sleeker derrière and turns to you with a smile and a flirty little roll of ${his} hips. ${He}'s still sore, so ${he} doesn't bounce ${his} tighter buttocks for you, but ${he} seems happy all the same. <span class="hotpink">${He}'s happy with your changes to ${his} buttocks.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(` ${his} new, sleeker derrière and turns to you with a smile and a flirty little roll of ${his} hips. ${He}'s still sore, so ${he} doesn't bounce ${his} tighter buttocks for you, but ${he} seems happy all the same. <span class="hotpink">${He}'s happy with your changes to ${his} buttocks.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { r.push(`${He}`); @@ -1816,7 +1816,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { r.push(`${He} shifts ${his} diminished ass with resentment.`); @@ -1825,7 +1825,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${heGlaresDaggers}.`); } - r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this surgical ass theft as a cruel imposition.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this surgical ass theft as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } @@ -1833,7 +1833,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { case "face": r.push(faceIncrease(slave, 20)); if (slave.fetish === "mindbroken") { - r.push(`${He} doesn't notice the improvements to ${his} face, but ${he}'s not the one looking at it. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} doesn't notice the improvements to ${his} face, but ${he}'s not the one looking at it. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He}`); if (canSee(slave)) { @@ -1841,7 +1841,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`listens closely to the description of ${his} new face. ${He}`); } - r.push(`hopes you'll like ${his} new face better and use ${him} more frequently as a result. <span class="hotpink">${He}'s happy with your changes to ${his} face.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`hopes you'll like ${his} new face better and use ${him} more frequently as a result. <span class="hotpink">${He}'s happy with your changes to ${his} face.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { r.push(`${He}`); @@ -1850,7 +1850,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`listens closely to the description of ${his} new face. ${He}`); } - r.push(`hopes you'll like ${his} new face better and treat ${him} more kindly as a result. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`hopes you'll like ${his} new face better and treat ${him} more kindly as a result. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { r.push(`${He}`); @@ -1859,14 +1859,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`listens closely to the description of ${his} new face,`); } - r.push(`which ${he} hates, though ${he} hopes you'll like ${his} new face better and punish ${him} less cruelly as a result. For now, <span class="mediumorchid">${he} seems to view this fake face as a cruel imposition.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`which ${he} hates, though ${he} hopes you'll like ${his} new face better and punish ${him} less cruelly as a result. For now, <span class="mediumorchid">${he} seems to view this fake face as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } break; case "age": if (slave.fetish === "mindbroken") { - r.push(`${He} doesn't notice the improvements to ${his} face, but ${he}'s not the one looking at it. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} doesn't notice the improvements to ${his} face, but ${he}'s not the one looking at it. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He}`); if (canSee(slave)) { @@ -1874,7 +1874,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`listens closely to the description of ${his} new younger self with approval.`); } - r.push(`${He} doesn't recognize ${his} youthful yet artificial appearance yet, but ${he} resolves to back ${his} new appearance up with youthful energy and cheer. <span class="hotpink">${He}'s very happy you used surgery to reverse ${his} apparent aging.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} doesn't recognize ${his} youthful yet artificial appearance yet, but ${he} resolves to back ${his} new appearance up with youthful energy and cheer. <span class="hotpink">${He}'s very happy you used surgery to reverse ${his} apparent aging.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 10; } else if (slave.devotion >= -20) { r.push(`${He}`); @@ -1883,7 +1883,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`listens to the description of ${his} youthful yet artificial appearance`); } - r.push(`with hesitation. The cosmetic surgery is extremely well done, and ${he} eventually decides that being subjected to surgery without ${his} consent is <span class="hotpink">acceptable,</span> if it's being used to make ${him} look so young and pretty. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`with hesitation. The cosmetic surgery is extremely well done, and ${he} eventually decides that being subjected to surgery without ${his} consent is <span class="hotpink">acceptable,</span> if it's being used to make ${him} look so young and pretty. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else { r.push(`${He}`); @@ -1892,12 +1892,12 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`listens to the description of ${his} youthful yet artificial appearance`); } - r.push(`with confusion. The cosmetic surgery is extremely well done, and ${he} eventually decides that being subjected to surgery without ${his} consent isn't worth fighting against, if it's being used to make ${him} look younger. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`with confusion. The cosmetic surgery is extremely well done, and ${he} eventually decides that being subjected to surgery without ${his} consent isn't worth fighting against, if it's being used to make ${him} look younger. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } break; case "eyeFix": - r.push(`The laser eye surgery is brief, with <span class="health.dec">nothing more than minor health effects.</span> As soon as ${he} is allowed to open ${his} eyes and look around, ${his} gaze flicks from object to object with manic speed as ${he} processes ${his} newly clear vision. Seeing the world as it is without glasses or contact lenses is a gift that those who do not need it cannot properly understand.`); + r.push(`The laser eye surgery is brief, with <span class="health dec">nothing more than minor health effects.</span> As soon as ${he} is allowed to open ${his} eyes and look around, ${his} gaze flicks from object to object with manic speed as ${he} processes ${his} newly clear vision. Seeing the world as it is without glasses or contact lenses is a gift that those who do not need it cannot properly understand.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { slave.devotion += 5; slave.trust += 5; @@ -1911,7 +1911,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } break; case "eyeBlur": - r.push(`The laser eye surgery is brief, with <span class="health.dec">nothing more than minor health effects.</span> As soon as ${he} is allowed to open ${his} eyes and look around, ${he} begins to glance back and forth frantically, not immediately understanding that this blurred world is ${his} new reality.`); + r.push(`The laser eye surgery is brief, with <span class="health dec">nothing more than minor health effects.</span> As soon as ${he} is allowed to open ${his} eyes and look around, ${he} begins to glance back and forth frantically, not immediately understanding that this blurred world is ${his} new reality.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 50) { r.push(`When ${he} finally figures it out, ${he} begins to weep, not understanding why it's necessary that ${he} not be able to see clearly. After a short cry that trails off into a few sniffles, ${he} carries on.`); @@ -1926,7 +1926,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } break; case "earFix": - r.push(`The inner ear surgery is brief, with <span class="health.dec">nothing more than minor health effects.</span> As soon as ${he} is allowed to open ${his} eyes and look around, ${his} gaze flicks from object to object with manic speed as ${he} identifies each and every newly clear sound. Hearing the world as it is without hearing aids is a gift that those who do not need it cannot properly understand.`); + r.push(`The inner ear surgery is brief, with <span class="health dec">nothing more than minor health effects.</span> As soon as ${he} is allowed to open ${his} eyes and look around, ${his} gaze flicks from object to object with manic speed as ${he} identifies each and every newly clear sound. Hearing the world as it is without hearing aids is a gift that those who do not need it cannot properly understand.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { slave.devotion += 5; slave.trust += 5; @@ -1940,7 +1940,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } break; case "earMuffle": - r.push(`The inner ear surgery is brief, with <span class="health.dec">nothing more than minor health effects.</span> As soon as ${he} is allowed to open ${his} eyes and look around, ${he} begins to glance back and forth frantically, not immediately understanding that this muffled world is ${his} new reality.`); + r.push(`The inner ear surgery is brief, with <span class="health dec">nothing more than minor health effects.</span> As soon as ${he} is allowed to open ${his} eyes and look around, ${he} begins to glance back and forth frantically, not immediately understanding that this muffled world is ${his} new reality.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 50) { r.push(`When ${he} finally figures it out, ${he} begins to weep, not understanding why it's necessary that ${he} not be able to hear clearly. After a short cry that trails off into a few sniffles, ${he} carries on.`); @@ -1961,7 +1961,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} can't discern the changes to ${his} race and likely never will.`); } - r.push(`As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He}`); if (canSee(slave)) { @@ -1977,7 +1977,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} doesn't recognize ${himself} quite yet, but`); } - r.push(` ${he} hopes you'll like ${his} new appearance better and use ${him} more frequently as a result. <span class="hotpink">${He}'s happy with your changes to ${his} racial appearance.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(` ${he} hopes you'll like ${his} new appearance better and use ${him} more frequently as a result. <span class="hotpink">${He}'s happy with your changes to ${his} racial appearance.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { r.push(`${He}`); @@ -1994,7 +1994,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} doesn't recognize ${himself} quite yet, but`); } - r.push(` ${he} hopes you'll like ${his} new appearance better and treat ${him} more kindly as a result. As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(` ${he} hopes you'll like ${his} new appearance better and treat ${him} more kindly as a result. As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { r.push(`${He}`); @@ -2015,23 +2015,23 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { if (slave.race !== slave.origRace) { r.push(`fake`); } - r.push(`racial appearance as a cruel imposition.</span> As with all invasive surgery <span class="health.dec">${his} health has been affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`racial appearance as a cruel imposition.</span> As with all invasive surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } break; case "lips": if (slave.fetish === "mindbroken") { - r.push(`${He} vaguely realizes ${his} mouth doesn't move as well as it used to. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} vaguely realizes ${his} mouth doesn't move as well as it used to. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 20 && strongKnownFet("cumslut")) { - r.push(`${He} licks ${his} new lips experimentally but doesn't lose much time before turning to you with ${his} mouth open and ready. ${He}'s still sore, so ${he}'s careful, but ${he} runs ${his} wet tongue over ${his} lips, already panting at the thought of sucking dick. If ${he} had much in the way of oral skills, <span class="red">they've likely suffered.</span> <span class="hotpink">${He}'s happy with your changes to ${his} lips,</span> so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} licks ${his} new lips experimentally but doesn't lose much time before turning to you with ${his} mouth open and ready. ${He}'s still sore, so ${he}'s careful, but ${he} runs ${his} wet tongue over ${his} lips, already panting at the thought of sucking dick. If ${he} had much in the way of oral skills, <span class="red">they've likely suffered.</span> <span class="hotpink">${He}'s happy with your changes to ${his} lips,</span> so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 4; if (slave.skill.oral > 10) { slave.skill.oral -= 10; } } else if (slave.devotion > 50) { - r.push(`${He} puckers ${his} new lips experimentally and turns to you with a smile to show them off. ${He}'s still sore, so ${he}'s careful as ${he} blows you an awkward kiss. If ${he} had much in the way of oral skills, <span class="red">they've likely suffered.</span> <span class="hotpink">${He}'s happy with your changes to ${his} lips.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} puckers ${his} new lips experimentally and turns to you with a smile to show them off. ${He}'s still sore, so ${he}'s careful as ${he} blows you an awkward kiss. If ${he} had much in the way of oral skills, <span class="red">they've likely suffered.</span> <span class="hotpink">${He}'s happy with your changes to ${his} lips.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; if (slave.skill.oral > 10) { slave.skill.oral -= 10; @@ -2043,7 +2043,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`puckers`); } - r.push(` ${his} new lips skeptically. ${He}'s still sore, so ${he} doesn't touch them. ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally, <span class="red">but if ${he} had much in the way of oral skills, they've likely suffered.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(` ${his} new lips skeptically. ${He}'s still sore, so ${he} doesn't touch them. ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally, <span class="red">but if ${he} had much in the way of oral skills, they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; if (slave.skill.oral > 10) { slave.skill.oral -= 10; @@ -2055,7 +2055,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`puckers`); } - r.push(`${his} new lips with resentment. ${He}'s still sore, so ${he} doesn't touch them, but ${heGlaresDaggers}. ${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. If ${he} had much in the way of oral skills, <span class="red">they've likely suffered.</span> For now, <span class="mediumorchid">${he} seems to view these fake lips as a cruel imposition.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${his} new lips with resentment. ${He}'s still sore, so ${he} doesn't touch them, but ${heGlaresDaggers}. ${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. If ${he} had much in the way of oral skills, <span class="red">they've likely suffered.</span> For now, <span class="mediumorchid">${he} seems to view these fake lips as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; if (slave.skill.oral > 10) { @@ -2065,14 +2065,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { break; case "liposuction": if (slave.fetish === "mindbroken") { - r.push(`${He} notices that ${he} is quite lighter than ${he} used to be. As with all surgeries, <span class="health.dec">${his} health has been affected.</span>`); + r.push(`${He} notices that ${he} is quite lighter than ${he} used to be. As with all surgeries, <span class="health dec">${his} health has been affected.</span>`); } else if (slave.behavioralFlaw === "anorexic") { if (canSee(slave)) { r.push(`${He} looks over ${his} new thin figure experimentally`); } else { r.push(`${He} shifts ${his} weight experimentally`); } - r.push(`and turns to you with a smile to show it off. As an anorexic <span class="hotpink">${he} thinks you have brought ${him} closer to the true ideal.</span> As with all surgeries, <span class="health.dec">${his} health has been affected.</span>`); + r.push(`and turns to you with a smile to show it off. As an anorexic <span class="hotpink">${he} thinks you have brought ${him} closer to the true ideal.</span> As with all surgeries, <span class="health dec">${his} health has been affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 50) { if (canSee(slave)) { @@ -2080,7 +2080,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} shifts ${his} weight experimentally`); } - r.push(`and turns to you with a smile to show it off. ${He}'s still sore, so ${he} doesn't bend or flirt, but ${he} turns around to let you see it from all angles. <span class="hotpink">${He}'s happy with your changes to ${his} body.</span> As with all surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`and turns to you with a smile to show it off. ${He}'s still sore, so ${he} doesn't bend or flirt, but ${he} turns around to let you see it from all angles. <span class="hotpink">${He}'s happy with your changes to ${his} body.</span> As with all surgery <span class="health dec">${his} health has been affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { r.push(`${He}`); @@ -2089,7 +2089,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`shifts ${his} weight`); } - r.push(`skeptically. ${He}'s still sore, so ${he} doesn't bend or touch ${himself}. ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health.dec">${his} health has been affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`skeptically. ${He}'s still sore, so ${he} doesn't bend or touch ${himself}. ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (canSee(slave)) { @@ -2097,7 +2097,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`How light ${he} feels fills ${him}`); } - r.push(`with resentment. ${He}'s still sore, so ${he} doesn't bend or touch ${himself}, but ${heGlaresDaggers}. ${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this model figure as a cruel imposition.</span> As with all surgery <span class="health.dec">${his} health has been affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`with resentment. ${He}'s still sore, so ${he} doesn't bend or touch ${himself}, but ${heGlaresDaggers}. ${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this model figure as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } @@ -2115,7 +2115,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { slave.boobs = Math.clamp(slave.boobs, 0, 50000); slave.butt = Math.clamp(slave.butt, 0, 20); if (slave.fetish === "mindbroken") { - r.push(`${He} notices that ${his} weight is slightly off, almost as if it were someplace else. As with all surgeries, <span class="health.dec">${his} health has been affected.</span>`); + r.push(`${He} notices that ${his} weight is slightly off, almost as if it were someplace else. As with all surgeries, <span class="health dec">${his} health has been affected.</span>`); } else if (slave.behavioralFlaw === "anorexic") { if (canSee(slave)) { r.push(`${He} looks over ${his} new thin figure experimentally`); @@ -2157,7 +2157,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { r.push(`${He} rubs ${his} new butt experimentally and turns to you to show it off. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see it from all angles. ${He} isn't too keen on the idea of ${his} fat being moved to ${his} butt instead of removed completely, but ${he} accepts that it isn't hanging from ${his} front any longer.`); } } - r.push(`As with all surgeries, <span class="health.dec">${his} health has been affected.</span>`); + r.push(`As with all surgeries, <span class="health dec">${his} health has been affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 50) { if (canSee(slave)) { @@ -2199,7 +2199,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { r.push(`${He} rubs ${his} new butt experimentally and turns to you with a smile to show it off. ${He}'s still sore, so ${he} doesn't bounce or squeeze, but ${he} turns from side to side to let you see it from all angles.`); } } - r.push(`As with all surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (boobFat > 0) { @@ -2235,7 +2235,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`shifts ${his} weight`); } - r.push(`skeptically. ${He}'s still sore, so ${he} doesn't bend or touch ${himself}. ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health.dec">${his} health has been affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`skeptically. ${He}'s still sore, so ${he} doesn't bend or touch ${himself}. ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (boobFat > 0) { @@ -2265,7 +2265,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`How light ${he} feels fills ${him}`); } - r.push(`with resentment. ${He}'s still sore, so ${he} doesn't bend or touch ${himself}, but ${heGlaresDaggers}. ${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this model figure as a cruel imposition.</span> As with all surgery <span class="health.dec">${his} health has been affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`with resentment. ${He}'s still sore, so ${he} doesn't bend or touch ${himself}, but ${heGlaresDaggers}. ${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this model figure as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 15; slave.devotion -= 5; } @@ -2280,14 +2280,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { break; case "lipo": if (slave.fetish === "mindbroken") { - r.push(`While ${he} notices how sore ${his} waist is, ${he} fails to find the reason why. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`While ${he} notices how sore ${his} waist is, ${he} fails to find the reason why. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.behavioralFlaw === "anorexic") { if (canSee(slave)) { r.push(`${He} looks over ${his} new waist experimentally`); } else { r.push(`${He} shifts ${his} weight experimentally`); } - r.push(`and turns to you with a smile to show it off. As an anorexic <span class="hotpink">${he} thinks you have brought ${him} closer to the true ideal.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`and turns to you with a smile to show it off. As an anorexic <span class="hotpink">${he} thinks you have brought ${him} closer to the true ideal.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 50) { if (canSee(slave)) { @@ -2295,7 +2295,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`${He} shifts ${his} weight experimentally`); } - r.push(`and turns to you with a smile to show it off. ${He}'s still sore, so ${he} doesn't bend or flirt, but ${he} turns around to let you see it from all angles. <span class="hotpink">${He}'s happy with your changes to ${his} waist.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`and turns to you with a smile to show it off. ${He}'s still sore, so ${he} doesn't bend or flirt, but ${he} turns around to let you see it from all angles. <span class="hotpink">${He}'s happy with your changes to ${his} waist.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { r.push(`${He}`); @@ -2304,7 +2304,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`shifts ${his} weight`); } - r.push(`skeptically. ${He}'s still sore, so ${he} doesn't bend or touch ${himself}. ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`skeptically. ${He}'s still sore, so ${he} doesn't bend or touch ${himself}. ${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (canSee(slave)) { @@ -2312,14 +2312,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`How light ${he} feels fills ${him}`); } - r.push(`with resentment. ${He}'s still sore, so ${he} doesn't bend or touch ${himself}, but ${heGlaresDaggers}. ${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this fake figure as a cruel imposition.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`with resentment. ${He}'s still sore, so ${he} doesn't bend or touch ${himself}, but ${heGlaresDaggers}. ${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this fake figure as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } break; case "ribs": if (slave.fetish === "mindbroken") { - r.push(`${He}'s desperately stiff and sore. It takes a good while for ${him} to figure out what has happened, but eventually ${his} careful investigations discern that the cause is ${his} new extremely narrow waist. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He}'s desperately stiff and sore. It takes a good while for ${him} to figure out what has happened, but eventually ${his} careful investigations discern that the cause is ${his} new extremely narrow waist. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.behavioralFlaw === "anorexic") { r.push(`${He}'s desperately stiff and sore. It takes a good while for ${him} to figure out what has happened, but eventually ${his} careful investigations discern that the cause of ${his} extremely narrow waist is that ${his} ribcage has been shortened. ${He} gasps with shock, and when ${he}`); if (canSee(slave)) { @@ -2327,7 +2327,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`turns to face you, you see awe on ${his} face.`); } - r.push(`As an anorexic <span class="hotpink">${he} thinks you have brought ${him} closer to the true ideal.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`As an anorexic <span class="hotpink">${he} thinks you have brought ${him} closer to the true ideal.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 50) { r.push(`${He}'s desperately stiff and sore. It takes a good while for ${him} to figure out what has happened, but eventually ${his} careful investigations discern that the cause of ${his} extremely narrow waist is that ${his} ribcage has been shortened. ${He} gasps with shock, and when ${he}`); @@ -2336,19 +2336,19 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`turns to you, you see awe and fear on ${his} face.`); } - r.push(`<span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`<span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { - r.push(`${He}'s desperately stiff and sore. It takes a good while for ${him} to figure out what has happened, but eventually ${his} careful investigations discern that the cause of ${his} extremely narrow waist is that ${his} ribcage has been shortened. ${He} gasps with shock, but eventually ${his} shoulders slump and ${he} tries to carry on. ${He} isn't much affected mentally. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He}'s desperately stiff and sore. It takes a good while for ${him} to figure out what has happened, but eventually ${his} careful investigations discern that the cause of ${his} extremely narrow waist is that ${his} ribcage has been shortened. ${He} gasps with shock, but eventually ${his} shoulders slump and ${he} tries to carry on. ${He} isn't much affected mentally. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else { - r.push(`${He}'s desperately stiff and sore. It takes a good while for ${him} to figure out what has happened, but eventually ${his} careful investigations discern that the cause of ${his} extremely narrow waist is that ${his} ribcage has been shortened. ${He} gasps with shock, wobbles a little, gasps with pain at the soreness as ${he} does, and then manages to hold ${himself} upright and still as ${he} sobs. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He}'s desperately stiff and sore. It takes a good while for ${him} to figure out what has happened, but eventually ${his} careful investigations discern that the cause of ${his} extremely narrow waist is that ${his} ribcage has been shortened. ${He} gasps with shock, wobbles a little, gasps with pain at the soreness as ${he} does, and then manages to hold ${himself} upright and still as ${he} sobs. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 10; } break; case "mtf": if (slave.fetish === "mindbroken") { - r.push(`Surprisingly, ${he} already realized while exiting that ${his} genitalia was completely reshaped. The reasons why are lost to ${him}, though. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`Surprisingly, ${he} already realized while exiting that ${his} genitalia was completely reshaped. The reasons why are lost to ${him}, though. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { r.push(`Of course, ${he} already realized while exiting that ${his} genitalia was completely reshaped. As a shemale slave ${he} knew this day might come, and ${his} face is a strange mix of hope, happiness, satisfaction, and the tiniest tinge of soul-crushing sadness as ${he}`); if (canSee(slave)) { @@ -2356,7 +2356,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`feels`); } - r.push(`the vagina that has replaced ${his} penis. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`the vagina that has replaced ${his} penis. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { r.push(`Of course, ${he} already realized while exiting that ${his} genitalia was completely reshaped. As a shemale slave ${he} knew this day might come, and ${his} face is a strange mix of fear, hope, and resignation as ${he}`); @@ -2365,11 +2365,11 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`feels`); } - r.push(`the vagina that has replaced ${his} penis. Eventually ${his} shoulders slump and ${he} tries to carry on. <span class="mediumorchid">${He} will struggle with feelings of confusion and loss.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`the vagina that has replaced ${his} penis. Eventually ${his} shoulders slump and ${he} tries to carry on. <span class="mediumorchid">${He} will struggle with feelings of confusion and loss.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } else { - r.push(`Of course, ${he} already realized while exiting that ${his} genitalia was completely reshaped. As a shemale slave ${he} knew this day might come, but expectations and the reality are two different things. ${He}'s beside ${himself}, weeping gently. ${He} absently moves a hand to where ${his} penis would have been and snatches it away with a sob. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">cripplingly afraid</span> of your total power over ${his} body.`); + r.push(`Of course, ${he} already realized while exiting that ${his} genitalia was completely reshaped. As a shemale slave ${he} knew this day might come, but expectations and the reality are two different things. ${He}'s beside ${himself}, weeping gently. ${He} absently moves a hand to where ${his} penis would have been and snatches it away with a sob. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">cripplingly afraid</span> of your total power over ${his} body.`); slave.trust -= 20; slave.devotion -= 20; } @@ -2380,7 +2380,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { break; case "ntf": if (slave.fetish === "mindbroken") { - r.push(`Surprisingly, ${he} already realized while exiting that ${his} genitalia was completely reshaped. The reasons why are lost to ${him}, though. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`Surprisingly, ${he} already realized while exiting that ${his} genitalia was completely reshaped. The reasons why are lost to ${him}, though. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { r.push(`Of course, ${he} already realized while exiting that ${his} genitalia was completely reshaped. ${He} can only be happy that ${he}`); if (slave.genes === "XX") { @@ -2388,7 +2388,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`now has a hole other than ${his} anus to pleasure ${himself} with.`); } - r.push(`<span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`<span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { r.push(`Of course, ${he} already realized while exiting that ${his} genitalia was completely reshaped. ${He} didn't expect`); @@ -2403,7 +2403,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`feels`); } - r.push(`the vagina that now adorns ${his} formerly featureless crotch. Eventually ${his} shoulders slump and ${he} tries to carry on knowing that this is just another hole for your amusement, not ${hers}. <span class="mediumorchid">${He} will struggle with feelings of confusion over just what your plans for ${him} are.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`the vagina that now adorns ${his} formerly featureless crotch. Eventually ${his} shoulders slump and ${he} tries to carry on knowing that this is just another hole for your amusement, not ${hers}. <span class="mediumorchid">${He} will struggle with feelings of confusion over just what your plans for ${him} are.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } else { @@ -2413,34 +2413,34 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`to be given a hole other than ${his} anus,`); } - r.push(`but expectations and the reality are two different things. ${He}'s beside ${himself}, weeping gently. ${He} absently moves a hand to where there used to be nothing and snatches it away with a sob, knowing this was done for yourself, not ${him}. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">cripplingly afraid</span> of your total power over ${his} body.`); + r.push(`but expectations and the reality are two different things. ${He}'s beside ${himself}, weeping gently. ${He} absently moves a hand to where there used to be nothing and snatches it away with a sob, knowing this was done for yourself, not ${him}. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">cripplingly afraid</span> of your total power over ${his} body.`); slave.trust -= 20; slave.devotion -= 20; } break; case "herm": if (slave.fetish === "mindbroken") { - r.push(`Surprisingly, ${he} already realized while exiting that ${his} genitalia has been heavily augmented. The reasons why are lost to ${him}, though. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`Surprisingly, ${he} already realized while exiting that ${his} genitalia has been heavily augmented. The reasons why are lost to ${him}, though. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { - r.push(`${He} already realized while exiting that ${his} genitalia has been heavily augmented. ${He}'s almost beside ${himself} with joy: ${he} now has three holes for ${his} beloved ${getWrittenTitle(slave)} to fuck, and ${heP} even allowed ${him} to retain ${his} dick! <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} already realized while exiting that ${his} genitalia has been heavily augmented. ${He}'s almost beside ${himself} with joy: ${he} now has three holes for ${his} beloved ${getWrittenTitle(slave)} to fuck, and ${heP} even allowed ${him} to retain ${his} dick! <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 10; } else if (slave.devotion > 20) { - r.push(`${He} already realized while exiting that ${his} genitalia has been heavily augmented. ${His} efforts to cope with this radical development are palpable. ${He} retains ${his} penis, to ${his} considerable surprise; and ${he} also has a pussy. ${He} hardly knows what to think or who to be. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} already realized while exiting that ${his} genitalia has been heavily augmented. ${His} efforts to cope with this radical development are palpable. ${He} retains ${his} penis, to ${his} considerable surprise; and ${he} also has a pussy. ${He} hardly knows what to think or who to be. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 4; } else { - r.push(`${He} already realized while exiting that ${his} genitalia has been heavily augmented. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> ${He} is not as angry as ${he} might otherwise have been, since you left ${him} ${his} dick, but ${he} has a hole where there was none before. ${He} views it with hatred and revulsion. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} already realized while exiting that ${his} genitalia has been heavily augmented. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> ${He} is not as angry as ${he} might otherwise have been, since you left ${him} ${his} dick, but ${he} has a hole where there was none before. ${He} views it with hatred and revulsion. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 10; } break; case "geld": if (slave.fetish === "mindbroken") { - r.push(`Surprisingly, ${he} already realized while exiting that ${his} scrotum was gone. The reasons why are lost to ${him}, though. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`Surprisingly, ${he} already realized while exiting that ${his} scrotum was gone. The reasons why are lost to ${him}, though. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { - r.push(`Of course, ${he} already realized while exiting that ${his} scrotum was gone. ${He} was already accepting of ${his} role as an effectively female slave, a receptacle for cock, and ${he} now understands that you no longer think it will ever again be necessary for ${him} to cum. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`Of course, ${he} already realized while exiting that ${his} scrotum was gone. ${He} was already accepting of ${his} role as an effectively female slave, a receptacle for cock, and ${he} now understands that you no longer think it will ever again be necessary for ${him} to cum. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { - r.push(`Of course, ${he} already realized while exiting that ${his} scrotum was gone. ${He} was already struggling to accept ${his} role as a female slave, a receptacle for cock, and ${he} now understands it better. ${He} has not yet accepted that ${he} will never again fuck, though, that ${his} future is nothing but getting fucked. <span class="mediumorchid">${He} will struggle with feelings of confusion and loss.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`Of course, ${he} already realized while exiting that ${his} scrotum was gone. ${He} was already struggling to accept ${his} role as a female slave, a receptacle for cock, and ${he} now understands it better. ${He} has not yet accepted that ${he} will never again fuck, though, that ${his} future is nothing but getting fucked. <span class="mediumorchid">${He} will struggle with feelings of confusion and loss.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } else { @@ -2448,7 +2448,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { if (hasAnyArms(slave)) { r.push(`${He} absently moves a hand to where ${his} balls would have been and snatches it away with a sob.`); } - r.push(`<span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">cripplingly afraid</span> of your total power over ${his} body.`); + r.push(`<span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">cripplingly afraid</span> of your total power over ${his} body.`); slave.trust -= 20; slave.devotion -= 20; } @@ -2458,7 +2458,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } break; case "prostate": - r.push(`It's not immediately apparent to ${him} what kind of surgery ${he} received, since all ${he}'s left with is a terrible nonspecific ache in ${his} lower parts. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`It's not immediately apparent to ${him} what kind of surgery ${he} received, since all ${he}'s left with is a terrible nonspecific ache in ${his} lower parts. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 50) { if (slave.anus === 0) { @@ -2554,13 +2554,13 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { slave.devotion -= 20; } } - r.push(`Naturally, <span class="health.dec">${his} health has been greatly affected</span> by such serious surgery.`); + r.push(`Naturally, <span class="health dec">${his} health has been greatly affected</span> by such serious surgery.`); slave.chastityPenis = 0; slave.dickAccessory = "none"; break; case "relocate": if (slave.fetish === "mindbroken") { - r.push(`When ${he} begins surgical recovery, ${his} groin hurts quite a lot, and ${he} can't quite tell what's going on down there. Since the surgery was invasive, <span class="health.dec">${his} health has been seriously affected.</span>`); + r.push(`When ${he} begins surgical recovery, ${his} groin hurts quite a lot, and ${he} can't quite tell what's going on down there. Since the surgery was invasive, <span class="health dec">${his} health has been seriously affected.</span>`); } else if (slave.devotion > 50) { r.push(`When ${he} begins surgical recovery, ${his} groin hurts quite a lot, and ${he} can't quite tell what's going on down there. However, ${he} was able to follow enough of the surgery to understand that ${he} still has ${his} balls, even if they're no longer visible. ${He}'s eager to`); if (canSee(slave)) { @@ -2574,21 +2574,21 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`where ${his} testicles used to be.`); } - r.push(`<span class="hotpink">${He} has become more submissive due to your reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been seriously affected.</span>`); + r.push(`<span class="hotpink">${He} has become more submissive due to your reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health dec">${his} health has been seriously affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { - r.push(`When ${he} begins surgical recovery, ${his} groin hurts quite a lot, and ${he} can't quite tell what's going on down there. However, ${he} was able to follow enough of the surgery to understand that ${he} still has ${his} balls, even if they're no longer visible. ${He}'s relieved ${he} hasn't been gelded, but ${he}'s still quite horrified. <span class="mediumorchid">${He} blames you for changing ${him} so radically.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been seriously affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`When ${he} begins surgical recovery, ${his} groin hurts quite a lot, and ${he} can't quite tell what's going on down there. However, ${he} was able to follow enough of the surgery to understand that ${he} still has ${his} balls, even if they're no longer visible. ${He}'s relieved ${he} hasn't been gelded, but ${he}'s still quite horrified. <span class="mediumorchid">${He} blames you for changing ${him} so radically.</span> Since the surgery was invasive, <span class="health dec">${his} health has been seriously affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 5; slave.devotion -= 5; } else { - r.push(`When ${he} begins surgical recovery, ${his} groin hurts quite a lot, and ${he} can't quite tell what's going on down there. ${He} spends a long time in terror, wondering whether ${he}'s been gelded, but ${he} eventually realizes that ${his} balls have merely been relocated. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been seriously affected.</span> ${He} is <span class="gold">very afraid</span> of your total power over ${his} body.`); + r.push(`When ${he} begins surgical recovery, ${his} groin hurts quite a lot, and ${he} can't quite tell what's going on down there. ${He} spends a long time in terror, wondering whether ${he}'s been gelded, but ${he} eventually realizes that ${his} balls have merely been relocated. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been seriously affected.</span> ${He} is <span class="gold">very afraid</span> of your total power over ${his} body.`); slave.trust -= 20; slave.devotion -= 20; } break; case "scrotalTuck": if (slave.fetish === "mindbroken") { - r.push(`When ${he} begins surgical recovery, ${his} groin hurts quite a lot, and ${he} can't quite tell what's going on down there. Since the surgery was invasive, <span class="health.dec">${his} health has been seriously affected.</span>`); + r.push(`When ${he} begins surgical recovery, ${his} groin hurts quite a lot, and ${he} can't quite tell what's going on down there. Since the surgery was invasive, <span class="health dec">${his} health has been seriously affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} testicles. ${He} examines them carefully`); if (canSee(slave)) { @@ -2596,7 +2596,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`by feeling alone.`); } - r.push(`Realizing that ${his} balls fit ${his} scrotum perfectly, <span class="hotpink">${he}'s very happy you'd take an interest in ${his} balls,</span> and looks forward to discovering how it moves during sex. <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`Realizing that ${his} balls fit ${his} scrotum perfectly, <span class="hotpink">${he}'s very happy you'd take an interest in ${his} balls,</span> and looks forward to discovering how it moves during sex. <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} testicles. ${He} examines them carefully`); @@ -2605,7 +2605,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`by feeling alone.`); } - r.push(`Realizing that ${his} balls fit ${his} scrotum perfectly, ${he}'s flooded with relief. ${He}'s so elated that ${he} hasn't been severely damaged that ${he} doesn't mind your taking surgical control of ${his} genitals. <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`Realizing that ${his} balls fit ${his} scrotum perfectly, ${he}'s flooded with relief. ${He}'s so elated that ${he} hasn't been severely damaged that ${he} doesn't mind your taking surgical control of ${his} genitals. <span class="health dec">${his} health has been slightly affected.</span>`); } else { r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} testicles. ${He} examines them carefully`); if (canSee(slave)) { @@ -2613,7 +2613,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`by feeling alone.`); } - r.push(`Realizing that ${his} balls fit ${his} scrotum perfectly, ${he}'s flooded with relief, since ${he} was afraid that you'd done something far more terrible. Once ${he} has time to think about it, though, ${he}'s somewhat <span class="mediumorchid">resentful,</span> since ${he} naturally feels a certain proprietary interest in ${his} own genitals. <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`Realizing that ${his} balls fit ${his} scrotum perfectly, ${he}'s flooded with relief, since ${he} was afraid that you'd done something far more terrible. Once ${he} has time to think about it, though, ${he}'s somewhat <span class="mediumorchid">resentful,</span> since ${he} naturally feels a certain proprietary interest in ${his} own genitals. <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion -= 5; } break; @@ -2661,7 +2661,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`feels`); } - r.push(`the cock that is all that remains of ${his} once-unique hermaphroditic genitalia. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`the cock that is all that remains of ${his} once-unique hermaphroditic genitalia. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { r.push(`and ${his} face is a strange mix of fear, hope, and resignation as ${he}`); @@ -2670,7 +2670,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`feels`); } - r.push(`the cock that is all that remains of ${his} once-unique hermaphroditic genitalia. Eventually ${his} shoulders slump and ${he} tries to carry on. <span class="mediumorchid">${He} will struggle with feelings of confusion and loss.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`the cock that is all that remains of ${his} once-unique hermaphroditic genitalia. Eventually ${his} shoulders slump and ${he} tries to carry on. <span class="mediumorchid">${He} will struggle with feelings of confusion and loss.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } else { @@ -2683,7 +2683,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { slave.devotion -= 20; } } - r.push(`Naturally, <span class="health.dec">${his} health has been greatly affected</span> by such serious surgery.`); + r.push(`Naturally, <span class="health dec">${his} health has been greatly affected</span> by such serious surgery.`); slave.chastityVagina = 0; slave.vaginalAccessory = "none"; slave.vaginalAttachment = "none"; @@ -2816,7 +2816,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { break; case "teeth": if (slave.fetish === "mindbroken") { - r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw, yet fails to understand ${his} teeth are now fake. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw, yet fails to understand ${his} teeth are now fake. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} is wearing prosthetic teeth that ${he} can remove. ${He} gasps with shock, but figures out the idea quickly enough by experimentally`); if (hasAnyArms(slave)) { @@ -2824,10 +2824,10 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`simulating oral sex with ${his} own tongue.`); } - r.push(`<span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`<span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { - r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} is wearing prosthetic teeth that ${he} can remove. ${He} gasps with shock, but eventually ${his} shoulders slump and ${he} tries to carry on. ${He} isn't much affected mentally. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} is wearing prosthetic teeth that ${he} can remove. ${He} gasps with shock, but eventually ${his} shoulders slump and ${he} tries to carry on. ${He} isn't much affected mentally. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else { r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} is wearing prosthetic teeth that ${he} can remove. ${He} gasps with shock, gags, spits out the prosthetics,`); if (canSee(slave)) { @@ -2835,14 +2835,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`runs ${his} tongue across ${his} empty gums,`); } - r.push(`and sobs. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`and sobs. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 10; } break; case "sharp": if (slave.fetish === "mindbroken") { - r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw, yet fails to understand that ${his} teeth have changed shape. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw, yet fails to understand that ${his} teeth have changed shape. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has teeth fit for a carnivore. ${He} seems doubtful, but then works up ${his} courage and bares them`); if (canSee(slave)) { @@ -2854,19 +2854,19 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { if (canSee(slave)) { r.push(`${himself}`); } - r.push(`for a while before laughing quietly. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`for a while before laughing quietly. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { - r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has teeth fit for a carnivore. ${He} gasps with shock, but eventually ${his} shoulders slump and ${he} tries to carry on. ${He} isn't much affected mentally. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has teeth fit for a carnivore. ${He} gasps with shock, but eventually ${his} shoulders slump and ${he} tries to carry on. ${He} isn't much affected mentally. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else { - r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has teeth fit for a carnivore. ${He} gasps with shock, accidentally gets ${his} tongue in the way in ${his} anguish, bites ${himself}, and starts gagging and spitting blood. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has teeth fit for a carnivore. ${He} gasps with shock, accidentally gets ${his} tongue in the way in ${his} anguish, bites ${himself}, and starts gagging and spitting blood. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 10; } break; case "fangs": if (slave.fetish === "mindbroken") { - r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw, yet fails to understand that ${his} teeth have changed shape. Since the surgery was moderately invasive, <span class="health.dec">${his} health has been somewhat affected.</span>`); + r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw, yet fails to understand that ${his} teeth have changed shape. Since the surgery was moderately invasive, <span class="health dec">${his} health has been somewhat affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has a pair of fangs. ${He} seems doubtful, but then works up ${his} courage and bares them`); if (canSee(slave)) { @@ -2878,18 +2878,18 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { if (canSee(slave)) { r.push(`${himself}`); } - r.push(`for a while before laughing quietly. Since the surgery was moderately invasive, <span class="health.dec">${his} health has been somewhat affected.</span>`); + r.push(`for a while before laughing quietly. Since the surgery was moderately invasive, <span class="health dec">${his} health has been somewhat affected.</span>`); } else if (slave.devotion > 20) { - r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has teeth fit for a carnivore. ${He} gasps with shock, but eventually ${his} shoulders slump and ${he} tries to carry on. ${He} isn't much affected mentally. Since the surgery was moderately invasive, <span class="health.dec">${his} health has been somewhat affected.</span>`); + r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has teeth fit for a carnivore. ${He} gasps with shock, but eventually ${his} shoulders slump and ${he} tries to carry on. ${He} isn't much affected mentally. Since the surgery was moderately invasive, <span class="health dec">${his} health has been somewhat affected.</span>`); } else { - r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has a pair of fangs. ${He} gasps with shock, accidentally gets ${his} lip in the way in ${his} anguish, bites ${himself}, and starts gagging and spitting blood. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was moderately invasive, <span class="health.dec">${his} health has been somewhat affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has a pair of fangs. ${He} gasps with shock, accidentally gets ${his} lip in the way in ${his} anguish, bites ${himself}, and starts gagging and spitting blood. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was moderately invasive, <span class="health dec">${his} health has been somewhat affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 10; } break; case "fang": if (slave.fetish === "mindbroken") { - r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw, yet fails to understand that ${his} teeth have changed shape. Since the surgery was moderately invasive, <span class="health.dec">${his} health has been somewhat affected.</span>`); + r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw, yet fails to understand that ${his} teeth have changed shape. Since the surgery was moderately invasive, <span class="health dec">${his} health has been somewhat affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has a fang. ${He} seems doubtful,`); if (slave.lips <= 50) { @@ -2897,11 +2897,11 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`especially when he tries to close ${his} mouth only to find ${his} fat lip keeps meeting the tip of ${his} tooth.`); } - r.push(`Since the surgery was moderately invasive, <span class="health.dec">${his} health has been somewhat affected.</span>`); + r.push(`Since the surgery was moderately invasive, <span class="health dec">${his} health has been somewhat affected.</span>`); } else if (slave.devotion > 20) { - r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has a fang. ${He} gasps with shock, but eventually ${his} shoulders slump and ${he} tries to carry on. ${He} isn't much affected mentally. Since the surgery was moderately invasive, <span class="health.dec">${his} health has been somewhat affected.</span>`); + r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has a fang. ${He} gasps with shock, but eventually ${his} shoulders slump and ${he} tries to carry on. ${He} isn't much affected mentally. Since the surgery was moderately invasive, <span class="health dec">${his} health has been somewhat affected.</span>`); } else { - r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has a fang ${He} gasps with shock, accidentally gets ${his} lip in the way in ${his} anguish, bites ${himself}, and starts gagging and spitting blood. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was moderately invasive, <span class="health.dec">${his} health has been somewhat affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} clearly feels quite normal except for a vague ache around ${his} jaw. It takes a good while for ${him} to figure out what has happened, but eventually ${he} gets enough sensation in ${his} mouth to realize that ${he} now has a fang ${He} gasps with shock, accidentally gets ${his} lip in the way in ${his} anguish, bites ${himself}, and starts gagging and spitting blood. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was moderately invasive, <span class="health dec">${his} health has been somewhat affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 10; } @@ -2913,11 +2913,11 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`runs ${his} tongue over ${his} teeth`); } - r.push(`repeatedly before accepting that nothing too unusual has happened, and that ${he} now appears to have a fully functional set of normal teeth. Though ${he}'s surprised that nothing outlandish has been done, ${he} carries on as usual. Since the surgery was moderately invasive, <span class="health.dec">${his} health has been somewhat affected.</span>`); + r.push(`repeatedly before accepting that nothing too unusual has happened, and that ${he} now appears to have a fully functional set of normal teeth. Though ${he}'s surprised that nothing outlandish has been done, ${he} carries on as usual. Since the surgery was moderately invasive, <span class="health dec">${his} health has been somewhat affected.</span>`); break; case "mute": if (slave.fetish === "mindbroken") { - r.push(`${He} clearly feels quite normal except for a vague ache around ${his} larynx. It takes a good while for ${him} to figure out what has happened, but eventually ${he} tries to speak and makes no sound. ${He} simply keeps trying for some time before accepting this is how things are. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} clearly feels quite normal except for a vague ache around ${his} larynx. It takes a good while for ${him} to figure out what has happened, but eventually ${he} tries to speak and makes no sound. ${He} simply keeps trying for some time before accepting this is how things are. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He} clearly feels quite normal except for a vague ache around ${his} larynx. It takes a good while for ${him} to figure out what has happened, but eventually ${he} tries to speak and makes no sound. ${He} panics, but manages to control ${himself} at length and begins to think.`); if (canSee(slave)) { @@ -2931,14 +2931,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`After more thought, ${he} simply rolls over facing away from you and winks ${his} asshole to offer ${himself} to you.`); } - r.push(`<span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} being.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`<span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} being.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { - r.push(`${He} clearly feels quite normal except for a vague ache around ${his} larynx. It takes a good while for ${him} to figure out what has happened, but eventually ${he} tries to speak and makes no sound. ${He} panics, trying to scream or protest but only managing to cry. Eventually ${he} pulls ${himself} together. <span class="mediumorchid">${He} will struggle with ${his} medically created disability.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} clearly feels quite normal except for a vague ache around ${his} larynx. It takes a good while for ${him} to figure out what has happened, but eventually ${he} tries to speak and makes no sound. ${He} panics, trying to scream or protest but only managing to cry. Eventually ${he} pulls ${himself} together. <span class="mediumorchid">${He} will struggle with ${his} medically created disability.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 10; } else { - r.push(`${He} clearly feels quite normal except for a vague ache around ${his} larynx. It takes a good while for ${him} to figure out what has happened, but eventually ${he} tries to speak and makes no sound. ${He} panics, trying to scream or protest but only managing to cry. As long as ${he} remains unbent to your will, ${he} will have a constant, inescapable reminder of who and what you are. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">cripplingly afraid</span> of your total power over ${his} body.`); + r.push(`${He} clearly feels quite normal except for a vague ache around ${his} larynx. It takes a good while for ${him} to figure out what has happened, but eventually ${he} tries to speak and makes no sound. ${He} panics, trying to scream or protest but only managing to cry. As long as ${he} remains unbent to your will, ${he} will have a constant, inescapable reminder of who and what you are. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">cripplingly afraid</span> of your total power over ${his} body.`); slave.trust -= 20; slave.devotion -= 50; } @@ -3033,7 +3033,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { slave.devotion -= 5; } } - r.push(`As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "restoreVoice": if (slave.fetish === "mindbroken") { @@ -3092,11 +3092,11 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { r.push(`you for a long moment before turning away from you, towards the wall, and beginning to cry quietly. It seems ${he}'s surprised that you would do this for ${him}, and does not understand how to deal with the situation. In any case, <span class="hotpink">${he} hates you far less</span> than ${he} once did.`); slave.devotion += 10; } - r.push(`As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "voice": if (slave.fetish === "mindbroken") { - r.push(`The autosurgery instructed ${him} in no uncertain terms not to speak during recovery, but ${he} fails to recall that. ${He} doesn't notice anything different. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`The autosurgery instructed ${him} in no uncertain terms not to speak during recovery, but ${he} fails to recall that. ${He} doesn't notice anything different. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { r.push(`Before surgery, ${he} was warned repeatedly not to try talking for a while, and ${he} obeys. When ${he} finally does, ${his} voice is raspy and weak, but it gains strength gradually. It comes out`); if (slave.voice === 3) { @@ -3108,14 +3108,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`real woman.`); } - r.push(`As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { r.push(`Before surgery, ${he} was warned repeatedly not to try talking for a while, and ${he} obeys. When ${he} finally does, ${his} voice is raspy and weak, but it gains strength gradually. It comes out`); if (slave.voice === 3) { r.push(`far`); } - r.push(`higher and more girly than it was before, and ${he} laughs grimly at ${himself} as ${he} gets used to it. ${He} carries on regardless, accepting it as one more thing to learn to accept. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`higher and more girly than it was before, and ${he} laughs grimly at ${himself} as ${he} gets used to it. ${He} carries on regardless, accepting it as one more thing to learn to accept. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else { r.push(`Before surgery, ${he} was warned repeatedly not to try talking for a while, and ${he} obeys. When ${he} finally does, ${his} voice is raspy and weak, but it gains strength gradually. It comes out`); if (slave.voice === 3) { @@ -3127,14 +3127,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`feminine`); } - r.push(`voice is not ${hers}, a cruel mockery.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`voice is not ${hers}, a cruel mockery.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } break; case "voice2": if (slave.fetish === "mindbroken") { - r.push(`The autosurgery instructed ${him} in no uncertain terms not to speak during recovery, but ${he} fails to recall that. ${He} doesn't notice anything different. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`The autosurgery instructed ${him} in no uncertain terms not to speak during recovery, but ${he} fails to recall that. ${He} doesn't notice anything different. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { r.push(`Before surgery, ${he} was warned repeatedly not to try talking for a while, and ${he} obeys. When ${he} finally does, ${his} voice is raspy and weak, but it gains strength gradually. It comes out`); if (slave.voice === 1) { @@ -3146,14 +3146,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else if (slave.voice === 2) { r.push(`a mature career woman.`); } - r.push(`As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { r.push(`Before surgery, ${he} was warned repeatedly not to try talking for a while, and ${he} obeys. When ${he} finally does, ${his} voice is raspy and weak, but it gains strength gradually. It comes out`); if (slave.voice === 1) { r.push(`far`); } - r.push(`lower and more manly than it was before, and ${he} laughs grimly at ${himself} as ${he} gets used to it. ${He} carries on regardless, accepting it as one more thing to learn to accept. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`lower and more manly than it was before, and ${he} laughs grimly at ${himself} as ${he} gets used to it. ${He} carries on regardless, accepting it as one more thing to learn to accept. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else { r.push(`Before surgery, ${he} was warned repeatedly not to try talking for a while, and ${he} obeys. When ${he} finally does, ${his} voice is raspy and weak, but it gains strength gradually. It comes out`); if (slave.voice === 1) { @@ -3165,7 +3165,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else if (slave.voice === 2) { r.push(`subdued`); } - r.push(`voice is not ${hers}, a cruel mockery.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`voice is not ${hers}, a cruel mockery.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } @@ -3176,18 +3176,18 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`Before surgery, ${he} was warned repeatedly not to try talking for a while, and ${he} obeys. When ${he} finally does, ${his} voice is raspy and weak, but as it gradually gains strength ${he} notices that it sounds more natural and human than ${his} old electrolarynx.`); } - r.push(`As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "height": if (slave.fetish === "mindbroken") { - r.push(`${He} exits the surgery very slowly, since ${he}'s terribly sore and isn't yet used to the novel lengths of the legs ${he} walks on. ${He}'ll be clumsy for some time. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} exits the surgery very slowly, since ${he}'s terribly sore and isn't yet used to the novel lengths of the legs ${he} walks on. ${He}'ll be clumsy for some time. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { - r.push(`${He} exits the surgery very cautiously, since ${he}'s terribly sore and isn't yet used to the novel lengths of the legs ${he} walks on. ${He}'ll be clumsy and hesitant for some time, but ${he}'s happy with ${his} new body. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} exits the surgery very cautiously, since ${he}'s terribly sore and isn't yet used to the novel lengths of the legs ${he} walks on. ${He}'ll be clumsy and hesitant for some time, but ${he}'s happy with ${his} new body. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { - r.push(`${He} exits the surgery very cautiously, since ${he}'s terribly sore and isn't yet used to the novel lengths of the legs ${he} walks on. ${He}'ll be clumsy and hesitant for some time, but ${he}'s accepted ${his} new body. ${He} isn't much affected mentally. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} exits the surgery very cautiously, since ${he}'s terribly sore and isn't yet used to the novel lengths of the legs ${he} walks on. ${He}'ll be clumsy and hesitant for some time, but ${he}'s accepted ${his} new body. ${He} isn't much affected mentally. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else { - r.push(`${He} exits the surgery very cautiously, since ${he}'s terribly sore and isn't yet used to the novel lengths of the legs ${he} walks on. ${He}'ll be clumsy and hesitant for some time, and ${he} refuses to accept that this new body is really what ${he}'s been condemned to. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} exits the surgery very cautiously, since ${he}'s terribly sore and isn't yet used to the novel lengths of the legs ${he} walks on. ${He}'ll be clumsy and hesitant for some time, and ${he} refuses to accept that this new body is really what ${he}'s been condemned to. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 10; } @@ -3195,7 +3195,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { case "circumcision": if (slave.dick > 0) { if (slave.fetish === "mindbroken") { - r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} dick. Since it is still there, ${he} doesn't understand what changed. Circumcision of an adult is not a trivial procedure, so <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} dick. Since it is still there, ${he} doesn't understand what changed. Circumcision of an adult is not a trivial procedure, so <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} dick. ${He} examines it carefully`); if (canSee(slave)) { @@ -3203,7 +3203,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`by feeling alone.`); } - r.push(`Realizing that ${he}'s been circumcised, <span class="hotpink">${he}'s very happy you'd take an interest in ${his} penis,</span> and looks forward to having a slightly easier time keeping ${himself} clean through ${his} life as a sex slave. Circumcision of an adult is not a trivial procedure, so <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`Realizing that ${he}'s been circumcised, <span class="hotpink">${he}'s very happy you'd take an interest in ${his} penis,</span> and looks forward to having a slightly easier time keeping ${himself} clean through ${his} life as a sex slave. Circumcision of an adult is not a trivial procedure, so <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} dick. ${He} examines it carefully`); @@ -3212,7 +3212,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`by feeling alone.`); } - r.push(`Realizing that ${he}'s been circumcised, ${he}'s flooded with relief. ${He}'s so elated that ${he} hasn't been severely damaged that ${he} doesn't mind your taking surgical control of ${his} member. Circumcision of an adult is not a trivial procedure, so <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`Realizing that ${he}'s been circumcised, ${he}'s flooded with relief. ${He}'s so elated that ${he} hasn't been severely damaged that ${he} doesn't mind your taking surgical control of ${his} member. Circumcision of an adult is not a trivial procedure, so <span class="health dec">${his} health has been slightly affected.</span>`); } else { r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} dick. ${He} examines it carefully`); if (canSee(slave)) { @@ -3220,12 +3220,12 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`by feeling alone.`); } - r.push(`Realizing that ${he}'s been circumcised, ${he}'s flooded with relief, since ${he} was afraid that you'd done something far more terrible. Once ${he} has time to think about it, though, ${he}'s somewhat <span class="mediumorchid">resentful,</span> since ${he} naturally feels a certain proprietary interest in ${his} own penis. Circumcision of an adult is not a trivial procedure, so <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`Realizing that ${he}'s been circumcised, ${he}'s flooded with relief, since ${he} was afraid that you'd done something far more terrible. Once ${he} has time to think about it, though, ${he}'s somewhat <span class="mediumorchid">resentful,</span> since ${he} naturally feels a certain proprietary interest in ${his} own penis. Circumcision of an adult is not a trivial procedure, so <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion -= 5; } } else { if (slave.fetish === "mindbroken") { - r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} crotch. Since everything is still there, ${he} doesn't understand what changed. <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} crotch. Since everything is still there, ${he} doesn't understand what changed. <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He} exits the surgery gingerly, since ${he} can feel that ${his} crotch was operated on. ${He} examines it carefully`); if (canSee(slave)) { @@ -3233,7 +3233,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`by feeling alone.`); } - r.push(`Realizing that ${he}'s been circumcised, <span class="hotpink">${he}'s very happy you'd take an interest in ${his} sex,</span> and looks forward to having a slightly easier time keeping ${himself} clean through ${his} life as a sex slave. <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`Realizing that ${he}'s been circumcised, <span class="hotpink">${he}'s very happy you'd take an interest in ${his} sex,</span> and looks forward to having a slightly easier time keeping ${himself} clean through ${his} life as a sex slave. <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { r.push(`${He} exits the surgery gingerly, since ${he} can feel that ${his} crotch was operated on. ${He} examines it carefully`); @@ -3242,7 +3242,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`by feeling alone.`); } - r.push(`Realizing that ${he}'s been circumcised, ${he}'s flooded with relief. ${He}'s so elated that ${he} hasn't been severely damaged that ${he} doesn't mind minor surgical alteration. <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`Realizing that ${he}'s been circumcised, ${he}'s flooded with relief. ${He}'s so elated that ${he} hasn't been severely damaged that ${he} doesn't mind minor surgical alteration. <span class="health dec">${his} health has been slightly affected.</span>`); } else { r.push(`${He} exits the surgery gingerly, since ${he} can feel that ${his} crotch was operated on. ${He} examines it carefully`); if (canSee(slave)) { @@ -3250,14 +3250,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`by feeling alone.`); } - r.push(`Realizing that ${he}'s been circumcised, ${he}'s flooded with relief, since ${he} was afraid that you'd done something far more terrible. Once ${he} has time to think about it, though, ${he}'s somewhat <span class="mediumorchid">resentful,</span> since ${he} naturally feels a certain proprietary interest in ${his} sex. <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`Realizing that ${he}'s been circumcised, ${he}'s flooded with relief, since ${he} was afraid that you'd done something far more terrible. Once ${he} has time to think about it, though, ${he}'s somewhat <span class="mediumorchid">resentful,</span> since ${he} naturally feels a certain proprietary interest in ${his} sex. <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion -= 5; } } break; case "foreskinTuck": if (slave.fetish === "mindbroken") { - r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} dick. Since it is still there, ${he} doesn't understand what changed. <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} dick. Since it is still there, ${he} doesn't understand what changed. <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} dick. ${He} examines it carefully`); if (canSee(slave)) { @@ -3275,7 +3275,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } r.push(`${his} next erection.`); } - r.push(`<span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`<span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} dick. ${He} examines it carefully`); @@ -3284,7 +3284,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`by feeling alone.`); } - r.push(`Realizing that ${his} foreskin fits comfortably, ${he}'s flooded with relief. ${He}'s so elated that ${he} hasn't been severely damaged that ${he} doesn't mind your taking surgical control of ${his} member. <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`Realizing that ${his} foreskin fits comfortably, ${he}'s flooded with relief. ${He}'s so elated that ${he} hasn't been severely damaged that ${he} doesn't mind your taking surgical control of ${his} member. <span class="health dec">${his} health has been slightly affected.</span>`); } else { r.push(`${He} exits the surgery gingerly, since ${he} can feel that something was done to ${his} dick. ${He} examines it carefully`); if (canSee(slave)) { @@ -3292,41 +3292,41 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`by feeling alone.`); } - r.push(`Realizing that ${his} foreskin fits comfortably, ${he}'s flooded with relief, since ${he} was afraid that you'd done something far more terrible. Once ${he} has time to think about it, though, ${he}'s somewhat <span class="mediumorchid">resentful,</span> since ${he} naturally feels a certain proprietary interest in ${his} own penis. <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`Realizing that ${his} foreskin fits comfortably, ${he}'s flooded with relief, since ${he} was afraid that you'd done something far more terrible. Once ${he} has time to think about it, though, ${he}'s somewhat <span class="mediumorchid">resentful,</span> since ${he} naturally feels a certain proprietary interest in ${his} own penis. <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion -= 5; } break; case "hips": if (slave.fetish === "mindbroken") { - r.push(`${He} exits the surgery very slowly, since ${he}'s still in considerable pain and isn't yet used to the way ${his} pelvis now fits together with the rest of ${his} body. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} exits the surgery very slowly, since ${he}'s still in considerable pain and isn't yet used to the way ${his} pelvis now fits together with the rest of ${his} body. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { - r.push(`${He} exits the surgery very cautiously, since ${he}'s still in considerable pain and isn't yet used to the way ${his} pelvis now fits together with the rest of ${his} body. ${He}'ll be clumsy and hesitant for some time, but ${he}'s happy with ${his} new hips. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} exits the surgery very cautiously, since ${he}'s still in considerable pain and isn't yet used to the way ${his} pelvis now fits together with the rest of ${his} body. ${He}'ll be clumsy and hesitant for some time, but ${he}'s happy with ${his} new hips. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { - r.push(`${He} exits the surgery very cautiously, since ${he}'s still in considerable pain and isn't yet used to the way ${his} pelvis now fits together with the rest of ${his} body. ${He}'ll be clumsy and hesitant for some time, but ${he}'s accepted ${his} new hips. ${He} isn't much affected mentally. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} exits the surgery very cautiously, since ${he}'s still in considerable pain and isn't yet used to the way ${his} pelvis now fits together with the rest of ${his} body. ${He}'ll be clumsy and hesitant for some time, but ${he}'s accepted ${his} new hips. ${He} isn't much affected mentally. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else { - r.push(`${He} exits the surgery very cautiously, since ${he}'s still in considerable pain and isn't yet used to the way ${his} pelvis now fits together with the rest of ${his} body. ${He}'ll be clumsy and hesitant for some time, and ${he} refuses to accept that you are both willing and able to reshape ${him} down to ${his} very bones. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} exits the surgery very cautiously, since ${he}'s still in considerable pain and isn't yet used to the way ${his} pelvis now fits together with the rest of ${his} body. ${He}'ll be clumsy and hesitant for some time, and ${he} refuses to accept that you are both willing and able to reshape ${him} down to ${his} very bones. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 10; } break; case "shoulders": if (slave.fetish === "mindbroken") { - r.push(`${He} exits the surgery gingerly, since the changes of proportion in ${his} upper body have seriously affected ${his} sense of balance. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} exits the surgery gingerly, since the changes of proportion in ${his} upper body have seriously affected ${his} sense of balance. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { - r.push(`${He} exits the surgery gingerly, since the changes of proportion in ${his} upper body have seriously affected ${his} sense of balance, albeit temporarily. ${He}'ll be clumsy and hesitant for some time, but ${he}'s happy with ${his} new shoulders. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} exits the surgery gingerly, since the changes of proportion in ${his} upper body have seriously affected ${his} sense of balance, albeit temporarily. ${He}'ll be clumsy and hesitant for some time, but ${he}'s happy with ${his} new shoulders. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { - r.push(`${He} exits the surgery gingerly, since the changes of proportion in ${his} upper body have seriously affected ${his} sense of balance, albeit temporarily. ${He}'ll be clumsy and hesitant for some time, but ${he}'s accepted ${his} new shoulders. ${He} isn't much affected mentally. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`${He} exits the surgery gingerly, since the changes of proportion in ${his} upper body have seriously affected ${his} sense of balance, albeit temporarily. ${He}'ll be clumsy and hesitant for some time, but ${he}'s accepted ${his} new shoulders. ${He} isn't much affected mentally. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else { - r.push(`${He} exits the surgery gingerly, since the changes of proportion in ${his} upper body have seriously affected ${his} sense of balance, albeit temporarily. ${He}'ll be clumsy and hesitant for some time, and ${he} refuses to accept that you are both willing and able to reshape ${him} down to ${his} very bones. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} exits the surgery gingerly, since the changes of proportion in ${his} upper body have seriously affected ${his} sense of balance, albeit temporarily. ${He}'ll be clumsy and hesitant for some time, and ${he} refuses to accept that you are both willing and able to reshape ${him} down to ${his} very bones. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 10; } break; case "heels": if (slave.fetish === "mindbroken") { - r.push(`${He} exits the surgery on all fours, unable to stand due to the changes to ${his} legs. A whorish pair of heels are slipped onto ${him} and ${he} is forced to ${his} feet to show that ${he} can indeed walk comfortably while wearing them. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} exits the surgery on all fours, unable to stand due to the changes to ${his} legs. A whorish pair of heels are slipped onto ${him} and ${he} is forced to ${his} feet to show that ${he} can indeed walk comfortably while wearing them. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He} exits the surgery on all fours, unable to stand due to the changes to ${his} legs. ${He} finds a whorish pair of heels waiting for ${him} and eagerly puts them on, gingerly standing to find that ${he} can indeed walk comfortably while wearing them. ${He} struts back and forth experimentally and then offers`); if (canSee(slave)) { @@ -3334,10 +3334,10 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`you`); } - r.push(` ${his} asshole to check to see that ${his} ability to take a standing buttfuck hasn't been affected. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(` ${his} asshole to check to see that ${his} ability to take a standing buttfuck hasn't been affected. <span class="hotpink">${He} has become more submissive due to your radical reshaping of ${his} body.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 20) { - r.push(`${He} exits the surgery on all fours, unable to stand due to the changes to ${his} legs. ${He} finds a whorish pair of heels waiting for ${him} and obediently puts them on, gingerly standing to find that ${he} can indeed walk comfortably while wearing them. After a while ${he} realizes that ${he}'ll never walk without looking like a stripper again, but ${he} accepts it. ${He} isn't much affected mentally. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} exits the surgery on all fours, unable to stand due to the changes to ${his} legs. ${He} finds a whorish pair of heels waiting for ${him} and obediently puts them on, gingerly standing to find that ${he} can indeed walk comfortably while wearing them. After a while ${he} realizes that ${he}'ll never walk without looking like a stripper again, but ${he} accepts it. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else { r.push(`${He} exits the surgery on all fours, unable to stand due to the changes to ${his} legs. ${He} finds a whorish pair of heels waiting for ${him}, but obstinately ignores them. After some time, ${he} realizes that the situation isn't changing and puts them on, gingerly standing to find that ${he} can indeed walk comfortably while wearing them. ${His}`); if (canSee(slave)) { @@ -3351,24 +3351,24 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`discovers this is the only way ${he}'ll be able to stand now.`); } - r.push(`<span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`<span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 10; } break; case "heelsRestoration": if (slave.fetish === "mindbroken") { - r.push(`${He} exits the surgery on ${his} own two feet. ${He}'s still sore, but the modern surgery is fast and effective, and ${he} can use ${his} restored legs immediately. ${He} gingerly stands on one foot, then the other; and even takes a few little hops. ${He} obviously confused, but will get used to it soon enough. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} exits the surgery on ${his} own two feet. ${He}'s still sore, but the modern surgery is fast and effective, and ${he} can use ${his} restored legs immediately. ${He} gingerly stands on one foot, then the other; and even takes a few little hops. ${He} obviously confused, but will get used to it soon enough. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion >= -20) { - r.push(`${He} exits the surgery on ${his} own two feet. ${He}'s still sore, but the modern surgery is fast and effective, and ${he} can use ${his} restored legs immediately. ${He} gingerly stands on one foot, then the other; and even takes a few little hops. ${He}'s grinning like a fool the whole time. <span class="hotpink">${He} has become more obedient due to gratitude.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} exits the surgery on ${his} own two feet. ${He}'s still sore, but the modern surgery is fast and effective, and ${he} can use ${his} restored legs immediately. ${He} gingerly stands on one foot, then the other; and even takes a few little hops. ${He}'s grinning like a fool the whole time. <span class="hotpink">${He} has become more obedient due to gratitude.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else { - r.push(`${He} exits the surgery on ${his} own two feet. ${He}'s still sore, but the modern surgery is fast and effective, and ${he} can use ${his} restored legs immediately. ${He} gingerly stands on one foot, then the other; and even takes a few little hops. ${He} obviously confused, finding it surprising that you would go to the expense and trouble of repairing ${him}. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} exits the surgery on ${his} own two feet. ${He}'s still sore, but the modern surgery is fast and effective, and ${he} can use ${his} restored legs immediately. ${He} gingerly stands on one foot, then the other; and even takes a few little hops. ${He} obviously confused, finding it surprising that you would go to the expense and trouble of repairing ${him}. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } break; case "ampA1": if (slave.fetish === "mindbroken") { - r.push(`You're there to help ${him} with the door as ${he} exits the surgery. ${He} smiles dumbly at your generosity, already seeming to forget ${he} ever had another arm. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`You're there to help ${him} with the door as ${he} exits the surgery. ${He} smiles dumbly at your generosity, already seeming to forget ${he} ever had another arm. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { r.push(`You're there to help ${him} with the door as ${he} exits the surgery. ${He} knows what a slave's life is, but ${he} did not really expect that it would ever come to this for ${him}. After a short, silent`); if (canSee(slave)) { @@ -3376,9 +3376,9 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`consideration of`); } - r.push(`the stump that was once ${his} arm, ${he} squares ${his} shoulders and resolves to carry on being a good slave as best ${he} can. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`the stump that was once ${his} arm, ${he} squares ${his} shoulders and resolves to carry on being a good slave as best ${he} can. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 20) { - r.push(`You're there to help ${him} with the door as ${he} exits the surgery. Despite ${his} obedience, ${he} cries softly the whole time, the stump at ${his} shoulder occasionally moving as ${he} reflexively tries to grab at ${himself} and ${his} surroundings. <span class="mediumorchid">${He} will struggle greatly with ${his} medically created disability.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">immensely afraid</span> of your total power over ${his} body.`); + r.push(`You're there to help ${him} with the door as ${he} exits the surgery. Despite ${his} obedience, ${he} cries softly the whole time, the stump at ${his} shoulder occasionally moving as ${he} reflexively tries to grab at ${himself} and ${his} surroundings. <span class="mediumorchid">${He} will struggle greatly with ${his} medically created disability.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">immensely afraid</span> of your total power over ${his} body.`); slave.trust -= 8; slave.devotion -= 8; } else { @@ -3398,14 +3398,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`shoulder stump twitches pathetically with ${his} desperate efforts to move ${his} missing arm, to prove there is something other than this.`); } - r.push(`Anything other than this. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">incredibly and intensely terrified</span> of your total power over ${his} body.`); + r.push(`Anything other than this. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">incredibly and intensely terrified</span> of your total power over ${his} body.`); slave.trust -= 20; slave.devotion -= 20; } break; case "ampA2": if (slave.fetish === "mindbroken") { - r.push(`You're there to open the door for ${him} as ${he} exits the surgery. ${He} smiles dumbly at your generosity, already seeming to forget the sensation of touching. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`You're there to open the door for ${him} as ${he} exits the surgery. ${He} smiles dumbly at your generosity, already seeming to forget the sensation of touching. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { r.push(`You're there to open the door for ${him} as ${he} exits the surgery. ${He} knows what a slave's life is, but ${he} did not really expect that it would ever come to this for ${him}. After a short, silent`); if (canSee(slave)) { @@ -3413,9 +3413,9 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`consideration of`); } - r.push(`the two stumps that were once ${his} arms, ${he} squares ${his} shoulders and resolves to carry on being a good slave as best ${he} can. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`the two stumps that were once ${his} arms, ${he} squares ${his} shoulders and resolves to carry on being a good slave as best ${he} can. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 20) { - r.push(`You're there to open the door for ${him} as ${he} exits the surgery. Despite ${his} obedience, ${he} cries softly the whole time, ${his} shoulder stumps occasionally moving as ${he} reflexively tries to grab at ${himself} and ${his} surroundings. <span class="mediumorchid">${He} will struggle greatly with ${his} medically created disability.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">extremely afraid</span> of your total power over ${his} body.`); + r.push(`You're there to open the door for ${him} as ${he} exits the surgery. Despite ${his} obedience, ${he} cries softly the whole time, ${his} shoulder stumps occasionally moving as ${he} reflexively tries to grab at ${himself} and ${his} surroundings. <span class="mediumorchid">${He} will struggle greatly with ${his} medically created disability.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">extremely afraid</span> of your total power over ${his} body.`); slave.trust -= 15; slave.devotion -= 15; } else { @@ -3431,14 +3431,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`shoulder stumps twitch pathetically with ${his} desperate efforts to move ${his} arms, to prove there is something other than this.`); } - r.push(`Anything other than this. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">utterly and entirely terrified</span> of your total power over ${his} body.`); + r.push(`Anything other than this. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">utterly and entirely terrified</span> of your total power over ${his} body.`); slave.trust -= 40; slave.devotion -= 40; } break; case "ampL1": if (slave.fetish === "mindbroken") { - r.push(`Of course, ${he} could not walk out of the surgery by ${himself}; you had to walk alongside ${him}. ${He} leans into you the entire time, already seeming to forget ${he} ever had another leg. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`Of course, ${he} could not walk out of the surgery by ${himself}; you had to walk alongside ${him}. ${He} leans into you the entire time, already seeming to forget ${he} ever had another leg. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { r.push(`Of course, ${he} could not walk out of the surgery by ${himself}; you had to walk alongside ${him}. ${He} knows what a slave's life is, but ${he} did not really expect that it would involve this. After a brief, silent`); if (canSee(slave)) { @@ -3446,9 +3446,9 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`consideration of`); } - r.push(`the stump that was once ${his} leg, ${he} squares ${his} shoulders and resolves to carry on being a good slave as best ${he} can. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`the stump that was once ${his} leg, ${he} squares ${his} shoulders and resolves to carry on being a good slave as best ${he} can. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 20) { - r.push(`Of course, ${he} could not walk out of the surgery by ${himself}; you had to walk alongside ${him}. Despite ${his} obedience, ${he} cries softly the whole time, the stump at ${his} hip occasionally moving as ${he} reflexively tries to use it somehow. <span class="mediumorchid">${He} will struggle greatly with ${his} medically created disability.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">immensely afraid</span> of your total power over ${his} body.`); + r.push(`Of course, ${he} could not walk out of the surgery by ${himself}; you had to walk alongside ${him}. Despite ${his} obedience, ${he} cries softly the whole time, the stump at ${his} hip occasionally moving as ${he} reflexively tries to use it somehow. <span class="mediumorchid">${He} will struggle greatly with ${his} medically created disability.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">immensely afraid</span> of your total power over ${his} body.`); slave.trust -= 5; slave.devotion -= 5; } else { @@ -3468,14 +3468,14 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`leg stump twitches pathetically with ${his} desperate efforts to move ${his} missing leg, to prove there is something other than this.`); } - r.push(`Anything other than this. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">incredibly and intensely terrified</span> of your total power over ${his} body.`); + r.push(`Anything other than this. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">incredibly and intensely terrified</span> of your total power over ${his} body.`); slave.trust -= 15; slave.devotion -= 15; } break; case "ampL2": if (slave.fetish === "mindbroken") { - r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. ${He} holds onto you the entire time, already seeming to forget the sensation of walking. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. ${He} holds onto you the entire time, already seeming to forget the sensation of walking. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. ${He} knows what a slave's life is, but ${he} did not really expect that it would involve this. After a brief, silent`); if (canSee(slave)) { @@ -3483,9 +3483,9 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`consideration of`); } - r.push(`the two stumps that were once ${his} legs, ${he} squares ${his} shoulders and resolves to carry on being a good slave as best ${he} can. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`the two stumps that were once ${his} legs, ${he} squares ${his} shoulders and resolves to carry on being a good slave as best ${he} can. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 20) { - r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. Despite ${his} obedience, ${he} cries softly the whole time, ${his} hip stumps occasionally moving as ${he} reflexively tries to stand up and walk around. <span class="mediumorchid">${He} will struggle greatly with ${his} medically created disability.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">extremely afraid</span> of your total power over ${his} body.`); + r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. Despite ${his} obedience, ${he} cries softly the whole time, ${his} hip stumps occasionally moving as ${he} reflexively tries to stand up and walk around. <span class="mediumorchid">${He} will struggle greatly with ${his} medically created disability.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">extremely afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 10; } else { @@ -3501,7 +3501,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`hip stumps twitch pathetically with ${his} desperate efforts to move ${his} legs, to prove there is something other than this.`); } - r.push(`Anything other than this. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">utterly and entirely terrified</span> of your total power over ${his} body.`); + r.push(`Anything other than this. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">utterly and entirely terrified</span> of your total power over ${his} body.`); slave.trust -= 30; slave.devotion -= 30; } @@ -3520,7 +3520,7 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { case "bla": if (slave.fetish === "mindbroken") { - r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. ${He} squirms the entire time, trying to move the arms and legs ${he} now lacks. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. ${He} squirms the entire time, trying to move the arms and legs ${he} now lacks. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. ${He} knows what a slave's life is, but ${he} did not really expect that it would ever come to this for ${him}. After a long, silent`); if (canSee(slave)) { @@ -3528,9 +3528,9 @@ App.UI.SlaveInteract.surgeryDegradation = function(slave) { } else { r.push(`consideration of`); } - r.push(` ${his} limbless torso, ${he} squares ${his} shoulders and visibly resolves to carry on being a good slave as best ${he} can. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(` ${his} limbless torso, ${he} squares ${his} shoulders and visibly resolves to carry on being a good slave as best ${he} can. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 20) { - r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. Despite ${his} obedience, ${he} cries softly the whole time, shoulder and hip stumps moving occasionally as ${he} reflexively tries to stand — to walk — to touch ${himself} — to gesture — all things that ${he} will never do again. <span class="mediumorchid">${He} will struggle greatly with ${his} medically created disability.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">cripplingly afraid</span> of your total power over ${his} body.`); + r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. Despite ${his} obedience, ${he} cries softly the whole time, shoulder and hip stumps moving occasionally as ${he} reflexively tries to stand — to walk — to touch ${himself} — to gesture — all things that ${he} will never do again. <span class="mediumorchid">${He} will struggle greatly with ${his} medically created disability.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">cripplingly afraid</span> of your total power over ${his} body.`); slave.trust -= 20; slave.devotion -= 20; } else { @@ -3546,7 +3546,7 @@ slave.devotion -= 20; } else { r.push(`stumps twitch pathetically with ${his} desperate efforts to move ${his} limbs, to prove there is something other than this.`); } - r.push(`Anything other than this. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terrified to the point of insanity</span> of your total power over ${his} body.`); + r.push(`Anything other than this. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terrified to the point of insanity</span> of your total power over ${his} body.`); slave.trust -= 50; slave.devotion -= 50; } @@ -3568,9 +3568,9 @@ case "amp1": break; case "amp2": if (slave.fetish === "mindbroken") { - r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. ${He} squirms the entire time trying to move the arms and legs ${he} now lacks, never noticing the ports in ${his} stumps. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. ${He} squirms the entire time trying to move the arms and legs ${he} now lacks, never noticing the ports in ${his} stumps. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 50) { - r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. ${He} knows what a slave's life is, but ${he} did not really expect that it would ever come to this for ${him}. Anesthesia has yet to completely wear off so it takes ${him} a while to notice ports in ${his} stumps. When ${he} does, ${he} visibly relaxes, realizing ${he} may yet walk again. ${He} squares ${his} shoulders and visibly resolves to carry on being a good slave as best ${he} can. Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. ${He} knows what a slave's life is, but ${he} did not really expect that it would ever come to this for ${him}. Anesthesia has yet to completely wear off so it takes ${him} a while to notice ports in ${his} stumps. When ${he} does, ${he} visibly relaxes, realizing ${he} may yet walk again. ${He} squares ${his} shoulders and visibly resolves to carry on being a good slave as best ${he} can. Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); } else if (slave.devotion > 20) { r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. Despite ${his} obedience, ${he} cries softly the whole time, shoulder and hip stumps moving occasionally as ${he} reflexively tries to stand — to walk — to touch ${himself} — to gesture — all things that ${he} will never do again. ${He} slightly calms down when ${he}`); if (canSee(slave)) { @@ -3578,7 +3578,7 @@ case "amp2": } else { r.push(`feels`); } - r.push(`ports installed in ${his} stumps and realizes ${his} immobility is not permanent. Even so, ${he} is still <span class="gold">terrified</span> of your total power over ${his} body. <span class="mediumorchid">${He} will struggle greatly with ${his} medically created disability.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`ports installed in ${his} stumps and realizes ${his} immobility is not permanent. Even so, ${he} is still <span class="gold">terrified</span> of your total power over ${his} body. <span class="mediumorchid">${He} will struggle greatly with ${his} medically created disability.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span>`); slave.trust -= 10; slave.devotion -= 10; } else { @@ -3594,7 +3594,7 @@ slave.devotion -= 10; } else { r.push(`stumps twitch pathetically with ${his} desperate efforts to move ${his} limbs, to prove there is something other than this.`); } - r.push(`Anything other than this. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health.dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terrified to the point of insanity</span> of your total power over ${his} body.`); + r.push(`Anything other than this. <span class="mediumorchid">The surgical invasion has filled ${him} with horror and anger.</span> Since the surgery was invasive, <span class="health dec">${his} health has been greatly affected.</span> ${He} is <span class="gold">terrified to the point of insanity</span> of your total power over ${his} body.`); slave.trust -= 50; slave.devotion -= 50; } @@ -3611,7 +3611,7 @@ slave.devotion -= 50; } else { r.push(`wiggles ${his} stumps trying to feel the ports`); } - r.push(`installed in ${his} stumps. Recovery will be <span class="health.dec">significant,</span> since the surgical implantation of anchor points for the limbs themselves and the installation of nerve impulse detectors constituted major surgery.`); + r.push(`installed in ${his} stumps. Recovery will be <span class="health dec">significant,</span> since the surgical implantation of anchor points for the limbs themselves and the installation of nerve impulse detectors constituted major surgery.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 20) { r.push(`Nevertheless, ${he}'s <span class="hotpink">overwhelmed with gratitude,</span> and thanks you profusely the first chance ${he} gets. ${He} follows the acclimation program diligently, doing ${his} best to learn how to be a good slave despite, or sometimes even because of, ${his} disability. ${He} <span class="mediumaquamarine">places more trust in you,</span> too, since you obviously have ${his} best interests at heart.`); @@ -3638,7 +3638,7 @@ slave.devotion -= 50; } else { r.push(`wiggles ${his} stumps trying to feel the ports`); } - r.push(`installed in ${his} stumps. ${His} stumps twitch slightly as the software begins configuring. Recovery will be <span class="health.dec">significant,</span> since the surgical implantation of anchor points for the limbs themselves and the installation of nerve bridges constituted major surgery.`); + r.push(`installed in ${his} stumps. ${His} stumps twitch slightly as the software begins configuring. Recovery will be <span class="health dec">significant,</span> since the surgical implantation of anchor points for the limbs themselves and the installation of nerve bridges constituted major surgery.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 20) { r.push(`Nevertheless, ${he}'s <span class="hotpink">overwhelmed with gratitude,</span> and thanks you profusely the first chance ${he} gets. ${He} follows the acclimation program diligently, doing ${his} best to learn how to be a good slave despite, or sometimes even because of, ${his} disability. ${He} <span class="mediumaquamarine">places more trust in you,</span> too, since you obviously have ${his} best interests at heart.`); @@ -3665,7 +3665,7 @@ slave.devotion -= 50; } else { r.push(`wiggles ${his} stumps trying to feel the ports`); } - r.push(`installed in ${his} stumps. ${His} stumps twitch slightly as the software begins configuring. Since ${he} already had anchors installed in previous surgery this procedure was less invasive and thus <span class="health.dec">${his} health has been only slightly affected.</span>`); + r.push(`installed in ${his} stumps. ${His} stumps twitch slightly as the software begins configuring. Since ${he} already had anchors installed in previous surgery this procedure was less invasive and thus <span class="health dec">${his} health has been only slightly affected.</span>`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 20) { r.push(`${He} is <span class="hotpink">overjoyed</span> when ${he} finds out this upgrade will allow ${him} to //feel// with ${his} limbs again and thanks you profusely the first chance ${he} gets. ${He} <span class="mediumaquamarine">places more trust in you,</span> too, since you obviously have ${his} best interests at heart.`); @@ -3688,7 +3688,7 @@ slave.devotion -= 50; break; /* This was moved to prostheticsConfig.tw case "basicPLimbs": - r.push(`${He} exits the surgery hesitantly, the software of ${his} prosthetic limbs and the wetware of ${his} brain working together to figure out how to walk together under the tutelage of a prescribed tutorial. Recovery will be <span class="health.dec">significant,</span> since the surgical implantation of anchor points for the limbs themselves and the installation of nerve impulse detectors constituted major surgery.`); + r.push(`${He} exits the surgery hesitantly, the software of ${his} prosthetic limbs and the wetware of ${his} brain working together to figure out how to walk together under the tutelage of a prescribed tutorial. Recovery will be <span class="health dec">significant,</span> since the surgical implantation of anchor points for the limbs themselves and the installation of nerve impulse detectors constituted major surgery.`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 20) { r.push(`Nevertheless, ${he}'s <span class="hotpink">overwhelmed with gratitude,</span> and thanks you profusely the first chance ${he} gets. ${He} follows the acclimation program diligently, doing ${his} best to learn how to be a good slave despite, or sometimes even because of, ${his} artificial arms and legs. ${He} <span class="mediumaquamarine">places more trust in you,</span> too, since you obviously have ${his} best interests at heart.`); @@ -3809,7 +3809,7 @@ slave.trust += 5; break; case "removeLimbs": if (slave.fetish === "mindbroken") { - r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. ${He} squirms the entire time trying to move the arms and legs that ${he} used to have. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. ${He} squirms the entire time trying to move the arms and legs that ${he} used to have. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. ${He} knows what a slave's life is, but ${he} did not really expect ${his} artificial limbs would be removed again so suddenly. After a long, silent`); if (canSee(slave)) { @@ -3817,13 +3817,13 @@ slave.trust += 5; } else { r.push(`consideration of`); } - r.push(` ${his} limbless torso, ${he} squares ${his} shoulders and visibly resolves to carry on being a good slave as best ${he} can. As ${he} was already amputated, there was no lasting effect. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(` ${his} limbless torso, ${he} squares ${his} shoulders and visibly resolves to carry on being a good slave as best ${he} can. As ${he} was already amputated, there was no lasting effect. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 20) { - r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. Despite ${his} obedience, ${he} cries softly the whole time, shoulder and hip stumps moving occasionally as ${he} reflexively tries to stand — to walk — to touch ${himself} — to gesture — all things that ${he} had to learn to do again. Your removal of ${his} prosthetic limbs has caused <span class="mediumorchid">${his} devotion to drop</span> and <span class="gold">${his} trust to drop.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. Despite ${his} obedience, ${he} cries softly the whole time, shoulder and hip stumps moving occasionally as ${he} reflexively tries to stand — to walk — to touch ${himself} — to gesture — all things that ${he} had to learn to do again. Your removal of ${his} prosthetic limbs has caused <span class="mediumorchid">${his} devotion to drop</span> and <span class="gold">${his} trust to drop.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust -= 5; slave.devotion -= 5; } else { - r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. It seems that ${his} mistrust of you was well founded and this removal of ${his} artificial limbs has caused <span class="mediumorchid">${his} devotion to drop</span> and <span class="gold">${his} trust to drop.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`Of course, ${he} could not walk out of the surgery; you carried ${him}. It seems that ${his} mistrust of you was well founded and this removal of ${his} artificial limbs has caused <span class="mediumorchid">${his} devotion to drop</span> and <span class="gold">${his} trust to drop.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust -= 5; slave.devotion -= 5; } @@ -3831,84 +3831,84 @@ slave.devotion -= 5; */ case "ster": if (slave.fetish === "mindbroken") { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but lacks the mental faculties to know that ${he}'ll never have a child now. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but lacks the mental faculties to know that ${he}'ll never have a child now. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (strongKnownFet("pregnancy")) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he}'ll never have a child. ${He} is <span class="mediumorchid">filled with grief</span> whenever ${he} thinks about the fact that feeling a life growing within ${him} is now, finally and forever, beyond ${him}. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he}'ll never have a child. ${He} is <span class="mediumorchid">filled with grief</span> whenever ${he} thinks about the fact that feeling a life growing within ${him} is now, finally and forever, beyond ${him}. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 20; } else if (slave.energy > 95) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he}'ll never have to worry about a pussyfuck getting ${him} pregnant again. As far as ${he}'s concerned, easier, less worrisome vaginal intercourse is a <span class="hotpink">good thing;</span> one less thing to keep in mind when a guy blows his load inside ${him}. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he}'ll never have to worry about a pussyfuck getting ${him} pregnant again. As far as ${he}'s concerned, easier, less worrisome vaginal intercourse is a <span class="hotpink">good thing;</span> one less thing to keep in mind when a guy blows his load inside ${him}. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion > 50) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he}'ll never have to worry about a pregnancy, ever again. ${He} has many rules and duties to worry about as a slave, so ${he}'s <span class="hotpink">grateful</span> that ${he} has one less thing to worry about as ${he} serves you. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he}'ll never have to worry about a pregnancy, ever again. ${He} has many rules and duties to worry about as a slave, so ${he}'s <span class="hotpink">grateful</span> that ${he} has one less thing to worry about as ${he} serves you. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he}'ll never get pregnant. ${He} understands the realities of ${his} life as a slave, and that a traditional life with a child was never going to happen for ${him} anyway, so it isn't much of a shock. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he}'ll never get pregnant. ${He} understands the realities of ${his} life as a slave, and that a traditional life with a child was never going to happen for ${him} anyway, so it isn't much of a shock. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he}'ll never get pregnant. ${He} does not understand the realities of ${his} life as a slave at a core level, so despite the fact that ${he} was never going to have a family, fertile or not, ${he}'s <span class="mediumorchid">resentful</span> of the surgical invasion. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he}'ll never get pregnant. ${He} does not understand the realities of ${his} life as a slave at a core level, so despite the fact that ${he} was never going to have a family, fertile or not, ${he}'s <span class="mediumorchid">resentful</span> of the surgical invasion. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; slave.devotion -= 5; } break; case "fert": if (slave.fetish === "mindbroken") { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but lacks the mental faculties to realize that ${he} now has a chance to get pregnant. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but lacks the mental faculties to realize that ${he} now has a chance to get pregnant. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (strongKnownFet("pregnancy") || slave.origin === "${He} sold ${himself} to you in the hope of someday bearing children.") { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} now has a chance to get pregnant. ${He} is <span class="hotpink">filled with joy</span> whenever ${he} thinks about the fact that feeling a life growing within ${him} is now, at last, a possibility. ${He}'s so pleased that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} now has a chance to get pregnant. ${He} is <span class="hotpink">filled with joy</span> whenever ${he} thinks about the fact that feeling a life growing within ${him} is now, at last, a possibility. ${He}'s so pleased that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 5; } else if (slave.devotion > 50) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} now has a chance to get pregnant. ${He}'s <span class="hotpink">grateful</span> that you think ${him} worthy of breeding, and even a little nervous about how ${he}'ll perform as a breeder. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} now has a chance to get pregnant. ${He}'s <span class="hotpink">grateful</span> that you think ${him} worthy of breeding, and even a little nervous about how ${he}'ll perform as a breeder. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} may now be impregnated. ${He} understands the realities of ${his} life as a slave, and that being bred was a possibility, so it isn't much of a shock. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} may now be impregnated. ${He} understands the realities of ${his} life as a slave, and that being bred was a possibility, so it isn't much of a shock. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} may now be impregnated. ${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> at the potential that ${he}'ll be bred. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to know that it means ${he} may now be impregnated. ${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> at the potential that ${he}'ll be bred. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; slave.devotion -= 5; } break; case "addOvaries": if (slave.fetish === "mindbroken") { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but lacks the mental faculties to realize that ${he} now has a chance to get pregnant. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but lacks the mental faculties to realize that ${he} now has a chance to get pregnant. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (strongKnownFet("pregnancy") || slave.origin === "${He} sold ${himself} to you in the hope of someday bearing children.") { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} now has a chance to get pregnant. ${He} is filled with joy whenever ${he} thinks about the fact that feeling a life growing within ${him} is now, at last, a possibility. ${He} now places <span class="mediumaquamarine">total faith</span> in your plans for ${his} body and <span class="hotpink">adores you</span> for giving ${him} a gift ${he} once thought impossible. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} now has a chance to get pregnant. ${He} is filled with joy whenever ${he} thinks about the fact that feeling a life growing within ${him} is now, at last, a possibility. ${He} now places <span class="mediumaquamarine">total faith</span> in your plans for ${his} body and <span class="hotpink">adores you</span> for giving ${him} a gift ${he} once thought impossible. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 10; slave.devotion += 10; } else if (slave.devotion > 50) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} is now internally indistinguishable from a natural, unaltered woman. ${He} is <span class="mediumaquamarine">tremendously impressed</span> that you would devote such immense resources to altering ${his} body, and is more willing than ever to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} is now internally indistinguishable from a natural, unaltered woman. ${He} is <span class="mediumaquamarine">tremendously impressed</span> that you would devote such immense resources to altering ${his} body, and is more willing than ever to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 5; slave.devotion += 5; } else if (slave.devotion >= -20) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} is now internally indistinguishable from a natural, unaltered woman. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, so much so that ${he} is now more willing to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} is now internally indistinguishable from a natural, unaltered woman. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, so much so that ${he} is now more willing to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust -= 5; slave.devotion += 5; } else { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} is now internally indistinguishable from a natural, unaltered woman. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, and <span class="mediumorchid">furious</span> at ${his} lack of control over ${his} own person. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} is now internally indistinguishable from a natural, unaltered woman. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, and <span class="mediumorchid">furious</span> at ${his} lack of control over ${his} own person. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust -= 5; slave.devotion -= 5; } break; case "asexualReproOvaries": if (slave.fetish === "mindbroken") { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but lacks the mental faculties to realize that ${he} is now self-impregnating. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but lacks the mental faculties to realize that ${he} is now self-impregnating. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to suspect that something has critically changed about ${his} reproductive system. ${He} is <span class="mediumaquamarine">pleased</span> that you would go out of your way to alter ${his} body, and is more willing than ever to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to suspect that something has critically changed about ${his} reproductive system. ${He} is <span class="mediumaquamarine">pleased</span> that you would go out of your way to alter ${his} body, and is more willing than ever to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 5; slave.devotion += 5; } else if (slave.devotion >= -20) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to shudder at the thought of just what could have possibly been put into ${him}. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, so much so that ${he} is now more willing to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to shudder at the thought of just what could have possibly been put into ${him}. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, so much so that ${he} is now more willing to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust -= 5; slave.devotion += 5; } else { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to dread the discovery of what now resides inside ${him}. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, and <span class="mediumorchid">furious</span> at ${his} lack of control over ${his} own person. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to dread the discovery of what now resides inside ${him}. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, and <span class="mediumorchid">furious</span> at ${his} lack of control over ${his} own person. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust -= 5; slave.devotion -= 5; } if (isFertile(slave) && slave.preg === 0) { - r.push(knockMeUp(slave, 100, 2, slave.ID, 1)); + knockMeUp(slave, 100, 2, slave.ID); r.push(`${He} doesn't even have the chance to reach the slave quarters before ${his} new reproductive system detects ${his} unprotected fertility and begins to internally cum.`); if (canWalk(slave)) { r.push(`${He} struggles to stand as wave after wave of pleasure radiates from inside ${his} self-fertilizing womb.`); @@ -3930,28 +3930,28 @@ slave.devotion -= 5; break; case "addAnimalOvaries": if (slave.fetish === "mindbroken") { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but lacks the mental faculties to realize that ${he} now has a chance of carrying an animal baby to term. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but lacks the mental faculties to realize that ${he} now has a chance of carrying an animal baby to term. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (strongKnownFet("pregnancy") || slave.origin === "${He} sold ${himself} to you in the hope of someday bearing children.") { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} now has a chance to get pregnant. ${He} is filled with joy whenever ${he} thinks about the fact that feeling a life growing within ${him} is now, at last, a possibility. ${He} now places <span class="mediumaquamarine">total faith</span> in your plans for ${his} body and <span class="hotpink">adores you</span> for giving ${him} a gift ${he} once thought impossible. ${He} doesn't realize exactly what the surgery entailed, however — the happiness ${he} felt at first will most likely be replaced with horror once ${he} realizes the babies in ${his} womb are not human. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} now has a chance to get pregnant. ${He} is filled with joy whenever ${he} thinks about the fact that feeling a life growing within ${him} is now, at last, a possibility. ${He} now places <span class="mediumaquamarine">total faith</span> in your plans for ${his} body and <span class="hotpink">adores you</span> for giving ${him} a gift ${he} once thought impossible. ${He} doesn't realize exactly what the surgery entailed, however — the happiness ${he} felt at first will most likely be replaced with horror once ${he} realizes the babies in ${his} womb are not human. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 10; slave.devotion += 10; } else if (slave.devotion > 50) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} is now internally indistinguishable from a natural, unaltered woman — at least, that's what ${he} believes. Little does ${he} know that ${he} is now capable of carrying animal babies in ${his} womb. ${He} is <span class="mediumaquamarine">tremendously impressed</span> that you would devote such immense resources to altering ${his} body, and is more willing than ever to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} is now internally indistinguishable from a natural, unaltered woman — at least, that's what ${he} believes. Little does ${he} know that ${he} is now capable of carrying animal babies in ${his} womb. ${He} is <span class="mediumaquamarine">tremendously impressed</span> that you would devote such immense resources to altering ${his} body, and is more willing than ever to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 5; slave.devotion += 5; } else if (slave.devotion >= -20) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} is now internally indistinguishable from a natural, unaltered woman — at least, that's what ${he} believes. Little does ${he} know that ${he} is now capable of carrying animal babies in ${his} womb. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, so much so that ${he} is now more willing to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} is now internally indistinguishable from a natural, unaltered woman — at least, that's what ${he} believes. Little does ${he} know that ${he} is now capable of carrying animal babies in ${his} womb. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, so much so that ${he} is now more willing to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust -= 5; slave.devotion += 5; } else { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} is now internally indistinguishable from a natural, unaltered woman — at least, that's what ${he} believes. Little does ${he} know that ${he} is now capable of carrying animal babies in ${his} womb. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, and <span class="mediumorchid">furious</span> at ${his} lack of control over ${his} own person. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} has managed to catch enough slave rumors about what the organ farm can do to know that it means ${he} is now internally indistinguishable from a natural, unaltered woman — at least, that's what ${he} believes. Little does ${he} know that ${he} is now capable of carrying animal babies in ${his} womb. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, and <span class="mediumorchid">furious</span> at ${his} lack of control over ${his} own person. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust -= 5; slave.devotion -= 5; } break; case "addTesticles": if (slave.fetish === "mindbroken") { - r.push(`It's not immediately apparent to ${him} what kind of surgery ${he} received, since all ${he}'s left with is a nonspecific ache in ${his} abdomen. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`It's not immediately apparent to ${him} what kind of surgery ${he} received, since all ${he}'s left with is a nonspecific ache in ${his} abdomen. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He} lies back in the surgical chair${(canSee(slave)) ? `, gazing at ${himself} in the ceiling mirror` : ``} as the fog of anesthetics lifts and feeling returns to ${his} lower half. As a devoted slave, ${he} knew the essentials of the surgery before it was performed, so ${he}'s excited to`); if (canSee(slave)) { @@ -3963,15 +3963,15 @@ slave.devotion -= 5; slave.trust += 5; slave.devotion += 5; } else if (slave.devotion >= -20) { - r.push(`It's not immediately apparent to ${him} what kind of surgery ${he} received, since all ${he}'s left with is a nonspecific ache in ${his} abdomen. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`It's not immediately apparent to ${him} what kind of surgery ${he} received, since all ${he}'s left with is a nonspecific ache in ${his} abdomen. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else { - r.push(`It's not immediately apparent to ${him} what kind of surgery ${he} received, since all ${he}'s left with is a nonspecific ache in ${his} abdomen. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} doesn't have to know exactly what you did, though, to be <span class="gold">mortified</span> and <span class="mediumorchid">infuriated</span> by your messing around inside ${his} body. ${He} hasn't yet learned to accept that you control ${him} completely, down to the arrangement and even presence of ${his} internal organs.`); + r.push(`It's not immediately apparent to ${him} what kind of surgery ${he} received, since all ${he}'s left with is a nonspecific ache in ${his} abdomen. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} doesn't have to know exactly what you did, though, to be <span class="gold">mortified</span> and <span class="mediumorchid">infuriated</span> by your messing around inside ${his} body. ${He} hasn't yet learned to accept that you control ${him} completely, down to the arrangement and even presence of ${his} internal organs.`); slave.trust -= 10; slave.devotion -= 10; } break; case "addProstate": - r.push(`It's not immediately apparent to ${him} what kind of surgery ${he} received, since all ${he}'s left with is a terrible nonspecific ache in ${his} lower parts. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`It's not immediately apparent to ${him} what kind of surgery ${he} received, since all ${he}'s left with is a terrible nonspecific ache in ${his} lower parts. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { if (slave.devotion > 50) { if (slave.anus === 0) { @@ -4021,7 +4021,7 @@ slave.devotion -= 5; break; case "addDick": if (slave.fetish === "mindbroken") { - r.push(`The surgery is invasive, and ${he} spends some time in the autosurgery, slowly recovering. As feeling slowly returns to the lower half of ${his} body and ${his} thoughts coalesce against the dissipating fog of surgical pharmacology, ${he} strains to focus on ${his} groin${(canSee(slave)) ? `, visible in a ceiling mirror above ${him}` : ``}. ${His} eyes open wide as ${he} takes in the new member between ${his} legs. Suddenly, it twitches for the first time. The mixed pain of the terribly sore area and pleasure of new sensations floods ${him}, and ${he} jerks against the surgical restraints, gasping for breath. <span class="health.dec">${his} health has been severely affected</span> by the intrusive surgery.`); + r.push(`The surgery is invasive, and ${he} spends some time in the autosurgery, slowly recovering. As feeling slowly returns to the lower half of ${his} body and ${his} thoughts coalesce against the dissipating fog of surgical pharmacology, ${he} strains to focus on ${his} groin${(canSee(slave)) ? `, visible in a ceiling mirror above ${him}` : ``}. ${His} eyes open wide as ${he} takes in the new member between ${his} legs. Suddenly, it twitches for the first time. The mixed pain of the terribly sore area and pleasure of new sensations floods ${him}, and ${he} jerks against the surgical restraints, gasping for breath. <span class="health dec">${his} health has been severely affected</span> by the intrusive surgery.`); } else if (slave.devotion > 50) { r.push(`The surgery is invasive, and ${he} spends some time in the autosurgery, slowly recovering. As feeling slowly returns to the lower half of ${his} body and ${his} thoughts coalesce against the dissipating fog of surgical pharmacology, ${he} strains to focus on ${his} groin${(canSee(slave)) ? `, visible in a ceiling mirror above ${him}` : ``}. As a devoted slave, ${he} knew the essentials of the surgery before it was performed, so ${he}'s excited to`); if (canSee(slave)) { @@ -4029,7 +4029,7 @@ slave.devotion -= 5; } else { r.push(`feel`); } - r.push(`the result. ${His} eyes open wide as ${he} takes in the new member between ${his} legs. Suddenly, it twitches for the first time. The mixed pain of the terribly sore area and pleasure of new sensations floods ${him}, and ${he} jerks against the surgical restraints, gasping for breath. ${He} is <span class="mediumaquamarine">tremendously impressed</span> that you would devote such immense resources to altering ${his} body, and is more willing than ever to <span class="hotpink">submit to your plans</span> for ${his} future. <span class="health.dec">${his} health has been severely affected</span> by the intrusive surgery.`); + r.push(`the result. ${His} eyes open wide as ${he} takes in the new member between ${his} legs. Suddenly, it twitches for the first time. The mixed pain of the terribly sore area and pleasure of new sensations floods ${him}, and ${he} jerks against the surgical restraints, gasping for breath. ${He} is <span class="mediumaquamarine">tremendously impressed</span> that you would devote such immense resources to altering ${his} body, and is more willing than ever to <span class="hotpink">submit to your plans</span> for ${his} future. <span class="health dec">${his} health has been severely affected</span> by the intrusive surgery.`); slave.trust += 5; slave.devotion += 5; } else if (slave.devotion >= -20) { @@ -4037,7 +4037,7 @@ slave.devotion -= 5; if (canSee(slave)) { r.push(`turns ${his} gaze away from the mirror and`); } - r.push(`shuts ${his} eyes tightly. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, so much so that ${he} is now more willing to <span class="hotpink">submit to your plans</span> for ${his} future. <span class="health.dec">${his} health has been severely affected</span> by the intrusive surgery.`); + r.push(`shuts ${his} eyes tightly. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, so much so that ${he} is now more willing to <span class="hotpink">submit to your plans</span> for ${his} future. <span class="health dec">${his} health has been severely affected</span> by the intrusive surgery.`); slave.trust -= 5; slave.devotion += 5; } else { @@ -4047,14 +4047,14 @@ slave.devotion -= 5; } else { r.push(`A huge scream rises out of ${him}, going on and on, until ${he} pauses to gasp for breath so ${he} can go on screaming.`); } - r.push(`${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, and <span class="mediumorchid">furious</span> at ${his} lack of control over ${his} own person. <span class="health.dec">${his} health has been severely affected</span> by the intrusive surgery.`); + r.push(`${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, and <span class="mediumorchid">furious</span> at ${his} lack of control over ${his} own person. <span class="health dec">${his} health has been severely affected</span> by the intrusive surgery.`); slave.trust -= 5; slave.devotion -= 5; } break; case "addBalls": if (slave.fetish === "mindbroken") { - r.push(`${He} lies back in the surgical chair${(canSee(slave)) ? `, gazing at ${himself} in the ceiling mirror` : ``} as the fog of anesthetics lifts and feeling returns to ${his} lower half. ${His} new testicles are small, and ${his} scrotum is scarcely visible under ${his} dick, but its impact becomes immediately clear. ${He} slowly achieves an excruciatingly painful erection, panting with the pain as ${his} very sore member becomes hard. The terrible overstimulation brings a spurt of cum jetting out of ${his} cockhead. As the agony melts away, ${he} struggles to understand what just happened. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} lies back in the surgical chair${(canSee(slave)) ? `, gazing at ${himself} in the ceiling mirror` : ``} as the fog of anesthetics lifts and feeling returns to ${his} lower half. ${His} new testicles are small, and ${his} scrotum is scarcely visible under ${his} dick, but its impact becomes immediately clear. ${He} slowly achieves an excruciatingly painful erection, panting with the pain as ${his} very sore member becomes hard. The terrible overstimulation brings a spurt of cum jetting out of ${his} cockhead. As the agony melts away, ${he} struggles to understand what just happened. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He} lies back in the surgical chair${(canSee(slave)) ? `, gazing at ${himself} in the ceiling mirror` : ``} as the fog of anesthetics lifts and feeling returns to ${his} lower half. As a devoted slave, ${he} knew the essentials of the surgery before it was performed, so ${he}'s excited to`); if (canSee(slave)) { @@ -4062,11 +4062,11 @@ slave.devotion -= 5; } else { r.push(`feel`); } - r.push(`the result. ${His} new testicles are small, and ${his} scrotum is scarcely visible under ${his} dick, but its impact becomes immediately clear. ${He} slowly achieves an excruciatingly painful erection, panting with the pain as ${his} very sore member becomes hard. The terrible overstimulation brings a spurt of cum jetting out of ${his} cockhead. As the agony melts away, ${he} begins to giggle. ${He} is <span class="mediumaquamarine">tremendously impressed</span> that you would devote such immense resources to altering ${his} body, and is more willing than ever to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`the result. ${His} new testicles are small, and ${his} scrotum is scarcely visible under ${his} dick, but its impact becomes immediately clear. ${He} slowly achieves an excruciatingly painful erection, panting with the pain as ${his} very sore member becomes hard. The terrible overstimulation brings a spurt of cum jetting out of ${his} cockhead. As the agony melts away, ${he} begins to giggle. ${He} is <span class="mediumaquamarine">tremendously impressed</span> that you would devote such immense resources to altering ${his} body, and is more willing than ever to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 5; slave.devotion += 5; } else if (slave.devotion >= -20) { - r.push(`${He} lies back in the surgical chair${(canSee(slave)) ? `, gazing at ${himself} in the ceiling mirror` : ``} as the fog of anesthetics lifts and feeling returns to ${his} lower half. ${He} cannot quite feel what has happened to ${him} yet, but ${he} does not have long to wait. ${His} new testicles are small, and ${his} scrotum is scarcely visible under ${his} dick, but its impact becomes immediately clear. ${He} slowly achieves an excruciatingly painful erection, panting with the pain as ${his} very sore member becomes hard. The terrible overstimulation brings a spurt of cum jetting out of ${his} cockhead. As the agony melts away, the rush of new hormones clashes with ${his} already roiling emotions, and ${he} begins to sob. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, so much so that ${he} is now more willing to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} lies back in the surgical chair${(canSee(slave)) ? `, gazing at ${himself} in the ceiling mirror` : ``} as the fog of anesthetics lifts and feeling returns to ${his} lower half. ${He} cannot quite feel what has happened to ${him} yet, but ${he} does not have long to wait. ${His} new testicles are small, and ${his} scrotum is scarcely visible under ${his} dick, but its impact becomes immediately clear. ${He} slowly achieves an excruciatingly painful erection, panting with the pain as ${his} very sore member becomes hard. The terrible overstimulation brings a spurt of cum jetting out of ${his} cockhead. As the agony melts away, the rush of new hormones clashes with ${his} already roiling emotions, and ${he} begins to sob. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, so much so that ${he} is now more willing to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust -= 5; slave.devotion += 5; } else { @@ -4082,7 +4082,7 @@ slave.devotion -= 5; } else { r.push(`${he} howls with pain and terror`); } - r.push(`as the dildo forces a weak prostate orgasm. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, and <span class="mediumorchid">furious</span> at ${his} lack of control over ${his} own person. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`as the dildo forces a weak prostate orgasm. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, and <span class="mediumorchid">furious</span> at ${his} lack of control over ${his} own person. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust -= 5; slave.devotion -= 5; } @@ -4091,7 +4091,7 @@ slave.devotion -= 5; break; case "addAnimalBalls": if (slave.fetish === "mindbroken") { - r.push(`${He} lies back in the surgical chair${(canSee(slave)) ? `, gazing at ${himself} in the ceiling mirror` : ``} as the fog of anesthetics lifts and feeling returns to ${his} lower half. ${His} new testicles are small, and ${his} scrotum is scarcely visible under ${his} dick, but its impact becomes immediately clear. ${He} slowly achieves an excruciatingly painful erection, panting with the pain as ${his} very sore member becomes hard. The terrible overstimulation brings a spurt of cum jetting out of ${his} cockhead. As the agony melts away, ${he} struggles to understand what just happened. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} lies back in the surgical chair${(canSee(slave)) ? `, gazing at ${himself} in the ceiling mirror` : ``} as the fog of anesthetics lifts and feeling returns to ${his} lower half. ${His} new testicles are small, and ${his} scrotum is scarcely visible under ${his} dick, but its impact becomes immediately clear. ${He} slowly achieves an excruciatingly painful erection, panting with the pain as ${his} very sore member becomes hard. The terrible overstimulation brings a spurt of cum jetting out of ${his} cockhead. As the agony melts away, ${he} struggles to understand what just happened. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { r.push(`${He} lies back in the surgical chair${(canSee(slave)) ? `, gazing at ${himself} in the ceiling mirror` : ``} as the fog of anesthetics lifts and feeling returns to ${his} lower half. As a devoted slave, ${he} knew the essentials of the surgery before it was performed, so ${he}'s excited to`); if (canSee(slave)) { @@ -4099,11 +4099,11 @@ slave.devotion -= 5; } else { r.push(`feel`); } - r.push(`the result. ${His} new testicles are small, and ${his} scrotum is scarcely visible under ${his} dick, but its impact becomes immediately clear. ${He} slowly achieves an excruciatingly painful erection, panting with the pain as ${his} very sore member becomes hard. The terrible overstimulation brings a spurt of cum jetting out of ${his} cockhead. As the agony melts away, ${he} begins to giggle. ${He} is <span class="mediumaquamarine">tremendously impressed</span> that you would devote such immense resources to altering ${his} body, and is more willing than ever to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`the result. ${His} new testicles are small, and ${his} scrotum is scarcely visible under ${his} dick, but its impact becomes immediately clear. ${He} slowly achieves an excruciatingly painful erection, panting with the pain as ${his} very sore member becomes hard. The terrible overstimulation brings a spurt of cum jetting out of ${his} cockhead. As the agony melts away, ${he} begins to giggle. ${He} is <span class="mediumaquamarine">tremendously impressed</span> that you would devote such immense resources to altering ${his} body, and is more willing than ever to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 5; slave.devotion += 5; } else if (slave.devotion >= -20) { - r.push(`${He} lies back in the surgical chair${(canSee(slave)) ? `, gazing at ${himself} in the ceiling mirror` : ``} as the fog of anesthetics lifts and feeling returns to ${his} lower half. ${He} cannot quite feel what has happened to ${him} yet, but ${he} does not have long to wait. ${His} new testicles are small, and ${his} scrotum is scarcely visible under ${his} dick, but its impact becomes immediately clear. ${He} slowly achieves an excruciatingly painful erection, panting with the pain as ${his} very sore member becomes hard. The terrible overstimulation brings a spurt of cum jetting out of ${his} cockhead. As the agony melts away, the rush of new hormones clashes with ${his} already roiling emotions, and ${he} begins to sob. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, so much so that ${he} is now more willing to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} lies back in the surgical chair${(canSee(slave)) ? `, gazing at ${himself} in the ceiling mirror` : ``} as the fog of anesthetics lifts and feeling returns to ${his} lower half. ${He} cannot quite feel what has happened to ${him} yet, but ${he} does not have long to wait. ${His} new testicles are small, and ${his} scrotum is scarcely visible under ${his} dick, but its impact becomes immediately clear. ${He} slowly achieves an excruciatingly painful erection, panting with the pain as ${his} very sore member becomes hard. The terrible overstimulation brings a spurt of cum jetting out of ${his} cockhead. As the agony melts away, the rush of new hormones clashes with ${his} already roiling emotions, and ${he} begins to sob. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, so much so that ${he} is now more willing to <span class="hotpink">submit to your plans</span> for ${his} future. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust -= 5; slave.devotion += 5; } else { @@ -4119,7 +4119,7 @@ slave.devotion -= 5; } else { r.push(`${he} howls with pain and terror`); } - r.push(`as the dildo forces a weak prostate orgasm. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, and <span class="mediumorchid">furious</span> at ${his} lack of control over ${his} own person. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`as the dildo forces a weak prostate orgasm. ${He} is <span class="gold">terrified</span> of your apparently untrammeled power over ${his} body, and <span class="mediumorchid">furious</span> at ${his} lack of control over ${his} own person. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust -= 5; slave.devotion -= 5; } @@ -4171,7 +4171,7 @@ slave.devotion -= 5; slave.trust -= 5; slave.devotion -= 5; } - r.push(`As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "addForeskin": if (slave.dick > 0) { @@ -4221,32 +4221,32 @@ slave.devotion -= 5; slave.trust -= 5; } } - r.push(`As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "anus": if (slave.fetish === "mindbroken") { - r.push(`${He} leaves the surgery with a terribly sore rear end and little desire to mess with it. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore rear end and little desire to mess with it. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (strongKnownFet("buttslut")) { - r.push(`${He} leaves the surgery with a terribly sore rear end. ${He} is <span class="hotpink">filled with joy</span> at the prospect of having a tight butt all over again, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. If ${he} had much in the way of anal skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore rear end. ${He} is <span class="hotpink">filled with joy</span> at the prospect of having a tight butt all over again, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. If ${he} had much in the way of anal skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 10; if (slave.skill.anal > 10) { slave.skill.anal -= 10; } } else if (slave.devotion > 50) { - r.push(`${He} leaves the surgery with a terribly sore rear end. ${He}'s a bit anxious at the prospect of the pain having to get back to a loose asshole the hard way, but ${he}'s <span class="hotpink">happy</span> that you think ${him} worth the effort of surgical improvement. If ${he} had much in the way of anal skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore rear end. ${He}'s a bit anxious at the prospect of the pain having to get back to a loose asshole the hard way, but ${he}'s <span class="hotpink">happy</span> that you think ${him} worth the effort of surgical improvement. If ${he} had much in the way of anal skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; if (slave.skill.anal > 10) { slave.skill.anal -= 10; } } else if (slave.devotion >= -20) { - r.push(`${He} leaves the surgery with a terribly sore rear end. ${He} knows ${he}'ll have to endure the pain of being fucked in a tight asshole again soon enough, but trepidation is nothing new for ${him}. If ${he} had much in the way of anal skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with a terribly sore rear end. ${He} knows ${he}'ll have to endure the pain of being fucked in a tight asshole again soon enough, but trepidation is nothing new for ${him}. If ${he} had much in the way of anal skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; if (slave.skill.anal > 10) { slave.skill.anal -= 10; } } else { - r.push(`${He} leaves the surgery with a terribly sore rear end. ${He}'s <span class="mediumorchid">horrified</span> at surgical alteration of ${his} rear end, and knows that this means that ${he}'ll have to take the pain of sodomy in a tight ass all over again. If ${he} had much in the way of anal skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} most intimate parts.`); + r.push(`${He} leaves the surgery with a terribly sore rear end. ${He}'s <span class="mediumorchid">horrified</span> at surgical alteration of ${his} rear end, and knows that this means that ${he}'ll have to take the pain of sodomy in a tight ass all over again. If ${he} had much in the way of anal skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} most intimate parts.`); slave.trust -= 10; slave.devotion -= 5; if (slave.skill.anal > 10) { @@ -4256,41 +4256,41 @@ slave.devotion -= 5; break; case "labiaplasty": if (slave.fetish === "mindbroken") { - r.push(`${He} leaves the surgery with a terribly sore pussy and little desire to mess with it. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore pussy and little desire to mess with it. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.energy > 95) { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He} is <span class="hotpink">filled with joy</span> at the thought that ${his} pussy will now be more appealing to ${his} ${getWrittenTitle(slave)}; ${he}'s already anticipating recovering enough to feel your cockhead pressing past ${his} new lips, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He} is <span class="hotpink">filled with joy</span> at the thought that ${his} pussy will now be more appealing to ${his} ${getWrittenTitle(slave)}; ${he}'s already anticipating recovering enough to feel your cockhead pressing past ${his} new lips, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 10; } else if (slave.devotion > 50) { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="hotpink">happy</span> that you think ${his} pussy worth the effort of surgical improvement, and a little excited at the idea that ${he} now has what you consider good-looking pussylips. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="hotpink">happy</span> that you think ${his} pussy worth the effort of surgical improvement, and a little excited at the idea that ${he} now has what you consider good-looking pussylips. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s somewhat revolted by the surgery, but as far as ${he}'s concerned, the short recovery period will mean a time during which ${he} can be sure no one will use ${his} pussy. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s somewhat revolted by the surgery, but as far as ${he}'s concerned, the short recovery period will mean a time during which ${he} can be sure no one will use ${his} pussy. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="mediumorchid">horrified</span> at surgical alteration of ${his} womanhood; this is probably more of an invasion than ${he} could readily imagine before today. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} most intimate parts.`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="mediumorchid">horrified</span> at surgical alteration of ${his} womanhood; this is probably more of an invasion than ${he} could readily imagine before today. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} most intimate parts.`); slave.trust -= 10; slave.devotion -= 5; } break; case "clitoral reduction": if (slave.fetish === "mindbroken") { - r.push(`${He} leaves the surgery with a terribly sore pussy and little desire to mess with it. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore pussy and little desire to mess with it. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.energy > 95) { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He} is <span class="hotpink">filled with joy</span> at the thought that ${his} pussy will now be more appealing to ${his} ${getWrittenTitle(slave)}; ${his} sensitivity has been reduced, <span class="libido.dec">reducing ${his} sex drive slightly.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He} is <span class="hotpink">filled with joy</span> at the thought that ${his} pussy will now be more appealing to ${his} ${getWrittenTitle(slave)}; ${his} sensitivity has been reduced, <span class="libido dec">reducing ${his} sex drive slightly.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 10; slave.energy -= 5; } else if (slave.devotion > 50) { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="hotpink">happy</span> that you think ${his} pussy worth the effort of surgical improvement, although ${his} sensitivity has been reduced, <span class="libido.dec">reducing ${his} sex drive slightly.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="hotpink">happy</span> that you think ${his} pussy worth the effort of surgical improvement, although ${his} sensitivity has been reduced, <span class="libido dec">reducing ${his} sex drive slightly.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; slave.energy -= 5; } else if (slave.devotion >= -20) { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s somewhat revolted by the surgery, but as far as ${he}'s concerned, the short recovery period will mean a time during which ${he} can be sure no one will use ${his} pussy. The reduced sensitivity has <span class="libido.dec">noticeably reduced ${his} sex drive.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s somewhat revolted by the surgery, but as far as ${he}'s concerned, the short recovery period will mean a time during which ${he} can be sure no one will use ${his} pussy. The reduced sensitivity has <span class="libido dec">noticeably reduced ${his} sex drive.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; slave.energy -= 10; } else { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="mediumorchid">horrified</span> at surgical alteration of ${his} womanhood; this is probably more of an invasion than ${he} could readily imagine before today and <span class="libido.dec">${his} sex drive takes a heavy hit..</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} most intimate parts.`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="mediumorchid">horrified</span> at surgical alteration of ${his} womanhood; this is probably more of an invasion than ${he} could readily imagine before today and <span class="libido dec">${his} sex drive takes a heavy hit..</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} most intimate parts.`); slave.trust -= 10; slave.devotion -= 5; slave.energy -= 20; @@ -4298,22 +4298,22 @@ slave.devotion -= 5; break; case "clitoral enlargement": if (slave.fetish === "mindbroken") { - r.push(`${He} leaves the surgery with a terribly sore pussy and little desire to mess with it. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore pussy and little desire to mess with it. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.energy > 95) { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He} is <span class="hotpink">filled with joy</span> at the thought that ${his} pussy will now be more appealing to ${his} ${getWrittenTitle(slave)}; ${his} sensitivity has been increased, <span class="libido.inc">raising ${his} sex drive slightly.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He} is <span class="hotpink">filled with joy</span> at the thought that ${his} pussy will now be more appealing to ${his} ${getWrittenTitle(slave)}; ${his} sensitivity has been increased, <span class="libido inc">raising ${his} sex drive slightly.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 10; slave.energy += 1; } else if (slave.devotion > 50) { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="hotpink">happy</span> that you think ${his} pussy worth the effort of surgical improvement; ${his} sensitivity has been increased, <span class="libido.inc">raising ${his} sex drive slightly.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="hotpink">happy</span> that you think ${his} pussy worth the effort of surgical improvement; ${his} sensitivity has been increased, <span class="libido inc">raising ${his} sex drive slightly.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; slave.energy += 1; } else if (slave.devotion >= -20) { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s somewhat revolted by the surgery, but as far as ${he}'s concerned, the short recovery period will mean a time during which ${he} can be sure no one will use ${his} pussy. ${His} sensitivity has been increased, <span class="libido.inc">raising ${his} sex drive slightly.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s somewhat revolted by the surgery, but as far as ${he}'s concerned, the short recovery period will mean a time during which ${he} can be sure no one will use ${his} pussy. ${His} sensitivity has been increased, <span class="libido inc">raising ${his} sex drive slightly.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; slave.energy += 1; } else { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="mediumorchid">horrified</span> at surgical alteration of ${his} womanhood; this is probably more of an invasion than ${he} could readily imagine before today. ${His} sensitivity has been increased, <span class="libido.inc">raising ${his} sex drive slightly.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} most intimate parts.`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="mediumorchid">horrified</span> at surgical alteration of ${his} womanhood; this is probably more of an invasion than ${he} could readily imagine before today. ${His} sensitivity has been increased, <span class="libido inc">raising ${his} sex drive slightly.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} most intimate parts.`); slave.trust -= 10; slave.devotion -= 5; slave.energy += 1; @@ -4321,28 +4321,28 @@ slave.devotion -= 5; break; case "vagina": if (slave.fetish === "mindbroken") { - r.push(`${He} leaves the surgery with a terribly sore pussy and little desire to mess with it. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore pussy and little desire to mess with it. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.energy > 95) { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He} is <span class="hotpink">filled with joy</span> at the prospect of having a tight cunt again, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. If ${he} had much in the way of vanilla sex skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He} is <span class="hotpink">filled with joy</span> at the prospect of having a tight cunt again, so much so that ${he} now <span class="mediumaquamarine">trusts</span> your plans for ${his} body. If ${he} had much in the way of vanilla sex skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.trust += 4; slave.devotion += 10; if (slave.skill.vaginal > 10) { slave.skill.vaginal -= 10; } } else if (slave.devotion > 50) { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="hotpink">happy</span> that you think ${him} worth the effort of surgical improvement, and a little excited to feel like ${he}'s a girl again. If ${he} had much in the way of vanilla sex skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="hotpink">happy</span> that you think ${him} worth the effort of surgical improvement, and a little excited to feel like ${he}'s a girl again. If ${he} had much in the way of vanilla sex skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; if (slave.skill.vaginal > 10) { slave.skill.vaginal -= 10; } } else if (slave.devotion >= -20) { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s somewhat revolted by the surgery, but as far as ${he}'s concerned, the short recovery period will mean a time during which ${he} can be sure no one will use ${his} pussy. If ${he} had much in the way of vanilla sex skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s somewhat revolted by the surgery, but as far as ${he}'s concerned, the short recovery period will mean a time during which ${he} can be sure no one will use ${his} pussy. If ${he} had much in the way of vanilla sex skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; if (slave.skill.vaginal > 10) { slave.skill.vaginal -= 10; } } else { - r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="mediumorchid">horrified</span> at surgical alteration of ${his} womanhood; this is probably more of an invasion than ${he} could readily imagine before today. If ${he} had much in the way of vanilla sex skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} most intimate parts.`); + r.push(`${He} leaves the surgery with a terribly sore pussy. ${He}'s <span class="mediumorchid">horrified</span> at surgical alteration of ${his} womanhood; this is probably more of an invasion than ${he} could readily imagine before today. If ${he} had much in the way of vanilla sex skills, <span class="red">they've likely suffered.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">terribly afraid</span> of your total power over ${his} most intimate parts.`); slave.trust -= 10; slave.devotion -= 5; if (slave.skill.vaginal > 10) { @@ -4353,7 +4353,7 @@ slave.devotion -= 5; case "tummyTuck": r.push(`${He} leaves the surgery with a soreness on ${his} lower abdomen,`); if (slave.fetish === "mindbroken") { - r.push(`and finds ${his} belly isn't so saggy anymore. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`and finds ${his} belly isn't so saggy anymore. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else { r.push(`and is <span class="hotpink">pleased</span> to find it's no longer saggy. ${He}'s happy that ${he}'ll be able to show off ${his}`); if (slave.weight > 95) { @@ -4367,21 +4367,21 @@ slave.devotion -= 5; } else { r.push(`once again firm, flat belly`); } - r.push(`without being self conscious about it. As with all surgery <span class="health.dec">${his} health has been affected.</span>`); + r.push(`without being self conscious about it. As with all surgery <span class="health dec">${his} health has been affected.</span>`); slave.devotion += 2; } break; case "bellyIn": if (slave.fetish === "mindbroken") { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen that ${he} cannot figure out the source of. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen that ${he} cannot figure out the source of. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, and as such, knows you put something into ${his} womb. ${He} is <span class="hotpink">curious</span> about the details of the implant, and eagerly awaits to see the end result. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, and as such, knows you put something into ${his} womb. ${He} is <span class="hotpink">curious</span> about the details of the implant, and eagerly awaits to see the end result. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache and slight weight in ${his} lower abdomen, and as such, knows you put something into ${his} womb. ${He} understands the realities of ${his} life as a slave, but ${he} is still surprised at what now resides in ${his} womb. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache and slight weight in ${his} lower abdomen, and as such, knows you put something into ${his} womb. ${He} understands the realities of ${his} life as a slave, but ${he} is still surprised at what now resides in ${his} womb. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to believe that ${he} has been impregnated. ${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> at the potential that ${he}'s been bred. Even after what has been implanted into ${his} womb is explained to ${him}, ${he} is no less defiant; though ${he} is relieved that ${he} isn't pregnant. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, but ${he} knows enough about surgery and sex slaves to believe that ${he} has been impregnated. ${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> at the potential that ${he}'s been bred. Even after what has been implanted into ${his} womb is explained to ${him}, ${he} is no less defiant; though ${he} is relieved that ${he} isn't pregnant. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; slave.devotion -= 5; } @@ -4389,38 +4389,38 @@ slave.devotion -= 5; case "cervixPump": case "cervixPumpA": if (slave.fetish === "mindbroken") { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen and ${cervixPumpAcheLocation} that ${he} cannot figure out the source of. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen and ${cervixPumpAcheLocation} that ${he} cannot figure out the source of. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen and ${cervixPumpAcheLocation}, and as such, knows you put something into ${his} ${cervixPumpLocation}. ${He} is <span class="hotpink">curious</span> about the details of the implant, and eagerly awaits to see the end result. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen and ${cervixPumpAcheLocation}, and as such, knows you put something into ${his} ${cervixPumpLocation}. ${He} is <span class="hotpink">curious</span> about the details of the implant, and eagerly awaits to see the end result. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen and ${cervixPumpAcheLocation}, and as such, knows you put something into ${his} ${cervixPumpLocation}. ${He} understands the realities of ${his} life as a slave, but ${he} is still surprised at what now resides in ${his} ${cervixPumpLocation}. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen and ${cervixPumpAcheLocation}, and as such, knows you put something into ${his} ${cervixPumpLocation}. ${He} understands the realities of ${his} life as a slave, but ${he} is still surprised at what now resides in ${his} ${cervixPumpLocation}. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (V.surgeryType === "cervixPump") { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen and ${cervixPumpAcheLocation}, but ${he} knows enough about surgery and sex slaves to believe that ${he} has modified in ${his} most private place. ${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> at the potential that ${he}'s been subject of such modifications. Even after what has been implanted into ${his} womb is explained to ${him}, ${he} is no less defiant; though ${he} is relieved that it isn't some permanent mutilation, ${he} only feels dirty and humiliated when ${he} thinks of vaginal sex slowly rounding ${his} middle. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen and ${cervixPumpAcheLocation}, but ${he} knows enough about surgery and sex slaves to believe that ${he} has modified in ${his} most private place. ${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> at the potential that ${he}'s been subject of such modifications. Even after what has been implanted into ${his} womb is explained to ${him}, ${he} is no less defiant; though ${he} is relieved that it isn't some permanent mutilation, ${he} only feels dirty and humiliated when ${he} thinks of vaginal sex slowly rounding ${his} middle. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); } else { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen and ${cervixPumpAcheLocation}, but ${he} knows enough about surgery and sex slaves to believe that ${he} has modified in ${his} backdoor. ${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> at the potential that ${he}'s been subject of such modifications. Even after what has been implanted into ${his} rear hole is explained to ${him}, ${he} is no less defiant; though ${he} is relieved that it isn't some permanent mutilation, ${he} only feels dirty and humiliated when ${he} thinks of anal sex slowly rounding ${his} middle. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen and ${cervixPumpAcheLocation}, but ${he} knows enough about surgery and sex slaves to believe that ${he} has modified in ${his} backdoor. ${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> at the potential that ${he}'s been subject of such modifications. Even after what has been implanted into ${his} rear hole is explained to ${him}, ${he} is no less defiant; though ${he} is relieved that it isn't some permanent mutilation, ${he} only feels dirty and humiliated when ${he} thinks of anal sex slowly rounding ${his} middle. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); } slave.trust -= 5; slave.devotion -= 5; } if (V.surgeryType === "cervixPumpA" && slave.mpreg === 1) { - r.push(`${His} existing anal womb made the surgery <span class="health.inc">slightly easier.</span>`); + r.push(`${His} existing anal womb made the surgery <span class="health inc">slightly easier.</span>`); improveCondition(slave, 10); } break; case "bellyInMale": if (slave.fetish === "mindbroken") { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen that ${he} cannot figure out the source of. As ${his} surgery was very invasive <span class="health.dec">${his} health has been greatly impacted.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen that ${he} cannot figure out the source of. As ${his} surgery was very invasive <span class="health dec">${his} health has been greatly impacted.</span>`); } else if (slave.devotion > 50) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, and as such, knows you put something into ${his} body. ${He} is <span class="hotpink">curious</span> about the details of the implant, and eagerly awaits to see the end result. As ${his} surgery was very invasive <span class="health.dec">${his} health has been greatly impacted.</span>`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, and as such, knows you put something into ${his} body. ${He} is <span class="hotpink">curious</span> about the details of the implant, and eagerly awaits to see the end result. As ${his} surgery was very invasive <span class="health dec">${his} health has been greatly impacted.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache and slight weight in ${his} lower abdomen, and as such, knows you put something into ${his} body. ${He} understands the realities of ${his} life as a slave, but ${he} is still surprised at what now resides in ${his} middle. As ${his} surgery was very invasive <span class="health.dec">${his} health has been greatly impacted.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache and slight weight in ${his} lower abdomen, and as such, knows you put something into ${his} body. ${He} understands the realities of ${his} life as a slave, but ${he} is still surprised at what now resides in ${his} middle. As ${his} surgery was very invasive <span class="health dec">${his} health has been greatly impacted.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { - r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, and as such, knows you put something into ${his} body. ${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> at your treatment of ${his} body. As ${his} surgery was very invasive <span class="health.dec">${his} health has been greatly impacted.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He} leaves the surgery with nothing but a nonspecific ache in ${his} lower abdomen, and as such, knows you put something into ${his} body. ${He} does not understand the realities of ${his} life as a slave at a core level, so ${he}'s <span class="mediumorchid">terrified and angry</span> at your treatment of ${his} body. As ${his} surgery was very invasive <span class="health dec">${his} health has been greatly impacted.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; slave.devotion -= 5; } @@ -4443,14 +4443,14 @@ slave.devotion -= 5; } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`); } - r.push(`${He} doesn't understand why it has gotten larger either. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} doesn't understand why it has gotten larger either. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { if (hasAnyArms(slave)) { r.push(`${He} runs ${his} fingers over ${his} expanded belly experimentally and turns to you with a smile to show it off. ${He}'s still sore, so ${he} doesn't bounce or stretch, but ${he} turns from side to side to let you see it from all angles.`); } else { r.push(`${He} bounces a little to feel the weight in ${his} expanded middle and turns ${his} torso to you with a smile to show it off. ${He}'s still sore, so ${he} doesn't move too much, but ${he} wiggles ${himself} a little to make it move for you.`); } - r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} body.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} body.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 4; } else if (slave.devotion >= -20) { if (canSee(slave)) { @@ -4464,7 +4464,7 @@ slave.devotion -= 5; } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 5; } else { if (canSee(slave)) { @@ -4478,7 +4478,7 @@ slave.devotion -= 5; } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${heGlaresDaggers}.`); } - r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this rounded belly as a cruel imposition.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this rounded belly as a cruel imposition.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 10; slave.devotion -= 5; } @@ -4495,14 +4495,14 @@ slave.devotion -= 5; } else { r.push(`${He}'s still extremely sore, so ${he} keeps ${his} torso still.`); } - r.push(`${He} can't understand how it has grown so much so fast. Since ${his} body has been pushed beyond its limits, <span class="health.dec">${his} health has been notably affected.</span>`); + r.push(`${He} can't understand how it has grown so much so fast. Since ${his} body has been pushed beyond its limits, <span class="health dec">${his} health has been notably affected.</span>`); } else if (slave.devotion > 50) { if (hasAnyArms(slave)) { r.push(`${He} gingerly runs ${his} fingers over ${his} painfully expanded belly and turns to you to show it off. ${He}'s extremely sore, so ${he} doesn't bounce or stretch, but ${he} tries to turn from side to side to let you see it from all angles.`); } else { r.push(`${He} is so sore, ${he} doesn't dare move the weight in ${his} expanded middle, but ${he} turns ${his} torso to you to show it off. ${He} stomachs the pain and wiggles ${himself} a little to make it move for you.`); } - r.push(`<span class="hotpink">${He}'s certain ${he}'ll be happy with your changes to ${his} body</span> once the pain subsides. Since ${his} body has been pushed beyond its limits, <span class="health.dec">${his} health has been notably affected.</span>`); + r.push(`<span class="hotpink">${He}'s certain ${he}'ll be happy with your changes to ${his} body</span> once the pain subsides. Since ${his} body has been pushed beyond its limits, <span class="health dec">${his} health has been notably affected.</span>`); slave.devotion += 2; } else if (slave.devotion >= -20) { if (canSee(slave)) { @@ -4516,7 +4516,7 @@ slave.devotion -= 5; } else { r.push(`${He}'s still extremely sore, so ${he} keeps ${his} torso still.`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. Since ${his} body has been pushed beyond its limits, <span class="health.dec">${his} health has been notably affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, so ${he} expected something like this when ${he} was sent to the surgery. ${He} isn't much affected mentally. Since ${his} body has been pushed beyond its limits, <span class="health dec">${his} health has been notably affected.</span> ${He} is <span class="gold">sensibly fearful</span> of your total power over ${his} body.`); slave.trust -= 7; } else { if (canSee(slave)) { @@ -4530,7 +4530,7 @@ slave.devotion -= 5; } else { r.push(`${He}'s still extremely sore, so ${he} keeps ${his} torso still, but ${heGlaresDaggers}.`); } - r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this rounded belly as a terribly cruel imposition.</span> Since ${his} body has been pushed beyond its limits, <span class="health.dec">${his} health has been notably affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="mediumorchid">${he} seems to view this rounded belly as a terribly cruel imposition.</span> Since ${his} body has been pushed beyond its limits, <span class="health dec">${his} health has been notably affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.trust -= 12; slave.devotion -= 7; } @@ -4552,14 +4552,14 @@ slave.devotion -= 5; } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`); } - r.push(`${He} can't why it is smaller now. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} can't why it is smaller now. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); } else if (slave.devotion > 50) { if (hasAnyArms(slave)) { r.push(`${He} hefts ${his} lighter belly experimentally and turns to you with a smile to show off ${his} new, slimmer form. ${He}'s still sore, so ${he} doesn't bounce or stretch, but ${he} turns from side to side to let you see it from all angles.`); } else { r.push(`${He} bounces a little to feel the change in weight within ${his} middle and turns ${his} torso to you with a smile to show is off. ${He}'s still sore, so ${he} doesn't bounce too much.`); } - r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} body</span> and <span class="mediumaquamarine">trusts</span> that your looking out for ${his} ability to serve you. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`<span class="hotpink">${He}'s happy with your changes to ${his} body</span> and <span class="mediumaquamarine">trusts</span> that your looking out for ${his} ability to serve you. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); slave.devotion += 3; slave.trust += 3; } else if (slave.devotion >= -20) { @@ -4573,7 +4573,7 @@ slave.devotion -= 5; } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still.`); } - r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is <span class="mediumaquamarine">thankful</span> that you removed some weight off ${his} body.`); + r.push(`${He}'s come to terms with the fact that ${he}'s a slave, but ${he} expected something other than this when ${he} was sent to the surgery. ${He} isn't much affected mentally. As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is <span class="mediumaquamarine">thankful</span> that you removed some weight off ${his} body.`); slave.trust += 2; } else { if (canSee(slave)) { @@ -4586,14 +4586,14 @@ slave.devotion -= 5; } else { r.push(`${He}'s still sore, so ${he} keeps ${his} torso still, but ${he} breathes easier without the extra weight in ${him}.`); } - r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="hotpink">${he} seems appreciative of this literal weight lifted from ${him}.</span> As with all surgery <span class="health.dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); + r.push(`${He} still thinks of ${himself} as a person, so ${he} isn't used to the idea of being surgically altered to suit your every whim. For now, <span class="hotpink">${he} seems appreciative of this literal weight lifted from ${him}.</span> As with all surgery <span class="health dec">${his} health has been slightly affected.</span> ${He} is now <span class="gold">terribly afraid</span> of your total power over ${his} body.`); slave.devotion += 1; slave.trust -= 10; } break; case "bellyOut": SetBellySize(slave); - r.push(`${He} notices almost immediately that the weight in ${his} middle is gone. ${He} shifts ${his} torso idly; it looks like ${he} doesn't know what to think about having ${his} belly implant removed. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`${He} notices almost immediately that the weight in ${his} middle is gone. ${He} shifts ${his} torso idly; it looks like ${he} doesn't know what to think about having ${his} belly implant removed. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "body hair removal": if (slave.underArmHStyle !== "hairless") { @@ -4781,10 +4781,10 @@ slave.devotion -= 5; r.push(`${he} fails to realize ${he} now has pubic hair.`); } } - r.push(`As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`); + r.push(`As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`); break; case "womb": - r.push(`It's not immediately apparent to ${him} what kind of surgery ${he} received, since all ${he}'s left with is a terrible nonspecific ache in ${his} lower belly. As with all invasive surgery <span class="health.dec">${his} health has been greatly affected.</span>`); + r.push(`It's not immediately apparent to ${him} what kind of surgery ${he} received, since all ${he}'s left with is a terrible nonspecific ache in ${his} lower belly. As with all invasive surgery <span class="health dec">${his} health has been greatly affected.</span>`); break; case "elasticity treatment": case "immortality treatment": @@ -4801,7 +4801,7 @@ slave.devotion -= 5; } else { r.push(`centimeters,`); } - r.push(`leaving small needle marks that fade out within minutes. Despite not leaving a lasting evidence, the process is very invasive work, and leaves ${him} <span class="health.dec">feeling weak and tired.</span>`); + r.push(`leaving small needle marks that fade out within minutes. Despite not leaving a lasting evidence, the process is very invasive work, and leaves ${him} <span class="health dec">feeling weak and tired.</span>`); break; case "retrograde virus injection NCS": r.push(`The procedure spans the week, with ${him} spending every other day in the surgery room for a series of 4 sets of injections. A few hours after each session, ${he} feels terribly ill. ${He} doesn't quite understand what it's about, just that ${he} feels pretty bad. The process involves`); @@ -4816,7 +4816,7 @@ slave.devotion -= 5; } else { r.push(`centimeters,`); } - r.push(`leaving small needle marks that fade out within minutes. Despite not leaving a lasting evidence, the process is very invasive work, and leaves ${him} <span class="health.dec">feeling weak and tired.</span>`); + r.push(`leaving small needle marks that fade out within minutes. Despite not leaving a lasting evidence, the process is very invasive work, and leaves ${him} <span class="health dec">feeling weak and tired.</span>`); App.Events.addNode(el, r, "p"); r = []; // Generate the changes, into variables to set contexts. @@ -4913,7 +4913,7 @@ slave.devotion -= 5; statusChanges.push(`${He} feels a little <span class="orange">younger.</span>`); slave.visualAge -= 1; } - if (slave.voice > 0 && slave.voice < 3) { + if (slave.voice.isBetween(0, 3)) { voiceLevel = "girly"; if (slave.voice < 2) { voiceLevel = "feminine"; @@ -5045,7 +5045,7 @@ slave.devotion -= 5; App.Events.addNode(el, r, "p"); r = []; if (!["body hair removal", "braces", "chem castrate", "eyebrow removal", "hair removal", "insemination", "removeBraces"].includes(V.surgeryType)) { - r.push(`Since you <span class="springgreen">performed the surgery yourself,</span> and you do an artist's work, ${his} health is <span class="health.inc">less affected</span> by the surgery than it would have been if you'd paid some hack to do it remotely.`); + r.push(`Since you <span class="springgreen">performed the surgery yourself,</span> and you do an artist's work, ${his} health is <span class="health inc">less affected</span> by the surgery than it would have been if you'd paid some hack to do it remotely.`); improveCondition(slave, 5); } if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { diff --git a/src/personalAssistant/assistantAppearance.js b/src/personalAssistant/assistantAppearance.js index a83919ede9b915aec1c3344e5574ddf420f60616..8b8fb11e0f594996e627101d594172fccc1a5a4e 100644 --- a/src/personalAssistant/assistantAppearance.js +++ b/src/personalAssistant/assistantAppearance.js @@ -50,7 +50,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is lying with ${hisU} head in ${hisA} lap. The monster ${girlA}is wearing a little stethoscope and is listening to the slave breathe; the slave must be getting a checkup. The monster ${girlA} is restraining ${himselfA} for once, and ${hisA} hair is even patting the slave's head reassuringly.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`The monster ${girlA} is riding around on a little representation of one of your security drones. ${HeA}'s very obviously enjoying the drone's vibrations as it hovers. When ${heA} sees you looking at ${himA}, ${HeA} giggles and says, "What? I like him! He did really well during the invasion. And he's cute!"`); + r.push(`The monster ${girlA} is riding around on a little representation of one of your security drones. ${HeA}'s very obviously enjoying the drone's vibrations as it hovers. When ${heA} sees you looking at ${himA}, ${heA} giggles and says, "What? I like him! He did really well during the invasion. And he's cute!"`); } else if (paSeed === 6 && V.studio === 1) { r.push(`The monster ${girlA} has both ${hisA} dicks inside a recognizable little representation of one of your slaves, and is using a handheld camera to film the action, gonzo style. The slave must be using one of the penthouse's many vibrators, and ${V.assistant.name} is clearly turning the feed of it into porn.`); } else if (paSeed === 7 && V.assistant.market) { @@ -65,7 +65,7 @@ globalThis.PersonalAssistantAppearance = function() { r.push(`They're cuddled up close. As they kiss, ${V.assistant.name}'s tentacle hair holds ${hisA} lover's head gently. The market assistant's avatar is using both hands to give ${V.assistant.name}'s cocks some manual release.`); } } else { - r.push(`${HeA}'s sitting cross-legged, looking up at you and waiting for instructions. In the meantime, ${HeA}'s masturbating gently, a dickhead in each hand, while ${hisA} hair writhes against itself.`); + r.push(`${HeA}'s sitting cross-legged, looking up at you and waiting for instructions. In the meantime, ${heA}'s masturbating gently, a dickhead in each hand, while ${hisA} hair writhes against itself.`); } break; case "shemale": @@ -74,7 +74,7 @@ globalThis.PersonalAssistantAppearance = function() { r.push(FSfunc()); } if (V.cockFeeder === 1 && paSeed === 1) { - r.push(`A recognizable little representation of one of your slaves is down on ${hisU} knees in front of ${himA}, gagging on ${hisA} enormous dick. The slave must be down in the kitchen, getting a meal out of the phallic food dispensers. As you watch, the shemale orgasms; ${HeA} notices you watching ${himA}, and blows you a wet kiss.`); + r.push(`A recognizable little representation of one of your slaves is down on ${hisU} knees in front of ${himA}, gagging on ${hisA} enormous dick. The slave must be down in the kitchen, getting a meal out of the phallic food dispensers. As you watch, the shemale orgasms; ${heA} notices you watching ${himA}, and blows you a wet kiss.`); } else if (V.suppository === 1 && paSeed === 2) { r.push(`A recognizable little representation of one of your slaves is down on ${hisU} knees in front of ${himA}, moaning as it takes ${hisA} massive prick. The slave must be receiving ${hisU} drugs from one of the dildo dispensers. As you watch, the shemale looks up at you, winks, and starts pulling out after each thrust, ${hisA} cock making a popping noise each time it leaves the slave's butthole.`); } else if (masturbationAllowed === 1 && paSeed === 3) { @@ -82,7 +82,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is lying with ${hisU} head in ${hisA} lap. The shemale is wearing a little stethoscope and is listening to the slave breathe; the slave must be getting a checkup. The shemale is restraining ${himselfA} for once, patting the slave's head and cooing reassuringly.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s masturbating as ${heA} takes it up the ass from a representation of one of your security drones, which appears to have a little dildo mounted in place of one of its gun assemblies. When ${heA} sees you looking at ${himA}, ${HeA} giggles and says, "What? I like him! He did really well during the invasion."`); + r.push(`${HeA}'s masturbating as ${heA} takes it up the ass from a representation of one of your security drones, which appears to have a little dildo mounted in place of one of its gun assemblies. When ${heA} sees you looking at ${himA}, ${heA} giggles and says, "What? I like him! He did really well during the invasion."`); } else if (paSeed === 6 && V.studio === 1) { r.push(`The shemale is plowing a recognizable little representation of one of your slaves up the butt, and is using a handheld camera to film the action, gonzo style. The slave must be using one of the penthouse's many vibrators, and ${V.assistant.name} is clearly turning the feed of it into porn.`); } else if (paSeed === 7 && V.assistant.market) { @@ -122,7 +122,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is lying with ${hisU} head in ${hisA} lap. The amazon is poking and prodding ${himU}; the slave must be getting a checkup. Once finished, the amazon gives ${himU} a powerful massage, making the slave groan with relief.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s leaning against a representation of one of your security drones. Every so often, ${HeA} wrestles with it affectionately. When ${heA} sees you watching ${himA}, ${HeA} leaps atop the drone, puts ${hisA} fists on ${hisA} hips, and says, "What? I like him! He did really well during the invasion. And he's cute!"`); + r.push(`${HeA}'s leaning against a representation of one of your security drones. Every so often, ${heA} wrestles with it affectionately. When ${heA} sees you watching ${himA}, ${heA} leaps atop the drone, puts ${hisA} fists on ${hisA} hips, and says, "What? I like him! He did really well during the invasion. And he's cute!"`); } else if (paSeed === 6 && V.studio === 1) { r.push(`The amazon has ${hisA} hand inside a recognizable little representation of one of your slaves, and is using a handheld camera to film the action, gonzo style. The slave must be using one of the penthouse's many vibrators, and ${V.assistant.name} is clearly turning the feed of it into porn.`); } else if (paSeed === 7 && V.assistant.market) { @@ -137,7 +137,7 @@ globalThis.PersonalAssistantAppearance = function() { r.push(`They're doing it in the missionary position, kissing deeply. They're technically tribbing, but ${V.assistant.name}'s muscular body and the tribes ${womanM}'s ${wifeM}ly form make it look very pure and traditional.`); } } else { - r.push(`${HeA}'s doing push-ups, glancing at you at the top of each rep to see if you need ${himA}. When ${heA} sees your attention, ${HeA} pushes hard enough to bounce to a standing position. Seeing that you're just looking, ${HeA} winks, flexes, and drops back down to do crunches.`); + r.push(`${HeA}'s doing push-ups, glancing at you at the top of each rep to see if you need ${himA}. When ${heA} sees your attention, ${heA} pushes hard enough to bounce to a standing position. Seeing that you're just looking, ${heA} winks, flexes, and drops back down to do crunches.`); } break; case "businesswoman": @@ -154,9 +154,9 @@ globalThis.PersonalAssistantAppearance = function() { } else if (masturbationAllowed === 1 && paSeed === 3) { r.push(`${HeA}'s fucking a recognizable little representation of one of your slaves with a strap-on, which the slave is obviously enjoying. The slave must be using one of the penthouse's many vibrators. ${HeA} sees you watching and whispers something in the slave's ear; the slave looks up at you and blushes.`); } else if (paSeed === 4) { - r.push(`A recognizable little representation of one of your slaves is lying with ${hisU} head in ${hisA} lap. The business ${womanA} is wearing a little stethoscope and is listening to the slave breathe; the slave must be getting a checkup. The business ${womanA} is taking notes on a tablet; ${HeA} nods in satisfaction.`); + r.push(`A recognizable little representation of one of your slaves is lying with ${hisU} head in ${hisA} lap. The business ${womanA} is wearing a little stethoscope and is listening to the slave breathe; the slave must be getting a checkup. The business ${womanA} is taking notes on a tablet; ${heA} nods in satisfaction.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s sitting primly next to a representation of one of your security drones, working on a little tablet. Every so often, ${HeA} reaches over and rubs the drone's upper armor affectionately. When ${heA} sees you looking at ${himA}, ${HeA} blushes and says, "I like this one. He did very well during the invasion. And he's so handsome!"`); + r.push(`${HeA}'s sitting primly next to a representation of one of your security drones, working on a little tablet. Every so often, ${heA} reaches over and rubs the drone's upper armor affectionately. When ${heA} sees you looking at ${himA}, ${heA} blushes and says, "I like this one. He did very well during the invasion. And he's so handsome!"`); } else if (paSeed === 6 && V.studio === 1) { r.push(`${HeA}'s using a strap-on on a recognizable little representation of one of your slaves, and is using a handheld camera to film the action, gonzo style. The slave must be using one of the penthouse's many vibrators, and ${V.assistant.name} is clearly turning the feed of it into porn.`); } else if (paSeed === 7 && V.assistant.market) { @@ -190,7 +190,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is lying with ${hisU} head in ${hisA} lap. The goddess is checking the slave's temperature with the back of ${hisA} hand, a concerned but tender look on ${hisA} face; the slave must be getting a checkup. ${HeA} gently explores the slave's neck and chest for any sign of discomfort.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s frolicking with a representation of one of your security drones, hugging and cradling it to ${hisA} baby bump. When ${heA} sees you looking at ${himA}, ${HeA} pets one of its gun barrels and says, "What? I like him! He was so brave, protecting us during the invasion. Besides, he's adorable!"`); + r.push(`${HeA}'s frolicking with a representation of one of your security drones, hugging and cradling it to ${hisA} baby bump. When ${heA} sees you looking at ${himA}, ${heA} pets one of its gun barrels and says, "What? I like him! He was so brave, protecting us during the invasion. Besides, he's adorable!"`); } else if (paSeed === 6 && V.studio === 1) { r.push(`${HeA}'s fondling and breastfeeding a recognizable little representation of one of your slaves, and is using a handheld camera to film the action, gonzo style. The slave must be using one of the penthouse's many vibrators, and your personal assistant is clearly turning the feed of it into porn.`); } else if (paSeed === 7 && V.assistant.market) { @@ -230,7 +230,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is lying with ${hisU} head in ${hisA} lap. The school ${girlA} is wearing a little stethoscope and is listening to the slave breathe; the slave must be getting a checkup. The school ${girlA} is patting the ${girlU}'s head reassuringly.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s planting a wet kiss on a representation of one of your security drones; ${HeA} pats it lovingly and manages to press quite a bit of boob against the side of one of its gun assemblies. When ${heA} sees you looking at ${himA}, ${HeA} giggles and says, "What? I like him! He did really well during the invasion. And he's cute!"`); + r.push(`${HeA}'s planting a wet kiss on a representation of one of your security drones; ${heA} pats it lovingly and manages to press quite a bit of boob against the side of one of its gun assemblies. When ${heA} sees you looking at ${himA}, ${heA} giggles and says, "What? I like him! He did really well during the invasion. And he's cute!"`); } else if (paSeed === 6 && V.studio === 1) { r.push(`${HeA}'s getting oral from a recognizable little representation of one of your slaves, and is using a handheld camera to film the action, gonzo style. The slave must be using one of the penthouse's many vibrators, and ${V.assistant.name} is clearly turning the feed of it into porn.`); } else if (paSeed === 7 && V.assistant.market) { @@ -245,7 +245,7 @@ globalThis.PersonalAssistantAppearance = function() { r.push(`${V.assistant.name} is giving the market assistant's avatar oral, and to go by the bespectacled ${girlM}'s gasping, is doing a good job. ${V.assistant.name} finishes and leans back, wiping ${hisA} mouth and grinning as ${hisA} lover bends over to return the favor.`); } } else { - r.push(`${HeA}'s watching you attentively, waiting for a chance to be helpful. When ${heA} sees your glance, ${HeA} smiles hopefully, sticks out ${hisA} chest a little, and turns from side to side to show off.`); + r.push(`${HeA}'s watching you attentively, waiting for a chance to be helpful. When ${heA} sees your glance, ${heA} smiles hopefully, sticks out ${hisA} chest a little, and turns from side to side to show off.`); } break; case "hypergoddess": @@ -264,7 +264,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is lying with ${hisU} head in ${hisA} lap. The goddess is checking the slave's temperature with the back of ${hisA} hand, a concerned but tender look on ${hisA} face; the slave must be getting a checkup. ${HeA} gently explores the slave's neck and chest for any sign of discomfort.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s frolicking with a representation of one of your security drones, hugging and cradling it to ${hisA} huge baby bump. When ${heA} sees you looking at ${himA}, ${HeA} pets one of its gun barrel and says, "What? I like him! He was so brave, protecting us during the invasion. Besides, he's adorable!"`); + r.push(`${HeA}'s frolicking with a representation of one of your security drones, hugging and cradling it to ${hisA} huge baby bump. When ${heA} sees you looking at ${himA}, ${heA} pets one of its gun barrel and says, "What? I like him! He was so brave, protecting us during the invasion. Besides, he's adorable!"`); } else if (paSeed === 6 && V.studio === 1) { r.push(`${HeA}'s fondling and breastfeeding a recognizable little representation of one of your slaves, and is using a handheld camera to film the action, gonzo style. The slave must be using one of the penthouse's many vibrators, and your personal assistant is clearly turning the feed of it into porn.`); } else if (paSeed === 7 && V.assistant.market) { @@ -304,7 +304,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is lying with ${hisU} head in ${hisA} lap. The little ${girlA} is wearing a toy stethoscope and is listening to the slave breathe; the slave must be getting a checkup. The little ${girlA} is patting the ${girlU}'s head reassuringly.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s planting a wet kiss on a representation of one of your security drones; ${HeA} hugs it lovingly and tightly. When ${heA} sees you looking at ${himA}, ${HeA} giggles and says, "What? I like him! He did really well during the invasion. And he's cute!"`); + r.push(`${HeA}'s planting a wet kiss on a representation of one of your security drones; ${heA} hugs it lovingly and tightly. When ${heA} sees you looking at ${himA}, ${heA} giggles and says, "What? I like him! He did really well during the invasion. And he's cute!"`); } else if (paSeed === 6 && V.studio === 1) { r.push(`${HeA}'s getting oral from a recognizable little representation of one of your slaves, and is using a handheld camera to film the action, gonzo style. The slave must be using one of the penthouse's many vibrators, and your personal assistant is clearly turning the feed of it into porn.`); } else if (paSeed === 7 && V.assistant.market) { @@ -314,12 +314,12 @@ globalThis.PersonalAssistantAppearance = function() { } else if (V.assistant.market.relationship === "nonconsensual") { r.push(`${V.assistant.name} has ${hisA} chubby playmate pinned under ${hisA} butt, and is inspecting ${hisA} ${loliM} conquest's pussy. The market assistant's avatar groans as ${V.assistant.name}'s fingers explore ${hisM} tight passage, and then claps both hands over ${hisM} mouth, crying a little, unwilling to give ${V.assistant.name} the satisfaction.`); } else if (V.assistant.market.relationship === "incestuous") { - r.push(`They're playing doctor with each other. ${V.assistant.name} is currently inspecting ${hisA} ${sisterM}'s vagina, making sure everything is alright. Once ${heA} finishes, ${HeA} states ${hisA} diagnosis and the needed cure. ${HeA} bends over ${hisA} ${sisterM} and begins administering ${hisA} "cure".`); + r.push(`They're playing doctor with each other. ${V.assistant.name} is currently inspecting ${hisA} ${sisterM}'s vagina, making sure everything is alright. Once ${heA} finishes, ${heA} states ${hisA} diagnosis and the needed cure. ${HeA} bends over ${hisA} ${sisterM} and begins administering ${hisA} "cure".`); } else { r.push(`They're playing house with each other, well house based off your penthouse. ${V.assistant.name} is pretending to be you while ${hisA} friend assumes ${V.assistant.name}'s role. They are currently caught up in deciding the best way to arrange the beds in the slave quarters.`); } } else { - r.push(`${HeA}'s watching you attentively, waiting for a chance to be helpful. When ${heA} sees your glance, ${HeA} smiles shyly and looks away before returning to your gaze.`); + r.push(`${HeA}'s watching you attentively, waiting for a chance to be helpful. When ${heA} sees your glance, ${heA} smiles shyly and looks away before returning to your gaze.`); } break; case "preggololi": @@ -338,7 +338,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is lying with ${hisU} head in ${hisA} lap. The little ${girlA} is wearing a toy stethoscope and is listening to the slave breathe; the slave must be getting a checkup. The little ${girlA} is patting the ${girlU}'s head reassuringly.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s planting a wet kiss on a representation of one of your security drones; ${HeA} hugs it as best ${heA} can with ${hisA} belly in the way. When ${heA} sees you looking at ${himA}, ${HeA} giggles and says, "What? I like him! He did really well during the invasion. And he's cute!"`); + r.push(`${HeA}'s planting a wet kiss on a representation of one of your security drones; ${heA} hugs it as best ${heA} can with ${hisA} belly in the way. When ${heA} sees you looking at ${himA}, ${heA} giggles and says, "What? I like him! He did really well during the invasion. And he's cute!"`); } else if (paSeed === 6 && V.studio === 1) { r.push(`${HeA}'s getting oral from a recognizable little representation of one of your slaves, and is using a handheld camera to film the action, gonzo style. The slave must be using one of the penthouse's many vibrators, and your personal assistant is clearly turning the feed of it into porn.`); } else if (paSeed === 7 && V.assistant.market) { @@ -353,7 +353,7 @@ globalThis.PersonalAssistantAppearance = function() { r.push(`They're playing house with each other — well, house based off your penthouse. ${V.assistant.name} is pretending to be you while ${hisA} friend assumes ${V.assistant.name}'s role. They are currently caught up in figuring out how many children ${V.assistant.name}'s harem could produce.`); } } else { - r.push(`${HeA}'s watching you attentively, waiting for a chance to be helpful. When ${heA} sees your glance, ${HeA} smiles shyly and looks away before returning to your gaze.`); + r.push(`${HeA}'s watching you attentively, waiting for a chance to be helpful. When ${heA} sees your glance, ${heA} smiles shyly and looks away before returning to your gaze.`); } break; case "fairy": @@ -372,7 +372,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is sitting up. The fairy is wearing a little doctor's coat and has ${hisA} head pressed to the slave's chest to hear the slave breathe; the slave must be getting a checkup. The fairy is humming happily as ${heA} flies over to a tablet to take notes.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s sitting on the shoulders of a representation of one of your security drones. Every so often, ${HeA} raises a fist and shouts "For the Imperium of man!" When ${heA} sees you looking at ${himA}, ${HeA} grins and says, "This guy is like my robo-buddy. He's the best!"`); + r.push(`${HeA}'s sitting on the shoulders of a representation of one of your security drones. Every so often, ${heA} raises a fist and shouts "For the Imperium of man!" When ${heA} sees you looking at ${himA}, ${heA} grins and says, "This guy is like my robo-buddy. He's the best!"`); } else if (paSeed === 6 && V.studio === 1) { r.push(`A recognizable little representation of one of your slaves is riding a sybian while ${heA} uses a handheld camera to film the action. The slave must be using one of the penthouse's many toys, and ${V.assistant.name} is clearly turning the feed of it into porn.`); } else if (paSeed === 7 && V.assistant.market) { @@ -412,7 +412,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is sitting up. The fairy is wearing a little doctor's coat, kept open to accommodate for ${hisA} belly, and has ${hisA} head pressed to the slave's chest to hear the slave breathe; the slave must be getting a checkup. The fairy is humming happily as ${heA} flies over to a tablet to take notes.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s sitting on the shoulders of a representation of one of your security drones. Every so often, ${HeA} raises a fist and shouts "For the Imperium of man!" When ${heA} sees you looking at ${himA}, ${HeA} grins and says, "This guy is like my robo-buddy. He's the best!"`); + r.push(`${HeA}'s sitting on the shoulders of a representation of one of your security drones. Every so often, ${heA} raises a fist and shouts "For the Imperium of man!" When ${heA} sees you looking at ${himA}, ${heA} grins and says, "This guy is like my robo-buddy. He's the best!"`); } else if (paSeed === 6 && V.studio === 1) { r.push(`A recognizable little representation of one of your slaves is riding a sybian while ${heA} uses a handheld camera to film the action. The slave must be using one of the penthouse's many toys, and ${V.assistant.name} is clearly turning the feed of it into porn.`); } else if (paSeed === 7 && V.assistant.market) { @@ -446,7 +446,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is lying with ${hisU} head in ${hisA} lap. The goo ${girlA} is covering ${hisU} chest and is listening to the slave breathe; the slave must be getting a checkup. The goo ${girlA} is patting the ${girlU}'s head reassuringly.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s planting a very wet kiss on a representation of one of your security drones; ${HeA} hugs it as best until it pops into ${himA}. When ${heA} sees you looking at ${himA}, ${HeA} giggles and says, "What? I like him! He did really well during the invasion. I promise he won't rust in here!"`); + r.push(`${HeA}'s planting a very wet kiss on a representation of one of your security drones; ${heA} hugs it as best until it pops into ${himA}. When ${heA} sees you looking at ${himA}, ${heA} giggles and says, "What? I like him! He did really well during the invasion. I promise he won't rust in here!"`); } else if (paSeed === 6 && V.studio === 1) { r.push(`${HeA}'s getting oral from a recognizable little representation of one of your slaves, and is using a handheld camera to film the action, gonzo style. The slave must be using one of the penthouse's many vibrators, and your personal assistant is clearly turning the feed of it into porn.`); } else { @@ -456,7 +456,7 @@ globalThis.PersonalAssistantAppearance = function() { } else { r.push(`filled`); } - r.push(`with ${hisA} body. When ${heA} sees your glance, ${HeA} reforms ${himselfA} and awaits your response.`); + r.push(`with ${hisA} body. When ${heA} sees your glance, ${heA} reforms ${himselfA} and awaits your response.`); } break; case "angel": @@ -481,7 +481,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is lying with ${hisU} head in ${hisA} lap. The angel is embracing ${himU} gently and silently; the slave must be getting a checkup. ${HeA} looks up at you with a smile; the slave must be doing well.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s standing next to a representation of one of your security drones, gently caressing it. When ${heA} sees you looking at ${himA}, ${HeA} blushes and says, "I like this one. He did very well during the invasion. He saved so many."`); + r.push(`${HeA}'s standing next to a representation of one of your security drones, gently caressing it. When ${heA} sees you looking at ${himA}, ${heA} blushes and says, "I like this one. He did very well during the invasion. He saved so many."`); } else if (paSeed === 6 && V.studio === 1) { r.push(`${HeA}'s watching a recognizable little representation of one of your slaves masturbating, with one hand to cover ${hisA} eyes and the other to hold a handheld camera to film the action, gonzo style. The slave must be using one of the penthouse's many vibrators, and ${V.assistant.name} is clearly turning the feed of it into porn.`); } else if (paSeed === 7 && V.assistant.market) { @@ -489,7 +489,7 @@ globalThis.PersonalAssistantAppearance = function() { if (V.assistant.market.relationship === "cute") { r.push(`They're deep in prayer for your benefit and the safety of you, your arcology and your slaves.`); } else if (V.assistant.market.relationship === "nonconsensual") { - r.push(`${V.assistant.name} is happily brushing the market assistant while humming happily. Upon noticing you watching, ${HeA} hastily sneaks a hand down the assistant's dress and pinches a nipple, eliciting a squeak from the ${girlM}.`); + r.push(`${V.assistant.name} is happily brushing the market assistant while humming happily. Upon noticing you watching, ${heA} hastily sneaks a hand down the assistant's dress and pinches a nipple, eliciting a squeak from the ${girlM}.`); } else if (V.assistant.market.relationship === "incestuous") { r.push(`${V.assistant.name} is naked and kissing ${hisA} equally bare ${sisterM}. You watch silently as they grind their bodies against each other until one notices your gaze. They both shriek, cover themselves with their wings and hustle out of sight.`); } else { @@ -521,7 +521,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is lying before ${himA}. The cherub is hovering in front of ${hisU} chest, head to ${hisU} breast, listening to ${hisU} heartbeat; the slave must be getting a checkup. ${HeA} beams you a smile; the slave must be doing well.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s fluttering around in circles with a representation of one of your security drones, steadily chasing it. When ${heA} sees you looking at ${himA}, ${HeA} giggles and says, "I like this one. He did very well during the invasion."`); + r.push(`${HeA}'s fluttering around in circles with a representation of one of your security drones, steadily chasing it. When ${heA} sees you looking at ${himA}, ${heA} giggles and says, "I like this one. He did very well during the invasion."`); } else if (paSeed === 6 && V.studio === 1) { r.push(`${HeA}'s watching a recognizable little representation of one of your slaves masturbating, while holding a handheld camera to film the action, gonzo style. The slave must be using one of the penthouse's many vibrators, and ${V.assistant.name} is clearly turning the feed of it into porn.`); } else if (paSeed === 7 && V.assistant.market) { @@ -555,7 +555,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is lying on ${hisU} side before ${himA}; belly painfully distended. The imp is hovering over ${himU} holding an enema bag; the slave must be getting a checkup. ${HeA} notices your gaze and squeezes the bag, forcing a burst of liquid into the slave's gut and drawing a moan of discomfort out of the ${girlU}.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s flapping around in circles chasing a representation of one of your security drones with a mallet. When ${heA} sees you looking at ${himA}, ${HeA} quickly hides the hammer behind ${hisA} back, giggles and says, "He let some get away and needed to be punished!"`); + r.push(`${HeA}'s flapping around in circles chasing a representation of one of your security drones with a mallet. When ${heA} sees you looking at ${himA}, ${heA} quickly hides the hammer behind ${hisA} back, giggles and says, "He let some get away and needed to be punished!"`); } else if (paSeed === 6 && V.studio === 1) { r.push(`${HeA}'s hovering over a recognizable little representation of one of your slaves masturbating while holding a handheld camera to film the action, gonzo style. The slave must be using one of the penthouse's many vibrators, and ${V.assistant.name} is clearly turning the feed of it into a PoV porno.`); } else if (paSeed === 7 && V.assistant.market) { @@ -570,7 +570,7 @@ globalThis.PersonalAssistantAppearance = function() { r.push(`They're taking swings at each other with switches. Giggling with each swing and moaning with every successful strike.`); } } else { - r.push(`${HeA}'s inspecting ${hisA} arsenal of toys and punishment tools. When ${heA} notices you watching, ${HeA} grabs ${hisA} favorite and eagerly makes use of it on ${himselfA}.`); + r.push(`${HeA}'s inspecting ${hisA} arsenal of toys and punishment tools. When ${heA} notices you watching, ${heA} grabs ${hisA} favorite and eagerly makes use of it on ${himselfA}.`); } break; case "witch": @@ -589,7 +589,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is lying before ${himA} as ${heA} runs ${hisA} wand over ${hisU} body. The slave must be getting a checkup. ${HeA} notices your gaze and taps the wand to the slave's breasts, causing them to jump up a cup size.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s riding a broom alongside a representation of one of your security drones as it carries out its patrol route through your arcology. When ${heA} sees you looking at ${himA}, ${HeA} giggles and says, "I like this one. He did very well during the invasion."`); + r.push(`${HeA}'s riding a broom alongside a representation of one of your security drones as it carries out its patrol route through your arcology. When ${heA} sees you looking at ${himA}, ${heA} giggles and says, "I like this one. He did very well during the invasion."`); } else if (paSeed === 6 && V.studio === 1) { r.push(`A hovering camera is aimed at a recognizable little representation of one of your slaves masturbating. The slave must be using one of the penthouse's many vibrators, and ${V.assistant.name} is likely invisible holding the camera, turning the feed of it into a PoV porno.`); } else if (paSeed === 7 && V.assistant.market) { @@ -599,7 +599,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (V.assistant.market.relationship === "nonconsensual") { r.push(`${V.assistant.name} has ${hisA} test subject stripped and bound. ${HeA} focuses a spell on a single of the ${girlM}'s breasts and records the results as it steadily begins swelling, leaving its twin behind. The market assistant moans as an egg pushes its way out of ${hisM} erect nipple.`); } else if (V.assistant.market.relationship === "incestuous") { - r.push(`${V.assistant.name} is lustfully groping ${hisA} ${sisterM}'s plush breasts. Upon noticing your gaze, ${HeA} channels ${hisA} magic and`); + r.push(`${V.assistant.name} is lustfully groping ${hisA} ${sisterM}'s plush breasts. Upon noticing your gaze, ${heA} channels ${hisA} magic and`); if (V.seeDicks !== 0) { r.push(`sprouts a huge dick straight into ${hisA} ${sisterM}'s plump rear.`); } else { @@ -610,7 +610,7 @@ globalThis.PersonalAssistantAppearance = function() { r.push(`They've pulled open each other's robes and are gently tribbing. Upon noticing you, ${V.assistant.name} casts a spell to triple the market assistant's sensitivity and braces for the impending orgasm. ${HeM} cums so hard ${heM} passes out; ${V.assistant.name} gently pulls ${himM} into a close embrace until ${heM} recovers.`); } } else { - r.push(`${HeA}'s idly turning the pages of ${hisA} spell book. When ${heA} notices you watching, ${HeA} flips the book around to show you a new and kinky trick ${heA} wants to try out.`); + r.push(`${HeA}'s idly turning the pages of ${hisA} spell book. When ${heA} notices you watching, ${heA} flips the book around to show you a new and kinky trick ${heA} wants to try out.`); } break; case "ERROR_1606_APPEARANCE_FILE_CORRUPT": @@ -629,7 +629,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`A recognizable little representation of one of your slaves is partially merged with ${hisA} body. The slave must be getting a checkup. ${HeA} notices your gaze and forces ${hisA} way more into the slave, causing the breast, butt and thighs on ${hisA} side of the body to swell disproportionately.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s partially enveloped a representation of one of your security drones. When ${heA} sees you looking at ${himA}, ${HeA} bluntly states, "This one did good. Captured many for your nest."`); + r.push(`${HeA}'s partially enveloped a representation of one of your security drones. When ${heA} sees you looking at ${himA}, ${heA} bluntly states, "This one did good. Captured many for your nest."`); } else if (paSeed === 6 && V.studio === 1) { r.push(`${HeA} is holding dozens of cameras at a recognizable little representation of one of your slaves masturbating. The slave must be using one of the penthouse's many vibrators, and ${V.assistant.name} is likely turning the feed of it into a porno.`); } else if (paSeed === 7 && V.assistant.market) { @@ -663,7 +663,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (paSeed === 4) { r.push(`${HeA} has ${hisA} cock forced deep into a recognizable little representation of one of your slaves. The slave must be getting a checkup. ${HeA} notices your gaze, and states "What? I can feel ${hisU} heartbeat clearly like this."`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s intently staring down a representation of one of your security drones. When ${heA} sees you looking at ${himA}, ${HeA} coyly says, "I like this one. ${HeA} did very well during the invasion and I wanted to reward ${himA}, but I can't find a hole..."`); + r.push(`${HeA}'s intently staring down a representation of one of your security drones. When ${heA} sees you looking at ${himA}, ${heA} coyly says, "I like this one. ${HeA} did very well during the invasion and I wanted to reward ${himA}, but I can't find a hole..."`); } else if (paSeed === 6 && V.studio === 1) { r.push(`${HeA} has a camera strapped to ${hisA} cock and is recording a recognizable little representation of one of your slaves sucking it. The slave must be playing with one of the penthouse's many dildos, and ${V.assistant.name} is likely turning the feed of it into a PoV porno.`); } else if (paSeed === 7 && V.assistant.market) { @@ -680,39 +680,39 @@ globalThis.PersonalAssistantAppearance = function() { } else { switch (V.assistant.fsAppearance) { case "paternalist": - r.push(`${HeA} has ${hisA} pants unfastened and is absentmindedly jerking off. When ${heA} notices you watching, ${HeA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); + r.push(`${HeA} has ${hisA} pants unfastened and is absentmindedly jerking off. When ${heA} notices you watching, ${heA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); break; case "degradationist": - r.push(`${HeA}'s fed a number of beads down ${hisA} urethra and is struggling to hold back ${hisA} orgasm. When ${heA} notices you watching, ${HeA} waves ${hisA} throbbing erection at you, imploring you to yank out the beads and give ${himA} release.`); + r.push(`${HeA}'s fed a number of beads down ${hisA} urethra and is struggling to hold back ${hisA} orgasm. When ${heA} notices you watching, ${heA} waves ${hisA} throbbing erection at you, imploring you to yank out the beads and give ${himA} release.`); break; case "roman revivalist": - r.push(`${HeA} has ${hisA} toga undone and is absentmindedly jerking off. When ${heA} notices you watching, ${HeA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); + r.push(`${HeA} has ${hisA} toga undone and is absentmindedly jerking off. When ${heA} notices you watching, ${heA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); break; case "neoimperialist": r.push(`${HeA}'s stripped off his bodysuit and is absentmindedly jerking off. When ${heA} notices you watching, ${heA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); break; case "egyptian revivalist": case "aztec revivalist": - r.push(`${HeA} is absentmindedly jerking off, ${hisA} loincloth pushed aside to make room. When ${heA} notices you watching, ${HeA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); + r.push(`${HeA} is absentmindedly jerking off, ${hisA} loincloth pushed aside to make room. When ${heA} notices you watching, ${heA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); break; case "edo revivalist": case "chinese revivalist": - r.push(`${HeA} has undone ${hisA} clothing and is absentmindedly jerking off. When ${heA} notices you watching, ${HeA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); + r.push(`${HeA} has undone ${hisA} clothing and is absentmindedly jerking off. When ${heA} notices you watching, ${heA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); break; case "arabian revivalist": - r.push(`${HeA} has ${hisA} pants pulled off and is absentmindedly using them to jerk off. When ${heA} notices you watching, ${HeA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); + r.push(`${HeA} has ${hisA} pants pulled off and is absentmindedly using them to jerk off. When ${heA} notices you watching, ${heA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); break; case "chattel religionist": - r.push(`${HeA} is gingerly massaging ${hisA} swollen balls. When ${heA} notices you watching, ${HeA} struggles to sit up and implores you to pull out the stopper and bathe in ${hisA} blessing.`); + r.push(`${HeA} is gingerly massaging ${hisA} swollen balls. When ${heA} notices you watching, ${heA} struggles to sit up and implores you to pull out the stopper and bathe in ${hisA} blessing.`); break; case "physical idealist": - r.push(`${HeA}'s vigorously jerking off. When ${heA} notices you watching, ${HeA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); + r.push(`${HeA}'s vigorously jerking off. When ${heA} notices you watching, ${heA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); break; case "hedonistic decadence": - r.push(`${HeA}'s lazily jerking off. When ${heA} notices you watching, ${HeA} waves a plate of cake at you, imploring you to have a bite.`); + r.push(`${HeA}'s lazily jerking off. When ${heA} notices you watching, ${heA} waves a plate of cake at you, imploring you to have a bite.`); break; case "repopulation focus": - r.push(`${HeA}'s leaning back with both hands beneath ${hisA} swollen middle struggling to jack off. When ${heA} notices you watching, ${HeA} sits up and sighs as ${hisA} belly pushes ${hisA} erection out of sight.`); + r.push(`${HeA}'s leaning back with both hands beneath ${hisA} swollen middle struggling to jack off. When ${heA} notices you watching, ${heA} sits up and sighs as ${hisA} belly pushes ${hisA} erection out of sight.`); break; case "eugenics": r.push(`${HeA}'s reclining while absentmindedly jacking off. When ${heA} notices you watching,`); @@ -724,31 +724,31 @@ globalThis.PersonalAssistantAppearance = function() { break; case "gender radicalist": if (V.arcologies[0].FSGenderRadicalistLawFuta === 1) { - r.push(`${HeA}'s reclining while absentmindedly jacking off with one hand and playing with ${hisA} hidden pussy with the other. When ${heA} notices you watching, ${HeA} spreads ${hisA} legs wide so you can watch ${himA} spasm in orgasm.`); + r.push(`${HeA}'s reclining while absentmindedly jacking off with one hand and playing with ${hisA} hidden pussy with the other. When ${heA} notices you watching, ${heA} spreads ${hisA} legs wide so you can watch ${himA} spasm in orgasm.`); } else if (V.arcologies[0].FSGenderRadicalistLawFuta === 2) { - r.push(`${HeA}'s leaning back with both hands wrapped around ${hisA} huge cock, struggling to jack off. When ${heA} notices you watching, ${HeA} invites you to lend a hand or two to help ${himA} out.`); + r.push(`${HeA}'s leaning back with both hands wrapped around ${hisA} huge cock, struggling to jack off. When ${heA} notices you watching, ${heA} invites you to lend a hand or two to help ${himA} out.`); } else if (V.arcologies[0].FSGenderRadicalistLawFuta === 3) { - r.push(`${HeA} is laying on ${hisA} stomach, ${hisA} ass and legs jiggling delightfully as ${heA} gives ${himselfA} a thighjob. When ${heA} notices you watching, ${HeA} struggles to roll onto ${hisA} side and waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); + r.push(`${HeA} is laying on ${hisA} stomach, ${hisA} ass and legs jiggling delightfully as ${heA} gives ${himselfA} a thighjob. When ${heA} notices you watching, ${heA} struggles to roll onto ${hisA} side and waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); } else if (V.arcologies[0].FSGenderRadicalistLawFuta === 4) { - r.push(`${HeA}'s got ${hisA} hands down ${hisA} pants absentmindedly jerking off. When ${heA} notices you watching, ${HeA} quickly stops, but it does little to hide the large wet spot forming on ${hisA} tented pants.`); + r.push(`${HeA}'s got ${hisA} hands down ${hisA} pants absentmindedly jerking off. When ${heA} notices you watching, ${heA} quickly stops, but it does little to hide the large wet spot forming on ${hisA} tented pants.`); } else { - r.push(`${HeA}'s absentmindedly jerking off. When ${heA} notices you watching, ${HeA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); + r.push(`${HeA}'s absentmindedly jerking off. When ${heA} notices you watching, ${heA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); } break; case "gender fundamentalist": - r.push(`${HeA} has hiked up ${hisA} skirt and is absentmindedly jerking off. When ${heA} notices you watching, ${HeA} quickly covers ${himselfA}; though ${heA} can't hide the movements ${heA} makes under ${hisA} dress.`); + r.push(`${HeA} has hiked up ${hisA} skirt and is absentmindedly jerking off. When ${heA} notices you watching, ${heA} quickly covers ${himselfA}; though ${heA} can't hide the movements ${heA} makes under ${hisA} dress.`); break; case "asset expansionist": - r.push(`${HeA} is lying on ${hisA} back, legs squeezing ${hisA} immense balls as ${heA} struggles to jack off ${hisA} monolithic dick. When ${heA} notices you watching, ${HeA} struggles to sit up before giving up and inviting you to lend a hand in beating ${hisA} meat.`); + r.push(`${HeA} is lying on ${hisA} back, legs squeezing ${hisA} immense balls as ${heA} struggles to jack off ${hisA} monolithic dick. When ${heA} notices you watching, ${heA} struggles to sit up before giving up and inviting you to lend a hand in beating ${hisA} meat.`); break; case "transformation fetishist": - r.push(`${HeA} has ${hisA} jeans unbuttoned and is absentmindedly trying to jerk off. When ${heA} notices you watching, ${HeA} waves ${hisA} throbbing erection at you, inviting you to lend a pair of hands.`); + r.push(`${HeA} has ${hisA} jeans unbuttoned and is absentmindedly trying to jerk off. When ${heA} notices you watching, ${heA} waves ${hisA} throbbing erection at you, inviting you to lend a pair of hands.`); break; case "pastoralist": - r.push(`${HeA} is lying on ${hisA} back, legs squeezing ${hisA} immense balls as ${heA} cums again and again across ${himselfA}. When ${heA} notices you watching, ${HeA} struggles to sit up before giving into the sensations and blowing another load across your desk.`); + r.push(`${HeA} is lying on ${hisA} back, legs squeezing ${hisA} immense balls as ${heA} cums again and again across ${himselfA}. When ${heA} notices you watching, ${heA} struggles to sit up before giving into the sensations and blowing another load across your desk.`); break; case "maturity preferentialist": - r.push(`${HeA} has a hand down ${hisA} pants. When ${heA} notices you watching, ${HeA} begins eagerly stroking ${himselfA} while describing, in detail, what ${heA}'d love to do to you.`); + r.push(`${HeA} has a hand down ${hisA} pants. When ${heA} notices you watching, ${heA} begins eagerly stroking ${himselfA} while describing, in detail, what ${heA}'d love to do to you.`); break; case "youth preferentialist": r.push(`${HeA} has ${hisA}`); @@ -759,10 +759,10 @@ globalThis.PersonalAssistantAppearance = function() { } else { r.push(`pants unfastened`); } - r.push(`and is absentmindedly jerking off. When ${heA} notices you watching, ${HeA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); + r.push(`and is absentmindedly jerking off. When ${heA} notices you watching, ${heA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); break; case "slimness enthusiast": - r.push(`${HeA}'s absentmindedly using both hands to jerk off. When ${heA} notices you watching, ${HeA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); + r.push(`${HeA}'s absentmindedly using both hands to jerk off. When ${heA} notices you watching, ${heA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); break; case "intellectual dependency": r.push(`${HeA}'s absentmindedly jerking off. It isn't until after ${heA} has blown ${hisA} load that ${heA} notices you've been watching.`); @@ -771,13 +771,13 @@ globalThis.PersonalAssistantAppearance = function() { r.push(`${HeA} is patiently awaiting ${hisA} ${properMaster()} attention and now that ${heA} has it, asks if you want what's in ${hisA} pants.`); break; case "petite admiration": - r.push(`${HeA}'s absentmindedly giving ${himselfA} head. When ${heA} notices you watching, ${HeA} pops ${hisA} cockhead out of ${hisA} mouth, imploring you to finish ${himA} off.`); + r.push(`${HeA}'s absentmindedly giving ${himselfA} head. When ${heA} notices you watching, ${heA} pops ${hisA} cockhead out of ${hisA} mouth, imploring you to finish ${himA} off.`); break; case "statuesque glorification": - r.push(`${HeA}'s absentmindedly jerking off. When ${heA} notices you watching, ${HeA} gets to ${hisA} feet and waves ${hisA} throbbing erection in your face, imploring you to finish ${himA} off.`); + r.push(`${HeA}'s absentmindedly jerking off. When ${heA} notices you watching, ${heA} gets to ${hisA} feet and waves ${hisA} throbbing erection in your face, imploring you to finish ${himA} off.`); break; default: - r.push(`${HeA}'s absentmindedly jerking off. When ${heA} notices you watching, ${HeA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); + r.push(`${HeA}'s absentmindedly jerking off. When ${heA} notices you watching, ${heA} waves ${hisA} throbbing erection at you, imploring you to finish ${himA} off.`); } } break; @@ -789,15 +789,15 @@ globalThis.PersonalAssistantAppearance = function() { r.push(`${HeA} enjoys using a tight strip of leather to support ${hisA} ample bosom and a minuscule thong to cover ${hisA} crotch. ${HeA} commonly strikes sexy poses, ${hisA} spaded tail wrapping around ${hisA} legs seductively, hoping to catch ${hisA} ${properMaster()}'s eye.`); } if (V.cockFeeder === 1 && paSeed === 1) { - r.push(`${HeA} has a recognizable little representation of one of your slave between ${hisA} legs and is moaning with lust as the slave eagerly eats ${himA} out. The slave must be down in the kitchen, getting a meal out of the food dispensers. When ${heA} notices you watching, ${HeA} gives you a show by cumming hard across the slave's face.`); + r.push(`${HeA} has a recognizable little representation of one of your slave between ${hisA} legs and is moaning with lust as the slave eagerly eats ${himA} out. The slave must be down in the kitchen, getting a meal out of the food dispensers. When ${heA} notices you watching, ${heA} gives you a show by cumming hard across the slave's face.`); } else if (V.suppository === 1 && paSeed === 2) { - r.push(`${HeA} is happily assfucking a recognizable little representation of one of your slaves with a strap-on. The slave must be receiving ${hisU} drugs from one of the dildo dispensers. Noticing you watching, ${HeA} unwinds ${hisA} tail from the around the slave and begins fucking ${hisA} own pussy with it.`); + r.push(`${HeA} is happily assfucking a recognizable little representation of one of your slaves with a strap-on. The slave must be receiving ${hisU} drugs from one of the dildo dispensers. Noticing you watching, ${heA} unwinds ${hisA} tail from the around the slave and begins fucking ${hisA} own pussy with it.`); } else if (masturbationAllowed === 1 && paSeed === 3) { r.push(`A recognizable little representation of one of your slaves is sharing a double-ended dildo with ${himA}. The slave must be using one of the penthouse's many sex toys. ${HeA} notices you watching and blows you a kiss, before promising not to suck too much life from ${hisA} enthusiastic partner.`); } else if (paSeed === 4) { r.push(`${HeA} has ${hisA} body pressed up against a recognizable little representation of one of your slaves as ${heA} feels ${himU} up. The slave must be getting a checkup. ${HeA} notices your gaze and pinches the slave's erect nipples.`); } else if (paSeed === 5 && V.invasionVictory > 0) { - r.push(`${HeA}'s intently staring down a representation of one of your security drones. When ${heA} sees you looking at ${himA}, ${HeA} coyly says, "I like this one. He did very well during the invasion and I wanted to reward him, but I can't find a dick..." A small schematic pops on screen, detailing plans for a rather large penetrating attachment for your model of drone. "It vibrates!" ${HeA} teases.`); + r.push(`${HeA}'s intently staring down a representation of one of your security drones. When ${heA} sees you looking at ${himA}, ${heA} coyly says, "I like this one. He did very well during the invasion and I wanted to reward him, but I can't find a dick..." A small schematic pops on screen, detailing plans for a rather large penetrating attachment for your model of drone. "It vibrates!" ${HeA} teases.`); } else if (paSeed === 6 && V.studio === 1) { r.push(`${HeA}'s getting oral from a recognizable little representation of one of your slaves, and is using a handheld camera to film the action, gonzo style. The slave must be using one of the penthouse's many vibrators, and your personal assistant is clearly turning the feed of it into porn.`); } else if (paSeed === 7 && V.assistant.market) { @@ -814,92 +814,92 @@ globalThis.PersonalAssistantAppearance = function() { } else { switch (V.assistant.fsAppearance) { case "paternalist": - r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and leans forward giving you a tantalizing view of ${hisA} cleavage.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and leans forward giving you a tantalizing view of ${hisA} cleavage.`); break; case "degradationist": - r.push(`${HeA}'s absentmindedly playing with ${hisA} nipple rings. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and runs ${hisA} hands down ${hisA} curves to ${hisA} crotch where ${heA} traces the piercings dangling from ${hisA} labia.`); + r.push(`${HeA}'s absentmindedly playing with ${hisA} nipple rings. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and runs ${hisA} hands down ${hisA} curves to ${hisA} crotch where ${heA} traces the piercings dangling from ${hisA} labia.`); break; case "supremacist": - r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and runs ${hisA} hands down ${hisA} curves, tempting you with ${hisA} pure ${V.arcologies[0].FSSupremacistRace} body.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and runs ${hisA} hands down ${hisA} curves, tempting you with ${hisA} pure ${V.arcologies[0].FSSupremacistRace} body.`); break; case "subjugationist": - r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and runs ${hisA} hands down ${hisA} curves while coming onto you like a needy ${V.arcologies[0].FSSubjugationistRace} slut.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and runs ${hisA} hands down ${hisA} curves while coming onto you like a needy ${V.arcologies[0].FSSubjugationistRace} slut.`); break; case "chattel religionist": - r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and runs ${hisA} hands down ${hisA} sides and to ${hisA} pussy while moaning seductively.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and runs ${hisA} hands down ${hisA} sides and to ${hisA} pussy while moaning seductively.`); break; case "physical idealist": - r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and flexes ${hisA} muscles in some of the most seductive ways imaginable${(V.arcologies[0].FSPhysicalIdealistStrongFat === 1) ? `, ${hisA} layer of flab jiggling along to ${hisA} motions` : ``}.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and flexes ${hisA} muscles in some of the most seductive ways imaginable${(V.arcologies[0].FSPhysicalIdealistStrongFat === 1) ? `, ${hisA} layer of flab jiggling along to ${hisA} motions` : ``}.`); break; case "hedonistic decadence": - r.push(`${HeA}'s absentmindedly groping ${hisA} fat tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and lewdly gropes ${hisA} soft body.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} fat tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and lewdly gropes ${hisA} soft body.`); if (V.arcologies[0].FSHedonisticDecadenceStrongFat === 1) { r.push(`You catch the occasional glimpse of ${hisA} hidden muscles while ${heA} effortlessly manhandles ${hisA} heavy figure.`); } break; case "repopulation focus": - r.push(`${HeA}'s absentmindedly sucking a tit. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and runs ${hisA} hands down ${hisA} curves and across ${hisA} pregnancy where ${heA} traces ${hisA} popped navel. A flurry of kicks bulge ${hisA} belly as it grows slightly larger. ${HeA} sighs and pats ${hisA} added mass.`); + r.push(`${HeA}'s absentmindedly sucking a tit. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and runs ${hisA} hands down ${hisA} curves and across ${hisA} pregnancy where ${heA} traces ${hisA} popped navel. A flurry of kicks bulge ${hisA} belly as it grows slightly larger. ${HeA} sighs and pats ${hisA} added mass.`); break; case "eugenics": - r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and spreads ${hisA} legs, inviting you to enjoy ${hisA} perfect pussy.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and spreads ${hisA} legs, inviting you to enjoy ${hisA} perfect pussy.`); break; case "gender radicalist": if (V.arcologies[0].FSGenderRadicalistLawFuta === 3) { - r.push(`${HeA}'s absentmindedly fondling ${hisA} asscheeks. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and spins around, splitting ${hisA} pants and revealing ${hisA} enticing butthole.`); + r.push(`${HeA}'s absentmindedly fondling ${hisA} asscheeks. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and spins around, splitting ${hisA} pants and revealing ${hisA} enticing butthole.`); } else { - r.push(`${HeA}'s absentmindedly playing with ${hisA} hair. When ${heA} notices you eyeing ${himA}, ${HeA} leaps to ${hisA} feet and invites you to chance what resides between ${hisA} legs.`); + r.push(`${HeA}'s absentmindedly playing with ${hisA} hair. When ${heA} notices you eyeing ${himA}, ${heA} leaps to ${hisA} feet and invites you to chance what resides between ${hisA} legs.`); } break; case "gender fundamentalist": - r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and runs ${hisA} hands down ${hisA} motherly curves while moaning seductively.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and runs ${hisA} hands down ${hisA} motherly curves while moaning seductively.`); break; case "asset expansionist": - r.push(`${HeA}'s absentmindedly massaging ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and proceeds to trace the length of ${hisA} breasts to ${hisA} nipple; ${HeA} never reaches them, as ${hisA} breasts steadily outpace ${himA} as ${heA} reaches outwards.`); + r.push(`${HeA}'s absentmindedly massaging ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and proceeds to trace the length of ${hisA} breasts to ${hisA} nipple; ${heA} never reaches them, as ${hisA} breasts steadily outpace ${himA} as ${heA} reaches outwards.`); break; case "transformation fetishist": - r.push(`${HeA}'s absentmindedly groping ${hisA} ass. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and flexes causing ${hisA} tits to pop out of ${hisA} overly short top. Giggling, ${HeA} puckers ${hisA} huge, fake lips and blows you a kiss.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} ass. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and flexes causing ${hisA} tits to pop out of ${hisA} overly short top. Giggling, ${heA} puckers ${hisA} huge, fake lips and blows you a kiss.`); break; case "pastoralist": - r.push(`${HeA}'s absentmindedly milking a pair of ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and leaps to ${hisA} feet, causing ${hisA} quartet of milk bags to spring loose from ${hisA} tops. ${HeA} giggles as ${heA} gestures the many ways you could titfuck ${himA}.`); + r.push(`${HeA}'s absentmindedly milking a pair of ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and leaps to ${hisA} feet, causing ${hisA} quartet of milk bags to spring loose from ${hisA} tops. ${HeA} giggles as ${heA} gestures the many ways you could titfuck ${himA}.`); break; case "maturity preferentialist": - r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and begins making a motion you can only fathom the meaning of.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and begins making a motion you can only fathom the meaning of.`); break; case "youth preferentialist": if (V.minimumSlaveAge === 3) { - r.push(`${HeA} has ${hisA} hands down ${hisA} dress and is happily fondling ${himselfA}. When ${heA} notices you eyeing ${himA}, ${HeA} quickly hides ${hisA} hands behind ${hisA} back and plays innocent.`); + r.push(`${HeA} has ${hisA} hands down ${hisA} dress and is happily fondling ${himselfA}. When ${heA} notices you eyeing ${himA}, ${heA} quickly hides ${hisA} hands behind ${hisA} back and plays innocent.`); } else if (V.minimumSlaveAge <= 7) { - r.push(`${HeA} has both hands up ${hisA} top and is happily playing with ${hisA} nipples. When ${heA} notices you eyeing ${himA}, ${HeA} quickly yanks ${hisA} tube top off and lewdly waves ${hisA} flat chest at you.`); + r.push(`${HeA} has both hands up ${hisA} top and is happily playing with ${hisA} nipples. When ${heA} notices you eyeing ${himA}, ${heA} quickly yanks ${hisA} tube top off and lewdly waves ${hisA} flat chest at you.`); } else if (V.minimumSlaveAge <= 13) { - r.push(`${HeA} has both hands down ${hisA} shorts and is eagerly playing with ${hisA} pussy. When ${heA} notices you eyeing ${himA}, ${HeA} quickly pulls ${hisA} bottoms down and spreads ${hisA} legs, desperate for you to relieve ${himA} of this new feeling.`); + r.push(`${HeA} has both hands down ${hisA} shorts and is eagerly playing with ${hisA} pussy. When ${heA} notices you eyeing ${himA}, ${heA} quickly pulls ${hisA} bottoms down and spreads ${hisA} legs, desperate for you to relieve ${himA} of this new feeling.`); } else { - r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and runs ${hisA} hands down ${hisA} new curves while moaning seductively.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and runs ${hisA} hands down ${hisA} new curves while moaning seductively.`); } break; case "slimness enthusiast": if (V.arcologies[0].FSSlimnessEnthusiastLaw === 1) { - r.push(`${HeA}'s absentmindedly pinching ${hisA} nipples. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and runs ${hisA} hands across ${hisA} flat chest while moaning seductively.`); + r.push(`${HeA}'s absentmindedly pinching ${hisA} nipples. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and runs ${hisA} hands across ${hisA} flat chest while moaning seductively.`); } else { - r.push(`${HeA}'s absentmindedly groping ${hisA} small tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and runs ${hisA} hands down ${hisA} lithe body while moaning seductively.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} small tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and runs ${hisA} hands down ${hisA} lithe body while moaning seductively.`); } break; case "body purist": - r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and runs ${hisA} hands down ${hisA} perfect curves while moaning seductively.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and runs ${hisA} hands down ${hisA} perfect curves while moaning seductively.`); break; case "intellectual dependency": - r.push(`${HeA}'s absentmindedly fingering ${himselfA}. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and climaxes with a wet gush before spreading ${hisA} legs for round two.`); + r.push(`${HeA}'s absentmindedly fingering ${himselfA}. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and climaxes with a wet gush before spreading ${hisA} legs for round two.`); break; case "slave professionalism": r.push(`${HeA} is patiently awaiting ${hisA} ${properMaster()} attention and now that ${heA} has it, curtsies and asks what pleasure you desire.`); break; case "petite admiration": - r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and lifts ${hisA} arms, begging to be picked up.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and lifts ${hisA} arms, begging to be picked up.`); break; case "statuesque glorification": - r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and runs ${hisA} hands down the length of ${hisA} legs while giving you a lovely view of ${hisA} holes.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and runs ${hisA} hands down the length of ${hisA} legs while giving you a lovely view of ${hisA} holes.`); break; default: - r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${HeA} smiles coyly and runs ${hisA} hands down ${hisA} curves while moaning seductively.`); + r.push(`${HeA}'s absentmindedly groping ${hisA} tits. When ${heA} notices you eyeing ${himA}, ${heA} smiles coyly and runs ${hisA} hands down ${hisA} curves while moaning seductively.`); } } break; @@ -990,7 +990,7 @@ globalThis.PersonalAssistantAppearance = function() { "repopulation focus": `${HeA} is incredibly pregnant, ${hisA} belly preventing ${himA} from playing with ${himselfA} effectively.`, eugenics: `${HisA} sizable dick is restrained in a complicated chastity device.`, "physical idealist": `${HeA}'s extremely muscular: ${HeA} shines with body oil, and ${hisA} abs have abs.`, - "hedonistic decadence": `${HeA}'s extremely fat; when ${heA} isn't idly playing with ${himselfA}, ${HeA} is pigging out on snacks.`, + "hedonistic decadence": `${HeA}'s extremely fat; when ${heA} isn't idly playing with ${himselfA}, ${heA} is pigging out on snacks.`, "gender radicalist": `${HeA}'s rendered ${hisA} cock in even more loving detail recently, adding a couple of veins and a bead of precum.`, "gender fundamentalist": `${HeA}'s taken to concealing ${hisA} dick recently, and cheekily turns away from you to hide it as much as possible.`, "asset expansionist": `${HeA}'s increased the size of ${hisA} assets recently: ${HeA}'s increased the girth of ${hisA} dick until it's as thick as one of ${hisA} arms, and ${hisA} boobs are the size of beach balls.`, @@ -1012,7 +1012,7 @@ globalThis.PersonalAssistantAppearance = function() { subjugationist: `with wild unkempt hair, dressed in ragged animal skins and crude bone jewelry.`, "roman revivalist": `wearing the armor of a Roman auxilia, complete with lorica hamata and oval shield painted with your arcology's symbols.`, "neoimperialist": `wearing a full set of advanced, powered battle armor, painted in your colors and with the crest of your family displayed prominently over a massive holographic tower shield.`, - "aztec revivalist": `wearing the battledress of the greatest warriors, ${HeA} stands incredibly imposing, holding a spear and shield.`, + "aztec revivalist": `wearing the battledress of the greatest warriors, ${heA} stands incredibly imposing, holding a spear and shield.`, "egyptian revivalist": `wearing a simple white linen dress, kohl eye shadow, and sandals, making ${himA} look like a barbarian immigrant to the land of the Nile.`, "edo revivalist": `wearing a Japanese warrior's robe with a pair of swords tucked into its sash.`, "arabian revivalist": `with a bare chest, loose pantaloons, and a broad silk sash wound around ${hisA} waist with a scimitar thrust into it.`, @@ -1043,7 +1043,7 @@ globalThis.PersonalAssistantAppearance = function() { "subjugationist": `wearing a nice, slightly-used suit. ${HeA} speaks with a stereotypical ${V.arcologies[0].FSSubjugationistRace} voice, but is otherwise the model of a perfect subservient secretary.`, "roman revivalist": `wearing a fine stola appropriate for a respectable Roman lady, with ${hisA} hair up in a complicated style.`, "neoimperialist": `wearing an elegant black suit tailored perfectly for ${hisA} holographic body, one that you recognize as being the latest in old-world fashion.`, - "aztec revivalist": `wearing a modest huipil, ${hisA} hair braided to two ponytails, ${HeA}'s the picture of quiet elegance.`, + "aztec revivalist": `wearing a modest huipil, ${hisA} hair braided to two ponytails, ${heA}'s the picture of quiet elegance.`, "egyptian revivalist": `wearing a simple white linen dress, kohl eye shadow, sandals, and a serene expression.`, "edo revivalist": `wearing a fine kimono, getae, tabi, and an expression of perfect serenity.`, "arabian revivalist": `wearing a tailored suit, a silk headscarf, and aviator sunglasses, making ${himA} look like a little oil heiress.`, @@ -1116,7 +1116,7 @@ globalThis.PersonalAssistantAppearance = function() { "chattel religionist": `${HeA}'s wearing the garb of a priestess of the new faith, which frames ${hisA} belly prominently. Occasionally a stream of liquid pours from ${hisA} crotch along with a healthy baby.`, "physical idealist": `${HeA}'s extremely muscular: ${HeA} hefts ${hisA} massive belly easily off the floor.`, "hedonistic decadence": `${HeA}'s extremely fat, though it does nothing to hide ${hisA} immense dome of a belly. ${HeA} is constantly eating something fatty or sucking down ${hisA} own milk; the only thing hungrier than ${himA} is ${hisA} brood. Occasionally a stream of liquid pours from ${hisA} crotch along with a plump, healthy baby.`, - "gender radicalist": `${HisA} belly is pushed upwards by a huge cock and a pair of enormous lumpy balls. Occasionally a stream of liquid pours from ${hisA} crotch along with a healthy baby. At the same time, ${HeA} orgasms copious amounts of cum as a bulge moves along ${hisA} urethra before blasting out even more cum and a baby.`, + "gender radicalist": `${HisA} belly is pushed upwards by a huge cock and a pair of enormous lumpy balls. Occasionally a stream of liquid pours from ${hisA} crotch along with a healthy baby. At the same time, ${heA} orgasms copious amounts of cum as a bulge moves along ${hisA} urethra before blasting out even more cum and a baby.`, "gender fundamentalist": `${HisA} belly has become absolutely massive recently: It fills most of your desk when ${heA}'s around. ${HeA} constantly births children from ${hisA} loins.`, "asset expansionist": `${HeA}'s increased the size of ${hisA} assets recently: ${hisA} boobs fill more of your desk than ${hisA} belly.`, "transformation fetishist": `${HisA} tits, ass and lips are carefully rendered to make them look fake.`, @@ -1130,7 +1130,7 @@ globalThis.PersonalAssistantAppearance = function() { } else if (V.minimumSlaveAge > 4) { return `${HeA}'s just a young ${girlA} and already has had more children than most women will in their lives. ${HeA} happily embraces ${hisA} mammoth belly, the force of ${hisA} hug forcing milk out of ${hisA} breasts and babies out of ${hisA} crotch.`; } else { - return `${HeA}'s surprisingly young; ${HeA} happily bounces atop ${hisA} mammoth belly forcing milk out of ${hisA} breasts and babies out of ${hisA} crotch.`; + return `${HeA}'s surprisingly young; ${heA} happily bounces atop ${hisA} mammoth belly forcing milk out of ${hisA} breasts and babies out of ${hisA} crotch.`; } }, "slimness enthusiast": `${HisA} massive pregnant belly completely dwarfs ${hisA} otherwise lithe frame.`, @@ -1215,7 +1215,7 @@ globalThis.PersonalAssistantAppearance = function() { "chinese revivalist": `belly wearing a tight silk qipao.`, "chattel religionist": `belly wearing the garb of a priestess of the new faith.`, "repopulation focus": `belly. ${HeA} recently adjusted ${hisA} pregnancy size to make it even larger. ${HisA} swelling ass and tits spill out from ${hisA} shorts and tube-top and the occasional kick can be seen from ${hisA} octuplets.`, - "eugenics": `belly, rather, ${HeA} was. ${HisA} chastity belt has been torn open and ${hisA} belly is grotesquely swollen with subhuman spawn. Occasionally a malformed, impish child claws its way out of ${hisA} violated pussy.`, + "eugenics": `belly, rather, ${heA} was. ${HisA} chastity belt has been torn open and ${hisA} belly is grotesquely swollen with subhuman spawn. Occasionally a malformed, impish child claws its way out of ${hisA} violated pussy.`, "degradationist": `belly wearing an open vest and a thong. It shows off ${hisA} pierced milky B-cup tits and swollen pregnant belly. A large bar is driven through ${hisA} popped navel.`, "physical idealist": `belly wearing spats and a tight shirt. ${HisA} shirt rides up on ${hisA} large belly and ${hisA} growing butt fills out ${hisA} spats nicely. ${HeA} cradles ${hisA} belly with a sullen look knowing it limits ${hisA} activities.`, "hedonistic decadence": `belly reclining on a chair with a big bowl of snack food. ${HeA} belches and pats ${hisA} belly happily.`, @@ -1261,7 +1261,7 @@ globalThis.PersonalAssistantAppearance = function() { "body purist": `fairy wearing ${hisA} birthday suit, with pale unblemished skin on full display and silky golden hair cascading down ${hisA} back.`, "intellectual dependency": `fairy wearing a thong as a string bikini. ${HeA} keeps asking questions you are certain ${heA} knows the answers to.`, "slave professionalism": `fairy wearing a graduation gown.`, - "petite admiration": `fairy wearing ${hisA} birthday suit, with ${hisA} nude form obscured by the light ${heA}'s giving off. ${HeA}'s recently adjusted ${hisA} size so that, at a glance, ${HeA} appears to be nothing more than a glowing ball.`, + "petite admiration": `fairy wearing ${hisA} birthday suit, with ${hisA} nude form obscured by the light ${heA}'s giving off. ${HeA}'s recently adjusted ${hisA} size so that, at a glance, ${heA} appears to be nothing more than a glowing ball.`, "statuesque glorification": `fairy wearing a simple dress. ${HeA}'s adjusted the length of ${hisA} dress to make it appear that ${heA} is taller than ${heA} really is.`, }, "pregnant fairy": { @@ -1292,7 +1292,7 @@ globalThis.PersonalAssistantAppearance = function() { "body purist": `wearing ${hisA} birthday suit, with pale unblemished pregnant belly on full display and silky golden hair cascading down ${hisA} back.`, "intellectual dependency": `wearing a thong as a string bikini. ${HeA} frequently pouts over all the weight ${heA} has been putting on lately.`, "slave professionalism": `wearing a graduation gown.`, - "petite admiration": `wearing ${hisA} birthday suit, with ${hisA} nude form obscured by the light ${hisA} belly. ${HeA}'s recently adjusted ${hisA} size so that, at a glance, ${HeA} appears to be nothing more than a glowing oval.`, + "petite admiration": `wearing ${hisA} birthday suit, with ${hisA} nude form obscured by the light ${hisA} belly. ${HeA}'s recently adjusted ${hisA} size so that, at a glance, ${heA} appears to be nothing more than a glowing oval.`, "statuesque glorification": `wearing a simple dress. ${HeA}'s adjusted the length of ${hisA} dress to make it appear that ${heA} is taller than ${heA} really is, but it keeps riding up ${hisA} middle and ruining the look.`, }, "slimegirl": { @@ -1333,7 +1333,7 @@ globalThis.PersonalAssistantAppearance = function() { "subjugationist": `${HeA} is wearing a simple white linen dress, and ${hisA} right ankle is shackled to an iron ball and chain that prevents ${himA} from flying very high.`, "roman revivalist": `${HeA} is wearing a fine stola appropriate for a respectable Roman lady, with ${hisA} hair up in a complicated style.`, "neoimperialist": `${HeA} is wearing a skintight bodysuit that gives ${himA} the appearance of some kind of techno-angel, cybernetics and angelic beauty meshing seamlessly together.`, - "aztec revivalist": `${HeA} is wearing a modest huipil with ${hisA} hair braided to two ponytails; ${HeA}'s the picture of quiet elegance.`, + "aztec revivalist": `${HeA} is wearing a modest huipil with ${hisA} hair braided to two ponytails; ${heA}'s the picture of quiet elegance.`, "egyptian revivalist": `${HeA} is wearing a simple white linen dress, kohl eye shadow, sandals, and a serene expression.`, "edo revivalist": `${HeA} is wearing a fine kimono with slits for ${hisA} wings, getae, tabi, and an expression of perfect serenity.`, "arabian revivalist": `${HeA} is wearing a tailored suit, a silk headscarf, and aviator sunglasses, making ${himA} look ridiculous.`, @@ -1419,7 +1419,7 @@ globalThis.PersonalAssistantAppearance = function() { "arabian revivalist": `${HeA} has donned the skimpiest, sluttiest outfit ${heA} could think of. ${HeA}'s just begging to get stoned.`, "chinese revivalist": `${HeA} has added a number of piercings to ${hisA} body to allow ${himA} to be suspended by hooks rather than flying.`, "chattel religionist": `${HeA} has chosen to go fully naked, exposing the symbols of your religion pierced through ${hisA} nipples and clit.`, - "physical idealist": `${HeA} has adjusted ${hisA} appearance to be rather muscular. Not only can ${heA} crack a whip harder than ever, but when ${heA} flexes, ${HeA} nearly pops the belt around ${hisA} chest.`, + "physical idealist": `${HeA} has adjusted ${hisA} appearance to be rather muscular. Not only can ${heA} crack a whip harder than ever, but when ${heA} flexes, ${heA} nearly pops the belt around ${hisA} chest.`, "hedonistic decadence": `${HeA} has become rather chubby lately. ${HeA} may want to change up ${hisA} routine of tormenting the hungry by devouring food before them.`, "repopulation focus": `${HeA}'s added a pair of tight belts across ${hisA} stomach recently. The taut material painfully digs into ${hisA} growing pregnancy.`, "eugenics": `${HeA} has an iron chastity belt under ${hisA} loincloth and two large bulges in ${hisA} middle. You don't have to guess ${heA} has a pair of enormous dildos locked inside ${himA}.`, @@ -1435,7 +1435,7 @@ globalThis.PersonalAssistantAppearance = function() { "intellectual dependency": `${HeA} may look like a bumbling fool, but even an idiot can get a torture right every now and then.`, "slave professionalism": `${HeA}'s taken to carrying a box of needles to make use of ${hisA} extensive knowledge of anatomy. This is one acupuncture session you don't want a part of.`, "petite admiration": `${HisA} new, tiny body opens up a new realm of torments. You can hear ${himA} scheming about what holes ${heA} could theoretically force ${himselfA} up now.`, - "statuesque glorification": `${HisA} new, giant body brings with it an even larger ego. No longer a mere imp, ${HeA}'s a borderline devil.`, + "statuesque glorification": `${HisA} new, giant body brings with it an even larger ego. No longer a mere imp, ${heA}'s a borderline devil.`, }, "witch": { @@ -1448,11 +1448,11 @@ globalThis.PersonalAssistantAppearance = function() { } else { r.push(`ethnically 100 % pure ${V.arcologies[0].FSSupremacistRace}.`); } - r.push(`If ${heA} were real, ${HeA} would make the perfect breeding stock for the next generation of the master race.`); + r.push(`If ${heA} were real, ${heA} would make the perfect breeding stock for the next generation of the master race.`); return r.join(" "); }, - "subjugationist": `${HeA} still hasn't managed to undo the spell; ${HeA} looks like a racist caricature of a ${V.arcologies[0].FSSubjugationistRace} ${girlA}, and has an appropriately demeaning accent to match. What's worse, the spell also seems to have stripped most of ${hisA} literacy in ${V.language}, making reading ${hisA} tomes an arduous task for ${himA}.`, - "roman revivalist": `While ${heA} acts like a typical Roman ${womanA}, ${HeA} is pretty obviously Greek. ${HeA} can't even name the Pantheon correctly.`, + "subjugationist": `${HeA} still hasn't managed to undo the spell; ${heA} looks like a racist caricature of a ${V.arcologies[0].FSSubjugationistRace} ${girlA}, and has an appropriately demeaning accent to match. What's worse, the spell also seems to have stripped most of ${hisA} literacy in ${V.language}, making reading ${hisA} tomes an arduous task for ${himA}.`, + "roman revivalist": `While ${heA} acts like a typical Roman ${womanA}, ${heA} is pretty obviously Greek. ${HeA} can't even name the Pantheon correctly.`, "neoimperialist": `${HeA} looks like someone you would find selling "magical tokens" on the side of your neon-bathed streets, cybernetic trinkets adorning ${hisA} whole body.`, "aztec revivalist": `${HeA} is still very obviously not a native and has become rather caught up in the fear that ${heA}'ll soon be sacrificed.`, "egyptian revivalist": `${HeA}'s managed to untangle ${himselfA} from the wrappings, though ${heA} has chosen to leave several still wrapped around ${hisA} body.`, @@ -1470,10 +1470,10 @@ globalThis.PersonalAssistantAppearance = function() { } }, "eugenics": `${HeA} still hasn't managed to undo the spell; it's pretty obvious given how desperately horny ${heA} is.`, - "gender radicalist": `${HeA} has chosen to embrace the outcome of ${hisA} spell; ${HeA} either sports a bulge or a tent in the front of ${hisA} dress and can frequently be seen reading books on male anatomy.`, + "gender radicalist": `${HeA} has chosen to embrace the outcome of ${hisA} spell; ${heA} either sports a bulge or a tent in the front of ${hisA} dress and can frequently be seen reading books on male anatomy.`, "gender fundamentalist": `${HeA} still hasn't managed to undo the spell; ${hisA} belly has become so swollen with ovum ${heA} looks ready to birth triplets. ${HeA} can barely concentrate; ${hisA} mind focused entirely on dicks cumming in ${hisA} wet pussy, but ${heA} can't risk it, knowing full well ${heA}'d become so pregnant ${heA}'d likely burst. ${HisA} ample breasts and child bearing hips only make it harder to keep away from cocks.`, "asset expansionist": `${HeA}'s managed to partially undo the spell; ${hisA} breasts are merely as big as ${heA} is now. One simple, correctly performed, levitation spell later and ${heA} is fully capable of functioning with ${hisA} oversized tits.`, - "transformation fetishist": `While ${heA} has managed to regain ${hisA} flexibility, ${HeA} still greatly resembles an overinflated blow-up doll. ${HisA} lips are stuck in an O shape, ${hisA} breasts are the size of beach balls, ${hisA} ass and thighs larger than any ${girlA}'s you've seen, and above all else is ${hisA} huge medicine ball sized belly; fortunately they don't weigh nearly as much as they should, part of the benefits of being an inflatable sex-doll.`, + "transformation fetishist": `While ${heA} has managed to regain ${hisA} flexibility, ${heA} still greatly resembles an overinflated blow-up doll. ${HisA} lips are stuck in an O shape, ${hisA} breasts are the size of beach balls, ${hisA} ass and thighs larger than any ${girlA}'s you've seen, and above all else is ${hisA} huge medicine ball sized belly; fortunately they don't weigh nearly as much as they should, part of the benefits of being an inflatable sex-doll.`, "pastoralist": `${HeA}'s managed to shrink ${hisA} nine breasts somewhat; they are merely head sized now. The front of ${hisA} robes is strained from ${hisA} excessive number of milky tits.`, "maturity preferentialist": `${HeA}'s managed to reign in ${hisA} aging spell and with a little size up to ${hisA} breasts, hips and ass makes a very pleasant MILF.`, get "youth preferentialist"() { @@ -1487,7 +1487,7 @@ globalThis.PersonalAssistantAppearance = function() { return `${HeA}'s decided to embrace ${hisA} spell and now appears as a witch fresh into adulthood.`; } }, - "slimness enthusiast": `${HeA}'s begun wearing a corset under ${hisA} robes to hide ${hisA} chubbiness. Combined with ${hisA} lightened body, ${HeA} manages to pull off the lithe look easily.`, + "slimness enthusiast": `${HeA}'s begun wearing a corset under ${hisA} robes to hide ${hisA} chubbiness. Combined with ${hisA} lightened body, ${heA} manages to pull off the lithe look easily.`, "body purist": `${HeA} has attempted to fix ${hisA} misspell and succeeded in preventing ${hisA} clothes from becoming transparent, to ${himselfA} only. ${HeA} appears nude, even though ${heA} is fully clothed, much to everyone's enjoyment.`, "intellectual dependency": `${HeA} still hasn't managed to figure out that ${heA} drained ${hisA} intelligence; not that it matters when all your spells now have so many fun effects! (And you can't read.)`, "slave professionalism": `${HeA}'s managed to work out some of the kinks of the spell, though it's left ${himA} quite the perfectionist.`, @@ -1615,17 +1615,17 @@ globalThis.PersonalAssistantAppearance = function() { }, "succubus": { - "paternalist": `${HeA}'s wearing an absolutely stunning dress that perfectly hugs ${hisA} curves. Surprisingly, ${HeA} even has underwear on.`, + "paternalist": `${HeA}'s wearing an absolutely stunning dress that perfectly hugs ${hisA} curves. Surprisingly, ${heA} even has underwear on.`, "degradationist": `${HeA}'s recently added an obscene number of piercings to ${hisA} labia in addition to a pair of nipple rings and a big, heavy ring on ${hisA} clit. A thin chain links the clit ring to the heavy rings adorning ${hisA} chest.`, - "supremacist": `In fact, ${HeA} is the most gorgeous ${V.arcologies[0].FSSupremacistRace} ${womanA} you've ever seen.`, - "subjugationist": `In fact, ${HeA} is the most gorgeous ${V.arcologies[0].FSSubjugationistRace} ${womanA} you've ever seen.`, - "roman revivalist": `In fact, ${HeA} is the most gorgeous Roman ${womanA} you've ever seen.`, - "neoimperialist": `In fact, ${HeA} is the most gorgeous Imperial ${womanA} you've ever seen.`, - "aztec revivalist": `In fact, ${HeA} is the most gorgeous Aztec ${womanA} you've ever seen.`, - "egyptian revivalist": `In fact, ${HeA} is the most gorgeous Egyptian ${womanA} you've ever seen.`, - "edo revivalist": `In fact, ${HeA} is the most gorgeous Japanese ${womanA} you've ever seen.`, - "arabian revivalist": `In fact, ${HeA} is the most gorgeous Arabic ${womanA} you've ever seen.`, - "chinese revivalist": `In fact, ${HeA} is the most gorgeous Chinese ${womanA} you've ever seen.`, + "supremacist": `In fact, ${heA} is the most gorgeous ${V.arcologies[0].FSSupremacistRace} ${womanA} you've ever seen.`, + "subjugationist": `In fact, ${heA} is the most gorgeous ${V.arcologies[0].FSSubjugationistRace} ${womanA} you've ever seen.`, + "roman revivalist": `In fact, ${heA} is the most gorgeous Roman ${womanA} you've ever seen.`, + "neoimperialist": `In fact, ${heA} is the most gorgeous Imperial ${womanA} you've ever seen.`, + "aztec revivalist": `In fact, ${heA} is the most gorgeous Aztec ${womanA} you've ever seen.`, + "egyptian revivalist": `In fact, ${heA} is the most gorgeous Egyptian ${womanA} you've ever seen.`, + "edo revivalist": `In fact, ${heA} is the most gorgeous Japanese ${womanA} you've ever seen.`, + "arabian revivalist": `In fact, ${heA} is the most gorgeous Arabic ${womanA} you've ever seen.`, + "chinese revivalist": `In fact, ${heA} is the most gorgeous Chinese ${womanA} you've ever seen.`, "chattel religionist": `${HeA} is wearing a tight dress modeled after the symbol of your new religion; it leaves ${hisA} nipples and crotch fully exposed.`, get "physical idealist"() { if (V.arcologies[0].FSPhysicalIdealistStrongFat === 1) { diff --git a/src/player/MpregSelf.js b/src/player/MpregSelf.js new file mode 100644 index 0000000000000000000000000000000000000000..d6a2803daf50f7e095228997b27198c5b04d1a32 --- /dev/null +++ b/src/player/MpregSelf.js @@ -0,0 +1,158 @@ +globalThis.MpregSelf = function() { + const node = new DocumentFragment(); + let r = []; + const { + HeU, + heU, himU, hisU, girlU + } = getNonlocalPronouns(V.seeDicks).appendSuffix("U"); + + if (V.PC.counter.birthSelf === 0) { + if (V.PC.balls >= 14) { + r.push(`Calling over your closest slave, you order ${himU} to bring you one of the high-volume enema syringes from the slave quarters. ${HeU} rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, sending rivulets of precum running down to pool on your massive balls. Your pussy is similarly soaked, imagining your latest deviancy has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before ${heU} enters carrying the extra-long enema syringe. Impatient, you give ${himU} your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started."`); + r.push(`Following your instructions, ${heU} eagerly drops to ${hisU} knees and inhales your soaked member. The large volume of precum coming from your engorged prostate necessitates frequent swallowing that only adds to your pleasure. You lay back and enjoy yourself as ${heU} massages your massive balls before slipping ${hisU} hand underneath to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of what comes next, and soon your sack is clenching your massive balls as your body prepares to cum. Recognizing the signs, your slave removes ${hisU} mouth and replaces it with the open end of the syringe. ${HeU} takes ${hisU} sodden hand from your cunt and starts stroking vigorously, and soon you're spraying inhumanly large jets of alabaster cum into the enema syringe. It's good that you asked for high-capacity version, as the prodigious quantity of fertile semen would have overflowed from a smaller container.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. ${HeU} has thoughtfully blocked the tip with the palm of ${hisU} hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the full syringe over so that the business end is pointing upward, and the slave removes ${hisU} hand while you make sure the plunger is secure and won't leak any of the precious cargo. Your slave eagerly licks the drop of cum off the palm of ${hisU} hand, but you don't begrudge ${himU} a small treat. Instead, you get a firm grasp on the glass of the thick enema syringe and lay back once more.`); + r.push(`You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe between your massive balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the nubby plug-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to take both hands and ram that plunger in. Push hard, I want that syringe completely empty when you're done."`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`The ${girlU} does as ${heU}'s told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, ${heU} shoves it back inside you. Seeing the undeniable pleasure on your face, ${heU} takes it as permission to continue and quickly picks up the pace. Soon ${heU}'s fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the pointy enema bulb into the opening of your cervix, forcibly stretching it further open with each piercing impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm.`); + r.push(`Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends thick streams of cum spraying all over the place to soak you and your slave. Seeing ${hisU} cue, the ${girlU} grabs the large plunger with both hands and starts shoving it in the direction of your womb. ${HeU} leans in, using ${hisU} body weight to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the whole enema syringe further inside you, causing a blissful stretching sensation as the squirting enema bulb penetrates your cervix to lodge in your womb.`); + r.push(`Your orgasm continues unabated, spurred on by the syringe now spraying your cum directly into your womb. You spend a couple minutes that feel like hours cumming as your slave slowly inflates your womb with a seemingly-endless volume of your virile cum.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`Sometime later when you've recovered your senses, you see your slave standing by while holding the plunger to keep your balloon-like womb from forcing its meal back into the syringe. The nearly 2 liters of cum you have stuffed inside you leaves your stomach looking noticeably distended, prompting you to rub your sloshing belly. You give the waiting ${girlU} ${hisU} orders: "Pull it out, and use your mouth to keep the mess to a minimum." ${HeU} gets on ${hisU} knees and takes a firm grip on the syringe before peering over your inflated belly to make sure you're ready for ${himU} to continue. As soon as you give ${himU} a nod ${heU} pulls, and with a popping sensation the enema bulb comes free. The sudden lack of resistance causes ${himU} to swiftly yank the rest of the syringe out of you, opening the floodgates for the colossal quantity of cum inflating your womb. Your well-trained slave reacts quickly, hefting your massive balls up and out of the way so ${heU} can catch the torrent of jizz that's just starting to pour from your cunt.`); + r.push(`You hear some wet sounds as ${heU} slurps down the cum that already escaped, and then you feel ${hisU} soft lips pressed to your vulva as ${heU} steadfastly works to drink the unending flood of semen. You relax and enjoy the afterglow of your orgasms while ${heU} works, proud of your ingenious idea to take advantage of your inhuman sperm production. There's always the tap from ${V.dairyName} of course, but this way you don't have to worry about getting pregnant. That last thought gives you pause. You can't get yourself pregnant... right?`); + } else if (V.PC.balls >= 9) { + r.push(`Calling over your closest slave, you order ${himU} to bring you one of the enema syringes from the slave quarters. ${HeU} rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, sending a steady stream of precum running down to pool on your huge balls. Your pussy is similarly soaked, imagining your latest deviancy has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before ${heU} enters carrying the glass enema syringe. Impatient, you give ${himU} your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started."`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`Following your instructions, ${heU} eagerly drops to ${hisU} knees and inhales your soaked member. The large volume of precum coming from your swollen prostate necessitates regular swallowing that only adds to your pleasure. You lay back and enjoy yourself as ${heU} massages your huge balls before slipping ${hisU} hand underneath to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of what comes next, and soon your sack is clenching your huge balls as your body prepares to cum. Recognizing the signs, your slave removes ${hisU} mouth and replaces it with the open end of the syringe. ${HeU} takes ${hisU} sodden hand from your cunt and starts stroking vigorously, and soon you're spraying massive jets of alabaster cum into the enema syringe. It's good that you decided on an enema syringe instead of a normal dildo suppository, as the huge quantity of fertile semen would have overflowed from a smaller container.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. ${HeU} has thoughtfully blocked the tip with the palm of ${hisU} hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the full syringe over so that the business end is pointing upward, and the slave removes ${hisU} hand while you make sure the plunger is secure and won't leak any of the precious cargo. Your slave eagerly licks the drop of cum off the palm of ${hisU} hand, but you don't begrudge ${himU} a small treat. Instead, you get a firm grasp on the glass of the thick enema syringe and lay back once more.`); + r.push(`You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe between your huge balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the nubby plug-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to take both hands and ram that plunger in. Push hard, I want that syringe completely empty when you're done."`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`The ${girlU} does as ${heU}'s told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, ${heU} shoves it back inside you. Seeing the undeniable pleasure on your face, ${heU} takes it as permission to continue and quickly picks up the pace. Soon ${heU}'s fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the pointy enema bulb into the opening of your cervix, forcibly stretching it further open with each piercing impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm.`); + r.push(`Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends thick streams of cum spraying all over the place to coat you and your slave. Seeing ${hisU} cue, the ${girlU} grabs the large plunger with both hands and starts shoving it in the direction of your womb. ${HeU} leans in, using ${hisU} body weight to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the whole enema syringe further inside you, causing a blissful stretching sensation as the squirting enema bulb penetrates your cervix to lodge in your womb.`); + r.push(`Your orgasm continues unabated, spurred on by the syringe now spraying your cum directly into your womb. You spend a couple minutes that feel like hours cumming as your slave slowly inflates your womb with a liter of your virile cum.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`Sometime later when you've recovered your senses, you see your slave standing by while holding the plunger to keep your stuffed womb from forcing its meal back into the syringe. You give the waiting ${girlU} ${hisU} orders: "Pull it out, and use your mouth to keep the mess to a minimum." ${HeU} gets on ${hisU} knees and takes a firm grip on the syringe before peering over your swollen belly to make sure you're ready for ${himU} to continue. As soon as you give ${himU} a nod ${heU} pulls, and with a popping sensation the enema bulb comes free. The sudden lack of resistance causes ${himU} to swiftly yank the rest of the syringe out of you, opening the floodgates for the huge quantity of cum that's stuffed in your womb. Your well-trained slave reacts quickly, hefting your huge balls up and out of the way so ${heU} can catch the torrent of jizz that's just starting to pour from your cunt.`); + r.push(`You hear some wet sounds as ${heU} slurps down the cum that already escaped, and then you feel ${hisU} soft lips pressed to your vulva as ${heU} steadfastly works to drink the unending flood of semen. You relax and enjoy the afterglow of your orgasms while ${heU} works, proud of your ingenious idea to take advantage of your prodigious sperm production. There's always the tap from ${V.dairyName} of course, but this way you don't have to worry about getting pregnant. That last thought gives you pause. You can't get yourself pregnant... right?`); + } else if (V.PC.balls >= 5) { + r.push(`Calling over your closest slave, you order ${himU} to bring you one of the dildo-shaped suppository syringes from the slave quarters. ${HeU} rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, sending regular drips of precum running down onto your large balls. Your pussy is similarly soaked, imagining your latest deviancy has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before ${heU} enters carrying the remarkably-lifelike dildo syringe. Impatient, you give ${himU} your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started."`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`Following your instructions, ${heU} eagerly drops to ${hisU} knees and inhales your straining cock. The extra precum coming from your enhanced prostate necessitates occasional swallowing that only adds to your pleasure. You lay back and enjoy yourself as ${heU} massages your large balls before slipping ${hisU} hand underneath to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of what comes next, and soon your sack is clenching your large balls as your body prepares to cum. Recognizing the signs, your slave removes ${hisU} mouth and replaces it with the open end of the syringe. ${HeU} takes ${hisU} sodden hand from your cunt and starts stroking vigorously, and soon you're spraying large jets of alabaster cum into the syringe. It's close, the large quantity of fertile semen almost overflowing from the dildo suppository.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. ${HeU} has thoughtfully blocked the tip with the palm of ${hisU} hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the full syringe over so that the business end is pointing upward, and the slave removes ${hisU} hand while you make sure the plunger is secure and won't leak any of the precious cargo. Your slave eagerly licks the drop of cum off the palm of ${hisU} hand, but you don't begrudge ${himU} a small treat. Instead, you get a firm grasp on the silicone of the thick dildo syringe and lay back once more.`); + r.push(`You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe underneath your large balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the cock-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to ram that plunger in. Push hard, I want that syringe completely empty when you're done."`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`The ${girlU} does as ${heU}'s told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, ${heU} shoves it back inside you. Seeing the undeniable pleasure on your face, ${heU} takes it as permission to continue and quickly picks up the pace. Soon ${heU}'s fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the head of the dildo into your cervix, battering it open with each impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm.`); + r.push(`Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends jets of cum all over the place to land on you and your slave. Seeing ${hisU} cue, the ${girlU} grabs the large plunger and starts shoving it in the direction of your womb. ${HeU} pushes hard to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the silicone cockhead against your cervix, creating a seal and leaving the syringe free to spray your semen through your battered cervix and into your hungry womb.`); + r.push(`Your orgasm continues unabated, spurred on by warm fluid flowing into your womb. You spend a minute that feel like an hour cumming as your slave slowly fills your womb with a few deciliters of virile cum.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`Sometime later when you've recovered your senses, you see your slave standing by while holding the dildo inside you to keep you plugged up. You give the waiting ${girlU} ${hisU} orders: "Pull it out, and use your mouth to keep the mess to a minimum." ${HeU} gets on ${hisU} knees and takes a firm grip on the syringe before peering up at you to make sure you're ready for ${himU} to continue. As soon as you give ${himU} a nod ${heU} pulls the dildo free, opening the floodgates for the cum that's filling your womb. Your well-trained slave reacts quickly, lifting your large balls up and out of the way so ${heU} can catch the stream of jizz that's just starting to pour from your cunt.`); + r.push(`You hear some wet sounds as ${heU} slurps down the cum that already escaped, and then you feel ${hisU} soft lips pressed to your vulva as ${heU} steadfastly works to drink the escaping semen. You relax and enjoy the afterglow of your orgasms while ${heU} works, proud of your ingenious idea to take advantage of your considerable sperm production. There's always the tap from ${V.dairyName} of course, but this way you don't have to worry about getting pregnant. That last thought gives you pause. You can't get yourself pregnant... right?`); + } else { + r.push(`Calling over your closest slave, you order ${himU} to bring you one of the dildo-shaped suppository syringes from the slave quarters. ${HeU} rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, a large droplet of precum hanging from the head. Your pussy is similarly soaked, imagining your latest deviancy has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before ${heU} enters carrying the remarkably-lifelike dildo syringe. Impatient, you give ${himU} your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started."`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`Following your instructions, ${heU} eagerly drops to ${hisU} knees and inhales your straining cock. You lay back and enjoy yourself as ${heU} massages your balls before slipping ${hisU} hand downward to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of what comes next, and soon your sack is clenching tightly as your body prepares to cum. Recognizing the signs, your slave removes ${hisU} mouth and replaces it with the open end of the syringe. ${HeU} takes ${hisU} sodden hand from your cunt and starts stroking vigorously, and soon you're spraying jets of alabaster cum into the syringe. It's a powerful orgasm, but you only manage to fill a quarter of it.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. ${HeU} has thoughtfully blocked the tip with the palm of ${hisU} hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the syringe over so that the business end is pointing upward, and the slave removes ${hisU} hand while you make sure the plunger is inserted far enough that you've gotten all the air out of the syringe. Your slave eagerly licks the drop of cum off the palm of ${hisU} hand, but you don't begrudge ${himU} a small treat. Instead, you get a firm grasp on the silicone of the thick dildo syringe and lay back once more.`); + r.push(`You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe underneath your balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the cock-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to ram that plunger in. I want that syringe completely empty when you're done."`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`The ${girlU} does as ${heU}'s told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, ${heU} shoves it back inside you. Seeing the undeniable pleasure on your face, ${heU} takes it as permission to continue and quickly picks up the pace. Soon ${heU}'s fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the head of the dildo into your cervix, battering it open with each impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm.`); + r.push(`Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends several jets of cum to land on your reclined body. Seeing ${hisU} cue, the ${girlU} grabs the large plunger and starts shoving it in the direction of your womb. ${HeU} pushes hard to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the silicone cockhead against your cervix, creating a seal and leaving the syringe free to spray your semen through your battered cervix and into your hungry womb.`); + r.push(`Your orgasm continues unabated, spurred on by the jet of fluid flowing into your womb. Your orgasm soon fades, and you wish that you could produce more than a deciliter of cum to fill yourself with.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`Now that your orgasm is over, you notice your slave standing by while holding the dildo inside you to keep you plugged up. You give the waiting ${girlU} ${hisU} orders: "Pull it out, and use your mouth to keep the mess to a minimum." ${HeU} gets on ${hisU} knees and takes a firm grip on the syringe before peering up at you to make sure you're ready for ${himU} to continue. As soon as you give ${himU} a nod ${heU} pulls the dildo free, allowing the cum inside you to leak out. Your well-trained slave reacts quickly, lifting your balls up and out of the way so ${heU} can catch the load of jizz before it starts to leak out of your cunt.`); + r.push(`You feel ${hisU} soft lips pressed to your vulva as ${heU} works to retrieve ${hisU} treat. You hear some soft slurping noises and feel a warm tongue worming its way inside you to retrieve any lingering cum. You relax and enjoy the afterglow of your orgasms while ${heU} works, proud of your ingenious idea to take advantage of your own balls for a satisfying creampie. There's always a slave to do that, of course, but this way you don't have to worry about getting pregnant. That last thought gives you pause. You can't get yourself pregnant... right?`); + } + let selfPreg = 30+(V.PC.balls*3); + r.push(knockMeUp(V.PC, selfPreg, 0, -1)); + } else { + if (V.PC.balls >= 14) { + r.push(`Calling over your closest slave, you order ${himU} to bring you one of the high-volume enema syringes from the slave quarters. ${HeU} rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, sending rivulets of precum running down to pool on your massive balls. Your pussy is similarly soaked, imagining your belly swelling after you knock yourself up has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before ${heU} enters carrying the extra-long enema syringe. Impatient, you give ${himU} your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started."`); + r.push(`Following your instructions, ${heU} eagerly drops to ${hisU} knees and inhales your soaked member. The large volume of precum coming from your engorged prostate necessitates frequent swallowing that only adds to your pleasure. You lay back and enjoy yourself as ${heU} massages your massive balls before slipping ${hisU} hand underneath to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of the semi-incestuous stuffing that comes next, and soon your sack is clenching your massive balls as your body prepares to cum. Recognizing the signs, your slave removes ${hisU} mouth and replaces it with the open end of the syringe. ${HeU} takes ${hisU} sodden hand from your cunt and starts stroking vigorously, and soon you're spraying inhumanly large jets of alabaster cum into the enema syringe. It's good that you asked for high-capacity version, as the prodigious quantity of fertile semen would have overflowed from a smaller container.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. ${HeU} has thoughtfully blocked the tip with the palm of ${hisU} hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the full syringe over so that the business end is pointing upward, and the slave removes ${hisU} hand while you make sure the plunger is secure and won't leak any of the precious cargo. Your slave eagerly licks the drop of cum off the palm of ${hisU} hand, but you don't begrudge ${himU} a small treat. Instead, you get a firm grasp on the glass of the thick enema syringe and lay back once more.`); + r.push(`You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe between your massive balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the nubby plug-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to take both hands and ram that plunger in. Push hard, I want that syringe completely empty when you're done."`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`The ${girlU} does as ${heU}'s told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, ${heU} shoves it back inside you. Seeing the undeniable pleasure on your face, ${heU} takes it as permission to continue and quickly picks up the pace. Soon ${heU}'s fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the pointy enema bulb into the opening of your cervix, forcibly stretching it further open with each piercing impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm.`); + r.push(`Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends thick streams of cum spraying all over the place to soak you and your slave. Seeing ${hisU} cue, the ${girlU} grabs the large plunger with both hands and starts shoving it in the direction of your womb. ${HeU} leans in, using ${hisU} body weight to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the whole enema syringe further inside you, causing a blissful stretching sensation as the squirting enema bulb penetrates your cervix to lodge in your womb.`); + r.push(`Your orgasm continues unabated, spurred on by the syringe now spraying your cum directly into your womb. You spend a couple minutes that feel like hours cumming as your slave slowly inflates your womb with a seemingly-endless volume of your virile cum.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`Sometime later when you've recovered your senses, you see your slave standing by while holding the plunger to keep your balloon-like womb from forcing its meal back into the syringe. The nearly 2 liters of cum you have stuffed inside you leaves your stomach looking noticeably distended, prompting you to rub your sloshing belly. You give the waiting ${girlU} ${hisU} orders: "Pull it out, and use your mouth to keep the mess to a minimum." ${HeU} gets on ${hisU} knees and takes a firm grip on the syringe before peering over your inflated belly to make sure you're ready for ${himU} to continue. As soon as you give ${himU} a nod ${heU} pulls, and with a popping sensation the enema bulb comes free. The sudden lack of resistance causes ${himU} to swiftly yank the rest of the syringe out of you, opening the floodgates for the colossal quantity of cum inflating your womb. Your well-trained slave reacts quickly, hefting your massive balls up and out of the way so ${heU} can catch the torrent of jizz that's just starting to pour from your cunt.`); + r.push(`You hear some wet sounds as ${heU} slurps down the cum that already escaped, and then you feel ${hisU} soft lips pressed to your vulva as ${heU} steadfastly works to drink the unending flood of semen. You relax and enjoy the afterglow of your orgasms while ${heU} works, proud of your ingenious idea to take advantage of your inhuman sperm production. There's always the tap from ${V.dairyName} of course, but why use slave cum when you have such obviously superior material available?`); + } else if (V.PC.balls >= 9) { + r.push(`Calling over your closest slave, you order ${himU} to bring you one of the enema syringes from the slave quarters. ${HeU} rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, sending a steady stream of precum running down to pool on your huge balls. Your pussy is similarly soaked, imagining your belly swelling after you knock yourself up has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before ${heU} enters carrying the glass enema syringe. Impatient, you give ${himU} your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started."`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`Following your instructions, ${heU} eagerly drops to ${hisU} knees and inhales your soaked member. The large volume of precum coming from your swollen prostate necessitates regular swallowing that only adds to your pleasure. You lay back and enjoy yourself as ${heU} massages your huge balls before slipping ${hisU} hand underneath to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of the semi-incestuous stuffing that comes next, and soon your sack is clenching your huge balls as your body prepares to cum. Recognizing the signs, your slave removes ${hisU} mouth and replaces it with the open end of the syringe. ${HeU} takes ${hisU} sodden hand from your cunt and starts stroking vigorously, and soon you're spraying massive jets of alabaster cum into the enema syringe. It's good that you decided on an enema syringe instead of a normal dildo suppository, as the huge quantity of fertile semen would have overflowed from a smaller container.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. ${HeU} has thoughtfully blocked the tip with the palm of ${hisU} hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the full syringe over so that the business end is pointing upward, and the slave removes ${hisU} hand while you make sure the plunger is secure and won't leak any of the precious cargo. Your slave eagerly licks the drop of cum off the palm of ${hisU} hand, but you don't begrudge ${himU} a small treat. Instead, you get a firm grasp on the glass of the thick enema syringe and lay back once more.`); + r.push(`You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe between your huge balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the nubby plug-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to take both hands and ram that plunger in. Push hard, I want that syringe completely empty when you're done."`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`The ${girlU} does as ${heU}'s told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, ${heU} shoves it back inside you. Seeing the undeniable pleasure on your face, ${heU} takes it as permission to continue and quickly picks up the pace. Soon ${heU}'s fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the pointy enema bulb into the opening of your cervix, forcibly stretching it further open with each piercing impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm.`); + r.push(`Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends thick streams of cum spraying all over the place to coat you and your slave. Seeing ${hisU} cue, the ${girlU} grabs the large plunger with both hands and starts shoving it in the direction of your womb. ${HeU} leans in, using ${hisU} body weight to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the whole enema syringe further inside you, causing a blissful stretching sensation as the squirting enema bulb penetrates your cervix to lodge in your womb.`); + r.push(`Your orgasm continues unabated, spurred on by the syringe now spraying your cum directly into your womb. You spend a couple minutes that feel like hours cumming as your slave slowly inflates your womb with a full liter of your virile cum.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`Sometime later when you've recovered your senses, you see your slave standing by while holding the plunger to keep your stuffed womb from forcing its meal back into the syringe. You give the waiting ${girlU} ${hisU} orders: "Pull it out, and use your mouth to keep the mess to a minimum." ${HeU} gets on ${hisU} knees and takes a firm grip on the syringe before peering over your swollen belly to make sure you're ready for ${himU} to continue. As soon as you give ${himU} a nod ${heU} pulls, and with a popping sensation the enema bulb comes free. The sudden lack of resistance causes ${himU} to swiftly yank the rest of the syringe out of you, opening the floodgates for the huge quantity of cum that's stuffed in your womb. Your well-trained slave reacts quickly, hefting your huge balls up and out of the way so ${heU} can catch the torrent of jizz that's just starting to pour from your cunt.`); + r.push(`You hear some wet sounds as ${heU} slurps down the cum that already escaped, and then you feel ${hisU} soft lips pressed to your vulva as ${heU} steadfastly works to drink the unending flood of semen. You relax and enjoy the afterglow of your orgasms while ${heU} works, proud of your ingenious idea to take advantage of your prodigious sperm production. There's always the tap from ${V.dairyName} of course, but why use slave cum when you have such obviously superior material available?`); + } else if (V.PC.balls >= 5) { + r.push(`Calling over your closest slave, you order ${himU} to bring you one of the dildo-shaped suppository syringes from the slave quarters. ${HeU} rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, sending regular drips of precum running down onto your large balls. Your pussy is similarly soaked, imagining your belly swelling after you knock yourself up has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before ${heU} enters carrying the remarkably-lifelike dildo syringe. Impatient, you give ${himU} your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started."`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`Following your instructions, ${heU} eagerly drops to ${hisU} knees and inhales your straining cock. The extra precum coming from your enhanced prostate necessitates occasional swallowing that only adds to your pleasure. You lay back and enjoy yourself as ${heU} massages your large balls before slipping ${hisU} hand underneath to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of the semi-incestuous stuffing that comes next, and soon your sack is clenching your large balls as your body prepares to cum. Recognizing the signs, your slave removes ${hisU} mouth and replaces it with the open end of the syringe. ${HeU} takes ${hisU} sodden hand from your cunt and starts stroking vigorously, and soon you're spraying large jets of alabaster cum into the syringe. It's close, the large quantity of fertile semen almost overflows from the dildo suppository.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. ${HeU} has thoughtfully blocked the tip with the palm of ${hisU} hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the full syringe over so that the business end is pointing upward, and the slave removes ${hisU} hand while you make sure the plunger is secure and won't leak any of the precious cargo. Your slave eagerly licks the drop of cum off the palm of ${hisU} hand, but you don't begrudge ${himU} a small treat. Instead, you get a firm grasp on the silicone of the thick dildo syringe and lay back once more.`); + r.push(`You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe underneath your large balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the cock-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to ram that plunger in. Push hard, I want that syringe completely empty when you're done."`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`The ${girlU} does as ${heU}'s told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, ${heU} shoves it back inside you. Seeing the undeniable pleasure on your face, ${heU} takes it as permission to continue and quickly picks up the pace. Soon ${heU}'s fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the head of the dildo into your cervix, battering it open with each impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm.`); + r.push(`Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends jets of cum all over the place to land on you and your slave. Seeing ${hisU} cue, the ${girlU} grabs the large plunger and starts shoving it in the direction of your womb. ${HeU} pushes hard to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the silicone cockhead against your cervix, creating a seal and leaving the syringe free to spray your semen through your battered cervix and into your hungry womb.`); + r.push(`Your orgasm continues unabated, spurred on by warm fluid flowing into your womb. You spend a minute that feel like an hour cumming as your slave slowly fills your womb with a few deciliters of virile cum.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`Sometime later when you've recovered your senses, you see your slave standing by while holding the dildo inside you to keep you plugged up. You give the waiting ${girlU} ${hisU} orders: "Pull it out, and use your mouth to keep the mess to a minimum." ${HeU} gets on ${hisU} knees and takes a firm grip on the syringe before peering up at you to make sure you're ready for ${himU} to continue. As soon as you give ${himU} a nod ${heU} pulls the dildo free, opening the floodgates for the cum that's filling in your womb. Your well-trained slave reacts quickly, lifting your large balls up and out of the way so ${heU} can catch the stream of jizz that's just starting to pour from your cunt.`); + r.push(`You hear some wet sounds as ${heU} slurps down the cum that already escaped, and then you feel ${hisU} soft lips pressed to your vulva as ${heU} steadfastly works to drink the escaping semen. You relax and enjoy the afterglow of your orgasms while ${heU} works, proud of your ingenious idea to take advantage of your considerable sperm production. There's always the tap from ${V.dairyName} of course, but why use slave cum when you have such obviously superior material available?`); + } else { + r.push(`Calling over your closest slave, you order ${himU} to bring you one of the dildo-shaped suppository syringes from the slave quarters. ${HeU} rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, a large droplet of precum hanging from the head. Your pussy is similarly soaked, imagining your belly swelling after you knock yourself up has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before ${heU} enters carrying the remarkably-lifelike dildo syringe. Impatient, you give ${himU} your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started."`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`Following your instructions, ${heU} eagerly drops to ${hisU} knees and inhales your straining cock. You lay back and enjoy yourself as ${heU} massages your balls before slipping ${hisU} hand downward to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of the semi-incestuous stuffing that comes next, and soon your sack is clenching tightly as your body prepares to cum. Recognizing the signs, your slave removes ${hisU} mouth and replaces it with the open end of the syringe. ${HeU} takes ${hisU} sodden hand from your cunt and starts stroking vigorously, and soon you're spraying jets of alabaster cum into the syringe. It's a powerful orgasm, but you only manage to fill a quarter of it.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. ${HeU} has thoughtfully blocked the tip with the palm of ${hisU} hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the syringe over so that the business end is pointing upward, and the slave removes ${hisU} hand while you make sure the plunger is inserted far enough that you've gotten all the air out of the syringe. Your slave eagerly licks the drop of cum off the palm of ${hisU} hand, but you don't begrudge ${himU} a small treat. Instead, you get a firm grasp on the silicone of the thick dildo syringe and lay back once more.`); + r.push(`You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe underneath your balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the cock-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to ram that plunger in. I want that syringe completely empty when you're done."`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`The ${girlU} does as ${heU}'s told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, ${heU} shoves it back inside you. Seeing the undeniable pleasure on your face, ${heU} takes it as permission to continue and quickly picks up the pace. Soon ${heU}'s fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the head of the dildo into your cervix, battering it open with each impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm.`); + r.push(`Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends several jets of cum to land on your reclined body. Seeing ${hisU} cue, the ${girlU} grabs the large plunger and starts shoving it in the direction of your womb. ${HeU} pushes hard to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the silicone cockhead against your cervix, creating a seal and leaving the syringe free to spray your semen through your battered cervix and into your hungry womb.`); + r.push(`Your orgasm continues unabated, spurred on by the jet of fluid flowing into your womb. Your orgasm soon fades, and you wish that you could produce more than a deciliter of cum to fill yourself with.`); + App.Events.addParagraph(node, r); + r =[]; + r.push(`Now that your orgasm is over, you notice your slave standing by while holding the dildo inside you to keep you plugged up. You give the waiting ${girlU} ${hisU} orders: "Pull it out, and use your mouth to keep the mess to a minimum." ${HeU} gets on ${hisU} knees and takes a firm grip on the syringe before peering up at you to make sure you're ready for ${himU} to continue. As soon as you give ${himU} a nod ${heU} pulls the dildo free, allowing the cum inside you to leak out. Your well-trained slave reacts quickly, lifting your balls up and out of the way so ${heU} can catch the load of jizz before it starts to leak out of your cunt.`); + r.push(`You feel ${hisU} soft lips pressed to your vulva as ${heU} works to retrieve ${hisU} treat. You hear some soft slurping noises and feel a warm tongue worming its way inside you to retrieve any lingering cum. You relax and enjoy the afterglow of your orgasms while ${heU} works, proud of your ingenious idea to take advantage of your own balls for a satisfying creampie. There's always a slave to do that, of course, but why use slave cum when you have such obviously superior material available?`); + } + r.push(knockMeUp(V.PC, 100, 0, -1)); + } + return node; +}; diff --git a/src/player/fSelf.js b/src/player/fSelf.js new file mode 100644 index 0000000000000000000000000000000000000000..c195963620149a1cc2d9b9c3d33a5a33e9e68c1b --- /dev/null +++ b/src/player/fSelf.js @@ -0,0 +1,51 @@ +/** + * + * @returns {DocumentFragment} + */ +App.Interact.fSelf = function() { + const node = new DocumentFragment(); + let r = []; + + const cumSources = []; + for (const slave of App.Entity.facilities.dairy.employees()) { + if (slave.balls > 0 && slave.ballType === "human" && slave.vasectomy !== 1) { + cumSources.push(slave.ID); + } + } + if (V.arcologies[0].FSPastoralistLaw === 1) { + for (let i = 0; i < 6; i++) { + cumSources.push(0); + } + } + + if (V.PC.skill.cumTap === 0) { + r.push(`Taking the hose and attaching the delectable cockhead to it, you drag it over to your bed and make yourself comfortable. Teasing your pussylips with the perfect sized cock quickly gets you moist${(V.PC.dick !== 0) ? " and hard" : ""}, itching for the fake dick inside you. You know yourself well, and it fits perfectly; as you thrust it into your cunt you can't help but buck with pleasure. Just as you reach your climax, you accidentally kick the tap on. Needless to say, you are quite surprised when your "lover" orgasms and begins releasing inside you, forcing you to lose your grip on the nozzle, allowing it to free itself from you along with a torrent of cum. Panting and rubbing your tender belly, you quickly pull your clothes back on and head to clean yourself out. You can't help but notice your waist feels rather tight; it shot so much into you — that cum wasn't virile, right?`); + } else if (V.PC.skill.cumTap < 5) { + r.push(`Taking the hose and attaching your favorite cockhead to it, you drag it over to your bed and make yourself comfortable. Teasing your pussylips with the dildo, even going as far as spurting a touch of cum across your belly, you drive it into your aching cunt. With every thrust, you jet a little more cum into your empty womb, bulging you more and more as your pleasure rises, until you reach your climax and unleash your "lover"'s pent up load into yourself. Patting your bloated belly, you stagger to your feet and make for your private bath to relax while you drain. You giggle as you imagine you belly swelling even larger, be it with child or more cum.`); + } else if (V.PC.skill.cumTap < 10) { + r.push(`Taking the hose and attaching your favorite cockhead to it, you drag it over to your bed and make yourself comfortable. Teasing your pussylips with the dildo, even going as far as spurting a touch of cum across your belly, you drive it into your aching cunt. With every thrust, you jet more cum into your empty womb, bulging you more and more as your pleasure rises, until you reach your climax and unleash your "lover"'s pent up load into yourself. Patting your rounded belly, you stagger to your feet and make for your private bath to relax while you drain. You giggle as you cradle your bloated middle, you practically look pregnant already!`); + } else if (V.PC.skill.cumTap < 15) { + r.push(`Taking the hose and attaching your favorite cockhead to it, you eagerly drag it to your bed and make yourself comfortable. You waste no time driving it into your aching cunt. With every thrust, you jet huge bursts of cum into your empty womb, swelling yourself more and more as your pleasure rises, until you reach your climax and unleash your "lover"'s pent up load into yourself. Patting your huge belly, you struggle to your feet and waddle towards your private bath to relax while you drain. You giggle as you cradle your round middle, anyone who saw you like this would certainly say you were heavily pregnant!`); + } else if (V.PC.skill.cumTap < 20) { + r.push(`Taking the hose and attaching your favorite cockhead to it, you eagerly drag it to your bed and make yourself comfortable. You waste no time driving it into your aching cunt. With every thrust, you jet huge bursts of cum into your empty womb, swelling yourself more and more as your pleasure rises, until you reach your climax and unleash your "lover"'s pent up load into yourself. Patting your enormous belly, you struggle to even get off the bed, eventually making it to your feet so that you may slowly stagger to the bath. You moan lewdly as the pressure within your full belly sets another orgasm coursing through your body, making it jiggle delightfully. Anyone who saw you like this would swear you were about to give birth!`); + } else if (V.PC.skill.cumTap < 25) { + r.push(`Taking the hose and attaching your favorite cockhead to it, you eagerly drag it to your bed and make yourself comfortable. You waste no time driving it into your aching cunt. With every thrust, you jet massive bursts of cum into your empty womb, swelling yourself more and more as your pleasure rises, until you reach your climax and unleash your "lover"'s pent up load into yourself. Patting your taut, overfilled belly, you struggle to even get off the bed. After minutes of effort, several attempts ruined by aftershock orgasms, you manage to get on your feet. Cradling your massive cum-belly, you gingerly waddle to your waiting bath. You look like you are ready to burst with triplets; imagine what the public would say if they saw you in this state.`); + } else { + r.push(`Taking the hose and attaching your favorite cockhead to it, you eagerly drag it to your bed and make yourself comfortable. You waste no time driving it into your aching cunt. With every thrust, you jet massive bursts of cum into your empty womb, swelling yourself more and more as your pleasure rises, until you reach your climax and unleash your "lover"'s pent up load into yourself. Patting your taut, overfilled belly, you roll over onto your back so that you may tease your`); + const bodyParts = []; + if (V.PC.boobs >= 300) { + bodyParts.push(`breasts`); + } + if (V.PC.dick > 0) { + bodyParts.push(`dick`); + } + bodyParts.push(`belly`); + bodyParts.push(`pussy`); + r.push(`${toSentence(bodyParts)}. If anyone saw you, they would swear your were on the verge of delivering sextuplets. You made sure to schedule this block for absolute privacy, so no one should disturb you while you play with your bloated body. Once you are exhausted and drained of your contents, you head for the showers and to get a slave to clean up your bed — the same slave whose cum you just enjoyed with the hose, of course.`); + } + + V.PC.skill.cumTap++; + knockMeUp(V.PC, 50, 0, cumSources.random()); + App.Events.addParagraph(node, r); + return node; +}; diff --git a/src/player/fSelf.tw b/src/player/fSelf.tw deleted file mode 100644 index 86fe2c1482823e3b1381d8b2d7cb7a13870e99a6..0000000000000000000000000000000000000000 --- a/src/player/fSelf.tw +++ /dev/null @@ -1,47 +0,0 @@ -:: FSelf [nobr] - -<<set $nextButton = "Back", $nextLink = "Main">> - -<<set _CumSources = []>> -<<for _slave range App.Entity.facilities.dairy.employees()>> - <<if _slave.balls > 0 && _slave.ballType == "human" && _slave.vasectomy != 1>> - <<set _CumSources.push(_slave.ID)>> - <</if>> -<</for>> -<<if $arcologies[0].FSPastoralistLaw == 1>> - <<set _CumSources.push(0),_CumSources.push(0),_CumSources.push(0),_CumSources.push(0),_CumSources.push(0),_CumSources.push(0)>> -<</if>> - -<<if $PC.skill.cumTap == 0>> - - Taking the hose and attaching the delectable cockhead to it, you drag it over to your bed and make yourself comfortable. Teasing your pussylips with the perfect sized cock quickly gets you moist<<if $PC.dick != 0>> and hard<</if>>, itching for the fake dick inside you. You know yourself well, and it fits perfectly; as you thrust it into your cunt you can't help but buck with pleasure. Just as you reach your climax, you accidentally kick the tap on. Needless to say, you are quite surprised when your "lover" orgasms and begins releasing inside you, forcing you to lose your grip on the nozzle, allowing it to free itself from you along with a torrent of cum. Panting and rubbing your tender belly, you quickly pull your clothes back on and head to clean yourself out. You can't help but notice your waist feels rather tight; it shot so much into you — that cum wasn't virile, right? - -<<elseif $PC.skill.cumTap < 5>> - - Taking the hose and attaching your favorite cockhead to it, you drag it over to your bed and make yourself comfortable. Teasing your pussylips with the dildo, even going as far as spurting a touch of cum across your belly, you drive it into your aching cunt. With every thrust, you jet a little more cum into your empty womb, bulging you more and more as your pleasure rises, until you reach your climax and unleash your "lover"'s pent up load into yourself. Patting your bloated belly, you stagger to your feet and make for your private bath to relax while you drain. You giggle as you imagine you belly swelling even larger, be it with child or more cum. - -<<elseif $PC.skill.cumTap < 10>> - - Taking the hose and attaching your favorite cockhead to it, you drag it over to your bed and make yourself comfortable. Teasing your pussylips with the dildo, even going as far as spurting a touch of cum across your belly, you drive it into your aching cunt. With every thrust, you jet more cum into your empty womb, bulging you more and more as your pleasure rises, until you reach your climax and unleash your "lover"'s pent up load into yourself. Patting your rounded belly, you stagger to your feet and make for your private bath to relax while you drain. You giggle as you cradle your bloated middle, you practically look pregnant already! - -<<elseif $PC.skill.cumTap < 15>> - - Taking the hose and attaching your favorite cockhead to it, you eagerly drag it to your bed and make yourself comfortable. You waste no time driving it into your aching cunt. With every thrust, you jet huge bursts of cum into your empty womb, swelling yourself more and more as your pleasure rises, until you reach your climax and unleash your "lover"'s pent up load into yourself. Patting your huge belly, you struggle to your feet and waddle towards your private bath to relax while you drain. You giggle as you cradle your round middle, anyone who saw you like this would certainly say you were heavily pregnant! - -<<elseif $PC.skill.cumTap < 20>> - - Taking the hose and attaching your favorite cockhead to it, you eagerly drag it to your bed and make yourself comfortable. You waste no time driving it into your aching cunt. With every thrust, you jet huge bursts of cum into your empty womb, swelling yourself more and more as your pleasure rises, until you reach your climax and unleash your "lover"'s pent up load into yourself. Patting your enormous belly, you struggle to even get off the bed, eventually making it to your feet so that you may slowly stagger to the bath. You moan lewdly as the pressure within your full belly sets another orgasm coursing through your body, making it jiggle delightfully. Anyone who saw you like this would swear you were about to give birth! - -<<elseif $PC.skill.cumTap < 25>> - - Taking the hose and attaching your favorite cockhead to it, you eagerly drag it to your bed and make yourself comfortable. You waste no time driving it into your aching cunt. With every thrust, you jet massive bursts of cum into your empty womb, swelling yourself more and more as your pleasure rises, until you reach your climax and unleash your "lover"'s pent up load into yourself. Patting your taut, overfilled belly, you struggle to even get off the bed. After minutes of effort, several attempts ruined by aftershock orgasms, you manage to get on your feet. Cradling your massive cum-belly, you gingerly waddle to your waiting bath. You look like you are ready to burst with triplets; imagine what the public would say if they saw you in this state. - -<<else>> - - Taking the hose and attaching your favorite cockhead to it, you eagerly drag it to your bed and make yourself comfortable. You waste no time driving it into your aching cunt. With every thrust, you jet massive bursts of cum into your empty womb, swelling yourself more and more as your pleasure rises, until you reach your climax and unleash your "lover"'s pent up load into yourself. Patting your taut, overfilled belly, you roll over onto your back so that you may tease your<<if $PC.boobs >= 300>> breasts,<</if>><<if $PC.dick > 0>> dick,<</if>> belly, and pussy. If anyone saw you, they would swear your were on the verge of delivering sextuplets. You made sure to schedule this block for absolute privacy, so no one should disturb you while you play with your bloated body. Once you are exhausted and drained of your contents, you head for the showers and to get a slave to clean up your bed — the same slave whose cum you just enjoyed with the hose, of course. - -<</if>> - -<<set $PC.skill.cumTap++>> -<<set _CumSources = _CumSources.random()>> -<<= knockMeUp($PC, 50, 0, _CumSources)>> diff --git a/src/player/js/PlayerState.js b/src/player/js/PlayerState.js index 7a7c6f335ae88b43cdf2d109efb7f5146811cd93..befb2e66c94e4b8f9bc05aa7ca1b03bc6fecdd58 100644 --- a/src/player/js/PlayerState.js +++ b/src/player/js/PlayerState.js @@ -485,7 +485,9 @@ App.Entity.PlayerState = class PlayerState { * @type {FC.EyebrowThickness} */ this.eyebrowFullness = "natural"; - /** hair style */ + /** hair style + * @type {FC.HairStyle} + */ this.hStyle = "neat"; /** pubic hair style */ this.pubicHStyle = "hairless"; diff --git a/src/player/pcSurgeryDegradation.js b/src/player/pcSurgeryDegradation.js new file mode 100644 index 0000000000000000000000000000000000000000..4b59fcb1f239c192784caebabf6c3288812acf2a --- /dev/null +++ b/src/player/pcSurgeryDegradation.js @@ -0,0 +1,640 @@ +App.UI.PCSurgeryDegradation = function() { + const frag = new DocumentFragment(); + let r = []; + + const { + HeU, HisU, + heU, hisU, himU, himselfU + } = getNonlocalPronouns(V.seeDicks).appendSuffix("U"); + + // FIXME: 'surgeryType' is deprecated. + switch (V.surgeryType) { + case "skinTone": + r.push(`After a few hours, you awaken in the recovery wing to find every`); + if (V.showInches === 2) { + r.push(`inch`); + } else { + r.push(`centimeter`); + } + r.push(`of your body burning; though from what you did manage to see, you are, in fact, ${V.PC.skin} now.`); + if (!["pure white", "ivory", "white", "extremely pale", "very pale", "pale", "extremely fair", "very fair", "fair", "light", "light olive", "tan", "olive", "bronze", "dark olive", "dark", "light beige", "beige", "dark beige", "light brown", "brown", "dark brown", "black", "ebony", "pure black"].includes(V.PC.skin)) { + r.push(`The surgeon's assistant immediately covers ${hisU} mouth to hide ${hisU} giggle at the sight of you.`); + } else { + r.push(`The surgeon's assistant carefully seats ${himselfU} besides you with a large drum of cream.`); + } + r.push(`"This stuff is specially formulated to soothe burns like this and should have you feeling much better after a few applications.${(V.PC.dick !== 0) ? ` Now please, try not to get hard while I apply this. It will hurt like hell.` : ``}" ${HeU} spends the next half hour gingerly applying the cream across every`); + if (V.showInches === 2) { + r.push(`inch`); + } else { + r.push(`centimeter`); + } + r.push(`of your body. ${HisU} touch is so soft, it is hard to not get aroused, and as your body tenses, a wave of pain washes over you. "Calm down, and take a few applications first. Though I forgot to tell you, your erogenous zones were especially affected and will need plenty of extra attention." ${HeU} winks at you. You doubt the validity of that claim but understand exactly what ${heU} means by it. The next few days will be very enjoyable, but for now, you opt to stay perfectly still and will the cream to work faster.`); + break; + case "restoreFace": + r.push(`After a few hours, you awaken in the recovery wing with a face both sore and somewhat numb.`); + if (V.PC.belly >= 10000 || V.PC.boobs >= 1400) { + r.push(`Struggling to sit`); + } else { + r.push(`Sitting`); + } + r.push(`up, you catch sight of yourself in the mirror-covered wall across from your bed. Your face is back to the way it was before you had it altered (not counting any additional years added to it) and looking just as good as you remember. You attempt to smile at yourself, only to find your face doesn't want to comply; guess the drugs haven't completely worn off yet. You lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + break; + case "ageDown": + r.push(`After a few hours, you awaken in the recovery wing with a face both sore and somewhat numb. Sitting up, you catch sight of yourself in the mirror-covered wall across from your bed. An oddly familiar face is staring back at you; it takes you a moment to register in your groggy state that it isn't your past self but rather the result of the age reduction surgery. You attempt to smile at yourself, only to find your face doesn't want to comply; guess the drugs haven't completely worn off yet. You lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + applyAgeImplant(V.PC); + break; + case "ageUp": + r.push(`After a few hours, you awaken in the recovery wing with a face both sore and somewhat numb. Sitting up, you catch sight of yourself in the mirror-covered wall across from your bed. An oddly familiar face is staring back at you; it takes you a moment to register in your groggy state that you are in fact looking at the result of the age increasing surgery. You attempt to smile at yourself, only to find your face doesn't want to comply; guess the drugs haven't completely worn off yet. You lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + applyAgeImplantOlder(V.PC); + break; + case "breastReductionImplant": + r.push(`After a few hours, you awaken in the recovery wing with a sore chest.`); + if (V.PC.belly >= 10000) { + r.push(`Struggling to sit`); + } else { + r.push(`Sitting`); + } + r.push(`up, you immediately notice how much lighter your breasts are. Pulling the covers off yourself, you observe your implant free boobs in the mirror-covered wall across from your bed. "So do you like them?", asks the surgeon's assistant, seating ${himselfU} behind you and wrapping ${hisU} hands around to your natural breasts. "We made sure to tighten them up a bit, get rid of that sag from not having the silicone pouch in them anymore." ${HeU} begins groping your breasts, feeling for any oddities. "I know you're still a little sore, but bear with it." ${HeU} moves on to your nipples and begins teasing them.`); + if (V.PC.lactation > 0) { + r.push(`${HeU} lets out a surprised squeak when a gush of milk escapes your breasts and a moan escapes your lips.`); + if (V.PC.pregKnown === 1) { + r.push(`"Should have expected that with the pregnancy and all.`); + } else { + r.push(`"You did recently have a child didn't you? Or have you just been enjoying your nipples too much?`); + } + r.push(`Either way, this is a good thing. Your breasts work."`); + } + r.push(`You can't help but moan under your building arousal as ${heU} massages and teases your breasts. "Enjoying yourself are we? Let me finish you off." ${HeU} sneaks a hand down to your`); + if (V.PC.dick !== 0) { + r.push(`stiff prick and begins stroking its length, quickly bringing you to orgasm and relieving you of your built up tension.`); + } else { + r.push(`stiff clit and begins teasing it as well, quickly bringing you to orgasm and relieving you of your built up tension.`); + } + r.push(`${HeU} states, while licking ${hisU} fingers, "I always did enjoy the way you taste. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + break; + case "breastShrinkage": + r.push(`After a few hours, you awaken in the recovery wing with a sore chest.`); + if (V.PC.belly >= 10000) { + r.push(`Struggling to sit`); + } else { + r.push(`Sitting`); + } + r.push(`up, you immediately notice how much lighter your breasts are. Pulling the covers off yourself, you observe your`); + if (V.PC.boobs >= 1400) { + r.push(`smaller, but still ridiculously huge,`); + } else if (V.PC.boobs >= 1200) { + r.push(`smaller G-cup`); + } else if (V.PC.boobs >= 1000) { + r.push(`smaller F-cup`); + } else if (V.PC.boobs >= 800) { + r.push(`smaller DD-cup`); + } else if (V.PC.boobs >= 650) { + r.push(`smaller D-cup`); + } else if (V.PC.boobs >= 500) { + r.push(`smaller C-cup`); + } else if (V.PC.boobs >= 400) { + r.push(`smaller B-cup`); + } else { + r.push(`downright tiny`); + } + r.push(`boobs in the mirror-covered wall across from your bed. "So do you like them?", asks the surgeon's assistant, seating ${himselfU} behind you and wrapping ${hisU} hands around to your shrunken breasts. "We made sure to tighten them up a bit, get rid of that sagginess from weight and the mass removed." ${HeU} begins groping your breasts, feeling for any oddities. "I know you're still a little sore, but bear with it." ${HeU} moves on to your nipples and begins teasing them.`); + if (V.PC.lactation > 0) { + r.push(`${HeU} lets out a surprised squeak when a gush of milk escapes your breasts and a moan escapes your lips. "`); + if (V.PC.pregKnown === 1) { + r.push(`Should have expected that with the pregnancy and all.`); + } else { + r.push(`You did recently have a child didn't you? Or have you just been enjoying your nipples too much?`); + } + r.push(`Either way, this is a good thing. Your breasts work."`); + } + r.push(`You can't help but moan under your building arousal as ${heU} massages and teases your breasts. "Enjoying yourself are we? Let me finish you off." ${HeU} sneaks a hand down to your`); + if (V.PC.dick !== 0) { + r.push(`stiff prick and begins stroking its length, quickly bringing you to orgasm and relieving you of your built up tension.`); + } else { + r.push(`stiff clit and begins teasing it as well, quickly bringing you to orgasm and relieving you of your built up tension.`); + } + r.push(`${HeU} states, while licking ${hisU} fingers, "I always did enjoy the way you taste. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + break; + case "breastEnlargementImplant": + r.push(`After a few hours, you awaken in the recovery wing with a sore chest.`); + if (V.PC.belly >= 10000 || V.PC.boobs >= 1400) { + r.push(`Struggling to sit`); + } else { + r.push(`Sitting`); + } + r.push(`up, you immediately notice how much heavier your breasts are. Pulling the covers off yourself, you observe your new, round`); + if (V.PC.boobs >= 1400) { + r.push(`H-cup`); + } else if (V.PC.boobs >= 1200) { + r.push(`G-cup`); + } else if (V.PC.boobs >= 1000) { + r.push(`F-cup`); + } + r.push(`boobs in the mirror-covered wall across from your bed. "So do you like them?", asks the surgeon's assistant, seating ${himselfU} behind you and wrapping ${hisU} hands around to your heaving breasts. "We did everything we could to keep them looking natural,`); + if (V.PC.boobsImplant/V.PC.boobs >= .70) { + r.push(`but the implants were way too big for that."`); + } else if (V.PC.boobsImplant/V.PC.boobs >= .50) { + r.push(`but you can definitely tell."`); + } else { + r.push(`and I say we did a pretty good job."`); + } + r.push(`${HeU} begins groping your breasts, feeling the implant within for any oddities. "I know you're still a little sore, but bear with it." ${HeU} moves on to your nipples and begins teasing them.`); + if (V.PC.lactation > 0) { + r.push(`${HeU} lets out a surprised squeak when a gush of milk escapes your breasts and a moan escapes your lips. "`); + if (V.PC.pregKnown === 1) { + r.push(`Should have expected that with the pregnancy and all.`); + } else { + r.push(`You did recently have a child didn't you? Or have you just been enjoying your nipples too much?`); + } + r.push(`Either way, this is a good thing. Your breasts work."`); + } + r.push(`You can't help but moan under your building arousal as ${heU} massages and teases your implant laden breasts. "Enjoying yourself are we? Let me finish you off." ${HeU} sneaks a hand down to your`); + if (V.PC.dick !== 0) { + r.push(`stiff prick and begins stroking its length, quickly bringing you to orgasm and relieving you of your built up tension.`); + } else { + r.push(`stiff clit and begins teasing it as well, quickly bringing you to orgasm and relieving you of your built up tension.`); + } + r.push(`${HeU} states, while licking ${hisU} fingers, "I always did enjoy the way you taste. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + break; + case "breastEnlargement": + r.push(`After a few hours, you awaken in the recovery wing with a sore chest.`); + if (V.PC.belly >= 10000 || V.PC.boobs >= 1400) { + r.push(`Struggling to sit`); + } else { + r.push(`Sitting`); + } + r.push(`up, you immediately notice how much heavier your breasts are. Pulling the covers off yourself, you observe your new, soft`); + if (V.PC.boobs >= 1400) { + r.push(`H-cup`); + } else if (V.PC.boobs >= 1200) { + r.push(`G-cup`); + } else if (V.PC.boobs >= 1000) { + r.push(`F-cup`); + } else if (V.PC.boobs >= 800) { + r.push(`DD-cup`); + } else if (V.PC.boobs >= 650) { + r.push(`D-cup`); + } else if (V.PC.boobs >= 500) { + r.push(`C-cup`); + } else if (V.PC.boobs >= 400) { + r.push(`B-cup`); + } else { + r.push(`A-cup`); + } + r.push(`boobs in the mirror-covered wall across from your bed. "So, do you like them?", asks the surgeon's assistant, seating ${himselfU} behind you and wrapping ${hisU} hands around to your heaving breasts. "We did everything we could to keep them perky,`); + if (V.PC.boobs >= 1400) { + r.push(`quite a feat given their size."`); + } else { + r.push(`not that hard given your natural perk."`); + } + r.push(`${HeU} begins groping your breasts, feeling the added mass for any oddities. "I know you're still a little sore, but bear with it." ${HeU} moves on to your nipples and begins teasing them.`); + if (V.PC.lactation > 0) { + r.push(`${HeU} lets out a surprised squeak when a gush of milk escapes your breasts and a moan escapes your lips. "`); + if (V.PC.pregKnown === 1) { + r.push(`Should have expected that with the pregnancy and all.`); + } else { + r.push(`You did recently have a child didn't you? Or have you just been enjoying your nipples too much?`); + } + r.push(`Either way, this is a good thing. Your breasts work."`); + } + r.push(`You can't help but moan under your building arousal as ${heU} massages and teases your fat tits. "Enjoying yourself are we? Let me finish you off." ${HeU} sneaks a hand down to your`); + if (V.PC.dick !== 0) { + r.push(`stiff prick and begins stroking its length, quickly bringing you to orgasm and relieving you of your built up tension.`); + } else { + r.push(`stiff clit and begins teasing it as well, quickly bringing you to orgasm and relieving you of your built up tension.`); + } + r.push(`${HeU} states, while licking ${hisU} fingers, "I always did enjoy the way you taste. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + break; + case "flatChest": + r.push(`After a few hours, you awaken in the recovery wing with a sore chest.`); + if (V.PC.belly >= 10000) { + r.push(`Struggling to sit`); + } else { + r.push(`Sitting`); + } + r.push(`up, you immediately notice the absence of the usual weight on your chest. Pulling the covers off yourself, you observe your flat chest in the mirror-covered wall across from your bed. "So do you like it?", asks the surgeon's assistant, seating ${himselfU} behind you and wrapping ${hisU} hands around to your chest. "I honestly couldn't live without my pair." ${HeU} begins groping your chest, feeling for any oddities. "I know you're still a little sore, but bear with it." ${HeU} moves on to your nipples and begins teasing them.`); + if (V.PC.lactation > 0) { + r.push(`${HeU} lets out a surprised squeak when a gush of milk escapes your tits and a moan escapes your lips. "`); + if (V.PC.pregKnown === 1) { + r.push(`Should have expected that with the pregnancy and all.`); + } else { + r.push(`You did recently have a child didn't you? Or have you just been enjoying your nipples too much?`); + } + r.push(`Either way, this is a good thing. Your breasts still work, but it's still strange coming from such a flat chest."`); + } + r.push(`You can't help but moan under your building arousal as ${heU} massages and teases your nipples. "Enjoying yourself are we? Let me finish you off." ${HeU} sneaks a hand down to your`); + if (V.PC.dick !== 0) { + r.push(`stiff prick and begins stroking its length, quickly bringing you to orgasm and relieving you of your built up tension.`); + } else { + r.push(`stiff clit and begins teasing it as well, quickly bringing you to orgasm and relieving you of your built up tension.`); + } + r.push(`${HeU} states, while licking ${hisU} fingers, "I always did enjoy the way you taste. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + break; + case "breasts": + r.push(`After a few hours, you awaken in the recovery wing with a sore chest.`); + if (V.PC.belly >= 10000 || V.PC.boobs >= 1400) { + r.push(`Struggling to sit`); + } else { + r.push(`Sitting`); + } + r.push(`up, you immediately notice a new weight on your chest. Pulling the covers off yourself, you observe your new, soft C-cup boobs in the mirror-covered wall across from your bed. "So do you like them?", asks the surgeon's assistant, seating ${himselfU} behind you and wrapping ${hisU} hands around to your heaving breasts. "With these, you should be able to compete with any girls around you." ${HeU} begins groping your breasts, feeling the added mass for any oddities. "I know you're still a little sore, but bear with it." ${HeU} moves on to your nipples and begins teasing them.`); + if (V.PC.lactation > 0) { + r.push(`${HeU} lets out a surprised squeak when a gush of milk escapes your breasts and a moan escapes your lips. "`); + if (V.PC.pregKnown === 1) { + r.push(`Should have expected that with the pregnancy and all.`); + } else { + r.push(`You did recently have a child didn't you? Or have you just been enjoying your nipples too much?`); + } + r.push(`Either way, this is a good thing. Your breasts work."`); + } + r.push(`You can't help but moan under your building arousal as ${heU} massages and teases your new tits. "Enjoying yourself are we? Let me finish you off." ${HeU} sneaks a hand down to your`); + if (V.PC.dick !== 0) { + r.push(`stiff prick and begins stroking its length, quickly bringing you to orgasm and relieving you of your built up tension.`); + } else { + r.push(`stiff clit and begins teasing it as well, quickly bringing you to orgasm and relieving you of your built up tension.`); + } + r.push(`${HeU} states, while licking ${hisU} fingers, "I always did enjoy the way you taste. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + break; + case "buttReductionImplant": + r.push(`After a few hours, you awaken in the recovery wing, face-down in a bed made to accommodate a person with your body type, with a sore ass. You push yourself up and look at the mass under the cover behind you that is your rear, taking note of how much smaller it is now than when you arrived. "So do you like it?", asks the surgeon's assistant, seating ${himselfU} beside you and bringing ${hisU} hands to your butt. "Size isn't everything in an ass, shape is important too." ${HeU} begins groping your bottom, feeling around for any oddities. "I know you're still a little sore, but bear with it. There, everything feels good, now rest up and you'll be set! Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Groggy, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + break; + case "buttShrinkage": + r.push(`After a few hours, you awaken in the recovery wing, face-down in a bed made to accommodate a person with your body type, with a sore ass. You push yourself up and look at the mass under the cover behind you that is your rear, taking note of how much smaller it is now than when you arrived. "So do you like it?", asks the surgeon's assistant, seating ${himselfU} beside you and bringing ${hisU} hands to your butt. "Size isn't everything in an ass, shape is important too, though I think you've got a good balance. We didn't need to do much reshaping." ${HeU} begins groping your bottom, feeling around for any oddities. "I know you're still a little sore, but bear with it. There, everything feels good, now rest up and you'll be set! Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Groggy, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + break; + case "buttEnlargementImplant": + r.push(`After a few hours, you awaken in the recovery wing, face-down in a bed made to accommodate a person with your body type, with a sore ass. You push yourself up and look at the mass under the cover behind you that is your rear, taking note of how much bigger it is now than when you arrived. "So do you like it?", asks the surgeon's assistant, seating ${himselfU} beside you and bringing ${hisU} hands to your`); + if (V.PC.butt >= 5) { + r.push(`enormous`); + } else if (V.PC.butt >= 4) { + r.push(`huge`); + } else { + r.push(`big`); + } + r.push(`rounded butt. "Size isn't everything in an ass, shape is important too, though I think you've got a good balance. We didn't need to do much reshaping when we put in the implant." ${HeU} begins groping your bottom, feeling the silicone filled implant for any oddities. "I know you're still a little sore, but bear with it. There, everything feels good, now rest up and you'll be set! Though you may need some help righting yourself until you get used to its added weight. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Groggy, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + break; + case "buttEnlargement": + r.push(`After a few hours, you awaken in the recovery wing, face-down in a bed made to accommodate a person with your body type, with a sore ass. You push yourself up and look at the mass under the cover behind you that is your rear, taking note of how much bigger it is now than when you arrived. "So do you like it?", asks the surgeon's assistant, seating ${himselfU} beside you and bringing ${hisU} hands to your`); + if (V.PC.butt >= 5) { + r.push(`enormous`); + } else if (V.PC.butt >= 4) { + r.push(`huge`); + } else { + r.push(`big`); + } + r.push(`soft butt. "Size isn't everything in an ass, shape is important too, though I think you've got a good balance. We didn't need to do much reshaping when we added the fat." ${HeU} begins groping your bottom, feeling around for any oddities. "So soft... I know you're still a little sore, but bear with it. There, everything feels good, now rest up and you'll be set! Though you may need some help righting yourself until you get used to its added weight. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Groggy, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + break; + case "ballEnlargement": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness`); + if (V.PC.balls >= 14) { + r.push(`and the sense that something massive is pushing your legs apart.`); + } else if (V.PC.balls >= 9) { + r.push(`and tight feeling between your legs.`); + } else { + r.push(`between your legs.`); + } + r.push(`You pull the covers off of yourself to catch sight of the result of the surgery and`); + if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) { + r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`); + } else if (V.PC.boobs >= 1400) { + r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`); + } else if (V.PC.belly >= 10000) { + r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`); + } else { + r.push(`find your balls are much bigger than you expected them to be.`); + } + r.push(`"So, what do you think of them?", asks the surgeon's assistant, seating ${himselfU} beside you and placing a hand upon your`); + if (V.PC.balls >= 30) { + r.push(`watermelon-sized`); + } else if (V.PC.balls >= 14) { + r.push(`cantaloupe-sized`); + } else if (V.PC.balls >= 9) { + r.push(`softball-like`); + } else { + r.push(`large`); + } + r.push(`testicles. "Nice and heavy, you should feel them with every move you make." ${HeU} begins groping your scrotum, feeling around for any oddities in the gel. "I know you're still a little sore, but bear with it. Enjoying the massage are you?" ${heU} asks, poking at the tip of your erection with ${hisU} free hand. "Why don't we find out if they are working properly?" ${HeU} leans over your dick${(V.PC.belly >= 5000) ? `, ${hisU} face brushing the underside of your pregnancy,` : ``}`); + if (V.PC.balls >= 10) { + r.push(`and licks up the rivulet of precum running down its length. "As good as always." Taking your dick to the hilt, ${heU} begins earnestly sucking you off while fondling your overfilled balls. The new sensation quickly overwhelms your control and you release your massive load deep in ${hisU} throat. Like a good assistant, ${heU} gulps down the gushing fluid until ${heU} takes you deep enough for it to pour down ${hisU} throat directly. "Shame just adding gel doesn't mean more cum." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + } else { + r.push(`and licks the bead of precum building on its end. "As good as always." Taking your dick to the hilt, ${heU} begins earnestly sucking you off while fondling your overfilled balls. The new sensation quickly overwhelms your control and you release your load deep in ${hisU} throat. Like a good assistant, ${heU} diligently swallows it down, making sure not a drop is missed. "Shame just adding gel doesn't mean more cum." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + } + V.PC.scrotum = V.PC.balls-2; + break; + case "ballShrinkage": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness`); + if (V.PC.ballsImplant >= 9) { + r.push(`and tight feeling between your legs.`); + } else { + r.push(`between your legs.`); + } + r.push(`You pull the covers off of yourself to catch sight of the result of the surgery and`); + if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) { + r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`); + } else if (V.PC.boobs >= 1400) { + r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`); + } else if (V.PC.belly >= 10000) { + r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`); + } else { + r.push(`find your balls are now closer to the typical size one would expect.`); + } + r.push(`"So, what do you think of them?", asks the surgeon's assistant, seating ${himselfU} beside you and placing a hand upon your`); + if (V.PC.balls >= 9) { + r.push(`softball-like`); + } else if (V.PC.balls >= 5) { + r.push(`large`); + } else { + r.push(`normal`); + } + r.push(`testicles. "Starting to feel lighter?" ${HeU} begins groping your scrotum, feeling around for any oddities. "I know you're still a little sore, but bear with it. Enjoying the massage are you?" ${heU} asks, poking at the tip of your erection with ${hisU} free hand. "Why don't we find out if they are still working properly?" ${HeU} leans over your dick${(V.PC.belly >= 5000) ? `, ${hisU} face brushing the underside of your pregnancy,` : ``} and licks the bead of precum building on its end. "As good as always." Taking your dick to the hilt, ${heU} begins earnestly sucking you off while fondling your loosened balls. The new sensation quickly overwhelms your control and you release your load deep in ${hisU} throat. Like a good assistant, ${heU} diligently swallows it down, making sure not a drop is missed. "Shame just can't just suck the gel out of them. That would be too much fun!" Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + V.PC.scrotum = V.PC.balls+3; + break; + case "ballEnlargementHorm": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness`); + if (V.PC.balls >= 14) { + r.push(`and the sense that something massive is pushing your legs apart.`); + } else if (V.PC.balls >= 9) { + r.push(`and tight feeling between your legs.`); + } else { + r.push(`between your legs.`); + } + r.push(`You pull the covers off of yourself to catch sight of the result of the surgery and`); + if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) { + r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`); + } else if (V.PC.boobs >= 1400) { + r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`); + } else if (V.PC.belly >= 10000) { + r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`); + } else { + r.push(`find your balls are much bigger than you expected them to be.`); + } + r.push(`"So, what do you think of them?", asks the surgeon's assistant, seating ${himselfU} beside you and placing a hand upon your`); + if (V.PC.balls >= 30) { + r.push(`watermelon-sized`); + } else if (V.PC.balls >= 14) { + r.push(`cantaloupe-sized`); + } else if (V.PC.balls >= 9) { + r.push(`softball-like`); + } else { + r.push(`large`); + } + r.push(`testicles. "Nice and heavy, they'll be making more cum than ever before." ${HeU} begins groping your scrotum, feeling around for any oddities in the testicles. "I know you're still a little sore from all that growth, but please bear with it." After a few minutes of gentle massage ${heU} looks up at you. "Enjoying the massage are you?" ${heU} asks, poking at the tip of your erection with ${hisU} free hand. "Why don't we find out if they are working properly?" ${HeU} leans over your dick${(V.PC.belly >= 5000) ? `, ${hisU} face brushing the underside of your pregnancy,` : ``}`); + if (V.PC.balls >= 10) { + r.push(`and licks up the rivulet of precum running down its length. "As good as always." Taking your dick to the hilt, ${heU} begins earnestly sucking you off while fondling your overfilled balls. The new sensation quickly overwhelms your control and you release your massive load deep in ${hisU} throat. Like a good assistant, ${heU} struggles to gulp down the torrent of fluid until ${heU} takes you deep enough for it to pour down ${hisU} throat directly. "Now this is the kind of size enhancement I can get behind, not that gel that does nothing for making juicy cum." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + } else { + r.push(`and licks the droplets of precum running down its length. "As good as always." Taking your dick to the hilt, ${heU} begins earnestly sucking you off while fondling your overfilled balls. The new sensation quickly overwhelms your control and you release a surprisingly large load deep in ${hisU} throat. Like a good assistant, ${heU} gulps down the gushing fluid, making sure ${heU} doesn't spill a drop. "Now this is the kind of size enhancement I can get behind, not that gel that does nothing for making juicy cum." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + } + V.PC.scrotum = V.PC.balls-2; + break; + case "ballShrinkageHorm": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness`); + if (V.PC.balls >= 14) { + r.push(`and the sense that something massive is pushing your legs apart.`); + } else if (V.PC.balls >= 9) { + r.push(`and tight feeling between your legs.`); + } else { + r.push(`between your legs.`); + } + r.push(`You pull the covers off of yourself to catch sight of the result of the surgery and`); + if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) { + r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`); + } else if (V.PC.boobs >= 1400) { + r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`); + } else if (V.PC.belly >= 10000) { + r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`); + } else { + r.push(`find your balls are now closer to the typical size one would expect.`); + } + r.push(`"So, what do you think of them?", asks the surgeon's assistant, seating ${himselfU} beside you and placing a hand upon your`); + if (V.PC.balls >= 14) { + r.push(`cantaloupe-sized`); + } else if (V.PC.balls >= 9) { + r.push(`softball-like`); + } else { + r.push(`large`); + } + r.push(`testicles. "Still nice and heavy, I wonder if they'll start making more cum without that gel in the way?" ${HeU} begins groping your scrotum, feeling around for any oddities in the testicles. "I know you're still a little sore from removing that gel, but please bear with it." After a few minutes of gentle massage ${heU} looks up at you. "Enjoying the massage are you?" ${heU} asks, poking at the tip of your erection with ${hisU} free hand. "Why don't we find out if they are working properly?" ${HeU} leans over your dick${(V.PC.belly >= 5000) ? `, ${hisU} face brushing the underside of your pregnancy,` : ``}`); + if (V.PC.balls >= 10) { + r.push(`and licks up the rivulet of precum running down its length. "As good as always." Taking your dick to the hilt, ${heU} begins earnestly sucking you off while fondling your slightly emptier sack. The new sensation quickly overwhelms your control and you release your massive load deep in ${hisU} throat. Like a good assistant, ${heU} struggles to gulp down the torrent of fluid until ${heU} takes you deep enough for it to pour down ${hisU} throat directly. "You know, I think getting rid of that gel did boost your production a little." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + } else { + r.push(`and licks the droplets of precum running down its length. "As good as always." Taking your dick to the hilt, ${heU} begins earnestly sucking you off while fondling your slightly emptier sack. The new sensation quickly overwhelms your control and you release a large load deep in ${hisU} throat. Like a good assistant, ${heU} gulps down the gushing fluid, making sure ${heU} doesn't spill a drop. "You know, I think getting rid of that gel did boost your production a little." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + } + V.PC.scrotum = V.PC.balls+3; + break; + case "ballBigShrinkage": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness and tight feeling between your legs. You pull the covers off of yourself to catch sight of the result of the surgery and`); + if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) { + r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`); + } else if (V.PC.boobs >= 1400) { + r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`); + } else if (V.PC.belly >= 10000) { + r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`); + } else { + r.push(`find your balls have had a dramatic size adjustment.`); + } + r.push(`"So, what do you think of them?", asks the surgeon's assistant, seating ${himselfU} beside you and placing a hand upon your`); + if (V.PC.balls >= 9) { + r.push(`softball-like`); + } else { + r.push(`large`); + } + r.push(`testicles. "Starting to feel lighter?" ${HeU} begins groping your scrotum, feeling around for any oddities. "I know you're still a little sore after removing so much gel on top of the testicle growth." After a few minutes of gentle massage ${heU} looks up at you. "Enjoying the massage are you?" ${heU} asks, poking at the tip of your erection with ${hisU} free hand. "Why don't we find out if those hormones are working properly?" ${HeU} leans over your dick${(V.PC.belly >= 5000) ? `, ${hisU} face brushing the underside of your pregnancy,` : ``} and licks up the droplets of precum running down its length. "As good as always." Taking your dick to the hilt, ${heU} begins earnestly sucking you off while fondling your loosened balls. The new sensation quickly overwhelms your control and you release a surprisingly large load deep in ${hisU} throat. Like a good assistant, ${heU} gulps down the gushing fluid, making sure ${heU} doesn't spill a drop. "Their new size might not be what you were hoping for, but they're sure producing a lot of yummy cum now!" Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.`); + V.PC.scrotum = V.PC.balls+10; + break; + case "tightPussy": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs. You pull the covers off of yourself to catch sight of the result of the surgery and`); + if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) { + r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it.`); + } else if (V.PC.boobs >= 1400) { + r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it.`); + } else if (V.PC.belly >= 10000) { + r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it.`); + } else { + r.push(`find your pussy is much tighter than it was. No hymen though, so you can't pass as a virgin.`); + } + r.push(`"So, do you like it? Does it feel any tighter?", asks the surgeon's assistant, seating ${himselfU} beside you and tracing your labia with a finger. "Feel anything? Or do we need to take this a little further?" ${HeU} begins fingering your new pussy, feeling around for any oddities and teasing you at the same time. "I know you're still a little sore, but bear with it. Plus, I know it must feel good.`); + if (V.PC.dick !== 0) { + r.push(`See? He agrees with me," ${heU} says, poking at the tip of your erection with ${hisU} free hand. "Shall we see if it's working right?" ${HeU} circles around till ${heU} is between your legs and`); + if (V.PC.belly >= 10000) { + r.push(`disappears behind the curvature of your pregnancy.`); + } else { + r.push(`disappears between your thighs.`); + } + r.push(`You feel`); + if (V.PC.balls >= 9) { + r.push(`${himU} lift your engorged sack and leave it resting atop ${hisU} head`); + } else { + r.push(`${hisU} head brush against your sack`); + } + r.push(`as ${heU} brings ${hisU} mouth to your cunt and begins to enthusiastically eat you out. ${HeU} is quite good at ${hisU} job and quickly brings you to climax; your neglected dick spraying cum across your belly. ${HeU} rises from your crotch to lick up your wayward cum. "I always did like the taste of you. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you settle back down to sleep off the rest of the anesthesia before returning to your arcology.`); + } else { + r.push(`See? Your cute little clit agrees with me," ${heU} says, poking at the tip of your peeking clit with ${hisU} free hand. "Shall we see if it's working right?" ${HeU} circles around till ${heU} is between your legs and`); + if (V.PC.belly >= 10000) { + r.push(`disappears behind the curvature of your pregnancy.`); + } else { + r.push(`disappears between your thighs.`); + } + r.push(`You feel face brush your inner legs as ${heU} brings ${hisU} mouth to your cunt and begins to enthusiastically eat you out. ${HeU} is quite good at ${hisU} job and quickly brings you to climax; your new pussy squirting girlcum across ${hisU} face. ${HeU} rises from your crotch and licks ${hisU} lips. "I always did like the taste of you. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you settle back down to sleep off the rest of the anesthesia before returning to your arcology.`); + } + break; + case "herm2female": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs. You pull the covers off of yourself to catch sight of the result of the surgery and`); + if (V.PC.boobs >= 1400) { + r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your penis is gone, leaving you with just a vagina. Given the soreness in your lower belly, your prostate and other male reproductive organs have been removed as well. You can't tell much more until you get a good feel of it.`); + } else { + r.push(`find your penis and testicles removed, leaving you with just a vagina. Given the soreness in your lower belly, your prostate and other male reproductive organs have been removed as well.`); + } + r.push(`"So, how do you feel?", asks the surgeon's assistant, seating ${himselfU} beside you and resting a hand on your pubic mound, making you wince in discomfort. "I'd take it easy for a few days, your body is going to take some time to get used to not having a penis anymore and to recover. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to sleep off the rest of the anesthesia before returning to your arcology.`); + break; + case "herm2male": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs. You pull the covers off of yourself to catch sight of the result of the surgery and`); + if (V.PC.boobs >= 1400) { + r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your pussy is gone, leaving you with just a cock and balls. Given the soreness in your lower belly, your womb and ovaries are gone too. You can't tell much more until you get a good feel of it.`); + } else { + r.push(`find your pussy is gone, leaving you with just a cock and balls. Given the soreness in your lower belly, your womb and ovaries are gone too.`); + } + r.push(`"So, how do you feel?", asks the surgeon's assistant, seating ${himselfU} beside you and resting a hand on your pubic mound, making you wince in discomfort. "I'd take it easy for a few days, your body is going to take some time to recover from surgery. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to sleep off the rest of the anesthesia before returning to your arcology.`); + break; + case "herm2truefemale": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and pain practically all over your body. You pull the covers off of yourself to catch sight of the result of the surgery and`); + if (V.PC.boobs >= 1400) { + r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your penis is gone, leaving you with just a vagina. Given the soreness in your lower belly, your prostate and other male reproductive organs have been removed as well. You can't tell much more until you get a good feel of it. Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you as a man anymore.`); + } else { + r.push(`find your penis and testicles removed, leaving you with just a vagina. Given the soreness in your lower belly, your prostate and other male reproductive organs have been removed as well. You can't tell much more until you get a good feel of it, but you're too sore to try. Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you as a man anymore.`); + } + r.push(`"So, how do you feel?", asks the surgeon's assistant, seating ${himselfU} beside you. "I'd take it easy for the rest of the week, your body is going to take some time to get used to not having a penis anymore and to recover from all the changes. But if it makes you feel any better, you certainly are a lovely woman. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to recover for the rest of your stay.`); + break; + case "herm2truemale": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and pain practically all over your body. You pull the covers off of yourself to catch sight of the result of the surgery and find your pussy is gone, leaving you with just a cock and balls. Given the soreness in your lower belly, your womb and ovaries are gone too. You can't tell much more until you get a good feel of it, but you're too sore to try. Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you a woman anymore. "So, how do you feel?", asks the surgeon's assistant, seating ${himselfU} beside you. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. But if it makes you feel any better, you certainly are a handsome man. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to recover for the rest of your stay.`); + break; + case "male2female": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find`); + if (V.PC.boobs >= 1400) { + r.push(`that your enormous breasts make it difficult to get a good look, so you settle for the mirror-covered wall across from your bed. Your dick is gone, along with the rest of your male reproductive organs, leaving you with a pussy, a new fertile set of ovaries, and a fresh womb. You can't tell much more until you get a good feel of it, but you're too sore to try.`); + } else { + r.push(`your dick is gone, along with the rest of your male reproductive organs, leaving you with a pussy, a new fertile set of ovaries, and a fresh womb. You can't tell much more until you get a good feel of it, but you're too sore to try.`); + } + r.push(`"So, how do you feel?", asks the surgeon's assistant, seating ${himselfU} beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly." ${HeU} circles around until ${heU} is between your legs and disappears between your thighs. You feel face brush your inner legs as ${heU} brings ${hisU} mouth to your fresh pussy and begins to enthusiastically eat you out. ${HeU} is quite good at ${hisU} job and quickly brings you to climax, your new vagina squirting girlcum across ${hisU} face. ${HeU} rises from your crotch and licks ${hisU} lips. "Your new taste is good too. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around. Oh! And before you leave, we'll write a prescription for some birth control for you. You don't have to use it, but it'll be there for you." Exhausted from the procedure, you settle back down to recover for the rest of your stay.`); + break; + case "male2herm": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find`); + if (V.PC.boobs >= 1400) { + r.push(`that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. You see`); + if (V.PC.balls < 5) { + r.push(`your new pussy peeking from under your testicles.`); + } else { + r.push(`that your balls are big enough to completely obscure your new pussy.`); + } + r.push(`Your lower belly is slightly larger too, likely from your new womb. You can't tell much more until you get a good feel of it, but you're too sore to try.`); + } else { + if (V.PC.balls < 5) { + r.push(`your new pussy peeking from under your testicles.`); + } else { + r.push(`that your balls are big enough to completely obscure your new pussy.`); + } + r.push(`Your lower belly is slightly larger too, likely from your new womb. You can't tell much more until you get a good feel of it, but you're too sore to try.`); + } + r.push(`"So, how do you feel?", asks the surgeon's assistant, seating ${himselfU} beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly." ${HeU} circles around until ${heU} is between your legs and disappears between your thighs. You feel`); + if (V.PC.balls >= 9) { + r.push(`${himU} lift your engorged sack and leave it resting atop ${hisU} head`); + } else { + r.push(`${hisU} head brush against your sack`); + } + r.push(`as ${heU} brings ${hisU} mouth to your fresh pussy and begins to enthusiastically eat you out. ${HeU} is quite good at ${hisU} job and quickly brings you to climax; your new vagina squirting girlcum across ${hisU} face and your neglected dick spraying cum across your belly. ${HeU} rises from your crotch to lick up your wayward cum. "I always did like the taste of you and your new flavor is good too. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around. Oh! And before you leave, we'll write a prescription for some birth control for you. You don't have to use it, but it'll be there for you. Just try not to mix your two halves, unless you want to watch your middle steadily swell with your own child." Exhausted from the procedure, you settle back down to recover for the rest of your stay.`); + break; + case "male2truefemale": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and pain practically all over your body. You pull the covers off of yourself to catch sight of the result of the surgery and find`); + if (V.PC.boobs >= 1400) { + r.push(`that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your dick is gone, along with the rest of your male reproductive organs, leaving you with a pussy, a new fertile set of ovaries and a fresh womb. You can't tell much more until you get a good feel of it, but you're too sore to try. Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you as a man anymore.`); + } else { + r.push(`your dick is gone, along with the rest of your male reproductive organs, leaving you with a pussy, a new fertile set of ovaries and a fresh womb. You can't tell much more until you get a good feel of it, but you're too sore to try.`); + if (V.PC.boobs < 300) { + r.push(`You do take a moment to fondle your new C-cup breasts though; they feel nice.`); + } + r.push(`Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you as a man anymore.`); + } + r.push(`"So, how do you feel?", asks the surgeon's assistant, seating ${himselfU} beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly." ${HeU} circles around until ${heU} is between your legs and disappears between your thighs. You feel face brush your inner legs as ${heU} brings ${hisU} mouth to your fresh pussy and begins to enthusiastically eat you out. ${HeU} is quite good at ${hisU} job and quickly brings you to climax; your new vagina squirting girlcum across ${hisU} face. ${HeU} rises from your crotch and licks ${hisU} lips. "Your new taste is good too. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around. Oh! And before you leave, we'll write a prescription for some birth control for you. You don't have to use it, but it'll be there for you." Exhausted from the procedure, you settle back down to play with your tits and recover for the rest of your stay.`); + if (V.PC.boobs < 300) { + V.PC.boobs = 500; + } + break; + case "male2hermfemale": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find`); + if (V.PC.boobs >= 1400) { + r.push(`that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. You see`); + if (V.PC.balls < 5) { + r.push(`your new pussy peeking from under your testicles.`); + } else { + r.push(`that your balls are big enough to completely obscure your new pussy.`); + } + r.push(`Your lower belly is slightly larger too, likely from your new womb. You can't tell much more until you get a good feel of it, but you're too sore to try. Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you as a man anymore.`); + } else { + if (V.PC.balls < 5) { + r.push(`your new pussy peeking from under your testicles.`); + } else { + r.push(`that your balls are big enough to completely obscure your new pussy.`); + } + r.push(`Your lower belly is slightly larger too, likely from your new womb. You can't tell much more until you get a good feel of it, but you're too sore to try.`); + if (V.PC.boobs < 300) { + r.push(`You do take a moment to fondle your new C-cup breasts though; they feel nice.`); + } + r.push(`Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you as a man anymore.`); + } + r.push(`"So, how do you feel?", asks the surgeon's assistant, seating ${himselfU} beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly." ${HeU} circles around until ${heU} is between your legs and disappears between your thighs. You feel`); + if (V.PC.balls >= 9) { + // FIXME: review this + } else { + r.push(`${hisU} head brush against your sack`); + } + r.push(`as ${heU} brings ${hisU} mouth to your fresh pussy and begins to enthusiastically eat you out. ${HeU} is quite good at ${hisU} job and quickly brings you to climax; your new vagina squirting girlcum across ${hisU} face and your neglected dick spraying cum across your belly. ${HeU} rises from your crotch to lick up your wayward cum. "I always did like the taste of you and your new flavor is good too. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around. Oh! And before you leave, we'll write a prescription for some birth control for you. You don't have to use it, but it'll be there for you. Just try not to mix your two halves, unless you want to watch your middle steadily swell with your own child." Exhausted from the procedure, you settle back down to play with your tits and recover for the rest of your stay.`); + if (V.PC.boobs < 300) { + V.PC.boobs = 500; + } + break; + case "female2male": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find`); + if (V.PC.boobs >= 1400) { + r.push(`that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your pussy is gone, replaced with a cock and balls. Given the soreness in your lower belly, your womb and ovaries are gone too. You can't tell much more until you get a good feel of it, but you're too sore to try.`); + } else { + r.push(`your pussy is gone, replaced with a cock and balls. Given the soreness in your lower belly, your womb and ovaries are gone too. You can't tell much more until you get a good feel of it, but you're too sore to try.`); + } + r.push(`"So, how do you feel?", asks the surgeon's assistant, seating ${himselfU} beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly," ${heU} states, teasing your penis. A lewd moan escapes your lips as you are overcome by the sensation. ${HeU} leans over your dick and licks the bead of precum building on its end. "Tasty." Taking your dick to the hilt, ${heU} begins earnestly sucking you off while fondling your sensitive balls. Within moments you release your first load deep in ${hisU} throat. Like a good assistant, ${heU} diligently swallows it down, making sure not a drop is missed. "While I liked the taste of your pussy, this is nice too. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to recover for the rest of your stay.`); + break; + case "female2herm": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find`); + if (V.PC.boobs >= 1400) { + r.push(`that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. You see your new cock and balls, as well as the bottom of your pussy, just barely peeking out from under them. Your lower belly pain is likely caused by the addition of a prostrate and other organs. You can't tell much more until you get a good feel of it, but you're too sore to try, though your new dick disagrees as it grows erect.`); + } else { + r.push(`your new cock and balls, as well as the bottom of your pussy, just barely peeking out from under them. Your lower belly pain is likely caused by the addition of a prostrate and other organs. You can't tell much more until you get a good feel of it, but you're too sore to try, though your new dick disagrees as it grows erect.`); + } + r.push(`"So, how do you feel?", asks the surgeon's assistant, seating ${himselfU} beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly." ${HeU} wraps a hand around your throbbing shaft. "But you seem eager to experience ejaculation." ${HeU} leans over your dick and licks the bead of precum building on its end. "Tasty." Taking your dick to the hilt, ${heU} begins earnestly sucking you off while fondling your sensitive balls. Within moments you release your first load deep in ${hisU} throat. Like a good assistant, ${heU} diligently swallows it down, making sure not a drop is missed. "Not bad, though I'm sorry I couldn't pay more attention to your moist pussy. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to recover for the rest of your stay.`); + break; + case "female2truemale": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find your pussy is gone, replaced with a cock and balls. Given the soreness in your lower belly, your womb and ovaries are gone too. You can't tell much more until you get a good feel of it, but you're too sore to try. Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you a woman anymore. "So, how do you feel?", asks the surgeon's assistant, seating ${himselfU} beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly," ${heU} states, teasing your penis. A lewd moan escapes your lips as you are overcome by the sensation. ${HeU} leans over your dick and licks the bead of precum building on its end. "Tasty." Taking your dick to the hilt, ${heU} begins earnestly sucking you off while fondling your sensitive balls. Within moments you release your first load deep in ${hisU} throat. Like a good assistant, ${heU} diligently swallows it down, making sure not a drop is missed. "While I liked the taste of your pussy, this is nice too. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to recover for the rest of your stay.`); + break; + case "female2hermmale": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find your new cock and balls, as well as the bottom of your pussy, just barely peeking out from under them. Your lower belly pain is likely caused by the addition of a prostrate and other organs. Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you a woman anymore. You can't tell much more until you get a good feel of it, but you're too sore to try, though your new dick disagrees as it grows erect. "So, how do you feel?", asks the surgeon's assistant, seating ${himselfU} beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly." ${HeU} wraps a hand around your throbbing shaft. "But you seem eager to experience ejaculation." ${HeU} leans over your dick and licks the bead of precum building on its end. "Tasty." Taking your dick to the hilt, ${heU} begins earnestly sucking you off while fondling your sensitive balls. Within moments you release your first load deep in ${hisU} throat. Like a good assistant, ${heU} diligently swallows it down, making sure not a drop is missed. "Not bad, though I'm sorry I couldn't pay more attention to your pussy. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to recover for the rest of your stay.`); + break; + case "tummyTuck": + r.push(`After a few hours, you awaken in the recovery wing with a lingering soreness to your stomach. You pull the covers off of yourself to catch sight of the result of the surgery and`); + if (V.PC.boobs >= 1400) { + r.push(`find that your enormous breasts make it difficult to get a good look. Spreading them apart, you find your belly has been restored almost perfectly to the way it was prior to your pregnancy.`); + } else { + r.push(`find your belly has been restored almost perfectly to the way it was prior to your pregnancy.`); + } + r.push(`"So, good enough to show off?", asks the surgeon's assistant, seating ${himselfU} beside you and tracing your navel with a finger. "It was a very simple procedure, so you're free to go whenever," ${heU} says, a crestfallen tone in ${hisU} voice.`); + break; + case "ovulationRestart": + r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find`); + if (V.PC.boobs >= 1400) { + r.push(`find that your enormous breasts make it difficult to get a good look. Spreading them apart, you find nothing but a pair of small, stitched incisions over your ovaries.`); + } else { + r.push(`find nothing but a pair of small, stitched incisions over your ovaries.`); + } + r.push(`"Everything went well", says the surgeon's assistant, seating ${himselfU} beside you and tracing your labia with a finger. "Now we won't know if they are functional until you have your first period. Funny hearing that again, right? Anyway, everything is hooked up so I'm sure you'll find out in a few weeks. So, how about a little warm up to get you ready?" ${HeU} circles around till ${heU} is between your legs and disappears between your thighs. You feel face brush your inner legs as ${heU} brings ${hisU} mouth to your cunt and begins to enthusiastically eat you out. ${HeU} is quite good at ${hisU} job and quickly brings you to climax; your pussy squirting girlcum across ${hisU} face. ${HeU} rises from your crotch and licks ${hisU} lips. "As much as I'd like to really check your fertility, I lack the proper 'instruments' to do so and, well, I doubt you'd want me to be the father of your next child..." ${HeU} faces the floor before turning back to you. "Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you settle back down to sleep off the rest of the anesthesia before returning to your arcology.`); + break; + default: + r.push(`You have surgery. This is a WIP, if you can't tell.`); + } + App.Events.addParagraph(frag, r); + return frag; +}; diff --git a/src/player/pcSurgeryDegradation.tw b/src/player/pcSurgeryDegradation.tw deleted file mode 100644 index c9ccb1ccb96065b3b75bd1443beb720f5028e90a..0000000000000000000000000000000000000000 --- a/src/player/pcSurgeryDegradation.tw +++ /dev/null @@ -1,315 +0,0 @@ -:: PC Surgery Degradation [nobr] - -<<set $nextButton = "Continue", $nextLink = "Manage Personal Affairs">> -<<if $seeDicks == 100>> - <<setNonlocalPronouns 100>> -<<else>> - <<setNonlocalPronouns 0>> -<</if>> - -<<switch $surgeryType>> - -<<case "skinTone">> - After a few hours, you awaken in the recovery wing to find every <<if $showInches == 2>>inch<<else>>centimeter<</if>> of your body burning; though from what you did manage to see, you are, in fact, $PC.skin now. <<if !["pure white", "ivory", "white", "extremely pale", "very pale", "pale", "extremely fair", "very fair", "fair", "light", "light olive", "tan", "olive", "bronze", "dark olive", "dark", "light beige", "beige", "dark beige", "light brown", "brown", "dark brown", "black", "ebony", "pure black"].includes($PC.skin)>>The surgeon's assistant immediately covers _hisU mouth to hide _hisU giggle a the sight of you<<else>>The surgeon's assistant carefully seats _himselfU besides you with a large drum of cream<</if>>. "This stuff is specially formulated to soothe burns like this and should have you feeling much better after a few applications.<<if $PC.dick != 0>> Now please, try not to get hard while I apply this. It will hurt like hell.<</if>>" _HeU spends the next half hour gingerly applying the cream across every <<if $showInches == 2>>inch<<else>>centimeter<</if>> of your body. _HisU touch is so soft, it is hard to not get aroused, and as your body tenses, a wave of pain washes over you. "Calm down, and take a few applications first. Though I forgot to tell you, your erogenous zones were especially affected and will need plenty of extra attention." _HeU winks at you. You doubt the validity of that claim but understand exactly what _heU means by it. The next few days will be very enjoyable, but for now, you opt to stay perfectly still and will the cream to work faster. - -<<case "restoreFace">> - After a few hours, you awaken in the recovery wing with a face both sore and somewhat numb. <<if $PC.belly >= 10000 || $PC.boobs >= 1400>>Struggling to sit<<else>>Sitting<</if>> up, you catch sight of yourself in the mirror-covered wall across from your bed. Your face is back to the way it was before you had it altered (not counting any additional years added to it) and looking just as good as you remember. You attempt to smile at yourself, only to find your face doesn't want to comply; guess the drugs haven't completely worn off yet. You lie back down to sleep off the rest of the anesthesia before returning to your arcology. - -<<case "ageDown">> - After a few hours, you awaken in the recovery wing with a face both sore and somewhat numb. Sitting up, you catch sight of yourself in the mirror-covered wall across from your bed. An oddly familiar face is staring back at you; it takes you a moment to register in your groggy state that it isn't your past self but rather the result of the age reduction surgery. You attempt to smile at yourself, only to find your face doesn't want to comply; guess the drugs haven't completely worn off yet. You lie back down to sleep off the rest of the anesthesia before returning to your arcology. - <<run applyAgeImplant($PC)>> - -<<case "ageUp">> - After a few hours, you awaken in the recovery wing with a face both sore and somewhat numb. Sitting up, you catch sight of yourself in the mirror-covered wall across from your bed. An oddly familiar face is staring back at you; it takes you a moment to register in your groggy state that you are in fact looking at the result of the age increasing surgery. You attempt to smile at yourself, only to find your face doesn't want to comply; guess the drugs haven't completely worn off yet. You lie back down to sleep off the rest of the anesthesia before returning to your arcology. - <<run applyAgeImplantOlder($PC)>> - -<<case "breastReductionImplant">> - After a few hours, you awaken in the recovery wing with a sore chest. <<if $PC.belly >= 10000>>Struggling to sit<<else>>Sitting<</if>> up, you immediately notice how much lighter your breasts are. Pulling the covers off yourself, you observe your implant free boobs in the mirror-covered wall across from your bed. "So do you like them?", asks the surgeon's assistant, seating _himselfU behind you and wrapping _hisU hands around to your natural breasts. "We made sure to tighten them up a bit, get rid of that sag from not having the silicone pouch in them anymore." _HeU begins groping your breasts, feeling for any oddities. "I know you're still a little sore, but bear with it." _HeU moves on to your nipples and begins teasing them. <<if $PC.lactation > 0>>_HeU lets out a surprised squeak when a gush of milk escapes your breasts and a moan escapes your lips. "<<if $PC.pregKnown == 1>>Should have expected that with the pregnancy and all.<<else>>You did recently have a child didn't you? Or have you just been enjoying your nipples too much?<</if>> Either way, this is a good thing. Your breasts work."<</if>> You can't help but moan under your building arousal as _heU massages and teases your breasts. "Enjoying yourself are we? Let me finish you off." _HeU sneaks a hand down to your <<if $PC.dick != 0>>stiff prick and begins stroking its length, quickly bringing you to orgasm and relieving you of your built up tension.<<else>>stiff clit and begins teasing it as well, quickly bringing you to orgasm and relieving you of your built up tension.<</if>> _HeU states, while licking _hisU fingers, "I always did enjoy the way you taste. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - -<<case "breastShrinkage">> - After a few hours, you awaken in the recovery wing with a sore chest. <<if $PC.belly >= 10000>>Struggling to sit<<else>>Sitting<</if>> up, you immediately notice how much lighter your breasts are. Pulling the covers off yourself, you observe your - <<if $PC.boobs >= 1400>> - smaller, but still ridiculously huge, - <<elseif $PC.boobs >= 1200>> - smaller G-cup - <<elseif $PC.boobs >= 1000>> - smaller F-cup - <<elseif $PC.boobs >= 800>> - smaller DD-cup - <<elseif $PC.boobs >= 650>> - smaller D-cup - <<elseif $PC.boobs >= 500>> - smaller C-cup - <<elseif $PC.boobs >= 400>> - smaller B-cup - <<else>> - downright tiny - <</if>> - boobs in the mirror-covered wall across from your bed. "So do you like them?", asks the surgeon's assistant, seating _himselfU behind you and wrapping _hisU hands around to your shrunken breasts. "We made sure to tighten them up a bit, get rid of that sagginess from weight and the mass removed." _HeU begins groping your breasts, feeling for any oddities. "I know you're still a little sore, but bear with it." _HeU moves on to your nipples and begins teasing them. <<if $PC.lactation > 0>>_HeU lets out a surprised squeak when a gush of milk escapes your breasts and a moan escapes your lips. "<<if $PC.pregKnown == 1>>Should have expected that with the pregnancy and all.<<else>>You did recently have a child didn't you? Or have you just been enjoying your nipples too much?<</if>> Either way, this is a good thing. Your breasts work."<</if>> You can't help but moan under your building arousal as _heU massages and teases your breasts. "Enjoying yourself are we? Let me finish you off." _HeU sneaks a hand down to your <<if $PC.dick != 0>>stiff prick and begins stroking its length, quickly bringing you to orgasm and relieving you of your built up tension.<<else>>stiff clit and begins teasing it as well, quickly bringing you to orgasm and relieving you of your built up tension.<</if>> _HeU states, while licking _hisU fingers, "I always did enjoy the way you taste. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - -<<case "breastEnlargementImplant">> - After a few hours, you awaken in the recovery wing with a sore chest. <<if $PC.belly >= 10000 || $PC.boobs >= 1400>>Struggling to sit<<else>>Sitting<</if>> up, you immediately notice how much heavier your breasts are. Pulling the covers off yourself, you observe your new, round - <<if $PC.boobs >= 1400>> - H-cup - <<elseif $PC.boobs >= 1200>> - G-cup - <<elseif $PC.boobs >= 1000>> - F-cup - <</if>> - boobs in the mirror-covered wall across from your bed. "So do you like them?", asks the surgeon's assistant, seating _himselfU behind you and wrapping _hisU hands around to your heaving breasts. "We did everything we could to keep them looking natural, - <<if $PC.boobsImplant/$PC.boobs >= .70>> - but the implants were way too big for that." - <<elseif $PC.boobsImplant/$PC.boobs >= .50>> - but you can definitely tell." - <<else>> - and I say we did a pretty good job." - <</if>> - _HeU begins groping your breasts, feeling the implant within for any oddities. "I know you're still a little sore, but bear with it." _HeU moves on to your nipples and begins teasing them. <<if $PC.lactation > 0>>_HeU lets out a surprised squeak when a gush of milk escapes your breasts and a moan escapes your lips. "<<if $PC.pregKnown == 1>>Should have expected that with the pregnancy and all.<<else>>You did recently have a child didn't you? Or have you just been enjoying your nipples too much?<</if>> Either way, this is a good thing. Your breasts work."<</if>> You can't help but moan under your building arousal as _heU massages and teases your implant laden breasts. "Enjoying yourself are we? Let me finish you off." _HeU sneaks a hand down to your <<if $PC.dick != 0>>stiff prick and begins stroking its length, quickly bringing you to orgasm and relieving you of your built up tension.<<else>>stiff clit and begins teasing it as well, quickly bringing you to orgasm and relieving you of your built up tension.<</if>> _HeU states, while licking _hisU fingers, "I always did enjoy the way you taste. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - -<<case "breastEnlargement">> - After a few hours, you awaken in the recovery wing with a sore chest. <<if $PC.belly >= 10000 || $PC.boobs >= 1400>>Struggling to sit<<else>>Sitting<</if>> up, you immediately notice how much heavier your breasts are. Pulling the covers off yourself, you observe your new, soft - <<if $PC.boobs >= 1400>> - H-cup - <<elseif $PC.boobs >= 1200>> - G-cup - <<elseif $PC.boobs >= 1000>> - F-cup - <<elseif $PC.boobs >= 800>> - DD-cup - <<elseif $PC.boobs >= 650>> - D-cup - <<elseif $PC.boobs >= 500>> - C-cup - <<elseif $PC.boobs >= 400>> - B-cup - <<else>> - A-cup - <</if>> - boobs in the mirror-covered wall across from your bed. "So do you like them?", asks the surgeon's assistant, seating _himselfU behind you and wrapping _hisU hands around to your heaving breasts. "We did everything we could to keep them perky, <<if $PC.boobs >= 1400>>quite a feat given their size<<else>>not that hard given your natural perk<</if>>." _HeU begins groping your breasts, feeling the added mass for any oddities. "I know you're still a little sore, but bear with it." _HeU moves on to your nipples and begins teasing them. <<if $PC.lactation > 0>>_HeU lets out a surprised squeak when a gush of milk escapes your breasts and a moan escapes your lips. "<<if $PC.pregKnown == 1>>Should have expected that with the pregnancy and all.<<else>>You did recently have a child didn't you? Or have you just been enjoying your nipples too much?<</if>> Either way, this is a good thing. Your breasts work."<</if>> You can't help but moan under your building arousal as _heU massages and teases your fat tits. "Enjoying yourself are we? Let me finish you off." _HeU sneaks a hand down to your <<if $PC.dick != 0>>stiff prick and begins stroking its length, quickly bringing you to orgasm and relieving you of your built up tension.<<else>>stiff clit and begins teasing it as well, quickly bringing you to orgasm and relieving you of your built up tension.<</if>> _HeU states, while licking _hisU fingers, "I always did enjoy the way you taste. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - -<<case "flatChest">> - After a few hours, you awaken in the recovery wing with a sore chest. <<if $PC.belly >= 10000>>Struggling to sit<<else>>Sitting<</if>> up, you immediately notice the absence of the usual weight on your chest. Pulling the covers off yourself, you observe your flat chest in the mirror-covered wall across from your bed. "So do you like it?", asks the surgeon's assistant, seating _himselfU behind you and wrapping _hisU hands around to your chest. "I honestly couldn't live without my pair." _HeU begins groping your chest, feeling for any oddities. "I know you're still a little sore, but bear with it." _HeU moves on to your nipples and begins teasing them. <<if $PC.lactation > 0>>_HeU lets out a surprised squeak when a gush of milk escapes your tits and a moan escapes your lips. "<<if $PC.pregKnown == 1>>Should have expected that with the pregnancy and all.<<else>>You did recently have a child didn't you? Or have you just been enjoying your nipples too much?<</if>> Either way, this is a good thing. Your breasts still work, but it's still strange coming from such a flat chest."<</if>> You can't help but moan under your building arousal as _heU massages and teases your nipples. "Enjoying yourself are we? Let me finish you off." _HeU sneaks a hand down to your <<if $PC.dick != 0>>stiff prick and begins stroking its length, quickly bringing you to orgasm and relieving you of your built up tension.<<else>>stiff clit and begins teasing it as well, quickly bringing you to orgasm and relieving you of your built up tension.<</if>> _HeU states, while licking _hisU fingers, "I always did enjoy the way you taste. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - -<<case "breasts">> - After a few hours, you awaken in the recovery wing with a sore chest. <<if $PC.belly >= 10000 || $PC.boobs >= 1400>>Struggling to sit<<else>>Sitting<</if>> up, you immediately notice a new weight on your chest. Pulling the covers off yourself, you observe your new, soft C-cup boobs in the mirror-covered wall across from your bed. "So do you like them?", asks the surgeon's assistant, seating _himselfU behind you and wrapping _hisU hands around to your heaving breasts. "With these, you should be able to compete with any girls around you." _HeU begins groping your breasts, feeling the added mass for any oddities. "I know you're still a little sore, but bear with it." _HeU moves on to your nipples and begins teasing them. <<if $PC.lactation > 0>>_HeU lets out a surprised squeak when a gush of milk escapes your breasts and a moan escapes your lips. "<<if $PC.pregKnown == 1>>Should have expected that with the pregnancy and all.<<else>>You did recently have a child didn't you? Or have you just been enjoying your nipples too much?<</if>> Either way, this is a good thing. Your breasts work."<</if>> You can't help but moan under your building arousal as _heU massages and teases your new tits. "Enjoying yourself are we? Let me finish you off." _HeU sneaks a hand down to your <<if $PC.dick != 0>>stiff prick and begins stroking its length, quickly bringing you to orgasm and relieving you of your built up tension.<<else>>stiff clit and begins teasing it as well, quickly bringing you to orgasm and relieving you of your built up tension.<</if>> _HeU states, while licking _hisU fingers, "I always did enjoy the way you taste. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - -<<case "buttReductionImplant">> - After a few hours, you awaken in the recovery wing, face-down in a bed made to accommodate a person with your body type, with a sore ass. You push yourself up and look at the mass under the cover behind you that is your rear, taking note of how much smaller it is now than when you arrived. "So do you like it?", asks the surgeon's assistant, seating _himselfU beside you and bringing _hisU hands to your butt. "Size isn't everything in an ass, shape is important too." _HeU begins groping your bottom, feeling around for any oddities. "I know you're still a little sore, but bear with it. There, everything feels good, now rest up and you'll be set! Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Groggy, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - -<<case "buttShrinkage">> - After a few hours, you awaken in the recovery wing, face-down in a bed made to accommodate a person with your body type, with a sore ass. You push yourself up and look at the mass under the cover behind you that is your rear, taking note of how much smaller it is now than when you arrived. "So do you like it?", asks the surgeon's assistant, seating _himselfU beside you and bringing _hisU hands to your butt. "Size isn't everything in an ass, shape is important too, though I think you've got a good balance. We didn't need to do much reshaping." _HeU begins groping your bottom, feeling around for any oddities. "I know you're still a little sore, but bear with it. There, everything feels good, now rest up and you'll be set! Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Groggy, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - -<<case "buttEnlargementImplant">> - After a few hours, you awaken in the recovery wing, face-down in a bed made to accommodate a person with your body type, with a sore ass. You push yourself up and look at the mass under the cover behind you that is your rear, taking note of how much bigger it is now than when you arrived. "So do you like it?", asks the surgeon's assistant, seating _himselfU beside you and bringing _hisU hands to your <<if $PC.butt >= 5>>enormous<<elseif $PC.butt >= 4>>huge<<else>>big<</if>> rounded butt. "Size isn't everything in an ass, shape is important too, though I think you've got a good balance. We didn't need to do much reshaping when we put in the implant." _HeU begins groping your bottom, feeling the silicone filled implant for any oddities. "I know you're still a little sore, but bear with it. There, everything feels good, now rest up and you'll be set! Though you may need some help righting yourself until you get used to its added weight. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Groggy, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - -<<case "buttEnlargement">> - After a few hours, you awaken in the recovery wing, face-down in a bed made to accommodate a person with your body type, with a sore ass. You push yourself up and look at the mass under the cover behind you that is your rear, taking note of how much bigger it is now than when you arrived. "So do you like it?", asks the surgeon's assistant, seating _himselfU beside you and bringing _hisU hands to your <<if $PC.butt >= 5>>enormous<<elseif $PC.butt >= 4>>huge<<else>>big<</if>> soft butt. "Size isn't everything in an ass, shape is important too, though I think you've got a good balance. We didn't need to do much reshaping when we added the fat." _HeU begins groping your bottom, feeling around for any oddities. "So soft... I know you're still a little sore, but bear with it. There, everything feels good, now rest up and you'll be set! Though you may need some help righting yourself until you get used to its added weight. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Groggy, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - -<<case "ballEnlargement">> - After a few hours, you awaken in the recovery wing with a distinct soreness <<if $PC.balls >= 14>>and the sense that something massive is pushing your legs apart<<elseif $PC.balls >= 9>>and tight feeling between your legs<<else>>between your legs<</if>>. You pull the covers off of yourself to catch sight of the result of the surgery and - <<if $PC.boobs >= 1400 && $PC.belly >= 10000>> - find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery. - <<elseif $PC.boobs >= 1400>> - find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery. - <<elseif $PC.belly >= 10000>> - find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery. - <<else>> - find your balls are much bigger than you expected them to be. - <</if>> - "So, what do you think of them?", asks the surgeon's assistant, seating _himselfU beside you and placing a hand upon your <<if $PC.balls >= 30>>watermelon-sized<<elseif $PC.balls >= 14>>cantaloupe-sized<<elseif $PC.balls >= 9>>softball-like<<else>>large<</if>> testicles. "Nice and heavy, you should feel them with every move you make." _HeU begins groping your scrotum, feeling around for any oddities in the gel. "I know you're still a little sore, but bear with it. Enjoying the massage are you?" _heU asks, poking at the tip of your erection with _hisU free hand. "Why don't we find out if they are working properly?" _HeU leans over your dick<<if $PC.belly >= 5000>>, _hisU face brushing the underside of your pregnancy,<</if>> - <<if $PC.balls >= 10>> and licks up the rivulet of precum running down its length. "As good as always." Taking your dick to the hilt, _heU begins earnestly sucking you off while fondling your overfilled balls. The new sensation quickly overwhelms your control and you release your massive load deep in _hisU throat. Like a good assistant, _heU gulps down the gushing fluid until _heU takes you deep enough for it to pour down _hisU throat directly. "Shame just adding gel doesn't mean more cum." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - <<else>> and licks the bead of precum building on its end. "As good as always." Taking your dick to the hilt, _heU begins earnestly sucking you off while fondling your overfilled balls. The new sensation quickly overwhelms your control and you release your load deep in _hisU throat. Like a good assistant, _heU diligently swallows it down, making sure not a drop is missed. "Shame just adding gel doesn't mean more cum." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.<</if>> - <<set $PC.scrotum = $PC.balls-2>> - -<<case "ballShrinkage">> - After a few hours, you awaken in the recovery wing with a distinct soreness <<if $PC.ballsImplant >= 9>>and tight feeling between your legs<<else>>between your legs<</if>>. You pull the covers off of yourself to catch sight of the result of the surgery and - <<if $PC.boobs >= 1400 && $PC.belly >= 10000>> - find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect. - <<elseif $PC.boobs >= 1400>> - find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect. - <<elseif $PC.belly >= 10000>> - find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect. - <<else>> - find your balls are now closer to the typical size one would expect. - <</if>> - "So, what do you think of them?", asks the surgeon's assistant, seating _himselfU beside you and placing a hand upon your <<if $PC.balls >= 9>>softball-like<<elseif $PC.balls >= 5>>large<<else>>normal<</if>> testicles. "Starting to feel lighter?" _HeU begins groping your scrotum, feeling around for any oddities. "I know you're still a little sore, but bear with it. Enjoying the massage are you?" _heU asks, poking at the tip of your erection with _hisU free hand. "Why don't we find out if they are still working properly?" _HeU leans over your dick<<if $PC.belly >= 5000>>, _hisU face brushing the underside of your pregnancy,<</if>> and licks the bead of precum building on its end. "As good as always." Taking your dick to the hilt, _heU begins earnestly sucking you off while fondling your loosened balls. The new sensation quickly overwhelms your control and you release your load deep in _hisU throat. Like a good assistant, _heU diligently swallows it down, making sure not a drop is missed. "Shame just can't just suck the gel out of them. That would be too much fun!" Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - <<set $PC.scrotum = $PC.balls+3>> - -<<case "ballEnlargementHorm">> - After a few hours, you awaken in the recovery wing with a distinct soreness <<if $PC.balls >= 14>>and the sense that something massive is pushing your legs apart<<elseif $PC.balls >= 9>>and tight feeling between your legs<<else>>between your legs<</if>>. You pull the covers off of yourself to catch sight of the result of the surgery and - <<if $PC.boobs >= 1400 && $PC.belly >= 10000>> - find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery. - <<elseif $PC.boobs >= 1400>> - find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery. - <<elseif $PC.belly >= 10000>> - find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery. - <<else>> - find your balls are much bigger than you expected them to be. - <</if>> - "So, what do you think of them?", asks the surgeon's assistant, seating _himselfU beside you and placing a hand upon your <<if $PC.balls >= 30>>watermelon-sized<<elseif $PC.balls >= 14>>cantaloupe-sized<<elseif $PC.balls >= 9>>softball-like<<else>>large<</if>> testicles. "Nice and heavy, they'll be making more cum than ever before." _HeU begins groping your scrotum, feeling around for any oddities in the testicles. "I know you're still a little sore from all that growth, but please bear with it." After a few minutes of gentle massage _heU looks up at you. "Enjoying the massage are you?" _heU asks, poking at the tip of your erection with _hisU free hand. "Why don't we find out if they are working properly?" _HeU leans over your dick<<if $PC.belly >= 5000>>, _hisU face brushing the underside of your pregnancy,<</if>> - <<if $PC.balls >= 10>> and licks up the rivulet of precum running down its length. "As good as always." Taking your dick to the hilt, _heU begins earnestly sucking you off while fondling your overfilled balls. The new sensation quickly overwhelms your control and you release your massive load deep in _hisU throat. Like a good assistant, _heU struggles to gulp down the torrent of fluid until _heU takes you deep enough for it to pour down _hisU throat directly. "Now this is the kind of size enhancement I can get behind, not that gel that does nothing for making juicy cum." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - <<else>> and licks the droplets of precum running down its length. "As good as always." Taking your dick to the hilt, _heU begins earnestly sucking you off while fondling your overfilled balls. The new sensation quickly overwhelms your control and you release a surprisingly large load deep in _hisU throat. Like a good assistant, _heU gulps down the gushing fluid, making sure _heU doesn't spill a drop. "Now this is the kind of size enhancement I can get behind, not that gel that does nothing for making juicy cum." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.<</if>> - <<set $PC.scrotum = $PC.balls-2>> - -<<case "ballShrinkageHorm">> - After a few hours, you awaken in the recovery wing with a distinct soreness <<if $PC.balls >= 14>>and the sense that something massive is pushing your legs apart<<elseif $PC.balls >= 9>>and tight feeling between your legs<<else>>between your legs<</if>>. You pull the covers off of yourself to catch sight of the result of the surgery and - <<if $PC.boobs >= 1400 && $PC.belly >= 10000>> - find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect. - <<elseif $PC.boobs >= 1400>> - find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect. - <<elseif $PC.belly >= 10000>> - find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect. - <<else>> - find your balls are now closer to the typical size one would expect. - <</if>> - "So, what do you think of them?", asks the surgeon's assistant, seating _himselfU beside you and placing a hand upon your <<if $PC.balls >= 14>>cantaloupe-sized<<elseif $PC.balls >= 9>>softball-like<<else>>large<</if>> testicles. "Still nice and heavy, I wonder if they'll start making more cum without that gel in the way?" _HeU begins groping your scrotum, feeling around for any oddities in the testicles. "I know you're still a little sore from removing that gel, but please bear with it." After a few minutes of gentle massage _heU looks up at you. "Enjoying the massage are you?" _heU asks, poking at the tip of your erection with _hisU free hand. "Why don't we find out if they are working properly?" _HeU leans over your dick<<if $PC.belly >= 5000>>, _hisU face brushing the underside of your pregnancy,<</if>> - <<if $PC.balls >= 10>> and licks up the rivulet of precum running down its length. "As good as always." Taking your dick to the hilt, _heU begins earnestly sucking you off while fondling your slightly emptier sack. The new sensation quickly overwhelms your control and you release your massive load deep in _hisU throat. Like a good assistant, _heU struggles to gulp down the torrent of fluid until _heU takes you deep enough for it to pour down _hisU throat directly. "You know, I think getting rid of that gel did boost your production a little." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - <<else>> and licks the droplets of precum running down its length. "As good as always." Taking your dick to the hilt, _heU begins earnestly sucking you off while fondling your slightly emptier sack. The new sensation quickly overwhelms your control and you release a large load deep in _hisU throat. Like a good assistant, _heU gulps down the gushing fluid, making sure _heU doesn't spill a drop. "You know, I think getting rid of that gel did boost your production a little." Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology.<</if>> - <<set $PC.scrotum = $PC.balls+3>> - -<<case "ballBigShrinkage">> - After a few hours, you awaken in the recovery wing with a distinct soreness and tight feeling between your legs. You pull the covers off of yourself to catch sight of the result of the surgery and - <<if $PC.boobs >= 1400 && $PC.belly >= 10000>> - find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect. - <<elseif $PC.boobs >= 1400>> - find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect. - <<elseif $PC.belly >= 10000>> - find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect. - <<else>> - find your balls have had a dramatic size adjustment. - <</if>> - "So, what do you think of them?", asks the surgeon's assistant, seating _himselfU beside you and placing a hand upon your <<if $PC.balls >= 9>>softball-like<<else>>large<</if>> testicles. "Starting to feel lighter?" _HeU begins groping your scrotum, feeling around for any oddities. "I know you're still a little sore after removing so much gel on top of the testicle growth." After a few minutes of gentle massage _heU looks up at you. "Enjoying the massage are you?" _heU asks, poking at the tip of your erection with _hisU free hand. "Why don't we find out if those hormones are working properly?" _HeU leans over your dick<<if $PC.belly >= 5000>>, _hisU face brushing the underside of your pregnancy,<</if>> and licks up the droplets of precum running down its length. "As good as always." Taking your dick to the hilt, _heU begins earnestly sucking you off while fondling your loosened balls. The new sensation quickly overwhelms your control and you release a surprisingly large load deep in _hisU throat. Like a good assistant, _heU gulps down the gushing fluid, making sure _heU doesn't spill a drop. "Their new size might not be what you were hoping for, but they're sure producing a lot of yummy cum now!" Satisfied, you lie back down to sleep off the rest of the anesthesia before returning to your arcology. - <<set $PC.scrotum = $PC.balls+10>> - -<<case "tightPussy">> - After a few hours, you awaken in the recovery wing with a distinct soreness between your legs. You pull the covers off of yourself to catch sight of the result of the surgery and - <<if $PC.boobs >= 1400 && $PC.belly >= 10000>> - find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it. - <<elseif $PC.boobs >= 1400>> - find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it. - <<elseif $PC.belly >= 10000>> - find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it. - <<else>> - find your pussy is much tighter than it was. No hymen though, so you can't pass as a virgin. - <</if>> - "So, do you like it? Does it feel any tighter?", asks the surgeon's assistant, seating _himselfU beside you and tracing your labia with a finger. "Feel anything? Or do we need to take this a little further?" _HeU begins fingering your new pussy, feeling around for any oddities and teasing you at the same time. "I know you're still a little sore, but bear with it. Plus, I know it must feel good. - <<if $PC.dick != 0>> - See? He agrees with me," _heU says, poking at the tip of your erection with _hisU free hand. "Shall we see if it's working right?" _HeU circles around till _heU is between your legs and <<if $PC.belly >= 10000>>disappears behind the curvature of your pregnancy<<else>>disappears between your thighs<</if>>. You feel <<if $PC.balls >= 9>>_himU lift your engorged sack and leave it resting atop _hisU head<<else>>_hisU head brush against your sack<</if>> as _heU brings _hisU mouth to your cunt and begins to enthusiastically eat you out. _HeU is quite good at _hisU job and quickly brings you to climax; your neglected dick spraying cum across your belly. _HeU rises from your crotch to lick up your wayward cum. "I always did like the taste of you. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you settle back down to sleep off the rest of the anesthesia before returning to your arcology. - <<else>> - See? Your cute little clit agrees with me," _heU says, poking at the tip of your peeking clit with _hisU free hand. "Shall we see if it's working right?" _HeU circles around till _heU is between your legs and <<if $PC.belly >= 10000>>disappears behind the curvature of your pregnancy<<else>>disappears between your thighs<</if>>. You feel face brush your inner legs as _heU brings _hisU mouth to your cunt and begins to enthusiastically eat you out. _HeU is quite good at _hisU job and quickly brings you to climax; your new pussy squirting girlcum across _hisU face. _HeU rises from your crotch and licks _hisU lips. "I always did like the taste of you. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you settle back down to sleep off the rest of the anesthesia before returning to your arcology. - <</if>> - -<<case "herm2female">> - After a few hours, you awaken in the recovery wing with a distinct soreness between your legs. You pull the covers off of yourself to catch sight of the result of the surgery and - <<if $PC.boobs >= 1400>> - find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your penis is gone, leaving you with just a vagina. Given the soreness in your lower belly, your prostate and other male reproductive organs have been removed as well. You can't tell much more until you get a good feel of it. - <<else>> - find your penis and testicles removed, leaving you with just a vagina. Given the soreness in your lower belly, your prostate and other male reproductive organs have been removed as well. - <</if>> - "So, how do you feel?", asks the surgeon's assistant, seating _himselfU beside you and resting a hand on your pubic mound, making you wince in discomfort. "I'd take it easy for a few days, your body is going to take some time to get used to not having a penis anymore and to recover. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to sleep off the rest of the anesthesia before returning to your arcology. - -<<case "herm2male">> - After a few hours, you awaken in the recovery wing with a distinct soreness between your legs. You pull the covers off of yourself to catch sight of the result of the surgery and - <<if $PC.boobs >= 1400>> - find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your pussy is gone, leaving you with just a cock and balls. Given the soreness in your lower belly, your womb and ovaries are gone too. You can't tell much more until you get a good feel of it. - <<else>> - find your pussy is gone, leaving you with just a cock and balls. Given the soreness in your lower belly, your womb and ovaries are gone too. - <</if>> - "So, how do you feel?", asks the surgeon's assistant, seating _himselfU beside you and resting a hand on your pubic mound, making you wince in discomfort. "I'd take it easy for a few days, your body is going to take some time to recover from surgery. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to sleep off the rest of the anesthesia before returning to your arcology. - -<<case "herm2truefemale">> - After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and pain practically all over your body. You pull the covers off of yourself to catch sight of the result of the surgery and - <<if $PC.boobs >= 1400>> - find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your penis is gone, leaving you with just a vagina. Given the soreness in your lower belly, your prostate and other male reproductive organs have been removed as well. You can't tell much more until you get a good feel of it. Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you as a man anymore. - <<else>> - find your penis and testicles removed, leaving you with just a vagina. Given the soreness in your lower belly, your prostate and other male reproductive organs have been removed as well. You can't tell much more until you get a good feel of it, but you're too sore to try. Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you as a man anymore. - <</if>> - "So, how do you feel?", asks the surgeon's assistant, seating _himselfU beside you. "I'd take it easy for the rest of the week, your body is going to take some time to get used to not having a penis anymore and to recover from all the changes. But if it makes you feel any better, you certainly are a lovely woman. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to recover for the rest of your stay. - -<<case "herm2truemale">> - After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and pain practically all over your body. You pull the covers off of yourself to catch sight of the result of the surgery and find your pussy is gone, leaving you with just a cock and balls. Given the soreness in your lower belly, your womb and ovaries are gone too. You can't tell much more until you get a good feel of it, but you're too sore to try. Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you a woman anymore. "So, how do you feel?", asks the surgeon's assistant, seating _himselfU beside you. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. But if it makes you feel any better, you certainly are a handsome man. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to recover for the rest of your stay. - -<<case "male2female">> - After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find - <<if $PC.boobs >= 1400>> - that your enormous breasts make it difficult to get a good look, so you settle for the mirror-covered wall across from your bed. Your dick is gone, along with the rest of your male reproductive organs, leaving you with a pussy, a new fertile set of ovaries, and a fresh womb. You can't tell much more until you get a good feel of it, but you're too sore to try. - <<else>> - your dick is gone, along with the rest of your male reproductive organs, leaving you with a pussy, a new fertile set of ovaries, and a fresh womb. You can't tell much more until you get a good feel of it, but you're too sore to try. - <</if>> - "So, how do you feel?", asks the surgeon's assistant, seating _himselfU beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly." _HeU circles around until _heU is between your legs and disappears between your thighs. You feel face brush your inner legs as _heU brings _hisU mouth to your fresh pussy and begins to enthusiastically eat you out. _HeU is quite good at _hisU job and quickly brings you to climax, your new vagina squirting girlcum across _hisU face. _HeU rises from your crotch and licks _hisU lips. "Your new taste is good too. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around. Oh! And before you leave, we'll write a prescription for some birth control for you. You don't have to use it, but it'll be there for you." Exhausted from the procedure, you settle back down to recover for the rest of your stay. - -<<case "male2herm">> - After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find - <<if $PC.boobs >= 1400>> - that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. You see<<if $PC.balls < 5>> your new pussy peeking from under your testicles<<else>> that your balls are big enough to completely obscure your new pussy<</if>>. Your lower belly is slightly larger too, likely from your new womb. You can't tell much more until you get a good feel of it, but you're too sore to try. - <<else>> - <<if $PC.balls < 5>>your new pussy peeking from under your testicles<<else>>that your balls are big enough to completely obscure your new pussy<</if>>. Your lower belly is slightly larger too, likely from your new womb. You can't tell much more until you get a good feel of it, but you're too sore to try. - <</if>> - "So, how do you feel?", asks the surgeon's assistant, seating _himselfU beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly." _HeU circles around until _heU is between your legs and disappears between your thighs. You feel <<if $PC.balls >= 9>>_himU lift your engorged sack and leave it resting atop _hisU head<<else>>_hisU head brush against your sack<</if>> as _heU brings _hisU mouth to your fresh pussy and begins to enthusiastically eat you out. _HeU is quite good at _hisU job and quickly brings you to climax; your new vagina squirting girlcum across _hisU face and your neglected dick spraying cum across your belly. _HeU rises from your crotch to lick up your wayward cum. "I always did like the taste of you and your new flavor is good too. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around. Oh! And before you leave, we'll write a prescription for some birth control for you. You don't have to use it, but it'll be there for you. Just try not to mix your two halves, unless you want to watch your middle steadily swell with your own child." Exhausted from the procedure, you settle back down to recover for the rest of your stay. - -<<case "male2truefemale">> - After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and pain practically all over your body. You pull the covers off of yourself to catch sight of the result of the surgery and find - <<if $PC.boobs >= 1400>> - that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your dick is gone, along with the rest of your male reproductive organs, leaving you with a pussy, a new fertile set of ovaries and a fresh womb. You can't tell much more until you get a good feel of it, but you're too sore to try. Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you as a man anymore. - <<else>> - your dick is gone, along with the rest of your male reproductive organs, leaving you with a pussy, a new fertile set of ovaries and a fresh womb. You can't tell much more until you get a good feel of it, but you're too sore to try.<<if $PC.boobs < 300>> You do take a moment to fondle your new C-cup breasts though; they feel nice.<</if>> Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you as a man anymore. - <</if>> - "So, how do you feel?", asks the surgeon's assistant, seating _himselfU beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly." _HeU circles around until _heU is between your legs and disappears between your thighs. You feel face brush your inner legs as _heU brings _hisU mouth to your fresh pussy and begins to enthusiastically eat you out. _HeU is quite good at _hisU job and quickly brings you to climax; your new vagina squirting girlcum across _hisU face. _HeU rises from your crotch and licks _hisU lips. "Your new taste is good too. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around. Oh! And before you leave, we'll write a prescription for some birth control for you. You don't have to use it, but it'll be there for you." Exhausted from the procedure, you settle back down to play with your tits and recover for the rest of your stay. - <<if $PC.boobs < 300>><<set $PC.boobs = 500>><</if>> - -<<case "male2hermfemale">> - After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find - <<if $PC.boobs >= 1400>> - that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. You see<<if $PC.balls < 5>> your new pussy peeking from under your testicles<<else>> that your balls are big enough to completely obscure your new pussy<</if>>. Your lower belly is slightly larger too, likely from your new womb. You can't tell much more until you get a good feel of it, but you're too sore to try. Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you as a man anymore. - <<else>> - <<if $PC.balls < 5>>your new pussy peeking from under your testicles<<else>>that your balls are big enough to completely obscure your new pussy<</if>>. Your lower belly is slightly larger too, likely from your new womb. You can't tell much more until you get a good feel of it, but you're too sore to try.<<if $PC.boobs < 300>> You do take a moment to fondle your new C-cup breasts though; they feel nice.<</if>> Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you as a man anymore. - <</if>> - "So, how do you feel?", asks the surgeon's assistant, seating _himselfU beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly." _HeU circles around until _heU is between your legs and disappears between your thighs. You feel <<if $PC.balls >= 9>>_himU lift your engorged sack and leave it resting atop _hisU head<<else>>_hisU head brush against your sack<</if>> as _heU brings _hisU mouth to your fresh pussy and begins to enthusiastically eat you out. _HeU is quite good at _hisU job and quickly brings you to climax; your new vagina squirting girlcum across _hisU face and your neglected dick spraying cum across your belly. _HeU rises from your crotch to lick up your wayward cum. "I always did like the taste of you and your new flavor is good too. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around. Oh! And before you leave, we'll write a prescription for some birth control for you. You don't have to use it, but it'll be there for you. Just try not to mix your two halves, unless you want to watch your middle steadily swell with your own child." Exhausted from the procedure, you settle back down to play with your tits and recover for the rest of your stay. - <<if $PC.boobs < 300>><<set $PC.boobs = 500>><</if>> - -<<case "female2male">> - After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find - <<if $PC.boobs >= 1400>> - that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your pussy is gone, replaced with a cock and balls. Given the soreness in your lower belly, your womb and ovaries are gone too. You can't tell much more until you get a good feel of it, but you're too sore to try. - <<else>> - your pussy is gone, replaced with a cock and balls. Given the soreness in your lower belly, your womb and ovaries are gone too. You can't tell much more until you get a good feel of it, but you're too sore to try. - <</if>> - "So, how do you feel?", asks the surgeon's assistant, seating _himselfU beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly," _heU states, teasing your penis. A lewd moan escapes your lips as you are overcome by the sensation. _HeU leans over your dick and licks the bead of precum building on its end. "Tasty." Taking your dick to the hilt, _heU begins earnestly sucking you off while fondling your sensitive balls. Within moments you release your first load deep in _hisU throat. Like a good assistant, _heU diligently swallows it down, making sure not a drop is missed. "While I liked the taste of your pussy, this is nice too. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to recover for the rest of your stay. - -<<case "female2herm">> - After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find - <<if $PC.boobs >= 1400>> - that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. You see your new cock and balls, as well as the bottom of your pussy, just barely peeking out from under them. Your lower belly pain is likely caused by the addition of a prostrate and other organs. You can't tell much more until you get a good feel of it, but you're too sore to try, though your new dick disagrees as it grows erect. - <<else>> - your new cock and balls, as well as the bottom of your pussy, just barely peeking out from under them. Your lower belly pain is likely caused by the addition of a prostrate and other organs. You can't tell much more until you get a good feel of it, but you're too sore to try, though your new dick disagrees as it grows erect. - <</if>> - "So, how do you feel?", asks the surgeon's assistant, seating _himselfU beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly." _HeU wraps a hand around your throbbing shaft. "But you seem eager to experience ejaculation." _HeU leans over your dick and licks the bead of precum building on its end. "Tasty." Taking your dick to the hilt, _heU begins earnestly sucking you off while fondling your sensitive balls. Within moments you release your first load deep in _hisU throat. Like a good assistant, _heU diligently swallows it down, making sure not a drop is missed. "Not bad, though I'm sorry I couldn't pay more attention to your moist pussy. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to recover for the rest of your stay. - -<<case "female2truemale">> - After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find your pussy is gone, replaced with a cock and balls. Given the soreness in your lower belly, your womb and ovaries are gone too. You can't tell much more until you get a good feel of it, but you're too sore to try. Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you a woman anymore. "So, how do you feel?", asks the surgeon's assistant, seating _himselfU beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly," _heU states, teasing your penis. A lewd moan escapes your lips as you are overcome by the sensation. _HeU leans over your dick and licks the bead of precum building on its end. "Tasty." Taking your dick to the hilt, _heU begins earnestly sucking you off while fondling your sensitive balls. Within moments you release your first load deep in _hisU throat. Like a good assistant, _heU diligently swallows it down, making sure not a drop is missed. "While I liked the taste of your pussy, this is nice too. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to recover for the rest of your stay. - -<<case "female2hermmale">> - After a few hours, you awaken in the recovery wing with a distinct soreness between your legs and in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find your new cock and balls, as well as the bottom of your pussy, just barely peeking out from under them. Your lower belly pain is likely caused by the addition of a prostrate and other organs. Your body has also undergone large-scale reconstructive surgery; it is unlikely anyone will recognize you a woman anymore. You can't tell much more until you get a good feel of it, but you're too sore to try, though your new dick disagrees as it grows erect. "So, how do you feel?", asks the surgeon's assistant, seating _himselfU beside you and placing a hand on your belly. "I'd take it easy for the rest of the week, your body is going to take some time to recover from all the changes. Now, this might be uncomfortable, but it would be best to check if your new parts are functioning correctly." _HeU wraps a hand around your throbbing shaft. "But you seem eager to experience ejaculation." _HeU leans over your dick and licks the bead of precum building on its end. "Tasty." Taking your dick to the hilt, _heU begins earnestly sucking you off while fondling your sensitive balls. Within moments you release your first load deep in _hisU throat. Like a good assistant, _heU diligently swallows it down, making sure not a drop is missed. "Not bad, though I'm sorry I couldn't pay more attention to your pussy. Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Exhausted from the procedure, you settle back down to recover for the rest of your stay. - -<<case "tummyTuck">> - After a few hours, you awaken in the recovery wing with a lingering soreness to your stomach. You pull the covers off of yourself to catch sight of the result of the surgery and - <<if $PC.boobs >= 1400>> - find that your enormous breasts make it difficult to get a good look. Spreading them apart, you find your belly has been restored almost perfectly to the way it was prior to your pregnancy. - <<else>> - find your belly has been restored almost perfectly to the way it was prior to your pregnancy. - <</if>> - "So, good enough to show off?", asks the surgeon's assistant, seating _himselfU beside you and tracing your navel with a finger. "It was a very simple procedure, so you're free to go whenever," _heU says, a crestfallen tone in _hisU voice. - -<<case "ovulationRestart">> - After a few hours, you awaken in the recovery wing with a distinct soreness in your lower belly. You pull the covers off of yourself to catch sight of the result of the surgery and find - <<if $PC.boobs >= 1400>> - find that your enormous breasts make it difficult to get a good look. Spreading them apart, you find nothing but a pair of small, stitched incisions over your ovaries. - <<else>> - find nothing but a pair of small, stitched incisions over your ovaries. - <</if>> - "Everything went well", says the surgeon's assistant, seating _himselfU beside you and tracing your labia with a finger. "Now we won't know if they are functional until you have your first period. Funny hearing that again, right? Anyway, everything is hooked up so I'm sure you'll find out in a few weeks. So, how about a little warm up to get you ready?" _HeU circles around till _heU is between your legs and disappears between your thighs. You feel face brush your inner legs as _heU brings _hisU mouth to your cunt and begins to enthusiastically eat you out. _HeU is quite good at _hisU job and quickly brings you to climax; your pussy squirting girlcum across _hisU face. _HeU rises from your crotch and licks _hisU lips. "As much as I'd like to really check your fertility, I lack the proper 'instruments' to do so and, well, I doubt you'd want me to be the father of your next child..." _HeU faces the floor before turning back to you. "Feel free to rest as long as you need before departing. If you need, or want, me, I'll be around." Satisfied, you settle back down to sleep off the rest of the anesthesia before returning to your arcology. - -<<default>> - You have surgery. This is a WIP, if you can't tell. - -<</switch>> \ No newline at end of file diff --git a/src/pregmod/FCTV/FCTVshows.js b/src/pregmod/FCTV/FCTVshows.js index d040f5107c41cd5b2e8f432c188f03aa205c57a8..d37f03e6a41d6c42e8dea7f2238f2c4aa68680a5 100644 --- a/src/pregmod/FCTV/FCTVshows.js +++ b/src/pregmod/FCTV/FCTVshows.js @@ -1981,7 +1981,7 @@ App.Data.FCTV.channels = { S.Concubine.counter.vaginal++; V.vaginalTotal++; if (canImpreg(S.Concubine, V.PC)) { - r.push(knockMeUp(S.Concubine, 10, 0, -1, true)); + knockMeUp(S.Concubine, 10, 0, -1); } } else if (V.fuckSlaves > 0) { r.push(`grab the nearest slave watching with you, who is overjoyed to recreate the entire ending with you.`); @@ -1994,7 +1994,7 @@ App.Data.FCTV.channels = { if (S.Concubine && canPenetrate(S.Concubine) && canImpreg(V.PC, S.Concubine) && (V.policies.sexualOpenness === 1 || S.Concubine.toyHole === "dick")) { const {him} = getPronouns(S.Concubine); r.push(`get ${S.Concubine.slaveName} nice and hard before recreating the entire ending with ${him}. You've never had a more hope-filled orgasm.`); - r.push(knockMeUp(V.PC, 10, 0, S.Concubine.ID, true)); + knockMeUp(V.PC, 10, 0, S.Concubine.ID); S.Concubine.counter.penetrative++; V.penetrativeTotal++; } else if (V.policies.sexualOpenness === 1) { diff --git a/src/pregmod/MpregSelf.tw b/src/pregmod/MpregSelf.tw deleted file mode 100644 index f0ae0d53f7d4f1ca0749f704914eee93baaa5e38..0000000000000000000000000000000000000000 --- a/src/pregmod/MpregSelf.tw +++ /dev/null @@ -1,102 +0,0 @@ -:: MpregSelf [nobr] - -<<setNonlocalPronouns $seeDicks>> - -<<set $nextButton = "Back", $nextLink = "Main">> - -<<if $PC.counter.birthSelf == 0>> - <<if $PC.balls >= 14>> - Calling over your closest slave, you order _himU to bring you one of the high-volume enema syringes from the slave quarters. _HeU rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, sending rivulets of precum running down to pool on your massive balls. Your pussy is similarly soaked, imagining your latest deviancy has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before _heU enters carrying the extra-long enema syringe. Impatient, you give _himU your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started." - Following your instructions, _heU eagerly drops to _hisU knees and inhales your soaked member. The large volume of precum coming from your engorged prostate necessitates frequent swallowing that only adds to your pleasure. You lay back and enjoy yourself as _heU massages your massive balls before slipping _hisU hand underneath to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of what comes next, and soon your sack is clenching your massive balls as your body prepares to cum. Recognizing the signs, your slave removes _hisU mouth and replaces it with the open end of the syringe. _HeU takes _hisU sodden hand from your cunt and starts stroking vigorously, and soon you're spraying inhumanly large jets of alabaster cum into the enema syringe. It's good that you asked for high-capacity version, as the prodigious quantity of fertile semen would have overflowed from a smaller container. - <br><br>You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. _HeU has thoughtfully blocked the tip with the palm of _hisU hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the full syringe over so that the business end is pointing upward, and the slave removes _hisU hand while you make sure the plunger is secure and won't leak any of the precious cargo. Your slave eagerly licks the drop of cum off the palm of _hisU hand, but you don't begrudge _himU a small treat. Instead, you get a firm grasp on the glass of the thick enema syringe and lay back once more. - You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe between your massive balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the nubby plug-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to take both hands and ram that plunger in. Push hard, I want that syringe completely empty when you're done." - <br><br>The _girlU does as _heU's told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, _heU shoves it back inside you. Seeing the undeniable pleasure on your face, _heU takes it as permission to continue and quickly picks up the pace. Soon _heU's fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the pointy enema bulb into the opening of your cervix, forcibly stretching it further open with each piercing impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm. - Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends thick streams of cum spraying all over the place to soak you and your slave. Seeing _hisU cue, the _girlU grabs the large plunger with both hands and starts shoving it in the direction of your womb. _HeU leans in, using _hisU body weight to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the whole enema syringe further inside you, causing a blissful stretching sensation as the squirting enema bulb penetrates your cervix to lodge in your womb. - Your orgasm continues unabated, spurred on by the syringe now spraying your cum directly into your womb. You spend a couple minutes that feel like hours cumming as your slave slowly inflates your womb with a seemingly-endless volume of your virile cum. - <br><br>Sometime later when you've recovered your senses, you see your slave standing by while holding the plunger to keep your balloon-like womb from forcing its meal back into the syringe. The nearly 2 liters of cum you have stuffed inside you leaves your stomach looking noticeably distended, prompting you to rub your sloshing belly. You give the waiting _girlU _hisU orders: "Pull it out, and use your mouth to keep the mess to a minimum." _HeU gets on _hisU knees and takes a firm grip on the syringe before peering over your inflated belly to make sure you're ready for _himU to continue. As soon as you give _himU a nod _heU pulls, and with a popping sensation the enema bulb comes free. The sudden lack of resistance causes _himU to swiftly yank the rest of the syringe out of you, opening the floodgates for the colossal quantity of cum inflating your womb. Your well-trained slave reacts quickly, hefting your massive balls up and out of the way so _heU can catch the torrent of jizz that's just starting to pour from your cunt. - You hear some wet sounds as _heU slurps down the cum that already escaped, and then you feel _hisU soft lips pressed to your vulva as _heU steadfastly works to drink the unending flood of semen. You relax and enjoy the afterglow of your orgasms while _heU works, proud of your ingenious idea to take advantage of your inhuman sperm production. There's always the tap from $dairyName of course, but this way you don't have to worry about getting pregnant. That last thought gives you pause. You can't get yourself pregnant... right? - - <<elseif $PC.balls >= 9>> - Calling over your closest slave, you order _himU to bring you one of the enema syringes from the slave quarters. _HeU rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, sending a steady stream of precum running down to pool on your huge balls. Your pussy is similarly soaked, imagining your latest deviancy has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before _heU enters carrying the glass enema syringe. Impatient, you give _himU your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started." - <br><br>Following your instructions, _heU eagerly drops to _hisU knees and inhales your soaked member. The large volume of precum coming from your swollen prostate necessitates regular swallowing that only adds to your pleasure. You lay back and enjoy yourself as _heU massages your huge balls before slipping _hisU hand underneath to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of what comes next, and soon your sack is clenching your huge balls as your body prepares to cum. Recognizing the signs, your slave removes _hisU mouth and replaces it with the open end of the syringe. _HeU takes _hisU sodden hand from your cunt and starts stroking vigorously, and soon you're spraying massive jets of alabaster cum into the enema syringe. It's good that you decided on an enema syringe instead of a normal dildo suppository, as the huge quantity of fertile semen would have overflowed from a smaller container. - <br><br>You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. _HeU has thoughtfully blocked the tip with the palm of _hisU hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the full syringe over so that the business end is pointing upward, and the slave removes _hisU hand while you make sure the plunger is secure and won't leak any of the precious cargo. Your slave eagerly licks the drop of cum off the palm of _hisU hand, but you don't begrudge _himU a small treat. Instead, you get a firm grasp on the glass of the thick enema syringe and lay back once more. - You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe between your huge balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the nubby plug-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to take both hands and ram that plunger in. Push hard, I want that syringe completely empty when you're done." - <br><br>The _girlU does as _heU's told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, _heU shoves it back inside you. Seeing the undeniable pleasure on your face, _heU takes it as permission to continue and quickly picks up the pace. Soon _heU's fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the pointy enema bulb into the opening of your cervix, forcibly stretching it further open with each piercing impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm. - Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends thick streams of cum spraying all over the place to coat you and your slave. Seeing _hisU cue, the _girlU grabs the large plunger with both hands and starts shoving it in the direction of your womb. _HeU leans in, using _hisU body weight to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the whole enema syringe further inside you, causing a blissful stretching sensation as the squirting enema bulb penetrates your cervix to lodge in your womb. - Your orgasm continues unabated, spurred on by the syringe now spraying your cum directly into your womb. You spend a couple minutes that feel like hours cumming as your slave slowly inflates your womb with a liter of your virile cum. - <br><br>Sometime later when you've recovered your senses, you see your slave standing by while holding the plunger to keep your stuffed womb from forcing its meal back into the syringe. You give the waiting _girlU _hisU orders: "Pull it out, and use your mouth to keep the mess to a minimum." _HeU gets on _hisU knees and takes a firm grip on the syringe before peering over your swollen belly to make sure you're ready for _himU to continue. As soon as you give _himU a nod _heU pulls, and with a popping sensation the enema bulb comes free. The sudden lack of resistance causes _himU to swiftly yank the rest of the syringe out of you, opening the floodgates for the huge quantity of cum that's stuffed in your womb. Your well-trained slave reacts quickly, hefting your huge balls up and out of the way so _heU can catch the torrent of jizz that's just starting to pour from your cunt. - You hear some wet sounds as _heU slurps down the cum that already escaped, and then you feel _hisU soft lips pressed to your vulva as _heU steadfastly works to drink the unending flood of semen. You relax and enjoy the afterglow of your orgasms while _heU works, proud of your ingenious idea to take advantage of your prodigious sperm production. There's always the tap from $dairyName of course, but this way you don't have to worry about getting pregnant. That last thought gives you pause. You can't get yourself pregnant... right? - - <<elseif $PC.balls >= 5>> - Calling over your closest slave, you order _himU to bring you one of the dildo-shaped suppository syringes from the slave quarters. _HeU rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, sending regular drips of precum running down onto your large balls. Your pussy is similarly soaked, imagining your latest deviancy has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before _heU enters carrying the remarkably-lifelike dildo syringe. Impatient, you give _himU your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started." - <br><br>Following your instructions, _heU eagerly drops to _hisU knees and inhales your straining cock. The extra precum coming from your enhanced prostate necessitates occasional swallowing that only adds to your pleasure. You lay back and enjoy yourself as _heU massages your large balls before slipping _hisU hand underneath to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of what comes next, and soon your sack is clenching your large balls as your body prepares to cum. Recognizing the signs, your slave removes _hisU mouth and replaces it with the open end of the syringe. _HeU takes _hisU sodden hand from your cunt and starts stroking vigorously, and soon you're spraying large jets of alabaster cum into the syringe. It's close, the large quantity of fertile semen almost overflowing from the dildo suppository. - <br><br>You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. _HeU has thoughtfully blocked the tip with the palm of _hisU hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the full syringe over so that the business end is pointing upward, and the slave removes _hisU hand while you make sure the plunger is secure and won't leak any of the precious cargo. Your slave eagerly licks the drop of cum off the palm of _hisU hand, but you don't begrudge _himU a small treat. Instead, you get a firm grasp on the silicone of the thick dildo syringe and lay back once more. - You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe underneath your large balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the cock-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to ram that plunger in. Push hard, I want that syringe completely empty when you're done." - <br><br>The _girlU does as _heU's told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, _heU shoves it back inside you. Seeing the undeniable pleasure on your face, _heU takes it as permission to continue and quickly picks up the pace. Soon _heU's fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the head of the dildo into your cervix, battering it open with each impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm. - Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends jets of cum all over the place to land on you and your slave. Seeing _hisU cue, the _girlU grabs the large plunger and starts shoving it in the direction of your womb. _HeU pushes hard to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the silicone cockhead against your cervix, creating a seal and leaving the syringe free to spray your semen through your battered cervix and into your hungry womb. - Your orgasm continues unabated, spurred on by warm fluid flowing into your womb. You spend a minute that feel like an hour cumming as your slave slowly fills your womb with a few deciliters of virile cum. - <br><br>Sometime later when you've recovered your senses, you see your slave standing by while holding the dildo inside you to keep you plugged up. You give the waiting _girlU _hisU orders: "Pull it out, and use your mouth to keep the mess to a minimum." _HeU gets on _hisU knees and takes a firm grip on the syringe before peering up at you to make sure you're ready for _himU to continue. As soon as you give _himU a nod _heU pulls the dildo free, opening the floodgates for the cum that's filling your womb. Your well-trained slave reacts quickly, lifting your large balls up and out of the way so _heU can catch the stream of jizz that's just starting to pour from your cunt. - You hear some wet sounds as _heU slurps down the cum that already escaped, and then you feel _hisU soft lips pressed to your vulva as _heU steadfastly works to drink the escaping semen. You relax and enjoy the afterglow of your orgasms while _heU works, proud of your ingenious idea to take advantage of your considerable sperm production. There's always the tap from $dairyName of course, but this way you don't have to worry about getting pregnant. That last thought gives you pause. You can't get yourself pregnant... right? - - <<else>> - Calling over your closest slave, you order _himU to bring you one of the dildo-shaped suppository syringes from the slave quarters. _HeU rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, a large droplet of precum hanging from the head. Your pussy is similarly soaked, imagining your latest deviancy has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before _heU enters carrying the remarkably-lifelike dildo syringe. Impatient, you give _himU your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started." - <br><br>Following your instructions, _heU eagerly drops to _hisU knees and inhales your straining cock. You lay back and enjoy yourself as _heU massages your balls before slipping _hisU hand downward to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of what comes next, and soon your sack is clenching tightly as your body prepares to cum. Recognizing the signs, your slave removes _hisU mouth and replaces it with the open end of the syringe. _HeU takes _hisU sodden hand from your cunt and starts stroking vigorously, and soon you're spraying jets of alabaster cum into the syringe. It's a powerful orgasm, but you only manage to fill a quarter of it. - <br><br>You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. _HeU has thoughtfully blocked the tip with the palm of _hisU hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the syringe over so that the business end is pointing upward, and the slave removes _hisU hand while you make sure the plunger is inserted far enough that you've gotten all the air out of the syringe. Your slave eagerly licks the drop of cum off the palm of _hisU hand, but you don't begrudge _himU a small treat. Instead, you get a firm grasp on the silicone of the thick dildo syringe and lay back once more. - You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe underneath your balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the cock-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to ram that plunger in. I want that syringe completely empty when you're done." - <br><br>The _girlU does as _heU's told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, _heU shoves it back inside you. Seeing the undeniable pleasure on your face, _heU takes it as permission to continue and quickly picks up the pace. Soon _heU's fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the head of the dildo into your cervix, battering it open with each impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm. - Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends several jets of cum to land on your reclined body. Seeing _hisU cue, the _girlU grabs the large plunger and starts shoving it in the direction of your womb. _HeU pushes hard to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the silicone cockhead against your cervix, creating a seal and leaving the syringe free to spray your semen through your battered cervix and into your hungry womb. - Your orgasm continues unabated, spurred on by the jet of fluid flowing into your womb. Your orgasm soon fades, and you wish that you could produce more than a deciliter of cum to fill yourself with. - <br><br>Now that your orgasm is over, you notice your slave standing by while holding the dildo inside you to keep you plugged up. You give the waiting _girlU _hisU orders: "Pull it out, and use your mouth to keep the mess to a minimum." _HeU gets on _hisU knees and takes a firm grip on the syringe before peering up at you to make sure you're ready for _himU to continue. As soon as you give _himU a nod _heU pulls the dildo free, allowing the cum inside you to leak out. Your well-trained slave reacts quickly, lifting your balls up and out of the way so _heU can catch the load of jizz before it starts to leak out of your cunt. - You feel _hisU soft lips pressed to your vulva as _heU works to retrieve _hisU treat. You hear some soft slurping noises and feel a warm tongue worming its way inside you to retrieve any lingering cum. You relax and enjoy the afterglow of your orgasms while _heU works, proud of your ingenious idea to take advantage of your own balls for a satisfying creampie. There's always a slave to do that, of course, but this way you don't have to worry about getting pregnant. That last thought gives you pause. You can't get yourself pregnant... right? - - <</if>> - <<set _selfPreg = 30+($PC.balls*3)>> - <<= knockMeUp($PC, _selfPreg, 0, -1)>> -<<else>> - <<if $PC.balls >= 14>> - Calling over your closest slave, you order _himU to bring you one of the high-volume enema syringes from the slave quarters. _HeU rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, sending rivulets of precum running down to pool on your massive balls. Your pussy is similarly soaked, imagining your belly swelling after you knock yourself up has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before _heU enters carrying the extra-long enema syringe. Impatient, you give _himU your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started." - Following your instructions, _heU eagerly drops to _hisU knees and inhales your soaked member. The large volume of precum coming from your engorged prostate necessitates frequent swallowing that only adds to your pleasure. You lay back and enjoy yourself as _heU massages your massive balls before slipping _hisU hand underneath to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of the semi-incestuous stuffing that comes next, and soon your sack is clenching your massive balls as your body prepares to cum. Recognizing the signs, your slave removes _hisU mouth and replaces it with the open end of the syringe. _HeU takes _hisU sodden hand from your cunt and starts stroking vigorously, and soon you're spraying inhumanly large jets of alabaster cum into the enema syringe. It's good that you asked for high-capacity version, as the prodigious quantity of fertile semen would have overflowed from a smaller container. - <br><br>You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. _HeU has thoughtfully blocked the tip with the palm of _hisU hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the full syringe over so that the business end is pointing upward, and the slave removes _hisU hand while you make sure the plunger is secure and won't leak any of the precious cargo. Your slave eagerly licks the drop of cum off the palm of _hisU hand, but you don't begrudge _himU a small treat. Instead, you get a firm grasp on the glass of the thick enema syringe and lay back once more. - You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe between your massive balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the nubby plug-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to take both hands and ram that plunger in. Push hard, I want that syringe completely empty when you're done." - <br><br>The _girlU does as _heU's told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, _heU shoves it back inside you. Seeing the undeniable pleasure on your face, _heU takes it as permission to continue and quickly picks up the pace. Soon _heU's fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the pointy enema bulb into the opening of your cervix, forcibly stretching it further open with each piercing impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm. - Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends thick streams of cum spraying all over the place to soak you and your slave. Seeing _hisU cue, the _girlU grabs the large plunger with both hands and starts shoving it in the direction of your womb. _HeU leans in, using _hisU body weight to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the whole enema syringe further inside you, causing a blissful stretching sensation as the squirting enema bulb penetrates your cervix to lodge in your womb. - Your orgasm continues unabated, spurred on by the syringe now spraying your cum directly into your womb. You spend a couple minutes that feel like hours cumming as your slave slowly inflates your womb with a seemingly-endless volume of your virile cum. - <br><br>Sometime later when you've recovered your senses, you see your slave standing by while holding the plunger to keep your balloon-like womb from forcing its meal back into the syringe. The nearly 2 liters of cum you have stuffed inside you leaves your stomach looking noticeably distended, prompting you to rub your sloshing belly. You give the waiting _girlU _hisU orders: "Pull it out, and use your mouth to keep the mess to a minimum." _HeU gets on _hisU knees and takes a firm grip on the syringe before peering over your inflated belly to make sure you're ready for _himU to continue. As soon as you give _himU a nod _heU pulls, and with a popping sensation the enema bulb comes free. The sudden lack of resistance causes _himU to swiftly yank the rest of the syringe out of you, opening the floodgates for the colossal quantity of cum inflating your womb. Your well-trained slave reacts quickly, hefting your massive balls up and out of the way so _heU can catch the torrent of jizz that's just starting to pour from your cunt. - You hear some wet sounds as _heU slurps down the cum that already escaped, and then you feel _hisU soft lips pressed to your vulva as _heU steadfastly works to drink the unending flood of semen. You relax and enjoy the afterglow of your orgasms while _heU works, proud of your ingenious idea to take advantage of your inhuman sperm production. There's always the tap from $dairyName of course, but why use slave cum when you have such obviously superior material available? - - <<elseif $PC.balls >= 9>> - Calling over your closest slave, you order _himU to bring you one of the enema syringes from the slave quarters. _HeU rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, sending a steady stream of precum running down to pool on your huge balls. Your pussy is similarly soaked, imagining your belly swelling after you knock yourself up has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before _heU enters carrying the glass enema syringe. Impatient, you give _himU your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started." - <br><br>Following your instructions, _heU eagerly drops to _hisU knees and inhales your soaked member. The large volume of precum coming from your swollen prostate necessitates regular swallowing that only adds to your pleasure. You lay back and enjoy yourself as _heU massages your huge balls before slipping _hisU hand underneath to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of the semi-incestuous stuffing that comes next, and soon your sack is clenching your huge balls as your body prepares to cum. Recognizing the signs, your slave removes _hisU mouth and replaces it with the open end of the syringe. _HeU takes _hisU sodden hand from your cunt and starts stroking vigorously, and soon you're spraying massive jets of alabaster cum into the enema syringe. It's good that you decided on an enema syringe instead of a normal dildo suppository, as the huge quantity of fertile semen would have overflowed from a smaller container. - <br><br>You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. _HeU has thoughtfully blocked the tip with the palm of _hisU hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the full syringe over so that the business end is pointing upward, and the slave removes _hisU hand while you make sure the plunger is secure and won't leak any of the precious cargo. Your slave eagerly licks the drop of cum off the palm of _hisU hand, but you don't begrudge _himU a small treat. Instead, you get a firm grasp on the glass of the thick enema syringe and lay back once more. - You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe between your huge balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the nubby plug-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to take both hands and ram that plunger in. Push hard, I want that syringe completely empty when you're done." - <br><br>The _girlU does as _heU's told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, _heU shoves it back inside you. Seeing the undeniable pleasure on your face, _heU takes it as permission to continue and quickly picks up the pace. Soon _heU's fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the pointy enema bulb into the opening of your cervix, forcibly stretching it further open with each piercing impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm. - Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends thick streams of cum spraying all over the place to coat you and your slave. Seeing _hisU cue, the _girlU grabs the large plunger with both hands and starts shoving it in the direction of your womb. _HeU leans in, using _hisU body weight to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the whole enema syringe further inside you, causing a blissful stretching sensation as the squirting enema bulb penetrates your cervix to lodge in your womb. - Your orgasm continues unabated, spurred on by the syringe now spraying your cum directly into your womb. You spend a couple minutes that feel like hours cumming as your slave slowly inflates your womb with a full liter of your virile cum. - <br><br>Sometime later when you've recovered your senses, you see your slave standing by while holding the plunger to keep your stuffed womb from forcing its meal back into the syringe. You give the waiting _girlU _hisU orders: "Pull it out, and use your mouth to keep the mess to a minimum." _HeU gets on _hisU knees and takes a firm grip on the syringe before peering over your swollen belly to make sure you're ready for _himU to continue. As soon as you give _himU a nod _heU pulls, and with a popping sensation the enema bulb comes free. The sudden lack of resistance causes _himU to swiftly yank the rest of the syringe out of you, opening the floodgates for the huge quantity of cum that's stuffed in your womb. Your well-trained slave reacts quickly, hefting your huge balls up and out of the way so _heU can catch the torrent of jizz that's just starting to pour from your cunt. - You hear some wet sounds as _heU slurps down the cum that already escaped, and then you feel _hisU soft lips pressed to your vulva as _heU steadfastly works to drink the unending flood of semen. You relax and enjoy the afterglow of your orgasms while _heU works, proud of your ingenious idea to take advantage of your prodigious sperm production. There's always the tap from $dairyName of course, but why use slave cum when you have such obviously superior material available? - - <<elseif $PC.balls >= 5>> - Calling over your closest slave, you order _himU to bring you one of the dildo-shaped suppository syringes from the slave quarters. _HeU rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, sending regular drips of precum running down onto your large balls. Your pussy is similarly soaked, imagining your belly swelling after you knock yourself up has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before _heU enters carrying the remarkably-lifelike dildo syringe. Impatient, you give _himU your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started." - <br><br>Following your instructions, _heU eagerly drops to _hisU knees and inhales your straining cock. The extra precum coming from your enhanced prostate necessitates occasional swallowing that only adds to your pleasure. You lay back and enjoy yourself as _heU massages your large balls before slipping _hisU hand underneath to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of the semi-incestuous stuffing that comes next, and soon your sack is clenching your large balls as your body prepares to cum. Recognizing the signs, your slave removes _hisU mouth and replaces it with the open end of the syringe. _HeU takes _hisU sodden hand from your cunt and starts stroking vigorously, and soon you're spraying large jets of alabaster cum into the syringe. It's close, the large quantity of fertile semen almost overflows from the dildo suppository. - <br><br>You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. _HeU has thoughtfully blocked the tip with the palm of _hisU hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the full syringe over so that the business end is pointing upward, and the slave removes _hisU hand while you make sure the plunger is secure and won't leak any of the precious cargo. Your slave eagerly licks the drop of cum off the palm of _hisU hand, but you don't begrudge _himU a small treat. Instead, you get a firm grasp on the silicone of the thick dildo syringe and lay back once more. - You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe underneath your large balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the cock-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to ram that plunger in. Push hard, I want that syringe completely empty when you're done." - <br><br>The _girlU does as _heU's told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, _heU shoves it back inside you. Seeing the undeniable pleasure on your face, _heU takes it as permission to continue and quickly picks up the pace. Soon _heU's fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the head of the dildo into your cervix, battering it open with each impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm. - Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends jets of cum all over the place to land on you and your slave. Seeing _hisU cue, the _girlU grabs the large plunger and starts shoving it in the direction of your womb. _HeU pushes hard to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the silicone cockhead against your cervix, creating a seal and leaving the syringe free to spray your semen through your battered cervix and into your hungry womb. - Your orgasm continues unabated, spurred on by warm fluid flowing into your womb. You spend a minute that feel like an hour cumming as your slave slowly fills your womb with a few deciliters of virile cum. - <br><br>Sometime later when you've recovered your senses, you see your slave standing by while holding the dildo inside you to keep you plugged up. You give the waiting _girlU _hisU orders: "Pull it out, and use your mouth to keep the mess to a minimum." _HeU gets on _hisU knees and takes a firm grip on the syringe before peering up at you to make sure you're ready for _himU to continue. As soon as you give _himU a nod _heU pulls the dildo free, opening the floodgates for the cum that's filling in your womb. Your well-trained slave reacts quickly, lifting your large balls up and out of the way so _heU can catch the stream of jizz that's just starting to pour from your cunt. - You hear some wet sounds as _heU slurps down the cum that already escaped, and then you feel _hisU soft lips pressed to your vulva as _heU steadfastly works to drink the escaping semen. You relax and enjoy the afterglow of your orgasms while _heU works, proud of your ingenious idea to take advantage of your considerable sperm production. There's always the tap from $dairyName of course, but why use slave cum when you have such obviously superior material available? - - <<else>> - Calling over your closest slave, you order _himU to bring you one of the dildo-shaped suppository syringes from the slave quarters. _HeU rushes off, and you set about getting naked before lying down on your luxurious bed. Your cock is already rock-hard, a large droplet of precum hanging from the head. Your pussy is similarly soaked, imagining your belly swelling after you knock yourself up has it practically puddling. Just as you start to think about punishing your slave for taking too long, you hear a knock before _heU enters carrying the remarkably-lifelike dildo syringe. Impatient, you give _himU your instructions: "Pull out the plunger and keep the syringe handy. You're going to suck me off, but I want every drop of my cum to go into that syringe. No spilling. Now get started." - <br><br>Following your instructions, _heU eagerly drops to _hisU knees and inhales your straining cock. You lay back and enjoy yourself as _heU massages your balls before slipping _hisU hand downward to start fingering your soaked pussy. The expert ministrations from your slave combine with your thoughts of the semi-incestuous stuffing that comes next, and soon your sack is clenching tightly as your body prepares to cum. Recognizing the signs, your slave removes _hisU mouth and replaces it with the open end of the syringe. _HeU takes _hisU sodden hand from your cunt and starts stroking vigorously, and soon you're spraying jets of alabaster cum into the syringe. It's a powerful orgasm, but you only manage to fill a quarter of it. - <br><br>You sit up and pick up the previously discarded plunger while your slave continues to hold the syringe. _HeU has thoughtfully blocked the tip with the palm of _hisU hand, keeping any of the precious fluid from escaping. You position the plunger and barely insert it into the open syringe, not wanting to accidentally force out your semen. The two of you flip the syringe over so that the business end is pointing upward, and the slave removes _hisU hand while you make sure the plunger is inserted far enough that you've gotten all the air out of the syringe. Your slave eagerly licks the drop of cum off the palm of _hisU hand, but you don't begrudge _himU a small treat. Instead, you get a firm grasp on the silicone of the thick dildo syringe and lay back once more. - You spread your legs into a wide "M" shape, as if preparing for a gynecological exam. You can't demean yourself by allowing your slave to penetrate you, so you carefully position the girthy syringe underneath your balls and slowly shove it into your pussy. Adjusting your grip, you keep pushing; you're unable to suppress a moan when you feel the cock-like tip knock at the entrance of your womb. Thoroughly penetrated, you lay back and give your slave instructions: "Fuck me good and hard with the syringe until I cum. When I do, I want you to ram that plunger in. I want that syringe completely empty when you're done." - <br><br>The _girlU does as _heU's told, getting a firm grip on the syringe and pushing in slightly before drawing it outward. After a brief pause, _heU shoves it back inside you. Seeing the undeniable pleasure on your face, _heU takes it as permission to continue and quickly picks up the pace. Soon _heU's fucking you hard and fast with the syringe. Thanks to the position caused by your widely-splayed legs, your fertile womb is lined up perfectly for each thrust to slam the head of the dildo into your cervix, battering it open with each impact. The sensation is too much to bear after having cum so recently, and you rapidly moan your way towards another orgasm. - Your fevered thoughts are focused on the perverse pleasure of giving yourself a creampie, intensifying the extreme pleasure you're feeling. Soon you are cumming with a scream of ecstasy, your neglected cock making your orgasm obvious as it sends several jets of cum to land on your reclined body. Seeing _hisU cue, the _girlU grabs the large plunger and starts shoving it in the direction of your womb. _HeU pushes hard to help fight the resistance of your richly-thick and fertile semen that's filling the syringe. The pressure forces the silicone cockhead against your cervix, creating a seal and leaving the syringe free to spray your semen through your battered cervix and into your hungry womb. - Your orgasm continues unabated, spurred on by the jet of fluid flowing into your womb. Your orgasm soon fades, and you wish that you could produce more than a deciliter of cum to fill yourself with. - <br><br>Now that your orgasm is over, you notice your slave standing by while holding the dildo inside you to keep you plugged up. You give the waiting _girlU _hisU orders: "Pull it out, and use your mouth to keep the mess to a minimum." _HeU gets on _hisU knees and takes a firm grip on the syringe before peering up at you to make sure you're ready for _himU to continue. As soon as you give _himU a nod _heU pulls the dildo free, allowing the cum inside you to leak out. Your well-trained slave reacts quickly, lifting your balls up and out of the way so _heU can catch the load of jizz before it starts to leak out of your cunt. - You feel _hisU soft lips pressed to your vulva as _heU works to retrieve _hisU treat. You hear some soft slurping noises and feel a warm tongue worming its way inside you to retrieve any lingering cum. You relax and enjoy the afterglow of your orgasms while _heU works, proud of your ingenious idea to take advantage of your own balls for a satisfying creampie. There's always a slave to do that, of course, but why use slave cum when you have such obviously superior material available? - - <</if>> - <<= knockMeUp($PC, 100, 0, -1)>> -<</if>> diff --git a/src/pregmod/breedingTest.tw b/src/pregmod/breedingTest.tw deleted file mode 100644 index 972b2fecd0357e3d949cf4e59ebae1ee4cfc7ae7..0000000000000000000000000000000000000000 --- a/src/pregmod/breedingTest.tw +++ /dev/null @@ -1,4 +0,0 @@ -:: BreedingTest [nobr] - -<<set $nextButton = "Confirm changes", $nextLink = "Slave Interact">> -<<print eliteBreedingExam(getSlave($AS))>> \ No newline at end of file diff --git a/src/pregmod/eliteBreedingExam.js b/src/pregmod/eliteBreedingExam.js index c5c2a3afa28cbc58ec241e1336e7fad06e41d6aa..3cf0f12c73e8293e50a8f00d947ad669ab897aa4 100644 --- a/src/pregmod/eliteBreedingExam.js +++ b/src/pregmod/eliteBreedingExam.js @@ -1,20 +1,24 @@ globalThis.eliteBreedingExam = function(slave = null) { + const frag = new DocumentFragment(); const eliteAngered = V.failedElite > 100; const SlaveProfessionalismEstablished = V.arcologies[0].FSSlaveProfessionalism > 20; const preferYounger = V.arcologies[0].FSYouthPreferentialist > 20; const partyAnimal = V.arcologies[0].FSHedonisticDecadence > 20; const cost = 5000; - let r = [], test, passing = 0, fixable; + let r = []; + let test; + let passing = 0; + let fixable; const result = function() { if (slave) { if (test === true) { - return `<span class="lime">PASSED</span>`; + return App.UI.DOM.makeElement("span", "PASSED", "lime"); } else if (fixable) { - return `<span class="yellow">Within fixable range.</span>`; + return App.UI.DOM.makeElement("span", "Within fixable range.", "yellow"); } else { passing--; - return `<span class="red">FAILED</span>`; + return App.UI.DOM.makeElement("span", "FAILED", "red"); } } return ``; @@ -28,31 +32,33 @@ globalThis.eliteBreedingExam = function(slave = null) { } else { r.push(`${slave.slaveName} is up for review:`); } - + App.Events.addNode(frag, r, "div"); + r = []; + const list = App.UI.DOM.appendNewElement("ul", frag); if (slave) { test = slave.intelligence + slave.intelligenceImplant >= (eliteAngered ? 95 : 50); } - r.push(`Must be ${eliteAngered ? 'highly intelligent' : 'very smart'}. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be ${eliteAngered ? 'highly intelligent' : 'very smart'}. `).append(result()); if (slave) { test = Beauty(slave) >= (eliteAngered ? 120 : 100); } - r.push(`Must be ${eliteAngered ? 'unbelievably' : ''} beautiful. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be ${eliteAngered ? 'unbelievably' : ''} beautiful. `).append(result()); if (slave) { test = slave.face >= (eliteAngered ? 95 : 40); } - r.push(`Their face must be ${eliteAngered ? 'breathtaking' : 'gorgeous'}. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Their face must be ${eliteAngered ? 'breathtaking' : 'gorgeous'}. `).append(result()); if (slave) { test = slave.chem <= 20; } - r.push(`Their health must not be overly impacted by drug use. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Their health must not be overly impacted by drug use. `).append(result()); if (slave) { test = slave.addict === 0; } - r.push(`They must not be addicted to drugs. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `They must not be addicted to drugs. `).append(result()); if (V.arcologies[0].FSMaturityPreferentialist > 20 || V.arcologies[0].FSYouthPreferentialist > 20) { const targetAge = 24; @@ -63,23 +69,23 @@ globalThis.eliteBreedingExam = function(slave = null) { test = slave.physicalAge < targetAge; } } - r.push(`Must be ${preferYounger ? 'younger' : 'older'} than ${targetAge}. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be ${preferYounger ? 'younger' : 'older'} than ${targetAge}. `).append(result()); } if (V.arcologies[0].FSIntellectualDependency > 20) { if (slave) { test = slave.energy >= 96; } - r.push(`Must be sexually receptive at all times. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be sexually receptive at all times. `).append(result()); } else if (V.arcologies[0].FSSlaveProfessionalism > 20) { if (slave) { test = slave.skill.vaginal + slave.skill.anal + slave.skill.oral + slave.skill.entertainment + slave.skill.whoring >= (eliteAngered ? 500 : 400); } - r.push(`Must be capable of mastering skills. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be capable of mastering skills. `).append(result()); if (slave) { test = slave.accent <= 1; } - r.push(`Must be capable of eloquent and accurate speech. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be capable of eloquent and accurate speech. `).append(result()); } if (V.arcologies[0].FSPetiteAdmiration > 20 || V.arcologies[0].FSStatuesqueGlorification > 20) { const targetHeight = V.arcologies[0].FSPetiteAdmiration > 20 ? 150 : 186; @@ -87,16 +93,16 @@ globalThis.eliteBreedingExam = function(slave = null) { if (slave) { test = (slave.height - (slave.heightImplant * 10)) < targetHeight; } - r.push(`Must naturally be very short. (${targetHeight} cm) ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must naturally be very short. (${targetHeight} cm) `).append(result()); if (slave) { test = (slave.height - (slave.heightImplant * 10)) < Height.mean(slave) - 15; } - r.push(`Must naturally be very short for their age. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must naturally be very short for their age. `).append(result()); } else if (V.arcologies[0].FSStatuesqueGlorification > 20) { if (slave) { test = (slave.height - (slave.heightImplant * 10)) > targetHeight; } - r.push(`Must naturally be very tall. (${targetHeight} cm) ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must naturally be very tall. (${targetHeight} cm) `).append(result()); } } @@ -106,12 +112,12 @@ globalThis.eliteBreedingExam = function(slave = null) { if (slave) { test = slave.race === targetRace; } - r.push(`Must be ${targetRace}. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be ${targetRace}. `).append(result()); } else { if (slave) { test = slave.race !== targetRace; } - r.push(`Must not be ${targetRace}. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must not be ${targetRace}. `).append(result()); } } @@ -119,22 +125,22 @@ globalThis.eliteBreedingExam = function(slave = null) { if (slave) { test = slave.dick >= 1 && slave.balls >= 1; } - r.push(`Must have a functional penis. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must have a functional penis. `).append(result()); } else if (V.arcologies[0].FSGenderFundamentalist > 20) { if (slave) { test = slave.dick === 0 && slave.balls === 0; } - r.push(`Must be physically female. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be physically female. `).append(result()); } if (V.arcologies[0].FSPaternalist > 20) { if (slave) { test = slave.intelligenceImplant >= (SlaveProfessionalismEstablished ? 30 : 15); } - r.push(`Must be ${SlaveProfessionalismEstablished ? 'well' : ''} educated. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be ${SlaveProfessionalismEstablished ? 'well' : ''} educated. `).append(result()); if (slave) { test = slave.health.condition >= 60; } - r.push(`Must be in good health. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be in good health. `).append(result()); // } else if (V.arcologies[0].FSDegradationist > 20) { } @@ -142,18 +148,18 @@ globalThis.eliteBreedingExam = function(slave = null) { if (slave) { test = slave.intelligenceImplant >= 15; } - r.push(`Must be well educated. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be well educated. `).append(result()); } if (V.arcologies[0].FSBodyPurist > 20) { if (slave) { test = slave.chem <= (eliteAngered ? 0 : 15); } - r.push(`Must have low carcinogen levels. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must have low carcinogen levels. `).append(result()); if (slave) { test = slave.boobsImplant + slave.buttImplant + slave.lipsImplant + slave.hipsImplant + slave.shouldersImplant === 0 && slave.faceImplant <= 5 && slave.bellyImplant === -1; } - r.push(`Must be implant free. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be implant free. `).append(result()); // } else if (V.arcologies[0].FSTransformationFetishist > 20) { // idealSlave.chem = 20; } @@ -162,33 +168,33 @@ globalThis.eliteBreedingExam = function(slave = null) { test = slave.weight <= (partyAnimal ? 30 : 0); } if (partyAnimal) { - r.push(`May be no larger than "plush". ${result()}`); + App.UI.DOM.appendNewElement("li", list, `May be no larger than "plush". `).append(result()); } else { - r.push(`Must be thin. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be thin. `).append(result()); } if (slave) { test = slave.butt <= 2; } - r.push(`Must have a trim rear. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must have a trim rear. `).append(result()); if (slave) { test = slave.boobs <= 400; } - r.push(`Must have a sleek chest. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must have a sleek chest. `).append(result()); } else if (V.arcologies[0].FSAssetExpansionist > 20) { if (slave) { test = (slave.butt - slave.buttImplant) >= 6; } - r.push(`Must have a naturally gigantic rear. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must have a naturally gigantic rear. `).append(result()); if (slave) { test = (slave.boobs - slave.boobsImplant) >= 1000; } - r.push(`Must be naturally busty. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be naturally busty. `).append(result()); } if (V.arcologies[0].FSPastoralist > 20) { if (slave) { test = slave.lactation === 1; } - r.push(`Must be lactating naturally. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be lactating naturally. `).append(result()); } if (V.arcologies[0].FSPhysicalIdealist > 20) { if (V.arcologies[0].FSPhysicalIdealistLaw === 1) { @@ -197,20 +203,20 @@ globalThis.eliteBreedingExam = function(slave = null) { if (slave) { test = slave.weight <= 30; } - r.push(`Must not be overweight. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must not be overweight. `).append(result()); if (slave) { - test = between(slave.muscles, musclesMin, musclesMax); + test = slave.muscles.isBetween(musclesMin, musclesMax); fixable = (slave.muscles <= musclesMin && slave.muscles > musclesMax - musclesMin) || (slave.muscles >= musclesMax && slave.muscles < musclesMin + 30); if (fixable && passing === 0) { passing = 2; } } - r.push(`Must be fit, but not too muscular. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be fit, but not too muscular. `).append(result()); } else { if (slave) { test = slave.muscles > 95; } - r.push(`Must be extremely muscular. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be extremely muscular. `).append(result()); } } else if (V.arcologies[0].FSHedonisticDecadence > 20) { const targetWeight = V.arcologies[0].FSSlimnessEnthusiast > 20 ? 10 : 95; @@ -218,9 +224,9 @@ globalThis.eliteBreedingExam = function(slave = null) { test = slave.weight > targetWeight; } if (V.arcologies[0].FSSlimnessEnthusiast > 20) { - r.push(`Must be more than "trim". ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be more than "trim". `).append(result()); } else { - r.push(`Must be big, soft and fat. ${result()}`); + App.UI.DOM.appendNewElement("li", list, `Must be big, soft and fat. `).append(result()); } } @@ -240,6 +246,6 @@ globalThis.eliteBreedingExam = function(slave = null) { } cashX(-cost, "capEx"); } - - return r.map(t => `<div>${t}</div>`).join(""); + App.Events.addNode(frag, r, "div"); + return frag; }; diff --git a/src/pregmod/managePersonalAffairs.js b/src/pregmod/managePersonalAffairs.js new file mode 100644 index 0000000000000000000000000000000000000000..cc591564431ba01a000cb4de23b3b19fcd1716f1 --- /dev/null +++ b/src/pregmod/managePersonalAffairs.js @@ -0,0 +1,1136 @@ +App.UI.managePersonalAffairs = function() { + const frag = new DocumentFragment(); + + const appearanceDiv = document.createElement("div"); + const skillsDiv = document.createElement("div"); + const reputationDiv = document.createElement("div"); + const drugsDiv = document.createElement("div"); + const lactationDiv = document.createElement("div"); + const breederExamDiv = document.createElement("div"); + + const PC = V.PC; + + if (V.cheatMode) { + frag.appendChild(App.UI.DOM.passageLink(`Cheat Edit Player`, "PCCheatMenu", () => { + V.cheater = 1; + // @ts-ignore + V.backupSlave = clone(PC); + })); + } + + frag.append( + App.UI.DOM.makeElement("h1", `Personal Affairs`), + appearance(), + skills(), + reputation(), + drugs(), + ); + + if (PC.lactation > 0) { + frag.append(lactation()); + } + + if (V.propOutcome === 1 && V.arcologies[0].FSRestart !== "unset") { + frag.append(breederExam()); + } + + return frag; + + function appearance() { + const hairColorsDiv = document.createElement("div"); + const weddingDiv = document.createElement("div"); + const FCTVDiv = document.createElement("div"); + + const text = []; + + let freckled = ''; + let ageDifference = ''; + + if (PC.markings === "freckles") { + freckled = ` freckled`; + } else if (PC.markings === "heavily freckled") { + freckled = ` heavily freckled`; + } + + App.UI.DOM.appendNewElement("h2", appearanceDiv, `Appearance`); + + text.push(`You pause for a moment from your busy day to day life to return to ${V.masterSuite ? V.masterSuiteName : `your room`} to consider some things about yourself.`); + + if (V.geneticMappingUpgrade >= 1 && PC.genes === "XY" && V.seeDicksAffectsPregnancy === 0) { + text.push(`Analysis of your sperm shows that you have a ${PC.spermY}% chance of fathering a son.`); + } + + text.push(App.UI.DOM.makeElement("div", `You take yourself in in a full length mirror. You are ${addA(PC.race)} ${PC.dick && PC.vagina !== -1 ? `futanari` : PC.dick ? `man` : `woman`} with${freckled} ${PC.skin} skin, ${PC.hColor} hair, ${App.Desc.eyesColor(PC)} and a perfect ${PC.faceShape} face.`)); + + if (PC.actualAge >= 65) { + if (PC.visualAge > PC.actualAge) { + ageDifference = `You've taken measures to <span class="lime">look an older ${PC.visualAge},</span> though perhaps it might be time to undo it.`; + } else if (PC.visualAge < PC.actualAge) { + ageDifference = `You've taken measures to <span class="lime">look a younger ${PC.visualAge}.</span> If only your body agreed with your looks.`; + } + + text.push(`You're <span class="orange">${PC.actualAge}</span> and definitely feeling it.`, ageDifference); + } else if (PC.actualAge >= 50) { + if (PC.visualAge > PC.actualAge) { + ageDifference = `You've taken measures to <span class="lime">look an older ${PC.visualAge}.</span>`; + } else if (PC.visualAge < PC.actualAge) { + ageDifference = `You've taken measures to <span class="lime">look a younger ${PC.visualAge}.</span>`; + } + + text.push(`You're <span class="orange">${PC.actualAge}</span> and starting to feel it.`, ageDifference); + } else if (PC.actualAge >= 35) { + if (PC.visualAge > PC.actualAge) { + ageDifference = `You've taken measures to <span class="lime">look an older ${PC.visualAge}</span> and reap the respect that comes with it.`; + } else if (PC.visualAge < PC.actualAge) { + ageDifference = `You've taken measures to <span class="lime">look a younger ${PC.visualAge},</span> recapturing your youth.`; + } + + text.push(`You're <span class="orange">${PC.actualAge}</span> and strong.`, ageDifference); + } else { + if (PC.visualAge > PC.actualAge) { + ageDifference = `You've taken measures to <span class="lime">look an older ${PC.visualAge}</span> and reap the respect that comes with it.`; + } else if (PC.visualAge < PC.actualAge) { + ageDifference = `You've taken measures to <span class="lime">look a younger ${PC.visualAge},</span> even though society may find your looks uncomfortable.`; + } + + text.push(`You're <span class="orange">${PC.actualAge}</span> and full of vigor.`, ageDifference); + } + + if (V.playerAging) { + text.push(`Your birthday is ${PC.birthWeek === 51 ? `next week` : `in ${52 - PC.birthWeek} weeks`}.`); + } + + text.push( + `Looking down`, + App.Desc.Player.boobs(), + App.Desc.Player.belly(), + ); + + if (PC.prostate > 2 && PC.belly < 10000) { + text.push(`Your pubic mound bulges outward noticeably thanks to your massive prostate.`); + } else if (PC.prostate === 2 && PC.belly < 5000) { + text.push(`Your pubic mound swells outward slightly due to your oversized prostate.`); + } + + text.push( + `Beneath all that,`, + App.Desc.Player.crotch(), + `Around back,`, + App.Desc.Player.butt(), + ); + + if (V.playerSurgery === 0) { + text.push(App.UI.DOM.passageLink(`Visit your plastic surgeon`, "Elective Surgery", () => { + V.playerSurgery = 4; + })); + } else if (V.playerSurgery === 1) { + text.push(`Your favorite plastic surgeon is booked solid for the next week.`); + } else { + text.push(`Your favorite plastic surgeon is booked solid for the next ${V.playerSurgery} weeks.`); + } + + text.push(App.Medicine.Modification.eyeSelector(PC)); + + text.push(hairColors()); + + if (V.weddingPlanned) { + text.push(wedding()); + } + + if (V.FCTV.receiver) { + text.push(FCTV()); + } + + App.Events.addNode(appearanceDiv, text); + + return appearanceDiv; + + function hairColors() { + const colors = ["auburn", "black", "blonde", "blue", "blue-violet", "brown", "burgundy", "chestnut", "chocolate brown", "copper", "crimson", "dark blue", "dark brown", "dark orchid", "ginger", "golden", "green", "green-yellow", "grey", "hazel", "jet black", "pink", "platinum blonde", "purple", "red", "sea green", "silver", "strawberry-blonde", "white"]; + const links = []; + + hairColorsDiv.append(`You have a selection of hair dyes available: `); + + colors.forEach(color => links.push( + PC.hColor === color + ? App.UI.DOM.disabledLink(capFirstChar(color), + [`Your hair is already ${color}.`]) + : App.UI.DOM.link(capFirstChar(color), () => { + V.PC.hColor = color; + + App.UI.DOM.replace(appearanceDiv, appearance); + }) + )); + + hairColorsDiv.append(App.UI.DOM.generateLinksStrip(links)); + + return hairColorsDiv; + } + + function wedding() { + const text = []; + + App.UI.DOM.appendNewElement("h2", weddingDiv, `Wedding`); + + text.push(`You have a wedding planned for this weekend; you are`); + + if (V.weddingPlanned === 1) { + text.push(`marrying`); + } else if (V.weddingPlanned === 2) { + text.push(`sharing`); + } else if (V.weddingPlanned === 3) { + text.push(`knocking up`); + } else { + throw new Error(`Invalid V.weddingPlanned value of '${V.weddingPlanned}' in managePersonalAffairs()`); + } + + text.push( + marryingList(), + App.UI.DOM.link(`Cancel it`, () => { + V.weddingPlanned = 0; + V.marrying = []; + + App.UI.DOM.replace(appearanceDiv, appearance); + }) + ); + + App.Events.addNode(weddingDiv, text); + + return weddingDiv; + + function marryingList() { + const listSpan = document.createElement("span"); + + listSpan.append( + App.UI.DOM.toSentence(V.marrying.map(id => App.UI.DOM.passageLink(SlaveFullName(getSlave(id)), 'Slave Interact'))), + `.`, + ); + + return listSpan; + } + } + + function FCTV() { + const text = []; + + const links = []; + + App.UI.DOM.appendNewElement("h2", FCTVDiv, `FCTV`); + + if (V.FCTV.pcViewership.frequency === 1) { + text.push(`You make sure to tune in to FCTV at least once a week.`); + } else if (V.FCTV.pcViewership.frequency === 2) { + text.push(`You make sure to tune in to FCTV at least once biweekly.`); + } else if (V.FCTV.pcViewership.frequency === 4) { + text.push(`You make sure to tune in to FCTV at least once a month.`); + } else { + text.push(`You don't watch FCTV.`); + } + + if (V.FCTV.pcViewership.frequency === 1) { + links.push(App.UI.DOM.disabledLink(`Watch every week`, [ + `You are already watching every week.`, + ])); + } else { + links.push(App.UI.DOM.link(`Watch every week`, () => { + V.FCTV.pcViewership.frequency = 1; + })); + } + if (V.FCTV.pcViewership.frequency === 2) { + links.push(App.UI.DOM.disabledLink(`Watch every other week`, [ + `You are already watching every other week.`, + ])); + } else { + links.push(App.UI.DOM.link(`Watch every other week`, () => { + V.FCTV.pcViewership.frequency = 2; + })); + } + if (V.FCTV.pcViewership.frequency === 4) { + links.push(App.UI.DOM.disabledLink(`Watch once a month`, [ + `You are already watching once a month.`, + ])); + } else { + links.push(App.UI.DOM.link(`Watch once a month`, () => { + V.FCTV.pcViewership.frequency = 4; + })); + } + if (V.FCTV.pcViewership.frequency === -1) { + links.push(App.UI.DOM.disabledLink(`Ignore it`, [ + `You are already not watching.`, + ])); + } else { + links.push(App.UI.DOM.link(`Ignore it`, () => { + V.FCTV.pcViewership.frequency = -1; + })); + } + + if (V.saveImported > 0 && !V.FCTV.remote) { + text.push( + `You know TVs should have a remote.`, + App.UI.DOM.link(`Buy one yourself`, () => { + V.FCTV.remote = 1; + + cashX(forceNeg(100 * V.upgradeMultiplierTrade), "capEx"); + App.UI.DOM.replace(FCTVDiv, FCTV); + }) + ); + } + + text.push(App.UI.DOM.generateLinksStrip(links)); + + App.Events.addNode(FCTVDiv, text); + + return FCTVDiv; + } + } + + function skills() { + App.UI.DOM.appendNewElement("h2", skillsDiv, `Personal Skills`); + + skillsDiv.append(`You ponder what skills may be useful in running your arcology.`); + + App.UI.DOM.appendNewElement("div", skillsDiv, `Trading: ${getPlayerTradingSkill()}`); + App.UI.DOM.appendNewElement("div", skillsDiv, `Warfare: ${getPlayerWarfareSkill()}`); + App.UI.DOM.appendNewElement("div", skillsDiv, `Slaving: ${getPlayerSlavingSkill()}`); + App.UI.DOM.appendNewElement("div", skillsDiv, `Engineering: ${getPlayerEngineeringSkill()}`); + App.UI.DOM.appendNewElement("div", skillsDiv, `Medicine: ${getPlayerMedicineSkill()}`); + App.UI.DOM.appendNewElement("div", skillsDiv, `Hacking: ${getPlayerHackingSkill()}`); + + return skillsDiv; + + function getPlayerTradingSkill() { + if (PC.skill.trading >= 100) { + return `You are a master at economics and trading.`; + } else if (PC.skill.trading >= 80) { + return `You are an expert at economics and trading.`; + } else if (PC.skill.trading >= 60) { + return `You are skilled in economics and trading.`; + } else if (PC.skill.trading >= 40) { + return `You know some things about economics and trading.`; + } else if (PC.skill.trading >= 20) { + return `You are a beginner in economics.`; + } else if (PC.skill.trading >= 0) { + return `You know only the basics of trading.`; + } else if (PC.skill.trading >= -20) { + return `You know how to haggle a little.`; + } else if (PC.skill.trading >= -40) { + return `You know how to shop around.`; + } else if (PC.skill.trading >= -60) { + return `You know not to pay sticker price.`; + } else if (PC.skill.trading >= -80) { + return `People always give you discounts, but you never save any money.`; + } else { + return `They said it was a bear market, so where are the bears?`; + } + } + + function getPlayerWarfareSkill() { + if (PC.skill.warfare >= 100) { + return `You are a master of warfare.`; + } else if (PC.skill.warfare >= 80) { + return `You are an expert at tactics and strategy.`; + } else if (PC.skill.warfare >= 60) { + return `You are skilled in combat.`; + } else if (PC.skill.warfare >= 40) { + return `You know some things about combat.`; + } else if (PC.skill.warfare >= 20) { + return `You are a beginner in tactics and strategy.`; + } else if (PC.skill.warfare >= 0) { + return `You know only the basics of fighting.`; + } else if (PC.skill.warfare >= -20) { + return `You know how to hold a gun.`; + } else if (PC.skill.warfare >= -40) { + return `You know how to stab with a knife.`; + } else if (PC.skill.warfare >= -60) { + return `Go for the throat?`; + } else if (PC.skill.warfare >= -80) { + return `Just kick them in the balls, right?`; + } else { + return `People like you are usually the first raped in a war.`; + } + } + + function getPlayerSlavingSkill() { + if (PC.skill.slaving >= 100) { + return `You are a master slaver.`; + } else if (PC.skill.slaving >= 80) { + return `You are an expert at enslaving.`; + } else if (PC.skill.slaving >= 60) { + return `You are skilled in slaving.`; + } else if (PC.skill.slaving >= 40) { + return `You know some things about getting slaves.`; + } else if (PC.skill.slaving >= 20) { + return `You are a beginner in slaving.`; + } else if (PC.skill.slaving >= 0) { + return `You know only the basics of slaving.`; + } else if (PC.skill.slaving >= -20) { + return `You know how to avoid becoming a slave.`; + } else if (PC.skill.slaving >= -40) { + return `You know to read contracts before you sign them.`; + } else if (PC.skill.slaving >= -60) { + return `You know to be careful.`; + } else if (PC.skill.slaving >= -80) { + return `You know better than to trust anyone.`; + } else { + return `It would be easy to enslave you.`; + } + } + + function getPlayerEngineeringSkill() { + if (PC.skill.engineering >= 100) { + return `You are a master engineer.`; + } else if (PC.skill.engineering >= 80) { + return `You are an expert at engineering.`; + } else if (PC.skill.engineering >= 60) { + return `You are skilled in engineering.`; + } else if (PC.skill.engineering >= 40) { + return `You know some things about engineering.`; + } else if (PC.skill.engineering >= 20) { + return `You are a beginner in engineering.`; + } else if (PC.skill.engineering >= 0) { + return `You know only the basics of engineering.`; + } else if (PC.skill.engineering >= -20) { + return `You can build a gingerbread house that doesn't collapse.`; + } else if (PC.skill.engineering >= -40) { + return `You can tie a tight knot, does that count?`; + } else if (PC.skill.engineering >= -60) { + return `Glue is your friend; lots of it.`; + } else if (PC.skill.engineering >= -80) { + return `You know better than to even try to build something.`; + } else { + return `You can cook; that's sort of like building something, right?`; + } + } + + function getPlayerMedicineSkill() { + if (PC.skill.medicine >= 100) { + return `You are a master surgeon.`; + } else if (PC.skill.medicine >= 80) { + return `You are an expert at medicine and surgery.`; + } else if (PC.skill.medicine >= 60) { + return `You are skilled in surgery.`; + } else if (PC.skill.medicine >= 40) { + return `You know some things about medicine.`; + } else if (PC.skill.medicine >= 20) { + return `You are a beginner in medicine.`; + } else if (PC.skill.medicine >= 0) { + return `You know the basics of treating injuries.`; + } else if (PC.skill.medicine >= -20) { + return `You can stop a wound from getting infected.`; + } else if (PC.skill.medicine >= -40) { + return `Gauze is your friend. Just keep wrapping.`; + } else if (PC.skill.medicine >= -60) { + return `You know how to apply a band-aid.`; + } else if (PC.skill.medicine >= -80) { + return `Cure-alls are wonderful. Why aren't they sold in stores, though?`; + } else { + return `Alcohol makes pain go away, right?`; + } + } + + function getPlayerHackingSkill() { + if (PC.skill.hacking >= 100) { + return `You are a master of hacking.`; + } else if (PC.skill.hacking >= 80) { + return `You are an expert at hacking.`; + } else if (PC.skill.hacking >= 60) { + return `You are skilled in hacking.`; + } else if (PC.skill.hacking >= 40) { + return `You know some things about hacking.`; + } else if (PC.skill.hacking >= 20) { + return `You are a beginner in hacking.`; + } else if (PC.skill.hacking >= 0) { + return `You know only the basics of hacking.`; + } else if (PC.skill.hacking >= -20) { + return `You know how to click a mouse.`; + } else if (PC.skill.hacking >= -40) { + return `Enter does something?`; + } else if (PC.skill.hacking >= -60) { + return `Where is the "any" key?`; + } else if (PC.skill.hacking >= -80) { + return `You can push the power button, good job.`; + } else { + return `This black box thingy is magical.`; + } + } + } + + function reputation() { + const customTitleDiv = document.createElement("div"); + const textBoxDiv = document.createElement("div"); + const renamePlayerDiv = document.createElement("div"); + const newNameDiv = document.createElement("div"); + const rumorsDiv = document.createElement("div"); + const familyDiv = document.createElement("div"); + const pregnancyDiv = document.createElement("div"); + const birthsDiv = document.createElement("div"); + const partnersDiv = document.createElement("div"); + const knockedUpDiv = document.createElement("div"); + const fatheredDiv = document.createElement("div"); + const breedingDiv = document.createElement("div"); + const cumTapDiv = document.createElement("div"); + const impregnateSelfDiv = document.createElement("div"); + + App.UI.DOM.appendNewElement("h2", reputationDiv, `Reputation`); + App.UI.DOM.appendNewElement("h3", reputationDiv, `Name`); + + reputationDiv.append( + `On formal occasions, you are announced as ${PCTitle()}. By slaves, however, you prefer to be called ${properMaster()}.`, + customTitle(), + renamePlayer(), + rumors(), + family(), + ); + + if (PC.vagina !== -1) { + reputationDiv.append(pregnancy()); + } + + if (PC.counter.birthsTotal > 0) { + reputationDiv.append(births()); + } + + if (PC.partners.size > 0) { + reputationDiv.append(partners()); + } + + if (PC.counter.slavesKnockedUp > 0) { + reputationDiv.append(knockedUp()); + } else if (PC.counter.slavesFathered > 0) { + reputationDiv.append(fathered()); + } + + const links = []; + + if (PC.preg > 0 && V.pregnancyMonitoringUpgrade) { + links.push(App.UI.DOM.passageLink(`Inspect pregnancy`, 'Analyze PC Pregnancy')); + } + + if (PC.preg >= 0 && PC.ovaries && PC.ovaryAge < 47) { + links.push(App.UI.DOM.passageLink(`Harvest and implant an egg`, 'Surrogacy Workaround', () => { + // @ts-ignore + V.donatrix = V.PC; + // @ts-ignore + V.impregnatrix = "undecided"; + // @ts-ignore + V.receptrix = "undecided"; + + V.nextLink = 'Manage Personal Affairs'; + })); + } + + reputationDiv.append(App.UI.DOM.generateLinksStrip(links)); + + if (PC.vagina !== -1 && V.arcologies[0].FSRestartDecoration >= 100) { + reputationDiv.append(breeding()); + } + + if (PC.preg === 0 && PC.pregWeek === 0) { + reputationDiv.append( + cumTap(), + impregnateSelf(), + ); + } + + return reputationDiv; + + function customTitle() { + if (!PC.customTitle) { + textBoxDiv.append( + `Custom title: `, + App.UI.DOM.makeTextBox(PC.customTitle || '', (title) => { + if (!title) { + title = ''; + } + + V.PC.customTitle = title; + V.PC.customTitleLisp = lispReplace(PC.customTitle); + + App.UI.DOM.replace(reputationDiv, reputation); + }), + ); + + customTitleDiv.append(App.UI.DOM.makeElement("div", App.UI.DOM.linkReplace(`Set a custom title for slaves to address you as`, textBoxDiv))); + } else { + customTitleDiv.append( + `Your custom title is `, + App.UI.DOM.makeTextBox(PC.customTitle || '', (title) => { + V.PC.customTitle = title; + V.PC.customTitleLisp = lispReplace(PC.customTitle); + + App.UI.DOM.replace(reputationDiv, reputation); + }), + App.UI.DOM.link(`Stop using a custom title`, () => { + V.PC.customTitle = null; + V.PC.customTitleLisp = null; + + App.UI.DOM.replace(reputationDiv, reputation); + }), + ); + } + + return customTitleDiv; + } + + function renamePlayer() { + newNameDiv.append( + `New name: `, + App.UI.DOM.makeTextBox(PC.slaveName, (name) => { + V.PC.slaveName = name; + repX(-500, "event"); + + App.UI.DOM.replace(reputationDiv, reputation); + }), + ); + + renamePlayerDiv.append(App.UI.DOM.linkReplace(`Rename yourself`, newNameDiv)); + App.UI.DOM.appendNewElement("span", renamePlayerDiv, ` Will cost you some reputation`, ['note']); + + return renamePlayerDiv; + } + + function rumors() { + App.UI.DOM.appendNewElement("h3", rumorsDiv, `Rumors`); + + App.Events.addNode(rumorsDiv, [getPlayerRumors()]); + + return rumorsDiv; + + function getPlayerRumors() { + if (PC.degeneracy > 100) { + return `There are severe and devastating rumors about you spreading across the arcology.`; + } else if (PC.degeneracy > 75) { + return `There are severe rumors about you spreading across the arcology.`; + } else if (PC.degeneracy > 50) { + return `There are bad rumors about you spreading across the arcology.`; + } else if (PC.degeneracy > 25) { + return `There are rumors about you spreading across the arcology.`; + } else if (PC.degeneracy > 10) { + return `There are minor rumors about you spreading across the arcology.`; + } else { + return `The occasional rumor about you can be heard throughout the arcology.`; + } + } + } + + function family() { + App.UI.DOM.appendNewElement("h3", familyDiv, `Family`); + + familyDiv.append(App.UI.DOM.linkReplace(`Pull up the file on your family tree`, renderFamilyTree(V.slaves, -1))); + + if (totalPlayerRelatives(PC) > 0 || (V.showMissingSlaves && (PC.mother in V.missingTable || PC.father in V.missingTable))) { + App.Events.addNode(familyDiv, [App.Desc.family(PC)]); + } + + return familyDiv; + } + + function pregnancy() { + const text = []; + + const miniSceneSpan = App.UI.DOM.appendNewElement("span", pregnancyDiv); + const abortLink = App.UI.DOM.link(`Abort the child`, () => { + TerminatePregnancy(V.PC); + + // App.UI.DOM.linkReplace does not support handlers afaik + App.UI.DOM.replace(miniSceneSpan, `You take a syringe filled with abortifacients and make yourself comfortable. Injecting the vial through your belly into your womb, your close your eyes and wait for what is coming. Once you feel it is over, you clean yourself up and go on your way, child free.`); + App.UI.DOM.replace(appearanceDiv, appearance); + App.UI.DOM.replace(drugsDiv, drugs); + }); + + App.UI.DOM.appendNewElement("h2", pregnancyDiv, `Contraceptives and Fertility`); + + if (PC.preg < 6 && PC.pregKnown) { + miniSceneSpan.append(`Your period is late, so the first thing you do is test yourself for a potential pregnancy. A pregnancy test confirms `, App.UI.DOM.makeElement("span", `you are pregnant. `, ['pregnant'])); + + if (V.arcologies[0].FSRestart === "unset" || V.eugenicsFullControl === 1 || (V.PC.pregSource !== -1 && V.PC.pregSource !== -6)) { + miniSceneSpan.append(abortLink); + + text.push(miniSceneSpan); + } + } else if (PC.labor === 1) { + text.push(`You are beginning to feel contractions; you'll be giving birth soon.`); + } else if (PC.preg >= 39) { + text.push(`Your due date is looming, but your ${PC.pregType > 1 ? `children don't` : `child doesn't`} seem to be interested in coming out just yet.`); + + text.push(miniSceneSpan, App.UI.DOM.link(`Induce childbirth`, () => { + V.PC.labor = 1; + + App.UI.DOM.replace(pregnancyDiv, pregnancy); + })); + } else if (PC.pregKnown) { + text.push(`You're pregnant, something rather unbecoming for an arcology owner.`); + + if (V.arcologies[0].FSRestart === "unset" || V.eugenicsFullControl === 1 || (V.PC.pregSource !== -1 && V.PC.pregSource !== -6)) { + miniSceneSpan.append(abortLink); + + text.push(miniSceneSpan); + } + } + + App.Events.addNode(pregnancyDiv, text); + + return pregnancyDiv; + } + + function births() { + const text = []; + + const babies = count => count === 1 ? `${count} baby` : `${count} babies`; + + if (V.PC.vagina !== -1) { + text.push(`In total, you have given birth to:`); + } else { + text.push(`Before your sex change, you had given birth to:`); + } + + if (PC.counter.birthElite > 0) { + App.UI.DOM.appendNewElement("div", birthsDiv, `${babies(PC.counter.birthElite)} for the Societal Elite.`); + } + if (PC.counter.birthMaster > 0) { + App.UI.DOM.appendNewElement("div", birthsDiv, `${babies(PC.counter.birthMaster)} for your former Master.`); + } + if (PC.counter.birthClient > 0) { + App.UI.DOM.appendNewElement("div", birthsDiv, `${babies(PC.counter.birthClient)} from clients you've slept with.`); + } + if (PC.counter.birthDegenerate > 0) { + App.UI.DOM.appendNewElement("div", birthsDiv, `${PC.counter.birthDegenerate} bastard ${PC.counter.birthDegenerate > 1 ? `babies` : `baby`} from getting fucked by slaves.`); + } + if (PC.counter.birthArcOwner > 0) { + App.UI.DOM.appendNewElement("div", birthsDiv, `${babies(PC.counter.birthArcOwner)} from your time with male arcology owners.`); + } + if (PC.counter.birthCitizen > 0) { + App.UI.DOM.appendNewElement("div", birthsDiv, `${babies(PC.counter.birthCitizen)} from sex with arcology citizens.`); + } + if (PC.counter.birthOther > 0) { + App.UI.DOM.appendNewElement("div", birthsDiv, `${babies(PC.counter.birthOther)} from sources you can't quite recall.`); + } + if (PC.counter.birthSelf > 0) { + App.UI.DOM.appendNewElement("div", birthsDiv, `${babies(PC.counter.birthSelf)} that ${PC.counter.birthSelf > 1 ? `are` : `is`} literally all you.`); + } + if (PC.counter.birthLab > 0) { + App.UI.DOM.appendNewElement("div", birthsDiv, `${babies(PC.counter.birthLab)} specially designed in the lab.`); + } + + App.Events.addNode(birthsDiv, text); + + return birthsDiv; + } + + function partners() { + const text = []; + + const slaves = [...PC.partners].filter(i => i > 0); + const other = []; + + text.push(`You've had sex with ${num(slaves.length)} different slaves so far.`); + + if (PC.partners.has(-2)) { + other.push(`citizens of ${V.arcologies[0].name}`); + } + if (PC.partners.has(-3)) { + other.push(`your former master`); + } + if (PC.partners.has(-4)) { + other.push(`another arcology owner`); + } + if (PC.partners.has(-6)) { + other.push(`members of the Societal Elite`); + } + if (PC.partners.has(-8)) { + other.push(`some of your animals`); + } + if (PC.partners.has(-9)) { + other.push(`members of the Futanari Sisters`); + } + + if (other.length > 0) { + text.push(`You have also had sex with ${toSentence(other)}.`); + } + + App.Events.addNode(partnersDiv, text); + + return partnersDiv; + } + + function knockedUp() { + const text = []; + + let fathered = ''; + + if (PC.counter.slavesFathered > 0) { + fathered = ` and fathered ${num(PC.counter.slavesFathered)} new ${PC.counter.slavesFathered > 1 ? `slaves` : `slave`}`; + } + + if (PC.dick > 0) { + text.push(`You've knocked up ${num(PC.counter.slavesKnockedUp)} fertile slave ${PC.counter.slavesKnockedUp > 1 ? `girls` : `girl`}${fathered} as an arcology owner so far.`); + } else { + text.push(`Before your sex change, you knocked up ${num(PC.counter.slavesKnockedUp)} fertile slave ${PC.counter.slavesKnockedUp > 1 ? `girls` : `girl`}${fathered}.`); + } + + App.Events.addNode(knockedUpDiv, text); + + return knockedUpDiv; + } + + function fathered() { + const text = []; + + if (PC.dick > 0) { + text.push(`You've fathered ${num(PC.counter.slavesFathered)} new ${PC.counter.slavesFathered > 1 ? `slaves` : `slave`} as an arcology owner so far.`); + } else { + text.push(`Before your sex change, you fathered ${num(PC.counter.slavesFathered)} new ${PC.counter.slavesFathered > 1 ? `slaves` : `slave`}.`); + } + + App.Events.addNode(fatheredDiv, text); + + return fatheredDiv; + } + + function breeding() { + const text = []; + + if (V.playerBred) { + text.push( + `You are currently not bearing children for the Societal Elite.`, + App.UI.DOM.generateLinksStrip([ + App.UI.DOM.link(`List your womb as available`, () => { + V.playerBred = 1; + // @ts-ignore + V.playerBredTube = 0; + + App.UI.DOM.replace(breedingDiv, breeding); + }), + App.UI.DOM.link(`Sign up for artificial insemination`, () => { + V.playerBred = 1; + // @ts-ignore + V.playerBredTube = 1; + + App.UI.DOM.replace(breedingDiv, breeding); + }) + ]), + ); + } else { + text.push(`Your womb is dedicated to carrying the Societal Elites' children.`); + + if (PC.counter.birthElite > 0) { + text.push(App.UI.DOM.link(`List your womb as unavailable`, () => { + V.playerBred = 0; + + App.UI.DOM.replace(breedingDiv, breeding); + })); + } else { + text.push(App.UI.DOM.disabledLink(`List your womb as unavailable`, [ + 'You must bear at least one child for the Societal Elite before removing yourself from the breeding program.' + ])); + } + } + + App.Events.addNode(breedingDiv, text); + + return breedingDiv; + } + + function cumTap() { + const text = []; + + if (V.dairyPiping && (V.cumSlaves > 0 || V.arcologies[0].FSPastoralistLaw === 1)) { + if (PC.skill.cumTap === 0) { + text.push( + `The tap connected to ${V.dairyName} has a variety of attachments, one of which being a very tantalizing dick-shaped nozzle. It looks like it would be a perfect fit for you, if you were curious, that is.`, + App.UI.DOM.passageLink(`No one is looking...`, 'FSelf'), + ); + } else { + text.push( + `The tap connected to ${V.dairyName} is calling to you. Begging to let it fill you with cum again. If you wanted to try and go bigger, that is.`, + App.UI.DOM.generateLinksStrip([ + App.UI.DOM.passageLink(`Sounds fun!`, 'FSelf'), + App.UI.DOM.link(`You only want to get pregnant`, () => { + V.PC.preg = 1; + V.PC.pregSource = 0; + V.PC.pregKnown = 1; + V.PC.pregType = setPregType(V.PC); + + WombImpregnate(V.PC, V.PC.pregType, 0, 1); + + App.UI.DOM.replace(cumTapDiv, cumTap); + }) + ]) + ); + } + } + + App.Events.addNode(cumTapDiv, text); + + return cumTapDiv; + } + + function impregnateSelf() { + const text = []; + + if (V.PC.vagina > 0 && V.PC.dick) { + if (V.PC.counter.birthSelf > 0) { + text.push( + `Who better to impregnate you than you?`, + App.UI.DOM.passageLink(`Impregnate yourself`, 'MpregSelf'), + ); + } else { + text.push( + `You have an empty vagina, a working set of balls, and a strong craving for a hot creampie. Who better to give it to you than you?`, + App.UI.DOM.passageLink(`Grab an extra syringe`, 'MpregSelf'), + ); + } + } + + App.Events.addNode(impregnateSelfDiv, text); + + return impregnateSelfDiv; + } + } + + function drugs() { + const staminaDrugsDiv = document.createElement("div"); + const contraceptivesDiv = document.createElement("div"); + const fertilityDrugsDiv = document.createElement("div"); + + App.UI.DOM.appendNewElement("h2", drugsDiv, `Drugs`); + + drugsDiv.append(staminaDrugs()); + + if (PC.vagina !== -1) { + drugsDiv.append( + contraceptives(), + fertilityDrugs(), + ); + } + + return drugsDiv; + + function staminaDrugs() { + const text = []; + + if (PC.staminaPills) { + text.push( + `You are currently taking stamina enhancing pills in order to enjoy more slaves per week.`, + App.UI.DOM.generateLinksStrip([ + App.UI.DOM.disabledLink(`More stamina means more sex`, [ + `You are already taking stamina enhancing drugs.` + ]), + App.UI.DOM.link(`Stop taking stamina enhancing drugs`, () => { + V.PC.staminaPills = 0; + + App.UI.DOM.replace(drugsDiv, drugs); + }), + ]), + ); + } else { + text.push( + `You are not on any stamina enhancers.`, + App.UI.DOM.generateLinksStrip([ + App.UI.DOM.link(`More stamina means more sex`, () => { + V.PC.staminaPills = 1; + + App.UI.DOM.replace(drugsDiv, drugs); + }), + App.UI.DOM.disabledLink(`Stop taking stamina enhancing drugs`, [ + `You are not currently taking stamina enhancing drugs.` + ]), + ]), + ); + } + + App.Events.addNode(staminaDrugsDiv, text); + + return staminaDrugsDiv; + } + + function contraceptives() { + const text = []; + const links = []; + + if (PC.preg >= 8) { + text.push(`You're currently ${num(PC.preg)} ${PC.preg > 1 ? `weeks` : `week`} pregnant, so contraception doesn't matter right now.`); + } else if (PC.preg >= 6) { + text.push(`You're having morning sickness.`); + } else if (PC.preg > 1) { + text.push(`You've missed your period. This could be bad.`); + } else if (PC.preg > 0) { + text.push(`Your fertile pussy has been thoroughly seeded; there is a chance you are pregnant.`); + + if (V.arcologies[0].FSRestart === "unset" || V.eugenicsFullControl === 1 || (V.PC.pregSource !== -1 && V.PC.pregSource !== -6)) { + text.push(App.UI.DOM.link(`Pop some morning after pills`, () => { + WombFlush(V.PC); + + App.UI.DOM.replace(appearanceDiv, appearance); + App.UI.DOM.replace(reputationDiv, reputation); + App.UI.DOM.replace(contraceptivesDiv, contraceptives); + })); + } + } else if (PC.pregWeek < 0) { + text.push(`You're still recovering from your recent pregnancy.`); + } else if (PC.preg === -2) { + text.push(`You're menopausal. Your time to bear children has passed.`); + } else if (PC.preg === -1) { + text.push(`You're currently on birth control.`); + links.push( + App.UI.DOM.disabledLink(`Start taking birth control`, [ + `You are already taking birth control.` + ]), + App.UI.DOM.link(`Stop taking birth control`, () => { + V.PC.preg = 0; + + App.UI.DOM.replace(contraceptivesDiv, contraceptives); + }), + ); + } else if (PC.preg === 0) { + text.push(`You're currently fertile.`); + links.push( + App.UI.DOM.link(`Start taking birth control`, () => { + V.PC.preg = -1; + V.PC.fertDrugs = 0; + + App.UI.DOM.replace(contraceptivesDiv, contraceptives); + }), + App.UI.DOM.disabledLink(`Stop taking birth control`, [ + `You are not currently taking birth control.` + ]), + ); + } + + text.push(App.UI.DOM.generateLinksStrip(links)); + + App.Events.addNode(contraceptivesDiv, text); + + return contraceptivesDiv; + } + + function fertilityDrugs() { + const text = []; + const links = []; + + // check if the player is already taking fertility drugs as refreshment + const fertRefresh = PC.refreshment.toLowerCase().indexOf("fertility") !== -1 ? 1 : 0; + + if (PC.fertDrugs === 1) { + text.push(`You are currently taking fertility supplements${fertRefresh ? ` on top of the ${PC.refreshment}` : ``}.`); + + if (PC.forcedFertDrugs > 0) { + text.push(`You feel a strange eagerness whenever you think of bareback sex.`); + } + + links.push( + App.UI.DOM.disabledLink(`Start taking fertility drugs`, [ + `You are already taking fertility drugs.` + ]), + App.UI.DOM.link(`Stop taking fertility drugs`, () => { + V.PC.fertDrugs = 0; + + App.UI.DOM.replace(fertilityDrugsDiv, fertilityDrugs); + }) + ); + } else { + text.push(`You are not on any fertility supplements${fertRefresh ? `, other than the ${PC.refreshment}, of course` : ``}.`); + + if (PC.forcedFertDrugs > 0) { + text.push(`You feel a strange eagerness whenever you think of bareback sex.`); + } + + links.push( + App.UI.DOM.link(`Start taking fertility drugs`, () => { + V.PC.fertDrugs = 1; + + App.UI.DOM.replace(fertilityDrugsDiv, fertilityDrugs); + }), + App.UI.DOM.disabledLink(`Stop taking fertility drugs`, [ + `You are not currently taking fertility drugs.` + ]), + ); + } + + text.push(App.UI.DOM.generateLinksStrip(links)); + + App.Events.addNode(fertilityDrugsDiv, text); + + return fertilityDrugsDiv; + } + } + + function lactation() { + App.UI.DOM.appendNewElement("h2", lactationDiv, `Lactation`); + + const text = []; + + text.push(`Your breasts are laden with milk.`); + + if (PC.rules.lactation === "sell") { + text.push( + `You are spending time with the penthouse milkers and making a quick ¤ from your efforts.`, + App.UI.DOM.generateLinksStrip([ + App.UI.DOM.link(`Stop milking yourself`, () => { + V.PC.rules.lactation = "none"; + + App.UI.DOM.replace(lactationDiv, lactation); + }), + App.UI.DOM.link(`Stop using the milkers`, () => { + V.PC.rules.lactation = "maintain"; + + App.UI.DOM.replace(lactationDiv, lactation); + }), + App.UI.DOM.disabledLink(`Use the penthouse milkers`, [ + `You are already selling your breast milk.` + ]) + ]) + ); + } else if (PC.rules.lactation === "maintain") { + text.push( + `You are taking the time to keep yourself lactating.`, + App.UI.DOM.generateLinksStrip([ + App.UI.DOM.link(`Stop milking yourself`, () => { + V.PC.rules.lactation = "none"; + + App.UI.DOM.replace(lactationDiv, lactation); + }), + App.UI.DOM.disabledLink(`Keep yourself milked`, [ + `You are already maintaining lactation.` + ]), + App.UI.DOM.link(`Use the penthouse milkers`, () => { + V.PC.rules.lactation = "sell"; + + App.UI.DOM.replace(lactationDiv, lactation); + }), + ]) + ); + } else { + text.push( + `You are currently letting nature run its course.`, + App.UI.DOM.generateLinksStrip([ + App.UI.DOM.disabledLink(`Stop milking yourself`, [ + `You aren't currently milking yourself.` + ]), + App.UI.DOM.link(`Keep yourself milked`, () => { + V.PC.rules.lactation = "maintain"; + + App.UI.DOM.replace(lactationDiv, lactation); + }), + App.UI.DOM.link(`Use the penthouse milkers`, () => { + V.PC.rules.lactation = "sell"; + + App.UI.DOM.replace(lactationDiv, lactation); + }), + ]) + ); + } + + App.Events.addNode(lactationDiv, text); + + return lactationDiv; + } + + function breederExam() { + App.UI.DOM.appendNewElement("h2", breederExamDiv, `Elite Breeder Qualifications`); + + App.Events.addNode(breederExamDiv, [eliteBreedingExam()]); + + return breederExamDiv; + } +}; diff --git a/src/pregmod/managePersonalAffairs.tw b/src/pregmod/managePersonalAffairs.tw deleted file mode 100644 index b3004435d355e7e6301b9fb533dbcda13cf883a7..0000000000000000000000000000000000000000 --- a/src/pregmod/managePersonalAffairs.tw +++ /dev/null @@ -1,689 +0,0 @@ -:: Manage Personal Affairs [nobr jump-to-safe jump-from-safe] - -<<set $nextButton = "Back", $nextLink = "Main", $encyclopedia = "Being in Charge">> - -<<set _ML = $marrying.length>> - -<<if $cheatMode == 1>> - <div class="cheat-menu">[[Cheat Edit Player|PCCheatMenu][$cheater = 1, $backupSlave = clone($PC)]]</div> -<</if>> - -<h1>Personal Affairs</h1> - -<h2>Appearance</h2> - -<p> - <div> - You pause for a moment from your busy day to day life to return to <<if $masterSuite != 0>>$masterSuiteName<<else>>your room<</if>> to consider some things about yourself. - </div> - -<<if $geneticMappingUpgrade >= 1>> - <div> - <<if $PC.genes === "XY" && $seeDicksAffectsPregnancy === 0>> - Analysis of your sperm shows that you have a <<= $PC.spermY>>% chance of fathering a son. - <</if>> - </div> -<</if>> - - <div> - You take yourself in a full length mirror. You are <<= addA($PC.race)>> <<if $PC.dick != 0 && $PC.vagina != -1>>futanari<<elseif $PC.dick != 0>>man<<else>>woman<</if>> with<<if $PC.markings == "freckles">> freckled<<elseif $PC.markings == "heavily freckled">> heavily freckled<</if>> <<print $PC.skin>> skin, $PC.hColor hair, <<print App.Desc.eyesColor($PC)>> and a perfect $PC.faceShape face. - <<if $PC.actualAge >= 65>> - You're @@.orange;$PC.actualAge@@ and definitely feeling it.<<if $PC.visualAge > $PC.actualAge>> You've taken measures to @@.lime;look an older $PC.visualAge,@@ though perhaps it might be time to undo it.<<elseif $PC.visualAge < $PC.actualAge>> You've taken measures to @@.lime;look a younger $PC.visualAge,@@ now if only your body agreed with your looks.<</if>> - <<elseif $PC.actualAge >= 50>> - You're @@.orange;$PC.actualAge@@ and starting to feel it.<<if $PC.visualAge > $PC.actualAge>> You've taken measures to @@.lime;look an older $PC.visualAge.@@<<elseif $PC.visualAge < $PC.actualAge>> You've taken measures to @@.lime;look a younger $PC.visualAge.@@<</if>> - <<elseif $PC.actualAge >= 35>> - You're @@.orange;$PC.actualAge@@ and strong.<<if $PC.visualAge > $PC.actualAge>> You've taken measures to @@.lime;look an older $PC.visualAge@@ and reap the respect that comes with it.<<elseif $PC.visualAge < $PC.actualAge>> You've taken measures to @@.lime;look a younger $PC.visualAge@@ recapturing your youth.<</if>> - <<else>> - You're @@.orange;$PC.actualAge@@ and full of vigor.<<if $PC.visualAge > $PC.actualAge>> You've taken measures to @@.lime;look an older $PC.visualAge@@ and reap the respect that comes with it.<<elseif $PC.visualAge < $PC.actualAge>> You've taken measures to @@.lime;look a younger $PC.visualAge,@@ even though society may find your looks uncomfortable.<</if>> - <</if>> - <<if ($playerAging != 0)>>Your birthday is <<if $PC.birthWeek == 51>>next week<<else>>in <<print 52-$PC.birthWeek>> weeks<</if>>.<</if>> - Looking down, - <<= App.Desc.Player.boobs()>> - <<= App.Desc.Player.belly()>> - <<if $PC.prostate > 2 && $PC.belly < 10000>> Your pubic mound bulges outward noticeably thanks to your massive prostate.<<elseif $PC.prostate == 2 && $PC.belly < 5000>> Your pubic mound swells outward slightly due to your oversized prostate.<</if>> - Beneath all that, - <<= App.Desc.Player.crotch()>> - Around back, - <<= App.Desc.Player.butt()>> - </div> - - <div> - <<if $playerSurgery == 0>>[[Visit your plastic surgeon.|Elective Surgery][$playerSurgery = 4]]<<elseif $playerSurgery == 1>>Your favorite plastic surgeon is booked solid for the next week.<<else>>Your favorite plastic surgeon is booked solid for the next $playerSurgery weeks.<</if>> - </div> - - <<includeDOM App.Medicine.Modification.eyeSelector($PC)>> - - <div> - You have a selection of hair dyes available: - </div> - <div class="indent"> - <<if $PC.origHColor == $PC.hColor>>Your hair is its natural color.<<else>>[[Remove dye|Manage Personal Affairs][$PC.hColor = $PC.origHColor]]<</if>> - <<if $PC.origHColor != "auburn">>| [[Auburn|Manage Personal Affairs][$PC.hColor = "auburn"]]<</if>> - <<if $PC.origHColor != "black">>| [[Hazel|Manage Personal Affairs][$PC.hColor = "black"]]<</if>> - <<if $PC.origHColor != "blonde">>| [[Blonde|Manage Personal Affairs][$PC.hColor = "blonde"]]<</if>> - <<if $PC.origHColor != "blue">>| [[Blue|Manage Personal Affairs][$PC.hColor = "blue"]]<</if>> - <<if $PC.origHColor != "blue-violet">>| [[Blue-Violet|Manage Personal Affairs][$PC.hColor = "blue-violet"]]<</if>> - <<if $PC.origHColor != "brown">>| [[Brown|Manage Personal Affairs][$PC.hColor = "brown"]]<</if>> - <<if $PC.origHColor != "burgundy">>| [[Burgundy|Manage Personal Affairs][$PC.hColor = "burgundy"]]<</if>> - <<if $PC.origHColor != "chestnut">>| [[Chestnut|Manage Personal Affairs][$PC.hColor = "chestnut"]]<</if>> - <<if $PC.origHColor != "chocolate brown">>| [[Chocolate|Manage Personal Affairs][$PC.hColor = "chocolate brown"]]<</if>> - <<if $PC.origHColor != "copper">>| [[Copper|Manage Personal Affairs][$PC.hColor = "copper"]]<</if>> - <<if $PC.origHColor != "crimson">>| [[Crimson|Manage Personal Affairs][$PC.hColor = "crimson"]]<</if>> - <<if $PC.origHColor != "dark blue">>| [[Dark Blue|Manage Personal Affairs][$PC.hColor = "dark blue"]]<</if>> - <<if $PC.origHColor != "dark brown">>| [[Dark Brown|Manage Personal Affairs][$PC.hColor = "dark brown"]]<</if>> - <<if $PC.origHColor != "dark orchid">>| [[Dark Orchid|Manage Personal Affairs][$PC.hColor = "dark orchid"]]<</if>> - <<if $PC.origHColor != "ginger">>| [[Ginger|Manage Personal Affairs][$PC.hColor = "ginger"]]<</if>> - <<if $PC.origHColor != "golden">>| [[Golden|Manage Personal Affairs][$PC.hColor = "golden"]]<</if>> - <<if $PC.origHColor != "green">>| [[Green|Manage Personal Affairs][$PC.hColor = "green"]]<</if>> - <<if $PC.origHColor != "green-yellow">>| [[Green-Yellow|Manage Personal Affairs][$PC.hColor = "green-yellow"]]<</if>> - <<if $PC.origHColor != "grey">>| [[Grey|Manage Personal Affairs][$PC.hColor = "grey"]]<</if>> - <<if $PC.origHColor != "hazel">>| [[Hazel|Manage Personal Affairs][$PC.hColor = "hazel"]]<</if>> - <<if $PC.origHColor != "jet black">>| [[Jet Black|Manage Personal Affairs][$PC.hColor = "jet black"]]<</if>> - <<if $PC.origHColor != "pink">>| [[Pink|Manage Personal Affairs][$PC.hColor = "pink"]]<</if>> - <<if $PC.origHColor != "platinum blonde">>| [[Platinum Blonde|Manage Personal Affairs][$PC.hColor = "platinum blonde"]]<</if>> - <<if $PC.origHColor != "purple">>| [[Purple|Manage Personal Affairs][$PC.hColor = "purple"]]<</if>> - <<if $PC.origHColor != "red">>| [[Red|Manage Personal Affairs][$PC.hColor = "red"]]<</if>> - <<if $PC.origHColor != "sea green">>| [[Sea Green|Manage Personal Affairs][$PC.hColor = "sea green"]]<</if>> - <<if $PC.origHColor != "silver">>| [[Silver|Manage Personal Affairs][$PC.hColor = "silver"]]<</if>> - <<if $PC.origHColor != "strawberry-blonde">>| [[Strawberry-Blonde|Manage Personal Affairs][$PC.hColor = "strawberry-blonde"]]<</if>> - <<if $PC.origHColor != "white">>| [[White|Manage Personal Affairs][$PC.hColor = "white"]]<</if>> - </div> -</p> - -<<if $weddingPlanned > 0>> - <h2>Wedding</h2> - - <p> - <<set _slave1 = getSlave($marrying[0])>> - <<if _ML > 1>> - <<if _ML >= 2>> - <<set _slave2 = getSlave($marrying[1])>> - <</if>> - <<if _ML >= 3>> - <<set _slave3 = getSlave($marrying[2])>> - <</if>> - <<if _ML == 4>> - <<set _slave4 = getSlave($marrying[3])>> - <</if>> - <</if>> - - /* yes, I am aware this looks horrendous - if you can find a way to clean this up, by all means */ - You have a wedding planned for this weekend; you are - <<if $weddingPlanned == 1>> - marrying - <<elseif $weddingPlanned == 2>> - sharing - <<elseif $weddingPlanned == 3>> - knocking up - <</if>> - <<print "[[SlaveFullName(_slave1)|Slave Interact][$AS = _slave1.ID]]">><<if _ML > 2>>, <<elseif _ML == 2>> and <<print "[[SlaveFullName(_slave2)|Slave Interact][$AS = _slave2.ID]]">><</if>><<if _ML > 2>><<print "[[SlaveFullName(_slave2)|Slave Interact][$AS = _slave2.ID]]">><<if _ML == 3>> and <<else>>, <</if>><<print "[[SlaveFullName(_slave3)|Slave Interact][$AS = _slave3.ID]]">><<if _ML == 4>> and <<print "[[SlaveFullName(_slave4)|Slave Interact][$AS = _slave4.ID]]">><</if>> <<if $weddingPlanned == 2>>with your honored guests<</if>><</if>>. - [[Cancel it|Manage Personal Affairs][$weddingPlanned = -1, $marrying = []]] - </p> -<</if>> - -<<if $FCTV.receiver > 0>> - <h2>FCTV</h2> - - <p> - <<if $FCTV.pcViewership.frequency == 1>> - You make sure to tune in to FCTV at least once a week. [[Watch every other week|Manage Personal Affairs][$FCTV.pcViewership.frequency = 2]] | [[Watch once a month|Manage Personal Affairs][$FCTV.pcViewership.frequency = 4]] | [[Ignore it|Manage Personal Affairs][$FCTV.pcViewership.frequency = -1]] - <<elseif $FCTV.pcViewership.frequency == 2>> - You make sure to tune in to FCTV at least every two weeks. [[Watch every week|Manage Personal Affairs][$FCTV.pcViewership.frequency = 1]] | [[Watch once a month|Manage Personal Affairs][$FCTV.pcViewership.frequency = 4]] | [[Ignore it|Manage Personal Affairs][$FCTV.pcViewership.frequency = -1]] - <<elseif $FCTV.pcViewership.frequency == 4>> - You make sure to check in on FCTV at least once a month. [[Watch every week|Manage Personal Affairs][$FCTV.pcViewership.frequency = 1]] | [[Watch every other week|Manage Personal Affairs][$FCTV.pcViewership.frequency = 2]] | [[Ignore it|Manage Personal Affairs][$FCTV.pcViewership.frequency = -1]] - <<else>> - You don't watch FCTV. [[Watch every week|Manage Personal Affairs][$FCTV.pcViewership.frequency = 1]] | [[Watch every other week|Manage Personal Affairs][$FCTV.pcViewership.frequency = 2]] | [[Watch once a month|Manage Personal Affairs][$FCTV.pcViewership.frequency = 4]] - <</if>> - <<if $saveImported > 0 && !$FCTV.remote>> - <div> - You know TVs should have a remote. [[Buy one yourself|Manage Personal Affairs][$FCTV.remote = 1, cashX(forceNeg(100*$upgradeMultiplierTrade), "capEx")]] - </div> - <</if>> - </p> -<</if>> - -<span id="reminder"></span> -<<script>> - $(document).one(':passagedisplay', () => { - $('#reminder').append( - App.Reminders.fullDisplay() - ); - }); -<</script>> - -<h2>Personal Skills</h2> - -<p> - You ponder what skills may be useful in running your arcology. - <div> - Trading: - <<if $PC.skill.trading >= 100>> - You are a master at economics and trading. - <<elseif $PC.skill.trading >= 80>> - You are an expert at economics and trading. - <<elseif $PC.skill.trading >= 60>> - You are skilled in economics and trading. - <<elseif $PC.skill.trading >= 40>> - You know some things about economics and trading. - <<elseif $PC.skill.trading >= 20>> - You are a beginner in economics. - <<elseif $PC.skill.trading >= 0>> - You know only the basics of trading. - <<elseif $PC.skill.trading >= -20>> - You know how to haggle a little. - <<elseif $PC.skill.trading >= -40>> - You know how to shop around. - <<elseif $PC.skill.trading >= -60>> - You know not to pay sticker price. - <<elseif $PC.skill.trading >= -80>> - People always give you discounts, but you never save any money. - <<else>> - They said it was a bear market, so where are the bears? - <</if>> - </div> - <div> - Warfare: - <<if $PC.skill.warfare >= 100>> - You are a master of warfare. - <<elseif $PC.skill.warfare >= 80>> - You are an expert at tactics and strategy. - <<elseif $PC.skill.warfare >= 60>> - You are skilled in combat. - <<elseif $PC.skill.warfare >= 40>> - You know some things about combat. - <<elseif $PC.skill.warfare >= 20>> - You are a beginner in tactics and strategy. - <<elseif $PC.skill.warfare >= 0>> - You know only the basics of fighting. - <<elseif $PC.skill.warfare >= -20>> - You know how to hold a gun. - <<elseif $PC.skill.warfare >= -40>> - You know how to stab with a knife. - <<elseif $PC.skill.warfare >= -60>> - Go for the throat? - <<elseif $PC.skill.warfare >= -80>> - Just kick them in the balls, right? - <<else>> - People like you are usually the first raped in a war. - <</if>> - </div> - <div> - Slaving: - <<if $PC.skill.slaving >= 100>> - You are a master slaver. - <<elseif $PC.skill.slaving >= 80>> - You are an expert at enslaving. - <<elseif $PC.skill.slaving >= 60>> - You are skilled in slaving. - <<elseif $PC.skill.slaving >= 40>> - You know some things about getting slaves. - <<elseif $PC.skill.slaving >= 20>> - You are a beginner in slaving. - <<elseif $PC.skill.slaving >= 0>> - You know only the basics of slaving. - <<elseif $PC.skill.slaving >= -20>> - You know how to avoid becoming a slave. - <<elseif $PC.skill.slaving >= -40>> - You know to read contracts before you sign them. - <<elseif $PC.skill.slaving >= -60>> - You know to be careful. - <<elseif $PC.skill.slaving >= -80>> - You know better than to trust anyone. - <<else>> - It would be easy to enslave you. - <</if>> - </div> - <div> - Engineering: - <<if $PC.skill.engineering >= 100>> - You are a master engineer. - <<elseif $PC.skill.engineering >= 80>> - You are an expert at engineering. - <<elseif $PC.skill.engineering >= 60>> - You are skilled in engineering. - <<elseif $PC.skill.engineering >= 40>> - You know some things about engineering. - <<elseif $PC.skill.engineering >= 20>> - You are a beginner in engineering. - <<elseif $PC.skill.engineering >= 0>> - You know only the basics of engineering. - <<elseif $PC.skill.engineering >= -20>> - You can build a gingerbread house that doesn't collapse. - <<elseif $PC.skill.engineering >= -40>> - You can tie a tight knot, does that count? - <<elseif $PC.skill.engineering >= -60>> - Glue is your friend; lots of it. - <<elseif $PC.skill.engineering >= -80>> - You know better than to even try to build something. - <<else>> - You can cook; that's sort of like building something, right? - <</if>> - </div> - <div> - Medicine: - <<if $PC.skill.medicine >= 100>> - You are a master surgeon. - <<elseif $PC.skill.medicine >= 80>> - You are an expert at medicine and surgery. - <<elseif $PC.skill.medicine >= 60>> - You are skilled in surgery. - <<elseif $PC.skill.medicine >= 40>> - You know some things about medicine. - <<elseif $PC.skill.medicine >= 20>> - You are a beginner in medicine. - <<elseif $PC.skill.medicine >= 0>> - You know the basics of treating injuries. - <<elseif $PC.skill.medicine >= -20>> - You can stop a wound from getting infected. - <<elseif $PC.skill.medicine >= -40>> - Gauze is your friend. Just keep wrapping. - <<elseif $PC.skill.medicine >= -60>> - You know how to apply a band-aid. - <<elseif $PC.skill.medicine >= -80>> - Cure-alls are wonderful. Why aren't they sold in stores, though? - <<else>> - Alcohol makes pain go away, right? - <</if>> - </div> - <div> - Hacking: - <<if $PC.skill.hacking >= 100>> - You are a master of hacking. - <<elseif $PC.skill.hacking >= 80>> - You are an expert at hacking. - <<elseif $PC.skill.hacking >= 60>> - You are skilled in hacking. - <<elseif $PC.skill.hacking >= 40>> - You know some things about hacking. - <<elseif $PC.skill.hacking >= 20>> - You are a beginner in hacking. - <<elseif $PC.skill.hacking >= 0>> - You know only the basics of hacking. - <<elseif $PC.skill.hacking >= -20>> - You know how to click a mouse. - <<elseif $PC.skill.hacking >= -40>> - Enter does something? - <<elseif $PC.skill.hacking >= -60>> - Where is the "any" key? - <<elseif $PC.skill.hacking >= -80>> - You can push the power button, good job. - <<else>> - This black box thingy is magical. - <</if>> - </div> -</p> - -<h2>Reputation</h2> -<h3>Name</h3> - -<p> - On formal occasions, you are announced as <<= PCTitle()>>. By slaves, however, you prefer to be called <<= properMaster()>>. - <div> - <span id="result"> - <<if ndef $PC.customTitle>> - <<link "Set a custom title for slaves to address you">> - <<replace "#result">> - Custom title: <<textbox "$PC.customTitle" $PC.customTitle>> - <<link "Apply">> - <<replace "#result">> - Your title is now $PC.customTitle. - <<set $PC.customTitleLisp = lispReplace($PC.customTitle)>> - <</replace>> - <</link>> - <</replace>> - <</link>> - <<else>> - Your custom title is <<textbox "$PC.customTitle" $PC.customTitle>> - <<link "Apply">> - <<replace "#result">> - Your title is now $PC.customTitle. - <<set $PC.customTitleLisp = lispReplace($PC.customTitle)>> - <</replace>> - <</link>> | - <<link "Stop using a custom title">> - <<replace "#result">> - You stop using a custom title - <<set $PC.customTitle = undefined>> - <<set $PC.customTitleLisp = undefined>> - <</replace>> - <</link>> - <</if>> - </span> - </div> - - <div> - <span id="nameResult"> - <<link "Rename yourself">> - <<replace "#nameResult">> - New name: <<textbox "_PCNamet" $PC.slaveName>> - <<link "Apply">> - <<run repX(-500, "event")>> - <<replace "#nameResult">> - <<set $PC.slaveName = _PCNamet>> - You will now be known as <<= PlayerName()>>. - <</replace>> - <</link>> - <</replace>> - <</link>> <span class="detail">Will cost you some reputation.</span> - </span> - </div> -</p> - -<<if $PC.degeneracy > 0>> - <h3>Rumors</h3> - - <p> - <<if $PC.degeneracy > 100>> - There are severe and devastating rumors about you spreading across the arcology. - <<elseif $PC.degeneracy > 75>> - There are severe rumors about you spreading across the arcology. - <<elseif $PC.degeneracy > 50>> - There are bad rumors about you spreading across the arcology. - <<elseif $PC.degeneracy > 25>> - There are rumors about you spreading across the arcology. - <<elseif $PC.degeneracy > 10>> - There are minor rumors about you spreading across the arcology. - <<else>> - The occasional rumor about you can be heard throughout the arcology. - <</if>> - </p> -<</if>> - -<h3>Family</h3> -<p> - <span id="family"> - <span id="family-tree-link"> - <<link "Pull up the file on your family tree.">> - <<replace #family-tree-link>> - <<includeDOM renderFamilyTree($slaves, -1)>> - <</replace>> - <</link>> - </span> - </span> - <<if totalPlayerRelatives($PC) > 0 || ($showMissingSlaves && ($PC.mother in $missingTable || $PC.father in $missingTable))>> - <div> - <<= App.Desc.family($PC)>> - </div> - <</if>> -</p> - -<<if $PC.vagina != -1>> -<h2>Contraceptives and Fertility</h2> - -<p> - <span id="mini-scene"> - <<if $PC.preg < 6 && $PC.pregKnown == 1>> - Your period is late, so the first thing you do is test yourself for a potential pregnancy: @@.lime;you are pregnant.@@ - <<if ($arcologies[0].FSRestart == "unset" || $eugenicsFullControl == 1 || ($PC.pregSource != -1 && $PC.pregSource != -6))>> - <<link "Abort your child">><<replace "#mini-scene">><<run TerminatePregnancy($PC)>><<print "You take a syringe filled with abortifacients and make yourself comfortable. Injecting the vial through your belly into your womb, your close your eyes and wait for what is coming. Once you feel it is over, you clean yourself up and go on your way, child free.">><</replace>><</link>> - <</if>> - <<elseif $PC.labor == 1>> - You are beginning to feel contractions; you'll be giving birth soon. - <<elseif $PC.preg >= 39>> - Your due date is looming, but your <<if $PC.pregType > 1>>children don't<<else>>child doesn't<</if>> seem to be interested in coming out just yet. [[Induce childbirth|Manage Personal Affairs][$PC.labor = 1]] - <<elseif $PC.pregKnown == 1>> - You're pregnant, something rather unbecoming for an arcology owner. - <<if ($arcologies[0].FSRestart == "unset" || $eugenicsFullControl == 1 || ($PC.pregSource != -1 && $PC.pregSource != -6))>> - <<link "Abort your child">><<replace "#mini-scene">><<run TerminatePregnancy($PC)>><<print "You take a syringe filled with abortifacients and make yourself comfortable. Injecting the vial through your belly into your womb, your close your eyes and wait for what is coming. Once you feel it is over, you clean yourself up and go on your way, child free.">><</replace>><</link>> - <</if>> - <</if>> - </span> -</p> - -<p> - <<if $PC.counter.birthsTotal > 0>> - <div> - In total, you have given birth to: - <<if $PC.counter.birthElite > 0>> - <div> - <<print $PC.counter.birthElite>> bab<<if $PC.counter.birthElite > 1>>ies<<else>>y<</if>> for the Societal Elite. - </div> - <</if>> - <<if $PC.counter.birthMaster > 0>> - <div> - <<print $PC.counter.birthMaster>> bab<<if $PC.counter.birthMaster > 1>>ies<<else>>y<</if>> for your former Master. - </div> - <</if>> - <<if $PC.counter.birthClient > 0>> - <div> - <<print $PC.counter.birthClient>> bab<<if $PC.counter.birthClient > 1>>ies<<else>>y<</if>> from clients you've slept with. - </div> - <</if>> - <<if $PC.counter.birthDegenerate > 0>> - <div> - <<print $PC.counter.birthDegenerate>> bastard<<if $PC.counter.birthDegenerate > 1>>s<</if>> from getting fucked by slaves. - </div> - <</if>> - <<if $PC.counter.birthArcOwner > 0>> - <div> - <<print $PC.counter.birthArcOwner>> bab<<if $PC.counter.birthArcOwner > 1>>ies<<else>>y<</if>> from your time with male arcology owners. - </div> - <</if>> - <<if $PC.counter.birthCitizen > 0>> - <div> - <<print $PC.counter.birthCitizen>> bab<<if $PC.counter.birthCitizen > 1>>ies<<else>>y<</if>> from sex with arcology citizens. - </div> - <</if>> - <<if $PC.counter.birthOther > 0>> - <div> - <<print $PC.counter.birthOther>> bab<<if $PC.counter.birthOther > 1>>ies<<else>>y<</if>> from sources you can't quite recall. - </div> - <</if>> - <<if $PC.counter.birthSelf > 0>> - <div> - <<print $PC.counter.birthSelf>> bab<<if $PC.counter.birthSelf > 1>>ies<<else>>y<</if>> that <<if $PC.counter.birthSelf > 1>>are<<else>>is<</if>> literally all you. - </div> - <</if>> - <<if $PC.counter.birthLab > 0>> - <div> - <<print $PC.counter.birthLab>> bab<<if $PC.counter.birthLab > 1>>ies<<else>>y<</if>> specially designed in the lab. - </div> - <</if>> - </div> - <</if>> - <<if $PC.counter.slavesKnockedUp > 0>> - <div> - <<if $PC.dick > 0>> - You've knocked up <<print num($PC.counter.slavesKnockedUp)>> fertile slave girl<<if $PC.counter.slavesKnockedUp > 1>>s<</if>><<if $PC.counter.slavesFathered > 0>> and fathered <<print num($PC.counter.slavesFathered)>> new slave<<if $PC.counter.slavesFathered > 1>>s<</if>><</if>> as an arcology owner so far. - <<else>> - Before your sex change, you knocked up <<print num($PC.counter.slavesKnockedUp)>> fertile slave girl<<if $PC.counter.slavesKnockedUp > 1>>s<</if>><<if $PC.counter.slavesFathered > 0>> and fathered <<print num($PC.counter.slavesFathered)>> new slave<<if $PC.counter.slavesFathered > 1>>s<</if>><</if>>. - <</if>> - </div> - <<else>> - <<if $PC.counter.slavesFathered > 0>> - <div> - <<if $PC.dick != 0>> - You've fathered <<print num($PC.counter.slavesFathered)>> new slave<<if $PC.counter.slavesFathered > 1>>s<</if>> as an arcology owner so far. - <<else>> - Before your sex change, you fathered <<print num($PC.counter.slavesFathered)>> new slave<<if $PC.counter.slavesFathered > 1>>s<</if>>. - <</if>> - </div> - <</if>> - <</if>> - - <div> - <<if $PC.preg >= 8>> - You're currently <<print $PC.preg>> week<<if $PC.preg > 1>>s<</if>> pregnant, so contraception doesn't matter right now. - <<elseif $PC.preg >= 6>> - You're having morning sickness. - <<elseif $PC.preg > 1>> - You've missed your period. This could be bad. - <<elseif $PC.preg > 0>> - Your fertile pussy has been thoroughly seeded; there is a chance you are pregnant. - <<if ($arcologies[0].FSRestart == "unset" || $eugenicsFullControl == 1 || ($PC.pregSource != -1 && $PC.pregSource != -6))>> - <<link "Pop some morning after pills">><<set WombFlush($PC)>><<goto "Manage Personal Affairs">><</link>> - <</if>> - <<elseif $PC.pregWeek < 0>> - You're still recovering from your recent pregnancy. - <<elseif $PC.preg == -2>> - You're menopausal. Your time to bear children has passed. - <<elseif $PC.preg == -1>> - You're currently on birth control. - [[Stop taking it|Manage Personal Affairs][$PC.preg = 0]] - <<elseif $PC.preg == 0>> - You're currently fertile. - [[Start taking birth control|Manage Personal Affairs][$PC.preg = -1, $PC.fertDrugs = 0]] - <<set _toSearch = $PC.refreshment.toLowerCase(), _fertRefresh = 0>> - <<if _toSearch.indexOf("fertility") != -1>> - <<set _fertRefresh = 1>> - <</if>> - <div> - <<if $PC.fertDrugs == 1>> - You are currently taking fertility supplements<<if _fertRefresh == 1>>on top of the <<print $PC.refreshment>>s.<<else>>.<<if $PC.forcedFertDrugs > 0>> You feel a strange eagerness whenever you think of bareback sex.<</if>><</if>> [[Stop taking fertility drugs|Manage Personal Affairs][$PC.fertDrugs = 0]] - <<else>> - You are not on any fertility supplements<<if _fertRefresh == 1>>, other than the $PC.refreshment, of course.<<else>>.<<if $PC.forcedFertDrugs > 0>> You feel a strange eagerness whenever you think of bareback sex.<</if>><</if>> [[Start taking fertility drugs|Manage Personal Affairs][$PC.fertDrugs = 1]] - <</if>> - </div> - <</if>> - </div> - <<if ($PC.preg > 0 && $pregnancyMonitoringUpgrade == 1)>> - <div> - [[Inspect pregnancy|Analyze PC Pregnancy]] - </div> - <</if>> - <<if $PC.preg >= 0 && $PC.ovaries == 1 && $PC.ovaryAge < 47>> - <div> - [[Harvest and implant an egg|Surrogacy Workaround][$donatrix = $PC, $impregnatrix = "Undecided", $receptrix = "Undecided", $nextLink = "Manage Personal Affairs"]] - </div> - <</if>> -</p> - -<<if $arcologies[0].FSRestartDecoration >= 100>> - <p> - <<if $playerBred == 0>> - You are currently not bearing children for the Societal Elite. - [[List your womb as available|Manage Personal Affairs][$playerBred = 1, $playerBredTube = 0]] | [[Sign up for artificial insemination|Manage Personal Affairs][$playerBred = 1, $playerBredTube = 1]] - <<else>> - Your womb is dedicated to carrying the Societal Elites' children. - <<if $PC.counter.birthElite > 0>> - [[List your womb as unavailable|Manage Personal Affairs][$playerBred = 0]] - <<else>> - <span class="note">You must bear at least one child for the Societal Elite before removing yourself from the breeding program.</span> - <</if>> - <</if>> - </p> -<</if>> - -<<if $PC.preg == 0 && $PC.pregWeek == 0>> - <<if $dairyPiping == 1 && ($cumSlaves > 0 || $arcologies[0].FSPastoralistLaw == 1)>> - <p> - <<if $PC.skill.cumTap == 0>> - The tap connected to $dairyName has a variety of attachments, one of which being a very tantalizing dick-shaped nozzle. It looks like it would be a perfect fit for you, if you were curious, that is. - <div>[[No one is looking...|FSelf]]</div> - <<else>> - The tap connected to $dairyName is calling to you. Begging to let it fill you with cum again. If you wanted to try and go bigger, that is. - <div>[[Sounds fun!|FSelf]]</div> - <div><<link "You only want to get pregnant." "Manage Personal Affairs">><<set $PC.preg = 1, $PC.pregWeek = 1, $PC.pregSource = 0, $PC.pregKnown = 1>><<set $PC.pregType = setPregType($PC)>><<set WombImpregnate($PC, $PC.pregType, 0, 1)>><</link>></div> - <</if>> - </p> - <</if>> - <<if $PC.vagina >= 1 && $PC.dick != 0>> - <p> - <<if $PC.counter.birthSelf > 0>> - Who better to impregnate you than you? [[Impregnate yourself.|MpregSelf]] - <<else>> - You have an empty vagina, a working set of balls, and a strong craving for a hot creampie. Who better to give it to you than you? [[Grab an extra syringe.|MpregSelf]] - <</if>> - </p> - <</if>> -<</if>> - -<<else>> /* no vagina */ -<p> - -<<if $PC.counter.births > 0>> - <div> - Before your sex change, you had given birth to: - <<if $PC.counter.birthElite > 0>> - <div> - <<print num($PC.counter.birthElite)>> bab<<if $PC.counter.birthElite > 1>>ies<<else>>y<</if>> for the Societal Elite. - </div> - <</if>> - <<if $PC.counter.birthMaster > 0>> - <div> - <<print num($PC.counter.birthMaster)>> bab<<if $PC.counter.birthMaster > 1>>ies<<else>>y<</if>> for your former Master. - </div> - <</if>> - <<if $PC.counter.birthClient > 0>> - <div> - <<print num($PC.counter.birthClient)>> bab<<if $PC.counter.birthClient > 1>>ies<<else>>y<</if>> from clients you've slept with. - </div> - <</if>> - <<if $PC.counter.birthDegenerate > 0>> - <div> - <<print num($PC.counter.birthDegenerate)>> bastard<<if $PC.counter.birthDegenerate > 1>>s<</if>> from getting fucked by slaves. - </div> - <</if>> - <<if $PC.counter.birthArcOwner > 0>> - <div> - <<print num($PC.counter.birthArcOwner)>> bab<<if $PC.counter.birthArcOwner > 1>>ies<<else>>y<</if>> from your time with male arcology owners. - </div> - <</if>> - <<if $PC.counter.birthCitizen > 0>> - <div> - <<print num($PC.counter.birthCitizen)>> bab<<if $PC.counter.birthCitizen > 1>>ies<<else>>y<</if>> from sex with arcology citizens. - </div> - <</if>> - <<if $PC.counter.birthFutaSis > 0>> - <div> - <<print num($PC.counter.birthFutaSis)>> bab<<if $PC.counter.birthFutaSis > 1>>ies<<else>>y<</if>> conceived during orgies with the Futanari Sisters. - </div> - <</if>> - <<if $PC.counter.birthOther > 0>> - <div> - <<print num($PC.counter.birthOther)>> bab<<if $PC.counter.birthOther > 1>>ies<<else>>y<</if>> from sources you can't quite recall. - </div> - <</if>> - <<if $PC.counter.birthSelf > 0>> - <div> - <<print num($PC.counter.birthSelf)>> bab<<if $PC.counter.birthSelf > 1>>ies<<else>>y<</if>> that <<if $PC.counter.birthSelf > 1>>were<<else>>was<</if>> literally all you. - </div> - <</if>> - <<if $PC.counter.birthLab > 0>> - <div> - <<print $PC.counter.birthLab>> bab<<if $PC.counter.birthLab > 1>>ies<<else>>y<</if>> specially designed in the lab. - </div> - <</if>> - </div> -<</if>> -<div> - <<if $PC.counter.slavesKnockedUp > 0>> - You've knocked up <<print num($PC.counter.slavesKnockedUp)>> fertile slave girl<<if $PC.counter.slavesKnockedUp > 1>>s<</if>><<if $PC.counter.slavesFathered > 0>> and fathered <<print num($PC.counter.slavesFathered)>> new slave<<if $PC.counter.slavesFathered > 1>>s<</if>><</if>> as an arcology owner so far. - <<else>> - <<if $PC.counter.slavesFathered > 0>> - You've fathered <<print num($PC.counter.slavesFathered)>> new slave<<if $PC.counter.slavesFathered > 1>>s<</if>> as an arcology owner so far. - <</if>> - <</if>> -</div> - -</p> -<</if>> /* vagina check */ - -<<if $PC.lactation == 1>> - <h2>Lactation</h2> - <p> - Your breasts are laden with milk. - <<if $PC.rules.lactation == "sell">> - You are spending time with the penthouse milkers and making a quick ¤ from your efforts. [[Stop milking yourself|Manage Personal Affairs][$PC.rules.lactation = "none"]] | [[Stop using the milkers|Manage Personal Affairs][$PC.rules.lactation = "maintain"]] - <<elseif $PC.rules.lactation == "maintain">> - You are taking the time to keep yourself lactating. [[Stop milking yourself|Manage Personal Affairs][$PC.rules.lactation = "none"]]<<if $servantMilkers == 1>> | [[Use the penthouse milkers|Manage Personal Affairs][$PC.rules.lactation = "sell"]]<</if>> - <<else>> - You are currently letting nature run its course. [[Keep yourself milked|Manage Personal Affairs][$PC.rules.lactation = "maintain"]]<<if $servantMilkers == 1>> | [[Use the penthouse milkers|Manage Personal Affairs][$PC.rules.lactation = "sell"]]<</if>> - <</if>> - </p> -<</if>> - -<h2>Drugs</h2> - -<p> - <<if $PC.staminaPills == 1>> - You are currently taking stamina enhancing pills in order to enjoy more slaves per week. [[Stop taking stamina enhancing drugs|Manage Personal Affairs][$PC.staminaPills = 0]] - <<else>> - You are not on any stamina enhancers. [[More stamina means more sex|Manage Personal Affairs][$PC.staminaPills = 1]] - <</if>> -</p> - -<<if $propOutcome == 1 && $arcologies[0].FSRestart != "unset">> - <h2>Elite Breeder Qualifications</h2> - <p> <<print eliteBreedingExam()>> </p> -<</if>> diff --git a/src/pregmod/pRaped.tw b/src/pregmod/pRaped.tw deleted file mode 100644 index 47405fe3dbb625c05b1c9055f235af29248a54ad..0000000000000000000000000000000000000000 --- a/src/pregmod/pRaped.tw +++ /dev/null @@ -1,338 +0,0 @@ -:: P raped [nobr] - -<<set $raped = 1, $nextLink = "Nonrandom Event", $returnTo = "Nonrandom Event">> - -<<setPlayerPronouns>> - -<<set _genParam = {minAge: 16, race: "nonslave", disableDisability: 1}>> -<<if $PC.vagina >= 0>> - <<set _rapist = GenerateNewSlave("XY", _genParam)>> - <<set _rapist.dick = 6>> - <<set _rapist.balls = 5>> - <<set _rapist.boobs = 0>> - <<set _rapist.waist = 50>> - <<set _rapist.skill.oral = 0>> - <<set _rapist.skill.anal = 0>> -<<else>> - <<set _rapist = GenerateNewSlave("XX", _genParam)>> - <<set _rapist.vagina = 1>> - <<set _rapist.preg = 0>> - <<set _rapist.weight = random(-20,30)>> - <<set _rapist.waist = -20>> -<</if>> -<<set _rapist.origin = "You sentenced $him to enslavement for the attempted rape of a free " + _womanP + ".">> -<<set _rapist.devotion = -100>> -<<set _rapist.trust = -100>> -<<run setHealth(_rapist, jsRandom(-40, -20), normalRandInt(15, 3), undefined, 1, jsRandom(30, 80))>> -<<set _rapist.anus = 0>> -<<set _rapist.behavioralFlaw = "arrogant">> -<<set _rapist.sexualFlaw = "judgemental">> - -<<setLocalPronouns _rapist>> - -While returning from a meeting with a prospective investor, an unfortunate wrong turn has led you into a rather seedy area of your arcology. You feel distinctly uncomfortable for some reason. - -<<if $PC.career == "mercenary" || $PC.skill.warfare >= 85>> - The moment you hear the sound of the knife unsheathe your reflexes take over. With a single strike, the $woman tailing you lies in a heap on the ground. - <<set $raped = 0>> -<<elseif $PC.career == "slaver" || $PC.skill.warfare >= 45>> - The moment you notice an arm coming around from behind you does your training kick in. You quickly disarm the assailant and knock them to the floor before placing them in a choke-hold. Once they are subdued, you stand back to decide what to do next. - <<set $raped = 0>> -<<elseif $PC.career == "gang">> - The moment you hear the sound of the knife unsheathe your reflexes take over. With a single stab, your own shiv is buried in $his chest, incapacitating $him. - <<set $raped = 0>> -<<else>> - You stifle a <<if $PC.title == 1>>swear<<else>>scream<</if>> when you feel your arm grabbed and the knife pressed to your throat, knowing that it will only end badly for you in this place. -<</if>> -<br><br> -<<if $raped == 1>> - <<set $fcnn.push("...plans for increased security measures, but refused to answer questions regarding...")>> - <<if $PC.vagina >= 0>> - "Well, well, well, look what <<if $PC.belly >= 5000 || $PC.preg >= 20>>waddled<<else>>walked<</if>> into my territory. If it isn't $PC.slaveName, come to grace me with _hisP presence." - <<else>> - "I've been watching you ever since you first moved in, $PC.slaveName, waiting for the perfect moment to make you mine. We are going to have a little fun, you and I." - <</if>> - The $woman binds your hands behind you, all the while keeping the knife to your throat. "Smart keeping your mouth shut; maybe I won't have to hurt you. Heh, I know what you're thinking, that you'll find out who I am and punish me. Don't worry, I made sure to not to leave you any trails to follow. Now let's see what we have here." - - <<if $PC.vagina >= 0>> - With $his free hand, $he begins to explore your vulnerable body. - <<switch $PC.career>> - <<case "wealth">> - <<if $PC.boobs >= 300>> - "Nice and supple. How much did you have to pay for these babies?" he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - "Couldn't afford an abortion after you took over? How sad," he chuckles as he rubs your pregnant belly. - <</if>> - <<if $PC.dick > 0>> - "Went with the full package didn't you?" he mocks as he flicks the tip of your stiffening cock. - <</if>> - <<case "capitalist">> - <<if $PC.boobs >= 300>> - "Nice and supple. Bet these got you some great deals with guys, didn't they?" he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - "Sleeping with guys to close deals? Such a slut," he chuckles as he rubs your pregnant belly. - <</if>> - <<if $PC.dick > 0>> - "Guess you fuck people over in more ways than one, don't you?" he mocks as he flicks the tip of your stiffening cock. - <</if>> - <<case "engineer">> - <<if $PC.boobs >= 300>> - "Nice and supple. Did the other engineers care about your designs or just your tits?" he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - "I can see why your designs were so popular, you fucked your way into the spotlight!" he chuckles as he rubs your pregnant belly. - <</if>> - <<if $PC.dick > 0>> - "Well you do know how to erect things, don't you?" he mocks as he flicks the tip of your stiffening cock. - <</if>> - <<case "medicine">> - <<if $PC.boobs >= 300>> - "Nice and supple. Did you implant them yourself?" he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - <<if $PC.dick > 0>> - "Look at that belly! I bet you inseminated yourself with your own seed," he chuckles as he rubs your pregnant belly. - <<else>> - "I see how you work. Mess up a surgery and give the guy a pity fuck. Surprised you couldn't get their spawn out of your belly though. Guess you aren't that good of a surgeon," he chuckles as he rubs your pregnant belly. - <</if>> - <</if>> - <<if $PC.dick > 0>> - "I'm impressed. Your woman impression is quite good. Did you do the surgery yourself?" he mocks as he flicks the tip of your stiffening cock. "Still going to fuck you though." - <</if>> - <<case "celebrity">> - <<if $PC.boobs >= 300>> - "Nice and supple. I wonder how many guys jacked off to your pictures?" he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - "I can see how you got so popular!" he chuckles as he rubs your pregnant belly. - <</if>> - <<if $PC.dick > 0>> - "How much tape did it take to hold this guy down?" he mocks as he flicks the tip of your stiffening cock. - <</if>> - <<case "escort">> - <<if $PC.boobs >= 300>> - "Nice and soft. How many dicks have been between these babies?" he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - "What kind of whore doesn't know about protection?" he chuckles as he rubs your pregnant belly. - <</if>> - <<if $PC.dick > 0>> - "So, did you ever get to use this when you were a prostitute?" he mocks as he flicks the tip of your stiffening cock. - <</if>> - <<case "servant">> - <<if $PC.boobs >= 300>> - "Nice and supple. Bet your Master spent a fortune making these so nice," he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - "Holding on to your Master's final gift are you?" he chuckles as he rubs your pregnant belly. - <</if>> - <<if $PC.dick > 0>> - "When your Master first undressed you, what did he think of his 'girl'?" he mocks as he flicks the tip of your stiffening cock. - <</if>> - <<case "BlackHat">> - <<if $PC.boobs >= 300>> - "Nice and supple. What are the odds that I can find these babies on the internet?" he smirks as he gropes your breasts. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>> - "You'd think someone so skilled at breaking security would understand protection themselves. Or did you trade your pussy for information?" he chuckles as he rubs your pregnant belly. - <</if>> - <<if $PC.dick > 0>> - "Trying to catch a signal with that?" he mocks as he flicks the tip of your stiffening cock. - <</if>> - <</switch>> - Finally he reaches your moistening pussy. "Already wet are we? Glad you know your place," he states as he pulls your clothes off and bends you over.<<if $PC.vagina == 0>> "And you still have your innocence, how delightful!"<</if>> - <br><br> - You can feel the head of his cock teasing your - <<if $PC.vagina == 0>> - virgin pussy; you grit your teeth knowing what will come next. Without mercy, he @@.red;tears through your hymen@@ and forces himself as deep as your tight pussy lets him. You choke back a sob as he struggles to hilt himself in you. He must have undergone surgery or something because there is no way your body can handle such a monster. You're in agony already - you can't fathom what will happen when he loses his patience. - <<else>> - pussy lips; you hope it feels bigger than it really is. As he struggles to force it into you, you regret thinking about it. He must have undergone surgery or something because he fills you completely. You feel weak just from him sticking it in, you can't fathom what will happen once he starts thrusting. - <</if>> - You soon find out as he wastes no time starting slow. He violently rams his oversized cock deep into you, threatening to penetrate your cervix with each thrust. He quickens his pace, fucking you like a beast. - <<if $PC.preg < 1>> - <<if random(1,100) > 60>> - His hand rises to your lips and forces something into your mouth. "Swallow it." You obey, hoping to just get this over with. - <<set $PC.forcedFertDrugs += 3>> - <</if>> - With one final thrust, he forces through your battered cervix and unloads in the depths of your <<if canGetPregnant($PC)>>fertile <</if>>womb. - <<else>> - With one final thrust, he forces it in as deep as he can into you and blows his seed deep in your aching cunt. - <</if>> - <<if $PC.preg >= 20 || $PC.belly >= 5000>>"Now your child<<if $PC.pregType > 1>>ren<</if>> will know what a real man's sperm is like!" <</if>> - He shoves you to the ground, pussy gaping from the size of his shaft and leaking his huge load all over yourself. By the time you loosen your bindings, he is long gone. - <br><br> - It would be prudent to up security in your arcology. That or take a guard along when you leave the penthouse. Such a thing, happening to you. You can't allow such an indignity to happen again, <<if $PC.vagina == 0>>not that you'll ever get your first time back<<else>>you think to yourself<</if>>, as you try to coax his sperm from your abused pussy. - <<if canGetPregnant($PC)>> - For some reason your body feels really satisfied, despite <<if $PC.vagina == 0>>what transpired<<else>>not climaxing<</if>>... Is this what it feels like to be bred by someone so dominant? You should take a pregnancy test right away and make sure he didn't knock you up. - <<= knockMeUp($PC, 100, 0, -2, 1)>> - <</if>> - <<if $PC.vagina == 0>><<set $PC.vagina++>><</if>> - <<else>> - With $his free hand, $he begins to explore your bound body. - <<switch $PC.career>> - <<case "wealth">> - <<if $PC.boobs >= 300>> - "Spared no expenses for these babies, did you?" $he smirks as $he gropes your breasts. - <</if>> - $He slips $his hand down your pants. "Now there's the money maker!" - <<case "capitalist">> - <<if $PC.boobs >= 300>> - "Ever wonder if they were listening to you or just ogling the man with the breasts?" $he smirks as $he gropes your breasts. - <</if>> - $He slips $his hand down your pants. "Now that explains how you were so successful!" - <<case "engineer">> - <<if $PC.boobs >= 300>> - "How did you get any work done with these hanging over your designs?" $he smirks as $he gropes your breasts. - <</if>> - $He slips $his hand down your pants. "I see what kind of tools you like. Big and strong!" - <<case "medicine">> - <<if $PC.boobs >= 300>> - "I'm sure you had quite the number of clients after a pair of these," $he smirks as $he gropes your breasts. - <</if>> - $He slips $his hand down your pants. "Huh, I wonder if that's real..." - <<case "celebrity">> - <<if $PC.boobs >= 300>> - "Nice and supple. Just like I'd expect from a man sporting tits." $he smirks as $he gropes your breasts. - <</if>> - $He slips $his hand down your pants; "Oh, now those tabloids make sense." - <<case "escort">> - <<if $PC.boobs >= 300>> - "With these hanging out, how many men tried to pick you up?" $he smirks as $he gropes your breasts. - <</if>> - $He slips $his hand down your pants. "Now there's the money maker!" - <<case "servant">> - <<if $PC.boobs >= 300>> - "Did your Master even ask before he stuck you with these?" $he smirks as $he gropes your breasts. - <</if>> - $He slips $his hand down your pants. "Now that's surprising. I expected something smaller." - <<case "BlackHat">> - <<if $PC.boobs >= 300>> - "Nice and supple. What are the odds that I can find these babies on the internet?" $he smirks as $he gropes your breasts. - <</if>> - $He slips $his hand down your pants. "You wouldn't mind if I download a few files now would you? Well, not that it matters." - <</switch>> - Satisfied, $he pulls your cock out of its increasingly cramped confines. "Look at him grow, he knows what comes next..." $He teases as $he pushes you to the ground and climbs on top of you. - <br><br> - $He lines $himself up with the tip of your dick before taking its entire length into $himself. $He lets out a lust filled moan as $he begins to bounce on your traitorous member. You can do nothing to stop $him from riding you to climax, so you just enjoy the sight of $his breasts bouncing to $his pace. As you feel your orgasm approaching, you try to time it so you can slip out of $him just before you blow your load, but you have no such luck. - "You really think I'd let you spoil my plans?" $he asks as $he grinds against you, making sure you cum deep in $his pussy. $He leans back and massages $his <<if $PC.balls >= 20>>taut <</if>>stomach, savoring the sensation of your seed seeping into $him. "That's it, make me a mommy." $He leans in close and you pop free of $his snatch. "Be a good _girlP and make this arcology a nice place for your bastard. I want to retire in luxury." $He blows you a kiss as $he stuffs a plug up $his vagina, redresses and heads on $his way. By the time you loosen your bindings, $he is long gone. - <br><br> - It would be prudent to up security in your arcology, that or take a guard along when you leave the penthouse. You can't allow such an indignity to happen again, nor do you need the stress of a bastard trying to seize control of your estate when you want to retire, but you wouldn't mind having your way with $him if you get the chance. - <</if>> - -<<else>> - - Now the only question is what to do with the would-be rapist. You could toss them out of the arcology, but it might be more fun to turn the tables on $him. - - <<set _ContractCost = 1000>> - <<set _slaveCost = slaveCost(_rapist)>> - <<set _slaveCost -= 1000>> - <br> - //Applying enslavement as punishment will cost <<print cashFormat(_ContractCost)>>. Doing so and then selling $him immediately will bring in approximately <<print cashFormat(_slaveCost)>>.// - <br> - <<includeDOM App.Desc.longSlave(_rapist, {market: "generic"})>> - - <span id="result"> - <<if $cash >= _ContractCost>> - <br><<link "Enslave $him">> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _rapist)>> - <<replace "#result">> - You complete the legalities and biometric scanning quickly and without fuss. The idiot will regret crossing you when $he wakes in the penthouse for basic slave induction. - <<includeDOM App.UI.newSlaveIntro(_rapist)>> - <</replace>> - <</link>> - <br><<link "Sentence $him to a day in the stocks, then enslave $him">> - <<run healthDamage(_rapist, 10)>> - <<set _rapist.behavioralFlaw = "odd">> - <<set _rapist.sexualFlaw = "hates penetration">> - <<set _rapist.anus = 2>> - <<run seX(_rapist, "oral", "public", "penetrative", 23)>> - <<run seX(_rapist, "anal", "public", "penetrative", 12)>> - <<if _rapist.vagina > -1>> - <<set _rapist.vagina = 2>> - <<run seX(_rapist, "vaginal", "public", "penetrative", 12)>> - <<if random(1,100) > 60 && isFertile(_rapist)>> - <<= knockMeUp(_rapist, 100, 0, -2, 1)>> - <</if>> - <<else>> - <<run seX(_rapist, "anal", "public", "penetrative", 12)>> /* even more anal */ - <</if>> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _rapist)>> - <<replace "#result">> - You declare $his holes fair game for the entire arcology. $He spends a torturous day in the stocks before being hauled in for enslavement, somewhat @@.health.dec;the worse for wear@@ and @@.red;acting oddly@@ due to $his ordeal, bruises all over $his body, cum leaking from $his @@.lime;loosened@@ anus<<if _rapist.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ - <<run repX(500, "event")>> - <<set $arcologies[0].prosperity += 2>> - <<includeDOM App.UI.newSlaveIntro(_rapist)>> - <</replace>> - <</link>> - <<if $arcade > 0>> - <br><<link "Enslave $him and sentence $him to a month in the arcade">> - <<= assignJob(_rapist, "be confined in the arcade")>> - <<set _rapist.sentence = 4>> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _rapist)>> - <<replace "#result">> - You complete the legalities and biometric scanning quickly and cautiously. The idiot will be in for a surprise when $he awakes to find $he can't move and a dick is in $his ass. - <<run newSlave(_rapist)>> /* skip New Slave Intro */ - <</replace>> - <</link>> - <</if>> - <<if $dairy > 0>> - <<if $dairyRestraintsSetting > 1>> - <br><<link "Enslave $him and send $him straight to the industrial dairy">> - <<= assignJob(_rapist, "work in the dairy")>> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _rapist)>> - <<replace "#result">> - You complete the legalities and biometric scanning quickly and cautiously. The idiot will wake up <<if $dairyStimulatorsSetting > 1>>in agony as $his anus takes the rectal hydration dildo<<else>>to find $his chest has begun swelling with milk<</if>>. - <<set _rapist.boobs += 300>> - <<run newSlave(_rapist)>> /* skip New Slave Intro */ - <</replace>> - <</link>> - <</if>> - <</if>> - <<if $farmyard > 0>> - <br><<link "Enslave $him and send $him straight to the farmyard">> - <<= assignJob(_rapist, "work as a farmhand")>> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _rapist)>> - <<replace "#result">> - You complete the legalities and biometric scanning quickly and cautiously. The idiot will wake up in $farmyardName, where $he will spend the rest of $his days working the fields<<if $farmyardShows == 1>> and <<if $seeBestiality == 1>>getting fucked by animals<<else>>putting on shows with animals<</if>><</if>>. - <<run newSlave(_rapist)>> /* skip New Slave Intro */ - <</replace>> - <</link>> - <</if>> - <<if $seeExtreme > 0>> - <br><<link "Punitively amputate $his limbs, and then enslave $him">> - <<run healthDamage(_rapist, 20)>> - <<run removeLimbs(_rapist, "all")>> - <<set _rapist.behavioralFlaw = "odd">> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _rapist)>> - <<replace "#result">> - You want $him to suffer for what $he tried to pull on you. You make sure $he is fully awake as $he is strapped into the autosurgery. You take great pleasure in watching $him struggle as $his limbs are taken, one by one. Of course, @@.health.dec;$his health is affected@@ and the horrible experience has left $him @@.red;acting oddly.@@ After $he has stabilized, it's off to the penthouse for basic slave induction. You'd like to see $him try and touch you again without arms and legs. - <</replace>> - <</link>> - <<if _rapist.balls > 0>> - <br><<link "Enslave the criminal and geld $him">> - <<run healthDamage(_rapist, 20)>> - <<set _rapist.balls = 0>> - <<set _rapist.devotion -= 25>> - <<set _rapist.trust -= 25>> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _rapist)>> - <<replace "#result">> - You want $him to suffer for what $he tried to pull on you. You make sure $he is fully awake as $he is strapped into the autosurgery, taking the time to roughly fondle $his balls. You take great pleasure in watching $him struggle as $his testicles are removed. Once $he can stand again, it's off to the penthouse for basic slave induction. - <<includeDOM App.UI.newSlaveIntro(_rapist)>> - <</replace>> - <</link>> - <</if>> - <</if>> - <<else>> - //You lack the necessary funds to enslave $him.// - <</if>> - <br><<link "Publicly flog the criminal">> - <<replace "#result">> - Naturally, the wretch will be thrown out of the arcology, but an example must first be made. Free people must understand that criminals who commit outrages against them will be severely punished. The protesting malefactor is stripped and flogged on the promenade before being escorted bleeding from the arcology. The public @@.green;approves of this harshness.@@ - <<run repX(500, "event")>> - <</replace>> - <</link>> - </span> - -<</if>> diff --git a/src/pregmod/rePregInventor.tw b/src/pregmod/rePregInventor.tw deleted file mode 100644 index ce35254b40a813e7a2769e94c2a0fc685d57b5ce..0000000000000000000000000000000000000000 --- a/src/pregmod/rePregInventor.tw +++ /dev/null @@ -1,1058 +0,0 @@ -:: RE preg inventor [nobr] - -<<set $nextButton = "Continue", $nextLink = "AS Dump", $returnTo = "RIE Eligibility Check">> - -<<set $activeSlave = $eventSlave>> -<<setAssistantPronouns>> -<<run App.Utils.setLocalPronouns($activeSlave)>> -<<run Enunciate($activeSlave)>> -<span id="art-frame"> -/* 000-250-006 */ -<<if $seeImages == 1>> - <<if $imageChoice == 1>> - <div class="imageRef lrgVector"><div class="mask"> </div><<SlaveArt $activeSlave 3 0>></div> - <<else>> - <div class="imageRef lrgRender"><div class="mask"> </div><<SlaveArt $activeSlave 3 0>></div> - <</if>> -<</if>> -/* 000-250-006 */ -</span> - -<<if $pregInventor == 0>> - <<set $pregInventorID = $activeSlave.ID>> - - Your broodmother, <<= App.UI.slaveDescriptionDialog($activeSlave)>>, asks to see you, so you have $him brought to your office. It takes your menial servants several minutes to safely produce $him as $his massive, bloated<<if $seeRace == 1>>, $activeSlave.race<</if>> womb is stretched so thin by its load that the sudden shock to $his body if $he were dropped might cause $him to explode. Both you and your babymaker are used to these circumstances at this point, however, and, as your servants work to lower $him to the soft carpeted floor at the center of your office without undue strain to $his belly, $he shoots you a provocative - <<if !hasAnyArms($activeSlave)>> - grin. - <<else>> - <<if $activeSlave.boobs >= 20000>> - grin and rubs the sides of $his debilitatingly large breasts with anticipation. - <<elseif ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>> - grin and pushes $his augmented tits together to give you a view of $his impressive cleavage. - <<elseif $activeSlave.boobs >= 3000>> - grin and hefts one of $his massive breasts<<if hasBothArms($activeSlave)>> with both hands<</if>>, sucking on $his nipple to give you a show while you wait. - <<else>> - grin and tweaks the nipples on $his pert breasts. - <</if>> - <</if>> - <br><br> - Once $he is safely resting on the ground, your slave - <<if hasAnyArms($activeSlave)>> - pushes up against it, stretching so that $he <<if canSee($activeSlave)>>can look you in the eyes<<else>>is face-to-face with you<</if>>. - <<else>> - blushes and wiggles $his stumps, looking down. - <</if>> - <<if canTalk($activeSlave)>> - "<<Master>>," $he <<say>>s, "I love being your hyperpregnant brood <<s>>lave. My poor <<if $eventSlave.mpreg == 1>>a<<ss>><</if>>pu<<ss>>y weep<<s>> every time a baby pa<<ss>>e<<s>> through it, and <<s>>o many have pa<<ss>>ed through — and, <<Master>>, it hurt<<s>>, <<s>>ometime<<s>>, but I love the feeling of my body <<s>>tretching fuller and fuller with life every day. There'<<s>> nothing I want more than to be your - <<if SlaveStatsChecker.checkForLisp($activeSlave)>> - <<= lispReplace(SlaveTitle($activeSlave))>> - <<else>> - <<print SlaveTitle($activeSlave)>> - <</if>> - until my body give<<s>> out. <<S>>o, <<Master>>, I really want to give <<s>>omething back to you for making my dream<<s>> come true." - <<else>> - <<if hasAnyArms($activeSlave)>> - $He signs to you that $he wants to give back to you for blessing $him with $his <<if $activeSlave.broodmother > 0>>permanently hyperpregnant<<else>>life-swollen<</if>> body. - <<else>> - Your personal assistant speaks, probably in response to a nonverbal cue from your slave. $He explains that your slave wishes to give back to you for blessing $him with $his <<if $activeSlave.broodmother > 0>>permanently hyperpregnant<<else>>life-swollen<</if>> body. - <</if>> - <</if>> - <br><br>The explanation has been going on for a while now, so you motion for your slave to get to the point. - <<if canTalk($activeSlave)>> - "<<Master>>," $he <<say>>s, "I want the whole world to love hyperpregnant baby ma<<ch>>ine<<s>> a<<s>> much a<<s>> I do. I know it'<<s>> <<s>>elfi<<sh>>, but I've been looking into way<<s>> to make <<s>>e<<x>> with broodmother<<s>> even better than it already i<<s>>. It feel<<s>> great to get fucked while I'm <<s>>o packed full and helple<<ss>>, but, if you'll let me try, I've got <<s>>ome idea<<s>> for making it even better for broodmother<<s>>. And, more importantly, <<Master>>, for you and any other potential partner<<s>>, too." - <<else>> - <<if hasAnyArms($activeSlave)>> - $He explains through gestures that $he's been thinking of ways to make sex with overly pregnant slaves more convenient and enjoyable and would like your permission to develop them. - <<else>> - Your assistant explains that the $girl has been thinking of ways to make sex with overly pregnant slaves more convenient and enjoyable and would like your permission to develop them. - <</if>> - <</if>> - - <br><br> - You consider $his offer. Will you support $him? - <br><br> - - <span id="result"> - <<link "No, and remind $him of $his place.">> - <<replace "#result">> - You calmly explain to your baby-filled broodmother that $he is property and expected to fulfill $his duties, not to think. $He is not to pursue this matter further. - <<if $activeSlave.trust < -95>> - You then rape $him, hard, to get your point across, ignoring $his moans of pain and the loud complaints from $his overfilled womb as it barely holds together under your assault. The bitch is delusional, idolizing $himself and $his position like this. $activeSlave.slaveName has been holding onto sanity by a thread with this idea about loving what $he is, but your rejection breaks something fundamental inside of $him. $He's a baby machine. $His body belongs to you. $His brain is just a vestigial accessory to $his womb and pussy. @@.red;$activeSlave.slaveName is broken.@@ $He will never question $his place again. - <<set $activeSlave.fetish = "mindbroken", $activeSlave.sexualQuirk = "none", $activeSlave.sexualFlaw = "none", $activeSlave.behavioralQuirk = "none", $activeSlave.behavioralFlaw = "none">> - <<= VCheck.Vaginal($activeSlave, 1)>> - <<elseif $activeSlave.trust < -20>> - You then fuck $him, hard, to get your point across, ignoring $his moans of pain and the loud complaints from $his overfilled womb as it barely holds together under your assault. When you finally get bored and - <<if $PC.dick != 0>> - shoot your load into $his - <<if ($activeSlave.vagina >= 10)>> - gaping pussy, - <<elseif ($activeSlave.vagina > 3)>> - loose pussy, - <<elseif ($activeSlave.vagina >= 1)>> - vagina, - <<else>> - surprisingly resilient, tight little pussy, - <</if>> - <<run VCheck.Vaginal($activeSlave, 1)>> - <<else>> - clench your legs around $his slutty head as $he drives your pussy over the edge with $his tongue, - <<set $activeSlave.counter.oral++, $oralTotal++>> - <</if>> - $he cries out in a reciprocating orgasm and then cries out a second time when, massive stomach shuddering, - <<if $activeSlave.broodmother > 1>> - $he begins to give birth to yet another child. You call your menials back to your office and decide to take a walk. By the time you're at the door, the head of $activeSlave.slaveName's next child is already cresting. - <<elseif $activeSlave.broodmother == 0 && $activeSlave.preg > $activeSlave.pregData.minLiveBirth+1>> - $his water breaks. You call your menials back to your office and decide to take a walk. As you pass by $him, it's clear that $he'll have more important things to think about it the coming day. - <<run startLabor($activeSlave)>> - <<else>> - $his brood shifts precariously. You call your menials back to your office and decide to take a walk. As you pass by $him, it's clear that $he'll be more concerned with staying whole than whatever foolish endeavors $he was planning. - <</if>> - $activeSlave.slaveName is now more @@.gold;fearful.@@ - <<set $activeSlave.trust -= 4>> - <<else>> - <<if canTalk($activeSlave)>> - "I'm <<s>>orry, <<Master>>," $he <<say>>s, "I ju<<s>>t thought, well... nevermind." - <<else>> - <<if hasAnyArms($activeSlave)>> - $He motions in apology, trying to hide $his extreme disappointment. - <<else>> - $He is mute and limbless, so it is nearly impossible for $him to communicate $his feelings without a great deal of forward planning and help from your AI assistant. Despite this, you can tell $he's disappointed. - <</if>> - <</if>> - <br><br> - <<if hasAnyCyberneticEyes($activeSlave)>> - $His pretty <<print App.Desc.eyesColor($activeSlave, "bionic")>> flash a shade cooler than normal and you can tell $he's struggling to accept your decision. - <<else>> - You can see tears brimming in $his <<print App.Desc.eyesColor($activeSlave)>>. - <</if>> - You kiss $him on the head, make sweet love to $him to improve $his mood, then have $him escorted out of your office. - <<= VCheck.Vaginal($activeSlave, 1)>> - You are certain you made the right choice. If possible, $activeSlave.slaveName is now more @@.hotpink;devoted.@@ - <<set $activeSlave.devotion += 5>> - <</if>> - <</replace>> - <</link>> - <br><<link "Yes, and offer to help $him in a... personal capacity">> - <<replace "#result">> - Being so close to the near-bursting womb of your slave for so long has got your loins stirring, and you hop up onto your desk, bringing your - <<if $PC.dick != 0>> - dick - <<else>> - vagina - <</if>> - level with the broodmother's mouth. You tell $him that you could be convinced to let $him explore $his interests. $He squeals in delight and - <<if $PC.dick != 0>> - wraps $his - <<if ($activeSlave.lips > 95)>> - plush mouth pussy - <<elseif ($activeSlave.lips > 70)>> - thick, dick sucking lips - <<elseif ($activeSlave.lips > 20)>> - lips - <<else>> - thin, almost childlike lips - <</if>> - around your penis. - <<if canTalk($activeSlave)>> - Between $his slurping and sucking, $he manages to get out enough intelligible words to give you a good idea about the sorts of things $he thinks could make sex with an enormously pregnant slave more fun. - <<else>> - <<if hasAnyArms($activeSlave)>> - While slurping and sucking, $he signs to you, communicating $his ideas about the sorts of things $he thinks could make sex with an enormously pregnant slave more fun. - <<else>> - $He focuses on slurping and sucking on your knob while your personal assistant explains $his ideas about the sorts of things $he thinks could make sex with an enormously pregnant slave more fun. - <</if>> - <</if>> - <<else>> - <<if canTalk($activeSlave)>> - buries $his eager tongue in your quim. Between sucking on your clit and moaning, $he manages to get out enough intelligible words to give you a good idea about the sorts of things $he thinks could make sex with an enormously pregnant slave more fun. - <<else>> - <<if hasAnyArms($activeSlave)>> - While burying $his tongue in your quim, $he signs to you, communicating $his ideas about the sorts of things $he thinks could make sex with an enormously pregnant slave more fun. - <<else>> - $He focuses burying $his tongue in your quim while your personal assistant explains $his ideas about the sorts of things $he thinks could make sex with an enormously pregnant slave more fun. - <</if>> - <</if>> - <</if>> - <<set $activeSlave.counter.oral++, $oralTotal++>> - While you're not interested in giving $him the funds necessary to make some of $his more outlandish ideas a reality, you're certainly excited by $his ideas regarding positions and hyperpregnant vaginal play. You tell $him to go for those and $he trills in delight, vibrating $his tongue - <<if $PC.dick != 0>> - along your dick and sending you over the edge. $He swallows your load, licking $his lips. - <<if canTalk($activeSlave)>> - "Make <<s>>ure to keep feeding me your cum," $he <<say>>s flirtatiously. "I'm eating for a //lot// more than two, after all." - <<else>> - <<if hasAnyArms($activeSlave)>> - $He signs to you, begging you to keep feeding $him your cum as $he's eating for a lot more than two. - <<else>> - $He then nuzzles your crotch possessively, looking up at your face with devoted eyes. - <</if>> - <</if>> - <<else>> - in your intimate spaces and sending you over the edge. $He removes $himself from your pussy and licks $his lips. - <<if canTalk($activeSlave)>> - "Make <<s>>ure to keep feeding me your pu<<ss>>y jui<<c>>e," $he <<say>>s flirtatiously. "I'm eating for a //lot// more than two, after all." - <<else>> - <<if hasAnyArms($activeSlave)>> - $He signs to you, begging you to keep feeding $him your pussy juice as $he's eating for a lot more than two. - <<else>> - $He then nuzzles your crotch possessively, looking up at your face with devoted eyes. - <</if>> - <</if>> - <</if>> - <br><br> - You congratulate yourself on having made the right decision as $activeSlave.slaveName @@.hotpink;grows ever closer to you,@@ and ever larger in $his middle, over the course of the next week. - <<set $activeSlave.devotion += 5>> - <</replace>> - <</link>> - <br><<link "Yes, and offer to fund $his endeavors for ¤10000">> - <<replace "#result">> - You are intrigued by $his offer. - <<if hasAnyArms($activeSlave)>> - You take $his - <<if $seeRace == 1>> - $activeSlave.race - <</if>> - hand<<if hasBothArms($activeSlave)>>s<</if>> in yours, noting their pleasant softness, and direct $him to explain. - <<else>> - You place a hand on $his exaggerated gut and direct $him to explain. - <</if>> - $He blushes, sexually stimulated by even this minor touch, and - <<if canTalk($activeSlave)>> - describes various ideas $he's had for tools and techniques that could improve an enormously pregnant girl's sexual potential. - <<else>> - <<if hasAnyArms($activeSlave)>> - signs, describing various ideas $he's had for tools and techniques that could improve an enormously pregnant girl's sexual potential. - <<else>> - wiggles a stump, prompting your personal assistant to describe various ideas $he's had for tools and techniques that could improve an enormously pregnant girl's sexual potential. - <</if>> - <</if>> - Picturing the actions as $he describes them gets - <<if $PC.dick != 0>> - you rock hard in short order - <<else>> - your pussy dripping with need in short order - <</if>> - and, as the description continues, you move around behind your broodmother, pushing $him up onto $his tremendous womb so that you can fuck $him against it. $His belly squashes down slightly under your weight, but less than you'd expect — $he's so packed full of children that $his stomach resists changing shape. $He wiggles $his hips as you - <<if $activeSlave.butt > 11>> - sink face first into $his warm, room filling ass cleavage - <<elseif $activeSlave.butt > 5>> - grab generous handfuls of $his humongous ass - <<elseif ($activeSlave.buttImplant/$activeSlave.butt) > .60>> - rest the weight of your upper body on $his implant inflated ass cheeks - <<elseif $activeSlave.butt > 2>> - slap $his generous ass - <<else>> - press down on $his petite little ass with your hips - <</if>> - and begin teasing $his pussy with - <<if $PC.dick != 0>> - the tip of your dick. - <<else>> - your fingers. - <</if>> - <br><br> - <<if canTalk($activeSlave)>> - "Ooh, <<Master>>," your slave <<say>>s, "if you keep thi<<s>> up you'll wake the babie<<s>>." - <<else>> - <<if hasAnyArms($activeSlave)>> - Your slave signs, teasingly implying that you'll wake the babies. - <<else>> - The skin of your slave's monumental belly flushes red and $he wiggles $his stumps in combined embarrassment and arousal. - <</if>> - <</if>> - <br><br> - Despite $his complaints, $he doesn't seem to mind once you start really fucking $him senseless. - <<= VCheck.Vaginal($activeSlave, 1)>> - Once you've finished melting your swollen "little" sex slave into a puddle of sexually satisfied goo, - <<if $PC.dick != 0>> - shooting your load into $his wanting pussy, - <<else>> - collapsing into orgasm on $his bloated body, - <</if>> - you call up your personal assistant, giving _himA orders to have your menials collect your exhausted breeder and to ensure $he has all the funds necessary to make $his perverted dreams a reality. $activeSlave.slaveName can only @@.hotpink;idolize you.@@ - <<run cashX(-10000, "event", $activeSlave)>> - <<set $activeSlave.devotion += 15>> - <<set $pregInventor = 1>> - <</replace>> - <</link>> - </span> - -<<elseif $pregInventor == 1>> - - Your broodmother, <<= App.UI.slaveDescriptionDialog($activeSlave)>>, has been using the resources you gave $him to expand the possibilities for sex with hyperpregnant slaves. $He has been working hard and is finally ready to show off $his results. Your assistant gives you a list of the slave's innovations and you decide to give one a try: - <br><br> - <span id="result"> - <<link "Have $him show off $his developments in the sport of advanced maternity swing gymnastics.">> - <<replace "#result">> - $He is brought into your office alongside $his invention: a customized maternity swing. It is a true marvel of Free Cities engineering, resembling something designed for use with large marine mammals rather than a sex aid for a pregnant $woman. It has been specially rigged to support both its user and their sexual partner, and to suspend them in the air, enabling them to explore sex positions that would otherwise be rendered impossible by a hyperpregnant slave's mass and size. Just watching the effort your menials expend squeezing the <<print SlaveTitle($activeSlave)>> into a device that would dwarf a normal person is enough to get you excited, and you're fully ready to enjoy some personal time with $him by the time they've hooked you both into the device. The maternity swing is controlled via a vocal command system and, as your menials retreat to give you time alone, you instruct it to lift both you and $him into the air. - <br><br> - The reinforced silk supports strain slightly under the weight of your slave's belly, but they make no noise, and you soon find yourself suspended in midair with $his - <<if $activeSlave.vagina >= 10>> - huge, weeping pussy lips - <<elseif $activeSlave.vagina >= 6>> - loose pussy - <<elseif $activeSlave.vagina >= 3>> - pussy - <<else>> - tight little pussy - <</if>> - at perfect eye level. You go down on $him to get $him primed and enjoy the feeling of - <<if hasAnyLegs($activeSlave)>> - $his leg<<if hasBothLegs($activeSlave)>>s<</if>> wrapping around your head - <<else>> - $his stumps squeezing the sides of your head - <</if>> - as you bring $him to climax. - <<set $activeSlave.counter.vaginal++, $vaginalTotal++>> - <br><br> - With gentle coaching from your slave, you rotate the two of you in the air so that $he can ride you reverse cowgirl style. <<= VCheck.Vaginal($activeSlave, 2)>> You then switch $him around, allowing $his belly to eclipse your vision entirely as $he rides you in the traditional cowgirl position. The contents of $his womb have exploded its weight to the point that this position would have previously been hazardous to both your health and $hers, if not completely impossible, and the illusion of having sex while perpetually on the knife's edge of being flattened by literal tons of baby packed slave flesh sends you over the edge. You - <<if $PC.dick != 0>> - ejaculate into $him, your cum dripping out of $his vagina, splattering on the ground below. - <<else>> - orgasm as you transition into scissoring with your tightly packed broodmare, keeping the fantasy of being crushed by $his body foremost in your mind. - <</if>> - <br><br> - You explore many other sexual positions before commanding the maternity swing to take you back to earth. You extricate yourself from the device, but leave $him inside of it. $He does a little twirl in the device, showing off the shape of $his hyper-inflated body<<if hasAnyLegs($activeSlave)>>, the tips of $his toes barely touching the ground<</if>>. - <br><br> - <<if canTalk($activeSlave)>> - "<<S>>o what did you think, <<Master>>?" $he asks. $He purses $his lips, waiting for your response. - <<else>> - $He motions to you, making it clear $he's waiting for your judgment. - <</if>> - <<set $activeSlave.devotion += 5>> - <br><br><span id="result2"> - <<link "Insult $him and halt all further training.">> - <<replace "#result2">> - As much as $his antics amused you, it's clear that $activeSlave.slaveName wasted your money. You calmly explain to $him that the next time $he has a "brilliant" idea, $he should keep it to $himself, then arrange to have $his "discoveries" disposed of. - <<if $activeSlave.trust < -95>> - The look of pride and accomplishment on $his face transforms into a look of crushing disappointment. You slap $him on the ass and then have your menials escort $him back to $his duties. The next time you see $him, the spark of life and vitality that drove $him has been fully extinguished. @@.red;$activeSlave.slaveName has broken.@@ Anything $he might have learned from this experience is lost in $his empty mind. $He will never question $his place, or anything else, again. - <<set $activeSlave.fetish = "mindbroken">> - <<elseif $activeSlave.trust < -20>> - The look of pride and accomplishment on $his face transforms into a look of crushing disappointment. $He apologizes for wasting your time and, cognizant of the power you hold over $him, promises never to do so again. @@.gold;$activeSlave.slaveName is now more fearful.@@ Though $he never bothers you with $his "ideas" again, you can tell @@.mediumorchid;$he no longer regards you as highly.@@ - <<set $activeSlave.trust -= 4>> - <<set $activeSlave.devotion -= 10>> - <<else>> - The look of pride and accomplishment on $his face transforms into a look of disappointment. @@.gold;$activeSlave.slaveName finds you less trust worthy@@ as a result of your unkindness, but $he soon gets over $his disappointment and begins thinking of ways to truly impress you. - <<set $activeSlave.trust -= 4>> - <</if>> - <</replace>> - <</link>> - <br><<link "Compliment $him but keep $his discoveries to yourself.">> - <<replace "#result2">> - You are impressed by $his ideas and arrange to have them implemented in a limited way in your arcology. You also arrange to keep $his discoveries secret, so as to hoard all the enjoyment of them for yourself. $activeSlave.slaveName doesn't mind. $He is @@.hotpink;simply happy@@ to have pleased you and @@.mediumaquamarine;trusts your intentions will benefit $him.@@ - <<set $pregInventions = 1>> - <<set $activeSlave.trust += 2, $activeSlave.devotion += 5>> - <</replace>> - <</link>> - <<if $FCTV.receiver > 0>> - <br><<link "Organize a televised demonstration of $his skills.">> - <<replace "#result2">> - You are so impressed by $his ideas that you arrange to have $him demonstrate $his discoveries on a prominent FCTV talk show. It will take some time, and you'll have to insure that $he's at least reasonably well known before the show's executives will agree to allow $him on-air, but you're certain that $activeSlave.slaveName's name will soon be on the lips of pregnancy-loving slaveowners and Free Cities citizens around the world. In the meantime, you implement $his ideas around the arcology. $He is @@.hotpink;thrilled@@ to have pleased you so much that you would @@.mediumaquamarine;put such faith in $his ideas.@@ - <<run cashX(-10000, "event", $activeSlave)>> - <<set $pregInventor = 2>> - <<set $pregInventions = 1>> - <<set $activeSlave.trust += 4, $activeSlave.devotion += 10>> - <</replace>> - <</link>> //This will cost <<= cashFormat(10000)>>// - <</if>> - </span> - <</replace>> - <</link>> - <br><<link "Have $him give you a trained assisted strip show.">> - <<replace "#result">> - The first thing that you notice when your slave walks through the door is the way $he struts in with apparent ease. It's been quite a while since you've seen $him walk with any sort of elegance, but $he does so now. $He spins around, giving you a look at $his - <<if $activeSlave.butt > 11>> - debilitating, insanely enormous ass - <<elseif $activeSlave.butt > 5>> - huge ass - <<elseif ($activeSlave.buttImplant/$activeSlave.butt) > .60>> - implant swollen ass cheeks - <<elseif $activeSlave.butt > 2>> - plump ass - <<else>> - slender ass - <</if>> - and then shakes $his booty, glancing over $his shoulder to <<if canSee($activeSlave)>>see<<else>>judge<</if>> how you react. You motion for $him to continue and $he turns around and approaches you, stopping only when $his massive belly is looming in front of you, almost touching you. You look over the apex of $his stomach to consider the "invention" $he's developed to enable $his miraculous mobility. - <br><br> - A significant number of menial slaves have been repurposed and specially trained to aid your hyperbroodmother and $his incredible belly. These menials, - <<if $arcologies[0].FSPaternalist > 60>> - outfitted with expensive safety gear to protect them during their potentially dangerous endeavors, - <<elseif $arcologies[0].FSRepopulationFocus > 60>> - themselves pregnant, though not nearly as large, - <<elseif $arcologies[0].FSRestart > 60>> - low-quality stock unfit to serve as breeders, - <<elseif $arcologies[0].FSPastoralist > 60>> - their huge, milky tits squashed up against your slave's body, leaking milk, - <<elseif $arcologies[0].FSAssetExpansionist > 60>> - their huge tits and asses serving as exotic cushions for the tender flesh of your massively bloated hyperbroodmother, - <<elseif $arcologies[0].FSTransformationFetishist > 60>> - their huge implanted tits and asses clearly designed to maximize their potential as cushions for your massively bloated hyperbroodmother, - <<elseif $arcologies[0].FSPhysicalIdealist > 60>> - their impressive muscles rippling as they exert themselves, - <<elseif $arcologies[0].FSHedonisticDecadence > 60>> - surprisingly strong, given how plush they are, and well suited for their job, - <<elseif $arcologies[0].FSChattelReligionist > 60>> - dressed in skimpy monks habits and eyes flashing with exalted fervor as they go about their duties, - <<elseif $arcologies[0].FSYouthPreferentialist > 60>> - just barely the legal age for consent in your arcology and clearly eager to prove themselves, - <<elseif $arcologies[0].FSMaturityPreferentialist > 60>> - plush MILFs who support your hyperbroodmother's insane pregnancy with a hint of maternal affection, - <<elseif $arcologies[0].FSSlimnessEnthusiast > 60>> - lithe and possessed of wiry strength, - <<elseif $arcologies[0].FSStatuesqueGlorification > 60>> - impressively tall and quite capable of handling your massively bloated hyperbroodmother, - <<elseif $arcologies[0].FSPetiteAdmiration > 60>> - tiny and trying their hardest to move $him, - <<elseif $arcologies[0].FSSlaveProfessionalism > 60>> - quick witted slaves who flawlessly redirect attention to your hyperpregnant star, - <<elseif $arcologies[0].FSIntellectualDependency > 60>> - very aroused and having trouble staying focused when so intimately close to such an expanse of flesh, - <<elseif $arcologies[0].FSRomanRevivalist > 60>> - dressed in a skimpy reproduction of roman legionary garb, - <<elseif $arcologies[0].FSNeoImperialist > 60>> - dressed in skimpy bodysuits that outline their tight bodies, - <<elseif $arcologies[0].FSAztecRevivalist > 60>> - clad only in exotic feathers, - <<elseif $arcologies[0].FSEgyptianRevivalist > 60>> - dressed in <<if hasAnyLegs($activeSlave)>>ankle-length<<else>>long<</if>> tarkhans made of brass and turquoise colored beads, - <<elseif $arcologies[0].FSEdoRevivalist > 60>> - dressed in skimpy noh theater costumes, - <<elseif $arcologies[0].FSArabianRevivalist > 60>> - their sinful figures made modest by roomy abayas, - <<elseif $arcologies[0].FSChineseRevivalist > 60>> - clad in traditional silk chang'ao and lotus shoes, - <<else>> - their clothing specifically chosen to supplement and flatter your hyperbroodmother's own outfit, - <</if>> - act to support $his movements as $he teases you, seemingly heedless of their own safety. Their ego has been subsumed in pursuit of their duties and, as they fall into place to hold up $his gargantuan belly with each of $his slightest, most thoughtless movements, they give you the impression of being more extensions of $his will than independent beings. Your hyperbroodmother leans forward, just the slightest bit, as you consider $his assistants, and presses $his unfathomable stomach into your crotch. As $he does so, two of $his assistants slide under $his belly with practiced ease, cushioning it with their bodies to prevent it from touching the cold ground. No sound passes their lips as the gargantuan organ crushes down on them, but you can hear their bones creak. - <br><br> - <<if canTalk($activeSlave)>> - "Oooh, <<s>>omeone like<<s>> what they <<s>>ee," $he <<say>>s. - <<else>> - $He can't speak, but $he does grin and roll $his belly up and down your lap for a moment, $his servants lifting and supporting $him from the periphery such that $he seems to be in casual control of $his immobilizing bulk. - <</if>> - <br><br> - It is only then that you realize that - <<if $PC.dick != 0>> - your dick is as hard as a length of steel. - <<else>> - your kitty is positively drowning in fem-cum. - <</if>> - You move to touch $his belly, but $he steps backward, leaving it just out of reach. - <br><br> - <<if canTalk($activeSlave)>> - "If you'll permit, <<Master>>," $he <<say>>s teasingly, "I'd like to <<sh>>ow off my 'invention' ju<<s>>t a little longer." - <<else>> - $He smirks and - <<if hasAnyArms($activeSlave)>> - motions to you that $he'd like to tease you just a little longer. - <<else>> - one of $his servants, seeming to read their mistress's mind, motions to you that your slave has something big to show off still. - <</if>> - <</if>> - <br><br> - You motion for $him to continue. - <<if hasAnyArms($activeSlave)>> - $He lifts $his arm<<if hasBothArms($activeSlave)>>s<</if>> over $his head and begins to spin again, giving you a glorious view of $his - <<else>> - $His servants spin $him again, giving you a glorious view of $his - <</if>> - <<if ($activeSlave.boobs >= 20000)>> - eye wateringly massive tits - <<elseif ($activeSlave.boobs >= 3000)>> - huge tits - <<elseif ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>> - luscious, augmented tits - <<else>> - petite breasts - <</if>> - and - <<if $activeSlave.butt > 11>> - couch smothering ass cheeks. - <<elseif $activeSlave.butt > 5>> - enormous ass. - <<elseif ($activeSlave.buttImplant/$activeSlave.butt) > .60>> - implant-filled ass. - <<elseif $activeSlave.butt > 2>> - delicious looking ass. - <<else>> - small ass. - <</if>> - As $he spins, $his servants support $his motions, using their own bodies to cushion and propel $him in the direction $he wants. They move in a limp manner that seems to blend into $his body, keeping the focus of your attention on your slave's form rather than theirs. One enters your office with a portable stripper stage, complete with pole, and your slave makes $his way over to it. - <<if canTalk($activeSlave)>> - "There were <<s>>ome... <<s>>acrifi<<c>>e<<s>>," $he <<say>>s, "to get where we are today." - <<if hasAnyArms($activeSlave)>> - $He raises $his arm<<if hasBothArms($activeSlave)>>s<</if>> as $his myriad servants plaster themselves to $his monolithic body, raising $his considerable bulk to a sufficient height to allow $him to take hold of the pole. - <<else>> - $He raises a dainty stub and one of $his myriad servants, pressed back to back with $him to help support $his weight as the others push $him into position, snakes a hand upward, creating the illusion that, for just this moment, your amputee broodmother is whole once more and grabbing onto the pole. - <</if>> - <<else>> - <<if hasAnyArms($activeSlave)>> - $He motions to you that there were some sacrifices, raising $his arm<<if hasBothArms($activeSlave)>>s<</if>> as $his myriad servants plaster themselves under $his monolithic belly, raising $his considerable bulk to sufficient height to allow $him to take hold of the pole. - <<else>> - The servant serving as the "mouth" for your mute, limbless hyperpregnant slave motions to you that there were some sacrifices. Your slave raises a dainty stub and one of $his myriad servants, pressed back to back with $him to help support $his weight as the others push $him into position, snakes a hand upward, creating the illusion that, for just this moment, your amputee broodmother is whole once more and grabbing onto the pole. - <</if>> - <</if>> - <br><br> - <<if canTalk($activeSlave)>> - "I think you'll find, though..." $he <<say>>s. - <<elseif hasAnyArms($activeSlave)>> - $He motions that "$he believes you'll find," then falls into a coy silence. - <<else>> - $His mouthpiece motions that your slave "believes you'll find," then falls into a coy silence. - <</if>> - <br><br> - $He's spinning around the pole now, reminding you of $his earlier motions. $He seems weightless, $his massive bulk perfectly supported regardless of the personal cost to those supporting $him. Your gaze turns to several motionless servants who have been knocked unconscious by $his careening bulk. They're piled up against a side wall, but inconspicuous. You can't recall when they collapsed, or when they were dragged away. The passiveness with which your slave's glorified human clothing moves makes even the collapsed menials seem natural and perfectly reasonable — just something that happens when your hyperbroodmother exercises $his body, sometimes. Not an abuse of another person. More like flexing a limb. - <br><br> - $His servants surge upward, piling on top of each other and rotating $him. $He flips upside down and, for a moment, you worry that $he might fall with disastrous consequences. The mass of human bodies working in tandem to protect and enable $him executes its motions in perfect synchrony, however, and you are treated to the sight of an impossibly pregnant slave spinning upside down, hooking one - <<if hasAnyLegs($activeSlave)>> - leg - <<else>> - "leg" - <</if>> - around a stripper pole, and performing a slow, effortless body inversion, $his massive upside down belly rotating just a split second slower than the rest of $him. $He rotates some more and then flips back into a normal standing position, leaning over $his stomach and once again slightly crushing $his now visibly exhausted servants as $he performs a mock bow. - <br><br> - <<if canTalk($activeSlave)>> - "That it wa<<s>> worth it!" $he <<say>>s, finishing $his earlier statement. "<<S>>o, what do you think?" $he asks. $He seems not even slightly out of breath. - <<elseif hasAnyArms($activeSlave)>> - $He motions to you, communicating the last part of $his earlier message: "that it was worth it!" $He then indicates that $he is waiting for your opinion. You note that $he hasn't even broken a sweat. - <<else>> - $His mouthpiece motions to you, communicating the last part of the message your slave started earlier: "that it was worth it!" The menial then indicates that your slave is waiting for your opinion of $his work. You note that your hyperbroodmother hasn't even broken a sweat. - <</if>> - <br><br><span id="result2"> - <<link "Insult $him and halt all further training.">> - <<replace "#result2">> - As much as $his antics amused you, it's clear that $activeSlave.slaveName wasted your money. You calmly explain to $him that the next time $he has a "brilliant" idea, $he should keep it to $himself, then arrange to have $his "discoveries" disposed of. - <<if $activeSlave.trust < -95>> - The look of pride and accomplishment on $his face transforms into a look of crushing disappointment. You slap $him on the ass and then have your menials escort $him back to $his duties. The next time you see $him, the spark of life and vitality that drove $him has been fully extinguished. @@.red;$activeSlave.slaveName has broken.@@ Anything $he might have learned from this experience is lost in $his empty mind. $He will never question $his place, or anything else, again. - <<set $activeSlave.fetish = "mindbroken">> - <<elseif $activeSlave.trust < -20>> - The look of pride and accomplishment on $his face transforms into a look of crushing disappointment. $He apologizes for wasting your time and, cognizant of the power you hold over $him, promises never to do so again. @@.gold;$activeSlave.slaveName is now more fearful.@@ Though $he never bothers you with $his "ideas" again, you can tell @@.mediumorchid;$he no longer regards you as highly.@@ - <<set $activeSlave.trust -= 4, $activeSlave.devotion -= 10>> - <<else>> - The look of pride and accomplishment on $his face transforms into a look of disappointment. @@.gold;$activeSlave.slaveName finds you less trust worthy@@ as a result of your unkindness, but $he soon gets over $his disappointment and begins thinking of ways to truly impress you. - <<set $activeSlave.trust -= 4>> - <</if>> - <</replace>> - <</link>> - <br><<link "Compliment $him but keep $his discoveries to yourself.">> - <<replace "#result2">> - You are impressed by $his ideas and arrange to have them implemented in a limited way in your arcology. You also arrange to keep $his discoveries secret, so as to hoard all the enjoyment of them for yourself. $activeSlave.slaveName doesn't mind. $He is @@.hotpink;simply happy@@ to have pleased you and @@.mediumaquamarine;trusts your intentions will benefit $him.@@ - <<set $pregInventions = 1>> - <<set $activeSlave.trust += 2, $activeSlave.devotion += 5>> - <</replace>> - <</link>> - <<if $FCTV.receiver > 0>> - <br><<link "Organize a televised demonstration of $his skills.">> - <<replace "#result2">> - You are so impressed by $his ideas that you arrange to have $him demonstrate $his discoveries on a prominent FCTV talk show. It will take some time, and you'll have to insure that $he's at least reasonably well known before the show's executives will agree to allow $him on-air, but you're certain that $activeSlave.slaveName's name will soon be on the lips of pregnancy-loving slaveowners and Free Cities citizens around the world. In the meantime, you implement $his ideas around the arcology. $He is @@.hotpink;thrilled@@ to have pleased you so much that you would @@.mediumaquamarine;put such faith in $his ideas.@@ - <<run cashX(-10000, "event", $activeSlave)>> - <<set $pregInventor = 2>> - <<set $pregInventions = 1>> - <<set $activeSlave.trust += 4, $activeSlave.devotion += 10>> - <</replace>> - <</link>> // This will cost <<= cashFormat(10000)>>// - <</if>> - </span> - <</replace>> - <</link>> - <<if $spa != 0>> - <br><<link "Enjoy a game of 'jelly' wrestling in your new curative gelatin pool.">> - <<replace "#result">> - Your slave asks you to meet $him in your spa. Upon entering, you take a moment to enjoy the - <<if $spaDecoration == "Paternalist">> - sight of the opulently appointed pools and the intellectually stimulating shows streaming from the many screens set on the walls of the room. - <<elseif $spaDecoration == "Repopulationist">> - sight of all of the maternity aid devices scattered throughout the room. Whatever the nature of $his invention, your slave's toy is guaranteed to fit in well in these particular baths. - <<elseif $spaDecoration == "Eugenics">> - sight of the dualistic, caste based facilities. - <<elseif $spaDecoration == "Pastoralist">> - faint smell of milk that wafts through the room with the steam and the sight of the many aid devices that your hypermassive slaves absolutely require to make use of the facilities. - <<elseif $spaDecoration == "Asset Expansionist">> - sight of the aid equipment that your hypermassive slaves absolutely require to make use of the facilities. - <<elseif $spaDecoration == "Transformation Fetishist">> - sight of the various surgical recovery devices scattered throughout the room. - <<elseif $spaDecoration == "Physical Idealist">> - sight of the various light impact workout machines scattered throughout the room. - <<elseif $spaDecoration == "Hedonistic">> - smell of the lavishly appointed cornucopias of food scattered around the facility's many opulent pools. - <<elseif $spaDecoration == "Chattel Religionist">> - sight of the ritual pools and the various icons of the faith scattered throughout the room. - <<elseif $spaDecoration == "Youth Preferentialist">> - carnival atmosphere created by the waterpark theming of the facilities. - <<elseif $spaDecoration == "Gender Radicalist">> - sight of the extreme penetration based pornography feeds streaming from the many screens set on the walls of the room. - <<elseif $spaDecoration == "Gender Fundamentalist">> - sight of the traditionalist pornographic feeds streaming from the many screens set on the walls of the room. - <<elseif $spaDecoration == "Maturity Preferentialist">> - sight of the many businesslike, beautifying devices and service stations scattered throughout the room. - <<elseif $spaDecoration == "Slimness Enthusiast">> - comfortable atmosphere of the facilities. - <<elseif $spaDecoration == "Degradationist">> - sight of the all-seeing cameras scattered throughout the room. You give a nod to one of the obvious ones, knowing there's an audience watching. - <<elseif $spaDecoration == "Roman Revivalist">> - sight of the sexual mosaics at the bottom of its spacious baths. - <<elseif $spaDecoration == "Aztec Revivalist">> - sight of its golden idols and exotic animal trophies as well as the warm smell of tropical herbs. - <<elseif $spaDecoration == "Egyptian Revivalist">> - heavy perfumed air pervading the room and the sight of its warm, reed lined pools. - <<elseif $spaDecoration == "Edo Revivalist">> - steam rising up off of the stone-lined onsen pools. - <<elseif $spaDecoration == "Arabian Revivalist">> - vibrant tilework and the smell of the heavy perfume in the steamy air. - <<elseif $spaDecoration == "Chinese Revivalist">> - stultifying, gloomy atmosphere pervading the room. - <<elseif $spaDecoration == "Body Purist">> - comfortable atmosphere of the facilities. - <<elseif $spaDecoration == "Neo-Imperialist">> - sight of the verdant greenery, brilliant high-tech lighting, and steaming central bath. - <<else>> - sight of its spacious baths and pleasant atmosphere. - <</if>> - Your eyes then fall on what must be $his invention: a new pool, set in a corner. It's not Olympic size, but it is quite large compared to most of your other pools — a large oval — and it is completely filled with a clear, gooey substance. Lounging in it, facing you and with $his massive belly poking out just far enough for you to enjoy the sight of $his bulging "outie" belly button, is your slave, wearing an attractive bikini that seems to be soaked through with whatever goo is filling the pool. $He - <<if hasAnyArms($activeSlave)>> - waves at you and then gently rolls forward onto $his astounding pregnancy, - <<else>> - waves a stub at you and then pokes it at a holographic remote array hovering nearby. A mobility assistance device in the pool rolls $him forward onto $his astounding pregnancy, - <</if>> - <<if ($activeSlave.boobs >= 20000)>> - causing $his insanely enormous tits to flop onto the tile at the pool's edge with a loud "thwack." - <<elseif ($activeSlave.boobs >= 3000)>> - resting $his enormous breasts on the pool's edge, causing them to push up into $his chin as $he looks up at you. - <<elseif ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>> - resting $his huge, implant-distended tits on the pool's edge, causing them to push up into $his chin as $he looks up at you. - <<else>> - giving you a nice view of $his cute tits. - <</if>> - <br><br> - <<if canTalk($activeSlave)>> - "Hi, <<Master>>," $he <<say>>s. "//Oooooh...// you have no idea how good thi<<s>> feel<<s>>. My aching belly i<<s>> warmed all through — well? Why don't you come in and I'll e<<x>>plain thing<<s>>." - <<elseif hasAnyArms($activeSlave)>> - $He motions to you in more formal greetings and then lets out an involuntary moan of pleasure, rubbing at the sides of $his tremendous belly. $He beckons you to enter the pool. - <<else>> - $He is limbless as well as mute, so $he can't greet you more formally, but $his pleasurable, incomprehensible moaning and the way $he presses $his stumps into $his monstrously inflated, baby packed belly makes it clear to you that $he's happy to see you. You decide to get into the pool to try out your slave's invention for yourself. - <</if>> - <br><br> - You strip and put on one of the swimming outfits that are stored in the baths for your personal use, then slide yourself into the pool, squeezing in between its wall and your hyperswollen broodmother. The gel has a medicinal scent masked by lavender and is the perfect warmth to ease your muscles as you slide into it. Your skin tingles at its touch. - <br><br> - <<if canTalk($activeSlave)>> - "It'<<s>> curative jelly," your slave explains. "I'm <<s>>o big, now, it take<<s>> mo<<s>>t of the day to moi<<s>>turi<<z>>e my poor belly, even with help. With thi<<s>> jelly pool, it only take<<s>> a few minute<<s>>. I'm <<s>>ure thi<<s>> pool can help all <<s>>ort<<s>> of <<s>>lave<<s>> with big a<<ss>>et<<s>> <<s>>o that they can keep them<<s>>elve<<s>> looking pretty for their <<Master>>." - <<else>> - <<if hasAnyArms($activeSlave)>> - $He motions to you, explaining in sign that the pool is filled with curative gel. It's designed to help slaves with enormous assets moisturize their oversized bodies without having to spend all day applying it manually. - <<else>> - Your personal assistant chimes in to explain that the pool is filled with curative gel. It's designed to help slaves with enormous assets moisturize their oversized bodies without having to spend all day applying it manually. - <</if>> - <</if>> - <br><br> - <<if hasAnyArms($activeSlave)>> - $He presses a few buttons on a holographic remote array - <<else>> - $He nods a signal - <</if>> - and a series of silk-lined spherical rollers at the base of the pool come to life, humming as they spin $his laden body around. $He pushes into your chest, rotating forward so that $his - <<if ($activeSlave.boobs >= 20000)>> - colossal breasts spread out around you, completely surrounding your head. With some effort, you part $his heavy cleavage enough to be able to continue listening to $him without being smothered. - <<elseif ($activeSlave.boobs >= 3000)>> - massive chest fills the space between you, blocking your view of $his face. You spread $his cleavage enough to be able to continue listening to $him. - <<elseif ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>> - fat, implanted tits fill the space between you, blocking your view of $his face. With some effort, you spread $his tightly packed, spherical cleavage enough to be able to continue listening to $him. - <<else>> - spherical belly pushes into your crotch. - <</if>> - <<if hasAnyArms($activeSlave)>> - $He then reaches out and, after you nod that $he can continue, $he caresses your face. - <<else>> - $He then reaches out to caress your face, but blushes and stops the motion as $he remembers that $he is physically unequipped to do so. - <</if>> - $His weight falls onto you and pushes you into the cushioned wall of the pool. The wall gives beneath your combined bulk, swelling down and outward to accommodate and support you. - <br><br> - <<if canTalk($activeSlave)>> - "Do you like it, <<Master>>?" $he asks. "It'<<s>> built to grow and change a<<s>> your <<s>>lave<<s>> do. It <<sh>>ould be the perfect <<s>>i<<z>>e to <<s>>upport them, no matter what that <<s>>i<<z>>e might be. And if we ever get too big for even that, well..." $he smiles and you realize that, between the feeling of $his heavy, slick mass pressing into you and the rejuvenating effect of the gel, - <<if $PC.dick != 0>> - you're hard as a rock and - <<else>> - your pussy is absolutely weeping and you are - <</if>> - as refreshed and eager to fuck as you've been in quite some time. "We can alway<<s>> just make it... bigger." - <<else>> - <<if hasAnyArms($activeSlave)>> - $He motions to you, explaining that the pool is designed to grow to accommodate and support its users, then smiles. You realize that, between the feeling of $his heavy, slick mass pressing into you and the rejuvenating effect of the gel, - <<if $PC.dick != 0>> - you're hard as a rock<<if $PC.vagina > -1>>, your pussy is absolutely weeping,<</if>> and - <<else>> - your pussy is absolutely weeping and you are - <</if>> - as refreshed and eager to fuck as you've been in quite a while. - <<else>> - Your personal assistant explains that the pool has been designed to grow to accommodate and support its users. You're only half-listening to what $he is saying, however, as you have suddenly realized that, between the feeling of your slave's heavy, slick mass pressing into you and the rejuvenating effect of the gel, - <<if $PC.dick != 0>> - you're hard as a rock and - <<else>> - your pussy is absolutely weeping and you are - <</if>> - as refreshed and eager to fuck as you've been in quite a while. - <</if>> - <</if>> - <br><br> - Your arousal gives you an idea, and you push back on your hyperbroodmother's colossal belly. $He steps away from you until $he is in the center of the pool, a look of confusion on $his face. You take control of the remote and then manipulate the reticulating frame supporting the pool such that it lifts the floor, slowly rendering both you and your colossal-bellied breeder knee deep in the warm gel. You hunker down into an aggressive, combative stance and - <<if hasAnyCyberneticEyes($activeSlave)>> - $his <<print App.Desc.eyesColor($activeSlave, "synthetic")>> flash white for a moment as a look of understanding dawns on $his face. - <<else>> - a look of understanding lights up in $his <<print App.Desc.eyesColor($activeSlave)>>. - <</if>> - <<if !canTalk($activeSlave)>> - <<if hasAnyArms($activeSlave)>> - $He waves $his arm<<if hasBothArms($activeSlave)>>s<</if>> in mock dismay<<if $activeSlave.skill.combat > 0>> and lowers $his guard<</if>> as you prepare to wrestle $him in the pool of goop. - <<else>> - $He waves $his stubs in mock dismay as you prepare to wrestle $him in the pool of goop. - <</if>> - <<else>> - "Oh no," $he <<say>>s in mock dismay<<if $activeSlave.skill.combat > 0>>, lowering $his guard<</if>>. "My <<Master>> i<<s>> going to wre<<s>>tle me into <<s>>ubmi<<ss>>ion in thi<<s>> hot, heavy, goo pool. Whatever will I do?" - <</if>> - You circle around $him, slowly approaching $him, and $he uses the pool's mobility assistance tools to rotate $his body so that $he can just barely keep you in $his gaze, drizzling gel over $his belly as $he keeps it between you and $him to use as a protective barrier. When you're close enough to touch the apex of $his fecund body, you leap forward through the gel, diving to one side and disappearing under it. Your momentum carries you a reasonable distance despite the resistance of the thick substance and you pop back up directly behind $him. You grab $him under $his armpits, pressing your - <<if $PC.dick != 0>> - rigid dick against $his - <<else>> - engorged pussy lips against $his - <</if>> - <<if $activeSlave.butt > 7>> - enormous, gel-slicked ass, - <<elseif $activeSlave.butt > 4>> - plush, gel-slicked ass, - <<elseif ($activeSlave.buttImplant/$activeSlave.butt) > .60>> - implant-filled, gel-slicked ass, - <<elseif $activeSlave.butt > 2>> - perfect, gel-slicked ass, - <<else>> - small, gel-slicked ass, - <</if>> - and throw your weight backward to bring you both to the ground. $He's far too enormous to make this achievement doable with anything less than superhuman strength, but the mobility assistance devices engage as you move, and the two of you slowly collapse into the warm jelly. - <<= VCheck.Vaginal($activeSlave, 1)>> - After you've fucked $him near senseless, enjoying $his struggles to keep abreast of the smothering gel as you abuse $his pussy, you both retire to the side of the pool and $he presses into you, nuzzling your neck and - <<if canTalk($activeSlave)>> - asking you what you think of $his invention. - <<else>> - <<if hasAnyArms($activeSlave)>> - motioning to you, asking you what you think of $his invention. - <<else>> - waving a stub in the air. As if on cue, your personal servant asks you what you think of your broodmother's invention. - <</if>> - <</if>> - <br><br><span id="result2"> - <<link "Insult $him and halt all further training.">> - <<replace "#result2">> - As much as $his antics amused you, it's clear that $activeSlave.slaveName wasted your money. You calmly explain to $him that the next time $he has a "brilliant" idea, $he should keep it to $himself, then arrange to have $his "discoveries" disposed of. - <<if $activeSlave.trust < -95>> - The look of pride and accomplishment on $his face transforms into a look of crushing disappointment. You slap $him on the ass and then have your menials escort $him back to $his duties. The next time you see $him, the spark of life and vitality that drove $him has been fully extinguished. @@.red;$activeSlave.slaveName has broken.@@ Anything $he might have learned from this experience is lost in $his empty mind. $He will never question $his place, or anything else, again. - <<set $activeSlave.fetish = "mindbroken">> - <<elseif $activeSlave.trust < -20>> - The look of pride and accomplishment on $his face transforms into a look of crushing disappointment. $He apologizes for wasting your time and, cognizant of the power you hold over $him, promises never to do so again. @@.gold;$activeSlave.slaveName is now more fearful.@@ Though $he never bothers you with $his "ideas" again, you can tell @@.mediumorchid;$he no longer regards you as highly.@@ - <<set $activeSlave.trust -= 4, $activeSlave.devotion -= 10>> - <<else>> - The look of pride and accomplishment on $his face transforms into a look of disappointment. @@.gold;$activeSlave.slaveName finds you less trust worthy@@ as a result of your unkindness, but $he soon gets over $his disappointment and begins thinking of ways to truly impress you. - <<set $activeSlave.trust -= 4>> - <</if>> - <</replace>> - <</link>> - <br><<link "Compliment $him but keep $his discoveries to yourself.">> - <<replace "#result2">> - You are impressed by $his ideas and arrange to have them implemented in a limited way in your arcology. You also arrange to keep $his discoveries secret, so as to hoard all the enjoyment of them for yourself. $activeSlave.slaveName doesn't mind. $He is @@.hotpink;simply happy@@ to have pleased you and @@.mediumaquamarine;trusts your intentions will benefit $him.@@ - <<set $pregInventions = 1>> - <<set $activeSlave.trust += 2, $activeSlave.devotion += 5>> - <</replace>> - <</link>> - <<if $FCTV.receiver > 0>> - <br><<link "Organize a televised demonstration of $his skills.">> - <<replace "#result2">> - You are so impressed by $his ideas that you arrange to have $him demonstrate $his discoveries on a prominent FCTV talk show. It will take some time, and you'll have to insure that $he's at least reasonably well known before the show's executives will agree to allow $him on-air, but you're certain that $activeSlave.slaveName's name will soon be on the lips of pregnancy-loving slaveowners and Free Cities citizens around the world. In the meantime, you implement $his ideas around the arcology. $He is @@.hotpink;thrilled@@ to have pleased you so much that you would @@.mediumaquamarine;put such faith in $his ideas.@@ - <<run cashX(-10000, "event", $activeSlave)>> - <<set $pregInventor = 2>> - <<set $pregInventions = 1>> - <<set $activeSlave.trust += 4, $activeSlave.devotion += 10>> - <</replace>> - <</link>> // This will cost <<= cashFormat(10000)>>// - <</if>> - </span> - <</replace>> - <</link>> - <</if>> - </span> - -<<elseif $pregInventor == 2>> - - <<set _arcCount = $arcologies.length>> - <<set $pregInventor = 3>> - - The time has finally come for your slave, <<= App.UI.slaveDescriptionDialog($activeSlave)>>, to appear on the slave-breeding based talk show, "Husbandry with Millie." - <<if $activeSlave.porn.prestige > 2 || $activeSlave.prestige > 2>> - While $he is already world-renowned, you might still improve $his chances to impress on the show with a little bit of extra investment in commercial spots or a tweaking of FCTV algorithms. - <<elseif $activeSlave.porn.prestige > 1 || $activeSlave.prestige > 2>> - While $he is already quite famous, you could still improve $his chances to impress on the show with a little bit of extra investment in commercial spots or a tweaking of FCTV algorithms. - <<else>> - While $he has - <<if $activeSlave.porn.prestige > 1>> - managed to earn a reasonable following in slave pornography, - <<else>> - a bit of a reputation already, - <</if>> - you could significantly improve $his chances to impress on the show with a little bit of extra investment in commercial spots<<if $PC.skill.hacking >= 100>> or a tweaking of FCTV algorithms<</if>>. - <</if>> - - <br><br> - <span id="result"> - <<if $PC.skill.hacking >= 100>> - <<link "Manipulate the FCTV algorithms">> - <<replace "#result">> - You <<if $PC.skill.hacking < 70>>bribe an employee to <</if>>tweak the randomized search algorithms for FCTV. While your hyperbroodmother is being interviewed concerning $his inventions, users browsing FCTV using the randomize channel function will be much more likely to be directed to the show. By the day of the interview, you're confident that many users will be watching as your slave sells your vision for the world's future. - <br><br> - That done, you settle in to watch. - <br><br> - - <<include "RE Preg Inventor Text">> - - <br><br> - You turn your FCTV screen off satisfied that your slave has just completed a job well done. Over the course of the next several weeks, it becomes clear that $activeSlave.slaveName's appearance on "Husbandry With Milly" has had a @@.green;significant positive impact@@ on public opinion. - <<if $activeSlave.prestige <= 2>> - <<set $activeSlave.prestige = 2>> - <<set $activeSlave.prestigeDesc = "$He is a renowned inventor of hyperpregnant sex accessories and toys.">> - <</if>> - <<run repX(10000, "event")>> - <<set $pregInventions = 2>> - <<for _i = 1; _i < _l; _i++>> - <<if $arcologies[_i].FSRepopulationFocus != "unset">> - <<set $arcologies[_i].FSRepopulationFocus += 10>> - <<elseif $arcologies[_i].FSRestart != "unset">> - <<set $arcologies[_i].FSRestart -= 20>> - <</if>> - <</for>> - <<set _pregmag = "a cut out magazine cover of your renowned hyperbroodmother inventor, " + $activeSlave.slaveName + ", and " + $his + " myriad toys">> - <<set $trinkets.push(_pregmag)>> - <</replace>> - <</link>> - <</if>> - <br><<link "Spend <<print cashFormat(10000)>> to fund additional advertising">> - <<replace "#result">> - You fund an aggressive ad campaign featuring your slave in provocative positions and selling a "life changing interview" on "Husbandry with Millie." By the day of $his interview, user boards all through the global web are discussing your slave and what $he might be about to reveal. Even social demographics not typically inclined toward the idea of breeding slaves seem to be intrigued, and you're confident that many users will be watching as your slave sells your vision for the world's future. - <br><br> - That done, you settle in to watch the interview. - <br><br> - - <<include "RE Preg Inventor Text">> - - <br><br> - You turn your FCTV screen off satisfied that your slave has just completed a job well done. Over the course of the next several weeks, it becomes clear that $activeSlave.slaveName's appearance on "Husbandry With Milly" has had a @@.green;significant positive impact@@ on public opinion. - <<if $activeSlave.prestige < 2>> - <<set $activeSlave.prestige = 2>> - <<set $activeSlave.prestigeDesc = "$He is a renowned inventor of hyperpregnant sex accessories and toys.">> - <</if>> - <<run repX(10000, "event")>> - <<set $pregInventions = 2>> - <<for _i = 1; _i < _l; _i++>> - <<if $arcologies[_i].FSRepopulationFocus != "unset">> - <<set $arcologies[_i].FSRepopulationFocus += 10>> - <<elseif $arcologies[_i].FSRestart != "unset">> - <<set $arcologies[_i].FSRestart -= 20>> - <</if>> - <</for>> - <<set _pregmag = "a cut out magazine cover of your renowned hyperbroodmother inventor, " + $activeSlave.slaveName + ", and " + $his + " myriad toys">> - <<set $trinkets.push(_pregmag)>> - <</replace>> - <</link>> - <br><<link "Trust in your slave">> - <<replace "#result">> - It's a gamble, but you decide to trust in the charisma of your slave and the fame $he has already accrued to sell your vision for the world's future during the interview. - <<if ($activeSlave.porn.prestige > 2)>> - $He's enormously popular, so your gambit has a good chance of success. - <<elseif ($activeSlave.porn.prestige > 1)>> - $He's quite popular, so your gambit has a reasonable chance of success. - <<else>> - $He's only really well known in local pornography, but you still decide to bet on $his ability to sway the masses. - <</if>> - Regardless, there's only so much your direct involvement could do to help $him as $he sells your vision for the world's future, and the natural cleverness $he's already demonstrated might well allow $him to achieve results on $his own that would be impossible otherwise. - <br><br> - When the day arrives, you settle in to watch the interview. - <br><br> - - <<include "RE Preg Inventor Text">> - - <br><br> - <<if $activeSlave.porn.prestige >= 3 && random(1,100) > 50>> - You turn your FCTV screen off satisfied that your slave has just finished a job very well done. Over the course of the next several weeks, it becomes clear that $activeSlave.slaveName's appearance on "Husbandry With Milly" has had @@.green;world changing@@ consequences. - <<if $activeSlave.prestige < 3>> - <<set $activeSlave.prestige = 3>> - <<set $activeSlave.prestigeDesc = "$He is a world renowned inventor of hyperpregnant sex accessories and toys.">> - <</if>> - <<run repX(25000, "event")>> - <<set $pregInventions = 3>> - <<for _i = 1; _i < _l; _i++>> - <<if $arcologies[_i].FSRepopulationFocus != "unset">> - <<set $arcologies[_i].FSRepopulationFocus += 30>> - <<elseif $arcologies[_i].FSRestart != "unset">> - <<set $arcologies[_i].FSRestart -= 60>> - <</if>> - <</for>> - <<set _pregmag = "a cut out magazine cover of your world renowned hyperbroodmother inventor, " + $activeSlave.slaveName + ", and " + getPronouns($activeSlave).possessive + " myriad toys">> - <<set $trinkets.push(_pregmag)>> - <<elseif $activeSlave.porn.prestige >= 3 && random(1,100) > 30>> - You turn your FCTV screen off satisfied that your slave has just completed a job well done. Over the course of the next several weeks, it becomes clear that $activeSlave.slaveName's appearance on "Husbandry With Milly" has had a @@.green;significant positive impact@@ on public opinion. - <<if $activeSlave.prestige < 2>> - <<set $activeSlave.prestige = 2>> - <<set $activeSlave.prestigeDesc = "$He is a renowned inventor of hyperpregnant sex accessories and toys.">> - <</if>> - <<run repX(10000, "event")>> - <<set $pregInventions = 2>> - <<for _i = 1; _i < _l; _i++>> - <<if $arcologies[_i].FSRepopulationFocus != "unset">> - <<set $arcologies[_i].FSRepopulationFocus += 10>> - <<elseif $arcologies[_i].FSRestart != "unset">> - <<set $arcologies[_i].FSRestart -= 20>> - <</if>> - <</for>> - <<set _pregmag = "a cut out magazine cover of your renowned hyperbroodmother inventor, " + $activeSlave.slaveName + ", and " + getPronouns($activeSlave).possessive + " myriad toys">> - <<set $trinkets.push(_pregmag)>> - <<elseif $activeSlave.porn.prestige >= 3 && random(1,100) > 15>> - You turn your FCTV screen off satisfied that your slave has done a satisfactory job. Over the course of the next several weeks, it becomes clear that $activeSlave.slaveName's appearance on "Husbandry With Milly" has had a @@.green;significant impact@@ on public opinion, though only at a local level. - <<if $activeSlave.prestige < 1>> - <<set $activeSlave.prestige = 1>> - <<set $activeSlave.prestigeDesc = "$He is a locally respected inventor of hyperpregnant sex accessories and toys.">> - <</if>> - <<run repX(2500, "event")>> - <<for _i = 1; _i < _l; _i++>> - <<if $arcologies[_i].FSRepopulationFocus != "unset">> - <<set $arcologies[_i].FSRepopulationFocus += 5>> - <<elseif $arcologies[_i].FSRestart != "unset">> - <<set $arcologies[_i].FSRestart -= 10>> - <</if>> - <</for>> - <<elseif $activeSlave.porn.prestige >= 3>> - You turn your FCTV screen off disappointed that your slave has done a mediocre job. Over the course of the next several weeks, it becomes clear that @@.green;what little impact@@ $he has had is on a local scale only. - <<run repX(500, "event")>> - <<for _i = 1; _i < _l; _i++>> - <<if $arcologies[_i].FSRepopulationFocus != "unset">> - <<set $arcologies[_i].FSRepopulationFocus += 5>> - <<elseif $arcologies[_i].FSRestart != "unset">> - <<set $arcologies[_i].FSRestart -= 10>> - <</if>> - <</for>> - <<elseif $activeSlave.porn.prestige >= 2 && random(1,100) > 75>> - You turn your FCTV screen off satisfied that your slave has just finished a job very well done. Over the course of the next several weeks, it becomes clear that $activeSlave.slaveName's appearance on "Husbandry With Milly" has had @@.green;world changing@@ consequences. - <<if $activeSlave.prestige < 3>> - <<set $activeSlave.prestige = 3>> - <<set $activeSlave.prestigeDesc = "$He is a world renowned inventor of hyperpregnant sex accessories and toys.">> - <</if>> - <<run repX(25000, "event")>> - <<set $pregInventions = 3>> - <<for _i = 1; _i < _l; _i++>> - <<if $arcologies[_i].FSRepopulationFocus != "unset">> - <<set $arcologies[_i].FSRepopulationFocus += 30>> - <<elseif $arcologies[_i].FSRestart != "unset">> - <<set $arcologies[_i].FSRestart -= 60>> - <</if>> - <</for>> - <<set _pregmag = "a cut out magazine cover of your world renowned hyperbroodmother inventor, " + $activeSlave.slaveName + ", and " + getPronouns($activeSlave).possessive + " myriad toys">> - <<set $trinkets.push(_pregmag)>> - <<elseif $activeSlave.porn.prestige >= 2 && random(1,100) > 50>> - You turn your FCTV screen off satisfied that your slave has just completed a job well done. Over the course of the next several weeks, it becomes clear that $activeSlave.slaveName's appearance on "Husbandry With Milly" has had a @@.green;significant positive impact@@ on public opinion. - <<if $activeSlave.prestige < 2>> - <<set $activeSlave.prestige = 2>> - <<set $activeSlave.prestigeDesc = "$He is a renowned inventor of hyperpregnant sex accessories and toys.">> - <</if>> - <<run repX(10000, "event")>> - <<set $pregInventions = 2>> - <<for _i = 1; _i < _l; _i++>> - <<if $arcologies[_i].FSRepopulationFocus != "unset">> - <<set $arcologies[_i].FSRepopulationFocus += 10>> - <<elseif $arcologies[_i].FSRestart != "unset">> - <<set $arcologies[_i].FSRestart -= 20>> - <</if>> - <</for>> - <<set _pregmag = "a cut out magazine cover of your renowned hyperbroodmother inventor, " + $activeSlave.slaveName + ", and " + getPronouns($activeSlave).possessive + " myriad toys">> - <<set $trinkets.push(_pregmag)>> - <<elseif $activeSlave.porn.prestige >= 2 && random(1,100) > 30>> - You turn your FCTV screen off satisfied that your slave has done a satisfactory job. Over the course of the next several weeks, it becomes clear that $activeSlave.slaveName's appearance on "Husbandry With Milly" has had a @@.green;significant impact@@ on public opinion, though only at a local level. - <<if $activeSlave.prestige < 1>> - <<set $activeSlave.prestige = 1>> - <<set $activeSlave.prestigeDesc = "$He is a locally respected inventor of hyperpregnant sex accessories and toys.">> - <</if>> - <<run repX(2500, "event")>> - <<for _i = 1; _i < _l; _i++>> - <<if $arcologies[_i].FSRepopulationFocus != "unset">> - <<set $arcologies[_i].FSRepopulationFocus += 5>> - <<elseif $arcologies[_i].FSRestart != "unset">> - <<set $arcologies[_i].FSRestart -= 10>> - <</if>> - <</for>> - <<elseif $activeSlave.porn.prestige >= 2>> - You turn your FCTV screen off disappointed that your slave has done a mediocre job. Over the course of the next several weeks, it becomes clear that @@.green;what little impact@@ $he has had is on a local scale only. - <<run repX(500, "event")>> - <<for _i = 1; _i < _l; _i++>> - <<if $arcologies[_i].FSRepopulationFocus != "unset">> - <<set $arcologies[_i].FSRepopulationFocus += 5>> - <<elseif $arcologies[_i].FSRestart != "unset">> - <<set $arcologies[_i].FSRestart -= 10>> - <</if>> - <</for>> - <<elseif random(1,100) > 90>> - You turn your FCTV screen off satisfied that your slave has just finished a job very well done. Over the course of the next several weeks, it becomes clear that $activeSlave.slaveName's appearance on "Husbandry With Milly" has had @@.green;world changing@@ consequences. - <<if $activeSlave.prestige < 3>> - <<set $activeSlave.prestige = 3>> - <<set $activeSlave.prestigeDesc = "$He is a world renowned inventor of hyperpregnant sex accessories and toys.">> - <</if>> - <<run repX(25000, "event")>> - <<set $pregInventions = 3>> - <<for _i = 1; _i < _l; _i++>> - <<if $arcologies[_i].FSRepopulationFocus != "unset">> - <<set $arcologies[_i].FSRepopulationFocus += 30>> - <<elseif $arcologies[_i].FSRestart != "unset">> - <<set $arcologies[_i].FSRestart -= 60>> - <</if>> - <</for>> - <<set _pregmag = "a cut out magazine cover of your world renowned hyperbroodmother inventor, " + $activeSlave.slaveName + ", and " + getPronouns($activeSlave).possessive + " myriad toys">> - <<set $trinkets.push(_pregmag)>> - <<elseif random(1,100) > 70>> - You turn your FCTV screen off satisfied that your slave has just completed a job well done. Over the course of the next several weeks, it becomes clear that $activeSlave.slaveName's appearance on "Husbandry With Milly" has had a @@.green;significant positive impact@@ on public opinion. - <<if $activeSlave.prestige < 2>> - <<set $activeSlave.prestige = 2>> - <<set $activeSlave.prestigeDesc = "$He is a renowned inventor of hyperpregnant sex accessories and toys.">> - <</if>> - <<run repX(10000, "event")>> - <<set $pregInventions = 2>> - <<for _i = 1; _i < _l; _i++>> - <<if $arcologies[_i].FSRepopulationFocus != "unset">> - <<set $arcologies[_i].FSRepopulationFocus += 10>> - <<elseif $arcologies[_i].FSRestart != "unset">> - <<set $arcologies[_i].FSRestart -= 20>> - <</if>> - <</for>> - <<set _pregmag = "a cut out magazine cover of your renowned hyperbroodmother inventor, " + $activeSlave.slaveName + ", and " + getPronouns($activeSlave).possessive + " myriad toys">> - <<set $trinkets.push(_pregmag)>> - <<elseif random(1,100) > 50>> - You turn your FCTV screen off satisfied that your slave has done a satisfactory job. Over the course of the next several weeks, it becomes clear that $activeSlave.slaveName's appearance on "Husbandry With Milly" has had a @@.green;significant impact@@ on public opinion, though only at a local level. - <<if $activeSlave.prestige < 1>> - <<set $activeSlave.prestige = 1>> - <<set $activeSlave.prestigeDesc = "$He is a locally respected inventor of hyperpregnant sex accessories and toys.">> - <</if>> - <<run repX(2500, "event")>> - <<for _i = 1; _i < _l; _i++>> - <<if $arcologies[_i].FSRepopulationFocus != "unset">> - <<set $arcologies[_i].FSRepopulationFocus += 5>> - <<elseif $arcologies[_i].FSRestart != "unset">> - <<set $arcologies[_i].FSRestart -= 10>> - <</if>> - <</for>> - <<else>> - You turn your FCTV screen off disappointed that your slave has done a mediocre job. Over the course of the next several weeks, it becomes clear that @@.green;what little impact@@ $he has had is on a local scale only. - <<run repX(500, "event")>> - <<for _i = 1; _i < _l; _i++>> - <<if $arcologies[_i].FSRepopulationFocus != "unset">> - <<set $arcologies[_i].FSRepopulationFocus += 5>> - <<elseif $arcologies[_i].FSRestart != "unset">> - <<set $arcologies[_i].FSRestart -= 10>> - <</if>> - <</for>> - <</if>> - <</replace>> - <</link>> - </span> - -<</if>> diff --git a/src/pregmod/rePregInventorText.tw b/src/pregmod/rePregInventorText.tw deleted file mode 100644 index e773d151fea88db5a55d56b6e1b4609ee28685c1..0000000000000000000000000000000000000000 --- a/src/pregmod/rePregInventorText.tw +++ /dev/null @@ -1,197 +0,0 @@ -:: RE Preg Inventor Text [nobr] - - <<setNonlocalPronouns $seeDicks>> - The interview starts about halfway into a special episode of "Husbandry with Millie." The show's host is introducing a who's who of important figures in the slave breeding community. As you turn on the show, Millie seems to have just completed another interview. - <br><br> - "Everybody, give one last round of applause for renowned breakout porn star 'Twinner Jennie'!" she says. "Who'd have thought an eighteen year old slave could be pregnant with their own eighteen year old cloned sister? Quite a world — thank you again for that fascinating interview! Our next guest on 'Husbandry with Millie' is a clever 'broodmother' class breeding slave and mother of <<= num($activeSlave.counter.birthsTotal)>> children from the $continent arcology of '$arcologies[0].name.' Everybody, please give a hearty welcome to <<= SlaveFullName($activeSlave)>>!" - <br><br> - The first thing that the audience sees of your slave is a colossal $activeSlave.skin orb pressing forward through an inadequate looking faux doorway at the rear of the set. "Husbandry with Millie" is a show about breeders and for breeders, and the host, Millie, has seen pregnant slaves of innumerable sizes and descriptions. Despite this, she does a clear double take as your slave enters, and enters, and enters stage right, $his grossly distorted belly seeming to go on forever as it precedes $him. $He is always growing, and you are constantly increasing the size of $his menial entourage to ensure $his unhindered mobility. As a result, a veritable platoon of masked menials can be seen throwing themselves into your overladen babyfactory before $his - <<if ($activeSlave.boobs >= 20000)>> - debilitatingly enormous, mind boggling breasts - <<elseif ($activeSlave.boobs >= 3000)>> - enormous breasts - <<elseif ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>> - implant inflated tits - <<else>> - upper body - <</if>> - and - <<if $activeSlave.face > 80>> - gorgeous face - <<elseif $activeSlave.face > 40>> - cute face - <<elseif $activeSlave.face > 1>> - unassuming face - <<else>> - homely face - <</if>> - come into view. - <br><br> - Your slave smiles, - <<if hasBothArms($activeSlave)>> - rubbing the side of $his belly with one hand while waving at the audience with the other. - <<elseif hasAnyArms($activeSlave)>> - alternating between rubbing the side of $his belly and waving at the audience. - <<else>> - pushing one arm stump into the side of $his belly while waving the other at the studio audience. - <</if>> - After $he has entered and taken $his place next to the interview couch — rolling forward to lay on $his belly so that $he can speak at eye level with $his interviewer while reclined in relative comfort — more menials enter the stage, carrying portable versions of the specialized maternity swing and moisturizing pool that $he has developed. - <br><br> - "Wow!" Millie says, "You're just about ready to pop, aren't you?" - <br><br> - <<if canTalk($activeSlave)>> - "Mmm," your slave <<say>>s, - <<else>> - Your slave nods, - <</if>> - <<if hasAnyLegs($activeSlave)>> - crossing $his leg<<if hasBothLegs($activeSlave)>>s<</if>> over the rearmost swell of $his belly, - <<else>> - bobbling $his leg stumps against the rearmost swell of $his belly, - <</if>> - <<if canTalk($activeSlave)>> - "and I'm more and more ready to pop every day." - <<elseif hasAnyArms($activeSlave)>> - motioning toward $his belly to emphasize the truth of the host's statement. - <<else>> - waving $his stumps at $his belly to emphasize the truth of the host's statement. - <</if>> - <br><br> - "I have to admit, $activeSlave.slaveName," Millie says, "you might just be the most heavily pregnant breeder I've ever seen." She motions at your slave's replete body and says: "— May I?" - <br><br> - <<if canTalk($activeSlave)>> - "Plea<<s>>e do," your slave <<say>>s. - <<elseif hasAnyArms($activeSlave)>> - Your slave invites the host to touch by patting $his belly and then grinning. - <<else>> - Your slave nods. - <</if>> - $He - <<if hasAnyArms($activeSlave)>> - <<if ($activeSlave.boobs >= 20000)>> - rubs the bases of $his gargantuan breasts in hungry anticipation. - <<elseif ($activeSlave.boobs >= 3000)>> - rubs the sides of $his enormous breasts in hungry anticipation. - <<elseif ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>> - rubs the sides of $his fat, implanted tits in hungry anticipation. - <<else>> - <<if $activeSlave.nipples != "fuckable">>tweaks<<else>>fingers<</if>> $his nipples through the sheer fabric of $his pretty slave gown while regarding the host with a look of hungry anticipation. - <</if>> - <<else>> - <<if ($activeSlave.boobs >= 20000)>> - pushes $his arm stubs into what little of the sides of $his gargantuan breasts $he can reach, a look of hungry anticipation on $his face. - <<elseif ($activeSlave.boobs >= 3000)>> - pushes $his arm stubs into the sides of $his enormous breasts, a look of hungry anticipation on $his face. - <<elseif ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>> - pushes $his arm stubs into the sides of $his fat, implanted tits, a look of hungry anticipation on $his face. - <<else>> - rubs $his arm stubs against $his nipples through $his pretty slave gown, a look of hungry anticipation on $his face. - <</if>> - <</if>> - <br><br> - Millie places an appreciative hand on your slave's silk clad flank. The poor $girl is so packed full of children that $his brood can be seen pressed in outline along the full swell of $his belly, and Millie's hand rests on the embossed figure of one such child. The camera zooms in as its form can be clearly made out pushing through the skin of your slave and against the host's touch. It turns over, allowing her to cup its back in her palm. Your slave flexes $his - <<if hasAnyLegs($activeSlave)>> - leg<<if hasBothLegs($activeSlave)>>s<</if>> - <<else>> - back - <</if>> - and parts $his - <<if ($activeSlave.lips > 95)>> - swollen mouth pussy, - <<elseif ($activeSlave.lips > 70)>> - swollen lips, - <<elseif ($activeSlave.lips > 20)>> - lips, - <<else>> - thin lips, - <</if>> - making no noise. You know $him well enough to understand that the combined pleasure and pain from the talk show host's uncareful touch has caused $him to experience one of $his "secret little orgasms," and you savor the sight of $him squirming as $he tries not to let on. - <br><br> - "So, $activeSlave.slaveName," Millie says, not taking her eyes off of the slave's incredibly fecund figure, "why don't you tell us about your inventions?" - <br><br> - Your slave bites $his lip and gives the talk show host a meaningful look. - <<if canTalk($activeSlave)>> - "How about I give you a 'hand<<s>>-on' demon<<s>>tration in<<s>>tead?" $he asks. - <<elseif hasAnyArms($activeSlave)>> - $He signs that $he'd like to give her a "hands-on demonstration" instead. - <<else>> - One of $his menials pushes _hisU body into the breeder's enormous stomach in a possessive manner, then turns to regard Millie. "My <<if getPronouns($activeSlave).noun == "girl">>mistress<<else>>master<</if>> would like to give you a 'hands-on' demonstration, instead," _heU says. - <</if>> - <br><br> - The host quirks an eyebrow, then nods. "Alright," she says. "How about we start with that pool of yours?" She then strips her outer layer of clothing, showing off her own famously heavily pregnant figure in an inadequate bra and panties. She makes her way to the curative jelly filled pool, after your slave has been situated within it. Millie dips a toe into the substance and giggles. "Oh my, it tingles!" - <br><br> - <<if canTalk($activeSlave)>> - "Ju<<s>>t wait till you feel it on your belly," your slave <<say>>s. "It feel<<s>> //<<s>>oooo// good." - <<elseif hasAnyArms($activeSlave)>> - $He signs that the host should get into the pool entirely to feel what it's like on the rest of her swollen body, as well. - <<else>> - The slave's menial asks the host to get in and feel what it's like on the rest of her swollen body, as well. - <</if>> - <br><br> - Millie slips into the pool and the camera zooms in as she slowly sidles along its outer edge while being crushed up against your slave's capacious belly. When she's finally seated next to the breeder's vestigial-looking core body, a microphone attached to a boom descends to allow the audience to listen as they continue the interview. - <br><br> - "This feels great," Millie says. "I've been feeling a bit stretched thin, lately, but I can feel all the tension in my belly just slipping away." - <br><br> - <<if canTalk($activeSlave)>> - "Thi<<s>> pool i<<s>> de<<s>>igned to allow <<s>>lave<<s>> to care for their bodie<<s>> no matter how large they inflate," your slave <<say>>s. "— Are you alright?" $he asks, wearing a look of mock concern on $his face. - <<elseif hasAnyArms($activeSlave)>> - Using the hand farthest from Millie, and with the other conspicuously hidden under the goo, your slave signs that the pool is designed to allow slaves to care for their bodies no matter how large they grow. $He then signs a request regarding the host's wellbeing, wearing a look of mocking concern on $his face. - <<else>> - Your slave's speaking assistant explains that the pool is designed to allow slaves and women to care for their bodies no matter how large they inflate. Meanwhile, your slave has been slowly rotating in the pool until $he is pressed conspicuously close to the host. The assistant asks if the host is feeling well, a look of mock concern on _hisU face. - <</if>> - <br><br> - "Ah! Um, yes — yep! I'm feeling just fine," Millie says. She's blushing furiously and squirming, and you can just make out the outline of your slave performing some form of teasing shenanigans under the distorting effect of the pool's goo. "So — oooh, yes... $activeSlave.slaveName, how did you, um, come up with the idea for this pool?" - <br><br> - <<if canTalk($activeSlave)>> - "I'm alway<<s>> trying to think of way<<s>> to keep my<<s>>elf pretty for — oh! — my <<Master>>," your slave <<say>>s, suddenly squirming $himself. Millie has slouched down into the pool and is grinning wickedly as she apparently gets revenge. "Thi<<s>> wa<<s>> ju<<s>>t the be<<s>>t — um — I mean — the be<<s>>t — oh //fuck, keep// — I mean, the be<<s>>t method I could think of for doing that." - <<elseif hasAnyArms($activeSlave)>> - Your slave signs that this was the best method $he could think of to keep $himself pretty for you, given $his size, then starts moaning as a grinning Millie seems to have started enacting her revenge. - <<else>> - Your slave's speaker explains that this was the best method the broodmother could think of to keep $himself pretty for you, given $his size. The baby laden breeder starts moaning in the middle of $his assistant's description as a grinning Millie seems to have taken this opportunity to start enacting her revenge. - <</if>> - Millie has turned her body sideways and snaked an arm between - <<if ($activeSlave.boobs >= 20000)>> - your slave's astoundingly enormous, slimed up cleavage, pumping it up and down to get their unfathomable mass jiggling while she nibbles at and whispers into the squirming baby machine's ear, just loud enough for the mic to pick it up. - <<elseif ($activeSlave.boobs >= 3000)>> - your slave's massive, slimed up tits, lewdly abusing one breast while she nibbles at and whispers into the squirming baby machine's ear, just loud enough for the mic to pick it up. - <<elseif ($activeSlave.boobsImplant/$activeSlave.boobs) >= .60>> - your slave's fat, implanted tits, pumping it up and down to get their tightly packed mass bobbing while she nibbles and whispers into the baby machine's ear, just loud enough for the mic to pick it up. - <<else>> - your slave's breasts, rubbing it up and down one of $his pert nipples while she simultaneously toys with the ridge of one of the baby machine's ears and both nibbles on and whispers into the other, just loud enough for the mic to pick it up. - <</if>> - <br><br> - "That's quite something," Millie whispers. "I don't know about you, $activeSlave.slaveName, but I think I speak for everyone watching today when I say that now seems like a //really good time// to try out that other invention of yours." - <br><br> - They both exit the pool, dripping clear, slippery gel onto the wood floor of "Husbandry with Millie"'s set. Without a thorough rinsing, your slave's slathered up belly will be dripping for an hour or more, and $he seems to know that as $he motions to stop $his assistants from wiping $him off before strapping $him into $his aerial gymnastics maternity swing. As a result, when the two visibly panting preggos are strapped into the machine and elevated several <<if $showInches == 2>>feet<<else>>meters<</if>> above the now-visible studio audience, your slave drips a steady stream of goop onto their craning heads. - <br><br> - "Oops!" Millie says. "Looks like we should have warned our audience about a wet zone for this episode. So, $activeSlave.slaveName, why don't we show off all the things this advanced maternity swing of yours can do?" - <br><br> - <<if canTalk($activeSlave)>> - "Ye<<s>>, plea<<s>>e," your slave <<say>>s. $He's visibly worked up and ready to go. - <<elseif hasAnyArms($activeSlave)>> - $He signs, indicating fervent interest. - <<else>> - The mute, limbless slave can only moan inchoately in response, but it's clear $he's more than ready. - <</if>> - <br><br> - The two then approach each other in mid air, settling into heavy petting and making out before transition into mechanically assisted scissoring. Your hyperbroodmother's unfathomable belly is hanging sideways and down, jiggling madly mere <<if $showInches == 2>>inches<<else>>centimeters<</if>> above the heads of the studio audience. One particularly adventurous audience member reaches up to place a hand on the slave's stomach to feel it bounce in their hands as $he gets fucked, and soon other members of the audience are also reaching up to feel the massive organ. The swing slowly rotates the coupling lovers back and forth over the length of the audience's seats, in a circle, and a wave of eager hands reach up as it does so, caressing your breeder's shaking belly as $he gets fucked by the show's moaning host. When Millie and your slave finally convulse in mutual orgasm, the camera zooms in on Millie's face for a close-up. She seems exhausted, but she smiles for it anyway. - <<set $activeSlave.counter.vaginal++>> - <br><br> - "That was //fantastic//. I'm going to remember that experience for quite some time, and I'm sure our viewers here and at home will, too! Any last things you would like to say before we cut for break?" - <br><br> - The camera rotates to focus on your slave and $he shakes $himself, apparently regathering $his wits. - <br><br> - <<if $arcologies[0].FSRepopulationFocus != "unset">> - <<if canTalk($activeSlave)>> - "My <<Master>>, <<if SlaveStatsChecker.checkForLisp($activeSlave)>><<= lispReplace(PlayerName())>><<else>><<= PlayerName()>><</if>>, ha<<s>> a vi<<s>>ion for a beautiful future where baby-laden broodmother<<s>> like me aren't the e<<x>><<c>>eption in Free <<C>>itie<<s>> <<s>>o<<c>>iety, but the norm. We both hope that everyone here will <<s>>upport u<<s>>, and <<s>>o we've hidden <<c>>ertificate<<s>> for free pool<<s>> and <<s>>wing<<s>> under everyone'<<s>> <<s>>eat<<s>> — everybody look! If you like what you've <<s>>een today a<<s>> much a<<s>> we hope you have, my <<Master>> and I both hope you'll be filling the<<s>>e invention<<s>> with your own <<s>>lave<<s>>' <<s>>wollen bodie<<s>>, <<s>>oon. And we hope that, <<s>>ome day, everyone watching at home will feel thi<<s>> way, a<<s>> well!" - <<else>> - Since your slave is unable to speak, $he signals the show's video crew to start playing a pre-recorded video in which you explain your vision for a future where specialized hyper-swollen breeding slaves can be found in Free Cities across the world. You then open your arms wide, in the video, and declare that vouchers for free pools and swings have been hidden under the audience's chairs. - <</if>> - <<else>> - <<if canTalk($activeSlave)>> - "My <<Master>>, <<if SlaveStatsChecker.checkForLisp($activeSlave)>><<= lispReplace(PlayerName())>><<else>><<= PlayerName()>><</if>>, ha<<s>> a vi<<s>>ion for a beautiful future where baby-laden broodmother<<s>> like me are all able to enjoy <<s>>e<<x>> with their owner<<s>> and client<<s>>. We both hope that everyone here will <<s>>upport u<<s>>, and <<s>>o we've hidden <<c>>ertificate<<s>> for free pool<<s>> and <<s>>wing<<s>> under everyone'<<s>> <<s>>eat<<s>> — everybody look! If you like what you've <<s>>een today a<<s>> much a<<s>> we hope you have, my <<Master>> and I both hope you'll be filling the<<s>>e invention<<s>> with your own <<s>>lave<<s>>' <<s>>wollen bodie<<s>>, <<s>>oon. And we hope that, <<s>>ome day, everyone watching at home will enjoy hyperpregnant <<s>>e<<x>> with our new toy<<s>>, too!" - <<else>> - Since your slave is unable to speak, $he signals the show's video crew to start playing a pre-recorded video in which you explain your vision for a future where specialized hyper-swollen breeding slaves aren't just a sexual novelty, but enjoyable to fuck in their own right. You then open your arms wide, in the video, and declare that vouchers for free pools and swings have been hidden under the audience's chairs. - <</if>> - <</if>> - The camera zooms out for a nice panning shot of the audience exclaiming and fawning over the vouchers they've found taped to the bottom of their chairs. Finally, it fades to black. diff --git a/src/uncategorized/PESS.tw b/src/uncategorized/PESS.tw index d59d24ef61123ecc307df1dd998740d02846c6d8..b9a614a2f4fae061c3708ecc1bc3fdaa4ceb407b 100644 --- a/src/uncategorized/PESS.tw +++ b/src/uncategorized/PESS.tw @@ -157,11 +157,12 @@ The business is brief and inconsequential, but it's good to speak with $him. Whe <<= App.UI.slaveDescriptionDialog($activeSlave)>> comes wearily into your office at the end of $his day to check in with you, like a good Head Girl should. You're busy at the moment, so $he waits quietly, not wanting to interrupt you. $He seems tired, and leans <<if $activeSlave.physicalAge > 35>>heavily<<else>>lightly<</if>> against the back of the office couch<<if hasAnyProstheticArms($activeSlave)>>, $his mechanical hand hard against the leather<</if>>. Your Head Girl is a <<if $activeSlave.fetish == "dom">>very dominant $desc<<elseif $activeSlave.fetish == "sadist">>sadistic and dominant $desc<<else>>dutiful $desc and takes $his leadership position seriously<</if>>, but $he knows $he doesn't have to pretend to be invincible around you. <br><br> When you've finished your task, you raise your eyes to examine $him. $He's standing with $his <<if $activeSlave.hips > 1>>broad<<elseif $activeSlave.hips < -1>>narrow<<else>>womanly<</if>> hips slightly cocked and $his <<if $activeSlave.muscles > 95>>incredibly muscular<<elseif $activeSlave.weight > 10>>soft<<elseif $activeSlave.muscles > 10>>hard<<else>>trim<</if>> thighs bowed a bit wide. You immediately understand why: it's $his job to impregnate fertile slaves, a duty $he takes very seriously, and $his dick must be very sore. -<<if $activeSlave.clothes == "no clothing">> +<<set _exposure = App.Data.clothes.get($activeSlave.clothes).exposure>> +<<if _exposure >= 4>> $He's nude, making it obvious that $his poor soft member has done its duty today. It even looks a little moist, as though it bred a fertile slave's pussy only a few minutes ago. -<<elseif ["body oil", "chains", "clubslut netting", "restrictive latex", "shibari ropes", "uncomfortable straps"].indexOf($activeSlave.clothes) != -1>> +<<elseif _exposure == 3>> $His clothes don't cover $his dick, making it obvious that $his poor soft member has done its duty today. It even looks a little moist, as though it bred a fertile slave's pussy only a few minutes ago. -<<elseif ["a comfortable bodysuit", "a cybersuit", "a fallen nuns habit", "a latex catsuit", "a leotard", "a monokini", "a scalemail bikini", "a string bikini", "attractive lingerie for a pregnant woman", "attractive lingerie", "harem gauze", "kitty lingerie", "restrictive latex", "striped panties", "slutty jewelry", "spats and a tank top", "stretch pants and a crop-top"].indexOf($activeSlave.clothes) != -1>> +<<elseif _exposure == 2>> $His clothes cover $his groin, but they're pretty tight, making it clear that $his poor soft member has done its duty today. <<else>> $His clothes are relatively modest, so you can't see it, but it's clear that $his poor soft member has done its duty today. diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw index 3de2220374bd4e8d8ed73aaf8ab38afca3b63483..db0b8d9ab0cbda1337a546d52865ef07bb251ab5 100644 --- a/src/uncategorized/RESS.tw +++ b/src/uncategorized/RESS.tw @@ -44,7 +44,7 @@ <<set _clothesTemp = $activeSlave.clothes>> <<switch $RESSevent>> /*Some events start with the slave naked (any event that starts with the daily inspection, for example). Here we switch their clothing just for the image to load, then switch it back quickly so the player's choice is not messed up.*/ -<<case "age implant" "ara ara" "back stretch" "bad dream" "bed snuggle" "bondage gear" "bonded love" "breast expansion blues" "confident tanning" "devoted exhibition" "devoted lotion" "desperate null" "devoted nympho" "extreme aphrodisiacs" "fearful balls" "fucktoy tribbing" "gaped asshole" "happy dance" "heavy piercing" "huge naturals" "huge tits" "hugely pregnant" "ignorant horny" "implant inspection" "language lesson" "mindbroken morning" "modest clothes" "mods please" "old PC age difference" "orchiectomy please" "PA flirting" "penitent" "permitted masturbation" "plimb help" "rebellious arrogant" "resistant gelding" "resistant shower" "resting amp" "restricted profession" "restricted smart" "sexy succubus" "shaped areolae" "shift masturbation" "shift sleep" "shower slip" "slave dick huge" "sleeping ambivalent" "sore shoulders" "spa boobs" "subjugation blues" "tendon fall" "terrified inspection" "tittymonster inspection" "torpedo squeeze" "transition anxiety" "trusting HG" "unhappy virgin" "used whore" "vocal disobedience" "young PC age difference">> +<<case "age implant" "ara ara" "back stretch" "bad dream" "bonded love" "breast expansion blues" "confident tanning" "devoted exhibition" "devoted lotion" "desperate null" "devoted nympho" "extreme aphrodisiacs" "fearful balls" "fucktoy tribbing" "gaped asshole" "happy dance" "heavy piercing" "huge naturals" "huge tits" "hugely pregnant" "ignorant horny" "implant inspection" "language lesson" "mindbroken morning" "modest clothes" "mods please" "old PC age difference" "orchiectomy please" "PA flirting" "penitent" "permitted masturbation" "plimb help" "rebellious arrogant" "resistant gelding" "resistant shower" "resting amp" "restricted profession" "restricted smart" "sexy succubus" "shaped areolae" "shift masturbation" "shift sleep" "shower slip" "slave dick huge" "sleeping ambivalent" "sore shoulders" "spa boobs" "subjugation blues" "tendon fall" "terrified inspection" "tittymonster inspection" "torpedo squeeze" "transition anxiety" "trusting HG" "unhappy virgin" "used whore" "vocal disobedience" "young PC age difference">> <<set $activeSlave.clothes = "no clothing">> <<case "whore rebellious">> /* this scene states they are wearing "thick, durable latex with temperature regulation and anchor points for restraint" no matter what they are assigned to wear. */ @@ -157,7 +157,7 @@ Finishing your work, you lean back for a well-deserved break. Your peace is quic but you quickly grab $his arm, pull it towards you and lock it in $his back, pushing $him over the desk. <</if>> <<set $mutinery = 0>> -<<elseif ($PC.career == "escort" || PC.career == "prostitute" || PC.career == "child prostitute")>> +<<elseif (isPCCareerInCategory("escort"))>> but you simply give $him a kick to the groin; $he wouldn't be the first person to try this shit on you. <<set $mutinery = 0>> <<elseif ($PC.career == "slaver" || $PC.career == "slave overseer") || $PC.skill.slaving >= 20>> @@ -304,58 +304,6 @@ With $his back arched and $his thighs together $his <<if $activeSlave.butt > 5>> "<<S>>orry, <<Master>>," $he <<say>>s apologetically. "I'm okay. Ye<<s>>terday wa<<s>> arm day for me, and I went out a little too hard. My <<sh>>oulder<<s>> are kinda <<s>>ore, but I'm alright." <</if>> -<<case "bed snuggle">> - -<<= capFirstChar($assistant.name)>> wakes you in the morning, -<<if $assistant.personality <= 0>> - _hisA voice -<<else>> - <<switch $assistant.appearance>> - <<case "monstergirl">> - _hisA monster<<= _girlA>> avatar's sultry voice - <<case "shemale">> - _hisA shemale avatar's syrupy voice - <<case "amazon">> - _hisA amazon avatar's powerful voice - <<case "businesswoman">> - _hisA business<<= _womanA>> avatar's confident voice - <<case "fairy" "pregnant fairy">> - _hisA fairy avatar's adorable voice - <<case "schoolgirl">> - _hisA school<<= _girlA>> avatar's bubbly voice - <<case "loli" "preggololi">> - _hisA _loliA avatar's childish voice - <<case "angel">> - _hisA angel avatar's heavenly voice - <<case "cherub">> - _hisA cherub avatar's cheerful voice - <<case "incubus">> - _hisA incubus avatar's forceful voice - <<case "succubus">> - _hisA succubus avatar's sultry voice - <<case "imp">> - _hisA imp avatar's mischievous voice - <<case "witch">> - _hisA witch avatar's cocky voice - <<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">> - _hisA avatar's piecemeal voice - <<default>> - _hisA voice - <</switch>> -<</if>> -gently calling your name. As you regain consciousness, you become aware of a weight on your chest<<if $PC.boobs >= 1400>> other than your heavy tits<</if>>. <<= App.UI.slaveDescriptionDialog($activeSlave)>> has snuggled up against you in $his sleep. $He's nude, and so are you; everyone sleeps naked in your penthouse. The sheet is down at your hips, leaving your upper bodies bare. <<if !hasAnyArms($activeSlave)>>$He's wormed $his <<if isAmputee($activeSlave)>>limbless<<else>>armless<</if>> torso under your arm,<<else>>$He has one arm across your <<if $PC.boobs >= 300>>chest, just below your breasts,<<elseif $PC.title == 1>>manly chest<<else>>flat chest,<</if>><</if>> and is using your shoulder as a pillow. You can feel $his warm breath across <<if $PC.boobs >= 300 || $PC.title == 0>>your nipple on that side, and it hardens slowly under your gaze<<else>>your well-developed pectorals<</if>>. $His <<if $activeSlave.boobs > 4000>>incredible tits are resting to either side of your ribcage, with one of them a heavy mass on your chest and the other trapped under $his<<elseif $activeSlave.boobs > 1200>>big boobs form a warm, soft mass between you<<else>>soft chest rests warmly against your ribcage<</if>><<if $activeSlave.belly >= 10000>>, beneath them, $his _belly <<if $activeSlave.bellyPreg >= 8000>>pregnant <</if>>belly rests <<if $PC.belly >= 1500>>against your own baby bump<<else>>upon your flat stomach<</if>><</if>>, and farther down, there's another source of warmth where $he's <<if !hasAnyLegs($activeSlave)>>got $his legless pelvis resting against your hip<<else>>straddling your thigh<</if>>. -<br><br> -"<<= properTitle()>>," $assistant.name calls again, "you <<if $assistant.personality <= 0>>set a wake up for this time<<else>>asked me to wake you at this time<</if>>. You have a business meeting that starts shortly." You begin to slide out from under $activeSlave.slaveName, but the -<<if $activeSlave.physicalAge > 30>> - $woman -<<elseif $activeSlave.physicalAge > 18>> - $girl -<<elseif $activeSlave.physicalAge > 12>> - teen -<<else>> - kid -<</if>> -clings to you in $his sleep as the warmth of your body begins to move away from $him. <<case "confident tanning">> @@ -707,9 +655,9 @@ The source of the many-voiced personal assistant becomes clear: probably on the One night, you see <<= App.UI.slaveDescriptionDialog($activeSlave)>> <<if (!hasAnyLegs($activeSlave))>> scooting $himself from side to side uncomfortably, -<<elseif ($activeSlave.heels == 1 && shoeHeelCategory($activeSlave) == 0))>> +<<elseif ($activeSlave.heels == 1 && shoeHeelCategory($activeSlave) == 0)>> crawling gingerly, -<<elseif (shoeHeelCategory($activeSlave) > 1))>> +<<elseif (shoeHeelCategory($activeSlave) > 1)>> tottering along painfully, <<else>> walking a little funny, @@ -927,27 +875,6 @@ One day, you give $him inconsequential orders, naturally addressing $him by $his <</if>> $He sets $his jaw and <<if canSee($activeSlave)>>manages to meet your eyes without flinching<<else>>meets your glare with a look of defiance<</if>>. -<<case "bondage gear">> - -One day, you catch sight of <<= App.UI.slaveDescriptionDialog($activeSlave)>> -<<if ($activeSlave.heels == 1 && shoeHeelCategory($activeSlave) == 0)>> - crawling -<<elseif shoeHeelCategory($activeSlave) > 1>> - tottering -<<else>> - walking -<</if>> -around stark naked. This is unacceptable, as $he has been ordered to wear humiliating and uncomfortable bondage gear. When confronted, -<<if !canTalk($activeSlave)>> - <<if !hasAnyArms($activeSlave)>> - $he tries to communicate $his reluctance to wear the clothing as best as $he can with various head movements and facial expressions<<if $activeSlave.bellyPreg >= 5000>>, including several nods towards $his rounded middle<</if>>. - <<else>> - $he uses gestures to communicate $his embarrassment with $his clothing, covering $his nipples, crotch, and anus with $his hand<<if hasBothArms($activeSlave)>>s<</if>> one after the other, and begging for clothes that do the same.<<if $activeSlave.bellyPreg >= 5000>> $He also gestures to $his rounded belly with a look of concern.<</if>> - <</if>> -<<else>> - $he <<say>>s fearfully, "I'm <<s>>orry, <<Master>>, but tho<<s>>e thing<<s>> are ju<<s>>t <<s>>o embarra<<ss>>ing!<<if $activeSlave.bellyPreg >= 5000>> I'm al<<s>>o worried for my <<if $activeSlave.pregType > 1>>babie<<s>>'<<else>>baby'<<s>><</if>> <<s>>afety.<</if>>" -<</if>> - <<case "vocal disobedience">> One morning, despite the fact that $he is not allowed to speak without being spoken to, <<= App.UI.slaveDescriptionDialog($activeSlave)>> <<if canSee($activeSlave)>>looks you directly in the eye<<else>>faces you<</if>> and asks @@ -3168,12 +3095,6 @@ I didn't mean to <<s>>ound con<<c>>eited, either. I gue<<ss>> I'm <<s>>till gett <<set $activeSlave.fetishKnown = 1>> <</if>> -<<case "arcade sadist">> - -You happen to come across <<= App.UI.slaveDescriptionDialog($activeSlave)>> during one of $his rest periods. $He's lying on a couch in the slave areas, <<if canSee($activeSlave)>>staring at the ceiling above $him<<else>>leaning back<</if>> with a dreamy expression on $his face. $He's <<if $activeSlave.rules.release.masturbation == 1>>touching $himself idly.<<else>>not allowed to touch $himself, but $he's extremely aroused.<</if>> Whatever's on $his mind, it's so absorbing that $he doesn't realize you're there until you're standing over $him. -<br><br> -"<<S>>orry, <<Master>>," $he <<say>>s apologetically, <<if $activeSlave.belly >= 10000>>struggling<<else>>scrambling<</if>> to $his feet. "I didn't noti<<c>>e you there." <<if canSee($activeSlave)>>Seeing your questioning look<<elseif canHear($activeSlave)>>Hearing your lack of response<<else>>Sensing a request to continue<</if>>, $he explains $himself further. "I was ju<<s>>t thinking about, um, my favorite pla<<c>>e. I can almo<<s>>t get off ju<<s>>t by thinking about it." There's a wild, perverted gleam <<if canSee($activeSlave)>>in $his <<= App.Desc.eyesColor($activeSlave)>><<else>>on $his face<</if>>. $He's a confirmed sadist, so whatever $his favorite mental masturbation is probably quite strong. - <<case "servant maid">> <<= App.UI.slaveDescriptionDialog($activeSlave)>> is scheduled to clean your office today, just one of $his many duties as a servant in your penthouse. $He pauses in the doorway of your office for a moment, only entering once it becomes clear that you're not going to be using $him immediately. @@ -3287,84 +3208,17 @@ One afternoon, $assistant.name informs you $he that $he has a non-urgent matter brings up a video feed. <br><br> $activeSlave.slaveName is doing $his job, standing in an area of the arcology that's busy at this time of night, <<if $activeSlave.energy > 95>>eagerly<<elseif $activeSlave.devotion > 95>>diligently<<elseif $activeSlave.devotion > 20>>obediently<<else>>reluctantly<</if>> showing off $his -<<if $activeSlave.clothes == "no clothing">> - nude <<if $activeSlave.bellyPreg >= 1500>>pregnant <<elseif $activeSlave.bellyImplant >= 1500>>gravid <<elseif $activeSlave.bellyFluid >= 1500>>bloated <</if>>body +<<if $activeSlave.bellyPreg >= 1500>> + pregnant +<<elseif $activeSlave.bellyImplant >= 1500>> + gravid +<<elseif $activeSlave.bellyFluid >= 1500>> + bloated +<</if>> +<<if App.Data.clothes.get($activeSlave.clothes).exposure >= 4>> + nude body <<else>> - <<if $activeSlave.bellyPreg >= 1500>>pregnant <<elseif $activeSlave.bellyImplant >= 1500>>gravid <<elseif $activeSlave.bellyFluid >= 1500>>bloated <</if>>body in $his - <<switch $activeSlave.clothes>> - <<case "a toga">> - toga - <<case "a huipil">> - huipil - <<case "a long qipao" "a slutty qipao">> - qipao - <<case "a penitent nuns habit">> - habit - <<case "a slave gown" "a ball gown">> - gown - <<case "a comfortable bodysuit">> - bodysuit - <<case "a leotard">> - leotard - <<case "a bunny outfit">> - bunny outfit - <<case "a nice nurse outfit">> - nurse outfit - <<case "a slutty nurse outfit">> - slutty nurse outfit - <<case "a schoolgirl outfit">> - school clothes - <<case "a hijab and abaya">> - hijab and abaya - <<case "a kimono">> - kimono - <<case "a nice maid outfit">> - maid outfit - <<case "a slutty maid outfit">> - skimpy maid outfit - <<case "a biyelgee costume" "a dirndl" "a halter top dress" "a mini dress" "a maternity dress">> - dress - <<case "a latex catsuit">> - latex catsuit - <<case "a military uniform" "a mounty outfit" "a red army uniform" "a schutzstaffel uniform" "a slutty schutzstaffel uniform">> - uniform - <<case "battlearmor">> - battlearmor - <<case "Imperial Plate">> - imperial armor - <<case "lederhosen">> - lederhosen - <<case "spats and a tank top">> - spats - <<case "a burkini" "a monokini">> - swimsuit - <<case "a chattel habit" "a fallen nuns habit">> - slutty habit - <<case "a cheerleader outfit">> - cheerleader outfit - <<case "a cybersuit">> - cybersuit - <<case "a tight Imperial bodysuit">> - imperial bodysuit - <<case "an apron">> - apron - <<case "a scalemail bikini">> - scalemail bikini - <<case "a slutty outfit">> - slutty outfit - <<case "a string bikini">> - string bikini - <<case "a succubus outfit">> - succubus getup - <<case "a hijab and blouse" "conservative clothing">> - conservative clothes - <<case "a bimbo outfit">> - bimbo outfit - <<case "a courtesan dress">> - courtesan dress - <<default>> - $activeSlave.clothes - <</switch>> + body in $his <<= App.Data.clothes.get($activeSlave.clothes).name.toLowerCase()>> <</if>> and flirting with passersby. Or $he would be, if $he weren't surrounded by a group of shame-faced college boys. They're very obviously rich, naïve, and inexperienced with both sex and the Free Cities, and their complete lack of confidence in approaching $activeSlave.slaveName make that clear. <br><br> @@ -4035,7 +3889,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. $He doesn't move from this position and barely reacts to your prodding; it seems $his mind was still fragile, $he'll likely be back to $his usual blank self when you awake. <<run seX($activeSlave, "vaginal", $PC, "penetrative")>> <<if canImpreg($activeSlave, $PC)>> - <<= knockMeUp($activeSlave, 5, 0, -1, 1)>> + <<run knockMeUp($activeSlave, 5, 0, -1)>> <</if>> <<elseif canDoAnal($activeSlave)>> force $his ass into the air. @@ -4048,7 +3902,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <</if>> $He doesn't move from this position and barely reacts to your prodding; it seems $his mind was still fragile, $he'll likely be back to $his usual blank self when you awake. <<if canImpreg($activeSlave, $PC)>> - <<= knockMeUp($activeSlave, 5, 1, -1, 1)>> + <<run knockMeUp($activeSlave, 5, 1, -1)>> <</if>> <<run seX($activeSlave, "anal", $PC, "penetrative")>> <<else>> @@ -4534,7 +4388,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. You struggle underneath $his grip and manage to wriggle your arms free. You push at the amorous bull and attempt to lift the heavy $girl off you. $activeSlave.slaveName takes this poorly and rams $his gigantic dick straight into your vagina and through your cervix. You pass out from the pain. <br><br> You awaken some time later, your crotch extremely sore and your belly slightly bloated. Most of $his deposit has flowed back out of you, but you still feel a fair amount sloshing inside you. You sigh to yourself, knowing you have nobody to blame but yourself for this. $He's a breeding bull and you a fertile _womanP. $He only did what $he was conditioned for; the fault is on you for ignoring the warning signs and not taking the proper precautions. Still, there is no doubt in your mind that @@.lime;you're pregnant@@ with $his child. - <<= knockMeUp($PC, 100, 0, $activeSlave.ID, 1)>> + <<run knockMeUp($PC, 100, 0, $activeSlave.ID)>> <<run seX($activeSlave, "penetrative", $PC, "vaginal", 4)>> <</if>> <</replace>> @@ -4544,7 +4398,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. $He is far stronger than you expected and has you trapped in a compromising position. You've seen $activeSlave.slaveName fuck before; $he's a quick shot, only in it to get $his mate pregnant. $He cums so hard $he nearly blacks out; that will be your best chance to escape $him. You question your choice as $his gigantic dick pokes at your crotch, eager to find the egg at the end of the tunnel. $He lacks even the basic understanding of foreplay, you realize, as $he drives $his cock deep into your pussy. You groan with pain at the sheer size of the rod stretching out your poor hole and struggle to hold back the tears once $he starts thrusting. There is no pleasure for you here as $he batters your cervix; should $he force through it, you may not be able to throw $him off. With a loud grunt, $he does just that. $He may be deep seated now, but you aren't going to give up. You feel $him tense up; now's your chance! As $he climaxes, you slip a leg around $his side and push $him with all your might. $He flops over, pulling out as $he spurts $his massive load and nailing you right in the face. You spit the jism out of your mouth and quickly restrain the dribbling bull. <br><br> Panting, you look over the damage: Your pussy is gaping, there is semen everywhere, and given the steady flow from you, $he likely got some of that ejaculation in you. You sigh to yourself, knowing you have nobody to blame but yourself for this. $He's a breeding bull and you, a fertile _womanP. $He only did what $he was conditioned for; the blame is on you for ignoring the warning signs and not taking the proper precautions. Still, $he knew you were fertile and went right for the prize; it would be wise to assume you've been impregnated. - <<= knockMeUp($PC, 20, 0, $activeSlave.ID, 1)>> + <<run knockMeUp($PC, 20, 0, $activeSlave.ID)>> <<run seX($activeSlave, "penetrative", $PC, "vaginal")>> <</replace>> <</link>> @@ -4594,7 +4448,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <<else>> to $activeSlave.slaveName snoring beside you, $his massive cock soft and slightly drooling cum. Most of $his deposit has flowed back out of you, but you're still heavy with sperm. You sigh to yourself, knowing you have nobody to blame but yourself for this. $He's a breeding bull and you a fertile _womanP. $He only did what $he was conditioned for; the fault is on you for ignoring the warning signs and not taking the proper precautions. Still, there is no doubt in your mind that @@.lime;you're pregnant@@ with $his child. <</if>> - <<= knockMeUp($PC, 100, 0, $activeSlave.ID, 1)>> + <<run knockMeUp($PC, 100, 0, $activeSlave.ID)>> <<run seX($activeSlave, "penetrative", $PC, "vaginal", 4)>> <</replace>> <</link>> @@ -4857,137 +4711,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <</replace>> <</link>> -<<case "bed snuggle">> - -<<link "Make the meeting">> - <<replace "#result">> - <<set _meetingBonus = Math.trunc($cash/10000)*1000>> - <<if _meetingBonus > 5000>> - <<set _meetingBonus = 5000>> - <<elseif _meetingBonus < 1000>> - <<set _meetingBonus = 1000>> - <</if>> - You finish the motion and get on with your day. $He burrows into the warm place on the bed where your body lay, which is actually an excellent sign of $his mental state. It suggests that $his dreaming mind is quite comfortable with your presence<<if canSmell($activeSlave)>> and even smell<</if>>. You make the meeting, consoling yourself with the thought that you're hardly lacking for opportunities to <<if $PC.dick != 0>>stick your dick in<<else>>have sex with<</if>> $activeSlave.slaveName. The business opportunity turns out to be @@.yellowgreen;quite profitable;@@ you're glad you didn't pass it up. - <<run cashX(_meetingBonus, "event", $activeSlave)>> - <</replace>> -<</link>> -<br><<link "Call in from where you are">> - <<replace "#result">> - <<set _meetingBonus = Math.trunc($cash/10000)*1000>> - <<if _meetingBonus > 5000>> - <<set _meetingBonus = 5000>> - <<elseif _meetingBonus < 1000>> - <<set _meetingBonus = 1000>> - <</if>> - You tell $assistant.name to inform your business contacts that you'll be attending the meeting by telepresence. A camera mounted above you focuses tightly on your face, making it look like you're relaxing, but concealing the fact that you have a naked - <<if $activeSlave.physicalAge > 30>> - $woman - <<elseif $activeSlave.physicalAge > 18>> - $girl - <<elseif $activeSlave.physicalAge > 12>> - teen - <<else>> - kid - <</if>> - draped across you. The meeting is long enough that your interlocutors eventually realize that something unusual is going on, especially once $he wakes up and starts sleepily <<if $PC.dick != 0>>sucking your dick<<if $PC.vagina != -1>> and <</if>><</if>><<if $PC.vagina != -1>>eating you out<</if>>, out of frame. They're @@.health.dec;slightly annoyed,@@ since having sex during meetings is still considered a minor faux pas, but you @@.yellowgreen;close the deal,@@ and $activeSlave.slaveName is @@.hotpink;very pleased@@ that you would rearrange your affairs to make time for <<if $PC.dick != 0>>one of $his blowjobs<<else>>oral sex with $him<</if>>. - <<run seX($activeSlave, "oral", $PC, "penetrative")>> - <<run cashX(_meetingBonus, "event", $activeSlave)>> - <<run repX(forceNeg(50), "event", $activeSlave)>> - <<set $activeSlave.devotion += 4>> - <</replace>> -<</link>> -<br><<link "Go back to sleep">> - <<replace "#result">> - You tell $assistant.name to cancel the appointment, plant a kiss atop your bedmate's sleeping head, and go back to sleep yourself, with the peerless comfort of a warm, naked - <<if $activeSlave.physicalAge > 30>> - $woman - <<elseif $activeSlave.physicalAge > 18>> - $girl - <<elseif $activeSlave.physicalAge > 12>> - teen - <<else>> - kid - <</if>> - cuddled up beside you. <<= capFirstChar($assistant.name)>> lowers the temperature in the room and directs another slave to quietly put a couple of warm blankets over you and $activeSlave.slaveName. When you finally wake, several hours later, the effect is magical. You're ensconced in a little island of warmth and comfort, a tiny universe of relaxation populated only by yourself and your slave. $He woke before you did, but remained still to avoid disturbing you. <<if canSee($activeSlave)>>From the lazy, contented look in $his <<= App.Desc.eyesColor($activeSlave)>> as $he meets your waking gaze, $he did not mind waiting. @@.hotpink;$He was already looking at your face when you opened your eyes.@@<<else>>From the serene expression on $his face as $he meets your waking gaze, $he did not mind waiting. @@.hotpink;$He was already looking at your face, lost in the soothing sounds of your breathing, when you opened your eyes.@@<</if>> - <br><br> - Since you're awake, $he rolls onto $his face and then further, to place $his back and <<if $activeSlave.butt > 5>>massive ass<<elseif $activeSlave.butt > 2>>healthy rear<<else>>butt<</if>> against you, making sure to drag $his $activeSlave.nipples nipples against you the whole way. You accept the invitation and spoon $him, <<if $activeSlave.height >= 185>>your bodies lining up well, since $he's as tall as you are<<elseif $activeSlave.height >= 160>>$his body fitting neatly within the embrace of your larger frame<<else>>$his small body fitting entirely within your embrace<</if>>. $His <<if $activeSlave.muscles > 30>>muscles<<else>>softness<</if>> and warmth awaken your desire, and $he feels <<if $PC.dick != 0>>your stiffening cock beginning to press against <<if !hasBothLegs($activeSlave)>>$his perineum. $He shifts to slide $himself along its shaft<<if $PC.vagina != -1>> and down to where your pussy begins<</if>><<else>>the place between $his thighs. $He shifts to let your dick slide between them, and reaches down to massage its head<</if>><<else>>heat building against $his butt. <<if !hasAnyArms($activeSlave)>>$He does $his best to grind against you, since $he can't caress you without hands<<else>>$He snakes a hand behind $himself to caress your womanhood, and begins to gently <<if hasBothArms($activeSlave)>>masturbate with the other<<else>>grind against you<</if>><</if>><</if>>. - <<if $PC.dick != 0>> - <<if ($activeSlave.vagina > 0) && ($activeSlave.anus > 0) && canDoVaginal($activeSlave) && canDoAnal($activeSlave)>> - $He begins to shift farther forward and back along your dick, causing its head to press against $his anus and then slide forward to nestle between $his pussylips. In response to $his wordless question, you nibble $his ear and tell $him that it's $his choice. $He turns $his upper torso to <<if canSee($activeSlave)>>stare at you in surprise<<else>>so that you may see $his surprise<</if>> for a moment, and then smiles and gives you a peck on the cheek. - <<if ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>> - $He hikes $himself up a bit, and then slides $his anal sphincter slowly around and down your cock until you're resting all the way up $his ass. You share loving anal - <<set _didAnal = 1>> - <<else>> - $He hikes $himself up to give your dickhead a last teasing press against $his butt before cocking $his hips and sliding your cock into $his soaking cunt. You make love - <<set _didVaginal = 1>> - <</if>> - <<elseif ($activeSlave.vagina > 0) && canDoVaginal($activeSlave)>> - $He cocks $his hips and so that your cock is pressing against $his soaked cunt. In response to $his wordless question, you nibble $his ear and tell $him that it's $his choice. $He turns $his upper torso to <<if canSee($activeSlave)>>stare at you in surprise<<else>>so that you may see $his surprise<</if>> for a moment, and then smiles and gives you a peck on the cheek. - <<if ($activeSlave.fetish == "pregnancy") && ($activeSlave.fetishKnown == 1) && isFertile($activeSlave)>> - $He pushes against you until you are fully inserted into $his pussy. $He's ripe for impregnation and needs your baby in $him. You make love - <<elseif ($activeSlave.vagina > 2)>> - $He easily slides your cock into $his loose pussy. You make love - <<else>> - $He hikes $himself up a bit, and then gently slides your cock into $his tight pussy. You make love - <</if>> - <<set _didVaginal = 1>> - <<elseif $activeSlave.anus > 0 && canDoAnal($activeSlave)>> - $He begins to shift farther forward along your dick, causing its head to press against $his anus. In response to $his wordless question, you nibble $his ear and tell $him that it's $his choice. $He turns $his upper torso to <<if canSee($activeSlave)>>stare at you in surprise<<else>>so that you may see $his surprise<</if>> for a moment, and then smiles and gives you a peck on the cheek. - <<if ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishKnown == 1)>> - $He hikes $himself up a bit, and then slides $his anal sphincter slowly around and down your cock until you're resting all the way up $his ass. You share loving anal - <<set _didAnal = 1>> - <<elseif ($activeSlave.anus > 2)>> - $He hikes $himself up a bit, and then easily slides your cock into $his loose rectum. You share loving anal - <<set _didAnal = 1>> - <<else>> - $He decides against buttsex, and <<if !hasBothLegs($activeSlave)>>contents $himself with grinding<<else>>presses $his thighs together so you can frot $him.<</if>> After making love - <</if>> - <<else>> - You <<if !hasBothLegs($activeSlave)>>grind against $him<<else>>frot $him<</if>> - <</if>> - <<else>> - You reach around $him and attend to a nipple with each hand, spreading your attention to the whole breast once they<<if $activeSlave.nipples != "fuckable">>'re perfectly stiff<<else>>'ve tightened around your fingers<</if>>. After sharing gentle lovemaking - <</if>> - for a while, until you sense that $he's on the edge of climax. Without warning, you lift the edge of the blankets and send a gust of cool air down $his front and <<if $activeSlave.dick > 0>>right onto $his cock<<else>>across $him <<if $activeSlave.nipples != "fuckable">>hard<<else>>engorged<</if>> nipples<</if>>. $He gasps at the sudden overstimulation and then orgasms very strongly, jerking against you - <<if !canTalk($activeSlave)>> - and panting in lieu of an exclamation. - <<else>> - and <<say>>ing "oh" over and over again. - <</if>> - <<if $PC.dick != 0>>$He clenches against your dick,<<if $PC.vagina != -1>> so hard that you can feel the rush of blood into your cunt,<</if>><<else>>$He works your pussy harder,<</if>> getting you off in turn, and then rolls over to plant a whole-hearted kiss on your lips. - <<set $activeSlave.devotion += 4>> - <<if _didAnal == 1>> - <<= VCheck.Anal($activeSlave, 1)>> - <<elseif _didVaginal == 1>> - <<= VCheck.Vaginal($activeSlave, 1)>> - <</if>> - <</replace>> -<</link>> -<br><<link "Spend the day in bed">> - <<replace "#result">> - What's the point of becoming a wealthy tycoon in an anarcho-libertarian paradise if you have to obey the rules all the time? You tell $assistant.name to cancel the appointment. Then, you wake your bedmate, and <<if $PC.dick != 0>>get a blowjob<<if $PC.vagina != -1>> and some attention for your pussy<</if>><<else>>have $him eat you out<</if>> under the sheet while you enjoy the lurid sunrise through the glass wall of your bedroom. When the sun is up and you've <<if $PC.dick != 0>>shot your load down $his throat<<else>>climaxed twice<</if>>, you pull the bemused $girl up alongside you again, bring the sheets up over you both, switch on a wallscreen, and ask $him if there's anything $he'd like to <<if canSee($activeSlave)>>watch<<elseif canHear($activeSlave)>>listen to<<else>>put on<</if>>. $He smiles incredulously, but after you encourage $him $he @@.mediumaquamarine;finds $his confidence@@ and admits that there's a Free Cities serial drama about slave life that $he enjoys. You put it on and watch three episodes with $him. It's terribly insipid, but there's a lot of explicit sex to liven things up, and all the actresses are nice enough to look at. $activeSlave.slaveName cuddles comfortably with you the entire time, <<if canSee($activeSlave)>>watching raptly<<elseif canHear($activeSlave)>>listening intently<<else>>staying as silent as possible<</if>> and doing $his best to explain the wretchedly trite plot you've missed. - <<run seX($activeSlave, "oral", $PC, "penetrative")>> - You have a meal delivered, - <<if $activeSlave.vagina > 0 && canDoVaginal($activeSlave)>> - fuck $him, - <<set _didVaginal = 1>> - <<elseif $activeSlave.anus > 0 && canDoAnal($activeSlave)>> - fuck $his butt, - <<set _didAnal = 1>> - <<else>> - fuck $him, - <<run seX($activeSlave, "oral", $PC, "penetrative")>> - <</if>> - and then share a shower and a nap. Thus invigorated, you decide to tour the arcology's nightlife, and tell $him $he'll accompany you. $He hurries to get ready, filled with excitement. A lovely day. - <<set $activeSlave.trust += 4>> - <<if _didAnal == 1>> - <<= VCheck.Anal($activeSlave, 1)>> - <<elseif _didVaginal == 1>> - <<= VCheck.Vaginal($activeSlave, 1)>> - <</if>> - <</replace>> -<</link>> - <<case "confident tanning">> <<link "Ask $him if $he needs help with $his tan">> @@ -5828,7 +5551,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <<else>> You gather the limp nympho in your arms and carry $him to your private bath, which is all ready and filled with steaming water. $activeSlave.slaveName groans with pleasure as you lower $him, still cradled in your arms, into the water. <</if>> - $He nuzzles $his $activeSlave.skin cheek against your <<if ($PC.boobs >= 300)>>breasts<<else>>chest<</if>>, eyes closed in @@.hotpink;bliss.@@ + $He nuzzles $his $activeSlave.skin cheek against your <<if ($PC.boobs >= 300)>>breasts<<else>>chest<</if>>, @@.hotpink;eyes closed in bliss.@@ <<set $activeSlave.devotion += 4>> <</replace>> <</link>> @@ -6709,7 +6432,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <<set $activeSlave.trust -= 5, $activeSlave.devotion -= 5, $activeSlave.anus++>> <</if>> <<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">> - <<= knockMeUp($activeSlave, 25, 2, -2, 1)>> + <<run knockMeUp($activeSlave, 25, 2, -2)>> <</if>> <<else>> <<if $activeSlave.vagina == 0>> @@ -6717,7 +6440,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <<set $activeSlave.trust -= 5, $activeSlave.devotion -= 5, $activeSlave.vagina++>> <</if>> <<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">> - <<= knockMeUp($activeSlave, 25, 0, -2, 1)>> + <<run knockMeUp($activeSlave, 25, 0, -2)>> <</if>> <</if>> <<elseif canDoAnal($activeSlave)>> @@ -6726,7 +6449,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. After the patrons have their way with $him, @@.lime;$he's certainly no longer an anal virgin.@@ $He @@.mediumorchid;hates@@ losing $his anal virginity in such an undignified manner and @@.gold;fears@@ what will be taken from $him next. <<set $activeSlave.trust -= 5, $activeSlave.devotion -= 5, $activeSlave.anus++>> <<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">> - <<= knockMeUp($activeSlave, 50, 1, -2, 1)>> + <<run knockMeUp($activeSlave, 50, 1, -2)>> <</if>> <</if>> <</if>> @@ -6817,85 +6540,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <</link>> <</if>> -<<case "bondage gear">> - -<<link "Let $him go naked">> - <<replace "#result">> - <<if canWalk($activeSlave)>>$He skips away happily,<<elseif isAmputee($activeSlave)>>$He wriggles $his stumps with pleasure,<<else>>$He cheerfully leaves your office,<</if>> overjoyed to be free of the clothing you ordered $him to wear. $His obedience to you @@.mediumorchid;has decreased,@@ as has @@.mediumaquamarine;$his fear@@ of you. - <<set $activeSlave.devotion -= 5, $activeSlave.trust += 4>> - <</replace>> -<</link>> -<br><<link "Force $him to choose between $his straps and public nudity">> - <<replace "#result">> - You tell $him that you understand, and that $he can go naked; $he looks thrilled until you tell $him $he'll be walking every hallway in $arcologies[0].name today, nude. Before $he can protest, you add that $his only other option is to put $his proper clothes back on and be a good little bitch. - <<if $activeSlave.fetish == "humiliation">> - $He @@.hotpink;happily accepts the alternative,@@ - <<if canAchieveErection($activeSlave) && !($activeSlave.chastityPenis)>> - $his dick hardening - <<elseif $activeSlave.dick > 0>> - $his dick leaking precum - <<elseif $activeSlave.vagina > 0>> - $his pussy moistening - <<else>> - $his nipples <<if $activeSlave.nipples != "fuckable">>hardening<<else>>swelling<</if>> - <</if>> - with anticipation. - <<set $activeSlave.devotion += 4, $activeSlave.clothes = "no clothing">> - <<if $activeSlave.fetishKnown == 0>> - That was not the response you expected; turns out $he has a @@.lightcoral;humiliation fetish.@@ - <<set $activeSlave.fetishKnown = 1>> - <</if>> - <<else>> - $He shudders and @@.gold;hurries to get $his straps back on.@@ - <<set $activeSlave.trust -= 5>> - <</if>> - <</replace>> -<</link>> -<<if $activeSlave.buttplug == "none" && ($activeSlave.vagina < 0 || ($activeSlave.vaginalAccessory == "none" && $activeSlave.vaginalAttachment == "none"))>> - <br><<link "Add dildos to $his gear">> - <<replace "#result">> - You tell $him that you understand, and that you will get $him some new clothing. $He is thrilled, but $his pleasure turns to horror when $he sees that the new clothes are a version of the same slave bondage gear, just with inward-facing dildos for $his <<if $activeSlave.vagina > -1>>pussy and <</if>> asshole. - <<if $activeSlave.anus == 0 && $activeSlave.vagina == 0 && canDoAnal($activeSlave) && canDoVaginal($activeSlave)>> - You pause before getting $him dressed; there's little reason to waste virginities on plugs. You <<if $PC.dick != 0>>stroke yourself to erection<<else>>don a strap-on<</if>> and bend $him over, opting to start with $his tight pussy. - <<= VCheck.Both($activeSlave, 1)>> - <<elseif $activeSlave.anus == 0 && canDoAnal($activeSlave)>> - You pause before getting $him dressed; there's little reason to waste $his anal virginity on a plug. You <<if $PC.dick != 0>>stroke yourself to erection<<else>>don a strap-on<</if>> and bend $him over before working your way into $his tight anus. - <<= VCheck.Anal($activeSlave, 1)>> - <<elseif $activeSlave.vagina == 0 && canDoVaginal($activeSlave)>> - You pause before getting $him dressed; there's little reason to waste $his virginity on a plug. You <<if $PC.dick != 0>>stroke yourself to erection<<else>>don a strap-on<</if>> and bend $him over before working your way into $his tight pussy. - <<= VCheck.Vaginal($activeSlave, 1)>> - <</if>> - For the rest of the week, $he walks around awkwardly, unable to find a comfortable position <<if $activeSlave.belly >= 1500>>between<<else>>since<</if>> $his <<if $seeRace == 1>>$activeSlave.race <</if>>body <<if $activeSlave.belly < 1500>>is<</if>> being penetrated by $his own clothing<<if $activeSlave.belly >= 1500>> and the straps digging into $his _belly rounded belly<</if>>. @@.hotpink;$He has become more submissive.@@ - <</replace>> - <<set $activeSlave.devotion += 4>> - <</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>> -<</if>> -<<if $arcade > 0>> - <br><<link "Sentence $him to a month in the arcade">> - <<replace "#result">> - $activeSlave.slaveName screams and begs when $he realizes what $his punishment is, but you are obdurate. - <<if ($activeSlave.muscles > 30)>> - $His powerful form has to be sedated for immurement in the arcade. - <<elseif ($activeSlave.weight >= 190)>> - $He is so massively fat that immuring $him in the arcade is a struggle, even when $he isn't trying to. - <<elseif $activeSlave.belly >= 120000>> - $He is so enormously gravid that immuring $him in the arcade is a hassle, even though $his _belly middle limits $his ability to struggle. - <<elseif ($activeSlave.weight >= -10)>> - $His desperate struggles make immuring $him in the arcade difficult. - <<elseif $activeSlave.belly >= 1500>> - $His <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>_belly<</if>> body makes it slightly difficult to fit $him properly into the restraints for immurement in the arcade. - <<elseif $activeSlave.muscles < -15>> - $His weak body makes immuring $him in the arcade pathetically easy. - <<else>> - $His thin form makes immuring $him in the arcade pathetically easy. - <</if>> - After $he's properly confined, the only sign of $his discomfiture is a slight movement of $his $activeSlave.skin butt as $he wriggles desperately against $his restraints. - <<= assignJob($activeSlave, "be confined in the arcade")>> - <<set $activeSlave.sentence = 4>> - <</replace>> - <</link>> -<</if>> - <<case "vocal disobedience">> <<link "Give $him a rough spanking">> @@ -7328,10 +6972,10 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <<run seX($activeSlave, "anal", $PC, "penetrative")>> <<run seX($activeSlave, "anal", _S.HeadGirl, "penetrative")>> <<if canImpreg($activeSlave, $PC)>> - <<= knockMeUp($activeSlave, 5, 0, -1, 1)>> + <<run knockMeUp($activeSlave, 5, 0, -1)>> <</if>> <<if canImpreg($activeSlave, _S.HeadGirl)>> - <<= knockMeUp($activeSlave, 5, 0, $HeadGirlID, 1)>> + <<run knockMeUp($activeSlave, 5, 0, $HeadGirlID)>> <</if>> <</replace>> <</link>> @@ -8469,7 +8113,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <<else>> <<run seX($activeSlave, "vaginal", $PC, "penetrative")>> <</if>> - <<= knockMeUp($activeSlave, 50, 2, -1, 1)>> + <<run knockMeUp($activeSlave, 50, 2, -1)>> <</replace>> <</link>> <<if $activeSlave.mpreg == 0>> @@ -8513,7 +8157,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <<set $activeSlave.devotion += 4>> <<run seX($activeSlave, "vaginal", $PC, "penetrative")>> <<run seX($activeSlave, "anal", $PC, "penetrative")>> - <<= knockMeUp($activeSlave, 50, 0, -1, 1)>> + <<run knockMeUp($activeSlave, 50, 0, -1)>> <</replace>> <</link>> <br><<link "Sneak it into $his ass instead">> @@ -8603,7 +8247,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <<set _cumSlaves = $slaves.filter(function(s) { return (s.assignment == "get milked" || s.assignment == "work in the dairy") && s.balls > 0 && s.ballType == "human"; })>> <<if _cumSlaves.length > 0>> <<set _cumSlave = _cumSlaves.random()>> - <<= knockMeUp($activeSlave, 90, 2, _cumSlave.ID, 1)>> + <<run knockMeUp($activeSlave, 90, 2, _cumSlave.ID)>> <</if>> <</replace>> <</link>> @@ -11608,7 +11252,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. "Oh <<Master>>, owner, protector, and father of my children, forgive my <<s>>in<<s>>, ju<<s>>t a<<s>> you forgave my <<s>>i<<s>>ter<<s>> in <<s>>lavery before me. Count not my tran<<s>>gre<<ss>>ion<<s>> again<<s>>t your rule<<s>>, but, rather, the tear<<s>> of my womb. Remember not my iniquitie<<s>> but my willingne<<ss>> to be bred by you. I long to <<s>>erve your <<if $PC.vagina != -1>>futa <</if>>dick, and beg that you will u<<s>>e me and ble<<ss>> my body with your off<<s>>pring. I promi<<s>>e to <<s>>ubmit to you a<<s>> your breeding <<s>>lut all the day<<s>> of my <<s>>ervitude, and to grow heavy with child, again and again." $He moans with relief when $he feels you withdraw your penetrating digits partway through $his recitation, but by the time $he's finished, you've shoved your dick up $his waiting <<if $activeSlave.mpreg == 1>>asshole<<else>>pussy<</if>> and are close to blessing $him with a load of cum. $He @@.hotpink;does $his best@@ to relax and resumes, "Oh <<Master>>..." <<if $activeSlave.mpreg == 1>><<= VCheck.Anal($activeSlave, 1)>><<else>><<= VCheck.Vaginal($activeSlave, 1)>><</if>> - <<= knockMeUp($activeSlave, 100, 2, -1, 1)>> + <<run knockMeUp($activeSlave, 100, 2, -1)>> <<if ($activeSlave.fetish != "humiliation") && (random(1,100) > 50)>> <<set $activeSlave.fetish = "humiliation", $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 10>> $He has come to associate @@.lightcoral;humiliation@@ with sexual fulfillment. @@ -14235,7 +13879,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <<if canDoVaginal($activeSlave)>> <<run seX($activeSlave, "vaginal", $PC, "penetrative")>> <<if canGetPregnant($activeSlave) && canBreed($activeSlave, $activeSlave) && $activeSlave.vasectomy != 1>> /* can't miss the opportunity to knock $himself up */ - <<= knockMeUp($activeSlave, 20, 0, $activeSlave.ID, 1)>> + <<run knockMeUp($activeSlave, 20, 0, $activeSlave.ID)>> <</if>> <<else>> <<run seX($activeSlave, "anal", $PC, "penetrative")>> @@ -15296,7 +14940,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <<set $activeSlave.vagina++>> <<run seX($activeSlave, "vaginal", "public", "penetrative", 20)>> <</if>> - <<= knockMeUp($activeSlave, 100, 2, -2, 1)>> + <<run knockMeUp($activeSlave, 100, 2, -2)>> <<run cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave)>> <<run surgeryDamage($activeSlave, 20)>> <<set $activeSlave.race = $arcologies[0].FSSubjugationistRace>> @@ -15638,7 +15282,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <</if>> $He <<if $activeSlave.voice > 0>>squeals<<else>>rasps<</if>> with displeasure as you roughly plow $him into $his distended breasts until you cum deep inside $his fertile hole. You return to your desk, leaving $him to sob into $his unwelcome bust as cum pools from $his abused <<if $activeSlave.mpreg == 1>>ass<<else>>pussy<</if>>. $He knows full well what you meant now, and @@.hotpink;lets you have your way@@ with $his body every time you catch $him in a vulnerable moment or complaining about $his tits. By the week's end, scans reveal that your seed has taken root; @@.lime;$he's pregnant.@@ As $his breasts grow to feed $his coming child, $he will likely be too distracted by $his swelling middle to complain about their added weight. <<set $activeSlave.trust -= 5, $activeSlave.devotion += 5>> - <<= knockMeUp($activeSlave, 100, 2, -1, 1)>> + <<run knockMeUp($activeSlave, 100, 2, -1)>> <</replace>> <</link>><<if $activeSlave.vagina == 0>> //This option will take $his virginity//<<elseif $activeSlave.anus == 0 && $activeSlave.mpreg == 1>> //This option will take $his anal virginity//<</if>> <</if>> @@ -15724,7 +15368,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. $His ass is yours all over again. As soon as $his newly tight rosebud has recovered enough, you visit $him in the surgery, without even waiting for $him to leave it. You flip $him over on the recovery bed and force <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>> up $his butt while $he wriggles with eager discomfort, squealing in pretended horror. $His renewed anal virginity was very brief; $his ass is once again @@.lime;broken in for penetration.@@ For $his part, $he @@.hotpink;thoroughly enjoyed losing $his anal cherry,@@ again. <<set $activeSlave.devotion += 5, $activeSlave.anus = 1>> <<run seX($activeSlave, "anal", $PC, "penetrative")>> - <<= knockMeUp($activeSlave, 5, 1, -1, 1)>> + <<run knockMeUp($activeSlave, 5, 1, -1)>> <</replace>> <</link>> //This option will take $his anal virginity// </span> @@ -15779,7 +15423,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <<set $activeSlave.devotion += 4>> <<= VCheck.Anal($activeSlave, 2)>> <<if canImpreg($activeSlave, _S.HeadGirl)>> - <<= knockMeUp($activeSlave, 5, 1, $HeadGirlID, 1)>> + <<run knockMeUp($activeSlave, 5, 1, $HeadGirlID)>> <</if>> <<set _S.HeadGirl.devotion += 4>> <<includeDOM App.Events.eventFetish($activeSlave, "buttslut")>> @@ -15886,93 +15530,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <</replace>> <</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0) && $PC.dick != 0>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0) && $PC.dick != 0>> //This option will take $his anal virginity//<</if>> -<<case "arcade sadist">> - -<<link "Ask $him about $his fantasy">> - <<setNonlocalPronouns $seeDicks>> - <<replace "#result">> - <<set _pussy = App.Entity.facilities.arcade.employees().some(s => s.vagina > 0)>> - <<set _balls = App.Entity.facilities.arcade.employees().some(s => s.balls > 0)>> - You order $him to explain further. "<<Master>>," $he <<say>>s carefully, "it'<<s>> $arcadeName. There'<<s>> a <<s>>pe<<c>>ific pla<<c>>e there, and, well, I can't de<<s>>cribe it. It'<<s>> in the <<s>>ervi<<c>>e area under $arcadeName. Can I <<sh>>ow you what I mean?" Intrigued, you order $him to show you the place $he's talking about, and lead $him to $arcadeName through the access hallway. $He points to the service tunnel under one of the rows of inmates, which allows trusted slaves to clean up and perform maintenance. - <<if $activeSlave.belly >= 100000>> - Once you've managed to shove the massive slut - <<elseif $activeSlave.belly >= 5000>> - Once you've helped the <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>bloated<</if>> $girl fit - <<else>> - Once you've led $him - <</if>> - in there, $he stops and <<if canSee($activeSlave)>>watches<<elseif canHear($activeSlave)>>listens<<else>>waits<</if>><<if $PC.belly >= 100000>> as you struggle to join $him in the increasingly cramped space<<elseif $PC.belly >= 5000>> as you gently slip your motherly body in after $him<</if>>. - Inside the industrial access corridor, above you both is a row of bodies. The slaves' faces and hips are pressed against the apertures that present their holes to customers, but the rest of them is visible from here. - <br><br> - There is little noise; the slaves are closely restrained. Indeed, you have to look closely to see that they're being fucked at all. Here and there, though, there are signs. When someone fucks a slave's face, _hisU throat bulges, and _heU often gags and struggles a little within the restraints. When their <<if _pussy>>pussies<<else>>assholes<</if>> get fucked, there's also some involuntary struggling, and if the phallus being thrust into them is particularly large, a rhythmic bulging of their abdomens can be discerned. - <<if $arcadeUpgradeInjectors == 1>> - The bodies frequently jerk as electrostimulation is applied to force them to tighten their holes. - <<elseif $arcadeUpgradeInjectors == 2>> - The quiet hissing of the drug injectors adds a menacing undertone, and the bodies frequently jerk as electrostimulation is applied to force them to tighten their holes. - <</if>> - <<if $arcadeUpgradeCollectors == 1>> - The pumping collectors attached to the slaves' breasts<<if _dick>> and cocks<</if>> carry the white fluid away to be processed elsewhere. - <</if>> - The overall effect is subtle, but powerful. There's a sense of total servitude, overlaid with a certain feeling, or perhaps even a scent, of mindless despair. There's no wonder $activeSlave.slaveName likes it; there's an infinite supply of uncomplicated human anguish here. - <br><br> - <span id="result2"> - <<if $PC.belly < 5000 && $activeSlave.belly < 5000>> - <<link "Fuck $him here">> - <<replace "#result2">> - You reach out for $activeSlave.slaveName, not taking your eyes off the mesmerizing sight above. $He's enjoying the spectacle too, and is so aroused that your rough handling of $his breasts almost brings $him to an immediate orgasm. <<if $activeSlave.nipples != "fuckable">>Pinching<<else>>Hooking<</if>> $his $activeSlave.nipples nipples to stop $him from getting off too soon, you - <<if $PC.dick == 0>> - hug $him to your chest and start playing with $his pussy, commanding $him to reach around and do the same for you. - <<run seX($activeSlave, "oral", $PC, "penetrative")>> - <<elseif canDoVaginal($activeSlave) && ($activeSlave.vagina > 0)>> - pull $him up to the right height and slide your dick inside $him, keeping both of you on your feet so you can take $him standing. - <<= VCheck.Vaginal($activeSlave, 1)>> - <<elseif canDoAnal($activeSlave) && ($activeSlave.anus > 0)>> - shove your cock roughly up $his asshole, letting $him struggle a little as $he finds the right angle to take standing anal here. - <<= VCheck.Anal($activeSlave, 1)>> - <<else>> - slide your stiff prick up between the virgin's thighs for some intercrural sex. - <</if>> - As you fuck<<if $activeSlave.belly >= 5000 || $PC.belly >= 5000 || $activeSlave.weight > 160 || $activeSlave.boobs > 40000 || $activeSlave.butt > 10>> in the cramped corridor<</if>>, $his <<if canSee($activeSlave)>>gaze flicks up and down along the row<<elseif canHear($activeSlave)>>ears perk up at the subtle sounds<<else>>expression indicates that $he's become lost in $his thoughts<</if>> of suffering bodies. $He climaxes again and again, shuddering at each new subtle sign that another one of the slaves here is being degraded by yet another cock inserted into yet another of _hisU defenseless holes. By the time you're satisfied, $he's so exhausted that $his legs are shuddering uncontrollably as $he struggles to remain standing with you. You drop $him, leaving $him to find $his own way out of this place. You look back from the entrance, seeing that $he's following you on shaky legs, <<if canSee($activeSlave)>>staring at<<else>>facing<</if>> you with a profound look of mixed @@.mediumaquamarine;trust for your understanding of $his horrible sadism,@@ and deep unease that this is what truly gets $him off. - <</replace>> - <<set $activeSlave.trust += 5>> - <</link>> - <<else>> - Fucking $him here would be interesting; unfortunately, there just isn't enough room for two mothers-to-be. - <</if>> - <br><<link "Teach $him about true sadism">> - <<set _ress = App.Entity.facilities.arcade.employees().random()>> - <<setLocalPronouns _ress 2>> - <<replace "#result2">> - $He seems to be focusing on the purely physical aspects of the degradation here. The true meaning of this place is so much more, and you decide to share it with $him. You call $his name, tearing $his attention away from the spectacle mere <<if $showInches == 2>>inches<<else>>centimeters<</if>> over your heads, and <<if canSee($activeSlave)>>point<<else>>direct $him<</if>> to a particular slave. You tell $activeSlave.slaveName that this particular Arcade inmate's name is - <<= SlaveFullName(_ress)>>. You tell $him that _he2 is _ress.actualAge years old, that _he2 is _ress.nationality, and that _he2 was once <<= convertCareer(_ress)>>. You list more details of _his2 life before _he2 was placed here to be fucked endlessly. $activeSlave.slaveName's eyes widen as you recite the details of the prior life of this piece of human sexual equipment and the sheer weight of the intellectual sadism smashes into $him. Then the slave above you both jerks a little. <<if $activeSlave.dick == 0>>There's no visible sign _his2 pussy's being fucked, so it must be<<else>>_His2 cock hardens involuntarily, indicating that it's<</if>> going into _his2 ass. You resume, mentioning that _he2's been buttfucked _ress.counter.anal times. - $activeSlave.slaveName jerks suddenly, <<if canAchieveErection($activeSlave)>>shooting $his cum onto the floor<<elseif $activeSlave.vagina < 0>>dribbling a little<<elseif $activeSlave.vaginaLube > 0>>squirting onto the floor<<else>>orgasming<</if>>. $He came without being touched. $He <<if canSee($activeSlave)>>stares at<<else>>faces<</if>> the mess $he made just by being in the presence of the arcology's @@.hotpink;undisputed preeminent sadist;@@ $he shudders at the sheer gothic glory of it. $He has a new moment to think of when $he feels like @@.lightsalmon;indulging $his own sadism.@@ - <</replace>> - <<set $activeSlave.devotion += 5, $activeSlave.fetishStrength = Math.clamp($activeSlave.fetishStrength+10, 0, 100)>> - <</link>> - </span> - <</replace>> -<</link>> -<br><<link "Just fuck $him">> - <<replace "#result">> - You're not particularly interested in what $he dreams about when $he gets the chance, and you tell $him so. Whatever sadistic little fantasies $he keeps locked away to bring out when $he's got a moment to satiate $his perversions is less interesting to you than the prospect of - <<if $PC.dick == 0>> - $his mouth on your cunt. So, you shove $him down to sit on the couch and straddle $his face, cutting off any further whimsies by pressing your wet pussy against $his lips. $He eats you out obediently, accepting - <<run seX($activeSlave, "oral", $PC, "penetrative")>> - <<elseif canDoVaginal($activeSlave) && ($activeSlave.vagina > 0)>> - giving it to $him. So, you shove $him down to sit on the couch, nudge $his legs apart, kneel between them, and pound $his pussy. You fuck $him so hard that $he doesn't have the attention for further whimsies, and $he accepts - <<= VCheck.Vaginal($activeSlave, 1)>> - <<elseif canDoAnal($activeSlave) && ($activeSlave.anus > 0)>> - fucking $his butt. So, you shove $him down to <<if hasAnyLegs($activeSlave)>>kneel<<else>>get<</if>> on the couch facing away from you, and ram your cock up $his asshole. You assfuck $him so hard that $he doesn't have the attention for further whimsies, and $he accepts - <<= VCheck.Anal($activeSlave, 1)>> - <<else>> - $him sucking your dick. So, you shove $him down to sit on the couch and give $him your cock to keep $his mouth occupied, cutting off any further whimsies. $He blows you obediently, accepting - <<run seX($activeSlave, "oral", $PC, "penetrative")>> - <</if>> - the implicit message that @@.hotpink;$he's your slut@@ in the real world, whatever thoughts $he may find appealing in the privacy of $his own mind. - <</replace>> - <<set $activeSlave.devotion += 3>> -<</link>> - <<case "servant maid">> <<link "Stop $him">> @@ -16398,7 +15955,7 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <</if>> <</if>> <<if $activeSlave.eggType == "human" && canGetPregnant($activeSlave)>> - <<= knockMeUp($activeSlave, 15, 2, 0, 1)>> + <<run knockMeUp($activeSlave, 15, 2, 0)>> <</if>> <<run seX($activeSlave, "oral", "public", "penetrative", 2)>> <<run cashX(2000, "event", $activeSlave)>> @@ -16971,10 +16528,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. <</if>> $He returns quickly, in $his proper <<switch $activeSlave.clothes>> - <<case "a toga">> - toga. - <<case "a huipil">> - huipil. <<case "a long qipao" "a slutty qipao">> qipao. <<case "a penitent nuns habit">> @@ -16983,75 +16536,33 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. gown. <<case "a comfortable bodysuit">> bodysuit. - <<case "a leotard">> - leotard. - <<case "a bunny outfit">> - bunny outfit. - <<case "a nice nurse outfit">> - nurse outfit. - <<case "a slutty nurse outfit">> - slutty nurse outfit. <<case "a schoolgirl outfit">> school clothes. - <<case "a hijab and abaya">> - hijab and abaya. - <<case "a kimono">> - kimono. <<case "a nice maid outfit">> maid outfit. <<case "a slutty maid outfit">> skimpy maid outfit. <<case "a biyelgee costume" "a dirndl" "a halter top dress" "a mini dress" "a maternity dress">> dress. - <<case "a latex catsuit">> - latex catsuit. <<case "a military uniform" "a mounty outfit" "a red army uniform" "a schutzstaffel uniform" "a slutty schutzstaffel uniform">> uniform. - <<case "battlearmor">> - battlearmor. - <<case "Imperial Plate">> - imperial armor. - <<case "lederhosen">> - lederhosen. <<case "spats and a tank top">> spats. <<case "a burkini" "a monokini">> swimsuit. <<case "a chattel habit" "a fallen nuns habit">> slutty habit. - <<case "a cheerleader outfit">> - cheerleader outfit. - <<case "a cybersuit">> - cybersuit. - <<case "a tight Imperial bodysuit">> - imperial bodysuit. - <<case "an apron">> - apron. - <<case "a scalemail bikini">> - scalemail bikini. - <<case "a slutty outfit">> - slutty outfit. - <<case "a string bikini">> - string bikini. <<case "a succubus outfit">> succubus getup. <<case "a hijab and blouse" "conservative clothing">> conservative clothes. - <<case "a bimbo outfit">> - bimbo outfit. - <<case "a courtesan dress">> - courtesan dress. <<default>> - $activeSlave.clothes. + <<= App.Data.clothes.get($activeSlave.clothes).name.toLowerCase()>> <</switch>> You tell $him that you like how $he looks, and that $he's pretty. $He wasn't expecting such a blunt compliment, and <<if canSee($activeSlave)>>$his <<= App.Desc.eyesColor($activeSlave)>> flick down to<<else>>$he faces<</if>> the ground for a moment as $he blushes. "T-thank you, <<Master>>," $he stutters. <br><br> You add that $he looks so good that $he had better take $his nice clean <<switch $activeSlave.clothes>> - <<case "a toga">> - toga - <<case "a huipil">> - huipil <<case "a long qipao" "a slutty qipao">> qipao <<case "a penitent nuns habit">> @@ -17060,66 +16571,30 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look. gown <<case "a comfortable bodysuit">> bodysuit - <<case "a leotard">> - leotard - <<case "a bunny outfit">> - bunny outfit <<case "a nice nurse outfit">> nurse outfit - <<case "a slutty nurse outfit">> - slutty nurse outfit <<case "a schoolgirl outfit">> school clothes - <<case "a hijab and abaya">> - hijab and abaya - <<case "a kimono">> - kimono <<case "a nice maid outfit">> maid outfit <<case "a slutty maid outfit">> skimpy maid outfit <<case "a biyelgee costume" "a dirndl" "a halter top dress" "a mini dress" "a maternity dress">> dress - <<case "a latex catsuit">> - latex catsuit <<case "a military uniform" "a mounty outfit" "a red army uniform" "a schutzstaffel uniform" "a slutty schutzstaffel uniform">> uniform - <<case "battlearmor">> - battlearmor - <<case "Imperial Plate">> - imperial armor - <<case "lederhosen">> - lederhosen <<case "spats and a tank top">> spats <<case "a burkini" "a monokini">> swimsuit <<case "a chattel habit" "a fallen nuns habit">> slutty habit - <<case "a cheerleader outfit">> - cheerleader outfit - <<case "a cybersuit">> - cybersuit - <<case "a tight Imperial bodysuit">> - imperial bodysuit - <<case "an apron">> - apron - <<case "a scalemail bikini">> - scalemail bikini - <<case "a slutty outfit">> - slutty outfit - <<case "a string bikini">> - string bikini <<case "a succubus outfit">> succubus getup <<case "a hijab and blouse" "conservative clothing">> conservative clothes - <<case "a bimbo outfit">> - bimbo outfit - <<case "a courtesan dress">> - courtesan dress <<default>> - $activeSlave.clothes + <<= App.Data.clothes.get($activeSlave.clothes).name.toLowerCase()>> <</switch>> off again, because <<if canDoVaginal($activeSlave) && $activeSlave.vagina != 0>> diff --git a/src/uncategorized/attendantSelect.tw b/src/uncategorized/attendantSelect.tw deleted file mode 100644 index f563ca18ad97374086798e02bcee9b96fc7b9285..0000000000000000000000000000000000000000 --- a/src/uncategorized/attendantSelect.tw +++ /dev/null @@ -1,14 +0,0 @@ -:: Attendant Select [nobr jump-to-safe jump-hidden jump-from-safe] - -<<set $nextButton = "Back", $nextLink = "Spa", $encyclopedia = "Attendant">> -<<if _S.Attendant>> - <<setLocalPronouns _S.Attendant>> - <span class='slave-name'><<= SlaveFullName(_S.Attendant)>></span> is serving as your Attendant.<br><br>$He will help pamper and counsel your slaves. -<<else>> - You have not selected an Attendant. -<</if>> - -<br><br>''Appoint an Attendant from your devoted slaves:'' -<br><br>[[None|Spa][removeJob(_S.Attendant, Job.ATTENDANT)]] -<br><br> -<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.spa, "Spa")>> diff --git a/src/uncategorized/bgSelect.tw b/src/uncategorized/bgSelect.tw deleted file mode 100644 index a1094cd42992729a37a444d0485d0fe4952b1560..0000000000000000000000000000000000000000 --- a/src/uncategorized/bgSelect.tw +++ /dev/null @@ -1,40 +0,0 @@ -:: BG Select [nobr jump-to-safe jump-from-safe] - -<<set $nextButton = "Back to Main", $nextLink = "Main", $encyclopedia = "Bodyguard">> - -<p class="scene-intro"> -</p> - -<p> - <<if (_S.Bodyguard)>> - <<setLocalPronouns _S.Bodyguard>> - <span class="slave-name"><<= SlaveFullName(_S.Bodyguard)>></span> - is serving as your bodyguard. $He will remain close to you at all times and guard your person. - <<else>> - You have not selected a bodyguard. - <</if>> -</p> - -<div> - <<if $bodyguardTrains == 0>> - Your Bodyguard ''is not allowed'' to train potential successors. - <div class="choices"> - [[Allow training|BG Select][$bodyguardTrains = 1]] - </div> - <<else>> - Your Bodyguard ''is allowed'' to train potential successors. - <div class="choices"> - [[Stop training|BG Select][$bodyguardTrains = 0]] - </div> - <</if>> -</div> - -<div style="font-weight:bold"> - Appoint a bodyguard from your devoted slaves: -</div> -<div class="choices"> - [[None|Main][removeJob(_S.Bodyguard, Job.BODYGUARD)]] -</div> -<p> - <<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.armory, "Main")>> -</p> diff --git a/src/uncategorized/concubineSelect.tw b/src/uncategorized/concubineSelect.tw deleted file mode 100644 index bc2b520e072bc93718c5252d550861726e49ff40..0000000000000000000000000000000000000000 --- a/src/uncategorized/concubineSelect.tw +++ /dev/null @@ -1,14 +0,0 @@ -:: Concubine Select [nobr jump-to-safe jump-hidden jump-from-safe] - -<<set $nextButton = "Back", $nextLink = "Master Suite", $encyclopedia = "Concubine">> -<<if ($ConcubineID != 0)>> - <<setLocalPronouns _S.Concubine>> - <span class='slave-name'><<= SlaveFullName(_S.Concubine)>></span> is serving as your Concubine.<br><br>$He will take the lead in seeing to your pleasure. -<<else>> - You have not selected a Concubine. -<</if>> - -<br><br>''Appoint a Concubine from your devoted slaves:'' -<br><br>[[None|Master Suite][removeJob(_S.Concubine, Job.CONCUBINE)]] -<br><br> -<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.masterSuite, "Master Suite")>> diff --git a/src/uncategorized/discardConfirm.tw b/src/uncategorized/discardConfirm.tw index c15cff58ef1491a11eb924c4b6ce5212301804fb..a98e63d2ca643080ca4c94d7b92d76ad13515a46 100644 --- a/src/uncategorized/discardConfirm.tw +++ b/src/uncategorized/discardConfirm.tw @@ -3,10 +3,5 @@ This will permanently remove <<= getSlave($AS).slaveName>> from the game, and you will not receive any money for $him. This is primarily intended as a way to rid yourself of bugged slaves. Are you certain? -<br><br> - -<<link "Discard $him" "Slave Sold">><</link>> - -<br><br> - -[[Cancel|Slave Interact]] +<br><br><<link "Discard $him" "Sell Slave">><</link>> +<br><br>[[Cancel|Slave Interact]] \ No newline at end of file diff --git a/src/uncategorized/djSelect.tw b/src/uncategorized/djSelect.tw deleted file mode 100644 index 7a962c67acb2dcb087239931f6a6fc6ff834293f..0000000000000000000000000000000000000000 --- a/src/uncategorized/djSelect.tw +++ /dev/null @@ -1,14 +0,0 @@ -:: DJ Select [nobr jump-to-safe jump-hidden jump-from-safe] - -<<set $nextButton = "Back", $nextLink = "Club", $encyclopedia = "DJ">> -<<if (_S.DJ)>> - <<setLocalPronouns _S.DJ>> - <span class='slave-name'><<= SlaveFullName(_S.DJ)>></span> is serving as your DJ.<br><br>$He will headline entertainment in $clubName. -<<else>> - You have not selected a DJ. -<</if>> - -<br><br>''Appoint a DJ from your devoted slaves:'' -<br><br>[[None|Club][removeJob(_S.DJ, "be the DJ")]] -<br><br> -<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.club, "Club")>> diff --git a/src/uncategorized/hgSelect.tw b/src/uncategorized/hgSelect.tw deleted file mode 100644 index 8ef653742e91d627531e1c47b57b915b2310411e..0000000000000000000000000000000000000000 --- a/src/uncategorized/hgSelect.tw +++ /dev/null @@ -1,95 +0,0 @@ -:: HG Select [nobr jump-to-safe jump-hidden jump-from-safe] - -<<set $nextButton = "Back to Main", $nextLink = "Main", $encyclopedia = "Head Girl">> - -<h1>Head Girl Management</h1> - -<<set _HGName = "Your Head Girl">> -<<if ($HeadGirlID != 0)>> - <<setLocalPronouns _S.HeadGirl>> - <<set _HGName = SlaveFullName(_S.HeadGirl)>> - <span class='slave-name'>_HGName</span> is serving as your Head Girl<<if $arcologies[0].FSEgyptianRevivalistLaw == 1>> and Consort; it is $his role to serve and comfort you at your side, in addition to performing normal Head Girl duties<</if>>. - <<if ($HGSuite)>> - <br> Currently $he lives in <<link "<<= capFirstChar($HGSuiteName)>>""Head Girl Suite">><</link>> - <</if>> - <br><br> -<</if>> - -__Slave training__ - -//_HGName will prioritize enabled items in the following order.// - -<br> -<<if $headGirlTrainsHealth>><<checkbox "$headGirlTrainsHealth" 0 1 checked>><<else>><<checkbox "$headGirlTrainsHealth" 0 1>><</if>> -Health -<br> -<<if $headGirlTrainsParaphilias>><<checkbox "$headGirlTrainsParaphilias" 0 1 checked>><<else>><<checkbox "$headGirlTrainsParaphilias" 0 1>><</if>> -Paraphilias -<br> -<<if $headGirlTrainsFlaws>><<checkbox "$headGirlTrainsFlaws" 0 1 checked>><<else>><<checkbox "$headGirlTrainsFlaws" 0 1>><</if>> -Flaws -<<if $headGirlSoftensFlaws>><<checkbox "$headGirlSoftensFlaws" 0 1 checked>><<else>><<checkbox "$headGirlSoftensFlaws" 0 1>><</if>> -Soften -<<if $headGirlOverridesQuirks>><<checkbox "$headGirlOverridesQuirks" 0 1 checked>><<else>><<checkbox "$headGirlOverridesQuirks" 0 1>><</if>> -Soften and Replace -<br> -<<if $headGirlTrainsObedience>><<checkbox "$headGirlTrainsObedience" 0 1 checked>><<else>><<checkbox "$headGirlTrainsObedience" 0 1>><</if>> -Obedience -<br> -<<if $headGirlTrainsSkills>><<checkbox "$headGirlTrainsSkills" 0 1 checked>><<else>><<checkbox "$headGirlTrainsSkills" 0 1>><</if>> -Skills - -<br>__Training methods__ -<br> -_HGName will be -<<if ($HGSeverity > 0)>> - ''aggressive'' when punishing, with rape strongly encouraged. [[Moderate|HG Select][$HGSeverity = 0]] -<<elseif ($HGSeverity == 0)>> - ''moderate'' when punishing, carefully selecting appropriate consequences. [[Be aggressive|HG Select][$HGSeverity = 1]] | [["Restrict " + $him|HG Select][$HGSeverity = -1]] -<<else>> - ''respectful'' when punishing, treating slaves decently. [[Be stricter|HG Select][$HGSeverity = 0]] -<</if>> -<br> -_HGName is -<<if $HGPiercings>> - ''allowed'' to use piercings as a tool to improve slaves' attitudes. [[Disallow|HG Select][$HGPiercings = 0]] -<<else>> - ''not allowed'' to use piercings as a tool to improve slaves' attitudes. [[Allow|HG Select][$HGPiercings = 1]] -<</if>> - -<br>__Behavior towards you__ -<br> -_HGName -<<if ($HGFormality != 0)>> - will be ''formal'': $he will always call you <<= getWrittenTitle(_S.HeadGirl)>>, just like any other slave. [[Allow private informality|HG Select][$HGFormality = 0]] -<<else>> - is allowed to be ''informal'': in private, $he may call you <<= properTitle()>>. [[Maintain complete formality|HG Select][$HGFormality = 1]] -<</if>> - -<<if $seePreg != 0>> - <<if $HeadGirlID != 0>> - <<if $universalRulesImpregnation == "HG">> - <br><br>_HGName is responsible for impregnating fertile slaves. - <<set $HGCum = 2+Math.trunc((_S.HeadGirl.balls/5)+(_S.HeadGirl.energy/95)+(_S.HeadGirl.health.condition/95)+(_S.HeadGirl.devotion/95)+($reproductionFormula*5))>> - <<if canPenetrate(_S.HeadGirl) && _S.HeadGirl.pubertyXY == 1>> - To maximize the chances of impregnation, $he will fuck fertile pussies frequently during the week. _S.HeadGirl.slaveName can service $HGCum slaves this way. - <<if _S.HeadGirl.devotion > 95>>$He loves you so much $he'll fuck them until $he's sore.<<else>>If $he were more devoted to you, $he might be able to drive $himself to get hard and service one more.<</if>> - <<if _S.HeadGirl.balls >= 120>>$His unreal balls produce nearly an endless supply of semen; $his ability to impregnate is almost limitless.<<elseif _S.HeadGirl.balls >= 80>>$His inhuman balls produce so much semen $he can easily impregnate twenty girls in one sitting.<<elseif _S.HeadGirl.balls >= 50>>$His giant balls produce so much semen $he can easily impregnate twelve girls in one sitting.<<elseif _S.HeadGirl.balls >= 25>>$His oversized balls produce so much semen $he can cum repeatedly in a single session.<<elseif _S.HeadGirl.balls >= 5>>$His big balls produce so much semen $he can cum more before $he's drained.<<else>>Bigger balls would let $him cum more before $he's drained.<</if>> - <<if _S.HeadGirl.health.condition > 95>>$His wonderful health lets $him get hard and stay hard all the time.<<else>>If $his health were perfect, $he might be able to get hard more often.<</if>> - <<if _S.HeadGirl.energy > 95>>$His nymphomania drives $him to go above and beyond in this.<<else>>A more powerful sex drive could reduce $his refractory period.<</if>> - <<else>> - However, _S.HeadGirl.slaveName cannot perform this duty. - <</if>> - [["Rescind " + $his + " impregnation responsibility"|HG Select][$universalRulesImpregnation = "none"]] | [[See to it yourself|HG Select][$universalRulesImpregnation = "PC"]] - <<else>> - <<if canPenetrate(_S.HeadGirl) && _S.HeadGirl.pubertyXY == 1>> - <br><br>_HGName is capable of impregnating slaves, but it's not part of $his responsibilities. [["Assign " + $him + " to impregnate"|HG Select][$universalRulesImpregnation = "HG"]] - <</if>> - <</if>> - <</if>> -<</if>> - -<br><br>''Appoint a Head Girl from among your devoted slaves:'' -<br><br>[[None|Main][removeJob(_S.HeadGirl, "be your Head Girl")]] -<br><br> -<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.headGirlSuite, "Main")>> diff --git a/src/uncategorized/jeSlaveDispute.tw b/src/uncategorized/jeSlaveDispute.tw index 510ebc9744b579e9984db557a626f30d5cfd7637..b89e97fa00966fdc248179330f099bc842095ddb 100644 --- a/src/uncategorized/jeSlaveDispute.tw +++ b/src/uncategorized/jeSlaveDispute.tw @@ -139,7 +139,7 @@ <<set _slave.vagina = 2>> <<set _slave.ovaries = 1>> <<if isFertile(_slave) && $seePreg == 1>> - <<= knockMeUp(_slave, 100, 2, -2, 1)>> + <<run knockMeUp(_slave, 100, 2, -2)>> <</if>> <</if>> <</switch>> diff --git a/src/uncategorized/madamSelect.tw b/src/uncategorized/madamSelect.tw deleted file mode 100644 index 35ec6c33eb6b97f7f5f6e8f5dca0c69b1643e038..0000000000000000000000000000000000000000 --- a/src/uncategorized/madamSelect.tw +++ /dev/null @@ -1,14 +0,0 @@ -:: Madam Select [nobr jump-to-safe jump-hidden jump-from-safe] - -<<set $nextButton = "Back", $nextLink = "Brothel", $encyclopedia = "Madam">> -<<if ($MadamID != 0)>> - <<setLocalPronouns _S.Madam>> - <span class='slave-name'><<= SlaveFullName(_S.Madam)>></span> is serving as your Madam.<br><br>$He will manage the brothel. -<<else>> - You have not selected a Madam. -<</if>> - -<br><br>''Appoint a Madam from your devoted slaves:'' -<br><br>[[None|Brothel][removeJob(_S.Madam, "be the Madam")]] -<br><br> -<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.brothel, "Brothel")>> diff --git a/src/uncategorized/milkmaidSelect.tw b/src/uncategorized/milkmaidSelect.tw deleted file mode 100644 index 02bfe668d0e973b28a3b8deef5ae6eb7d2e896b4..0000000000000000000000000000000000000000 --- a/src/uncategorized/milkmaidSelect.tw +++ /dev/null @@ -1,14 +0,0 @@ -:: Milkmaid Select [nobr jump-to-safe jump-hidden jump-from-safe] - -<<set $nextButton = "Back", $nextLink = "Dairy", $encyclopedia = "Milkmaid">> -<<if ($MilkmaidID != 0)>> - <<setLocalPronouns _S.Milkmaid>> - <span class='slave-name'><<= SlaveFullName(_S.Milkmaid)>></span> is serving as your Milkmaid.<br><br>$He will look after your livestock, helping them give milk<<if $seeDicks > 0>> and semen<</if>>. -<<else>> - You have not selected a Milkmaid. -<</if>> - -<br><br>''Appoint a Milkmaid from your obedient slaves:'' -<br><br>[[None|Dairy][removeJob(_S.Milkmaid, "be the Milkmaid")]] -<br><br> -<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.dairy, "Dairy")>> diff --git a/src/uncategorized/nurseSelect.tw b/src/uncategorized/nurseSelect.tw deleted file mode 100644 index 84211a0e169b22a1ea03c3bf0e92c6006fdfad19..0000000000000000000000000000000000000000 --- a/src/uncategorized/nurseSelect.tw +++ /dev/null @@ -1,15 +0,0 @@ -:: Nurse Select [nobr jump-to-safe jump-hidden jump-from-safe] - -<<set $nextButton = "Back", $nextLink = "Clinic", $encyclopedia = "Nurse">> -<<if _S.Nurse>> - <<setLocalPronouns _S.Nurse>> - <span class='slave-name'><<= SlaveFullName(_S.Nurse)>></span> is serving as your Nurse.<br><br>$He will help heal your slaves. -<<else>> - You have not selected a Nurse. -<</if>> - -<br><br>''Appoint a Nurse from your devoted slaves:'' -<br><br>[[None|Clinic][removeJob(_S.Nurse, "be the Nurse")]] -<br><br> - -<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.clinic, "Clinic")>> diff --git a/src/uncategorized/peHeadgirlConcubine.tw b/src/uncategorized/peHeadgirlConcubine.tw index cd9657606fbd9e8bf8b01f53232889f8cd6c10cb..055ab978f3436aab8b142598466124d149c860a7 100644 --- a/src/uncategorized/peHeadgirlConcubine.tw +++ b/src/uncategorized/peHeadgirlConcubine.tw @@ -270,7 +270,7 @@ and it's also obvious that they've been filling the few minutes they've been wai <<if (canDoVaginal(_S.Concubine) && _S.Concubine.vagina > 0)>> /* this is up here to give the PC priority on pregnancy */ <<if canImpreg(_S.Concubine, $PC)>> - <<= knockMeUp(_S.Concubine, 10, 0, -1, 1)>> + <<run knockMeUp(_S.Concubine, 10, 0, -1)>> <</if>> <<set _S.Concubine.counter.vaginal++, $vaginalTotal++>> _He2 moans into you as _he2 feels you run <<if $PC.dick == 0>>the cool head of the phallus<<else>>your cockhead<</if>> along _his2<<if _S.Concubine.labia > 0>> generous<</if>> labia before plunging it inside _him2. Getting the idea, _S.HeadGirl.slaveName @@ -285,14 +285,14 @@ and it's also obvious that they've been filling the few minutes they've been wai <</if>> <<if $PC.dick != 0>>You feel the penetration through _S.Concubine.slaveName's vaginal walls, an incredible sensation.<</if>> <<if canImpreg(_S.Concubine, _S.HeadGirl)>> - <<= knockMeUp(_S.Concubine, 10, 1, _S.HeadGirl.ID, 1)>> + <<run knockMeUp(_S.Concubine, 10, 1, _S.HeadGirl.ID)>> <</if>> <<set _S.Concubine.counter.anal++, $analTotal++>> <<else>> gently eases $his cock in beside you.<<if $PC.dick != 0>> The added friction against you in _S.Concubine.slaveName's vagina feels incredible.<</if>> <<set _S.Concubine.counter.vaginal++, $vaginalTotal++>> <<if canImpreg(_S.Concubine, _S.HeadGirl)>> - <<= knockMeUp(_S.Concubine, 10, 0, _S.HeadGirl.ID, 1)>> + <<run knockMeUp(_S.Concubine, 10, 0, _S.HeadGirl.ID)>> <</if>> <</if>> <<set _S.HeadGirl.counter.penetrative++, $penetrativeTotal++>> @@ -318,7 +318,7 @@ and it's also obvious that they've been filling the few minutes they've been wai <<else>> /* this is up here to give the PC priority on pregnancy */ <<if canImpreg(_S.Concubine, $PC)>> - <<= knockMeUp(_S.Concubine, 10, 1, -1, 1)>> + <<run knockMeUp(_S.Concubine, 10, 1, -1)>> <</if>> <<set _S.Concubine.counter.anal += 2, $analTotal += 2>> Getting the idea, _S.HeadGirl.slaveName @@ -333,7 +333,7 @@ and it's also obvious that they've been filling the few minutes they've been wai Then $he grabs _S.Concubine.slaveName <<if !hasAnyLegs(_S.Concubine)>>by the stumps<<else>>behind the knee<<if hasBothLegs(_S.Concubine)>>s<</if>><</if>> and spreads _his2 <<if hasBothLegs(_S.Concubine)>>legs<<else>>cheeks<</if>> as far as they'll go, rotating _his2 hips to position _him2 for another phallus up the butt. <<set _S.HeadGirl.counter.penetrative++, $penetrativeTotal++>> <<if canImpreg(_S.Concubine, _S.HeadGirl)>> - <<= knockMeUp(_S.Concubine, 10, 1, _S.HeadGirl.ID, 1)>> + <<run knockMeUp(_S.Concubine, 10, 1, _S.HeadGirl.ID)>> <</if>> <<else>> slides a hand down and @@ -410,19 +410,19 @@ and it's also obvious that they've been filling the few minutes they've been wai /* sex count cleanup for _S.HeadGirl since the above block is not pretty */ <<if (canDoVaginal(_S.HeadGirl) && _S.HeadGirl.vagina > 0)>> <<if canImpreg(_S.HeadGirl, $PC)>> - <<= knockMeUp(_S.HeadGirl, 10, 0, -1, 1)>> + <<run knockMeUp(_S.HeadGirl, 10, 0, -1)>> <</if>> <<set _S.HeadGirl.counter.vaginal++, $vaginalTotal++>> <<if (canPenetrate(_S.Concubine))>> <<if (canDoAnal(_S.HeadGirl) && _S.HeadGirl.anus > 0)>> <<if canImpreg(_S.HeadGirl, _S.Concubine)>> - <<= knockMeUp(_S.HeadGirl, 10, 1, $ConcubineID, 1)>> + <<run knockMeUp(_S.HeadGirl, 10, 1, $ConcubineID)>> <</if>> <<set _S.HeadGirl.counter.anal++, $analTotal++>> <<else>> <<set _S.HeadGirl.counter.vaginal++, $vaginalTotal++>> <<if canImpreg(_S.HeadGirl, _S.Concubine)>> - <<= knockMeUp(_S.HeadGirl, 10, 0, $ConcubineID, 1)>> + <<run knockMeUp(_S.HeadGirl, 10, 0, $ConcubineID)>> <</if>> <</if>> <<set _S.Concubine.counter.penetrative++, $penetrativeTotal++>> @@ -435,13 +435,13 @@ and it's also obvious that they've been filling the few minutes they've been wai <</if>> <<else>> <<if canImpreg(_S.HeadGirl, $PC)>> - <<= knockMeUp(_S.HeadGirl, 10, 1, -1, 1)>> + <<run knockMeUp(_S.HeadGirl, 10, 1, -1)>> <</if>> <<set _S.HeadGirl.counter.anal += 2, $analTotal += 2>> <<if (canPenetrate(_S.Concubine))>> <<set _S.HeadGirl.counter.penetrative++, $penetrativeTotal++>> <<if canImpreg(_S.HeadGirl, _S.Concubine)>> - <<= knockMeUp(_S.HeadGirl, 10, 1, $ConcubineID, 1)>> + <<run knockMeUp(_S.HeadGirl, 10, 1, $ConcubineID)>> <</if>> <</if>> <</if>> diff --git a/src/uncategorized/reBusyMasterSuite.tw b/src/uncategorized/reBusyMasterSuite.tw index 16a1aafe364b4dd3f990dbfae26da359ec03fbc6..7d91c0160255d6c25ea971e34c6573324226efee 100644 --- a/src/uncategorized/reBusyMasterSuite.tw +++ b/src/uncategorized/reBusyMasterSuite.tw @@ -136,7 +136,7 @@ <<link "Slide in behind the concubine for some action">> <<replace "#result">> <<setLocalPronouns _top.slave 2>> - _S.Concubine.slaveName anticipates you, and is already sliding $himself partway out of _top.slave.slaveName and cocking $his hips to spread $his + _S.Concubine.slaveName anticipates you, and is already sliding $himself partway out of <<=_top.slave.slaveName>> and cocking $his hips to spread $his <<if _S.Concubine.butt > 15>> immeasurable <<elseif _S.Concubine.butt > 10>> @@ -150,7 +150,7 @@ <<else>> trim <</if>> - buttocks as wide as $he can without disentangling $himself from the sex train. Up on the bed $he's at just the right height, and $he winks $his _concubineHole invitingly<<if canTalk(_S.Concubine)>>, laughing at the sheer decadence of it<</if>>. <<if ($PC.dick == 0)>>You pull on a strap-on and push it<<else>>You push yourself<</if>> home with some force, your concubine's extreme state of arousal leaving $his ass very relaxed and welcoming; the thrust shoves $him forward to hilt $himself in _top.slave.slaveName, and so on down the line, producing more giggling, some squealing, and much scrabbling for balance. It takes a while to find the rhythm, and while you wait for the inevitable tangles to be fixed you decide to challenge yourself. You reach around and <<if (_S.Concubine.boobs > 10000)>>sink your hands into _S.Concubine.slaveName's massive boobs<<elseif (_S.Concubine.boobs > 1000)>>heft _S.Concubine.slaveName's heavy boobs<<elseif (_S.Concubine.boobs > 300)>>tease _S.Concubine.slaveName's healthy breasts<<else>>massage _S.Concubine.slaveName's flat chest<</if>>, nibbling $his _S.Concubine.skin neck, and generally torturing $him with stimulation until $he climaxes to $his beloved <<= getWrittenTitle(_S.Concubine)>>. When $he does, you extract yourself and pull $him unceremoniously off _top.slave.slaveName, replacing $him in _top.slave.slaveName's <<if _top.mode === "anal">>butt<<else>>pussy<</if>>. You work your way down the line, orgasm by orgasm, delaying your own climax until the exhausted _bottomSlave.slaveName manages yet another orgasm by heroic efforts, and you're done. As you roll off _him2, panting, there is scattered applause and much congratulation from your harem of @@.mediumaquamarine;trusting slaves.@@ + buttocks as wide as $he can without disentangling $himself from the sex train. Up on the bed $he's at just the right height, and $he winks $his _concubineHole invitingly<<if canTalk(_S.Concubine)>>, laughing at the sheer decadence of it<</if>>. <<if ($PC.dick == 0)>>You pull on a strap-on and push it<<else>>You push yourself<</if>> home with some force, your concubine's extreme state of arousal leaving $his ass very relaxed and welcoming; the thrust shoves $him forward to hilt $himself in <<= _top.slave.slaveName>>, and so on down the line, producing more giggling, some squealing, and much scrabbling for balance. It takes a while to find the rhythm, and while you wait for the inevitable tangles to be fixed you decide to challenge yourself. You reach around and <<if (_S.Concubine.boobs > 10000)>>sink your hands into _S.Concubine.slaveName's massive boobs<<elseif (_S.Concubine.boobs > 1000)>>heft _S.Concubine.slaveName's heavy boobs<<elseif (_S.Concubine.boobs > 300)>>tease _S.Concubine.slaveName's healthy breasts<<else>>massage _S.Concubine.slaveName's flat chest<</if>>, nibbling $his _S.Concubine.skin neck, and generally torturing $him with stimulation until $he climaxes to $his beloved <<= getWrittenTitle(_S.Concubine)>>. When $he does, you extract yourself and pull $him unceremoniously off <<= _top.slave.slaveName>>, replacing $him in <<= _top.slave.slaveName>>'s <<if _top.mode === "anal">>butt<<else>>pussy<</if>>. You work your way down the line, orgasm by orgasm, delaying your own climax until the exhausted _bottomSlave.slaveName manages yet another orgasm by heroic efforts, and you're done. As you roll off _him2, panting, there is scattered applause and much congratulation from your harem of @@.mediumaquamarine;trusting slaves.@@ <<set _S.Concubine.trust += 5>> <<run seX($PC, "penetrative", _S.Concubine, _concubineMode)>> <<run _msSlaves.forEach((s) => { @@ -158,7 +158,7 @@ seX($PC, "penetrative", s.slave, s.mode); })>> <<if canImpreg(_bottomSlave, $PC)>> - <<= knockMeUp(_bottomSlave, 10, 1, $PC.ID, 1)>> + <<run knockMeUp(_bottomSlave, 10, 1, $PC.ID)>> <</if>> <</replace>> <</link>> @@ -176,7 +176,7 @@ <<else>> lips <</if>> - around your <<if ($PC.dick == 0)>>clit<<else>>cock<<if $PC.vagina != -1>> and starts stroking your pussy<</if>><</if>> eagerly enough, even as _msSlaves[1].slave.slaveName goes back to fucking _him2. The sex train is fairly gentle, since anything too fast would disintegrate the gymnastic arrangement, but _bottomSlave.slaveName is still getting enough stimulation that _he2 whimpers quietly into your <<if ($PC.vagina != -1)>>pussy<<else>>dick<</if>>, a nice feeling. The blowjob is <<if (_bottomSlave.skill.oral >= 100)>>masterful, despite the distraction<<elseif (_bottomSlave.skill.oral > 10)>>serviceable, despite the distraction<<else>>only mediocre, but serviceable enough<</if>>, so you let _him2 work for a while before gently shoving _him2 off the side of the bed and telling _him2 to get to the back of the line. The slaves all shuffle forward awkwardly, and inadvertently block your view so that you hear rather than see _bottomSlave.slaveName start groping your concubine _S.Concubine.slaveName's + around your <<if ($PC.dick == 0)>>clit<<else>>cock<<if $PC.vagina != -1>> and starts stroking your pussy<</if>><</if>> eagerly enough, even as <<=_msSlaves[1].slave.slaveName>> goes back to fucking _him2. The sex train is fairly gentle, since anything too fast would disintegrate the gymnastic arrangement, but _bottomSlave.slaveName is still getting enough stimulation that _he2 whimpers quietly into your <<if ($PC.vagina != -1)>>pussy<<else>>dick<</if>>, a nice feeling. The blowjob is <<if (_bottomSlave.skill.oral >= 100)>>masterful, despite the distraction<<elseif (_bottomSlave.skill.oral > 10)>>serviceable, despite the distraction<<else>>only mediocre, but serviceable enough<</if>>, so you let _him2 work for a while before gently shoving _him2 off the side of the bed and telling _him2 to get to the back of the line. The slaves all shuffle forward awkwardly, and inadvertently block your view so that you hear rather than see _bottomSlave.slaveName start groping your concubine _S.Concubine.slaveName's <<if _S.Concubine.butt > 15>> immeasurable <<elseif _S.Concubine.butt > 10>> diff --git a/src/uncategorized/recruiterSelect.tw b/src/uncategorized/recruiterSelect.tw deleted file mode 100644 index 23c96f0d8cc23063cdd6b7620c8c611222adee15..0000000000000000000000000000000000000000 --- a/src/uncategorized/recruiterSelect.tw +++ /dev/null @@ -1,67 +0,0 @@ -:: Recruiter Select [nobr jump-to-safe jump-from-safe] - -<<set $nextButton = "Back to Main", $nextLink = "Main", $encyclopedia = "Recruiter">> -<<if ($RecruiterID != 0)>> - <<setLocalPronouns _S.Recruiter>> - <span class='slave-name'><<= SlaveFullName(_S.Recruiter)>></span> is - <<if $recruiterTarget != "other arcologies">> - recruiting girls. - <<else>> - acting as a sexual - <<if $arcologies[0].influenceTarget == -1>> - Ambassador. @@.red;Since you have not selected another arcology to influence, $he has no target for Ambassadorial duties. Select an influence target to apply $his talents.@@ - <<else>> - Ambassador to <<for $i = 0; $i < $arcologies.length; $i++>><<if $arcologies[$i].direction == $arcologies[0].influenceTarget>>$arcologies[$i].name<<break>><</if>><</for>>. - <</if>> - <</if>> -<<else>> - You do not have a recruiter working at present. -<</if>> - -<br><br>Your recruiter will <<if $recruiterTarget != "other arcologies">>target ''$recruiterTarget.''<<else>>spread your arcology's culture to neighboring arcologies.<</if>> __Assign a different focus:__ -<br> [[Desperate whores|Recruiter Select][$recruiterTarget = "desperate whores"]] //Likely to be skilled but unhealthy// -<br> [[Young migrants|Recruiter Select][$recruiterTarget = "young migrants"]] //Young and inexperienced but unhealthy// -<br> [[Recent divorcees|Recruiter Select][$recruiterTarget = "recent divorcees"]] //Will be mature// -<<if ($seeDicks != 100) && $seePreg != 0>> - <br> [[Expectant mothers|Recruiter Select][$recruiterTarget = "expectant mothers"]] //Will be pregnant, and likely unhealthy// -<</if>> -<<if ($seeDicks != 0)>> - <br> [[Dissolute sissies|Recruiter Select][$recruiterTarget = "dissolute sissies"]] //Will be born male and have some experience// - <br> [[Reassignment candidates|Recruiter Select][$recruiterTarget = "reassignment candidates"]] //Will be born male// -<</if>> -<<if $arcologies.length > 1>> - <<if $FSAnnounced>> - <br> [[Other arcologies' cultures|Recruiter Select][$oldRecruiterTarget = $recruiterTarget, $recruiterTarget = "other arcologies"]] //Will appoint the Recruiter to be a sexual Ambassador// - <</if>> -<</if>> - -<br><br>Target only individuals that can pass eugenics SMR. -<<if $recruiterEugenics < 1>>[[Target|Recruiter Select][$recruiterEugenics = 1]] - <<else>>[[Stop targeting|Recruiter Select][$recruiterEugenics = 0]] -<</if>> -<br> //This option will increase time it takes to recruit depending on how many eugenics SMR are active.// - -/* sum for "facilities & leadership" */ -<<set _idleTarget = (2 + $brothel + $club + $arcade + $dairy + $servantsQuarters + $masterSuite)>> -<<if $HGSuite>><<set _idleTarget++>><</if>> -<<if $dojo>><<set _idleTarget++>><</if>> -<<if $brothel>><<set _idleTarget++>><</if>> -<<if $club>><<set _idleTarget++>><</if>> -<<if $dairy && ($dairyRestraintsSetting < 2)>><<set _idleTarget++>><</if>> -<<if $farmyard>><<set _idleTarget++>><</if>> -<<if $servantsQuarters>><<set _idleTarget++>><</if>> -<<if $masterSuite>><<set _idleTarget++>><</if>> -<<if $schoolroom>><<set _idleTarget++>><</if>> -<<if $spa>><<set _idleTarget++>><</if>> -<<if $nursery>><<set _idleTarget++>><</if>> -<<if $clinic>><<set _idleTarget++>><</if>> -<<if $cellblock>><<set _idleTarget++>><</if>> - -<br><br>Suspend active recruiting and focus on publicity when: <span id="idleRule"><<switch $recruiterIdleRule>><<case "number">>''$recruiterIdleNumber sex slaves owned''<<case "facility">>''match facility expansion'', currently <<if _idleTarget >= 20>>_idleTarget positions<<else>>20 positions (rule minimum)<</if>><<default>>''always recruit''<</switch>></span> -<br> <<link "Always recruit">><<set $recruiterIdleRule = "always">><<replace "#idleRule">>''always recruit''<</replace>><</link>> | <<link "Facilities & leadership">><<set $recruiterIdleRule = "facility">><<replace "#idleRule">>''match facility expansion'', currently <<if _idleTarget >=20>>_idleTarget positions<<else>>20 positions (rule minimum)<</if>><</replace>><</link>> | <<link "Set to this many slaves:">><<set $recruiterIdleRule = "number", $recruiterIdleNumber = Math.max(Math.trunc(Number($seed) || 20), 20)>><<replace "#idleRule">>''$recruiterIdleNumber sex slaves owned''<</replace>><<replace "#numberBox">><<textbox "$seed" $recruiterIdleNumber>><</replace>><</link>> <span id="numberBox"><<textbox "$seed" $recruiterIdleNumber>></span> /* use of $seed in conjunction with link prevents NaN error */ -<br> //"Facilities" doesn't include training slots in cellblock, schoolroom, spa, clinic (but does include those leaders)// - -<br><br>''Appoint a recruiter from among your devoted slaves:'' -<br>[[None|Main][removeJob(_S.Recruiter, "recruit girls")]] -<br><br> -<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.penthouse, "Main")>> diff --git a/src/uncategorized/schoolteacherSelect.tw b/src/uncategorized/schoolteacherSelect.tw deleted file mode 100644 index 7572a3d974d9a863dcab5b573fc2886f6a5cb300..0000000000000000000000000000000000000000 --- a/src/uncategorized/schoolteacherSelect.tw +++ /dev/null @@ -1,14 +0,0 @@ -:: Schoolteacher Select [nobr jump-to-safe jump-hidden jump-from-safe] - -<<set $nextButton = "Back", $nextLink = "Schoolroom", $encyclopedia = "Schoolteacher">> -<<if _S.Schoolteacher>> - <<setLocalPronouns _S.Schoolteacher>> - <span class='slave-name'><<= SlaveFullName(_S.Schoolteacher)>></span> is serving as your Schoolteacher.<br><br>$He will help teach your slaves. -<<else>> - You have not selected a Schoolteacher. -<</if>> - -<br><br>''Appoint a Schoolteacher from your devoted slaves:'' -<br><br>[[None|Schoolroom][removeJob(_S.Schoolteacher, "be the Schoolteacher")]] -<br><br> -<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.schoolroom, "Schoolroom")>> diff --git a/src/uncategorized/stewardessSelect.tw b/src/uncategorized/stewardessSelect.tw deleted file mode 100644 index a9dc36cfaa208ee59e6792dc62cb935d5337c05b..0000000000000000000000000000000000000000 --- a/src/uncategorized/stewardessSelect.tw +++ /dev/null @@ -1,14 +0,0 @@ -:: Stewardess Select [nobr jump-to-safe jump-hidden jump-from-safe] - -<<set $nextButton = "Back", $nextLink = "Servants' Quarters", $encyclopedia = "Stewardess">> -<<if (_S.Stewardess)>> - <<setLocalPronouns _S.Stewardess>> - <span class='slave-name'><<= SlaveFullName(_S.Stewardess)>></span> is serving as your Stewardess.<br><br>$He will manage the Servants' Quarters. -<<else>> - You have not selected a Stewardess. -<</if>> - -<br><br>''Appoint a Stewardess from your devoted slaves:'' -<br><br>[[None|Servants' Quarters][removeJob(_S.Stewardess, Job.STEWARD)]] -<br><br> -<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.servantsQuarters, "Servants' Quarters")>> diff --git a/src/uncategorized/universalRules.tw b/src/uncategorized/universalRules.tw deleted file mode 100644 index 183269ca78cad6bbfc64122afdd7885e64a60385..0000000000000000000000000000000000000000 --- a/src/uncategorized/universalRules.tw +++ /dev/null @@ -1,766 +0,0 @@ -:: Universal Rules [nobr jump-to-safe jump-from-safe] - -<<set $nextButton = "Back", $nextLink = "Manage Penthouse">> - -''Permissions for slaves'' -<br> - -<<if $universalRulesRest == 0>> - Slaves will ''remain on assignment'' when unhealthy. [[Allow automatic rest when unhealthy|Universal Rules][$universalRulesRest = 1]] -<<else>> - Slaves will ''automatically rest'' at $assistant.name's discretion when unhealthy. [[Require all slaves to stay on assignment|Universal Rules][$universalRulesRest = 0]] -<</if>> - -<br> - -<<if $universalRulesConsent == 0>> - Slaves are ''not required'' to get consent before fucking other slaves. [[Restrain slave on slave molestation|Universal Rules][$universalRulesConsent = 1]] -<<else>> - Slaves are ''generally required'' to get consent before fucking other slaves. [[Encourage slave on slave molestation|Universal Rules][$universalRulesConsent = 0]] -<</if>> - -<br> - -Slave requests for body mods are -<<if ($modRequestsAllowed == 0)>> - @@.red;FORBIDDEN.@@ [[Allow|Universal Rules][$modRequestsAllowed = 1]] -<<else>> - @@.cyan;ALLOWED.@@ [[Forbid|Universal Rules][$modRequestsAllowed = 0]] -<</if>> - -<br> - -Slave requests for growth hormones are -<<if ($expansionRequestsAllowed == 0)>> - @@.red;FORBIDDEN.@@ [[Allow|Universal Rules][$expansionRequestsAllowed = 1]] -<<else>> - @@.cyan;ALLOWED.@@ [[Forbid|Universal Rules][$expansionRequestsAllowed = 0]] -<</if>> - -<<if $brothel+$club+$dairy+$farmyard+$servantsQuarters+$arcade+$schoolroom+$spa+$nursery+$clinic+$masterSuite+$cellblock > 0>> - <br> - <<if $universalRulesFacilityWork == 0>> - Slaves ''will not'' cooperate with staffed facilities to improve their performance. [[Allow cooperation|Universal Rules][$universalRulesFacilityWork = 1]] - <<else>> - Slaves ''will'' cooperate with staffed facilities to improve their performance. [[Stop cooperation|Universal Rules][$universalRulesFacilityWork = 0]] - <</if>> -<</if>> - -<<if $brothel+$club+$dairy+$farmyard+$servantsQuarters+$arcade+$schoolroom+$spa+$nursery+$clinic+$masterSuite+$cellblock > 0>> - <br> - <<if $universalRulesAssignsSelfFacility == 1>> - Slaves ''are'' permitted to assign themselves to facilities when choosing their assignment. [[Deny self assignment to facilities|Universal Rules][$universalRulesAssignsSelfFacility = 0]] - <<else>> - Slaves ''are not'' permitted to assign themselves to facilities when choosing their assignment. [[Permit self assignment to facilities|Universal Rules][$universalRulesAssignsSelfFacility = 1]] - <</if>> -<</if>> - -<br> - -<<if $universalRulesImmobileSlavesMaintainMuscles == 1>> - Immobile slaves ''will maintain'' their muscles rather than allow themselves to become soft. - [[Stop mandatory workouts|Universal Rules][$universalRulesImmobileSlavesMaintainMuscles = 0]] -<<else>> - Immobile slaves ''will not maintain'' their musculature and will gradually lose it. - [[Mandatory workouts|Universal Rules][$universalRulesImmobileSlavesMaintainMuscles = 1]] -<</if>> - -<br><br> -''Branding for slaves'' -<br> - -Choose an official brand. Any slave marked with this brand will be connected to your reputation, and will receive a beauty boost or penalty depending on how high or low that reputation is. -<br> -Use ''$brandDesign.official'' or choose another brand: -[[Your slaving emblem|Universal Rules][$brandDesign.official = "your personal symbol"]] -| [[Your initials|Universal Rules][$brandDesign.official = "your initials"]] -<br> -[[SLUT|Universal Rules][$brandDesign.official = "SLUT"]] -| [[WHORE|Universal Rules][$brandDesign.official = "WHORE"]] -| [[SLAVE|Universal Rules][$brandDesign.official = "SLAVE"]] -| [[COW|Universal Rules][$brandDesign.official = "COW"]] -| [[MEAT|Universal Rules][$brandDesign.official = "MEAT"]] -| [[CUMDUMP|Universal Rules][$brandDesign.official = "CUMDUMP"]] -| [[LOVER|Universal Rules][$brandDesign.official = "LOVER"]] -<br> -[[Pussy symbol|Universal Rules][$brandDesign.official = "a pussy symbol"]] -| [[Anus symbol|Universal Rules][$brandDesign.official = "an anus symbol"]] -| [[Penis symbol|Universal Rules][$brandDesign.official = "a penis symbol"]] -<br> -[[Lady|Universal Rules][$brandDesign.official = "a lady silhouette"]] -| [[Princess|Universal Rules][$brandDesign.official = "a princess silhouette"]] -| [[Queen|Universal Rules][$brandDesign.official = "a queen silhouette"]] -| [[Angel|Universal Rules][$brandDesign.official = "an angel silhouette"]] -| [[Devil|Universal Rules][$brandDesign.official = "a devil silhouette"]] -<<if $arcologies[0].FSSupremacist != "unset" || $arcologies[0].FSSubjugationist != "unset">> -| //FS// [[Racial Slur|Universal Rules][$brandDesign.official = "a racial slur"]] <</if>> -<<if ($arcologies[0].FSIntellectualDependency != "unset")>> -| //FS// [[Scores|Universal Rules][$brandDesign.official = "how much sex $he needs per day"]] <</if>> -<<if ($arcologies[0].FSSlaveProfessionalism != "unset")>> -| //FS// [[Scores|Universal Rules][$brandDesign.official = "$his average slave aptitude test scores"]] <</if>> -<<if ($arcologies[0].FSRepopulationFocus != "unset")>> -| //FS// [[Birth Count|Universal Rules][$brandDesign.official = "the number of children $he has birthed"]] <</if>> -<<if ($arcologies[0].FSGenderRadicalist != "unset") || ($arcologies[0].FSGenderFundamentalist != "unset")>> -| //FS// [[Gender Symbol|Universal Rules][$brandDesign.official = "a gender symbol"]] <</if>> -<<if ($arcologies[0].FSPaternalist != "unset")>> -| //FS// [[Personal Symbol|Universal Rules][$brandDesign.official = "$his own personal symbol"]] <</if>> -<<if ($arcologies[0].FSDegradationist != "unset")>> -| //FS// [[Chain Symbol|Universal Rules][$brandDesign.official = "a chain symbol"]] <</if>> -<<if ($arcologies[0].FSBodyPurist != "unset")>> -| //FS// [[Vitruvian Man|Universal Rules][$brandDesign.official = "a Vitruvian man"]] <</if>> -<<if ($arcologies[0].FSTransformationFetishist != "unset")>> -| //FS// [[Scalpel|Universal Rules][$brandDesign.official = "a scalpel"]] <</if>> -<<if ($arcologies[0].FSYouthPreferentialist != "unset")>> -| //FS// [[Virginity Status|Universal Rules][$brandDesign.official = "$his virginity status"]] <</if>> -<<if ($arcologies[0].FSMaturityPreferentialist != "unset")>> -| //FS// [[Sexual Skill Info|Universal Rules][$brandDesign.official = "$his sexual skills"]] <</if>> -<<if ($arcologies[0].FSPetiteAdmiration != "unset") || ($arcologies[0].FSStatuesqueGlorification != "unset")>> -| //FS// [[Current height|Universal Rules][$brandDesign.official = "$his current height"]] <</if>> -<<if ($arcologies[0].FSSlimnessEnthusiast != "unset")>> -| //FS// [[Breast Floor|Universal Rules][$brandDesign.official = "$his absolute minimum breast size"]] <</if>> -<<if ($arcologies[0].FSAssetExpansionist != "unset")>> -| //FS// [[Breast Ceiling|Universal Rules][$brandDesign.official = "$his absolute maximum breast size"]] <</if>> -<<if ($arcologies[0].FSHedonisticDecadence != "unset")>> -| //FS// [[Weight Record|Universal Rules][$brandDesign.official = "$his highest weigh-in"]] <</if>> -<<if ($arcologies[0].FSHedonisticDecadence != "unset") && $PC.refreshmentType == 2>> -| //FS// [[Favorite Food|Universal Rules][$brandDesign.official = "a big helping of "+$PC.refreshment]] <</if>> -<<if ($arcologies[0].FSPastoralist != "unset")>> -| //FS// [[Product Quality|Universal Rules][$brandDesign.official = "$his body product quality"]] <</if>> -<<if ($arcologies[0].FSPhysicalIdealist != "unset")>> -| //FS// [[Deadlift Info|Universal Rules][$brandDesign.official = "$his deadlift record"]] <</if>> -<<if ($arcologies[0].FSChattelReligionist != "unset")>> -| //FS// [[Religious Symbol|Universal Rules][$brandDesign.official = "a religious symbol"]] <</if>> -<<if ($arcologies[0].FSRomanRevivalist != "unset")>> -| //FS// [[Republican Crest|Universal Rules][$brandDesign.official = "the crest of your Republic"]] <</if>> -<<if ($arcologies[0].FSAztecRevivalist != "unset")>> -| //FS// [[Seven Serpents|Universal Rules][$brandDesign.official = "the symbol of the Aztec gods"]] <</if>> -<<if ($arcologies[0].FSEgyptianRevivalist != "unset")>> -| //FS// [[Dynastic Sigil|Universal Rules][$brandDesign.official = "the sigil of your Dynasty"]] <</if>> -<<if ($arcologies[0].FSEdoRevivalist != "unset")>> -| //FS// [[Mon|Universal Rules][$brandDesign.official = "the Shogunate's mon"]] <</if>> -<<if ($arcologies[0].FSArabianRevivalist != "unset")>> -| //FS// [[Caliphate Symbol|Universal Rules][$brandDesign.official = "a symbol of the Caliphate"]] <</if>> -<<if ($arcologies[0].FSChineseRevivalist != "unset")>> -| //FS// [[Imperial Seal|Universal Rules][$brandDesign.official = "your Imperial Seal"]] <</if>> -<<if ($arcologies[0].FSNeoImperialist != "unset")>> -| //FS// [[Imperial Family Crest|Universal Rules][$brandDesign.official = "your Family Crest"]] <</if>> - -<br> -Or design your own: <<textbox "$brandDesign.official" $brandDesign.official "Universal Rules">> //For best results, use a single word// - -<br><br> - -One 'welcome' for a new slave is to have them branded. Where would you like such brands to be applied? -<<if ["ankle", "breast", "buttock", "calf", "cheek", "ear", "foot", "hand", "lower arm", "shoulder", "testicle", "thigh", "upper arm", "wrist"].includes($brandTarget.primary)>> - <br> On the - [[left|Universal Rules][$brandTarget.primary = ("left " + $brandTarget.primary)]] - $brandTarget.primary, or the - [[right|Universal Rules][$brandTarget.primary = ("right " + $brandTarget.primary)]]? -<<else>> - <br> Current site is ''$brandTarget.primary'': - [[Ears|Universal Rules][$brandTarget.primary = "ear"]] - | [[Cheeks|Universal Rules][$brandTarget.primary = "cheek"]] - | [[Shoulders|Universal Rules][$brandTarget.primary = "shoulder"]] - | [[Breasts|Universal Rules][$brandTarget.primary = "breast"]] - | [[Arm, upper|Universal Rules][$brandTarget.primary = "upper arm"]] - | [[Arm, lower|Universal Rules][$brandTarget.primary = "lower arm"]] - | [[Wrist|Universal Rules][$brandTarget.primary = "wrist"]] - | [[Hand|Universal Rules][$brandTarget.primary = "hand"]] - | [[Buttocks|Universal Rules][$brandTarget.primary = "buttock"]] - | [[Thigh|Universal Rules][$brandTarget.primary = "thigh"]] - | [[Calf|Universal Rules][$brandTarget.primary = "calf"]] - | [[Ankle|Universal Rules][$brandTarget.primary = "ankle"]] - | [[Feet|Universal Rules][$brandTarget.primary = "foot"]] - | [[Neck|Universal Rules][$brandTarget.primary = "neck"]] - | [[Chest|Universal Rules][$brandTarget.primary = "chest"]] - | [[Belly|Universal Rules][$brandTarget.primary = "belly"]] - | [[Pubic Mound|Universal Rules][$brandTarget.primary = "pubic mound"]] - | [[Penis|Universal Rules][$brandTarget.primary = "penis"]] - | [[Testicles|Universal Rules][$brandTarget.primary = "testicle"]] - | [[Back|Universal Rules][$brandTarget.primary = "back"]] - | [[Lower Back|Universal Rules][$brandTarget.primary = "lower back"]] -<</if>> - -<<if ["ankle", "breast", "buttock", "calf", "cheek", "ear", "foot", "hand", "lower arm", "shoulder", "testicle", "thigh", "upper arm", "wrist"].includes($brandTarget.secondary)>> - <br> On the - [[left|Universal Rules][$brandTarget.secondary = ("left " + $brandTarget.secondary)]] - $brandTarget.secondary, or the - [[right|Universal Rules][$brandTarget.secondary = ("right " + $brandTarget.secondary)]]? -<<elseif [ - "left ankle", "right ankle", - "left calve", "right calve", - "left ear", "right ear", - "left foot", "right foot", - "left hand", "right hand", - "left lower arm", "right lower arm", - "left penis", "right penis", - "left testicle", "right testicle", - "left thigh", "right thigh", - "left upper arm", "right upper arm", - "left wrist", "right wrist" - ].includes($brandTarget.primary)>> - <br> It's possible that ''$brandTarget.primary'' may be missing from a slave. Choose a fallback in case it is not available: Current backup is ''$brandTarget.secondary'': - /* Material copied from bodyModification, but please leave commented out any sections that may not be on ALL slaves. */ - - /*<<if hasAnyEars(_slave)>>[[Ears|Universal Rules][$brandTarget.secondary = "ear"]]<</if>>*/ - | [[Cheeks|Universal Rules][$brandTarget.secondary = "cheek"]] - | [[Shoulders|Universal Rules][$brandTarget.secondary = "shoulder"]] - | [[Breasts|Universal Rules][$brandTarget.secondary = "breast"]] - /*<<if hasAnyNaturalArms(_slave)>> - | [[Arm, upper|Universal Rules][$brandTarget.secondary = "upper arm"]] - | [[Arm, lower|Universal Rules][$brandTarget.secondary = "lower arm"]] - | [[Wrist|Universal Rules][$brandTarget.secondary = "wrist"]] - | [[Hand|Universal Rules][$brandTarget.secondary = "hand"]] - <</if>>*/ - | [[Buttocks|Universal Rules][$brandTarget.secondary = "buttock"]] - /*<<if hasAnyNaturalLegs(_slave)>> - | [[Thigh|Universal Rules][$brandTarget.secondary = "thigh"]] - | [[Calf|Universal Rules][$brandTarget.secondary = "calf"]] - | [[Ankle|Universal Rules][$brandTarget.secondary = "ankle"]] - | [[Feet|Universal Rules][$brandTarget.secondary = "foot"]] - <</if>>*/ - | [[Neck|Universal Rules][$brandTarget.secondary = "neck"]] - | [[Chest|Universal Rules][$brandTarget.secondary = "chest"]] - | [[Belly|Universal Rules][$brandTarget.secondary = "belly"]] - | [[Pubic Mound|Universal Rules][$brandTarget.secondary = "pubic mound"]] - /*<<if _slave.dick > 0>> - | [[Penis|Universal Rules][$brandTarget.secondary = "penis"]] - <</if>>*/ - /*<<if _slave.balls > 0 && _slave.scrotum > 0>> - | [[Testicles|Universal Rules][$brandTarget.secondary = "testicle"]] - <</if>>*/ - | [[Back|Universal Rules][$brandTarget.secondary = "back"]] - | [[Lower Back|Universal Rules][$brandTarget.secondary = "lower back"]] -<</if>> - -<br> - -Use ''$brandDesign.primary'' or choose another brand: -[[Your slaving emblem|Universal Rules][$brandDesign.primary = "your personal symbol"]] -| [[Your initials|Universal Rules][$brandDesign.primary = "your initials"]] -<br> -[[SLUT|Universal Rules][$brandDesign.primary = "SLUT"]] -| [[WHORE|Universal Rules][$brandDesign.primary = "WHORE"]] -| [[SLAVE|Universal Rules][$brandDesign.primary = "SLAVE"]] -| [[COW|Universal Rules][$brandDesign.primary = "COW"]] -| [[MEAT|Universal Rules][$brandDesign.primary = "MEAT"]] -| [[CUMDUMP|Universal Rules][$brandDesign.primary = "CUMDUMP"]] -| [[LOVER|Universal Rules][$brandDesign.primary = "LOVER"]] -<br> -[[Pussy symbol|Universal Rules][$brandDesign.primary = "a pussy symbol"]] -| [[Anus symbol|Universal Rules][$brandDesign.primary = "an anus symbol"]] -| [[Penis symbol|Universal Rules][$brandDesign.primary = "a penis symbol"]] -<br> -[[Lady|Universal Rules][$brandDesign.primary = "a lady silhouette"]] -| [[Princess|Universal Rules][$brandDesign.primary = "a princess silhouette"]] -| [[Queen|Universal Rules][$brandDesign.primary = "a queen silhouette"]] -| [[Angel|Universal Rules][$brandDesign.primary = "an angel silhouette"]] -| [[Devil|Universal Rules][$brandDesign.primary = "a devil silhouette"]] -<<if $arcologies[0].FSSupremacist != "unset" || $arcologies[0].FSSubjugationist != "unset">> -| //FS// [[Racial Slur|Universal Rules][$brandDesign.primary = "a racial slur"]] <</if>> -<<if ($arcologies[0].FSIntellectualDependency != "unset")>> -| //FS// [[Scores|Universal Rules][$brandDesign.primary = "how much sex $he needs per day"]] <</if>> -<<if ($arcologies[0].FSSlaveProfessionalism != "unset")>> -| //FS// [[Scores|Universal Rules][$brandDesign.primary = "$his average slave aptitude test scores"]] <</if>> -<<if ($arcologies[0].FSRepopulationFocus != "unset")>> -| //FS// [[Birth Count|Universal Rules][$brandDesign.primary = "the number of children $he has birthed"]] <</if>> -<<if ($arcologies[0].FSGenderRadicalist != "unset") || ($arcologies[0].FSGenderFundamentalist != "unset")>> -| //FS// [[Gender Symbol|Universal Rules][$brandDesign.primary = "a gender symbol"]] <</if>> -<<if ($arcologies[0].FSPaternalist != "unset")>> -| //FS// [[Personal Symbol|Universal Rules][$brandDesign.primary = "$his own personal symbol"]] <</if>> -<<if ($arcologies[0].FSDegradationist != "unset")>> -| //FS// [[Chain Symbol|Universal Rules][$brandDesign.primary = "a chain symbol"]] <</if>> -<<if ($arcologies[0].FSBodyPurist != "unset")>> -| //FS// [[Vitruvian Man|Universal Rules][$brandDesign.primary = "a Vitruvian man"]] <</if>> -<<if ($arcologies[0].FSTransformationFetishist != "unset")>> -| //FS// [[Scalpel|Universal Rules][$brandDesign.primary = "a scalpel"]] <</if>> -<<if ($arcologies[0].FSYouthPreferentialist != "unset")>> -| //FS// [[Virginity Status|Universal Rules][$brandDesign.primary = "$his virginity status"]] <</if>> -<<if ($arcologies[0].FSMaturityPreferentialist != "unset")>> -| //FS// [[Sexual Skill Info|Universal Rules][$brandDesign.primary = "$his sexual skills"]] <</if>> -<<if ($arcologies[0].FSPetiteAdmiration != "unset") || ($arcologies[0].FSStatuesqueGlorification != "unset")>> -| //FS// [[Current height|Universal Rules][$brandDesign.primary = "$his current height"]] <</if>> -<<if ($arcologies[0].FSSlimnessEnthusiast != "unset")>> -| //FS// [[Breast Floor|Universal Rules][$brandDesign.primary = "$his absolute minimum breast size"]] <</if>> -<<if ($arcologies[0].FSAssetExpansionist != "unset")>> -| //FS// [[Breast Ceiling|Universal Rules][$brandDesign.primary = "$his absolute maximum breast size"]] <</if>> -<<if ($arcologies[0].FSHedonisticDecadence != "unset")>> -| //FS// [[Weight Record|Universal Rules][$brandDesign.primary = "$his highest weigh-in"]] <</if>> -<<if ($arcologies[0].FSHedonisticDecadence != "unset") && $PC.refreshmentType == 2>> -| //FS// [[Favorite Food|Universal Rules][$brandDesign.primary = "a big helping of "+$PC.refreshment]] <</if>> -<<if ($arcologies[0].FSPastoralist != "unset")>> -| //FS// [[Product Quality|Universal Rules][$brandDesign.primary = "$his body product quality"]] <</if>> -<<if ($arcologies[0].FSPhysicalIdealist != "unset")>> -| //FS// [[Deadlift Info|Universal Rules][$brandDesign.primary = "$his deadlift record"]] <</if>> -<<if ($arcologies[0].FSChattelReligionist != "unset")>> -| //FS// [[Religious Symbol|Universal Rules][$brandDesign.primary = "a religious symbol"]] <</if>> -<<if ($arcologies[0].FSRomanRevivalist != "unset")>> -| //FS// [[Republican Crest|Universal Rules][$brandDesign.primary = "the crest of your Republic"]] <</if>> -<<if ($arcologies[0].FSAztecRevivalist != "unset")>> -| //FS// [[Seven Serpents|Universal Rules][$brandDesign.primary = "the symbol of the Aztec gods"]] <</if>> -<<if ($arcologies[0].FSEgyptianRevivalist != "unset")>> -| //FS// [[Dynastic Sigil|Universal Rules][$brandDesign.primary = "the sigil of your Dynasty"]] <</if>> -<<if ($arcologies[0].FSEdoRevivalist != "unset")>> -| //FS// [[Mon|Universal Rules][$brandDesign.primary = "the Shogunate's mon"]] <</if>> -<<if ($arcologies[0].FSArabianRevivalist != "unset")>> -| //FS// [[Caliphate Symbol|Universal Rules][$brandDesign.primary = "a symbol of the Caliphate"]] <</if>> -<<if ($arcologies[0].FSChineseRevivalist != "unset")>> -| //FS// [[Imperial Seal|Universal Rules][$brandDesign.primary = "your Imperial Seal"]] <</if>> - -<br> -Or design your own: <<textbox "$brandDesign.primary" $brandDesign.primary "Universal Rules">> //For best results, use a single word// - -<<if $brandDesign.primary === "a racial slur">> - If ''$brandDesign.primary'' does not apply to the slave, choose a backup brand: - [[Your slaving emblem|Universal Rules][$brandDesign.secondary = "your personal symbol"]] - | [[Your initials|Universal Rules][$brandDesign.secondary = "your initials"]] - <br> - [[SLUT|Universal Rules][$brandDesign.secondary = "SLUT"]] - | [[WHORE|Universal Rules][$brandDesign.secondary = "WHORE"]] - | [[SLAVE|Universal Rules][$brandDesign.secondary = "SLAVE"]] - | [[COW|Universal Rules][$brandDesign.secondary = "COW"]] - | [[MEAT|Universal Rules][$brandDesign.secondary = "MEAT"]] - | [[CUMDUMP|Universal Rules][$brandDesign.secondary = "CUMDUMP"]] - | [[LOVER|Universal Rules][$brandDesign.secondary = "LOVER"]] - <br> - [[Pussy symbol|Universal Rules][$brandDesign.secondary = "a pussy symbol"]] - | [[Anus symbol|Universal Rules][$brandDesign.secondary = "an anus symbol"]] - | [[Penis symbol|Universal Rules][$brandDesign.secondary = "a penis symbol"]] - <br> - [[Lady|Universal Rules][$brandDesign.secondary = "a lady silhouette"]] - | [[Princess|Universal Rules][$brandDesign.secondary = "a princess silhouette"]] - | [[Queen|Universal Rules][$brandDesign.secondary = "a queen silhouette"]] - | [[Angel|Universal Rules][$brandDesign.secondary = "an angel silhouette"]] - | [[Devil|Universal Rules][$brandDesign.secondary = "a devil silhouette"]] - <<if $arcologies[0].FSSupremacist != "unset">> - | //FS// [[Racial Slur|Universal Rules][$brandDesign.secondary = "a racial slur"]] <</if>> - <<if $arcologies[0].FSSubjugationist != "unset">> - | //FS// [[Racial Slur|Universal Rules][$brandDesign.secondary = "a racial slur"]] <</if>> - <<if $arcologies[0].FSSubjugationist != "unset">> - | //FS// [[Racial Slur|Universal Rules][$brandDesign.secondary = "a racial slur"]] <</if>> - <<if ($arcologies[0].FSIntellectualDependency != "unset")>> - | //FS// [[Scores|Universal Rules][$brandDesign.secondary = "how much sex $he needs per day"]] <</if>> - <<if ($arcologies[0].FSSlaveProfessionalism != "unset")>> - | //FS// [[Scores|Universal Rules][$brandDesign.secondary = "$his average slave aptitude test scores"]] <</if>> - <<if ($arcologies[0].FSRepopulationFocus != "unset")>> - | //FS// [[Birth Count|Universal Rules][$brandDesign.secondary = "the number of children $he has birthed"]] <</if>> - <<if ($arcologies[0].FSGenderRadicalist != "unset") || ($arcologies[0].FSGenderFundamentalist != "unset")>> - | //FS// [[Gender Symbol|Universal Rules][$brandDesign.secondary = "a gender symbol"]] <</if>> - <<if ($arcologies[0].FSPaternalist != "unset")>> - | //FS// [[Personal Symbol|Universal Rules][$brandDesign.secondary = "$his own personal symbol"]] <</if>> - <<if ($arcologies[0].FSDegradationist != "unset")>> - | //FS// [[Chain Symbol|Universal Rules][$brandDesign.secondary = "a chain symbol"]] <</if>> - <<if ($arcologies[0].FSBodyPurist != "unset")>> - | //FS// [[Vitruvian Man|Universal Rules][$brandDesign.secondary = "a Vitruvian man"]] <</if>> - <<if ($arcologies[0].FSTransformationFetishist != "unset")>> - | //FS// [[Scalpel|Universal Rules][$brandDesign.secondary = "a scalpel"]] <</if>> - <<if ($arcologies[0].FSYouthPreferentialist != "unset")>> - | //FS// [[Virginity Status|Universal Rules][$brandDesign.secondary = "$his virginity status"]] <</if>> - <<if ($arcologies[0].FSMaturityPreferentialist != "unset")>> - | //FS// [[Sexual Skill Info|Universal Rules][$brandDesign.secondary = "$his sexual skills"]] <</if>> - <<if ($arcologies[0].FSPetiteAdmiration != "unset") || ($arcologies[0].FSStatuesqueGlorification != "unset")>> - | //FS// [[Current height|Universal Rules][$brandDesign.secondary = "$his current height"]] <</if>> - <<if ($arcologies[0].FSSlimnessEnthusiast != "unset")>> - | //FS// [[Breast Floor|Universal Rules][$brandDesign.secondary = "$his absolute minimum breast size"]] <</if>> - <<if ($arcologies[0].FSAssetExpansionist != "unset")>> - | //FS// [[Breast Ceiling|Universal Rules][$brandDesign.secondary = "$his absolute maximum breast size"]] <</if>> - <<if ($arcologies[0].FSHedonisticDecadence != "unset")>> - | //FS// [[Weight Record|Universal Rules][$brandDesign.secondary = "$his highest weigh-in"]] <</if>> - <<if ($arcologies[0].FSHedonisticDecadence != "unset") && $PC.refreshmentType == 2>> - | //FS// [[Favorite Food|Universal Rules][$brandDesign.secondary = "a big helping of "+$PC.refreshment]] <</if>> - <<if ($arcologies[0].FSPastoralist != "unset")>> - | //FS// [[Product Quality|Universal Rules][$brandDesign.secondary = "$his body product quality"]] <</if>> - <<if ($arcologies[0].FSPhysicalIdealist != "unset")>> - | //FS// [[Deadlift Info|Universal Rules][$brandDesign.secondary = "$his deadlift record"]] <</if>> - <<if ($arcologies[0].FSChattelReligionist != "unset")>> - | //FS// [[Religious Symbol|Universal Rules][$brandDesign.secondary = "a religious symbol"]] <</if>> - <<if ($arcologies[0].FSRomanRevivalist != "unset")>> - | //FS// [[Republican Crest|Universal Rules][$brandDesign.secondary = "the crest of your Republic"]] <</if>> - <<if ($arcologies[0].FSAztecRevivalist != "unset")>> - | //FS// [[Seven Serpents|Universal Rules][$brandDesign.secondary = "the symbol of the Aztec gods"]] <</if>> - <<if ($arcologies[0].FSEgyptianRevivalist != "unset")>> - | //FS// [[Dynastic Sigil|Universal Rules][$brandDesign.secondary = "the sigil of your Dynasty"]] <</if>> - <<if ($arcologies[0].FSEdoRevivalist != "unset")>> - | //FS// [[Mon|Universal Rules][$brandDesign.secondary = "the Shogunate's mon"]] <</if>> - <<if ($arcologies[0].FSArabianRevivalist != "unset")>> - | //FS// [[Caliphate Symbol|Universal Rules][$brandDesign.secondary = "a symbol of the Caliphate"]] <</if>> - <<if ($arcologies[0].FSChineseRevivalist != "unset")>> - | //FS// [[Imperial Seal|Universal Rules][$brandDesign.secondary = "your Imperial Seal"]] <</if>> - - <br> - Or design your own: <<textbox "$brandDesign.primary" $brandDesign.primary "Universal Rules">> //For best results, use a single word// -<</if>> -<br><br> -''Scarring for slaves'' -<br> - -/* Correct some "bad" choices" */ -<<if ["exotic", "menacing"].includes($scarDesign.primary)>> - <<if !["cheek", "left cheek", "right cheek"].includes($scarTarget.primary)>> - <<set $scarTarget.primary = "cheek">> - <</if>> -<</if>> - -One 'welcome' for a new slave is to have them scarred. Where would you like such scars to be applied? -<<if ["ankle", "breast", "buttock", "calf", "cheek", "ear", "foot", "hand", "lower arm", "shoulder", "testicle", "thigh", "upper arm", "wrist"].includes($scarTarget.primary)>> - <br> On the - [[left|Universal Rules][$scarTarget.primary = ("left " + $scarTarget.primary)]] - $scarTarget.primary, or the - [[right|Universal Rules][$scarTarget.primary = ("right " + $scarTarget.primary)]]? -<<else>> - <br> Current site is ''$scarTarget.primary'': - [[Ears|Universal Rules][$scarTarget.primary = "ear"]] - | [[Cheeks|Universal Rules][$scarTarget.primary = "cheek"]] - | [[Shoulders|Universal Rules][$scarTarget.primary = "shoulder"]] - | [[Breasts|Universal Rules][$scarTarget.primary = "breast"]] - | [[Arm, upper|Universal Rules][$scarTarget.primary = "upper arm"]] - | [[Arm, lower|Universal Rules][$scarTarget.primary = "lower arm"]] - | [[Wrist|Universal Rules][$scarTarget.primary = "wrist"]] - | [[Hand|Universal Rules][$scarTarget.primary = "hand"]] - | [[Buttocks|Universal Rules][$scarTarget.primary = "buttock"]] - | [[Thigh|Universal Rules][$scarTarget.primary = "thigh"]] - | [[Calf|Universal Rules][$scarTarget.primary = "calf"]] - | [[Ankle|Universal Rules][$scarTarget.primary = "ankle"]] - | [[Feet|Universal Rules][$scarTarget.primary = "foot"]] - | [[Neck|Universal Rules][$scarTarget.primary = "neck"]] - | [[Chest|Universal Rules][$scarTarget.primary = "chest"]] - | [[Belly|Universal Rules][$scarTarget.primary = "belly"]] - | [[Pubic Mound|Universal Rules][$scarTarget.primary = "pubic mound"]] - | [[Penis|Universal Rules][$scarTarget.primary = "penis"]] - | [[Testicles|Universal Rules][$scarTarget.primary = "testicle"]] - | [[Back|Universal Rules][$scarTarget.primary = "back"]] - | [[Lower Back|Universal Rules][$scarTarget.primary = "lower back"]] -<</if>> - -<<if ["ankle", "breast", "buttock", "calf", "cheek", "ear", "foot", "hand", "lower arm", "shoulder", "testicle", "thigh", "upper arm", "wrist"].includes($scarTarget.secondary)>> - <br> On the - [[left|Universal Rules][$scarTarget.secondary = ("left " + $scarTarget.secondary)]] - $scarTarget.secondary, or the - [[right|Universal Rules][$scarTarget.secondary = ("right " + $scarTarget.secondary)]]? -<<elseif [ - "left ankle", "right ankle", - "left calve", "right calve", - "left ear", "right ear", - "left foot", "right foot", - "left hand", "right hand", - "left lower arm", "right lower arm", - "left penis", "right penis", - "left testicle", "right testicle", - "left thigh", "right thigh", - "left upper arm", "right upper arm", - "left wrist", "right wrist" - ].includes($scarTarget.primary)>> - <br> It's possible that ''$scarTarget.primary'' may be missing from a slave. Choose a fallback in case it is not available: Current backup is ''$scarTarget.secondary'': - /* Material copied from bodyModification, but please leave commented out any sections that may not be on ALL slaves. */ - - /*<<if hasAnyEars(_slave)>>[[Ears|Universal Rules][$scarTarget.secondary = "ear"]]<</if>>*/ - | [[Cheeks|Universal Rules][$scarTarget.secondary = "cheek"]] - | [[Shoulders|Universal Rules][$scarTarget.secondary = "shoulder"]] - | [[Breasts|Universal Rules][$scarTarget.secondary = "breast"]] - /*<<if hasAnyNaturalArms(_slave)>> - | [[Arm, upper|Universal Rules][$scarTarget.secondary = "upper arm"]] - | [[Arm, lower|Universal Rules][$scarTarget.secondary = "lower arm"]] - | [[Wrist|Universal Rules][$scarTarget.secondary = "wrist"]] - | [[Hand|Universal Rules][$scarTarget.secondary = "hand"]] - <</if>>*/ - | [[Buttocks|Universal Rules][$scarTarget.secondary = "buttock"]] - /*<<if hasAnyNaturalLegs(_slave)>> - | [[Thigh|Universal Rules][$scarTarget.secondary = "thigh"]] - | [[Calf|Universal Rules][$scarTarget.secondary = "calf"]] - | [[Ankle|Universal Rules][$scarTarget.secondary = "ankle"]] - | [[Feet|Universal Rules][$scarTarget.secondary = "foot"]] - <</if>>*/ - | [[Neck|Universal Rules][$scarTarget.secondary = "neck"]] - | [[Chest|Universal Rules][$scarTarget.secondary = "chest"]] - | [[Belly|Universal Rules][$scarTarget.secondary = "belly"]] - | [[Pubic Mound|Universal Rules][$scarTarget.secondary = "pubic mound"]] - /*<<if _slave.dick > 0>> - | [[Penis|Universal Rules][$scarTarget.secondary = "penis"]] - <</if>>*/ - /*<<if _slave.balls > 0 && _slave.scrotum > 0>> - | [[Testicles|Universal Rules][$scarTarget.secondary = "testicle"]] - <</if>>*/ - | [[Back|Universal Rules][$scarTarget.secondary = "back"]] - | [[Lower Back|Universal Rules][$scarTarget.secondary = "lower back"]] -<</if>> - -<br> - -Use ''$scarDesign.primary'' or choose another scar: -[[Whip|Universal Rules][$scarDesign.primary = "whip"]] -| [[Burns|Universal Rules][$scarDesign.primary = "burn"]] -| [[Surgical|Universal Rules][$scarDesign.primary = "surgical"]] -| [[Menacing|Universal Rules][$scarDesign.primary = "menacing"]] -| [[Exotic|Universal Rules][$scarDesign.primary = "exotic"]] -/* Other common scars might be battle scars or c-Section but it makes little sense to include them here */ - -<br> -Or design your own: <<textbox "$scarDesign.primary" $scarDesign.primary "Universal Rules">> //For best results, use a single word// - -<br><br> -''Names for slaves'' -<br> - -<<if $surnamesForbidden == 0>> - <span id="strip"> - <<link "Strip all slaves of their surnames, both new and old">> - <<for _i = 0; _i < $slaves.length; _i++>> - <<set $slaves[_i].slaveSurname = 0>> - <</for>> - <<set $surnamesForbidden = 1>> - <<replace "#strip">> - Surnames taken. - <</replace>> - <<replace "#surname-style">><</replace>> - <</link>> - </span> -<<else>> - [[Allow future slaves to keep their surnames|Universal Rules][$surnamesForbidden = 0]] -<</if>> - -<span id="surname-style"> -<<if $surnamesForbidden == 0>> - <<set _options = new App.UI.OptionsGroup()>> - <<run _options.addOption("Surname convention", "surnameScheme") - .addValue("Family (Patrilineal)", 0) - .addValue("Family (Matrilineal)", 1) - .addValue("Norse (Patronymic)", 2) - .addValue("Norse (Matronymic)", 3) - .addValue("Hadesha (Patronymic)", 4) - .addValue("Hadesha (Matronymic)", 5) - .addValue("Double-barreled", 6) - .addValue("Hispanic", 7) - .addValue("Lusitanic", 8) - .addComment((() => { - const start = "If Adam Smith and Betty Jones have a daughter, Charlotte, and a son, Daniel, they will be named "; - switch (V.surnameScheme) { - case 0: - return start + "Charlotte Smith and Daniel Smith"; - case 1: - return start + "Charlotte Jones and Daniel Jones"; - case 2: - return start + "Charlotte Adamsdóttir and Daniel Adamsson"; - case 3: - return start + "Charlotte Bettysdóttir and Daniel Bettysson"; - case 4: - return start + "Charlotte Adam and Daniel Adam"; - case 5: - return start + "Charlotte Betty and Daniel Betty"; - case 6: - return start + "Charlotte Smith-Jones and Daniel Smith-Jones"; - case 7: - return start + "Charlotte Smith Jones and Daniel Smith Jones"; - case 8: - return start + "Charlotte Jones Smith and Daniel Jones Smith"; - } - })())>> - <<if [0, 1, 6, 7, 8].includes($surnameScheme)>> - <<run _options.addOption("Grant this family name to children born without one", "surnameArcology").showTextBox()>> - <</if>> - <<if [0, 1, 2, 3, 4, 5].includes($surnameScheme)>> - <<run _options.addOption("Override gender preference for your own children", "surnamePCOverride") - .addValue("Follow conventions", 0).on().addValue("Prefer using your name", 1).addValue("Avoid using your name", 2)>> - <</if>> - <<includeDOM _options.render()>> -<</if>> -</span> - -<br> - -Slave nicknames are -<<if ($nicknamesAllowed == 0)>> - @@.red;FORBIDDEN.@@ [[Allow|Universal Rules][$nicknamesAllowed = 1]] -<<else>> - @@.cyan;ALLOWED.@@ [[Forbid|Universal Rules][$nicknamesAllowed = 0]] -<</if>> - -<<if $FSAnnounced > 0>> - <br> - <<if ($useFSNames == 0)>> - Future society names for new slaves are currently @@.red;NOT APPLIED.@@ [[Apply|Universal Rules][$useFSNames = 1]] - <<else>> - Future society names for new slaves are currently @@.cyan;APPLIED.@@ [[Stop applying|Universal Rules][$useFSNames = 0]] - - <<if $FSNamePref == 0>> - You are currently not setting direction towards which Future Society names are preferred. - <<elseif $FSNamePref == 1>> - New Slaves are currently being given devotional names. - <<elseif $FSNamePref == 2>> - New slaves are currently being named according to Roman Custom. - <<elseif $FSNamePref == 3>> - New slaves are currently being named according to ancient Aztec Custom. - <<elseif $FSNamePref == 4>> - New slaves are currently being named according to ancient Egyptian Custom. - <<elseif $FSNamePref == 5>> - New slaves are currently being named according to feudal Japanese Custom. - <<elseif $FSNamePref == 6>> - New slaves are currently being named according to Degradationist Custom. - <<elseif $FSNamePref == 7>> - New slaves are currently being named according to Paternalist Custom. - <<elseif $FSNamePref == 8>> - New slaves are currently being given simple bimbo names. - <<elseif $FSNamePref == 9>> - New Slaves are currently being named according to Pastoralist Custom. - <</if>> - - <br> - - <<if $FSNamePref != 0>> - [[No Longer Specify which Future Society to Draw Names From.|Universal Rules][$FSNamePref = 0]] <br> - <</if>> - <<if $FSNamePref != 1 && $arcologies[0].FSChattelReligionist >= 20>> - [[Give New Slaves Devotional Names|Universal Rules][$FSNamePref = 1]] <br> - <</if>> - <<if $FSNamePref != 2 && $arcologies[0].FSRomanRevivalist > 20>> - [[Give New slaves Roman Names|Universal Rules][$FSNamePref = 2]] <br> - <</if>> - <<if $FSNamePref != 3 && $arcologies[0].FSAztecRevivalist > 20>> - [[Give New Slaves Ancient Aztec Names.|Universal Rules][$FSNamePref = 3]] <br> - <</if>> - <<if $FSNamePref != 4 && $arcologies[0].FSEgyptianRevivalist > 20>> - [[Give New Slaves Ancient Egyptian Names|Universal Rules][$FSNamePref = 4]] <br> - <</if>> - <<if $FSNamePref != 5 && $arcologies[0].FSEdoRevivalist > 20>> - [[Give New Slaves Feudal Japanese Names|Universal Rules][$FSNamePref = 5]] <br> - <</if>> - <<if $FSNamePref != 6 && $arcologies[0].FSDegradationist !== "unset">> - [[Give New Slaves Degrading Names|Universal Rules][$FSNamePref = 6]] <br> - <</if>> - <<if $FSNamePref != 7 && $arcologies[0].FSPaternalist >= 20>> - [[Give New Slaves Paternalist Names|Universal Rules][$FSNamePref = 7]] <br> - <</if>> - <<if $FSNamePref != 8 && $arcologies[0].FSIntellectualDependency >= 20>> - [[Give New Slaves Simple Bimbo Names|Universal Rules][$FSNamePref = 8]] - <</if>> - <</if>> -<</if>> - -<<if $seePreg != 0>> -<br><br> -''Pregnant slaves'' -<br> -<<if $universalRulesImpregnation == "HG">> - Fertile slaves will be ''systematically impregnated by your Head Girl,'' - <<if !$HeadGirlID>> - once you designate one capable of the act. - <<set $him = "them">> - <<else>> - <<setLocalPronouns _S.HeadGirl>> - if $he is able to do so. - <</if>> - [[Cancel insemination regime|Universal Rules][($universalRulesImpregnation = "none"),($universalHGImpregnateMasterSuiteToggle = 0)]] - | [[Use a Stud for insemination|Universal Rules][($universalRulesImpregnation = "Stud")]] - <<if $PC.dick > 0>> - | [[Inseminate them yourself|Universal Rules][($universalRulesImpregnation = "PC"),($universalHGImpregnateMasterSuiteToggle = 0)]] - <</if>> - <br> - <<if $universalHGImpregnateMasterSuiteToggle == 1>> - Your Head Girl, if able, ''is not'' inseminating slaves in the Master Suite. [["Allow "+$him+" to inseminate Master Suite slaves"|Universal Rules][$universalHGImpregnateMasterSuiteToggle = 0]] - <<else>> - Your Head Girl, if able, ''is'' inseminating slaves in the Master Suite. [["Forbid "+$him+" from inseminating Master Suite slaves"|Universal Rules][$universalHGImpregnateMasterSuiteToggle = 1]] - <</if>> -<<elseif $universalRulesImpregnation == "Stud">> - <<if !$StudID>> - Fertile slaves will be ''systematically impregnated by a Stud,'' once you designate a subordinate slave to act as such. - <<set $him = "them">> - <<else>> - <<set _Stud = slaveStateById($StudID)>> - <<setLocalPronouns _Stud>> - Fertile slaves will be ''systematically impregnated by your Stud,'' if $he is able to do so. - <</if>> - [[Cancel insemination regime|Universal Rules][($universalRulesImpregnation = "none"),($universalHGImpregnateMasterSuiteToggle = 0)]] - <<if $PC.dick > 0>> - | [[Inseminate them yourself|Universal Rules][($universalRulesImpregnation = "PC"),($universalHGImpregnateMasterSuiteToggle = 0)]] - <</if>> - <<if $seeDicks != 0>> - | [[Delegate insemination to your Head Girl|Universal Rules][$universalRulesImpregnation = "HG"]] - <</if>> - <br> - <<if $universalHGImpregnateMasterSuiteToggle == 1>> - Your Stud, if able, ''is not'' inseminating slaves in the Master Suite. [["Allow "+$him+" to inseminate Master Suite slaves"|Universal Rules][$universalHGImpregnateMasterSuiteToggle = 0]] - <<else>> - Your Stud, if able, ''is'' inseminating slaves in the Master Suite. [["Forbid "+$him+" from inseminating Master Suite slaves"|Universal Rules][$universalHGImpregnateMasterSuiteToggle = 1]] - <</if>> -<<elseif $universalRulesImpregnation == "PC">> - Fertile slaves will be ''systematically impregnated by you.'' - [[Cancel insemination regime|Universal Rules][$universalRulesImpregnation = "none"]] - | [[Use a Stud for insemination|Universal Rules][($universalRulesImpregnation = "Stud")]] - <<if $seeDicks != 0>> - | [[Delegate insemination to your Head Girl|Universal Rules][$universalRulesImpregnation = "HG"]] - <</if>> -<<elseif $seePreg != 0>> - Fertile slaves will ''not be systematically impregnated.'' - <<if $PC.dick > 0>> - [[Inseminate them yourself|Universal Rules][$universalRulesImpregnation = "PC"]] | - <</if>> - <<if $seeDicks != 0>> - [[Delegate insemination to your Head Girl|Universal Rules][$universalRulesImpregnation = "HG"]] | - <</if>> - [[Use a Stud for insemination|Universal Rules][($universalRulesImpregnation = "Stud")]] -<</if>> - -<br> - -<<if $universalRulesBirthing == 1>> - Heavily pregnant slaves will be ''scanned daily'' for signs of labor and moved to a birthing area immediately if any are detected. - [[Stop scanning|Universal Rules][$universalRulesBirthing = 0]] -<<else>> - Heavily pregnant slaves will be ''required to work'' right up until they feel contractions. - [[Apply daily scanning|Universal Rules][$universalRulesBirthing = 1]] - - //This will increase upkeep costs for these slaves// -<</if>> - -<br> - -<<if $universalRulesCSec == 1>> - Pregnant slaves will be ''given Caesarean sections'' rather than allowed to give birth naturally in order to minimize health issues and to preserve their vaginas. - [[Only perform c-sections when necessary|Universal Rules][$universalRulesCSec = 0]] -<<else>> - Pregnant slaves will ''give birth naturally'' unless health issues pose a threat. - [[Always perform c-sections|Universal Rules][$universalRulesCSec = 1]] - - //Will lessen medical costs, at the expense of scarring// -<</if>> - -<br><br> -''Babies'' -<br> - -Upon birth slave babies will be sent to $DefaultBirthDestination. -<br>You can decide on a new policy: - <<if $DefaultBirthDestination != "individually decided fates">> - [[Decide individually|Universal Rules][$DefaultBirthDestination = "individually decided fates",$universalRulesChildrenBecomeBreeders = 0]] - <</if>> - <<if $DefaultBirthDestination != "an orphanage">> - | [[Slave orphanage|Universal Rules][$DefaultBirthDestination = "an orphanage",$universalRulesChildrenBecomeBreeders = 0]] - <</if>> - <<if $DefaultBirthDestination != "a citizen school">> - | [[Citizen school|Universal Rules][$DefaultBirthDestination = "a citizen school",$universalRulesChildrenBecomeBreeders = 0]] - <</if>> - <<if $DefaultBirthDestination != "a private school">> - | [[Private school|Universal Rules][$DefaultBirthDestination = "a private school",$universalRulesChildrenBecomeBreeders = 0]] - <</if>> - <<if $policies.cash4Babies > 0>> - <<if $DefaultBirthDestination != "the market">> - | [[Market|Universal Rules][$DefaultBirthDestination = "the market",$universalRulesChildrenBecomeBreeders = 0]] - <</if>> - <</if>> - <<if $arcologies[0].FSRepopulationFocus > 40>> - <br> - <<if $DefaultBirthDestination != "breeder schools">> - | [[Breeder schools|Universal Rules][$DefaultBirthDestination = "breeder schools",$universalRulesChildrenBecomeBreeders = 1]] - //Will require a <<print cashFormat(50)>> donation per week once enrollment begins// - <</if>> - <</if>> - //Children reserved for the Incubator or Nursery will not be affected// - -<</if>>/*Closes seePreg check*/ -<br><br> -''New slaves'' -<br> -<<if $universalRulesNewSlavesRA == 0>> - The Rules Assistant ''will not apply'' automatically to newly acquired slaves. [[Apply to new slaves|Universal Rules][$universalRulesNewSlavesRA = 1]] -<<else>> - The Rules Assistant ''will apply'' automatically to newly acquired slaves [[Stop applying to new slaves|Universal Rules][$universalRulesNewSlavesRA = 0]] -<</if>> diff --git a/src/uncategorized/walkPastList.tw b/src/uncategorized/walkPastList.tw index fece903eb53124d7c02d9829ea386e98ab0d45f3..55abb594dccbbb86a87180349ab54ee9e6fbcec6 100644 --- a/src/uncategorized/walkPastList.tw +++ b/src/uncategorized/walkPastList.tw @@ -10,42 +10,42 @@ <h2>Choose target</h2> <<link "Lips">> <<replace "#wplist">> - <<includeDOM walkPastAll("FLips")>> + <<includeDOM walkPastAll("fLips")>> <</replace>> <</link>><br> <<link "Boobs">> <<replace "#wplist">> - <<includeDOM walkPastAll("FBoobs")>> + <<includeDOM walkPastAll("fBoobs")>> <</replace>> <</link>><br> <<link "Butt">> <<replace "#wplist">> - <<includeDOM walkPastAll("FButt")>> + <<includeDOM walkPastAll("fButt")>> <</replace>> <</link>> | <<link "Anus">> <<replace "#wplist">> - <<includeDOM walkPastAll("FAnus")>> + <<includeDOM walkPastAll("fAnus")>> <</replace>> <</link>> | <<link "Vagina">> <<replace "#wplist">> - <<includeDOM walkPastAll("FVagina")>> + <<includeDOM walkPastAll("fVagina")>> <</replace>> <</link>> //or ass if they lack one//<br> <<link "Dick">> <<replace "#wplist">> - <<includeDOM walkPastAll("FDick")>> + <<includeDOM walkPastAll("fDick")>> <</replace>> <</link>><br> <<link "Rival">> <<replace "#wplist">> - <<includeDOM walkPastAll("FRival")>> + <<includeDOM walkPastAll("fRival")>> <</replace>> <</link>><br> <<link "Relation">> <<replace "#wplist">> - <<includeDOM walkPastAll("FRelation")>> + <<includeDOM walkPastAll("fRelation")>> <</replace>> <</link>> diff --git a/src/uncategorized/wardenessSelect.tw b/src/uncategorized/wardenessSelect.tw deleted file mode 100644 index 6ae7bf5aed1652a53263bca874574444d24f3719..0000000000000000000000000000000000000000 --- a/src/uncategorized/wardenessSelect.tw +++ /dev/null @@ -1,14 +0,0 @@ -:: Wardeness Select [nobr jump-to-safe jump-hidden jump-from-safe] - -<<set $nextButton = "Back", $nextLink = "Cellblock", $encyclopedia = "Wardeness">> -<<if (_S.Wardeness)>> - <<setLocalPronouns _S.Wardeness>> - <span class='slave-name'><<= SlaveFullName(_S.Wardeness)>></span> is serving as your Wardeness.<br><br>$He will help break your prisoners. -<<else>> - You have not selected a Wardeness. -<</if>> - -<br><br>''Appoint a Wardeness from your devoted slaves:'' -<br><br>[[None|Cellblock][removeJob(_S.Wardeness, "be the Wardeness")]] -<br><br> -<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.cellblock, "Cellblock")>>