diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 248e8c623e76f1777845b5cbc48dd535f718c531..0000000000000000000000000000000000000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,21 +0,0 @@ -# only start pipelines if we are on the main branch, at a git tag or a merge request. -include: - - template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml' - -stages: - - lint - -eslint: - stage: lint - #image: node:current-alpine3.12 - image: node:12-alpine3.12 - tags: [ docker ] - script: - - npm install - #- npm ci ### should use this for automated testing instead of "npm install", but we need a package-lock.json for it. - - npm install eslint-formatter-gitlab - # > /dev/null 2>&1 || FAILED=true to make error type warnings not fail the job - - npx eslint --format gitlab . > /dev/null 2>&1 || FAILED=true - artifacts: - reports: - codequality: gl-codequality.json diff --git a/artTools/vector_deepmurk_extras.svg b/artTools/vector_deepmurk_extras.svg index 2b74000dc9ccce7d80779221d3c720c19fd82802..933a4d356a83a4da01c86b213cb4706b8315f456 100644 --- a/artTools/vector_deepmurk_extras.svg +++ b/artTools/vector_deepmurk_extras.svg @@ -1979,23 +1979,9 @@ inkscape:connector-curvature="0" sodipodi:nodetypes="ccccc" /></g></g> </g> - <g - inkscape:groupmode="layer" - id="Arm_Outfit_" - inkscape:label="Arm_Outfit_" - style="display:none"><g - inkscape:groupmode="layer" - id="Cat_Tail" - inkscape:label="Cat_Tail" - style="display:inline"><path - inkscape:connector-curvature="0" - d="m 342.15888,477.17932 c 0,0 113.6156,70.85179 139.77284,-28.74333 25.05714,-95.4064 -57.66395,-93.79968 -48.14882,-165.08654 3.40586,-25.5165 38.15951,-39.43051 38.15951,-39.43051" - style="display:inline;fill-opacity:1;fill:none;opacity:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-width:16;stroke:#20202c;vector-effect:none" - id="path2502" /><path - inkscape:connector-curvature="0" - style="display:inline;fill-opacity:1;fill:none;opacity:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-width:16;stroke:#fefefe;vector-effect:none" - d="m 442.29877,265.01668 c 11.34263,-13.77073 29.64364,-21.09774 29.64364,-21.09774" - id="path2504-9" /></g></g> + <g id="Cat_Tail" style="display:none"><path d="m 342.15888,477.17932 c 0,0 113.6156,70.85179 139.77284,-28.74333 25.05714,-95.4064 -57.66395,-93.79968 -48.14882,-165.08654 3.40586,-25.5165 38.15951,-39.43051 38.15951,-39.43051" style="display:inline;fill-opacity:1;fill:none;opacity:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-width:16;stroke:#20202c;vector-effect:none" id="path2502"/><path style="display:inline;fill-opacity:1;fill:none;opacity:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-width:16;stroke:#fefefe;vector-effect:none" d="m 442.29877,265.01668 c 11.34263,-13.77073 29.64364,-21.09774 29.64364,-21.09774" id="path2504-9"/></g> + <g id="Fox_Tail" style="display:none"><path d="M331.1 473.6c-3.7.8-4.6 2.4-2.6 5.2 2.5 1.7 4.1 4.1 6.2 6.1a32 32 0 017.1 9.2l.7 1c1.1 1.1 2.3 2.5 3.7 3.1v.2c2.2 8.5 8 17 9 24.8.7 2.6 1 5.4 2.5 7.7h1v.3c-1.6 1.7-.8 4.1-1.6 6 0 3.2-1.2 6.7.6 10l.4.3c-.7.8-.4 1.6 0 2.6l-1.3 2.3c0 2.3-.5 4.6-.5 7-.2 1.4-.4 2.7 0 4v.5c0 2.5.5 5 1 7.3-1 1.8.6 3.7-.4 5.7 2.5 4 1.2 8.7 2.5 13.1l8.5 31.8h.2a21.4 21.4 0 00.8 7.2c3.6 10.8 2.8 23 8.2 33.5 1.7 8.2 4.6 16.3 8.2 24l1.9 1.6a9.9 9.9 0 001.6 5c1.3 2.3 4.4 3.2 6.9 3.4 1 .8 2.3.8 2.6 4.1.4 3.3 3.3 4.6 7 7.7.6.4.4.7.4 1.2.2 5.2 3.3 8.4 7.6 10.7 1.5 2.6 4.2 4.9 6 4.9 1.7 2.1 4.3 2.1 6.3 3.1.5 3.3 1.6 2.8 2.1 3.8 1.2 2.3 4.3 3.3 6.6 4.7.3 2.8 3.3 2.2 4.6 3.8 2.5 1.3 4.6 3.3 7.7 2.5h.4c1.6 2.1 3.9 2.1 6.5 1.1v.5c.7 1.3 2 1.7 3.3 1.7 1 1.6 2.5 2 4.3 1.5 19.2-.9 37.8-22.7 36.6-40 .7-2.4-1.6-4-2-6l-1.6-2.3-1 .1-4.8-3.3c0-1.1 0-2.3-.6-3.2-1.5-1.5-1.2-4.3-3.5-5-.1-1.6-2-2.6-3.4-3.3-.3-1.4-1.5-2.8-.7-4.2l-.1-1.3c-2.3-2-4.6-6.6-5.5-7.1-1-1-2.4-1.8-.6-3 1.6-1.1-5.6-8.7-8.6-11 1.9-.1-.6-3.8-.6-5.2l-.7-1.7-1.8-1.6c-.8-1-.6-2.6-2.1-3.1l-1-1.5-.6-.8c-.5-1.5-.2-3.3-2-4.1-1.3-1.4 0-2.7 0-3.8-3.1-2.2-1.2-6.1-3.3-8.6l-.3-.8c-1.7-1.6-2-4.1-2.5-6.2l-.8-3c-.3-1.1-.2-2.3-.3-3.3 0-1.3-.4-2.6 0-3.8.3-1.3.3-2.4-.2-3.6v-.1c.3-.9.2-1.8 0-2.8l-1.7-5.6-1.3-6-1-.7c.4-5.3-3-10.6-3.6-15a9.4 9.4 0 00-2.8-5.6c-.6-7.2-10.8-34.5-15.6-34.5v-.5a8.2 8.2 0 00-.8-1.8c-3.3-5.6-7.5-10.5-10.2-16.4-.6-1.6-2.1-3.3-3.8-4.4a29 29 0 01-6.9-7.6c-10.3-13.5-12.6-8.9-15-13.5-3.4-4-11-8.2-12.6-8.5-3.7-.7-3-2.8-4.4-3.5-2.6-1.1-5-2.4-7.9-2.8-4.9-2-10.3-.6-15-2.4-5.3-.3-11-1.7-15.5-1.7z" fill="#863b3b"/><path d="M494 699.5l-.9.1c-1.1 2.2-3.4-.5-5 1.7 3.2 2 8 4 2.2 8.5 0 1.3-.5 1.7-1.6.7-1-.9-1.7-2.5-3.5-2.2l.7 2.7c0 .8-.5.3-.8.3-3.7 0-3.3 2.8-3.8 5 0 0-.3 0-.5-.2-4 2.2-4 2.2-2.6 4.4 1.3 2.4-.5 4-1.2 6l.2.9c-1.8.3-3.3.6-1.7 3.1 1.3 2.3-1.1 1-1.6 1.6v.5c-1.3.7-2.5-2-4-.5-.6 1-.3 1.9 0 2.8l-1 .4a5 5 0 002.9 3l2 1.2c.7 3.8-1.6 2.2-3.2 1.8l-2.1-1.3c-2.2 1-2.8 4.6-5.6 3.6-2.3-.6-3.1.7-4.3 1.9l-2 .6c1 1.7 2.7 2.1 4.5 1.7.3 3.9 4 1.4 5.6 3.2 1 .5 1.8.7 2.4.4.4.6 1.2.8 1.8 1 1.2 0 2.3-1.2 3.3-.9 0 1.2.7 2 1.7 2.8.8 1.2 4.4 2.7 5.5 1.3 1.7.5 3.2-.1 4.2-1.6.4 2.8 3.6 2.8 3.7 1.6 1 .7 2.2.5 3.3.4 1-.2 1.7-.7 2.2-1.5.4.8 1.6 0 1.8-.3 1 1.3 2.1 1.1 3 1.3l.6-.2.8.8c2.1.9 4.1 0 6-.6v.1c1.7 2.7 9.4.4 11.4-1 1-.8 2-1.8 2.1-3l1.2-.2c.7.6 1.6 1 2.3 1 4.1 0 6 .6 7.4-2.2 1.1-.3 1-.8.5-1.5.5-.1.8-.6 1-1.1 0-.7-.5-1.3-.2-2.1 1.2 0 2.3-.4 1.3-2.2-.6-1.6-3.3-2-4.4-3.3-1.8-1.6-2.2-4.6-3.8-6.4-1.3-1.3-3.3-1-4.6-2.1-1.8-1.5-2.1-7.2-5.3-6.6l-.3.2c0-1 0-2.2-.5-3.3-1.1-.3-2-.2-2.6.8-1-.1-3 1.5-2.1-1.5 0-1-.4-1.6-.9-2.4l-1.3-1.7c-1.6-.8-1.6-2.6-2-4-2 .4-4 1-4.4-1.7 1.5-1.5-3-3.5-4-3.5.6-2.4-1.7-4-2-6l-1.7-2.3z" fill="#eaeaea"/></g> + <g id="Cow_Tail" style="display:none"><path d="M421.12 602.38l.5 1.96c.47 3.84 4.3 13.82-4.74 15.06.55-2.29 2.45-6 2.21-7.57 0 0-.5 3.82-3.16 5.93-.72.57-1.16 2.13-.56 3.9-1.43-.52-2.62-3.79-1.53-5.34 1.03-1.46 2.62-3.16 2.3-4.99-.14 1.55-1.5 3.76-3.36 5.07-1.53 1.08-2.64 1.86-5.08 1.88 3.7-2.34 3.72-4.93 4.95-6.58a5.18 5.18 0 001.05-3.32l-1.46-4.45z" fill="#e7d0bf"/><path d="M412.19 561.3c-.88 17.5 3.89 38 3.89 38" fill="none" stroke="#ebebeb" stroke-width="5"/><path d="M321.75 480.5s89.19-57.34 90.44 80.8" fill="none" stroke="#704a2f" stroke-width="5" stroke-linecap="round"/><path d="M416.6 589.3l-4.88-.16c1.33 8.83-6.77 22.18-6.77 22.18s4.67-3.52 5.94-8.88c-.34 2.04-.79 5.73.16 7.44 1.33 2.41 2.9 4.37 2.9 4.37s-1.1-4.14-1.1-7c0-2.86 0 3.23 1.33 4.66-.78-4.74.16-4.51.16-4.51s1.17 1.43 1.01 4.29c1.1-3.84 0-5.42 0-5.42s2.36 2.4 2.2 5.72c.22-1.32.27-2.3.25-3.08.24.9.56 1.84 1 2.33 1.02 1.13.63 3.46.63 3.46s1.8-3.61.7-5.8c-1.1-2.18 0-3.8 0-3.8-.07 3.24 1.58 1.76 1.34 3.5-.2 1.4 1.13 1.58 1.88 2.94-.98-3.46 1.49-3.61-.04-6.81l-.5-1.06c.69.7 1.56 1.58 1.95 2.3.5.94 1.3 5.68 1.3 5.68s.1-1.47-.32-4.78c-.42-3.21-1.62-3.02-4.13-6.9.73-1.74.46-3.08-3.18-7.1-.93-1-1.84-3.57-1.84-3.57z" fill="#ebebeb"/></g> <g inkscape:groupmode="layer" id="Hair_Back_" @@ -3238,26 +3224,10 @@ id="path2074" sodipodi:nodetypes="cssssssssssssssssssssccccc" /> </g> - </g><g - inkscape:groupmode="layer" - id="Cat_Ear_Back" - inkscape:label="Cat_Ear_Back" - style="display:none"><g - style="display:inline" - id="g8" - transform="translate(0,-2.0000001)"><path - inkscape:connector-curvature="0" - style="display:inline;fill-opacity:1;fill:#ff80b2;stroke-width:1.09067011" - d="m 248.73736,68.964871 c 0,0 1.69861,-0.804687 4.08156,-0.299212 2.38295,0.505475 23.75731,3.393902 29.82301,5.415802 6.06569,2.021898 7.14885,3.466112 7.14885,3.466112 L 263.21726,106.7929 c -3.84107,-5.31888 -4.93514,-8.768348 -7.63681,-17.615026 -1.84138,-6.029593 -1.55793,-8.849384 -2.81153,-12.285769 -0.74632,-2.04581 -1.39753,-4.595174 -4.03156,-7.927234 z" - id="path2" /><path - inkscape:connector-curvature="0" - d="m 248.73736,68.964871 c 0,0 1.69861,-0.804687 4.08156,-0.299212 2.38295,0.505475 23.75731,3.393902 29.82301,5.415802 6.06569,2.021898 7.14885,3.466112 7.14885,3.466112 l -9.45442,10.405004 c -8.89399,-4.0001 -15.68619,-8.81104 -20.05716,-12.416027 -2.33857,-1.928752 -6.80539,-4.786815 -11.54184,-6.571679 z" - style="display:inline;fill-opacity:1;fill:#ffaacc;stroke-width:1.09067011" - id="path4" /><path - inkscape:connector-curvature="0" - style="fill-opacity:1;fill:#fefefe;stroke-width:1.09067011" - d="m 251.82217,72.78348 c 0,0 4.58923,1.460454 7.26102,0.648083 l 19.57572,12.076963 c 0,0 -14.32239,6.372867 -17.57187,14.965934 0,0 -0.28885,-1.805263 0.1083,-3.538319 l -0.93872,3.141169 c 0,0 -0.32495,-2.166325 0.18052,-3.82717 0,0 -1.08316,-0.758212 -2.45516,1.444213 0,0 0.32494,-3.646639 1.84136,-5.307486 -1.84137,0.180528 -4.44095,2.166322 -4.44095,2.166322 0,0 -0.14441,-7.040542 4.76591,-9.062442 -4.11601,0.216633 -6.93223,3.791062 -6.93223,3.791062 0,0 -0.36105,-6.82391 3.75496,-8.015386 -2.99675,0.938738 -4.29654,3.71885 -4.29654,3.71885 0,0 -0.54157,-3.827166 0.93874,-6.246224 -0.686,-0.216632 -1.73305,0.613791 -1.73305,0.613791 0,0 0.79431,-2.419059 3.32169,-3.285586 -2.5839,-0.566619 -3.3797,-3.283774 -3.3797,-3.283774 z" - id="path6" /></g></g> + </g> + <g id="Cat_Ear_Back" style="display:none"><path style="display:inline;fill-opacity:1;fill:#20202c;stroke-width:1.09067011" d="m 248.73736,68.964871 c 0,0 1.69861,-0.804687 4.08156,-0.299212 2.38295,0.505475 23.75731,3.393902 29.82301,5.415802 6.06569,2.021898 7.14885,3.466112 7.14885,3.466112 L 263.21726,106.7929 c -3.84107,-5.31888 -4.93514,-8.768348 -7.63681,-17.615026 -1.84138,-6.029593 -1.55793,-8.849384 -2.81153,-12.285769 -0.74632,-2.04581 -1.39753,-4.595174 -4.03156,-7.927234 z" id="path2"/><path d="m 248.73736,68.964871 c 0,0 1.69861,-0.804687 4.08156,-0.299212 2.38295,0.505475 23.75731,3.393902 29.82301,5.415802 6.06569,2.021898 7.14885,3.466112 7.14885,3.466112 l -9.45442,10.405004 c -8.89399,-4.0001 -15.68619,-8.81104 -20.05716,-12.416027 -2.33857,-1.928752 -6.80539,-4.786815 -11.54184,-6.571679 z" style="display:inline;fill-opacity:1;fill:#333344;stroke-width:1.09067011" id="path4"/><path style="fill-opacity:1;fill:#fefefe;stroke-width:1.09067011" d="m 251.82217,72.78348 c 0,0 4.58923,1.460454 7.26102,0.648083 l 19.57572,12.076963 c 0,0 -14.32239,6.372867 -17.57187,14.965934 0,0 -0.28885,-1.805263 0.1083,-3.538319 l -0.93872,3.141169 c 0,0 -0.32495,-2.166325 0.18052,-3.82717 0,0 -1.08316,-0.758212 -2.45516,1.444213 0,0 0.32494,-3.646639 1.84136,-5.307486 -1.84137,0.180528 -4.44095,2.166322 -4.44095,2.166322 0,0 -0.14441,-7.040542 4.76591,-9.062442 -4.11601,0.216633 -6.93223,3.791062 -6.93223,3.791062 0,0 -0.36105,-6.82391 3.75496,-8.015386 -2.99675,0.938738 -4.29654,3.71885 -4.29654,3.71885 0,0 -0.54157,-3.827166 0.93874,-6.246224 -0.686,-0.216632 -1.73305,0.613791 -1.73305,0.613791 0,0 0.79431,-2.419059 3.32169,-3.285586 -2.5839,-0.566619 -3.3797,-3.283774 -3.3797,-3.283774 z" id="path6"/></g> + <g id="Fox_Ear_Back" style="display:none"><path d="M260 53c-.7 0-1.3.4-1.4 1.8 0 .3.2.6.5.9l-.1 3.6c.3.7-.3 2 1.3 1.8 2.5 1 .4 3.8 1.9 5.2l-.6 3.7c1.5.7 1.2 2.2 1.7 3.4-.7.2-.7 1-1 1.6l1.2 1.3c1 1.2 1.1 2.9 2.6 3.8.5.5.6 1.2.7 2l-.1.5V84c-1 1.1-1 2.5-1.2 3.8 1.6-.3 1.9 1 2.4 2 0 1.3-2 1-1.9 2.4v.6l-.2.2c0 .1 0 .2.3.3h.6l1.3-.8v.5l1.2-.9.6.7 1.8-1.7V92l2-1.3c.4-.4 1-.8.8-1.5 1.2 0 2.1-.8 3-1.5.3-.6 1-1 .6-1.8.5-.1.9-.5 1.2-.8l.8-.8.3-.1.1-.1c.3-.2.7-.2 1-.3 1-.3 2-.6 2.5-1.6v-.6c.5-.2 1-.5 1.1-1.1.6-.1 1-.6 1.3-1l.8-.5h.6c.5 0 .8-.3 1-.7.3-.6.3-1.2.2-1.8l-.6-1.2-.8-1.3c-.4-.7-.7-1.4-1.3-2-.4-.3-.8-.7-1.4-.7l-1.2-.8-2.4-2.5-1.2-.6c-.8-.3-1-1.6-2.2-1.3-.3-1.4-1.6-2-2.3-3.1l-1.3-.1-.6-.6c0-1.3-1.4-1.6-2-2.5-.4 0-.8-.7-1.3-.2-.3-1.5-1.9-1.8-2.6-2.9-1.7-.3-2.7-2-4.2-2.6-1-.9-1-.8-1.3-.7h-.6c-.5-.3-1-.5-1.5-.5z" fill="#863b3b"/></g> + <g id="Cow_Ear_Back" style="display:none"><path d="M268.97 88.19c3.57 1.86 2.25 4.2 10.8 1.75l-3.88 16.12c-11.15-.78-4.86 6.7-19.13 5.86-14.26-.84-19.85-9.81-21.72-17.47 7.4-9.24 23.72-11.42 33.93-6.26z" fill="#87553a"/><path d="M255.22 99.84l3.57-.18s-.23 4.14 2.5 4.53l.55 7.45-8.2.53-.3-7.17s2.4.3 1.88-5.16z" fill="#f1ab2b"/></g> </g> <g inkscape:groupmode="layer" @@ -16889,26 +16859,10 @@ inkscape:connector-curvature="0" style="fill:#3f403f" /> </g> - </g><g - inkscape:groupmode="layer" - id="Cat_Ear_Fore" - inkscape:label="Cat_Ear_Fore" - style="display:none"><g - style="display:inline" - transform="translate(7.2500004,-0.49999703)" - id="g8-9"><path - inkscape:connector-curvature="0" - style="display:inline;fill:#ff80b2;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 308.1475,77.54163 c 0,0 12.76065,-8.72344 26.22373,-9.571872 11.01415,-0.694103 19.3005,-2.094451 19.3005,-2.094451 -1.1752,8.016637 -7.95821,31.134787 -22.41696,46.848853 0,0 1.03532,-26.317653 -23.10727,-35.18253 z" - id="path2-5" /><path - inkscape:connector-curvature="0" - d="m 353.67173,65.875307 c -1.1752,8.016637 -7.95821,31.134787 -22.41696,46.848853 0,0 0.0174,-0.44206 -0.005,-1.23089 -0.1085,-3.84062 -1.15748,-15.901417 -9.73296,-25.185131 7.53822,-11.504443 19.52704,-16.919867 32.15481,-20.432832 z" - style="display:inline;fill:#ffaacc;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - id="path4-7" /><path - inkscape:connector-curvature="0" - style="display:inline;fill:#fefefe;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 329.49165,100.71363 c -1.35994,-4.601307 -3.757,-9.839308 -7.97484,-14.405491 4.85489,-7.409284 11.55582,-12.292945 19.08455,-15.769361 0,0 5.17674,-0.18227 8.51755,1.867294 -0.16223,0.07853 -2.7722,0.606429 -4.0879,1.030675 2.49749,0.129635 3.54594,1.366431 3.54594,1.366431 0,0 -0.91465,0.05439 -2.3119,0.89546 2.85074,0.89458 4.63218,5.458641 4.63218,5.458641 0,0 -2.19492,-0.350727 -4.86496,0.149253 2.06512,0.935863 3.25191,4.890565 3.25191,4.890565 0,0 -2.18348,-0.526951 -6.00364,-0.793573 4.30345,1.520613 4.48699,6.023984 4.48699,6.023984 0,0 -3.83009,-2.647995 -4.31294,-3.165587 1.78858,2.77439 1.68141,5.83086 1.68141,5.83086 0,0 -1.28005,-1.529562 -3.01908,-2.13864 0.54376,1.109778 0.54477,3.262668 0.54477,3.262668 0,0 -2.12647,-1.184307 -2.69251,-1.999674 0.45817,3.293475 -0.44441,8.565455 -0.44441,8.565455 0,0 -2.3265,-3.196931 -3.16399,-5.032441 0.25185,3.018194 -0.90576,5.929071 -0.90576,5.929071 0,0 -0.0958,-4.496089 -0.9266,-5.750878 0.28951,3.866948 -0.68272,5.889828 -1.896,8.463388 0,0 -1.77802,-2.46182 -3.14077,-4.6781 z" - id="path6-3" /></g></g> + </g> + <g id="Cat_Ear_Fore" style="display:none"><g style="display:inline" transform="translate(0,3e-6)" id="g8-9"><path style="display:inline;fill-opacity:1;fill:#20202c;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-width:1px;stroke:none" d="m 308.1475,77.54163 c 0,0 12.76065,-8.72344 26.22373,-9.571872 11.01415,-0.694103 19.3005,-2.094451 19.3005,-2.094451 -1.1752,8.016637 -7.95821,31.134787 -22.41696,46.848853 0,0 1.03532,-26.317653 -23.10727,-35.18253 z" id="path2-5"/><path d="m 353.67173,65.875307 c -1.1752,8.016637 -7.95821,31.134787 -22.41696,46.848853 0,0 0.0174,-0.44206 -0.005,-1.23089 -0.1085,-3.84062 -1.15748,-15.901417 -9.73296,-25.185131 7.53822,-11.504443 19.52704,-16.919867 32.15481,-20.432832 z" style="display:inline;fill-opacity:1;fill:#333344;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-width:1px;stroke:none" id="path4-7"/><path style="display:inline;fill-opacity:1;fill:#fefefe;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-width:1px;stroke:none" d="m 329.49165,100.71363 c -1.35994,-4.601307 -3.757,-9.839308 -7.97484,-14.405491 4.85489,-7.409284 11.55582,-12.292945 19.08455,-15.769361 0,0 5.17674,-0.18227 8.51755,1.867294 -0.16223,0.07853 -2.7722,0.606429 -4.0879,1.030675 2.49749,0.129635 3.54594,1.366431 3.54594,1.366431 0,0 -0.91465,0.05439 -2.3119,0.89546 2.85074,0.89458 4.63218,5.458641 4.63218,5.458641 0,0 -2.19492,-0.350727 -4.86496,0.149253 2.06512,0.935863 3.25191,4.890565 3.25191,4.890565 0,0 -2.18348,-0.526951 -6.00364,-0.793573 4.30345,1.520613 4.48699,6.023984 4.48699,6.023984 0,0 -3.83009,-2.647995 -4.31294,-3.165587 1.78858,2.77439 1.68141,5.83086 1.68141,5.83086 0,0 -1.28005,-1.529562 -3.01908,-2.13864 0.54376,1.109778 0.54477,3.262668 0.54477,3.262668 0,0 -2.12647,-1.184307 -2.69251,-1.999674 0.45817,3.293475 -0.44441,8.565455 -0.44441,8.565455 0,0 -2.3265,-3.196931 -3.16399,-5.032441 0.25185,3.018194 -0.90576,5.929071 -0.90576,5.929071 0,0 -0.0958,-4.496089 -0.9266,-5.750878 0.28951,3.866948 -0.68272,5.889828 -1.896,8.463388 0,0 -1.77802,-2.46182 -3.14077,-4.6781 z" id="path6-3"/></g></g> + <g id="Fox_Ear_Fore" style="display:none"><path d="M340 52.9c-.2 0-.5.3-.7.5-.5 0-1 0-1.3.6 0 0-.7 0-1 .3-.4.2-.8 1.2-.8 1.2-2 1.2-2.2 1.9-2 2.4-1.2 0-1.8 1-2.5 1.8-1-.1-1.9 1.8-2.5 2.6-.6-.5-4.5 1.6-3.3 2.8l-.5.4c-.5 0-1.2-.6-1.2-.6-.8.6-.9 1.3-.6 2.1 0 .3.2.5.4.7-1 1.2-2.8 1.6-3.1 3.4l-.7.7c-.6.7-1.7.9-2.4 1.6-.4.5-.4 1-.3 1.7-.4 2.3-.2 2.7 1.8 2.4l-.2.6v.1c-.4.6-.3 1.2 0 1.8.7 1.3 1.5 2.4 3.2 2.1h.2l.1.1.1.1c-1.2 1-1.1 2-.4 3 .8 1.2 1.1 2.4 1.4 3.7 1.2 1.5 2.2 3.1 4 4 3.2 2.1 3.5 9.1 12 10.2-.3-.8-1-1.4-.9-2l.7.6c.8.2 1.4 0 2-.5l.8-.4c.5-.3.6-.9.8-1.3l.7-.7v-1.2h.6c-.5-1-.3-3.3-.7-4.4 1.5-.5 1.2-2.6 2.6-3.1.9-.6.5-3.4.5-5.1l-.2-6v-.9s.1.4.4.5l.4-4.4c1.2-2.8 1.3-5.7 1.3-8.7 0-.7-.2-1.2-.2-1.2l-.2 1-.2-5.4-.5-.3c0-2.4-.8-5-2.6-6.2 0 0 .1-.3-.7-.7-.7-.3-4 0-4.3 0z" fill="#863b3b"/><path d="M340.4 68.9c-1.2-.2-2.1 1.3-3.4.6l-.3-.2-3 1.9-.7 2.5c.7 1.3.3 2-1.2 2v1.1c.6.5.6 1.2.5 2-1 1-.6 2.3-.7 3.4-.2 2-1 3.5-3 4.1 1.5 2.4 4.6 3.5 5.7 6.4l.7 1.8c1.3-1.5 1.9-3 1.1-5.1-.6-1.6.1-3 1.8-3.9.6 0 1.3-.3 1.7 0l.2-1.6c-1.1 0-1.2-.9-1.1-2-.4-.7-.4-1.3.6-1.3.5.3.8.8 1.2 1l.6-.3h-.2c-1-1.3-.8-2.8-.5-4 .6-2.8.5-5.6 0-8.4z"/></g> + <g id="Cow_Ear_Fore" style="display:none"><path d="M341.29 87.85c-4.02 2.48-4.66 5.24-10.49.95 3.7 6.63 5.61 18.01 4.8 23.83 10.25-5.13 5.33 4.15 21.96 1.98 16.62-2.18 22.4-13.14 23.95-22.26-9.43-10.2-28.7-11.38-40.22-4.5z" fill="#87553a"/><path d="M354.75 101.34l3.78.9s-1.5 4.25 1.23 5.48l-1.68 7.94-8.71-1.94 1.85-7.57s2.42 1.06 3.53-4.8z" fill="#f1ab2b"/></g> </g> <g inkscape:groupmode="layer" diff --git a/devTools/types/SugarCubeExtensions.d.ts b/devTools/types/SugarCubeExtensions.d.ts index 52eaed4fd5f7094d7ace8765ef0f122992e8e563..e8709b836aec7898ad34082c2a5df7c74d817d19 100644 --- a/devTools/types/SugarCubeExtensions.d.ts +++ b/devTools/types/SugarCubeExtensions.d.ts @@ -26,9 +26,6 @@ declare module "twine-sugarcube" { filterRegions: string[]; heightBoostingShoes: string[]; highHeels: string[]; - humiliatingClothes: string[]; - modestClothes: string[]; - sluttyClothes: string[]; pregData: Record<string, FC.PregnancyData>; diff --git a/js/003-data/miscData.js b/js/003-data/miscData.js index a0a906213fdd4bb2278d7f912445f137d778ccbd..a79da32e166af927ed42553ce4657dad7e8fb6fd 100644 --- a/js/003-data/miscData.js +++ b/js/003-data/miscData.js @@ -261,9 +261,6 @@ App.Data.misc = { filterRaces: ["Amerindian", "Asian", "Black", "Indo-Aryan", "Latina", "Malay", "Middle Eastern", "Mixed Race", "Pacific Islander", "Semitic", "Southern European", "White"], filterRacesLowercase: ["amerindian", "asian", "black", "indo-aryan", "latina", "malay", "middle eastern", "mixed race", "pacific islander", "semitic", "southern european", "white"], filterRegions: ["Africa", "Asia", "Australia", "Europe", "Middle East", "North America", "South America"], - naturalSkins: ["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"], - dyedSkins: ["camouflage patterned", "dyed blue", "dyed gray", "dyed green", "dyed pink", "dyed red", "tiger striped"], - naturalNippleColors: ["black", "brown", "dark brown", "ebony", "ivory", "light brown", "pale pink", "pink"], /* START Custom Nationalities region filter */ /* Not currently weighted, but will accept weights */ @@ -1554,13 +1551,6 @@ App.Data.misc = { fakeBellies: ["a huge empathy belly", "a large empathy belly", "a medium empathy belly", "a small empathy belly"], /* lets fake bellies be separated from other .bellyAccessory */ - modestClothes: ["a ball gown", "a biyelgee costume", "a bunny outfit", "a burkini", "a burqa", "a comfortable bodysuit", "a cybersuit", "a dirndl", "a gothic lolita dress", "a halter top dress", "a hanbok", "a hijab and abaya", "a hijab and blouse", "a huipil", "a kimono", "a klan robe", "a latex catsuit", "a leotard", "a long qipao", "a maternity dress", "a military uniform", "a mini dress", "a mounty outfit", "a nice maid outfit", "a nice nurse outfit", "a niqab and abaya", "a one-piece swimsuit", "a penitent nuns habit", "a police uniform", "a red army uniform", "a schoolgirl outfit", "a schutzstaffel uniform", "a slave gown", "a slutty maid outfit", "a slutty nurse outfit", "a slutty qipao", "a sweater and cutoffs", "a t-shirt and jeans", "a toga", "an oversized t-shirt and boyshorts", "battlearmor", "battledress", "conservative clothing", "cutoffs and a t-shirt", "leather pants and a tube top", "lederhosen", "nice business attire", "restrictive latex", "slutty business attire", "spats and a tank top", "sport shorts and a sports bra", "sport shorts and a t-shirt", "stretch pants and a crop-top", "Imperial Plate"], - - sluttyClothes: ["a bimbo outfit", "a chattel habit", "a cheerleader outfit", "a fallen nuns habit", "a schoolgirl outfit", "a skimpy loincloth", "a slutty klan robe", "a slutty maid outfit", "a slutty nurse outfit", "a slutty outfit", "a slutty pony outfit", "a slutty qipao", "a slutty schutzstaffel uniform", "a string bikini", "a succubus outfit", "a t-shirt and panties", "a t-shirt and thong", "a tank-top and panties", "a tube top and thong", "attractive lingerie", "attractive lingerie for a pregnant woman", "clubslut netting", "kitty lingerie", "leather pants and a tube top", "leather pants and pasties", "panties and pasties", "pasties", "slutty business attire", "slutty jewelry", "sport shorts and a sports bra", "striped underwear", "a tight Imperial bodysuit"], - - /* stuff that reveals genitals */ - humiliatingClothes: ["a bra", "a button-up shirt", "a chattel habit", "a fallen nuns habit", "a skimpy loincloth", "a sports bra", "a string bikini", "a striped bra", "a succubus outfit", "a sweater", "a t-shirt", "a tank-top", "a thong", "a tube top", "clubslut netting", "pasties", "restrictive latex", "shibari ropes", "slutty jewelry", "uncomfortable straps", "Western clothing"], - highHeels: ["boots", "extreme heels", "extreme platform heels", "heels", "platform heels"], heightBoostingShoes: ["extreme heels", "extreme platform heels", "heels", "platform heels", "platform shoes", "pumps"], diff --git a/js/003-data/slaveMods.js b/js/003-data/slaveMods.js index 4f5deee28451931127bc72def9764c48bea0f140..70e41dc98207ee1a087d7d818a4444a53e2896be 100644 --- a/js/003-data/slaveMods.js +++ b/js/003-data/slaveMods.js @@ -392,16 +392,6 @@ App.Medicine.Modification.hairStyles = { title: "Very long", hLength: 100 }, - { - title: "Apply hair growth stimulating treatment", - hLength: 0, - requirements: slave => !slave.bald - }, - { - title: "Apply extensions", - onApplication: function(slave) { slave.hLength += 10; }, - requirements: slave => !slave.bald && slave.hLength < 150 - }, ] }; @@ -438,3 +428,12 @@ App.Medicine.Modification.eyeShape = [ {value: "vacant"}, {value: "wide-eyed"} ]; + +App.Medicine.Modification.naturalSkins = ["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"]; +App.Medicine.Modification.dyedSkins = ["camouflage patterned", "dyed blue", "dyed gray", "dyed green", "dyed pink", "dyed red", "tiger striped"]; +App.Medicine.Modification.naturalNippleColors = ["black", "brown", "dark brown", "ebony", "ivory", "light brown", "pale pink", "pink"]; +App.Medicine.Modification.eyebrowStyles = new Set(["shaved", "straight", "rounded", "natural", "slanted inwards", "slanted outwards", "high-arched", "elongated", "shortened", "curved"]); +App.Medicine.Modification.eyebrowFullness = new Set(["pencil-thin", "thin", "threaded", "natural", "tapered", "thick", "bushy"]); +App.Medicine.Modification.pubicStyles = new Set(["waxed", "in a strip", "neat", "bushy", "bushy in the front and neat in the rear", "very bushy"]); +App.Medicine.Modification.armpitStyles = new Set(["waxed", "shaved", "neat", "bushy"]); +App.Medicine.Modification.hornColor = new Set(["golden", "copper", "red", "deep red", "green", "pink", "dark brown", "brown", "burgundy", "jet black", "black", "grey", "silver", "white", "blue-violet", "purple", "dark orchid", "sea green", "green-yellow", "dark blue", "blazing red", "neon green", "neon blue", "neon pink"]); diff --git a/js/003-data/slaveWearData.js b/js/003-data/slaveWearData.js index 0d1d044b570a3ec5e7b02945f9d3a87ac51e7c1f..6065c8ee0de396a9999afdb4a8c0210d4a27f0fc 100644 --- a/js/003-data/slaveWearData.js +++ b/js/003-data/slaveWearData.js @@ -1,633 +1,1285 @@ /** - * @typedef {object} slaveWear + * @typedef {object} clothes * @property {string} name - * @property {string} value - * @property {string} [fs] + * @property {FC.FutureSociety} [fs] Automatically unlocked with this FS. * @property {boolean} [requirements] + * @property {0|1|2|3|4} [exposure] 0: Modest, 1: Acceptable, 2: Slutty, 3: Humiliating (exposes genitals), 4: Might as well be nude + * @property {boolean} [harsh] + * @property {boolean} [topless] */ /** - * @typedef {Array<slaveWear>|Array<slaveWearChastity>} slaveWearCategory + * @type {Map.<string, clothes>} The string here will be what is applied to the relevant slave property. Slave.clothes = "a bunny outfit", not "Bunny outfit". */ - -/** @type {Object.<string, slaveWearCategory>} */ -App.Data.slaveWear = { - - niceClothes: [ +App.Data.clothes = new Map([ + ["attractive lingerie for a pregnant woman", { name: "Maternity lingerie", - value: "attractive lingerie for a pregnant woman", fs: "FSRepopulationFocus", - get requirements() { return V.boughtItem.clothing.maternityLingerie === 1; } - }, + get requirements() { return V.boughtItem.clothing.maternityLingerie === 1; }, + exposure: 2 + } + ], + ["a bunny outfit", { name: "Bunny outfit", - value: "a bunny outfit", fs: "FSGenderFundamentalist", - get requirements() { return V.boughtItem.clothing.bunny === 1; } - }, + get requirements() { return V.boughtItem.clothing.bunny === 1; }, + exposure: 1 + } + ], + ["body oil", { name: "Body oil", - value: "body oil", fs: "FSPhysicalIdealist", - get requirements() { return V.boughtItem.clothing.oil === 1; } - }, + get requirements() { return V.boughtItem.clothing.oil === 1; }, + exposure: 4 + } + ], + ["a chattel habit", { name: "Chattel habit", - value: "a chattel habit", fs: "FSChattelReligionist", - get requirements() { return V.boughtItem.clothing.habit === 1; } - }, + get requirements() { return V.boughtItem.clothing.habit === 1; }, + exposure: 3 + } + ], + ["conservative clothing", { name: "Conservative clothing", - value: "conservative clothing", fs: "FSPaternalist", - get requirements() { return V.boughtItem.clothing.conservative === 1; } - }, + get requirements() { return V.boughtItem.clothing.conservative === 1; }, + exposure: 0 + } + ], + ["harem gauze", { name: "Harem gauze", - value: "harem gauze", fs: "FSArabianRevivalist", - get requirements() { return V.boughtItem.clothing.harem === 1; } - }, + get requirements() { return V.boughtItem.clothing.harem === 1; }, + exposure: 1 + } + ], + ["a huipil", { name: "Huipil", - value: "a huipil", fs: "FSAztecRevivalist", - get requirements() { return V.boughtItem.clothing.huipil === 1; } - }, + get requirements() { return V.boughtItem.clothing.huipil === 1; }, + exposure: 0 + } + ], + ["a kimono", { name: "Kimono", - value: "a kimono", fs: "FSEdoRevivalist", - get requirements() { return (V.boughtItem.clothing.kimono === 1 || V.continent === "Japan"); } - }, + get requirements() { return (V.boughtItem.clothing.kimono === 1 || V.continent === "Japan"); }, + exposure: 0 + } + ], + ["a maternity dress", { name: "Maternity dress", - value: "a maternity dress", fs: "FSRepopulationFocus", - get requirements() { return V.boughtItem.clothing.maternityDress === 1; } - }, + get requirements() { return V.boughtItem.clothing.maternityDress === 1; }, + exposure: 0, + } + ], + ["a slutty qipao", { name: "Qipao (slutty)", - value: "a slutty qipao", fs: "FSChineseRevivalist", - get requirements() { return V.boughtItem.clothing.qipao === 1; } - }, + get requirements() { return V.boughtItem.clothing.qipao === 1; }, + exposure: 2 + } + ], + ["a long qipao", { name: "Qipao (long)", - value: "a long qipao", fs: "FSChineseRevivalist", - get requirements() { return V.boughtItem.clothing.cultural === 1; } - }, + get requirements() { return V.boughtItem.clothing.cultural === 1; }, + exposure: 0 + } + ], + ["Imperial Plate", { name: "Imperial Plate", - value: "Imperial Plate", fs: "FSNeoImperialist", - get requirements() { return V.boughtItem.clothing.imperialarmor === 1; } - }, + get requirements() { return V.boughtItem.clothing.imperialarmor === 1; }, + exposure: 0 + } + ], + ["a tight Imperial bodysuit", { name: "Imperial Bodysuit", - value: "a tight Imperial bodysuit", fs: "FSNeoImperialist", - get requirements() { return V.boughtItem.clothing.imperialsuit === 1; } - }, + get requirements() { return V.boughtItem.clothing.imperialsuit === 1; }, + exposure: 2 + } + ], + ["stretch pants and a crop-top", { name: "Stretch pants and a crop-top", - value: "stretch pants and a crop-top", fs: "FSHedonisticDecadence", - get requirements() { return V.boughtItem.clothing.lazyClothes === 1; } - }, + get requirements() { return V.boughtItem.clothing.lazyClothes === 1; }, + exposure: 0 + } + ], + ["a toga", { name: "Toga", - value: "a toga", fs: "FSRomanRevivalist", - get requirements() { return V.boughtItem.clothing.toga === 1; } - }, + get requirements() { return V.boughtItem.clothing.toga === 1; }, + exposure: 1 + } + ], + ["Western clothing", { name: "Western clothing", - value: "Western clothing", fs: "FSPastoralist", - get requirements() { return V.boughtItem.clothing.western === 1; } - }, + get requirements() { return V.boughtItem.clothing.western === 1; }, + exposure: 3 + } + ], + ["a courtesan dress", { name: "Courtesan dress", - value: "a courtesan dress", fs: "FSSlaveProfessionalism", - get requirements() { return V.boughtItem.clothing.courtesan === 1; } - }, + get requirements() { return V.boughtItem.clothing.courtesan === 1; }, + exposure: 1 + } + ], + ["a bimbo outfit", { name: "Bimbo outfit", - value: "a bimbo outfit", fs: "FSIntellectualDependency", - get requirements() { return V.boughtItem.clothing.bimbo === 1; } - }, + get requirements() { return V.boughtItem.clothing.bimbo === 1; }, + exposure: 2 + } + ], + ["petite admi outfit", { name: "Petite admi outfit", - value: "petite admi outfit", fs: "FSPetiteAdmiration", - get requirements() { return V.boughtItem.clothing.petite === 1; } - }, - {name: "Battlearmor", value: "battlearmor", get requirements() { return V.boughtItem.clothing.military === 1; }}, - {name: "Military uniform", value: "a military uniform", get requirements() { return V.boughtItem.clothing.military === 1; }}, - {name: "Red Army uniform", value: "a red army uniform", get requirements() { return V.boughtItem.clothing.military === 1; }}, - {name: "Battledress", value: "battledress", get requirements() { return V.boughtItem.clothing.military === 1; }}, - {name: "Biyelgee costume", value: "a biyelgee costume", get requirements() { return V.boughtItem.clothing.cultural === 1; }}, - {name: "Dirndl", value: "a dirndl", get requirements() { return V.boughtItem.clothing.cultural === 1; }}, - {name: "Lederhosen", value: "lederhosen", get requirements() { return V.boughtItem.clothing.cultural === 1; }}, - {name: "Mounty outfit", value: "a mounty outfit", get requirements() { return V.boughtItem.clothing.cultural === 1; }}, - {name: "Hanbok", value: "a hanbok", get requirements() { return V.boughtItem.clothing.cultural === 1; }}, + get requirements() { return V.boughtItem.clothing.petite === 1; }, + exposure: 0 + } + ], + ["battlearmor", + { + name: "Battlearmor", + get requirements() { return V.boughtItem.clothing.military === 1; }, + exposure: 0 + } + ], + ["a military uniform", + { + name: "Military uniform", + get requirements() { return V.boughtItem.clothing.military === 1; }, + exposure: 0 + } + ], + ["a red army uniform", + { + name: "Red Army uniform", + get requirements() { return V.boughtItem.clothing.military === 1; }, + exposure: 0 + } + ], + ["battledress", + { + name: "Battledress", + get requirements() { return V.boughtItem.clothing.military === 1; }, + exposure: 0 + } + ], + ["a biyelgee costume", + { + name: "Biyelgee costume", + get requirements() { return V.boughtItem.clothing.cultural === 1; }, + exposure: 0 + } + ], + ["a dirndl", + { + name: "Dirndl", + get requirements() { return V.boughtItem.clothing.cultural === 1; }, + exposure: 0 + } + ], + ["lederhosen", + { + name: "Lederhosen", + get requirements() { return V.boughtItem.clothing.cultural === 1; }, + exposure: 0 + } + ], + ["a mounty outfit", + { + name: "Mounty outfit", + get requirements() { return V.boughtItem.clothing.cultural === 1; }, + exposure: 0 + } + ], + ["a hanbok", + { + name: "Hanbok", + get requirements() { return V.boughtItem.clothing.cultural === 1; }, + exposure: 0 + } + ], + ["a burqa", { name: "Burqa", - value: "a burqa", - get requirements() { return V.boughtItem.clothing.middleEastern === 1 || V.continent === "the Middle East"; } - }, + get requirements() { return V.boughtItem.clothing.middleEastern === 1 || V.continent === "the Middle East"; }, + exposure: 0 + } + ], + ["a niqab and abaya", { name: "Niqab and abaya", - value: "a niqab and abaya", - get requirements() { return V.boughtItem.clothing.middleEastern === 1 || V.continent === "the Middle East"; } - }, + get requirements() { return V.boughtItem.clothing.middleEastern === 1 || V.continent === "the Middle East"; }, + exposure: 0 + } + ], + ["a hijab and blouse", { name: "Hijab and blouse", - value: "a hijab and blouse", - get requirements() { return (V.boughtItem.clothing.conservative === 1 || V.continent === "the Middle East"); } - }, + get requirements() { return (V.boughtItem.clothing.conservative === 1 || V.continent === "the Middle East"); }, + exposure: 0 + } + ], + ["a burkini", { name: "Burkini", - value: "a burkini", - get requirements() { return V.boughtItem.clothing.swimwear === 1 && (V.boughtItem.clothing.swimwear === 1 || V.continent === "the Middle East"); } - }, - {name: "Santa dress", value: "a Santa dress", get requirements() { return V.boughtItem.clothing.costume === 1; }}, - - {name: "Klan robe", value: "a klan robe", get requirements() { return V.boughtItem.clothing.pol === 1; }}, - {name: "Slutty klan robe", value: "a slutty klan robe", get requirements() { return V.boughtItem.clothing.pol === 1; }}, - {name: "Schutzstaffel uniform", value: "a schutzstaffel uniform", get requirements() { return V.boughtItem.clothing.pol === 1; }}, - {name: "Slutty schutzstaffel uniform", value: "a slutty schutzstaffel uniform", get requirements() { return V.boughtItem.clothing.pol === 1; }}, - - {name: "Nice business attire", value: "nice business attire", get requirements() { return V.boughtItem.clothing.career === 1; }}, - {name: "Nurse (nice)", value: "a nice nurse outfit", get requirements() { return V.boughtItem.clothing.career === 1; }}, - {name: "Police uniform", value: "a police uniform", get requirements() { return V.boughtItem.clothing.career === 1; }}, + get requirements() { return V.boughtItem.clothing.swimwear === 1 && (V.boughtItem.clothing.swimwear === 1 || V.continent === "the Middle East"); }, + exposure: 1 + } + ], + ["a Santa dress", + { + name: "Santa dress", + get requirements() { return V.boughtItem.clothing.costume === 1; }, + exposure: 2 + } + ], + ["a klan robe", + { + name: "Klan robe", + get requirements() { return V.boughtItem.clothing.pol === 1; }, + exposure: 0 + } + ], + ["a slutty klan robe", + { + name: "Slutty klan robe", + get requirements() { return V.boughtItem.clothing.pol === 1; }, + exposure: 2 + } + ], + ["a schutzstaffel uniform", + { + name: "Schutzstaffel uniform", + get requirements() { return V.boughtItem.clothing.pol === 1; }, + exposure: 0 + } + ], + ["a slutty schutzstaffel uniform", + { + name: "Slutty schutzstaffel uniform", + get requirements() { return V.boughtItem.clothing.pol === 1; }, + exposure: 2 + } + ], + ["nice business attire", + { + name: "Nice business attire", + get requirements() { return V.boughtItem.clothing.career === 1; }, + exposure: 0 + } + ], + ["a nice nurse outfit", + { + name: "Nurse (nice)", + get requirements() { return V.boughtItem.clothing.career === 1; }, + exposure: 0 + } + ], + ["a police uniform", + { + name: "Police uniform", + get requirements() { return V.boughtItem.clothing.career === 1; }, + exposure: 0 + } + ], + ["a nice maid outfit", { name: "Maid (nice)", - value: "a nice maid outfit", - get requirements() { return V.boughtItem.clothing.career === 1 || V.PC.career === "servant" || V.PC.career === "handmaiden" || V.PC.career === "child servant"; } - }, - - {name: "Ballgown", value: "a ball gown", get requirements() { return V.boughtItem.clothing.dresses === 1; }}, - {name: "Gothic lolita dress", value: "a gothic lolita dress", get requirements() { return V.boughtItem.clothing.dresses === 1; }}, - - {name: "Cybersuit", value: "a cybersuit", get requirements() { return V.boughtItem.clothing.bodysuits === 1; }}, - {name: "Latex catsuit", value: "a latex catsuit", get requirements() { return V.boughtItem.clothing.bodysuits === 1; }}, - - {name: "Button-up shirt and panties", value: "a button-up shirt and panties", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "Button-up shirt", value: "a button-up shirt", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "Cutoffs", value: "cutoffs", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "Jeans", value: "jeans", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "Leather pants and a tube top", value: "leather pants and a tube top", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "Leather pants", value: "leather pants", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "Oversized t-shirt", value: "an oversized t-shirt", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "Sweater and cutoffs", value: "a sweater and cutoffs", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "Sweater and panties", value: "a sweater and panties", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "Sweater", value: "a sweater", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "T-shirt and jeans", value: "a t-shirt and jeans", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "T-shirt and panties", value: "a t-shirt and panties", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "T-shirt", value: "a t-shirt", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "Tank-top and panties", value: "a tank-top and panties", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "Tank-top", value: "a tank-top", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - {name: "Tube top", value: "a tube top", get requirements() { return V.boughtItem.clothing.casual === 1; }}, - - {name: "Boyshorts", value: "boyshorts", get requirements() { return V.boughtItem.clothing.underwear === 1; }}, - {name: "Bra", value: "a bra", get requirements() { return V.boughtItem.clothing.underwear === 1; }}, - {name: "Kitty lingerie", value: "kitty lingerie", get requirements() { return V.boughtItem.clothing.underwear === 1; }}, - {name: "Panties and pasties", value: "panties and pasties", get requirements() { return V.boughtItem.clothing.underwear === 1; }}, - {name: "Skimpy loincloth", value: "a skimpy loincloth", get requirements() { return V.boughtItem.clothing.underwear === 1; }}, - {name: "Thong", value: "a thong", get requirements() { return V.boughtItem.clothing.underwear === 1; }}, - {name: "Pasties", value: "pasties", get requirements() { return V.boughtItem.clothing.underwear === 1; }}, - + get requirements() { return V.boughtItem.clothing.career === 1 || V.PC.career === "servant" || V.PC.career === "handmaiden" || V.PC.career === "child servant"; }, + exposure: 0 + } + ], + ["a ball gown", + { + name: "Ballgown", + get requirements() { return V.boughtItem.clothing.dresses === 1; }, + exposure: 0 + } + ], + ["a gothic lolita dress", + { + name: "Gothic lolita dress", + get requirements() { return V.boughtItem.clothing.dresses === 1; }, + exposure: 0 + } + ], + ["a cybersuit", + { + name: "Cybersuit", + get requirements() { return V.boughtItem.clothing.bodysuits === 1; }, + exposure: 0 + } + ], + ["a latex catsuit", + { + name: "Latex catsuit", + get requirements() { return V.boughtItem.clothing.bodysuits === 1; }, + exposure: 1 + } + ], + ["a button-up shirt and panties", + { + name: "Button-up shirt and panties", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 2 + } + ], + ["a button-up shirt", + { + name: "Button-up shirt", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 3 + } + ], + ["cutoffs", + { + name: "Cutoffs", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 2 + } + ], + ["jeans", + { + name: "Jeans", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 2, + topless: true + } + ], + ["leather pants and a tube top", + { + name: "Leather pants and a tube top", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 1 + } + ], + ["leather pants", + { + name: "Leather pants", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 2, + topless: true + } + ], + ["an oversized t-shirt", + { + name: "Oversized t-shirt", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 3 + } + ], + ["a sweater and cutoffs", + { + name: "Sweater and cutoffs", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 0 + } + ], + ["a sweater and panties", + { + name: "Sweater and panties", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 2 + } + ], + ["a sweater", + { + name: "Sweater", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 3 + } + ], + ["a t-shirt and jeans", + { + name: "T-shirt and jeans", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 0 + } + ], + ["a t-shirt and panties", + { + name: "T-shirt and panties", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 2 + } + ], + ["a t-shirt", + { + name: "T-shirt", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 3 + } + ], + ["a tank-top and panties", + { + name: "Tank-top and panties", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 2 + } + ], + ["a tank-top", + { + name: "Tank-top", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 3 + } + ], + ["a tube top", + { + name: "Tube top", + get requirements() { return V.boughtItem.clothing.casual === 1; }, + exposure: 3 + } + ], + ["boyshorts", + { + name: "Boyshorts", + get requirements() { return V.boughtItem.clothing.underwear === 1; }, + exposure: 2, + topless: true + } + ], + ["a bra", + { + name: "Bra", + get requirements() { return V.boughtItem.clothing.underwear === 1; }, + exposure: 3 + } + ], + ["kitty lingerie", + { + name: "Kitty lingerie", + get requirements() { return V.boughtItem.clothing.underwear === 1; }, + exposure: 2 + } + ], + ["panties and pasties", + { + name: "Panties and pasties", + get requirements() { return V.boughtItem.clothing.underwear === 1; }, + exposure: 2 + } + ], + ["a skimpy loincloth", + { + name: "Skimpy loincloth", + get requirements() { return V.boughtItem.clothing.underwear === 1; }, + exposure: 3 + } + ], + ["a thong", + { + name: "Thong", + get requirements() { return V.boughtItem.clothing.underwear === 1; }, + exposure: 3, + topless: true + } + ], + ["pasties", + { + name: "Pasties", + get requirements() { return V.boughtItem.clothing.underwear === 1; }, + exposure: 3 + } + ], + ["leather pants and pasties", { name: "Leather pants and pasties", - value: "leather pants and pasties", - get requirements() { return V.boughtItem.clothing.underwear === 1 && V.boughtItem.clothing.casual === 1; } - }, + get requirements() { return V.boughtItem.clothing.underwear === 1 && V.boughtItem.clothing.casual === 1; }, + exposure: 2, + } + ], + ["a t-shirt and thong", { name: "T-shirt and thong", - value: "a t-shirt and thong", - get requirements() { return V.boughtItem.clothing.underwear === 1 && V.boughtItem.clothing.casual === 1; } - }, + get requirements() { return V.boughtItem.clothing.underwear === 1 && V.boughtItem.clothing.casual === 1; }, + exposure: 3, + } + ], + ["a tube top and thong", { name: "Tube top and thong", - value: "a tube top and thong", - get requirements() { return V.boughtItem.clothing.underwear === 1 && V.boughtItem.clothing.casual === 1; } - }, + get requirements() { return V.boughtItem.clothing.underwear === 1 && V.boughtItem.clothing.casual === 1; }, + exposure: 3, + } + ], + ["an oversized t-shirt and boyshorts", { name: "Oversized t-shirt and boyshorts", - value: "an oversized t-shirt and boyshorts", - get requirements() { return V.boughtItem.clothing.underwear === 1 && V.boughtItem.clothing.casual === 1; } - }, - {name: "Sport shorts and a sports bra", value: "sport shorts and a sports bra", get requirements() { return V.boughtItem.clothing.sports === 1; }}, - {name: "Sport shorts", value: "sport shorts", get requirements() { return V.boughtItem.clothing.sports === 1; }}, - {name: "Sports bra", value: "a sports bra", get requirements() { return V.boughtItem.clothing.sports === 1; }}, + get requirements() { return V.boughtItem.clothing.underwear === 1 && V.boughtItem.clothing.casual === 1; }, + exposure: 0, + } + ], + ["sport shorts and a sports bra", + { + name: "Sport shorts and a sports bra", + get requirements() { return V.boughtItem.clothing.sports === 1; }, + exposure: 1, + } + ], + ["sport shorts", + { + name: "Sport shorts", + get requirements() { return V.boughtItem.clothing.sports === 1; }, + exposure: 2, + topless: true + } + ], + ["a sports bra", + { + name: "Sports bra", + get requirements() { return V.boughtItem.clothing.sports === 1; }, + exposure: 3 + } + ], + ["sport shorts and a t-shirt", { name: "Sport shorts and a t-shirt", - value: "sport shorts and a t-shirt", - get requirements() { return V.boughtItem.clothing.sports === 1 && V.boughtItem.clothing.casual === 1; } - }, - {name: "Pony outfit (nice)", value: "a nice pony outfit", get requirements() { return V.boughtItem.clothing.pony === 1; }}, - {name: "Pony outfit (slutty)", value: "a slutty pony outfit", get requirements() { return V.boughtItem.clothing.pony === 1; }}, - - {name: "Monokini", value: "a monokini", get requirements() { return V.boughtItem.clothing.swimwear === 1; }}, - {name: "One-piece swimsuit", value: "a one-piece swimsuit", get requirements() { return V.boughtItem.clothing.swimwear === 1; }}, - + get requirements() { return V.boughtItem.clothing.sports === 1 && V.boughtItem.clothing.casual === 1; }, + exposure: 0 + } + ], + ["a nice pony outfit", + { + name: "Pony outfit (nice)", + get requirements() { return V.boughtItem.clothing.pony === 1; }, + exposure: 1 + } + ], + ["a slutty pony outfit", + { + name: "Pony outfit (slutty)", + get requirements() { return V.boughtItem.clothing.pony === 1; }, + exposure: 2 + } + ], + ["a monokini", + { + name: "Monokini", + get requirements() { return V.boughtItem.clothing.swimwear === 1; }, + exposure: 3 + } + ], + ["a one-piece swimsuit", + { + name: "One-piece swimsuit", + get requirements() { return V.boughtItem.clothing.swimwear === 1; }, + exposure: 1 + } + ], + ["a striped bra", { name: "Striped bra", - value: "a striped bra", - get requirements() { return V.boughtItem.clothing.pantsu === 1 || V.continent === "Japan"; } - }, + get requirements() { return V.boughtItem.clothing.pantsu === 1 || V.continent === "Japan"; }, + exposure: 3 + } + ], + ["striped panties", { name: "Striped panties", - value: "striped panties", - get requirements() { return V.boughtItem.clothing.pantsu === 1 || V.continent === "Japan"; } - }, + get requirements() { return V.boughtItem.clothing.pantsu === 1 || V.continent === "Japan"; }, + exposure: 2, + topless: true + } + ], + ["striped underwear", { name: "Striped underwear", - value: "striped underwear", - get requirements() { return V.boughtItem.clothing.pantsu === 1 || V.continent === "Japan"; } - }, - - // "Normal" things: - {name: "Apron", value: "an apron"}, - {name: "Bangles", value: "slutty jewelry"}, - {name: "Clubslut netting", value: "clubslut netting"}, - {name: "Cutoffs and a t-shirt", value: "cutoffs and a t-shirt"}, - {name: "Bodysuit", value: "a comfortable bodysuit"}, - {name: "Cheerleader", value: "a cheerleader outfit"}, - {name: "Fallen nun", value: "a fallen nuns habit"}, - {name: "Hijab and abaya", value: "a hijab and abaya"}, - {name: "Leotard", value: "a leotard"}, - {name: "Maid (slutty)", value: "a slutty maid outfit"}, - {name: "Mini dress", value: "a mini dress"}, - {name: "Nice lingerie", value: "attractive lingerie"}, - {name: "Nurse (slutty)", value: "a slutty nurse outfit"}, - {name: "Overalls", value: "overalls"}, - {name: "Panties", value: "panties"}, - {name: "Scalemail bikini", value: "a scalemail bikini"}, - {name: "Schoolgirl", value: "a schoolgirl outfit"}, - {name: "Slutty outfit", value: "a slutty outfit"}, - {name: "Spats and a tank top", value: "spats and a tank top"}, - {name: "String bikini", value: "a string bikini"}, - {name: "Succubus costume", value: "a succubus outfit"}, - {name: "Suit (slutty)", value: "slutty business attire"}, - - // {name: "Let them choose", value: "choosing her own clothes"}, - {name: "Haltertop dress", value: "a halter top dress"}, - {name: "Slave gown", value: "a slave gown"} + get requirements() { return V.boughtItem.clothing.pantsu === 1 || V.continent === "Japan"; }, + exposure: 2, + topless: true + } ], - harshClothes: [ + // "Normal" things: + ["an apron", { - name: "Chains", - value: "chains", - fs: "FSDegradationist", - get requirements() { return V.boughtItem.clothing.chains === 1; } - }, - {name: "Go naked", value: "no clothing"}, - {name: "Penitent nun", value: "a penitent nuns habit"}, - {name: "Restrictive latex", value: "restrictive latex"}, - {name: "Shibari ropes", value: "shibari ropes"}, - {name: "Uncomfortable straps", value: "uncomfortable straps"} + name: "Apron", + exposure: 2, + } ], - - niceCollars: [ - {name: "Stylish leather", value: "stylish leather"}, - {name: "Satin choker", value: "satin choker"}, - {name: "Silken ribbon", value: "silk ribbon"}, - {name: "Heavy gold", value: "heavy gold"}, - {name: "Pretty jewelry", value: "pretty jewelry"}, - {name: "Nice retirement counter", value: "nice retirement counter", get requirements() { return V.seeAge === 1; }}, - {name: "Pregnancy biometrics", value: "preg biometrics", get requirements() { return V.seePreg === 1; }}, - {name: "Bell", value: "bell collar"}, - {name: "Cowbell", value: "leather with cowbell"}, - { - name: "Bowtie collar", - value: "bowtie", - fs: "FSGenderFundamentalist", - get requirements() { return V.boughtItem.clothing.bunny === 1; } - }, + ["slutty jewelry", { - name: "Neck tie", - value: "neck tie", - fs: "FSPaternalist", - get requirements() { return V.boughtItem.clothing.conservative === 1; } - }, - { - name: "Ancient Egyptian", - value: "ancient Egyptian", - fs: "FSEgyptianRevivalist", - get requirements() { return V.boughtItem.clothing.egypt === 1; } - }, + name: "Bangles", + exposure: 3 + } ], - - harshCollars: [ - {name: "Tight steel", value: "tight steel"}, - {name: "Cruel retirement counter", value: "cruel retirement counter", get requirements() { return V.seeAge === 1; }}, - {name: "Uncomfortable leather", value: "uncomfortable leather"}, - {name: "Shock punishment", value: "shock punishment"}, - {name: "Neck corset", value: "neck corset"}, + ["clubslut netting", + { + name: "Clubslut netting", + exposure: 3 + } ], - - faceAccessory: [ - {name: "Porcelain mask", value: "porcelain mask"}, - {name: "Cat ears", value: "cat ears"}, + ["cutoffs and a t-shirt", + { + name: "Cutoffs and a t-shirt", + exposure: 0 + } ], - - mouthAccessory: [ - {name: "Ball gag", value: "ball gag"}, - {name: "Bit gag", value: "bit gag"}, - {name: "Ring gag", value: "ring gag"}, + ["a comfortable bodysuit", { - name: "Massive dildo gag", - value: "massive dildo gag", - get requirements() { return V.boughtItem.toys.gags === 1; } - }, - {name: "Dildo gag", value: "dildo gag"}, + name: "Bodysuit", + exposure: 1 + } ], - - shoes: [ - {name: "Barefoot", value: "none"}, - {name: "Flats", value: "flats"}, - {name: "Heels", value: "heels"}, - {name: "Pumps", value: "pumps"}, - {name: "Thigh boots", value: "boots"}, - {name: "Painfully extreme heels", value: "extreme heels"}, - { - name: "Platforms", - value: "platform shoes", - fs: "FSStatuesqueGlorification", - get requirements() { return (V.boughtItem.shoes.heels === 1); } - }, - { - name: "Platform heels", - value: "platform heels", - fs: "FSStatuesqueGlorification", - get requirements() { return (V.boughtItem.shoes.heels === 1); } - }, - { - name: "Painfully extreme platform heels", - value: "extreme platform heels", - fs: "FSStatuesqueGlorification", - get requirements() { return (V.boughtItem.shoes.heels === 1); } + ["a cheerleader outfit", + { + name: "Cheerleader", + exposure: 2 } ], - - bellyAccessories: [ - {name: "None", value: "none"}, - {name: "Tight corset", value: "a corset"}, - {name: "Extreme corset", value: "an extreme corset"}, - {name: "Supportive band", value: "a support band"}, - { - name: "1st Trimester belly", - value: "a small empathy belly", - fs: "FSRepopulationFocus", - get requirements() { return V.boughtItem.clothing.belly === 1; } - }, + ["a fallen nuns habit", { - name: "2nd Trimester belly", - value: "a medium empathy belly", - fs: "FSRepopulationFocus", - get requirements() { return V.boughtItem.clothing.belly === 1; } - }, + name: "Fallen nun", + exposure: 3 + } + ], + ["a hijab and abaya", { - name: "3rd Trimester belly", - value: "a large empathy belly", - fs: "FSRepopulationFocus", - get requirements() { return V.boughtItem.clothing.belly === 1; } - }, + name: "Hijab and abaya", + exposure: 0 + } + ], + ["a leotard", { - name: "3rd Trimester twins belly", - value: "a huge empathy belly", - fs: "FSRepopulationFocus", - get requirements() { return V.boughtItem.clothing.belly === 1; } + name: "Leotard", + exposure: 1 } ], - - vaginalAccessories: [ + ["a slutty maid outfit", { - name: "None", - value: "none" - }, + name: "Maid (slutty)", + exposure: 2 + } + ], + ["a mini dress", { - name: "Bullet vibrator", - value: "bullet vibrator" - }, + name: "Mini dress", + exposure: 2 + } + ], + ["attractive lingerie", { - name: "Smart bullet vibrator", - value: "smart bullet vibrator", - get requirements() { return V.boughtItem.toys.smartVibes === 1; } - }, + name: "Nice lingerie", + exposure: 2 + } + ], + ["a slutty nurse outfit", { - name: "Dildo", - value: "dildo" - }, + name: "Nurse (slutty)", + exposure: 2 + } + ], + ["overalls", { - name: "Long dildo", - value: "long dildo", - get requirements() { return V.boughtItem.toys.dildos === 1; } - }, + name: "Overalls", + exposure: 1 + } + ], + ["panties", { - name: "Large dildo", - value: "large dildo" - }, + name: "Panties", + exposure: 2, + topless: true + } + ], + ["a scalemail bikini", { - name: "Long, large dildo", - value: "long, large dildo", - get requirements() { return V.boughtItem.toys.dildos === 1; } - }, + name: "Scalemail bikini", + exposure: 2 + } + ], + ["a schoolgirl outfit", { - name: "Huge dildo", - value: "huge dildo", - get requirements() { return V.boughtItem.toys.dildos === 1; } - }, + name: "Schoolgirl", + exposure: 1 + } + ], + ["a slutty outfit", { - name: "Long, huge dildo", - value: "long, huge dildo", - get requirements() { return V.boughtItem.toys.dildos === 1; } + name: "Slutty outfit", + exposure: 2 } ], - - vaginalAttachments: [ - {name: "None", value: "none"}, + ["spats and a tank top", { - name: "Vibrating attachment", - value: "vibrator", - get requirements() { return V.boughtItem.toys.vaginalAttachments === 1; } - }, + name: "Spats and a tank top", + exposure: 0 + } + ], + ["a string bikini", { - name: "Smart vibrating attachment", - value: "smart vibrator", - get requirements() { return V.boughtItem.toys.smartVaginalAttachments === 1; } + name: "String bikini", + exposure: 3 } ], - - dickAccessories: [ - {name: "None", value: "none"}, + ["a succubus outfit", { - name: "Bullet vibrator", - value: "bullet vibrator" - }, + name: "Succubus costume", + exposure: 3 + } + ], + ["slutty business attire", { - name: "Smart bullet vibrator", - value: "smart bullet vibrator", - get requirements() { return V.boughtItem.toys.smartVibes === 1; } + name: "Suit (slutty)", + exposure: 2, } ], - buttplugs: [ - { - name: "None", - value: "none" - }, + /* + ["choosing her own clothes", +{ + name: "Let them choose", + } +], + */ + ["a halter top dress", + { + name: "Haltertop dress", + exposure: 0 + } + ], + ["a slave gown", { - name: "Standard plug", - value: "plug" - }, + name: "Slave gown", + exposure: 0 + } + ], + ["chains", { - name: "Long plug", - value: "long plug", - get requirements() { return V.boughtItem.toys.buttPlugs === 1; } - }, + name: "Chains", + fs: "FSDegradationist", + get requirements() { return V.boughtItem.clothing.chains === 1; }, + exposure: 3, + harsh: true + } + ], + ["no clothing", { - name: "Large plug", - value: "large plug" - }, + name: "Go naked", + exposure: 4, + harsh: true + } + ], + ["a penitent nuns habit", { - name: "Long, large plug", - value: "long, large plug", - get requirements() { return V.boughtItem.toys.buttPlugs === 1; } - }, + name: "Penitent nun", + exposure: 0, + harsh: true + } + ], + ["restrictive latex", { - name: "Huge plug", - value: "huge plug", - }, + name: "Restrictive latex", + exposure: 3 + } + ], + ["shibari ropes", { - name: "Long, huge plug", - value: "long, huge plug", - get requirements() { return V.boughtItem.toys.buttPlugs === 1; } + name: "Shibari ropes", + exposure: 3, + harsh: true } ], + ["uncomfortable straps", + { + name: "Uncomfortable straps", + exposure: 3, + harsh: true + } + ] +]); +/** + * @typedef {object} slaveWear + * @property {string} name + * @property {FC.FutureSociety} [fs] Automatically unlocked with this FS. + * @property {boolean} [requirements] + * @property {boolean} [harsh] + */ + +/** + * @typedef {Map<string, slaveWear|slaveWearChastity>} slaveWearCategory + */ + +/** @type {Object.<string, slaveWearCategory>} */ +App.Data.slaveWear = { + collars: new Map([ + ["stylish leather", {name: "Stylish leather"}], + ["satin choker", {name: "Satin choker"}], + ["silk ribbon", {name: "Silken ribbon"}], + ["heavy gold", {name: "Heavy gold"}], + ["pretty jewelry", {name: "Pretty jewelry"}], + ["nice retirement counter", + { + name: "Nice retirement counter", + get requirements() { + return V.seeAge === 1; + } + } + ], + ["preg biometrics", + { + name: "Pregnancy biometrics", + get requirements() { + return V.seePreg === 1; + } + } + ], + ["bell collar", {name: "Bell"}], + ["leather with cowbell", {name: "Cowbell"}], + ["bowtie", + { + name: "Bowtie collar", + fs: "FSGenderFundamentalist", + get requirements() { + return V.boughtItem.clothing.bunny === 1; + } + } + ], + ["neck tie", + { + name: "Neck tie", + fs: "FSPaternalist", + get requirements() { + return V.boughtItem.clothing.conservative === 1; + } + } + ], + ["ancient Egyptian", + { + name: "Ancient Egyptian", + fs: "FSEgyptianRevivalist", + get requirements() { + return V.boughtItem.clothing.egypt === 1; + } + } + ], + ["tight steel", + { + name: "Tight steel", + harsh: true + } + ], + ["cruel retirement counter", + { + name: "Cruel retirement counter", + get requirements() { + return V.seeAge === 1; + }, + harsh: true + } + ], + ["uncomfortable leather", + { + name: "Uncomfortable leather", + harsh: true + } + ], + ["shock punishment", + { + name: "Shock punishment", + harsh: true + } + ], + ["neck corset", + { + name: "Neck corset", + harsh: true + } + ], + ]), + + faceAccessory: new Map([ + ["porcelain mask", {name: "Porcelain mask"}], + ["cat ears", {name: "Cat ears"}], + ]), - buttplugAttachments: [ - {name: "None", value: "none"}, - {name: "Tail", value: "tail", get requirements() { return V.boughtItem.toys.buttPlugTails === 1; }}, - {name: "Fox tail", value: "fox tail", get requirements() { return V.boughtItem.toys.buttPlugTails === 1; }}, - {name: "Cat tail", value: "cat tail", get requirements() { return V.boughtItem.toys.buttPlugTails === 1; }}, - {name: "Cow tail", value: "cow tail", get requirements() { return V.boughtItem.toys.buttPlugTails === 1; }} - ], - /** - * @typedef {object} slaveWearChastity - * @property {string} name - * @property {string} value - * @property {object} updateSlave - * @property {string} [fs] - */ + mouthAccessory: new Map([ + ["ball gag", {name: "Ball gag"}], + ["bit gag", {name: "Bit gag"}], + ["ring gag", {name: "Ring gag"}], + ["massive dildo gag", + { + name: "Massive dildo gag", + get requirements() { + return V.boughtItem.toys.gags === 1; + } + } + ], + ["dildo gag", {name: "Dildo gag"} + ], + ]), + + shoes: new Map([ + ["none", {name: "Barefoot"}], + ["flats", {name: "Flats"}], + ["heels", {name: "Heels"}], + ["pumps", {name: "Pumps"}], + ["boots", {name: "Thigh boots"}], + ["extreme heels", {name: "Painfully extreme heels"}], + ["platform shoes", + { + name: "Platforms", + fs: "FSStatuesqueGlorification", + get requirements() { + return (V.boughtItem.shoes.heels === 1); + } + } + ], + ["platform heels", + { + name: "Platform heels", + fs: "FSStatuesqueGlorification", + get requirements() { + return (V.boughtItem.shoes.heels === 1); + } + } + ], + ["extreme platform heels", + { + name: "Painfully extreme platform heels", + fs: "FSStatuesqueGlorification", + get requirements() { + return (V.boughtItem.shoes.heels === 1); + } + } + ], + ]), - /** @type {Array<slaveWearChastity>} */ - chastityDevices: [ - // '.value' must be a string, so using update slave so I can update multiple values. + bellyAccessories: new Map([ + ["none", {name: "None"}], + ["a corset", {name: "Tight corset"}], + ["an extreme corset", {name: "Extreme corset"}], + ["a support band", {name: "Supportive band"}], + ["a small empathy belly", + { + name: "1st Trimester belly", + fs: "FSRepopulationFocus", + get requirements() { + return V.boughtItem.clothing.belly === 1; + } + } + ], + ["a medium empathy belly", + { + name: "2nd Trimester belly", + fs: "FSRepopulationFocus", + get requirements() { + return V.boughtItem.clothing.belly === 1; + } + } + ], + ["a large empathy belly", + { + name: "3rd Trimester belly", + fs: "FSRepopulationFocus", + get requirements() { + return V.boughtItem.clothing.belly === 1; + } + } + ], + ["a huge empathy belly", + { + name: "3rd Trimester twins belly", + fs: "FSRepopulationFocus", + get requirements() { + return V.boughtItem.clothing.belly === 1; + } + } + ] + ]), + + vaginalAccessories: new Map([ + ["none", {name: "None"}], + ["bullet vibrator", {name: "Bullet vibrator"}], + ["smart bullet vibrator", + { + name: "Smart bullet vibrator", + get requirements() { + return V.boughtItem.toys.smartVibes === 1; + } + } + ], + ["dildo", {name: "Dildo"}], + ["long dildo", + { + name: "Long dildo", + get requirements() { + return V.boughtItem.toys.dildos === 1; + } + } + ], + ["large dildo", {name: "Large dildo"}], + ["long, large dildo", + { + name: "Long, large dildo", + get requirements() { + return V.boughtItem.toys.dildos === 1; + } + } + ], + ["huge dildo", + { + name: "Huge dildo", + get requirements() { + return V.boughtItem.toys.dildos === 1; + } + } + ], + ["long, huge dildo", + { + name: "Long, huge dildo", + get requirements() { + return V.boughtItem.toys.dildos === 1; + } + } + ] + ]), + + vaginalAttachments: new Map([ + ["none", {name: "None"}], + ["vibrator", + { + name: "Vibrating attachment", + get requirements() { + return V.boughtItem.toys.vaginalAttachments === 1; + } + } + ], + ["smart vibrator", + { + name: "Smart vibrating attachment", + get requirements() { + return V.boughtItem.toys.smartVaginalAttachments === 1; + } + } + ] + ]), + + dickAccessories: new Map([ + ["none", {name: "None"}], + ["bullet vibrator", {name: "Bullet vibrator"}], + ["smart bullet vibrator", + { + name: "Smart bullet vibrator", + get requirements() { + return V.boughtItem.toys.smartVibes === 1; + } + } + ] + ]), + + buttplugs: new Map([ + ["none", {name: "None"}], + ["plug", {name: "Standard plug"}], + ["long plug", + { + name: "Long plug", + get requirements() { + return V.boughtItem.toys.buttPlugs === 1; + } + } + ], + ["large plug", {name: "Large plug"}], + ["long, large plug", + { + name: "Long, large plug", + get requirements() { + return V.boughtItem.toys.buttPlugs === 1; + } + } + ], + ["huge plug", {name: "Huge plug"}], + ["long, huge plug", + { + name: "Long, huge plug", + get requirements() { + return V.boughtItem.toys.buttPlugs === 1; + } + } + ] + ]), + + buttplugAttachments: new Map([ + ["none", {name: "None"}], + ["tail", + { + name: "Tail", + get requirements() { + return V.boughtItem.toys.buttPlugTails === 1; + } + } + ], + ["fox tail", + { + name: "Fox tail", + get requirements() { + return V.boughtItem.toys.buttPlugTails === 1; + } + } + ], + ["cat tail", + { + name: "Cat tail", + get requirements() { + return V.boughtItem.toys.buttPlugTails === 1; + } + } + ], + ["cow tail", + { + name: "Cow tail", + get requirements() { + return V.boughtItem.toys.buttPlugTails === 1; + } + } + ] + ]), +}; +/** + * @typedef {object} slaveWearChastity + * @property {string} name + * @property {string} value + * @property {object} updateSlave + * @property {FC.FutureSociety} [fs] + */ + +/** @type {Map<string, slaveWearChastity>} */ +App.Data.slaveWear.chastityDevices = new Map([ + // '.value' must be a string, so using update slave so I can update multiple values. + ["none", { name: "None", - value: "none", updateSlave: { choosesOwnChastity: 0, chastityAnus: 0, chastityPenis: 0, chastityVagina: 0 }, - }, + } + ], + ["anal chastity", { name: "Anal chastity", - value: "anal chastity", updateSlave: { choosesOwnChastity: 0, chastityAnus: 1, chastityPenis: 0, chastityVagina: 0 } - }, + } + ], + ["chastity belt", { name: "Chastity belt", - value: "chastity belt", updateSlave: { choosesOwnChastity: 0, chastityAnus: 0, chastityPenis: 0, chastityVagina: 1 }, - }, + } + ], + ["combined chastity belt", { name: "Combined chastity belt", - value: "combined chastity belt", updateSlave: { choosesOwnChastity: 0, chastityAnus: 1, chastityPenis: 0, chastityVagina: 1 }, - }, + } + ], + ["chastity cage", { name: "Chastity cage", - value: "chastity cage", updateSlave: { choosesOwnChastity: 0, chastityAnus: 0, chastityPenis: 1, chastityVagina: 0 }, - }, + } + ], + ["combined chastity cage", { name: "Combined chastity cage", - value: "combined chastity cage", updateSlave: { choosesOwnChastity: 0, chastityAnus: 1, chastityPenis: 1, chastityVagina: 0 }, - }, + } + ], + ["genital chastity", { name: "Genital chastity", - value: "genital chastity", updateSlave: { choosesOwnChastity: 0, chastityAnus: 0, chastityPenis: 1, chastityVagina: 1 }, - }, + } + ], + ["full chastity", { name: "Full chastity", - value: "full chastity", updateSlave: { choosesOwnChastity: 0, chastityAnus: 1, chastityPenis: 1, chastityVagina: 1 }, - }, + } + ], + ["choose own chastity", { name: "Choose own chastity", - value: "choose own chastity", fs: "FSRestart", updateSlave: { choosesOwnChastity: 1 }, - }, + } + ], + ["revoke choosing own chastity", { name: "Revoke choosing own chastity", - value: "revoke choosing own chastity", fs: "FSRestart", updateSlave: { choosesOwnChastity: 0 }, - }, - ], -}; + } + ] +]); diff --git a/src/002-config/mousetrapConfig.js b/src/002-config/mousetrapConfig.js index da2641fb38a03b0b3aae3041456e9e0b7a941f50..dd39ff0c3d8b77d5ca4062e99907c29746b1c5b6 100644 --- a/src/002-config/mousetrapConfig.js +++ b/src/002-config/mousetrapConfig.js @@ -255,11 +255,43 @@ App.UI.Hotkeys = (function() { } } + function settingsPage() { + const f = document.createDocumentFragment(); + + App.UI.DOM.appendNewElement("h1", f, "Hotkey Settings"); + + const p = document.createElement("p"); + const ul = document.createElement("ul"); + + let li = document.createElement("li"); + li.append("On keyboard layouts other than the "); + const a = document.createElement("a"); + a.href = "https://en.wikipedia.org/wiki/File:KB_United_States.svg"; + a.target = "_blank"; + a.append("US-QWERTY layout"); + li.append(a, + "there may be keys or combinations of keys where the recorded key is different from the key used to listen to key events. You will have to find these keys yourself through trial and error."); + ul.append(li); + + App.UI.DOM.appendNewElement("li", ul, "Custom hotkeys are browser specific and are not part of your save."); + + li = document.createElement("li"); + li.append("While we try not to overwrite browser or OS level key combinations it is possible to do so with custom hotkeys. This also means that during recording of custom hotkeys no browser or OS level key combinations are available. There are however keys that cannot be overwritten, the ", + App.UI.DOM.makeElement("code", "Win key"), " on Windows is an example for this."); + ul.append(li); + + p.append(ul); + f.append(p); + + f.append(settingsMenu()); + return f; + } + return { add: addDefault, hotkeys: hotkeysForAction, init: init, - settings: settingsMenu, + settings: settingsPage, }; })(); diff --git a/src/003-assets/CSS/gridTemplates.css b/src/003-assets/CSS/gridTemplates.css index 87763df8e8ace21100c398ba5f1789e5a3bec787..bdc2adf2e7f4ce6c1b970d3059b45c2dcb7cf382 100644 --- a/src/003-assets/CSS/gridTemplates.css +++ b/src/003-assets/CSS/gridTemplates.css @@ -24,15 +24,16 @@ div.eyeContainer { grid-template-columns: 80px 50px 70px 50px; } -div.buyProsthetics { +div.buy-prosthetics { display: grid; - grid-template-columns: 300px 140px 150px 150px; + grid-template-columns: repeat(4, max-content); + grid-column-gap: 40px; } -div.buyProsthetics div.full { +div.buy-prosthetics div.full { grid-column-start: 2; grid-column-end: 5; } -div.buyProsthetics div.research { +div.buy-prosthetics div.research { grid-column-start: 3; grid-column-end: 5; text-align: center; diff --git a/src/004-base/domPassage.js b/src/004-base/domPassage.js new file mode 100644 index 0000000000000000000000000000000000000000..441a8a87ef71ae7eaec796f7b57030bc4ce44811 --- /dev/null +++ b/src/004-base/domPassage.js @@ -0,0 +1,26 @@ +/** + * A pure DOM Passage, the SugarCube Wikifier never gets invoked. + */ +App.DomPassage = class extends Passage { + /** + * @param {string} title + * @param {function():DocumentFragment|function():HTMLElement} callback + * @param {string[]} tags + */ + constructor(title, callback, tags = []) { + super(title, { + hasAttribute: a => a === "tags", + getAttribute: () => tags.join(" ") + }); + this.callback = callback; + + Story.add(this); + } + + /** + * @returns {DocumentFragment|HTMLElement} + */ + render() { + return this.callback(); + } +}; diff --git a/src/005-passages/options.js b/src/005-passages/options.js new file mode 100644 index 0000000000000000000000000000000000000000..ec6cf6a86d09225e9cc68b31c654cfde8b48b2de --- /dev/null +++ b/src/005-passages/options.js @@ -0,0 +1,59 @@ +new App.DomPassage("Options", + () => { + if (lastVisited("Slave Interact") === 1) { + V.storedLink = "Slave Interact"; + } else { + V.storedLink = "Main"; + } + + V.nextButton = "Back"; + V.nextLink = V.storedLink; + V.encyclopedia = "How to Play"; + + return App.UI.optionsPassage(); + }, ["jump-to-safe", "jump-from-safe"] +); + +new App.DomPassage("Description Options", + () => { + V.nextButton = "Back"; + if (V.storedLink !== "Slave Interact") { + if (lastVisited("Slave Interact") === 1) { + V.storedLink = "Slave Interact"; + } else { + V.storedLink = "Options"; + } + } + V.nextLink = V.storedLink; + + return App.UI.descriptionOptions(); + }, + ["jump-to-safe", "jump-from-safe"] +); + +new App.DomPassage("Summary Options", + () => { + V.nextButton = "Back"; + if (V.storedLink !== "Slave Interact" && V.storedLink !== "Main") { + if (lastVisited("Main") === 1) { + V.storedLink = "Main"; + } else { + V.storedLink = "Options"; + } + } + V.nextLink = V.storedLink; + V.passageSwitchHandler = App.EventHandlers.optionsChanged; + + return App.UI.summaryOptions(); + }, + ["jump-to-safe", "jump-from-safe"] +); + +new App.DomPassage("Hotkey Settings", + () => { + V.nextButton = "Back"; + V.nextLink = "Main"; + + return App.UI.Hotkeys.settings(); + }, ["jump-to-safe", "jump-from-safe"] +); diff --git a/src/Mods/SecExp/attackHandler.tw b/src/Mods/SecExp/attackHandler.tw index 2bca99e2995993f7c04bfd1bc1f16015339f133b..00a77c7bad8aa0f7657dee2f355749c3874a8732 100644 --- a/src/Mods/SecExp/attackHandler.tw +++ b/src/Mods/SecExp/attackHandler.tw @@ -85,9 +85,11 @@ <<elseif $SecExp.core.authority >= 15000>> <<set _slaveMod += 0.25>> <</if>> - <<if $PC.career == "escort" || $PC.career == "servant">> + <<if $PC.career == "escort" || $PC.career == "prostitute" || $PC.career == "servant">> <<set _slaveMod += 0.10>> - <<elseif $PC.career == "slaver">> + <<elseif $PC.career == "child prostitute" && $PC.visualAge >= $minimumSlaveAge>> + <<set _slaveMod += 0.05>> + <<elseif $PC.career == "slaver" || $PC.career == "slave overseer" || $PC.career == "slave tender">> <<set _slaveMod -= 0.10>> <</if>> <<if $rep <= 2500 && $rep > 1000>> diff --git a/src/Mods/SecExp/js/secExpBC.js b/src/Mods/SecExp/js/secExpBC.js index 3a3c9fe42afc42e01769a8ade2c3870cbf6af8e5..46d090fd112fa47a735368f41e087ea971092e0c 100644 --- a/src/Mods/SecExp/js/secExpBC.js +++ b/src/Mods/SecExp/js/secExpBC.js @@ -106,11 +106,11 @@ App.SecExp.generalBC = function() { V.SecExp.units.mercs.free = 30; } } - + for (const squad of App.SecExp.unit.humanSquads()) { App.SecExp.unit.fixBroken(squad); } - + if (V.SecExp.defaultNames) { V.SecExp.units.slaves.defaultName = V.SecExp.defaultNames.slaves; V.SecExp.units.mercs.defaultName = V.SecExp.defaultNames.mercs; diff --git a/src/art/vector/VectorArtJS.js b/src/art/vector/VectorArtJS.js index 7edef164b7e331f554c5b8a5fa2f7f5772870ec5..0ccb9bbbf222280e781cdd81abf193b363d0c4a3 100644 --- a/src/art/vector/VectorArtJS.js +++ b/src/art/vector/VectorArtJS.js @@ -1098,10 +1098,19 @@ App.Art.vectorArtElement = (function() { svgQueue.add("Art_Vector_Plug_Huge_Long"); } - if (slave.buttplugAttachment === "tail") { - svgQueue.add("Art_Vector_Plug_Tail"); - } else if (slave.buttplugAttachment === "cat tail") { - svgQueue.add("Art_Vector_Cat_Tail"); + switch (slave.buttplugAttachment) { + case "tail": + svgQueue.add("Art_Vector_Plug_Tail"); + break; + case "cat tail": + svgQueue.add("Art_Vector_Cat_Tail"); + break; + case "fox tail": + svgQueue.add("Art_Vector_Fox_Tail"); + break; + case "cow tail": + svgQueue.add("Art_Vector_Cow_Tail"); + break; } } @@ -2014,8 +2023,24 @@ App.Art.vectorArtElement = (function() { } } /* note: latex clothing actually shows some hair, but there is no appropriate art for it */ - if (slave.faceAccessory === "cat ears") { - svgQueue.add("Art_Vector_Cat_Ear_Back"); + switch(slave.faceAccessory) { + case "cat ears": + svgQueue.add("Art_Vector_Cat_Ear_Back"); + break; + case "fox ears": + svgQueue.add("Art_Vector_Fox_Ear_Back"); + break; + case "cow ears": + svgQueue.add("Art_Vector_Cow_Ear_Back"); + break; + } + switch(slave.earT) { + case "neko": + svgQueue.add("Art_Vector_Cat_Ear_Back"); + break; + case "kit": + svgQueue.add("Art_Vector_Fox_Ear_Back"); + break; } } @@ -2091,8 +2116,24 @@ App.Art.vectorArtElement = (function() { } } /* note: latex clothing actually shows some hair, but there is no appropriate art for it */ - if (slave.faceAccessory === "cat ears") { - svgQueue.add("Art_Vector_Cat_Ear_Fore"); + switch(slave.faceAccessory) { + case "cat ears": + svgQueue.add("Art_Vector_Cat_Ear_Fore"); + break; + case "fox ears": + svgQueue.add("Art_Vector_Fox_Ear_Fore"); + break; + case "cow ears": + svgQueue.add("Art_Vector_Cow_Ear_Fore"); + break; + } + switch(slave.earT) { + case "neko": + svgQueue.add("Art_Vector_Cat_Ear_Fore"); + break; + case "kit": + svgQueue.add("Art_Vector_Fox_Ear_Fore"); + break; } } diff --git a/src/art/vector/layers/Art_Vector_Cat_Ear_Back.svg b/src/art/vector/layers/Art_Vector_Cat_Ear_Back.svg index dc91bc8923839095b7d1ae60ca61c04ccbd67d00..f2824e6a276cd10acc8d95727ed16e31f3ae50c8 100644 --- a/src/art/vector/layers/Art_Vector_Cat_Ear_Back.svg +++ b/src/art/vector/layers/Art_Vector_Cat_Ear_Back.svg @@ -1 +1 @@ -<svg viewBox="0 0 560 1000"><g data-transform="art" style="display:inline" id="g8" transform="translate(0,-2.0000001)"><path style="display:inline;fill-opacity:1;fill:#ff80b2;stroke-width:1.09067011" d="m 248.73736,68.964871 c 0,0 1.69861,-0.804687 4.08156,-0.299212 2.38295,0.505475 23.75731,3.393902 29.82301,5.415802 6.06569,2.021898 7.14885,3.466112 7.14885,3.466112 L 263.21726,106.7929 c -3.84107,-5.31888 -4.93514,-8.768348 -7.63681,-17.615026 -1.84138,-6.029593 -1.55793,-8.849384 -2.81153,-12.285769 -0.74632,-2.04581 -1.39753,-4.595174 -4.03156,-7.927234 z" id="path2"/><path d="m 248.73736,68.964871 c 0,0 1.69861,-0.804687 4.08156,-0.299212 2.38295,0.505475 23.75731,3.393902 29.82301,5.415802 6.06569,2.021898 7.14885,3.466112 7.14885,3.466112 l -9.45442,10.405004 c -8.89399,-4.0001 -15.68619,-8.81104 -20.05716,-12.416027 -2.33857,-1.928752 -6.80539,-4.786815 -11.54184,-6.571679 z" style="display:inline;fill-opacity:1;fill:#ffaacc;stroke-width:1.09067011" id="path4"/><path style="fill-opacity:1;fill:#fefefe;stroke-width:1.09067011" d="m 251.82217,72.78348 c 0,0 4.58923,1.460454 7.26102,0.648083 l 19.57572,12.076963 c 0,0 -14.32239,6.372867 -17.57187,14.965934 0,0 -0.28885,-1.805263 0.1083,-3.538319 l -0.93872,3.141169 c 0,0 -0.32495,-2.166325 0.18052,-3.82717 0,0 -1.08316,-0.758212 -2.45516,1.444213 0,0 0.32494,-3.646639 1.84136,-5.307486 -1.84137,0.180528 -4.44095,2.166322 -4.44095,2.166322 0,0 -0.14441,-7.040542 4.76591,-9.062442 -4.11601,0.216633 -6.93223,3.791062 -6.93223,3.791062 0,0 -0.36105,-6.82391 3.75496,-8.015386 -2.99675,0.938738 -4.29654,3.71885 -4.29654,3.71885 0,0 -0.54157,-3.827166 0.93874,-6.246224 -0.686,-0.216632 -1.73305,0.613791 -1.73305,0.613791 0,0 0.79431,-2.419059 3.32169,-3.285586 -2.5839,-0.566619 -3.3797,-3.283774 -3.3797,-3.283774 z" id="path6"/></g></svg> +<svg viewBox="0 0 560 1000"><path style="display:inline;fill-opacity:1;fill:#20202c;stroke-width:1.09067011" d="m 248.73736,68.964871 c 0,0 1.69861,-0.804687 4.08156,-0.299212 2.38295,0.505475 23.75731,3.393902 29.82301,5.415802 6.06569,2.021898 7.14885,3.466112 7.14885,3.466112 L 263.21726,106.7929 c -3.84107,-5.31888 -4.93514,-8.768348 -7.63681,-17.615026 -1.84138,-6.029593 -1.55793,-8.849384 -2.81153,-12.285769 -0.74632,-2.04581 -1.39753,-4.595174 -4.03156,-7.927234 z" id="path2"/><path d="m 248.73736,68.964871 c 0,0 1.69861,-0.804687 4.08156,-0.299212 2.38295,0.505475 23.75731,3.393902 29.82301,5.415802 6.06569,2.021898 7.14885,3.466112 7.14885,3.466112 l -9.45442,10.405004 c -8.89399,-4.0001 -15.68619,-8.81104 -20.05716,-12.416027 -2.33857,-1.928752 -6.80539,-4.786815 -11.54184,-6.571679 z" style="display:inline;fill-opacity:1;fill:#333344;stroke-width:1.09067011" id="path4"/><path style="fill-opacity:1;fill:#fefefe;stroke-width:1.09067011" d="m 251.82217,72.78348 c 0,0 4.58923,1.460454 7.26102,0.648083 l 19.57572,12.076963 c 0,0 -14.32239,6.372867 -17.57187,14.965934 0,0 -0.28885,-1.805263 0.1083,-3.538319 l -0.93872,3.141169 c 0,0 -0.32495,-2.166325 0.18052,-3.82717 0,0 -1.08316,-0.758212 -2.45516,1.444213 0,0 0.32494,-3.646639 1.84136,-5.307486 -1.84137,0.180528 -4.44095,2.166322 -4.44095,2.166322 0,0 -0.14441,-7.040542 4.76591,-9.062442 -4.11601,0.216633 -6.93223,3.791062 -6.93223,3.791062 0,0 -0.36105,-6.82391 3.75496,-8.015386 -2.99675,0.938738 -4.29654,3.71885 -4.29654,3.71885 0,0 -0.54157,-3.827166 0.93874,-6.246224 -0.686,-0.216632 -1.73305,0.613791 -1.73305,0.613791 0,0 0.79431,-2.419059 3.32169,-3.285586 -2.5839,-0.566619 -3.3797,-3.283774 -3.3797,-3.283774 z" id="path6"/></svg> diff --git a/src/art/vector/layers/Art_Vector_Cat_Ear_Fore.svg b/src/art/vector/layers/Art_Vector_Cat_Ear_Fore.svg index f734c1e679dc0ff1e4c3f70aa5ad06657c477511..1ab856e1586fb48eff7ad04f80c4b2d0c4b60517 100644 --- a/src/art/vector/layers/Art_Vector_Cat_Ear_Fore.svg +++ b/src/art/vector/layers/Art_Vector_Cat_Ear_Fore.svg @@ -1 +1 @@ -<svg viewBox="0 0 560 1000"><g data-transform="art" style="display:inline" transform="translate(7.2500004,-0.49999703)" id="g8-9"><path style="display:inline;fill-opacity:1;fill:#ff80b2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-width:1px;stroke:none" d="m 308.1475,77.54163 c 0,0 12.76065,-8.72344 26.22373,-9.571872 11.01415,-0.694103 19.3005,-2.094451 19.3005,-2.094451 -1.1752,8.016637 -7.95821,31.134787 -22.41696,46.848853 0,0 1.03532,-26.317653 -23.10727,-35.18253 z" id="path2-5"/><path d="m 353.67173,65.875307 c -1.1752,8.016637 -7.95821,31.134787 -22.41696,46.848853 0,0 0.0174,-0.44206 -0.005,-1.23089 -0.1085,-3.84062 -1.15748,-15.901417 -9.73296,-25.185131 7.53822,-11.504443 19.52704,-16.919867 32.15481,-20.432832 z" style="display:inline;fill-opacity:1;fill:#ffaacc;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-width:1px;stroke:none" id="path4-7"/><path style="display:inline;fill-opacity:1;fill:#fefefe;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-width:1px;stroke:none" d="m 329.49165,100.71363 c -1.35994,-4.601307 -3.757,-9.839308 -7.97484,-14.405491 4.85489,-7.409284 11.55582,-12.292945 19.08455,-15.769361 0,0 5.17674,-0.18227 8.51755,1.867294 -0.16223,0.07853 -2.7722,0.606429 -4.0879,1.030675 2.49749,0.129635 3.54594,1.366431 3.54594,1.366431 0,0 -0.91465,0.05439 -2.3119,0.89546 2.85074,0.89458 4.63218,5.458641 4.63218,5.458641 0,0 -2.19492,-0.350727 -4.86496,0.149253 2.06512,0.935863 3.25191,4.890565 3.25191,4.890565 0,0 -2.18348,-0.526951 -6.00364,-0.793573 4.30345,1.520613 4.48699,6.023984 4.48699,6.023984 0,0 -3.83009,-2.647995 -4.31294,-3.165587 1.78858,2.77439 1.68141,5.83086 1.68141,5.83086 0,0 -1.28005,-1.529562 -3.01908,-2.13864 0.54376,1.109778 0.54477,3.262668 0.54477,3.262668 0,0 -2.12647,-1.184307 -2.69251,-1.999674 0.45817,3.293475 -0.44441,8.565455 -0.44441,8.565455 0,0 -2.3265,-3.196931 -3.16399,-5.032441 0.25185,3.018194 -0.90576,5.929071 -0.90576,5.929071 0,0 -0.0958,-4.496089 -0.9266,-5.750878 0.28951,3.866948 -0.68272,5.889828 -1.896,8.463388 0,0 -1.77802,-2.46182 -3.14077,-4.6781 z" id="path6-3"/></g></svg> +<svg viewBox="0 0 560 1000"><g data-transform="art" style="display:inline" transform="translate(0,3e-6)" id="g8-9"><path style="display:inline;fill-opacity:1;fill:#20202c;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-width:1px;stroke:none" d="m 308.1475,77.54163 c 0,0 12.76065,-8.72344 26.22373,-9.571872 11.01415,-0.694103 19.3005,-2.094451 19.3005,-2.094451 -1.1752,8.016637 -7.95821,31.134787 -22.41696,46.848853 0,0 1.03532,-26.317653 -23.10727,-35.18253 z" id="path2-5"/><path d="m 353.67173,65.875307 c -1.1752,8.016637 -7.95821,31.134787 -22.41696,46.848853 0,0 0.0174,-0.44206 -0.005,-1.23089 -0.1085,-3.84062 -1.15748,-15.901417 -9.73296,-25.185131 7.53822,-11.504443 19.52704,-16.919867 32.15481,-20.432832 z" style="display:inline;fill-opacity:1;fill:#333344;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-width:1px;stroke:none" id="path4-7"/><path style="display:inline;fill-opacity:1;fill:#fefefe;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-width:1px;stroke:none" d="m 329.49165,100.71363 c -1.35994,-4.601307 -3.757,-9.839308 -7.97484,-14.405491 4.85489,-7.409284 11.55582,-12.292945 19.08455,-15.769361 0,0 5.17674,-0.18227 8.51755,1.867294 -0.16223,0.07853 -2.7722,0.606429 -4.0879,1.030675 2.49749,0.129635 3.54594,1.366431 3.54594,1.366431 0,0 -0.91465,0.05439 -2.3119,0.89546 2.85074,0.89458 4.63218,5.458641 4.63218,5.458641 0,0 -2.19492,-0.350727 -4.86496,0.149253 2.06512,0.935863 3.25191,4.890565 3.25191,4.890565 0,0 -2.18348,-0.526951 -6.00364,-0.793573 4.30345,1.520613 4.48699,6.023984 4.48699,6.023984 0,0 -3.83009,-2.647995 -4.31294,-3.165587 1.78858,2.77439 1.68141,5.83086 1.68141,5.83086 0,0 -1.28005,-1.529562 -3.01908,-2.13864 0.54376,1.109778 0.54477,3.262668 0.54477,3.262668 0,0 -2.12647,-1.184307 -2.69251,-1.999674 0.45817,3.293475 -0.44441,8.565455 -0.44441,8.565455 0,0 -2.3265,-3.196931 -3.16399,-5.032441 0.25185,3.018194 -0.90576,5.929071 -0.90576,5.929071 0,0 -0.0958,-4.496089 -0.9266,-5.750878 0.28951,3.866948 -0.68272,5.889828 -1.896,8.463388 0,0 -1.77802,-2.46182 -3.14077,-4.6781 z" id="path6-3"/></g></svg> diff --git a/src/art/vector/layers/Art_Vector_Cow_Ear_Back.svg b/src/art/vector/layers/Art_Vector_Cow_Ear_Back.svg new file mode 100644 index 0000000000000000000000000000000000000000..27af8762fa4d00897ced83b059c3dad4c9994820 --- /dev/null +++ b/src/art/vector/layers/Art_Vector_Cow_Ear_Back.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 560 1000"><path d="M268.97 88.19c3.57 1.86 2.25 4.2 10.8 1.75l-3.88 16.12c-11.15-.78-4.86 6.7-19.13 5.86-14.26-.84-19.85-9.81-21.72-17.47 7.4-9.24 23.72-11.42 33.93-6.26z" fill="#87553a"/><path d="M255.22 99.84l3.57-.18s-.23 4.14 2.5 4.53l.55 7.45-8.2.53-.3-7.17s2.4.3 1.88-5.16z" fill="#f1ab2b"/></svg> diff --git a/src/art/vector/layers/Art_Vector_Cow_Ear_Fore.svg b/src/art/vector/layers/Art_Vector_Cow_Ear_Fore.svg new file mode 100644 index 0000000000000000000000000000000000000000..b15a49ac861ab184d708457f03863240b6b7159f --- /dev/null +++ b/src/art/vector/layers/Art_Vector_Cow_Ear_Fore.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 560 1000"><path d="M341.29 87.85c-4.02 2.48-4.66 5.24-10.49.95 3.7 6.63 5.61 18.01 4.8 23.83 10.25-5.13 5.33 4.15 21.96 1.98 16.62-2.18 22.4-13.14 23.95-22.26-9.43-10.2-28.7-11.38-40.22-4.5z" fill="#87553a"/><path d="M354.75 101.34l3.78.9s-1.5 4.25 1.23 5.48l-1.68 7.94-8.71-1.94 1.85-7.57s2.42 1.06 3.53-4.8z" fill="#f1ab2b"/></svg> diff --git a/src/art/vector/layers/Art_Vector_Cow_Tail.svg b/src/art/vector/layers/Art_Vector_Cow_Tail.svg new file mode 100644 index 0000000000000000000000000000000000000000..3723e6f4681bb606e49d688bbe1fe84373e4e9c6 --- /dev/null +++ b/src/art/vector/layers/Art_Vector_Cow_Tail.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 560 1000"><path d="M421.12 602.38l.5 1.96c.47 3.84 4.3 13.82-4.74 15.06.55-2.29 2.45-6 2.21-7.57 0 0-.5 3.82-3.16 5.93-.72.57-1.16 2.13-.56 3.9-1.43-.52-2.62-3.79-1.53-5.34 1.03-1.46 2.62-3.16 2.3-4.99-.14 1.55-1.5 3.76-3.36 5.07-1.53 1.08-2.64 1.86-5.08 1.88 3.7-2.34 3.72-4.93 4.95-6.58a5.18 5.18 0 001.05-3.32l-1.46-4.45z" fill="#e7d0bf"/><path d="M412.19 561.3c-.88 17.5 3.89 38 3.89 38" fill="none" stroke="#ebebeb" stroke-width="5"/><path d="M321.75 480.5s89.19-57.34 90.44 80.8" fill="none" stroke="#704a2f" stroke-width="5" stroke-linecap="round"/><path d="M416.6 589.3l-4.88-.16c1.33 8.83-6.77 22.18-6.77 22.18s4.67-3.52 5.94-8.88c-.34 2.04-.79 5.73.16 7.44 1.33 2.41 2.9 4.37 2.9 4.37s-1.1-4.14-1.1-7c0-2.86 0 3.23 1.33 4.66-.78-4.74.16-4.51.16-4.51s1.17 1.43 1.01 4.29c1.1-3.84 0-5.42 0-5.42s2.36 2.4 2.2 5.72c.22-1.32.27-2.3.25-3.08.24.9.56 1.84 1 2.33 1.02 1.13.63 3.46.63 3.46s1.8-3.61.7-5.8c-1.1-2.18 0-3.8 0-3.8-.07 3.24 1.58 1.76 1.34 3.5-.2 1.4 1.13 1.58 1.88 2.94-.98-3.46 1.49-3.61-.04-6.81l-.5-1.06c.69.7 1.56 1.58 1.95 2.3.5.94 1.3 5.68 1.3 5.68s.1-1.47-.32-4.78c-.42-3.21-1.62-3.02-4.13-6.9.73-1.74.46-3.08-3.18-7.1-.93-1-1.84-3.57-1.84-3.57z" fill="#ebebeb"/></svg> diff --git a/src/art/vector/layers/Art_Vector_Fox_Ear_Back.svg b/src/art/vector/layers/Art_Vector_Fox_Ear_Back.svg new file mode 100644 index 0000000000000000000000000000000000000000..70a2d64a751850468298e73295123d0ef3536ff8 --- /dev/null +++ b/src/art/vector/layers/Art_Vector_Fox_Ear_Back.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 560 1000"><path d="M260 53c-.7 0-1.3.4-1.4 1.8 0 .3.2.6.5.9l-.1 3.6c.3.7-.3 2 1.3 1.8 2.5 1 .4 3.8 1.9 5.2l-.6 3.7c1.5.7 1.2 2.2 1.7 3.4-.7.2-.7 1-1 1.6l1.2 1.3c1 1.2 1.1 2.9 2.6 3.8.5.5.6 1.2.7 2l-.1.5V84c-1 1.1-1 2.5-1.2 3.8 1.6-.3 1.9 1 2.4 2 0 1.3-2 1-1.9 2.4v.6l-.2.2c0 .1 0 .2.3.3h.6l1.3-.8v.5l1.2-.9.6.7 1.8-1.7V92l2-1.3c.4-.4 1-.8.8-1.5 1.2 0 2.1-.8 3-1.5.3-.6 1-1 .6-1.8.5-.1.9-.5 1.2-.8l.8-.8.3-.1.1-.1c.3-.2.7-.2 1-.3 1-.3 2-.6 2.5-1.6v-.6c.5-.2 1-.5 1.1-1.1.6-.1 1-.6 1.3-1l.8-.5h.6c.5 0 .8-.3 1-.7.3-.6.3-1.2.2-1.8l-.6-1.2-.8-1.3c-.4-.7-.7-1.4-1.3-2-.4-.3-.8-.7-1.4-.7l-1.2-.8-2.4-2.5-1.2-.6c-.8-.3-1-1.6-2.2-1.3-.3-1.4-1.6-2-2.3-3.1l-1.3-.1-.6-.6c0-1.3-1.4-1.6-2-2.5-.4 0-.8-.7-1.3-.2-.3-1.5-1.9-1.8-2.6-2.9-1.7-.3-2.7-2-4.2-2.6-1-.9-1-.8-1.3-.7h-.6c-.5-.3-1-.5-1.5-.5z" fill="#863b3b"/></svg> diff --git a/src/art/vector/layers/Art_Vector_Fox_Ear_Fore.svg b/src/art/vector/layers/Art_Vector_Fox_Ear_Fore.svg new file mode 100644 index 0000000000000000000000000000000000000000..29e309fa80a7f1521e6f9ba94f4934f05f41a294 --- /dev/null +++ b/src/art/vector/layers/Art_Vector_Fox_Ear_Fore.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 560 1000"><path d="M340 52.9c-.2 0-.5.3-.7.5-.5 0-1 0-1.3.6 0 0-.7 0-1 .3-.4.2-.8 1.2-.8 1.2-2 1.2-2.2 1.9-2 2.4-1.2 0-1.8 1-2.5 1.8-1-.1-1.9 1.8-2.5 2.6-.6-.5-4.5 1.6-3.3 2.8l-.5.4c-.5 0-1.2-.6-1.2-.6-.8.6-.9 1.3-.6 2.1 0 .3.2.5.4.7-1 1.2-2.8 1.6-3.1 3.4l-.7.7c-.6.7-1.7.9-2.4 1.6-.4.5-.4 1-.3 1.7-.4 2.3-.2 2.7 1.8 2.4l-.2.6v.1c-.4.6-.3 1.2 0 1.8.7 1.3 1.5 2.4 3.2 2.1h.2l.1.1.1.1c-1.2 1-1.1 2-.4 3 .8 1.2 1.1 2.4 1.4 3.7 1.2 1.5 2.2 3.1 4 4 3.2 2.1 3.5 9.1 12 10.2-.3-.8-1-1.4-.9-2l.7.6c.8.2 1.4 0 2-.5l.8-.4c.5-.3.6-.9.8-1.3l.7-.7v-1.2h.6c-.5-1-.3-3.3-.7-4.4 1.5-.5 1.2-2.6 2.6-3.1.9-.6.5-3.4.5-5.1l-.2-6v-.9s.1.4.4.5l.4-4.4c1.2-2.8 1.3-5.7 1.3-8.7 0-.7-.2-1.2-.2-1.2l-.2 1-.2-5.4-.5-.3c0-2.4-.8-5-2.6-6.2 0 0 .1-.3-.7-.7-.7-.3-4 0-4.3 0z" fill="#863b3b"/><path d="M340.4 68.9c-1.2-.2-2.1 1.3-3.4.6l-.3-.2-3 1.9-.7 2.5c.7 1.3.3 2-1.2 2v1.1c.6.5.6 1.2.5 2-1 1-.6 2.3-.7 3.4-.2 2-1 3.5-3 4.1 1.5 2.4 4.6 3.5 5.7 6.4l.7 1.8c1.3-1.5 1.9-3 1.1-5.1-.6-1.6.1-3 1.8-3.9.6 0 1.3-.3 1.7 0l.2-1.6c-1.1 0-1.2-.9-1.1-2-.4-.7-.4-1.3.6-1.3.5.3.8.8 1.2 1l.6-.3h-.2c-1-1.3-.8-2.8-.5-4 .6-2.8.5-5.6 0-8.4z"/></svg> diff --git a/src/art/vector/layers/Art_Vector_Fox_Tail.svg b/src/art/vector/layers/Art_Vector_Fox_Tail.svg new file mode 100644 index 0000000000000000000000000000000000000000..5784a7136298f1c6092150cbe919e17ed7509dd4 --- /dev/null +++ b/src/art/vector/layers/Art_Vector_Fox_Tail.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 560 1000"><path d="M331.1 473.6c-3.7.8-4.6 2.4-2.6 5.2 2.5 1.7 4.1 4.1 6.2 6.1a32 32 0 017.1 9.2l.7 1c1.1 1.1 2.3 2.5 3.7 3.1v.2c2.2 8.5 8 17 9 24.8.7 2.6 1 5.4 2.5 7.7h1v.3c-1.6 1.7-.8 4.1-1.6 6 0 3.2-1.2 6.7.6 10l.4.3c-.7.8-.4 1.6 0 2.6l-1.3 2.3c0 2.3-.5 4.6-.5 7-.2 1.4-.4 2.7 0 4v.5c0 2.5.5 5 1 7.3-1 1.8.6 3.7-.4 5.7 2.5 4 1.2 8.7 2.5 13.1l8.5 31.8h.2a21.4 21.4 0 00.8 7.2c3.6 10.8 2.8 23 8.2 33.5 1.7 8.2 4.6 16.3 8.2 24l1.9 1.6a9.9 9.9 0 001.6 5c1.3 2.3 4.4 3.2 6.9 3.4 1 .8 2.3.8 2.6 4.1.4 3.3 3.3 4.6 7 7.7.6.4.4.7.4 1.2.2 5.2 3.3 8.4 7.6 10.7 1.5 2.6 4.2 4.9 6 4.9 1.7 2.1 4.3 2.1 6.3 3.1.5 3.3 1.6 2.8 2.1 3.8 1.2 2.3 4.3 3.3 6.6 4.7.3 2.8 3.3 2.2 4.6 3.8 2.5 1.3 4.6 3.3 7.7 2.5h.4c1.6 2.1 3.9 2.1 6.5 1.1v.5c.7 1.3 2 1.7 3.3 1.7 1 1.6 2.5 2 4.3 1.5 19.2-.9 37.8-22.7 36.6-40 .7-2.4-1.6-4-2-6l-1.6-2.3-1 .1-4.8-3.3c0-1.1 0-2.3-.6-3.2-1.5-1.5-1.2-4.3-3.5-5-.1-1.6-2-2.6-3.4-3.3-.3-1.4-1.5-2.8-.7-4.2l-.1-1.3c-2.3-2-4.6-6.6-5.5-7.1-1-1-2.4-1.8-.6-3 1.6-1.1-5.6-8.7-8.6-11 1.9-.1-.6-3.8-.6-5.2l-.7-1.7-1.8-1.6c-.8-1-.6-2.6-2.1-3.1l-1-1.5-.6-.8c-.5-1.5-.2-3.3-2-4.1-1.3-1.4 0-2.7 0-3.8-3.1-2.2-1.2-6.1-3.3-8.6l-.3-.8c-1.7-1.6-2-4.1-2.5-6.2l-.8-3c-.3-1.1-.2-2.3-.3-3.3 0-1.3-.4-2.6 0-3.8.3-1.3.3-2.4-.2-3.6v-.1c.3-.9.2-1.8 0-2.8l-1.7-5.6-1.3-6-1-.7c.4-5.3-3-10.6-3.6-15a9.4 9.4 0 00-2.8-5.6c-.6-7.2-10.8-34.5-15.6-34.5v-.5a8.2 8.2 0 00-.8-1.8c-3.3-5.6-7.5-10.5-10.2-16.4-.6-1.6-2.1-3.3-3.8-4.4a29 29 0 01-6.9-7.6c-10.3-13.5-12.6-8.9-15-13.5-3.4-4-11-8.2-12.6-8.5-3.7-.7-3-2.8-4.4-3.5-2.6-1.1-5-2.4-7.9-2.8-4.9-2-10.3-.6-15-2.4-5.3-.3-11-1.7-15.5-1.7z" fill="#863b3b"/><path d="M494 699.5l-.9.1c-1.1 2.2-3.4-.5-5 1.7 3.2 2 8 4 2.2 8.5 0 1.3-.5 1.7-1.6.7-1-.9-1.7-2.5-3.5-2.2l.7 2.7c0 .8-.5.3-.8.3-3.7 0-3.3 2.8-3.8 5 0 0-.3 0-.5-.2-4 2.2-4 2.2-2.6 4.4 1.3 2.4-.5 4-1.2 6l.2.9c-1.8.3-3.3.6-1.7 3.1 1.3 2.3-1.1 1-1.6 1.6v.5c-1.3.7-2.5-2-4-.5-.6 1-.3 1.9 0 2.8l-1 .4a5 5 0 002.9 3l2 1.2c.7 3.8-1.6 2.2-3.2 1.8l-2.1-1.3c-2.2 1-2.8 4.6-5.6 3.6-2.3-.6-3.1.7-4.3 1.9l-2 .6c1 1.7 2.7 2.1 4.5 1.7.3 3.9 4 1.4 5.6 3.2 1 .5 1.8.7 2.4.4.4.6 1.2.8 1.8 1 1.2 0 2.3-1.2 3.3-.9 0 1.2.7 2 1.7 2.8.8 1.2 4.4 2.7 5.5 1.3 1.7.5 3.2-.1 4.2-1.6.4 2.8 3.6 2.8 3.7 1.6 1 .7 2.2.5 3.3.4 1-.2 1.7-.7 2.2-1.5.4.8 1.6 0 1.8-.3 1 1.3 2.1 1.1 3 1.3l.6-.2.8.8c2.1.9 4.1 0 6-.6v.1c1.7 2.7 9.4.4 11.4-1 1-.8 2-1.8 2.1-3l1.2-.2c.7.6 1.6 1 2.3 1 4.1 0 6 .6 7.4-2.2 1.1-.3 1-.8.5-1.5.5-.1.8-.6 1-1.1 0-.7-.5-1.3-.2-2.1 1.2 0 2.3-.4 1.3-2.2-.6-1.6-3.3-2-4.4-3.3-1.8-1.6-2.2-4.6-3.8-6.4-1.3-1.3-3.3-1-4.6-2.1-1.8-1.5-2.1-7.2-5.3-6.6l-.3.2c0-1 0-2.2-.5-3.3-1.1-.3-2-.2-2.6.8-1-.1-3 1.5-2.1-1.5 0-1-.4-1.6-.9-2.4l-1.3-1.7c-1.6-.8-1.6-2.6-2-4-2 .4-4 1-4.4-1.7 1.5-1.5-3-3.5-4-3.5.6-2.4-1.7-4-2-6l-1.7-2.3z" fill="#eaeaea"/></svg> diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js index 77397c71d7eb8f5a1b1488bf1adb2a17361f9800..2e2b2f24c18820e9a5c1c5fe6248358faa5ba9ed 100644 --- a/src/data/backwardsCompatibility/datatypeCleanup.js +++ b/src/data/backwardsCompatibility/datatypeCleanup.js @@ -1508,7 +1508,7 @@ globalThis.ArcologyDatatypeCleanup = function() { V.drugsCost = Math.trunc(10000 / V.localEcon); V.rulesCost = Math.trunc(10000 / V.localEcon); V.modCost = Math.trunc(5000 / V.localEcon); - V.surgeryCost = Math.trunc(30000 / (V.localEcon * (V.PC.career === "medicine" ? 2 : 1))); + V.surgeryCost = Math.trunc(30000 / (V.localEcon * ((V.PC.career === "medicine" || V.PC.career === "medical assistant" || V.PC.career === "nurse") ? 2 : 1))); V.facilityCost = +V.facilityCost || 100; for (const school of App.Data.misc.schools.keys()) { diff --git a/src/descriptions/familySummaries.js b/src/descriptions/familySummaries.js index ab159c9683f975913b4ab4aed1bd3eada2c7c314..dd7b45d6fa77566f651aa9a7319ee3d47cf5cb11 100644 --- a/src/descriptions/familySummaries.js +++ b/src/descriptions/familySummaries.js @@ -387,7 +387,7 @@ App.Desc.family = (function() { if (areSisters(slave, V.PC) === 3 && slave.genes === "XX") { r.push(`${He} is`); if (halfSisters.length > 0) { - r.push(`<span class="lightgreen">is your half-${sister} along with ${slaveListToText(halfSisters)}.</span>`); + r.push(`<span class="lightgreen">your half-${sister} along with ${slaveListToText(halfSisters)}.</span>`); } else { r.push(`<span class="lightgreen">your half-${sister}.</span>`); } @@ -398,7 +398,7 @@ App.Desc.family = (function() { if (areSisters(slave, V.PC) === 3 && slave.genes === "XY") { r.push(`${He} is`); if (halfBrothers.length > 0) { - r.push(`<span class="lightgreen">is your half-${sister} along with ${slaveListToText(halfBrothers)})>>.</span>`); + r.push(`<span class="lightgreen">your half-${sister} along with ${slaveListToText(halfBrothers)}.</span>`); } else { r.push(`<span class="lightgreen">your half-${sister}.</span>`); } diff --git a/src/endWeek/economics/arcmgmt.js b/src/endWeek/economics/arcmgmt.js index 64e5a67637416d778bd47e55cd912fe639c764c7..daa8bb291e2b0c48333b28cde90accb90833a689 100644 --- a/src/endWeek/economics/arcmgmt.js +++ b/src/endWeek/economics/arcmgmt.js @@ -106,20 +106,20 @@ App.EndWeek.arcManagement = function() { V.ACitizens = V.lowerClass + V.middleClass + V.upperClass + V.topClass; if (V.cheatMode === 1 || V.debugMode === 1) { appendDiv(`${V.arcologies[0].prosperity} Prosperity | ${_FSScore} FS Score | ${_honeymoon} Honeymoon | ${_transportHub} Transporthub | ${_terrain} Terrain | ${_crime} Crime`); - appendDiv(`${_LSCD} Lower + Slave Class Demand | ${_SCD} Slave Class Demand | ${_slaveProductivity} Slave Productivity`); - appendDiv(`${_LCD} Lower Class Demand | ${_lowerClassP} LC Multiplier`); - appendDiv(`${_MCD} Middle Class Demand | ${_middleClassP} MC Multiplier`); - appendDiv(`${_UCD} Upper Class Demand | ${_upperClassP} UC Multiplier`); - appendDiv(`${_TCD} Top Class Demand | ${_topClassP} TC Multiplier`); + appendDiv(`${num(_LSCD)} Lower + Slave Class Demand | ${num(_SCD)} Slave Class Demand | ${num(_slaveProductivity)} Slave Productivity`); + appendDiv(`${num(_LCD)} Lower Class Demand | ${num(_lowerClassP)} LC Multiplier`); + appendDiv(`${num(_MCD)} Middle Class Demand | ${num(_middleClassP)} MC Multiplier`); + appendDiv(`${num(_UCD)} Upper Class Demand | ${num(_upperClassP)} UC Multiplier`); + appendDiv(`${num(_TCD)} Top Class Demand | ${num(_topClassP)} TC Multiplier`); } const percOfPop = (n) => Math.trunc((n / (V.ACitizens + V.ASlaves)) * 1000) / 10; appendDiv(`${V.arcologies[0].name} is home to the following:`); - appendDiv(`Citizens | ${V.ACitizens} | ${percOfPop(V.ACitizens)}%`); - appendDiv(`Lower Class Citizens | ${V.lowerClass} | ${percOfPop(V.lowerClass)}%`); - appendDiv(`Middle Class Citizens | ${V.middleClass} | ${percOfPop(V.middleClass)}%`); - appendDiv(`Upper Class Citizens | ${V.upperClass} | ${percOfPop(V.upperClass)}%`); - appendDiv(`Millionaires | ${V.topClass} | ${percOfPop(V.topClass)}%`); - appendDiv(`Slaves | ${V.ASlaves} | ${percOfPop(V.ASlaves)}%`); + appendDiv(`Citizens | ${num(V.ACitizens)} | ${percOfPop(V.ACitizens)}%`); + appendDiv(`Lower Class Citizens | ${num(V.lowerClass)} | ${percOfPop(V.lowerClass)}%`); + appendDiv(`Middle Class Citizens | ${num(V.middleClass)} | ${percOfPop(V.middleClass)}%`); + appendDiv(`Upper Class Citizens | ${num(V.upperClass)} | ${percOfPop(V.upperClass)}%`); + appendDiv(`Millionaires | ${num(V.topClass)} | ${percOfPop(V.topClass)}%`); + appendDiv(`Slaves | ${num(V.ASlaves)} | ${percOfPop(V.ASlaves)}%`); r = []; if (V.arcologies[0].FSSupremacistLawME === 1) { @@ -256,8 +256,7 @@ App.EndWeek.arcManagement = function() { r.push(`Food vendors are offered subsidized rent and operating expenses to set up shop in your arcology.`); } if (V.secExpEnabled > 0) { - if (V.SecExp.edicts.alternativeRents === 1) { - /* A silly policy*/ + if (V.SecExp.edicts.alternativeRents === 1) { // A silly policy r.push(`Your citizens are allowed to pay their rents in slaves rather than cash and a few financially challenged individuals make use of this.`); _rentMultiplier *= 0.95; const _movement = random(0, 3); @@ -411,8 +410,7 @@ App.EndWeek.arcManagement = function() { if (V.arcologies[0].prosperity < (V.rep / 100)) { r.push(`Your impressive reputation relative to ${V.arcologies[0].name}'s prosperity <span class="green">drives an increase in business.</span>`); _AWeekGrowth++; - } else if (V.rep > 18000) { - /* no growth penalty if PC is at high rep, no matter how high prosperity goes */ + } else if (V.rep > 18000) { // no growth penalty if PC is at high rep, no matter how high prosperity goes } else if (V.arcologies[0].prosperity > (V.rep / 60)) { r.push(`Your low reputation relative to ${V.arcologies[0].name}'s prosperity <span class="red">seriously impedes business growth.</span>`); _AWeekGrowth -= 2; @@ -530,7 +528,7 @@ App.EndWeek.arcManagement = function() { _AWeekGrowth--; } - /* deactivated with sec Exp as they are modifiers for the trade mechanic */ + // deactivated with sec Exp as they are modifiers for the trade mechanic if (V.secExpEnabled === 0) { if (V.terrain === "urban") { r.push(`Since your arcology is located in the heart of an urban area, its commerce is naturally vibrant.`); @@ -656,7 +654,6 @@ App.EndWeek.arcManagement = function() { let _popCap = menialPopCap(); let _menialSlaveValue = menialSlaveCost(); const {HeM, heM} = getPronouns(assistant.pronouns().market).appendSuffix('M'); - // <br> r.push(`Your <span class="bold">business assistant</span> manages the menial slave market.`); if (_menialSlaveValue <= 900 + V.assistant.market.aggressiveness) { /* BUY */ let _bulkMax = _popCap.value - V.menials - V.fuckdolls - V.menialBioreactors; @@ -1453,8 +1450,8 @@ App.EndWeek.arcManagement = function() { V.menials += _enslavedPC; V.NPCSlaves += _enslavedNPC; if (_enslaved > 1) { - appendDiv(`In total <span class="green">${_enslaved} lower class citizens</span> were enslaved for failing to pay their debts.`); - appendDiv(`<span class="green">You enslaved ${_enslavedPC}</span> of them while other debtholders in the arcology enslaved the remaining ${_enslavedNPC}.`); + appendDiv(`In total <span class="green">${num(_enslaved)} lower class citizens</span> were enslaved for failing to pay their debts.`); + appendDiv(`<span class="green">You enslaved ${num(_enslavedPC)}</span> of them while other debtholders in the arcology enslaved the remaining ${num(_enslavedNPC)}.`); } else { appendDiv(`<span class="green">As arcology owner you claimed the slave.</span>`); } @@ -1493,7 +1490,7 @@ App.EndWeek.arcManagement = function() { appendDiv(`<span class="red">Visitors is NaN, report this issue!</span>`); V.visitors = _oldVisitors; } - appendDiv(`<span class="green">${V.visitors} traders and tourists</span> visited your arcology this week.`); + appendDiv(`<span class="green">${num(V.visitors)} traders and tourists</span> visited your arcology this week.`); appendDiv(App.SecExp.propagandaEffects("enslavement").text); _enslaved += App.SecExp.propagandaEffects("enslavement").effect; @@ -1506,7 +1503,7 @@ App.EndWeek.arcManagement = function() { if (_weeklyRetiredMenials > 1) { _weeklyRetiredMenials = Math.trunc(_weeklyRetiredMenials); if (_weeklyRetiredMenials > 1) { - appendDiv(`<span class="red">${_weeklyRetiredMenials} of your menial slaves</span> retired as free citizens this week.`); + appendDiv(`<span class="red">${num(_weeklyRetiredMenials)} of your menial slaves</span> retired as free citizens this week.`); } else { appendDiv(`<span class="red">One of your menial slaves</span> retired as a free citizen this week.`); } @@ -1522,7 +1519,7 @@ App.EndWeek.arcManagement = function() { if (_weeklyRetiredNPCMenials > 1) { _weeklyRetiredNPCMenials = Math.trunc(_weeklyRetiredNPCMenials); if (_weeklyRetiredNPCMenials > 1) { - appendDiv(`<span class="red">${_weeklyRetiredNPCMenials} menial slaves</span> were retired as free citizens by other slave owners in your arcology this week.`); + appendDiv(`<span class="red">${num(_weeklyRetiredNPCMenials)} menial slaves</span> were retired as free citizens by other slave owners in your arcology this week.`); } else { appendDiv(`<span class="red">One menial slave</span> was retired as a free citizen by another slave owner in your arcology this week.`); } @@ -1554,7 +1551,7 @@ App.EndWeek.arcManagement = function() { V.menialDemandFactor -= _NPCSlavesSold; V.NPCSlaves = Math.trunc(_SCD * 1.6); if (_NPCSlavesSold > 1) { - appendDiv(`<span class="red">${_NPCSlavesSold}</span> slaves were sold by your inhabitants. They've got more than enough of them already.`); + appendDiv(`<span class="red">${num(_NPCSlavesSold)}</span> slaves were sold by your inhabitants. They've got more than enough of them already.`); } else if (_NPCSlavesSold > 0) { appendDiv(`<span class="red">One slave</span> was sold by your inhabitants. They've got more than enough of them already.`); } @@ -1564,7 +1561,7 @@ App.EndWeek.arcManagement = function() { V.menialDemandFactor -= _NPCSlavesSold; V.NPCSlaves = Math.trunc(_LSCD / _slaveProductivity); if (_NPCSlavesSold > 1) { - appendDiv(`<span class="red">${_NPCSlavesSold}</span> slaves were sold by your inhabitants. There was so little work that they failed to earn their keep.`); + appendDiv(`<span class="red">${num(_NPCSlavesSold)}</span> slaves were sold by your inhabitants. There was so little work that they failed to earn their keep.`); } else if (_NPCSlavesSold > 0) { appendDiv(`<span class="red">One slave</span> was sold by your inhabitants. There was so little work that it failed to earn its keep.`); } @@ -1575,7 +1572,7 @@ App.EndWeek.arcManagement = function() { V.menialDemandFactor -= _NPCSlavesSold; V.NPCSlaves -= _NPCSlavesSold; if (_NPCSlavesSold > 1) { - appendDiv(`<span class="red">${_NPCSlavesSold}</span> slaves were sold by your inhabitants. They've got more than enough of them already.`); + appendDiv(`<span class="red">${num(_NPCSlavesSold)}</span> slaves were sold by your inhabitants. They've got more than enough of them already.`); } else if (_NPCSlavesSold > 0) { appendDiv(`<span class="red">One slave</span> was sold by your inhabitants. They've got more than enough of them already.`); } @@ -1587,7 +1584,7 @@ App.EndWeek.arcManagement = function() { V.menialDemandFactor -= _NPCSlavesSold; V.NPCSlaves -= _NPCSlavesSold; if (_NPCSlavesSold > 1) { - appendDiv(`<span class="red">${_NPCSlavesSold}</span> were sold by your inhabitants. They saw an opportunity for profit.`); + appendDiv(`<span class="red">${num(_NPCSlavesSold)}</span> were sold by your inhabitants. They saw an opportunity for profit.`); } else if (_NPCSlavesSold > 0) { appendDiv(`<span class="red">One slave</span> was sold by your inhabitants. They saw an opportunity for profit.`); } @@ -1600,7 +1597,7 @@ App.EndWeek.arcManagement = function() { V.menialSupplyFactor -= _NPCSlavesBought; V.NPCSlaves += _NPCSlavesBought; if (_NPCSlavesBought > 1) { - appendDiv(`<span class="green">${_NPCSlavesBought} slaves</span> were bought by your inhabitants. They were too cheap to pass up on.`); + appendDiv(`<span class="green">${num(_NPCSlavesBought)} slaves</span> were bought by your inhabitants. They were too cheap to pass up on.`); } /* there's no way this ever ends up needing a 1 slave version*/ } } @@ -1630,12 +1627,12 @@ App.EndWeek.arcManagement = function() { const _intellectualDependencyEnslaved = Math.trunc(_LCImmigration * 0.25); _LCImmigration -= _intellectualDependencyEnslaved; _enslaved += _intellectualDependencyEnslaved; - r.push(`<span class="green">${_intellectualDependencyEnslaved} dumb immigrants</span> were enslaved for their own good.`); + r.push(`<span class="green">${num(_intellectualDependencyEnslaved)} dumb immigrants</span> were enslaved for their own good.`); } V.lowerClass += _LCImmigration; if (_LCImmigration > 1) { - r.push(`<span class="green">${_LCImmigration} lower class citizens</span> moved to your arcology.`); + r.push(`<span class="green">${num(_LCImmigration)} lower class citizens</span> moved to your arcology.`); } else if (_LCImmigration > 0) { r.push(`<span class="green">One lower class citizen</span> moved to your arcology.`); } @@ -1646,9 +1643,9 @@ App.EndWeek.arcManagement = function() { V.lowerClass -= _LCEmigration; _enslaved += _enslavedEmigrants; if (_LCEmigration > 1) { - r.push(`<span class="red">${_LCEmigration} lower class citizens</span> had no work and tried to leave your arcology.`); + r.push(`<span class="red">${num(_LCEmigration)} lower class citizens</span> had no work and tried to leave your arcology.`); if (_enslavedEmigrants > 1) { - r.push(`<span class="green">${_enslavedEmigrants} of them were enslaved instead.</span>`); + r.push(`<span class="green">${num(_enslavedEmigrants)} of them were enslaved instead.</span>`); } else if (_enslavedEmigrants > 0) { r.push(`<span class="green">One of them was enslaved instead.</span>`); } @@ -1664,7 +1661,7 @@ App.EndWeek.arcManagement = function() { V.menialSupplyFactor -= _NPCSlavesBought; V.NPCSlaves += _NPCSlavesBought; if (_NPCSlavesBought > 1) { - appendDiv(`<span class="green">${_NPCSlavesBought} slaves</span> were bought by your inhabitants. They did not have enough of them to satisfy their needs.`); + appendDiv(`<span class="green">${num(_NPCSlavesBought)} slaves</span> were bought by your inhabitants. They did not have enough of them to satisfy their needs.`); } else if (_NPCSlavesBought > 0) { appendDiv(`<span class="green">One slave</span> was bought by your inhabitants. They did not quite have enough of them to satisfy their needs.`); } @@ -1693,7 +1690,7 @@ App.EndWeek.arcManagement = function() { const _MCImmigration = Math.trunc((_MCD - V.middleClass) * (0.3 * _terrain)) + 1 + secExpImigrationBonus.effect; V.middleClass += _MCImmigration; if (_MCImmigration > 1) { - appendDiv(`<span class="green">${_MCImmigration} middle class citizens</span> moved to your arcology.`); + appendDiv(`<span class="green">${num(_MCImmigration)} middle class citizens</span> moved to your arcology.`); } else if (_MCImmigration > 0) { appendDiv(`<span class="green">One middle class citizen</span> moved to your arcology.`); } @@ -1702,7 +1699,7 @@ App.EndWeek.arcManagement = function() { const _MCEmigration = Math.trunc((V.middleClass - _MCD) * 0.4); V.middleClass -= _MCEmigration; if (_MCEmigration > 1) { - appendDiv(`<span class="red">${_MCEmigration} middle class citizens</span> left your arcology.`); + appendDiv(`<span class="red">${num(_MCEmigration)} middle class citizens</span> left your arcology.`); } else if (_MCEmigration > 0) { appendDiv(`<span class="red">One middle class citizen</span> left your arcology.`); } @@ -1731,7 +1728,7 @@ App.EndWeek.arcManagement = function() { const _UCImmigration = Math.trunc((_UCD - V.upperClass) * (0.3 * _terrain)) + 1 + secExpImigrationBonus.effect; V.upperClass += _UCImmigration; if (_UCImmigration > 1) { - appendDiv(`<span class="green">${_UCImmigration} upper class citizens</span> moved to your arcology.`); + appendDiv(`<span class="green">${num(_UCImmigration)} upper class citizens</span> moved to your arcology.`); } else if (_UCImmigration > 0) { appendDiv(`<span class="green">One upper class citizen</span> moved to your arcology.`); } @@ -1740,7 +1737,7 @@ App.EndWeek.arcManagement = function() { const _UCEmigration = Math.trunc((V.upperClass - _UCD) * 0.4); V.upperClass -= _UCEmigration; if (_UCEmigration > 1) { - appendDiv(`<span class="red">${_UCEmigration} upper class citizens</span> left your arcology.`); + appendDiv(`<span class="red">${num(_UCEmigration)} upper class citizens</span> left your arcology.`); } else if (_UCEmigration > 0) { appendDiv(`<span class="red">One upper class citizen</span> left your arcology.`); } @@ -1775,7 +1772,7 @@ App.EndWeek.arcManagement = function() { const _TCImmigration = Math.trunc((_TCD - V.topClass) * (0.3 * _terrain)) + 1 + secExpImigrationBonus.effect; V.topClass += _TCImmigration; if (_TCImmigration > 1) { - appendDiv(`<span class="green">${_TCImmigration} millionaires</span> moved to your arcology.`); /* Fat Cat? One-Percenter? */ + appendDiv(`<span class="green">${num(_TCImmigration)} millionaires</span> moved to your arcology.`); /* Fat Cat? One-Percenter? */ } else if (_TCImmigration > 0) { appendDiv(`<span class="green">One millionaire</span> moved to your arcology.`); } @@ -1784,7 +1781,7 @@ App.EndWeek.arcManagement = function() { const _TCEmigration = Math.trunc((V.topClass - _TCD) * 0.4) + 1; V.topClass -= _TCEmigration; if (_TCEmigration > 1) { - appendDiv(`<span class="red">${_TCEmigration} millionaires</span> left your arcology.`); + appendDiv(`<span class="red">${num(_TCEmigration)} millionaires</span> left your arcology.`); } else if (_TCEmigration > 0) { appendDiv(`<span class="red">One millionaire</span> left your arcology.`); } @@ -1815,12 +1812,12 @@ App.EndWeek.arcManagement = function() { V.citizenRetirementTrigger = 2; r.push(`You have enacted citizen retirement, the slaves of eligible age are granted freedom.`); if (_menialsRetirement > 1) { - r.push(`<span class="red">${_menialsRetirement} of your menial slaves</span> were retired.`); + r.push(`<span class="red">${num(_menialsRetirement)} of your menial slaves</span> were retired.`); } else if (_menialsRetirement > 0) { r.push(`<span class="red">One of your menial slaves</span> was retired.`); } if (_ASlavesRetirement > 1) { - r.push(`<span class="red">${_ASlavesRetirement} slaves</span> in your arcology were given a citizen retirement.`); + r.push(`<span class="red">${num(_ASlavesRetirement)} slaves</span> in your arcology were given a citizen retirement.`); } /* I could bother with a single slave retirement message, but that's never going to get used*/ } @@ -1874,7 +1871,7 @@ App.EndWeek.arcManagement = function() { r.push(`<span class="red">${capFirstChar(numberWithPluralOne(_expiration, "slave"))} died</span> due to the tough working conditions in your arcology.`); } if (_expirationPC > 1) { - r.push(`Of which <span class="red">${_expirationPC} were yours.</span>`); + r.push(`Of which <span class="red">${num(_expirationPC)} were yours.</span>`); } else if (_expirationPC > 0) { r.push(`<span class="red">One of them was yours.</span>`); } diff --git a/src/endWeek/economics/fsDevelopments.js b/src/endWeek/economics/fsDevelopments.js index cd87fc58e04b12e8b34a9b699b3ec398dc2c878a..78a3ab8d9547cfbeec017b63b501fb4d0af9fef0 100644 --- a/src/endWeek/economics/fsDevelopments.js +++ b/src/endWeek/economics/fsDevelopments.js @@ -290,7 +290,7 @@ App.EndWeek.FSDevelopments = function() { const FSDecoration = `${FS}Decoration`; r.push(FutureSocieties.arcSupport(FS)); if (arc[FS] < 0 && (FS !== "FSRestart" || arc.FSRestartDecoration !== 100)) { - r.push(removeFS("FS")); + r.push(removeFS(FS)); } else if (arc[FS] > arc[FSDecoration]) { arc[FS] = arc[FSDecoration]; } @@ -305,6 +305,10 @@ App.EndWeek.FSDevelopments = function() { } } + if (arc.FSChattelReligionist !== "unset" && arc.FSChattelReligionist >= V.FSLockinLevel) { + V.nicaea.announceable = 1; + } + App.UI.SlaveSummary.societyChanged(); App.Events.addNode(el, r, "div"); return el; diff --git a/src/endWeek/economics/reputation.js b/src/endWeek/economics/reputation.js index 1a31805abc4d44f9416b54ea7e5e075f539bb94a..66c3e8668376c8c6a44afdb57440fcdb5993ebf8 100644 --- a/src/endWeek/economics/reputation.js +++ b/src/endWeek/economics/reputation.js @@ -461,7 +461,7 @@ App.EndWeek.reputation = function() { if ( (V.PC.belly >= 1500) || - (V.PC.career === "escort" && V.PC.belly >= 500 && V.PC.preg > 0) + (V.PC.career === "escort" && V.PC.belly >= 500 && V.PC.preg > 0) // .belly? .clothing? ) { if (V.arcologies[0].FSRestart !== "unset") { if (V.arcologies[0].FSRestartDecoration === 100) { @@ -523,13 +523,25 @@ App.EndWeek.reputation = function() { } } - if (V.PC.career === "escort" && V.rep < 16000 - _enduringRep) { - r.push(`Society <span class="red">frowns</span> over being run by an ex-whore. The presence of porn of you on the net doesn't aid your reputation either.`); + if ((V.PC.career === "escort" || V.PC.career === "prostitute") && V.rep < 16000 - _enduringRep) { + r.push(`Society <span class="red">frowns</span> over being run by an ex-whore.`); + if (V.PC.career === "escort") { + r.push(`The presence of porn of you on the net doesn't aid your reputation either.`); + } repX(forceNeg(Math.min((V.rep * 0.05), 500)), "PCactions"); - } else if (V.PC.career === "escort") { + } else if (V.PC.career === "escort" || V.PC.career === "prostitute") { r.push(`Your reputation is so strong that society has accepted your previous endeavors despite how unusual it is for a prominent slaveowner to have once nearly been a slave.`); } - if (V.PC.career === "servant" && V.rep < 12000 - _enduringRep) { + if (V.PC.career === "child prostitute" && V.rep < 22000 - _enduringRep) { + r.push(`Society <span class="red">is mortified</span> over being run by a sex-addled child whore.`); + if (V.PC.visualAge < V.minimumSlaveAge) { + r.push(`The fact that you appear underage only makes the thought worse.`); + } + repX(forceNeg(Math.min((V.rep * 0.06), 500)), "PCactions"); + } else if (V.PC.career === "child prostitute") { + r.push(`Your reputation is so strong that society has finally accepted your previous life as a child whore.`); + } + if ((V.PC.career === "servant" || V.PC.career === "handmaiden" || V.PC.career === "child servant") && V.rep < 12000 - _enduringRep) { r.push(`Society <span class="red">frowns</span> over being run by an ex-`); if (V.PC.title === 1) { r.push(`butler,`); @@ -538,16 +550,28 @@ App.EndWeek.reputation = function() { } r.push(`despite how prominent their previous owner was.`); repX(forceNeg(Math.min((V.rep * 0.05), 500)), "PCactions"); - } else if (V.PC.career === "servant") { + } else if (V.PC.career === "servant" || V.PC.career === "handmaiden" || V.PC.career === "child servant") { r.push(`Your reputation is so strong that society has accepted your previous vocation despite how unusual it is for a prominent slaveowner to have once been nothing more than a lowly servant.`); } if (V.PC.career === "gang" && V.rep < 15000 - _enduringRep) { r.push(`Society <span class="red">frowns</span> over being run by an ex-gang leader, no matter how strong they might have been.`); repX(forceNeg(Math.min((V.rep * 0.05), 500)), "PCactions"); + } else if (V.PC.career === "hoodlum" && V.rep < 16000 - _enduringRep) { + r.push(`Society <span class="red">dislikes</span> being run by some low-life thug, no matter how much "street cred" they may have once held.`); + repX(forceNeg(Math.min((V.rep * 0.05), 500)), "PCactions"); + } else if (V.PC.career === "street urchin" && V.rep < 20000 - _enduringRep) { + r.push(`Society <span class="red">hates</span> being run by some homeless street rat; how you even managed to get this far baffles them.`); + repX(forceNeg(Math.min((V.rep * 0.06), 500)), "PCactions"); } else if (V.PC.career === "BlackHat" && V.rep < 15000 - _enduringRep) { r.push(`Society <span class="red">dislikes</span> being run by someone so capable of dredging up secrets, especially when they used to do it for the highest bidder.`); repX(forceNeg(Math.min((V.rep * 0.05), 500)), "PCactions"); - } else if (V.PC.career === "gang" || V.PC.career === "BlackHat") { + } else if (V.PC.career === "hacker" && V.rep < 16000 - _enduringRep) { + r.push(`Society <span class="red">dislikes</span> being run by someone so capable of dredging up secrets, especially when they do it for fun.`); + repX(forceNeg(Math.min((V.rep * 0.05), 500)), "PCactions"); + } else if (V.PC.career === "script kiddy" && V.rep < 18000 - _enduringRep) { + r.push(`Society <span class="red">dislikes</span> being run by someone with such a reckless and disruptive idea of fun.`); + repX(forceNeg(Math.min((V.rep * 0.05), 500)), "PCactions"); + } else if (V.PC.career === "gang" || V.PC.career === "hoodlum" || V.PC.career === "street urchin" || V.PC.career === "BlackHat" || V.PC.career === "hacker" || V.PC.career === "script kiddy") { r.push(`Your reputation is strong enough that society has come to accept your background as part of your image.`); } diff --git a/src/endWeek/reports/brothelReport.js b/src/endWeek/reports/brothelReport.js index cf79c57d336cd6dae081c13879a78750954e9229..f22c8e70c04629c803d0bf26f350852aa042d5ec 100644 --- a/src/endWeek/reports/brothelReport.js +++ b/src/endWeek/reports/brothelReport.js @@ -48,6 +48,7 @@ App.EndWeek.brothelReport = function() { FLsFetish = 1; S.Madam.fetishKnown = 1; S.Madam.fetish = "dom"; + S.Madam.fetishStrength = 10; } } else if (S.Madam.fetishKnown === 0) { FLsFetish = 1; diff --git a/src/endWeek/reports/cellblockReport.js b/src/endWeek/reports/cellblockReport.js index 59cb643ca983ff9bd89c214f37f78c67ad1b7bc6..344449e1a79ebfbf151da80bfde3b644d7f78959 100644 --- a/src/endWeek/reports/cellblockReport.js +++ b/src/endWeek/reports/cellblockReport.js @@ -48,6 +48,7 @@ App.EndWeek.cellblockReport = function() { FLsFetish = 1; S.Wardeness.fetishKnown = 1; S.Wardeness.fetish = "sadist"; + S.Wardeness.fetishStrength = 10; } } else if (S.Wardeness.fetishKnown === 0) { FLsFetish = 1; diff --git a/src/endWeek/reports/clinicReport.js b/src/endWeek/reports/clinicReport.js index 1073e82bd91a11b3d3d83b25b25235fdbf49a94e..9366fb523ede2bf98ee03d5ea15d2e63ca9956b7 100644 --- a/src/endWeek/reports/clinicReport.js +++ b/src/endWeek/reports/clinicReport.js @@ -36,6 +36,7 @@ App.EndWeek.clinicReport = function() { FLsFetish = 1; S.Nurse.fetishKnown = 1; S.Nurse.fetish = "dom"; + S.Nurse.fetishStrength = 10; } } else if (S.Nurse.fetishKnown === 0) { FLsFetish = 1; diff --git a/src/endWeek/reports/clubReport.js b/src/endWeek/reports/clubReport.js index 65f83a2e2a94bd4fbbdd018cb73b9b0e7f861364..20230974547efcf4c18b711374ac24cbfb11b640 100644 --- a/src/endWeek/reports/clubReport.js +++ b/src/endWeek/reports/clubReport.js @@ -39,6 +39,7 @@ App.EndWeek.clubReport = function() { FLsFetish = 1; S.DJ.fetishKnown = 1; S.DJ.fetish = "humiliation"; + S.DJ.fetishStrength = 10; } } else if (S.DJ.fetishKnown === 0) { FLsFetish = 1; diff --git a/src/endWeek/reports/dairyReport.js b/src/endWeek/reports/dairyReport.js index c6a0bbb2c4d51483ea5c318c66a7707770a27b71..6c67054e3d8079ba0b358a3989270abe2c22d193 100644 --- a/src/endWeek/reports/dairyReport.js +++ b/src/endWeek/reports/dairyReport.js @@ -138,6 +138,7 @@ App.EndWeek.dairyReport = function() { FLsFetish = 1; S.Milkmaid.fetishKnown = 1; S.Milkmaid.fetish = "boobs"; + S.Milkmaid.fetishStrength = 10; } } else if (S.Milkmaid.fetishKnown === 0) { FLsFetish = 1; @@ -152,6 +153,7 @@ App.EndWeek.dairyReport = function() { FLsFetish = 3; S.Milkmaid.fetishKnown = 1; S.Milkmaid.fetish = "cumslut"; + S.Milkmaid.fetishStrength = 10; } } else if (S.Milkmaid.fetishKnown === 0) { FLsFetish = 3; @@ -166,6 +168,7 @@ App.EndWeek.dairyReport = function() { FLsFetish = 5; S.Milkmaid.fetishKnown = 1; S.Milkmaid.fetish = "pregnancy"; + S.Milkmaid.fetishStrength = 10; } } else if (S.Milkmaid.fetishKnown === 0) { FLsFetish = 5; diff --git a/src/endWeek/reports/farmyardReport.js b/src/endWeek/reports/farmyardReport.js index 10b7d475f9df6da16eb4d6e515ab7acfcab0321a..5f9d59c893af2354942d32591a0a819d98103729 100644 --- a/src/endWeek/reports/farmyardReport.js +++ b/src/endWeek/reports/farmyardReport.js @@ -109,6 +109,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() { if (fetishChangeChance(slave) > jsRandom(0, 100)) { slave.fetishKnown = 1; slave.fetish = 'dom'; + slave.fetishStrength = 10; return 1; } } else if (!slave.fetishKnown) { diff --git a/src/endWeek/reports/schoolroomReport.js b/src/endWeek/reports/schoolroomReport.js index e6854c231a8798b2399dfb0a54523d9c40e24ab6..0ab52049ad6c993797135a5b446f028dec7d73ed 100644 --- a/src/endWeek/reports/schoolroomReport.js +++ b/src/endWeek/reports/schoolroomReport.js @@ -39,6 +39,7 @@ App.EndWeek.schoolroomReport = function() { FLsFetish = 1; S.Schoolteacher.fetishKnown = 1; S.Schoolteacher.fetish = "dom"; + S.Schoolteacher.fetishStrength = 10; } } else if (S.Schoolteacher.fetishKnown === 0) { FLsFetish = 1; diff --git a/src/endWeek/reports/servantsQuartersReport.js b/src/endWeek/reports/servantsQuartersReport.js index 3e09cb8b1a2139fb4d3e355003cbc49cd8185f7b..a429906ac1e9c76fcf0be0f4e383a4925508bd72 100644 --- a/src/endWeek/reports/servantsQuartersReport.js +++ b/src/endWeek/reports/servantsQuartersReport.js @@ -33,6 +33,7 @@ App.EndWeek.servantsQuartersReport = function() { FLsFetish = 1; S.Stewardess.fetishKnown = 1; S.Stewardess.fetish = "dom"; + S.Stewardess.fetishStrength = 10; } } else if (S.Stewardess.fetishKnown === 0) { FLsFetish = 1; diff --git a/src/endWeek/reports/spaReport.js b/src/endWeek/reports/spaReport.js index 2e70f4714f460f9e08203710701e3c58f457cb3d..d0d4f0770c1b3f351f57f31453f46ce16c9829fb 100644 --- a/src/endWeek/reports/spaReport.js +++ b/src/endWeek/reports/spaReport.js @@ -35,6 +35,7 @@ App.EndWeek.spaReport = function() { FLsFetish = 1; S.Attendant.fetishKnown = 1; S.Attendant.fetish = "submissive"; + S.Attendant.fetishStrength = 10; } } else if (S.Attendant.fetishKnown === 0) { FLsFetish = 1; diff --git a/src/endWeek/saClothes.js b/src/endWeek/saClothes.js index bf925dfc8df15fe35d7c4b68fc87a66406214d2f..914f95a5d114e439633608ac242b6f5e80834ffd 100644 --- a/src/endWeek/saClothes.js +++ b/src/endWeek/saClothes.js @@ -87,6 +87,7 @@ App.SlaveAssignment.clothes = (function() { function clothingEffects(slave) { switch (slave.clothes) { case "no clothing": + case "body oil": if (slave.devotion >= -20) { if (slave.fetish === "humiliation" && slave.fetishKnown === 0) { r.push(`${He} pretends to be embarrassed by ${his} nudity but seems to get off on it. <span class="lightcoral">${He}'s into humiliation.</span>`); @@ -273,9 +274,17 @@ App.SlaveAssignment.clothes = (function() { break; default: if (slave.devotion <= 20) { - r.push(`${He} is <span class="mediumorchid">inappropriately proud</span> of the nice clothes ${he}'s wearing, <span class="mediumaquamarine">building ${his} confidence.</span>`); + if (App.Data.clothes.get(slave.clothes).exposure === 0) { + r.push(`${He} is <span class="mediumorchid">inappropriately proud</span> of the modest clothes ${he}'s wearing; their decency <span class="mediumaquamarine">rapidly building ${his} confidence.</span>`); + slave.trust += 7; + } else if (App.Data.clothes.get(slave.clothes).exposure === 1) { + r.push(`${He} is <span class="mediumorchid">inappropriately proud</span> of the nice clothes ${he}'s wearing; their relative decency <span class="mediumaquamarine">building ${his} confidence.</span>`); + slave.trust += 5; + } else if (App.Data.clothes.get(slave.clothes).exposure <= 3) { + r.push(`${He} is <span class="mediumorchid">inappropriately proud</span> of the nice clothes ${he}'s wearing, <span class="mediumaquamarine">building ${his} confidence.</span>`); + slave.trust += 3; + } slave.devotion -= 5; - slave.trust += 3; } else if (slave.fetish === "boobs" && slave.clothes === "a monokini") { if (slave.fetishKnown === 0) { r.push(`${He} pretends to be embarrassed by how ${his} monokini draws attention to ${his} breasts but <span class="hotpink">seems to get off on it.</span>`); @@ -287,7 +296,7 @@ App.SlaveAssignment.clothes = (function() { r.push(`${He} pretends to be embarrassed by ${his} clearly exposed breasts but <span class="hotpink">secretly gets off on it.</span>`); slave.devotion += 1; } - } else if (slave.fetish === "humiliation" && setup.humiliatingClothes.includes(slave.clothes)) { + } else if (slave.fetish === "humiliation" && App.Data.clothes.get(slave.clothes).exposure === 3) { if (slave.fetishKnown === 0) { r.push(`${He} pretends to be embarrassed by ${his} extremely revealing clothing but seems to get off on it. <span class="lightcoral">${He}'s into humiliation.</span>`); slave.fetishKnown = 1; @@ -324,7 +333,7 @@ App.SlaveAssignment.clothes = (function() { // humiliating clothing effects if (slave.fetishKnown === 0 || slave.fetish === "none") { - if (setup.humiliatingClothes.includes(slave.clothes)) { + if (App.Data.clothes.get(slave.clothes).exposure === 3) { if (fetishChangeChance(slave) > jsRandom(0, 100)) { r.push(`Surprisingly, ${he} takes to ${his} extremely revealing clothing, and gets an obvious thrill from it. <span class="lightcoral">${He}'s become a humiliation fetishist!</span>`); slave.fetish = "humiliation"; diff --git a/src/endWeek/saRelationships.js b/src/endWeek/saRelationships.js index ed45109b57e076010e0767e6109d44058c11aa2a..b470976241be7c412c0e9e48b513318cae0fd459 100644 --- a/src/endWeek/saRelationships.js +++ b/src/endWeek/saRelationships.js @@ -8,7 +8,6 @@ App.SlaveAssignment.relationships = (function() { let playerPronouns; let PC; - let friend; return saRelationships; @@ -346,6 +345,7 @@ App.SlaveAssignment.relationships = (function() { * */ function existingRelationship(slave) { + let friend; let him2, his2, wife2; if (slave.relationship > 0) { friend = getSlave(slave.relationshipTarget); @@ -454,6 +454,7 @@ App.SlaveAssignment.relationships = (function() { case Job.QUARTER: r.push(`${He} is <span class="devotion inc">happy</span> to be allowed to live ${his} life close to you, since ${he}'s your ${wife}. In addition, ${his} deep reliance on ${his} formal relationship to you produces a steady increase of both <span class="devotion inc">devotion</span> and <span class="trust inc">trust.</span>`); slave.devotion += 2; + slave.trust += 2; break; case Job.WHORE: case Job.BROTHEL: @@ -554,7 +555,9 @@ App.SlaveAssignment.relationships = (function() { } } } else if (slave.rules.relationship === "restrictive" && slave.relationship !== 5) { - if (friend.rules.relationship === "restrictive") { + if (disobedience(friend) > random(0, 100)) { + r.push(`${friend.slaveName} knows ${slave.slaveName} isn't allowed to be in a relationship with ${him2}, but keeps seeing ${him} anyway.`); + } else { r.push(`Since the rules forbid the relationship between ${slave.slaveName} and ${friend.slaveName}, they are <span class="relationship dec">forced apart.</span>`); if (slave.relationship > 1) { slave.relationship--; @@ -578,7 +581,9 @@ App.SlaveAssignment.relationships = (function() { } } } else if (slave.rules.relationship === "just friends" && slave.relationship !== 5 && slave.relationship > 2) { - if (friend.rules.relationship === "restrictive") { + if (disobedience(friend) > random(0, 100)) { + r.push(`${friend.slaveName} knows ${slave.slaveName} isn't allowed to be in a sexual relationship with ${him2}, but keeps fucking ${him} anyway.`); + } else { r.push(`Since the sexual relationship between ${slave.slaveName} and ${friend.slaveName} is against the rules, they`); if (!hasAnyArms(slave) && !hasAnyArms(friend)) { r.push(`are, metaphorically speaking,`); diff --git a/src/events/RETS/reTopExhaustion.js b/src/events/RETS/reTopExhaustion.js index ffdbb142994ac96e8933c3420f52ab14804b298c..4db34abde09ced7cc20d6439fb803f3a20ac8125 100644 --- a/src/events/RETS/reTopExhaustion.js +++ b/src/events/RETS/reTopExhaustion.js @@ -62,7 +62,7 @@ App.Events.RETSTopExhaustion = class RETSTopExhaustion extends App.Events.BaseEv let t = []; t.push(`As you stroll past the best part of the slave living area one evening, you hear a lewd slap, slap, slap coming from the room`); - t.push(App.UI.DOM.combineNodes(App.UI.DOM.slaveDescriptionDialog(subSlave))); + t.push(App.UI.DOM.slaveDescriptionDialog(subSlave)); t.push(`and`); t.push(contextualIntro(subSlave, domSlave, "DOM")); t.push(`share. It's quite obvious what they're up to, but you look in anyway. ${subSlave.slaveName} has clearly had a long day, and is tired, but ${he}'s being a good ${subSlave.relationship > 4 ? `${wife}` : `lover`} and letting ${domSlave.slaveName} use ${his} body. ${subSlave.slaveName} is lying`); diff --git a/src/events/eventUtils.js b/src/events/eventUtils.js index 6a117d3f283b325621417b3d09bd237fd7d42943..b8a9df8934acf8860d3ed8b22d143739862bb0ac 100644 --- a/src/events/eventUtils.js +++ b/src/events/eventUtils.js @@ -1,5 +1,5 @@ App.Events.drawEventArt = (function() { - const validSingleOutfits = App.Data.slaveWear.niceClothes.map(c => c.value).concat(App.Data.slaveWear.harshClothes.map(c => c.value)); + const validSingleOutfits = Array.from(App.Data.clothes.keys()); /** draw event art, with the option to dress the slave in a particular way * @param {Node} node - DOM node to attach art to diff --git a/src/events/intro/initNationalities.js b/src/events/intro/initNationalities.js index 6e4149d3a94b4be91266c3c1253efe31b40e6694..491a310a163420291102d36146a0ccb0a4a225a8 100644 --- a/src/events/intro/initNationalities.js +++ b/src/events/intro/initNationalities.js @@ -116,34 +116,34 @@ App.Intro.initNationalities = function() { break; case "prostitute": V.trinkets.push("a nude pinup of you from the brothel you used to work in"); - // tattoo "You have your ID number from your days as a prostitute tattooed on your left breast." + V.PC.boobsTat = "You have your ID number from your days as a prostitute tattooed on your left breast."; break; case "child prostitute": V.trinkets.push("a pair of your used underwear"); - // tattoo "You have your ID number from your days as a prostitute tattooed on your left breast." + V.PC.boobsTat = "You have your ID number from your days as a prostitute tattooed on your left breast."; break; case "servant": V.trinkets.push("a framed picture of your late Master"); - // tattoo "You have your Master's brand tattooed on your left breast."; + V.PC.boobsTat = "You have your Master's brand tattooed on your left breast."; break; case "handmaiden": V.trinkets.push("a framed picture of your late Master's family"); - // tattoo "You have your Master's brand tattooed on your left breast."; + V.PC.boobsTat = "You have your Master's brand tattooed on your left breast."; break; case "child servant": V.trinkets.push("a framed picture of your late Master patting your head"); - // tattoo "You have your Master's brand tattooed on your left breast."; + V.PC.boobsTat = "You have your Master's brand tattooed on your left breast."; break; case "gang": V.trinkets.push("your favorite handgun, whose sight has instilled fear in many"); break; case "hoodlum": V.trinkets.push("a hood ornament stolen from a fancy Old World vehicle"); - // tattoo "You have a tattoo denoting your gang affiliation on your neck." + V.PC.shoulderTat = "You have a tattoo denoting your gang affiliation on your neck."; break; case "street urchin": V.trinkets.push("your trusty knife, whose kept you safe many a night"); - // tattoo "You have a tattoo denoting your gang affiliation on your neck." + V.PC.shoulderTat = "You have a tattoo denoting your gang affiliation on your neck."; break; } diff --git a/src/events/intro/pcAppearance.js b/src/events/intro/pcAppearance.js index 96b5024ccaee1d0cc7e6bd95e6ca3d56a2f23e11..8eedb327acdc323eb60c5d9ba4ce27e493eae0d2 100644 --- a/src/events/intro/pcAppearance.js +++ b/src/events/intro/pcAppearance.js @@ -2,8 +2,8 @@ App.UI.Player = {}; App.UI.Player.appearance = function(options) { options.addOption("Your nationality is", "nationality", V.PC).showTextBox() - .addValueList(Object.keys(App.Data.SlaveSummary.short.nationality)) - .addComment("For best result capitalize it."); + .addValueList(App.Data.misc.baseNationalities) + .addComment("For best result capitalize it.").pulldown(); options.addOption("Your race is", "race", V.PC).showTextBox() .addValueList(Array.from(setup.filterRaces, (k => [k, k.toLowerCase()]))); @@ -14,11 +14,11 @@ App.UI.Player.appearance = function(options) { } options.addOption("Your skin tone is", "skin", V.PC).showTextBox() - .addValueList(makeAList(setup.naturalSkins)); + .addValueList(makeAList(App.Medicine.Modification.naturalSkins)); if (V.cheatMode) { options.addOption("Your genetic skin tone is", "origSkin", V.PC).showTextBox() - .addValueList(makeAList(setup.naturalSkins)); + .addValueList(makeAList(App.Medicine.Modification.naturalSkins)); } options.addOption("Your body", "markings", V.PC) diff --git a/src/facilities/bodyModification/bodyModification.js b/src/facilities/bodyModification/bodyModification.js index 682f9b9c50cfab76016516595779bca380b4291c..93e3be757f1c1fa864bbd37018aa0e28c5c1aa97 100644 --- a/src/facilities/bodyModification/bodyModification.js +++ b/src/facilities/bodyModification/bodyModification.js @@ -41,7 +41,7 @@ App.UI.bodyModification = function(slave, cheat = false) { function intro() { const el = new DocumentFragment(); App.UI.DOM.appendNewElement("h1", el, "Body Modification Studio"); - App.UI.DOM.appendNewElement("div", el, `${SlaveFullName(slave)} is lying strapped down on the table in your body modification studio. ${He} is entirely at your mercy.`); + App.UI.DOM.appendNewElement("div", el, `${SlaveFullName(slave)} is lying strapped down on the table in your body modification studio. ${He} is entirely at your mercy.`, "scene-intro"); return el; } diff --git a/src/facilities/farmyard/food/pFoodCrisis.tw b/src/facilities/farmyard/food/pFoodCrisis.tw index cbf28f977c7187b82d3a0ec4cec725be03061e2f..1e34af8d9ea6758b107226b09844e9c63a8186f7 100644 --- a/src/facilities/farmyard/food/pFoodCrisis.tw +++ b/src/facilities/farmyard/food/pFoodCrisis.tw @@ -4,9 +4,9 @@ <<set $nextButton = "Continue", $nextLink = "Random Nonindividual Event">> -<<if ($PC.skill.trading >= 100) || ($PC.career == "capitalist")>> +<<if ($PC.skill.trading >= 100) || ($PC.career == "capitalist" || $PC.career == "entrepreneur" || $PC.career == "business kid")>> <<set _price = 2500>> -<<elseif ($PC.skill.trading >= 50) || ($PC.career == "capitalist")>> +<<elseif ($PC.skill.trading >= 50) || ($PC.career == "capitalist" || $PC.career == "entrepreneur" || $PC.career == "business kid")>> <<set _price = 5000>> <<else>> <<set _price = 10000>> @@ -32,7 +32,7 @@ <<set $rations = 2>> <</replace>> <</link>> - <<if ($PC.skill.trading >= 50) || ($PC.career == "capitalist")>>//This will cost <<print cashFormat(_price*2)>> and some upkeep, @@.springgreen;reduced by your knowledge of trading@@//<<else>>//This will cost <<print cashFormat(_price*2)>> and incur significant upkeep costs//<</if>> + <<if ($PC.skill.trading >= 50) || ($PC.career == "capitalist" || $PC.career == "entrepreneur" || $PC.career == "business kid")>>//This will cost <<print cashFormat(_price*2)>> and some upkeep, @@.springgreen;reduced by your knowledge of trading@@//<<else>>//This will cost <<print cashFormat(_price*2)>> and incur significant upkeep costs//<</if>> <br><<link "Give them enough to survive on">> <<replace "#result">> You have your own problems to deal with, but that doesn't mean you don't look out for your own. You have a number of rationing stations set up throughout $arcologies[0].name and announce that each citizen is entitled to two full meals a day, just enough for your citizens not to starve. Your citizens are @@.green;happy@@ to hear that their leader is looking out for them. @@ -41,7 +41,7 @@ <<set $rations = 1>> <</replace>> <</link>> - <<if ($PC.skill.trading >= 50) || ($PC.career == "capitalist")>>//This will cost <<print cashFormat(_price)>> and some upkeep, @@.springgreen;reduced by your knowledge of trading@@//<<else>>//This will cost <<print cashFormat(_price)>> and incur significant upkeep costs//<</if>> + <<if ($PC.skill.trading >= 50) || ($PC.career == "capitalist" || $PC.career == "entrepreneur" || $PC.career == "business kid")>>//This will cost <<print cashFormat(_price)>> and some upkeep, @@.springgreen;reduced by your knowledge of trading@@//<<else>>//This will cost <<print cashFormat(_price)>> and incur significant upkeep costs//<</if>> <br><<link "They can figure their problem out on their own">> <<replace "#result">> You have your own problems to deal with, and you simply can't afford to drop everything and solve theirs at the moment. That you can't take care of your arcology's citizen @@.red;reflects poorly on you.@@ @@ -65,7 +65,7 @@ <<set $rations = 4>> <</replace>> <</link>> - <<if ($PC.skill.trading >= 50) || ($PC.career == "capitalist")>>//This will cost <<print cashFormat(_price*2)>> and some upkeep, @@.springgreen;reduced by your knowledge of trading@@//<<else>>//This will cost <<print cashFormat(_price*2)>> and incur significant upkeep costs//<</if>> + <<if ($PC.skill.trading >= 50) || ($PC.career == "capitalist" || $PC.career == "entrepreneur" || $PC.career == "business kid")>>//This will cost <<print cashFormat(_price*2)>> and some upkeep, @@.springgreen;reduced by your knowledge of trading@@//<<else>>//This will cost <<print cashFormat(_price*2)>> and incur significant upkeep costs//<</if>> <br><<link "Provide them with enough sustenance to survive on too">> <<replace "#result">> As much as you'd like to provide them with all of the food in the world, it simply is not feasible in your current situation. Therefore, you announce to the leaders that you will provide them only enough rations to live off of. The leaders understand, and are @@.green;pleased@@ to hear that you would provide for them at all. @@ -74,7 +74,7 @@ <<set $rations = 3>> <</replace>> <</link>> - <<if ($PC.skill.trading >= 50) || ($PC.career == "capitalist")>>//This will cost <<print cashFormat(_price)>> and some upkeep, @@.springgreen;reduced by your knowledge of trading@@//<<else>>//This will cost <<print cashFormat(_price)>> and incur significant upkeep costs//<</if>> + <<if ($PC.skill.trading >= 50) || ($PC.career == "capitalist" || $PC.career == "entrepreneur" || $PC.career == "business kid")>>//This will cost <<print cashFormat(_price)>> and some upkeep, @@.springgreen;reduced by your knowledge of trading@@//<<else>>//This will cost <<print cashFormat(_price)>> and incur significant upkeep costs//<</if>> <br><<link "Change your mind about giving out any rations at all">> <<replace "#result">> Having given the people rations at all was a mistake, you think to yourself. You have a great number of your own problems to deal with, and providing rations to everyone that can't afford food is putting an unnecessary strain on your own situation. With this is mind, you tell the leaders that you simply can't help them at this time, and have decided that you can't help anyone with food at all. The citizens are understandably @@.red;angry@@ that you would go back on your word. @@ -103,7 +103,7 @@ <<unset $rations>> <</replace>> <</link>> - <<if ($PC.skill.trading >= 50) || ($PC.career == "capitalist")>>//This will cost an initial investment of <<print cashFormat(_price*5)>>, @@.springgreen;reduced by your knowledge of trading@@//<<else>>//This will cost an initial investment of <<print cashFormat(_price*5)>>//<</if>> + <<if ($PC.skill.trading >= 50) || ($PC.career == "capitalist" || $PC.career == "entrepreneur" || $PC.career == "business kid")>>//This will cost an initial investment of <<print cashFormat(_price*5)>>, @@.springgreen;reduced by your knowledge of trading@@//<<else>>//This will cost an initial investment of <<print cashFormat(_price*5)>>//<</if>> <br><<link "Politely decline their offer, but continue giving them rations">> <<replace "#result">> Things have been going fairly well for you, but not //that// well — setting up an entirely new place to buy, sell, and store food would no doubt be an expensive undertaking. You tell the citizens that while you can't spare the resources to create a new market at the moment, you will honor your past agreement and continue giving them free rations. The people initially seem a bit disappointed that you don't seem to want to expand $arcologies[0].name, but are ultimately @@.green;glad@@ to hear that you'll continue taking care of them. @@ -112,7 +112,7 @@ <<set $rations = 5>> <</replace>> <</link>> - <<if ($PC.skill.trading >= 50) || ($PC.career == "capitalist")>>//This will cost <<print cashFormat(_price)>> and some upkeep, @@.springgreen;reduced by your knowledge of trading@@//<<else>>//This will cost <<print cashFormat(_price)>> and incur significant upkeep costs//<</if>> + <<if ($PC.skill.trading >= 50) || ($PC.career == "capitalist" || $PC.career == "entrepreneur" || $PC.career == "business kid")>>//This will cost <<print cashFormat(_price)>> and some upkeep, @@.springgreen;reduced by your knowledge of trading@@//<<else>>//This will cost <<print cashFormat(_price)>> and incur significant upkeep costs//<</if>> <br><<link "Turn down their offer and end rationing completely">> <<replace "#result">> While a new place to buy, sell, and store food in $arcologies[0].name would most likely come in quite handy in the future, you ultimately decide that you simply cannot spare the resources required. In fact, giving rations at all was a costly venture, and after not having seen any sort of return-on-investment, you decide that you are unable to continue giving out rations anymore. Your citizens are @@.red;angry@@ at the fact that you seem not to care about them at all, but that's their problem. diff --git a/src/facilities/fsDecoration.js b/src/facilities/fsDecoration.js index 0088928df73056fc9769fe78d265bfdcb8343a33..b937b06c90caf3aef67c299a4f7f0affdeb39164 100644 --- a/src/facilities/fsDecoration.js +++ b/src/facilities/fsDecoration.js @@ -242,7 +242,7 @@ App.UI.FSChangeDecoration = function(FS, items = []) { costs = 10000; el.append( App.UI.DOM.link( - `Station slaves in your arcology's public spaces to promote this goal`, + `Customize the exterior of the arcology to support this goal`, () => { V.arcologies[0][FSDecoration] = 100; cashX(forceNeg(costs), "capEx"); diff --git a/src/facilities/salon/salon.tw b/src/facilities/salon/salon.tw new file mode 100644 index 0000000000000000000000000000000000000000..07bb6f37df73148445f546bf7c0e95cc38fb42a3 --- /dev/null +++ b/src/facilities/salon/salon.tw @@ -0,0 +1,5 @@ +:: Salon [nobr jump-from-safe] + +<<set $nextButton = "Confirm changes", $nextLink = "Slave Interact", $encyclopedia = "The Auto Salon">> + +<<includeDOM App.UI.salon(getSlave($AS))>> \ No newline at end of file diff --git a/src/facilities/salon/salonPassage.js b/src/facilities/salon/salonPassage.js new file mode 100644 index 0000000000000000000000000000000000000000..20b0aab88504918ea0b801d8e069723acbcce54c --- /dev/null +++ b/src/facilities/salon/salonPassage.js @@ -0,0 +1,505 @@ +/** + * UI for the Salon. Refreshes without refreshing the passage. + * @param {App.Entity.SlaveState} slave + * @param {boolean} cheat if true, will hide scenes and keep the player from being billed for changes. + */ +App.UI.salon = function(slave, cheat = false) { + const container = document.createElement("span"); + container.id = "salon"; + const { + He, His, + he, his, him + } = getPronouns(slave); + Enunciate(slave); + + container.append(createPage()); + return container; + + function createPage() { + const el = new DocumentFragment(); + if (!cheat) { + if (V.seeImages > 0) { + App.Events.drawEventArt(el, slave); + } + el.append(intro()); + } + el.append(eyewear()); + el.append(ears()); + if (slave.horn !== "none") { + el.append(horns()); + } + el.append(hair()); + el.append(makeup()); + el.append(skin()); + el.append(bodyHair()); + return el; + } + + function intro() { + const el = new DocumentFragment(); + App.UI.DOM.appendNewElement("h1", el, "The Auto Salon"); + App.UI.DOM.appendNewElement("div", el, `${SlaveFullName(slave)} is seated in the auto salon. ${He} is awaiting your artistic pleasure.`, "scene-intro"); + return el; + } + + function eyewear() { + const el = new DocumentFragment(); + App.UI.DOM.appendNewElement("h3", el, "Eyewear"); + const r = []; + const options = new App.UI.OptionsGroup(); + + if (getBestVision(slave) === 0) { + r.push(`${He} is blind`); + } else if (anyVisionEquals(slave, 1)) { + r.push(`${He} is nearsighted`); + } else { + r.push(`${His} vision is normal`); + } + + const option = options.addOption(r.join(" "), "eyewear", slave) + .addValue("None", "none") + .addValue("Cosmetic glasses", "glasses", billMod); + if (getBestVision(slave) !== 0 && anyVisionEquals(slave, 1)) { + option.addValue("Corrective glasses", "corrective glasses", billMod); + option.addValue("Corrective glasses", "corrective glasses", billMod); + } else { + option.addValue("Blurring glasses", "blurring glasses", billMod); + option.addValue("Blurring glasses", "blurring glasses", billMod); + option.addComment("Blurring options are annoying and impede performance on some assignments."); + } + el.append(options.render()); + + el.append(App.Medicine.Modification.eyeSelector(slave, cheat)); + return el; + } + + function ears() { + const el = new DocumentFragment(); + App.UI.DOM.appendNewElement("h3", el, "Ears"); + const r = []; + const options = new App.UI.OptionsGroup(); + + if (slave.earImplant === 1) { + r.push(`${He} has artificial inner ear implants`); + } else if (slave.hears < -1) { + r.push(`${He} is deaf`); + } else if (slave.hears > -1) { + r.push(`${His} hearing is normal`); + } else { + r.push(`${He} is hearing impaired`); + } + const option = options.addOption(r.join(" "), "earwear", slave) + .addValue("None", "none"); + // Hard of hearing + if (slave.hears === -1 && slave.earImplant !== 1) { + option.addValue("Hearing aids", "hearing aids", billMod); + } + // Is not deaf + if (slave.hears > -2 || slave.earImplant === 1) { + option.addValue("Muffling ear plugs", "muffling ear plugs", billMod); + option.addValue("Deafening ear plugs", "deafening ear plugs", billMod); + } + el.append(options.render()); + + el.append(App.Medicine.Salon.ears(slave)); + + return el; + } + + function horns() { + const el = new DocumentFragment(); + App.UI.DOM.appendNewElement("h3", el, "Horns"); + const options = new App.UI.OptionsGroup(); + + const option = options.addOption(`Set the color of ${his} ${slave.horn}`, "hornColor", slave); + for (const hornColor of App.Medicine.Modification.hornColor) { + option.addValue(capFirstChar(hornColor), hornColor, billMod); + } + + el.append(options.render()); + + return el; + } + + function makeup() { + const el = new DocumentFragment(); + App.UI.DOM.appendNewElement("h3", el, "Makeup"); + const options = new App.UI.OptionsGroup(); + + options.addOption(App.Desc.makeup(slave), "makeup", slave) + .addValue("Nice", 1, billMod) + .addValue("Gorgeous", 2, billMod) + .addValue("Slutty", 4, billMod) + .addValue("Color-coordinate with hair", 3, billMod); + + options.addOption("", "makeup", slave) + .addValue("Neon", 5, billMod) + .addValue("Neon, color-coordinate with hair", 6, billMod); + + options.addOption("", "makeup", slave) + .addValue("Metallic", 7, billMod) + .addValue("Metallic, color-coordinate with hair", 8, billMod); + + el.append(options.render()); + + return el; + } + + function hair() { + const el = new DocumentFragment(); + let option; + App.UI.DOM.appendNewElement("h3", el, "Hair"); + const options = new App.UI.OptionsGroup(); + let title; + let showChoices = true; + const hasWig = (slave.bald === 1 && slave.hStyle !== "bald"); + + if (slave.bald === 1) { + if (slave.hStyle === "bald") { + title = `${He} is completely bald.`; + showChoices = false; + } else { + title = `${His} wig is ${slave.hColor}.`; + } + } else { + title = `${His} hair is ${slave.hColor}.`; + } + App.UI.DOM.appendNewElement("div", el, title); + + if (slave.bald === 1) { + options.addOption(`Use a wig`, "hStyle", slave) + .addValue("Enable", "neat").on() + .addValue("Disable", "bald").off(); + } + + if (showChoices) { + if (slave.hLength > 1) { + // Original color + if (cheat) { + option = options.addOption("Natural color", "origHColor", slave); + for (const color of App.Medicine.Modification.Color.Primary) { + option.addValue(capFirstChar(color.value), color.value, billMod); + } + option.pulldown(); + + options.addOption("") + .customButton( + "Sync body hair color", + () => { + slave.eyebrowHColor = slave.origHColor; + slave.pubicHColor = slave.origHColor; + slave.underArmHColor = slave.origHColor; + App.UI.reload(); + }, + "" + ); + } + // Color + option = options.addOption("Primary color", "hColor", slave); + if (slave.origHColor !== slave.hColor) { + option.addValue("Restore natural color", slave.origHColor, billMod); + } + for (const color of App.Medicine.Modification.Color.Primary) { + option.addValue(capFirstChar(color.value), color.value, billMod); + } + option.pulldown(); + + option = options.addOption("Secondary color", "hColor", slave); + for (const color of App.Medicine.Modification.Color.Secondary) { + option.addValue(color.title, (slave.hColor + color.value), billMod); + } + option.pulldown(); + } + // Style + if (slave.hLength > 1) { + title = `Style ${hasWig ? "wig" : "hair"} `; + } else { + title = `${His} ${hasWig ? "wig" : "hair"} is too short to style meaningfully`; + } + option = options.addOption(title, "hStyle", slave); + if (slave.hLength > 1) { + for (const style of App.Medicine.Modification.hairStyles.Normal) { + option.addValue(style.title, style.value, billMod); + } + option.pulldown(); + } + + // Style + Cut + if (slave.hLength > 1) { + option = options.addOption(`${hasWig ? "Change wig style and length" : "Cut and style hair"}`, "hStyle", slave); + if (slave.hLength > 1) { + for (const style of App.Medicine.Modification.hairStyles.Cut) { + option.addValue( + style.title, + style.value, + () => { + slave.hLength = style.hLength; + billMod(); + }); + } + } + } + + // 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) { + if ( + (style.hasOwnProperty("requirements") && !style.requirements(slave)) || + (style.hLength && style.hLength > slave.hLength) + ) { + continue; + } + option.addValue(style.title, style.hLength, billMod); + } + if (!slave.bald && slave.hLength < 150) { + option.addValue("Apply extensions", slave.hLength + 10, billMod); + } + } else { + option.addValue("Apply hair growth stimulating treatment", 1); + } + + option.showTextBox(); + + // Maintain + if (!hasWig) { + options.addOption(`Maintain this length`, "haircuts", slave) + .addValue("Enable", 1).on() + .addValue("Disable", 0).off(); + } + } + + el.append(options.render()); + return el; + } + + function skin() { + const el = new DocumentFragment(); + let r; + let option; + App.UI.DOM.appendNewElement("h3", el, "Skin"); + const options = new App.UI.OptionsGroup(); + let comment = []; + + if (cheat) { + option = options.addOption(`${His} natural skin color is`, "origSkin", slave).showTextBox().pulldown(); + for (const skin of App.Medicine.Modification.naturalSkins) { + option.addValue(capFirstChar(skin), skin, () => slave.skin = slave.origSkin); + } + } + + option = options.addOption(`${His} skin is ${slave.skin}.`, "skin", slave); + if (App.Medicine.Modification.dyedSkins.includes(slave.skin)) { + option.addValue("Remove coloring", slave.origSkin, billMod); + } else if ((slave.skin === "sun tanned") || (slave.skin === "spray tanned")) { + option.addValue("Remove tanning", slave.origSkin, billMod); + } + + if (!App.Medicine.Modification.dyedSkins.includes(slave.skin)) { + if (slave.skin === "sun tanned" || slave.skin === "spray tanned") { + comment.push(`${His} skin tanning must be removed before any advanced procedure to change ${his} skin color.`); + } else { + if (skinToneLevel(slave.skin) > 1) { + option.addValue("Bleach", changeSkinTone(slave.skin, -2), billMod); + } + if (skinToneLevel(slave.skin) > 8) { + option.addValue("Lighten", changeSkinTone(slave.skin, -1), billMod); + } + if (skinToneLevel(slave.skin) < 18) { + option.addValue("Darken", changeSkinTone(slave.skin, 1), billMod); + } + if (skinToneLevel(slave.skin) < 25) { + option.addValue("Blacken", changeSkinTone(slave.skin, 2), billMod); + } + } + if (slave.skin !== "sun tanned") { + if (skinToneLevel(slave.skin) < 6) { + comment.push(`${His} skin is so light in color that any attempt at natural tanning is more likely to damage ${his} skin.`); + } else if ((skinToneLevel(slave.skin) > 20)) { + comment.push(`${His} skin is so dark in color that any attempt at natural tanning is not likely to appear on ${his} skin.`); + } else { + option.addValue("Sun tan", "sun tanned", billMod); + } + } + if (slave.skin !== "spray tanned") { + option.addValue("Spray tan", "sun tanned", billMod); + } + option.addComment(comment.join(" ")); + } + + option = options.addOption(`Dye or paint`, "skin", slave); + for (const dye of App.Medicine.Modification.dyedSkins) { + option.addValue(capFirstChar(dye), dye, billMod); + } + + if (cheat) { + options.addOption(`${His} skin's marks are`, "markings", slave) + .addValueList([ + ["None", "none"], + ["Freckles", "freckles"], + ["Heavily freckled", "heavily freckled"], + ["Beauty mark", "beauty mark"], + ["Birthmark", "birthmark"], + ]); + } + option.pulldown(); + + if (slave.markings === "beauty mark") { + r = []; + r.push(`${He} has a prominent mole on ${his} face, which`); + if (slave.face > 40) { + r.push(`qualifies as a beauty mark and enhances ${his} attractiveness due to ${his} facial beauty.`); + } else if (slave.face < -10) { + r.push(`makes ${him} even less attractive.`); + } else { + r.push(`qualifies as a beauty mark since ${he}'s pretty, having no significant impact on ${his} beauty.`); + } + options.addOption(r.join(" "), "markings", slave) + .addValue("Remove it", "none", billMod); + } + if (slave.markings === "birthmark") { + r = []; + r.push(`${He} has a large birthmark, which`); + if (slave.prestige > 0 || slave.porn.prestige > 1) { + r.push(`enhances ${his} attractiveness due to ${his} prestige.`); + } else { + r.push(`detracts from ${his} attractiveness.`); + } + options.addOption(r.join(" "), "markings", slave) + .addValue("Bleach it", "none", billMod); + } + + el.append(options.render()); + + return el; + } + + function bodyHair() { + const el = new DocumentFragment(); + const options = new App.UI.OptionsGroup(); + let option; + let r = []; + App.UI.DOM.appendNewElement("h3", el, "Body hair"); + + // Eyebrows + if (slave.eyebrowHStyle !== "bald") { + // Describe and change color + r.push(`${His} eyebrows`); + if (slave.eyebrowHStyle === "shaved") { + r.push(`would be ${slave.eyebrowHColor} if present.`); + } else { + r.push(`are ${slave.eyebrowHColor}.`); + } + + option = options.addOption(r.join(" "), "eyebrowHColor", slave); + if (slave.eyebrowHColor !== slave.hColor) { + option.addValue("Match the hair", slave.hColor); + } + option.addValueList(makeAList(App.Medicine.Modification.Color.Primary.map(color => color.value))); + option.addCallbackToEach(billMod); + option.pulldown(); + + // Style + option = options.addOption(`Style ${his} eyebrow hair`, "eyebrowHStyle", slave); + for (const fullness of App.Medicine.Modification.eyebrowStyles) { + option.addValue(capFirstChar(fullness), fullness, billMod); + } + option.pulldown(); + + // Fullness + option = options.addOption(`Shape ${his} eyebrow hair`, "eyebrowFullness", slave); + for (const fullness of App.Medicine.Modification.eyebrowFullness) { + option.addValue(capFirstChar(fullness), fullness, billMod); + } + option.pulldown(); + } else { + options.addComment(`${His} eyebrows are completely hairless.`); + } + + // Pubic hair + const _pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY); + r = []; + const hasPubes = (slave.pubicHStyle !== "bald" && slave.pubicHStyle !== "hairless" && slave.physicalAge >= _pubertyAge - 1); + if (hasPubes) { + r.push(`${His}`); + if (slave.physicalAge < _pubertyAge) { + r.push(`wispy pubic hair, which is just starting to grow in,`); + } else if (slave.pubicHStyle === "in a strip") { + r.push(`pubic hair, which is shaved into a strip,`); + } else { + r.push(`${slave.pubicHStyle} pubic hair`); + } + if (slave.pubicHStyle === "waxed") { + r.push(`would be ${slave.pubicHColor} if present.`); + } else { + r.push(`is ${slave.pubicHColor}.`); + } + } else { + r.push(`${His} groin is completely hairless.`); + } + option = options.addOption(r.join(" "), "pubicHColor", slave); + if (hasPubes) { + if (slave.pubicHColor !== slave.hColor) { + option.addValue("Match the curtains", slave.pubicHColor); + } + option.addValueList(makeAList(App.Medicine.Modification.Color.Primary.map(color => color.value))) + .addCallbackToEach(billMod) + .pulldown(); + + // Style + option = options.addOption(`Style ${his} pubic hair`, "pubicHStyle", slave); + for (const fullness of App.Medicine.Modification.pubicStyles) { + option.addValue(capFirstChar(fullness), fullness, billMod); + } + option.pulldown(); + } + + // Armpit hair + r = []; + const hasPitHair = (slave.underArmHStyle !== "bald" && slave.underArmHStyle !== "hairless" && slave.physicalAge >= _pubertyAge - 1); + if (hasPitHair) { + r.push(`${His}`); + if (slave.physicalAge < _pubertyAge) { + r.push(`wispy underarm hair`); + } else { + r.push(`${slave.underArmHStyle} underarm hair`); + } + if (slave.underArmHStyle === "waxed") { + r.push(`would be ${slave.underArmHColor} if present.`); + } else { + r.push(`is ${slave.underArmHColor}.`); + } + } else { + r.push(`${His} underarms are completely hairless.`); + } + option = options.addOption(r.join(" "), "underArmHColor", slave); + if (hasPitHair) { + if (slave.underArmHColor !== slave.hColor) { + option.addValue("Match the hair", slave.hColor); + } + option.addValueList(makeAList(App.Medicine.Modification.Color.Primary.map(color => color.value))) + .addCallbackToEach(billMod) + .pulldown(); + + // Style + option = options.addOption(`Style ${his} armpit hair`, "underArmHStyle", slave); + for (const fullness of App.Medicine.Modification.armpitStyles) { + option.addValue(capFirstChar(fullness), fullness, billMod); + } + option.pulldown(); + } + + el.append(options.render()); + return el; + } + + function billMod() { + if (!cheat) { + cashX(forceNeg(V.modCost), "slaveMod", slave); + } + } + + function makeAList(iterable) { + return Array.from(iterable, (k => [capFirstChar(k), k])); + } +}; diff --git a/src/facilities/wardrobe/wardrobeShopping.js b/src/facilities/wardrobe/wardrobeShopping.js index c25b749e9cc0ed36c0033ca3664b8ba9fabc0e29..c1aa035e680c1476eb3d57537a7c0d7ffcdbdffb 100644 --- a/src/facilities/wardrobe/wardrobeShopping.js +++ b/src/facilities/wardrobe/wardrobeShopping.js @@ -7,10 +7,8 @@ App.UI.WardrobeShopping = function() { let r = []; r.push(`The room containing all the clothes and accessories you have available to dress your slaves in, as well as the supplies and tools your tailor needs to resize them to better fit your slaves. Several mirrors are set up for a slave to try on outfits should they be allowed to dress themselves. The selection includes`); - const ownItAll = ( - App.Data.slaveWear.niceClothes.every((i) => isItemAccessible.entry(i.value, "clothing")) && - App.Data.slaveWear.harshClothes.every((i) => isItemAccessible.entry(i.value, "clothing")) - ); + const ownItAll = Array.from(App.Data.clothes.keys()).every((key) => isItemAccessible.entry(key, "clothing")); + if (ownItAll) { r.push(`outfits from all manner of cultures and societies; not a single style eludes you.`); } else { diff --git a/src/gui/css/options.css b/src/gui/css/options.css index 7ce9fb2705cc625456d3c1fb5e887d9fd6954241..d1d13a5cda81a249638223a767af91562035cbf8 100644 --- a/src/gui/css/options.css +++ b/src/gui/css/options.css @@ -4,12 +4,6 @@ div.options-group { align-items: center; } -@media only screen and (min-width: 1600px) { - div.options-group.double { - grid-template-columns: max-content auto max-content auto; - } -} - /* left side */ div.options-group div.description { margin-right: 10px; @@ -77,18 +71,64 @@ div.options-group button.neutral:hover { div.options-group input { border: 2px solid var(--button-border-color); min-width: unset; /* remove SC styling */ - width: 140px; + width: 12em; + /* move back so that the outline of a potential select overlaps in front */ + position:relative; + z-index: 0; +} + +.options-group input:hover, .options-group input:focus { + /* show highlighted border in front of neighbours */ + z-index: 1 } div.options-group input.number { - width: 50px; + width: 4em; +} + +div.options-group input.full-width { + width: 100%; +} + +/* custom row */ +.options-group .custom-row { + grid-column-start: span 2; + width: 70vw +} + +.options-group select { + border: none; /* outline instead of border */ + /* left & right outline overlap each other so we don't have a double border */ + outline: solid 2px var(--button-border-color); + margin-left: 2px; + min-width: 12em; + /* move in front of a potential textbox, so the outline overlaps the border of the textbox */ + position: relative; + z-index: 1; +} + +.options-group select:hover { + outline: solid 2px #eee; +} + +/* double column */ +@media only screen and (min-width: 1600px) { + .options-group.double { + grid-template-columns: max-content auto max-content auto; + } + + .options-group.double .custom-row { + width: 35vw + } } +/* other */ .subHeading { width: 85%; text-align: center; margin-top: 1.5em; } + .scLink { width: 85%; text-align: center; @@ -104,8 +144,3 @@ table.invisible { border-spacing: 5px; margin:1em auto; } - -/* custom row */ -.options-group .custom-row { - grid-column-start: span 2; -} diff --git a/src/gui/options/descriptionOptions.js b/src/gui/options/descriptionOptions.js new file mode 100644 index 0000000000000000000000000000000000000000..6b4e0da08707ff4981c98a0cf8784a82d6660807 --- /dev/null +++ b/src/gui/options/descriptionOptions.js @@ -0,0 +1,70 @@ +App.UI.descriptionOptions = function() { + const f = document.createDocumentFragment(); + App.UI.DOM.appendNewElement("h1", f, "Description Options"); + + App.UI.DOM.appendNewElement("p", f, + "These options will affect both the long form description of each slave and the miniscenes available from the main menu.", + "scene-intro"); + + const options = new App.UI.OptionsGroup(); + + options.addOption("", "surnameOrder") + .addValue("Allow nationality name order", 0).customDescription("Order names ''based on country of origin''.") + .addValue("Force name surname", 1).customDescription("Names will always be ''Name Surname''.") + .addValue("Force surname name", 2).customDescription("Names will always be ''Surname Name''."); + + options.addOption("", "seeRace") + .addValue("Disable most mentions of race", 0).off() + .customDescription("Ethnicity will ''almost never'' be mentioned.") + .addValue("Enable mentions of race", 1).on().customDescription("Ethnicity will ''occasionally'' be mentioned."); + + options.addOption("", "seeNationality") + .addValue("Disable most mentions of nationality", 0).off() + .customDescription("Nationality will ''almost never'' be mentioned.") + .addValue("Enable mentions of nationality", 1).on() + .customDescription("Nationality will ''occasionally'' be mentioned."); + + options.addOption("The effects of implants are", "showImplantEffects") + .addValue("Shown", 1).on().addValue("Hidden", 0).off(); + + options.addOption("Clothing is mostly", "showClothing") + .addValue("Shown", 1).on().addValue("Hidden", 0).off(); + + options.addOption("Detailed slave age information is", "showAgeDetail") + .addValue("Shown", 1).on().addValue("Hidden", 0).off(); + + options.addOption("Approximate height is", "showHeightCMs") + .addValue("Shown", 1).on().addValue("Hidden", 0).off(); + + options.addOption("Cosmetic body mods are", "showBodyMods") + .addValue("Shown", 1).on().addValue("Hidden", 0).off(); + + options.addOption("Sexual histories are", "showSexualHistory") + .addValue("Shown", 1).on().addValue("Hidden", 0).off(); + + options.addOption("Attractiveness and Sexual scores are", "showScores") + .addValue("Shown", 1).on().addValue("Hidden", 0).off(); + + options.addOption("Volume, in CCs, of breasts is", "showBoobCCs") + .addValue("Shown", 1).on().addValue("Hidden", 0).off(); + + options.addOption("Height and length units are in", "showInches") + .addValueList([["Metric", 0], ["Both", 1], ["Imperial", 2]]); + + if (V.seeDicks > 0) { + options.addOption("Approximate sizes of dicks and balls are", "showDickCMs") + .addValue("Shown", 1).on().addValue("Hidden", 0).off(); + } + + options.addOption("Numbers are displayed as", "showNumbers") + .addValueList([["Integers", 2], ["Both", 1], ["Words", 0]]); + + if (V.showNumbers === 1) { + options.addOption("Only numbers up to $showNumbersMax are displayed as words", "showNumbersMax") + .addValue("Default (20)", 20).showTextBox(); + } + + App.UI.DOM.appendNewElement("p", f, options.render()); + + return f; +}; diff --git a/src/gui/options/descriptionOptions.tw b/src/gui/options/descriptionOptions.tw deleted file mode 100644 index b4b0c1a7075d5b046b65e1b92fdaf8ac4a4ede47..0000000000000000000000000000000000000000 --- a/src/gui/options/descriptionOptions.tw +++ /dev/null @@ -1,74 +0,0 @@ -:: Description Options [nobr jump-to-safe jump-from-safe] - -<<set $nextButton = "Back">> -<<if $storedLink !== "Slave Interact">> - <<if lastVisited("Slave Interact") === 1>> - <<set $storedLink = "Slave Interact">> - <<else>> - <<set $storedLink = "Options">> - <</if>> -<</if>> -<<set $nextLink = $storedLink>> - -<h1>Description Options</h1> - -//These options will affect both the long form description of each slave and the miniscenes available from the main menu.// - -<<set _options = new App.UI.OptionsGroup()>> - -<<run _options.addOption("", "surnameOrder") -.addValue("Allow nationality name order", 0).customDescription("Order names ''based on country of origin''.") -.addValue("Force name surname", 1).customDescription("Names will always be ''Name Surname''.") -.addValue("Force surname name", 2).customDescription("Names will always be ''Surname Name''.")>> - -<<run _options.addOption("", "seeRace") -.addValue("Disable most mentions of race", 0).off().customDescription("Ethnicity will ''almost never'' be mentioned.") -.addValue("Enable mentions of race", 1).on().customDescription("Ethnicity will ''occasionally'' be mentioned.")>> - -<<run _options.addOption("", "seeNationality") -.addValue("Disable most mentions of nationality", 0).off().customDescription("Nationality will ''almost never'' be mentioned.") -.addValue("Enable mentions of nationality", 1).on().customDescription("Nationality will ''occasionally'' be mentioned.")>> - -<<run _options.addOption("The effects of implants are", "showImplantEffects") -.addValue("Shown", 1).on().addValue("Hidden", 0).off()>> - -<<run _options.addOption("Clothing is mostly", "showClothing") -.addValue("Shown", 1).on().addValue("Hidden", 0).off()>> - -<<run _options.addOption("Detailed slave age information is", "showAgeDetail") -.addValue("Shown", 1).on().addValue("Hidden", 0).off()>> - -<<run _options.addOption("Approximate height is", "showHeightCMs") -.addValue("Shown", 1).on().addValue("Hidden", 0).off()>> - -<<run _options.addOption("Cosmetic body mods are", "showBodyMods") -.addValue("Shown", 1).on().addValue("Hidden", 0).off()>> - -<<run _options.addOption("Sexual histories are", "showSexualHistory") -.addValue("Shown", 1).on().addValue("Hidden", 0).off()>> - -<<run _options.addOption("Attractiveness and Sexual scores are", "showScores") -.addValue("Shown", 1).on().addValue("Hidden", 0).off()>> - -<<run _options.addOption("Volume, in CCs, of breasts is", "showBoobCCs") -.addValue("Shown", 1).on().addValue("Hidden", 0).off()>> - -<<run _options.addOption("Height and length units are in", "showInches") -.addValueList([["Metric", 0], ["Both", 1], ["Imperial", 2]])>> - - -<<if $seeDicks > 0>> <br> - <<run _options.addOption("Approximate sizes of dicks and balls are", "showDickCMs") - .addValue("Shown", 1).on().addValue("Hidden", 0).off()>> -<</if>> - - -<<run _options.addOption("Numbers are displayed as", "showNumbers") -.addValueList([["Integers", 2], ["Both", 1], ["Words", 0]])>> - -<<if $showNumbers === 1>> - <<run _options.addOption("Only numbers up to $showNumbersMax are displayed as words", "showNumbersMax") - .addValue("Default (20)", 20).showTextBox()>> -<</if>> - -<<includeDOM _options.render()>> diff --git a/src/gui/options/hotkeySettings.tw b/src/gui/options/hotkeySettings.tw deleted file mode 100644 index b1bf6388eacc1f4df01bd3ee5d965dceab84e39e..0000000000000000000000000000000000000000 --- a/src/gui/options/hotkeySettings.tw +++ /dev/null @@ -1,27 +0,0 @@ -:: Hotkey Settings [nobr jump-to-safe jump-from-safe] - -<<set $nextButton = "Back", $nextLink = "Main">> - -<h1>Hotkey Settings</h1> - -<p> - <ul> - <li> - On keyboard layouts other than the <a href="https://en.wikipedia.org/wiki/File:KB_United_States.svg" - target="_blank">US-QWERTY layout</a> there may be keys or combinations of keys where the recorded key is - different from the key used to listen to key events. You will have to find these keys yourself through trial - and error. - </li> - <li> - Custom hotkeys are browser specific and are not part of your save. - </li> - <li> - While we try not to overwrite browser or OS level key combinations it is possible to do so with custom - hotkeys. This also means that during recording of custom hotkeys no browser or OS level key combinations are - available. There are however keys that cannot be overwritten, the <code>Win key</code> on Windows is an - example for this. - </li> - </ul> -</p> - -<<includeDOM App.UI.Hotkeys.settings()>> diff --git a/src/gui/options/options.js b/src/gui/options/options.js index a8aafbcd3f844fc3df238d83117f9f22402ad0bf..a6ffd81760751d90cabb3ebeff05929bc7c4e08f 100644 --- a/src/gui/options/options.js +++ b/src/gui/options/options.js @@ -2,9 +2,8 @@ App.UI.OptionsGroup = (function() { class Row { /** * @param {HTMLDivElement} container - * @param {boolean} doubleColumn */ - render(container, doubleColumn) {} // jshint ignore:line + render(container) {} // jshint ignore:line } /** @@ -65,6 +64,17 @@ App.UI.OptionsGroup = (function() { return this; } + /** + * @param {Map} values + * @returns {Option} + */ + addValueMap(values) { + for (const [key, value] of values) { + this.addValue(key, value); + } + return this; + } + /** * @param {*} value * @param {number} compareValue @@ -79,14 +89,13 @@ App.UI.OptionsGroup = (function() { } /** - * @param {string} [unit] + * @param {Object} [params] + * @param {string} [params.unit] + * @param {boolean} [params.large=false] * @returns {Option} */ - showTextBox(unit) { - this.textbox = true; - if (unit) { - this.unit = unit; - } + showTextBox({unit, large = false} = {}) { + this.textbox = {unit: unit, large: large}; return this; } @@ -144,6 +153,14 @@ App.UI.OptionsGroup = (function() { return this; } + /** + * @param {Function} callback gets executed on every button click. Selected value is given as argument. + */ + addCallbackToEach(callback) { + this.valuePairs.forEach(pair => pair.callback = callback); + return this; + } + /** * Mark option as on to style differently. * @returns {Option} @@ -171,8 +188,14 @@ App.UI.OptionsGroup = (function() { return this; } + /** + * Puts the options in side a pulldown if there are at least 6. + * Not counting text boxes or comments. + * @returns {Option} + */ pulldown() { this.enablePulldown = true; + return this; } /** @@ -247,8 +270,8 @@ App.UI.OptionsGroup = (function() { buttonGroup.append(button); } } else { + let matchFound = false; let select = document.createElement("select"); - select.classList.add("rajs-list"); for (const value of this.valuePairs) { let el = document.createElement("option"); @@ -256,9 +279,13 @@ App.UI.OptionsGroup = (function() { el.value = value.value; if (this.object[this.property] === value.value) { el.selected = true; + matchFound = true; } select.appendChild(el); } + if (!matchFound) { + select.selectedIndex = -1; + } select.onchange = () => { const O = select.options[select.selectedIndex]; if (isNaN(Number(O.value))) { @@ -284,11 +311,15 @@ App.UI.OptionsGroup = (function() { if (isNumber) { textbox.classList.add("number"); } + if (this.textbox.large) { + textbox.classList.add("full-width"); + } buttonGroup.append(textbox); - if (this.unit) { - buttonGroup.append(" ", this.unit); + if (this.textbox.unit) { + buttonGroup.append(" ", this.textbox.unit); } } + if (this.comment) { const comment = document.createElement("span"); comment.classList.add("comment"); @@ -348,16 +379,10 @@ App.UI.OptionsGroup = (function() { /** * @param {HTMLDivElement} container - * @param {boolean}doubleColumn */ - render(container, doubleColumn) { + render(container) { /** @type {HTMLDivElement} */ const div = App.UI.DOM.makeElement("div", this.element, "custom-row"); - let factor = 0.7; - if (doubleColumn) { - factor *= 0.5; - } - div.style.width = `${Math.round(window.innerWidth * factor)}px`; container.append(div); } } diff --git a/src/gui/options/options.tw b/src/gui/options/options.tw deleted file mode 100644 index ca66ab0ffb92b01a2d5066879ccc78c592c88172..0000000000000000000000000000000000000000 --- a/src/gui/options/options.tw +++ /dev/null @@ -1,11 +0,0 @@ -:: Options [nobr jump-to-safe jump-from-safe] - -<<if lastVisited("Slave Interact") === 1>> - <<set $storedLink = "Slave Interact">> -<<else>> - <<set $storedLink = "Main">> -<</if>> - -<<set $nextButton = "Back", $nextLink = $storedLink, $encyclopedia = "How to Play">> - -<<includeDOM App.UI.optionsPassage()>> \ No newline at end of file diff --git a/src/gui/options/summaryOptions.tw b/src/gui/options/summaryOptions.tw deleted file mode 100644 index a5fcb72e82afd398b58281ee7dc2ec44b94d0462..0000000000000000000000000000000000000000 --- a/src/gui/options/summaryOptions.tw +++ /dev/null @@ -1,14 +0,0 @@ -:: Summary Options [nobr jump-to-safe jump-from-safe] - -<<set $nextButton = "Back">> -<<if $storedLink !== "Slave Interact" && $storedLink !== "Main">> - <<if lastVisited("Main") === 1>> - <<set $storedLink = "Main">> - <<else>> - <<set $storedLink = "Options">> - <</if>> -<</if>> -<<set $nextLink = $storedLink>> -<<set $passageSwitchHandler = App.EventHandlers.optionsChanged>> - -<<includeDOM App.UI.summaryOptions()>> \ No newline at end of file diff --git a/src/interaction/prostheticConfig.tw b/src/interaction/prostheticConfig.tw index dc84c4ea06d63de195ca06c57a653ff27a52fd64..4326995e2739557b650eb27dddce73f1203e6b58 100644 --- a/src/interaction/prostheticConfig.tw +++ b/src/interaction/prostheticConfig.tw @@ -273,7 +273,7 @@ This room is lined with shelves and cabinets; it could be easily mistaken for a <p class="choices"> //Fit prosthetics to $him:// -<div class="buyProsthetics"> +<div class="buy-prosthetics"> <div></div> <div>''Buy and fit''</div> <div> @@ -297,52 +297,56 @@ This room is lined with shelves and cabinets; it could be easily mistaken for a <<if $adjustProsthetics.findIndex(function(p) {return p.id == _p && p.slaveID == getSlave($AS).ID}) != -1 || $researchLab.tasks.findIndex(function(p) {return p.type == "craftFit" && p.id == _p && p.slaveID == getSlave($AS).ID}) != -1>> <div class="full">//Currently being fitted to $him.//</div> <<elseif setup.prosthetics[_p].level > $prostheticsUpgrade>> - <div class="full">//Better contracts are needed to buy this.//</div> + <div class="full">//Better contracts are needed to buy these.//</div> <<elseif isProstheticAvailable(getSlave($AS), _p)>> <div class="full">//Completed.//</div> <<else>> <<capture _p>> <div> - <<if $prosthetics[_p].amount > 0>> - <<link "From storage" "Prosthetics Configuration">> - <<set $adjustProsthetics.push({id: _p, workLeft: setup.prosthetics[_p].adjust, slaveID: getSlave($AS).ID}), $prosthetics[_p].amount -= 1>> - <</link>> - <<else>> - <<link "<<= cashFormat(setup.prosthetics[_p].costs)>>" "Prosthetics Configuration">> - <<set $adjustProsthetics.push({id: _p, workLeft: setup.prosthetics[_p].adjust, slaveID: getSlave($AS).ID}), cashX(forceNeg(setup.prosthetics[_p].costs), "slaveMod", getSlave($AS))>> - <</link>> - <</if>> + <<if $prosthetics[_p].amount > 0>> + <<link "From storage" "Prosthetics Configuration">> + <<set $adjustProsthetics.push({id: _p, workLeft: setup.prosthetics[_p].adjust, slaveID: getSlave($AS).ID}), $prosthetics[_p].amount -= 1>> + <</link>> + <<else>> + <<link "<<= cashFormat(setup.prosthetics[_p].costs)>>" "Prosthetics Configuration">> + <<set $adjustProsthetics.push({id: _p, workLeft: setup.prosthetics[_p].adjust, slaveID: getSlave($AS).ID}), cashX(forceNeg(setup.prosthetics[_p].costs), "slaveMod", getSlave($AS))>> + <</link>> + <</if>> </div> <<if $prosthetics[_p].research > 0>> - <div style="text-align:center"> - <<if $researchLab.level > 0 && $prosthetics[_p].research > 0>> - <<link "Construct" "Prosthetics Configuration">> - <<set $researchLab.tasks.push({ - type: "craftFit", - id: _p, - workLeft: (setup.prosthetics[_p].adjust + setup.prosthetics[_p].craft) / 1.5, - slaveID: $AS})>> - /* 1.5: longer than adjust, but faster than adjust+craft. */ - <</link>> - <</if>> - </div> - <div style="text-align:right"> - <<if $researchLab.speed >= 300 && $prosthetics[_p].research > 0>> /* max speed */ - <<if $prosthetics[_p].amount > 0>> - <<link "From storage: <<= cashFormat(setup.prosthetics[_p].adjust * 50)>>" "Prosthetics Configuration">> - <<set cashX(forceNeg(setup.prosthetics[_p].costs * 1.5), "slaveMod", getSlave($AS)), addProsthetic(getSlave($AS), _p)>> - <</link>> - <<else>> - <<link "<<= cashFormat(setup.prosthetics[_p].costs + setup.prosthetics[_p].adjust * 100)>>" "Prosthetics Configuration">> - <<set cashX(forceNeg(setup.prosthetics[_p].costs + setup.prosthetics[_p].adjust * 100), "slaveMod", getSlave($AS)), addProsthetic(getSlave($AS), _p)>> - <</link>> - <</if>> - <</if>> - </div> + <div style="text-align:center"> + <<if $researchLab.level > 0 && $prosthetics[_p].research > 0>> + <<link "Construct" "Prosthetics Configuration">> + <<set $researchLab.tasks.push({ + type: "craftFit", + id: _p, + workLeft: (setup.prosthetics[_p].adjust + setup.prosthetics[_p].craft) / 1.5, + slaveID: $AS})>> + /* 1.5: longer than adjust, but faster than adjust+craft. */ + <</link>> + <</if>> + </div> + <div style="text-align:right"> + <<if $researchLab.speed >= 300 && $prosthetics[_p].research > 0>> /* max speed */ + <<if $prosthetics[_p].amount > 0>> + <<link "From storage: <<= cashFormat(setup.prosthetics[_p].adjust * 50)>>" "Prosthetics Configuration">> + <<set cashX(forceNeg(setup.prosthetics[_p].costs * 1.5), "slaveMod", getSlave($AS)), addProsthetic(getSlave($AS), _p)>> + <</link>> + <<else>> + <<link "<<= cashFormat(setup.prosthetics[_p].costs + setup.prosthetics[_p].adjust * 100)>>" "Prosthetics Configuration">> + <<set cashX(forceNeg(setup.prosthetics[_p].costs + setup.prosthetics[_p].adjust * 100), "slaveMod", getSlave($AS)), addProsthetic(getSlave($AS), _p)>> + <</link>> + <</if>> + <</if>> + </div> <<elseif $researchLab.level > 0>> - <div class="research"> - //Not researched.// - </div> + <div class="research"> + //Not researched.// + </div> + <<else>> + <div class="research"> + //You need to construct a lab first.// + </div> <</if>> <</capture>> <</if>> diff --git a/src/interaction/siDescription.js b/src/interaction/siDescription.js index daeceffb745707c99d9a8ba818a6e2c1175b9f6d..86fddfb5659cd962e0907b9fb29e99188beb0898 100644 --- a/src/interaction/siDescription.js +++ b/src/interaction/siDescription.js @@ -34,7 +34,7 @@ App.UI.SlaveInteract.description = function(slave) { "Description Options", () => { jQuery("#description-link").empty().append(hideOptions()); - jQuery("#description-options").empty().append(App.UI.DOM.renderPassage("Description Options")); + jQuery("#description-options").empty().append(App.UI.descriptionOptions()); } ); } diff --git a/src/interaction/siFinancial.js b/src/interaction/siFinancial.js index 7c0a734fa1c4aa52fff86ca75202a029cc516b54..9985fef2c627fe88a55572f7be9606b9e05c0d22 100644 --- a/src/interaction/siFinancial.js +++ b/src/interaction/siFinancial.js @@ -187,7 +187,7 @@ App.UI.SlaveInteract.financial = function(slave) { } if (V.slaves.length < 2) { - r.push("You cannot sell your last save"); + r.push("You cannot sell your last slave"); } else if (slave.origin === "You bought ${him} from a body dump, completely broken." && (V.week - slave.weekAcquired <= 8)) { r.push(`A discarded slave must be kept for at least two months to ensure health before being sold.`); } else if (slave.accent > 3) { diff --git a/src/interaction/siWardrobe.js b/src/interaction/siWardrobe.js index 805960ad548f48fe4506a1b74bc8dd37a5336de8..167dbaa3b3eaaa7957b0a73107b87fb0b3bc4177 100644 --- a/src/interaction/siWardrobe.js +++ b/src/interaction/siWardrobe.js @@ -1,35 +1,34 @@ App.UI.SlaveInteract.wardrobe = function(slave) { const { // eslint-disable-next-line no-unused-vars - he, him, his, } = getPronouns(slave); - const el = new DocumentFragment(); - el.append(clothes()); + const frag = new DocumentFragment(); + frag.append(clothes()); if (slave.fuckdoll === 0) { - el.append(collar()); - el.append(mask()); - el.append(mouth()); - el.append(armAccessory()); - el.append(shoes()); - el.append(legAccessory()); - el.append(bellyAccessory()); - el.append(buttplug()); - el.append(buttplugAttachment()); - el.append(vaginalAccessory()); - el.append(vaginalAttachment()); - el.append(dickAccessory()); - el.append(chastity()); + frag.append(collar()); + frag.append(mask()); + frag.append(mouth()); + frag.append(armAccessory()); + frag.append(shoes()); + frag.append(legAccessory()); + frag.append(bellyAccessory()); + frag.append(buttplug()); + frag.append(buttplugAttachment()); + frag.append(vaginalAccessory()); + frag.append(vaginalAttachment()); + frag.append(dickAccessory()); + frag.append(chastity()); } - App.UI.DOM.appendNewElement("h3", el, `Shopping`); - el.append(shopping()); + App.UI.DOM.appendNewElement("h3", frag, `Shopping`); + frag.append(shopping()); - return el; + return frag; function clothes() { - let el = document.createElement('div'); + const el = document.createElement('div'); let links; if (slave.fuckdoll === 0) { let label = document.createElement('div'); @@ -43,7 +42,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { if (slave.clothes !== `choosing her own clothes`) { let choiceOptionsArray = []; choiceOptionsArray.push({text: ` Let ${him} choose`, updateSlave: {clothes: `choosing her own clothes`, choosesOwnClothes: 1}}); - label.appendChild(App.UI.SlaveInteract.generateRows(choiceOptionsArray, slave, "clothes", false, refresh)); + label.appendChild(generateRows(choiceOptionsArray, "clothes", false)); } el.appendChild(label); @@ -51,54 +50,40 @@ App.UI.SlaveInteract.wardrobe = function(slave) { let niceOptionsArray = []; let harshOptionsArray = []; - let clothingOption; - // Nice clothes - App.Data.slaveWear.niceClothes.forEach(item => { - clothingOption = { - text: item.name, - updateSlave: {clothes: item.value, choosesOwnClothes: 0}, - FS: item.fs - }; - niceOptionsArray.push(clothingOption); - }); - // Harsh clothes - App.Data.slaveWear.harshClothes.forEach(item => { - clothingOption = { - text: item.name, - updateSlave: {clothes: item.value, choosesOwnClothes: 0}, - FS: item.fs + for (const [key, object] of App.Data.clothes) { + if (key === "choosing her own clothes") { + continue; + } + const reshapedItem = { + text: object.name, + updateSlave: {clothes: key, choosesOwnClothes: 0}, + FS: object.fs, + exposure: object.exposure, }; - if (item.value !== "choosing her own clothes") { - harshOptionsArray.push(clothingOption); + if (object.harsh) { + harshOptionsArray.push(reshapedItem); + } else { + niceOptionsArray.push(reshapedItem); } - }); + } // Sort niceOptionsArray = niceOptionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); harshOptionsArray = harshOptionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); // Nice options - links = document.createElement('div'); - links.className = "choices"; - links.append(`Nice: `); - links.appendChild(App.UI.SlaveInteract.generateRows(niceOptionsArray, slave, "clothes", true, refresh)); - el.appendChild(links); + links = App.UI.DOM.appendNewElement("div", el, "Nice: ", "choices"); + links.appendChild(generateRows(niceOptionsArray, "clothes", true)); // Harsh options - links = document.createElement('div'); - links.className = "choices"; - links.append(`Harsh: `); - links.appendChild(App.UI.SlaveInteract.generateRows(harshOptionsArray, slave, "clothes", true, refresh)); - el.appendChild(links); + links = App.UI.DOM.appendNewElement("div", el, "Harsh: ", "choices"); + links.appendChild(generateRows(harshOptionsArray, "clothes", true)); } 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) { // Color options - links = document.createElement('div'); - links.className = "choices"; - links.append(`Color: `); + links = App.UI.DOM.appendNewElement("div", el, "Color: ", "choices"); links.appendChild(colorOptions("clothingBaseColor")); - el.appendChild(links); } } @@ -106,9 +91,9 @@ App.UI.SlaveInteract.wardrobe = function(slave) { } function collar() { - let el = document.createElement('div'); + const el = document.createElement('div'); - let label = document.createElement('div'); + const label = document.createElement('div'); label.append(`Collar: `); let choice = App.UI.DOM.disabledLink(`${slave.collar}`, [clothTooltip(`${slave.collar}`)]); @@ -119,7 +104,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { if (slave.collar !== `none`) { let choiceOptionsArray = []; choiceOptionsArray.push({text: ` None`, updateSlave: {collar: `none`}}); - label.appendChild(App.UI.SlaveInteract.generateRows(choiceOptionsArray, slave, "collar", false, refresh)); + label.appendChild(generateRows(choiceOptionsArray, "collar", false)); } el.appendChild(label); @@ -127,25 +112,18 @@ App.UI.SlaveInteract.wardrobe = function(slave) { let niceOptionsArray = []; let harshOptionsArray = []; - let clothingOption; - // Nice collar - App.Data.slaveWear.niceCollars.forEach(item => { - clothingOption = { - text: item.name, - updateSlave: {collar: item.value}, - FS: item.fs + for (const [key, object] of App.Data.slaveWear.collars) { + const reshapedItem = { + text: object.name, + updateSlave: {collar: key}, + FS: object.fs, }; - niceOptionsArray.push(clothingOption); - }); - // Harsh collar - App.Data.slaveWear.harshCollars.forEach(item => { - clothingOption = { - text: item.name, - updateSlave: {collar: item.value}, - FS: item.fs - }; - harshOptionsArray.push(clothingOption); - }); + if (object.harsh) { + harshOptionsArray.push(reshapedItem); + } else { + niceOptionsArray.push(reshapedItem); + } + } // Sort niceOptionsArray = niceOptionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); @@ -155,23 +133,23 @@ App.UI.SlaveInteract.wardrobe = function(slave) { let links = document.createElement('div'); links.className = "choices"; links.append(`Nice: `); - links.appendChild(App.UI.SlaveInteract.generateRows(niceOptionsArray, slave, "collar", true, refresh)); + links.appendChild(generateRows(niceOptionsArray, "collar", true)); el.appendChild(links); // Harsh options links = document.createElement('div'); links.className = "choices"; links.append(`Harsh: `); - links.appendChild(App.UI.SlaveInteract.generateRows(harshOptionsArray, slave, "collar", true, refresh)); + links.appendChild(generateRows(harshOptionsArray, "collar", true)); el.appendChild(links); return el; } function mask() { - let el = document.createElement('div'); + const el = document.createElement('div'); - let label = document.createElement('div'); + const label = document.createElement('div'); label.append(`Mask: `); let choice = App.UI.DOM.disabledLink(`${slave.faceAccessory} `, [clothTooltip(`${slave.faceAccessory}`)]); @@ -182,29 +160,28 @@ App.UI.SlaveInteract.wardrobe = function(slave) { if (slave.faceAccessory !== `none`) { let choiceOptionsArray = []; choiceOptionsArray.push({text: ` None`, updateSlave: {faceAccessory: `none`}}); - label.appendChild(App.UI.SlaveInteract.generateRows(choiceOptionsArray, slave, "faceAccessory", false, refresh)); + label.appendChild(generateRows(choiceOptionsArray, "faceAccessory", false)); } el.appendChild(label); let array = []; - let clothingOption; - App.Data.slaveWear.faceAccessory.forEach(item => { - clothingOption = { - text: item.name, - updateSlave: {faceAccessory: item.value}, - FS: item.fs + for (const [key, object] of App.Data.slaveWear.faceAccessory) { + const reshapedItem = { + text: object.name, + updateSlave: {faceAccessory: key}, + FS: object.fs, }; - array.push(clothingOption); - }); + array.push(reshapedItem); + } // Sort array = array.sort((a, b) => (a.text > b.text) ? 1 : -1); let links = document.createElement('div'); links.className = "choices"; - links.appendChild(App.UI.SlaveInteract.generateRows(array, slave, "faceAccessory", true, refresh)); + links.appendChild(generateRows(array, "faceAccessory", true)); el.appendChild(links); if (slave.eyewear === "corrective glasses" || slave.eyewear === "glasses" || slave.eyewear === "blurring glasses" || slave.faceAccessory === "porcelain mask") { @@ -224,9 +201,9 @@ App.UI.SlaveInteract.wardrobe = function(slave) { } function mouth() { - let el = document.createElement('div'); + const el = document.createElement('div'); - let label = document.createElement('div'); + const label = document.createElement('div'); label.append(`Gag: `); let choice = App.UI.DOM.disabledLink(`${slave.mouthAccessory}`, [clothTooltip(`${slave.mouthAccessory}`)]); @@ -237,40 +214,38 @@ App.UI.SlaveInteract.wardrobe = function(slave) { if (slave.mouthAccessory !== `none`) { let choiceOptionsArray = []; choiceOptionsArray.push({text: ` None`, updateSlave: {mouthAccessory: `none`}}); - label.appendChild(App.UI.SlaveInteract.generateRows(choiceOptionsArray, slave, "mouthAccessory", false, refresh)); + label.appendChild(generateRows(choiceOptionsArray, "mouthAccessory", false)); } el.appendChild(label); let array = []; - let clothingOption; - // mouthAccessory - App.Data.slaveWear.mouthAccessory.forEach(item => { - clothingOption = { - text: item.name, - updateSlave: {mouthAccessory: item.value}, - FS: item.fs + for (const [key, object] of App.Data.slaveWear.mouthAccessory) { + const reshapedItem = { + text: object.name, + updateSlave: {mouthAccessory: key}, + FS: object.fs, }; - array.push(clothingOption); - }); + array.push(reshapedItem); + } // Sort array = array.sort((a, b) => (a.text > b.text) ? 1 : -1); let links = document.createElement('div'); links.className = "choices"; - links.appendChild(App.UI.SlaveInteract.generateRows(array, slave, "mouthAccessory", true, refresh)); + links.appendChild(generateRows(array, "mouthAccessory", true)); el.appendChild(links); return el; } function armAccessory() { - let el = document.createElement('div'); + const el = document.createElement('div'); // App.Desc.armwear(slave) - let label = document.createElement('div'); + const label = document.createElement('div'); label.append(`Arm accessory: `); let choice = App.UI.DOM.disabledLink(`${slave.armAccessory}`, [clothTooltip(`${slave.armAccessory}`)]); @@ -282,7 +257,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { // Choose her own if (slave.armAccessory !== "none") { array.push({text: ` None`, updateSlave: {armAccessory: `none`}}); - label.appendChild(App.UI.SlaveInteract.generateRows(array, slave, "armAccessory", false, refresh)); + label.appendChild(generateRows(array, "armAccessory", false)); } el.appendChild(label); @@ -293,16 +268,16 @@ App.UI.SlaveInteract.wardrobe = function(slave) { {text: "Hand gloves", updateSlave: {armAccessory: "hand gloves"}}, {text: "Elbow gloves", updateSlave: {armAccessory: "elbow gloves"}} ]; - links.appendChild(App.UI.SlaveInteract.generateRows(array, slave, "armAccessory", false, refresh)); + links.appendChild(generateRows(array, "armAccessory", false)); el.appendChild(links); return el; } function shoes() { - let el = document.createElement('div'); + const el = document.createElement('div'); - let label = document.createElement('div'); + const label = document.createElement('div'); label.append(`Shoes: `); let choice = App.UI.DOM.disabledLink(`${slave.shoes}`, [clothTooltip(`${slave.shoes}`)]); @@ -314,22 +289,21 @@ App.UI.SlaveInteract.wardrobe = function(slave) { if (slave.shoes !== `none`) { let choiceOptionsArray = []; choiceOptionsArray.push({text: `None`, updateSlave: {shoes: `none`}}); - label.appendChild(App.UI.SlaveInteract.generateRows(choiceOptionsArray, slave, "shoes", false, refresh)); + label.appendChild(generateRows(choiceOptionsArray, "shoes", false)); } */ el.appendChild(label); let optionsArray = []; - let clothingOption; - App.Data.slaveWear.shoes.forEach(item => { - clothingOption = { - text: item.name, - updateSlave: {shoes: item.value}, - FS: item.fs + for (const [key, object] of App.Data.slaveWear.shoes) { + const reshapedItem = { + text: object.name, + updateSlave: {shoes: key}, + FS: object.fs, }; - optionsArray.push(clothingOption); - }); + optionsArray.push(reshapedItem); + } // Sort // No sort here since we want light -> advanced. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); @@ -337,7 +311,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { // Options let links = document.createElement('div'); links.className = "choices"; - links.appendChild(App.UI.SlaveInteract.generateRows(optionsArray, slave, "shoes", true, refresh)); + links.appendChild(generateRows(optionsArray, "shoes", true)); el.appendChild(links); if (V.seeImages === 1 && V.imageChoice === 1 && slave.shoes !== "none") { @@ -353,12 +327,12 @@ App.UI.SlaveInteract.wardrobe = function(slave) { } function legAccessory() { - let el = document.createElement('div'); + const el = document.createElement('div'); - let label = document.createElement('div'); + const label = document.createElement('div'); label.append(`Leg accessory: `); - let choice = App.UI.DOM.disabledLink(`${slave.legAccessory}`, [clothTooltip(`${slave.legAccessory}`)]); + const choice = App.UI.DOM.disabledLink(`${slave.legAccessory}`, [clothTooltip(`${slave.legAccessory}`)]); choice.style.fontWeight = "bold"; label.appendChild(choice); @@ -367,7 +341,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { // Choose her own if (slave.legAccessory !== "none") { array.push({text: ` None`, updateSlave: {legAccessory: `none`}}); - label.appendChild(App.UI.SlaveInteract.generateRows(array, slave, "legAccessory", false, refresh)); + label.appendChild(generateRows(array, "legAccessory", false)); } el.appendChild(label); @@ -378,7 +352,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { {text: "Short stockings", updateSlave: {legAccessory: "short stockings"}}, {text: "Long stockings", updateSlave: {legAccessory: "long stockings"}} ]; - links.appendChild(App.UI.SlaveInteract.generateRows(array, slave, "legAccessory", false, refresh)); + links.appendChild(generateRows(array, "legAccessory", false)); el.appendChild(links); return el; @@ -390,18 +364,19 @@ App.UI.SlaveInteract.wardrobe = function(slave) { let optionsArray = []; - let clothingOption; - App.Data.slaveWear.bellyAccessories.forEach(item => { - clothingOption = { - text: item.name, - updateSlave: {bellyAccessory: item.value}, - FS: item.fs - }; - if (item.value !== "none") { + for (const [key, object] of App.Data.slaveWear.bellyAccessories) { + if (key === "none") { // skip none in set, we set the link elsewhere. - optionsArray.push(clothingOption); + continue; } - }); + const reshapedItem = { + text: object.name, + updateSlave: {bellyAccessory: key}, + FS: object.fs, + }; + optionsArray.push(reshapedItem); + } + // Sort // No sort here since we want small -> large.optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); @@ -416,7 +391,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { // Choose her own if (slave.bellyAccessory !== `none`) { - label.appendChild(App.UI.SlaveInteract.generateRows(choiceOptionsArray, slave, "bellyAccessory", false, refresh)); + label.appendChild(generateRows(choiceOptionsArray, "bellyAccessory", false)); } el.appendChild(label); @@ -424,7 +399,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { // Options let links = document.createElement('div'); links.className = "choices"; - links.appendChild(App.UI.SlaveInteract.generateRows(optionsArray, slave, "bellyAccessory", true, refresh)); + links.appendChild(generateRows(optionsArray, "bellyAccessory", true)); if (slave.pregKnown === 1) { let note = document.createElement('span'); note.className = "note"; @@ -438,9 +413,9 @@ App.UI.SlaveInteract.wardrobe = function(slave) { function buttplug() { // App.Desc.buttplug(slave) - let el = document.createElement('div'); + const el = document.createElement('div'); - let label = document.createElement('div'); + const label = document.createElement('div'); label.append(`Anal accessory: `); let choice = App.UI.DOM.disabledLink(`${slave.buttplug}`, [clothTooltip(`${slave.buttplug}`)]); @@ -450,24 +425,24 @@ App.UI.SlaveInteract.wardrobe = function(slave) { if (slave.buttplug !== `none`) { let choiceOptionsArray = []; choiceOptionsArray.push({text: ` None`, updateSlave: {buttplug: `none`, buttplugAttachment: `none`}}); - label.appendChild(App.UI.SlaveInteract.generateRows(choiceOptionsArray, slave, "buttplug", false, refresh)); + label.appendChild(generateRows(choiceOptionsArray, "buttplug", false)); } el.appendChild(label); let optionsArray = []; - let clothingOption; - App.Data.slaveWear.buttplugs.forEach(item => { - clothingOption = { - text: item.name, - updateSlave: {buttplug: item.value}, - FS: item.fs - }; - if (item.value !== "none") { + for (const [key, object] of App.Data.slaveWear.buttplugs) { + if (key === "none") { // skip none in set, we set the link elsewhere. - optionsArray.push(clothingOption); + continue; } - }); + const reshapedItem = { + text: object.name, + updateSlave: {buttplug: key}, + FS: object.fs, + }; + optionsArray.push(reshapedItem); + } // Sort // No sort here since we want small -> large. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); @@ -475,46 +450,46 @@ App.UI.SlaveInteract.wardrobe = function(slave) { // Options let links = document.createElement('div'); links.className = "choices"; - links.appendChild(App.UI.SlaveInteract.generateRows(optionsArray, slave, "buttplug", true, refresh)); + links.appendChild(generateRows(optionsArray, "buttplug", true)); el.appendChild(links); return el; } function buttplugAttachment() { - let el = document.createElement('div'); + const el = document.createElement('div'); if (slave.buttplug === "none") { return el; } - let label = document.createElement('div'); + const label = document.createElement('div'); label.append(`Anal accessory attachment: `); - let choice = App.UI.DOM.disabledLink(`${slave.buttplugAttachment}`, [clothTooltip(`${slave.buttplugAttachment}`)]); + const choice = App.UI.DOM.disabledLink(`${slave.buttplugAttachment}`, [clothTooltip(`${slave.buttplugAttachment}`)]); choice.style.fontWeight = "bold"; label.appendChild(choice); if (slave.buttplugAttachment !== `none`) { let choiceOptionsArray = []; choiceOptionsArray.push({text: ` None`, updateSlave: {buttplugAttachment: `none`}}); - label.appendChild(App.UI.SlaveInteract.generateRows(choiceOptionsArray, slave, "buttplugAttachment", false, refresh)); + label.appendChild(generateRows(choiceOptionsArray, "buttplugAttachment", false)); } el.appendChild(label); let optionsArray = []; - let clothingOption; - App.Data.slaveWear.buttplugAttachments.forEach(item => { - clothingOption = { - text: item.name, - updateSlave: {buttplugAttachment: item.value}, - FS: item.fs - }; - if (item.value !== "none") { + for (const [key, object] of App.Data.slaveWear.buttplugAttachment) { + if (key === "none") { // skip none in set, we set the link elsewhere. - optionsArray.push(clothingOption); + continue; } - }); + const reshapedItem = { + text: object.name, + updateSlave: {buttplugAttachment: key}, + FS: object.fs, + }; + optionsArray.push(reshapedItem); + } // Sort optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); @@ -522,7 +497,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { // Options let links = document.createElement('div'); links.className = "choices"; - links.appendChild(App.UI.SlaveInteract.generateRows(optionsArray, slave, "buttplugAttachment", true, refresh)); + links.appendChild(generateRows(optionsArray, "buttplugAttachment", true)); el.appendChild(links); return el; @@ -531,9 +506,9 @@ App.UI.SlaveInteract.wardrobe = function(slave) { function vaginalAccessory() { // <<vaginalAccessoryDescription>> - let el = document.createElement('div'); + const el = document.createElement('div'); - let label = document.createElement('div'); + const label = document.createElement('div'); label.append(`Vaginal accessory: `); let choice = App.UI.DOM.disabledLink(`${slave.vaginalAccessory}`, [clothTooltip(`${slave.vaginalAccessory}`)]); @@ -543,24 +518,24 @@ App.UI.SlaveInteract.wardrobe = function(slave) { if (slave.vaginalAccessory !== `none`) { let choiceOptionsArray = []; choiceOptionsArray.push({text: ` None`, updateSlave: {vaginalAccessory: `none`}}); - label.appendChild(App.UI.SlaveInteract.generateRows(choiceOptionsArray, slave, "vaginalAccessory", false, refresh)); + label.appendChild(generateRows(choiceOptionsArray, "vaginalAccessory", false)); } el.appendChild(label); let optionsArray = []; - let clothingOption; - App.Data.slaveWear.vaginalAccessories.forEach(item => { - clothingOption = { - text: item.name, - updateSlave: {vaginalAccessory: item.value}, - FS: item.fs - }; - if (item.value !== "none") { + for (const [key, object] of App.Data.slaveWear.vaginalAccessories) { + if (key === "none") { // skip none in set, we set the link elsewhere. - optionsArray.push(clothingOption); + continue; } - }); + const reshapedItem = { + text: object.name, + updateSlave: {vaginalAccessory: key}, + FS: object.fs, + }; + optionsArray.push(reshapedItem); + } // Sort // No sort here since we want small -> large. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); @@ -568,7 +543,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { // Options let links = document.createElement('div'); links.className = "choices"; - links.appendChild(App.UI.SlaveInteract.generateRows(optionsArray, slave, "vaginalAccessory", true, refresh)); + links.appendChild(generateRows(optionsArray, "vaginalAccessory", true)); el.appendChild(links); return el; @@ -590,24 +565,24 @@ App.UI.SlaveInteract.wardrobe = function(slave) { if (slave.vaginalAttachment !== `none`) { let choiceOptionsArray = []; choiceOptionsArray.push({text: ` None`, updateSlave: {vaginalAttachment: `none`}}); - label.appendChild(App.UI.SlaveInteract.generateRows(choiceOptionsArray, slave, "vaginalAttachment", false, refresh)); + label.appendChild(generateRows(choiceOptionsArray, "vaginalAttachment", false)); } el.appendChild(label); let optionsArray = []; - let clothingOption; - App.Data.slaveWear.vaginalAttachments.forEach(item => { - clothingOption = { - text: item.name, - updateSlave: {vaginalAttachment: item.value}, - FS: item.fs - }; - if (item.value !== "none") { + for (const [key, object] of App.Data.slaveWear.vaginalAttachments) { + if (key === "none") { // skip none in set, we set the link elsewhere. - optionsArray.push(clothingOption); + continue; } - }); + const reshapedItem = { + text: object.name, + updateSlave: {vaginalAttachments: key}, + FS: object.fs, + }; + optionsArray.push(reshapedItem); + } // Sort optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); @@ -615,43 +590,43 @@ App.UI.SlaveInteract.wardrobe = function(slave) { // Options let links = document.createElement('div'); links.className = "choices"; - links.appendChild(App.UI.SlaveInteract.generateRows(optionsArray, slave, "vaginalAttachment", true, refresh)); + links.appendChild(generateRows(optionsArray, "vaginalAttachment", true)); el.appendChild(links); return el; } function dickAccessory() { - let el = document.createElement('div'); + const el = document.createElement('div'); - let label = document.createElement('div'); + const label = document.createElement('div'); label.append(`Dick accessory: `); - let choice = App.UI.DOM.disabledLink(`${slave.dickAccessory}`, [clothTooltip(`${slave.dickAccessory}`)]); + const choice = App.UI.DOM.disabledLink(`${slave.dickAccessory}`, [clothTooltip(`${slave.dickAccessory}`)]); choice.style.fontWeight = "bold"; label.appendChild(choice); if (slave.dickAccessory !== `none`) { let choiceOptionsArray = []; choiceOptionsArray.push({text: ` None`, updateSlave: {dickAccessory: `none`}}); - label.appendChild(App.UI.SlaveInteract.generateRows(choiceOptionsArray, slave, "dickAccessory", false, refresh)); + label.appendChild(generateRows(choiceOptionsArray, "dickAccessory", false)); } el.appendChild(label); let optionsArray = []; - let clothingOption; - App.Data.slaveWear.dickAccessories.forEach(item => { - clothingOption = { - text: item.name, - updateSlave: {dickAccessory: item.value}, - FS: item.fs - }; - if (item.value !== "none") { + for (const [key, object] of App.Data.slaveWear.dickAccessories) { + if (key === "none") { // skip none in set, we set the link elsewhere. - optionsArray.push(clothingOption); + continue; } - }); + const reshapedItem = { + text: object.name, + updateSlave: {dickAccessory: key}, + FS: object.fs, + }; + optionsArray.push(reshapedItem); + } // Sort // No sort here since we want small -> large. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); @@ -659,16 +634,16 @@ App.UI.SlaveInteract.wardrobe = function(slave) { // Options let links = document.createElement('div'); links.className = "choices"; - links.appendChild(App.UI.SlaveInteract.generateRows(optionsArray, slave, "dickAccessory", true, refresh)); + links.appendChild(generateRows(optionsArray, "dickAccessory", true)); el.appendChild(links); return el; } function chastity() { - let el = document.createElement('div'); + const el = document.createElement('div'); - let label = document.createElement('div'); + const label = document.createElement('div'); label.append(`Chastity devices: `); let chasCho = ""; @@ -709,25 +684,26 @@ App.UI.SlaveInteract.wardrobe = function(slave) { chastityVagina: 0 } }); - label.appendChild(App.UI.SlaveInteract.generateRows(choiceOptionsArray, slave, "chastity", false, refresh)); + label.appendChild(generateRows(choiceOptionsArray, "chastity", false)); } el.appendChild(label); let optionsArray = []; - let clothingOption; - App.Data.slaveWear.chastityDevices.forEach(item => { - clothingOption = { - text: item.name, - updateSlave: {}, - FS: item.fs - }; - Object.assign(clothingOption.updateSlave, item.updateSlave); - if (item.value !== "none") { + for (const [key, object] of App.Data.slaveWear.chastityDevices) { + if (key === "none") { // skip none in set, we set the link elsewhere. - optionsArray.push(clothingOption); + continue; } - }); + const reshapedItem = { + text: object.name, + updateSlave: {}, + FS: object.fs, + }; + Object.assign(reshapedItem.updateSlave, object.updateSlave); + optionsArray.push(reshapedItem); + } + // Sort // skip sort for this one too. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); @@ -735,7 +711,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { // Options let links = document.createElement('div'); links.className = "choices"; - links.appendChild(App.UI.SlaveInteract.generateRows(optionsArray, slave, "chastity", true, refresh)); + links.appendChild(generateRows(optionsArray, "chastity", true)); el.appendChild(links); return el; @@ -753,8 +729,8 @@ App.UI.SlaveInteract.wardrobe = function(slave) { * @returns {Node} */ function colorOptions(update) { - let el = new DocumentFragment(); - let colorChoice = App.UI.DOM.colorInput( + const el = new DocumentFragment(); + const colorChoice = App.UI.DOM.colorInput( slave[update], v => { slave[update] = v; @@ -785,7 +761,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { /** * Figure out a tooltip text to use based on clothing name. * Described effects are mainly from saClothes.js some are from saLongTermMentalEffects.js or saLongTermPhysicalEffects.js - * Potential fetish relevations are not mentioned. + * Potential fetish revelations are not mentioned. * Chastity options could mention that at least fucktoys can appreciate maintaining their virginity but I assume just choosing a hole to focus on has the same effect so it's not really a clothing effect. * what's the word for below 20 devotion slaves? Disobedient? * Also accepting is a bit weird for ones above, I think I've seen obedient being used instead. @@ -889,7 +865,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { case "a medium empathy belly": case "a large empathy belly": case "a huge empathy belly": - return Cloth + " strenghtens or removes(a weak) pregnancy fetish and affects devotion in various ways depending on devotion, fertility and having a pregnancy fetish or breeder flaw."; + return Cloth + " strengthens or removes(a weak) pregnancy fetish and affects devotion in various ways depending on devotion, fertility and having a pregnancy fetish or breeder flaw."; case "bullet vibrator": return Cloth + " increases devotion but weakens fetish and libido."; @@ -898,7 +874,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { case "dildo": return Cloth + " stretches vagina from virgin to tight, might remove hatred of penetration."; case "long dildo": - return Cloth + " stretches vagina from virging to tight, might remove hatred of penetration. Makes size queens happy while others less trusting."; + return Cloth + " stretches vagina from virgin to tight, might remove hatred of penetration. Makes size queens happy while others less trusting."; case "large dildo": case "long, large dildo": return Cloth + " stretches vagina into a loose one, on a tight vagina increases obedience and fear."; @@ -914,7 +890,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { case "plug": return Cloth + " stretches butthole from virgin to tight, might remove hatred of anal."; case "long plug": - return Cloth + " stretches vagina from virging to tight, might remove hatred of penetration. Makes size queens happy."; + return Cloth + " stretches vagina from virgin to tight, might remove hatred of penetration. Makes size queens happy."; case "large plug": case "long, large plug": return Cloth + " stretches vagina into a loose one, on a tight vagina increases obedience and fear."; @@ -955,16 +931,19 @@ App.UI.SlaveInteract.wardrobe = function(slave) { /* assuming nice clothes, could actually add some sort of check to make sure. */ /* which clothes have these is decided in miscData.js */ let clothTooltip = Cloth + ""; - if (setup.humiliatingClothes.includes(cloth)) { - clothTooltip += ", it's humiliating"; - } - if (setup.sluttyClothes.includes(cloth)) { - clothTooltip += ", it's slutty"; + switch (App.Data.clothes.get(slave.clothes).exposure) { + case 3: + clothTooltip += ", it's humiliating"; + break; + case 2: + clothTooltip += ", it's slutty"; + break; + case 0: + clothTooltip += ", it's modest"; + break; } - if (setup.modestClothes.includes(cloth)) { - clothTooltip += ", it's modest"; - } - if (clothTooltip === Cloth + "") { + + if (clothTooltip === Cloth + "") { clothTooltip += ", it's only nice(meaning non-obedients lose devotion and fear while obedients gain devotion and trust)."; } clothTooltip += "."; @@ -972,4 +951,75 @@ App.UI.SlaveInteract.wardrobe = function(slave) { } } } + /** @typedef RowItem + * @type {object} + * @property {FC.FutureSociety} [FS] - FS requirement, if any + * @property {string} [text] - link text + * @property {object} [updateSlave] - properties to be merged onto the slave + * @property {object} [update] - properties to be merged into global state + * @property {string} [note] + * @property {string} [slutty] + * @property {string} [humiliating] + */ + + /** Generate a row of choices + * @param {RowItem[]} array + * @param {string} [category] - should be in the form of slave.category, the thing we want to update. + * @param {boolean} [accessCheck=false] + * @returns {HTMLUListElement} + */ + function generateRows(array, category, accessCheck = false) { + const linkArray = []; + for (const item of array) { + let link; + // Some items will never be in App.Data.slaveWear, especially "none" if it falls in between harsh and nice data sets. Trying to look it up would cause an error, which is what access check works around. + const itemName = (category === "chastity") ? item.text.toLowerCase() : item.updateSlave[category]; // Yucky. Category name does not match for chastity (since it sets multiple kinds of chastity at once). Compare using a lowercase name instead. + const unlocked = (accessCheck === true) ? isItemAccessible.entry(itemName, category, slave) : false; + if (accessCheck === false || unlocked) { + if (typeof unlocked === 'string') { // is it just text? + link = App.UI.DOM.disabledLink(item.text, [unlocked]); + } else { + link = document.createElement('span'); + + // Set up the link + link.appendChild( + App.UI.DOM.link( + `${item.text} `, + () => { click(item); }, + [], + "", + clothTooltip(itemName) + ) + ); + + if (item.FS) { + let FS = App.UI.DOM.disabledLink(`FS`, [FutureSocieties.displayAdj(item.FS)]); + FS.style.fontStyle = "italic"; + link.appendChild(FS); + } + + // add a note node if required + if (item.note) { + link.appendChild(App.UI.DOM.makeElement('span', ` ${item.note}`, 'note')); + } + } + linkArray.push(link); + } + } + + return App.UI.DOM.generateLinksStrip(linkArray); + + /** @param {RowItem} arrayOption */ + function click(arrayOption) { + if (arrayOption.updateSlave) { + for (const slaveProperty in arrayOption.updateSlave) { + _.set(slave, slaveProperty, arrayOption.updateSlave[slaveProperty]); + } + } + if (arrayOption.update) { + Object.assign(V, arrayOption.update); + } + refresh(); + } + } }; diff --git a/src/js/economyJS.js b/src/js/economyJS.js index 4816d267ae70ba14cfe9c7895d26fd7e133aae45..06e96167ea11dfedfb489d766789a578d426d1aa 100644 --- a/src/js/economyJS.js +++ b/src/js/economyJS.js @@ -620,7 +620,7 @@ globalThis.calculateCosts = (function() { // security expansion function getSecurityExpansionCost() { - let secExpCost = 0, soldierMod = 1.5; // V.SecExp.edicts.defense.soldierWages === 1 + let secExpCost = 0; if (V.secExpEnabled > 0) { const unitModifier = function(x) { if (x === 'slaves') { @@ -629,16 +629,12 @@ globalThis.calculateCosts = (function() { return 1.5; } return 1; - } - + }; + secExpCost += App.SecExp.upkeep.edictsCash(); secExpCost += App.SecExp.upkeep.SF(); secExpCost += App.SecExp.upkeep.buildings(); - if (V.SecExp.edicts.defense.soldierWages === 0) { - soldierMod = 1; - } else if (V.SecExp.edicts.defense.soldierWages === 2) { - soldierMod = 2; - } + const soldierMod = 1 + V.SecExp.edicts.defense.soldierWages * 0.5; // 1.0, 1.5, 2.0 for (const unit of App.SecExp.unit.list().slice(1)) { for (const squad of V.SecExp.units[unit].squads) { @@ -2189,20 +2185,20 @@ Welcome to the new way to spend and make money, all while having it recorded: ca The new system will still happily spend your money, but it will also record it in the appropriate budget category and (optionally) the appropriate slave as well. -Let's say you were going to spend 100 on your favorite $activeSlave with cashX. You might try: +Let's say you were going to spend 100 on your favorite slave with cashX. You might try: -<<run cashX(-100, "slaveMod", $activeSlave)>> +<<run cashX(-100, "slaveMod", _slave)>> There we go! 1. -100 taken from your account 2. Recorded: -100 for the slaveMod category, to be displayed on the Budget screen -3. Recorded: -100 noted in your activeSlave's permanent record. $He better get busy paying that off! +3. Recorded: -100 noted in your slave's permanent record. $He better get busy paying that off! cashX can be used in JS as well, and can be included in [[]] style links. Make sure that expenses arrive in the COST slot as a negative, they are often positive in code. Use the new function forceNeg or pass it along on a temporary variable if needed. -Costs don't have to be numbers either, you can use variables. <<run cashX(forceNeg(_ContractCost), "slaveTransfer", $activeSlave)>>. forceNeg makes sure that whatever value _ContractCost has is negative, and will therefore be recorded as an expense. You don't have to use it if you're sure the number you are passing along is negative. +Costs don't have to be numbers either, you can use variables. <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _slave)>>. forceNeg makes sure that whatever value _ContractCost has is negative, and will therefore be recorded as an expense. You don't have to use it if you're sure the number you are passing along is negative. A full list of categories (slaveMod, slaveTransfer, event) are in App.Data.Records.LastWeeksCash(). It's important to match your cost to one of those categories (or add a new one there, and display it in costsBudget.tw.) diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js index 7a00f5433c4aabedea6a2bb705ce690216ac285b..f499e6bbae627abe658d7a6cf3658ea320beaf01 100644 --- a/src/js/eventSelectionJS.js +++ b/src/js/eventSelectionJS.js @@ -618,7 +618,7 @@ globalThis.generateRandomEventPoolStandard = function(eventSlave) { if (eventSlave.trust > 20) { if (eventSlave.rules.speech !== "restrictive") { if (eventSlave.choosesOwnClothes !== 1) { - if (setup.modestClothes.includes(eventSlave.clothes)) { + if (App.Data.clothes.get(eventSlave.clothes).exposure === 0) { V.RESSevent.push("modest clothes"); } } diff --git a/src/js/familyTreeJS.js b/src/js/familyTreeJS.js index 6c483d90cf333e02c560a8f0fd8c14de79e8cfa1..4cf9bca040699305e7cbb2a94e2c54034cbc6512 100644 --- a/src/js/familyTreeJS.js +++ b/src/js/familyTreeJS.js @@ -2,20 +2,6 @@ /* eslint-disable no-console */ let lastActiveSlave, lastSlaves, lastPC; -/* - To use, add something like: - -<div id="family-tree"></div> - <span id="family-tree-link"> - <<link "Pull up the file on $his family tree.">> - <<replace #family-tree-link>> - <<run renderFamilyTree($slaves, $activeSlave.ID)>> - <</replace>> - <</link>> -</span> - -*/ - globalThis.renderFamilyTree = function(slaves, filterID) { 'use strict'; @@ -514,21 +500,6 @@ globalThis.buildFamilyTree = function(slaves, filterID) { return family_graph; }; -/* Old version. To use, do something like: -<div id="edit-family"> - <div id="graph"></div> -</div> - -<<run updateFamilyTree($activeSlave, $slaves, $PC)>> -html_script_tag updateFamilyTree() end_html_script_tag -// tweego freaks out if the actual end of script tag is used even inside a comment -If you want to update the tree, just re-call the run line. - -If there's no active slave, you can do: - -<<run updateFamilyTree(null, $slaves, $PC)>> -*/ - globalThis.updateFamilyTree = function(activeSlave = lastActiveSlave, slaves = lastSlaves, PC = lastPC) { lastActiveSlave = activeSlave; lastSlaves = slaves; diff --git a/src/js/itemAvailability.js b/src/js/itemAvailability.js index f0c5fc0cb1f13e86ed1266dd6d4e060240306d8a..1a23c13bead242b88d7c04815a8a1ee07f40ad03 100644 --- a/src/js/itemAvailability.js +++ b/src/js/itemAvailability.js @@ -15,51 +15,45 @@ globalThis.isItemAccessible = (function() { if (V.cheatMode === 1) { return true; } - let niceDB = []; - let harshDB = []; + let selectedDB; switch (category) { case "clothing": case "clothes": - niceDB = App.Data.slaveWear.niceClothes; - harshDB = App.Data.slaveWear.harshClothes; + selectedDB = App.Data.clothes; break; case "collar": - niceDB = App.Data.slaveWear.niceCollars; - harshDB = App.Data.slaveWear.harshCollars; + selectedDB = App.Data.slaveWear.collars; break; case "bellyAccessory": - niceDB = App.Data.slaveWear.bellyAccessories; + selectedDB = App.Data.slaveWear.bellyAccessories; break; case "buttplug": - niceDB = App.Data.slaveWear.buttplugs; + selectedDB = App.Data.slaveWear.buttplugs; break; case "buttplugAttachment": - niceDB = App.Data.slaveWear.buttplugAttachments; + selectedDB = App.Data.slaveWear.buttplugAttachments; break; case "vaginalAccessory": - niceDB = App.Data.slaveWear.vaginalAccessories; + selectedDB = App.Data.slaveWear.vaginalAccessories; break; case "vaginalAttachment": - niceDB = App.Data.slaveWear.vaginalAttachments; + selectedDB = App.Data.slaveWear.vaginalAttachments; break; case "dickAccessory": - niceDB = App.Data.slaveWear.vaginalAccessories; + selectedDB = App.Data.slaveWear.dickAccessories; break; case "shoes": - niceDB = App.Data.slaveWear.shoes; + selectedDB = App.Data.slaveWear.shoes; break; case "chastity": - niceDB = App.Data.slaveWear.chastityDevices; + selectedDB = App.Data.slaveWear.chastityDevices; break; default: console.log(`made a category for ${category} automatically, may need to define this by hand`); - niceDB = App.Data.slaveWear[category]; + selectedDB = App.Data.slaveWear[category]; break; } - let item = niceDB.find((i) => i.value === string); - if (!item && (typeof harshDB !== 'undefined')) { - item = harshDB.find((i) => i.value === string); - } + const item = selectedDB.get(string); if (!item) { console.log(`${string} is not a registered piece of clothing! Check App.Data.slaveWear.${category}`); return false; /* couldn't be found */ @@ -68,20 +62,22 @@ globalThis.isItemAccessible = (function() { } /** * Returns array of wearable clothing in format [name, value], basically player facing / game data. - * @param {Array} db Array to look in (such as App.Data.slaveWear.niceClothes) + * @param {Map} map Map to look in (such as App.Data.clothes) + * @param {string} [filter] for example, if we want to filer clothing data by the "harsh" property, pass harsh as the parameter here. + * @param {any} [filterValue] remove any clothing where the .filter property does not match this value. Function will evaluate undefined as false. * @returns {Array} */ - function array(db) { + function array(map, filter, filterValue) { const array = []; - db.forEach((i) => { - if (V.cheatMode || isAvailable(i)) { - let name = i.name; - if (i.fs) { - name = `${i.name} (FS)`; - } - array.push([name, i.value]); + for (const [key, obj] of map) { + if (filter && filterValue !== (obj[filter] || false)) { + continue; } - }); + if (V.cheatMode || isAvailable(obj)) { + const name = (obj.fs) ? `${obj.name} (FS)` : obj.name; + array.push([name, obj.value]); + } + } return array; } diff --git a/src/js/releaseRules.js b/src/js/releaseRules.js index b029004c3b2edd4bf6437706322092bf9f45da9b..ab0a354a055fc0872a7cdb3c9b2a458c13652cc9 100644 --- a/src/js/releaseRules.js +++ b/src/js/releaseRules.js @@ -128,10 +128,6 @@ App.Utils.releaseSummaryShort = function releaseSummaryShort(slave) { App.Utils.releaseSummaryLong = function releaseSummaryLong(slave) { const rel = slave.rules.release; const includeFamily = (rel.family === 1) && (V.seeIncest === 1); - let _counter = rel.masturbation + rel.partner + rel.facilityLeader + rel.slaves + rel.master; - if (includeFamily) { - _counter += 1; - } if (rel.masturbation === 0 && rel.partner === 0 && rel.facilityLeader === 0 && !includeFamily && rel.slaves === 0 && rel.master === 0) { return "chastity"; @@ -147,7 +143,7 @@ App.Utils.releaseSummaryLong = function releaseSummaryLong(slave) { return "slaves only"; } else if (rel.masturbation === 0 && rel.partner === 0 && rel.facilityLeader === 0 && !includeFamily && rel.slaves === 0 && rel.master === 1) { return "you only"; - } else if (_counter >= 3) { + } else if (rel.slaves === 1) { let ret = "permissive"; let exceptions = []; if (rel.partner === 0) { @@ -169,9 +165,11 @@ App.Utils.releaseSummaryLong = function releaseSummaryLong(slave) { ret += ", no masturbation"; } return ret; - } else if (_counter > 0 && _counter < 3){ - let ret = "restrictive"; + } else { let permissions = []; + if (rel.masturbation === 1) { + permissions.push("masturbation"); + } if (rel.partner === 1) { permissions.push("partner"); } @@ -185,14 +183,10 @@ App.Utils.releaseSummaryLong = function releaseSummaryLong(slave) { permissions.push("you"); } if (permissions.length > 0) { - ret += " but permits " + permissions.reduce(function(res, ch, i, arr) { return res + (i === arr.length - 1 ? ' and ' : ', ') + ch; }); - } - if (rel.masturbation === 1) { - ret += ", and allowed to masturbate"; + return permissions.reduce(function(res, ch, i, arr) { return res + (i === arr.length - 1 ? ' and ' : ', ') + ch; }); + } else { + return "restrictive"; } - return ret; - } else { - return "no release rules"; } }; diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js index 03ce426239d71eb0f92e498c642749506d27e6be..084ea51d06e2220cd9c20c1cf637a6927c7576f7 100644 --- a/src/js/rulesAssistantOptions.js +++ b/src/js/rulesAssistantOptions.js @@ -1806,11 +1806,11 @@ globalThis.rulesAssistantOptions = (function() { ]; super("Clothes", items); - const nClothes = isItemAccessible.array(App.Data.slaveWear.niceClothes); + const nClothes = isItemAccessible.array(App.Data.clothes, "harsh", false); nClothes.sort(function(a, b) { if (a[0] < b[0]) { return -1; } if (a[0] > b[0]) { return 1; } return 0; }); this._nice = new ListSubSection(this, "Nice", nClothes); - const hClothes = isItemAccessible.array(App.Data.slaveWear.harshClothes); + const hClothes = isItemAccessible.array(App.Data.clothes, "harsh", true); hClothes.sort(function(a, b) { if (a[0] < b[0]) { return -1; } if (a[0] > b[0]) { return 1; } return 0; }); this._harsh = new ListSubSection(this, "Harsh", hClothes); @@ -1833,11 +1833,11 @@ globalThis.rulesAssistantOptions = (function() { ]; super("Collar", items); - const niceCollars = isItemAccessible.array(App.Data.slaveWear.niceCollars); + const niceCollars = isItemAccessible.array(App.Data.slaveWear.collars, "harsh", false); niceCollars.sort(function(a, b) { if (a[0] < b[0]) { return -1; } if (a[0] > b[0]) { return 1; } return 0; }); this._nice = new ListSubSection(this, "Nice", niceCollars); - const harshCollars = isItemAccessible.array(App.Data.slaveWear.harshCollars); + const harshCollars = isItemAccessible.array(App.Data.slaveWear.collars, "harsh", true); harshCollars.sort(function(a, b) { if (a[0] < b[0]) { return -1; } if (a[0] > b[0]) { return 1; } return 0; }); this._harsh = new ListSubSection(this, "Harsh", harshCollars); @@ -3029,32 +3029,7 @@ globalThis.rulesAssistantOptions = (function() { class HornColorList extends ListSelector { constructor() { - const pairs = [ - ["golden"], - ["copper"], - ["red"], - ["deep red"], - ["green"], - ["pink"], - ["dark brown"], - ["brown"], - ["burgundy"], - ["jet black"], - ["black"], - ["grey"], - ["silver"], - ["white"], - ["blue-violet"], - ["purple"], - ["dark orchid"], - ["sea green"], - ["green-yellow"], - ["dark blue"], - ["blazing red"], - ["neon green"], - ["neon blue"], - ["neon pink"] - ]; + const pairs = Array.from(App.Medicine.Modification.hornColor, color => [color]); super("Horn color", pairs); this.setValue(current_rule.set.hornColor); this.onchange = (value) => current_rule.set.hornColor = value; @@ -3081,18 +3056,7 @@ globalThis.rulesAssistantOptions = (function() { class EyebrowStyleList extends ListSelector { constructor() { - const pairs = [ - ["shaved"], - ["straight"], - ["rounded"], - ["natural"], - ["slanted inwards"], - ["slanted outwards"], - ["high-arched"], - ["elongated"], - ["shortened"], - ["curved"] - ]; + const pairs = Array.from(App.Medicine.Modification.eyebrowStyles, style => [style]); super("Eyebrow style", pairs); this.setValue(current_rule.set.eyebrowHStyle); this.onchange = (value) => current_rule.set.eyebrowHStyle = value; @@ -3101,15 +3065,7 @@ globalThis.rulesAssistantOptions = (function() { class EyebrowFullnessList extends ListSelector { constructor() { - const pairs = [ - ["pencil-thin"], - ["thin"], - ["threaded"], - ["natural"], - ["tapered"], - ["thick"], - ["bushy"] - ]; + const pairs = Array.from(App.Medicine.Modification.eyebrowFullness, fullness => [fullness]); super("Eyebrow fullness", pairs); this.setValue(current_rule.set.eyebrowFullness); this.onchange = (value) => current_rule.set.eyebrowFullness = value; @@ -3140,14 +3096,7 @@ globalThis.rulesAssistantOptions = (function() { class PubicHairStyleList extends ListSelector { constructor() { - const pairs = [ - ["waxed"], - ["in a strip"], - ["neat"], - ["bushy"], - ["bushy in the front and neat in the rear"], - ["very bushy"] - ]; + const pairs = Array.from(App.Medicine.Modification.pubicStyles, style => [style]); super("Pubic hairstyle", pairs); this.setValue(current_rule.set.pubicHStyle); this.onchange = (value) => current_rule.set.pubicHStyle = value; @@ -3165,12 +3114,7 @@ globalThis.rulesAssistantOptions = (function() { class ArmpitHairStyleList extends ListSelector { constructor() { - const pairs = [ - ["waxed"], - ["shaved"], - ["neat"], - ["bushy"] - ]; + const pairs = Array.from(App.Medicine.Modification.armpitStyles, style => [style]); super("Underarm hair style", pairs); this.setValue(current_rule.set.underArmHStyle); this.onchange = (value) => current_rule.set.underArmHStyle = value; @@ -4022,13 +3966,7 @@ globalThis.rulesAssistantOptions = (function() { ["pure black"], ["sun tanned"], ["spray tanned"], - ["dyed red"], - ["dyed green"], - ["dyed blue"], - ["dyed pink"], - ["dyed gray"], - ["tiger striped"], - ["camouflage patterned"], + ...App.Medicine.Modification.dyedSkins ]; super("Dye or tan skin", items); this.setValue(current_rule.set.skinColor); diff --git a/src/js/salon.js b/src/js/salon.js index 9a0e8ccdfd578613e480eb56978c00c947dab257..74916eb4ff5a80df035fa3a44c6ce96fda0e8b43 100644 --- a/src/js/salon.js +++ b/src/js/salon.js @@ -1,8 +1,9 @@ /** * @param {FC.HumanState} entity + * @param {Boolean} cheat * @returns {HTMLDivElement} */ -App.Medicine.Modification.eyeSelector = function(entity) { +App.Medicine.Modification.eyeSelector = function(entity, cheat = false) { const {He, him, his} = getPronouns(entity); const player = entity === V.PC; @@ -166,7 +167,9 @@ App.Medicine.Modification.eyeSelector = function(entity) { selectedPupil === "none" ? "" : selectedPupil, selectedSclera === "none" ? "" : selectedSclera, selectedSide); - cashX(forceNeg(V.modCost), "slaveMod", entity); + if (!cheat) { + cashX(forceNeg(V.modCost), "slaveMod", entity); + } App.UI.reload(); } @@ -226,463 +229,100 @@ App.Medicine.Modification.eyeSelector = function(entity) { * @param {object} params * @param {number|string} [params.primaryEarColor=0] * @param {string} [params.secondaryEarColor=""] - * @returns {JQuery<HTMLElement>} + * @param {Boolean} [params.cheat=false] + * @returns {HTMLElement} */ -App.Medicine.Salon.ears = function(slave, {primaryEarColor = 0, secondaryEarColor = ""} = {}) { - const frag = new DocumentFragment(); +App.Medicine.Salon.ears = function(slave, {primaryEarColor = 0, secondaryEarColor = "", cheat = false} = {}) { let updatePrimary = (newVal) => { primaryEarColor = newVal; apply(); }; let updateSecondary = (newVal) => { secondaryEarColor = newVal; apply(); }; + const container = document.createElement("div"); + container.id = "salon-ears"; + container.append(content()); + return container; - if (slave.earT !== "none" && slave.earTColor !== "hairless") { - const {His, his} = getPronouns(slave); - let div; - let p; - frag.append(`${His} fluffy ears are ${slave.earTColor}.`); - - div = document.createElement("div"); - div.classList.add("choices"); - if (slave.earTColor !== slave.hColor) { - div.append( - App.UI.DOM.link( - "Match current hair", - () => { - slave.earTColor = slave.hColor; - App.Art.refreshSlaveArt(slave, 3, "art-frame"); - apply(); - } - ) - ); - div.append(" or "); - App.UI.DOM.appendNewElement("span", div, "choose a new one: ", "note"); - } else { - App.UI.DOM.appendNewElement("span", div, `Choose a dye color before dyeing ${his} ears:`, "note"); - } - frag.append(div); - - div = document.createElement("div"); - div.classList.add("choices"); - 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(createList(App.Medicine.Modification.Color.Secondary, updateSecondary)); - frag.append(div); - - if (primaryEarColor !== 0) { - p = document.createElement("p"); - p.classList.add("choices"); - p.append( - App.UI.DOM.link( - `Color ${his} ears`, - () => { - slave.earTColor = (primaryEarColor + secondaryEarColor); - App.Art.refreshSlaveArt(slave, 3, "art-frame"); - cashX(forceNeg(V.modCost), "slaveMod", slave); - App.Medicine.Salon.ears(slave); // discard selections after locking them in. - } - ) - ); - p.append(` ${primaryEarColor}${secondaryEarColor} now?`); - frag.append(p); - } - } - return jQuery("#salon-ears").empty().append(frag); - - function createList(array, method) { - const links = []; - for (const item of array) { - const title = item.title || capFirstChar(item.value); - links.push( - App.UI.DOM.link( - title, - () => method(item.value) - ) - ); - } - return App.UI.DOM.generateLinksStrip(links); - } - function apply() { - App.Art.refreshSlaveArt(slave, 3, "art-frame"); - App.Medicine.Salon.ears( - slave, - { - primaryEarColor: primaryEarColor, - secondaryEarColor: secondaryEarColor, - } - ); - } -}; - -/** - * Update hair in salon - * @param {App.Entity.SlaveState} slave - * @param {object} params - * @param {number|string} [params.primaryHairColor] - * @param {string} [params.secondaryHairColor] - * @returns {JQuery<HTMLElement>} - */ -App.Medicine.Salon.hair = function(slave, {primaryHairColor = 0, secondaryHairColor = ""} = {}) { - const frag = new DocumentFragment(); - let updatePrimary = (newVal) => { primaryHairColor = newVal.value; apply(); }; - let updateSecondary = (newVal) => { secondaryHairColor = newVal.value; apply(); }; - const {His, his, He, him} = getPronouns(slave); - - if (slave.bald !== 1) { - frag.append(hairDye()); - frag.append(hairStyle()); - frag.append(hairLength()); - frag.append(hairMaint()); - } else { - // Bald - if (slave.hStyle === "bald") { - frag.append(`${He} is completely bald. `); - } else { - frag.append(wigDye()); - } - frag.append(wigStyle()); - frag.append(wigLength()); - } - return jQuery("#salon-hair").empty().append(frag); - - function hairDye() { - const frag = new DocumentFragment(); - let div; - let p; - frag.append(`${His} hair is ${slave.hColor}.`); - - div = document.createElement("div"); - div.classList.add("choices"); - if (slave.origHColor !== slave.hColor) { - div.append( - App.UI.DOM.link( - "Restore natural color", - () => { - slave.hColor = slave.origHColor; - App.Art.refreshSlaveArt(slave, 3, "art-frame"); - cashX(forceNeg(V.modCost), "slaveMod", slave); - apply(); - } - ) - ); - div.append(" or "); - App.UI.DOM.appendNewElement("span", div, "choose a new one: ", "note"); - } else { - App.UI.DOM.appendNewElement("span", div, `Choose a dye color before dyeing ${his} hair:`, "note"); - } - frag.append(div); - - div = document.createElement("div"); - div.classList.add("choices"); - 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(createList(App.Medicine.Modification.Color.Secondary, updateSecondary)); - frag.append(div); - - if (primaryHairColor !== 0) { - p = document.createElement("p"); - p.classList.add("choices"); - p.append( - App.UI.DOM.link( - `Color ${his} hair`, - () => { - slave.hColor = (primaryHairColor + secondaryHairColor); - App.Art.refreshSlaveArt(slave, 3, "art-frame"); - cashX(forceNeg(V.modCost), "slaveMod", slave); - App.Medicine.Salon.hair(slave); // discard selections after locking them in. - } - ) - ); - p.append(` ${primaryHairColor}${secondaryHairColor} now?`); - frag.append(p); - } - return frag; - } - - function hairStyle() { - const frag = new DocumentFragment(); - let div; - let method; - div = document.createElement("div"); - if (slave.hStyle !== "shaved") { - div.append(`${His} ${slave.hStyle} hair is ${lengthToEitherUnit(slave.hLength)} long. `); - } else { - div.append(`${His} hair is shaved smooth. `); - } - App.UI.DOM.appendNewElement("span", div, `General hairstyles will conform to hair length and clothing choices.`, "note"); - frag.append(div); - - // Normal styles - div = document.createElement("div"); - div.classList.add("choices"); - method = (newVal) => { - slave.hStyle = newVal.value; - cashX(forceNeg(V.modCost), "slaveMod", slave); - apply(); - }; - if (slave.hLength > 1) { - div.append(`Style ${his} hair:`); - div.append(createList(App.Medicine.Modification.hairStyles.Normal, method)); - } else { - App.UI.DOM.appendNewElement("span", div, `${His} hair is too short to style meaningfully`, "note"); - } - frag.append(div); - - // Short styles, includes cutting - div = document.createElement("div"); - div.classList.add("choices"); - method = (newVal) => { - slave.hStyle = newVal.value; - slave.hLength = newVal.hLength; - cashX(forceNeg(V.modCost), "slaveMod", slave); - apply(); - }; - if (slave.hLength > 1) { - div.append(`Cut and style ${his} hair:`); - div.append(createList(App.Medicine.Modification.hairStyles.Cut, method)); - } - frag.append(div); - - return frag; - } - - function hairLength() { + function content() { const frag = new DocumentFragment(); - let div = document.createElement("div"); - div.classList.add("choices"); - let method = (newVal) => { - if (newVal.hasOwnProperty("onApplication")) { - newVal.onApplication(slave); + if (slave.earT !== "none" && slave.earTColor !== "hairless") { + const {His, his} = getPronouns(slave); + let div; + let p; + frag.append(`${His} fluffy ears are ${slave.earTColor}.`); + + div = document.createElement("div"); + div.classList.add("choices"); + if (slave.earTColor !== slave.hColor) { + div.append( + App.UI.DOM.link( + "Match current hair", + () => { + slave.earTColor = slave.hColor; + App.Art.refreshSlaveArt(slave, 3, "art-frame"); + apply(); + } + ) + ); + div.append(" or "); + App.UI.DOM.appendNewElement("span", div, "choose a new one: ", "note"); + } else { + App.UI.DOM.appendNewElement("span", div, `Choose a dye color before dyeing ${his} ears:`, "note"); } - if (newVal.hasOwnProperty("hLength")) { - slave.hLength = newVal.hLength; + frag.append(div); + + div = document.createElement("div"); + div.classList.add("choices"); + 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(createList(App.Medicine.Modification.Color.Secondary, updateSecondary)); + frag.append(div); + + if (primaryEarColor !== 0) { + p = document.createElement("p"); + p.classList.add("choices"); + p.append( + App.UI.DOM.link( + `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. + } + ) + ); + p.append(` ${primaryEarColor}${secondaryEarColor} now?`); + frag.append(p); } - apply(); - }; - const oldHLength = (V.showInches === 2) ? Math.round(slave.hLength / 2.54) : slave.hLength; - - App.UI.DOM.appendNewElement("span", div, `Cut or lengthen ${his} hair:`); - div.append(createList(App.Medicine.Modification.hairStyles.Length, method)); - div.append(" | Custom length: "); - div.append( - App.UI.DOM.makeTextBox( - oldHLength, - v => { - v = Math.max(v, 0); // Positive hair length only - // If they entered "inches," convert - if (V.showInches === 2) { - v = Math.round(v * 2.54); - } - slave.hLength = v; - cashX(forceNeg(V.modCost), "slaveMod", slave); - apply(); - }, - true - ) - ); - if (V.showInches === 1) { - div.append(`cm (${cmToInchString(slave.hLength)})`); - } else if (V.showInches === 2) { - div.append(`inches`); } - - frag.append(div); - - return frag; - } - - function hairMaint() { - let div = document.createElement("div"); - div.classList.add("choices"); - div.append(`Have ${his} hair carefully maintained at its current length: `); - let haircuts; - let text; - if (slave.haircuts === 1) { - text = "Cease maintenance"; - haircuts = 0; - } else { - text = "Begin maintenance"; - haircuts = 1; - } - div.append( - App.UI.DOM.link( - text, - () => { - slave.haircuts = haircuts; - apply(); - } - ) - ); - return div; - } - - function wigDye() { - const frag = new DocumentFragment(); - let div; - let p; - frag.append(`${His} current wig is ${slave.hColor}. `); - - if (slave.hStyle !== "bald") { - frag.append( - App.UI.DOM.link( - "Remove wig", - () => { - slave.hStyle = "bald"; - slave.hLength = 0; - // I'm not going to charge you for taking off a fucking wig. - apply(); - } - ) - ); - frag.append(" or "); - App.UI.DOM.appendNewElement("span", frag, "choose a new one: ", "note"); - } else { - App.UI.DOM.appendNewElement("span", frag, `Choose a wig color:`, "note"); - } - - div = document.createElement("div"); - div.classList.add("choices"); - 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(createList(App.Medicine.Modification.Color.Secondary, updateSecondary)); - frag.append(div); - - if (primaryHairColor !== 0) { - p = document.createElement("p"); - p.classList.add("choices"); - p.append( - App.UI.DOM.link( - `Change`, - () => { - slave.earTColor = (primaryHairColor + secondaryHairColor); - App.Art.refreshSlaveArt(slave, 3, "art-frame"); - cashX(forceNeg(V.modCost), "slaveMod", slave); - App.Medicine.Salon.hair(slave); // discard selections after locking them in. - } - ) - ); - p.append(` ${his} wig color to ${primaryHairColor}${secondaryHairColor} now?`); - frag.append(p); - } - return frag; - } - - function wigLength() { - const frag = new DocumentFragment(); - if (slave.hStyle === "bald") { - return frag; - } - let div = document.createElement("div"); - div.classList.add("choices"); - const array = []; - for (const number of [10, 30, 60, 90, 120, 150]) { - const obj = {}; - obj.title = lengthToEitherUnit(number); - obj.hLength = number; - array.push(obj); - } - let method = (newVal) => { - slave.hLength = newVal.hLength; - apply(); - }; - const oldHLength = (V.showInches === 2) ? Math.round(slave.hLength / 2.54) : slave.hLength; - App.UI.DOM.appendNewElement("span", div, `Set wig length to:`, "choices"); - div.append(createList(array, method)); - div.append(" | Custom length: "); - div.append( - App.UI.DOM.makeTextBox( - oldHLength, - v => { - v = Math.max(v, 10); // Wigs must be at least 10 cm - // If they entered "inches," convert - if (V.showInches === 2) { - v = Math.round(v * 2.54); - } - slave.hLength = v; - cashX(forceNeg(V.modCost), "slaveMod", slave); - apply(); - }, - true - ) - ); - if (V.showInches === 1) { - div.append(`cm (${cmToInchString(slave.hLength)})`); - } else if (V.showInches === 2) { - div.append(`inches`); - } - - frag.append(div); - - return frag; - } - - function wigStyle() { - const frag = new DocumentFragment(); - let div = document.createElement("div"); - div.classList.add("choices"); - const method = (newVal) => { - slave.hStyle = newVal.value; - cashX(forceNeg(V.modCost), "slaveMod", slave); - apply(); - }; - - if (slave.hStyle !== "bald") { - frag.append(`${His} ${slave.hStyle} wig is ${lengthToEitherUnit(slave.hLength)} long. `); - } else { - frag.append(`${He} is not wearing a wig. `); - } - App.UI.DOM.appendNewElement("span", frag, `General hairstyles will conform to hair length and clothing choices.`, "note"); - - div = document.createElement("div"); - div.classList.add("choices"); - if (slave.hStyle === "bald") { - div.append(`Give ${him} a wig:`); - } else { - div.append(`Set wig style:`); - } - div.append(createList(App.Medicine.Modification.hairStyles.Normal, method)); - frag.append(div); return frag; } function createList(array, method) { const links = []; for (const item of array) { - if (item.hasOwnProperty("requirements")) { - if (item.requirements(slave) === false) { - continue; - } - } const title = item.title || capFirstChar(item.value); links.push( App.UI.DOM.link( title, - () => method(item) + () => method(item.value) ) ); } return App.UI.DOM.generateLinksStrip(links); } - function apply() { App.Art.refreshSlaveArt(slave, 3, "art-frame"); - App.Medicine.Salon.hair( + App.Medicine.Salon.ears( slave, { - primaryHairColor: primaryHairColor, - secondaryHairColor: secondaryHairColor, + primaryEarColor: primaryEarColor, + secondaryEarColor: secondaryEarColor, } ); } @@ -694,9 +334,10 @@ App.Medicine.Salon.hair = function(slave, {primaryHairColor = 0, secondaryHairCo * @param {object} params * @param {number|string} [params.primaryTailColor] * @param {string} [params.secondaryTailColor] + * @param {Boolean} [params.cheat] * @returns {JQuery<HTMLElement>} */ -App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailColor = ""} = {}) { +App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailColor = "", cheat = false} = {}) { const frag = new DocumentFragment(); let updatePrimary = (newVal) => { primaryTailColor = newVal.value; apply(); }; let updateSecondary = (newVal) => { secondaryTailColor = newVal.value; apply(); }; @@ -723,7 +364,9 @@ App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailCo () => { slave.tailColor = slave.hColor; App.Art.refreshSlaveArt(slave, 3, "art-frame"); - cashX(forceNeg(V.modCost), "slaveMod", slave); + if (!cheat) { + cashX(forceNeg(V.modCost), "slaveMod", slave); + } apply(); } ) @@ -756,7 +399,9 @@ App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailCo () => { slave.tailColor = (primaryTailColor + secondaryTailColor); App.Art.refreshSlaveArt(slave, 3, "art-frame"); - cashX(forceNeg(V.modCost), "slaveMod", slave); + if (!cheat) { + cashX(forceNeg(V.modCost), "slaveMod", slave); + } App.Medicine.Salon.tail(slave); // discard selections after locking them in. } ) diff --git a/src/js/statsChecker/statsChecker.js b/src/js/statsChecker/statsChecker.js index 461e30fdb1421aad863e3782e08c782694da47d0..4c94e5f40860ef9dda5431f208eab3e8fae95033 100644 --- a/src/js/statsChecker/statsChecker.js +++ b/src/js/statsChecker/statsChecker.js @@ -472,7 +472,7 @@ globalThis.bimboScore = function(slave) { if (slave.skin === "sun tanned" || slave.skin === "spray tanned") { degree++; } - if (setup.sluttyClothes.includes(slave.clothes)) { + if (App.Data.clothes.get(slave.clothes).exposure === 2) { degree++; } diff --git a/src/js/utilsFC.js b/src/js/utilsFC.js index febd84b8831a2472c3d0b5fcd362fba36b1013ac..ff6d0c4e524222a00017bf18f4d4e6397c2e8f64 100644 --- a/src/js/utilsFC.js +++ b/src/js/utilsFC.js @@ -2577,7 +2577,7 @@ globalThis.randomRaceHair = function(raceName) { * @returns {number} */ globalThis.skinToneLevel = function(skinTone) { - if (!setup.naturalSkins.includes(skinTone)) { + if (!App.Medicine.Modification.naturalSkins.includes(skinTone)) { return undefined; } const skinToMelanin = { @@ -2617,7 +2617,7 @@ globalThis.skinToneLevel = function(skinTone) { * @returns {string} */ globalThis.changeSkinTone = function(skin, value) { - if (!setup.naturalSkins.includes(skin)) { + if (!App.Medicine.Modification.naturalSkins.includes(skin)) { return skin; } const skinToMelanin = { @@ -2670,7 +2670,7 @@ globalThis.changeSkinTone = function(skin, value) { * @returns {number} */ globalThis.nippleColorLevel = function(color) { - if (!setup.naturalNippleColors.includes(color)) { + if (!App.Medicine.Modification.naturalNippleColors.includes(color)) { return undefined; } const nippleColor = { @@ -3084,3 +3084,4 @@ App.Utils.alphabetizeIterable = function(iterable) { const clonedArray = (Array.from(iterable)); return clonedArray.sort(compare); }; + diff --git a/src/markets/specificMarkets/customSlaveMarket.js b/src/markets/specificMarkets/customSlaveMarket.js index 16c09e908488c3e92ab4e2bfc453ea1bd37cc6c1..5838770da2fdae91ad4f50d3a54eb3143e8c507f 100644 --- a/src/markets/specificMarkets/customSlaveMarket.js +++ b/src/markets/specificMarkets/customSlaveMarket.js @@ -349,7 +349,7 @@ App.Markets["Custom Slave"] = function() { const choices = new Map([ ["left natural", "Left natural"] ]); - for (const skin of App.Data.misc.naturalSkins) { + for (const skin of App.Medicine.Modification.naturalSkins) { choices.set(skin, capFirstChar(skin)); } diff --git a/src/markets/specificMarkets/schoolFutanari.js b/src/markets/specificMarkets/schoolFutanari.js index 9bd0ba9588e877a223cc835ce3ac3754b3bb24bd..e5643fba810534ea45974fb56ca8b2779edc4bc6 100644 --- a/src/markets/specificMarkets/schoolFutanari.js +++ b/src/markets/specificMarkets/schoolFutanari.js @@ -21,120 +21,122 @@ App.Markets.TFS = function() { App.UI.DOM.appendNewElement("p", el, `It hasn't been long enough since you allowed them to use your organ farm to add ovaries to themselves for the effects to be obvious yet. Most of them are doubtless pregnant, however. There's been a subtle shift in their sexual behavior, too: they're much more likely to focus on vaginal sex than they were before, so much so that they often double penetrate each others' pussies. When there aren't any cunts available, they do their best to hold their orgasms until one opens up, so to speak.`); } } - } - App.UI.DOM.appendNewElement("p", el, `Visitors are not common: in fact, visitors are only as frequent as you feel like visiting. It takes a while before they notice you. When a dreamy-eyed young futa finally does, she reaches a lazy hand over to alert the eldest one present by tugging on one of her nipples and pointing in your direction. The elder looks over at you and gives you a friendly wave followed by a wait-one-moment gesture. She's curled up on her back with her cockhead in her own mouth, using both hands to give her own shaft a boob job while a younger futa is eats her ass and fingers her pussy. The futa matron orgasms promptly, sucking down her own cum. She gets up languidly, her plush body, softening forearm-sized dick, and enormous natural boobs making it a wonderful sight.`); + App.UI.DOM.appendNewElement("p", el, `Visitors are not common: in fact, visitors are only as frequent as you feel like visiting. It takes a while before they notice you. When a dreamy-eyed young futa finally does, she reaches a lazy hand over to alert the eldest one present by tugging on one of her nipples and pointing in your direction. The elder looks over at you and gives you a friendly wave followed by a wait-one-moment gesture. She's curled up on her back with her cockhead in her own mouth, using both hands to give her own shaft a boob job while a younger futa is eats her ass and fingers her pussy. The futa matron orgasms promptly, sucking down her own cum. She gets up languidly, her plush body, softening forearm-sized dick, and enormous natural boobs making it a wonderful sight.`); - if (V.PC.title === 1) { - r.push(`"Protector,`); - } else { - r.push(`"Protectrix,`); - } - r.push(`thank you so much for coming to see us. Our own Selection of a Sister to serve in slavery is not to take place for some time, but our communications interface in that side room," she points, "will permit you to access a regional listing of Selected Sisters ${(V.TFS.farmUpgrade > 0) ? `, all of which are fully fertile and produce their own natural female hormones, thanks to you` : ``}." She looks uncharacteristically uncertain. "Will you permit me to`); - if (V.PC.dick !== 0) { - if (V.PC.vagina !== -1) { - r.push(`worship your perfect genitalia`); + if (V.PC.title === 1) { + r.push(`"Protector,`); } else { - r.push(`serve your cock`); + r.push(`"Protectrix,`); } - } else { - r.push(`adore your pussy`); - } - r.push(`while you use it? I think my Sisters will forgive me the infidelity."`); - if (V.PC.dick !== 0 && V.PC.vagina !== -1 && V.PC.boobs >= 300) { - r.push(`She looks at you speculatively. "Or you could join us for a while."`); - } - const result = document.createElement("p"); - result.id = "result"; - App.UI.DOM.appendNewElement( - "div", - result, - App.UI.DOM.link( - "Let her give you oral while you browse", - () => { - r = []; - r.push(`You accept her offer, and she walks seductively over to the interface with the listing of available Sisters, getting down on her knees below it. When you step up to look through the listing, she presses her huge soft tits against your knees`); - if (V.PC.dick !== 0) { - if (V.PC.vagina !== -1) { - r.push(`and nuzzles her plush lips and hot tongue against your womanhood, using one hand to massage your shaft languidly. Perusing the very thorough pictures and videos of the pretty futanari for sale here is arousing enough without a truly masterful oral queen pleasing both your cock and your pussy, and you cum quickly. She drinks your cum rapturously and returns her mouth to your wet cunt, eagerly working to bring more forth.`); - } else { - r.push(`and snuggles her face between your thighs, nuzzling her nose into your ballsack before licking it with appetite and then sucking each of your balls gently, one by one. Meanwhile one of her clever hands is languidly massaging your shaft, bringing forth a drop of precum which she laps up with appetite. Humming with pleasure, she deepthroats you without apparent effort, her mischievous tongue flicking forward to lap at your scrotum. You blow your load down her throat, and she starts to suck you hard again.`); - } - } else { - r.push(`and trails nibbles and kisses along your inner thighs before nuzzling her plush lips and hot tongue against your womanhood. Perusing the very thorough pictures and videos of the pretty futanari for sale here is arousing enough without a truly masterful cunt pleaser working her magic between your legs, and you've orgasmed before you finish one listing. She prolongs the climax cleverly and then starts to build you towards another.`); - } - - jQuery("#result").empty().append(r.join(" ")); + r.push(`thank you so much for coming to see us. Our own Selection of a Sister to serve in slavery is not to take place for some time, but our communications interface in that side room," she points, "will permit you to access a regional listing of Selected Sisters ${(V.TFS.farmUpgrade > 0) ? `, all of which are fully fertile and produce their own natural female hormones, thanks to you` : ``}." She looks uncharacteristically uncertain. "Will you permit me to`); + if (V.PC.dick !== 0) { + if (V.PC.vagina !== -1) { + r.push(`worship your perfect genitalia`); + } else { + r.push(`serve your cock`); } - ) - ); + } else { + r.push(`adore your pussy`); + } + r.push(`while you use it? I think my Sisters will forgive me the infidelity."`); + if (V.PC.dick !== 0 && V.PC.vagina !== -1 && V.PC.boobs >= 300) { + r.push(`She looks at you speculatively. "Or you could join us for a while."`); + } + App.UI.DOM.appendNewElement("p", el, r.join(" ")); - if (V.PC.dick !== 0 && V.PC.vagina >= 0 && V.PC.boobs >= 300) { - App.UI.DOM.appendNewElement("div", result, + const result = App.UI.DOM.appendNewElement("p", el); + result.id = "result"; + App.UI.DOM.appendNewElement( + "div", + result, App.UI.DOM.link( - "Join the Sisters' orgy", + "Let her give you oral while you browse", () => { r = []; - V.futaAddiction += 1; - switch (V.futaAddiction) { - case 1: - r.push(`You agree to spend some time taking part in the Sisters' orgy. The futa matron looks doubtful. "You'd have to agree to act as one of us," she says. "No different. No special sexual treatment." Her voice rises cutely on the last syllable, as you take her enormous dick in one hand and begin to stroke it vigorously. "V-very well," she gasps, taking one of your breasts in each of her hands.`); - if (V.PC.vagina === 0) { - r.push(`You leave the Sisters' suite a few hours later, <span class="green">leaving your virginity behind.</span> You are tired and a bit sore, but satisfied.`); - V.PC.vagina = 1; - } else { - 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)); - } - 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)); - } - 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)); - } - 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)); - } - 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)); - } - 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)); - } - 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)); - } - break; - case 8: - V.gameover = "sisters"; - SugarCube.Engine.play("Gameover"); - break; - default: - V.futaAddiction = 0; + r.push(`You accept her offer, and she walks seductively over to the interface with the listing of available Sisters, getting down on her knees below it. When you step up to look through the listing, she presses her huge soft tits against your knees`); + if (V.PC.dick !== 0) { + if (V.PC.vagina !== -1) { + r.push(`and nuzzles her plush lips and hot tongue against your womanhood, using one hand to massage your shaft languidly. Perusing the very thorough pictures and videos of the pretty futanari for sale here is arousing enough without a truly masterful oral queen pleasing both your cock and your pussy, and you cum quickly. She drinks your cum rapturously and returns her mouth to your wet cunt, eagerly working to bring more forth.`); + } else { + r.push(`and snuggles her face between your thighs, nuzzling her nose into your ballsack before licking it with appetite and then sucking each of your balls gently, one by one. Meanwhile one of her clever hands is languidly massaging your shaft, bringing forth a drop of precum which she laps up with appetite. Humming with pleasure, she deepthroats you without apparent effort, her mischievous tongue flicking forward to lap at your scrotum. You blow your load down her throat, and she starts to suck you hard again.`); + } + } else { + r.push(`and trails nibbles and kisses along your inner thighs before nuzzling her plush lips and hot tongue against your womanhood. Perusing the very thorough pictures and videos of the pretty futanari for sale here is arousing enough without a truly masterful cunt pleaser working her magic between your legs, and you've orgasmed before you finish one listing. She prolongs the climax cleverly and then starts to build you towards another.`); } + jQuery("#result").empty().append(r.join(" ")); } ) ); + + if (V.PC.dick !== 0 && V.PC.vagina >= 0 && V.PC.boobs >= 300) { + App.UI.DOM.appendNewElement("div", result, + App.UI.DOM.link( + "Join the Sisters' orgy", + () => { + r = []; + V.futaAddiction += 1; + switch (V.futaAddiction) { + case 1: + r.push(`You agree to spend some time taking part in the Sisters' orgy. The futa matron looks doubtful. "You'd have to agree to act as one of us," she says. "No different. No special sexual treatment." Her voice rises cutely on the last syllable, as you take her enormous dick in one hand and begin to stroke it vigorously. "V-very well," she gasps, taking one of your breasts in each of her hands.`); + if (V.PC.vagina === 0) { + r.push(`You leave the Sisters' suite a few hours later, <span class="green">leaving your virginity behind.</span> You are tired and a bit sore, but satisfied.`); + V.PC.vagina = 1; + } else { + 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)); + } + 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)); + } + 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)); + } + 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)); + } + 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)); + } + 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)); + } + 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)); + } + break; + case 8: + V.gameover = "sisters"; + SugarCube.Engine.play("Gameover"); + break; + default: + V.futaAddiction = 0; + } + jQuery("#result").empty().append(r.join(" ")); + } + ) + ); + } } else { App.UI.DOM.appendNewElement("p", el, `The Futanari Sisters use the same legalistic structures as other slave schools, but are actually very different. They're quite enigmatic, and inquiry into their cult-like methods is politely discouraged. All the Sisters own the institution together, and seem to share the goal of pursuing transformation of themselves to fit the classic futanari fetish — that is, to transform themselves into beautiful, curvaceous women with large dicks. All Sisters remain within the closed society for at least seven years. The Sisters fund themselves by selling members into slavery: interestingly, the more impressive a member is, the older she seems to be when sold; there may be a sort of selection mechanism by which the losers are sold immediately and the winners remain, leading the Sisters. This does not mean that ex-Sisters are unhappy with enslavement. On the contrary, it seems to be an expected stage of their lives, and not shameful.`, "scene-intro"); if (V.TFS.schoolUpgrade !== 0) { diff --git a/src/npc/descriptions/descriptionWidgets.js b/src/npc/descriptions/descriptionWidgets.js index ee287553a7c6622338eaec17783d83d11a55ad3a..fc40a143f5189de6e64078d7de6291a5de458fb3 100644 --- a/src/npc/descriptions/descriptionWidgets.js +++ b/src/npc/descriptions/descriptionWidgets.js @@ -1502,7 +1502,7 @@ App.Desc.geneticQuirkAssessment = function(slave) { if (slave.geneticQuirks.uterineHypersensitivity === 2) { r.push(`${He} possesses a rare genetic trait that causes uterine hypersensitivity;`); if (slave.ovaries === 1 || slave.mpreg === 1) { - r.push(`pregnancy and birth will extremely pleasurable to ${him}.`); + r.push(`pregnancy and birth will be extremely pleasurable for ${him}.`); } else { r.push(`it has little effect on those unable to bear children.`); } diff --git a/src/npc/interaction/fAbuse.tw b/src/npc/interaction/fAbuse.tw index bc3ca37031738e907fb72e9831c5b55700323280..266ac82a3d89fda3428ec704e5af1ec552912de9 100644 --- a/src/npc/interaction/fAbuse.tw +++ b/src/npc/interaction/fAbuse.tw @@ -362,7 +362,7 @@ from your victim. <</if>> <</if>> -<<if (setup.dyedSkins.includes(getSlave($AS).skin))>> +<<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. diff --git a/src/npc/startingGirls/editFamily.js b/src/npc/startingGirls/editFamily.js new file mode 100644 index 0000000000000000000000000000000000000000..45b2e9b23ba66754aa22d8f0cbcf3bb2b6120ff3 --- /dev/null +++ b/src/npc/startingGirls/editFamily.js @@ -0,0 +1,479 @@ +App.Intro.editFamily = function(slave) { + const el = new DocumentFragment(); + 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()); + editFamily.append(makeElWithID("family-tree")); + el.append(editFamily); + + return el; + + function makeFamilyTable() { + const familyTable = makeElWithID("family-table"); + familyTable.append(summary()); + familyTable.append(makeElWithID("dont-be-dumb")); + familyTable.append(mother()); + familyTable.append(sameMotherAs()); + familyTable.append(father()); + familyTable.append(sameFatherAs()); + familyTable.append(motherOfTheChildren()); + familyTable.append(fatherOfTheChildren()); + if (_allowPCFamily) { + familyTable.append(resetAllRelativesOfPC()); + } + return familyTable; + } + + function summary() { + const familySummary = App.UI.DOM.makeElement("p"); + $(familySummary).append(App.Desc.family(slave)); + return familySummary; + } + + function mother() { + const div = document.createElement("div"); + const linkArray = []; + + div.append(`${slave.slaveName}'s mother is ${parentName("mother")}. `); + + linkArray.push( + App.UI.DOM.link( + "Reset", + () => { + slave.mother = 0; + refresh(); + } + ) + ); + + if (V.PC.vagina > 0 && isNotMom(V.PC) && ((V.PC.actualAge - slave.actualAge) >= V.fertilityAge) && _allowPCFamily) { + linkArray.push( + App.UI.DOM.link( + "You", + () => { + slave.mother = V.PC.ID; + refresh(); + } + ) + ); + } + + for (const potentialRel of V.slaves) { + if (potentialRel.vagina > 0 && isNotMom(potentialRel) && ((potentialRel.actualAge - slave.actualAge) >= potentialRel.pubertyAgeXX) && potentialRel.newGamePlus === 0) { + linkArray.push( + App.UI.DOM.link( + potentialRel.slaveName, + () => { + slave.mother = potentialRel.ID; + refresh(); + } + ) + ); + } + } + + div.append(App.UI.DOM.generateLinksStrip(linkArray)); + + return div; + } + + function father() { + const div = document.createElement("div"); + const linkArray = []; + + div.append(`${slave.slaveName}'s father is ${parentName("father")}. `); + + linkArray.push( + App.UI.DOM.link( + "Reset", + () => { + slave.father = 0; + refresh(); + } + ) + ); + + if (V.PC.dick > 0 && isNotDad(V.PC) && ((V.PC.actualAge - slave.actualAge) >= V.potencyAge) && _allowPCFamily) { + linkArray.push( + App.UI.DOM.link( + "You", + () => { + slave.father = V.PC.ID; + refresh(); + } + ) + ); + } + + for (const potentialRel of V.slaves) { + if (potentialRel.dick > 0 && isNotDad(potentialRel) && ((potentialRel.actualAge - slave.actualAge) >= potentialRel.pubertyAgeXY) && potentialRel.newGamePlus === 0) { + linkArray.push( + App.UI.DOM.link( + potentialRel.slaveName, + () => { + slave.father = potentialRel.ID; + refresh(); + } + ) + ); + } + } + + div.append(App.UI.DOM.generateLinksStrip(linkArray)); + + return div; + } + + function sameMotherAs() { + const div = document.createElement("div"); + const linkArray = []; + + if (slave.mother === -1) { + div.append(`You are ${his} mother, and also the mother of: `); + } else { + div.append(`${His} mom, ${parentName("mother")}, is also the mother of: `); + } + + div.append(App.StartingGirls.listOfSlavesWithParent('mother', slave.mother), " "); + + linkArray.push( + App.UI.DOM.link( + "Reset", + () => { + slave.mother = 0; + refresh(); + } + ) + ); + + if ((slave.mother !== V.PC.ID) && (V.PC.mother !== slave.ID) && _allowPCFamily) { + linkArray.push( + App.UI.DOM.link( + "You", + () => { + setRel(V.PC); + refresh(); + } + ) + ); + } + + for (const potentialRel of V.slaves) { + if ((slave.mother !== potentialRel.ID) && (potentialRel.mother !== slave.ID) && potentialRel.newGamePlus === 0) { + linkArray.push( + App.UI.DOM.link( + potentialRel.slaveName, + () => { + setRel(potentialRel); + refresh(); + } + ) + ); + } + } + + div.append(App.UI.DOM.generateLinksStrip(linkArray)); + + return div; + + function setRel(potentialRel) { + if (potentialRel.mother !== 0) { + slave.mother = potentialRel.mother; + } else if (slave.mother !== 0) { + potentialRel.mother = slave.mother; + } else { + slave.mother = -20 - 2*slave.ID; + potentialRel.mother = slave.mother; + } + } + } + + function sameFatherAs() { + const div = document.createElement("div"); + const linkArray = []; + + if (slave.father === -1) { + div.append(`You are ${his} father, and also the father of: `); + } else { + div.append(`${His} dad, ${parentName("father")}, is also the father of: `); + } + + div.append(App.StartingGirls.listOfSlavesWithParent('father', slave.father), " "); + + linkArray.push( + App.UI.DOM.link( + "Reset", + () => { + slave.father = 0; + refresh(); + } + ) + ); + + if ((slave.father !== V.PC.ID) && (V.PC.father !== slave.ID) && _allowPCFamily) { + linkArray.push( + App.UI.DOM.link( + "You", + () => { + setRel(V.PC); + refresh(); + } + ) + ); + } + + for (const potentialRel of V.slaves) { + if ((slave.father !== potentialRel.ID) && (potentialRel.father !== slave.ID) && potentialRel.newGamePlus === 0) { + linkArray.push( + App.UI.DOM.link( + potentialRel.slaveName, + () => { + setRel(potentialRel); + refresh(); + } + ) + ); + } + } + + div.append(App.UI.DOM.generateLinksStrip(linkArray)); + + return div; + + function setRel(potentialRel) { + if (potentialRel.father !== 0) { + slave.father = potentialRel.father; + } else if (slave.father !== 0) { + potentialRel.father = slave.father; + } else { + slave.father = -20 - 2*slave.ID; + potentialRel.father = slave.father; + } + } + } + + function motherOfTheChildren() { + const div = document.createElement("div"); + const linkArray = []; + + div.append(motheredNames()); + + linkArray.push( + App.UI.DOM.link( + "Reset", + () => { + for (const s of V.slaves) { + if (s.mother === slave.ID && s.newGamePlus === 0) { + s.mother = 0; + } + } + if (V.PC.mother === slave.ID && _allowPCFamily) { + V.PC.mother = 0; + } + refresh(); + } + ) + ); + + if (slave.vagina >= 0) { + if (isNotMom(V.PC) && (slave.actualAge - V.PC.actualAge) >= V.fertilityAge && _allowPCFamily) { + linkArray.push( + App.UI.DOM.link( + "You", + () => { + setRel(V.PC); + 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(); + } + ) + ); + } + } + } + + div.append(App.UI.DOM.generateLinksStrip(linkArray)); + + return div; + + function setRel(potentialRel) { + potentialRel.mother = slave.ID; + if (slave.vagina === 0) { + slave.vagina = 1; + } + } + } + + function motheredNames() { + const children = App.StartingGirls.listOfSlavesWithParent("mother", slave.ID); + if (children) { + return `${slave.slaveName} is the mother of these children: ${children}. Add: `; + } else { + return `${slave.slaveName} is not a mother to any children yet. Add: `; + } + } + + function fatherOfTheChildren() { + const div = document.createElement("div"); + const linkArray = []; + + div.append(fatheredNames()); + + linkArray.push( + App.UI.DOM.link( + "Reset", + () => { + for (const s of V.slaves) { + if (s.father === slave.ID && s.newGamePlus === 0) { + s.father = 0; + } + } + if (V.PC.father === slave.ID && _allowPCFamily) { + V.PC.father = 0; + } + refresh(); + } + ) + ); + + if (slave.dick > 0) { + if (isNotDad(V.PC) && (slave.actualAge - V.PC.actualAge) >= V.potencyAge && _allowPCFamily) { + linkArray.push( + App.UI.DOM.link( + "You", + () => { + V.PC.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(); + } + ) + ); + } + } + } + + div.append(App.UI.DOM.generateLinksStrip(linkArray)); + + return div; + } + + function fatheredNames() { + const children = App.StartingGirls.listOfSlavesWithParent("father", slave.ID); + if (children) { + return `${slave.slaveName} is the father of these children: ${children}. Add: `; + } else { + return `${slave.slaveName} is not a father to any children yet. Add: `; + } + } + + function resetAllRelativesOfPC() { + return App.UI.DOM.makeElement( + "div", + App.UI.DOM.link( + "Reset ALL PC Relatives", + () => { + let _sameMother = 0; + let _sameFather = 0; + + for (const s of V.slaves) { + if (s.newGamePlus === 0) { + if (s.mother === V.PC.ID) { + s.mother = 0; + } + if (s.father === V.PC.ID) { + s.father = 0; + } + if (s.mother === V.PC.mother) { + _sameMother++; + } + if (s.father === V.PC.father) { + _sameFather++; + } + } + } + if (_sameMother === 0 && slave.mother === V.PC.mother) { + slave.mother = 0; + } + if (_sameFather === 0 && slave.father === V.PC.father) { + slave.father = 0; + } + for (let _efw = 0; (_efw < V.slaves.length && (_sameMother === 1 || _sameFather === 1)); _efw++) { + if (V.slaves[_efw].newGamePlus === 0) { + if (V.slaves[_efw].mother === V.PC.mother && _sameMother === 1) { + V.slaves[_efw].mother = 0; + _sameMother = 0; + } + if (V.slaves[_efw].father === V.PC.father && _sameFather === 1) { + V.slaves[_efw].father = 0; + _sameFather = 0; + } + } + } + if (slave.mother === V.PC.ID) { + slave.mother = 0; + } + if (slave.father === V.PC.ID) { + slave.father = 0; + } + V.PC.father = 0; + V.PC.mother = 0; + refresh(); + } + ) + ); + } + + function makeElWithID(id, elType = "div") { + const el = document.createElement(elType); + el.id = id; + return el; + } + + /** + * + * @param {string} rel "mother", etc. Property of slave object. + */ + function parentName(rel) { + if (slave[rel] === V.PC.ID) { + return `You`; + } else { + const relObj = getSlave(slave[rel]); + return relObj ? relObj.slaveName : "unknown to you"; + } + } + + function refresh() { + jQuery('#family-table').replaceWith(makeFamilyTable); + jQuery('#dont-be-dumb').empty().append(App.UI.DOM.makeElement("div", "You will break things by making impossible relations such as being your own father. If you do this, clearing all PC relations will fix it. Probably.", "note")); + App.StartingGirls.uncommittedFamilyTree(slave); + } +}; diff --git a/src/npc/startingGirls/startingGirls.js b/src/npc/startingGirls/startingGirls.js index 15c12bda60d42096c1db238afecad3d0b9e7c5c5..10c209d4dca62a800339ec28c6379b4630d5bce6 100644 --- a/src/npc/startingGirls/startingGirls.js +++ b/src/npc/startingGirls/startingGirls.js @@ -37,11 +37,6 @@ App.StartingGirls.cleanup = function(slave) { resetEyeColor(slave, "both"); slave.origRace = slave.race; - slave.skin = slave.origSkin; - slave.hColor = slave.origHColor; - slave.eyebrowHColor = slave.hColor; - slave.pubicHColor = slave.hColor; - slave.underArmHColor = slave.hColor; if (slave.balls === 0) { slave.scrotum = 0; @@ -252,73 +247,6 @@ App.StartingGirls.uncommittedFamilyTree = function(slave) { renderFamilyTree(tSlaves, slave.ID); }; -App.StartingGirls.career = function(slave) { - let el = new DocumentFragment(); - let text; - let pullDown; - - if (V.AgePenalty === 1) { - if (slave.actualAge < 16) { - text = "Very young careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.veryYoung)); - } else if (slave.actualAge <= 24) { - text = "Young careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.young)); - } else if (slave.intelligenceImplant >= 15) { - text = "Educated careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.educated)); - } else { - text = "Uneducated careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.uneducated)); - } - } else { - if (slave.actualAge < 16) { - text = "Very young careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.veryYoung)); - } else if (slave.intelligenceImplant >= 15) { - text = "Educated careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.educated)); - } else if (slave.actualAge <= 24) { - text = "Young careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.young)); - } else { - text = "Uneducated careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.uneducated)); - } - } - function render(options) { - let select = document.createElement("select"); - select.classList.add("rajs-list"); - - for (const opt of options) { - let el = document.createElement("option"); - el.textContent = capFirstChar(opt); - el.value = opt; - if (slave.career === opt) { - el.selected = true; - } - select.appendChild(el); - } - select.onchange = () => { - slave.career = select.options[select.selectedIndex].value; - jQuery("#career-textbox").empty().append( - App.UI.DOM.makeTextBox( - slave.career, - v => { - slave.career = v; - }, - false, - ) - ); - }; - - return select; - } - el.append(text); - el.append(pullDown); - return el; -}; - App.StartingGirls.applyPlayerOrigin = function(slave) { switch (V.PC.career) { case "wealth": @@ -688,3 +616,736 @@ App.StartingGirls.applyPlayerOrigin = function(slave) { } } }; + +App.StartingGirls.physical = function(slave) { + const el = new DocumentFragment(); + const {he} = getPronouns(slave); + const options = new App.UI.OptionsGroup(); + let option; + + options.addOption("Condition", "condition", slave.health) + .addValueList([["Unhealthy", -40], ["Healthy", 0], ["Very healthy", 40], ["Extremely healthy", 80]]); + + options.addOption(`Height: ${heightToEitherUnit(slave.height)}`, "height", slave).showTextBox({unit: "cm"}) + .addRange(145, 150, "<", "Petite") + .addRange(155, 160, "<", "Short") + .addRange(165, 170, "<", "Average") + .addRange(180, 185, "<", "Tall") + .addRange(190, 185, ">=", "Very tall"); + option = options.addOption(`Average height for a ${slave.actualAge} year old """is ${heightToEitherUnit(Math.round(Height.mean(slave)))}"""`) + .customButton( + "Make average", + () => resyncSlaveHight(slave), + "" + ); + if (V.cheatMode === 1) { + option.customButton( + "Make dwarf", + () => slave.height = Height.random(slave, {limitMult: [-4, -1], spread: 0.15}), + "" + ) + .customButton( + "Make giant", + () => slave.height = Height.random(slave, {limitMult: [3, 10], spread: 0.15}), + "" + ); + } + + options.addOption("Weight", "weight", slave) + .addRange(-100, -95, "<", "Emaciated") + .addRange(-50, -30, "<", "Skinny") + .addRange(-20, -10, "<", "Thin") + .addRange(0, 10, "<", "Average") + .addRange(20, 30, "<", "Plush") + .addRange(50, 95, "<", "Chubby") + .addRange(100, 130, "<", "Fat") + .addRange(140, 160, "<", "Obese") + .addRange(180, 190, "<", "Super obese") + .addRange(200, 190, ">=", "Dangerously obese"); + + options.addOption("Muscles", "muscles", slave) + .addRange(-100, -96, "<", "Frail") + .addRange(-66, -51, "<", "Very weak") + .addRange(-41, -6, "<", "Weak") + .addRange(0, 5, "<", "Normal") + .addRange(20, 30, "<", "Toned") + .addRange(40, 50, "<", "Well built") + .addRange(65, 95, "<", "Quite muscular") + .addRange(100, 95, ">=", "Ripped"); + + options.addOption("Waist", "waist", slave) + .addRange(-100, -95, "<", " Absurd") + .addRange(-55, -40, "<", "Hourglass") + .addRange(-25, -15, "<", "Feminine") + .addRange(0, 10, "<", "Average") + .addRange(15, 40, "<", "Unattractive") + .addRange(55, 95, "<", "Ugly") + .addRange(100, 10, ">=", "Masculine"); + + option = options.addOption("Facial appearance", "faceShape", slave) + .addValue("Normal", "normal"); + if (V.seeDicks !== 0) { + option.addValue("Masculine", "masculine"); + } + option.addValueList([["Androgynous", "androgynous"], ["Cute", "cute"], ["Sensual", "sensual"], ["Exotic", "exotic"]]); + + options.addOption("Facial attractiveness", "face", slave) + .addRange(-100, -95, "<", "Very ugly") + .addRange(-55, -40, "<", "Ugly") + .addRange(-15, -10, "<", "Unattractive") + .addRange(0, 10, "<", "Average") + .addRange(15, 40, "<", "Attractive") + .addRange(55, 95, "<", "Beautiful") + .addRange(100, 95, ">=", "Very beautiful"); + + option = options.addOption("Lips", "lips", slave) + .addRange(5, 10, "<", "Thin") + .addRange(15, 20, "<", "Normal") + .addRange(25, 40, "<", "Pretty") + .addRange(55, 70, "<", "Plush"); + if (V.seeExtreme === 1) { + option.addRange(85, 95, "<", "Huge") + .addRange(100, 95, ">=", "Facepussy"); + } else { + option.addRange(85, 70, ">=", "Huge"); + } + + options.addOption("Voice", "voice", slave) + .addValueList([["Mute", 0], ["Deep", 1], ["Normal", 2], ["High", 3]]); + + if (slave.voice !== 0) { + options.addOption(V.language, "accent", slave) + .addValueList([ + ["Unaccented", 0], + [`Pretty ${aNational(slave.nationality)} accent`, 1], + [`Thick ${aNational(slave.nationality)} accent`, 2], + ["Not fluent", 3] + ]); + } + + option = options.addOption("Teeth", "teeth", slave) + .addValueList([ + ["Crooked", "crooked"], + ["Gapped", "gapped"], + ["Braces", "straightening braces"] + ]); + if (slave.physicalAge >= 12) { + if (slave.teeth === "baby" || slave.teeth === "mixed") { + slave.teeth = "normal"; + } + option.addValue("Straight", "normal"); + } else if (slave.physicalAge >= 6) { + if (slave.teeth === "baby" || slave.teeth === "normal" || slave.teeth === "") { + slave.teeth = "mixed"; + } + option.addValue("Mixed adult & child", "mixed"); + } else { + if (slave.teeth === "mixed" || slave.teeth === "normal" || slave.teeth === "") { + slave.teeth = "mixed"; + } + option.addValue("Baby", "baby"); + } + + options.addOption("Breasts", "boobs", slave).showTextBox({unit: "CCs"}) + .addRange(200, 200, "<=", "Flat (AA-cup)") + .addRange(300, 300, "<=", "Small (A-cup)") + .addRange(400, 400, "<=", "Medium (B-cup)") + .addRange(500, 500, "<=", "Healthy (C-cup)") + .addRange(800, 800, "<=", "Large (DD-cup)") + .addRange(1200, 1200, "<=", "Very Large (G-cup)") + .addRange(2050, 2050, "<=", "Huge (K-cup)") + .addRange(3950, 3950, "<=", "Massive (Q-cup)") + .addRange(6000, 6000, "<=", "Monstrous") + .addRange(8000, 6000, ">", "Science Experiment"); + + options.addOption("Natural shape", "boobShape", slave) + .addValueList([ + ["Normal", "normal"], + ["Perky", "perky"], + ["Torpedo-shaped", "torpedo-shaped"], + ["Wide-set", "wide-set"], + ["Downward-facing", "downward-facing"], + ["Saggy", "saggy"] + ]); + + options.addOption("Lactation", "lactation", slave) + .addValue("Artificial", 2, () => slave.lactationDuration = 2) + .addValue("Natural", 1, () => slave.lactationDuration = 2) + .addValue("None", 0); + + options.addOption("Nipples", "nipples", slave) + .addValueList([["Tiny", "tiny"], ["Cute", "cute"], ["Puffy", "puffy"], ["Partially Inverted", "partially inverted"], ["Inverted", "inverted"], ["Huge", "huge"]]); + + options.addOption("Areolae", "areolae", slave) + .addValueList([["Normal", 0], ["Large", 1], ["Wide", 2], ["Huge", 3], ["Massive", 4]]); + + options.addOption("Shoulders", "shoulders", slave) + .addValueList([["Very narrow", -2], ["Narrow", -1], ["Feminine", 0], ["Broad", 1], ["Very broad", 2]]); + + options.addOption("Hips", "hips", slave) + .addValueList([["Very narrow", -2], ["Narrow", -1], ["Normal", 0], ["Broad", 1], ["Very broad", 2]]); + + options.addOption("Butt", "butt", slave) + .addValueList([["Flat", 0], ["Small", 1], ["Plump", 2], ["Big", 3], ["Huge", 4], ["Enormous", 5], ["Gigantic", 6], ["Massive", 7]]); + + options.addOption("Anus", "anus", slave) + .addValueList([["Virgin", 0], ["Normal", 1], ["Veteran", 2], ["Gaping", 3]]); + + if (slave.anus > 0) { + let comment; + if (slave.analArea <= slave.anus) { + comment = "Recently stretched to current size."; + } else if (slave.analArea - slave.anus === 1) { + comment = "Used to current size."; + } else { + comment = "Very broad."; + } + options.addOption("External anus appearance", "anus", slave) + .addValueList([ + ["Recently stretched", slave.analArea = slave.anus], + ["Used to current size", slave.analArea = slave.anus+1], + ["Very broad", slave.analArea = slave.anus+2], + ]).addComment(comment); + } + + options.addOption("Vagina", "vagina", slave) + .addValue("No vagina", -1, () => { + slave.preg = 0; + WombFlush(slave); + slave.belly = 0; + slave.bellyPreg = 0; + slave.pubertyXX = 0; + slave.pubertyAgeXX = V.fertilityAge; + slave.ovaries= 0; + }) + .addValue("Virgin", 0, () => { + slave.preg = -1; + slave.belly = 0; + slave.bellyPreg = 0; + slave.ovaries = 1; + }) + .addValue("Normal", 1, () => { + slave.preg = -1; + slave.belly = 0; + slave.bellyPreg = 0; + slave.ovaries = 1; + }) + .addValue("Veteran", 2, () => { + slave.preg = -1; + slave.belly = 0; + slave.bellyPreg = 0; + slave.ovaries = 1; + }) + .addValue("Gaping", 3, () => { + slave.preg = -1; + slave.belly = 0; + slave.bellyPreg = 0; + slave.ovaries = 1; + }); + + if (slave.vagina > -1) { + if (slave.dick === 0) { + options.addOption("Clit", "clit", slave) + .addValueList([["Normal", 0], ["Large", 1], ["Huge", 2]]); + } + + options.addOption("Labia", "labia", slave) + .addValueList([["Normal", 0], ["Large", 1], ["Huge", 2], ["Huge Dangling", 3]]); + + options.addOption("Vaginal wetness", "vaginaLube", slave) + .addValueList([["Dry", 0], ["Normal", 1], ["Excessive", 2]]); + + if (V.seePreg !== 0) { + /* This is only shown if slave has vagina */ + options.addOption("Puberty", "pubertyXX", slave) + .addValue("Prepubescent", 0, () => { + slave.pubertyAgeXX = V.fertilityAge; + slave.belly = 0; + slave.bellyPreg = 0; + WombFlush(slave); + }).addValue("Postpubescent", 1); + + options.addOption("Age of puberty", "pubertyAgeXX", slave).showTextBox(); + + if (slave.pubertyXX === 1) { + option = options.addOption("Pregnancy", "preg", slave); + if (V.seeHyperPreg === 1 && V.cheatMode === 1) { + option.addValue("Bursting at the seams", 43, () => { + slave.pregType = 150; + slave.pregWeek = 43; + slave.pregKnown = 1; + slave.belly = 2700000; + slave.bellyPreg = 2700000; + slave.pubertyXX = 1; + }); + if (slave.preg === 43) { + option.addComment("Extreme hyper pregnancy!"); + } + } + option.addValue("Completely Filled", 42, () => { + slave.pregType = 8; + slave.pregWeek = 42; + slave.pregKnown = 1; + slave.belly = 120000; + slave.bellyPreg = 120000; + slave.pubertyXX = 1; + }).addValue("Ready to drop", 40, () => { + slave.pregType = 1; + slave.pregWeek = 40; + slave.pregKnown = 1; + slave.belly = 15000; + slave.bellyPreg = 15000; + slave.pubertyXX = 1; + }).addValue("Advanced", 34, () => { + slave.pregType = 1; + slave.pregWeek = 34; + slave.pregKnown = 1; + slave.belly = 10000; + slave.bellyPreg = 10000; + slave.pubertyXX = 1; + }).addValue("Showing", 27, () => { + slave.pregType = 1; + slave.pregWeek = 27; + slave.pregKnown = 1; + slave.belly = 5000; + slave.bellyPreg = 5000; + slave.pubertyXX = 1; + }).addValue("Early", 12, () => { + slave.pregType = 1; + slave.pregWeek = 12; + slave.pregKnown = 1; + slave.belly = 100; + slave.bellyPreg = 100; + slave.pubertyXX = 1; + }).addValue("None", 0, () => { + slave.pregType = 0; + slave.belly = 0; + slave.bellyPreg = 0; + slave.pregSource = 0; + slave.pregWeek = 0; + slave.pregKnown = 0; + }).addValue("Contraceptives", -1, () => { + slave.pregType = 0; + slave.belly = 0; + slave.bellyPreg = 0; + slave.pregSource = 0; + slave.pregWeek = 0; + slave.pregKnown = 0; + }).addValue("Barren", -2, () => { + slave.pregType = 0; + slave.belly = 0; + slave.bellyPreg = 0; + slave.pregSource = 0; + slave.pregWeek = 0; + slave.pregKnown = 0; + }); + options.addOption("Births", "birthsTotal", slave.counter).showTextBox().addComment(`How many times ${he} has already given birth, not necessarily while owned by you.`); + } + + if (V.PC.dick > 0 && slave.preg > 0) { + options.addOption("Father of child", "pregSource", slave) + .addValueList([["My child", -1], ["Not me", 0]]); + } + } + } + + if (V.seeDicks !== 0 || V.makeDicks === 1) { + options.addOption("Penis", "dick", slave) + .addValue("None", 0, () => { + slave.balls = 0; + slave.pubertyXY = 0; + slave.pubertyAgeXY = V.potencyAge; + }) + .addValue("Tiny", 1, () => slave.clit = 0) + .addValue("Small", 2, () => slave.clit = 0) + .addValue("Normal", 3, () => slave.clit = 0) + .addValue("Large", 4, () => slave.clit = 0) + .addValue("Massive", 5, () => slave.clit = 0); + + if (slave.dick > 0) { + option = options.addOption("Foreskin", "foreskin", slave); + if (V.seeCircumcision === 1) { + option.addValue("Circumcised", 0); + } else if (slave.foreskin === 0) { + slave.foreskin = 3; + } + option.addValueList([["Tiny", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]]); + } + + options.addOption("Testicles", "balls", slave) + .addValue("None", 0, () => { + slave.pubertyXY = 0; + slave.pubertyAgeXY = V.potencyAge; + slave.scrotum = 0; + }).addValueList([["Vestigial", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]]); + + options.addOption("Age of Male Puberty", "pubertyAgeXY", slave).showTextBox(); + + if (slave.balls > 0) { + options.addOption("Ballsack", "scrotum", slave) + .addValueList([["None", 0], ["Tiny", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]]); + + options.addOption("Male Puberty", "pubertyXY", slave) + .addValue("Prepubescent", 0, () => slave.pubertyAgeXY = V.potencyAge) + .addValue("Postpubescent", 1); + } + } + + options.addOption("Prostate", "prostate", slave) + .addValueList([ + ["No prostate", 0], + ["Has a prostate", 1] + ]); + + const optionLeft = options.addOption("Left eye", "vision", slave.eye.left); + const optionRight = options.addOption("Right eye", "vision", slave.eye.right); + optionLeft.addValueList([["Normal", 2], ["Nearsighted", 1]]); + optionRight.addValueList([["Normal", 2], ["Nearsighted", 1]]); + if (V.seeExtreme === 1) { + optionLeft.addValue("Blind", 0); + optionRight.addValue("Blind", 0); + } else { + if (slave.eye.left.vision === 0) { + slave.eye.left.vision = 2; + } + if (slave.eye.right.vision === 0) { + slave.eye.right.vision = 2; + } + } + option = options.addOption("Natural eye color", "origColor", slave.eye); + for (const color of App.Medicine.Modification.eyeColor.map(color => color.value)) { + option.addValue(capFirstChar(color), color); + } + option.pulldown(); + + option = options.addOption("Hearing", "hears", slave); + option.addValueList([["Normal", 0], ["Hard of hearing", -1]]); + if (V.seeExtreme === 1) { + option.addValue("Deaf", -2); + } else if (slave.hears === 0) { + slave.hears = 2; + } + + if (V.seeExtreme === 1) { + options.addOption("Smell ability", "smells", slave) + .addValueList([["Normal", 0], ["None", -1]]); + + options.addOption("Taste ability", "tastes", slave) + .addValueList([["Normal", 0], ["None", -1]]); + + State.temporary.LA = hasLeftArm(slave); + options.addOption("Left arm", "LA", State.temporary) + .addValue("Healthy", true, () => slave.arm.left = new App.Entity.LimbState()) + .addValue("Amputated", false, () => slave.arm.left = null); + + State.temporary.RA = hasRightArm(slave); + options.addOption("Right arm", "RA", State.temporary) + .addValue("Healthy", true, () => slave.arm.right = new App.Entity.LimbState()) + .addValue("Amputated", false, () => slave.arm.right = null); + + State.temporary.LL = hasLeftLeg(slave); + options.addOption("Left leg", "LL", State.temporary) + .addValue("Healthy", true, () => slave.leg.left = new App.Entity.LimbState()) + .addValue("Amputated", false, () => slave.leg.left = null); + + State.temporary.RL = hasRightLeg(slave); + options.addOption("Right leg", "RL", State.temporary) + .addValue("Healthy", true, () => slave.leg.right = new App.Entity.LimbState()) + .addValue("Amputated", false, () => slave.leg.right = null); + } + + el.append(options.render()); + return el; +}; + +App.StartingGirls.profile = function(slave) { + const el = new DocumentFragment(); + let options = new App.UI.OptionsGroup(); + let r; + let option; + const {His} = getPronouns(slave); + + options.addOption("Birth name", "birthName", slave).showTextBox(); + options.addOption("Slave name", "slaveName", slave).showTextBox(); + options.addOption("Birth surname", "birthSurname", slave).showTextBox(); + options.addOption("Slave surname", "slaveSurname", slave).showTextBox(); + + option = options.addOption("Career", "career", slave).showTextBox(); + let careers; + let text; + if (V.AgePenalty === 1) { + if (slave.actualAge < 16) { + text = "Very young careers"; + careers = App.Data.Careers.General.veryYoung; + } else if (slave.actualAge <= 24) { + text = "Young careers"; + careers = App.Utils.alphabetizeIterable(App.Data.Careers.General.young); + } else if (slave.intelligenceImplant >= 15) { + text = "Educated careers"; + careers = App.Utils.alphabetizeIterable(App.Data.Careers.General.educated); + } else { + text = "Uneducated careers"; + careers = App.Utils.alphabetizeIterable(App.Data.Careers.General.uneducated); + } + } else { + if (slave.actualAge < 16) { + text = "Very young careers"; + careers = App.Utils.alphabetizeIterable(App.Data.Careers.General.veryYoung); + } else if (slave.intelligenceImplant >= 15) { + text = "Educated careers"; + careers = App.Utils.alphabetizeIterable(App.Data.Careers.General.educated); + } else if (slave.actualAge <= 24) { + text = "Young careers"; + careers = App.Utils.alphabetizeIterable(App.Data.Careers.General.young); + } else { + text = "Uneducated careers"; + careers = App.Utils.alphabetizeIterable(App.Data.Careers.General.uneducated); + } + } + for (const career of careers) { + option.addValue(capFirstChar(career), career); + } + option.addComment(text).pulldown(); + + options.addOption("Legal status", "indenture", slave) + .addValue("Slave", -1, () => slave.indentureRestrictions = 0) + .addRange(52, 0, ">=", "Indentured Servant"); + if (slave.indenture > -1) { + options.addOption("Remaining weeks", "indenture", slave).showTextBox(); + + options.addOption("Indenture restrictions", "indentureRestrictions", slave) + .addValueList([["None", 0], ["Protective", 1], ["Restrictive", 2]]); + } + + options.addOption("Age", "actualAge", slave).showTextBox() + .customButton("Resync characteristics to age", () => resyncSlaveToAge(slave), "") + .customButton("Resync only height to age", () => slave.height = Height.random(slave), "") + .addComment("It is recommended to resync if you change age significantly"); + + options.addOption("Birth week", "birthWeek", slave).showTextBox(); + + options.addOption("Genes", "genes", slave) + .addValue("XX (Female)", "XX", () => { + slave.dick = 0; + slave.balls = 0; + slave.clit = 0; + slave.pubertyXY = 0; + slave.pubertyAgeXY = V.potencyAge; + slave.pubertyXX = (slave.pubertyAgeXX < slave.actualAge ? 1 : 0); + slave.vagina = Math.max(0, slave.vagina); + slave.boobs = Math.max(500, slave.boobs); + slave.balls = 0; + slave.scrotum = 0; + slave.prostate = 0; + slave.shoulders = either(-2, -1, 0); + slave.hips = either(-2, -1, 0); + }).addValue("XY (Male)", "XY", () => { + slave.dick = 3; + slave.vagina = -1; + WombFlush(slave); + slave.belly = 0; + slave.bellyPreg = 0; + slave.pubertyXY = (slave.pubertyAgeXY < slave.actualAge ? 1 : 0); + slave.pubertyXX = 0; + slave.pubertyAgeXX = V.fertilityAge; + slave.ovaries = 0; + slave.boobs = 0; + slave.balls = 3; + slave.scrotum = 3; + slave.prostate = 1; + slave.shoulders = either(0, 1, 2); + slave.hips = either(0, 1, 2); + }); + + option = options.addOption("Prestige", "prestige", slave) + .addValueList([["None", 0], ["Locally known", 1], ["Regionally famous", 2], ["World renowned", 3]]); + if (slave.prestige > 0) { + r = []; + r.push("Starting slaves incur an extreme cost penalty for prestige. This slave's"); + if (slave.actualAge >= 25) { + if (slave.actualAge > 35) { + r.push(" advanced"); + } + r.push(" age decreases the penalty."); + } else { + r.push(" young age requires paying the full penalty."); + } + option.addComment(`<span class=warning>${r.join(" ")}</span>`); + } + + options.addOption(`${His} nationality is`, "nationality", slave).showTextBox() + .addValueList(App.Data.misc.baseNationalities) + .pulldown(); + + + if (V.seeRace === 1) { + options.addOption(`${His} ethnicity is`, "race", slave).showTextBox().pulldown() + .addValueList([["White", "white"], ["Asian", "asian"], ["Latina", "latina"], ["Middle Eastern", "middle eastern"], + ["Black", "black"], ["Semitic", "semitic"], ["Southern European", "southern european"], ["Indo-Aryan", "indo-aryan"], + ["Amerindian", "amerindian"], ["Pacific Islander", "pacific islander"], ["Malay", "malay"], ["Mixed Race", "mixed race"]]); + } + + el.append(options.render()); + App.UI.DOM.appendNewElement("h3", el, "Optional customizations"); + options = new App.UI.OptionsGroup(); + + options.addOption("Origin story", "origin", slave).showTextBox({large: true}).addComment("Use complete, capitalized and punctuated sentences."); + + options.addOption("Origin override", "originOverride", V) + .addValue("Enable", 1).on() + .addValue("Disable", 0).off() + .addComment("Prevent Starting Girls from overwriting custom origin and tattoo with its defaults."); + + if (slave.prestige) { + options.addOption("Prestige description", "prestigeDesc", V).showTextBox().addComment("Use complete, capitalized and punctuated sentences."); + } + options.addOption("Description", "desc", slave.custom).showTextBox().addComment("Use complete, capitalized and punctuated sentences."); + options.addOption("Label", "label", slave.custom).showTextBox().addComment("Use a short phrase"); + + + el.append(options.render()); + return el; +}; + +App.StartingGirls.mental = function(slave) { + const el = new DocumentFragment(); + const options = new App.UI.OptionsGroup(); + let option; + let r; + + options.addOption("Intelligence", "intelligence", slave) + .addValueList([["Moronic", -100], ["Very stupid", -60], ["Stupid", -30], ["Average", 0], ["Smart", 30], ["Very smart", 60], ["Brilliant", 100]]); + + options.addOption("Education", "intelligenceImplant", slave) + .addValueList([["Uneducated", 0], ["Educated", 15], ["Well educated", 30]]); + + option = options.addOption("Devotion", "devotion", slave).showTextBox() + .addRange(-100, -95, "<", "Utterly hateful") + .addRange(-70, -50, "<", "Hateful") + .addRange(-35, -20, "<", "Resistant") + .addRange(0, 20, "<", "Ambivalent") + .addRange(35, 50, "<", "Accepting") + .addRange(70, 95, "<", "Devoted") + .addRange(100, 95, ">=", "Worshipful"); + if (slave.devotion > 20) { + r = []; + r.push("Starting slaves incur"); + if (slave.devotion > 50) { + r.push("severe cost penalty at very high"); + } else { + r.push("an additional cost penalty at high"); + } + r.push("levels of devotion. This slave's"); + if (slave.actualAge >= 25) { + if (slave.actualAge > 35) { + r.push("advanced"); + } + r.push("age decreases the penalty."); + } else { + r.push("young age requires paying the full penalty."); + } + option.addComment(`<span class=warning>${r.join(" ")}</span>`); + } + + options.addOption("Trust", "trust", slave).showTextBox() + .addRange(-100, -95, "<", "Abjectly terrified") + .addRange(-70, -50, "<", "Terrified") + .addRange(-35, -20, "<", "Frightened") + .addRange(0, 20, "<", "Fearful") + .addRange(35, 50, "<", "Careful") + .addRange(70, 95, "<", "Trusting") + .addRange(100, 95, ">=", "Absolute trust"); + + + + if (slave.fetishKnown === 0) { + options.addOption("Fetish", "fetishKnown", slave) + .addValueList([["Unknown", 0], ["Known", 1]]); + } else { + option = options.addOption("Fetish", "fetish", slave) + .addValue("Unknown", "", () => { + slave.fetish = either("boobs", "buttslut", "cumslut", "dom", "humiliation", "masochist", "pregnancy", "sadist", + "submissive", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none"); + slave.fetishKnown = 0; + }).addValueList([["None", "none"], ["Sub", "submissive"], ["Dom", "dom"], ["Cumslut", "cumslut"], ["Humiliation", "humiliation"], + ["Buttslut", "buttslut"], ["Breasts", "boobs"], ["Pregnancy", "pregnancy"], ["Sadism", "sadist"], ["Masochism", "masochist"]]); + if (V.seeExtreme === 1) { + option.addValue("Mindbroken", "mindbroken", () => { + slave.fetishStrength = 10; + slave.sexualFlaw = "none"; + slave.sexualQuirk = "none"; + slave.behavioralFlaw = "none"; + slave.behavioralQuirk = "none"; + }); + } + + if (slave.fetish !== "none" && slave.fetish !== "mindbroken") { + options.addOption("Fetish strength", "fetishStrength", slave) + .addRange(15, 30, "<=", "Very Low") + .addRange(45, 60, "<=", "Low") + .addRange(75, 85, "<=", "Normal") + .addRange(90, 95, "<=", "High") + .addRange(100, 95, ">", "Extremely High"); + } + } + + options.addOption("Sexuality", "attrKnown", slave) + .addValue("Known", 1, () => { + slave.attrXX = random(0, 100); + slave.attrXY = random(0, 100); + slave.energy = random(1, 90); + }).on() + .addValue("Unknown", 0).off(); + if (slave.attrKnown === 1) { + options.addOption("Attraction to men", "attrXY", slave) + .addRange(0, 5, "<=", "Disgusted").off() + .addRange(10, 15, "<=", "Turned off").off() + .addRange(25, 35, "<=", "Not attracted").off() + .addRange(50, 65, "<=", "Indifferent").neutral() + .addRange(75, 85, "<=", "Attracted").on() + .addRange(90, 95, "<=", "Aroused").on() + .addRange(100, 95, ">", "Passionate").on(); + options.addOption("Attraction to women", "attrXX", slave) + .addRange(0, 5, "<=", "Disgusted").off() + .addRange(10, 15, "<=", "Turned off").off() + .addRange(25, 35, "<=", "Not attracted").off() + .addRange(50, 65, "<=", "Indifferent").neutral() + .addRange(75, 85, "<=", "Attracted").on() + .addRange(90, 95, "<=", "Aroused").on() + .addRange(100, 95, ">", "Passionate").on(); + + options.addOption("Sex drive", "energy", slave) + .addRange(5, 10, "<=", "Frigid").off() + .addRange(25, 40, "<=", "Poor").off() + .addRange(45, 60, "<=", "Average").neutral() + .addRange(65, 80, "<=", "Powerful").on() + .addRange(85, 99, "<=", "Sex addict").on() + .addRange(100, 99, ">", "Nympho").on(); + } + + if (slave.fetish !== "mindbroken") { + options.addOption("Behavioral Flaw", "behavioralFlaw", slave) + .addValueList([["None", "none"], ["Arrogant", "arrogant"], ["Bitchy", "bitchy"], ["Odd", "odd"], ["Hates Men", "hates men"], + ["Hates Women", "hates women"], ["Anorexic", "anorexic"], ["Gluttonous", "gluttonous"], ["Devout", "devout"], + ["Liberated", "liberated"]]); + + options.addOption("Behavioral Quirk", "behavioralQuirk", slave) + .addValueList([["None", "none"], ["Confident", "confident"], ["Cutting", "cutting"], ["Funny", "funny"], + ["Adores Men", "adores men"], ["Adores Women", "adores women"], ["Insecure", "insecure"], ["Fitness", "fitness"], + ["Sinful", "sinful"], ["Advocate", "advocate"]]); + + options.addOption("Sexual Flaw", "sexualFlaw", slave) + .addValueList([["None", "none"], ["Hates Oral", "hates oral"], ["Hates Anal", "hates anal"], + ["Hates Penetration", "hates penetration"], ["Repressed", "repressed"], ["Shamefast", "shamefast"], ["Apathetic", "apathetic"], + ["Crude", "crude"], ["Judgemental", "judgemental"], ["Sexually idealistic", "idealistic"]]); + + options.addOption("Sexual Quirk", "sexualQuirk", slave) + .addValueList([["None", "none"], ["Oral", "gagfuck queen"], ["Anal", "painal queen"], ["Penetration", "strugglefuck queen"], + ["Perverted", "perverted"], ["Tease", "tease"], ["Caring", "caring"], ["Unflinching", "unflinching"], ["Size queen", "size queen"], + ["Romantic", "romantic"]]); + } + + el.append(options.render()); + + return el; +}; diff --git a/src/npc/startingGirls/startingGirls.tw b/src/npc/startingGirls/startingGirls.tw index d6725d87aad3bda27525b826db77885f6b3b8ea4..6dc4e30a17bbc6c267dfbcebb163fd38ab8faefa 100644 --- a/src/npc/startingGirls/startingGirls.tw +++ b/src/npc/startingGirls/startingGirls.tw @@ -200,13 +200,13 @@ <h2>You are customizing this slave:</h2> <<includeDOM App.Desc.longSlave(V.activeSlave, {market: "generic"})>> <div class="tab-bar"> - <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Overview')" id="tab Overview">Overview</button> + <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'profile')" id="tab profile">Profile</button> <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Physical')" id="tab Physical">Physical</button> <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Mental')" id="tab Mental">Mental</button> <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Skills')" id="tab Skills">Skills</button> <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Family', App.StartingGirls.uncommittedFamilyTree(V.activeSlave))" id="tab Family">Family</button> <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'body-mods')" id="tab body-mods">Body Mods</button> - <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Customization')" id="tab Customization">Customization</button> + <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'salon')" id="tab salon">Salon</button> <<if $cash >= _slaveCost>> <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'assignRemove')" id="tab assignRemove">Finalize</button> <<else>> @@ -216,607 +216,21 @@ <<run App.Utils.setLocalPronouns($activeSlave)>> -<div id="Overview" class="tab-content"> +<div id="profile" class="tab-content"> <div class="content"> - - <<set _options = new App.UI.OptionsGroup()>> - - <<set _option = _options.addOption("Devotion", "devotion", $activeSlave).showTextBox() - .addRange(-100, -95, "<", "Utterly hateful") - .addRange(-70, -50, "<", "Hateful") - .addRange(-35, -20, "<", "Resistant") - .addRange(0, 20, "<", "Ambivalent") - .addRange(35, 50, "<", "Accepting") - .addRange(70, 95, "<", "Devoted") - .addRange(100, 95, ">=", "Worshipful")>> - <<if $activeSlave.devotion > 20>> - <<set _comment = "Starting slaves incur">> - <<if $activeSlave.devotion > 50>> - <<run _comment += " severe cost penalty at very high">> - <<else>> - <<run _comment += " an additional cost penalty at high">> - <</if>> - <<run _comment += " levels of devotion. This slave's">> - <<if $activeSlave.actualAge >= 25>> - <<if $activeSlave.actualAge > 35>>advanced <</if>> - <<run _comment += " age decreases the penalty.">> - <<else>> - <<run _comment += " young age requires paying the full penalty.">> - <</if>> - <<run _option.addComment(`<span class=warning>${_comment}</span>`)>> - <</if>> - - <<run _options.addOption("Trust", "trust", $activeSlave).showTextBox() - .addRange(-100, -95, "<", "Abjectly terrified") - .addRange(-70, -50, "<", "Terrified") - .addRange(-35, -20, "<", "Frightened") - .addRange(0, 20, "<", "Fearful") - .addRange(35, 50, "<", "Careful") - .addRange(70, 95, "<", "Trusting") - .addRange(100, 95, ">=", "Absolute trust")>> - - <<run _options.addOption("Legal status", "indenture", $activeSlave) - .addValue("Slave", -1, () => V.activeSlave.indentureRestrictions = 0) - .addRange(52, 0, ">=", "Indentured Servant")>> - <<if $activeSlave.indenture > -1>> - <<run _options.addOption("Remaining weeks", "indenture", $activeSlave).showTextBox()>> - - <<run _options.addOption("Indenture restrictions", "indentureRestrictions", $activeSlave) - .addValueList([["None", 0], ["Protective", 1], ["Restrictive", 2]])>> - <</if>> - - <<run _options.addOption("Age", "actualAge", $activeSlave).showTextBox() - .customButton("Resync characteristics to age", () => resyncSlaveToAge(V.activeSlave)) - .customButton("Resync only height to age", () => V.activeSlave.height = Height.random(V.activeSlave)) - .addComment("It is recommended to resync if you change age significantly")>> - - <<run _options.addOption("Birth week", "birthWeek", $activeSlave).showTextBox()>> - - <<run _options.addOption("Genes", "genes", $activeSlave) - .addValue("XX (Female)", "XX", () => { - V.activeSlave.dick = 0; - V.activeSlave.balls = 0; - V.activeSlave.clit = 0; - V.activeSlave.pubertyXY = 0; - V.activeSlave.pubertyAgeXY = V.potencyAge; - V.activeSlave.pubertyXX = (V.activeSlave.pubertyAgeXX < V.activeSlave.actualAge ? 1 : 0); - V.activeSlave.vagina = Math.max(0, V.activeSlave.vagina); - V.activeSlave.boobs = Math.max(500, V.activeSlave.boobs); - V.activeSlave.balls = 0; - V.activeSlave.scrotum = 0; - V.activeSlave.prostate = 0; - V.activeSlave.shoulders = either(-2,-1,0); - V.activeSlave.hips = either(-2,-1,0); - }).addValue("XY (Male)", "XY", () => { - V.activeSlave.dick = 3; - V.activeSlave.vagina = -1; - WombFlush(V.activeSlave); - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.pubertyXY = (V.activeSlave.pubertyAgeXY < V.activeSlave.actualAge ? 1 : 0); - V.activeSlave.pubertyXX = 0; - V.activeSlave.pubertyAgeXX = V.fertilityAge; - V.activeSlave.ovaries = 0; - V.activeSlave.boobs = 0; - V.activeSlave.balls = 3; - V.activeSlave.scrotum = 3; - V.activeSlave.prostate = 1; - V.activeSlave.shoulders = either(0,1,2); - V.activeSlave.hips = either(0,1,2); - })>> - - <<run _options.addOption("Condition", "condition", $activeSlave.health) - .addValueList([["Unhealthy", -40], ["Healthy", 0], ["Very healthy", 40], ["Extremely healthy", 80]])>> - - <<set _option = _options.addOption("Prestige", "prestige", $activeSlave) - .addValueList([["None", 0], ["Locally known", 1], ["Regionally famous", 2], ["World renowned", 3]])>> - <<if $activeSlave.prestige > 0>> - <<set _comment = "Starting slaves incur an extreme cost penalty for prestige. This slave's">> - <<if $activeSlave.actualAge >= 25>> - <<if $activeSlave.actualAge > 35>> - <<set _comment += " advanced">> - <</if>> - <<set _comment += " age decreases the penalty.">> - <<else>> - <<set _comment += " young age requires paying the full penalty.">> - <</if>> - <<run _option.addComment(`<span class=warning>${_comment}</span>`)>> - <</if>> - - <<run _options.addOption("$His nationality is", "nationality", $activeSlave).showTextBox() - .addValueList(Object.keys(App.Data.SlaveSummary.short.nationality))>> - - <<if $seeRace == 1>> - <<run _options.addOption("$His ethnicity is", "race", $activeSlave).showTextBox() - .addValueList([["White", "white"], ["Asian", "asian"], ["Latina", "latina"], ["Middle Eastern", "middle eastern"], - ["Black", "black"], ["Semitic", "semitic"], ["Southern European", "southern european"], ["Indo-Aryan", "indo-aryan"], - ["Amerindian", "amerindian"], ["Pacific Islander", "pacific islander"], ["Malay", "malay"], ["Mixed Race", "mixed race"]])>> - <</if>> - - <<run _options.addOption("$His skin color is", "origSkin", $activeSlave).showTextBox() - .addValueList([["Pure White", "pure white"], ["Ivory", "ivory"], ["White", "white"], ["Extremely Pale", "extremely pale"], - ["Very Pale", "very pale"], ["Pale", "pale"], ["Extremely Fair", "extremely fair"], ["Very Fair", "very fair"], - ["Fair", "fair"], ["Light", "light"], ["Light Olive", "light olive"], ["Tan", "tan"], ["Olive", "olive"], ["Bronze", "bronze"], - ["Dark Olive", "dark olive"], ["Dark", "dark"], ["Light Beige", "light beige"], ["Beige", "beige"], - ["Dark Beige", "dark beige"], ["Light Brown", "light brown"], ["Brown", "brown"], ["Dark Brown", "dark brown"], - ["Black", "black"], ["Ebony", "ebony"], ["Pure Black", "pure black"]])>> - - <<run _options.addOption("Intelligence", "intelligence", $activeSlave) - .addValueList([["Moronic", -100], ["Very stupid", -60], ["Stupid", -30], ["Average", 0], ["Smart", 30], ["Very smart", 60], ["Brilliant", 100]])>> - - <<run _options.addOption("Education", "intelligenceImplant", $activeSlave) - .addValueList([["Uneducated", 0], ["Educated", 15], ["Well educated", 30]])>> - - <<includeDOM _options.render()>> + <<includeDOM App.StartingGirls.profile($activeSlave)>> </div> </div> <div id="Physical" class="tab-content"> <div class="content"> - - <<set _options = new App.UI.OptionsGroup()>> - - <<run _options.addOption(`Height: ${heightToEitherUnit($activeSlave.height)}`, "height", $activeSlave).showTextBox("cm") - .addRange(145, 150, "<", "Petite") - .addRange(155, 160, "<", "Short") - .addRange(165, 170, "<", "Average") - .addRange(180, 185, "<", "Tall") - .addRange(190, 185, ">=", "Very tall")>> - <<set _option = _options.addOption(`Average height for a ${$activeSlave.actualAge} year old """is ${heightToEitherUnit(Math.round(Height.mean(V.activeSlave)))}"""`) - .customButton("Make average", () => resyncSlaveHight($activeSlave))>> - <<if $cheatMode === 1>> - <<run _option.customButton("Make dwarf", () => V.activeSlave.height = Height.random(V.activeSlave, {limitMult: [-4, -1], spread: 0.15})) - .customButton("Make giant", () => V.activeSlave.height = Height.random(V.activeSlave, {limitMult: [3, 10], spread: 0.15}))>> - <</if>> - - <<run _options.addOption("Weight", "weight", $activeSlave) - .addRange(-100, -95, "<", "Emaciated") - .addRange(-50, -30, "<", "Skinny") - .addRange(-20, -10, "<", "Thin") - .addRange(0, 10, "<", "Average") - .addRange(20, 30, "<", "Plush") - .addRange(50, 95, "<", "Chubby") - .addRange(100, 130, "<", "Fat") - .addRange(140, 160, "<", "Obese") - .addRange(180, 190, "<", "Super obese") - .addRange(200, 190, ">=", "Dangerously obese")>> - - <<run _options.addOption("Muscles", "muscles", $activeSlave) - .addRange(-100, -96, "<", "Frail") - .addRange(-66, -51, "<", "Very weak") - .addRange(-41, -6, "<", "Weak") - .addRange(0, 5, "<", "Normal") - .addRange(20, 30, "<", "Toned") - .addRange(40, 50, "<", "Well built") - .addRange(65, 95, "<", "Quite muscular") - .addRange(100, 95, ">=", "Ripped")>> - - <<run _options.addOption("Waist", "waist", $activeSlave) - .addRange(-100, -95, "<", " Absurd") - .addRange(-55, -40, "<", "Hourglass") - .addRange(-25, -15, "<", "Feminine") - .addRange(0, 10, "<", "Average") - .addRange(15, 40, "<", "Unattractive") - .addRange(55, 95, "<", "Ugly") - .addRange(100, 10, ">=", "Masculine")>> - - <<set _option = _options.addOption("Facial appearance", "faceShape", $activeSlave) - .addValue("Normal", "normal")>> - <<if $seeDicks !== 0>> - <<run _option.addValue("Masculine", "masculine")>> - <</if>> - <<run _option.addValueList([["Androgynous", "androgynous"], ["Cute", "cute"], ["Sensual", "sensual"], ["Exotic", "exotic"]])>> - - <<run _options.addOption("Facial attractiveness", "face", $activeSlave) - .addRange(-100, -95, "<", "Very ugly") - .addRange(-55, -40, "<", "Ugly") - .addRange(-15, -10, "<", "Unattractive") - .addRange(0, 10, "<", "Average") - .addRange(15, 40, "<", "Attractive") - .addRange(55, 95, "<", "Beautiful") - .addRange(100, 95, ">=", "Very beautiful")>> - - <<set _option = _options.addOption("Lips", "lips", $activeSlave) - .addRange(5, 10, "<", "Thin") - .addRange(15, 20, "<", "Normal") - .addRange(25, 40, "<", "Pretty") - .addRange(55, 70, "<", "Plush")>> - <<if $seeExtreme == 1>> - <<run _option.addRange(85, 95, "<", "Huge") - .addRange(100, 95, ">=", "Facepussy")>> - <<else>> - <<run _option.addRange(85, 70, ">=", "Huge")>> - <</if>> - - <<run _options.addOption("Voice", "voice", $activeSlave) - .addValueList([["Mute", 0], ["Deep", 1], ["Normal", 2], ["High", 3]])>> - - <<if $activeSlave.voice !== 0>> - <<run _options.addOption("$language", "accent", $activeSlave) - .addValueList([["Unaccented", 0], [`Pretty ${aNational($activeSlave.nationality)} accent`, 1], - [`Thick ${aNational($activeSlave.nationality)} accent`, 2], ["Not fluent", 3]])>> - <</if>> - - <<set _option = _options.addOption("Teeth", "teeth", $activeSlave) - .addValueList([["Crooked", "crooked"], ["Gapped", "gapped"], ["Braces", "straightening braces"]])>> - <<if $activeSlave.physicalAge >= 12>> - <<if $activeSlave.teeth == "baby" || $activeSlave.teeth == "mixed">> - <<set $activeSlave.teeth = "normal">> - <</if>> - <<run _option.addValue("Straight", "normal")>> - <<elseif $activeSlave.physicalAge >= 6>> - <<if $activeSlave.teeth == "baby" || $activeSlave.teeth == "normal" || $activeSlave.teeth == "">> - <<set $activeSlave.teeth = "mixed">> - <</if>> - <<run _option.addValue("Mixed adult & child", "mixed")>> - <<else>> - <<if $activeSlave.teeth == "mixed" || $activeSlave.teeth == "normal" || $activeSlave.teeth == "">> - <<set $activeSlave.teeth = "mixed">> - <</if>> - <<run _option.addValue("Baby", "baby")>> - <</if>> - - <<run _options.addOption("Breasts", "boobs", $activeSlave).showTextBox("CCs") - .addRange(200, 200, "<=", "Flat (AA-cup)") - .addRange(300, 300, "<=", "Small (A-cup)") - .addRange(400, 400, "<=", "Medium (B-cup)") - .addRange(500, 500, "<=", "Healthy (C-cup)") - .addRange(800, 800, "<=", "Large (DD-cup)") - .addRange(1200, 1200, "<=", "Very Large (G-cup)") - .addRange(2050, 2050, "<=", "Huge (K-cup)") - .addRange(3950, 3950, "<=", "Massive (Q-cup)") - .addRange(6000, 6000, "<=", "Monstrous") - .addRange(8000, 6000, ">", "Science Experiment")>> - - <<run _options.addOption("Lactation", "lactation", $activeSlave) - .addValue("Artificial", 2, () => V.activeSlave.lactationDuration = 2) - .addValue("Natural", 1, () => V.activeSlave.lactationDuration = 2) - .addValue("None", 0)>> - - <<run _options.addOption("Nipples", "nipples", $activeSlave) - .addValueList([["Tiny", "tiny"], ["Cute", "cute"], ["Puffy", "puffy"], ["Partially Inverted", "partially inverted"], ["Inverted", "inverted"], ["Huge", "huge"]])>> - - <<run _options.addOption("Areolae", "areolae", $activeSlave) - .addValueList([["Normal", 0], ["Large", 1], ["Wide", 2], ["Huge", 3], ["Massive", 4]])>> - - <<run _options.addOption("Shoulders", "shoulders", $activeSlave) - .addValueList([["Very narrow", -2], ["Narrow", -1], ["Feminine", 0], ["Broad", 1], ["Very broad", 2]])>> - - <<run _options.addOption("Hips", "hips", $activeSlave) - .addValueList([["Very narrow", -2], ["Narrow", -1], ["Normal", 0], ["Broad", 1], ["Very broad", 2]])>> - - <<run _options.addOption("Butt", "butt", $activeSlave) - .addValueList([["Flat", 0], ["Small", 1], ["Plump", 2], ["Big", 3], ["Huge", 4], ["Enormous", 5], ["Gigantic", 6], ["Massive", 7]])>> - - <<run _options.addOption("Anus", "anus", $activeSlave) - .addValueList([["Virgin", 0], ["Normal", 1], ["Veteran", 2], ["Gaping", 3]])>> - - <<run _options.addOption("Vagina", "vagina", $activeSlave) - .addValue("No vagina", -1, () => { - V.activeSlave.preg = 0; - WombFlush(V.activeSlave); - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.pubertyXX = 0; - V.activeSlave.pubertyAgeXX = V.fertilityAge; - V.activeSlave.ovaries = 0; - }).addValue("Virgin", 0, () => { - V.activeSlave.preg = -1; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.ovaries = 1 - }).addValue("Normal", 1, () => { - V.activeSlave.preg = -1; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.ovaries = 1 - }).addValue("Veteran", 2, () => { - V.activeSlave.preg = -1; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.ovaries = 1 - }).addValue("Gaping", 3, () => { - V.activeSlave.preg = -1; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.ovaries = 1 - })>> - - <<if $activeSlave.vagina > -1>> - <<if $activeSlave.dick === 0>> - <<run _options.addOption("Clit", "clit", $activeSlave) - .addValueList([["Normal", 0], ["Large", 1], ["Huge", 2]])>> - <</if>> - - <<run _options.addOption("Labia", "labia", $activeSlave) - .addValueList([["Normal", 0], ["Large", 1], ["Huge", 2], ["Huge Dangling", 3]])>> - - <<run _options.addOption("Vaginal wetness", "vaginaLube", $activeSlave) - .addValueList([["Dry", 0], ["Normal", 1], ["Excessive", 2]])>> - - <<if $seePreg !== 0>> - /* This is only shown if slave has vagina */ - <<run _options.addOption("Puberty", "pubertyXX", $activeSlave) - .addValue("Prepubescent", 0, () => { - V.activeSlave.pubertyAgeXX = V.fertilityAge; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - WombFlush(V.activeSlave) - }).addValue("Postpubescent", 1)>> - - <<run _options.addOption("Age of puberty", "pubertyAgeXX", $activeSlave).showTextBox()>> - - <<if $activeSlave.pubertyXX === 1>> - <<set _option = _options.addOption("Pregnancy", "preg", $activeSlave)>> - <<if $seeHyperPreg === 1 && $cheatMode === 1>> - <<run _option.addValue("Bursting at the seams", 43, () => { - V.activeSlave.pregType = 150; - V.activeSlave.pregWeek = 43; - V.activeSlave.pregKnown = 1; - V.activeSlave.belly = 2700000; - V.activeSlave.bellyPreg = 2700000; - V.activeSlave.pubertyXX = 1; - })>> - <<if $activeSlave.preg === 43>> - <<run _option.addComment("Extreme hyper pregnancy!")>> - <</if>> - <</if>> - <<run _option.addValue("Completely Filled", 42, () => { - V.activeSlave.pregType = 8; - V.activeSlave.pregWeek = 42; - V.activeSlave.pregKnown = 1; - V.activeSlave.belly = 120000; - V.activeSlave.bellyPreg = 120000; - V.activeSlave.pubertyXX = 1; - }).addValue("Ready to drop", 40, () => { - V.activeSlave.pregType = 1; - V.activeSlave.pregWeek = 40; - V.activeSlave.pregKnown = 1; - V.activeSlave.belly = 15000; - V.activeSlave.bellyPreg = 15000; - V.activeSlave.pubertyXX = 1; - }).addValue("Advanced", 34, () => { - V.activeSlave.pregType = 1; - V.activeSlave.pregWeek = 34; - V.activeSlave.pregKnown = 1; - V.activeSlave.belly = 10000; - V.activeSlave.bellyPreg = 10000; - V.activeSlave.pubertyXX = 1; - }).addValue("Showing", 27, () => { - V.activeSlave.pregType = 1; - V.activeSlave.pregWeek = 27; - V.activeSlave.pregKnown = 1; - V.activeSlave.belly = 5000; - V.activeSlave.bellyPreg = 5000; - V.activeSlave.pubertyXX = 1; - }).addValue("Early", 12, () => { - V.activeSlave.pregType = 1; - V.activeSlave.pregWeek = 12; - V.activeSlave.pregKnown = 1; - V.activeSlave.belly = 100; - V.activeSlave.bellyPreg = 100; - V.activeSlave.pubertyXX = 1; - }).addValue("None", 0, () => { - V.activeSlave.pregType = 0; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.pregSource = 0; - V.activeSlave.pregWeek = 0; - V.activeSlave.pregKnown = 0; - }).addValue("Contraceptives", -1, () => { - V.activeSlave.pregType = 0; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.pregSource = 0; - V.activeSlave.pregWeek = 0; - V.activeSlave.pregKnown = 0; - }).addValue("Barren", -2, () => { - V.activeSlave.pregType = 0; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.pregSource = 0; - V.activeSlave.pregWeek = 0; - V.activeSlave.pregKnown = 0; - })>> - <</if>> - - <<if $PC.dick > 0 && $activeSlave.preg > 0>> - <<run _options.addOption("Father of child", "pregSource", $activeSlave) - .addValueList([["My child", -1], ["Not me", 0]])>> - <</if>> - <</if>> - <</if>> - - <<if $seeDicks !== 0 || $makeDicks === 1>> - <<run _options.addOption("Penis", "dick", $activeSlave) - .addValue("None", 0, () => { - V.activeSlave.balls = 0; - V.activeSlave.pubertyXY = 0; - V.activeSlave.pubertyAgeXY = V.potencyAge; - }).addValue("Tiny", 1, () => {V.activeSlave.clit = 0}) - .addValue("Small", 2, () => {V.activeSlave.clit = 0}) - .addValue("Normal", 3, () => {V.activeSlave.clit = 0}) - .addValue("Large", 4, () => {V.activeSlave.clit = 0}) - .addValue("Massive", 5, () => {V.activeSlave.clit = 0})>> - - <<if $activeSlave.dick > 0>> - <<set _option = _options.addOption("Foreskin", "foreskin", $activeSlave)>> - <<if $seeCircumcision === 1>> - <<run _option.addValue("Circumcised", 0)>> - <<elseif $activeSlave.foreskin === 0>> - <<set $activeSlave.foreskin = 3>> - <</if>> - <<run _option.addValueList([["Tiny", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]])>> - <</if>> - - <<run _options.addOption("Testicles", "balls", $activeSlave) - .addValue("None", 0, () => { - V.activeSlave.pubertyXY = 0; - V.activeSlave.pubertyAgeXY = V.potencyAge; - V.activeSlave.scrotum = 0; - }).addValueList([["Vestigial", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]])>> - - <<run _options.addOption("Age of Male Puberty", "pubertyAgeXY", $activeSlave).showTextBox()>> - - <<if $activeSlave.balls > 0>> - <<run _options.addOption("Ballsack", "scrotum", $activeSlave) - .addValueList([["None", 0], ["Tiny", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]])>> - - <<run _options.addOption("Male Puberty", "pubertyXY", $activeSlave) - .addValue("Prepubescent", 0, () => {V.activeSlave.pubertyAgeXY = V.potencyAge}) - .addValue("Postpubescent", 1)>> - <</if>> - <</if>> - - <<run _options.addOption("Prostate", "prostate", $activeSlave) - .addValueList([["No prostate", 0], ["Has a prostate", 1]])>> - - <<set _optionLeft = _options.addOption("Left eye", "vision", $activeSlave.eye.left)>> - <<set _optionRight = _options.addOption("Right eye", "vision", $activeSlave.eye.right)>> - <<run _optionLeft.addValueList([["Normal", 2], ["Nearsighted", 1]]), _optionRight.addValueList([["Normal", 2], ["Nearsighted", 1]])>> - <<if $seeExtreme === 1>> - <<run _optionLeft.addValue("Blind", 0), _optionRight.addValue("Blind", 0)>> - <<else>> - <<if $activeSlave.eye.left.vision === 0>> - <<set $activeSlave.eye.left.vision = 2>> - <</if>> - <<if $activeSlave.eye.right.vision === 0>> - <<set $activeSlave.eye.right.vision = 2>> - <</if>> - <</if>> - - <<set _option = _options.addOption("Hearing", "hears", $activeSlave)>> - <<run _option.addValueList([["Normal", 0], ["Hard of hearing", -1]])>> - <<if $seeExtreme == 1>> - <<run _option.addValue("Deaf", -2)>> - <<elseif $activeSlave.hears === 0>> - <<set $activeSlave.hears = 2>> - <</if>> - - - <<if $seeExtreme == 1>> - <<run _options.addOption("Smell ability", "smells", $activeSlave) - .addValueList([["Normal", 0], ["None", -1]])>> - - <<run _options.addOption("Taste ability", "tastes", $activeSlave) - .addValueList([["Normal", 0], ["None", -1]])>> - - <<set _LA = hasLeftArm($activeSlave)>> - <<run _options.addOption("Left arm", "LA", State.temporary) - .addValue("Healthy", true, () => V.activeSlave.arm.left = new App.Entity.LimbState()) - .addValue("Amputated", false, () => V.activeSlave.arm.left = null)>> - - <<set _RA = hasRightArm($activeSlave)>> - <<run _options.addOption("Right arm", "RA", State.temporary) - .addValue("Healthy", true, () => V.activeSlave.arm.right = new App.Entity.LimbState()) - .addValue("Amputated", false, () => V.activeSlave.arm.right = null)>> - - <<set _LL = hasLeftLeg($activeSlave)>> - <<run _options.addOption("Left leg", "LL", State.temporary) - .addValue("Healthy", true, () => V.activeSlave.leg.left = new App.Entity.LimbState()) - .addValue("Amputated", false, () => V.activeSlave.leg.left = null)>> - - <<set _RL = hasRightLeg($activeSlave)>> - <<run _options.addOption("Right leg", "RL", State.temporary) - .addValue("Healthy", true, () => V.activeSlave.leg.right = new App.Entity.LimbState()) - .addValue("Amputated", false, () => V.activeSlave.leg.right = null)>> - <</if>> - - <<includeDOM _options.render()>> + <<includeDOM App.StartingGirls.physical($activeSlave)>> </div> </div> <div id="Mental" class="tab-content"> <div class="content"> - - <<set _options = new App.UI.OptionsGroup()>> - <<if $activeSlave.fetishKnown === 0>> - <<run _options.addOption("Fetish", "fetishKnown", $activeSlave) - .addValueList([["Unknown", 0], ["Known", 1]])>> - <<else>> - <<set _option = _options.addOption("Fetish", "fetish", $activeSlave) - .addValue("Unknown", "", () => { - V.activeSlave.fetish = either("boobs", "buttslut", "cumslut", "dom", "humiliation", "masochist", "pregnancy", "sadist", - "submissive", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none"); - V.activeSlave.fetishKnown = 0 - }).addValueList([["None", "none"], ["Sub", "submissive"], ["Dom", "dom"], ["Cumslut", "cumslut"], ["Humiliation", "humiliation"], - ["Buttslut", "buttslut"], ["Breasts", "boobs"], ["Pregnancy", "pregnancy"], ["Sadism", "sadist"], ["Masochism", "masochist"]])>> - <<if $seeExtreme === 1>> - <<run _option.addValue("Mindbroken", "mindbroken", () => { - V.activeSlave.fetishStrength = 10; - V.activeSlave.sexualFlaw = "none"; - V.activeSlave.sexualQuirk = "none"; - V.activeSlave.behavioralFlaw = "none"; - V.activeSlave.behavioralQuirk = "none"; - })>> - <</if>> - - <<if $activeSlave.fetish !== "none" && $activeSlave.fetish !== "mindbroken">> - <<run _options.addOption("Fetish strength", "fetishStrength", $activeSlave) - .addRange(15, 30, "<=", "Very Low") - .addRange(45, 60, "<=", "Low") - .addRange(75, 85, "<=", "Normal") - .addRange(90, 95, "<=", "High") - .addRange(100, 95, ">", "Extremely High")>> - <</if>> - <</if>> - - <<run _options.addOption("Sexuality", "attrKnown", $activeSlave) - .addValue("Unknown", 0).addValue("Known", 1, () => { - V.activeSlave.attrXX = random(0, 100); - V.activeSlave.attrXY = random(0, 100); - V.activeSlave.energy = random(1, 90); - })>> - <<if $activeSlave.attrKnown === 1>> - <<run _options.addOption("Attraction to men", "attrXY", $activeSlave) - .addRange(0, 5, "<=", "Disgusted").off() - .addRange(10, 15, "<=", "Turned off").off() - .addRange(25, 35, "<=", "Not attracted").off() - .addRange(50, 65, "<=", "Indifferent").neutral() - .addRange(75, 85, "<=", "Attracted").on() - .addRange(90, 95, "<=", "Aroused").on() - .addRange(100, 95, ">", "Passionate").on()>> - <<run _options.addOption("Attraction to women", "attrXX", $activeSlave) - .addRange(0, 5, "<=", "Disgusted").off() - .addRange(10, 15, "<=", "Turned off").off() - .addRange(25, 35, "<=", "Not attracted").off() - .addRange(50, 65, "<=", "Indifferent").neutral() - .addRange(75, 85, "<=", "Attracted").on() - .addRange(90, 95, "<=", "Aroused").on() - .addRange(100, 95, ">", "Passionate").on()>> - - <<run _options.addOption("Sex drive", "energy", $activeSlave) - .addRange(5, 10, "<=", "Frigid").off() - .addRange(25, 40, "<=", "Poor").off() - .addRange(45, 60, "<=", "Average").neutral() - .addRange(65, 80, "<=", "Powerful").on() - .addRange(85, 99, "<=", "Sex addict").on() - .addRange(100, 99, ">", "Nympho").on()>> - <</if>> - - <<if $activeSlave.fetish !== "mindbroken">> - <<run _options.addOption("Behavioral Flaw", "behavioralFlaw", $activeSlave) - .addValueList([["None", "none"], ["Arrogant", "arrogant"], ["Bitchy", "bitchy"], ["Odd", "odd"], ["Hates Men", "hates men"], - ["Hates Women", "hates women"], ["Anorexic", "anorexic"], ["Gluttonous", "gluttonous"], ["Devout", "devout"], - ["Liberated", "liberated"]])>> - - <<run _options.addOption("Behavioral Quirk", "behavioralQuirk", $activeSlave) - .addValueList([["None", "none"], ["Confident", "confident"], ["Cutting", "cutting"], ["Funny", "funny"], - ["Adores Men", "adores men"], ["Adores Women", "adores women"], ["Insecure", "insecure"], ["Fitness", "fitness"], - ["Sinful", "sinful"], ["Advocate", "advocate"]])>> - - <<run _options.addOption("Sexual Flaw", "sexualFlaw", $activeSlave) - .addValueList([["None", "none"], ["Hates Oral", "hates oral"], ["Hates Anal", "hates anal"], - ["Hates Penetration", "hates penetration"], ["Repressed", "repressed"], ["Shamefast", "shamefast"], ["Apathetic", "apathetic"], - ["Crude", "crude"], ["Judgemental", "judgemental"], ["Sexually idealistic", "idealistic"]])>> - - <<run _options.addOption("Sexual Quirk", "sexualQuirk", $activeSlave) - .addValueList([["None", "none"], ["Oral", "gagfuck queen"], ["Anal", "painal queen"], ["Penetration", "strugglefuck queen"], - ["Perverted", "perverted"], ["Tease", "tease"], ["Caring", "caring"], ["Unflinching", "unflinching"], ["Size queen", "size queen"], - ["Romantic", "romantic"]])>> - <</if>> - - <<includeDOM _options.render()>> + <<includeDOM App.StartingGirls.mental($activeSlave)>> </div> </div> @@ -894,7 +308,7 @@ <div id="Family" class="tab-content"> <div class="content"> - <<editFamily>> + <<includeDOM App.Intro.editFamily($activeSlave)>> </div> </div> @@ -904,118 +318,9 @@ </div> </div> -<div id="Customization" class="tab-content"> +<div id="salon" class="tab-content"> <div class="content"> - - ''Birth name:'' <<textbox "$activeSlave.birthName" $activeSlave.birthName "Starting Girls">> - | ''Slave name:'' <<textbox "$activeSlave.slaveName" $activeSlave.slaveName "Starting Girls">> - <br>''Birth surname:'' <<textbox "$activeSlave.birthSurname" $activeSlave.birthSurname "Starting Girls">> - | ''Slave surname:'' <<textbox "$activeSlave.slaveSurname" $activeSlave.slaveSurname "Starting Girls">> - <br>''Career:'' <span id="career-textbox"><<textbox "$activeSlave.career" $activeSlave.career "Starting Girls">></span> - <span id="careers"></span> - <script>jQuery('#careers').empty().append(App.StartingGirls.career(V.activeSlave));</script> - <br>''Hair color:'' <<textbox "$activeSlave.origHColor" $activeSlave.origHColor "Starting Girls">> //This will also set eyebrow, pubic, and underarm hair color.// - <br>''Hair Style:'' <<textbox "$activeSlave.hStyle" $activeSlave.hStyle "Starting Girls">> - <br>''Hair Length:'' <<textbox "$activeSlave.hLength" $activeSlave.hLength "Starting Girls">> - <br>''Eye color:'' <<textbox "$activeSlave.eye.origColor" $activeSlave.eye.origColor "Starting Girls">> - <<if def $pupil_temp>> - <<set $activeSlave.eye.left.pupil = $pupil_temp, $activeSlave.eye.right.pupil = $pupil_temp, delete $pupil_temp>> - <</if>> - <br>''Pupil shape:'' <<textbox "$pupil_temp" $activeSlave.eye.left.pupil "Starting Girls">> - <<if def $sclerae_temp>> - <<set $activeSlave.eye.left.sclera = $sclerae_temp, $activeSlave.eye.right.sclera = $sclerae_temp, delete $sclerae_temp>> - <</if>> - <br>''Sclera color:'' <<textbox "$sclerae_temp" $activeSlave.eye.left.sclera "Starting Girls">> - <br>Custom tattoo: <<textbox "$activeSlave.custom.tattoo" $activeSlave.custom.tattoo "Starting Girls">> //Use complete, capitalized and punctuated sentences.// - <br>Custom origin story: <<textbox "$activeSlave.origin" $activeSlave.origin "Starting Girls">> //Use complete, capitalized and punctuated sentences.// - <br>Origin override: - <<if $originOverride == 1>> - @@.green;Enabled@@ [[Disable|Starting Girls][$originOverride = 0]] //Disabling will allow Starting Girls to overwrite origins and tattoos with its defaults.// - <<else>> - @@.red;Disabled@@ [[Enable|Starting Girls][$originOverride = 1]] //Enabling will keep your custom origin and tattoo from being overwritten by Starting Girls.// - <</if>> - <<if $activeSlave.prestige>> - <br>Reason for prestigiousness: <<textbox "$activeSlave.prestigeDesc" $activeSlave.prestigeDesc>> //Use complete, capitalized and punctuated sentences.// - <</if>> - <br>Custom description: <<textbox "$activeSlave.custom.desc" $activeSlave.custom.desc "Starting Girls">> //Use complete, capitalized and punctuated sentences.// - <br>Custom label: <<textbox "$activeSlave.custom.label" $activeSlave.custom.label "Starting Girls">> //Use a short phrase.// - - <br><br> - ''Eyebrow hair style:'' $activeSlave.eyebrowHStyle. - [[Natural|Starting Girls][$activeSlave.eyebrowHStyle = "natural"]] - | [[Curved|Starting Girls][$activeSlave.eyebrowHStyle = "curved"]] - | [[Elongated|Starting Girls][$activeSlave.eyebrowHStyle = "elongated"]] - | [[High-Arched|Starting Girls][$activeSlave.eyebrowHStyle = "high-arched"]] - | [[Rounded|Starting Girls][$activeSlave.eyebrowHStyle = "rounded"]] - | [[Shaved|Starting Girls][$activeSlave.eyebrowHStyle = "shaved"]] - | [[Shortened|Starting Girls][$activeSlave.eyebrowHStyle = "shortened"]] - | [[Slanted Inwards|Starting Girls][$activeSlave.eyebrowHStyle = "slanted inwards"]] - | [[Slanted Outwards|Starting Girls][$activeSlave.eyebrowHStyle = "slanted outwards"]] - | [[Straight|Starting Girls][$activeSlave.eyebrowHStyle = "straight"]] - - <br> - ''Eyebrow hair maintenance:'' $activeSlave.eyebrowFullness - [[Natural|Starting Girls][$activeSlave.eyebrowFullness = "natural"]] - | [[Bushy|Starting Girls][$activeSlave.eyebrowFullness = "bushy"]] - | [[Thick|Starting Girls][$activeSlave.eyebrowFullness = "thick"]] - | [[Tapered|Starting Girls][$activeSlave.eyebrowFullness = "tapered"]] - | [[Threaded|Starting Girls][$activeSlave.eyebrowFullness = "threaded"]] - | [[Thin|Starting Girls][$activeSlave.eyebrowFullness = "thin"]] - | [[Pencil-Thin|Starting Girls][$activeSlave.eyebrowFullness = "pencil-thin"]] - - <br><br> - ''Pubic hair maintenance:'' $activeSlave.pubicHStyle. - [[Waxed|Starting Girls][$activeSlave.pubicHStyle = "waxed"]] - | [[Naturally hairless|Starting Girls][$activeSlave.pubicHStyle = "hairless"]] - | [[Landing strip|Starting Girls][$activeSlave.pubicHStyle = "in a strip"]] - | [[Neat|Starting Girls][$activeSlave.pubicHStyle = "neat"]] - | [[Bushy in the front|Starting Girls][$activeSlave.pubicHStyle = "bushy in the front and neat in the rear"]] - | [[Bushy|Starting Girls][$activeSlave.pubicHStyle = "bushy"]] - | [[Very Bushy|Starting Girls][$activeSlave.pubicHStyle = "very bushy"]] - - <br><br> - ''Under arm hair maintenance:'' $activeSlave.underArmHStyle. - [[Waxed|Starting Girls][$activeSlave.underArmHStyle = "waxed"]] - | [[Naturally hairless|Starting Girls][$activeSlave.underArmHStyle = "hairless"]] - | [[Shaved|Starting Girls][$activeSlave.underArmHStyle = "shaved"]] - | [[Neat|Starting Girls][$activeSlave.underArmHStyle = "neat"]] - | [[Bushy|Starting Girls][$activeSlave.underArmHStyle = "bushy"]] - - <br><br> - ''Natural skin distinctiveness:'' $activeSlave.markings. - [[None|Starting Girls][$activeSlave.markings = "none"]] - | [[Freckles|Starting Girls][$activeSlave.markings = "freckles"]] - | [[Heavily freckled|Starting Girls][$activeSlave.markings = "heavily freckled"]] - | [[Beauty mark|Starting Girls][$activeSlave.markings = "beauty mark"]] - | [[Birthmark|Starting Girls][$activeSlave.markings = "birthmark"]] - - <<if $activeSlave.anus > 0>> - <br><br> - ''External appearance of anus:'' - <<if $activeSlave.analArea <= $activeSlave.anus>> - Recently stretched to current size. - <<elseif $activeSlave.analArea - $activeSlave.anus == 1>> - Used to current size. - <<else>> - Very broad. - <</if>> - [[Recently stretched|Starting Girls][$activeSlave.analArea = $activeSlave.anus]] - | [[Used to current size|Starting Girls][$activeSlave.analArea = $activeSlave.anus+1]] - | [[Very broad|Starting Girls][$activeSlave.analArea = $activeSlave.anus+2]] - <</if>> - - <br><br> - ''Natural breast shape:'' $activeSlave.boobShape. - [[Normal|Starting Girls][$activeSlave.boobShape = "normal"]] - | [[Perky|Starting Girls][$activeSlave.boobShape = "perky"]] - | [[Torpedo-shaped|Starting Girls][$activeSlave.boobShape = "torpedo-shaped"]] - | [[Wide-set|Starting Girls][$activeSlave.boobShape = "wide-set"]] - | [[Downward-facing|Starting Girls][$activeSlave.boobShape = "downward-facing"]] - | [[Saggy|Starting Girls][$activeSlave.boobShape = "saggy"]] - - <br><br> - ''Births:'' <<textbox "$activeSlave.counter.birthsTotal" $activeSlave.counter.birthsTotal "Starting Girls">> //How many times $he has already given birth, not necessarily while owned by you.// - + <<includeDOM App.UI.salon($activeSlave, true)>> </div> </div> diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw index 013cd21ae6fe333cf3f641f015796fa6cfa8feda..09a3e01e4c6e38bbc5804698c73fc6ee4e7f7862 100644 --- a/src/uncategorized/RESS.tw +++ b/src/uncategorized/RESS.tw @@ -199,17 +199,21 @@ Finishing your work, you lean back for a well-deserved break. Your peace is quic but you just have to reach for your trusty handgun to make the slave step back in fear. <</if>> <<set $mutinery = 0>> -<<elseif ($PC.career == "mercenary")>> +<<elseif ($PC.career == "street urchin")>> + but you slash at $him with your trusted knife, catching $him off guard and leaving a nasty gash. Before $he recovers $his senses, you make sure to have your knife to $his throat. + <<set $mutinery = 0>> + /* add scar somewhere */ +<<elseif ($PC.career == "mercenary" || $PC.career == "recruit")>> <<if ($personalArms != 0)>> but you quickly draw the weapon you always keep close at hand, forcing the slave to put $his hand<<if hasBothArms($activeSlave)>>s<</if>> on the back of $his head. <<else>> 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")>> +<<elseif ($PC.career == "escort" || PC.career == "prostitute" || PC.career == "child prostitute")>> 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.skill.slaving >= 20>> +<<elseif ($PC.career == "slaver" || $PC.career == "slave overseer") || $PC.skill.slaving >= 20>> but you simply give $him a kick to the groin, a little trick you remember from your early days on how to deal with rebellious slaves. <<set $mutinery = 0>> <<elseif ($PC.skill.warfare >= 20)>> @@ -4548,7 +4552,7 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h <<else>> hypertrophied <</if>> - dick inside your<<if $PC.career == "escort" || $PC.career == "servant">> expert<</if>> mouth. You diligently suck until you feel $him begin to tense up; this is your chance. You clamp down on $his cock while simultaneously punching $him in the balls. $He howls in pain, until you headbutt $him in the stomach and knock the wind out of $him. You quickly pull $him into an arm lock and force $him over your desk. Now that you have $him restrained, it's time $he learned $his place — after you've gotten the taste of the slut out of your mouth, that is. + dick inside your<<if $PC.career == "escort" || $PC.career == "prostitute" || $PC.career == "child prostitute" || $PC.career == "servant">> expert<</if>> mouth. You diligently suck until you feel $him begin to tense up; this is your chance. You clamp down on $his cock while simultaneously punching $him in the balls. $He howls in pain, until you headbutt $him in the stomach and knock the wind out of $him. You quickly pull $him into an arm lock and force $him over your desk. Now that you have $him restrained, it's time $he learned $his place — after you've gotten the taste of the slut out of your mouth, that is. <<set $mutinery = 2>> <br><br><span id="result2"> diff --git a/src/uncategorized/cellblock.tw b/src/uncategorized/cellblock.tw index c8735ddd82a94eb262982cba29d46967f42d5abf..beb66b4c19905612ab1a1c5893c55c4d94071b1c 100644 --- a/src/uncategorized/cellblock.tw +++ b/src/uncategorized/cellblock.tw @@ -88,7 +88,7 @@ <div> <<set _Tmult0 = Math.trunc($cellblock*1000*$upgradeMultiplierArcology)>> _cellblockNameCaps has room for $cellblock slaves to be kept in close confinement. - There <<if _CL == 1>>is<<else>>are<</if>> currently _CL slaves<<if _CL != 1>>s<</if>> kept in close confinement in $cellblockName. + There <<if _CL == 1>>is<<else>>are<</if>> currently _CL slave<<if _CL != 1>>s<</if>> kept in close confinement in $cellblockName. <div class="choices"> [[Expand the cellblock|Cellblock][cashX(forceNeg(_Tmult0), "capEx"), $cellblock += 5, $PC.skill.engineering += .1]] <span class="note"> diff --git a/src/uncategorized/genericPlotEvents.tw b/src/uncategorized/genericPlotEvents.tw index de9ac5d467ed39ef52f7c829c40becb45dda7afd..acaa3e8ca1455d0f7516cdb224826fd358b0e56f 100644 --- a/src/uncategorized/genericPlotEvents.tw +++ b/src/uncategorized/genericPlotEvents.tw @@ -1,1428 +1,1309 @@ :: Generic Plot Events [nobr] -/* GENERIC PLOT EVENTS */ - <<set $nextButton = "Continue", $nextLink = "Random Nonindividual Event", $returnTo = "Random Nonindividual Event">> - <<setAssistantPronouns>> <<switch $Event>> <<case "bad curatives">> + <<set _genPlot = $slaves.findIndex(function(s) { return s.curatives > 1 || s.inflationType == "curative"; })>> + <<setLocalPronouns $slaves[_genPlot]>> + <<if _genPlot !== -1>> + <<run $slaves.forEach(function(s) { + if (s.curatives > 1 || s.inflationType === "curative") { + healthDamage(s, Math.floor(Math.random() * 2 + 1)); + } + })>> + <<else>> + <<goto "Random Nonindividual Event">> + <</if>> + <<run cashX(500*$slaves.length, "event")>> -<<set _genPlot = $slaves.findIndex(function(s) { return s.curatives > 1 || s.inflationType == "curative"; })>> -<<setLocalPronouns $slaves[_genPlot]>> -<<if _genPlot != -1>> - <<run $slaves.forEach(function(s) { - if (s.curatives > 1 || s.inflationType == "curative") { - healthDamage(s, Math.floor(Math.random() * 2 + 1)); - } - })>> -<<else>> - <<goto "Random Nonindividual Event">> -<</if>> -<<run cashX(500*$slaves.length, "event")>> - -Early one morning, you hear convulsive dry heaving coming from one of the bathrooms. On investigation, it seems that $slaves[_genPlot].slaveName woke up feeling terribly nauseous. $He's in no danger, but you've hardly checked $him over before more slaves stagger in. Every one of your slaves on curatives has been struck by the mysterious malady and has @@.health.dec;sickened.@@ -<br><br> -It doesn't take much investigation before you find other slaveowners reporting the same thing. Elementary detective work fingers a particular drug supplier as the culprit, and before long the unfortunate pharmaceutical concern is drowning under a rain of harsh public comment and harsher private contract warfare. As the day wears on, the poor slaves feel a bit better, but begin to report discomfort in their breasts. Apparently the problem has to do with contamination of the curative production line with A-HGH production reactants. -<br><br> -The firm promptly pays @@.yellowgreen;fair compensation@@ for the minor damage to your slaves' health. However, you're left with the matter of the boobs to deal with. Over the week, all your slaves on curatives experience at least a little @@.lime;breast growth,@@ and some gain several cup sizes.<<if $boughtItem.toys.medicalEnema == 1>> Those with bellies full of curative mixture, on the other hand, have not stopped growing yet and won't until they completely absorb their load. They will likely end up @@.lime;sporting enormous tits@@ by the end of this.<</if>> - + Early one morning, you hear convulsive dry heaving coming from one of the bathrooms. On investigation, it seems that $slaves[_genPlot].slaveName woke up feeling terribly nauseous. $He's in no danger, but you've hardly checked $him over before more slaves stagger in. Every one of your slaves on curatives has been struck by the mysterious malady and has @@.health.dec;sickened.@@ + <br><br> + It doesn't take much investigation before you find other slaveowners reporting the same thing. Elementary detective work fingers a particular drug supplier as the culprit, and before long the unfortunate pharmaceutical concern is drowning under a rain of harsh public comment and harsher private contract warfare. As the day wears on, the poor slaves feel a bit better, but begin to report discomfort in their breasts. Apparently the problem has to do with contamination of the curative production line with A-HGH production reactants. + <br><br> + The firm promptly pays @@.yellowgreen;fair compensation@@ for the minor damage to your slaves' health. However, you're left with the matter of the boobs to deal with. Over the week, all your slaves on curatives experience at least a little @@.lime;breast growth,@@ and some gain several cup sizes.<<if $boughtItem.toys.medicalEnema == 1>> Those with bellies full of curative mixture, on the other hand, have not stopped growing yet and won't until they completely absorb their load. They will likely end up @@.lime;sporting enormous tits@@ by the end of this.<</if>> <<case "bad breasts">> + <<set _genPlot = $slaves.findIndex(function(s) { return ["breast injections", "intensive breast injections", "hyper breast injections"].includes(s.drugs); })>> + <<setLocalPronouns $slaves[_genPlot]>> + <<if _genPlot !== -1>> + <<run $slaves.forEach(function(s) { + if (["breast injections", "hyper breast injections", "intensive breast injections"].includes(s.drugs)) { + healthDamage(s, Math.floor(Math.random() * 2 + 1)); + } + })>> + <<else>> + <<goto "Random Nonindividual Event">> + <</if>> -<<set _genPlot = $slaves.findIndex(function(s) { return ["breast injections", "intensive breast injections", "hyper breast injections"].includes(s.drugs); })>> -<<setLocalPronouns $slaves[_genPlot]>> -<<if _genPlot != -1>> - <<run $slaves.forEach(function(s) { - if (["breast injections", "hyper breast injections", "intensive breast injections"].includes(s.drugs)) { - healthDamage(s, Math.floor(Math.random() * 2 + 1)); - } - })>> -<<else>> - <<goto "Random Nonindividual Event">> -<</if>> - -Early one morning, you hear heaving coming from one of the bathrooms. On investigation, it seems that $slaves[_genPlot].slaveName woke up feeling terribly nauseous. $He's in no danger, but you've hardly checked $him over before more slaves stagger in. Every one of your slaves on breast focused A-HGH has been struck by the mysterious malady and has @@.health.dec;sickened.@@ -<br><br> -It doesn't take much investigation before you find other slaveowners reporting the same thing. Elementary detective work fingers a particular drug supplier as the culprit, and before long the unfortunate pharmaceutical concern is drowning under a rain of harsh public comment and harsher private contract warfare. As the day wears on, the poor slaves feel much better, and appear positively glowing. However, their breasts swell slightly and their bellies bulge, pointing to the issue being the contamination of the A-HGH production line with fertility agents. -<br><br> -The firm promptly pays @@.yellowgreen; a large compensation@@ for potentially ruining your slaves. However, you're left with the matter of all the growing bellies to deal with. Over the week, all of your slaves on breast injections show signs of @@.yellow;early pregnancy,@@ and hyper pregnancy at that, save those who aren't fertile. They just experienced some hip and ass growth. You have no idea how much fertility agent was in the enhancers but you feel they may become a problem if left alone! - + Early one morning, you hear heaving coming from one of the bathrooms. On investigation, it seems that $slaves[_genPlot].slaveName woke up feeling terribly nauseous. $He's in no danger, but you've hardly checked $him over before more slaves stagger in. Every one of your slaves on breast focused A-HGH has been struck by the mysterious malady and has @@.health.dec;sickened.@@ + <br><br> + It doesn't take much investigation before you find other slaveowners reporting the same thing. Elementary detective work fingers a particular drug supplier as the culprit, and before long the unfortunate pharmaceutical concern is drowning under a rain of harsh public comment and harsher private contract warfare. As the day wears on, the poor slaves feel much better, and appear positively glowing. However, their breasts swell slightly and their bellies bulge, pointing to the issue being the contamination of the A-HGH production line with fertility agents. + <br><br> + The firm promptly pays @@.yellowgreen; a large compensation@@ for potentially ruining your slaves. However, you're left with the matter of all the growing bellies to deal with. Over the week, all of your slaves on breast injections show signs of @@.yellow;early pregnancy,@@ and hyper pregnancy at that, save those who aren't fertile. They just experienced some hip and ass growth. You have no idea how much fertility agent was in the enhancers but you feel they may become a problem if left alone! <<case "strip club closing">> - -It's been a good few weeks, getting settled in as owner of $arcologies[0].name. The power of being overlord of this great building and everyone in it is incredible, but so is the responsibility. It's a good thing you have ample opportunities for stress relief. You're going to need them after today. There's a nasty disturbance on a business level of the arcology. Normally, the arcology's public safety drones would suppress this kind of nonsense, but $assistant.name program is suggesting that you resolve the dispute. -<br><br> -As you step off the elevator, you hear several <<if $seeDicks != 100>>female <</if>>voices shouting. Apparently one of $arcologies[0].name's few remaining strip joints has closed. It was a topless bar and strip club all in one, but the owner is packing up his things. He's explaining to a crowd of his angry former employees that he can't make ends meet. As the price of a slave whore is barely higher than that of a lap dance from a free stripper, it's not surprising. It looks like the former dancers are on the verge of trashing the place. - + It's been a good few weeks, getting settled in as owner of $arcologies[0].name. The power of being overlord of this great building and everyone in it is incredible, but so is the responsibility. It's a good thing you have ample opportunities for stress relief. You're going to need them after today. There's a nasty disturbance on a business level of the arcology. Normally, the arcology's public safety drones would suppress this kind of nonsense, but $assistant.name program is suggesting that you resolve the dispute. + <br><br> + As you step off the elevator, you hear several <<if $seeDicks !== 100>>female <</if>>voices shouting. Apparently one of $arcologies[0].name's few remaining strip joints has closed. It was a topless bar and strip club all in one, but the owner is packing up his things. He's explaining to a crowd of his angry former employees that he can't make ends meet. As the price of a slave whore is barely higher than that of a lap dance from a free stripper, it's not surprising. It looks like the former dancers are on the verge of trashing the place. <<case "strip club aftermath">> - -<<set _ContractCost = 1000>> -<<set $activeSlaveOneTimeMinAge = $minimumSlaveAge>> -<<set $activeSlaveOneTimeMaxAge = 42>> -<<set $oneTimeDisableDisability = 1>> -<<if $arcologies[0].FSSupremacistLawME == 1>> - <<set $fixedRace = $arcologies[0].FSSupremacistRace>> -<<elseif $arcologies[0].FSSubjugationistLawME == 1>> - <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> - <<set $fixedRace = _races.random()>> -<</if>> -<<set $activeSlave = GenerateNewSlave()>> -<<if $eventResults.strip == 1>> - <<set $activeSlave.origin = "$He offered $himself to you as a slave to escape the hard life of a free whore.">> - <<set $activeSlave.career = "a prostitute">> - <<set $activeSlave.devotion = 20>> - <<set $activeSlave.trust = 5>> - <<run setHealth($activeSlave, jsRandom(-90, 10), undefined, undefined, undefined, 40)>> - <<set $activeSlave.anus = 2>> - <<if $activeSlave.dick == 0>> - <<set $activeSlave.vagina = 2>> - <<set $activeSlave.skill.vaginal = 15>> + <<set _ContractCost = 1000>> + <<set _pram = {minAge: $minimumSlaveAge, maxAge: 42, disableDisability: 1}>> + <<if $arcologies[0].FSSupremacistLawME === 1>> + <<set _pram.race = $arcologies[0].FSSupremacistRace>> + <<elseif $arcologies[0].FSSubjugationistLawME === 1>> + <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> + <<set _pram.race = _races.random()>> <</if>> - <<set $activeSlave.skill.oral = 15>> - <<set $activeSlave.skill.anal = 15>> - <<set $activeSlave.skill.whoring = 15>> - <<set $activeSlave.addict = 2>> - <<set _slaveCost = slaveCost($activeSlave)>> -<<elseif $eventResults.strip == 2>> - <<set $activeSlave.origin = "$He offered $himself to you, impressed by your handling of $his employment situation.">> - <<set $activeSlave.career = "a prostitute">> - <<set $activeSlave.devotion = 45>> - <<set $activeSlave.trust = 25>> - <<run setHealth($activeSlave, 20, undefined, undefined, undefined, 20)>> - <<set $activeSlave.anus = 2>> - <<if $activeSlave.dick == 0>> - <<set $activeSlave.vagina = 2>> - <<set $activeSlave.skill.vaginal = 35>> + <<set _slave = GenerateNewSlave(null, _pram)>> + <<if $eventResults.strip === 1>> + <<set _slave.origin = "$He offered $himself to you as a slave to escape the hard life of a free whore.">> + <<set _slave.career = "a prostitute">> + <<set _slave.devotion = 20>> + <<set _slave.trust = 5>> + <<run setHealth(_slave, jsRandom(-90, 10), undefined, undefined, undefined, 40)>> + <<set _slave.anus = 2>> + <<if _slave.dick == 0>> + <<set _slave.vagina = 2>> + <<set _slave.skill.vaginal = 15>> + <</if>> + <<set _slave.skill.oral = 15>> + <<set _slave.skill.anal = 15>> + <<set _slave.skill.whoring = 15>> + <<set _slave.addict = 2>> + <<set _slaveCost = slaveCost(_slave)>> + <<elseif $eventResults.strip === 2>> + <<set _slave.origin = "$He offered $himself to you, impressed by your handling of $his employment situation.">> + <<set _slave.career = "a prostitute">> + <<set _slave.devotion = 45>> + <<set _slave.trust = 25>> + <<run setHealth(_slave, 20, undefined, undefined, undefined, 20)>> + <<set _slave.anus = 2>> + <<if _slave.dick == 0>> + <<set _slave.vagina = 2>> + <<set _slave.skill.vaginal = 35>> + <</if>> + <<set _slave.skill.oral = 35>> + <<set _slave.skill.anal = 35>> + <<set _slave.skill.whoring = 35>> + <<set _slave.boobs += 600>> + <<set _slave.boobsImplant = 600>> + <<set _slave.boobsImplantType = "string">> + <<set _slave.lipsPiercing = 1>> + <<set _slave.earPiercing = 1>> + <<set _slave.nosePiercing = 1>> + <<set _slave.eyebrowPiercing = 1>> + <<set _slave.navelPiercing = 1>> + <<set _slave.nipplesPiercing = 1>> + <<set _slave.clitPiercing = 1>> + <<set _slave.hStyle = "strip">> + <<set _slaveCost = slaveCost(_slave)>> <</if>> - <<set $activeSlave.skill.oral = 35>> - <<set $activeSlave.skill.anal = 35>> - <<set $activeSlave.skill.whoring = 35>> - <<set $activeSlave.boobs += 600>> - <<set $activeSlave.boobsImplant = 600>> - <<set $activeSlave.boobsImplantType = "string">> - <<set $activeSlave.lipsPiercing = 1>> - <<set $activeSlave.earPiercing = 1>> - <<set $activeSlave.nosePiercing = 1>> - <<set $activeSlave.eyebrowPiercing = 1>> - <<set $activeSlave.navelPiercing = 1>> - <<set $activeSlave.nipplesPiercing = 1>> - <<set $activeSlave.clitPiercing = 1>> - <<set $activeSlave.hStyle = "strip">> - <<set _slaveCost = slaveCost($activeSlave)>> -<</if>> -<<run App.Utils.setLocalPronouns($activeSlave)>> -<<run Enunciate($activeSlave)>> -<<if $eventResults.strip == 1>> - One day, you walk by the commercial space where the strip club that closed was located. It's now advertised as a massage parlor, but the real merchandise on offer is obvious. You can see a bored-looking, half-dressed masseuse rubbing a client, but the sounds of someone having hard sex are filtering out from the back room, and the pricing sheet lists more orifices than massage options. - <br><br> - As you pass, a tired-looking streetwalker walking by wearing ripped jeans and a torn top offers $himself to you. $He's halfway through $his clumsy come-on before $he curses and rushes over to kneel at your feet. As $he does, $he shrieks, "You own thi<<s>> arcology! You — you offered to en<<s>>lave u<<s>> <<s>>tripper<<s>> when the old pla<<c>>e clo<<s>>ed down! Plea<<s>>e, plea<<s>>e, can I a<<cc>>ept? I'm <<s>>orry I didn't earlier. I'm <<s>>orry. I'll fucking do anything! Plea<<s>>e!" - <br><br> - //Enslaving $him will cost <<print cashFormat(_ContractCost)>>. Alternatively, you could sell $him. Less costs, this will bring in <<print cashFormat(_slaveCost)>>.// + <<run App.Utils.setLocalPronouns(_slave)>> + <<run Enunciate(_slave)>> + <<if $eventResults.strip === 1>> + One day, you walk by the commercial space where the strip club that closed was located. It's now advertised as a massage parlor, but the real merchandise on offer is obvious. You can see a bored-looking, half-dressed masseuse rubbing a client, but the sounds of someone having hard sex are filtering out from the back room, and the pricing sheet lists more orifices than massage options. + <br><br> + As you pass, a tired-looking streetwalker walking by wearing ripped jeans and a torn top offers $himself to you. $He's halfway through $his clumsy come-on before $he curses and rushes over to kneel at your feet. As $he does, $he shrieks, "You own thi<<s>> arcology! You — you offered to en<<s>>lave u<<s>> <<s>>tripper<<s>> when the old pla<<c>>e clo<<s>>ed down! Plea<<s>>e, plea<<s>>e, can I a<<cc>>ept? I'm <<s>>orry I didn't earlier. I'm <<s>>orry. I'll fucking do anything! Plea<<s>>e!" + <br><br> + //Enslaving $him will cost <<print cashFormat(_ContractCost)>>. Alternatively, you could sell $him. Less costs, this will bring in <<print cashFormat(_slaveCost)>>.// + <br><br> + <<includeDOM App.Desc.longSlave(_slave)>> + <<elseif $eventResults.strip === 2>> + One day, you walk by the commercial space where the strip club that closed was located. It's now advertised as a massage parlor, and indeed, you can see a couple of competent-looking, modestly dressed masseuses seeing to clients. The only chink in the old world decorum is the pretty sign detailing pricing, which lists not only various massages but the masseuses' hands, breasts, mouths,<<if $seeDicks !== 100>> pussies,<</if>> and anuses. + <br><br> + As you pass, a pretty streetwalker walking by wearing an attractive club $girl outfit sidles up to you. $He's halfway through $his first flirty come-on before $he recognizes you. $He gasps and <<say>>s, "You own thi<<s>> arcology! <<if $PC.title !== 0>><<S>>ir<<else>>Ma'am<</if>>, I wa<<s>> a <<s>>tripper here! Thank you <<s>>o much for helping u<<s>>. That money <<s>>et mo<<s>>t of u<<s>> up pretty well." $He hefts $his chest. "It bought me new boob<<s>>, that'<<s>> for <<s>>ure. <<S>>o, um," $he bites $his lip in indecision, "I hear —" $he hesitates and then the words come out in a rush. "I hear your $girl<<s>> do really well. I've <<s>>een them, they look good. Can I come?" You arch an eyebrow and begin to ask whether $he knows what that means. "Yep," $he interrupts. "I'll be your <<s>>e<<x>> <<s>>lave." + <br><br> + //Enslaving $him will cost <<print cashFormat(_ContractCost)>>. Alternatively, you could sell $him. Less costs, this will bring in <<print cashFormat(_slaveCost)>>.// + <br><br> + <<includeDOM App.Desc.longSlave(_slave)>> + <<else>> + <<setNonlocalPronouns $seeDicks>> + One day, you walk by the commercial space where the strip club that closed was located. The <<= _girlU>>s you set up in cheap housing tried to run the place as a worker-owned strip bar for a while, but as you suspected, they were obliged to start whoring in short order. With the price of sex driven so low by slave competition, there's hardly any profit in bodies patrons can't even touch. The <<= _girlU>>s here might be prostitutes now, but they're still free and they're surviving. + <br><br> + As you pass, a pretty bottle blonde comes running out. "Hey," _heU calls, "you're the owner! You set us up with this place!" You ask _himU how they're doing. "Well," _heU says, smiling ruefully, "turning tricks ain't easy, you know. But we get by. Those rooms you set up for us are nice and cheap, even if we're packed in there like <<if _heU == "he">>fraternity boys<<else>>sorority girls<</if>>." _HeU winks. "Hey, I don't suppose you've fucked a free _womanU lately? I'll give you an Arcology Tour, on the house. Least I can do." + <</if>> +<<case "militia">> + The outside world continues to deteriorate. The Free Cities are a popular target for old world demagogues looking for a convenient scapegoat for the restive populate to hate. The Free Cities were originally founded without much thought towards how they might be defended, should it come to that. But recently, the leading citizens have begun to worry that there might one day be barbarians at the gates. It has been suggested that citizens of means should form a militia. <br><br> - <<includeDOM App.Desc.longSlave(V.activeSlave)>> -<<elseif $eventResults.strip == 2>> - One day, you walk by the commercial space where the strip club that closed was located. It's now advertised as a massage parlor, and indeed, you can see a couple of competent-looking, modestly dressed masseuses seeing to clients. The only chink in the old world decorum is the pretty sign detailing pricing, which lists not only various massages but the masseuses' hands, breasts, mouths,<<if $seeDicks != 100>> pussies,<</if>> and anuses. + This is a less ludicrous suggestion than it might sound. Your arcology's security drones alone could form a formidable means of defense if adapted for that purpose. However, it's not likely that the anarchic Free Cities are going to ever make this anything more than a polite suggestion. <br><br> - As you pass, a pretty streetwalker walking by wearing an attractive club $girl outfit sidles up to you. $He's halfway through $his first flirty come-on before $he recognizes you. $He gasps and <<say>>s, "You own thi<<s>> arcology! <<if $PC.title != 0>><<S>>ir<<else>>Ma'am<</if>>, I wa<<s>> a <<s>>tripper here! Thank you <<s>>o much for helping u<<s>>. That money <<s>>et mo<<s>>t of u<<s>> up pretty well." $He hefts $his chest. "It bought me new boob<<s>>, that'<<s>> for <<s>>ure. <<S>>o, um," $he bites $his lip in indecision, "I hear —" $he hesitates and then the words come out in a rush. "I hear your $girl<<s>> do really well. I've <<s>>een them, they look good. Can I come?" You arch an eyebrow and begin to ask whether $he knows what that means. "Yep," $he interrupts. "I'll be your <<s>>e<<x>> <<s>>lave." + ''This is a unique opportunity.'' Without this security scare, it's unlikely you could convince any of your free-spirited tenants to even stay near lethally armed drones. +<<case "shoot invitation">> + <<= capFirstChar($assistant.name)>> usually delays message delivery when you're relieving your sexual needs with your property, but messages from other arcology owners have a special priority. This one is a brief but rather well-spoken audio invitation from one of your more notoriously wealthy peers. <br><br> - //Enslaving $him will cost <<print cashFormat(_ContractCost)>>. Alternatively, you could sell $him. Less costs, this will bring in <<print cashFormat(_slaveCost)>>.// + "A week from today, I will be hosting a novel sporting event for the well-to-do. A new tradition, if it's as diverting as I hope. If you wish to take part in a very exclusive contest of marksmanship, exhibitionism, and grace under pressure, buy in. Five thousand. And, believe me, you have a fine chance to come out ahead." +<<case "shoot result">> + You are delivered to your host's arcology by hired VTOL limousine. His arcology is flared at the top, to allow a flat space occupied by a classic Georgian mansion surrounded by lawns. After a brief reception for the handful of well-heeled attendees, the host calls for your attention. "Ladies and gentlemen," he says, "I would like to celebrate here today the return of many things which should not have been allowed to lapse." <br><br> - <<includeDOM App.Desc.longSlave(V.activeSlave)>> -<<else>> - <<setNonlocalPronouns $seeDicks>> - One day, you walk by the commercial space where the strip club that closed was located. The <<= _girlU>>s you set up in cheap housing tried to run the place as a worker-owned strip bar for a while, but as you suspected, they were obliged to start whoring in short order. With the price of sex driven so low by slave competition, there's hardly any profit in bodies patrons can't even touch. The <<= _girlU>>s here might be prostitutes now, but they're still free and they're surviving. + He leads the party towards a broad lawn with a long table along one side, and indicates the handsome single-barrel shotguns lined up on the table. He continues, "In a few moments, some really choice livestock are going to be led up onto this lawn. They have been told that if they can run from one side to the other, they'll be freed." He winks. "Those guns are loaded with taser slugs, of course. Whatever you drop and fuck, you get to take home." <br><br> - As you pass, a pretty bottle blonde comes running out. "Hey," _heU calls, "you're the owner! You set us up with this place!" You ask _himU how they're doing. "Well," _heU says, smiling ruefully, "turning tricks ain't easy, you know. But we get by. Those rooms you set up for us are nice and cheap, even if we're packed in there like <<if _heU == "he">>fraternity boys<<else>>sorority girls<</if>>." _HeU winks. "Hey, I don't suppose you've fucked a free _womanU lately? I'll give you an Arcology Tour, on the house. Least I can do." -<</if>> - -<<case "militia">> - -The outside world continues to deteriorate. The Free Cities are a popular target for old world demagogues looking for a convenient scapegoat for the restive populate to hate. The Free Cities were originally founded without much thought towards how they might be defended, should it come to that. But recently, the leading citizens have begun to worry that there might one day be barbarians at the gates. It has been suggested that citizens of means should form a militia. -<br><br> -This is a less ludicrous suggestion than it might sound. Your arcology's security drones alone could form a formidable means of defense if adapted for that purpose. However, it's not likely that the anarchic Free Cities are going to ever make this anything more than a polite suggestion. -<br><br> -''This is a unique opportunity.'' Without this security scare, it's unlikely you could convince any of your free-spirited tenants to even stay near lethally armed drones. - -<<case "shoot invitation">> - -<<= capFirstChar($assistant.name)>> usually delays message delivery when you're relieving your sexual needs with your property, but messages from other arcology owners have a special priority. This one is a brief but rather well-spoken audio invitation from one of your more notoriously wealthy peers. -<br><br> -"A week from today, I will be hosting a novel sporting event for the well-to-do. A new tradition, if it's as diverting as I hope. If you wish to take part in a very exclusive contest of marksmanship, exhibitionism, and grace under pressure, buy in. Five thousand. And, believe me, you have a fine chance to come out ahead." - -<<case "shoot result">> - -You are delivered to your host's arcology by hired VTOL limousine. His arcology is flared at the top, to allow a flat space occupied by a classic Georgian mansion surrounded by lawns. After a brief reception for the handful of well-heeled attendees, the host calls for your attention. "Ladies and gentlemen," he says, "I would like to celebrate here today the return of many things which should not have been allowed to lapse." -<br><br> -He leads the party towards a broad lawn with a long table along one side, and indicates the handsome single-barrel shotguns lined up on the table. He continues, "In a few moments, some really choice livestock are going to be led up onto this lawn. They have been told that if they can run from one side to the other, they'll be freed." He winks. "Those guns are loaded with taser slugs, of course. Whatever you drop and fuck, you get to take home." -<br><br> -The crowd of nude slaves led up to the lawn and chained to rings along one edge all have pale skin — the better to show impacts, perhaps. But besides that, they are extremely varied, and all physically extraordinary in some way. After you and your fellow partiers are ready, your host fires an old-fashioned revolver in the air and the chained slaves are all released at once. You could easily hit any of them, but you only have one shot. - + The crowd of nude slaves led up to the lawn and chained to rings along one edge all have pale skin — the better to show impacts, perhaps. But besides that, they are extremely varied, and all physically extraordinary in some way. After you and your fellow partiers are ready, your host fires an old-fashioned revolver in the air and the chained slaves are all released at once. You could easily hit any of them, but you only have one shot. <<case "aid invitation">> - -<<set _trapped = []>> -<<if ($seeDicks <= 75)>> - <<set _trapped.push("convent")>> - <<set _trapped.push("school")>> - <<set _trapped.push("housewives")>> - <<set _trapped.push("volleyballTeam")>> - <<if $seePreg != 0>> - <<set _trapped.push("maternity")>> - <<if $continent == "Africa">> - <<set _trapped.push("seizedMission")>> + <<set _trapped = []>> + <<if ($seeDicks <= 75)>> + <<set _trapped.push("convent")>> + <<set _trapped.push("school")>> + <<set _trapped.push("housewives")>> + <<set _trapped.push("volleyballTeam")>> + <<if $seePreg !== 0>> + <<set _trapped.push("maternity")>> + <<if $continent === "Africa">> + <<set _trapped.push("seizedMission")>> + <</if>> <</if>> <</if>> -<</if>> -<<if ($seeDicks >= 25)>> - <<set _trapped.push("conversion")>> -<</if>> -<<set _trapped.push("gradeSchool")>> -<<set $eventResults.aidTarget = _trapped.random()>> -A small old world country near the arcology is experiencing serious unrest. Its corrupt government is doing an even poorer job than most of addressing chronic joblessness and general malaise. Thus far, it's been a fertile source of people in poverty for slavers to target, and little else. Lately, though, it's been showing signs worse may be to come. You've instructed $assistant.name to flag communications from the area; there's always a possibility that business opportunities may arise from the benighted country, and the situation is becoming so unstable it's prudent to keep a personal eye on it anyway. You receive just such a call from -<<if $eventResults.aidTarget == "convent">> - the leader of a female-oriented religious retreat -<<elseif $eventResults.aidTarget == "school">> - the principal of a preparatory school for girls -<<elseif $eventResults.aidTarget == "housewives">> - the queen bee of a small group of suburban housewives -<<elseif $eventResults.aidTarget == "maternity">> - the maternity ward of a hospital -<<elseif $eventResults.aidTarget == "conversion">> - the owner of a religious sexual orientation therapy camp -<<elseif $eventResults.aidTarget == "gradeSchool">> - a student stranded -<<elseif $eventResults.aidTarget == "volleyballTeam">> - a student athlete -<<elseif $eventResults.aidTarget == "seizedMission">> - the leader of a group of missionaries -<</if>> -in the capital city. -<br><br> -<<if $eventResults.aidTarget != "seizedMission">> - They are deeply worried by the situation. There have been large riots over the past week, and yesterday they became seriously violent. The unrest is targeting - <<if $eventResults.aidTarget == "convent">> - better-off citizens, including the caller. Though most of the nuns have already left, the leader and a few of her women are now stuck in the area and are running out of options as the riots lock down transportation. - <<elseif $eventResults.aidTarget == "school">> - better-off citizens, including the caller. Though most of the students and faculty have already made it out, the principal and a few students are now stuck in the area and are running out of options as the riots lock down transportation. - <<elseif $eventResults.aidTarget == "housewives">> - better-off citizens, including the caller. Though most of them have taken flights out, the leader and a few of them are now stuck in the area and are running out of options as the riots lock down transportation. - <<elseif $eventResults.aidTarget == "maternity">> - better-off citizens, including the caller. Though most of the patients have already left, several of the most pregnant are now stuck in the area and are running out of options as the riots lock down transportation. - <<elseif $eventResults.aidTarget == "conversion">> - better-off citizens, including the caller. Though most of the camp's inmates have already left, a few of them and the owner are now stuck in the area and are running out of options as the riots lock down transportation. - <<elseif $eventResults.aidTarget == "gradeSchool">> - better-off citizens, including the caller. Though most of the other students and faculty escaped, a few of the students are now stuck in the school and are running out of options as the riots steadily creep closer to the grounds. - <<elseif $eventResults.aidTarget == "volleyballTeam">> - vulnerable citizens, including the caller. Their bus broke down on the way to the championship game and all those that have left to get help have not returned. She and her several remaining teammates are running out of options as those looking for easy targets creep ever closer. + <<if ($seeDicks >= 25)>> + <<set _trapped.push("conversion")>> <</if>> -<<else>> - After years of constant rape and abuse, an opening finally arrived for escape when a rival faction raided the decaying church they were stored in, however the situation outside isn't much better. Violent riots are taking place and the mobs are eagerly snatching up what ever loot and women they can get their hands on. She and the remaining women are trapped and in no condition to run; most particularly the youngest of the group who is ripe with child, though she herself and one of the others are also carrying their rapists' babies. They are completely out of options as the looters work their way down the city streets. -<</if>> -They beg you to help evacuate them, and promise to pay you once they're out. - + <<set _trapped.push("gradeSchool")>> + <<set $eventResults.aidTarget = _trapped.random()>> + A small old world country near the arcology is experiencing serious unrest. Its corrupt government is doing an even poorer job than most of addressing chronic joblessness and general malaise. Thus far, it's been a fertile source of people in poverty for slavers to target, and little else. Lately, though, it's been showing signs worse may be to come. You've instructed $assistant.name to flag communications from the area; there's always a possibility that business opportunities may arise from the benighted country, and the situation is becoming so unstable it's prudent to keep a personal eye on it anyway. You receive just such a call from + <<if $eventResults.aidTarget === "convent">> + the leader of a female-oriented religious retreat + <<elseif $eventResults.aidTarget === "school">> + the principal of a preparatory school for girls + <<elseif $eventResults.aidTarget === "housewives">> + the queen bee of a small group of suburban housewives + <<elseif $eventResults.aidTarget === "maternity">> + the maternity ward of a hospital + <<elseif $eventResults.aidTarget === "conversion">> + the owner of a religious sexual orientation therapy camp + <<elseif $eventResults.aidTarget === "gradeSchool">> + a student stranded + <<elseif $eventResults.aidTarget === "volleyballTeam">> + a student athlete + <<elseif $eventResults.aidTarget === "seizedMission">> + the leader of a group of missionaries + <</if>> + in the capital city. + <br><br> + <<if $eventResults.aidTarget !== "seizedMission">> + They are deeply worried by the situation. There have been large riots over the past week, and yesterday they became seriously violent. The unrest is targeting + <<if $eventResults.aidTarget === "convent">> + better-off citizens, including the caller. Though most of the nuns have already left, the leader and a few of her women are now stuck in the area and are running out of options as the riots lock down transportation. + <<elseif $eventResults.aidTarget === "school">> + better-off citizens, including the caller. Though most of the students and faculty have already made it out, the principal and a few students are now stuck in the area and are running out of options as the riots lock down transportation. + <<elseif $eventResults.aidTarget === "housewives">> + better-off citizens, including the caller. Though most of them have taken flights out, the leader and a few of them are now stuck in the area and are running out of options as the riots lock down transportation. + <<elseif $eventResults.aidTarget === "maternity">> + better-off citizens, including the caller. Though most of the patients have already left, several of the most pregnant are now stuck in the area and are running out of options as the riots lock down transportation. + <<elseif $eventResults.aidTarget === "conversion">> + better-off citizens, including the caller. Though most of the camp's inmates have already left, a few of them and the owner are now stuck in the area and are running out of options as the riots lock down transportation. + <<elseif $eventResults.aidTarget === "gradeSchool">> + better-off citizens, including the caller. Though most of the other students and faculty escaped, a few of the students are now stuck in the school and are running out of options as the riots steadily creep closer to the grounds. + <<elseif $eventResults.aidTarget === "volleyballTeam">> + vulnerable citizens, including the caller. Their bus broke down on the way to the championship game and all those that have left to get help have not returned. She and her several remaining teammates are running out of options as those looking for easy targets creep ever closer. + <</if>> + <<else>> + After years of constant rape and abuse, an opening finally arrived for escape when a rival faction raided the decaying church they were stored in, however the situation outside isn't much better. Violent riots are taking place and the mobs are eagerly snatching up what ever loot and women they can get their hands on. She and the remaining women are trapped and in no condition to run; most particularly the youngest of the group who is ripe with child, though she herself and one of the others are also carrying their rapists' babies. They are completely out of options as the looters work their way down the city streets. + <</if>> + They beg you to help evacuate them, and promise to pay you once they're out. <<case "aid result">> + <<set $eventResults.aid = 0>> + <<set $nationHate += 2>> + You watch on the feeds from your VTOL craft as it settles <<if $eventResults.aidTarget === "volleyballTeam">>beside<<else>>onto the roof of<</if>> the + <<if $eventResults.aidTarget === "convent">> + convent whose remaining women + <<elseif $eventResults.aidTarget === "school">> + girls' school whose remaining students and principal + <<elseif $eventResults.aidTarget === "housewives">> + mansion of the leader of the group of housewives + <<elseif $eventResults.aidTarget === "maternity">> + maternity ward whose remaining patients + <<elseif $eventResults.aidTarget === "conversion">> + religious sexual orientation therapy camp whose inmates and owner + <<elseif $eventResults.aidTarget === "gradeSchool">> + school whose students + <<elseif $eventResults.aidTarget === "volleyballTeam">> + bus whose athletes + <<elseif $eventResults.aidTarget === "seizedMission">> + building the raped missionaries + <</if>> + you promised to rescue<<if $eventResults.aidTarget === "seizedMission">> were holed up in<</if>>. Its side doors retract, allowing the escapees to hustle aboard with their bundles of personal possessions. Once they're on board and strapped into their seats, the turbofans howl and the craft peels smoothly off the roof, the hot jet wash setting it alight. Once it transitions fully into level flight, the true plan goes into operation. At a carefully selected moment, injectors concealed within each seat lance into the passengers' buttocks, knocking them out. It works flawlessly, the drugs precisely calibrated to each body based on the weight added to the VTOL as each climbed aboard. This avoids the potential for over- or under-dosage present when using gas or darts to subdue groups. In perfect unison, the passengers slump against the harnesses holding them against the seats. + <br><br> + When the aircraft lands at your penthouse pad, the would-be escapees are still unconscious. This makes putting them through enslavement physically laborious, though it does cut down on the usual whining; fortunately, you reserved the credits necessary to obscure their questionably legitimate enslavement. By the time they awake, they'll be indistinguishable from any other new slave in the arcology. The possibility remains, however that rumor of the incident will leak out. Your VTOL bird's entry and exit from the capital city was likely noticed and remarked upon. + <br><br> + <<set _newSlaves = []>> + <<if $eventResults.aidTarget === "convent">> + <<set _slave = GenerateNewSlave("XX", {minAge: 30, maxAge: 42, disableDisability: 1})>> + <<set _slave.origin = "$He was the head of a religious community of women you enslaved.">> + <<set _slave.career = "a nun">> + <<set _slave.devotion = -20>> + <<set _slave.trust = random(-90,-75)>> + <<run setHealth(_slave, jsRandom(-10, 10), undefined, undefined, undefined, 0)>> + <<set _slave.face = 15>> + <<set _slave.anus = 0>> + <<set _slave.vagina = 0>> + <<set _slave.weight = random(20,140)>> + <<set _slave.attrXX = random(60,90)>> + <<set _slave.attrXY = random(10,50)>> + <<set _slave.energy = random(60,80)>> + <<set _slave.skill.vaginal = 0>> + <<set _slave.skill.oral = 35>> + <<set _slave.skill.anal = 0>> + <<set _slave.skill.whoring = 0>> + <<set _slave.skill.entertainment = 0>> + <<set _slave.pubicHStyle = "bushy">> + <<set _slave.fetish = "dom">> + <<set _slave.behavioralFlaw = "devout">> + <<set _slave.sexualFlaw = "repressed">> + <<set _slave.sexualQuirk = "perverted">> + <<set _newSlaves.push(_slave)>> + In any case, you've enslaved a fine group. The leader is on the older side, but not unattractive. $His girls are younger, and probably have all sorts of delightful repressed tendencies to be manipulated. + <<for _i = 0; _i < 3; _i++>> + <<set _slave = GenerateNewSlave("XX", {minAge: 18, maxAge: 24})>> + <<set _slave.origin = "$He was an initiate in a religious community of women you enslaved.">> + <<set _slave.career = "a nun">> + <<set _slave.devotion = random(-90,-75)>> + <<set _slave.trust = -20>> + <<run setHealth(_slave, jsRandom(-10, 10), undefined, undefined, undefined, 20)>> + <<set _slave.anus = 0>> + <<set _slave.vagina = 0>> + <<set _slave.weight = random(-20,-100)>> + <<set _slave.attrXX = random(10,50)>> + <<set _slave.attrXY = random(10,50)>> + <<set _slave.energy = random(5,20)>> + <<set _slave.skill.vaginal = 0>> + <<set _slave.skill.oral = 15>> + <<set _slave.skill.anal = 0>> + <<set _slave.skill.whoring = 0>> + <<set _slave.skill.entertainment = 0>> + <<set _slave.pubicHStyle = "bushy">> + <<set _slave.behavioralFlaw = "devout">> + <<set _slave.sexualFlaw = "repressed">> + <<set _newSlaves.push(_slave)>> + <</for>> + <<elseif $eventResults.aidTarget === "school">> + <<set _slave = GenerateNewSlave("XX", {minAge: 26, maxAge: 42, disableDisability: 1})>> + <<set _slave.origin = "$He was the principal of a girls' school whose remnants you enslaved. A strap-on and a large quantity of personal lubricant were found in $his possession when $he was enslaved.">> + <<set _slave.intelligence = random(16,80)>> + <<set _slave.intelligenceImplant = 15>> + <<set _slave.teeth = "normal">> + <<set _slave.career = "a principal">> + <<set _slave.devotion = -20>> + <<set _slave.trust = random(-90,-75)>> + <<run setHealth(_slave, jsRandom(-10, 10), undefined, undefined, undefined, 0)>> + <<set _slave.anus = 1>> + <<set _slave.vagina = 1>> + <<set _slave.weight = random(20,80)>> + <<set _slave.attrXX = random(60,90)>> + <<set _slave.attrXY = random(10,50)>> + <<set _slave.energy = random(60,80)>> + <<set _slave.skill.vaginal = 15>> + <<set _slave.skill.oral = 15>> + <<set _slave.skill.anal = 15>> + <<set _slave.skill.whoring = 0>> + <<set _slave.skill.entertainment = 15>> + <<set _slave.pubicHStyle = "waxed">> + <<set _slave.fetish = "dom">> + <<set _slave.behavioralFlaw = either("arrogant", "bitchy", "hates men", "hates men", "liberated")>> + <<set _slave.sexualFlaw = "shamefast">> + <<set _newSlaves.push(_slave)>> + In any case, you've enslaved a fine group. The principal is on the older side, and seems to have paid unusually close attention to $his appearance, for the female principal of a girls' school. And for whatever reason, the school's uniform skirt seems to have been rather short in back. + <<for _i = 0; _i < 3; _i++>> + <<set _slave = GenerateNewSlave("XX", {maxAge: 18, disableDisability: 1})>> + <<set _slave.origin = "$He was a student at a girls' school whose remnants you enslaved.">> + <<set _slave.career = "a student">> + <<run generateSalonModifications(_slave)>> + <<set _slave.devotion = random(-90,-75)>> + <<set _slave.trust = -20>> + <<run setHealth(_slave, jsRandom(-10, 10), undefined, undefined, undefined, 10)>> + <<set _slave.anus = 1>> + <<set _slave.vagina = random(0, 0, 1)>> + <<set _slave.weight = random(-50,0)>> + <<set _slave.attrXX = 70>> + <<set _slave.attrXY = random(10,70)>> + <<set _slave.energy = random(50,70)>> + <<set _slave.skill.vaginal = 0>> + <<set _slave.skill.oral = 0>> + <<set _slave.skill.anal = 15>> + <<set _slave.skill.whoring = 0>> + <<set _slave.skill.entertainment = 0>> + <<set _slave.fetish = "buttslut">> + <<set _slave.behavioralFlaw = either("anorexic", "arrogant", "bitchy")>> + <<set _slave.sexualFlaw = either("hates anal", "idealistic", "shamefast")>> + <<set _newSlaves.push(_slave)>> + <</for>> + <<elseif $eventResults.aidTarget === "maternity">> + <<for _i = 0; _i < 4; _i++>> + <<set _pram = {mature: 0, disableDisability: 1, ageOverridesPedoMode: 1}>> + <<if $pedo_mode === 1>> + <<set _pram.minAge = $fertilityAge>> + <<else>> + <<set _pram.minAge = 20>> + <<set _pram.maxAge = 39>> + <</if>> + <<set _slave = GenerateNewSlave("XX", _pram)>> + <<set _slave.origin = "$He was an expectant mother you enslaved when you evacuated $him from a threatened old world hospital.">> + <<set _slave.career = "a housewife">> + <<set _slave.devotion = random(-90,-75)>> + <<set _slave.trust = -20>> + <<set _slave.preg = random(28,40)>> + <<set _slave.pregType = either(1, 1, 1, 1, 1, 1, 2)>> + <<set _slave.pregKnown = 1>> + <<set _slave.pregWeek = _slave.preg>> + <<run SetBellySize(_slave)>> + <<run setHealth(_slave, jsRandom(-10, 10), undefined, undefined, undefined, 50)>> + <<set _slave.vagina = random(1,3)>> + <<set _slave.boobs += 100*random(0,2)>> + <<set _slave.lactation = 1>> + <<set _slave.lactationDuration = 2>> + <<set _slave.nipples = either("cute", "inverted", "partially inverted", "puffy")>> + <<set _newSlaves.push(_slave)>> + <</for>> + In any case, you've enslaved a fine group. The expectant mothers vary widely; the only thing they have in common is their gravid bellies. None of them are in really serious condition, either, and they should bear the transition to slave life reasonably well despite their pregnancies. + <<elseif $eventResults.aidTarget === "gradeSchool">> + In any case, you've enslaved a fine group. The girls are all within a similar age range, young, and healthy. Their youth and vigor should make them quite popular. + <<for _i = 0; _i < 4; _i++>> + <<set _pram = {disableDisability: 1, ageOverridesPedoMode: 1}>> + <<if $minimumSlaveAge <= 7>> + <<set _pram.minAge = 7>> + <<set _pram.maxAge = 10>> + <<elseif $minimumSlaveAge <= 11>> + <<set _pram.minAge = 11>> + <<set _pram.maxAge = 14>> + <<elseif $minimumSlaveAge <= 15>> + <<set _pram.minAge = 15>> + <<set _pram.maxAge = 18>> + <<else>> + <<set _pram.minAge = 18>> + <<set _pram.maxAge = 18>> + <</if>> + <<set _slave = GenerateNewSlave(null, _pram)>> + <<set _slave.origin = "$He was a student you enslaved when you evacuated $him from a threatened old world grade school.">> + <<set _slave.career = "a student">> + <<run generateSalonModifications(_slave)>> + <<set _slave.devotion = random(-90,-75)>> + <<set _slave.trust = random(-90,-75)>> + <<run setHealth(_slave, jsRandom(-10, 10), undefined, undefined, 0, jsRandom(40, 70))>> + <<set _newSlaves.push(_slave)>> + <</for>> + <<elseif $eventResults.aidTarget === "conversion">> + In any case, you've enslaved a fine group. Certain religious groups persist in the hilarious delusion that it's possible to alter sexual orientation through prayer. In your experience, hormones, drugs, and compliance training are far more effective. + <<set _slave = GenerateNewSlave("XY", {disableDisability: 1, minAge: 26, maxAge: 42})>> + <<set _slave.origin = "$He was the owner of a religious orientation conversion therapy camp whose remnants you enslaved.">> + <<set _slave.career = "a business owner">> + <<set _slave.devotion = -20>> + <<set _slave.trust = random(-90,-75)>> + <<run setHealth(_slave, jsRandom(-10, 10), undefined, undefined, undefined, 0)>> + <<set _slave.anus = random(2,3)>> + <<set _slave.weight = random(20,80)>> + <<set _slave.attrXX = random(10,50)>> + <<set _slave.attrXY = 90>> + <<set _slave.energy = random(30,80)>> + <<set _slave.skill.oral = random(50,100)>> + <<set _slave.skill.anal = random(50,100)>> + <<set _slave.skill.whoring = 0>> + <<set _slave.skill.entertainment = random(15,40)>> + <<set _slave.pubicHStyle = "waxed">> + <<set _slave.fetish = either("submissive", "cumslut", "buttslut")>> + <<set _slave.fetishStrength = random(1,2)>> + <<set _slave.behavioralFlaw = either("arrogant", "bitchy", "hates women", "odd", "liberated")>> + <<set _slave.sexualFlaw = either("repressed", "shamefast")>> + <<set _newSlaves.push(_slave)>> + <<for _i = 0; _i < 3; _i++>> + <<set _slave = GenerateNewSlave("XY", {disableDisability: 1, minAge: 16, maxAge: 18})>> + <<set _slave.origin = "$He was an inmate at a religious orientation conversion therapy camp whose remnants you enslaved.">> + <<set _slave.career = "a student">> + <<set _slave.devotion = random(-90,-75)>> + <<set _slave.trust = -20>> + <<run setHealth(_slave, jsRandom(-10, 10), undefined, undefined, undefined, 20)>> + <<set _slave.anus = 1>> + <<set _slave.weight = random(-50,0)>> + <<set _slave.attrXX = random(10,50)>> + <<set _slave.attrXY = random(60,90)>> + <<set _slave.energy = random(30,70)>> + <<set _slave.skill.oral = random(15,40)>> + <<set _slave.skill.anal = random(15,40)>> + <<set _slave.skill.whoring = 0>> + <<set _slave.skill.entertainment = 0>> + <<set _slave.fetish = "buttslut">> + <<set _slave.behavioralFlaw = either("anorexic", "bitchy", "devout", "odd")>> + <<set _slave.sexualFlaw = either("apathetic", "repressed", "shamefast")>> + <<set _newSlaves.push(_slave)>> + <</for>> + <<elseif $eventResults.aidTarget === "volleyballTeam">> + In any case, you've enslaved a fine group. The girls are in fine health, fit and just past their majority, likely the reason any that stepped off the bus were promptly abducted. Their youth and vigor should make them quite popular, as will their experience with handling balls. + <<for _i = 0; _i < 4; _i++>> + <<set _slave = GenerateNewSlave("XX", {disableDisability: 1, ageOverridesPedoMode: 1, minAge: 18, maxAge: 18})>> + <<set _slave.height = Math.round(Height.random(_slave, {skew: 1, limitMult: [0, 2]}))>> + <<set _slave.origin = "$He was a volleyball player you enslaved when you evacuated $him from a broken down bus.">> + <<set _slave.career = "a student athlete">> + <<run generateSalonModifications(_slave)>> + <<set _slave.devotion = random(-90,-75)>> + <<set _slave.trust = random(-90,-75)>> + <<run setHealth(_slave, jsRandom(20, 60), 0, 0, undefined, 90)>> + <<set _slave.muscles = random(20,40)>> + <<set _slave.weight = random(-10,5)>> + <<set _slave.waist = random(-40,0)>> + <<set _slave.boobs = random(3,5)*100>> + <<set _slave.butt = random(1,2)>> + <<set _newSlaves.push(_slave)>> + <</for>> + <<elseif $eventResults.aidTarget === "seizedMission">> + /* leader */ + <<set _pram = {mature: 0, disableDisability: 1, ageOverridesPedoMode: 1, race: "white"}>> + <<if $pedo_mode === 1>> + <<set _pram.minAge = 18>> + <<set _pram.maxAge = 24>> + <<else>> + <<set _pram.minAge = 25>> + <<set _pram.maxAge = 39>> + <</if>> + <<set _missLeader = GenerateNewSlave("XX", _pram)>> + <<set _missLeader.origin = "$He was the head nun of a conquered mission. Once claimed, $he was reduced to nothing more than a cum dump for $his black masters.">> + <<set _missLeader.career = "a nun">> + <<set _missLeader.intelligence = random(16,80)>> + <<set _missLeader.intelligenceImplant = 15>> + <<set _missLeader.devotion = 40>> + <<set _missLeader.trust = random(0,40)>> + <<run setHealth(_missLeader, jsRandom(-50, 10), normalRandInt(15, 3), undefined, undefined, 60)>> + <<set _missLeader.anus = 3>> + <<set _missLeader.vagina = 5>> + <<set _missLeader.weight = random(-80,-20)>> + <<set _missLeader.muscles = random(-20,0)>> + <<set _missLeader.waist = random(-40,0)>> + <<set _missLeader.attrXY = random(0,10)>> + <<set _missLeader.energy = random(0,20)>> + <<set _missLeader.skill.vaginal = 50>> + <<set _missLeader.skill.oral = 75>> + <<set _missLeader.skill.anal = 25>> + <<set _missLeader.pubicHStyle = "bushy">> + <<set _missLeader.underarmHStyle = "bushy">> + <<set _missLeader.preg = random(15,25)>> + <<set _missLeader.pregType = 1>> + <<set _missLeader.pregKnown = 1>> + <<set _missLeader.pregWeek = _missLeader.preg>> + <<run SetBellySize(_missLeader)>> + <<run WombFatherRace(_missLeader, "black")>> + <<set _missLeader.counter.birthsTotal = 3>> + <<set _missLeader.bellySag = 5>> + <<set _missLeader.bellySagPreg = 5>> + <<set _missLeader.boobs += 100*random(1,3)>> + <<set _missLeader.lactation = 1>> + <<set _missLeader.lactationDuration = 2>> + <<set _missLeader.boobShape = "saggy">> + <<set _missLeader.nipples = "huge">> + <<set _newSlaves.push(_missLeader)>> + + /* preggo */ + <<set _pram = {disableDisability: 1, ageOverridesPedoMode: 1, race: "white"}>> + <<if $pedo_mode === 1>> + <<set _pram.minAge = 16>> + <<set _pram.maxAge = 18>> + <<else>> + <<set _pram.minAge = 18>> + <<set _pram.maxAge = 24>> + <</if>> + <<set _slave = GenerateNewSlave("XX", _pram)>> + <<set _slave.origin = "$He was a nun in a felled mission. Once claimed, $he was reduced to nothing more than a cum dump for $his black masters.">> + <<set _slave.career = "a nun">> + <<set _slave.intelligenceImplant = 15>> + <<set _slave.devotion = 30>> + <<set _slave.trust = random(-20,20)>> + <<run setHealth(_slave, jsRandom(-60, -10), normalRandInt(15, 3), undefined, undefined, 40)>> + <<set _slave.anus = 3>> + <<set _slave.vagina = 4>> + <<set _slave.weight = random(-90,-20)>> + <<set _slave.muscles = random(-50,-20)>> + <<set _slave.waist = random(-40,0)>> + <<set _slave.attrXY = random(0,10)>> + <<set _slave.energy = random(0,20)>> + <<set _slave.skill.vaginal = 50>> + <<set _slave.skill.oral = 75>> + <<set _slave.skill.anal = 25>> + <<set _slave.pubicHStyle = "bushy">> + <<set _slave.underarmHStyle = "bushy">> + <<set _slave.preg = random(30,35)>> + <<set _slave.pregType = 1>> + <<set _slave.pregKnown = 1>> + <<set _slave.pregWeek = _slave.preg>> + <<run SetBellySize(_slave)>> + <<run WombFatherRace(_slave, "black")>> + <<set _slave.counter.birthsTotal = 3>> + <<set _slave.bellySag = 5>> + <<set _slave.bellySagPreg = 5>> + <<set _slave.boobs += 100*random(0,2)>> + <<set _slave.lactation = 1>> + <<set _slave.lactationDuration = 2>> + <<set _slave.boobShape = "saggy">> + <<set _slave.nipples = either("cute", "puffy")>> + <<set _newSlaves.push(_slave)>> -<<set $eventResults.aid = 0>> -<<set $nationHate += 2>> -You watch on the feeds from your VTOL craft as it settles <<if $eventResults.aidTarget == "volleyballTeam">>beside<<else>>onto the roof of<</if>> the -<<if $eventResults.aidTarget == "convent">> - convent whose remaining women -<<elseif $eventResults.aidTarget == "school">> - girls' school whose remaining students and principal -<<elseif $eventResults.aidTarget == "housewives">> - mansion of the leader of the group of housewives -<<elseif $eventResults.aidTarget == "maternity">> - maternity ward whose remaining patients -<<elseif $eventResults.aidTarget == "conversion">> - religious sexual orientation therapy camp whose inmates and owner -<<elseif $eventResults.aidTarget == "gradeSchool">> - school whose students -<<elseif $eventResults.aidTarget == "volleyballTeam">> - bus whose athletes -<<elseif $eventResults.aidTarget == "seizedMission">> - building the raped missionaries -<</if>> -you promised to rescue<<if $eventResults.aidTarget == "seizedMission">> were holed up in<</if>>. Its side doors retract, allowing the escapees to hustle aboard with their bundles of personal possessions. Once they're on board and strapped into their seats, the turbofans howl and the craft peels smoothly off the roof, the hot jet wash setting it alight. Once it transitions fully into level flight, the true plan goes into operation. At a carefully selected moment, injectors concealed within each seat lance into the passengers' buttocks, knocking them out. It works flawlessly, the drugs precisely calibrated to each body based on the weight added to the VTOL as each climbed aboard. This avoids the potential for over- or under-dosage present when using gas or darts to subdue groups. In perfect unison, the passengers slump against the harnesses holding them against the seats. -<br><br> -When the aircraft lands at your penthouse pad, the would-be escapees are still unconscious. This makes putting them through enslavement physically laborious, though it does cut down on the usual whining; fortunately, you reserved the credits necessary to obscure their questionably legitimate enslavement. By the time they awake, they'll be indistinguishable from any other new slave in the arcology. The possibility remains, however that rumor of the incident will leak out. Your VTOL bird's entry and exit from the capital city was likely noticed and remarked upon. -<br><br> -<<set _newSlaves = []>> -<<if $eventResults.aidTarget == "convent">> - <<set $activeSlaveOneTimeMinAge = 30>> - <<set $activeSlaveOneTimeMaxAge = 42>> - <<set $oneTimeDisableDisability = 1>> - <<set $activeSlave = GenerateNewSlave("XX")>> - <<set $activeSlave.origin = "$He was the head of a religious community of women you enslaved.">> - <<set $activeSlave.career = "a nun">> - <<set $activeSlave.devotion = -20>> - <<set $activeSlave.trust = random(-90,-75)>> - <<run setHealth($activeSlave, jsRandom(-10, 10), undefined, undefined, undefined, 0)>> - <<set $activeSlave.face = 15>> - <<set $activeSlave.anus = 0>> - <<set $activeSlave.vagina = 0>> - <<set $activeSlave.weight = random(20,140)>> - <<set $activeSlave.attrXX = random(60,90)>> - <<set $activeSlave.attrXY = random(10,50)>> - <<set $activeSlave.energy = random(60,80)>> - <<set $activeSlave.skill.vaginal = 0>> - <<set $activeSlave.skill.oral = 35>> - <<set $activeSlave.skill.anal = 0>> - <<set $activeSlave.skill.whoring = 0>> - <<set $activeSlave.skill.entertainment = 0>> - <<set $activeSlave.pubicHStyle = "bushy">> - <<set $activeSlave.fetish = "dom">> - <<set $activeSlave.behavioralFlaw = "devout">> - <<set $activeSlave.sexualFlaw = "repressed">> - <<set $activeSlave.sexualQuirk = "perverted">> - <<set _newSlaves.push($activeSlave)>> - In any case, you've enslaved a fine group. The leader is on the older side, but not unattractive. $His girls are younger, and probably have all sorts of delightful repressed tendencies to be manipulated. - <<for $i = 0; $i < 3; $i++>> - <<set $activeSlaveOneTimeMinAge = 18>> - <<set $activeSlaveOneTimeMaxAge = 24>> - <<set $activeSlave = GenerateNewSlave("XX")>> - <<set $activeSlave.origin = "$He was an initiate in a religious community of women you enslaved.">> - <<set $activeSlave.career = "a nun">> - <<set $activeSlave.devotion = random(-90,-75)>> - <<set $activeSlave.trust = -20>> - <<run setHealth($activeSlave, jsRandom(-10, 10), undefined, undefined, undefined, 20)>> - <<set $activeSlave.anus = 0>> - <<set $activeSlave.vagina = 0>> - <<set $activeSlave.weight = random(-20,-100)>> - <<set $activeSlave.attrXX = random(10,50)>> - <<set $activeSlave.attrXY = random(10,50)>> - <<set $activeSlave.energy = random(5,20)>> - <<set $activeSlave.skill.vaginal = 0>> - <<set $activeSlave.skill.oral = 15>> - <<set $activeSlave.skill.anal = 0>> - <<set $activeSlave.skill.whoring = 0>> - <<set $activeSlave.skill.entertainment = 0>> - <<set $activeSlave.pubicHStyle = "bushy">> - <<set $activeSlave.behavioralFlaw = "devout">> - <<set $activeSlave.sexualFlaw = "repressed">> - <<set _newSlaves.push($activeSlave)>> - <</for>> -<<elseif $eventResults.aidTarget == "school">> - <<set $activeSlaveOneTimeMinAge = 26>> - <<set $activeSlaveOneTimeMaxAge = 42>> - <<set $oneTimeDisableDisability = 1>> - <<set $activeSlave = GenerateNewSlave("XX")>> - <<set $activeSlave.origin = "$He was the principal of a girls' school whose remnants you enslaved. A strap-on and a large quantity of personal lubricant were found in $his possession when $he was enslaved.">> - <<set $activeSlave.intelligence = random(16,80)>> - <<set $activeSlave.intelligenceImplant = 15>> - <<set $activeSlave.teeth = "normal">> - <<set $activeSlave.career = "a principal">> - <<set $activeSlave.devotion = -20>> - <<set $activeSlave.trust = random(-90,-75)>> - <<run setHealth($activeSlave, jsRandom(-10, 10), undefined, undefined, undefined, 0)>> - <<set $activeSlave.anus = 1>> - <<set $activeSlave.vagina = 1>> - <<set $activeSlave.weight = random(20,80)>> - <<set $activeSlave.attrXX = random(60,90)>> - <<set $activeSlave.attrXY = random(10,50)>> - <<set $activeSlave.energy = random(60,80)>> - <<set $activeSlave.skill.vaginal = 15>> - <<set $activeSlave.skill.oral = 15>> - <<set $activeSlave.skill.anal = 15>> - <<set $activeSlave.skill.whoring = 0>> - <<set $activeSlave.skill.entertainment = 15>> - <<set $activeSlave.pubicHStyle = "waxed">> - <<set $activeSlave.fetish = "dom">> - <<set $activeSlave.behavioralFlaw = either("arrogant", "bitchy", "hates men", "hates men", "liberated")>> - <<set $activeSlave.sexualFlaw = "shamefast">> - <<set _newSlaves.push($activeSlave)>> - In any case, you've enslaved a fine group. The principal is on the older side, and seems to have paid unusually close attention to $his appearance, for the female principal of a girls' school. And for whatever reason, the school's uniform skirt seems to have been rather short in back. - <<for $i = 0; $i < 3; $i++>> - <<set $activeSlaveOneTimeMaxAge = 18>> - <<set $oneTimeDisableDisability = 1>> - <<set $activeSlave = GenerateNewSlave("XX")>> - <<set $activeSlave.origin = "$He was a student at a girls' school whose remnants you enslaved.">> - <<set $activeSlave.career = "a student">> - <<run generateSalonModifications($activeSlave)>> - <<set $activeSlave.devotion = random(-90,-75)>> - <<set $activeSlave.trust = -20>> - <<run setHealth($activeSlave, jsRandom(-10, 10), undefined, undefined, undefined, 10)>> - <<set $activeSlave.anus = 1>> - <<set $activeSlave.vagina = random(0, 0, 1)>> - <<set $activeSlave.weight = random(-50,0)>> - <<set $activeSlave.attrXX = 70>> - <<set $activeSlave.attrXY = random(10,70)>> - <<set $activeSlave.energy = random(50,70)>> - <<set $activeSlave.skill.vaginal = 0>> - <<set $activeSlave.skill.oral = 0>> - <<set $activeSlave.skill.anal = 15>> - <<set $activeSlave.skill.whoring = 0>> - <<set $activeSlave.skill.entertainment = 0>> - <<set $activeSlave.fetish = "buttslut">> - <<set $activeSlave.behavioralFlaw = either("anorexic", "arrogant", "bitchy")>> - <<set $activeSlave.sexualFlaw = either("hates anal", "idealistic", "shamefast")>> - <<set _newSlaves.push($activeSlave)>> - <</for>> -<<elseif $eventResults.aidTarget == "maternity">> - <<for $i = 0; $i < 4; $i++>> - <<if $pedo_mode == 1>> - <<set $activeSlaveOneTimeMinAge = $fertilityAge>> + /* post preggo */ + <<set _pram = {disableDisability: 1, ageOverridesPedoMode: 1, race: "white"}>> + <<if $pedo_mode === 1>> + <<set _pram.minAge = 16>> + <<set _pram.maxAge = 18>> <<else>> - <<set $activeSlaveOneTimeMinAge = 20>> - <<set $activeSlaveOneTimeMaxAge = 39>> + <<set _pram.minAge = 19>> + <<set _pram.maxAge = 22>> <</if>> - <<set $one_time_age_overrides_pedo_mode = 1>> /% Old enough to be pregnant. %/ - <<set $oneTimeDisableDisability = 1>> - <<set $activeSlave = GenerateNewSlave("XX", {mature: 0})>> - <<set $activeSlave.origin = "$He was an expectant mother you enslaved when you evacuated $him from a threatened old world hospital.">> - <<set $activeSlave.career = "a housewife">> - <<set $activeSlave.devotion = random(-90,-75)>> - <<set $activeSlave.trust = -20>> - <<set $activeSlave.preg = random(28,40)>> - <<set $activeSlave.pregType = either(1, 1, 1, 1, 1, 1, 2)>> - <<set $activeSlave.pregKnown = 1>> - <<set $activeSlave.pregWeek = $activeSlave.preg>> - <<run SetBellySize($activeSlave)>> - <<run setHealth($activeSlave, jsRandom(-10, 10), undefined, undefined, undefined, 50)>> - <<set $activeSlave.vagina = random(1,3)>> - <<set $activeSlave.boobs += 100*random(0,2)>> - <<set $activeSlave.lactation = 1>> - <<set $activeSlave.lactationDuration = 2>> - <<set $activeSlave.nipples = either("cute", "inverted", "partially inverted", "puffy")>> - <<set _newSlaves.push($activeSlave)>> - <</for>> - In any case, you've enslaved a fine group. The expectant mothers vary widely; the only thing they have in common is their gravid bellies. None of them are in really serious condition, either, and they should bear the transition to slave life reasonably well despite their pregnancies. -<<elseif $eventResults.aidTarget == "gradeSchool">> - In any case, you've enslaved a fine group. The girls are all within a similar age range, young, and healthy. Their youth and vigor should make them quite popular. - <<for $i = 0; $i < 4; $i++>> - <<if $minimumSlaveAge <= 7>> - <<set $activeSlaveOneTimeMinAge = 7>> - <<set $activeSlaveOneTimeMaxAge = 10>> - <<elseif $minimumSlaveAge <= 11>> - <<set $activeSlaveOneTimeMinAge = 11>> - <<set $activeSlaveOneTimeMaxAge = 14>> - <<elseif $minimumSlaveAge <= 15>> - <<set $activeSlaveOneTimeMinAge = 15>> - <<set $activeSlaveOneTimeMaxAge = 18>> + <<set _slave = GenerateNewSlave("XX", _pram)>> + <<set _slave.origin = "$He was a nun in a felled mission. Once claimed, $he was reduced to nothing more than a cum dump for $his black masters.">> + <<set _slave.career = "a nun">> + <<set _slave.devotion = 50>> + <<set _slave.trust = random(0,50)>> + <<run setHealth(_slave, jsRandom(-90, -50), normalRandInt(15, 3), undefined, undefined, 80)>> + <<set _slave.anus = 3>> + <<set _slave.vagina = 5>> + <<set _slave.weight = random(-90,-60)>> + <<set _slave.muscles = random(-70,-20)>> + <<set _slave.waist = random(-10,0)>> + <<set _slave.attrXY = random(0,10)>> + <<set _slave.energy = random(0,20)>> + <<set _slave.skill.vaginal = 50>> + <<set _slave.skill.oral = 75>> + <<set _slave.skill.anal = 25>> + <<set _slave.pubicHStyle = "bushy">> + <<set _slave.underarmHStyle = "bushy">> + <<set _slave.preg = 0>> + <<set _slave.pregWeek = -3>> + <<set _slave.counter.birthsTotal = 2>> + <<set _slave.bellySag = 5>> + <<set _slave.bellySagPreg = 5>> + <<set _slave.boobs += 100*random(1,3)>> + <<set _slave.lactation = 1>> + <<set _slave.lactationDuration = 1>> + <<set _slave.boobsMilk = 200>> + <<set _slave.boobs += _slave.boobsMilk>> + <<set _slave.boobShape = "saggy">> + <<set _slave.nipples = either("cute", "puffy")>> + <<set _newSlaves.push(_slave)>> + + /* young preggo*/ + <<set _pram = {disableDisability: 1, ageOverridesPedoMode: 1, race: "white"}>> + <<if $minimumSlaveAge < $fertilityAge>> + <<if $minimumSlaveAge < 8>> + <<set _pram.minAge = 8>> + <<set _pram.maxAge = 8>> + <<else>> + <<set _pram.minAge = $fertilityAge>> + <<set _pram.maxAge = $fertilityAge>> + <</if>> <<else>> - <<set $activeSlaveOneTimeMinAge = 18>> - <<set $activeSlaveOneTimeMaxAge = 18>> + <<if $fertilityAge < 8>> + <<set _pram.minAge = 8>> + <<set _pram.maxAge = 8>> + <<else>> + <<set _pram.minAge = $minimumSlaveAge>> + <<set _pram.maxAge = $minimumSlaveAge>> + <</if>> <</if>> - <<set $one_time_age_overrides_pedo_mode = 1>> - <<set $oneTimeDisableDisability = 1>> - <<set $activeSlave = GenerateNewSlave()>> - <<set $activeSlave.origin = "$He was a student you enslaved when you evacuated $him from a threatened old world grade school.">> - <<set $activeSlave.career = "a student">> - <<run generateSalonModifications($activeSlave)>> - <<set $activeSlave.devotion = random(-90,-75)>> - <<set $activeSlave.trust = random(-90,-75)>> - <<run setHealth($activeSlave, jsRandom(-10, 10), undefined, undefined, 0, jsRandom(40, 70))>> - <<set _newSlaves.push($activeSlave)>> - <</for>> -<<elseif $eventResults.aidTarget == "conversion">> - In any case, you've enslaved a fine group. Certain religious groups persist in the hilarious delusion that it's possible to alter sexual orientation through prayer. In your experience, hormones, drugs, and compliance training are far more effective. - <<set $activeSlaveOneTimeMinAge = 26>> - <<set $activeSlaveOneTimeMaxAge = 42>> - <<set $oneTimeDisableDisability = 1>> - <<set $activeSlave = GenerateNewSlave("XY")>> - <<set $activeSlave.origin = "$He was the owner of a religious orientation conversion therapy camp whose remnants you enslaved.">> - <<set $activeSlave.career = "a business owner">> - <<set $activeSlave.devotion = -20>> - <<set $activeSlave.trust = random(-90,-75)>> - <<run setHealth($activeSlave, jsRandom(-10, 10), undefined, undefined, undefined, 0)>> - <<set $activeSlave.anus = random(2,3)>> - <<set $activeSlave.weight = random(20,80)>> - <<set $activeSlave.attrXX = random(10,50)>> - <<set $activeSlave.attrXY = 90>> - <<set $activeSlave.energy = random(30,80)>> - <<set $activeSlave.skill.oral = random(50,100)>> - <<set $activeSlave.skill.anal = random(50,100)>> - <<set $activeSlave.skill.whoring = 0>> - <<set $activeSlave.skill.entertainment = random(15,40)>> - <<set $activeSlave.pubicHStyle = "waxed">> - <<set $activeSlave.fetish = either("submissive", "cumslut", "buttslut")>> - <<set $activeSlave.fetishStrength = random(1,2)>> - <<set $activeSlave.behavioralFlaw = either("arrogant", "bitchy", "hates women", "odd", "liberated")>> - <<set $activeSlave.sexualFlaw = either("repressed", "shamefast")>> - <<set _newSlaves.push($activeSlave)>> - <<for $i = 0; $i < 3; $i++>> - <<set $activeSlaveOneTimeMinAge = 16>> - <<set $activeSlaveOneTimeMaxAge = 18>> - <<set $oneTimeDisableDisability = 1>> - <<set $activeSlave = GenerateNewSlave("XY")>> - <<set $activeSlave.origin = "$He was an inmate at a religious orientation conversion therapy camp whose remnants you enslaved.">> - <<set $activeSlave.career = "a student">> - <<set $activeSlave.devotion = random(-90,-75)>> - <<set $activeSlave.trust = -20>> - <<run setHealth($activeSlave, jsRandom(-10, 10), undefined, undefined, undefined, 20)>> - <<set $activeSlave.anus = 1>> - <<set $activeSlave.weight = random(-50,0)>> - <<set $activeSlave.attrXX = random(10,50)>> - <<set $activeSlave.attrXY = random(60,90)>> - <<set $activeSlave.energy = random(30,70)>> - <<set $activeSlave.skill.oral = random(15,40)>> - <<set $activeSlave.skill.anal = random(15,40)>> - <<set $activeSlave.skill.whoring = 0>> - <<set $activeSlave.skill.entertainment = 0>> - <<set $activeSlave.fetish = "buttslut">> - <<set $activeSlave.behavioralFlaw = either("anorexic", "bitchy", "devout", "odd")>> - <<set $activeSlave.sexualFlaw = either("apathetic", "repressed", "shamefast")>> - <<set _newSlaves.push($activeSlave)>> - <</for>> -<<elseif $eventResults.aidTarget == "volleyballTeam">> - In any case, you've enslaved a fine group. The girls are in fine health, fit and just past their majority, likely the reason any that stepped off the bus were promptly abducted. Their youth and vigor should make them quite popular, as will their experience with handling balls. - <<for $i = 0; $i < 4; $i++>> - <<set $activeSlaveOneTimeMinAge = 18>> - <<set $activeSlaveOneTimeMaxAge = 18>> - <<set $one_time_age_overrides_pedo_mode = 1>> - <<set $oneTimeDisableDisability = 1>> - <<set $activeSlave = GenerateNewSlave("XX")>> - <<set $activeSlave.height = Math.round(Height.random($activeSlave, {skew: 1, limitMult: [0, 2]}))>> - <<set $activeSlave.origin = "$He was a volleyball player you enslaved when you evacuated $him from a broken down bus.">> - <<set $activeSlave.career = "a student athlete">> - <<run generateSalonModifications($activeSlave)>> - <<set $activeSlave.devotion = random(-90,-75)>> - <<set $activeSlave.trust = random(-90,-75)>> - <<run setHealth($activeSlave, jsRandom(20, 60), 0, 0, undefined, 90)>> - <<set $activeSlave.muscles = random(20,40)>> - <<set $activeSlave.weight = random(-10,5)>> - <<set $activeSlave.waist = random(-40,0)>> - <<set $activeSlave.boobs = random(3,5)*100>> - <<set $activeSlave.butt = random(1,2)>> - <<set _newSlaves.push($activeSlave)>> - <</for>> -<<elseif $eventResults.aidTarget == "seizedMission">> - /* leader */ - <<if $pedo_mode == 1>> - <<set $activeSlaveOneTimeMinAge = 18>> - <<set $activeSlaveOneTimeMaxAge = 24>> - <<else>> - <<set $activeSlaveOneTimeMinAge = 25>> - <<set $activeSlaveOneTimeMaxAge = 39>> - <</if>> - <<set $one_time_age_overrides_pedo_mode = 1>> /% Old enough to be pregnant. %/ - <<set $oneTimeDisableDisability = 1>> - <<set $fixedRace = "white">> - <<set _missLeader = GenerateNewSlave("XX", {mature: 0})>> - <<set _missLeader.origin = "$He was the head nun of a conquered mission. Once claimed, $he was reduced to nothing more than a cum dump for $his black masters.">> - <<set _missLeader.career = "a nun">> - <<set _missLeader.intelligence = random(16,80)>> - <<set _missLeader.intelligenceImplant = 15>> - <<set _missLeader.devotion = 40>> - <<set _missLeader.trust = random(0,40)>> - <<run setHealth(_missLeader, jsRandom(-50, 10), normalRandInt(15, 3), undefined, undefined, 60)>> - <<set _missLeader.anus = 3>> - <<set _missLeader.vagina = 5>> - <<set _missLeader.weight = random(-80,-20)>> - <<set _missLeader.muscles = random(-20,0)>> - <<set _missLeader.waist = random(-40,0)>> - <<set _missLeader.attrXY = random(0,10)>> - <<set _missLeader.energy = random(0,20)>> - <<set _missLeader.skill.vaginal = 50>> - <<set _missLeader.skill.oral = 75>> - <<set _missLeader.skill.anal = 25>> - <<set _missLeader.pubicHStyle = "bushy">> - <<set _missLeader.underarmHStyle = "bushy">> - <<set _missLeader.preg = random(15,25)>> - <<set _missLeader.pregType = 1>> - <<set _missLeader.pregKnown = 1>> - <<set _missLeader.pregWeek = _missLeader.preg>> - <<run SetBellySize(_missLeader)>> - <<run WombFatherRace(_missLeader, "black")>> - <<set _missLeader.counter.birthsTotal = 3>> - <<set _missLeader.bellySag = 5>> - <<set _missLeader.bellySagPreg = 5>> - <<set _missLeader.boobs += 100*random(1,3)>> - <<set _missLeader.lactation = 1>> - <<set _missLeader.lactationDuration = 2>> - <<set _missLeader.boobShape = "saggy">> - <<set _missLeader.nipples = "huge">> - <<set _newSlaves.push(_missLeader)>> - /* preggo */ - <<if $pedo_mode == 1>> - <<set $activeSlaveOneTimeMinAge = 16>> - <<set $activeSlaveOneTimeMaxAge = 18>> - <<else>> - <<set $activeSlaveOneTimeMinAge = 18>> - <<set $activeSlaveOneTimeMaxAge = 24>> - <</if>> - <<set $one_time_age_overrides_pedo_mode = 1>> /% Old enough to be pregnant. %/ - <<set $oneTimeDisableDisability = 1>> - <<set $fixedRace = "white">> - <<set $activeSlave = GenerateNewSlave("XX")>> - <<set $activeSlave.origin = "$He was a nun in a felled mission. Once claimed, $he was reduced to nothing more than a cum dump for $his black masters.">> - <<set $activeSlave.career = "a nun">> - <<set $activeSlave.intelligenceImplant = 15>> - <<set $activeSlave.devotion = 30>> - <<set $activeSlave.trust = random(-20,20)>> - <<run setHealth($activeSlave, jsRandom(-60, -10), normalRandInt(15, 3), undefined, undefined, 40)>> - <<set $activeSlave.anus = 3>> - <<set $activeSlave.vagina = 4>> - <<set $activeSlave.weight = random(-90,-20)>> - <<set $activeSlave.muscles = random(-50,-20)>> - <<set $activeSlave.waist = random(-40,0)>> - <<set $activeSlave.attrXY = random(0,10)>> - <<set $activeSlave.energy = random(0,20)>> - <<set $activeSlave.skill.vaginal = 50>> - <<set $activeSlave.skill.oral = 75>> - <<set $activeSlave.skill.anal = 25>> - <<set $activeSlave.pubicHStyle = "bushy">> - <<set $activeSlave.underarmHStyle = "bushy">> - <<set $activeSlave.preg = random(30,35)>> - <<set $activeSlave.pregType = 1>> - <<set $activeSlave.pregKnown = 1>> - <<set $activeSlave.pregWeek = $activeSlave.preg>> - <<run SetBellySize($activeSlave)>> - <<run WombFatherRace($activeSlave, "black")>> - <<set $activeSlave.counter.birthsTotal = 3>> - <<set $activeSlave.bellySag = 5>> - <<set $activeSlave.bellySagPreg = 5>> - <<set $activeSlave.boobs += 100*random(0,2)>> - <<set $activeSlave.lactation = 1>> - <<set $activeSlave.lactationDuration = 2>> - <<set $activeSlave.boobShape = "saggy">> - <<set $activeSlave.nipples = either("cute", "puffy")>> - <<set _newSlaves.push($activeSlave)>> - /* post preggo */ - <<if $pedo_mode == 1>> - <<set $activeSlaveOneTimeMinAge = 16>> - <<set $activeSlaveOneTimeMaxAge = 18>> - <<else>> - <<set $activeSlaveOneTimeMinAge = 19>> - <<set $activeSlaveOneTimeMaxAge = 22>> - <</if>> - <<set $one_time_age_overrides_pedo_mode = 1>> /% Old enough to be pregnant. %/ - <<set $oneTimeDisableDisability = 1>> - <<set $fixedRace = "white">> - <<set $activeSlave = GenerateNewSlave("XX")>> - <<set $activeSlave.origin = "$He was a nun in a felled mission. Once claimed, $he was reduced to nothing more than a cum dump for $his black masters.">> - <<set $activeSlave.career = "a nun">> - <<set $activeSlave.devotion = 50>> - <<set $activeSlave.trust = random(0,50)>> - <<run setHealth($activeSlave, jsRandom(-90, -50), normalRandInt(15, 3), undefined, undefined, 80)>> - <<set $activeSlave.anus = 3>> - <<set $activeSlave.vagina = 5>> - <<set $activeSlave.weight = random(-90,-60)>> - <<set $activeSlave.muscles = random(-70,-20)>> - <<set $activeSlave.waist = random(-10,0)>> - <<set $activeSlave.attrXY = random(0,10)>> - <<set $activeSlave.energy = random(0,20)>> - <<set $activeSlave.skill.vaginal = 50>> - <<set $activeSlave.skill.oral = 75>> - <<set $activeSlave.skill.anal = 25>> - <<set $activeSlave.pubicHStyle = "bushy">> - <<set $activeSlave.underarmHStyle = "bushy">> - <<set $activeSlave.preg = 0>> - <<set $activeSlave.pregWeek = -3>> - <<set $activeSlave.counter.birthsTotal = 2>> - <<set $activeSlave.bellySag = 5>> - <<set $activeSlave.bellySagPreg = 5>> - <<set $activeSlave.boobs += 100*random(1,3)>> - <<set $activeSlave.lactation = 1>> - <<set $activeSlave.lactationDuration = 1>> - <<set $activeSlave.boobsMilk = 200>> - <<set $activeSlave.boobs += $activeSlave.boobsMilk>> - <<set $activeSlave.boobShape = "saggy">> - <<set $activeSlave.nipples = either("cute", "puffy")>> - <<set _newSlaves.push($activeSlave)>> - /* young preggo*/ - <<if $minimumSlaveAge < $fertilityAge>> - <<if $minimumSlaveAge < 8>> - <<set $activeSlaveOneTimeMinAge = 8>> - <<set $activeSlaveOneTimeMaxAge = 8>> + <<set _missLoli = GenerateNewSlave("XX", _pram)>> + <<set _missLoli.origin = "$He was a fucktoy held in a felled mission. $He was nothing more than a cum dump to $his black masters.">> + <<set _missLoli.career = "an orphan">> + <<set _missLoli.devotion = -20>> + <<set _missLoli.trust = random(-100,-80)>> + <<run setHealth(_missLoli, jsRandom(-90, -70), normalRandInt(25, 3), undefined, undefined, 100)>> + <<set _missLoli.anus = 3>> + <<set _missLoli.vagina = 5>> + <<set _missLoli.pubertyXX = 1>> + <<set _missLoli.weight = random(-100,-60)>> + <<set _missLoli.muscles = random(-100,-80)>> + <<set _missLoli.waist = random(-40,-10)>> + <<set _missLoli.attrXY = random(0,10)>> + <<set _missLoli.energy = random(0,20)>> + <<set _missLoli.skill.vaginal = 75>> + <<set _missLoli.skill.oral = 75>> + <<set _missLoli.skill.anal = 50>> + <<set _missLoli.pubicHStyle = "bushy">> + <<set _missLoli.underarmHStyle = "bushy">> + <<set _missLoli.preg = 40>> + <<set _missLoli.pregType = 1>> + <<set _missLoli.pregKnown = 1>> + <<set _missLoli.pregWeek = _missLoli.preg>> + <<run SetBellySize(_missLoli)>> + <<run WombFatherRace(_missLoli, "black")>> + <<set _missLoli.counter.birthsTotal = 0>> + <<set _missLoli.bellySag = 5>> + <<set _missLoli.bellySagPreg = 5>> + <<if _missLoli.boobs < 300>> + <<set _missLoli.boobs = 400>> <<else>> - <<set $activeSlaveOneTimeMinAge = $fertilityAge>> - <<set $activeSlaveOneTimeMaxAge = $fertilityAge>> + <<set _missLoli.boobs += 100>> <</if>> - <<else>> - <<if $fertilityAge < 8>> - <<set $activeSlaveOneTimeMinAge = 8>> - <<set $activeSlaveOneTimeMaxAge = 8>> + <<set _missLoli.lactation = 1>> + <<set _missLoli.lactationDuration = 2>> + <<set _missLoli.boobShape = either("perky", "torpedo-shaped")>> + <<set _missLoli.nipples = either("cute", "puffy")>> + <<set _newSlaves.push(_missLoli)>> + <<setLocalPronouns _missLeader>> + <<setLocalPronouns _missLoli 2>> + In any case, you've enslaved a fine group. The women will clean up nicely and are already accustomed to being raped and abused, so they should bear the transition to slave life reasonably well. The leader is a little older than the rest and clearly has been pregnant several times given the sag to $his breasts and the stretch marks coating $his swollen belly; it's clear $he has a rape baby growing inside $him. The next two are younger, but no better off; one is hugely pregnant and the other shows signs of a recent birth. The last, however, is the most eye-catching; + <<if $minimumSlaveAge < 8 && $fertilityAge < 8>> + _he2 is just a little _girl2 and a massively pregnant one at that. The leader was right to worry about _his2 well-being, there is no way _he2 would survive giving birth. + <<elseif $fertilityAge < 18 && $minimumSlaveAge < 18>> + _he2 is in no way prepared to be as pregnant as _he2 is. The leader was right to worry about _his2 well-being, birth is going to be a struggle for _him2. <<else>> - <<set $activeSlaveOneTimeMinAge = $minimumSlaveAge>> - <<set $activeSlaveOneTimeMaxAge = $minimumSlaveAge>> + _his2 stomach has already dropped and _he2 clearly has no experience with pregnancy. The leader was right to worry about _his2 well-being, _his2 body is ill-suited for childbirth. <</if>> - <</if>> - <<set $one_time_age_overrides_pedo_mode = 1>> - <<set $oneTimeDisableDisability = 1>> - <<set $fixedRace = "white">> - <<set _missLoli = GenerateNewSlave("XX")>> - <<set _missLoli.origin = "$He was a fucktoy held in a felled mission. $He was nothing more than a cum dump to $his black masters.">> - <<set _missLoli.career = "an orphan">> - <<set _missLoli.devotion = -20>> - <<set _missLoli.trust = random(-100,-80)>> - <<run setHealth(_missLoli, jsRandom(-90, -70), normalRandInt(25, 3), undefined, undefined, 100)>> - <<set _missLoli.anus = 3>> - <<set _missLoli.vagina = 5>> - <<set _missLoli.pubertyXX = 1>> - <<set _missLoli.weight = random(-100,-60)>> - <<set _missLoli.muscles = random(-100,-80)>> - <<set _missLoli.waist = random(-40,-10)>> - <<set _missLoli.attrXY = random(0,10)>> - <<set _missLoli.energy = random(0,20)>> - <<set _missLoli.skill.vaginal = 75>> - <<set _missLoli.skill.oral = 75>> - <<set _missLoli.skill.anal = 50>> - <<set _missLoli.pubicHStyle = "bushy">> - <<set _missLoli.underarmHStyle = "bushy">> - <<set _missLoli.preg = 40>> - <<set _missLoli.pregType = 1>> - <<set _missLoli.pregKnown = 1>> - <<set _missLoli.pregWeek = _missLoli.preg>> - <<run SetBellySize(_missLoli)>> - <<run WombFatherRace(_missLoli, "black")>> - <<set _missLoli.counter.birthsTotal = 0>> - <<set _missLoli.bellySag = 5>> - <<set _missLoli.bellySagPreg = 5>> - <<if _missLoli.boobs < 300>> - <<set _missLoli.boobs = 400>> <<else>> - <<set _missLoli.boobs += 100>> + In any case, you've enslaved a fine group. The women seem to have banded together when they were left to fend for themselves in their suburban neighborhood. They're older than many slaves, but they seem to have had rich husbands; they're conventionally pretty, and have lived soft lives that have left them healthy. + <<for _i = 0; _i < 4; _i++>> + <<set _slave = GenerateNewSlave("XX", {disableDisability: 1, minAge: 26, maxAge: 42})>> + <<set _slave.origin = "$He was a wealthy housewife who you enslaved as $he fled societal collapse.">> + <<set _slave.career = "a housewife">> + <<set _slave.devotion = -20>> + <<set _slave.trust = random(-10,10)>> + <<run setHealth(_slave, jsRandom(30, 50), 0, 0, 0)>> + <<set _slave.anus = 1>> + <<set _slave.vagina = random(1,2)>> + <<set _slave.weight = random(-20,20)>> + <<set _slave.boobs += 100*random(0,3)>> + <<set _slave.butt += random(0,2)>> + <<set _slave.attrXX = random(10,50)>> + <<set _slave.attrXY = random(60,90)>> + <<set _slave.energy = random(20,80)>> + <<set _slave.skill.vaginal = 15>> + <<set _slave.skill.oral = 15>> + <<set _slave.skill.anal = 0>> + <<set _slave.skill.whoring = 0>> + <<set _slave.skill.entertainment = 15>> + <<set _slave.behavioralFlaw = either("anorexic", "arrogant", "bitchy", "liberated")>> + <<set _slave.sexualFlaw = either("apathetic", "hates anal", "hates oral", "idealistic", "shamefast")>> + <<set _newSlaves.push(_slave)>> + <</for>> <</if>> - <<set _missLoli.lactation = 1>> - <<set _missLoli.lactationDuration = 2>> - <<set _missLoli.boobShape = either("perky", "torpedo-shaped")>> - <<set _missLoli.nipples = either("cute", "puffy")>> - <<set _newSlaves.push(_missLoli)>> - <<setLocalPronouns _missLeader>> - <<setLocalPronouns _missLoli 2>> - In any case, you've enslaved a fine group. The women will clean up nicely and are already accustomed to being raped and abused, so they should bear the transition to slave life reasonably well. The leader is a little older than the rest and clearly has been pregnant several times given the sag to $his breasts and the stretch marks coating $his swollen belly; it's clear $he has a rape baby growing inside $him. The next two are younger, but no better off; one is hugely pregnant and the other shows signs of a recent birth. The last, however, is the most eye-catching; - <<if $minimumSlaveAge < 8 && $fertilityAge < 8>> - _he2 is just a little _girl2 and a massively pregnant one at that. The leader was right to worry about _his2 well-being, there is no way _he2 would survive giving birth. - <<elseif $fertilityAge < 18 && $minimumSlaveAge < 18>> - _he2 is in no way prepared to be as pregnant as _he2 is. The leader was right to worry about _his2 well-being, birth is going to be a struggle for _him2. +<<case "arcology naming">> + As a society free of the encumbrance of governmental oversight, the arcologies of the Free Cities are places where societal evolution and corporate expansion can occur rapidly. + Even so, the incredible speed with which the arcology has improved under your tenure as compared to that of your predecessor, after you obtained ownership through + <<if $PC.rumor === "wealth">> + a leveraged buyout, + <<elseif $PC.rumor === "diligence">> + hard work and competence, + <<elseif $PC.rumor === "force">> + some episodes of violence, + <<elseif $PC.rumor === "social engineering">> + the creative use of psychology, + <<elseif $PC.rumor === "luck">> + an incredible opportunity, + <</if>> + is nothing short of astonishing. Other arcologies have taken many years to develop along anything but strictly conservative lines, and you are not the only arcology owner with a background + <<if $PC.career === "wealth" || $PC.career === "trust fund" || $PC.career === "rich kid">> + of substantial wealth. + <<elseif $PC.career === "capitalist" || $PC.career === "entrepreneur" || $PC.career === "business kid">> + in business. + <<elseif $PC.career === "mercenary">> + in the world of private contracting. + <<elseif $PC.career === "recruit" || $PC.career === "child soldier">> + in the military. + <<elseif $PC.career === "slaver">> + as a slavebreaker. + <<elseif $PC.career === "slave overseer">> + as a slave trainer. + <<elseif $PC.career === "slave tender">> + as a slave tamer. + <<elseif $PC.career === "engineer">> + in arcology engineering. + <<elseif $PC.career === "construction" || $PC.career === "worksite helper">> + in construction. + <<elseif $PC.career === "medicine" || $PC.career === "medical assistant">> + in medicine and surgery. + <<elseif $PC.career === "nurse">> + in medicine. + <<elseif $PC.career === "celebrity" || $PC.career === "rising star" || $PC.career === "child star">> + in the public sphere. + <<elseif $PC.career === "escort" || $PC.career === "prostitute" || $PC.career === "child prostitute">> + involving many personal contacts. + <<elseif $PC.career === "servant" || $PC.career === "handmaiden" || $PC.career === "child servant">> + involving the rich and powerful. + <<elseif $PC.career === "gang" || $PC.career === "hoodlum" || $PC.career === "street urchin">> + involving gangs. + <<elseif $PC.career === "BlackHat" || $PC.career === "hacker" || $PC.career === "script kiddy">> + involving mysterious data breaches. <<else>> - _his2 stomach has already dropped and _he2 clearly has no experience with pregnancy. The leader was right to worry about _his2 well-being, _his2 body is ill-suited for childbirth. + in the Free Cities. <</if>> -<<else>> - In any case, you've enslaved a fine group. The women seem to have banded together when they were left to fend for themselves in their suburban neighborhood. They're older than many slaves, but they seem to have had rich husbands; they're conventionally pretty, and have lived soft lives that have left them healthy. - <<for $i = 0; $i < 4; $i++>> - <<set $activeSlaveOneTimeMinAge = 26>> - <<set $activeSlaveOneTimeMaxAge = 42>> - <<set $oneTimeDisableDisability = 1>> - <<set $activeSlave = GenerateNewSlave("XX")>> - <<set $activeSlave.origin = "$He was a wealthy housewife who you enslaved as $he fled societal collapse.">> - <<set $activeSlave.career = "a housewife">> - <<set $activeSlave.devotion = -20>> - <<set $activeSlave.trust = random(-10,10)>> - <<run setHealth($activeSlave, jsRandom(30, 50), 0, 0, 0)>> - <<set $activeSlave.anus = 1>> - <<set $activeSlave.vagina = random(1,2)>> - <<set $activeSlave.weight = random(-20,20)>> - <<set $activeSlave.boobs += 100*random(0,3)>> - <<set $activeSlave.butt += random(0,2)>> - <<set $activeSlave.attrXX = random(10,50)>> - <<set $activeSlave.attrXY = random(60,90)>> - <<set $activeSlave.energy = random(20,80)>> - <<set $activeSlave.skill.vaginal = 15>> - <<set $activeSlave.skill.oral = 15>> - <<set $activeSlave.skill.anal = 0>> - <<set $activeSlave.skill.whoring = 0>> - <<set $activeSlave.skill.entertainment = 15>> - <<set $activeSlave.behavioralFlaw = either("anorexic", "arrogant", "bitchy", "liberated")>> - <<set $activeSlave.sexualFlaw = either("apathetic", "hates anal", "hates oral", "idealistic", "shamefast")>> - <<set _newSlaves.push($activeSlave)>> - <</for>> -<</if>> - -<<case "arcology naming">> - -As a society free of the encumbrance of governmental oversight, the arcologies of the Free Cities are places where societal evolution and corporate expansion can occur rapidly. - -Even so, the incredible speed with which the arcology has improved under your tenure as compared to that of your predecessor, after you obtained ownership through -<<if $PC.rumor == "wealth">> - a leveraged buyout, -<<elseif $PC.rumor == "diligence">> - hard work and competence, -<<elseif $PC.rumor == "force">> - some episodes of violence, -<<elseif $PC.rumor == "social engineering">> - the creative use of psychology, -<<elseif $PC.rumor == "luck">> - an incredible opportunity, -<</if>> -is nothing short of astonishing. Other arcologies have taken many years to develop along anything but strictly conservative lines, and you are not the only arcology owner with a background -<<if $PC.career == "wealth">> - of substantial wealth. -<<elseif $PC.career == "capitalist">> - in business. -<<elseif $PC.career == "mercenary">> - in the world of private contracting. -<<elseif $PC.career == "slaver">> - as a slavebreaker. -<<elseif $PC.career == "engineer">> - in arcology engineering. -<<elseif $PC.career == "medicine">> - in medicine and surgery. -<<elseif $PC.career == "celebrity">> - in the public sphere. -<<elseif $PC.career == "escort">> - involving many personal contacts. -<<elseif $PC.career == "servant">> - involving the rich and powerful. -<<elseif $PC.career == "gang">> - involving gangs. -<<elseif $PC.career == "BlackHat">> - involving mysterious data breaches. -<<else>> - in the Free Cities. -<</if>> -It occurs to you that the arcology's growing role as a place where those with the means to do so can live in the society you have created, enjoying themselves and their lives to the fullest while subjugating others, should be commemorated. -<br><br> -As any slaveowner with half a mind in the Free Cities knows, there is power in words, and in what they represent. Master. Slave. These two words alone, more than any others, define the arcologies that have taken up the mantle of leading the world forward in these dark times. The time has come to add a new term to the lexicon of the Free Cities — a name. No longer will your arcology be known only as $arcologies[0].name, a bland and uninspiring name if ever there was one. -<br><br> -From this day forward, the arcology shall be known as: <<textbox "$arcologies[0].name" $arcologies[0].name>> - + It occurs to you that the arcology's growing role as a place where those with the means to do so can live in the society you have created, enjoying themselves and their lives to the fullest while subjugating others, should be commemorated. + <br><br> + As any slaveowner with half a mind in the Free Cities knows, there is power in words, and in what they represent. Master. Slave. These two words alone, more than any others, define the arcologies that have taken up the mantle of leading the world forward in these dark times. The time has come to add a new term to the lexicon of the Free Cities — a name. No longer will your arcology be known only as $arcologies[0].name, a bland and uninspiring name if ever there was one. + <br><br> + From this day forward, the arcology shall be known as: <<textbox "$arcologies[0].name" $arcologies[0].name>> <<case "slave food">> - -A screen opposite your desk springs to life, <<if $assistant.personality == 0>>showing your personal assistant's symbol, indicating that it has a complex subject to report. When you instruct it to continue, it displays<<else>>and $assistant.name's avatar appears on it seated, indicating that _heA has something complex to bring up. When you tell _himA to continue, _heA reviews<</if>> medical research that's just been published, on the long term effects of the liquid diet your slaves eat. The current generation of slaves is the first, and new discoveries about the effects of years of modern slavery are made all the time. Apparently, consuming state of the art slave food causes slow atrophy of slaves' digestive tracts. The slaves' ability to digest the slave food does not seem to be affected; the atrophy is the body's natural reaction to never facing digestive challenge, and once it reaches the point where the remaining digestive capacity is necessary for liquid slave food, it stops. The only negative effect known is difficulty readjusting to normal food, becoming more extreme the longer the slave food diet was followed. -<br><br>"In conclusion," -<<if $assistant.personality == 0>> - your assistant recites, "no impact on slaves who fully adapt to slave food is likely, as long as they remain slaves. If they were to be freed, they would have to either continue obtaining liquid slave food, or go through a difficult or even impossible dietary transition." _HeA pauses. "This information is likely to remain at the level of a rumor among the slave population, unless it is openly admitted." -<<else>> - _heA says, "your slaves who stay on slave food long enough to need it will be totally fine, as long as they stay slaves. If they're ever freed, though, they have to keep eating slave food, or somehow switch. And that's never been tried." - <<switch $assistant.appearance>> - <<case "monstergirl">> - The monster<<= _girlA>> bares _hisA fangs and becomes very erect. "They're stuck," _heA says. "They're fuckslaves forever." _HeA pauses. - <<case "shemale">> - The shemale starts to stroke _himselfA. "Their assholes are going to be nice and clean and fuckable forever," _heA says, starting to cum. - <<case "amazon">> - The amazon looks pleased. "They're changing to fit their place," _heA says. - <<case "businesswoman">> - The business<<= _womanA>> fans _himselfA, looking rather hot under the collar. "Another way they're bound to you," _heA says breathily. - <<case "fairy">> - The small fairy giggles and spins around on one foot. "Looks like they'll be under our care for life!" _HeA comes to a stop. - <<case "pregnant fairy">> - The small fairy giggles and rapidly beats _hisA wings. "Looks like they'll be under our care for life!" _HisA wings settle down. - <<case "goddess">> - The goddess beams. "It's wonderful," _heA says radiantly. "Their place is here, with us." _HeA pauses. - <<case "hypergoddess">> - The child filled goddess beams. "It's wonderful," _heA says radiantly. "They are like our children, and this arcology our womb; even after they are born they are forever bound to us." _HeA pauses. - <<case "loli">> - The little _girlA smiles happily while jumping up and down. "So we can be friends forever? That's great!" _HeA pauses. - <<case "preggololi">> - The little _girlA smiles happily. "So we can be friends forever? That's great!" _HeA pauses. - <<case "angel">> - The angel frowns. "How unfair. But you'll tend to your flock, right?" - <<case "cherub">> - The cherub pauses. "That means they can't stray from your flock, they have to stay near you, right?" - <<case "incubus">> - The incubus smirks. "I don't care either way. A hole is a hole." - <<case "succubus">> - The succubus frowns. "That means they are reshaping themselves to fit you better. THAT, is MY job." - <<case "imp">> - The imp laughs. "They are nothing but toys now, never allowed to be free again!" - <<case "witch">> - The witch ponders. "It's probably more convenient than casting a spell, less side effects too. Sorry again about that last spell." - <<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">> - It begins to twitch excitedly. "That means its digestive track is empty. Think how many young can be shoved in there now!" Its avatar is visible erect, maybe? It's sometimes hard to tell. - <<case "schoolgirl">> - The school<<= _girlA>> snickers cruelly. "Suck dick or starve," _heA sniggers. - <<default>> - _HisA symbol rotates slowly. - <</switch>> - "The truth will get out, but it'll be nothing more than a rumor among the slaves unless you let it be known yourself." -<</if>> - + A screen opposite your desk springs to life, <<if $assistant.personality === 0>>showing your personal assistant's symbol, indicating that it has a complex subject to report. When you instruct it to continue, it displays<<else>>and $assistant.name's avatar appears on it seated, indicating that _heA has something complex to bring up. When you tell _himA to continue, _heA reviews<</if>> medical research that's just been published, on the long term effects of the liquid diet your slaves eat. The current generation of slaves is the first, and new discoveries about the effects of years of modern slavery are made all the time. Apparently, consuming state of the art slave food causes slow atrophy of slaves' digestive tracts. The slaves' ability to digest the slave food does not seem to be affected; the atrophy is the body's natural reaction to never facing digestive challenge, and once it reaches the point where the remaining digestive capacity is necessary for liquid slave food, it stops. The only negative effect known is difficulty readjusting to normal food, becoming more extreme the longer the slave food diet was followed. + <br><br>"In conclusion," + <<if $assistant.personality === 0>> + your assistant recites, "no impact on slaves who fully adapt to slave food is likely, as long as they remain slaves. If they were to be freed, they would have to either continue obtaining liquid slave food, or go through a difficult or even impossible dietary transition." _HeA pauses. "This information is likely to remain at the level of a rumor among the slave population, unless it is openly admitted." + <<else>> + _heA says, "your slaves who stay on slave food long enough to need it will be totally fine, as long as they stay slaves. If they're ever freed, though, they have to keep eating slave food, or somehow switch. And that's never been tried." + <<switch $assistant.appearance>> + <<case "monstergirl">> + The monster<<= _girlA>> bares _hisA fangs and becomes very erect. "They're stuck," _heA says. "They're fuckslaves forever." _HeA pauses. + <<case "shemale">> + The shemale starts to stroke _himselfA. "Their assholes are going to be nice and clean and fuckable forever," _heA says, starting to cum. + <<case "amazon">> + The amazon looks pleased. "They're changing to fit their place," _heA says. + <<case "businesswoman">> + The business<<= _womanA>> fans _himselfA, looking rather hot under the collar. "Another way they're bound to you," _heA says breathily. + <<case "fairy">> + The small fairy giggles and spins around on one foot. "Looks like they'll be under our care for life!" _HeA comes to a stop. + <<case "pregnant fairy">> + The small fairy giggles and rapidly beats _hisA wings. "Looks like they'll be under our care for life!" _HisA wings settle down. + <<case "goddess">> + The goddess beams. "It's wonderful," _heA says radiantly. "Their place is here, with us." _HeA pauses. + <<case "hypergoddess">> + The child filled goddess beams. "It's wonderful," _heA says radiantly. "They are like our children, and this arcology our womb; even after they are born they are forever bound to us." _HeA pauses. + <<case "loli">> + The little _girlA smiles happily while jumping up and down. "So we can be friends forever? That's great!" _HeA pauses. + <<case "preggololi">> + The little _girlA smiles happily. "So we can be friends forever? That's great!" _HeA pauses. + <<case "angel">> + The angel frowns. "How unfair. But you'll tend to your flock, right?" + <<case "cherub">> + The cherub pauses. "That means they can't stray from your flock, they have to stay near you, right?" + <<case "incubus">> + The incubus smirks. "I don't care either way. A hole is a hole." + <<case "succubus">> + The succubus frowns. "That means they are reshaping themselves to fit you better. THAT, is MY job." + <<case "imp">> + The imp laughs. "They are nothing but toys now, never allowed to be free again!" + <<case "witch">> + The witch ponders. "It's probably more convenient than casting a spell, less side effects too. Sorry again about that last spell." + <<case "ERROR_1606_APPEARANCE_FILE_CORRUPT">> + It begins to twitch excitedly. "That means its digestive track is empty. Think how many young can be shoved in there now!" Its avatar is visible erect, maybe? It's sometimes hard to tell. + <<case "schoolgirl">> + The school<<= _girlA>> snickers cruelly. "Suck dick or starve," _heA sniggers. + <<default>> + _HisA symbol rotates slowly. + <</switch>> + "The truth will get out, but it'll be nothing more than a rumor among the slaves unless you let it be known yourself." + <</if>> <<default>> ERROR: bad event <</switch>> <br><br> - <span id="result"> <<switch $Event>> <<case "bad curatives">> - -<<link "Free breast growth is acceptable">> - <<replace "#result">> - Since you're not displeased with the breast expansion, you accept the health compensation and even make discreet inquiries to see of the effect can perhaps be replicated. Unfortunately, it seems that the result that occurred was as much due to luck as anything else. The process cannot be safely marketed. - <<run $slaves.forEach(function(s) { - if (s.curatives > 1) { - if (s.geneMods.NCS > 0) { - s.boobs += Math.floor(Math.random() * 10 + 1) * 50; + <<link "Free breast growth is acceptable">> + <<replace "#result">> + Since you're not displeased with the breast expansion, you accept the health compensation and even make discreet inquiries to see of the effect can perhaps be replicated. Unfortunately, it seems that the result that occurred was as much due to luck as anything else. The process cannot be safely marketed. + <<run $slaves.forEach(function(s) { + if (s.curatives > 1) { + if (s.geneMods.NCS > 0) { + s.boobs += Math.floor(Math.random() * 10 + 1) * 50; + } + else { + s.boobs += Math.floor(Math.random() * 10 + 1) * 100; + } } - else { - s.boobs += Math.floor(Math.random() * 10 + 1) * 100; + if (s.inflationType === "curative") { + if (s.geneMods.NCS > 0) { + s.boobs += Math.floor(Math.random() * 10 + 1) * 150 * s.inflation; + } + else { + s.boobs += Math.floor(Math.random() * 10 + 1) * 300 * s.inflation; + } } - } - if (s.inflationType == "curative") { - if (s.geneMods.NCS > 0) { - s.boobs += Math.floor(Math.random() * 10 + 1) * 150 * s.inflation; + if (s.geneticQuirks.macromastia === 3) { + s.geneticQuirks.macromastia = 2; } - else { - s.boobs += Math.floor(Math.random() * 10 + 1) * 300 * s.inflation; + if (s.geneticQuirks.gigantomastia === 3) { + s.geneticQuirks.gigantomastia = 2; } - } - if (s.geneticQuirks.macromastia == 3) { - s.geneticQuirks.macromastia = 2; - } - if (s.geneticQuirks.gigantomastia == 3) { - s.geneticQuirks.gigantomastia = 2; - } - })>> - <</replace>> -<</link>> -<br><<link "Demand further compensation">> - <<replace "#result">> - You muster all the contractual remedies available to you and join the crowd of slaveowners laying into the hapless manufacturer. Of course, with so many attackers, there is as much infighting between them as conflict with the helpless enemy, since everyone knows the business will go bankrupt before everyone gets paid. Nevertheless you @@.yellowgreen;approximately double@@ the money you make out of the situation. - <<run cashX(500*$slaves.length, "event")>> - <</replace>> -<</link>> -<br><<link "Force surgical repairs">> - <<replace "#result">> - The hapless manufacturer eventually goes bankrupt. However, you do manage to force surgical repair of the breast expansion before they do. At the manager's expense, your slaves move through a top-flight surgeon's care and are reduced to their former sizes. - <</replace>> -<</link>> - + })>> + <</replace>> + <</link>> + <br><<link "Demand further compensation">> + <<replace "#result">> + You muster all the contractual remedies available to you and join the crowd of slaveowners laying into the hapless manufacturer. Of course, with so many attackers, there is as much infighting between them as conflict with the helpless enemy, since everyone knows the business will go bankrupt before everyone gets paid. Nevertheless you @@.yellowgreen;approximately double@@ the money you make out of the situation. + <<run cashX(500*$slaves.length, "event")>> + <</replace>> + <</link>> + <br><<link "Force surgical repairs">> + <<replace "#result">> + The hapless manufacturer eventually goes bankrupt. However, you do manage to force surgical repair of the breast expansion before they do. At the manager's expense, your slaves move through a top-flight surgeon's care and are reduced to their former sizes. + <</replace>> + <</link>> <<case "bad breasts">> + <<link "The emotional distress isn't worth the trouble">> + <<replace "#result">> + Since subjecting all the affected slaves to abortions would cause you severe losses, you've decided to let them keep the pregnancies. You hope you are prepared for all the children you'll be producing. Those who couldn't become pregnant @@.lime;gained some breast, hip and ass size,@@ as well as @@.lime;began lactating.@@ -<<link "The emotional distress isn't worth the trouble">> - <<replace "#result">> - Since subjecting all the affected slaves to abortions would cause you severe losses, you've decided to let them keep the pregnancies. You hope you are prepared for all the children you'll be producing. Those who couldn't become pregnant @@.lime;gained some breast, hip and ass size,@@ as well as @@.lime;began lactating.@@ - <<for $i = 0; $i < $slaves.length; $i++>> - <<if ($slaves[$i].drugs == "breast injections") && canGetPregnant($slaves[$i])>> - <<set $slaves[$i].preg = 1>> - <<set $slaves[$i].pregType = random(10,25)>> - <<set $slaves[$i].pregKnown = 1>> - <<set $slaves[$i].pregWeek = 1>> - <<run SetBellySize($slaves[$i])>> - <<elseif $slaves[$i].drugs == "breast injections">> - <<set $slaves[$i].lactation = 1>> - <<set $slaves[$i].lactationDuration = 2>> - <<if ($slaves[$i].geneMods.NCS == 0) && ($slaves[$i].hips < 1)>> - <<set $slaves[$i].hips += 1>> - <<set $slaves[$i].butt += 1>> - <</if>> - <<if $precociousPuberty == 1>> - <<if $slaves[$i].pubertyXX == 0 && ($slaves[$i].ovaries == 1 || $slaves[$i].mpreg == 1)>> - <<set $slaves[$i].pubertyAgeXX -= 1>> - <<if $slaves[$i].geneMods.NCS == 1>> - <<set $slaves[$i].pubertyAgeXX -= .5>> + <<for _slave range $slaves>> + <<if _slave.drugs.includes("breast injections")>> + <<set _isIntense = _slave.drugs.includes("intensive")>> + <<set _isHyper = _slave.drugs.includes("hyper")>> + <<if canGetPregnant(_slave)>> + <<set _slave.preg = 1>> + <<if _isIntense>> + <<set _slave.pregType = random(15, 35)>> + <<elseif _isHyper>> + <<set _slave.pregType = random(20, 45)>> + <<else>> + <<set _slave.pregType = random(10, 25)>> <</if>> - <</if>> - <<if $slaves[$i].pubertyXY == 0 && $slaves[$i].balls > 0>> - <<set $slaves[$i].pubertyAgeXY += 1>> - /* NCS reduces the male puberty slowing affects */ - <<if $slaves[$i].geneMods.NCS == 1>> - <<set $slaves[$i].pubertyAgeXY -= .5>> + <<set _slave.pregKnown = 1>> + <<set _slave.pregWeek = 1>> + <<run SetBellySize(_slave)>> + <<else>> + <<set _slave.lactation = 1>> + <<set _slave.lactationDuration = 2>> + <<if _slave.geneMods.NCS === 0 && _slave.hips < 1>> + <<set _slave.hips++>> + <<if _isHyper>> + <<set _slave.butt += 2>> + <<else>> + <<set _slave.butt++>> + <</if>> <</if>> - <</if>> - <</if>> - <<if $slaves[$i].geneMods.NCS == 0>> - <<set $slaves[$i].boobs += 300>> - <<else>> - <<set $slaves[$i].boobs += 150>> - <</if>> - <<elseif $slaves[$i].drugs == "intensive breast injections" && canGetPregnant($slaves[$i])>> - <<set $slaves[$i].preg = 1>> - <<set $slaves[$i].pregType = random(15,35)>> - <<set $slaves[$i].pregKnown = 1>> - <<set $slaves[$i].pregWeek = 1>> - <<run SetBellySize($slaves[$i])>> - <<elseif $slaves[$i].drugs == "intensive breast injections">> - <<set $slaves[$i].lactation = 1>> - <<set $slaves[$i].lactationDuration = 2>> - <<if ($slaves[$i].geneMods.NCS == 0) && ($slaves[$i].hips < 1)>> - <<set $slaves[$i].hips += 1>> - <<set $slaves[$i].butt += 1>> - <</if>> - <<if $precociousPuberty == 1>> - <<if $slaves[$i].pubertyXX == 0 && ($slaves[$i].ovaries == 1 || $slaves[$i].mpreg == 1)>> - <<set $slaves[$i].pubertyAgeXX -= 1.5>> - <<if $slaves[$i].geneMods.NCS == 1>> - <<set $slaves[$i].pubertyAgeXX -= .75>> + <<if $precociousPuberty === 1>> + <<if _slave.pubertyXX === 0 && (_slave.ovaries === 1 || _slave.mpreg === 1)>> + <<if _isIntense>> + <<set _slave.pubertyAgeXX -= 1.5>> + <<elseif _isHyper>> + <<set _slave.pubertyAgeXX -= 2>> + <<else>> + <<set _slave.pubertyAgeXX-->> + <</if>> + <<if _slave.geneMods.NCS === 1>> + <<if _isIntense>> + <<set _slave.pubertyAgeXX -= 0.75>> + <<elseif _isHyper>> + <<set _slave.pubertyAgeXX -= 1>> + <<else>> + <<set _slave.pubertyAgeXX -= 0.5>> + <</if>> + <</if>> + <</if>> + <<if _slave.pubertyXY === 0 && _slave.balls > 0>> + <<if _isIntense>> + <<set _slave.pubertyAgeXY += 1.5>> + <<elseif _isHyper>> + <<set _slave.pubertyAgeXY += 2>> + <<else>> + <<set _slave.pubertyAgeXY += 1>> + <</if>> + /* NCS reduces the male puberty slowing affects */ + <<if _slave.geneMods.NCS === 1>> + <<if _isIntense>> + <<set _slave.pubertyAgeXY -= 0.75>> + <<elseif _isHyper>> + <<set _slave.pubertyAgeXY -= 1>> + <<else>> + <<set _slave.pubertyAgeXY -= 0.5>> + <</if>> + <</if>> + <</if>> <</if>> - <</if>> - <<if $slaves[$i].pubertyXY == 0 && $slaves[$i].balls > 0>> - <<set $slaves[$i].pubertyAgeXY += 1.5>> - /* NCS reduces the male puberty slowing affects */ - <<if $slaves[$i].geneMods.NCS == 1>> - <<set $slaves[$i].pubertyAgeXY -= .75>> + <<if _slave.geneMods.NCS === 0>> + <<set _slave.boobs += 300>> + <<else>> + <<set _slave.boobs += 150>> <</if>> <</if>> <</if>> - <<if $slaves[$i].geneMods.NCS == 0>> - <<set $slaves[$i].boobs += 300>> - <<else>> - <<set $slaves[$i].boobs += 150>> - <</if>> - <<elseif ($slaves[$i].drugs == "hyper breast injections") && canGetPregnant($slaves[$i])>> - <<set $slaves[$i].preg = 1>> - <<set $slaves[$i].pregType = random(20,45)>> - <<set $slaves[$i].pregKnown = 1>> - <<set $slaves[$i].pregWeek = 1>> - <<run SetBellySize($slaves[$i])>> - <<elseif $slaves[$i].drugs == "hyper breast injections">> - <<set $slaves[$i].lactation = 1>> - <<set $slaves[$i].lactationDuration = 2>> - <<if ($slaves[$i].geneMods.NCS == 0) && ($slaves[$i].hips < 1)>> - <<set $slaves[$i].hips += 1>> - <<set $slaves[$i].butt += 2>> - <</if>> - <<if $precociousPuberty == 1>> - <<if $slaves[$i].pubertyXX == 0 && ($slaves[$i].ovaries == 1 || $slaves[$i].mpreg == 1)>> - <<set $slaves[$i].pubertyAgeXX -= 2>> - <<if $slaves[$i].geneMods.NCS == 1>> - <<set $slaves[$i].pubertyAgeXX -= 1>> - <</if>> - <</if>> - <<if $slaves[$i].pubertyXY == 0 && $slaves[$i].balls > 0>> - <<set $slaves[$i].pubertyAgeXY += 2>> - /* NCS reduces the male puberty slowing affects */ - <<if $slaves[$i].geneMods.NCS == 1>> - <<set $slaves[$i].pubertyAgeXY -= 1>> - <</if>> - <</if>> - <</if>> - <<if $slaves[$i].geneMods.NCS == 0>> - <<set $slaves[$i].boobs += 300>> - <<else>> - <<set $slaves[$i].boobs += 150>> - <</if>> - <</if>> - <</for>> - <</replace>> -<</link>> -<br><<link "Demand further compensation">> - <<replace "#result">> - You muster all the contractual remedies available to you and join the crowd of slaveowners laying into the hapless manufacturer. Of course, with so many attackers, there is as much infighting between them as conflict with the helpless enemy, since everyone knows the business will go bankrupt before everyone gets paid. Nevertheless you @@.yellowgreen;approximately double@@ the money you make out of the situation, plenty to deal with the pregnancies. - <<run cashX(2000*$slaves.length, "event")>> - <</replace>> -<</link>> -<br><<link "Force surgical repairs and compensation">> - <<replace "#result">> - The hapless manufacturer eventually goes bankrupt. However, you do manage to force surgical correction of the pregnancies before they do. As additional compensation, they agree to naturally enhance your afflicted slaves' busts knowing full well that most buyers are not interested in slaves that have been knocked up. At the managers expense, your slaves move through a top-flight surgeons care and are pregnancy free and sporting @@.lime;larger breasts.@@ - <<run $slaves.forEach(function(s) { - if (canGetPregnant(s)) { - if (s.drugs == "breast injections") { - if (s.geneMods.NCS > 0) { - s.boobs += Math.floor(Math.random() * 10 + 1) * 50; - } - else { - s.boobs += Math.floor(Math.random() * 10 + 1) * 100; - } - } else if (s.drugs == "intensive breast injections") { - if (s.geneMods.NCS > 0) { - s.boobs += Math.floor(Math.random() * 10 + 1) * 100; - } - else { - s.boobs += Math.floor(Math.random() * 10 + 1) * 150; - } - } else if (s.drugs == "hyper breast injections") { - if (s.geneMods.NCS > 0) { - s.boobs += Math.floor(Math.random() * 10 + 1) * 200; - } - else { - s.boobs += Math.floor(Math.random() * 10 + 1) * 300; + <</for>> + <</replace>> + <</link>> + <br><<link "Demand further compensation">> + <<replace "#result">> + You muster all the contractual remedies available to you and join the crowd of slaveowners laying into the hapless manufacturer. Of course, with so many attackers, there is as much infighting between them as conflict with the helpless enemy, since everyone knows the business will go bankrupt before everyone gets paid. Nevertheless you @@.yellowgreen;approximately double@@ the money you make out of the situation, plenty to deal with the pregnancies. + <<run cashX(2000*$slaves.length, "event")>> + <</replace>> + <</link>> + <br><<link "Force surgical repairs and compensation">> + <<replace "#result">> + The hapless manufacturer eventually goes bankrupt. However, you do manage to force surgical correction of the pregnancies before they do. As additional compensation, they agree to naturally enhance your afflicted slaves' busts knowing full well that most buyers are not interested in slaves that have been knocked up. At the managers expense, your slaves move through a top-flight surgeons care and are pregnancy free and sporting @@.lime;larger breasts.@@ + <<run $slaves.forEach(function(s) { + if (canGetPregnant(s)) { + if (s.drugs === "breast injections") { + if (s.geneMods.NCS > 0) { + s.boobs += Math.floor(Math.random() * 10 + 1) * 50; + } + else { + s.boobs += Math.floor(Math.random() * 10 + 1) * 100; + } + } else if (s.drugs === "intensive breast injections") { + if (s.geneMods.NCS > 0) { + s.boobs += Math.floor(Math.random() * 10 + 1) * 100; + } + else { + s.boobs += Math.floor(Math.random() * 10 + 1) * 150; + } + } else if (s.drugs === "hyper breast injections") { + if (s.geneMods.NCS > 0) { + s.boobs += Math.floor(Math.random() * 10 + 1) * 200; + } + else { + s.boobs += Math.floor(Math.random() * 10 + 1) * 300; + } } } - } - })>> - <</replace>> -<</link>> - + })>> + <</replace>> + <</link>> <<case "strip club closing">> - -<<set $eventResults.strip = 1>> -<<link "Offer to take them in">> - <<replace "#result">> - The now-unemployed strippers are not impressed by your offer to take them in. "What," one of them says, "be one of your shivering little cunts? You'd have us signing ourselves into slavery inside two weeks. Fuck off, we'll take the streets." Under the nonlethal riot cannons of the security drones, they file off, muttering mutinously. Unfortunately, you don't have any pretense to enslave or imprison them. - <<set $nextButton = "Continue">> - <</replace>> -<</link>> -<br><<link "Offer them severance pay">> - <<replace "#result">> - You have a word with them, stepping closer and speaking quietly to defuse the situation. You tell them you're aware that they're in a difficult place, but you also explain that the Free Cities are a new and changing place. No one can rely on the old way of doing things any more. You offer to pay each of them a small stipend to help tide them over until they find other employment. They're surprised at your munificence but @@.green;accept it with gratitude.@@ - <<set $nextButton = "Continue">> - <<run repX(2000, "event")>> - <<run cashX(-1000, "event")>> - <<set $eventResults.strip = 2>> - <</replace>> -<</link>> //This will cost <<print cashFormat(1000)>>// -<br><<link "Offer to set them up independently">> - <<replace "#result">> - You offer a way out of their situation. They, you suggest, can keep working in the now-vacant shop if they work together to pay the rent. They can move into a couple of vacant rooms nearby that you can easily have set up as a bunkhouse. You'll collect a little more rent, and they'll have a second chance. They @@.green;accept it with gratitude.@@ It's quite likely they'll either fail or have to accept being whores rather than strippers, but that's not your concern. @@.green;Your arcology's prosperity has increased.@@ - <<set $nextButton = "Continue">> - <<set $arcologies[0].prosperity += 1>> - <<run repX(500, "event")>> - <<run cashX(-500, "event")>> - <<set $eventResults.strip = 3>> - <</replace>> -<</link>> //This will cost <<print cashFormat(500)>>// - -<<case "strip club aftermath">> - -<<if $eventResults.strip != 3>> - <<if $cash >= _ContractCost>> - <<link "Enslave $him">> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", $activeSlave)>> + <<set $eventResults.strip = 1>> + <<link "Offer to take them in">> <<replace "#result">> - <<if $eventResults.strip == 1>> - $He sobs with gratitude as the biometric scanners scrupulously record $his every particular as belonging not to a person but to a piece of human property. The medical scan discloses that $his aphrodisiac addiction is very new: $he will probably be able to kick the habit in short order if you decide to withhold further doses. - <<else>> - $He smiles with gratitude as the biometric scanners scrupulously record $his every particular as belonging not to a person but to a piece of human property. $He's seen what Free Cities life is, and $he seems to have come to the conclusion that being a slave in the penthouse is better than being a free whore on the lower levels. - <</if>> - <<includeDOM App.UI.newSlaveIntro($activeSlave)>> + The now-unemployed strippers are not impressed by your offer to take them in. "What," one of them says, "be one of your shivering little cunts? You'd have us signing ourselves into slavery inside two weeks. Fuck off, we'll take the streets." Under the nonlethal riot cannons of the security drones, they file off, muttering mutinously. Unfortunately, you don't have any pretense to enslave or imprison them. + <<set $nextButton = "Continue">> <</replace>> <</link>> + <br><<link "Offer them severance pay">> + <<replace "#result">> + You have a word with them, stepping closer and speaking quietly to defuse the situation. You tell them you're aware that they're in a difficult place, but you also explain that the Free Cities are a new and changing place. No one can rely on the old way of doing things any more. You offer to pay each of them a small stipend to help tide them over until they find other employment. They're surprised at your munificence but @@.green;accept it with gratitude.@@ + <<set $nextButton = "Continue">> + <<run repX(2000, "event")>> + <<run cashX(-1000, "event")>> + <<set $eventResults.strip = 2>> + <</replace>> + <</link>> //This will cost <<print cashFormat(1000)>>// + <br><<link "Offer to set them up independently">> + <<replace "#result">> + You offer a way out of their situation. They, you suggest, can keep working in the now-vacant shop if they work together to pay the rent. They can move into a couple of vacant rooms nearby that you can easily have set up as a bunkhouse. You'll collect a little more rent, and they'll have a second chance. They @@.green;accept it with gratitude.@@ It's quite likely they'll either fail or have to accept being whores rather than strippers, but that's not your concern. @@.green;Your arcology's prosperity has increased.@@ + <<set $nextButton = "Continue">> + <<set $arcologies[0].prosperity++>> + <<run repX(500, "event")>> + <<run cashX(-500, "event")>> + <<set $eventResults.strip = 3>> + <</replace>> + <</link>> //This will cost <<print cashFormat(500)>>// +<<case "strip club aftermath">> + <<if $eventResults.strip !== 3>> + <<if $cash >= _ContractCost>> + <<link "Enslave $him">> + <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _slave)>> + <<replace "#result">> + <<if $eventResults.strip === 1>> + $He sobs with gratitude as the biometric scanners scrupulously record $his every particular as belonging not to a person but to a piece of human property. The medical scan discloses that $his aphrodisiac addiction is very new: $he will probably be able to kick the habit in short order if you decide to withhold further doses. + <<else>> + $He smiles with gratitude as the biometric scanners scrupulously record $his every particular as belonging not to a person but to a piece of human property. $He's seen what Free Cities life is, and $he seems to have come to the conclusion that being a slave in the penthouse is better than being a free whore on the lower levels. + <</if>> + <<includeDOM App.UI.newSlaveIntro(_slave)>> + <</replace>> + <</link>> + <<else>> + //You lack the necessary funds to enslave $him.// + <</if>> <<else>> - //You lack the necessary funds to enslave $him.// + <<link "Take an Arcology Tour">> + <<replace "#result">> + The cubicle _heU takes you back into is small, but clean and well-kept. _HeU gives you a kiss on the cheek. "That's not part of the Arcology Tour. Sorry. Here's the start of the real tour." <<if $PC.dick !== 0>>_HeU sucks you to full mast while shucking off _hisU skimpy clothing<<if $PC.vagina !== -1>>, giggling appreciatively at your pussy and lavishing attention on it with _hisU hands<</if>>. Then _heU turns around and slides you into _hisU <<if _heU === "he">>ass<<else>>pussy<</if>> with the ease of long practice. After a good long standing fuck, _heU begs you to "finish the tour" in _hisU ass and then "pay the tour guide" by coming in _hisU mouth.<<else>>_HeU giggles. "Tour's a little different for a lady like you, Ma'am. Here," _heU says, and starts to make out with you, pressing you back down onto a bench. _HeU lavishes expert oral attention on your pussy in a series of clever positions that offer every part of _hisU body to you in turn for you to grope, squeeze, and penetrate with your fingers.<</if>> Afterward, as _heU's hurrying back into _hisU clothes, _heU says, "We've got the money you paid to set those rooms up, @@.yellowgreen;here it is.@@ And we're doing pretty good, so we could use a little more working space. We'd like the vacant space next door. We'll furnish it, if you'll let us have it?" @@.green;$arcologies[0].name's prosperity has increased.@@ + <<set $arcologies[0].prosperity += 2>> + <<run cashX(500, "event")>> + <</replace>> + <</link>> + <br><<link "Politely decline">> + <<replace "#result">> + "Aw," _heU says, "you're no fun. Well anyway, we've got the money you paid to set those rooms up, @@.yellowgreen;here it is.@@ And we're doing pretty good, so we could use a little more working space. We'd like the vacant space next door. We'll furnish it, if you'll let us have it?" @@.green;$arcologies[0].name's prosperity has increased.@@ + <<set $arcologies[0].prosperity += 2>> + <<run cashX(500, "event")>> + <</replace>> + <</link>> <</if>> -<<else>> - <<link "Take an Arcology Tour">> +<<case "militia">> + <<set $personalArms = 0>> + <<if $arcologyUpgrade.drones === 1>> + <<link "Arm yourself and your drones">> + <<replace "#result">> + In a time of uncertainty, the public adores people who protect them. So, in addition to publicly procuring yourself the latest weapons and armor, you update the arcology's drone systems. The security drones' riot cannons can be replaced for easy maintenance, so it's rather easy to provide them with alternate, lethal weaponry that they can switch to if it becomes necessary. $arcologies[0].name becomes known as one of the best-protected in the Free Cities. @@.green;Your reputation has greatly improved.@@ + <<set $nextButton = "Continue">> + <<run repX(4000, "event")>> + <<run cashX(-5000, "event")>> + <<set $personalArms = 3>> + <</replace>> + <</link>> //This will cost <<print cashFormat(5000)>>// + <br> + <</if>> + <<link "Arm yourself">> <<replace "#result">> - The cubicle _heU takes you back into is small, but clean and well-kept. _HeU gives you a kiss on the cheek. "That's not part of the Arcology Tour. Sorry. Here's the start of the real tour." <<if $PC.dick != 0>>_HeU sucks you to full mast while shucking off _hisU skimpy clothing<<if $PC.vagina != -1>>, giggling appreciatively at your pussy and lavishing attention on it with _hisU hands<</if>>. Then _heU turns around and slides you into _hisU <<if _heU == "he">>ass<<else>>pussy<</if>> with the ease of long practice. After a good long standing fuck, _heU begs you to "finish the tour" in _hisU ass and then "pay the tour guide" by coming in _hisU mouth.<<else>>_HeU giggles. "Tour's a little different for a lady like you, Ma'am. Here," _heU says, and starts to make out with you, pressing you back down onto a bench. _HeU lavishes expert oral attention on your pussy in a series of clever positions that offer every part of _hisU body to you in turn for you to grope, squeeze, and penetrate with your fingers.<</if>> Afterward, as _heU's hurrying back into _hisU clothes, _heU says, "We've got the money you paid to set those rooms up, @@.yellowgreen;here it is.@@ And we're doing pretty good, so we could use a little more working space. We'd like the vacant space next door. We'll furnish it, if you'll let us have it?" @@.green;$arcologies[0].name's prosperity has increased.@@ - <<set $arcologies[0].prosperity += 2>> - <<run cashX(500, "event")>> + In a time of uncertainty, the public looks up to people who project strength. So, you purchase yourself some of the latest armor and weapons, and make sure they are visible in a glass-walled cabinet in your office. Many of your wealthier tenants follow suit. A few of them even emulate your example and practice using these implements once a week. @@.green;Your reputation has improved.@@ + <<set $nextButton = "Continue">> + <<run repX(1500, "event")>> + <<run cashX(-2000, "event")>> //This will cost <<print cashFormat(2000)>>// + <<set $personalArms = 1>> + <</replace>> + <</link>> //This will cost <<print cashFormat(2000)>>// + <br><<link "Ignore this foolishness">> + <<replace "#result">> + No doubt this panicky fad will pass. You ignore the controversy. In a few days, the subject of a militia passes from the public mind. + <<set $nextButton = "Continue">> + <<set $personalArms = 0>> + <</replace>> + <</link>> +<<case "shoot invitation">> + <<set $eventResults.shoot = 0>> + <<link "Buy in">> + <<replace "#result">> + You receive a brief but elegant confirmation. It looks like you've RSVP'd. + <<run cashX(-5000, "event")>> + <<set $eventResults.shoot = 1>> <</replace>> <</link>> <br><<link "Politely decline">> <<replace "#result">> - "Aw," _heU says, "you're no fun. Well anyway, we've got the money you paid to set those rooms up, @@.yellowgreen;here it is.@@ And we're doing pretty good, so we could use a little more working space. We'd like the vacant space next door. We'll furnish it, if you'll let us have it?" @@.green;$arcologies[0].name's prosperity has increased.@@ - <<set $arcologies[0].prosperity += 2>> - <<run cashX(500, "event")>> + You decline the invitation. <</replace>> <</link>> -<</if>> - -<<case "militia">> - -<<set $personalArms = 0>> -<<if $arcologyUpgrade.drones == 1>> -<<link "Arm yourself and your drones">> - <<replace "#result">> - In a time of uncertainty, the public adores people who protect them. So, in addition to publicly procuring yourself the latest weapons and armor, you update the arcology's drone systems. The security drones' riot cannons can be replaced for easy maintenance, so it's rather easy to provide them with alternate, lethal weaponry that they can switch to if it becomes necessary. $arcologies[0].name becomes known as one of the best-protected in the Free Cities. @@.green;Your reputation has greatly improved.@@ - <<set $nextButton = "Continue">> - <<run repX(4000, "event")>> - <<run cashX(-5000, "event")>> - <<set $personalArms = 3>> - <</replace>> -<</link>> //This will cost <<print cashFormat(5000)>>// -<br> -<</if>> -<<link "Arm yourself">> - <<replace "#result">> - In a time of uncertainty, the public looks up to people who project strength. So, you purchase yourself some of the latest armor and weapons, and make sure they are visible in a glass-walled cabinet in your office. Many of your wealthier tenants follow suit. A few of them even emulate your example and practice using these implements once a week. @@.green;Your reputation has improved.@@ - <<set $nextButton = "Continue">> - <<run repX(1500, "event")>> - <<run cashX(-2000, "event")>> //This will cost <<print cashFormat(2000)>>// - <<set $personalArms = 1>> - <</replace>> -<</link>> //This will cost <<print cashFormat(2000)>>// -<br><<link "Ignore this foolishness">> - <<replace "#result">> - No doubt this panicky fad will pass. You ignore the controversy. In a few days, the subject of a militia passes from the public mind. - <<set $nextButton = "Continue">> - <<set $personalArms = 0>> - <</replace>> -<</link>> - -<<case "shoot invitation">> - -<<set $eventResults.shoot = 0>> -<<link "Buy in">> - <<replace "#result">> - You receive a brief but elegant confirmation. It looks like you've RSVP'd. - <<run cashX(-5000, "event")>> - <<set $eventResults.shoot = 1>> - <</replace>> -<</link>> -<br><<link "Politely decline">> - <<replace "#result">> - You decline the invitation. - <</replace>> -<</link>> - <<case "shoot result">> - -<<set $eventResults.shoot = 0>> -<<link "Hit the muscular slave about to successfully cross the lawn">> - <<replace "#result">> - <<set $activeSlaveOneTimeMinAge = 18>> - <<set $activeSlaveOneTimeMaxAge = 28>> - <<set $one_time_age_overrides_pedo_mode = 1>> - <<set $oneTimeDisableDisability = 1>> - <<set $activeSlave = GenerateNewSlave("XX")>> - <<set $activeSlave.origin = "You won $him at a shotgun match against other arcology owners.">> - <<set $activeSlave.lips = random(5,25)>> - <<set $activeSlave.anus = 1>> - <<set $activeSlave.skill.vaginal = 15>> - <<set $activeSlave.skill.oral = 15>> - <<set $activeSlave.skill.anal = 15>> - <<set $activeSlave.skill.whoring = 0>> - <<set $activeSlave.skill.entertainment = 0>> - <<set $activeSlave.counter.vaginal += 1>> - <<set $vaginalTotal += 1>> - <<set $activeSlave.devotion = 25>> - <<set $activeSlave.trust = 5>> - <<set $activeSlave.oldDevotion = 25>> - <<set $activeSlave.face = 0>> - <<set $activeSlave.vagina = 1>> - <<set $activeSlave.preg = -1>> - <<set $activeSlave.muscles = 50>> - <<set $activeSlave.weight = 0>> - <<run setHealth($activeSlave, 80, undefined, undefined, undefined, 0)>> - <<set $activeSlave.boobs = 400>> - <<set $activeSlave.butt = 2>> - <<set $activeSlave.waist = 0>> - <<set $activeSlave.fetish = "none">> - <<set $activeSlave.behavioralFlaw = "arrogant">> - <<set $activeSlave.sexualFlaw = "idealistic">> - <<run App.Utils.setLocalPronouns($activeSlave)>> - <span id="art-frame"> - /* 000-250-006 */ - <<if $seeImages == 1>> - <<if $imageChoice == 1>> - <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> - <<else>> - <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> - <</if>> - <</if>> - /* 000-250-006 */ - </span> - You decide to stop the athletic slave $girl about to win $his freedom, and place your taser slug in $his muscular buttock. $He goes stiff and skids across the grass with a growl. Your taser slug is linked to $assistant.name, who hits $him again whenever $he tries to continue running. Fury glints from $his eyes, but $he apparently knows how to pick $his battles. By the time you approach $him, $he's already bent over, presenting $himself, and from the oily sheen on $his privates, it looks like $he even managed to get some lube somewhere to make the experience a little easier. It is a strange thing, respecting a slave, but $he rises even higher in your estimation as you fuck $him on the grass. $He does $his best to please you, having clearly decided to do $his best given $his situation. $He's sexually inexpert, but clearly smart enough to know when to submit. - <<run newSlave($activeSlave)>> /* skip New Slave Intro */ - <</replace>> -<</link>> -<<if $minimumSlaveAge <= 8>> - <br><<link "Hit the young slave with the unnaturally wide hips struggling along">> + <<set $eventResults.shoot = 0>> + <<link "Hit the muscular slave about to successfully cross the lawn">> <<replace "#result">> - <<set $activeSlaveOneTimeMinAge = 8>> - <<set $activeSlaveOneTimeMaxAge = 8>> - <<set $one_time_age_overrides_pedo_mode = 1>> - <<set $oneTimeDisableDisability = 1>> - <<set $activeSlave = GenerateNewSlave("XX")>> - <<set $activeSlave.origin = "You won $him at a shotgun match against other arcology owners.">> - <<set $activeSlave.lips = random(5,25)>> - <<set $activeSlave.anus = 0>> - <<set $activeSlave.skill.whoring = 0>> - <<set $activeSlave.skill.entertainment = 0>> - <<set $activeSlave.counter.vaginal += 1>> - <<set $vaginalTotal += 1>> - <<set $activeSlave.devotion = 25>> - <<set $activeSlave.trust = 5>> - <<set $activeSlave.oldDevotion = 25>> - <<set $activeSlave.face = 25>> - <<set $activeSlave.vagina = 1>> - <<set $activeSlave.preg = 0>> - <<if $precociousPuberty == 1>> - <<set $activeSlave.pubertyXX = 1>> - <</if>> - <<set $activeSlave.muscles = 0>> - <<set $activeSlave.weight = -10>> - <<set $activeSlave.height = 135>> - <<run setHealth($activeSlave, 80, undefined, undefined, undefined, 0)>> - <<set $activeSlave.boobs = 200>> - <<set $activeSlave.butt = 1>> - <<set $activeSlave.waist = -50>> - <<set $activeSlave.shoulders = -2>> - <<set $activeSlave.hips = 3>> - <<set $activeSlave.ovaries = 1>> - <<set $activeSlave.hipsImplant = 1>> - <<set $activeSlave.skill.anal = 0>> - <<set $activeSlave.skill.oral = 0>> - <<set $activeSlave.skill.vaginal = 0>> - <<set $activeSlave.fetish = "pregnancy">> - <<set $activeSlave.fetishStrength = 60>> - <<set $activeSlave.behavioralFlaw = "anorexic">> - <<set $activeSlave.sexualFlaw = "idealistic">> - <<run App.Utils.setLocalPronouns($activeSlave)>> + <<set _slave = GenerateNewSlave("XX", {disableDisability: 1, ageOverridesPedoMode: 1, mixAge: 18, maxAge: 28})>> + <<set _slave.origin = "You won $him at a shotgun match against other arcology owners.">> + <<set _slave.lips = random(5,25)>> + <<set _slave.anus = 1>> + <<set _slave.skill.vaginal = 15>> + <<set _slave.skill.oral = 15>> + <<set _slave.skill.anal = 15>> + <<set _slave.skill.whoring = 0>> + <<set _slave.skill.entertainment = 0>> + <<run actX(_slave, "vaginal")>> + <<set _slave.devotion = 25>> + <<set _slave.trust = 5>> + <<set _slave.oldDevotion = 25>> + <<set _slave.face = 0>> + <<set _slave.vagina = 1>> + <<set _slave.preg = -1>> + <<set _slave.muscles = 50>> + <<set _slave.weight = 0>> + <<run setHealth(_slave, 80, undefined, undefined, undefined, 0)>> + <<set _slave.boobs = 400>> + <<set _slave.butt = 2>> + <<set _slave.waist = 0>> + <<set _slave.fetish = "none">> + <<set _slave.behavioralFlaw = "arrogant">> + <<set _slave.sexualFlaw = "idealistic">> + <<run App.Utils.setLocalPronouns(_slave)>> <span id="art-frame"> /* 000-250-006 */ - <<if $seeImages == 1>> - <<if $imageChoice == 1>> - <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> + <<if $seeImages === 1>> + <<if $imageChoice === 1>> + <div class="imageRef medImg"><<= SlaveArt(_slave, 2, 0)>></div> <<else>> - <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> + <div class="imageRef medImg"><<= SlaveArt(_slave, 2, 0)>></div> <</if>> <</if>> /* 000-250-006 */ </span> - You decide to stop the wide-hipped $loli struggling to run, and easily place your taser slug in $his broad rear. $He goes stiff and falls flat on $his face. Your taser slug is linked to $assistant.name, but since the $girl can't manage to flip over, let alone stand, shocking $him more is unneeded. Fury glints from $his eyes, but $he fully realizes it's over for $him. By the time you approach $him, $he's hoisted $his overly wide rear upwards, presenting $himself, moisture beginning to ooze from $his virgin cunt. It looks like $he was being groomed to be a breeding slave, and $he seems to understand $his role quite well, judging by the way $he rocks $his hips back and forth for you. You thoroughly enjoy $his gratifyingly tight pussy, which is so nice that you confine yourself entirely to it despite the appealing sight of $his virgin butthole. - <<run newSlave($activeSlave)>> /* skip New Slave Intro */ + You decide to stop the athletic slave $girl about to win $his freedom, and place your taser slug in $his muscular buttock. $He goes stiff and skids across the grass with a growl. Your taser slug is linked to $assistant.name, who hits $him again whenever $he tries to continue running. Fury glints from $his eyes, but $he apparently knows how to pick $his battles. By the time you approach $him, $he's already bent over, presenting $himself, and from the oily sheen on $his privates, it looks like $he even managed to get some lube somewhere to make the experience a little easier. It is a strange thing, respecting a slave, but $he rises even higher in your estimation as you fuck $him on the grass. $He does $his best to please you, having clearly decided to do $his best given $his situation. $He's sexually inexpert, but clearly smart enough to know when to submit. + <<run newSlave(_slave)>> /* skip New Slave Intro */ <</replace>> <</link>> -<</if>> -<br><<link "Hit the plush older slave lagging behind">> - <<setNonlocalPronouns $seeDicks>> - <<replace "#result">> - <<set $activeSlaveOneTimeMinAge = 36>> - <<set $activeSlaveOneTimeMaxAge = 42>> - <<set $one_time_age_overrides_pedo_mode = 1>> - <<set $oneTimeDisableDisability = 1>> - <<set $activeSlave = GenerateNewSlave("XX")>> - <<set $activeSlave.origin = "You won $him at a shotgun match against other arcology owners.">> - <<set $activeSlave.vagina = 1>> - <<set $activeSlave.skill.vaginal = 15>> - <<set $activeSlave.skill.oral = 15>> - <<set $activeSlave.skill.whoring = 0>> - <<set $activeSlave.skill.entertainment = 0>> - <<set $activeSlave.counter.vaginal += 1>> - <<set $vaginalTotal += 1>> - <<set $activeSlave.devotion = -60>> - <<set $activeSlave.trust = -40>> - <<set $activeSlave.oldDevotion = -60>> - <<set $activeSlave.face = 15>> - <<set $activeSlave.ovaries = 1>> - <<set $activeSlave.preg = -1>> - <<set $activeSlave.anus = 0>> - <<set $activeSlave.skill.anal = 0>> - <<set $activeSlave.muscles = 20>> - <<set $activeSlave.weight = 20>> - <<run setHealth($activeSlave, 30, undefined, undefined, undefined, 0)>> - <<if $activeSlave.lips < 10>><<set $activeSlave.lips += 10>><</if>> - <<set $activeSlave.boobs = 1000>> - <<set $activeSlave.butt = 6>> - <<set $activeSlave.waist = -15>> - <<set $activeSlave.fetish = "none">> - <<set $activeSlave.behavioralFlaw = "bitchy">> - <<set $activeSlave.sexualFlaw = "hates anal">> - <<run App.Utils.setLocalPronouns($activeSlave)>> - <span id="art-frame"> - /* 000-250-006 */ - <<if $seeImages == 1>> - <<if $imageChoice == 1>> - <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> - <<else>> - <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> + <<if $minimumSlaveAge <= 8>> + <br><<link "Hit the young slave with the unnaturally wide hips struggling along">> + <<replace "#result">> + <<set _slave = GenerateNewSlave("XX", {disableDisability: 1, ageOverridesPedoMode: 1, minAge: 8, maxAge: 8})>> + <<set _slave.origin = "You won $him at a shotgun match against other arcology owners.">> + <<set _slave.lips = random(5,25)>> + <<set _slave.anus = 0>> + <<set _slave.skill.whoring = 0>> + <<set _slave.skill.entertainment = 0>> + <<run actX(_slave, "vaginal")>> + <<set _slave.devotion = 25>> + <<set _slave.trust = 5>> + <<set _slave.oldDevotion = 25>> + <<set _slave.face = 25>> + <<set _slave.vagina = 1>> + <<set _slave.preg = 0>> + <<if $precociousPuberty === 1>> + <<set _slave.pubertyXX = 1>> <</if>> - <</if>> - /* 000-250-006 */ - </span> - You decide to drop the luscious specimen in the rear, and place your taser slug in $his huge buttock. $He goes stiff and slumps to the grass in defeat. Your taser slug is linked to $assistant.name, who hits $him again whenever $he tries to rise. Meanwhile, an athletic slave has successfully crossed the lawn, and is sobbing with joy as _hisU manumission forms are completed. Disbelief and anger fills your supine prize's eyes, and $he's spitting with rage by the time you reach $him. It's a comical sight, since $his gyrations only serve to display $his magnificent breasts and broad butt. $He must have been recently enslaved, and is new enough to slavery that you are obliged to tase $him twice more before $he presents $his holes. The impression of newness to slavery despite $his age is reinforced by $his gratifyingly tight pussy, which is so nice that you confine yourself entirely to it despite the appealing sight of what is almost certainly a virgin butthole. - <<run newSlave($activeSlave)>> /* skip New Slave Intro */ - <</replace>> -<</link>> -<<if $seeDicks != 0 || $makeDicks != 0>> - <br><<link "Hit the slave with the tits, pussy and impressive dick">> + <<set _slave.muscles = 0>> + <<set _slave.weight = -10>> + <<set _slave.height = 135>> + <<run setHealth(_slave, 80, undefined, undefined, undefined, 0)>> + <<set _slave.boobs = 200>> + <<set _slave.butt = 1>> + <<set _slave.waist = -50>> + <<set _slave.shoulders = -2>> + <<set _slave.hips = 3>> + <<set _slave.ovaries = 1>> + <<set _slave.hipsImplant = 1>> + <<set _slave.skill.anal = 0>> + <<set _slave.skill.oral = 0>> + <<set _slave.skill.vaginal = 0>> + <<set _slave.fetish = "pregnancy">> + <<set _slave.fetishStrength = 60>> + <<set _slave.behavioralFlaw = "anorexic">> + <<set _slave.sexualFlaw = "idealistic">> + <<run App.Utils.setLocalPronouns(_slave)>> + <span id="art-frame"> + /* 000-250-006 */ + <<if $seeImages === 1>> + <<if $imageChoice === 1>> + <div class="imageRef medImg"><<= SlaveArt(_slave, 2, 0)>></div> + <<else>> + <div class="imageRef medImg"><<= SlaveArt(_slave, 2, 0)>></div> + <</if>> + <</if>> + /* 000-250-006 */ + </span> + You decide to stop the wide-hipped $loli struggling to run, and easily place your taser slug in $his broad rear. $He goes stiff and falls flat on $his face. Your taser slug is linked to $assistant.name, but since the $girl can't manage to flip over, let alone stand, shocking $him more is unneeded. Fury glints from $his eyes, but $he fully realizes it's over for $him. By the time you approach $him, $he's hoisted $his overly wide rear upwards, presenting $himself, moisture beginning to ooze from $his virgin cunt. It looks like $he was being groomed to be a breeding slave, and $he seems to understand $his role quite well, judging by the way $he rocks $his hips back and forth for you. You thoroughly enjoy $his gratifyingly tight pussy, which is so nice that you confine yourself entirely to it despite the appealing sight of $his virgin butthole. + <<run newSlave(_slave)>> /* skip New Slave Intro */ + <</replace>> + <</link>> + <</if>> + <br><<link "Hit the plush older slave lagging behind">> <<setNonlocalPronouns $seeDicks>> <<replace "#result">> - <<set $activeSlaveOneTimeMinAge = 18>> - <<set $activeSlaveOneTimeMaxAge = 24>> - <<set $one_time_age_overrides_pedo_mode = 1>> - <<set $oneTimeDisableDisability = 1>> - <<set $activeSlave = GenerateNewSlave("XY")>> - <<set $activeSlave.origin = "You won $him at a shotgun match against other arcology owners.">> - <<set $activeSlave.skill.vaginal = 15>> - <<set $activeSlave.skill.oral = 15>> - <<set $activeSlave.skill.whoring = 0>> - <<set $activeSlave.skill.entertainment = 0>> - <<set $activeSlave.counter.anal += 1>> - <<set $analTotal += 1>> - <<set $activeSlave.counter.vaginal += 1>> - <<set $vaginalTotal += 1>> - <<set $activeSlave.devotion = 25>> - <<set $activeSlave.trust = 5>> - <<set $activeSlave.oldDevotion = 25>> - <<if $activeSlave.foreskin > 0>><<set $activeSlave.foreskin = $activeSlave.dick>><</if>> - <<if $activeSlave.balls > 0>><<set $activeSlave.scrotum = $activeSlave.balls>><</if>> - <<set $activeSlave.vagina = 1>> - <<set $activeSlave.ovaries = 0>> - <<set $activeSlave.dick = 6>> - <<set $activeSlave.balls = 3>> - <<set $activeSlave.face = 0>> - <<set $activeSlave.clit = 0>> - <<set $activeSlave.preg = -2>> - <<set $activeSlave.anus = 2>> - <<set $activeSlave.skill.anal = 35>> - <<set $activeSlave.muscles = 0>> - <<set $activeSlave.weight = 0>> - <<run setHealth($activeSlave, 30, undefined, undefined, undefined, 0)>> - <<if $activeSlave.lips < 10>><<set $activeSlave.lips += 10>><</if>> - <<set $activeSlave.boobs = 800>> - <<set $activeSlave.butt = 4>> - <<set $activeSlave.waist = -15>> - <<set $activeSlave.fetish = "none">> - <<set $activeSlave.sexualFlaw = "none">> - <<set $activeSlave.behavioralFlaw = "odd">> - <<run App.Utils.setLocalPronouns($activeSlave)>> + <<set _slave = GenerateNewSlave("XX", {disableDisability: 1, ageOverridesPedoMode: 1, minAge: 36, maxAge: 42})>> + <<set _slave.origin = "You won $him at a shotgun match against other arcology owners.">> + <<set _slave.vagina = 1>> + <<set _slave.skill.vaginal = 15>> + <<set _slave.skill.oral = 15>> + <<set _slave.skill.whoring = 0>> + <<set _slave.skill.entertainment = 0>> + <<run actX(_slave, "vaginal")>> + <<set _slave.devotion = -60>> + <<set _slave.trust = -40>> + <<set _slave.oldDevotion = -60>> + <<set _slave.face = 15>> + <<set _slave.ovaries = 1>> + <<set _slave.preg = -1>> + <<set _slave.anus = 0>> + <<set _slave.skill.anal = 0>> + <<set _slave.muscles = 20>> + <<set _slave.weight = 20>> + <<run setHealth(_slave, 30, undefined, undefined, undefined, 0)>> + <<if _slave.lips < 10>><<set _slave.lips += 10>><</if>> + <<set _slave.boobs = 1000>> + <<set _slave.butt = 6>> + <<set _slave.waist = -15>> + <<set _slave.fetish = "none">> + <<set _slave.behavioralFlaw = "bitchy">> + <<set _slave.sexualFlaw = "hates anal">> + <<run App.Utils.setLocalPronouns(_slave)>> <span id="art-frame"> /* 000-250-006 */ - <<if $seeImages == 1>> - <<if $imageChoice == 1>> - <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> + <<if $seeImages === 1>> + <<if $imageChoice === 1>> + <div class="imageRef medImg"><<= SlaveArt(_slave, 2, 0)>></div> <<else>> - <div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div> + <div class="imageRef medImg"><<= SlaveArt(_slave, 2, 0)>></div> <</if>> <</if>> /* 000-250-006 */ </span> - You decide to drop the really rare specimen, and place your taser slug in $his leg. $He goes stiff and slumps to the grass, squealing with pain since the taser robbed $his ability to break $his fall, leading $him to land on nearly <<if $showInches == 2>>a foot<<else>>thirty centimeters<</if>> of flaccid cock. Your taser slug is linked to $assistant.name, who hits $him again whenever $he tries to rise. Meanwhile, an athletic slave has successfully crossed the lawn, and is sobbing with joy as _hisU manumission forms are completed. Apathy fills your supine prize's eyes, and $he simply lies face-down and quiescent. $He obeys orders to roll over so you can see what you've gotten, however. $He's clearly a work of long and careful hormonal treatment. $He has no implants, but sports big breasts, feminine hips, a nice butt, plush lips, and a huge dick. When you fuck $his pussy and then $his anus, $he even gets a massive erection, showing that $he isn't even on hormone treatment to maintain this unusual set of attributes. - <<run newSlave($activeSlave)>> /* skip New Slave Intro */ + You decide to drop the luscious specimen in the rear, and place your taser slug in $his huge buttock. $He goes stiff and slumps to the grass in defeat. Your taser slug is linked to $assistant.name, who hits $him again whenever $he tries to rise. Meanwhile, an athletic slave has successfully crossed the lawn, and is sobbing with joy as _hisU manumission forms are completed. Disbelief and anger fills your supine prize's eyes, and $he's spitting with rage by the time you reach $him. It's a comical sight, since $his gyrations only serve to display $his magnificent breasts and broad butt. $He must have been recently enslaved, and is new enough to slavery that you are obliged to tase $him twice more before $he presents $his holes. The impression of newness to slavery despite $his age is reinforced by $his gratifyingly tight pussy, which is so nice that you confine yourself entirely to it despite the appealing sight of what is almost certainly a virgin butthole. + <<run newSlave(_slave)>> /* skip New Slave Intro */ <</replace>> <</link>> -<</if>> -<<= IncreasePCSkills('warfare', 2)>> - -<<case "aid invitation">> - -<<set $eventResults.aid = 0>> - <<set _price = 10000>> -<<link "Agree">> - <<replace "#result">> - You dispatch your personal VTOL bird immediately. It lands <<if $eventResults.aidTarget == "volleyballTeam">>beside the bus<<else>>on the roof of the building<</if>> they're sheltering in, and brings them across the closest border and into a more functional country. You receive a call expressing their heartfelt thanks and promising to @@.green;spread the word@@ about how you helped them escape, and a wire transfer of their @@.yellowgreen;payment@@ for the airlift. - <<run cashX(2000, "event")>> - <<run repX(1000, "event")>> - <</replace>> -<</link>> -<br><<link "Do it for free">> - <<replace "#result">> - You dispatch your personal VTOL bird immediately. It lands <<if $eventResults.aidTarget == "volleyballTeam">>beside the bus<<else>>on the roof of the building<</if>> they're sheltering in, and brings them across the closest border and into a more functional country. You receive a call expressing their heartfelt thanks, and when you refuse their payment for the airlift, they tearfully promise to tell the story of how you @@.green;extended charity@@ to those in need, belying the rumors about slaveowners. - <<run repX(2500, "event")>> - <</replace>> -<</link>> -<br><<link "Airlift them into slavery">> - <<replace "#result">> - You send your personal VTOL bird to the shop for some immediate and very expensive modifications to its cargo and passenger area. Since this will take several days, you stall the supplicants. - <<if $eventResults.aidTarget == "volleyballTeam">> - A few of the girls decide to leave, but the sight of them pushed against the wall of a nearby building, toned bodies glistening with sweat and seed as their captors rape them into submission, keep the rest happy to stay on the bus. Those that remained - <<else>> - Their situation isn't truly dire yet, and they can wait. They + <<if $seeDicks !== 0 || $makeDicks !== 0>> + <br><<link "Hit the slave with the tits, pussy and impressive dick">> + <<setNonlocalPronouns $seeDicks>> + <<replace "#result">> + <<set _slave = GenerateNewSlave("XY", {disableDisability: 1, ageOverridesPedoMode: 1, minAge: 18, maxAge: 24})>> + <<set _slave.origin = "You won $him at a shotgun match against other arcology owners.">> + <<set _slave.skill.vaginal = 15>> + <<set _slave.skill.oral = 15>> + <<set _slave.skill.whoring = 0>> + <<set _slave.skill.entertainment = 0>> + <<run actX(_slave, "anal")>> + <<run actX(_slave, "vaginal")>> + <<set _slave.devotion = 25>> + <<set _slave.trust = 5>> + <<set _slave.oldDevotion = 25>> + <<if _slave.foreskin > 0>><<set _slave.foreskin = _slave.dick>><</if>> + <<if _slave.balls > 0>><<set _slave.scrotum = _slave.balls>><</if>> + <<set _slave.vagina = 1>> + <<set _slave.ovaries = 0>> + <<set _slave.dick = 6>> + <<set _slave.balls = 3>> + <<set _slave.face = 0>> + <<set _slave.clit = 0>> + <<set _slave.preg = -2>> + <<set _slave.anus = 2>> + <<set _slave.skill.anal = 35>> + <<set _slave.muscles = 0>> + <<set _slave.weight = 0>> + <<run setHealth(_slave, 30, undefined, undefined, undefined, 0)>> + <<if _slave.lips < 10>><<set _slave.lips += 10>><</if>> + <<set _slave.boobs = 800>> + <<set _slave.butt = 4>> + <<set _slave.waist = -15>> + <<set _slave.fetish = "none">> + <<set _slave.sexualFlaw = "none">> + <<set _slave.behavioralFlaw = "odd">> + <<run App.Utils.setLocalPronouns(_slave)>> + <span id="art-frame"> + /* 000-250-006 */ + <<if $seeImages === 1>> + <<if $imageChoice === 1>> + <div class="imageRef medImg"><<= SlaveArt(_slave, 2, 0)>></div> + <<else>> + <div class="imageRef medImg"><<= SlaveArt(_slave, 2, 0)>></div> + <</if>> + <</if>> + /* 000-250-006 */ + </span> + You decide to drop the really rare specimen, and place your taser slug in $his leg. $He goes stiff and slumps to the grass, squealing with pain since the taser robbed $his ability to break $his fall, leading $him to land on nearly <<if $showInches === 2>>a foot<<else>>thirty centimeters<</if>> of flaccid cock. Your taser slug is linked to $assistant.name, who hits $him again whenever $he tries to rise. Meanwhile, an athletic slave has successfully crossed the lawn, and is sobbing with joy as _hisU manumission forms are completed. Apathy fills your supine prize's eyes, and $he simply lies face-down and quiescent. $He obeys orders to roll over so you can see what you've gotten, however. $He's clearly a work of long and careful hormonal treatment. $He has no implants, but sports big breasts, feminine hips, a nice butt, plush lips, and a huge dick. When you fuck $his pussy and then $his anus, $he even gets a massive erection, showing that $he isn't even on hormone treatment to maintain this unusual set of attributes. + <<run newSlave(_slave)>> /* skip New Slave Intro */ + <</replace>> + <</link>> <</if>> - are extremely grateful, though they would be less hopeful if they knew the true nature of the aircraft coming to retrieve them. - <<set $eventResults.aid = 1>> - <<run cashX(forceNeg(_price), "event")>> - <</replace>> -<</link>> //This will cost <<print cashFormat(_price)>>// - + <<= IncreasePCSkills('warfare', 2)>> +<<case "aid invitation">> + <<set $eventResults.aid = 0>> + <<set _price = 10000>> + <<link "Agree">> + <<replace "#result">> + You dispatch your personal VTOL bird immediately. It lands <<if $eventResults.aidTarget === "volleyballTeam">>beside the bus<<else>>on the roof of the building<</if>> they're sheltering in, and brings them across the closest border and into a more functional country. You receive a call expressing their heartfelt thanks and promising to @@.green;spread the word@@ about how you helped them escape, and a wire transfer of their @@.yellowgreen;payment@@ for the airlift. + <<run cashX(2000, "event")>> + <<run repX(1000, "event")>> + <</replace>> + <</link>> + <br><<link "Do it for free">> + <<replace "#result">> + You dispatch your personal VTOL bird immediately. It lands <<if $eventResults.aidTarget === "volleyballTeam">>beside the bus<<else>>on the roof of the building<</if>> they're sheltering in, and brings them across the closest border and into a more functional country. You receive a call expressing their heartfelt thanks, and when you refuse their payment for the airlift, they tearfully promise to tell the story of how you @@.green;extended charity@@ to those in need, belying the rumors about slaveowners. + <<run repX(2500, "event")>> + <</replace>> + <</link>> + <br><<link "Airlift them into slavery">> + <<replace "#result">> + You send your personal VTOL bird to the shop for some immediate and very expensive modifications to its cargo and passenger area. Since this will take several days, you stall the supplicants. + <<if $eventResults.aidTarget === "volleyballTeam">> + A few of the girls decide to leave, but the sight of them pushed against the wall of a nearby building, toned bodies glistening with sweat and seed as their captors rape them into submission, keep the rest happy to stay on the bus. Those that remained + <<else>> + Their situation isn't truly dire yet, and they can wait. They + <</if>> + are extremely grateful, though they would be less hopeful if they knew the true nature of the aircraft coming to retrieve them. + <<set $eventResults.aid = 1>> + <<run cashX(forceNeg(_price), "event")>> + <</replace>> + <</link>> //This will cost <<print cashFormat(_price)>>// <<case "aid result">> - -<<set $eventResults.aid = 0>> -<<link "Sell your captures immediately">> - <<replace "#result">> - <<for _genPlot = 0; _genPlot < _newSlaves.length; _genPlot++>> - <<set _slaveCost = slaveCost(_newSlaves[_genPlot])>> - <<run cashX(_slaveCost, "slaveTransfer")>> - <</for>> - Prisoners @@.green;sold.@@ - <</replace>> -<</link>> -<br><<link "Enslave them all">> - <<replace "#result">> - <<for _genPlot = 0; _genPlot < _newSlaves.length; _genPlot++>> - <<run newSlave(_newSlaves[_genPlot])>> /* skip New Slave Intro — TODO: use Bulk Slave Intro */ - <</for>> - You simply enslave all of the escapees yourself. These slaves will more than make up for the costs you expended, in the long run. - <</replace>> -<</link>> - + <<set $eventResults.aid = 0>> + <<link "Sell your captures immediately">> + <<replace "#result">> + <<for _genPlot = 0; _genPlot < _newSlaves.length; _genPlot++>> + <<set _slaveCost = slaveCost(_newSlaves[_genPlot])>> + <<run cashX(_slaveCost, "slaveTransfer")>> + <</for>> + Prisoners @@.green;sold.@@ + <</replace>> + <</link>> + <br><<link "Enslave them all">> + <<replace "#result">> + <<for _genPlot = 0; _genPlot < _newSlaves.length; _genPlot++>> + <<run newSlave(_newSlaves[_genPlot])>> /* skip New Slave Intro — TODO: use Bulk Slave Intro */ + <</for>> + You simply enslave all of the escapees yourself. These slaves will more than make up for the costs you expended, in the long run. + <</replace>> + <</link>> <<case "arcology naming">> - -<<link "Hurrah!">> - <<replace "#result">> - Your citizens enthusiastically respond to your naming of the arcology as $arcologies[0].name. They are proud to finally have a real name for their home. Other Free Cities take note, and some take up their own names as well, another indication of the Cities' collective ascension over the old world. - <<set $nextButton = "Continue">> - <</replace>> -<</link>> // Click to confirm your arcology's name, for now and ever! Or until you decide to change it again while managing your arcology.// - + <<link "Hurrah!">> + <<replace "#result">> + Your citizens enthusiastically respond to your naming of the arcology as $arcologies[0].name. They are proud to finally have a real name for their home. Other Free Cities take note, and some take up their own names as well, another indication of the Cities' collective ascension over the old world. + <<set $nextButton = "Continue">> + <</replace>> + <</link>> // Click to confirm your arcology's name, for now and ever! Or until you decide to change it again while managing your arcology.// <<case "slave food">> - -<<set $revealFoodEffects = 0>> -<<link "Conceal the effects from your slaves">> - <<replace "#result">> - Your slaves don't need to know that every drop of food they drink is making the light of any eventual freedom they may someday enjoy dimmer and dimmer. Slaves talk to each other all the time, and rumors fly around in such profusion that the truth often gets lost among them. The cruel irony of the symptoms the research discovered is that they're impossible for the slaves to notice so long as they continue to eat the slave food. - <</replace>> -<</link>> -<br><<link "Admit the truth to your slaves">> - <<replace "#result">> - Your new slaves already receive a simple explanation of the way the slave food works as part of their training. You simply append a statement to the effect that the slaves' bodies will adapt to the slave food, slowly making it difficult and eventually impossible for them to eat anything else. There is no immediate reaction, but the news begins to filter out among the slaves. They'll react to the newly revealed nature of their food in accordance with their individual attitudes. - <<set $revealFoodEffects = 1>> - <</replace>> -<</link>> - + <<set $revealFoodEffects = 0>> + <<link "Conceal the effects from your slaves">> + <<replace "#result">> + Your slaves don't need to know that every drop of food they drink is making the light of any eventual freedom they may someday enjoy dimmer and dimmer. Slaves talk to each other all the time, and rumors fly around in such profusion that the truth often gets lost among them. The cruel irony of the symptoms the research discovered is that they're impossible for the slaves to notice so long as they continue to eat the slave food. + <</replace>> + <</link>> + <br><<link "Admit the truth to your slaves">> + <<replace "#result">> + Your new slaves already receive a simple explanation of the way the slave food works as part of their training. You simply append a statement to the effect that the slaves' bodies will adapt to the slave food, slowly making it difficult and eventually impossible for them to eat anything else. There is no immediate reaction, but the news begins to filter out among the slaves. They'll react to the newly revealed nature of their food in accordance with their individual attitudes. + <<set $revealFoodEffects = 1>> + <</replace>> + <</link>> <</switch>> </span> diff --git a/src/uncategorized/managePenthouse.tw b/src/uncategorized/managePenthouse.tw index 2b68bee8a0389943ed988d254c8f35fd594b09b5..09ad829c0b4ab571d01e30260e3779954c7907f1 100644 --- a/src/uncategorized/managePenthouse.tw +++ b/src/uncategorized/managePenthouse.tw @@ -400,7 +400,7 @@ <span class="detail"> Costs <<print cashFormat(Math.trunc(150000*$upgradeMultiplierArcology))>> <div class="indent"> - Buying the equipment to construct prosthetics yourself is expensive but if you want to construct a lot of prosthetics it will pay out in the long run. + Buying the equipment to construct prosthetics yourself is expensive but if you plan to construct many prosthetics it will pay out in the long run. </div> </span> <</if>> diff --git a/src/uncategorized/pMercenaries.tw b/src/uncategorized/pMercenaries.tw index 53a88b27cce1e243c4a78c26c898dde67b13647d..c00dcffc947e5a641f1ab9772ff2a2885e827a48 100644 --- a/src/uncategorized/pMercenaries.tw +++ b/src/uncategorized/pMercenaries.tw @@ -30,7 +30,9 @@ The budgetary difficulty many old world countries are in has resulted in unemplo <<run repX(-100, "event")>> <<run cashX(forceNeg(_price), "mercenaries")>> <<set $mercenaries = 1>> - <<set $SecExp.units.mercs.free = 15>> + <<if ($secExpEnabled > 0)>> + <<set $SecExp.units.mercs.free = 15>> + <</if>> <</replace>> <</link>> <<if ($PC.skill.warfare >= 50) || ($PC.career == "arcology owner")>>//This will cost <<print cashFormat(_price)>> and some upkeep, @@.springgreen;reduced by your mercenary contacts@@//<<else>>//This will cost <<print cashFormat(5000)>> and incur significant upkeep costs//<</if>> <br><<link "Install a full platoon">> @@ -39,7 +41,9 @@ The budgetary difficulty many old world countries are in has resulted in unemplo <<run repX(-500, "event")>> <<run cashX(forceNeg((_price*2)), "mercenaries")>> <<set $mercenaries = 3>> - <<set $SecExp.units.mercs.free = 30>> + <<if ($secExpEnabled > 0)>> + <<set $SecExp.units.mercs.free = 30>> + <</if>> <</replace>> <</link>> <<if ($PC.skill.warfare >= 50) || ($PC.career == "arcology owner")>>//This will cost <<print cashFormat((_price*2))>> and some upkeep, @@.springgreen;reduced by your mercenary contacts@@//<<else>>//This will cost <<print cashFormat(10000)>> and incur significant upkeep costs//<</if>> <br><<link "Do not quarter troops in your arcology">> diff --git a/src/uncategorized/reMalefactor.tw b/src/uncategorized/reMalefactor.tw index e0294b2f9f011ab29081b7fcf43a23a5375981c7..4396e0f6116d5bc8af87aac1944cfc39645c5887 100644 --- a/src/uncategorized/reMalefactor.tw +++ b/src/uncategorized/reMalefactor.tw @@ -3,399 +3,341 @@ <<set $nextButton = "Continue", $nextLink = "RIE Eligibility Check", $returnTo = "RIE Eligibility Check", $encyclopedia = "Free Cities Justice">> <<switch $malefactor>> - <<case "addict">> - -<<set $activeSlave = GenerateNewSlave()>> -<<set $activeSlave.origin = "You sentenced $him to enslavement as a punishment for attempted burglary.">> -<<set $activeSlave.career = "a criminal">> -<<set $activeSlave.devotion = random(-75,-60)>> -<<set $activeSlave.trust = random(-15,0)>> -<<set $activeSlave.oldDevotion = $activeSlave.devotion>> -<<run setHealth($activeSlave, jsRandom(-40, -20))>> -<<set $activeSlave.addict = 30>> -<<set $activeSlave.anus = 3>> -<<if $activeSlave.dick == 0>> - <<set $activeSlave.balls = 0>> - <<set $activeSlave.vagina = 2>> - <<set $activeSlave.skill.vaginal = 15>> -<<else>> - <<set $activeSlave.ovaries = 0>> - <<set $activeSlave.clit = 0>> - <<set $activeSlave.skill.vaginal = 0>> -<</if>> -<<set $activeSlave.skill.oral = 15>> -<<set $activeSlave.skill.anal = 35>> -<<set $activeSlave.skill.whoring = 15>> -<<set $activeSlave.earPiercing = 1>> -<<set $activeSlave.nosePiercing = 1>> -<<set $activeSlave.nipplesPiercing = 1>> -<<set $activeSlave.clitPiercing = 1>> -<<set $activeSlave.behavioralFlaw = "odd">> - + <<set _slave = GenerateNewSlave()>> + <<set _slave.origin = "You sentenced $him to enslavement as a punishment for attempted burglary.">> + <<set _slave.career = "a criminal">> + <<set _slave.devotion = random(-75,-60)>> + <<set _slave.trust = random(-15,0)>> + <<set _slave.oldDevotion = _slave.devotion>> + <<run setHealth(_slave, jsRandom(-40, -20))>> + <<set _slave.addict = 30>> + <<set _slave.anus = 3>> + <<if _slave.dick === 0>> + <<set _slave.balls = 0>> + <<set _slave.vagina = 2>> + <<set _slave.skill.vaginal = 15>> + <<else>> + <<set _slave.ovaries = 0>> + <<set _slave.clit = 0>> + <<set _slave.skill.vaginal = 0>> + <</if>> + <<set _slave.skill.oral = 15>> + <<set _slave.skill.anal = 35>> + <<set _slave.skill.whoring = 15>> + <<set _slave.earPiercing = 1>> + <<set _slave.nosePiercing = 1>> + <<set _slave.nipplesPiercing = 1>> + <<set _slave.clitPiercing = 1>> + <<set _slave.behavioralFlaw = "odd">> <<case "escapee">> - -<<set $oneTimeDisableDisability = 1>> -<<set $activeSlave = GenerateNewSlave()>> -<<set $activeSlave.origin = "You sentenced $him to enslavement as a punishment for suspected escapism.">> -<<set $activeSlave.devotion = random(-75,-60)>> -<<set $activeSlave.trust = random(-15,0)>> -<<set $activeSlave.oldDevotion = $activeSlave.devotion>> -<<run setHealth($activeSlave, jsRandom(-80, -70), undefined, undefined, undefined, 70)>> -<<set $activeSlave.heels = 1>> -<<set $activeSlave.boobs += 100*random(12,32)>> -<<set $activeSlave.butt += random(2,4)>> -<<set $activeSlave.anus = 1>> -<<if $activeSlave.dick == 0>> - <<set $activeSlave.balls = 0>> - <<set $activeSlave.vagina = 2>> - <<set $activeSlave.skill.vaginal = 15>> -<<else>> - <<set $activeSlave.dick = random(4,5)>> - <<set $activeSlave.balls = random(0,2)>> - <<set $activeSlave.ovaries = 0>> - <<set $activeSlave.clit = 0>> - <<set $activeSlave.skill.vaginal = 0>> -<</if>> -<<set $activeSlave.skill.oral = 0>> -<<set $activeSlave.skill.anal = 0>> -<<set $activeSlave.skill.whoring = 0>> -<<set $activeSlave.sexualFlaw = "hates penetration">> -<<set $activeSlave.behavioralFlaw = "odd">> - + <<set _slave = GenerateNewSlave(null, {disableDisability: 1})>> + <<set _slave.origin = "You sentenced $him to enslavement as a punishment for suspected escapism.">> + <<set _slave.devotion = random(-75,-60)>> + <<set _slave.trust = random(-15,0)>> + <<set _slave.oldDevotion = _slave.devotion>> + <<run setHealth(_slave, jsRandom(-80, -70), undefined, undefined, undefined, 70)>> + <<set _slave.heels = 1>> + <<set _slave.boobs += 100*random(12,32)>> + <<set _slave.butt += random(2,4)>> + <<set _slave.anus = 1>> + <<if _slave.dick === 0>> + <<set _slave.balls = 0>> + <<set _slave.vagina = 2>> + <<set _slave.skill.vaginal = 15>> + <<else>> + <<set _slave.dick = random(4,5)>> + <<set _slave.balls = random(0,2)>> + <<set _slave.ovaries = 0>> + <<set _slave.clit = 0>> + <<set _slave.skill.vaginal = 0>> + <</if>> + <<set _slave.skill.oral = 0>> + <<set _slave.skill.anal = 0>> + <<set _slave.skill.whoring = 0>> + <<set _slave.sexualFlaw = "hates penetration">> + <<set _slave.behavioralFlaw = "odd">> <<case "anchorBaby">> - -<<set $activeSlaveOneTimeMinAge = $fertilityAge>> -<<set $activeSlaveOneTimeMaxAge = 42>> -<<set $oneTimeDisableDisability = 1>> -<<set $activeSlave = GenerateNewSlave("XX")>> -<<set $activeSlave.origin = "You sentenced $him to enslavement as a punishment for smuggling slaves within $his body.">> -<<set $activeSlave.career = App.Data.Careers.General.uneducated.random()>> -<<set $activeSlave.devotion = random(-75,-50)>> -<<set $activeSlave.trust = random(-75,-60)>> -<<set $activeSlave.oldDevotion = $activeSlave.devotion>> -<<run setHealth($activeSlave, jsRandom(20, 40), undefined, undefined, undefined, 60)>> -<<set $activeSlave.weight = random(40,80)>> -<<set $activeSlave.accent = 3>> -<<set $activeSlave.boobs += 200>> -<<set $activeSlave.lactation = 1>> -<<set $activeSlave.lactationDuration = 2>> -<<set $activeSlave.ovaries = 1>> -<<if $activeSlave.vagina < 2>> - <<set $activeSlave.vagina += 3>> -<</if>> -<<set $activeSlave.bellySag = 3, $activeSlave.bellySagPreg = 3>> -<<set $activeSlave.preg = 0>> -<<set $activeSlave.pregWeek = -4>> -<<set $activeSlave.counter.birthsTotal = 2>> -<<set $activeSlave.counter.births = 2>> -<<set $activeSlave.skill.vaginal = 30>> -<<set $activeSlave.skill.oral = 15>> -<<set $activeSlave.skill.anal = 15>> -<<set $activeSlave.sexualFlaw = "crude">> -<<set $activeSlave.behavioralFlaw = "bitchy">> - + <<set _slave = GenerateNewSlave("XX", {disableDisability: 1, minAge: $fertilityAge, maxAge: 42})>> + <<set _slave.origin = "You sentenced $him to enslavement as a punishment for smuggling slaves within $his body.">> + <<set _slave.career = App.Data.Careers.General.uneducated.random()>> + <<set _slave.devotion = random(-75,-50)>> + <<set _slave.trust = random(-75,-60)>> + <<set _slave.oldDevotion = _slave.devotion>> + <<run setHealth(_slave, jsRandom(20, 40), undefined, undefined, undefined, 60)>> + <<set _slave.weight = random(40,80)>> + <<set _slave.accent = 3>> + <<set _slave.boobs += 200>> + <<set _slave.lactation = 1>> + <<set _slave.lactationDuration = 2>> + <<set _slave.ovaries = 1>> + <<if _slave.vagina < 2>> + <<set _slave.vagina += 3>> + <</if>> + <<set _slave.bellySag = 3, _slave.bellySagPreg = 3>> + <<set _slave.preg = 0>> + <<set _slave.pregWeek = -4>> + <<set _slave.counter.birthsTotal = 2>> + <<set _slave.counter.births = 2>> + <<set _slave.skill.vaginal = 30>> + <<set _slave.skill.oral = 15>> + <<set _slave.skill.anal = 15>> + <<set _slave.sexualFlaw = "crude">> + <<set _slave.behavioralFlaw = "bitchy">> <<case "orphanloli">> - -<<set $activeSlaveOneTimeMinAge = $minimumSlaveAge>> -<<set $activeSlaveOneTimeMaxAge = 12>> -<<set $oneTimeDisableDisability = 1>> -<<set $activeSlave = GenerateNewSlave()>> -<<set $activeSlave.origin = "You sentenced $him to enslavement as a punishment for suspected escapism.">> -<<set $activeSlave.career = "an orphan">> -<<set $activeSlave.devotion = random(-15,0)>> -<<set $activeSlave.trust = random(-75,-60)>> -<<set $activeSlave.oldDevotion = $activeSlave.devotion>> -<<run setHealth($activeSlave, jsRandom(-80, -70), undefined, undefined, undefined, 70)>> -<<set $activeSlave.weight = -100>> -<<set $activeSlave.accent = 3>> -<<set $activeSlave.boobs = 0>> -<<set $activeSlave.butt = 0>> -<<set $activeSlave.anus = 0>> -<<if $activeSlave.dick == 0>> - <<set $activeSlave.balls = 0>> - <<set $activeSlave.vagina = 0>> - <<set $activeSlave.skill.vaginal = 0>> -<<else>> - <<set $activeSlave.dick = random(1,2)>> - <<set $activeSlave.balls = random(1,2)>> - <<set $activeSlave.ovaries = 0>> - <<set $activeSlave.clit = 0>> - <<set $activeSlave.skill.vaginal = 0>> -<</if>> -<<set $activeSlave.skill.oral = 0>> -<<set $activeSlave.skill.anal = 0>> -<<set $activeSlave.skill.whoring = 0>> -<<set $activeSlave.sexualFlaw = "apathetic">> -<<set $activeSlave.behavioralFlaw = "gluttonous">> - + <<set _slave = GenerateNewSlave(null, {minAge: $minimumSlaveAge, maxAge: 12, disableDisability: 1})>> + <<set _slave.origin = "You sentenced $him to enslavement as a punishment for suspected escapism.">> + <<set _slave.career = "an orphan">> + <<set _slave.devotion = random(-15,0)>> + <<set _slave.trust = random(-75,-60)>> + <<set _slave.oldDevotion = _slave.devotion>> + <<run setHealth(_slave, jsRandom(-80, -70), undefined, undefined, undefined, 70)>> + <<set _slave.weight = -100>> + <<set _slave.accent = 3>> + <<set _slave.boobs = 0>> + <<set _slave.butt = 0>> + <<set _slave.anus = 0>> + <<if _slave.dick === 0>> + <<set _slave.balls = 0>> + <<set _slave.vagina = 0>> + <<else>> + <<set _slave.dick = random(1,2)>> + <<set _slave.balls = random(1,2)>> + <<set _slave.ovaries = 0>> + <<set _slave.clit = 0>> + <</if>> + <<set _slave.skill.vaginal = 0>> + <<set _slave.skill.oral = 0>> + <<set _slave.skill.anal = 0>> + <<set _slave.skill.whoring = 0>> + <<set _slave.sexualFlaw = "apathetic">> + <<set _slave.behavioralFlaw = "gluttonous">> <<case "businesswoman">> - -<<set $activeSlaveOneTimeMinAge = 35>> -<<set $activeSlaveOneTimeMaxAge = 43>> -<<set $oneTimeDisableDisability = 1>> -<<if $arcologies[0].FSSupremacistLawME == 1>> - <<set $fixedRace = $arcologies[0].FSSupremacistRace>> -<<elseif $arcologies[0].FSSubjugationistLawME == 1>> - <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> - <<set $fixedRace = _races.random()>> -<</if>> -<<set $activeSlave = GenerateNewSlave("XX")>> -<<set $activeSlave.origin = "You sentenced $him to enslavement as a punishment for fraud and theft.">> -<<set $activeSlave.career = "a criminal businesswoman">> -<<set $activeSlave.devotion = random(-75,-60)>> -<<set $activeSlave.trust = random(-15,0)>> -<<set $activeSlave.oldDevotion = $activeSlave.devotion>> -<<set $activeSlave.vagina = 2>> -<<set $activeSlave.preg = -1>> -<<set $activeSlave.skill.vaginal = 15>> -<<set $activeSlave.anus = 0>> -<<set $activeSlave.boobs += 400>> -<<set $activeSlave.boobsImplant = 400>> -<<set $activeSlave.boobsImplantType = "normal">> -<<set $activeSlave.butt += 2>> -<<set $activeSlave.buttImplant = 2>> -<<set $activeSlave.buttImplantType = "normal">> -<<run setHealth($activeSlave, jsRandom(20, 40), undefined, undefined, undefined, 10)>> -<<set $activeSlave.sexualFlaw = "hates oral">> -<<set $activeSlave.behavioralFlaw = "arrogant">> -<<set $activeSlave.hStyle = "fashionable for a Free Cities businesswoman, up in a tight bun">> -<<set $activeSlave.custom.tattoo = "$He has a pretty floral tattoo along $his collarbone.">> - + <<set _pram = {disableDisability: 1, minAge: 35, maxAge: 45}>> + <<if $arcologies[0].FSSupremacistLawME === 1>> + <<set _pram.race = $arcologies[0].FSSupremacistRace>> + <<elseif $arcologies[0].FSSubjugationistLawME === 1>> + <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> + <<set _pram.race = _races.random()>> + <</if>> + <<set _slave = GenerateNewSlave("XX", _pram)>> + <<set _slave.origin = "You sentenced $him to enslavement as a punishment for fraud and theft.">> + <<set _slave.career = "a criminal businesswoman">> + <<set _slave.devotion = random(-75,-60)>> + <<set _slave.trust = random(-15,0)>> + <<set _slave.oldDevotion = _slave.devotion>> + <<set _slave.vagina = 2>> + <<set _slave.preg = -1>> + <<set _slave.skill.vaginal = 15>> + <<set _slave.anus = 0>> + <<set _slave.boobs += 400>> + <<set _slave.boobsImplant = 400>> + <<set _slave.boobsImplantType = "normal">> + <<set _slave.butt += 2>> + <<set _slave.buttImplant = 2>> + <<set _slave.buttImplantType = "normal">> + <<run setHealth(_slave, jsRandom(20, 40), undefined, undefined, undefined, 10)>> + <<set _slave.sexualFlaw = "hates oral">> + <<set _slave.behavioralFlaw = "arrogant">> + <<set _slave.hStyle = "fashionable for a Free Cities businesswoman, up in a tight bun">> + <<set _slave.custom.tattoo = "$He has a pretty floral tattoo along $his collarbone.">> <<case "whore">> - -<<set $oneTimeDisableDisability = 1>> -<<if $arcologies[0].FSSupremacistLawME == 1>> - <<set $fixedRace = $arcologies[0].FSSupremacistRace>> -<<elseif $arcologies[0].FSSubjugationistLawME == 1>> - <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> - <<set $fixedRace = _races.random()>> -<</if>> -<<set $activeSlave = GenerateNewSlave()>> -<<set $activeSlave.origin = "You sentenced $him to enslavement as a punishment for theft and battery.">> -<<set $activeSlave.career = "a prostitute">> -<<set $activeSlave.devotion = random(-75,-60)>> -<<set $activeSlave.trust = random(-15,0)>> -<<set $activeSlave.oldDevotion = $activeSlave.devotion>> -<<run setHealth($activeSlave, jsRandom(-40, -20))>> -<<set $activeSlave.anus = 2>> -<<if $activeSlave.dick == 0>> - <<set $activeSlave.balls = 0>> - <<set $activeSlave.vagina = 2>> - <<set $activeSlave.skill.vaginal = 35>> -<</if>> -<<set $activeSlave.skill.oral = 35>> -<<set $activeSlave.skill.anal = 35>> -<<set $activeSlave.skill.whoring = 35>> -<<set $activeSlave.boobs += 400>> -<<set $activeSlave.boobsImplant = 400>> -<<set $activeSlave.boobsImplantType = "normal">> -<<set $activeSlave.butt += 1>> -<<set $activeSlave.buttImplant = 1>> -<<set $activeSlave.buttImplantType = "normal">> -<<set $activeSlave.lips += 10>> -<<set $activeSlave.lipsImplant = 10>> -<<set $activeSlave.lipsPiercing = 1>> -<<set $activeSlave.tonguePiercing = 1>> -<<set $activeSlave.earPiercing = 1>> -<<set $activeSlave.nosePiercing = 1>> -<<set $activeSlave.eyebrowPiercing = 1>> -<<set $activeSlave.nipplesPiercing = 1>> -<<set $activeSlave.clitPiercing = 1>> -<<set $activeSlave.sexualFlaw = "hates penetration">> -<<set $activeSlave.hStyle = "strip">> -<<set $activeSlave.custom.tattoo = "$He has a teardrop tattooed under each eye.">> - + <<set _pram = {disableDisability: 1}>> + <<if $arcologies[0].FSSupremacistLawME === 1>> + <<set _pram.race = $arcologies[0].FSSupremacistRace>> + <<elseif $arcologies[0].FSSubjugationistLawME === 1>> + <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> + <<set _pram.race = _races.random()>> + <</if>> + <<set _slave = GenerateNewSlave(null, _pram)>> + <<set _slave.origin = "You sentenced $him to enslavement as a punishment for theft and battery.">> + <<set _slave.career = "a prostitute">> + <<set _slave.devotion = random(-75,-60)>> + <<set _slave.trust = random(-15,0)>> + <<set _slave.oldDevotion = _slave.devotion>> + <<run setHealth(_slave, jsRandom(-40, -20))>> + <<set _slave.anus = 2>> + <<if _slave.dick === 0>> + <<set _slave.balls = 0>> + <<set _slave.vagina = 2>> + <<set _slave.skill.vaginal = 35>> + <</if>> + <<set _slave.skill.oral = 35>> + <<set _slave.skill.anal = 35>> + <<set _slave.skill.whoring = 35>> + <<set _slave.boobs += 400>> + <<set _slave.boobsImplant = 400>> + <<set _slave.boobsImplantType = "normal">> + <<set _slave.butt++>> + <<set _slave.buttImplant = 1>> + <<set _slave.buttImplantType = "normal">> + <<set _slave.lips += 10>> + <<set _slave.lipsImplant = 10>> + <<set _slave.lipsPiercing = 1>> + <<set _slave.tonguePiercing = 1>> + <<set _slave.earPiercing = 1>> + <<set _slave.nosePiercing = 1>> + <<set _slave.eyebrowPiercing = 1>> + <<set _slave.nipplesPiercing = 1>> + <<set _slave.clitPiercing = 1>> + <<set _slave.sexualFlaw = "hates penetration">> + <<set _slave.hStyle = "strip">> + <<set _slave.custom.tattoo = "$He has a teardrop tattooed under each eye.">> <<case "rapist">> - -<<set $activeSlaveOneTimeMinAge = 16>> -<<set $oneTimeDisableDisability = 1>> -<<if $arcologies[0].FSSupremacistLawME == 1>> - <<set $fixedRace = $arcologies[0].FSSupremacistRace>> -<<elseif $arcologies[0].FSSubjugationistLawME == 1>> - <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> - <<set $fixedRace = _races.random()>> -<</if>> -<<set $activeSlave = GenerateNewSlave("XY")>> -<<set $activeSlave.origin = "You sentenced $him to enslavement as a punishment for the rape of a free woman.">> -<<set $activeSlave.devotion = random(-75,-60)>> -<<set $activeSlave.trust = random(-15,0)>> -<<set $activeSlave.oldDevotion = $activeSlave.devotion>> -<<run setHealth($activeSlave, jsRandom(0, 20), undefined, undefined, 0, 5)>> -<<set $activeSlave.anus = 0>> -<<set $activeSlave.balls = random(2,4)>> -<<set $activeSlave.skill.oral = 0>> -<<set $activeSlave.skill.anal = 0>> -<<set $activeSlave.behavioralFlaw = "arrogant">> -<<set $activeSlave.sexualFlaw = "hates men">> - + <<set _pram = {disableDisability: 1, minAge: 16}>> + <<if $arcologies[0].FSSupremacistLawME === 1>> + <<set _pram.race = $arcologies[0].FSSupremacistRace>> + <<elseif $arcologies[0].FSSubjugationistLawME === 1>> + <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> + <<set _pram.race = _races.random()>> + <</if>> + <<set _slave = GenerateNewSlave("XY", _pram)>> + <<set _slave.origin = "You sentenced $him to enslavement as a punishment for the rape of a free woman.">> + <<set _slave.devotion = random(-75,-60)>> + <<set _slave.trust = random(-15,0)>> + <<set _slave.oldDevotion = _slave.devotion>> + <<run setHealth(_slave, jsRandom(0, 20), undefined, undefined, 0, 5)>> + <<set _slave.anus = 0>> + <<set _slave.balls = random(2,4)>> + <<set _slave.skill.oral = 0>> + <<set _slave.skill.anal = 0>> + <<set _slave.behavioralFlaw = "arrogant">> + <<set _slave.sexualFlaw = "hates men">> <<case "mule">> - -<<set $activeSlaveOneTimeMinAge = 13>> -<<if $pedo_mode == 1>> -<<else>> - <<set $activeSlaveOneTimeMaxAge = 26>> -<</if>> -<<set $oneTimeDisableDisability = 1>> -<<if $arcologies[0].FSSupremacistLawME == 1>> - <<set $fixedRace = $arcologies[0].FSSupremacistRace>> -<<elseif $arcologies[0].FSSubjugationistLawME == 1>> - <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> - <<set $fixedRace = _races.random()>> -<</if>> -<<set $activeSlave = GenerateNewSlave("XX")>> -<<set $activeSlave.origin = "You sentenced $him to enslavement for smuggling drugs into the arcology.">> -<<set $activeSlave.career = "a drug mule">> -<<set $activeSlave.devotion = random(-50,-20)>> -<<set $activeSlave.trust = random(-100,-75)>> -<<set $activeSlave.vagina = 2>> -<<set $activeSlave.preg = -2>> -<<set $activeSlave.bellyImplant = 0>> -<<set $activeSlave.cervixImplant = 1>> -<<set $activeSlave.pubicHStyle = "shaved">> -<<set $activeSlave.bellySag = 2>> -<<set $activeSlave.skill.vaginal = 50>> -<<set $activeSlave.anus = 0>> -<<set $activeSlave.hips = 0>> -<<set $activeSlave.weight = -60>> -<<set $activeSlave.waist = random(-30,-10)>> -<<set $activeSlave.boobs = random(4,5)*100>> -<<set $activeSlave.boobShape = "perky">> -<<run setHealth($activeSlave, jsRandom(-20, 10), undefined, undefined, undefined, 40)>> -<<set $activeSlave.sexualFlaw = "hates penetration">> -<<set $activeSlave.behavioralFlaw = "shamefast">> -<<set $activeSlave.accent = 0>> - + <<set _pram = {disableDisability: 1, minAge: 13}>> + <<if $pedo_mode === 0>> + <<set _pram.maxAge = 26>> + <</if>> + <<if $arcologies[0].FSSupremacistLawME === 1>> + <<set _pram.race = $arcologies[0].FSSupremacistRace>> + <<elseif $arcologies[0].FSSubjugationistLawME === 1>> + <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> + <<set _pram.race = _races.random()>> + <</if>> + <<set _slave = GenerateNewSlave("XX", _pram)>> + <<set _slave.origin = "You sentenced $him to enslavement for smuggling drugs into the arcology.">> + <<set _slave.career = "a drug mule">> + <<set _slave.devotion = random(-50,-20)>> + <<set _slave.trust = random(-100,-75)>> + <<set _slave.vagina = 2>> + <<set _slave.preg = -2>> + <<set _slave.bellyImplant = 0>> + <<set _slave.cervixImplant = 1>> + <<set _slave.pubicHStyle = "shaved">> + <<set _slave.bellySag = 2>> + <<set _slave.skill.vaginal = 50>> + <<set _slave.anus = 0>> + <<set _slave.hips = 0>> + <<set _slave.weight = -60>> + <<set _slave.waist = random(-30,-10)>> + <<set _slave.boobs = random(4,5)*100>> + <<set _slave.boobShape = "perky">> + <<run setHealth(_slave, jsRandom(-20, 10), undefined, undefined, undefined, 40)>> + <<set _slave.sexualFlaw = "hates penetration">> + <<set _slave.behavioralFlaw = "shamefast">> + <<set _slave.accent = 0>> <<case "liberator">> - -<<set $activeSlaveOneTimeMinAge = random(12,28)>> -<<set $activeSlaveOneTimeMaxAge = 43>> -<<set $oneTimeDisableDisability = 1>> -<<set $activeSlave = GenerateNewSlave("XX")>> -<<set $activeSlave.origin = "You sentenced $him to enslavement as a punishment for attempted theft of a slave.">> -<<set $activeSlave.career = "an antislavery activist">> -<<set $activeSlave.devotion = random(-75,-60)>> -<<set $activeSlave.trust = random(-15,0)>> -<<set $activeSlave.oldDevotion = $activeSlave.devotion>> -<<set $activeSlave.muscles = 50>> -<<set $activeSlave.weight = random(-20,30)>> -<<set $activeSlave.waist = random(-10,10)>> -<<set $activeSlave.skill.vaginal = 0>> -<<set $activeSlave.skill.oral = 0>> -<<set $activeSlave.skill.anal = 0>> -<<set $activeSlave.skill.whoring = 0>> -<<set $activeSlave.skill.combat = 1>> -<<set $activeSlave.anus = 0>> -<<run setHealth($activeSlave, jsRandom(60, 80), undefined, undefined, 0, 10)>> -<<set $activeSlave.behavioralFlaw = "arrogant">> -<<set $activeSlave.sexualFlaw = "hates men">> -<<set $activeSlave.hStyle = "shaved into a mohawk">> -<<set $activeSlave.custom.tattoo = "$He seems to have had slave tattoos at one time, but has had them cheaply removed.">> - + <<set _slave = GenerateNewSlave("XX", {disableDisability: 1, minAge: random(12, 28) , maxAge: 43})>> + <<set _slave.origin = "You sentenced $him to enslavement as a punishment for attempted theft of a slave.">> + <<set _slave.career = "an antislavery activist">> + <<set _slave.devotion = random(-75,-60)>> + <<set _slave.trust = random(-15,0)>> + <<set _slave.oldDevotion = _slave.devotion>> + <<set _slave.muscles = 50>> + <<set _slave.weight = random(-20,30)>> + <<set _slave.waist = random(-10,10)>> + <<set _slave.skill.vaginal = 0>> + <<set _slave.skill.oral = 0>> + <<set _slave.skill.anal = 0>> + <<set _slave.skill.whoring = 0>> + <<set _slave.skill.combat = 1>> + <<set _slave.anus = 0>> + <<run setHealth(_slave, jsRandom(60, 80), undefined, undefined, 0, 10)>> + <<set _slave.behavioralFlaw = "arrogant">> + <<set _slave.sexualFlaw = "hates men">> + <<set _slave.hStyle = "shaved into a mohawk">> + <<set _slave.custom.tattoo = "$He seems to have had slave tattoos at one time, but has had them cheaply removed.">> <<case "passfail">> - -<<set $oneTimeDisableDisability = 1>> -<<if $arcologies[0].FSSubjugationistLawME == 1>> - <<set _realRace = $arcologies[0].FSSubjugationistRace>> -<<elseif $arcologies[0].FSSupremacistLawME == 1>> - <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSupremacistRace)>> - <<set _realRace = _races.random()>> -<</if>> -<<set $fixedRace = _realRace>> -<<set $activeSlave = GenerateNewSlave()>> -<<set $activeSlave.origin = "You sentenced $him to enslavement as a punishment for defying local racial segregation laws.">> -<<set $activeSlave.career = App.Data.Careers.General.educated.random()>> -<<set $activeSlave.devotion = random(-75,-50)>> -<<set $activeSlave.trust = random(-75,-50)>> -<<set $activeSlave.oldDevotion = $activeSlave.devotion>> -<<run setHealth($activeSlave, jsRandom(-40, -20), undefined, undefined, 0, 10)>> -<<set $activeSlave.intelligence = random(51,95)>> -<<set $activeSlave.intelligenceImplant = 15>> -<<if $arcologies[0].FSSupremacistLawME == 1>> - <<set _fakeRace = $arcologies[0].FSSupremacistRace>> -<<elseif $arcologies[0].FSSubjugationistLawME == 1>> - <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> - <<set _fakeRace = _races.random()>> -<</if>> -<<set $activeSlave.race = _fakeRace>> -<<set $activeSlave.skin = randomRaceSkin(_fakeRace)>> -<<run setEyeColor($activeSlave, randomRaceEye(_fakeRace))>> -<<set $activeSlave.hColor = randomRaceHair(_fakeRace)>> -<<set $activeSlave.override_Race = 1, $activeSlave.override_Skin = 1, $activeSlave.override_H_Color = 1, $activeSlave.override_Eye_Color = 1>> - + <<set _pram = {disableDisability: 1}>> + <<if $arcologies[0].FSSubjugationistLawME === 1>> + <<set _pram.race = $arcologies[0].FSSubjugationistRace>> + <<elseif $arcologies[0].FSSupremacistLawME === 1>> + <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSupremacistRace)>> + <<set _pram.race = _races.random()>> + <</if>> + <<set _slave = GenerateNewSlave(null, _pram)>> + <<set _slave.origin = "You sentenced $him to enslavement as a punishment for defying local racial segregation laws.">> + <<set _slave.career = App.Data.Careers.General.educated.random()>> + <<set _slave.devotion = random(-75,-50)>> + <<set _slave.trust = random(-75,-50)>> + <<set _slave.oldDevotion = _slave.devotion>> + <<run setHealth(_slave, jsRandom(-40, -20), undefined, undefined, 0, 10)>> + <<set _slave.intelligence = random(51,95)>> + <<set _slave.intelligenceImplant = 15>> + <<if $arcologies[0].FSSupremacistLawME === 1>> + <<set _fakeRace = $arcologies[0].FSSupremacistRace>> + <<elseif $arcologies[0].FSSubjugationistLawME === 1>> + <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> + <<set _fakeRace = _races.random()>> + <</if>> + <<set _slave.race = _fakeRace>> + <<set _slave.skin = randomRaceSkin(_fakeRace)>> + <<run setEyeColor(_slave, randomRaceEye(_fakeRace))>> + <<set _slave.hColor = randomRaceHair(_fakeRace)>> + <<set _slave.override_Race = 1, _slave.override_Skin = 1, _slave.override_H_Color = 1, _slave.override_Eye_Color = 1>> <</switch>> -<<run App.Utils.setLocalPronouns($activeSlave)>> +<<run App.Utils.setLocalPronouns(_slave)>> -<<switch $malefactor>> +<<if ["addict", "escapee", "anchorBaby", "orphanloli", "businesswoman", "whore", "rapist", "mule"].includes($malefactor)>> + <<= capFirstChar($assistant.name)>> alerts you that a <<if $malefactor === "mule">>potential <</if>>criminal has been detected by your security systems and detained by the drones. Crime is extremely uncommon in your arcology, + <<if !["liberator", "passfail"].includes($malefactor)>> + since nothing can escape the notice of the omnipresent monitoring systems. + <</if>> +<</if>> +<<switch $malefactor>> <<case "addict">> - -<<= capFirstChar($assistant.name)>> alerts you that a criminal has been detected by your security systems and detained by the drones. Crime is extremely uncommon in your arcology, since nothing can escape the notice of the omnipresent monitoring systems. Criminals are usually either too angry, too ignorant, or too stupid to understand the impossibility of successful petty crime. This is the latter situation; a $girl suffering severe aphrodisiac withdrawal has attempted to break into a store that sells the stuff. $He's now lying <<if $seePee == 1>>in a pool of $his own urine<<else>>face-down on the pavement<</if>> with a taser round stuck in $his ass; the drone responsible is hovering helpfully nearby, hitting $him with another shock whenever $he does more than twitch. - + Criminals are usually either too angry, too ignorant, or too stupid to understand the impossibility of successful petty crime. This is the latter situation; a $girl suffering severe aphrodisiac withdrawal has attempted to break into a store that sells the stuff. $He's now lying <<if $seePee === 1>>in a pool of $his own urine<<else>>face-down on the pavement<</if>> with a taser round stuck in $his ass; the drone responsible is hovering helpfully nearby, hitting $him with another shock whenever $he does more than twitch. <<case "escapee">> - -<<= capFirstChar($assistant.name)>> alerts you that a criminal has been detected by your security systems and detained by the drones. Crime is extremely uncommon in your arcology, since nothing can escape the notice of the omnipresent monitoring systems. This is a simple case of vagrancy; sleeping on the streets (due to penury rather than inebriation) breaks an implicit contract all visitors to the arcology sign by coming here. The criminal is anything but usual, however. $He bears signs of extreme hormone manipulation over a long period, and has had $his Achilles tendons clipped. Camera records show $him crawling in with a cargo shipment. $He's clad in rags, and you cannot find any record of $him anywhere. The growing crowd is convinced $he's an escaped slave, and is growing ugly. - + This is a simple case of vagrancy; sleeping on the streets (due to penury rather than inebriation) breaks an implicit contract all visitors to the arcology sign by coming here. The criminal is anything but usual, however. $He bears signs of extreme hormone manipulation over a long period, and has had $his Achilles tendons clipped. Camera records show $him crawling in with a cargo shipment. $He's clad in rags, and you cannot find any record of $him anywhere. The growing crowd is convinced $he's an escaped slave, and is growing ugly. <<case "anchorBaby">> - -<<= capFirstChar($assistant.name)>> alerts you that a criminal has been detected by your security systems and is waiting detainment. Crime is extremely uncommon in your arcology, since nothing can escape the notice of the omnipresent monitoring systems. This is likely another case of attempted escape by a slave or potentially a smuggling operation. The cause of detection is a steady stream of moaning emanating from a cargo container recently deposited into the arcology's cargo depot and has attracted a crowd of curious onlookers. Video feeds show the container being open and a heavily pregnant <<if $activeSlave.physicalAge > 30>>$woman<<elseif $activeSlave.physicalAge > 19>>young $woman<<elseif $activeSlave.physicalAge > 12>>teenager<<else>>little $girl<</if>> staggering out while clutching a newborn to $his breast and struggling to hold back $his second child from being born. From what little language $he knows, $he seems to think that just giving birth in your arcology is enough to become a proper citizen; as expected, $he squats and pushes out the other brat as you arrive. The growing crowd is becoming unruly, and $his inability to speak the language isn't helping; things could get ugly at any moment and hinge entirely on your next move. - + This is likely another case of attempted escape by a slave or potentially a smuggling operation. The cause of detection is a steady stream of moaning emanating from a cargo container recently deposited into the arcology's cargo depot and has attracted a crowd of curious onlookers. Video feeds show the container being open and a heavily pregnant <<if _slave.physicalAge > 30>>$woman<<elseif _slave.physicalAge > 19>>young $woman<<elseif _slave.physicalAge > 12>>teenager<<else>>little $girl<</if>> staggering out while clutching a newborn to $his breast and struggling to hold back $his second child from being born. From what little language $he knows, $he seems to think that just giving birth in your arcology is enough to become a proper citizen; as expected, $he squats and pushes out the other brat as you arrive. The growing crowd is becoming unruly, and $his inability to speak the language isn't helping; things could get ugly at any moment and hinge entirely on your next move. <<case "orphanloli">> - -<<= capFirstChar($assistant.name)>> alerts you that a criminal has been detected by your security systems and detained by the drones. Crime is extremely uncommon in your arcology, since nothing can escape the notice of the omnipresent monitoring systems. This is a simple case of vagrancy; sleeping on the streets (due to penury rather than inebriation) breaks an implicit contract all visitors to the arcology sign by coming here. Several reports of petty theft were made in the area recently as well. The criminal is anything but usual, however. $He is very young, emaciated, and desperate. Camera records show $him crawling in through an air vent. $He's clad in rags, clutching a presumably stolen apple, and you cannot find any record of $him anywhere. The growing crowd is convinced $he's an escaped slave, and $his inability to speak the language isn't helping; things could get ugly at any moment and hinge entirely on your next move. - + This is a simple case of vagrancy; sleeping on the streets (due to penury rather than inebriation) breaks an implicit contract all visitors to the arcology sign by coming here. Several reports of petty theft were made in the area recently as well. The criminal is anything but usual, however. $He is very young, emaciated, and desperate. Camera records show $him crawling in through an air vent. $He's clad in rags, clutching a presumably stolen apple, and you cannot find any record of $him anywhere. The growing crowd is convinced $he's an escaped slave, and $his inability to speak the language isn't helping; things could get ugly at any moment and hinge entirely on your next move. <<case "businesswoman">> - -<<= capFirstChar($assistant.name)>> alerts you that a criminal has been detected by your security systems and detained by the drones. Crime is extremely uncommon in your arcology, since nothing can escape the notice of the omnipresent monitoring systems. Nevertheless, it seems one of your tenants, a hitherto well-respected business<<= $woman>>, has left the straight and narrow. It seems $his business affairs took a decisive turn for the worse, so $he attempted to drain $his clients' funds and leave your arcology before anyone was the wiser. Unfortunately for $him, your security drones, controlled by $assistant.name, were very much the wiser. <<= capFirstChar($assistant.name)>> has with machine efficiency compiled the completest proofs of corporate malfeasance you have ever seen. Your wretched tenant signed a contract with you that included provisions forbidding theft. $He is entirely at your mercy. - + Nevertheless, it seems one of your tenants, a hitherto well-respected business<<= $woman>>, has left the straight and narrow. It seems $his business affairs took a decisive turn for the worse, so $he attempted to drain $his clients' funds and leave your arcology before anyone was the wiser. Unfortunately for $him, your security drones, controlled by $assistant.name, were very much the wiser. <<= capFirstChar($assistant.name)>> has with machine efficiency compiled the completest proofs of corporate malfeasance you have ever seen. Your wretched tenant signed a contract with you that included provisions forbidding theft. $He is entirely at your mercy. <<case "whore">> - -<<= capFirstChar($assistant.name)>> alerts you that a criminal has been detected by your security systems and detained by the drones. Crime is extremely uncommon in your arcology, since nothing can escape the notice of the omnipresent monitoring systems. Nevertheless, it seems one of your tenants, a free whore, has been systematically stealing from clients. $He was furtive enough to get away with it for a time, but has now been caught red-handed. The john who caught $him attempted to stop $him, and $he fought him. Like many prostitutes $he carried a weapon in $his handbag, and the man is severely wounded. <<= capFirstChar($assistant.name)>> has with machine efficiency compiled a staggering dossier of video logs and personal testimony from previous customers who now understand where their personal belongings went, as well as appalling footage of today's victim's injuries. Your wretched tenant signed a contract with you that included provisions forbidding this kind of thing. $He is entirely at your mercy. - + Nevertheless, it seems one of your tenants, a free whore, has been systematically stealing from clients. $He was furtive enough to get away with it for a time, but has now been caught red-handed. The john who caught $him attempted to stop $him, and $he fought him. Like many prostitutes $he carried a weapon in $his handbag, and the man is severely wounded. <<= capFirstChar($assistant.name)>> has with machine efficiency compiled a staggering dossier of video logs and personal testimony from previous customers who now understand where their personal belongings went, as well as appalling footage of today's victim's injuries. Your wretched tenant signed a contract with you that included provisions forbidding this kind of thing. $He is entirely at your mercy. <<case "rapist">> - -<<= capFirstChar($assistant.name)>> alerts you that a criminal has been detected by your security systems and detained by the drones. Crime is extremely uncommon in your arcology, since nothing can escape the notice of the omnipresent monitoring systems. Nevertheless, it seems one of your tenants saw fit to rape a free woman. Within ten minutes, the inhuman efficiency of $assistant.name has compiled video recordings, physical evidence, and even the victim's testimony, which is quite consistent with the first two. Your wretched tenant signed a contract with you that included provisions forbidding this kind of thing. $He is entirely at your mercy. - + Nevertheless, it seems one of your tenants saw fit to rape a free woman. Within ten minutes, the inhuman efficiency of $assistant.name has compiled video recordings, physical evidence, and even the victim's testimony, which is quite consistent with the first two. Your wretched tenant signed a contract with you that included provisions forbidding this kind of thing. $He is entirely at your mercy. <<case "mule">> - -<<= capFirstChar($assistant.name)>> alerts you that a potential criminal has been detected by your security systems and is now being tailed by the drones. Crime is extremely uncommon in your arcology, since nothing can escape the notice of the omnipresent monitoring systems, but some individuals still make attempts to fool them. In this case, the cameras are fixed on a clearly pregnant, and hugely at that, $woman as $he works $his way through the crowded market sectors. You watch as $he repeatedly bumps into other patrons and stalls, pausing to apologize before proceeding on $his way, as if $he wasn't familiar with $his gravid swell. $His body is also clearly underdeveloped for someone ready to drop quadruplets at any moment; thin, with barely any hips to speak of and a pert bust clearly not swollen with milk. $He even walks like a $woman not burdened with nine months of gestating multiples, let alone a single. As $he stumbles under $his own weight, $his shirt rides up, giving you a clear view of the deep red stretch marks of a belly that grew far faster than it could handle. You've seen enough and order the drones to corral $him until security arrives. $His expression shifts from fear as they encircle $him to panic as a groan escapes $his lips. $He grabs $his stomach as a capsule falls to the floor. As another contraction hits $him, $he drops to the ground and begins to "give birth" to $his illegal cargo. -<<if $bellyImplants == 1>> - $He likely has belly implant designed to carry foreign objects inside $his womb and, having lost $his composure, is now vacating its contents. -<<else>> - You have no idea what you are witnessing until <<if $assistant.name == "your personal assistant">>your personal assistant pulls up an advertisement for a fillable womb located implant<<else>>$assistant.name introduces you to a fillable womb located implant<</if>> that $he likely has installed. -<</if>> -$He is easily taken into custody and $his contraband confiscated once the jeering crowd is dispersed enough to reach $him. - + However some individuals still make attempts to fool them. In this case, the cameras are fixed on a clearly pregnant, and hugely at that, $woman as $he works $his way through the crowded market sectors. You watch as $he repeatedly bumps into other patrons and stalls, pausing to apologize before proceeding on $his way, as if $he wasn't familiar with $his gravid swell. $His body is also clearly underdeveloped for someone ready to drop quadruplets at any moment; thin, with barely any hips to speak of and a pert bust clearly not swollen with milk. $He even walks like a $woman not burdened with nine months of gestating multiples, let alone a single. As $he stumbles under $his own weight, $his shirt rides up, giving you a clear view of the deep red stretch marks of a belly that grew far faster than it could handle. You've seen enough and order the drones to corral $him until security arrives. $His expression shifts from fear as they encircle $him to panic as a groan escapes $his lips. $He grabs $his stomach as a capsule falls to the floor. As another contraction hits $him, $he drops to the ground and begins to "give birth" to $his illegal cargo. + <<if $bellyImplants === 1>> + $He likely has a belly implant designed to carry foreign objects inside $his womb and, having lost $his composure, is now vacating its contents. + <<else>> + You have no idea what you are witnessing until <<if $assistant.name === "your personal assistant">>your personal assistant pulls up an advertisement for a fillable womb located implant<<else>>$assistant.name introduces you to a fillable womb located implant<</if>> that $he likely has installed. + <</if>> + $He is easily taken into custody and $his contraband confiscated once the jeering crowd is dispersed enough to reach $him. <<case "liberator">> - -<<setNonlocalPronouns $seeDicks>> -<<= capFirstChar($assistant.name)>> alerts you that a criminal has been detected by your security systems and detained by the drones. Crime is extremely uncommon in your arcology, but this is a special case. A well-muscled, well-armed $woman was caught attempting to smuggle a slave owned by one of your tenants out of the arcology. Though the slave surrendered immediately (and will be dealt with by _hisU owner), the would-be liberatrix was caught by your security drones. $He destroyed two of them and caused @@.red;other minor damage@@<<run cashX(forceNeg(1000), "event", $activeSlave)>> that will require a small sum to repair, but was eventually subdued. The drones had to expend a great deal of nonlethal ordnance to bring $him down and keep $him down, but $he is now entirely at your mercy. - + <<setNonlocalPronouns $seeDicks>> + but this is a special case. A well-muscled, well-armed $woman was caught attempting to smuggle a slave owned by one of your tenants out of the arcology. Though the slave surrendered immediately (and will be dealt with by _hisU owner), the would-be liberatrix was caught by your security drones. $He destroyed two of them and caused @@.red;other minor damage@@<<run cashX(forceNeg(1000), "event", _slave)>> that will require a small sum to repair, but was eventually subdued. The drones had to expend a great deal of nonlethal ordnance to bring $him down and keep $him down, but $he is now entirely at your mercy. <<case "passfail">> - -<<= capFirstChar($assistant.name)>> alerts you that a criminal has been detected by your security systems and detained by the drones. Crime is extremely uncommon in your arcology, since nothing can escape the notice of the omnipresent monitoring systems. Nevertheless, it seems one of your tenants, a rather ordinary white collar worker, has been severely wounded in a freak industrial accident, to the point that a blood transfusion was needed. In the course of doing so, an arcology hospital's autosurgery noted several genetic discrepancies and alerted a few nearby drones. Simply put, while the $woman appears to be a normal _fakeRace $woman, this is the result of numerous cosmetic surgeries; $he is actually _realRace. The laws of your arcology hold that members of the _realRace race are fit only for slavery, quite unlike the superior _fakeRace people. That a _realRace $girl would gain a position of relatively high class and power through such deception and fraud is considered an outrage by many of your citizens, and so $he was placed under arrest before $he even awoke from surgery. $He is now entirely at your mercy. - + since nothing can escape the notice of the omnipresent monitoring systems. Nevertheless, it seems one of your tenants, a rather ordinary white collar worker, has been severely wounded in a freak industrial accident, to the point that a blood transfusion was needed. In the course of doing so, an arcology hospital's autosurgery noted several genetic discrepancies and alerted a few nearby drones. Simply put, while the $woman appears to be a normal _fakeRace $woman, this is the result of numerous cosmetic surgeries; $he is actually _realRace. The laws of your arcology hold that members of the _realRace race are fit only for slavery, quite unlike the superior _fakeRace people. That a _realRace $girl would gain a position of relatively high class and power through such deception and fraud is considered an outrage by many of your citizens, and so $he was placed under arrest before $he even awoke from surgery. $He is now entirely at your mercy. <</switch>> -<br><br> - <<set _ContractCost = 1000>> -<<set _slaveCost = slaveCost($activeSlave)>> +<<set _slaveCost = slaveCost(_slave)>> <<set _slaveCost -= 1000>> -//Applying enslavement as punishment will cost <<print cashFormat(_ContractCost)>>. Doing so and then selling $him immediately will bring in approximately <<print cashFormat(_slaveCost)>>.// +<br><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><br> <<includeDOM App.Desc.longSlave(_slave, {market: "generic"})>> <br><br> - -<<includeDOM App.Desc.longSlave(V.activeSlave, {market: "generic"})>> - -<br><br> - <span id="result"> <<if $cash >= _ContractCost>> <<link "Enslave $him">> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", $activeSlave)>> + <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _slave)>> <<replace "#result">> <<switch $malefactor>> <<case "addict">> @@ -411,61 +353,61 @@ $He is easily taken into custody and $his contraband confiscated once the jeerin <<case "liberator">> You complete the legalities and biometric scanning quickly and cautiously. Though the would-be liberator is of course restrained, disarmed, and still sedated, $he could awake at any time. Based on the drone logs, $he is likely to be violent when $he does. <</switch>> - <<includeDOM App.UI.newSlaveIntro($activeSlave)>> + <<includeDOM App.UI.newSlaveIntro(_slave)>> <</replace>> <</link>> <br><<link "Sentence $him to a day in the stocks, then enslave $him">> - <<run healthDamage($activeSlave, 10)>> - <<set $activeSlave.behavioralFlaw = "odd">> - <<set $activeSlave.sexualFlaw = "hates penetration">> - <<set $activeSlave.anus = 2>> + <<run healthDamage(_slave, 10)>> + <<set _slave.behavioralFlaw = "odd">> + <<set _slave.sexualFlaw = "hates penetration">> + <<set _slave.anus = 2>> <<set _fuckCount = random(20,35)>> - <<run seX($activeSlave, "anal", "public", "penetrative", _fuckCount)>> - <<if $activeSlave.vagina > -1>> - <<if $activeSlave.vagina < 2>> - <<set $activeSlave.vagina = 2>> + <<run seX(_slave, "anal", "public", "penetrative", _fuckCount)>> + <<if _slave.vagina > -1>> + <<if _slave.vagina < 2>> + <<set _slave.vagina = 2>> <</if>> - <<if isFertile($activeSlave) && $activeSlave.eggType == "human">> - <<= knockMeUp($activeSlave, 40, 2, -2)>> + <<if isFertile(_slave) && _slave.eggType === "human">> + <<= knockMeUp(_slave, 40, 2, -2)>> <</if>> - <<run seX($activeSlave, "vaginal", "public", "penetrative", _fuckCount*2)>> + <<run seX(_slave, "vaginal", "public", "penetrative", _fuckCount*2)>> <</if>> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", $activeSlave)>> + <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _slave)>> <<replace "#result">> <<switch $malefactor>> <<case "addict">> - You declare $his holes fair game for the entire arcology, since $he must somehow repay $his debt to society. $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 $activeSlave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ + You declare $his holes fair game for the entire arcology, since $he must somehow repay $his debt to society. $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 _slave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ <<case "escapee">> - You declare $his holes fair game for the entire arcology, so that all free citizens can own $him for a moment, if they wish. $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 $activeSlave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ + You declare $his holes fair game for the entire arcology, so that all free citizens can own $him for a moment, if they wish. $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 _slave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ <<case "orphanloli">> - You declare $his holes fair game for the entire arcology, so that all free citizens can own $him for a moment, if they wish. $He spends a torturous day in the stocks before being hauled in for enslavement, @@.health.dec;completely broken@@ due to $his ordeal, bruises all over $his body, cum leaking from $his @@.lime;loosened@@ anus<<if $activeSlave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ - <<set $activeSlave.fetish = "mindbroken">> + You declare $his holes fair game for the entire arcology, so that all free citizens can own $him for a moment, if they wish. $He spends a torturous day in the stocks before being hauled in for enslavement, @@.health.dec;completely broken@@ due to $his ordeal, bruises all over $his body, cum leaking from $his @@.lime;loosened@@ anus<<if _slave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ + <<set _slave.fetish = "mindbroken">> <<case "anchorBaby">> - You declare $his holes fair game for the entire arcology; since $he wants to produce future slaves, your arcology might as well have the privilege of fathering them. $He spends a torturous day in the stocks after $his children are taken to a slave orphanage 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 $activeSlave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ + You declare $his holes fair game for the entire arcology; since $he wants to produce future slaves, your arcology might as well have the privilege of fathering them. $He spends a torturous day in the stocks after $his children are taken to a slave orphanage 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 _slave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ <<case "businesswoman">> - You declare $his holes fair game for the entire arcology, in payment for $his crimes. $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 $activeSlave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ + You declare $his holes fair game for the entire arcology, in payment for $his crimes. $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 _slave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ <<case "whore">> - You declare $his holes fair game for the entire arcology, to repay $his thefts. $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 $activeSlave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ + You declare $his holes fair game for the entire arcology, to repay $his thefts. $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 _slave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ <<case "rapist">> - 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 $activeSlave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ + 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 _slave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ <<case "mule">> - You declare $his holes fair game for the entire arcology as punishment for trying to smuggle in a load instead of taking one. $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 $activeSlave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ + You declare $his holes fair game for the entire arcology as punishment for trying to smuggle in a load instead of taking one. $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 _slave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ <<case "liberator">> - Slaveownership is the cornerstone of the society you're building in your arcology, and this $woman attempted to undermine it. $His holes are thus 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 $activeSlave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun,@@ and small slaveholders are @@.green;encouraged to do business with your arcology@@ after word of the incident gets around. + Slaveownership is the cornerstone of the society you're building in your arcology, and this $woman attempted to undermine it. $His holes are thus 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 _slave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun,@@ and small slaveholders are @@.green;encouraged to do business with your arcology@@ after word of the incident gets around. <<case "passfail">> - You declare $his holes fair game for the entire arcology; after all, $he did want to be around lots of _fakeRace people, didn't $he? $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 $activeSlave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ + You declare $his holes fair game for the entire arcology; after all, $he did want to be around lots of _fakeRace people, didn't $he? $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 _slave.vagina > -1>> and @@.lime;fucked-out@@ pussy<</if>>. The public @@.green;enjoys the fun.@@ <</switch>> - <<run repX(500, "event", $activeSlave)>> + <<run repX(500, "event", _slave)>> <<set $arcologies[0].prosperity += 2>> - <<includeDOM App.UI.newSlaveIntro($activeSlave)>> + <<includeDOM App.UI.newSlaveIntro(_slave)>> <</replace>> <</link>> <<if $arcade > 0>> <br><<link "Enslave $him and sentence $him to a month in the arcade">> - <<= assignJob($activeSlave, "be confined in the arcade")>> - <<set $activeSlave.choosesOwnAssignment = 0>> - <<set $activeSlave.sentence = 4>> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", $activeSlave)>> + <<= assignJob(_slave, "be confined in the arcade")>> + <<set _slave.choosesOwnAssignment = 0>> + <<set _slave.sentence = 4>> + <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _slave)>> <<replace "#result">> <<switch $malefactor>> <<case "addict">> @@ -479,40 +421,40 @@ $He is easily taken into custody and $his contraband confiscated once the jeerin <<case "liberator">> You complete the legalities and biometric scanning quickly and cautiously. Though the would-be liberator is of course restrained, disarmed, and still sedated, $he could awake at any time. It would be best to have $him restrained for public use in the arcade first. The public @@.green;looks forward@@ to seeing $him there. <</switch>> - <<run repX(250, "event", $activeSlave)>> - <<run newSlave($activeSlave)>> /* skip New Slave Intro */ + <<run repX(250, "event", _slave)>> + <<run newSlave(_slave)>> /* skip New Slave Intro */ <</replace>> <</link>> <</if>> - <<if $malefactor != "mule">> + <<if $malefactor !== "mule">> <<if $dairy > 0>> <<if $dairyRestraintsSetting > 1>> <br><<link "Enslave $him and send $him straight to the industrial dairy">> - <<= assignJob($activeSlave, "work in the dairy")>> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", $activeSlave)>> + <<= assignJob(_slave, "work in the dairy")>> + <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _slave)>> <<replace "#result">> <<switch $malefactor>> <<case "addict">> - You complete the legalities and biometric scanning quickly and cautiously. The condemned accepts a sedative, thinking it's aphrodisiacs, and $his unconscious body is installed in $dairyName. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the addict's <<if $dairyStimulatorsSetting > 1>>agony as $his anus adapts to accommodate rectal dildo hydration<<elseif ($dairyPregSetting > 1) && ($activeSlave.vagina > 0)>>discomfort as $his pussy adapts to industrial reproduction<<else>>breasts as they are roughly milked<</if>>, together with a lengthy report on the experimental detox process used to ensure that the milk $he produces will be untainted. + You complete the legalities and biometric scanning quickly and cautiously. The condemned accepts a sedative, thinking it's aphrodisiacs, and $his unconscious body is installed in $dairyName. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the addict's <<if $dairyStimulatorsSetting > 1>>agony as $his anus adapts to accommodate rectal dildo hydration<<elseif ($dairyPregSetting > 1) && (_slave.vagina > 0)>>discomfort as $his pussy adapts to industrial reproduction<<else>>breasts as they are roughly milked<</if>>, together with a lengthy report on the experimental detox process used to ensure that the milk $he produces will be untainted. <<case "escapee">> - You complete the legalities and biometric scanning quickly. The condemned is too far gone to resist as $he is installed in $dairyName. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the escapee's <<if $dairyStimulatorsSetting > 1>>agony as $his anus adapts to accommodate rectal dildo hydration<<elseif ($dairyPregSetting > 1) && ($activeSlave.vagina > 0)>>discomfort as $his pussy adapts to industrial reproduction<<else>>breasts as they are roughly milked<</if>>. + You complete the legalities and biometric scanning quickly. The condemned is too far gone to resist as $he is installed in $dairyName. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the escapee's <<if $dairyStimulatorsSetting > 1>>agony as $his anus adapts to accommodate rectal dildo hydration<<elseif ($dairyPregSetting > 1) && (_slave.vagina > 0)>>discomfort as $his pussy adapts to industrial reproduction<<else>>breasts as they are roughly milked<</if>>. <<case "orphanloli">> - You complete the legalities and biometric scanning quickly. The condemned is too weak to resist as $he is installed in $dairyName but $he weeps the entire time. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the escapee's <<if $dairyStimulatorsSetting > 1>>agony as $his anus adapts to accommodate rectal dildo hydration<<elseif ($dairyPregSetting > 1) && ($activeSlave.vagina > 0)>>agony as $his once tight pussy adapts to industrial reproduction<<else>>budding breasts as they are roughly milked<</if>>. + You complete the legalities and biometric scanning quickly. The condemned is too weak to resist as $he is installed in $dairyName but $he weeps the entire time. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the escapee's <<if $dairyStimulatorsSetting > 1>>agony as $his anus adapts to accommodate rectal dildo hydration<<elseif ($dairyPregSetting > 1) && (_slave.vagina > 0)>>agony as $his once tight pussy adapts to industrial reproduction<<else>>budding breasts as they are roughly milked<</if>>. <<case "anchorBaby">> - You complete the legalities and biometric scanning quickly and cautiously before having $his children taken away. The condemned resists installation in $dairyName with energy born of desperation. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the criminal's <<if ($dairyPregSetting > 1) && ($activeSlave.vagina > 0)>>discomfort as $his pussy adapts to industrial reproduction, along with a prospectus detailing the scheduled sale of $his next batch of slave product in eighteen years and nine months<<elseif $dairyStimulatorsSetting > 1>>agony as $his anus adapts to accommodate rectal dildo hydration<<else>>breasts as they are roughly milked<</if>>. + You complete the legalities and biometric scanning quickly and cautiously before having $his children taken away. The condemned resists installation in $dairyName with energy born of desperation. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the criminal's <<if ($dairyPregSetting > 1) && (_slave.vagina > 0)>>discomfort as $his pussy adapts to industrial reproduction, along with a prospectus detailing the scheduled sale of $his next batch of slave product in eighteen years and nine months<<elseif $dairyStimulatorsSetting > 1>>agony as $his anus adapts to accommodate rectal dildo hydration<<else>>breasts as they are roughly milked<</if>>. <<case "businesswoman">> - You complete the legalities and biometric scanning quickly and cautiously. The condemned resists installation in $dairyName with energy born of desperation. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the criminal's <<if ($dairyPregSetting > 1) && ($activeSlave.vagina > 0)>>discomfort as $his pussy adapts to industrial reproduction, along with a prospectus detailing the scheduled sale of $his first slave product in eighteen years and nine months<<elseif $dairyStimulatorsSetting > 1>>agony as $his anus adapts to accommodate rectal dildo hydration<<else>>breasts as they are roughly milked<</if>>. + You complete the legalities and biometric scanning quickly and cautiously. The condemned resists installation in $dairyName with energy born of desperation. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the criminal's <<if ($dairyPregSetting > 1) && (_slave.vagina > 0)>>discomfort as $his pussy adapts to industrial reproduction, along with a prospectus detailing the scheduled sale of $his first slave product in eighteen years and nine months<<elseif $dairyStimulatorsSetting > 1>>agony as $his anus adapts to accommodate rectal dildo hydration<<else>>breasts as they are roughly milked<</if>>. <<case "whore">> - You complete the legalities and biometric scanning quickly and cautiously. The condemned resists installation in $dairyName with energy born of desperation. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the criminal's <<if ($dairyPregSetting > 1) && ($activeSlave.vagina > 0)>>discomfort as $his well-traveled pussy adapts to industrial reproduction<<elseif $dairyStimulatorsSetting > 1>>discomfort as $his well-traveled anus adapts to accommodate rectal dildo hydration<<else>>breasts as they are roughly milked<</if>>. + You complete the legalities and biometric scanning quickly and cautiously. The condemned resists installation in $dairyName with energy born of desperation. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the criminal's <<if ($dairyPregSetting > 1) && (_slave.vagina > 0)>>discomfort as $his well-traveled pussy adapts to industrial reproduction<<elseif $dairyStimulatorsSetting > 1>>discomfort as $his well-traveled anus adapts to accommodate rectal dildo hydration<<else>>breasts as they are roughly milked<</if>>. <<case "rapist">> You complete the legalities and biometric scanning quickly and cautiously. The condemned resists installation in $dairyName with energy born of desperation. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the rapist's <<if $dairyStimulatorsSetting > 1>>agony as $his anus adapts to accommodate rectal dildo hydration<<else>>newly growing breasts as they are roughly milked<</if>>. <<case "liberator">> - You complete the legalities and biometric scanning quickly and cautiously. The condemned resists installation in $dairyName with energy born of desperation. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the criminal's <<if ($dairyPregSetting > 1) && ($activeSlave.vagina > 0)>>discomfort as $his pussy adapts to industrial reproduction<<elseif $dairyStimulatorsSetting > 1>>discomfort as $his anus adapts to accommodate rectal dildo hydration<<else>>breasts as they are roughly milked<</if>>, together with a report on the likely productivity of such a fit body capable of withstanding the stress of high throughput. + You complete the legalities and biometric scanning quickly and cautiously. The condemned resists installation in $dairyName with energy born of desperation. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the criminal's <<if ($dairyPregSetting > 1) && (_slave.vagina > 0)>>discomfort as $his pussy adapts to industrial reproduction<<elseif $dairyStimulatorsSetting > 1>>discomfort as $his anus adapts to accommodate rectal dildo hydration<<else>>breasts as they are roughly milked<</if>>, together with a report on the likely productivity of such a fit body capable of withstanding the stress of high throughput. <<case "passfail">> - You complete the legalities and biometric scanning quickly. The condemned is too weak to resist as $he is installed in $dairyName but $he weeps the entire time. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the criminal's <<if ($dairyPregSetting > 1) && ($activeSlave.vagina > 0)>>discomfort as $his pussy adapts to industrial reproduction<<elseif $dairyStimulatorsSetting > 1>>discomfort as $his anus adapts to accommodate rectal dildo hydration<<else>>breasts as they are roughly milked<</if>>. + You complete the legalities and biometric scanning quickly. The condemned is too weak to resist as $he is installed in $dairyName but $he weeps the entire time. The public @@.green;accepts@@ this as an appropriate punishment, especially when you release footage of the criminal's <<if ($dairyPregSetting > 1) && (_slave.vagina > 0)>>discomfort as $his pussy adapts to industrial reproduction<<elseif $dairyStimulatorsSetting > 1>>discomfort as $his anus adapts to accommodate rectal dildo hydration<<else>>breasts as they are roughly milked<</if>>. <</switch>> - <<run repX(250, "event", $activeSlave)>> - <<run newSlave($activeSlave)>> /* skip New Slave Intro */ + <<run repX(250, "event", _slave)>> + <<run newSlave(_slave)>> /* skip New Slave Intro */ <</replace>> <</link>> <</if>> @@ -520,10 +462,10 @@ $He is easily taken into custody and $his contraband confiscated once the jeerin <</if>> <<if $seeExtreme > 0>> <br><<link "Punitively amputate $his limbs, and then enslave $him">> - <<run healthDamage($activeSlave, 20)>> - <<run removeLimbs($activeSlave, "all")>> - <<set $activeSlave.behavioralFlaw = "odd">> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", $activeSlave)>> + <<run healthDamage(_slave, 20)>> + <<run removeLimbs(_slave, "all")>> + <<set _slave.behavioralFlaw = "odd">> + <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _slave)>> <<replace "#result">> <<switch $malefactor>> <<case "addict">> @@ -547,61 +489,61 @@ $He is easily taken into custody and $his contraband confiscated once the jeerin <<case "passfail">> An example must be made. The citizens of your arcology must be assured that the racially inferior will not try to rise above their station, no matter their deceptions. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. $He begs and pleads until $he sees $his doom in the form of the surgical machinery, at which point $he switches to fighting vainly to escape. Of course, @@.health.dec;$his health is affected@@ and the horrible experience has left $him @@.red;acting oddly.@@ Then it's off to the penthouse for basic slave induction. The public @@.green;approves of this harshness.@@ <</switch>> - <<run repX(500, "event", $activeSlave)>> - <<includeDOM App.UI.newSlaveIntro($activeSlave)>> + <<run repX(500, "event", _slave)>> + <<includeDOM App.UI.newSlaveIntro(_slave)>> <</replace>> <</link>> - <<if $malefactor == "rapist" && $activeSlave.balls > 0>> + <<if $malefactor === "rapist" && _slave.balls > 0>> <br><<link "Enslave the criminal and geld $him">> - <<run healthDamage($activeSlave, 20)>> - <<set $activeSlave.balls = 0>> - <<set $activeSlave.devotion -= 25>> - <<set $activeSlave.trust -= 25>> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", $activeSlave)>> + <<run healthDamage(_slave, 20)>> + <<set _slave.balls = 0>> + <<set _slave.devotion -= 25>> + <<set _slave.trust -= 25>> + <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _slave)>> <<replace "#result">> Video feeds from your remote surgery are made public as the protesting criminal is strapped down and gelded. $He is so utterly broken by this turn of events that you complete the legalities and biometric scanning without fuss. The condemned sobs weakly throughout the process until you grow tired of the whining and apply punishment. Then it's off to the penthouse for basic slave induction. The public @@.green;approves of this harshness,@@ which increases your arcology's prosperity by @@.green;giving it a reputation for swift and terrible justice.@@ - <<run repX(500, "event", $activeSlave)>> + <<run repX(500, "event", _slave)>> <<set $arcologies[0].prosperity += 10>> - <<includeDOM App.UI.newSlaveIntro($activeSlave)>> + <<includeDOM App.UI.newSlaveIntro(_slave)>> <</replace>> <</link>> <</if>> <</if>> /* closes seeExtreme */ - <<if $malefactor == "orphanloli">> + <<if $malefactor === "orphanloli">> <br><<link "'Adopt' $him">> - <<set $activeSlave.devotion = 25>> - <<set $activeSlave.trust = 25>> - <<set $activeSlave.origin = "$He was an orphan forced to live and steal on the streets until you adopted $him.">> - <<run cashX(forceNeg(_ContractCost), "slaveTransfer", $activeSlave)>> + <<set _slave.devotion = 25>> + <<set _slave.trust = 25>> + <<set _slave.origin = "$He was an orphan forced to live and steal on the streets until you adopted $him.">> + <<run cashX(forceNeg(_ContractCost), "slaveTransfer", _slave)>> <<replace "#result">> You sit down and talk to the exhausted $girl, handing $him a contract cleverly altered to resemble adoption papers. Once $he comprehends what $he is looking at, $he eagerly signs it. Only once $he has reached the penthouse and been introduced to the slave life does $he realize $he willingly signed away $his freedom. Though $he can't complain. A warm cot and plenty of food await, which to $him is a huge improvement over a slow death on the streets. The public <<if $arcologies[0].FSPaternalist != "unset">> @@.green;is impressed by your act,@@ even if it is a trick. - <<run repX(500, "event", $activeSlave)>> + <<run repX(500, "event", _slave)>> <<else>> @@.red;feels you let this criminal off too easy.@@ - <<run repX(forceNeg(100), "event", $activeSlave)>> + <<run repX(forceNeg(100), "event", _slave)>> <</if>> - <<includeDOM App.UI.newSlaveIntro($activeSlave)>> + <<includeDOM App.UI.newSlaveIntro(_slave)>> <</replace>> <</link>> <</if>> <<else>> //You lack the necessary funds to enslave $him.// <</if>> - <<if $malefactor == "anchorBaby">> + <<if $malefactor === "anchorBaby">> <br><<link "Grant $him citizenship">> <<replace "#result">> - You help the exhausted mother to $his feet and hand $him $his second newborn. $He watches you, uncertain of your motives, until you have $him escorted to the proper welcoming facility and put in a good word for having $him added to your arcology's free population. You announce to the public that such a fertile <<if $activeSlave.physicalAge > 30>>MILF<<elseif $activeSlave.physicalAge > 19>>$woman<<elseif $activeSlave.physicalAge > 12>>teen<<else>>youth<</if>> will be a boon to <<if $arcologies[0].FSRepopulationFocus != "unset">>Repopulationism<<else>>society<</if>>, and that the contract $he is signing mandates $he be on powerful fertility agents whenever $he isn't pregnant. During $his residency, free or not, $he will provide society with dozens of future children. The public + You help the exhausted mother to $his feet and hand $him $his second newborn. $He watches you, uncertain of your motives, until you have $him escorted to the proper welcoming facility and put in a good word for having $him added to your arcology's free population. You announce to the public that such a fertile <<if _slave.physicalAge > 30>>MILF<<elseif _slave.physicalAge > 19>>$woman<<elseif _slave.physicalAge > 12>>teen<<else>>youth<</if>> will be a boon to <<if $arcologies[0].FSRepopulationFocus != "unset">>Repopulationism<<else>>society<</if>>, and that the contract $he is signing mandates $he be on powerful fertility agents whenever $he isn't pregnant. During $his residency, free or not, $he will provide society with dozens of future children. The public <<if $arcologies[0].FSRepopulationFocus != "unset">> @@.green;approves of breeders, free or not,@@ and word spreads that any and all mothers are welcome into your arcology @@.green;adding to its prosperity.@@ - <<run repX(500, "event", $activeSlave)>> + <<run repX(500, "event", _slave)>> <<elseif $arcologies[0].FSPaternalist != "unset">> @@.green;sympathizes with your charity.@@ - <<run repX(100, "event", $activeSlave)>> + <<run repX(100, "event", _slave)>> <<else>> @@.red;feels you let this criminal off too easy.@@ - <<run repX(forceNeg(100), "event", $activeSlave)>> + <<run repX(forceNeg(100), "event", _slave)>> <</if>> <</replace>> <</link>> @@ -626,21 +568,21 @@ $He is easily taken into custody and $his contraband confiscated once the jeerin <<case "liberator">> An example must be made. Slaveownership is the cornerstone of the society you're building in your arcology, and this $woman attempted to undermine it. The protesting bitch is stripped and flogged on the promenade before being escorted bleeding from the arcology. The public @@.green;approves of this harshness.@@ <</switch>> - <<run repX(500, "event", $activeSlave)>> + <<run repX(500, "event", _slave)>> <</replace>> <</link>> - <<if $malefactor == "liberator">> + <<if $malefactor === "liberator">> <br><<link "Permit the slaveowner $he tried to steal from to flog $him">> <<replace "#result">> An example must be made. Slaveownership is the cornerstone of the society you're building in your arcology, and this $woman attempted to undermine it. $He is stripped and the slaveowner whose property $he tried to free is handed the leathern instrument. It seems the escapee was a favorite he does not wish to mangle, so he flogs the criminal mercilessly instead. $He is flung out of the arcology, nearly dead. The public @@.green;approves of this harshness,@@ and small slaveholders are @@.green;encouraged to do business with your arcology@@ after word of the incident gets around. - <<run repX(500, "event", $activeSlave)>> + <<run repX(500, "event", _slave)>> <<set $arcologies[0].prosperity += 10>> <</replace>> <</link>> <</if>> <br><<link "Sell $him immediately">> <<run cashX(_slaveCost, "slaveTransfer")>> - <<if $cash4Babies == 1 && $malefactor == "anchorBaby">> + <<if $cash4Babies === 1 && $malefactor === "anchorBaby">> <<run cashX(random(20,30), "slaveTransfer")>> <</if>> <<replace "#result">> @@ -652,7 +594,7 @@ $He is easily taken into custody and $his contraband confiscated once the jeerin <<case "orphanloli">> You complete the legalities and biometric scanning quickly and without fuss. $He sobs throughout the process, though stops once $he realizes being a slave means free food. $He starts crying again once $he realizes $he is heading for the slave markets. <<case "anchorBaby">> - You complete the legalities and biometric scanning quickly and without fuss. The condemned sobs and begs throughout the process until you grow tired of the whining and apply punishment. Then it's off to slave markets for sale. $His children <<if $cash4Babies == 1>>head off to be sold as well<<else>>will be sent to a slave orphanage for future sale<</if>>. + You complete the legalities and biometric scanning quickly and without fuss. The condemned sobs and begs throughout the process until you grow tired of the whining and apply punishment. Then it's off to slave markets for sale. $His children <<if $cash4Babies === 1>>head off to be sold as well<<else>>will be sent to a slave orphanage for future sale<</if>>. <<case "businesswoman" "mule" "passfail" "rapist" "whore">> You complete the legalities and biometric scanning quickly and without fuss. The condemned sobs and begs throughout the process until you grow tired of the whining and apply punishment. Then it's off to slave markets for sale. <<case "liberator">> @@ -660,4 +602,4 @@ $He is easily taken into custody and $his contraband confiscated once the jeerin <</switch>> <</replace>> <</link>> -</span> +</span> \ No newline at end of file diff --git a/src/uncategorized/resFailure.tw b/src/uncategorized/resFailure.tw index 9e0239302b3c79b3dcf6e88eea3fd801050e5c04..d69dc78e57ba8540e329c8c18fbf88caa08e751d 100644 --- a/src/uncategorized/resFailure.tw +++ b/src/uncategorized/resFailure.tw @@ -565,7 +565,7 @@ <</if>> <<if _slave.foreskin > 0>> <<set _slave.foreskin = _slave.dick>> <</if>> <<set _slave.preg = -3>> - <<if $TFS.farmUpgrade != 0>> + <<if $TFS.farmUpgrade > 0>> <<set _slave.ovaries = 1>> <<if $TFS.farmUpgrade >= 2>> <<set _slave.preg = random(1,41)>> @@ -641,7 +641,7 @@ <<set _slave.anus = 3>> <<set _slave.fetish = "dom">> <<set _slave.preg = -3>> - <<if $TFS.farmUpgrade != 0>> + <<if $TFS.farmUpgrade > 0>> <<set _slave.ovaries = 1>> <<if $TFS.farmUpgrade >= 2>> <<set _slave.preg = random(1,41)>> diff --git a/src/uncategorized/salon.tw b/src/uncategorized/salon.tw deleted file mode 100644 index 40e4e8d6b826fff50902559e31453a202499bee5..0000000000000000000000000000000000000000 --- a/src/uncategorized/salon.tw +++ /dev/null @@ -1,551 +0,0 @@ -:: Salon [nobr jump-from-safe] - -<<set $nextButton = "Confirm changes", $nextLink = "Slave Interact", $encyclopedia = "The Auto Salon">> -<<run App.Utils.setLocalPronouns(getSlave($AS))>> - -<<if $showInches == 2>> - <<set _oldHLength = Math.round(getSlave($AS).hLength/2.54), _newHLength = 0>> -<<else>> - <<set _oldHLength = getSlave($AS).hLength, _newHLength = 0>> -<</if>> - -<h1>The Auto Salon</h1> - -<span class="note"> - <<= getSlave($AS).slaveName>> is seated in the auto salon. $He is awaiting your artistic pleasure. -</span> - -/* 000-250-006 */ -<span id="art-frame"> - <<if $seeImages == 1>> - <<if $imageChoice == 1>> - <div class="imageRef lrgVector"><div class="mask"> </div><<= SlaveArt(getSlave($AS), 3, 0)>></div> - <<else>> - <div class="imageRef lrgRender"><div class="mask"> </div><<= SlaveArt(getSlave($AS), 3, 0)>></div> - <</if>> - <</if>> -</span> -/* 000-250-006 */ - -/* EYES */ - -<h3>Eyewear</h3> -<<if getBestVision(getSlave($AS)) === 0>> - $He is blind, and - <<if getSlave($AS).eyewear == "none">> - has no eyewear. - <<else>> - is wearing <<= getSlave($AS).eyewear>>. [[Remove|Salon][getSlave($AS).eyewear = "none"]] - <</if>> - <div class="choices"> - Give $him: [[Cosmetic glasses|Salon][getSlave($AS).eyewear = "glasses",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> -<<elseif anyVisionEquals(getSlave($AS), 1)>> - $He is nearsighted, and $he - <<if getSlave($AS).eyewear == "none">> - has no eyewear. - <<else>> - is wearing <<= getSlave($AS).eyewear>>. [[Remove|Salon][getSlave($AS).eyewear = "none"]] - <</if>> - <div class="choices"> - Give $him: [[Cosmetic glasses|Salon][getSlave($AS).eyewear = "glasses",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Corrective glasses|Salon][getSlave($AS).eyewear = "corrective glasses",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Corrective contacts|Salon][getSlave($AS).eyewear = "corrective contacts",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <span class="note">Nearsightedness will impede performance on some assignments.</span> - </div> -<<else>> - $His vision is normal, and $he - <<if getSlave($AS).eyewear == "none">> - has no eyewear. - <<else>> - is wearing <<= getSlave($AS).eyewear>>. [[Remove|Salon][getSlave($AS).eyewear = "none"]] - <</if>> - <div class="choices"> - Give $him: [[Cosmetic glasses|Salon][getSlave($AS).eyewear = "glasses",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blurring glasses|Salon][getSlave($AS).eyewear = "blurring glasses",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blurring contacts|Salon][getSlave($AS).eyewear = "blurring contacts",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <span class="note">Blurring options are annoying and impede performance on some assignments.</span> - </div> -<</if>> - -<<includeDOM App.Medicine.Modification.eyeSelector(getSlave($AS))>> - -/* EARS */ -<h3>Ears</h3> -<p id="salon-ears"></p> -<script> - App.Medicine.Salon.ears(getSlave(V.AS)); -</script> - -<div> - <<if getSlave($AS).earImplant == 1>> - $He has artificial inner ear implants, - <<if getSlave($AS).earwear == "none">> - which are unobstructed. - <<else>> - and is wearing <<= getSlave($AS).earwear>>. [[Remove|Salon][getSlave($AS).earwear = "none"]] - <</if>> - <<elseif getSlave($AS).hears < -1>> - $He is deaf, and - <<if getSlave($AS).earwear == "none">> - is wearing nothing on $his ears. - <<else>> - is wearing <<= getSlave($AS).earwear>>. [[Remove|Salon][getSlave($AS).earwear = "none"]] - <</if>> - <<elseif getSlave($AS).hears > -1>> - $His hearing is normal, and $he - <<if getSlave($AS).earwear == "none">> - has nothing in $his ears. - <<else>> - is wearing <<= getSlave($AS).earwear>>. [[Remove|Salon][getSlave($AS).earwear = "none"]] - <</if>> - <<else>> - $He is hearing impaired, and - <<if getSlave($AS).earwear == "none">> - wears nothing to correct or worsen this. - <<else>> - is wearing <<= getSlave($AS).earwear>>. [[Remove|Salon][getSlave($AS).earwear = "none"]] - <</if>> - <</if>> - <div class="choices"> - Give $him: - [[Hearing aids|Salon][getSlave($AS).earwear = "hearing aids",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Muffling ear plugs|Salon][getSlave($AS).earwear = "muffling ear plugs",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Deafening ear plugs|Salon][getSlave($AS).earwear = "deafening ear plugs",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <span class="note">Muffling options are annoying and impede performance on some assignments.</span> - </div> -</div> - -/*End ear check */ -<div> - <<if getSlave($AS).horn != "none">> - $His <<= getSlave($AS).horn>> are <<= getSlave($AS).hornColor>> - <div class="choices"> - Set horn color: - [[Black|Salon][getSlave($AS).hornColor = "black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blazing Red|Salon][getSlave($AS).hornColor = "blazing red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blue-Violet|Salon][getSlave($AS).hornColor = "blue-violet",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blue|Salon][getSlave($AS).hornColor = "blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Brown|Salon][getSlave($AS).hornColor = "brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Burgundy|Salon][getSlave($AS).hornColor = "burgundy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Copper|Salon][getSlave($AS).hornColor = "copper",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Dark Blue|Salon][getSlave($AS).hornColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Dark Brown|Salon][getSlave($AS).hornColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Dark Orchid|Salon][getSlave($AS).hornColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Deep Red|Salon][getSlave($AS).hornColor = "deep red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Golden|Salon][getSlave($AS).hornColor = "golden",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Green-yellow|Salon][getSlave($AS).hornColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Green|Salon][getSlave($AS).hornColor = "green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Grey|Salon][getSlave($AS).hornColor = "grey",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Jet Black|Salon][getSlave($AS).hornColor = "jet black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neon Blue|Salon][getSlave($AS).hornColor = "neon blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neon Green|Salon][getSlave($AS).hornColor = "neon green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neon Pink|Salon][getSlave($AS).hornColor = "neon pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Pink|Salon][getSlave($AS).hornColor = "pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Ivory|Salon][getSlave($AS).hornColor = "ivory",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Purple|Salon][getSlave($AS).hornColor = "purple",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Red|Salon][getSlave($AS).hornColor = "red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Sea Green|Salon][getSlave($AS).hornColor = "sea green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Silver|Salon][getSlave($AS).hornColor = "silver",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[White|Salon][getSlave($AS).hornColor = "white",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> - <</if>> -</div> - -/* HAIR */ - -<h3>Hair</h3> -<p id="salon-hair"></p> -<script> - App.Medicine.Salon.hair(getSlave(V.AS)); -</script> - -/* MAKEUP */ -<h3>Makeup</h3> - -<div> - <<= App.Desc.makeup(getSlave($AS))>> - <<if getSlave($AS).makeup > 0>> - [[Remove|Salon][getSlave($AS).makeup = 0,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <</if>> - <div class="choices"> - Apply makeup: - [[Nice|Salon][getSlave($AS).makeup = 1,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Gorgeous|Salon][getSlave($AS).makeup = 2,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Slutty|Salon][getSlave($AS).makeup = 4,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Color-coordinate with hair|Salon][getSlave($AS).makeup = 3,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> - <div class="choices"> - - [[Neon|Salon][getSlave($AS).makeup = 5,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neon, color-coordinate with hair|Salon][getSlave($AS).makeup = 6,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> - <div class="choices"> - - [[Metallic|Salon][getSlave($AS).makeup = 7,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Metallic, color-coordinate with hair|Salon][getSlave($AS).makeup = 8,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> -</div> - -/* NAILS */ -<div> - <<= App.Desc.nails(getSlave($AS))>> - - <<if hasAnyArms(getSlave($AS))>> - <div class="choices"> - Treat nails: - [[Clip|Salon][getSlave($AS).nails = 0,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Extend|Salon][getSlave($AS).nails = 1,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Sharp, claw-like|Salon][getSlave($AS).nails = 3,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Bright, glittery|Salon][getSlave($AS).nails = 4,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Streetwalker-style|Salon][getSlave($AS).nails = 5,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Color-coordinate with hair|Salon][getSlave($AS).nails = 2,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> - <div class="choices"> - - [[Neon|Salon][getSlave($AS).nails = 6,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neon, color-coordinate with hair|Salon][getSlave($AS).nails = 7,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> - <div class="choices"> - - [[Metallic|Salon][getSlave($AS).nails = 8,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Metallic, color-coordinate with hair|Salon][getSlave($AS).nails = 9,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> - <</if>> -</div> - -/* SKIN */ -<h3>Skin</h3> -<div> - $His skin is <<= getSlave($AS).skin>>. - - <<if (setup.dyedSkins.includes(getSlave($AS).skin))>> - [[Remove coloring|Salon][getSlave($AS).skin = getSlave($AS).origSkin,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <<elseif ((getSlave($AS).skin == "sun tanned") || (getSlave($AS).skin == "spray tanned"))>> - [[Remove tanning|Salon][getSlave($AS).skin = getSlave($AS).origSkin,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <</if>> -</div> - -<<if (!setup.dyedSkins.includes(getSlave($AS).skin))>> - <div class="choices"> - <<if (getSlave($AS).skin == "sun tanned" || getSlave($AS).skin == "spray tanned")>> - $His skin tanning must be removed before any advanced procedure to change $his skin color. - <<else>> - Change skin tone: - <<set _needsSpacers = 0>> - <<if (skinToneLevel(getSlave($AS).skin) > 1)>> - <<if _needsSpacers == 1>> | <</if>> - [[Bleach|Salon][getSlave($AS).skin = changeSkinTone(getSlave($AS).skin, -2), cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <<set _needsSpacers = 1>> - <</if>> - <<if (skinToneLevel(getSlave($AS).skin) > 8)>> - <<if _needsSpacers == 1>> | <</if>> - [[Lighten|Salon][getSlave($AS).skin = changeSkinTone(getSlave($AS).skin, -1), cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <<set _needsSpacers = 1>> - <</if>> - <<if (skinToneLevel(getSlave($AS).skin) < 18)>> - <<if _needsSpacers == 1>> | <</if>> - [[Darken|Salon][getSlave($AS).skin = changeSkinTone(getSlave($AS).skin, 1), cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <<set _needsSpacers = 1>> - <</if>> - <<if (skinToneLevel(getSlave($AS).skin) < 25)>> - <<if _needsSpacers == 1>> | <</if>> - [[Blacken|Salon][getSlave($AS).skin = changeSkinTone(getSlave($AS).skin, 2), cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <<set _needsSpacers = 1>> - <</if>> - <</if>> - </div> - <div class="choices"> - <<set _needsSpacers = 0>> - <<if (getSlave($AS).skin != "sun tanned")>> - <<if (skinToneLevel(getSlave($AS).skin) < 6)>> - $His skin is so light in color that any attempt at natural tanning is more likely to damage $his skin. - <<elseif (skinToneLevel(getSlave($AS).skin) > 20)>> - $His skin is so dark in color that any attempt at natural tanning is not likely to appear on $his skin. - <<else>> - [["Sun tan " + $his + " skin"|Salon][getSlave($AS).skin = "sun tanned", cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <<set _needsSpacers = 1>> - <</if>> - <</if>> - <<if (getSlave($AS).skin != "spray tanned")>> - <<if _needsSpacers == 1>> | <</if>> - [["Spray tan " + $his + " skin"|Salon][getSlave($AS).skin = "spray tanned", cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <</if>> - </div> -<</if>> - -<div class="choices"> - Dye or paint: - [[Blue|Salon][getSlave($AS).skin = "dyed blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Camouflage|Salon][getSlave($AS).skin = "camouflage patterned",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Gray|Salon][getSlave($AS).skin = "dyed gray",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Green|Salon][getSlave($AS).skin = "dyed green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Pink|Salon][getSlave($AS).skin = "dyed pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Red|Salon][getSlave($AS).skin = "dyed red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Tiger Stripes|Salon][getSlave($AS).skin = "tiger striped",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] -</div> - -<p id="salon-tail"></p> -<script> - App.Medicine.Salon.tail(getSlave(V.AS)); -</script> - -/* MARKS */ -<div> - <<if (getSlave($AS).markings == "beauty mark")>> - $He has a prominent mole on $his face, which - <<if getSlave($AS).face > 40>> - qualifies as a beauty mark and enhances $his attractiveness due to $his facial beauty. - <<elseif getSlave($AS).face < -10>> - makes $him even less attractive. - <<else>> - qualifies as a beauty mark since $he's pretty, having no significant impact on $his beauty. - <</if>> - [[Remove it|Salon][getSlave($AS).markings = "none",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <</if>> -</div> - -<div> - <<if (getSlave($AS).markings == "birthmark")>> - $He has a large birthmark, which - <<if getSlave($AS).prestige > 0 || getSlave($AS).porn.prestige > 1>> - enhances $his attractiveness due to $his prestige. - <<else>> - detracts from $his attractiveness. - <</if>> - [[Bleach it|Salon][getSlave($AS).markings = "none",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <</if>> -</div> - - -<h3>Body hair</h3> -/* EYEBROW HAIR */ - -<<if getSlave($AS).eyebrowHStyle != "bald">> - <div> - $His <<if getSlave($AS).eyebrowFullness != "natural">><<= getSlave($AS).eyebrowFullness>><<if getSlave($AS).eyebrowHStyle != "natural">>,<</if>> <</if>><<if getSlave($AS).eyebrowHStyle != "natural">><<= getSlave($AS).eyebrowHStyle>> <</if>> eyebrows - <<if getSlave($AS).eyebrowHStyle == "shaved">> - would be <<= getSlave($AS).eyebrowHColor>> if present. - <<else>> - are <<= getSlave($AS).eyebrowHColor>>. - <</if>> - <<if getSlave($AS).eyebrowHColor != getSlave($AS).hColor>> - [[Match the hair?|Salon][getSlave($AS).eyebrowHColor = getSlave($AS).hColor,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <</if>> - </div> - - <div class="choices"> - Dye $his eyebrow hair: - [[Auburn|Salon][getSlave($AS).eyebrowHColor = "auburn",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Black|Salon][getSlave($AS).eyebrowHColor = "black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blazing Red|Salon][getSlave($AS).eyebrowHColor = "blazing red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blonde|Salon][getSlave($AS).eyebrowHColor = "blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blue-Violet|Salon][getSlave($AS).eyebrowHColor = "blue-violet",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blue|Salon][getSlave($AS).eyebrowHColor = "blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Brown|Salon][getSlave($AS).eyebrowHColor = "brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Burgundy|Salon][getSlave($AS).eyebrowHColor = "burgundy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Chestnut|Salon][getSlave($AS).eyebrowHColor = "chestnut",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Chocolate|Salon][getSlave($AS).eyebrowHColor = "chocolate brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Copper|Salon][getSlave($AS).eyebrowHColor = "copper",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Dark Blue|Salon][getSlave($AS).eyebrowHColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Dark Brown|Salon][getSlave($AS).eyebrowHColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Dark Orchid|Salon][getSlave($AS).eyebrowHColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Deep Red|Salon][getSlave($AS).eyebrowHColor = "deep red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Ginger|Salon][getSlave($AS).eyebrowHColor = "ginger",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Golden|Salon][getSlave($AS).eyebrowHColor = "golden",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Green-yellow|Salon][getSlave($AS).eyebrowHColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Green|Salon][getSlave($AS).eyebrowHColor = "green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Grey|Salon][getSlave($AS).eyebrowHColor = "grey",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Hazel|Salon][getSlave($AS).eyebrowHColor = "hazel",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Jet Black|Salon][getSlave($AS).eyebrowHColor = "jet black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neon Blue|Salon][getSlave($AS).eyebrowHColor = "neon blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neon Green|Salon][getSlave($AS).eyebrowHColor = "neon green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neon Pink|Salon][getSlave($AS).eyebrowHColor = "neon pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Pink|Salon][getSlave($AS).eyebrowHColor = "pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Platinum Blonde|Salon][getSlave($AS).eyebrowHColor = "platinum blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Purple|Salon][getSlave($AS).eyebrowHColor = "purple",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Red|Salon][getSlave($AS).eyebrowHColor = "red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Sea Green|Salon][getSlave($AS).eyebrowHColor = "sea green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Silver|Salon][getSlave($AS).eyebrowHColor = "silver",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Strawberry-Blonde|Salon][getSlave($AS).eyebrowHColor = "strawberry-blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[White|Salon][getSlave($AS).eyebrowHColor = "white",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> - - <div class="choices"> - Style $his eyebrow hair: - [[Natural|Salon][getSlave($AS).eyebrowHStyle = "natural",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Curved|Salon][getSlave($AS).eyebrowHStyle = "curved",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Elongated|Salon][getSlave($AS).eyebrowHStyle = "elongated",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[High-Arched|Salon][getSlave($AS).eyebrowHStyle = "high-arched",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Rounded|Salon][getSlave($AS).eyebrowHStyle = "rounded",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Shaved|Salon][getSlave($AS).eyebrowHStyle = "shaved",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Shortened|Salon][getSlave($AS).eyebrowHStyle = "shortened",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Slanted Inwards|Salon][getSlave($AS).eyebrowHStyle = "slanted inwards",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Slanted Outwards|Salon][getSlave($AS).eyebrowHStyle = "slanted outwards",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Straight|Salon][getSlave($AS).eyebrowHStyle = "straight",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> - - <div class="choices"> - Shape $his eyebrow hair: - [[Natural|Salon][getSlave($AS).eyebrowFullness = "natural",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Bushy|Salon][getSlave($AS).eyebrowFullness = "bushy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Thick|Salon][getSlave($AS).eyebrowFullness = "thick",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Tapered|Salon][getSlave($AS).eyebrowFullness = "tapered",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Threaded|Salon][getSlave($AS).eyebrowFullness = "threaded",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Thin|Salon][getSlave($AS).eyebrowFullness = "thin",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Pencil-Thin|Salon][getSlave($AS).eyebrowFullness = "pencil-thin",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> -<<else>> - <div> - $His eyebrows are completely hairless. - </div> -<</if>> - -/* PUBIC HAIR */ - -<<set _pubertyAge = Math.min(getSlave($AS).pubertyAgeXX, getSlave($AS).pubertyAgeXY)>> -<<if getSlave($AS).pubicHStyle != "bald" && getSlave($AS).pubicHStyle != "hairless" && getSlave($AS).physicalAge >= _pubertyAge-1>> - - <div> - $His - <<if getSlave($AS).physicalAge < _pubertyAge>> - wispy pubic hair, which is just starting to grow in, - <<elseif getSlave($AS).pubicHStyle == "in a strip">> - pubic hair, which is shaved into a strip, - <<else>> - <<= getSlave($AS).pubicHStyle>> pubic hair - <</if>> - <<if getSlave($AS).pubicHStyle == "waxed">> - would be <<= getSlave($AS).pubicHColor>> if present. - <<else>> - is <<= getSlave($AS).pubicHColor>>. - <</if>> - <<if getSlave($AS).pubicHColor != getSlave($AS).hColor>> - [[Match the curtains?|Salon][getSlave($AS).pubicHColor = getSlave($AS).hColor,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <</if>> - </div> - - <div class="choices"> - Dye $his pubic hair: - [[Auburn|Salon][getSlave($AS).pubicHColor = "auburn",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Black|Salon][getSlave($AS).pubicHColor = "black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blazing Red|Salon][getSlave($AS).pubicHColor = "blazing red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blonde|Salon][getSlave($AS).pubicHColor = "blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blue-Violet|Salon][getSlave($AS).pubicHColor = "blue-violet",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blue|Salon][getSlave($AS).pubicHColor = "blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Brown|Salon][getSlave($AS).pubicHColor = "brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Burgundy|Salon][getSlave($AS).pubicHColor = "burgundy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Chestnut|Salon][getSlave($AS).pubicHColor = "chestnut",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Chocolate|Salon][getSlave($AS).pubicHColor = "chocolate brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Copper|Salon][getSlave($AS).pubicHColor = "copper",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Dark Blue|Salon][getSlave($AS).pubicHColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Dark Brown|Salon][getSlave($AS).pubicHColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Dark Orchid|Salon][getSlave($AS).pubicHColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Deep Red|Salon][getSlave($AS).pubicHColor = "deep red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Ginger|Salon][getSlave($AS).pubicHColor = "ginger",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Golden|Salon][getSlave($AS).pubicHColor = "golden",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Green-yellow|Salon][getSlave($AS).pubicHColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Green|Salon][getSlave($AS).pubicHColor = "green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Grey|Salon][getSlave($AS).pubicHColor = "grey",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Hazel|Salon][getSlave($AS).pubicHColor = "hazel",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Jet Black|Salon][getSlave($AS).pubicHColor = "jet black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neon Blue|Salon][getSlave($AS).pubicHColor = "neon blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neon Green|Salon][getSlave($AS).pubicHColor = "neon green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neon Pink|Salon][getSlave($AS).pubicHColor = "neon pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Pink|Salon][getSlave($AS).pubicHColor = "pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Platinum Blonde|Salon][getSlave($AS).pubicHColor = "platinum blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Purple|Salon][getSlave($AS).pubicHColor = "purple",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Red|Salon][getSlave($AS).pubicHColor = "red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Sea Green|Salon][getSlave($AS).pubicHColor = "sea green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Silver|Salon][getSlave($AS).pubicHColor = "silver",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Strawberry-Blonde|Salon][getSlave($AS).pubicHColor = "strawberry-blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[White|Salon][getSlave($AS).pubicHColor = "white",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> - - <div class="choices"> - Style $his pubic hair: - [[Waxed|Salon][getSlave($AS).pubicHStyle = "waxed",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Landing strip|Salon][getSlave($AS).pubicHStyle = "in a strip",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neat|Salon][getSlave($AS).pubicHStyle = "neat",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Bushy in the front|Salon][getSlave($AS).pubicHStyle = "bushy in the front and neat in the rear",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Bushy|Salon][getSlave($AS).pubicHStyle = "bushy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Very Bushy|Salon][getSlave($AS).pubicHStyle = "very bushy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> - -<<else>> - <div> - $His groin is completely hairless. - </div> -<</if>> - -/* UNDERARM HAIR */ - -<<if getSlave($AS).underArmHStyle != "bald" && getSlave($AS).underArmHStyle != "hairless" && getSlave($AS).physicalAge >= _pubertyAge-1>> - - <div> - $His - <<if getSlave($AS).physicalAge < _pubertyAge>> - wispy underarm hair - <<else>> - <<= getSlave($AS).underArmHStyle>> underarm hair - <</if>> - <<if getSlave($AS).underArmHStyle == "waxed">> - would be <<= getSlave($AS).underArmHColor>> if present. - <<else>> - is <<= getSlave($AS).underArmHColor>>. - <</if>> - <<if getSlave($AS).underArmHColor != getSlave($AS).hColor>> - [[Match the hair?|Salon][getSlave($AS).underArmHColor = getSlave($AS).hColor,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - <</if>> - </div> - - <div class="choices"> - Dye $his armpit hair: - [[Auburn|Salon][getSlave($AS).underArmHColor = "auburn",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Black|Salon][getSlave($AS).underArmHColor = "black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blazing Red|Salon][getSlave($AS).underArmHColor = "blazing red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blonde|Salon][getSlave($AS).underArmHColor = "blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blue-Violet|Salon][getSlave($AS).underArmHColor = "blue-violet",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Blue|Salon][getSlave($AS).underArmHColor = "blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Brown|Salon][getSlave($AS).underArmHColor = "brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Burgundy|Salon][getSlave($AS).underArmHColor = "burgundy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Chestnut|Salon][getSlave($AS).underArmHColor = "chestnut",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Chocolate|Salon][getSlave($AS).underArmHColor = "chocolate brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Copper|Salon][getSlave($AS).underArmHColor = "copper",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Dark Blue|Salon][getSlave($AS).underArmHColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Dark Brown|Salon][getSlave($AS).underArmHColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Dark Orchid|Salon][getSlave($AS).underArmHColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Deep Red|Salon][getSlave($AS).underArmHColor = "deep red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Ginger|Salon][getSlave($AS).underArmHColor = "ginger",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Golden|Salon][getSlave($AS).underArmHColor = "golden",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Green-yellow|Salon][getSlave($AS).underArmHColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Green|Salon][getSlave($AS).underArmHColor = "green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Grey|Salon][getSlave($AS).underArmHColor = "grey",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Hazel|Salon][getSlave($AS).underArmHColor = "hazel",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Jet Black|Salon][getSlave($AS).underArmHColor = "jet black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neon Blue|Salon][getSlave($AS).underArmHColor = "neon blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neon Green|Salon][getSlave($AS).underArmHColor = "neon green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neon Pink|Salon][getSlave($AS).underArmHColor = "neon pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Pink|Salon][getSlave($AS).underArmHColor = "pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Platinum Blonde|Salon][getSlave($AS).underArmHColor = "platinum blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Purple|Salon][getSlave($AS).underArmHColor = "purple",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Red|Salon][getSlave($AS).underArmHColor = "red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Sea Green|Salon][getSlave($AS).underArmHColor = "sea green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Silver|Salon][getSlave($AS).underArmHColor = "silver",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Strawberry-Blonde|Salon][getSlave($AS).underArmHColor = "strawberry-blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[White|Salon][getSlave($AS).underArmHColor = "white",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> - - <div class="choices"> - Style $his armpit hair: - [[Waxed|Salon][getSlave($AS).underArmHStyle = "waxed",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Shaved|Salon][getSlave($AS).underArmHStyle = "shaved",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Neat|Salon][getSlave($AS).underArmHStyle = "neat",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - | [[Bushy|Salon][getSlave($AS).underArmHStyle = "bushy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] - </div> - -<<else>> - <div> - $His underarms are completely hairless. - </div> -<</if>> diff --git a/src/uncategorized/seCustomSlaveDelivery.tw b/src/uncategorized/seCustomSlaveDelivery.tw index 23b9c3ca82019a02c255161319fcd8729e11429b..627ffda4115efc22b7082201d031f2c035b945bc 100644 --- a/src/uncategorized/seCustomSlaveDelivery.tw +++ b/src/uncategorized/seCustomSlaveDelivery.tw @@ -2,105 +2,106 @@ <<set $customSlaveOrdered = 0, $nextButton = "Continue", $nextLink = "Scheduled Event", $returnTo = "Scheduled Event", $encyclopedia = "Enslaving People">> +<<set _pram = {mature: 0, nationality: _nationality}>> <<if $customSlave.age == 2>> - <<set $activeSlaveOneTimeMinAge = $minimumSlaveAge>> - <<set $activeSlaveOneTimeMaxAge = 2>> + <<set _pram.minAge = $minimumSlaveAge>> + <<set _pram.maxAge = 2>> <<elseif $customSlave.age == 4>> - <<set $activeSlaveOneTimeMinAge = 3>> - <<set $activeSlaveOneTimeMaxAge = 4>> + <<set _pram.minAge = 3>> + <<set _pram.maxAge = 4>> <<elseif $customSlave.age == 6>> - <<set $activeSlaveOneTimeMinAge = 5>> - <<set $activeSlaveOneTimeMaxAge = 6>> + <<set _pram.minAge = 5>> + <<set _pram.maxAge = 6>> <<elseif $customSlave.age == 9>> - <<set $activeSlaveOneTimeMinAge = 7>> - <<set $activeSlaveOneTimeMaxAge = 9>> + <<set _pram.minAge = 7>> + <<set _pram.maxAge = 9>> <<elseif $customSlave.age == 12>> - <<set $activeSlaveOneTimeMinAge = 10>> - <<set $activeSlaveOneTimeMaxAge = 12>> + <<set _pram.minAge = 10>> + <<set _pram.maxAge = 12>> <<elseif $customSlave.age == 14>> - <<set $activeSlaveOneTimeMinAge = 13>> - <<set $activeSlaveOneTimeMaxAge = 14>> + <<set _pram.minAge = 13>> + <<set _pram.maxAge = 14>> <<elseif $customSlave.age == 17>> - <<set $activeSlaveOneTimeMinAge = 15>> - <<set $activeSlaveOneTimeMaxAge = 17>> + <<set _pram.minAge = 15>> + <<set _pram.maxAge = 17>> <<elseif $customSlave.age == 19>> - <<set $activeSlaveOneTimeMinAge = 18>> - <<set $activeSlaveOneTimeMaxAge = 19>> + <<set _pram.minAge = 18>> + <<set _pram.maxAge = 19>> <<elseif $customSlave.age == 20>> - <<set $activeSlaveOneTimeMinAge = 20>> - <<set $activeSlaveOneTimeMaxAge = $retirementAge-1>> + <<set _pram.minAge = 20>> + <<set _pram.maxAge = $retirementAge-1>> <<elseif $customSlave.age == 24>> - <<set $activeSlaveOneTimeMinAge = 20>> - <<set $activeSlaveOneTimeMaxAge = 24>> + <<set _pram.minAge = 20>> + <<set _pram.maxAge = 24>> <<elseif $customSlave.age == 25>> - <<set $activeSlaveOneTimeMinAge = 25>> - <<set $activeSlaveOneTimeMaxAge = $retirementAge-1>> + <<set _pram.minAge = 25>> + <<set _pram.maxAge = $retirementAge-1>> <<elseif $customSlave.age == 29>> - <<set $activeSlaveOneTimeMinAge = 25>> - <<set $activeSlaveOneTimeMaxAge = 29>> + <<set _pram.minAge = 25>> + <<set _pram.maxAge = 29>> <<elseif $customSlave.age == 30>> - <<set $activeSlaveOneTimeMinAge = 30>> - <<set $activeSlaveOneTimeMaxAge = $retirementAge-1>> + <<set _pram.minAge = 30>> + <<set _pram.maxAge = $retirementAge-1>> <<elseif $customSlave.age == 39>> - <<set $activeSlaveOneTimeMinAge = 30>> - <<set $activeSlaveOneTimeMaxAge = 39>> + <<set _pram.minAge = 30>> + <<set _pram.maxAge = 39>> <<elseif $customSlave.age == 40>> - <<set $activeSlaveOneTimeMinAge = 40>> - <<set $activeSlaveOneTimeMaxAge = $retirementAge-1>> + <<set _pram.minAge = 40>> + <<set _pram.maxAge = $retirementAge-1>> <<elseif $customSlave.age == 49>> - <<set $activeSlaveOneTimeMinAge = 40>> - <<set $activeSlaveOneTimeMaxAge = 49>> + <<set _pram.minAge = 40>> + <<set _pram.maxAge = 49>> <<elseif $customSlave.age == 50>> - <<set $activeSlaveOneTimeMinAge = 50>> - <<set $activeSlaveOneTimeMaxAge = $retirementAge-1>> + <<set _pram.minAge = 50>> + <<set _pram.maxAge = $retirementAge-1>> <<elseif $customSlave.age == 59>> - <<set $activeSlaveOneTimeMinAge = 50>> - <<set $activeSlaveOneTimeMaxAge = 59>> + <<set _pram.minAge = 50>> + <<set _pram.maxAge = 59>> <<elseif $customSlave.age == 60>> - <<set $activeSlaveOneTimeMinAge = 60>> - <<set $activeSlaveOneTimeMaxAge = $retirementAge-1>> + <<set _pram.minAge = 60>> + <<set _pram.maxAge = $retirementAge-1>> <<elseif $customSlave.age == 69>> - <<set $activeSlaveOneTimeMinAge = 60>> - <<set $activeSlaveOneTimeMaxAge = 69>> + <<set _pram.minAge = 60>> + <<set _pram.maxAge = 69>> <<elseif $customSlave.age == 70>> - <<set $activeSlaveOneTimeMinAge = 70>> - <<set $activeSlaveOneTimeMaxAge = $retirementAge-1>> + <<set _pram.minAge = 70>> + <<set _pram.maxAge = $retirementAge-1>> <<elseif $customSlave.age == 79>> - <<set $activeSlaveOneTimeMinAge = 70>> - <<set $activeSlaveOneTimeMaxAge = 79>> + <<set _pram.minAge = 70>> + <<set _pram.maxAge = 79>> <<elseif $customSlave.age == 80>> - <<set $activeSlaveOneTimeMinAge = 80>> - <<set $activeSlaveOneTimeMaxAge = $retirementAge-1>> + <<set _pram.minAge = 80>> + <<set _pram.maxAge = $retirementAge-1>> <<elseif $customSlave.age == 89>> - <<set $activeSlaveOneTimeMinAge = 80>> - <<set $activeSlaveOneTimeMaxAge = 89>> + <<set _pram.minAge = 80>> + <<set _pram.maxAge = 89>> <<elseif $customSlave.age == 90>> - <<set $activeSlaveOneTimeMinAge = 90>> - <<set $activeSlaveOneTimeMaxAge = $retirementAge-1>> + <<set _pram.minAge = 90>> + <<set _pram.maxAge = $retirementAge-1>> <<elseif $customSlave.age == 99>> - <<set $activeSlaveOneTimeMinAge = 90>> - <<set $activeSlaveOneTimeMaxAge = 99>> + <<set _pram.minAge = 90>> + <<set _pram.maxAge = 99>> <<elseif $customSlave.age == 100>> - <<set $activeSlaveOneTimeMinAge = 100>> - <<set $activeSlaveOneTimeMaxAge = $retirementAge-1>> + <<set _pram.minAge = 100>> + <<set _pram.maxAge = $retirementAge-1>> <<elseif $customSlave.age == 109>> - <<set $activeSlaveOneTimeMinAge = 100>> - <<set $activeSlaveOneTimeMaxAge = 109>> + <<set _pram.minAge = 100>> + <<set _pram.maxAge = 109>> <<elseif $customSlave.age == 110>> - <<set $activeSlaveOneTimeMinAge = 110>> - <<set $activeSlaveOneTimeMaxAge = $retirementAge-1>> + <<set _pram.minAge = 110>> + <<set _pram.maxAge = $retirementAge-1>> <<elseif $customSlave.age == 119>> - <<set $activeSlaveOneTimeMinAge = 110>> - <<set $activeSlaveOneTimeMaxAge = 119>> + <<set _pram.minAge = 110>> + <<set _pram.maxAge = 119>> <<elseif $customSlave.age == 120>> - <<set $activeSlaveOneTimeMinAge = 120>> - <<set $activeSlaveOneTimeMaxAge = $retirementAge-1>> + <<set _pram.minAge = 120>> + <<set _pram.maxAge = $retirementAge-1>> <<elseif $customSlave.age == 129>> - <<set $activeSlaveOneTimeMinAge = 120>> - <<set $activeSlaveOneTimeMaxAge = 129>> + <<set _pram.minAge = 120>> + <<set _pram.maxAge = 129>> <<else>> - <<set $activeSlaveOneTimeMinAge = 130>> - <<set $activeSlaveOneTimeMaxAge = $retirementAge-1>> + <<set _pram.minAge = 130>> + <<set _pram.maxAge = $retirementAge-1>> <</if>> <<set $one_time_age_overrides_pedo_mode = 1>> <<if $customSlave.nationality != "Nationality is unimportant">> @@ -110,13 +111,13 @@ <<set $fixedRace = $customSlave.race>> <</if>> <<if $customSlave.sex == 2>> - <<set _delivery = GenerateNewSlave("XY", {mature: 0, nationality: _nationality})>> + <<set _delivery = GenerateNewSlave("XY", _pram)>> <<set _delivery.dick = $customSlave.dick>> <<set _delivery.balls = $customSlave.balls>> <<set _delivery.scrotum = _delivery.balls>> <<set _delivery.foreskin = _delivery.dick>> <<else>> - <<set _delivery = GenerateNewSlave("XX", {mature: 0, nationality: _nationality})>> + <<set _delivery = GenerateNewSlave("XX", _pram)>> <<if $customSlave.virgin == 0>> <<set _delivery.vagina = $customSlave.virgin>> <</if>> diff --git a/src/uncategorized/seRetirement.tw b/src/uncategorized/seRetirement.tw index d325986e62ec881627bad8d4125c287663d0fd35..b17f96d976cb83dceefb97e5c0de9bee81292dfe 100644 --- a/src/uncategorized/seRetirement.tw +++ b/src/uncategorized/seRetirement.tw @@ -2,21 +2,21 @@ <<set $nextButton = "Continue">> -<<set $activeSlave = getSlave($retiree)>> -<<set _clonedSlave = clone($activeSlave)>> -<<if SlaveStatsChecker.checkForLisp($activeSlave)>> +<<set _slave = getSlave($retiree)>> +<<set _clonedSlave = clone(_slave)>> +<<if SlaveStatsChecker.checkForLisp(_slave)>> <<set _playerName = lispReplace($PC.slaveName)>> <<else>> <<set _playerName = $PC.slaveName>> <</if>> <<run Enunciate(_clonedSlave)>> <<setLocalPronouns _clonedSlave>> -<<set _sr = $slaveIndices[$activeSlave.relationshipTarget]>> +<<set _sr = $slaveIndices[_slave.relationshipTarget]>> <<if def _sr>> <<setLocalPronouns $slaves[_sr] 2>> <</if>> <<if $policies.retirement.fate == "citizen">> - <<set $activeSlave.clothes = "conservative clothing">> + <<set _slave.clothes = "conservative clothing">> <<elseif $policies.retirement.fate == "bioreactor">> /* Scene starts in normal clothing */ <<elseif $policies.retirement.fate == "arcade">> @@ -26,125 +26,125 @@ /* 000-250-006 */ <<if $seeImages == 1>> <<if $imageChoice == 1>> - <div class="imageRef lrgVector"><div class="mask"> </div><<= SlaveArt($activeSlave, 2, 0)>></div> + <div class="imageRef lrgVector"><div class="mask"> </div><<= SlaveArt(_slave, 2, 0)>></div> <<else>> - <div class="imageRef lrgRender"><div class="mask"> </div><<= SlaveArt($activeSlave, 2, 0)>></div> + <div class="imageRef lrgRender"><div class="mask"> </div><<= SlaveArt(_slave, 2, 0)>></div> <</if>> <</if>> /* 000-250-006 */ </span> -<<= App.UI.slaveDescriptionDialog($activeSlave)>> is retiring from sexual slavery this week, +<<= App.UI.slaveDescriptionDialog(_slave)>> is retiring from sexual slavery this week, <<if $policies.retirement.fate == "citizen">> in a way that will fill the rest of your property with envy and @@.mediumaquamarine;trust.@@ <<for $i = 0; $i < $slaves.length; $i++>> <<set $slaves[$i].trust += 3>> <</for>> - <<if $activeSlave.relationship > 3>> - $slaves[_sr].slaveName, for _his2 part, is @@.hotpink;overjoyed,@@ though also a bit sad. Although _he2 knows _he2 will $slaves[_sr].assignment for a while longer, _he2 looks forward to joining $activeSlave.slaveName one day. + <<if _slave.relationship > 3>> + $slaves[_sr].slaveName, for _his2 part, is @@.hotpink;overjoyed,@@ though also a bit sad. Although _he2 knows _he2 will $slaves[_sr].assignment for a while longer, _he2 looks forward to joining _slave.slaveName one day. <<set $slaves[_sr].devotion += 10>> <</if>> <br><br> $He is retiring into citizenship, with a substantial annuity that will provide $him with a secure if not luxurious life. - <<if $activeSlave.relationship == -3>> - <<if $activeSlave.fetish == "mindbroken">> + <<if _slave.relationship == -3>> + <<if _slave.fetish == "mindbroken">> Sadly, $he is not mentally equipped to look after $himself, but the arcology hosts several fine institutions capable of caring for $him. They'll have someone check in on $him daily. $Him being your $wife is ultimately irrelevant; $he never realized it in the first place. - <<elseif $activeSlave.devotion+$activeSlave.trust >= 175>> + <<elseif _slave.devotion+_slave.trust >= 175>> $He wishes $he could continue to be your slave $wife, but $he understands that marriages between slaves and slaveowners are predicated on the slave relationship. $He knows that $his retirement has come, meaning that $his slave relationship to you is ending. $He's had a long time to get used to the idea, and gets through the process with dignity, doing $his best to avoid embarrassing you. - <<elseif $activeSlave.devotion < -20 && $activeSlave.trust > 20>> + <<elseif _slave.devotion < -20 && _slave.trust > 20>> $He is glad $he no longer has to be your slave $wife, as $he never wanted to be in the first place, though $he will miss taking advantage of the position. $He understands that marriages between slaves and slaveowners are predicated on the slave relationship. $He knows that $his retirement has come, meaning that $his slave relationship to you is ending. $He's had a long time to dream of the idea, and goes through the process with unremitting joy, doing $his best to embarrass you. - <<elseif $activeSlave.devotion < -20>> + <<elseif _slave.devotion < -20>> $He is glad $he no longer has to be your slave $wife, as $he never wanted to be in the first place. $He understands that marriages between slaves and slaveowners are predicated on the slave relationship. $He knows that $his retirement has come, meaning that $his slave relationship to you is ending. $He's had a long time to dream of the idea, and goes through the process with unremitting joy, doing $his best to avoid embarrassing you while $he's still subject to your whims and your punishments. <<else>> $He is glad $he no longer has to be your slave $wife, as $he never wanted to be in the first place. $He understands that marriages between slaves and slaveowners are predicated on the slave relationship. $He knows that $his retirement has come, meaning that $his slave relationship to you is ending. $He's had a long time to get used to the idea, and gets through the process dutifully, doing $his best to avoid embarrassing you. <</if>> - <<elseif $activeSlave.fetish == "mindbroken" || $activeSlave.actualAge < 3>> + <<elseif _slave.fetish == "mindbroken" || _slave.actualAge < 3>> Sadly, $he is not mentally equipped to look after $himself, but the arcology hosts several fine institutions capable of caring for $him. They'll have someone check in on $him daily. - <<elseif $activeSlave.devotion > 95>> + <<elseif _slave.devotion > 95>> $He desperately wishes $he could continue to be your sex slave, but $he understands that $his retirement has come. More importantly, $he's had a long time to get used to the idea, and gets through the process with resolution, doing $his best to avoid embarrassing $himself or you. - <<elseif $activeSlave.devotion > 20>> + <<elseif _slave.devotion > 20>> $He is very happy to be a free person again, though $he does $his best to do you the favor of not being too ostentatious about this. <<else>> It is with an ill-disguised triumphalism that $he leaves sexual slavery behind $him, and enters into a life in which $he can decline to have things inserted into $his body. <</if>> $He's certainly going to have some adjustments to make. - <<if $activeSlave.energy > 90>> + <<if _slave.energy > 90>> Notably, dealing with $his formidable sex drive is now $his business. You suspect the arcology's clubs are about to receive a fanatical new regular, and the arcology's whores may not know what hit them when $he realizes that $he's now quite capable of buying whatever $he wants on a semi-regular basis. - <<if $activeSlave.skill.anal+$activeSlave.skill.oral >= 120>> + <<if _slave.skill.anal+_slave.skill.oral >= 120>> $He's so sexually skilled, though, that $he probably won't have much trouble. $He'll probably have more than a few eager lovers within days. <</if>> - <<if $activeSlave.face > 40>> + <<if _slave.face > 40>> $He's certainly attractive enough that $he'll have no trouble finding as many casual hookups as $he likes. <</if>> <</if>> - <<if $activeSlave.prestigeDesc == 0>> + <<if _slave.prestigeDesc == 0>> <<set _toSearch = "">> <<else>> - <<set _toSearch = $activeSlave.prestigeDesc>> + <<set _toSearch = _slave.prestigeDesc>> <</if>> - <<if $activeSlave.porn.prestigeDesc == 0>> + <<if _slave.porn.prestigeDesc == 0>> <<set _toSearchAlt = "">> <<else>> - <<set _toSearchAlt = $activeSlave.porn.prestigeDesc>> + <<set _toSearchAlt = _slave.porn.prestigeDesc>> <</if>> - <<if (_toSearch.indexOf("Head Girl") != -1) || ($HeadGirlID == $activeSlave.ID)>> + <<if (_toSearch.indexOf("Head Girl") != -1) || ($HeadGirlID == _slave.ID)>> <br><br> $He has a reputation from $his long service as your Head Girl. To $his bemusement, and considerable satisfaction, $he has multiple job offers from slaving operations without even having to circulate $his resume. - <<if $activeSlave.fetish == "sadist">> + <<if _slave.fetish == "sadist">> The prospect of a virtually unlimited field for abuse and rape is something $he'd pay for, now that $he has $his own money. $He's excited beyond description to find that there are people interested in paying $him to exercise $his exquisitely horrible skills. - <<elseif $activeSlave.fetish == "dom">> + <<elseif _slave.fetish == "dom">> Dominance is second nature to $him. Though $he doesn't have to work, $his slaving skills are valuable enough that $he'd probably be tempted by the pay $he can expect, even if $he didn't derive real pleasure from exercising them. <<else>> $His annuity means that $he doesn't have to work, but $he's inclined to do so. $His skills command reasonable wages in the slave training field, and between those prospects and $his annuity, $he stands to become wealthy. <</if>> <<elseif (_toSearchAlt.indexOf("is world famous for") != -1)>> <br><br> - <<set _pornFame = $activeSlave.porn.prestigeDesc>> + <<set _pornFame = _slave.porn.prestigeDesc>> <<set _pornFame = _pornFame.replace("$He is world famous for $his career in slave pornography. Millions are intimately familiar with", "enjoy")>> <<set _pornFame = _pornFame.replace(".", ",")>> In addition to $his annuity, you've laid the groundwork for $him to become wealthy by the way you publicized pornography of $him. Many thousands of people across the world are willing to pay to _pornFame and they enjoy it in part because $he doesn't mind it, either. $He's in a position to make great money for doing on camera what $he would probably do anyway. - <<elseif ($activeSlave.intelligence+$activeSlave.intelligenceImplant >= -50) && ($activeSlave.muscles > 5) && ($activeSlave.skill.combat >= 1) && hasAllLimbs($activeSlave) && ($activeSlave.face > 10)>> + <<elseif (_slave.intelligence+_slave.intelligenceImplant >= -50) && (_slave.muscles > 5) && (_slave.skill.combat >= 1) && hasAllLimbs(_slave) && (_slave.face > 10)>> <br><br> $He's pretty and deadly. If $he feels $he prefers wealth and danger to living on $his annuity, $he'll have no trouble finding work. In fact, $he'll likely have trouble sifting through all the mercenary organizations, businesses in need of attractive and competent guards for public spaces, and citizens looking for effective bodyguards willing to hire $him. - <<elseif ($activeSlave.intelligence+$activeSlave.intelligenceImplant > 50) && ($activeSlave.intelligenceImplant >= 15)>> + <<elseif (_slave.intelligence+_slave.intelligenceImplant > 50) && (_slave.intelligenceImplant >= 15)>> <br><br> $He has no skills extraordinary enough to bring prospective employers in search of $him, in this new, slaveowning economy, but $he is highly intelligent, educated, and has a small income. As you know from your own abundant personal experience, $his intelligence is a lever, $his annuity is a fulcrum, and with the two, $he may move the world someday. You have no doubt that, at the very least, $he will be far from the poorest of your citizens. <</if>> <br><br> As $he takes $his leave, heading the short distance down to $his modest little apartment, $he presents a strange appearance. $He's wearing cheap but not unattractive clothing, and you are struck by a crystal-clear mental image of what $he looks like nude. - <<if $activeSlave.fetish != "mindbroken">> - <<if $activeSlave.devotion > 20>> - <<if $activeSlave.devotion > 95>> + <<if _slave.fetish != "mindbroken">> + <<if _slave.devotion > 20>> + <<if _slave.devotion > 95>> $He's doing $his absolute best not to sob, but $his lips are quivering. <<else>> $He looks like $he might cry. <</if>> - <<if !canTalk($activeSlave)>> + <<if !canTalk(_slave)>> $He gestures $his thanks, and ironically indicates that $he'll see you around. <<else>> - "Well, thank<<s>>, <<Master>>, um, I mean _playerName. I g-gue<<ss>> I'll <<s>>ee you around<<if !canSee($activeSlave)>>, uh, a<<s>> they <<s>>ay<</if>>. I mean, the arcology. Anyway. Bye." + "Well, thank<<s>>, <<Master>>, um, I mean _playerName. I g-gue<<ss>> I'll <<s>>ee you around<<if !canSee(_slave)>>, uh, a<<s>> they <<s>>ay<</if>>. I mean, the arcology. Anyway. Bye." <</if>> - <<if $activeSlave.devotion > 95>> + <<if _slave.devotion > 95>> $He turns resolutely away and flees, trying to choke back $his tears. <<else>> $He turns resolutely away. <</if>> <</if>> <</if>> - <<if $activeSlave.relationship == -3>> + <<if _slave.relationship == -3>> <br> When you return to your desk you realize something. - <<if $activeSlave.fetish == "mindbroken">> + <<if _slave.fetish == "mindbroken">> The ring $he wore when $he was your slave $wife is nowhere to be seen; $he's likely forgotten $he was wearing it, but no matter: you can always get more. - <<elseif $activeSlave.devotion+$activeSlave.trust >= 175>> + <<elseif _slave.devotion+_slave.trust >= 175>> The ring $he wore when $he was your slave $wife is nowhere to be seen; $he's likely taken it with $him to remember you by. - <<elseif $activeSlave.devotion < -20 && $activeSlave.trust > 20>> + <<elseif _slave.devotion < -20 && _slave.trust > 20>> The ring $he wore when $he was your slave $wife is nowhere to be seen; $he's likely taken it with $him to either try and pawn or to dispose of. It doesn't matter: you can always get more. - <<elseif $activeSlave.devotion < -20>> + <<elseif _slave.devotion < -20>> The ring $he wore when $he was your slave $wife was left on your desk; $he likely ripped it off as soon as $he was free. <<else>> The ring $he wore when $he was your slave $wife is nowhere to be seen; $he's either taken it with $him as a souvenir, or left it back in $his sleeping area. If it's the former, no matter: you can always get more. @@ -157,8 +157,8 @@ <br><br> - <<if $activeSlave.energy > 50>> - <<if $activeSlave.devotion > 20>> + <<if _slave.energy > 50>> + <<if _slave.devotion > 20>> <span id="result"> <<link "See $him around">> <<setNonlocalPronouns $seeDicks>> @@ -212,7 +212,7 @@ <br> <<if _clonedSlave.relationship >= 4>> <<link "Send $his _girl2 into retirement with $him">> - <<set _sr = $slaveIndices[_clonedSlave.relationshipTarget]>> /* must be reset since $activeSlave may already be removed from $slaves */ + <<set _sr = $slaveIndices[_clonedSlave.relationshipTarget]>> /* must be reset since _slave may already be removed from $slaves */ <<replace "#art-frame">> /* 000-250-006 */ <<if $seeImages == 1>> @@ -254,18 +254,18 @@ <<for $i = 0; $i < $slaves.length; $i++>> <<set $slaves[$i].trust -= 3>> <</for>> - <<if $activeSlave.relationship > 3>> + <<if _slave.relationship > 3>> $slaves[_sr].slaveName, for _his2 part, is @@.mediumorchid;horrified.@@ <<set $slaves[_sr].devotion -= 20>> <</if>> <br><br> - $He is retiring into a featureless existence where the only realities are the phalli ejaculating food, fluid, and drugs into $his <<if $activeSlave.vagina > -1>> vagina,<</if>> anus, and throat,<<if $activeSlave.balls > 0>> the relentless sodomy forcing semen out of $his distended balls,<</if>> and the milk flowing into the milkers tugging at $his painfully engorged nipples. - <<if $activeSlave.fetish == "mindbroken">> + $He is retiring into a featureless existence where the only realities are the phalli ejaculating food, fluid, and drugs into $his <<if _slave.vagina > -1>> vagina,<</if>> anus, and throat,<<if _slave.balls > 0>> the relentless sodomy forcing semen out of $his distended balls,<</if>> and the milk flowing into the milkers tugging at $his painfully engorged nipples. + <<if _slave.fetish == "mindbroken">> $He's already broken in spirit, and $he complies with $his installation into a milking machine with the dumb obedience of the animal $he has become. - <<elseif $activeSlave.devotion > 20>> + <<elseif _slave.devotion > 20>> $He complies with $his installation into a milking machine with the dumb obedience of someone whose mind will not allow them to understand their true situation out of simple immediate self-preservation. - <<elseif $activeSlave.trust < 50>> + <<elseif _slave.trust < 50>> $He is so terrified of punishment that $he complies with $his installation into a milking machine to avoid pain. $He knows that if $he does not obey, there will be pain, and if $he obeys, there may be pain but it will come later. <<else>> $He resists, of course, giving the compliance systems an excuse to unload quite a few volts of electricity into $him. This disobedience is one of $his more abortive attempts to resist your will, and it is $his last. @@ -293,18 +293,18 @@ <<for $i = 0; $i < $slaves.length; $i++>> <<set $slaves[$i].trust -= 3>> <</for>> - <<if $activeSlave.relationship > 3>> + <<if _slave.relationship > 3>> $slaves[_sr].slaveName, for _his2 part, is @@.mediumorchid;horrified.@@ <<set $slaves[_sr].devotion -= 20>> <</if>> <br><br> - $He is retiring into a dark, featureless eternity in which the only realities are phalli intruding into $his<<if $activeSlave.vagina > -1>> vagina,<</if>> anus, and throat, and the drug-induced haze that will leave $him no choice but to orgasm when $he is penetrated. - <<if $activeSlave.fetish == "mindbroken">> + $He is retiring into a dark, featureless eternity in which the only realities are phalli intruding into $his<<if _slave.vagina > -1>> vagina,<</if>> anus, and throat, and the drug-induced haze that will leave $him no choice but to orgasm when $he is penetrated. + <<if _slave.fetish == "mindbroken">> $He's already broken in spirit, and $he complies with the conversion process with the dumb obedience of the animal $he has become. - <<elseif $activeSlave.devotion > 20>> + <<elseif _slave.devotion > 20>> $He complies with the conversion process with the dumb obedience of someone whose mind will not allow them to understand their true situation out of simple immediate self-preservation. - <<elseif $activeSlave.trust < 50>> + <<elseif _slave.trust < 50>> $He is so terrified of punishment that $he complies with the conversion process to avoid pain. $He knows that if $he does not obey, there will be pain, and if $he obeys, there may be pain but it will come later. <<else>> $He resists, of course, giving the compliance systems an excuse to unload quite a few volts of electricity into $him. This disobedience is one of $his more abortive attempts to resist your will, and it is $his last. @@ -318,27 +318,27 @@ the autosurgery, <</if>> and, a disturbingly short time later, there is a new Fuckdoll, a humanoid figure encased in a tough black bodysuit, in your office. - <<if !hasAnyLegs($activeSlave)>> - Its <<if isAmputee($activeSlave)>>limbless<<else>>legless<</if>> form is not obviously human. It's a sex toy, with several interesting holes and nothing else worth noticing. + <<if !hasAnyLegs(_slave)>> + Its <<if isAmputee(_slave)>>limbless<<else>>legless<</if>> form is not obviously human. It's a sex toy, with several interesting holes and nothing else worth noticing. <<else>> It stands immobile, the hydraulic system hidden within the suit stiffened to make voluntary movement impossible. <</if>> - <<if $activeSlave.boobs > 2000>> - The suit has a pair of gaps for its monstrous breasts, bare expanses of $activeSlave.skin skin. + <<if _slave.boobs > 2000>> + The suit has a pair of gaps for its monstrous breasts, bare expanses of _slave.skin skin. <</if>> - <<if $activeSlave.belly >= 5000>> - The suit has a gap for its big belly; a round dome of $activeSlave.skin skin. + <<if _slave.belly >= 5000>> + The suit has a gap for its big belly; a round dome of _slave.skin skin. <</if>> - <<if $activeSlave.lips > 40>> + <<if _slave.lips > 40>> Its upper hole is surrounded by a ludicrous set of swollen lips. <</if>> - <<if $activeSlave.labia > 0>> + <<if _slave.labia > 0>> The conversion process left its labia permanently engorged. <</if>> - <<if $activeSlave.vaginaLube > 0>> + <<if _slave.vaginaLube > 0>> Its front hole is dripping streams of natural lubrication. <</if>> - <<if $activeSlave.anus > 2>> + <<if _slave.anus > 2>> The gap in the suit over its rear hole opens into the Fuckdoll's interior, since it's the same size as the Fuckdoll's loose sphincter. <</if>> <br><br> @@ -350,7 +350,7 @@ <<if $PC.dick != 0>> You enter a command, and the Fuckdoll instantly <<if hasAnyLegs(_clonedSlave)>> - collapses to its knee<<if hasBothLegs($activeSlave)>>s<</if>>. + collapses to its knee<<if hasBothLegs(_slave)>>s<</if>>. <<else>> presents its upper hole. <</if>> @@ -370,7 +370,7 @@ <<else>> into a life of menial drudgery. This has little impact on your other human property. - <<if $activeSlave.relationship > 3>> + <<if _slave.relationship > 3>> $slaves[_sr].slaveName, for _his2 part, is @@.mediumorchid;saddened,@@ but not seriously affected. _He2 knew this was coming. <<set $slaves[_sr].devotion -= 5>> <</if>> @@ -385,9 +385,9 @@ <h3>Final notes...</h3> <div class="note"> <div class="indent"> - $His most recent task was to <<print $activeSlave.assignment>><<if $assignmentRecords[$activeSlave.ID]>>, and before that to <<print $assignmentRecords[$activeSlave.ID]>><</if>>. + $His most recent task was to <<print _slave.assignment>><<if $assignmentRecords[_slave.ID]>>, and before that to <<print $assignmentRecords[_slave.ID]>><</if>>. </div> - <<includeDOM slaveImpactLongTerm(V.activeSlave)>> + <<includeDOM slaveImpactLongTerm(_slave)>> </div> <<if $retired == 0>> /* retiring during the end week */ diff --git a/src/uncategorized/tfsFarmUpgrade.tw b/src/uncategorized/tfsFarmUpgrade.tw index 2513fa3268fcaa01ade5e2b3860b365a6b2b55a6..d2f11d88994a3eb086dee29f0c134a45a0fe4afc 100644 --- a/src/uncategorized/tfsFarmUpgrade.tw +++ b/src/uncategorized/tfsFarmUpgrade.tw @@ -30,14 +30,14 @@ whether we will use contraception after we are transformed." She shudders sudden <span id="result"> <<link "Permit them access, but tell them to use contraception">> <<replace "#result">> - You signify your assent, telling the Sister that the organ farm will accept seed tissue from any of them for the purpose of fabricating ovaries. To your mild surprise, she responds by breaking down into cutely inelegant crying. You add that you think the Sisters are beautiful as they are, and recruits will continue to approach them; it's not necessary for them to go through the rigors of pregnancy. It takes her a long time to manage to thank to properly, and she hurries to end the call before she can embarrass herself further. + You signify your assent, telling the Sister that the organ farm will accept seed tissue from any of them for the purpose of fabricating ovaries. To your mild surprise, she responds by breaking down into cutely inelegant crying. You add that you think the Sisters are beautiful as they are, and recruits will continue to approach them; it's not necessary for them to go through the rigors of pregnancy. It takes her a long time to manage to thank you properly, and she hurries to end the call before she can embarrass herself further. <<set $TFS.farmUpgrade = 1>> <</replace>> <</link>> <<if $seePreg != 0>> <br><<link "Permit them access, and encourage them to get pregnant">> <<replace "#result">> - You signify your assent, telling the Sister that the organ farm will accept seed tissue from any of them for the purpose of fabricating ovaries. To your mild surprise, she responds with cutely inelegant crying. You add that you think the world needs more Futanari Sisters, especially ones as cute and sexy as you're confident her many daughters will be. At that, she breaks down completely, one of her hands going to rub her belly gently. It takes her a long time to manage to thank to properly, and she hurries to end the call before she can embarrass herself further.<<if $arcologies[0].FSRestartDecoration == 100 && $eugenicsFullControl != 1>> The Societal Elite are @@.red;outraged@@ that you would not only allow such a breach of eugenics to occur, but encourage it.<</if>> + You signify your assent, telling the Sister that the organ farm will accept seed tissue from any of them for the purpose of fabricating ovaries. To your mild surprise, she responds with cutely inelegant crying. You add that you think the world needs more Futanari Sisters, especially ones as cute and sexy as you're confident her many daughters will be. At that, she breaks down completely, one of her hands going to rub her belly gently. It takes her a long time to manage to thank you properly, and she hurries to end the call before she can embarrass herself further.<<if $arcologies[0].FSRestartDecoration == 100 && $eugenicsFullControl != 1>> The Societal Elite are @@.red;outraged@@ that you would not only allow such a breach of eugenics to occur, but encourage it.<</if>> <<set $TFS.farmUpgrade = 2>> <<if $arcologies[0].FSRestart != "unset" && $eugenicsFullControl != 1>> <<set $failedElite += 275>> @@ -47,7 +47,7 @@ whether we will use contraception after we are transformed." She shudders sudden <<if $seeHyperPreg == 1>> <br><<link "Permit them access, and encourage them to embrace hyperpregnancy.">> <<replace "#result">> - You signify your assent, telling the Sister that the organ farm will accept seed tissue from any of them for the purpose of fabricating ovaries, so long as they are willing to bear as many children as they can handle. To your mild surprise, she responds with cutely inelegant crying. You add that you think the world needs many more Futanari Sisters, especially ones as cute and sexy as you're confident her countless daughters will be. At that, she breaks down completely, one of her hands going to rub her belly gently. It takes her a long time to manage to thank to properly, and she hurries to end the call before she can embarrass herself further.<<if $arcologies[0].FSRestartDecoration == 100 && $eugenicsFullControl != 1>> The Societal Elite are @@.red;outraged@@ that you would not only allow such a breach of eugenics to occur, but encourage it to such an obscene degree.<</if>> + You signify your assent, telling the Sister that the organ farm will accept seed tissue from any of them for the purpose of fabricating ovaries, so long as they are willing to bear as many children as they can handle. To your mild surprise, she responds with cutely inelegant crying. You add that you think the world needs many more Futanari Sisters, especially ones as cute and sexy as you're confident her countless daughters will be. At that, she breaks down completely, one of her hands going to rub her belly gently. It takes her a long time to manage to thank you properly, and she hurries to end the call before she can embarrass herself further.<<if $arcologies[0].FSRestartDecoration == 100 && $eugenicsFullControl != 1>> The Societal Elite are @@.red;outraged@@ that you would not only allow such a breach of eugenics to occur, but encourage it to such an obscene degree.<</if>> <<set $TFS.farmUpgrade = 3>> <<if $arcologies[0].FSRestart != "unset" && $eugenicsFullControl != 1>> <<set $failedElite += 1000>> @@ -58,7 +58,7 @@ whether we will use contraception after we are transformed." She shudders sudden /* <br><<link "Decline, but grant them something more fitting">> <<replace "#result">> - You decline her offer and propose a new one, letting the Sister know that the organ farm will accept seed tissue from any of them for the purpose of fabricating testicular ovaries, which should satisfy their desires, if in an unorthodox way. To your mild surprise, she responds with cutely inelegant crying. You add that you think the world needs more Futanari Sisters, especially ones as cute and sexy as you're confident her many daughters will be. At that, she breaks down completely, one of her hands going to rub her balls gently. It takes her a long time to manage to thank to properly, and she hurries to end the call before she can embarrass herself further.<<if $arcologies[0].FSRestartDecoration == 100 && $eugenicsFullControl != 1>> The Societal Elite are @@.red;outraged@@ that you would not only allow such a breach of eugenics to occur, but encourage it.<</if>> + You decline her offer and propose a new one, letting the Sister know that the organ farm will accept seed tissue from any of them for the purpose of fabricating testicular ovaries, which should satisfy their desires, if in an unorthodox way. To your mild surprise, she responds with cutely inelegant crying. You add that you think the world needs more Futanari Sisters, especially ones as cute and sexy as you're confident her many daughters will be. At that, she breaks down completely, one of her hands going to rub her balls gently. It takes her a long time to manage to thank you properly, and she hurries to end the call before she can embarrass herself further.<<if $arcologies[0].FSRestartDecoration == 100 && $eugenicsFullControl != 1>> The Societal Elite are @@.red;outraged@@ that you would not only allow such a breach of eugenics to occur, but encourage it.<</if>> <<set $TFS.farmUpgrade = 4>> <<if $arcologies[0].FSRestart != "unset" && $eugenicsFullControl != 1>> <<set $failedElite += 100>> diff --git a/src/utility/extendedFamilyWidgets.tw b/src/utility/extendedFamilyWidgets.tw deleted file mode 100644 index af8d2cc357d5925de8467e7208d1fb4041fe7f36..0000000000000000000000000000000000000000 --- a/src/utility/extendedFamilyWidgets.tw +++ /dev/null @@ -1,307 +0,0 @@ -:: extended family widgets [nobr widget] - -<<widget "parentName">> -<<if $activeSlave[$args[0]] == $PC.ID>> - You -<<else>> - <<set _j = $slaveIndices[$activeSlave[$args[0]]]>> - <<if def _j>> - <<print $slaves[_j].slaveName>> - <<else>> - Unknown - <</if>> -<</if>> -<</widget>> - -<<widget "redisplayFamily">> -<<replace '#dont-be-dumb'>><br> //You will break things by making impossible relations such as being your own father. If you do this, clearing all PC relations will fix it. Probably.//<</replace>> -<<replace '#fatheredNames'>><<= App.StartingGirls.listOfSlavesWithParent("father", $activeSlave.ID)>><</replace>> -<<replace '#motheredNames'>><<= App.StartingGirls.listOfSlavesWithParent("mother", $activeSlave.ID)>><</replace>> -<<replace '#familySummary'>><<= App.Desc.family($activeSlave)>><</replace>> -<<replace '#motherName'>><<parentName "mother">><</replace>> -<<replace '#fatherName'>><<parentName "father">><</replace>> -<<replace '#sameMotherNames'>><<= App.StartingGirls.listOfSlavesWithParent("mother", $activeSlave.mother)>><</replace>> -<<replace '#sameFatherNames'>><<= App.StartingGirls.listOfSlavesWithParent("father", $activeSlave.father)>><</replace>> -<<run App.StartingGirls.uncommittedFamilyTree($activeSlave)>> -<</widget>> - -<<widget "editFamily">> -<<set _allowPCFamily = ($freshPC == 1 || $saveImported == 0)>> -<div id="edit-family"><div id="family-table"> - -<span id="dont-be-dumb"></span> - -<br>''Mother:'' <span id="motherName"><<parentName "mother">></span> -<<link "Reset">> - <<set $activeSlave.mother = 0>> - <<redisplayFamily>> -<</link>> -<<if $PC.vagina > 0 && (($PC.actualAge - $activeSlave.actualAge) >= $fertilityAge) && (($PC.mother != $activeSlave.mother) || ($activeSlave.mother == 0)) && _allowPCFamily>> - | <<link "You">><<set $activeSlave.mother = $PC.ID>><<redisplayFamily>><</link>> -<</if>> -<<for _efw = 0; _efw < $slaves.length; _efw++>> - <<if $slaves[_efw].vagina > 0 && (($slaves[_efw].actualAge - $activeSlave.actualAge) >= $slaves[_efw].pubertyAgeXX) && (($slaves[_efw].mother != $activeSlave.mother) || ($activeSlave.mother == 0)) && $slaves[_efw].newGamePlus == 0>> - | - <<set _id = $slaves[_efw].ID>> - <<set _slaveName = $slaves[_efw].slaveName>> - <<print " - <<link _slaveName>> - <<set $activeSlave.mother = " + _id + ">> - <<redisplayFamily>> - <</link>> - ">> - <</if>> -<</for>> - -<br>''Father:'' <span id="fatherName"><<parentName "father">></span> -<<link "Reset">> - <<set $activeSlave.father = 0>> - <<redisplayFamily>> -<</link>> -<<if ($PC.dick > 0) && (($PC.actualAge - $activeSlave.actualAge) >= $potencyAge) && (($PC.father != $activeSlave.father) || ($activeSlave.father == 0)) && _allowPCFamily>> - | <<link "You">><<set $activeSlave.father = $PC.ID>><<redisplayFamily>><</link>> -<</if>> -<<for _efw = 0; _efw < $slaves.length; _efw++>> - <<if ($slaves[_efw].dick > 0) && ((($slaves[_efw].actualAge - $activeSlave.actualAge) >= $slaves[_efw].pubertyAgeXY)) && (($slaves[_efw].father != $activeSlave.father) || ($activeSlave.father == 0)) && $slaves[_efw].newGamePlus == 0>> - | - <<set _id = $slaves[_efw].ID>> - <<set _slaveName = $slaves[_efw].slaveName>> - <<print " - <<link _slaveName>> - <<set $activeSlave.father = " + _id + ">> - <<redisplayFamily>> - <</link>> - ">> - <</if>> -<</for>> - -<br>''Same mother as:'' <span id="sameMotherNames"><<= App.StartingGirls.listOfSlavesWithParent('mother', $activeSlave.mother)>></span> -<<link "Reset">> - <<set $activeSlave.mother = 0>> - <<redisplayFamily>> -<</link>> -<<if ($activeSlave.mother != $PC.ID) && ($PC.mother != $activeSlave.ID) && _allowPCFamily>> - | - <<link "You">> - <<if $PC.mother != 0>> - <<set $activeSlave.mother = $PC.mother>> - <<elseif $activeSlave.mother != 0>> - <<set $PC.mother = $activeSlave.mother>> - <<else>> - <<set $activeSlave.mother = -20 - 2*$activeSlave.ID>> - <<set $PC.mother = $activeSlave.mother>> - <</if>> - <<redisplayFamily>> - <</link>> -<</if>> -<<for _efw = 0; _efw < $slaves.length; _efw++>> - <<if $slaves[_efw].newGamePlus == 0>> - <<if $saveImported == 1>>|<</if>> - <<set _slaveName = $slaves[_efw].slaveName>> - <<set _slave = $slaves[_efw]>> - <<if ($activeSlave.mother != _slave.ID) && (_slave.mother != $activeSlave.ID)>> - | - <<print " - <<link _slaveName>> - <<set _slave = $slaves[" + _efw + "]>> - <<if _slave.mother != 0>> - <<set $activeSlave.mother = _slave.mother>> - <<elseif $activeSlave.mother != 0>> - <<set _slave.mother = $activeSlave.mother>> - <<else>> - <<set $activeSlave.mother = -20 - 2*$activeSlave.ID>> - <<set _slave.mother = $activeSlave.mother>> - <</if>> - <<redisplayFamily>> - <</link>> - ">> - <</if>> - <</if>> -<</for>> - -<br>''Same father as:'' <span id="sameFatherNames"><<= App.StartingGirls.listOfSlavesWithParent('father', $activeSlave.father)>></span> -<<link "Reset">> - <<set $activeSlave.father = 0>> - <<replace '#fatherName'>><</replace>> - <<replace '#sameFatherNames'>><</replace>> - <<redisplayFamily>> -<</link>> -<<if ($activeSlave.father != $PC.ID) && ($PC.father != $activeSlave.ID) && _allowPCFamily>> - | - <<link "You">> - <<if $PC.father != 0>> - <<set $activeSlave.father = $PC.father>> - <<elseif $activeSlave.father != 0>> - <<set $PC.father = $activeSlave.father>> - <<else>> - <<set $activeSlave.father = (-20 - 2*$activeSlave.ID -1)>> - <<set $PC.father = $activeSlave.father>> - <</if>> - <<redisplayFamily>> - <</link>> -<</if>> -<<for _efw = 0; _efw < $slaves.length; _efw++>> - <<if $slaves[_efw].newGamePlus == 0>> - <<if $saveImported == 1>>|<</if>> - <<set _slaveName = $slaves[_efw].slaveName>> - <<set _slave = $slaves[_efw]>> - <<if ($activeSlave.father != _slave.ID) && (_slave.father != $activeSlave.ID)>> - | - <<print " - <<link _slaveName>> - <<set _slave = $slaves[" + _efw + "]>> - <<if _slave.father != 0>> - <<set $activeSlave.father = _slave.father>> - <<elseif $activeSlave.father != 0>> - <<set _slave.father = $activeSlave.father>> - <<else>> - <<set $activeSlave.father = (-20 - 2*$activeSlave.ID -1)>> - <<set _slave.father = $activeSlave.father>> - <</if>> - <<redisplayFamily>> - <</link>> - ">> - <</if>> - <</if>> -<</for>> - -<br>''Mother of the children:'' <span id="motheredNames"><<= App.StartingGirls.listOfSlavesWithParent("mother", $activeSlave.ID)>></span> -<<link "Reset">> - <<for _efw = 0; _efw < $slaves.length; _efw++>> - <<if $slaves[_efw].mother == $activeSlave.ID && $slaves[_efw].newGamePlus == 0>> - <<set $slaves[_efw].mother = 0>> - <</if>> - <</for>> - <<if $PC.mother == $activeSlave.ID && _allowPCFamily>> - <<set $PC.mother = 0>> - <</if>> - <<redisplayFamily>> -<</link>> -<<if $activeSlave.vagina >= 0>> - <<if (($activeSlave.actualAge - $PC.actualAge) >= $fertilityAge) && (($PC.mother != $activeSlave.mother) || ($activeSlave.mother == 0)) && _allowPCFamily>> - | - <<link "You">> - <<set $PC.mother = $activeSlave.ID>> - <<if $activeSlave.vagina == 0>> - <<set $activeSlave.vagina = 1>> - <</if>> - <<redisplayFamily>> - <</link>> - <</if>> - - <<for _efw = 0; _efw < $slaves.length; _efw++>> - <<if $slaves[_efw].newGamePlus == 0>> - <<set _slaveName = $slaves[_efw].slaveName>> - <<set _slave = $slaves[_efw]>> - <<if (($activeSlave.actualAge - _slave.actualAge) >= $fertilityAge) && ((_slave.mother != $activeSlave.mother) || ($activeSlave.mother == 0))>> - | - <<print " - <<link _slaveName>> - <<set _slave = $slaves[" + _efw + "]>> - <<set _slave.mother = $activeSlave.ID>> - <<if $activeSlave.vagina == 0>> - <<set $activeSlave.vagina = 1>> - <</if>> - <<redisplayFamily>> - <</link>> - ">> - <</if>> - <</if>> - <</for>> -<</if>> - -<br>''Father of the children:'' <span id="fatheredNames"><<= App.StartingGirls.listOfSlavesWithParent("father", $activeSlave.ID)>></span> -<<link "Reset">> - <<for _efw = 0; _efw < $slaves.length; _efw++>> - <<if $slaves[_efw].father == $activeSlave.ID && $slaves[_efw].newGamePlus == 0>> - <<set $slaves[_efw].father = 0>> - <</if>> - <</for>> - <<if $PC.father == $activeSlave.ID && _allowPCFamily>> - <<set $PC.father = 0>> - <</if>> - <<redisplayFamily>> -<</link>> -<<if $activeSlave.dick > 0>> - <<if (($activeSlave.actualAge - $PC.actualAge) >= $potencyAge) && (($PC.father != $activeSlave.father) || ($activeSlave.father == 0)) && _allowPCFamily>> - | - <<link "You">> - <<set $PC.father = $activeSlave.ID>> - <<redisplayFamily>> - <</link>> - <</if>> - - <<for _efw = 0; _efw < $slaves.length; _efw++>> - <<if $slaves[_efw].newGamePlus == 0>> - <<set _slaveName = $slaves[_efw].slaveName>> - <<set _slave = $slaves[_efw]>> - <<if (($activeSlave.actualAge - _slave.actualAge) >= $potencyAge) && ((_slave.father != $activeSlave.father) || ($activeSlave.father == 0))>> - | - <<print " - <<link _slaveName>> - <<set _slave = $slaves[" + _efw + "]>> - <<set _slave.father = $activeSlave.ID>> - <<redisplayFamily>> - <</link>> - ">> - <</if>> - <</if>> - <</for>> -<</if>> - -<br> -<<if _allowPCFamily>> - <<link "Reset ALL PC Relatives">> - <<set _sameMother = 0, _sameFather = 0>> - <<for _efw = 0; _efw < $slaves.length; _efw++>> - <<if $slaves[_efw].newGamePlus == 0>> - <<if $slaves[_efw].mother == $PC.ID>> - <<set $slaves[_efw].mother = 0>> - <</if>> - <<if $slaves[_efw].father == $PC.ID>> - <<set $slaves[_efw].father = 0>> - <</if>> - <<if $slaves[_efw].mother == $PC.mother>> - <<set _sameMother++>> - <</if>> - <<if $slaves[_efw].father == $PC.father>> - <<set _sameFather++>> - <</if>> - <</if>> - <</for>> - <<if _sameMother == 0 && $activeSlave.mother == $PC.mother>> - <<set $activeSlave.mother = 0>> - <</if>> - <<if _sameFather == 0 && $activeSlave.father == $PC.father>> - <<set $activeSlave.father = 0>> - <</if>> - <<for _efw = 0; (_efw < $slaves.length && (_sameMother == 1 || _sameFather == 1)); _efw++>> - <<if $slaves[_efw].newGamePlus == 0>> - <<if $slaves[_efw].mother == $PC.mother && _sameMother == 1>> - <<set $slaves[_efw].mother = 0, _sameMother = 0>> - <</if>> - <<if $slaves[_efw].father == $PC.father && _sameFather == 1>> - <<set $slaves[_efw].father = 0, _sameFather = 0>> - <</if>> - <</if>> - <</for>> - <<if $activeSlave.mother == $PC.ID>> - <<set $activeSlave.mother = 0>> - <</if>> - <<if $activeSlave.father == $PC.ID>> - <<set $activeSlave.father = 0>> - <</if>> - <<set $PC.father = 0>> - <<set $PC.mother = 0>> - <<redisplayFamily>> - <</link>> -<</if>> - -<br> - <span id="familySummary"><<= App.Desc.family($activeSlave)>></span> -<br> -</div> -<div id="family-tree"></div> -</div> - -<</widget>>