diff --git a/.gitignore b/.gitignore index ec93e78dba80af00f0ea5d6d850f71e01effc949..a4201c23f5f846ad8aff2c6941f5f6511272b99d 100644 --- a/.gitignore +++ b/.gitignore @@ -103,4 +103,5 @@ package.json fc-pregmod *.outline *.todo -TODO.txt \ No newline at end of file +TODO.txt +.vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..7a73a41bfdf76d6f793007240d80983a52f15f97 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/SanityCheck.jar b/SanityCheck.jar index bebdf1da3e6277f966e8fff78ea96d884fe27b0b..478417de473b6dd0de5575eef4d474e2ef3d7073 100644 Binary files a/SanityCheck.jar and b/SanityCheck.jar differ diff --git a/compile b/compile index d44d129ab69d49563aebeec6f894f4e42b013f7a..c9bb6c0cd576c3111a246d3985f774f3c7670586 100755 --- a/compile +++ b/compile @@ -66,3 +66,6 @@ fi #Make the output prettier, replacing \t with a tab and \n with a newline sed -i -e '/^.*<div id="store-area".*$/s/\\t/\t/g' -e '/^.*<div id="store-area".*$/s/\\n/\n/g' bin/FC_pregmod_tmp.html \ && mv bin/FC_pregmod_tmp.html bin/FC_pregmod.html + +echo "bin/FC_pregmod.html compilation finished." + diff --git a/compile-git b/compile-git index 92331b4916db9a0906e43e383916518ab689f2e5..43304f9a1090397b866dd284c853f9b6a80502ad 100755 --- a/compile-git +++ b/compile-git @@ -41,4 +41,4 @@ $TWEEGO_EXE -o "bin/FC_pregmod_${HASH}_tmp.html" src/ sed -i -e '/^<div id="store-area".*$/s/\\t/\t/g' -e '/^<div id="store-area".*$/s/\\n/\n/g' "bin/FC_pregmod_${HASH}_tmp.html" \ && mv "bin/FC_pregmod_${HASH}_tmp.html" "bin/FC_pregmod_${HASH}.html" -echo "FC_pregmod_$HASH.html compilation finished." +echo "bin/FC_pregmod_$HASH.html compilation finished." diff --git a/compile-git+java-sanityCheck.bat b/compile-git+java-sanityCheck.bat new file mode 100644 index 0000000000000000000000000000000000000000..b1050a2d7d8a4257f1ba91cdafccb5f6b7f8daec --- /dev/null +++ b/compile-git+java-sanityCheck.bat @@ -0,0 +1,39 @@ +@echo off +:: Free Cities Basic Compiler - Windows + +:: Set working directory +pushd %~dp0 + +:: See if we can find a git installation +setlocal enabledelayedexpansion + +for %%k in (HKCU HKLM) do ( + for %%w in (\ \Wow6432Node\) do ( + for /f "skip=2 delims=: tokens=1*" %%a in ('reg query "%%k\SOFTWARE%%wMicrosoft\Windows\CurrentVersion\Uninstall\Git_is1" /v InstallLocation 2^> nul') do ( + for /f "tokens=3" %%z in ("%%a") do ( + set GIT=%%z:%%b + set GITFOUND=yes + goto FOUND + ) + ) + ) +) +:FOUND +if %GITFOUND% == yes ( + set "PATH=%GIT%bin;%PATH%" + bash --login -c ./java+gitGrep-sanityCheck.sh +) + +:: Compile the game +call "%~dp0compile.bat" + +if %GITFOUND% == yes ( + :: Make the output prettier, replacing \t with a tab and \n with a newline + bash -c "sed -i -e '/^.*<div id=\"store-area\".*$/s/\\\t/\t/g' -e '/^.*<div id=\"store-area\".*$/s/\\\n/\n/g' bin/FC_pregmod.html" + + :: Revert ./src/init/storyInit.tw for next compilation + git checkout -- ./src/init/storyInit.tw +) + +popd +PAUSE diff --git a/compile-git+java-sanityCheck.sh b/compile-git+java-sanityCheck.sh new file mode 100755 index 0000000000000000000000000000000000000000..53f1ec1f7aacd71618fa8276424dea09140751f5 --- /dev/null +++ b/compile-git+java-sanityCheck.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# Run sanity check. +./java+gitGrep-sanityCheck.sh + +HASH="$(git rev-list -n 1 --abbrev-commit HEAD)" + +export TWEEGO_PATH=devTools/tweeGo/storyFormats +TWEEGO_EXE="tweego" + +if hash $TWEEGO_EXE 2>/dev/null; then + echo "system tweego binary" +else + case "$(uname -m)" in + x86_64|amd64) + echo "x64 arch" + if [ "$(uname -s)" = "Darwin" ]; then + TWEEGO_EXE="./devTools/tweeGo/tweego_osx64" + else + TWEEGO_EXE="./devTools/tweeGo/tweego_nix64" + fi + ;; + x86|i[3-6]86) + echo "x86 arch" + if [ "$(uname -s)" = "Darwin" ]; then + TWEEGO_EXE="./devTools/tweeGo/tweego_osx86" + else + TWEEGO_EXE="./devTools/tweeGo/tweego_nix86" + fi + ;; + *) + echo "No system tweego binary found, and no precompiled binary for your platform available" + echo "Please compile tweego and put the executable in PATH" + exit 2 + esac +fi + +$TWEEGO_EXE -o "bin/FC_pregmod_${HASH}_tmp.html" src/ + +#Make the output prettier, replacing \t with a tab and \n with a newline +sed -i -e '/^<div id="store-area".*$/s/\\t/\t/g' -e '/^<div id="store-area".*$/s/\\n/\n/g' "bin/FC_pregmod_${HASH}_tmp.html" \ + && mv "bin/FC_pregmod_${HASH}_tmp.html" "bin/FC_pregmod_${HASH}.html" + +echo "FC_pregmod_$HASH.html compilation finished." diff --git a/devNotes/Useful JS Function Documentation.txt b/devNotes/Useful JS Function Documentation.txt index f0e1e92a9e73e1da7cba0f26865d7308bb427605..8f1186b094e7df8479a806c141d379f88b14df9d 100644 --- a/devNotes/Useful JS Function Documentation.txt +++ b/devNotes/Useful JS Function Documentation.txt @@ -346,4 +346,6 @@ UtilJS [script] removeDuplicates() - Takes an array and returns a new array without duplicate entries - HackingSkillMultiplier() - outputs a value based off of the PC's hacking skill. \ No newline at end of file + HackingSkillMultiplier() - outputs a value based off of the PC's hacking skill. + + upgradeMultiplierArcology() - outputs a value based off of the PC's engineering skill. diff --git a/devNotes/VersionChangeLog-Premod+LoliMod.txt b/devNotes/VersionChangeLog-Premod+LoliMod.txt index ab5ff93babc9ee0ca6b8f7bf156a3212890fe177..579ba6ae6c235153c6a1bfdc7ed4eb98b9da19bd 100644 --- a/devNotes/VersionChangeLog-Premod+LoliMod.txt +++ b/devNotes/VersionChangeLog-Premod+LoliMod.txt @@ -2,6 +2,13 @@ Pregmod 0.10.7.1-2.2.x +03/13/2019 + + 4 + -fixes + -code cleaning + -player engineering skill now functional + 03/11/2019 3 diff --git a/devNotes/twine CSS b/devNotes/twine CSS index 0c11d518885273e3fa7335bb94c87d15efb5d4a1..1d74d7da5628dd716ca811c5ede5e0203faae835 100644 --- a/devNotes/twine CSS +++ b/devNotes/twine CSS @@ -623,3 +623,35 @@ div.tab button.active { opacity: 1; } } + +/*:: Options Macro [stylesheet]*/ + +.optionMacroDescription { +} + +.optionMacroOption { +} + +/* Seperate each option with a | */ +.optionMacroOption::after { + content: " | "; +} + +/* But don't add the | after the last one */ +.optionMacroOption:last-child::after { + content: unset; +} + + +.optionMacroOption a { +} + +.optionMacroOption:hover { +} + +.optionMacroSelected { +} + +/* Container div of the list of options */ +.optionMacroOptionsList { +} diff --git a/devTools/javaSanityCheck/excluded b/devTools/javaSanityCheck/excluded index 28ff834dcbab00ca86653880aa605a6a64163fd2..eb522cb6bac88f489da3aeae75878591398e5838 100644 --- a/devTools/javaSanityCheck/excluded +++ b/devTools/javaSanityCheck/excluded @@ -3,14 +3,4 @@ # src/art/ src/gui/svgFilters.tw -# -#excluded to reduce false positives until better solution: -src/pregmod/basenationalitiesControls.tw src/pregmod/editGenetics.tw -src/pregmod/widgets/bodySwapReaction.tw -src/uncategorized/costsBudget.tw -src/uncategorized/initRules.tw -src/uncategorized/slaveAssignmentsReport.tw -src/uncategorized/storyCaption.tw -src/cheats/ -src/pregmod/customizeSlaveTrade.tw diff --git a/devTools/javaSanityCheck/htmlTags b/devTools/javaSanityCheck/htmlTags index 751b084ff5822f4162e3f79ea622b91f60c5472b..466a9b301e715f5b896bd84c38941bf61c4ec985 100644 --- a/devTools/javaSanityCheck/htmlTags +++ b/devTools/javaSanityCheck/htmlTags @@ -8,6 +8,7 @@ #included to reduce false positives until better solution !-- http://www.gnu.org/licenses/ +-400 #html tags a;1 b;1 diff --git a/devTools/javaSanityCheck/src/DisallowedTagException.java b/devTools/javaSanityCheck/src/DisallowedTagException.java index cd479fbdf5f9c8b42a9271b8c0049cba10bcb72a..f4cc75e736b162192a5f18bbc55a10edb21eaa38 100644 --- a/devTools/javaSanityCheck/src/DisallowedTagException.java +++ b/devTools/javaSanityCheck/src/DisallowedTagException.java @@ -2,7 +2,7 @@ package org.arkerthan.sanityCheck; public class DisallowedTagException extends RuntimeException { - public DisallowedTagException(String tag) { - super(tag); - } + public DisallowedTagException(String tag) { + super(tag); + } } diff --git a/devTools/javaSanityCheck/src/Main.java b/devTools/javaSanityCheck/src/Main.java index d8af45777314f08b03eb5f471be4cdb9ba72f703..9c2d72a8ebe019e565a56e8daf3625c50c4b0f6d 100644 --- a/devTools/javaSanityCheck/src/Main.java +++ b/devTools/javaSanityCheck/src/Main.java @@ -12,308 +12,317 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +/** + * @author Arkerthan + */ public class Main { - public static TagSearchTree<Tag> htmlTags, twineTags; - private static String currentFile; - private static int currentLine, currentPosition; - private static Stack<Element> stack; - private static List<SyntaxError> errors = new LinkedList<>(); - private static String[] excluded; - - public static void main(String[] args) { - //setup - setupExclude(); - setupHtmlTags(); - setupTwineTags(); - Path workingDir = Paths.get("").toAbsolutePath(); - - //actual sanityCheck - runSanityCheckInDirectory(workingDir, new File("src/")); - - //handle errors - for (SyntaxError e : - errors) { - System.out.println(e.getError()); - } - } - - - /** - * Goes through the whole directory including subdirectories and runs - * sanityCheck() on all .tw files - * - * @param dir to be checked - */ - private static void runSanityCheckInDirectory(Path workingDir, File dir) { - //subdirectories are checked recursively - - try { - for (File file : dir.listFiles()) { - if (file.isFile()) { //run sanityCheck if file is a .tw file - String path = file.getAbsolutePath(); - if (path.endsWith(".tw")) { - sanityCheck(workingDir.relativize(file.toPath())); - } - } else if (file.isDirectory()) { - runSanityCheckInDirectory(workingDir, file.getAbsoluteFile()); - } - } - } catch (NullPointerException e) { - e.printStackTrace(); - System.err.println("Couldn't find directory " + currentFile); - System.exit(-1); - } - } - - /** - * Runs the sanity check for one file. Does not run if file is excluded. - * - * @param path file to be checked - */ - private static void sanityCheck(Path path) { - File file = path.toFile(); - - // replace this with a known encoding if possible - Charset encoding = Charset.defaultCharset(); - - if (!excluded(file.getPath())) { - try { - currentFile = file.getPath(); - currentLine = 1; - stack = new Stack<>(); - - //actually opening and reading the file - try (InputStream in = new FileInputStream(file); - Reader reader = new InputStreamReader(in, encoding); - // buffer for efficiency - Reader buffer = new BufferedReader(reader)) { - handleCharacters(buffer); - } - } catch (IOException e) { - System.err.println("Couldn't read " + file); - } - } - } - - /** - * sets up the alphabetical search tree for fast access of HTML tags later - */ - private static void setupHtmlTags() { - //load HTML tags into a list - List<Tag> TagsList = new LinkedList<>(); - try { - - Files.lines(new File("devTools/javaSanityCheck/htmlTags").toPath()).map(String::trim) - .filter(s -> !s.startsWith("#")) - .forEach(s -> TagsList.add(parseTag(s))); - } catch (IOException e) { - System.err.println("Couldn't read devTools/javaSanityCheck/htmlTags"); - } - - //turn List into alphabetical search tree - try { - htmlTags = new TagSearchTree(TagsList); - } catch (ArrayIndexOutOfBoundsException e) { - System.err.println("Illegal Character in devTools/javaSanityCheck/htmlTags"); - System.exit(-1); - } - } - - /** - * sets up the alphabetical search tree for fast access of twine tags later - */ - private static void setupTwineTags() { - //load twine tags into a list - List<Tag> TagsList = new LinkedList<>(); - try { - - Files.lines(new File("devTools/javaSanityCheck/twineTags").toPath()).map(String::trim) - .filter(s -> !s.startsWith("#")) - .forEach(s -> TagsList.add(parseTag(s))); - } catch (IOException e) { - System.err.println("Couldn't read devTools/javaSanityCheck/twineTags"); - } - - //turn List into alphabetical search tree - try { - twineTags = new TagSearchTree(TagsList); - } catch (ArrayIndexOutOfBoundsException e) { - System.err.println("Illegal Character in devTools/javaSanityCheck/twineTags"); - System.exit(-1); - } - } - - /** - * Turns a string into a Tag - * ";1" at the end of the String indicates that the tag needs to be closed later - * - * @param s tag as String - * @return tag as Tag - */ - private static Tag parseTag(String s) { - String[] st = s.split(";"); - if (st.length > 1 && st[1].equals("1")) { - return new Tag(st[0], false); - } - return new Tag(st[0], true); - } - - /** - * sets up the excluded array. - */ - private static void setupExclude() { - //load excluded files - List<String> excludedList = new ArrayList<>(); - try { - Files.lines(new File("devTools/javaSanityCheck/excluded").toPath()).map(String::trim) - .filter(s -> !s.startsWith("#")) - .forEach(excludedList::add); - } catch (IOException e) { - System.err.println("Couldn't read devTools/javaSanityCheck/excluded"); - } - - //turn excluded files into an array and change them to windows style if needed - if (isWindows()) { - excluded = new String[excludedList.size()]; - int i = 0; - for (String s : - excludedList) { - excluded[i++] = s.replaceAll("/", "\\\\"); - } - } else { - excluded = excludedList.toArray(new String[0]); - } - } - - /** - * @return whether OS is Windows or not - */ - private static boolean isWindows() { - return (System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows")); - } - - /** - * checks if a file or directory is excluded from the sanity check - * - * @param s file/directory to be checked - * @return whether it is excluded or not - */ - private static boolean excluded(String s) { - for (String ex : - excluded) { - if (s.startsWith(ex)) return true; - } - return false; - } - - /** - * Reads the file character by character. - * - * @param reader reader that is read - * @throws IOException thrown if the file can't be read - */ - private static void handleCharacters(Reader reader) throws IOException { - int r; - while ((r = reader.read()) != -1) { - char c = (char) r; - handleCharacter(c); - } - } - - /** - * Handles a single character - * - * @param c next character - */ - private static void handleCharacter(char c) { - //updating position - currentPosition++; - if (c == '\n') { - currentLine++; - currentPosition = 1; - } - - //try applying to the innermost element - if (!stack.empty()) { - int change; - try { - change = stack.peek().handleChar(c); - } catch (SyntaxError e) { - change = e.getChange(); - addError(e); - } - - //change greater 0 means the innermost element did some work - if (change > 0) { - //2 means the Element is complete - if (change == 2) { - //remove the topmost element from stack since it is complete - stack.pop(); - return; - } - //3 means the Element is complete and part of a two tag system - if (change == 3) { - //remove the topmost element from stack since it is complete - KnownElement k = stack.pop().getKnownElement(); - /*if (k.isOpening()) { - stack.push(k); - } else */ - if (k.isClosing()) { - if (stack.empty()) { - addError(new SyntaxError("Closed tag " + k.getShortDescription() + " without having any open tags.", -2)); - } else if (stack.peek() instanceof KnownElement) { - KnownElement kFirst = (KnownElement) stack.pop(); - if (!kFirst.isMatchingElement(k)) { - addError(new SyntaxError("Opening tag " + kFirst.getShortDescription() + - " does not match closing tag " + k.getShortDescription() + ".", -2)); - } - //stack.pop(); - } else { - addError(new SyntaxError("Closing tag " + k.getShortDescription() + " inside " + - "another tag: " + stack.peek().getShortDescription(), -2, true)); - } - } - if (k.isOpening()) { - stack.push(k); - } - return; - } - if (change == 4) { - stack.pop(); - } else { - return; - } - } - } - - - //innermost element was uninterested, trying to find matching element - switch (c) { - //case '@': - // stack.push(new AtElement(currentLine, currentPosition)); - //break; - case '<': - stack.push(new AngleBracketElement(currentLine, currentPosition)); - break; - //case '>': - //addError(new SyntaxError("Dangling \">\", current innermost: " + (stack.empty() ? "null" : stack.peek().getShortDescription()), -2)); - //break; - case '/': - stack.push(new CommentElement(currentLine, currentPosition)); - break; - } - } - - /** - * add an error to the error list - * - * @param e new error - */ - private static void addError(SyntaxError e) { - e.setFile(currentFile); - e.setLine(currentLine); - e.setPosition(currentPosition); - errors.add(e); - } + public static TagSearchTree<Tag> htmlTags, twineTags; + private static String currentFile; + private static int currentLine, currentPosition; + private static Stack<Element> stack; + private static List<SyntaxError> errors = new LinkedList<>(); + private static String[] excluded; + + public static void main(String[] args) { + + //setup + setupExclude(); + setupHtmlTags(); + setupTwineTags(); + Path workingDir = Paths.get("").toAbsolutePath(); + + //actual sanityCheck + runSanityCheckInDirectory(workingDir, new File("src/")); + + //output errors + for (SyntaxError e : + errors) { + System.out.println(e.getError()); + } + } + + + /** + * Goes through the whole directory including subdirectories and runs + * {@link Main#sanityCheck(Path)} on all .tw files + * + * @param dir to be checked + */ + private static void runSanityCheckInDirectory(Path workingDir, File dir) { + //subdirectories are checked recursively + + try { + for (File file : dir.listFiles()) { + if (file.isFile()) { //run sanityCheck if file is a .tw file + String path = file.getAbsolutePath(); + if (path.endsWith(".tw")) { + sanityCheck(workingDir.relativize(file.toPath())); + } + } else if (file.isDirectory()) { + runSanityCheckInDirectory(workingDir, file.getAbsoluteFile()); + } + } + } catch (NullPointerException e) { + e.printStackTrace(); + System.err.println("Couldn't read directory " + currentFile); + System.exit(-1); + } + } + + /** + * Runs the sanity check for one file. Does not run if file is excluded. + * + * @param path file to be checked + */ + private static void sanityCheck(Path path) { + File file = path.toFile(); + + // replace this with a known encoding if possible + Charset encoding = Charset.defaultCharset(); + + if (!excluded(file.getPath())) { + currentFile = file.getPath(); + currentLine = 1; + stack = new Stack<>(); + + //actually opening and reading the file + try (InputStream in = new FileInputStream(file); + Reader reader = new InputStreamReader(in, encoding); + // buffer for efficiency + Reader buffer = new BufferedReader(reader)) { + handleCharacters(buffer); + } catch (IOException e) { + e.printStackTrace(); + System.err.println("Couldn't read " + file); + } + } + } + + /** + * sets up a {@link TagSearchTree<Tag>} for fast access of HTML tags later + */ + private static void setupHtmlTags() { + //load HTML tags into a list + List<Tag> TagsList = loadTags("devTools/javaSanityCheck/htmlTags"); + + //turn List into alphabetical search tree + try { + htmlTags = new TagSearchTree<>(TagsList); + } catch (ArrayIndexOutOfBoundsException e) { + System.err.println("Illegal Character in devTools/javaSanityCheck/htmlTags"); + System.exit(-1); + } + } + + /** + * sets up a {@link TagSearchTree<Tag>} for fast access of twine tags later + */ + private static void setupTwineTags() { + //load twine tags into a list + List tagsList = loadTags("devTools/javaSanityCheck/twineTags"); + + //turn List into alphabetical search tree + try { + twineTags = new TagSearchTree<>(tagsList); + } catch (ArrayIndexOutOfBoundsException e) { + System.err.println("Illegal Character in devTools/javaSanityCheck/twineTags"); + System.exit(-1); + } + } + + /** + * Loads a list of tags from a file + * + * @param filePath file to load tags from + * @return loaded tags + */ + private static List<Tag> loadTags(String filePath) { + List<Tag> tagsList = new LinkedList<>(); + try { + Files.lines(new File(filePath).toPath()).map(String::trim) + .filter(s -> !s.startsWith("#")) + .forEach(s -> tagsList.add(parseTag(s))); + } catch (IOException e) { + System.err.println("Couldn't read " + filePath); + } + return tagsList; + } + + /** + * Turns a string into a Tag + * ";1" at the end of the String indicates that the tag needs to be closed later + * + * @param s tag as String + * @return tag as Tag + */ + private static Tag parseTag(String s) { + String[] st = s.split(";"); + if (st.length > 1 && st[1].equals("1")) { + return new Tag(st[0], false); + } + return new Tag(st[0], true); + } + + /** + * sets up the excluded files array. + */ + private static void setupExclude() { + //load excluded files + List<String> excludedList = new ArrayList<>(); + try { + Files.lines(new File("devTools/javaSanityCheck/excluded").toPath()).map(String::trim) + .filter(s -> !s.startsWith("#")) + .forEach(excludedList::add); + } catch (IOException e) { + System.err.println("Couldn't read devTools/javaSanityCheck/excluded"); + } + + //turn excluded files into an array and change path to windows style if needed + if (isWindows()) { + excluded = new String[excludedList.size()]; + int i = 0; + for (String s : + excludedList) { + excluded[i++] = s.replaceAll("/", "\\\\"); + } + } else { + excluded = excludedList.toArray(new String[0]); + } + } + + /** + * @return whether OS is Windows or not + */ + private static boolean isWindows() { + return (System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows")); + } + + /** + * checks if a file or directory is excluded from the sanity check + * + * @param s file/directory to be checked + * @return whether it is excluded or not + */ + private static boolean excluded(String s) { + for (String ex : + excluded) { + if (s.startsWith(ex)) return true; + } + return false; + } + + /** + * Reads the file character by character. + * + * @param reader reader that is read + * @throws IOException thrown if the file can't be read + */ + private static void handleCharacters(Reader reader) throws IOException { + int r; + while ((r = reader.read()) != -1) { + char c = (char) r; + handleCharacter(c); + } + } + + /** + * Handles a single character + * + * @param c next character + */ + private static void handleCharacter(char c) { + //updating position + currentPosition++; + if (c == '\n') { + currentLine++; + currentPosition = 1; + } + + //try applying to the innermost element + if (!stack.empty()) { + int change; + try { + change = stack.peek().handleChar(c); + } catch (SyntaxError e) { + change = e.getChange(); + addError(e); + } + + //change greater 0 means the innermost element did some work + if (change > 0) { + //2 means the Element is complete + if (change == 2) { + //remove the topmost element from stack since it is complete + stack.pop(); + return; + } + //3 means the Element is complete and part of a two or more tag system + if (change == 3) { + //remove the topmost element from stack since it is complete + KnownElement k = stack.pop().getKnownElement(); + //if KnownElement k is closing another element, check if there is one and remove it + if (k.isClosing()) { + if (stack.empty()) { //there are no open elements at all + addError(new SyntaxError("Closed tag " + k.getShortDescription() + " without " + + "having any open tags.", -2)); + } else if (stack.peek() instanceof KnownElement) { + //get opening tag + KnownElement kFirst = (KnownElement) stack.pop(); + //check if closing element matches the opening element + if (!kFirst.isMatchingElement(k)) { + addError(new SyntaxError("Opening tag " + kFirst.getShortDescription() + + " does not match closing tag " + k.getShortDescription() + ".", -2)); + } + } else { + //There closing tag inside another not Known element: <div </html> + addError(new SyntaxError("Closing tag " + k.getShortDescription() + " inside " + + "another tag " + stack.peek().getShortDescription() + " without opening first.", + -2, true)); + } + } + //check if the element needs to be closed by another + if (k.isOpening()) { + stack.push(k); + } + return; + } + //means the element couldn't do anything with it and is finished + if (change == 4) { + stack.pop(); + } else { + return; + } + } + } + + + //innermost element was uninterested, trying to find matching element + switch (c) { + //case '@': + //stack.push(new AtElement(currentLine, currentPosition)); + //break; + case '<': + stack.push(new AngleBracketElement(currentLine, currentPosition)); + break; + //case '>': + //addError(new SyntaxError("Dangling \">\", current innermost: " + (stack.empty() ? "null" : stack.peek().getShortDescription()), -2)); + //break; + case '/': + stack.push(new CommentElement(currentLine, currentPosition)); + break; + } + } + + /** + * add an error to the error list + * + * @param e new error + */ + private static void addError(SyntaxError e) { + e.setFile(currentFile); + e.setLine(currentLine); + e.setPosition(currentPosition); + errors.add(e); + } } diff --git a/devTools/javaSanityCheck/src/SyntaxError.java b/devTools/javaSanityCheck/src/SyntaxError.java index 2eaf24c6ec434192048c93891d72897c29dea9a6..ad7aa7cdf3c2c2f01caa4f552f01180861d3569a 100644 --- a/devTools/javaSanityCheck/src/SyntaxError.java +++ b/devTools/javaSanityCheck/src/SyntaxError.java @@ -1,40 +1,64 @@ package org.arkerthan.sanityCheck; public class SyntaxError extends Exception { - private String file; - private int line, position; - private String description; - private int change; //see Element for values; -2 means not thrown - private boolean warning = false; - - public SyntaxError(String description, int change) { - this.description = description; - this.change = change; - } - - public SyntaxError(String description, int change, boolean warning) { - this(description, change); - this.warning = warning; - } - - public void setFile(String file) { - this.file = file; - } - - public void setLine(int line) { - this.line = line; - } - - public void setPosition(int position) { - this.position = position; - } - - public String getError() { - String s = warning ? "Warning: " : "Error: "; - return s + file + ": " + line + ":" + position + " : "+ description; - } - - public int getChange() { - return change; - } + private String file; + private int line, position; + private String description; + private int change; //see Element for values; -2 means not thrown + private boolean warning = false; + + /** + * @param description description of error + * @param change state change as specified in Element + */ + public SyntaxError(String description, int change) { + this.description = description; + this.change = change; + } + + /** + * @param description description of error + * @param change state change as specified in Element + * @param warning whether it is a warning or an error + */ + public SyntaxError(String description, int change, boolean warning) { + this(description, change); + this.warning = warning; + } + + /** + * @param file at which the error occurred + */ + public void setFile(String file) { + this.file = file; + } + + /** + * @param line in which the error occurred + */ + public void setLine(int line) { + this.line = line; + } + + /** + * @param position at which the error occurred + */ + public void setPosition(int position) { + this.position = position; + } + + /** + * @return error message + */ + public String getError() { + String s = warning ? "Warning: " : "Error: "; + return s + file + ": " + line + ":" + position + " : " + description; + } + + /** + * @return change that happened in Element before it was thrown. -1 if not thrown. + */ + public int getChange() { + return change; + } } diff --git a/devTools/javaSanityCheck/src/Tag.java b/devTools/javaSanityCheck/src/Tag.java index 5c3c92651a71beb8a4e3cba73d1eb64238fc9908..8a13ee4f7a178399db3eaf626b693e8a12ae71df 100644 --- a/devTools/javaSanityCheck/src/Tag.java +++ b/devTools/javaSanityCheck/src/Tag.java @@ -1,11 +1,11 @@ package org.arkerthan.sanityCheck; public class Tag { - public final String tag; - public final boolean single; + public final String tag; + public final boolean single; - public Tag(String tag, boolean single) { - this.tag = tag; - this.single = single; - } + public Tag(String tag, boolean single) { + this.tag = tag; + this.single = single; + } } diff --git a/devTools/javaSanityCheck/src/TagSearchTree.java b/devTools/javaSanityCheck/src/TagSearchTree.java index 71e89ec769ff658b246886a179976055f2633709..dde49df879a346f124d15647cfeb821d0e0735fb 100644 --- a/devTools/javaSanityCheck/src/TagSearchTree.java +++ b/devTools/javaSanityCheck/src/TagSearchTree.java @@ -9,72 +9,72 @@ import java.util.List; * @param <E> Tag class to be stored */ public class TagSearchTree<E extends Tag> { - private static final int SIZE = 128; - private final TagSearchTree<E>[] branches; - private E element = null; - private String path; + private static final int SIZE = 128; + private final TagSearchTree<E>[] branches; + private E element = null; + private String path; - /** - * creates a new empty TagSearchTree - */ - private TagSearchTree() { - branches = new TagSearchTree[SIZE]; - } + /** + * creates a new empty TagSearchTree + */ + private TagSearchTree() { + branches = new TagSearchTree[SIZE]; + } - /** - * Creates a new filled TagSearchTree - * - * @param list Tags to be inserted - */ - public TagSearchTree(List<E> list) { - this(); - for (E e : list) { - this.add(e, 0); - } - } + /** + * Creates a new filled TagSearchTree + * + * @param list Tags to be inserted + */ + public TagSearchTree(List<E> list) { + this(); + for (E e : list) { + this.add(e, 0); + } + } - /** - * adds a new Tag to the TagSearchTree - * - * @param e Tag to be stored - * @param index index of relevant char for adding in tag - */ - private void add(E e, int index) { - //set the path to here - path = e.tag.substring(0, index); - //checks if tag has to be stored here or further down - if (e.tag.length() == index) { - element = e; - } else { - //store tag in correct branch - char c = e.tag.charAt(index); - if (branches[c] == null) { - branches[c] = new TagSearchTree<>(); - } - branches[c].add(e, index + 1); - } - } + /** + * adds a new Tag to the TagSearchTree + * + * @param e Tag to be stored + * @param index index of relevant char for adding in tag + */ + private void add(E e, int index) { + //set the path to here + path = e.tag.substring(0, index); + //checks if tag has to be stored here or further down + if (e.tag.length() == index) { + element = e; + } else { + //store tag in correct branch + char c = e.tag.charAt(index); + if (branches[c] == null) { + branches[c] = new TagSearchTree<>(); + } + branches[c].add(e, index + 1); + } + } - /** - * @param c character of branch needed - * @return branch or null if branch doesn't exist - */ - public TagSearchTree<E> getBranch(char c) { - if (c >= SIZE) return null; - return branches[c]; - } + /** + * @param c character of branch needed + * @return branch or null if branch doesn't exist + */ + public TagSearchTree<E> getBranch(char c) { + if (c >= SIZE) return null; + return branches[c]; + } - /** - * @return stored Tag, null if empty - */ - public E getElement() { - return element; - } + /** + * @return stored Tag, null if empty + */ + public E getElement() { + return element; + } - /** - * @return path inside full tree to get to this Branch - */ - public String getPath() { - return path; - } + /** + * @return path inside full tree to get to this Branch + */ + public String getPath() { + return path; + } } diff --git a/devTools/javaSanityCheck/src/UnknownStateException.java b/devTools/javaSanityCheck/src/UnknownStateException.java index 80dbe598682d23875efe5517170f4f1c91a96246..dceb35bc3d5b57fa3d710e9e61d3ce427a3499c3 100644 --- a/devTools/javaSanityCheck/src/UnknownStateException.java +++ b/devTools/javaSanityCheck/src/UnknownStateException.java @@ -2,7 +2,7 @@ package org.arkerthan.sanityCheck; public class UnknownStateException extends RuntimeException { - public UnknownStateException(int state) { - super(String.valueOf(state)); - } + public UnknownStateException(int state) { + super(String.valueOf(state)); + } } diff --git a/devTools/javaSanityCheck/src/element/AngleBracketElement.java b/devTools/javaSanityCheck/src/element/AngleBracketElement.java index 99549cda24411a29d1dfe32a0693cff99edbb46c..43538bd6986a30cbc1a98966c8f6fea15144a3a3 100644 --- a/devTools/javaSanityCheck/src/element/AngleBracketElement.java +++ b/devTools/javaSanityCheck/src/element/AngleBracketElement.java @@ -6,355 +6,374 @@ import java.util.Arrays; import java.util.List; public class AngleBracketElement extends Element { - private static final List<String> logicTags = Arrays.asList("if", "elseif", "else", "switch", "case", "default"); - private int state = 0; - /* - 0 - initial: < - TWINE - 1 - << - -1 - <</ - 2 - trying to complete twine tag: <<tag ???>> - -2 - trying to complete twine tag: <</tag>> - 3 - waiting for >> - -3 - expecting > from 3 - 4 - waiting for >> with KnownElement - -4 - expecting > from 4 - 5 - expecting >> - -5 - expecting > - 6 - expecting > with KnownElement opening; comparison? - -6 - expecting > with KnownElement closing + private static final List<String> logicTags = Arrays.asList("if", "elseif", "else", "switch", "case", "default"); + private int state = 0; + /* + 0 - initial: < + TWINE + 1 - << + -1 - <</ + 2 - trying to complete twine tag: <<tag ???>> + -2 - trying to complete twine tag: <</tag>> + 3 - waiting for >> + -3 - expecting > from 3 + 4 - waiting for >> with KnownElement + -4 - expecting > from 4 + 5 - expecting >> + -5 - expecting > + 6 - expecting > with KnownElement opening; comparison? + -6 - expecting > with KnownElement closing - HTML - -9 - </ - 10 - trying to complete HTML tag: <tag ???> + HTML + -9 - </ + 10 - trying to complete HTML tag: <tag ???> -10 - trying to complete HTML tag: </tag> - 11 - waiting for > + 11 - waiting for > -11 - expecting > - 12 - waiting for > with KnownElement - */ + 12 - waiting for > with KnownElement + */ - private TagSearchTree<Tag> tree; + private TagSearchTree<Tag> tree; - public AngleBracketElement(int line, int pos) { - super(line, pos); - } + public AngleBracketElement(int line, int pos) { + super(line, pos); + } - @Override - public int handleChar(char c) throws SyntaxError { - switch (state) { - case 0: - switch (c) { - case '<': - state = 1; - return 1; - case '>': - throw new SyntaxError("Empty Statement?", 2); - case '/': - state = -9; - return 1; - case ' ':// assume comparison - case '=':// " - return 2; - case '3'://a heart: <3 - return 2; - default: - try { - state = 10; - tree = Main.htmlTags; - return handleOpeningHTML(c); - } catch (SyntaxError e) { - state = 1; - throw new SyntaxError("Opening \"<\" missing, found " + c + " [debug:initialCase]", 1); - } - } - case 1: - if (c == '<') { - throw new SyntaxError("Too many \"<\".", 1); - } else if (c == '>') { - state = 3; - throw new SyntaxError("Empty Statement?", 1); - } else if (c == '/') { - state = -1; - return 1; - } - state = 2; - tree = Main.twineTags; - return handleOpeningTwine(c); - case -1: - if (c == '>') { - throw new SyntaxError("Empty Statement?", 2, true); - } - state = -2; - tree = Main.twineTags; - return handleClosingTwine(c); + @Override + public int handleChar(char c) throws SyntaxError { + switch (state) { + case 0: + switch (c) { + case '<': + state = 1; + return 1; + case '>': + throw new SyntaxError("Empty Statement?", 2); + case '/': + state = -9; + return 1; + case ' ':// assume comparison + case '=':// " + return 2; + case '3'://a heart: <3 + return 2; + default: + try { + state = 10; + tree = Main.htmlTags; + return handleOpeningHTML(c); + } catch (SyntaxError e) { + state = 1; + throw new SyntaxError("Opening \"<\" missing, found " + c, 1); + } + } + case 1: + if (c == '<') { + throw new SyntaxError("Too many \"<\".", 1); + } else if (c == '>') { + state = 3; + throw new SyntaxError("Empty Statement?", 1); + } else if (c == '/') { + state = -1; + return 1; + } + state = 2; + tree = Main.twineTags; + return handleOpeningTwine(c); + case -1: + if (c == '>') { + throw new SyntaxError("Empty Statement?", 2, true); + } + state = -2; + tree = Main.twineTags; + return handleClosingTwine(c); - case 2: - return handleOpeningTwine(c); - case -2: - return handleClosingTwine(c); - case 3: - if (c == '>') { - state = -3; - return 1; - } - break; - case -3: - if (c == '>') { - return 2; - } else if (c == ' ' || c == '=') { // assuming comparison - state = 3; - return 1; - } else { - throw new SyntaxError("Closing \">\" missing, opened [" + line + ":" + pos + "]", 2); - } - case 4: - if (c == '>') { - state = -4; - return 1; - } - break; - case -4: - if (c == '>') { - return 3; - } else if (c == ' ' || c == '=') { // assuming comparison - state = 4; - return 1; - } else { - throw new SyntaxError("Closing \">\" missing, opened [" + line + ":" + pos + "]", 2); - } - case 5: - if (c == '>') { - state = -5; - return 1; - } else { - throw new SyntaxError("Closing \">\" missing, opened [" + line + ":" + pos + "]", 2); - } - case -5: - if (c == '>') { - return 2; - } - throw new SyntaxError("Closing \">\" missing, opened [" + line + ":" + pos + "]", 2); - case 6: - if (c == '>') { - return 3; - } else if (c == ' ' || c == '=') { - state = 3; - return 1; - } else { - throw new SyntaxError("Closing \">\" missing, opened [" + line + ":" + pos + "]", 3); - } - case -6: - if (c == '>') { - return 3; - } - throw new SyntaxError("Closing \">\" missing, opened [" + line + ":" + pos + "]", 3); + case 2: + return handleOpeningTwine(c); + case -2: + return handleClosingTwine(c); + case 3: + if (c == '>') { + state = -3; + return 1; + } + break; + case -3: + if (c == '>') { + return 2; + } else if (c == ' ' || c == '=') { // assuming comparison + state = 3; + return 1; + } else { + throw new SyntaxError("Closing \">\" missing, opened tag at [" + line + ":" + pos + "]", 2); + } + case 4: + if (c == '>') { + state = -4; + return 1; + } + break; + case -4: + if (c == '>') { + return 3; + } else if (c == ' ' || c == '=') { // assuming comparison + state = 4; + return 1; + } else { + throw new SyntaxError("Closing \">\" missing, opened tag at[" + line + ":" + pos + "]", 2); + } + case 5: + if (c == '>') { + state = -5; + return 1; + } else { + throw new SyntaxError("Closing \">\" missing, opened tag at [" + line + ":" + pos + "]", 2); + } + case -5: + if (c == '>') { + return 2; + } + throw new SyntaxError("Closing \">\" missing, opened tag at [" + line + ":" + pos + "]", 2); + case 6: + if (c == '>') { + return 3; + } else if (c == ' ' || c == '=') { + state = 3; + return 1; + } else { + throw new SyntaxError("Closing \">\" missing, opened tag at [" + line + ":" + pos + "]", 3); + } + case -6: + if (c == '>') { + return 3; + } + throw new SyntaxError("Closing \">\" missing, opened tag at [" + line + ":" + pos + "]", 3); - case -9: - if (c == '>') { - throw new SyntaxError("Empty Statement?", 2, true); - } - state = -10; - tree = Main.htmlTags; - return handleClosingHTML(c); - case 10: - return handleOpeningHTML(c); - case -10: - return handleClosingHTML(c); - case 11: - if (c == '>') - return 2; - if (c == '@') //@ inside HTML tags is allowed - return 1; - break; - case -11: - if (c == '>') - return 2; - throw new SyntaxError("Closing \">\" missing [2]", 2); - case 12: - if (c == '>') - return 3; - if (c == '@') //@ inside HTML tags is allowed - return 1; - break; - default: - throw new UnknownStateException(state); - } - return 0; - } + case -9: + if (c == '>') { + throw new SyntaxError("Empty Statement?", 2, true); + } + state = -10; + tree = Main.htmlTags; + return handleClosingHTML(c); + case 10: + return handleOpeningHTML(c); + case -10: + return handleClosingHTML(c); + case 11: + if (c == '>') + return 2; + if (c == '@') //@ inside HTML tags is allowed + return 1; + break; + case -11: + if (c == '>') + return 2; + throw new SyntaxError("Closing \">\" missing [2]", 2); + case 12: + if (c == '>') + return 3; + if (c == '@') //@ inside HTML tags is allowed + return 1; + break; + default: + throw new UnknownStateException(state); + } + return 0; + } - private int handleOpeningHTML(char c) throws SyntaxError { - if (c == ' ') { - state = 11; - if (tree.getElement() == null) { - throw new SyntaxError("Unknown HTML tag", 1); - } - if (!tree.getElement().single) { - k = new KnownHtmlElement(line, pos, true, tree.getElement().tag); - state = 12; - return 1; - } - return 1; - } - if (c == '>') { - if (tree.getElement() == null) { - throw new SyntaxError("Unknown HTML tag", 2); - } - if (!tree.getElement().single) { - k = new KnownHtmlElement(line, pos, true, tree.getElement().tag); - return 3; - } - return 2; - } + private int handleOpeningHTML(char c) throws SyntaxError { + if (c == ' ') { + state = 11; + if (tree.getElement() == null) { + throw new SyntaxError("Unknown HTML tag", 1); + } + if (!tree.getElement().single) { + k = new KnownHtmlElement(line, pos, true, tree.getElement().tag); + state = 12; + return 1; + } + return 1; + } + if (c == '>') { + if (tree.getElement() == null) { + throw new SyntaxError("Unknown HTML tag", 2); + } + if (!tree.getElement().single) { + k = new KnownHtmlElement(line, pos, true, tree.getElement().tag); + return 3; + } + return 2; + } - tree = tree.getBranch(c); - if (tree == null) { - state = 11; - throw new SyntaxError("Unknown HTML tag or closing \">\" missing, found " + c, 1); - } + tree = tree.getBranch(c); + if (tree == null) { + state = 11; + throw new SyntaxError("Unknown HTML tag or closing \">\" missing, found " + c, 1); + } - return 1; - } + return 1; + } - private int handleClosingHTML(char c) throws SyntaxError { - if (c == '>') { - if (tree.getElement() == null) { - throw new SyntaxError("Unknown HTML tag", 2); - } - if (tree.getElement().single) { - throw new SyntaxError("Single HTML tag used as closing Tag: " + tree.getElement().tag, 2); - } - k = new KnownHtmlElement(line, pos, false, tree.getElement().tag); - return 3; - } + private int handleClosingHTML(char c) throws SyntaxError { + if (c == '>') { + if (tree.getElement() == null) { + throw new SyntaxError("Unknown HTML tag: " + tree.getPath(), 2); + } + if (tree.getElement().single) { + throw new SyntaxError("Single HTML tag used as closing Tag: " + tree.getElement().tag, 2); + } + k = new KnownHtmlElement(line, pos, false, tree.getElement().tag); + return 3; + } - tree = tree.getBranch(c); - if (tree == null) { - state = -11; - throw new SyntaxError("Unknown HTML tag or closing \">\" missing, found " + c, 1); - } + tree = tree.getBranch(c); + if (tree == null) { + state = -11; + throw new SyntaxError("Unknown HTML tag or closing \">\" missing, found " + c, 1); + } - return 1; - } + return 1; + } - private int handleOpeningTwine(char c) throws SyntaxError { - if (c == ' ') { - state = 3; - if (tree.getElement() == null) { - //assuming not listed means widget until better solution - return 1; - //throw new SyntaxError("Unknown Twine tag or closing \">>\" missing, found " + tree.getPath(), 1); - } - if (!tree.getElement().single) { - if (logicTags.contains(tree.getElement().tag)) { - k = new KnownLogicElement(line, pos, tree.getElement().tag, false); - } else { - k = new KnownTwineElement(line, pos, true, tree.getElement().tag); - } - state = 4; - return 1; - } - return 1; - } - if (c == '>') { - state = -5; - if (tree.getElement() == null) { - //assuming not listed means widget until better solution - //throw new SyntaxError("Unknown Twine tag or closing \">>\" missing, found " + tree.getPath(), 1); - return 1; - } - if (!tree.getElement().single) { - if (logicTags.contains(tree.getElement().tag)) { - k = new KnownLogicElement(line, pos, tree.getElement().tag, false); - } else { - k = new KnownTwineElement(line, pos, true, tree.getElement().tag); - } - state = 6; - return 1; - } - return 2; - } + private int handleOpeningTwine(char c) throws SyntaxError { + if (c == ' ') { + state = 3; + if (tree.getElement() == null) { + //assuming not listed means widget until better solution + return 1; + } + if (!tree.getElement().single) { + if (logicTags.contains(tree.getElement().tag)) { + k = new KnownLogicElement(line, pos, tree.getElement().tag, false); + } else { + k = new KnownTwineElement(line, pos, true, tree.getElement().tag); + } + state = 4; + return 1; + } + return 1; + } + if (c == '>') { + state = -5; + if (tree.getElement() == null) { + //assuming not listed means widget until better solution + return 1; + } + if (!tree.getElement().single) { + if (logicTags.contains(tree.getElement().tag)) { + k = new KnownLogicElement(line, pos, tree.getElement().tag, false); + } else { + k = new KnownTwineElement(line, pos, true, tree.getElement().tag); + } + state = 6; + return 1; + } + return 2; + } - tree = tree.getBranch(c); - if (tree == null) { - //assuming not listed means widget until better solution - state = 3; - //throw new SyntaxError("Unknown Twine tag or closing \">>\" missing, found " + c, 1); - } + tree = tree.getBranch(c); + if (tree == null) { + //assuming not listed means widget until better solution + state = 3; + } - return 1; - } + return 1; + } - private int handleClosingTwine(char c) throws SyntaxError { - if (c == '>') { - if (tree.getElement() == null) { - throw new SyntaxError("Unknown Twine tag", 2); - } - if (tree.getElement().single) { - throw new SyntaxError("Single Twine tag used as closing Tag: " + tree.getElement().tag, 2); - } - if (logicTags.contains(tree.getElement().tag)) { - k = new KnownLogicElement(line, pos, tree.getElement().tag, true); - } else { - k = new KnownTwineElement(line, pos, false, tree.getElement().tag); - } - state = -6; - return 1; - } + private int handleClosingTwine(char c) throws SyntaxError { + if (c == '>') { + if (tree.getElement() == null) { + throw new SyntaxError("Unknown Twine tag: " + tree.getPath(), 2); + } + if (tree.getElement().single) { + throw new SyntaxError("Single Twine tag used as closing Tag: " + tree.getElement().tag, 2); + } + if (logicTags.contains(tree.getElement().tag)) { + k = new KnownLogicElement(line, pos, tree.getElement().tag, true); + } else { + k = new KnownTwineElement(line, pos, false, tree.getElement().tag); + } + state = -6; + return 1; + } - tree = tree.getBranch(c); - if (tree == null) { - state = 3; - throw new SyntaxError("Unknown Twine closing tag or closing \">>\" missing, found " + c, 1); - } + tree = tree.getBranch(c); + if (tree == null) { + state = 3; + throw new SyntaxError("Unknown Twine closing tag or closing \">>\" missing, found " + c, 1); + } - return 1; - } + return 1; + } - @Override - public String getShortDescription() { - StringBuilder builder = new StringBuilder(); - builder.append('[').append(line).append(":").append(pos).append("] "); - switch (state) { - case 0: - builder.append("<"); - break; - case 1: - builder.append("<<"); - break; - case -1: - builder.append("<</"); - break; - case 2: - builder.append("<<").append(tree.getPath()); - break; - case -2: - builder.append("<</").append(tree.getPath()); - break; - case 3: - builder.append("<<??? ???"); - break; - case 4: - builder.append("<<?").append(tree.getPath()).append(" ???"); - break; - case -3: - builder.append("<<??? ???>"); - break; - case -4: - builder.append("<<?").append(tree.getPath()).append(" ???>"); - break; - case 5: - builder.append("<").append(tree.getPath()).append(" ???"); - break; - case -5: - builder.append("</").append(tree.getPath()); - break; - case 6: - builder.append("<").append(tree.getPath()).append(" ???"); - break; - default: - //throw new UnknownStateException(state); - } - return builder.toString(); - } + @Override + public String getShortDescription() { + StringBuilder builder = new StringBuilder(); + builder.append('[').append(line).append(":").append(pos).append("] "); + switch (state) { + case 0: + builder.append("<"); + break; + //TWINE + case 1: + builder.append("<<"); + break; + case -1: + builder.append("<</"); + break; + case 2: + builder.append("<<").append(tree.getPath()); + break; + case -2: + builder.append("<</").append(tree.getPath()); + break; + case 3: + builder.append("<<???"); + break; + case -3: + builder.append("<<???>"); + break; + case 4: + builder.append("<<").append(tree.getPath()).append(" ???"); + break; + case -4: + builder.append("<<").append(tree.getPath()).append(" ???>"); + break; + case 5: + builder.append("<<???"); + break; + case -5: + builder.append("<<").append(tree == null ? "???" : tree.getPath()).append(">"); + break; + case 6: + builder.append("<<").append(tree.getPath()).append(" ???>"); + break; + case -6: + builder.append("<</").append(tree.getPath()).append(">"); + break; + //HTML + case -9: + builder.append("</"); + break; + case 10: + builder.append("<").append(tree.getPath()); + break; + case -10: + builder.append("</").append(tree.getPath()); + break; + case 11: + builder.append("<?").append(tree == null ? "???" : tree.getPath()); + break; + case -11: + builder.append("</").append(tree == null ? "???" : tree.getPath()); + break; + case 12: + builder.append("<").append(tree.getPath()).append(" ???"); + default: + throw new UnknownStateException(state); + } + return builder.toString(); + } } diff --git a/devTools/javaSanityCheck/src/element/AtElement.java b/devTools/javaSanityCheck/src/element/AtElement.java index 168e340a4326b24c0dff912c64d25ec5042d6fe5..0dad04247c50f2a9a77bb9ce584ded8de0377ed2 100644 --- a/devTools/javaSanityCheck/src/element/AtElement.java +++ b/devTools/javaSanityCheck/src/element/AtElement.java @@ -4,102 +4,102 @@ import org.arkerthan.sanityCheck.SyntaxError; import org.arkerthan.sanityCheck.UnknownStateException; public class AtElement extends Element { - private int state = 0; - // 0 = @ - // 1 = @@ - // 2 = @@. - // 3 = @@.a -- @@.ab -- @@.abc - // 4 = @@.abc;abc - // 5 = @@.abc;abc@ + private int state = 0; + // 0 = @ + // 1 = @@ + // 2 = @@. + // 3 = @@.a -- @@.ab -- @@.abc + // 4 = @@.abc;abc + // 5 = @@.abc;abc@ - // example: @@.red;some text@@ + // example: @@.red;some text@@ - public AtElement(int line, int pos) { - super(line, pos); - } + public AtElement(int line, int pos) { + super(line, pos); + } - @Override - public int handleChar(char c) throws SyntaxError { - switch (state) { - case 0: - state = 1; - if (c == '@') { - return 1; - } else { - if (c == '.') { - state = 2; - } - throw new SyntaxError("Opening \"@\" missing.", 1); - } - case 1: - if (c == '.') { - state = 2; - return 1; - } else { - state = 4; - throw new SyntaxError("\".\" missing, found \"" + c + "\". This might also indicate a " + - "missing closure in the previous color code.", 0, true); - } - case 2: - state = 3; - if (Character.isAlphabetic(c)) { - return 1; - } else { - throw new SyntaxError("Identifier might be wrong.", 1, true); - } - case 3: - if (c == ';') { - state = 4; - return 1; - } else if (c == ' ') { - state = 4; - throw new SyntaxError("\";\" missing or wrong space.", 1); - } - break; - case 4: - if (c == '@') { - state = 5; - return 1; - } - break; - case 5: - if (c == '@') { - return 2; - } else { - throw new SyntaxError("Closing \"@\" missing.", 2); - } - default: - throw new UnknownStateException(state); - } - return 0; - } + @Override + public int handleChar(char c) throws SyntaxError { + switch (state) { + case 0: + state = 1; + if (c == '@') { + return 1; + } else { + if (c == '.') { + state = 2; + } + throw new SyntaxError("Opening \"@\" missing.", 1); + } + case 1: + if (c == '.') { + state = 2; + return 1; + } else { + state = 4; + throw new SyntaxError("\".\" missing, found \"" + c + "\". This might also indicate a " + + "missing closure in the previous color code.", 0, true); + } + case 2: + state = 3; + if (Character.isAlphabetic(c)) { + return 1; + } else { + throw new SyntaxError("Identifier might be wrong.", 1, true); + } + case 3: + if (c == ';') { + state = 4; + return 1; + } else if (c == ' ') { + state = 4; + throw new SyntaxError("\";\" missing or wrong space.", 1); + } + break; + case 4: + if (c == '@') { + state = 5; + return 1; + } + break; + case 5: + if (c == '@') { + return 2; + } else { + throw new SyntaxError("Closing \"@\" missing.", 2); + } + default: + throw new UnknownStateException(state); + } + return 0; + } - @Override - public String getShortDescription() { - StringBuilder builder = new StringBuilder(); - builder.append(line).append(":").append(pos).append(" "); - switch (state) { - case 0: - builder.append("@"); - break; - case 1: - builder.append("@@"); - break; - case 2: - builder.append("@@."); - break; - case 3: - builder.append("@@.???"); - break; - case 4: - builder.append("@@???"); - break; - case 5: - builder.append("@@???@"); - break; - default: - throw new UnknownStateException(state); - } - return builder.toString(); - } + @Override + public String getShortDescription() { + StringBuilder builder = new StringBuilder(); + builder.append(line).append(":").append(pos).append(" "); + switch (state) { + case 0: + builder.append("@"); + break; + case 1: + builder.append("@@"); + break; + case 2: + builder.append("@@."); + break; + case 3: + builder.append("@@.???"); + break; + case 4: + builder.append("@@???"); + break; + case 5: + builder.append("@@???@"); + break; + default: + throw new UnknownStateException(state); + } + return builder.toString(); + } } diff --git a/devTools/javaSanityCheck/src/element/CommentElement.java b/devTools/javaSanityCheck/src/element/CommentElement.java index 7906986e3dae2c3829d3ff5bd2bf76eddcbbd5c7..159b92afcd56f36b21952f173fa417276880b4c4 100644 --- a/devTools/javaSanityCheck/src/element/CommentElement.java +++ b/devTools/javaSanityCheck/src/element/CommentElement.java @@ -4,63 +4,67 @@ import org.arkerthan.sanityCheck.SyntaxError; import org.arkerthan.sanityCheck.UnknownStateException; public class CommentElement extends Element { - int state = 0; - /* - 0 - / - 1 - /*??? - 2 - /*???* - 3 - /%??? - 4 - /%???% - */ + private int state = 0; + /* + 0 - / + 1 - /*??? + 2 - /*???* + 3 - /%??? + 4 - /%???% + */ - public CommentElement(int line, int pos) { - super(line, pos); - } + /** + * @param line line in which comment starts + * @param pos position in line where comment starts + */ + public CommentElement(int line, int pos) { + super(line, pos); + } - @Override - public int handleChar(char c) throws SyntaxError { - switch (state) { - case 0: - if (c == '*') { - state = 1; - } else if (c == '%') { - state = 3; - } else if (c == '>') { - throw new SyntaxError("XHTML style closure", 4, true); - } else { - return 4; - } - break; - case 1: - if (c == '*') { - state = 2; - } - break; - case 2: - if (c == '/') { - return 2; - } - state = 1; - break; - case 3: - if (c == '%') { - state = 4; - } - break; - case 4: - if (c == '/') { - return 2; - } - state = 3; - break; - default: - throw new UnknownStateException(state); - } - return 1; - } + @Override + public int handleChar(char c) throws SyntaxError { + switch (state) { + case 0: + if (c == '*') { + state = 1; + } else if (c == '%') { + state = 3; + } else if (c == '>') { + throw new SyntaxError("XHTML style closure", 4, true); + } else { + return 4; + } + break; + case 1: + if (c == '*') { + state = 2; + } + break; + case 2: + if (c == '/') { + return 2; + } + state = 1; + break; + case 3: + if (c == '%') { + state = 4; + } + break; + case 4: + if (c == '/') { + return 2; + } + state = 3; + break; + default: + throw new UnknownStateException(state); + } + return 1; + } - @Override - public String getShortDescription() { - return null; - } + @Override + public String getShortDescription() { + return null; + } } diff --git a/devTools/javaSanityCheck/src/element/Element.java b/devTools/javaSanityCheck/src/element/Element.java index f80a85f8c1800ca4cb3422f9a29c91938900b39f..96f71976f3dd99e0ff49d69de72b18db7153aa9d 100644 --- a/devTools/javaSanityCheck/src/element/Element.java +++ b/devTools/javaSanityCheck/src/element/Element.java @@ -3,38 +3,41 @@ package org.arkerthan.sanityCheck.element; import org.arkerthan.sanityCheck.SyntaxError; public abstract class Element { - protected KnownElement k; - protected int line, pos; + protected KnownElement k; + protected int line, pos; - /** - * @param line Line the instance was created - * @param pos Position in line the instance was created - */ - protected Element(int line, int pos) { - this.line = line; - this.pos = pos; - } + /** + * @param line Line the instance was created + * @param pos Position in line the instance was created + */ + protected Element(int line, int pos) { + this.line = line; + this.pos = pos; + } - /** - * Parses a Char and returns an int depending on the state of the element - * 0 - the Element did nothing - * 1 - the Element changed state - * 2 - the Element is finished - * 3 - the Element is finished and a KnownHtmlElement was generated - * 4 - the Element is finished and the char is still open for use - * - * @param c - * @return - * @throws Error - */ - public abstract int handleChar(char c) throws SyntaxError; + /** + * Parses a Char and returns an int depending on the state of the element + * 0 - the Element did nothing + * 1 - the Element changed state + * 2 - the Element is finished + * 3 - the Element is finished and a KnownHtmlElement was generated + * 4 - the Element is finished and the char is still open for use + * + * @param c char to be parsed + * @return state change + * @throws SyntaxError thrown when an syntax error is detected + */ + public abstract int handleChar(char c) throws SyntaxError; - public KnownElement getKnownElement() { - return k; - } + /** + * @return the constructed KnownElement. null if none was constructed yet. + */ + public KnownElement getKnownElement() { + return k; + } - /** - * @return a short description usually based on state and position of the Element - */ - public abstract String getShortDescription(); + /** + * @return a short description usually based on state and position of the Element + */ + public abstract String getShortDescription(); } diff --git a/devTools/javaSanityCheck/src/element/KnownElement.java b/devTools/javaSanityCheck/src/element/KnownElement.java index b3164c2a5890f646bbf75207827049d7ae5d5658..7bc0b7a1ee7d746855cc8fe34354c099f66e5b30 100644 --- a/devTools/javaSanityCheck/src/element/KnownElement.java +++ b/devTools/javaSanityCheck/src/element/KnownElement.java @@ -4,28 +4,32 @@ import org.arkerthan.sanityCheck.SyntaxError; public abstract class KnownElement extends Element { - public KnownElement(int line, int pos) { - super(line, pos); - } + /** + * @param line at which it begins + * @param pos at which it begins + */ + public KnownElement(int line, int pos) { + super(line, pos); + } - /** - * @return true, if it needs another Known Element to close it. - */ - public abstract boolean isOpening(); + /** + * @return true, if it needs another Known Element to close it. + */ + public abstract boolean isOpening(); - /** - * @return true if it closes another Element. - */ - public abstract boolean isClosing(); + /** + * @return true if it closes another Element. + */ + public abstract boolean isClosing(); - /** - * @param k Element to be checked - * @return true if given Element closes Element - */ - public abstract boolean isMatchingElement(KnownElement k); + /** + * @param k Element to be checked + * @return true if given Element closes Element + */ + public abstract boolean isMatchingElement(KnownElement k); - @Override - public int handleChar(char c) throws SyntaxError { - return 0; - } + @Override + public int handleChar(char c) throws SyntaxError { + return 0; + } } diff --git a/devTools/javaSanityCheck/src/element/KnownHtmlElement.java b/devTools/javaSanityCheck/src/element/KnownHtmlElement.java index 51abacd60ac47a000fa47b2fe88f61ca8daf2bc6..c262263b9b79886dfa229b6b29b79c7a6e2f8b2d 100644 --- a/devTools/javaSanityCheck/src/element/KnownHtmlElement.java +++ b/devTools/javaSanityCheck/src/element/KnownHtmlElement.java @@ -2,40 +2,46 @@ package org.arkerthan.sanityCheck.element; public class KnownHtmlElement extends KnownElement { - private boolean opening; - private String statement; + private boolean opening; + private String statement; - public KnownHtmlElement(int line, int pos, boolean opening, String statement) { - super(line, pos); - this.opening = opening; - this.statement = statement; - } + /** + * @param line at which it begins + * @param pos at which it begins + * @param opening if it opens a tag: <tag> or closes it: </tag> + * @param statement statement inside the tag + */ + public KnownHtmlElement(int line, int pos, boolean opening, String statement) { + super(line, pos); + this.opening = opening; + this.statement = statement; + } - @Override - public String getShortDescription() { - StringBuilder builder = new StringBuilder(); - builder.append('[').append(line).append(":").append(pos).append("] <"); - if (!opening) { - builder.append("/"); - } - return builder.append(statement).append(">").toString(); - } + @Override + public String getShortDescription() { + StringBuilder builder = new StringBuilder(); + builder.append('[').append(line).append(":").append(pos).append("] <"); + if (!opening) { + builder.append("/"); + } + return builder.append(statement).append(">").toString(); + } - @Override - public boolean isOpening() { - return opening; - } + @Override + public boolean isOpening() { + return opening; + } - @Override - public boolean isClosing() { - return !opening; - } + @Override + public boolean isClosing() { + return !opening; + } - @Override - public boolean isMatchingElement(KnownElement k) { - if (k instanceof KnownHtmlElement) { - return ((KnownHtmlElement) k).statement.equals(this.statement); - } - return false; - } + @Override + public boolean isMatchingElement(KnownElement k) { + if (k instanceof KnownHtmlElement) { + return ((KnownHtmlElement) k).statement.equals(this.statement); + } + return false; + } } diff --git a/devTools/javaSanityCheck/src/element/KnownLogicElement.java b/devTools/javaSanityCheck/src/element/KnownLogicElement.java index 994201c5a9ba40a4aea01252bb0ba6765a5841b7..502abde93a296c3dffb2391b75b08893aeecd2c5 100644 --- a/devTools/javaSanityCheck/src/element/KnownLogicElement.java +++ b/devTools/javaSanityCheck/src/element/KnownLogicElement.java @@ -7,111 +7,111 @@ import java.util.Arrays; import java.util.List; public class KnownLogicElement extends KnownElement { - private static final List<String> allowedTags = Arrays.asList("if", "elseif", "else"); - private final int state; - private boolean last; - /* - 0 - if - 1 - elseif - 2 - else - 3 - switch - 4 - case - 5 - default - */ + private static final List<String> allowedTags = Arrays.asList("if", "elseif", "else"); + private final int state; + private boolean last; + /* + 0 - if + 1 - elseif + 2 - else + 3 - switch + 4 - case + 5 - default + */ - public KnownLogicElement(int line, int pos, String tag, boolean last) { - this(line, pos, tag); - this.last = last; - } + public KnownLogicElement(int line, int pos, String tag, boolean last) { + this(line, pos, tag); + this.last = last; + } - public KnownLogicElement(int line, int pos, String tag) { - super(line, pos); - switch (tag) { - case "if": - state = 0; - break; - case "elseif": - state = 1; - break; - case "else": - state = 2; - break; - case "switch": - state = 3; - break; - case "case": - state = 4; - break; - case "default": - state = 5; - break; - default: - throw new DisallowedTagException(tag); - } - last = false; - } + public KnownLogicElement(int line, int pos, String tag) { + super(line, pos); + switch (tag) { + case "if": + state = 0; + break; + case "elseif": + state = 1; + break; + case "else": + state = 2; + break; + case "switch": + state = 3; + break; + case "case": + state = 4; + break; + case "default": + state = 5; + break; + default: + throw new DisallowedTagException(tag); + } + last = false; + } - @Override - public boolean isOpening() { - return !last; - } + @Override + public boolean isOpening() { + return !last; + } - @Override - public boolean isClosing() { - return (state != 0 && state != 3) || last; - } + @Override + public boolean isClosing() { + return (state != 0 && state != 3) || last; + } - @Override - public boolean isMatchingElement(KnownElement k) { - if (!(k instanceof KnownLogicElement)) { - return false; - } - KnownLogicElement l = (KnownLogicElement) k; - switch (state) { - case 0: - case 1: - return l.state == 1 || l.state == 2 || (l.state == 0 && l.last); - case 2: - return l.state == 0 && l.last; - case 3: - case 4: - return l.state == 3 || l.state == 4; - case 5: - return l.state == 3 && l.last; - default: - throw new UnknownStateException(state); - } - } + @Override + public boolean isMatchingElement(KnownElement k) { + if (!(k instanceof KnownLogicElement)) { + return false; + } + KnownLogicElement l = (KnownLogicElement) k; + switch (state) { + case 0: + case 1: + return l.state == 1 || l.state == 2 || (l.state == 0 && l.last); + case 2: + return l.state == 0 && l.last; + case 3: + case 4: + return l.state == 3 || l.state == 4; + case 5: + return l.state == 3 && l.last; + default: + throw new UnknownStateException(state); + } + } - @Override - public String getShortDescription() { - StringBuilder builder = new StringBuilder(); - builder.append("[").append(line).append(":").append(pos).append("] <<"); - if (last) { - builder.append('/'); - } - switch (state) { - case 0: - builder.append("if"); - break; - case 1: - builder.append("elseif"); - break; - case 2: - builder.append("else"); - break; - case 3: - builder.append("switch"); - break; - case 4: - builder.append("case"); - break; - case 5: - builder.append("default"); - break; - default: - throw new UnknownStateException(state); - } - return builder.append(">>").toString(); - } + @Override + public String getShortDescription() { + StringBuilder builder = new StringBuilder(); + builder.append("[").append(line).append(":").append(pos).append("] <<"); + if (last) { + builder.append('/'); + } + switch (state) { + case 0: + builder.append("if"); + break; + case 1: + builder.append("elseif"); + break; + case 2: + builder.append("else"); + break; + case 3: + builder.append("switch"); + break; + case 4: + builder.append("case"); + break; + case 5: + builder.append("default"); + break; + default: + throw new UnknownStateException(state); + } + return builder.append(">>").toString(); + } } diff --git a/devTools/javaSanityCheck/src/element/KnownTwineElement.java b/devTools/javaSanityCheck/src/element/KnownTwineElement.java index 399fa5192181044e589ffd5d4222941b001f3066..765d9b682ee32cc9ac54cf095d318e241af2af5d 100644 --- a/devTools/javaSanityCheck/src/element/KnownTwineElement.java +++ b/devTools/javaSanityCheck/src/element/KnownTwineElement.java @@ -2,40 +2,47 @@ package org.arkerthan.sanityCheck.element; public class KnownTwineElement extends KnownElement { - private boolean opening; - private String statement; + private boolean opening; + private String statement; - public KnownTwineElement(int line, int pos, boolean opening, String statement) { - super(line, pos); - this.opening = opening; - this.statement = statement; - } + /** + * + * @param line at which it begins + * @param pos at which it begins + * @param opening if it opens a tag: <<tag>> or closes it: <</tag>> + * @param statement statement inside the tag + */ + public KnownTwineElement(int line, int pos, boolean opening, String statement) { + super(line, pos); + this.opening = opening; + this.statement = statement; + } - @Override - public String getShortDescription() { - StringBuilder builder = new StringBuilder(); - builder.append("[").append(line).append(":").append(pos).append("] <<"); - if (!opening) { - builder.append("/"); - } - return builder.append(statement).append(">>").toString(); - } + @Override + public String getShortDescription() { + StringBuilder builder = new StringBuilder(); + builder.append("[").append(line).append(":").append(pos).append("] <<"); + if (!opening) { + builder.append("/"); + } + return builder.append(statement).append(">>").toString(); + } - @Override - public boolean isOpening() { - return opening; - } + @Override + public boolean isOpening() { + return opening; + } - @Override - public boolean isClosing() { - return !opening; - } + @Override + public boolean isClosing() { + return !opening; + } - @Override - public boolean isMatchingElement(KnownElement k) { - if (k instanceof KnownTwineElement) { - return ((KnownTwineElement) k).statement.equals(this.statement); - } - return false; - } + @Override + public boolean isMatchingElement(KnownElement k) { + if (k instanceof KnownTwineElement) { + return ((KnownTwineElement) k).statement.equals(this.statement); + } + return false; + } } diff --git a/devTools/javaSanityCheck/twineTags b/devTools/javaSanityCheck/twineTags index e1dea71621bd818041d6aad43d7b3053b2c78132..bfaa9ccc4de7ab664404577c17f6e58c9debe228 100644 --- a/devTools/javaSanityCheck/twineTags +++ b/devTools/javaSanityCheck/twineTags @@ -2,8 +2,6 @@ #Effectively everything that is allowed in a statements like this: #<<tag>> or <<tag ???>> #when ;1 is specified it expects a matching closing tag like this: <</tag>> -#Everything belonging to if and switch statements is hard coded and does not -#need to be included here. #Do not add HTML Tags here. #Characters outside of ASCII scope are not supported. # @@ -11,19 +9,20 @@ capture;1 continue;0 for;1 -#does foreach really exist? foreach;1 goto;0 htag;1 include;0 link;1 nobr;1 +options;1 print;0 replace;1 run;0 script;1 set;0 silently;1 +span;1 textbox;0 timed;1 unset;0 diff --git a/java+gitGrep-sanityCheck.sh b/java+gitGrep-sanityCheck.sh new file mode 100755 index 0000000000000000000000000000000000000000..02e5e0853125872d38d548a37361eedd16fca35d --- /dev/null +++ b/java+gitGrep-sanityCheck.sh @@ -0,0 +1,111 @@ +#!/bin/bash +if [ ! -d ".git" ]; then + #not running in git repo, so can't use git commands :-) + echo "No .git repo found - skipping sanity checks" + exit 0 +fi + +WARNING='\033[93m' +WARNING='\033[93m' +ENDC='\033[0m' + +myprint() { + while read data; do + echo -n -e "[$1]$WARNING" + echo "$data" + done +} + +GREP="git grep -n --color" +# Check for missing right angle bracket: <</if> +#$GREP "<</[^>]*>[^>]" -- 'src/*' | myprint "MissingClosingAngleBracket" +#$GREP "<<[^>()]*>[^()<>"$'\r]*\r'"\?$" -- 'src/*' | myprint "MissingClosingAngleBracket" +# Check for missing left angle bracket: </if>> +#$GREP "\([^<]\|^\)</\?\(if\|else\|case\|set\|print\|elseif\)" -- 'src/*' | myprint "MissingOpeningAngleBracket2" +# Check for accidental assignment. e.g.: <<if $foo = "hello">> +$GREP "<<[ ]*if[^>=]*[^><\!=]=[^=][^>]*>>" -- 'src/*' | myprint "AccidentalAssignmentInIf" +# Check for accidental assignment. e.g.: <<elseif $foo = "hello">> +$GREP "<<[ ]*elseif[^>=]*[^><\!=]=[^=][^>]*>>" -- 'src/*' | myprint "AccidentalAssignmentInElseIf" +# Check for missing ". e.g.: <<if $foo == "hello>> +$GREP "<<[^\"<>]*\"[^\"<>]*>>" -- 'src/*' | myprint "MissingSpeechMark" +# Check for missing ". e.g.: <<if $foo = "hello) +$GREP -e "<<[^\"<>]*\([^\"<>]*\"[^><\"]*\"\| [<>] \)*\"\([^\"<>]*\"[^><\"]*\"\| [<>] \)*\([^\"<>]\| [<>] \)*>>" --and --not -e "*[^']*" -- 'src/*' | myprint "MissingSpeechMark2" +# Check for colors like: @@color:red - should be @@.red +$GREP -e "@@color:" --and --not -e "@@color:rgb([0-9 ]\+,[0-9 ]\+,[0-9 ]\+)" -- "src/*" | myprint "UseCssColors" +# Check for missing $ in activeSlave or PC +$GREP "<<[ ]*[^\$><_\[]*\(activeSlave\|PC\)[.]" -- "src/*" | myprint "MissingDollar" +# Check for closing bracket without opening bracket. e.g.: <<if foo)>> (but <<case "foo")>> is valid, so ignore those +$GREP -e "<<[ a-zA-Z]\+\([^()<>]\|[^()<>][<>][^()<>]\)*)" --and --not -e "<< *case" -- "src/*" | myprint "MissingOpeningBracket" +# Check for opening bracket without closing bracket. e.g.: <<if (foo>> +$GREP -e "<<[ a-zA-Z]\([^<>]\|[^<>][<>][^<>]\)\+(\([^()<>]\|[^<>()][<>][^<>()]\|([^<>()]*])\)*>>" -- "src/*" | myprint "MissingClosingBracket" +# Check for two closing brackets but one opening bracket. e.g.: <<if (foo))>> +$GREP -e "<<[ a-zA-Z]\+[^()<>]*([^()]*)[^()]*)[^()<>]*>>" -- "src/*" | myprint "MissingOpeningBracket2" +# Check for one closing bracket but two opening brackets. e.g.: <<if ((foo)>> +$GREP -e "<<[ a-zA-Z]\+[^()<>]*([^()]*([^()]*)[^()<>]*>>" -- "src/*" | myprint "MissingClosingBracket2" +$GREP -e "<<.*[(][^<>)]*[(][^<>)]*)\?[^<>)]*>>" -- "src/*" | myprint "MissingClosingBracket3" +# Check for missing >>. e.g.: <<if $foo +#$GREP "<<[^<>]*[^,\"\[{"$'\r]\r'"\?$" -- 'src/*' | myprint "MissingClosingAngleBrackets" +# Check for too many >>>. e.g.: <</if>>> +$GREP "<<[^<>]*[<>]\?[^<>]*>>>" -- "src/*.tw" | myprint "TooManyAngleBrackets" +# Check for too many <<<. e.g.: <<</if>> +#$GREP "<<<[^<>]*[<>]\?[^<>]*>>" -- "src/*.tw" | myprint "TooManyAngleBrackets" +# Check for wrong capitalization on 'activeslave' and other common typos +$GREP -e "\$act" --and --not -e "\$\(activeSlave\|activeChild\|activeArcology\|activeStandard\|activeOrgan\|activeLimbs\|activeUnits\|activeCanine\|activeHooved\|activeFeline\)" -- "src/*" | myprint "WrongCapitilization" +$GREP "\(csae\|[a-z] She \|attepmts\|youreslf\|advnaces\|canAcheive\|setBellySize\|SetbellySize\|setbellySize\|bellypreg\|pregBelly\|bellyimplant\|bellyfluid\|pronounCaps\|carress\|hormonebalance\|fetishknown\)" -- 'src/*' | myprint "SpellCheck" +$GREP "\(recieve\|recieves\)" -- 'src/*' | myprint "PregmodderCannotSpellReceive" +$GREP "\$slave\[" -- 'src/*' | myprint "ShouldBeSlaves" +# Check for strange spaces e.g. $slaves[$i]. lips +$GREP "\$slaves\[\$i\]\. " -- 'src/*' | myprint "MissingPropertyAfterSlaves" +# Check using refreshmentType instead of refreshment +$GREP "\$PC.refreshmentType[^ =]" -- 'src/*' | myprint "ShouldBeRefreshment" +# Check, e.g., <<//if>> +$GREP "<</[a-zA-Z]*[^a-zA-Z<>]\+[a-zA-Z]*>>" -- 'src/*' | myprint "DoubleSlash" +# Check, e.g. <<else $foo==4 +#$GREP "<<else >\?[^>]" -- 'src/*' | myprint "ShouldBeElseIf" +# Check, e.g., =to +$GREP "=to" -- 'src/*' | myprint "EqualAndTo" +# Check doing $slaves.foo instead of $slaves[i].foo +$GREP -e "[$]slaves[.]" --and --not -e '[$]slaves[.]\(length\|random\|map\|filter\|deleteAt\|push\|find\|includes\|delete\|forEach\)' -- 'src/*' | myprint "MissingSlavesIndex" +# Try to check for accidentally mixing slaves[] and activeSlave. This can have a lot of false matches, but has caught a lot of bugs so it's worth the pain +$GREP -e "activeSlave[.]" --and -e "slaves\[..\?\][.]" --and --not -e '[.]ID' --and --not -e 'slaves\[..\?\][.]\(slaveName\|slaveSurname\|actualAge\|relation\|assignment\|age\|devotion\|trust\|vagina\|mother\|father\|training\)' -- 'src/*' | myprint "MaybeAccidentalMixingOfSlavesAndActiveSlave" +# Check, e.g. <<set foo == 4>> +$GREP "<<set[^{>=]*==" -- 'src/*' | myprint "DoubleEqualsInSet" +# Check for, e.g <<if slaves[foo]>> +$GREP "<<\([^>]\|[^>]>[^>]\)*[^$]slaves\[" -- 'src/*' | myprint "MissingDollar" +# Check for missing $ or _ in variable name: +$GREP -e "<<[a-zA-Z]\([^>\"]\|[^>]>[^>]\|\"[^\"]*\"\)* [a-zA-Z]\+ * =" -- src/*.tw | myprint "MissingDollar2" +# Check for missing command, e.g. <<foo = +$GREP -e "<<[a-zA-Z]* = *" -- src/*.tw | myprint "BadCommand" +# Check for duplicate words, e.g. with with +$GREP -e " \(\b[a-zA-Z][a-zA-Z]\+\) \1\b " --and --not -e " her her " --and --not -e " you you " --and --not -e " New New " --and --not -e "Slave Slave " --and --not -e " that that " --and --not -e " in in " --and --not -e " is is " -- 'src/*' | myprint "Duplicate words" +# Check for obsolete SugarCube macros +$GREP -E "<<display |<<click|<<.*\.contains" -- src/*.tw | myprint "ObsoleteMacro" +# Check for double articles +$GREP -E "\Wa an\W" -- src/*.tw | myprint "DoubleArticle" +# Check for incorrect articles +$GREP -i -E "\Wa (a|e|i|o|u)." -- src/*.tw | grep -a -i -vE "\Wa (un|eu|us|ut|on|ur|in)." | grep -a -i -vE "(&|<<s>>|UM)." | myprint "IncorrectArticle" +$GREP -i -E "\Wan (b|c|d|f|g|j|k|l|m|n|p|q|r|s|t|v|w|x|y|z)\w." -- src/*.tw | grep -a -i -vE "[A-Z]{3}" | myprint "IncorrectArticle" +# Check for $ sign mid-word +$GREP -i "\w$\w" -- src/*.tw | myprint "VarSignMidWord" +# check for $ sign at beginning of macro +$GREP '<<\s*\$' -- 'src/*' | myprint "VarSignAtMacroStart" +# check for missing ; before statement +$GREP 'if $ ' -- 'src/*' | myprint "missing ; before statement" +$GREP 'elseif $ ' -- 'src/*' | myprint "missing ; before statement" +# Check for a . inside a <<>> +$GREP "<<[a-zA-Z]\([^\"'>]\|[^\"'>]>[^\"'>]\)*[a-zA-Z][.][^a-zA-Z]" | myprint "StrangeCharacterAfterDot" +# Check for @@. instead of .@@ +$GREP -E "@@(\.|,|;|:)\s" -- src/*.tw | myprint "WrongSelectorPunctuation" + +# Check that we do not have any variables that we use only once. e.g. $onlyUsedOnce +# Ignore *Nationalities +( +cd src/ +cat $(find . -name "*.tw" ) | tr -c '$a-zA-Z' '\n' | sed -n '/^[$]/p' | grep -v "Nationalities" | sort | uniq -u | sed 's/^[$]/-e[$]/' | sed 's/$/\\\\W/' | xargs -r git grep -n --color | myprint "OnlyUsedOnce" +cat $(find . -name "*.tw" ) | tr -c '.$a-zA-Z[]_' '\n' | sed 's/SugarCube\.State\.variables\./$/g' | sed -n -e 's/^[$]\(PC\|activeSlave\|\(slaves\|tanks\)\[[^]]*\]*\)[.]\([a-zA-Z]\+\).*$/[.]\3/p' | sort | uniq -u |sed 's/^\(.*\)$/-e\1\\\\\b/' | xargs -r git grep -n --color | myprint "SlaveAttributeUsedOnce" +$GREP "\$\(PC\|activeSlave\|slaves\|tanks\)[.][^a-zA-Z]" | myprint "UnexpectedCharAfterDot" + +) + +#run the java sanity check +java -jar SanityCheck.jar diff --git a/sanityCheck-java b/sanityCheck-java deleted file mode 100755 index 455bbfbc243ec664f5aac2daa2ad74903d104962..0000000000000000000000000000000000000000 --- a/sanityCheck-java +++ /dev/null @@ -1 +0,0 @@ -java -jar SanityCheck.jar diff --git a/sanityCheck-java.bat b/sanityCheck-java.bat deleted file mode 100644 index 455bbfbc243ec664f5aac2daa2ad74903d104962..0000000000000000000000000000000000000000 --- a/sanityCheck-java.bat +++ /dev/null @@ -1 +0,0 @@ -java -jar SanityCheck.jar diff --git a/slave variables documentation - Pregmod.txt b/slave variables documentation - Pregmod.txt index a1d9d6cba8aef8a7ecf44770ed75da0d54082366..477a44f14ee1bf6953d39b5505fe0d972ad7dddb 100644 --- a/slave variables documentation - Pregmod.txt +++ b/slave variables documentation - Pregmod.txt @@ -2636,6 +2636,7 @@ vaginalAccessory: may accept strings, use at own risk "none" +"bullet vibrator" "dildo" "large dildo" "huge dildo" @@ -2643,6 +2644,12 @@ may accept strings, use at own risk "long, large dildo" "long, huge dildo" +vaginalAttachment: + +may accept strings, use at own risk +"none" +"vibrator" + dickAccessory: may accept strings, use at own risk diff --git a/src/SpecialForce/Firebase.tw b/src/SpecialForce/Firebase.tw index d6e3997f2e52a62da44cbc12c80630283a5c5b81..452c1b0006b295ecf9a46947463caad56562cbe4 100644 --- a/src/SpecialForce/Firebase.tw +++ b/src/SpecialForce/Firebase.tw @@ -71,12 +71,12 @@ <br>[[Tour the firebase|Firebase][$Tour = 1]] <<else>> <<= FlavourText('Intro')>> - <<if _T1 && _LB> 0>> <br><br>''Launch Bay:'' - <<if $SF.Squad.Satellite.lv > 0>> <br> ''Satellite:'' <<= Sat()>> - <<if $SF.Squad.Satellite.InOrbit < 1>> <br> [[Launch it into geostationary orbit.|Firebase][$SF.Squad.Satellite.InOrbit=1]] //You <span class='red'>cannot</span> upgrade the satellite once it has been launched.// <</if>> - <</if>> - <<if $SF.Squad.GiantRobot > 0>> <br> ''Giant Robot:'' <<= GR()>> <</if>> - <<if $SF.Squad.MissileSilo > 0>> <br> ''Cruise Missile:'' <<= ms()>> <</if>> + <<if _T1 && _LB> 0>> <br><br>''Launch Bay:'' + <<if $SF.Squad.Satellite.lv > 0>> <br> ''Satellite:'' <<= Sat()>> + <<if $SF.Squad.Satellite.InOrbit < 1>> <br> [[Launch it into geostationary orbit.|Firebase][$SF.Squad.Satellite.InOrbit=1]] //You <span class='red'>cannot</span> upgrade the satellite once it has been launched.// <</if>> + <</if>> + <<if $SF.Squad.GiantRobot > 0>> <br> ''Giant Robot:'' <<= GR()>> <</if>> + <<if $SF.Squad.MissileSilo > 0>> <br> ''Cruise Missile:'' <<= ms()>> <</if>> <</if>> <<= FlavourText('Outro')>> <</if>> \ No newline at end of file diff --git a/src/SpecialForce/SpecialForce.js b/src/SpecialForce/SpecialForce.js index 144bbe80a68815ab91d62097edf1adb1ef496bf1..5bbe9269e02d4e066ba64a65823c8e8762e3bf95 100644 --- a/src/SpecialForce/SpecialForce.js +++ b/src/SpecialForce/SpecialForce.js @@ -1,42 +1,4 @@ //V=SugarCube.State.variables, T=SugarCube.State.temporary; -window.Count = function() { - const V=State.variables, T=State.temporary, C=Math.clamp, S=V.SF.Squad, E=V.economy; - T.FU=10; S.Firebase=C(S.Firebase, 0, T.FU); - T.AU=10; S.Armoury=C(S.Armoury, 0, T.AU); - T.DrugsU=10; S.Drugs=C(S.Drugs, 0, T.DrugsU); - T.DU=10; S.Drones=C(S.Drones, 0, T.DU); - T.AVU=10; S.AV=C(S.AV, 0, T.AVU); - T.TVU=10; S.TV=C(S.TV, 0, T.TVU); - T.AAU=10; S.AA=C(S.AA, 0, T.AAU); - T.TAU=10; S.TA=C(S.TA, 0, T.TAU); - if (V.PC.warfare >= 75) {T.PGTU=10; T.SPU=10; T.GunSU=10; T.SatU=10; T.GRU=10; T.MSU=10; T.ACU=10; T.SubU=10; T.HATU=10;} - else if (V.PC.warfare >= 50) {T.PGTU=9; T.SPU=9; T.GunSU=9; T.SatU=9; T.GRU=9; T.MSU=9; T.ACU=9; T.SubU=9; T.HATU=9;} - else {T.PGTU=8; T.SPU=8; T.GunSU=8; T.SatU=8; T.GRU=8; T.MSU=8; T.ACU=8; T.SubU=8; T.HATU=8;} - S.PGT=C(S.PGT, 0, T.PGTU); - S.SpacePlane=C(S.SpacePlane, 0, T.SPU); S.GunS=C(S.GunS, 0, T.GunSU); - S.Satellite.lv=C(S.Satellite.lv, 0, T.SatU); S.GiantRobot=C(S.GiantRobot, 0, T.GRU); S.MissileSilo=C(S.MissileSilo, 0, T.MSU); - S.AircraftCarrier=C(S.AircraftCarrier, 0, T.ACU); S.Sub=C(S.Sub, 0, T.SubU); S.HAT=C(S.HAT, 0, T.HATU); - T.GU=T.AVU+T.TVU+T.PGTU; T.G=S.AV+S.TV+S.PGT; - T.H=S.AA+S.TA+S.SpacePlane+S.GunS; T.HU=T.AAU+T.TAU+T.SPU+T.GunSU; - T.LBU=T.SatU+T.MSU; T.LB=S.Satellite.lv+S.MissileSilo; - T.Base=S.Firebase+S.Armoury+S.Drugs+S.Drones+T.H; - T.max=T.FU+T.AU+T.DrugsU+T.DU+T.HU; - //if (V.SF.Facility.Toggle > 0) T.Base += 1; T.max += 1; - - if (V.terrain !== "oceanic" || V.terrain === "marine") { T.LBU += T.GRU; T.LB += S.GiantRobot; T.Base += T.G; T.max += T.GU; - T.max += T.LBU; T.Base += T.LB; - } else { - T.NY=S.AircraftCarrier + S.Sub + S.HAT; T.Base += T.NY; - T.NYU=T.ACU + T.SubU + T.HATU; T.max += T.NYU; - } V.SF.Size=T.Base; V.SF.Size=C(V.SF.Size, 1, T.max); T.T1=0; - if (E > 100) {T.Env=4;} else if (E > 67) {T.Env=3;} else {T.Env=2;} - if (V.SF.Size >= 30) T.T1=1; T.SFSubsidy=5000*(1+((V.SF.Squad.Troops/100)+(V.SF.Size/100))); - SFNameCapsCheck(); - if (V.SF.IntroProgress > -1) delete V.SF.IntroProgress; - if (V.SF.MercCon === undefined) MercCon(); - if (V.SF.Size === T.max) delete V.SF.Upgrade; -}; - window.Main = function() { const V=State.variables; V.SF={Toggle:V.SF.Toggle,Active:-1,Depravity:0, Size:0, Upgrade:0, Gift:0, UC:{Assign:0, Lock:0}, ROE:"hold", Target:"recruit", Regs:"strict", Caps:"The Special Force", Lower:"the special force", Subsidy:1, BadOutcome:""}; @@ -64,65 +26,34 @@ window.SFInit = function() { }; window.SFBC = function() { + function jsDel(input) { + while(input.length > 0) { + delete input[0]; input.splice(input[0],1); + } + } + const V=State.variables; function InitClean() { - delete V.SFMODToggle; - delete V.securityForceActive; - delete V.securityForceCreate; - delete V.securityForceEventSeen; + jsDel([V.SFMODToggle,V.securityForceActive,V.securityForceCreate,V.securityForceEventSeen]); } function MainClean() { - delete V.securityForceActive; - delete V.securityForceRecruit; - delete V.securityForceTrade; - delete V.securityForceBooty; - delete V.securityForceIncome; - delete V.securityForceMissionEfficiency; - delete V.securityForceProfitable; - delete V.TierTwoUnlock; - delete V.securityForceDepravity; - delete V.SFAO; - delete V.securityForceUpgradeTokenReset; - delete V.securityForceUpgradeToken; - delete V.securityForceGiftToken; - delete V.securityForceRulesOfEngagement; - delete V.securityForceFocus; - delete V.securityForceAccountability; - delete V.securityForceName; - delete V.SubsidyActive; + jsDel([V.securityForceActive,V.securityForceRecruit,V.securityForceTrade,V.securityForceBooty,V.securityForceIncome]); + jsDel([V.securityForceMissionEfficiency,V.securityForceProfitable,V.TierTwoUnlock,V.securityForceDepravity,V.SFAO]); + jsDel([V.securityForceUpgradeTokenReset,V.securityForceUpgradeToken,V.securityForceGiftToken,V.securityForceRulesOfEngagement]); + jsDel([V.securityForceFocus,V.securityForceAccountability,V.securityForceName,V.SubsidyActive]); } function ColonelClean() { - delete V.SubsidyActive; - delete V.ColonelCore; - delete V.securityForceColonelToken; - delete V.securityForceColonelSexed; - delete V.ColonelRelationship; + jsDel([V.SubsidyActive,V.ColonelCore,V.securityForceColonelToken,V.securityForceColonelSexed,V.ColonelRelationship]); } function TradeShowClean() { - delete V.OverallTradeShowAttendance; - delete V.CurrentTradeShowAttendance; - delete V.TradeShowIncome; - delete V.TotalTradeShowIncome; - delete V.TradeShowHelots; - delete V.TotalTradeShowHelots; + jsDel([V.OverallTradeShowAttendance,V.CurrentTradeShowAttendance,V.TradeShowIncome,V.TotalTradeShowIncome]); + jsDel([V.TradeShowHelots,V.TotalTradeShowHelots]); } function UnitsClean() { - delete V.securityForcePersonnel; - delete V.securityForceInfantryPower; - delete V.securityForceArcologyUpgrades; - delete V.securityForceVehiclePower; - delete V.securityForceDronePower; - delete V.securityForceStimulantPower; - delete V.securityForceHeavyBattleTank; - delete V.securityForceAircraftPower; - delete V.securityForceSpacePlanePower; - delete V.securityForceAC130; - delete V.securityForceSatellitePower; - delete V.securityForceGiantRobot; - delete V.securityForceMissileSilo; - delete V.securityForceAircraftCarrier; - delete V.securityForceSubmarine; - delete V.securityForceHeavyAmphibiousTransport; + jsDel([V.securityForceInfantryPower,V.securityForceArcologyUpgrades,V.securityForceVehiclePower,V.securityForceDronePower]); + jsDel([V.securityForceStimulantPower,V.securityForceHeavyBattleTank,V.securityForceAircraftPower,V.securityForceSpacePlanePower]); + jsDel([V.securityForceAC130,V.securityForceSatellitePower,V.securityForceGiantRobot,V.securityForceMissileSilo,V.securityForceAircraftCarrier]); + jsDel([V.securityForceSubmarine,V.securityForceHeavyAmphibiousTransport,V.securityForcePersonnel]); } if (V.SF === undefined) { @@ -205,8 +136,8 @@ window.SFBC = function() { if (V.SpecOpsLock != undefined) V.SF.SpecOpsLock=V.SpecOpsLock; delete V.SpecOpsLock; if (V.SF.UC === undefined) { if (V.SF.SpecOps != undefined && V.SF.SpecOpsLock != undefined) { - V.SF.UC={Assign:V.SF.SpecOps, Lock:V.SF.SpecOpsLock}; delete V.SF.SpecOps; - delete V.SF.SpecOpsLock; + V.SF.UC={Assign:V.SF.SpecOps, Lock:V.SF.SpecOpsLock}; + jsDel([V.SF.SpecOps,V.SF.SpecOpsLock]); } else if (V.SF.UC === {}) { V.SF.UC={Assign:0, Lock:0}; } @@ -228,17 +159,17 @@ window.SFBC = function() { if (V.SF.Depravity < 0) V.SF.Depravity=0; if (V.SF.Size === undefined) V.SF.Size=V.SF.Units; delete V.SF.Units; if (V.SFUnit !== undefined) { - if (V.SFUnit.AT !== undefined) delete V.SFUnit.AT; V.SFUnitTA=0; - V.SF.Squad=V.SFUnit; delete V.SFUnit; - V.SF.Squad.Sat={lv:V.SF.Squad.Satellite, InOrbit:V.SatLaunched}; - delete V.SatLaunched; + if (V.SFUnit.AT !== undefined) V.SFUnitTA=0; + V.SF.Squad.Satellite=V.SF.Squad.Sat; + jsDel([V.SF.Squad.Sat,V.SatLaunched,V.SFUnit.AT]); V.SF.Squad.Satellite=V.SF.Squad.Sat; delete V.SF.Squad.Sat; if (V.SFTradeShow !== undefined) V.SF.MercCon=V.SFTradeShow; delete V.SFTradeShow; if (V.SFColonel !== undefined) V.SF.Colonel=V.SFColonel; delete V.SFColonel; if (V.SF.BadOutcome === undefined) V.SF.BadOutcome=""; if (V.SF.Squad.Satellite !== undefined && V.SatLaunched === undefined) { - delete V.SFUnit; V.SF.Squad.Sat={lv:0, InOrbit:0}; - delete V.SatLaunched; V.SF.Squad.Satellite=V.SF.Squad.Sat; delete V.SF.Squad.Sat; + V.SF.Squad.Sat={lv:0, InOrbit:0}; + V.SF.Squad.Satellite=V.SF.Squad.Sat; + jsDel([V.SF.Squad.Sat,V.SatLaunched,V.SFUnit]); } } if (V.SF.Squad !== undefined && V.SF.Squad.Satellite.lv === undefined) { @@ -251,8 +182,7 @@ window.SFBC = function() { }; window.SFReport = function() { - "use strict"; - const V=State.variables,T=State.temporary,S=V.SF.Squad; + "use strict"; const V=State.variables,T=State.temporary,S=V.SF.Squad; let target=50000,baseLine=5000,profit=0,upkeep=0,income=0; let Multiplier={action:1,troop:1,unit:1,depravity:1},SFD=V.SF.Depravity; let FNG=10,unitCap=2500,Trade=0.025,deaths=0,r=``; Count(); @@ -363,9 +293,9 @@ window.SFReport = function() { V.arcologies[0].prosperity=Math.ceil(V.arcologies[0].prosperity+(Trade/10)*0.25);} if (V.secExp > 0) V.authority += V.SF.Size*10; V.authority=Math.clamp(V.authority, 0, 20000); - income += Math.ceil( ( (baseLine* (0.09+Multiplier.troop/NO).toFixed(2) * (0.09+Multiplier.unit/NO).toFixed(2) * (0.09+Multiplier.action/NO).toFixed(2) * (0.09+Multiplier.depravity/NO).toFixed(2) ) - (upkeep*N1).toFixed(2) )/V.SF.Size/5+S.Troops/1000 ); S.Troops += Math.round(FNG/2); + income += Math.ceil( ( (baseLine* (0.09+Multiplier.troop/NO).toFixed(2) * (0.09+Multiplier.unit/NO).toFixed(2) * (0.09+Multiplier.action/NO).toFixed(2) * (0.09+Multiplier.depravity/NO).toFixed(2) ) - (upkeep*N1).toFixed(2) )/((V.SF.Size/2+S.Troops/2)*5) ); S.Troops += Math.round(FNG/2); if (V.debugMode > 0) r += `<br>income:${commaNum(income)}, troop:${commaNum((0.09+Multiplier.troop/NO).toFixed(2))}, unit:${commaNum((0.09+Multiplier.unit/NO).toFixed(2))}, action:${commaNum((0.09+Multiplier.action/NO).toFixed(2))}, depravity:${commaNum((0.09+Multiplier.depravity/NO).toFixed(2))}, upkeep:${commaNum((upkeep*N1).toFixed(2))}`; - if (V.economy < 100) if (V.SF.Target === "raiding") { income=Math.ceil(income*14); } else if (V.SF.Target === "secure") { income=Math.ceil(income*20); } else { income=Math.ceil(income*50); } //Remove line if hard mode ever gets fixed. + if (V.economy < 100) income *= 83; //Remove line if hard mode ever gets fixed. if (income >= target) profit=1; delete V.SF.Subsidy; cashX(income, "specialForces"); if (S.Troops > unitCap) S.Troops=unitCap; if (V.arcologies[0].prosperity > V.ProsperityCap) V.arcologies[0].prosperity=V.ProsperityCap; @@ -434,20 +364,58 @@ window.SFReport = function() { return r; }; +window.Count = function() { + const V=State.variables, T=State.temporary, C=Math.clamp, S=V.SF.Squad, E=V.economy; + T.FU=10; S.Firebase=C(S.Firebase, 0, T.FU); + T.AU=10; S.Armoury=C(S.Armoury, 0, T.AU); + T.DrugsU=10; S.Drugs=C(S.Drugs, 0, T.DrugsU); + T.DU=10; S.Drones=C(S.Drones, 0, T.DU); + T.AVU=10; S.AV=C(S.AV, 0, T.AVU); + T.TVU=10; S.TV=C(S.TV, 0, T.TVU); + T.AAU=10; S.AA=C(S.AA, 0, T.AAU); + T.TAU=10; S.TA=C(S.TA, 0, T.TAU); + if (V.PC.warfare >= 75) {T.PGTU=10; T.SPU=10; T.GunSU=10; T.SatU=10; T.GRU=10; T.MSU=10; T.ACU=10; T.SubU=10; T.HATU=10;} + else if (V.PC.warfare >= 50) {T.PGTU=9; T.SPU=9; T.GunSU=9; T.SatU=9; T.GRU=9; T.MSU=9; T.ACU=9; T.SubU=9; T.HATU=9;} + else {T.PGTU=8; T.SPU=8; T.GunSU=8; T.SatU=8; T.GRU=8; T.MSU=8; T.ACU=8; T.SubU=8; T.HATU=8;} + S.PGT=C(S.PGT, 0, T.PGTU); + S.SpacePlane=C(S.SpacePlane, 0, T.SPU); S.GunS=C(S.GunS, 0, T.GunSU); + S.Satellite.lv=C(S.Satellite.lv, 0, T.SatU); S.GiantRobot=C(S.GiantRobot, 0, T.GRU); S.MissileSilo=C(S.MissileSilo, 0, T.MSU); + S.AircraftCarrier=C(S.AircraftCarrier, 0, T.ACU); S.Sub=C(S.Sub, 0, T.SubU); S.HAT=C(S.HAT, 0, T.HATU); + T.GU=T.AVU+T.TVU+T.PGTU; T.G=S.AV+S.TV+S.PGT; + T.H=S.AA+S.TA+S.SpacePlane+S.GunS; T.HU=T.AAU+T.TAU+T.SPU+T.GunSU; + T.LBU=T.SatU+T.MSU; T.LB=S.Satellite.lv+S.MissileSilo; + T.Base=S.Firebase+S.Armoury+S.Drugs+S.Drones+T.H; + T.max=T.FU+T.AU+T.DrugsU+T.DU+T.HU; + //if (V.SF.Facility.Toggle > 0) T.Base += 1; T.max += 1; + + if (V.terrain !== "oceanic" || V.terrain === "marine") { T.LBU += T.GRU; T.LB += S.GiantRobot; T.Base += T.G; T.max += T.GU; + T.max += T.LBU; T.Base += T.LB; + } else { + T.NY=S.AircraftCarrier + S.Sub + S.HAT; T.Base += T.NY; + T.NYU=T.ACU + T.SubU + T.HATU; T.max += T.NYU; + } V.SF.Size=T.Base; V.SF.Size=C(V.SF.Size, 1, T.max); T.T1=0; + if (E > 100) {T.Env=4;} else if (E > 67) {T.Env=3;} else {T.Env=2;} + if (V.SF.Size >= 30) T.T1=1; T.SFSubsidy=5000*(1+((V.SF.Squad.Troops/100)+(V.SF.Size/100))); + SFNameCapsCheck(); + if (V.SF.IntroProgress > -1) delete V.SF.IntroProgress; + if (V.SF.MercCon === undefined) MercCon(); + if (V.SF.Size === T.max) delete V.SF.Upgrade; +}; + window.SFNameCapsCheck = function() { const V=State.variables; if (V.SF.Lower != "the special force") V.SF.Caps=V.SF.Lower.replace("the ", "The "); }; window.SFUpgradeCost = function(cost,unit) { - const V=State.variables,T=State.temporary,S=V.SF.Squad; var value=0; + "use strict"; const V=State.variables,T=State.temporary,S=V.SF.Squad; let value=0; value=cost*T.Env*(1.15+(V.SF.Size/10))*(1.15+(unit/100)); if ([S.Sub,S.AircraftCarrier,S.MissileSilo,S.GiantRobot,S.Satellite.lv,S.GunS,S.SpacePlane,S.Drones].includes(unit)) value *= V.HackingSkillMultiplier; return Math.ceil(value); }; window.progress = function(x,max) { - var out = `â`, z, i; + "use strict"; let out = `â`, z, i; if (max === undefined) { Math.clamp(x,0,10); if (State.variables.SF.Size < 30) { @@ -485,7 +453,7 @@ window.SFCR = function() { window.Interactions = function() { "use strict"; let choice=``, time=``; - const V=State.variables, C=V.SF.Colonel, T=State.temporary; + const V=State.variables, C=V.SF.Colonel; if (V.SF.Gift > 0) { if (V.choice == 1) { choice +=`${V.SF.Caps} is turning over spare capital in tribute this week. `; @@ -511,7 +479,7 @@ window.Interactions = function() { }; window.BadOutcome = function() { - const V=State.variables,t=`The Colonel's`; var r =``;V.SF.Active=-2; + "use strict"; const V=State.variables; let r =``;V.SF.Active=-2; switch(V.SF.Colonel.Core) { case "Shell-Shocked": V.SF.BadOutcome="lockdown"; V.trinkets.push("${t} explosives detonator"); @@ -683,7 +651,7 @@ window.FlavourText = function(View) { if (S.AA >= 8) stealth=`The old skin has been replaced with a radar-absorbent material, making the aircraft difficult to pick up on radar.`; if (S.AA >= 9) scramble=`The VTOLs can scramble to react to any threat in under three minutes.`; if (S.AA >= 10) PAI=`A piloting AI has been installed, allowing the VTOLs to perform impossible maneuvers that cannot be done by a human pilot. This removes the need for a human in the aircraft altogether.`; - return `${group}. Several of the landing pads around $arcologies[0].name host groups of four fighters, ready to defend the arcology. ${scramble} The attack VTOL are currently ${W1} with a Gatling cannon${W2} ${W3}${support}. ${TAI} ${PAI} ${engines} ${lock} ${stealth}`; + return `${group}. Several of the landing pads around ${V.arcologies[0].name} host groups of four fighters, ready to defend the arcology. ${scramble} The attack VTOL are currently ${W1} with a Gatling cannon${W2} ${W3}${support}. ${TAI} ${PAI} ${engines} ${lock} ${stealth}`; } function TA() { @@ -730,7 +698,7 @@ window.FlavourText = function(View) { function AC() { let recom=`has been recommissioned from the Old World for ${V.SF.Lower}. It`, jets=`Formerly mothballed strike jets`, loc=``, radar=``, AAG=``, prop=``, torp=``, armor=``, power=``, scramble=``; - if (V.week % 6 === 0) { loc=`moored to the pier in the Naval Yard`; } else { loc=`patrolling the waters near $arcologies[0].name`; } + if (V.week % 6 === 0) { loc=`moored to the pier in the Naval Yard`; } else { loc=`patrolling the waters near ${V.arcologies[0].name}`; } if (S.AircraftCarrier >= 2) { radar=`The island's radar and comms have been improved.`; recom=``; } if (S.AircraftCarrier >= 3) AAG=`The antiair guns have been updated to automatically track and predict enemy aircraft movement.`; if (S.AircraftCarrier >= 4) jets=`Modern strike jets with state-of-the-art armaments`; @@ -768,7 +736,7 @@ window.FlavourText = function(View) { if (S.HAT >= 8) ramps=`The loading ramps have been improved, allowing for faster unloading.`; if (S.HAT >= 9) HATframe=`The frame has been widened and reinforced, allowing for more space on the deck.`; if (S.HAT >= 10) loadout=`An experimental loadout sacrifices all carrying capacity to instead act as a floating gun platform by mounting several rotary autocannons the deck, should the need arise.`; - return `An air cushion transport vehicle, or hovercraft${recom} is parked on the pier of the Naval Yard, ready to ferry ${tons} tons of soldiers and vehicles. ${guns} ${guns2} ${fans} ${turbines} ${speed} ${skirt} ${armor} ${ramps} ${HATframe} ${loadout}`; + return `An air cushion transport vehicle, or hovercraft ${recom} is parked on the pier of the Naval Yard, ready to ferry ${tons} tons of soldiers and vehicles. ${guns} ${guns2} ${fans} ${turbines} ${speed} ${skirt} ${armor} ${ramps} ${HATframe} ${loadout}`; } let r = `<br>`; @@ -897,7 +865,7 @@ window.Sat = function() { if (S.Satellite.lv >= 9) lens=`A higher quality and adjustable lens has been installed on the laser, allowing scalpel precision on armor or wide-area blasts on unarmored targets.`; if (S.Satellite.lv >= 10) kin=`A magazine of directable tungsten rods have been mounted to the exterior of the satellite, allowing for kinetic bombardment roughly equal to a series of nuclear blasts.`; return `${loc} ${gyro} ${thrusters} ${telemetry} ${solar} ${reactor} ${surviv} ${laser}${heat} ${lens} ${kin}`; -} +}; window.GR = function() { "use strict"; const V=State.variables, S=V.SF.Squad; @@ -912,7 +880,7 @@ window.GR = function() { if (S.GiantRobot >= 9) ammo=`; with spare ammunition drums kept along the robot's waist.`; if (S.GiantRobot >= 10) missile=`Missile pods have been mounted on the shoulders.`; return `A prototype giant robot ${loc} rests in a gantry along the side of the arcology. The robot is as tall as a medium-sized office building, focusing on speed over other factors. ${power} ${armor} ${actuator} ${heatsink} The main armament is ${knife} ${cannon}${ammo} ${missile}`; -} +}; window.ms = function() { "use strict"; const V=State.variables, S=V.SF.Squad; @@ -927,7 +895,7 @@ window.ms = function() { if (S.MissileSilo >= 9) h=`The missile now uses its remaining fuel to create a thermobaric explosion, massively increasing explosive power.`; if (S.MissileSilo >= 10) c=` that can be tipped with either a conventional or nuclear warhead`; return `${a} the arcology. The current missile armament is ${b}${c}. ${d} ${e} ${f} ${g} ${h}`; -} +}; /*window.FSIntegrationMenu = function() { const V=State.variables; @@ -937,7 +905,7 @@ window.ms = function() { if (V.SF.FS === undefined) { text += `<br><br>`; //text += ``; - V.SF.FS={Acceptance:{'FS':[],'Percent':[]}, Upgrade:0, Annoyance:0, Options:{ 'Slaves':[], 'FoodsAndMedia':[], 'CommonArea':[] ,'Barracks':[], 'SlaveProcessingCages':[], 'CommandCenter':[] ,'Armory':[] ,'DrugLab':[], 'Garage':[], 'Hangar':[] ,'DroneBay':[] ,'PersonalItems':[] ,'VehicleUpgrades':[] ,'CommonAreaVendors':[], 'RoleplayingManadated':[] ,'ColonelCompilance':[] ,'ColonelGift':[] }}; + V.SF.FS={Acceptance:{'FS':[],'Percent':[]}, Upgrade:0, Annoyance:0, Options:{ 'Slaves':[], 'FoodsAndMedia':[], 'CommonArea':[], 'Barracks':[], 'SlaveProcessingCages':[], 'CommandCenter':[], 'Armory':[], 'DrugLab':[], 'Garage':[], 'Hangar':[], 'DroneBay':[], 'PersonalItems':[], 'VehicleUpgrades':[], 'CommonAreaVendors':[], 'RoleplayingManadated':[], 'ColonelCompilance':[], 'ColonelGift':[] }}; V.SF.Colonel.Talk=1; } else { text += `You walk past The Colonel and move towards the common area to meet with an exclusive group of her very influential officers that are currently relaxing at their favorite table. These men and women are known for their competence, popularity, and authority within in their respective divisions of the ${V.SF.Lower}, they are hard to replace, and they are always looking to earn more coin; they are the perfect weak link for trickling your Future Society influences down into the Firebase. As the officers make room at their table for you to sit and join them for discussion, you spot The Colonel staring at you from afar, and she does not look happy with you. As you are her employer, she cannot stop you from speaking with her soldiers or moving around as you please, but she can tell that you are up to no good: <br><br>`; diff --git a/src/SpecialForce/TrickShotNight.tw b/src/SpecialForce/TrickShotNight.tw index fa046dc9db2c1f7ffe360f58e3a05c6864691ef1..1bcfada098a24753297800026b5ad61cee67650c 100644 --- a/src/SpecialForce/TrickShotNight.tw +++ b/src/SpecialForce/TrickShotNight.tw @@ -23,9 +23,9 @@ Despite your direct elevator, interaction with the majority of your security for <br>//You lack the necessary funds to attend.// <<else>> /* cash >= 500000 */ -<<link "Attend the trick shot night">> +<br><<link "Attend the trick shot night">> <<replace "#result">> <<set $PC.warfare += 1>> - You instruct $assistantName to inform $SF.Lower that you will be attending their trick shot night, and after settling your affairs in the penthouse you head down to the firebase. The atmosphere in the firebase is casual, especially in comparison to the usual situations you meet them, though your security force still maintain some measure of decorum towards you as their employer. Eventually, you settle in at the table with a handful of $SF.Lower officers and cash in your @@.yellowgreen;<<print cashFormat(500000)>>@@ into bullets. All that remains is to decide your strategy for the night. + You instruct $assistantName to inform $SF.Lower that you will be attending their trick shot night, and after settling your affairs in the penthouse you head down to the firebase. The atmosphere in the firebase is casual, especially in comparison to the usual situations you meet them, though your security force still maintain some measure of decorum towards you as their employer. Eventually, you settle in at the table with a handful of $SF.Lower officers and turn your @@.yellowgreen;<<print cashFormat(500000)>>@@ into bullets. All that remains is to decide your strategy for the night. <br><br> <span id="bountyresult"> <<link "Play it safe">> @@ -73,13 +73,41 @@ Despite your direct elevator, interaction with the majority of your security for <<set $activeSlave.analSkill = 0>> <<set $activeSlave.whoreSkill = 0>> <<set $activeSlave.combatSkill = 1>> + <<set $activeSlave.accent = random(0,1)>> <<set $activeSlave.behavioralFlaw = "arrogant">> + <<set $activeSlave.hLength = 1>> <<set $activeSlave.hStyle = "buzzcut">> + <<set $activeSlave.clothes = "a military uniform">> <<setLocalPronouns $activeSlave>> + <span id="artFrame"> + /* 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> Some aggressive play and an eye for riling up your fellow players has resulted in an immense payout, and all but one of your adversaries have folded as the situation has escalated. The only player still in contention is a wily old mercenary, the veteran of $his fair share of battles on the battlefield and at the firing range. $He's short on bullets, however, and $he'll have to buy in with something else as collateral. <br><br> <span id="aliveresult"> <<link "A year of servitude">> + <<set $activeSlave.clothes = "no clothing">> + <<replace "#artFrame">> + <span id="artFrame"> + /* 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> + <</replace>> <<replace "#aliveresult">> <<if random(1,100) > 50>> For all your skillful maneuvering to reach this position, ultimately the win comes down to chance. This time, however, luck was not on your side. As the victor sweeps up $his spoils, the other security force clap you on the back and offer their condolences for your defeat. Though you may have lost your ¤, it seems you've @@.green;made some friends.@@ diff --git a/src/SpecialForce/Upgrades.tw b/src/SpecialForce/Upgrades.tw index e1aaa7b15af009ee9869d00b0b82262811cd2770..21365acb4661b81b4a643679065a149e86af3a6e 100644 --- a/src/SpecialForce/Upgrades.tw +++ b/src/SpecialForce/Upgrades.tw @@ -1,5 +1,6 @@ :: Upgrades [nobr] - <br><br> <<if $SF.Size !== _max>> Total upgrade progress: <<print progress($SF.Size,_max)>> $SF.Size/_max(<<print ($SF.Size/_max).toFixed(2)>>%) <<if $SF.Size < 30>><br>//<<print (30-$SF.Size )>> more upgrades is needed untill the next tier unlocks.//<</if>> + + <br><br> <<if $SF.Size !== _max>> Total upgrade progress: <<print progress($SF.Size,_max)>> $SF.Size/_max(<<print ($SF.Size/_max).toFixed(2)>>%) <<if $SF.Size < 30>><br>//<<print (30-$SF.Size )>> more upgrades is needed until the next tier unlocks.//<</if>> <<else>>There are no more upgrades available.<</if>> <<if $SF.Upgrade > 0 && ($SF.Size !== _max)>> <<set _cost = Math.ceil(Math.abs($cash*.05*(1.25+($SF.Size/1000))))>> diff --git a/src/SpecialForce/WeeklyChoices.tw b/src/SpecialForce/WeeklyChoices.tw index 03c38a19a4617e29c505ebeb39f9f977b7407fb7..cd9bcf4ddc1bf8910dcb4b7e1fb26bdd83cd51b4 100644 --- a/src/SpecialForce/WeeklyChoices.tw +++ b/src/SpecialForce/WeeklyChoices.tw @@ -212,7 +212,7 @@ <br> <<link "All three holes">> <<replace "#result6">> <<include "SFColonelSexDec">> <</replace>> <<set $SF.Colonel.Fun += 3>> <</link>> - </span> <</replace>> </span> <</link>> + </span> <</replace>> <</link>> </span> <</replace>> <</link>> <</if>> /*Closes fun*/ </span> <</replace>> <</link>> /*Closes talk*/ -</span> <</if>> /*Closes spend time with The Colonel*/ \ No newline at end of file +</span> <</if>> /*Closes spend time with The Colonel*/ diff --git a/src/art/vector/VectorArtJS.js b/src/art/vector/VectorArtJS.js index 6d6308083adfb65acbd108ab69e9dec11a20e44c..b1cf19041dd87a77d2447f0da5d433403ed9ebd1 100644 --- a/src/art/vector/VectorArtJS.js +++ b/src/art/vector/VectorArtJS.js @@ -1029,6 +1029,8 @@ window.VectorArt = (function () { r += jsInclude("Art_Vector_Dildo_Huge"); else if (slave.vaginalAccessory === "long, huge dildo") r += jsInclude("Art_Vector_Dildo_Huge_Long"); + } else if (slave.vaginalAccessory === "bullet vibrator") { + r += jsInclude("Art_Vector_Bullet_Vibrator"); } } } diff --git a/src/art/vector_revamp/vectorRevampedArtControl.js b/src/art/vector_revamp/vectorRevampedArtControl.js index b70074c5f3a8e1fab7d4e04917203740926cc8a4..8be76f964b583f31b7239a461db15b90665c57f3 100644 --- a/src/art/vector_revamp/vectorRevampedArtControl.js +++ b/src/art/vector_revamp/vectorRevampedArtControl.js @@ -1067,7 +1067,7 @@ class RevampedArtControl { result.push("Art_Vector_Revamp_Clit_Piercing"); else if (this.artSlave.clitPiercing == 2) result.push("Art_Vector_Revamp_Clit_Piercing_Heavy"); - else if (this.artSlave.clitPiercing == 1) + else if (this.artSlave.clitPiercing == 3) result.push("Art_Vector_Revamp_Clit_Piercing_Smart"); return result; diff --git a/src/cheats/PCCheatMenuCheatDatatypeCleanup.tw b/src/cheats/PCCheatMenuCheatDatatypeCleanup.tw index 928a415334cca34355d5cdfcf1bdc70eed2472a3..377239aaf99d4455ce6044a94e7c5a569479aeee 100644 --- a/src/cheats/PCCheatMenuCheatDatatypeCleanup.tw +++ b/src/cheats/PCCheatMenuCheatDatatypeCleanup.tw @@ -31,6 +31,8 @@ <<set $tempSlave.pregWeek = 0>> <</if>> <<run PCDatatypeCleanup()>> +<<set $upgradeMultiplierArcology = upgradeMultiplierArcology()>> +<<set $HackingSkillMultiplier = HackingSkillMultiplier()>> <<if $tempSlave.boobs == 0>> <<set $tempSlave.boobsBonus = 0>> diff --git a/src/cheats/mod_EditFSCheat.tw b/src/cheats/mod_EditFSCheat.tw index 434a64cf002347a1cacf655a8d7c414c462e2fee..83b314e537f52114d245c4e1ccd6ee43957519db 100644 --- a/src/cheats/mod_EditFSCheat.tw +++ b/src/cheats/mod_EditFSCheat.tw @@ -35,7 +35,7 @@ <<radiobutton "$arcologies[0].FSSupremacistRace" "semitic">> Semitic | <<radiobutton "$arcologies[0].FSSupremacistRace" "mixed race">> Mixed Race - <br>[[Apply and reset Racial Subjugationism|MOD_Edit FS Cheat][removeFS("FSSubjugationist")]] + <br>[[Apply and reset Racial Subjugationism|MOD_Edit FS Cheat][FutureSocieties.remove("FSSubjugationist")]] <br><br> @@ -71,7 +71,7 @@ <<radiobutton "$arcologies[0].FSSubjugationistRace" "semitic">> Semitic | <<radiobutton "$arcologies[0].FSSubjugationistRace" "mixed race">> Mixed Race - <br>[[Apply and reset Racial Supremacy|MOD_Edit FS Cheat][removeFS("FSSupremacist")]] + <br>[[Apply and reset Racial Supremacy|MOD_Edit FS Cheat][FutureSocieties.remove("FSSupremacist")]] <br><br> @@ -101,7 +101,7 @@ | <<radiobutton "$arcologies[0].FSGenderRadicalistLawFuta" 3>> 3 (Big butts and skilled buttholes pref.) | <<radiobutton "$arcologies[0].FSGenderRadicalistLawFuta" 4>> 4 (Trap pref.) - <br>[[Apply and reset Gender Traditionalism|MOD_Edit FS Cheat][removeFS("FSGenderFundamentalist")]] + <br>[[Apply and reset Gender Traditionalism|MOD_Edit FS Cheat][FutureSocieties.remove("FSGenderFundamentalist")]] <br><br> @@ -124,7 +124,7 @@ <<radiobutton "$arcologies[0].FSGenderFundamentalistSMR" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSGenderFundamentalistSMR" 1>> 1 (Passed.) - <br>[[Apply and reset Gender Radicalism|MOD_Edit FS Cheat][removeFS("FSGenderRadicalist")]] + <br>[[Apply and reset Gender Radicalism|MOD_Edit FS Cheat][FutureSocieties.remove("FSGenderRadicalist")]] <<if $seePreg != 0>> <br><br> @@ -152,7 +152,7 @@ <<radiobutton "$arcologies[0].FSRepopulationFocusLaw" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSRepopulationFocusLaw" 1>> 1 (Passed.) - <br>[[Apply and reset Eugenics|MOD_Edit FS Cheat][removeFS("FSRestart")]] + <br>[[Apply and reset Eugenics|MOD_Edit FS Cheat][FutureSocieties.remove("FSRestart")]] <br><br> @@ -175,7 +175,7 @@ <<radiobutton "$arcologies[0].FSRestartSMR" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSRestartSMR" 1>> 1 (Passed.) - <br>[[Apply and reset Repopulation Efforts|MOD_Edit FS Cheat][removeFS("FSRepopulationFocus")]] + <br>[[Apply and reset Repopulation Efforts|MOD_Edit FS Cheat][FutureSocieties.remove("FSRepopulationFocus")]] <</if>> <br><br> @@ -199,7 +199,7 @@ <<radiobutton "$arcologies[0].FSPaternalistLaw" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSPaternalistLaw" 1>> 1 (Passed.) - <br>[[Apply and reset Degradationism|MOD_Edit FS Cheat][removeFS("FSDegradationist")]] + <br>[[Apply and reset Degradationism|MOD_Edit FS Cheat][FutureSocieties.remove("FSDegradationist")]] <br><br> @@ -222,7 +222,7 @@ <<radiobutton "$arcologies[0].FSDegradationistLaw" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSDegradationistLaw" 1>> 1 (Passed.) - <br>[[Apply and reset Paternalism|MOD_Edit FS Cheat][removeFS("FSPaternalist")]] + <br>[[Apply and reset Paternalism|MOD_Edit FS Cheat][FutureSocieties.remove("FSPaternalist")]] <br><br> @@ -245,7 +245,7 @@ <<radiobutton "$arcologies[0].FSBodyPuristLaw" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSBodyPuristLaw" 1>> 1 (Passed.) - <br>[[Apply and reset Body Transformationism|MOD_Edit FS Cheat][removeFS("FSTransformationFetishist")]] + <br>[[Apply and reset Body Transformationism|MOD_Edit FS Cheat][FutureSocieties.remove("FSTransformationFetishist")]] <br><br> @@ -268,7 +268,7 @@ <<radiobutton "$arcologies[0].FSTransformationFetishistSMR" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSTransformationFetishistSMR" 1>> 1 (Passed.) - <br>[[Apply and reset Body Purism|MOD_Edit FS Cheat][removeFS("FSBodyPurist")]] + <br>[[Apply and reset Body Purism|MOD_Edit FS Cheat][FutureSocieties.remove("FSBodyPurist")]] <br><br> @@ -292,7 +292,7 @@ <<radiobutton "$arcologies[0].FSYouthPreferentialistLaw" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSYouthPreferentialistLaw" 1>> 1 (Passed.) - <br>[[Apply and reset Maturity Preferentialism|MOD_Edit FS Cheat][removeFS("FSMaturityPreferentialist")]] + <br>[[Apply and reset Maturity Preferentialism|MOD_Edit FS Cheat][FutureSocieties.remove("FSMaturityPreferentialist")]] <br><br> @@ -316,7 +316,7 @@ <<radiobutton "$arcologies[0].FSMaturityPreferentialistLaw" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSMaturityPreferentialistLaw" 1>> 1 (Passed.) - <br>[[Apply and reset Youth Preferentialism|MOD_Edit FS Cheat][removeFS("FSYouthPreferentialist")]] + <br>[[Apply and reset Youth Preferentialism|MOD_Edit FS Cheat][FutureSocieties.remove("FSYouthPreferentialist")]] <br><br> @@ -339,7 +339,7 @@ <<radiobutton "$arcologies[0].FSSlimnessEnthusiastSMR" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSSlimnessEnthusiastSMR" 1>> 1 (Passed.) - <br>[[Apply and reset Asset Expansionism|MOD_Edit FS Cheat][removeFS("FSAssetExpansionist")]] + <br>[[Apply and reset Asset Expansionism|MOD_Edit FS Cheat][FutureSocieties.remove("FSAssetExpansionist")]] <br><br> @@ -363,7 +363,7 @@ <<radiobutton "$arcologies[0].FSAssetExpansionistSMR" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSAssetExpansionistSMR" 1>> 1 (Passed.) - <br>[[Apply and reset Slimness Enthusiasm|MOD_Edit FS Cheat][removeFS("FSSlimnessEnthusiast")]] + <br>[[Apply and reset Slimness Enthusiasm|MOD_Edit FS Cheat][FutureSocieties.remove("FSSlimnessEnthusiast")]] <br><br> @@ -409,7 +409,7 @@ <<radiobutton "$arcologies[0].FSPhysicalIdealistSMR" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSPhysicalIdealistSMR" 1>> 1 (Passed.) - <br>[[Apply and reset Hedonistic Decadence|MOD_Edit FS Cheat][removeFS("FSHedonisticDecadence")]] + <br>[[Apply and reset Hedonistic Decadence|MOD_Edit FS Cheat][FutureSocieties.remove("FSHedonisticDecadence")]] <br><br> @@ -440,7 +440,7 @@ <<radiobutton "$arcologies[0].FSHedonisticDecadenceLaw2" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSHedonisticDecadenceLaw2" 1>> 1 (Passed.) - <br>[[Apply and reset Physical Idealist|MOD_Edit FS Cheat][removeFS("FSPhysicalIdealist")]] + <br>[[Apply and reset Physical Idealist|MOD_Edit FS Cheat][FutureSocieties.remove("FSPhysicalIdealist")]] <br><br> @@ -486,7 +486,7 @@ <<radiobutton "$arcologies[0].FSRomanRevivalistLaw" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSRomanRevivalistLaw" 1>> 1 (Passed.) - <br>[[Apply and reset other Revivalisms|MOD_Edit FS Cheat][removeFS("FSAztecRevivalist"), removeFS("FSEgyptianRevivalist"), removeFS("FSEdoRevivalist"), removeFS("FSArabianRevivalist"), removeFS("FSChineseRevivalist")]] + <br>[[Apply and reset other Revivalisms|MOD_Edit FS Cheat][FutureSocieties.remove("FSAztecRevivalist"), FutureSocieties.remove("FSEgyptianRevivalist"), FutureSocieties.remove("FSEdoRevivalist"), FutureSocieties.remove("FSArabianRevivalist"), FutureSocieties.remove("FSChineseRevivalist")]] <br><br> @@ -509,7 +509,7 @@ <<radiobutton "$arcologies[0].FSAztecRevivalistLaw" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSAztecRevivalistLaw" 1>> 1 (Passed.) - <br>[[Apply and reset other Revivalisms|MOD_Edit FS Cheat][removeFS("FSRomanRevivalist"), removeFS("FSEgyptianRevivalist"), removeFS("FSEdoRevivalist"), removeFS("FSArabianRevivalist"), removeFS("FSChineseRevivalist")]] + <br>[[Apply and reset other Revivalisms|MOD_Edit FS Cheat][FutureSocieties.remove("FSRomanRevivalist"), FutureSocieties.remove("FSEgyptianRevivalist"), FutureSocieties.remove("FSEdoRevivalist"), FutureSocieties.remove("FSArabianRevivalist"), FutureSocieties.remove("FSChineseRevivalist")]] <br><br> @@ -532,7 +532,7 @@ <<radiobutton "$arcologies[0].FSEgyptianRevivalistLaw" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSEgyptianRevivalistLaw" 1>> 1 (Passed.) - <br>[[Apply and reset other Revivalisms|MOD_Edit FS Cheat][removeFS("FSRomanRevivalist"), removeFS("FSAztecRevivalist"), removeFS("FSEdoRevivalist"), removeFS("FSArabianRevivalist"), removeFS("FSChineseRevivalist")]] + <br>[[Apply and reset other Revivalisms|MOD_Edit FS Cheat][FutureSocieties.remove("FSRomanRevivalist"), FutureSocieties.remove("FSAztecRevivalist"), FutureSocieties.remove("FSEdoRevivalist"), FutureSocieties.remove("FSArabianRevivalist"), FutureSocieties.remove("FSChineseRevivalist")]] <br><br> @@ -555,7 +555,7 @@ <<radiobutton "$arcologies[0].FSEdoRevivalistLaw" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSEdoRevivalistLaw" 1>> 1 (Passed.) - <br>[[Apply and reset other Revivalisms|MOD_Edit FS Cheat][removeFS("FSRomanRevivalist"), removeFS("FSAztecRevivalist"), removeFS("FSEgyptianRevivalist"), removeFS("FSArabianRevivalist"), removeFS("FSChineseRevivalist")]] + <br>[[Apply and reset other Revivalisms|MOD_Edit FS Cheat][FutureSocieties.remove("FSRomanRevivalist"), FutureSocieties.remove("FSAztecRevivalist"), FutureSocieties.remove("FSEgyptianRevivalist"), FutureSocieties.remove("FSArabianRevivalist"), FutureSocieties.remove("FSChineseRevivalist")]] <br><br> @@ -578,7 +578,7 @@ <<radiobutton "$arcologies[0].FSArabianRevivalistLaw" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSArabianRevivalistLaw" 1>> 1 (Passed.) - <br>[[Apply and reset other Revivalisms|MOD_Edit FS Cheat][removeFS("FSRomanRevivalist"), removeFS("FSAztecRevivalist"), removeFS("FSEgyptianRevivalist"), removeFS("FSEdoRevivalist"), removeFS("FSChineseRevivalist")]] + <br>[[Apply and reset other Revivalisms|MOD_Edit FS Cheat][FutureSocieties.remove("FSRomanRevivalist"), FutureSocieties.remove("FSAztecRevivalist"), FutureSocieties.remove("FSEgyptianRevivalist"), FutureSocieties.remove("FSEdoRevivalist"), FutureSocieties.remove("FSChineseRevivalist")]] <br><br> @@ -601,4 +601,4 @@ <<radiobutton "$arcologies[0].FSChineseRevivalistLaw" 0>> 0 (Not passed.) | <<radiobutton "$arcologies[0].FSChineseRevivalistLaw" 1>> 1 (Passed.) - <br>[[Apply and reset other Revivalisms|MOD_Edit FS Cheat][removeFS("FSRomanRevivalist"), removeFS("FSAztecRevivalist"), removeFS("FSEgyptianRevivalist"), removeFS("FSEdoRevivalist"), removeFS("FSArabianRevivalist")]] + <br>[[Apply and reset other Revivalisms|MOD_Edit FS Cheat][FutureSocieties.remove("FSRomanRevivalist"), FutureSocieties.remove("FSAztecRevivalist"), FutureSocieties.remove("FSEgyptianRevivalist"), FutureSocieties.remove("FSEdoRevivalist"), FutureSocieties.remove("FSArabianRevivalist")]] diff --git a/src/cheats/mod_EditFSCheatDatatypeCleanup.tw b/src/cheats/mod_EditFSCheatDatatypeCleanup.tw index 460a79ba8d52f964b4d619b9359b8b8c59e4b866..f0dc1eabfd1d3b10eb3c864d0c1c40eb882af4fb 100644 --- a/src/cheats/mod_EditFSCheatDatatypeCleanup.tw +++ b/src/cheats/mod_EditFSCheatDatatypeCleanup.tw @@ -141,7 +141,7 @@ <</if>> <<for _fscdc = 0; _fscdc < setup.FutureSocieties.length; _fscdc++>> <<if !($arcologies[0][setup.FutureSocieties[_fscdc]] > 0)>> - <<run removeFS(setup.FutureSocieties[_fscdc])>> + <<run FutureSocieties.remove(setup.FutureSocieties[_fscdc])>> <</if>> <</for>> diff --git a/src/endWeek/saServant.js b/src/endWeek/saServant.js index deefae63fbc9010d497f66fccf40da22155fbba0..24e70b3451090238538dab752e841165597cde4b 100644 --- a/src/endWeek/saServant.js +++ b/src/endWeek/saServant.js @@ -58,10 +58,12 @@ window.saServant = /** @param {App.Entity.SlaveState} slave */ function saServan t += `so happy to serve your other slaves that ${he} often sees to their needs before they know they have them, and greatly <span class='yellowgreen'>reduces the upkeep</span> of your slaves.`; } - let _oral = jsRandom(5,10); - slave.oralCount += _oral; - V.oralTotal += _oral; - + if (slave.releaseRules !== "chastity") { + let _oral = jsRandom(5,10); + slave.oralCount += _oral; + V.oralTotal += _oral; + } + if (slave.relationship == -2) { t += ` ${He} does ${his} best to perfect your domesticity due to ${his} emotional bond to you.`; } else if (slave.relationship == -3 && slave.devotion > 50) { diff --git a/src/events/intro/initNationalities.tw b/src/events/intro/initNationalities.tw index e4c1f257698a4d5a2336fbaac72fbb311d6b78c5..ed54a9c4fe997cd7e13325d014bff9c5682ba29e 100644 --- a/src/events/intro/initNationalities.tw +++ b/src/events/intro/initNationalities.tw @@ -26,7 +26,6 @@ <<set $trinkets.push("an artist's impression of an early arcology design")>> <<set $arcologyUpgrade.drones = 1, $arcologyUpgrade.hydro = 1>> <<set $secBots.active = 1, $secBots.troops = 30, $secBots.maxTroops = 30>> - <<set $upgradeMultiplierArcology = 0.6>> <<elseif $PC.career == "medicine">> <<set $trinkets.push("a framed postsurgical x-ray")>> <<set $surgeryCost = Math.trunc($surgeryCost/2)>> @@ -36,7 +35,6 @@ <<run repX(4000, "event")>> <<elseif $PC.career == "arcology owner">> <<set $trinkets.push("a miniature model of your first arcology")>> - <<set $upgradeMultiplierArcology = 0.8>> <<run repX(2000, "event")>> <<elseif $PC.career == "escort">> <<set $trinkets.push("a copy of the first porno you starred in")>> diff --git a/src/events/intro/introSummary.tw b/src/events/intro/introSummary.tw index afcb75c701b1d1a4e1e2482a37af243c95366380..cd091e42dc4b89e2f45d90802ea641b8cd295ffe 100644 --- a/src/events/intro/introSummary.tw +++ b/src/events/intro/introSummary.tw @@ -22,39 +22,35 @@ You may review your settings before clicking "Continue" to begin. <</if>> __''World Settings''__ -<br>Economic climate: +<br> <<set $localEcon = $economy>> -<<if $economy > 125>> - ''not truly dire. Not yet.'' //Very Easy// - <br>[[Harder|Intro Summary][$economy = 125]] -<<elseif $economy > 100>> - ''getting a touch dire.'' //Easy// - <br>[[Harder|Intro Summary][$economy = 100]] | [[Easier|Intro Summary][$economy = 200]] -<<elseif $economy > 80>> - ''serious risks.'' //Default Difficulty// - <br>[[Harder|Intro Summary][$economy = 80]] | [[Easier|Intro Summary][$economy = 125]] -<<elseif $economy > 67>> - ''ugly.'' //Hard// - <br>[[Harder|Intro Summary][$economy = 67]] | [[Easier|Intro Summary][$economy = 100]] -<<else>> - ''this is the last dance.'' //Very Hard// - <br>[[Easier|Intro Summary][$economy = 80]] -<</if>> +<<options $economy>> + Economic climate: + <<option 200 "Very Easy">> + ''not truly dire. Not yet.'' //Very Easy// + <<option 125 "Easy">> + ''getting a touch dire.'' //Easy// + <<option 100 "Default Difficulty">> + ''serious risks.'' //Default Difficulty// + <<option 80 "Hard">> + ''ugly.'' //Hard// + <<option 67 "Hard">> + ''this is the last dance.'' //Very Hard// +<</options>> <<if $difficultySwitch == 1>><<set $econAdvantage = -2>><</if>> -<br>Economic forecast: -<<if $difficultySwitch == 0>> - ''no change.'' //Vanilla -- Some economic content requires this to be set to harder than vanilla// - <br>[[Harder|Intro Summary][$difficultySwitch = 1, $econRate = 1]] -<<elseif $econRate == 1>> - ''slow decline''. //Easy// - <br>[[Harder|Intro Summary][$econRate = 2]] | [[Easier|Intro Summary][$difficultySwitch = 0]] -<<elseif $econRate == 2>> - ''noticeable deterioration'' //Default Difficulty// - <br>[[Harder|Intro Summary][$econRate = 4]] | [[Easier|Intro Summary][$econRate = 1]] -<<else>> - ''going to hell in a handbasket''. //Hard// - <br>[[Easier|Intro Summary][$econRate = 2]] -<</if>> +<<if $difficultySwitch == 0>><<set $econRate = 0>><</if>> +<br> +<<options $econRate>> +Economic forecast: + <<option 0 "Vanilla" "$difficultySwitch = 0">> + ''no change.'' //Vanilla -- Some economic content requires this to be set to harder than vanilla// + <<option 1 "Easy" "$difficultySwitch = 1">> + ''slow decline''. //Easy// + <<option 2 "Default" "$difficultySwitch = 1">> + ''noticeable deterioration'' //Default Difficulty// + <<option 4 "Hard" "$difficultySwitch = 1">> + ''going to hell in a handbasket''. //Hard// +<</options>> /* Not functional yet <br> All the things you need to run your arcology are getting more expensive @@ -84,29 +80,31 @@ __''World Settings''__ <br> <<if ndef $customVariety>> -You are using standardized slave trading channels. [[Customize the slave trade|Customize Slave Trade][$customVariety = 1, $customWA = 0]] +<<options>> + You are using standardized slave trading channels. + <<option>> + [[Customize the slave trade...|Customize Slave Trade][$customVariety = 1, +$customWA = 0]] +<</options>> <br> - <<if $internationalTrade == 0>> + <<options $internationalTrade>> + <<option 0 "Restrict the trade to continental">> The slave trade is ''continental,'' so a narrower variety of slaves will be available. - [[Allow intercontinental trade|Intro Summary][$internationalTrade = 1]] - <br> - <<else>> + <<option 1 "Allow intercontinental trade">> The slave trade is ''international,'' so a wider variety of slaves will be available. - [[Restrict the trade to continental|Intro Summary][$internationalTrade = 0]] - <br> - <</if>> + <</options>> + <br> <<if $internationalTrade == 1>> - <<if $internationalVariety == 0>> - International slave variety is ''semi-realistic,'' so more populous nations will be more common. - [[Normalized national variety|Intro Summary][$internationalVariety = 1]] - <br> - <<else>> - International slave variety is ''normalized,'' so small nations will appear nearly as much as large ones. - [[Semi-realistic national variety|Intro Summary][$internationalVariety = 0]] - <br> - <</if>> + <<options $internationalVariety>> + International slave variety is + <<option 0 "Semi-realistic national variety">> + ''semi-realistic,'' so more populous nations will be more common. + <<option 1 "Normalized national variety">> + ''normalized,'' so small nations will appear nearly as much as large ones. + <</options>> <</if>> + <br> <<else>> Current nationality distributions are [[Adjust the slave trade|Customize Slave Trade][$customWA = 0, $customVariety = 1]] | [[Stop customizing|Intro Summary][delete $customVariety]] <<if ndef $nationalitiescheck>> /* NGP: regenerate $nationalitiescheck from previous game's $nationalities array */ @@ -124,166 +122,162 @@ You are using standardized slave trading channels. [[Customize the slave trade|C <</if>> /* closes $customVariety is defined */ /* Accordion 000-250-006 */ - Accordion effects on weekly reports are -<<if $useAccordion == 0>> - @@.red;DISABLED.@@ [[Enable|Intro Summary][$useAccordion = 1]] -<<else>> - @@.cyan;ENABLED.@@ [[Disable|Intro Summary][$useAccordion = 0]] -<</if>> +<<options $useAccordion>> + <<option 0 "Disable">> + Accordion effects on weekly reports are @@.red;DISABLED.@@ + <<option 1 "Enable">> + Accordion effects on weekly reports are @@.cyan;ENABLED.@@ +<</options>> /* Accordion 000-250-006 */ <br> -Economic Tabs on weekly reports are -<<if $useTabs == 0>> -@@.red;DISABLED.@@ [[Enable|Intro Summary][$useTabs = 1]] -<<else>> -@@.cyan;ENABLED.@@ [[Disable|Intro Summary][$useTabs = 0]] -<</if>> - +<<options $useTabs>> + <<option 0 "Disable">> + Economic Tabs on weekly reports are @@.red;DISABLED.@@ + <<option 1 "Enable">> + Economic Tabs on weekly reports are @@.cyan;ENABLED.@@ +<</options>> <br> -<<if $plot == 1>> - Game mode: ''two-handed''. Includes non-erotic events concerning the changing world. - [[Disable non-erotic events|Intro Summary][$plot = 0]] -<<else>> - Game mode: ''one-handed''. No non-erotic events concerning the changing world. - [[Enable non-erotic events|Intro Summary][$plot = 1]] -<</if>> + +<<options $plot>> + <<option 0 "Disable non-erotic events">> + Game mode: ''one-handed''. No non-erotic events concerning the changing world. + <<option 1 "Enable non-erotic events">> + Game mode: ''two-handed''. Includes non-erotic events concerning the changing world. +<</options>> <br><br> __''General slave settings''__ <br> -<<if $verboseDescriptions == 1>> - Your master suite ''will'' detail slave changes. - [[Disable|Intro Summary][$verboseDescriptions = 0]] -<<else>> - Your master suite ''will not'' detail slave changes. - [[Enable|Intro Summary][$verboseDescriptions = 1]] -<</if>> +<<options $verboseDescriptions>> + <<option 0 "Disable">> + Your master suite ''will not'' detail slave changes. + <<option 1 "Enable">> + Your master suite ''will'' detail slave changes. +<</options>> <br> -<<if $newDescriptions == 1>> - Slaves ''will'' have alternate titles. - [[Disable|Intro Summary][$newDescriptions = 0]] -<<else>> - Slaves ''will not'' have alternate titles. - [[Enable|Intro Summary][$newDescriptions = 1]] -<</if>> +<<options $newDescriptions>> + <<option 0 "Disable">> + Slaves ''will not'' have alternate titles. + <<option 1 "Enable">> + Slaves ''will'' have alternate titles. +<</options>> <br> -<<if $seeRace == 1>> - Ethnicity will ''occasionally'' be mentioned. - [[Disable most mentions of race|Intro Summary][$seeRace = 0]] -<<else>> - Ethnicity will ''almost never'' be mentioned. - [[Enable mentions of race|Intro Summary][$seeRace = 1]] -<</if>> +<<options $seeRace>> + <<option 0 "Disable most mentions of race">> + Ethnicity will ''almost never'' be mentioned. + <<option 1 "Enable mentions of race">> + Ethnicity will ''occasionally'' be mentioned. +<</options>> <br> -<<if $seeNationality == 1>> - Nationality will ''occasionally'' be mentioned. - [[Disable most mentions of nationality|Intro Summary][$seeNationality = 0]] -<<else>> - Nationality will ''almost never'' be mentioned. - [[Enable mentions of nationality|Intro Summary][$seeNationality = 1]] -<</if>> +<<options $seeNationality>> + <<option 0 "Disable most mentions of nationality">> + Nationality will ''almost never'' be mentioned. + <<option 1 "Enable mentions of nationality">> + Nationality will ''occasionally'' be mentioned. +<</options>> <br> -<<if $allowMaleSlaveNames>> - Slaves ''can generate with male names.'' - [[Only use female names|Intro Summary][$allowMaleSlaveNames = false]] -<<else>> - Slaves will ''always generate with female names.'' - [[Allow male names|Intro Summary][$allowMaleSlaveNames = true]] -<</if>> -//This only affects slave generation and not your ability to name your slaves.// +<<options $allowMaleSlaveNames>> + <<option false "Only use female names">> + Slaves will ''always generate with female names'', + <<option true "Allow male names">> + Slaves ''can generate with male names''. + <<comment>> + This only affects slave generation and not your ability to name your slaves. +<</options>> <br> -<<if $surnameOrder == 0>> - Order names ''based on country of origin''. [[Force name surname|Intro Summary][$surnameOrder = 1]] | [[Force surname name|Intro Summary][$surnameOrder = 2]] -<<elseif $surnameOrder == 1>> - Names will always be ''Name Surname''. [[Allow nationality name order|Intro Summary][$surnameOrder = 0]] | [[Force surname name|Intro Summary][$surnameOrder = 2]] -<<elseif $surnameOrder == 2>> - Names will always be ''Surname Name''. [[Allow nationality name order|Intro Summary][$surnameOrder = 0]] | [[Force name surname|Intro Summary][$surnameOrder = 1]] -<</if>> +<<options $surnameOrder>> + <<option 0 "Allow nationality name order">> + Order names ''based on country of origin''. + <<option 1 "Force name surname">> + Names will always be ''Name Surname''. + <<option 2 "Force surname name">> + Names will always be ''Surname Name''. +<</options>> <br> -<<if $familyTesting == 1>> - Slaves ''can'' have extended families instead of just a single relative. //May cause lag.// - [[Disable extended families|Intro Summary][$familyTesting = 0]] -<<else>> +<<options $familyTesting>> + <<option 0 "Disable extended families">> Slaves ''cannot'' have extended families, just a single relative. //Vanilla Mode.// - [[Enable extended families|Intro Summary][$familyTesting = 1]] -<</if>> //Extended family mode must be on for the incubation facility to be enabled.// + <<option 1 "Enable extended families">> + Slaves ''can'' have extended families instead of just a single relative. + //May cause lag.// + <<comment>> + Extended family mode must be on for the incubation facility to be enabled. +<</options>> <<if $familyTesting == 1>> <br> - <<if $inbreeding == 1>> - Successive breeding ''will'' result in sub-average slaves. - [[Disable inbreeding damage|Intro Summary][$inbreeding = 0]] - <<else>> + <<options $inbreeding>> + <<option 0 "Disable inbreeding damage">> Successive breeding ''will not'' result in sub-average slaves. - [[Enable inbreeding damage|Intro Summary][$inbreeding = 1]] - <</if>> + <<option 1 "Enable inbreeding damage">> + Successive breeding ''will'' result in sub-average slaves. + <</options>> <br> - <<if $allowFamilyTitles == 1>> - Your relatives ''will'' use family titles. - [[Disable family titles|Intro Summary][$allowFamilyTitles = 0]] - <<else>> + <<options $allowFamilyTitles>> + <<option 0 "Disable family titles">> Your relatives ''will not'' use family titles. - [[Enable family titles|Intro Summary][$allowFamilyTitles = 1]] - <</if>> + <<option 1 "Enable family titles">> + Your relatives ''will'' use family titles. + <</options>> <</if>> <br> -Interactions between slaves' weight and asset size are -<<if ($weightAffectsAssets != 0)>> - ''enabled''. [[Disable|Intro Summary][$weightAffectsAssets = 0]] -<<else>> - ''disabled''. [[Enable|Intro Summary][$weightAffectsAssets = 1]] -<</if>> + +<<options $weightAffectsAssets>> + <<option 0 "Disable">> + Interactions between slaves' weight and asset size are ''disabled''. + <<option 1 "Enable">> + Interactions between slaves' weight and asset size are ''enabled''. +<</options>> <br> -<<if ($curativeSideEffects != 0)>> -Curative side effects are ''enabled''. [[Disable|Intro Summary][$curativeSideEffects = 0]] -<<else>> -Curative side effects are ''disabled''. [[Enable|Intro Summary][$curativeSideEffects = 1]] -<</if>> +<<options $curativeSideEffects>> + <<option 0 "Disable">> + Curative side effects are ''disabled''. + <<option 1 "Enable">> + Curative side effects are ''enabled''. +<</options>> <br> /% Begin mod section: toggle whether slaves lisp. %/ -<<if $disableLisping>> +<<options $disableLisping>> +<<option 0 "Disable Lisping">> Lisping: ''slaves will not lisp''. - [[Enable Lisping|Intro Summary][$disableLisping = 0]] -<<else>> +<<option 1 "Enable Lisping">> Lisping: ''slaves with fat lips or heavy oral piercings will lisp''. - [[Disable Lisping|Intro Summary][$disableLisping = 1]] -<</if>> +<</options>> /% End mod section: toggle whether slaves lisp. %/ <br><br> __''Slave age settings''__ <br> -<<if $seeAge == 1>> - Slaves will ''age naturally.'' - [[Disable aging|Intro Summary][$seeAge = 0]] | - [[Semi aging|Intro Summary][$seeAge = 2]] -<<elseif $seeAge == 2>> - Slaves ''will'' celebrate birthdays, but ''not age.'' - [[Enable aging fully|Intro Summary][$seeAge = 1]] | - [[Disable aging|Intro Summary][$seeAge = 0]] -<<else>> + +<br> +<<options $seeAge>> + <<option 0 "Disable aging">> Slaves will ''not age,'' and not experience birthdays. - [[Enable aging|Intro Summary][$seeAge = 1]] | - [[Semi aging|Intro Summary][$seeAge = 2]] -<</if>> -//This option cannot be changed during the game// + <<option 1 "Enable aging">> + Slaves will ''age naturally.'' + <<option 2 "Semi aging">> + Slaves ''will'' celebrate birthdays, but ''not age.'' + <<comment>> + This option cannot be changed during the game +<</options>> <br> + <<if $minimumSlaveAge < 3>> <<set $minimumSlaveAge = 3>> <<elseif $minimumSlaveAge < 18>> @@ -292,15 +286,19 @@ __''Slave age settings''__ /% Either out of range or not a number. %/ <<set $minimumSlaveAge = 18>> <</if>> -Girls appearing in the game will be no younger than <<textbox "$minimumSlaveAge" $minimumSlaveAge "Intro Summary">> +<<options>> + Girls appearing in the game will be no younger than: + <<option>> + <<textbox "$minimumSlaveAge" $minimumSlaveAge "Intro Summary">> +<</options>> <br> -<<if ($extremeUnderage == 0)>> -Molestation of slaves younger than $minimumSlaveAge is ''forbidden''. [[Allow|Intro Summary][$extremeUnderage = 1]] -<<else>> -Molestation of slaves younger than $minimumSlaveAge is ''permitted''. [[Deny|Intro Summary][$extremeUnderage = 0]] -<</if>> - +<<options $extremeUnderage>> + <<option 0 "Deny">> + Molestation of slaves younger than $minimumSlaveAge is ''forbidden''. + <<option 1 "Allow">> + Molestation of slaves younger than $minimumSlaveAge is ''permitted''. +<</options>> <br> <<if $retirementAge <= $minimumSlaveAge>> <<set $retirementAge = $minimumSlaveAge+1>> @@ -310,16 +308,20 @@ Molestation of slaves younger than $minimumSlaveAge is ''permitted''. [[Deny|Int /% Either out of range or not a number. %/ <<set $retirementAge = 45>> <</if>> -Initial retirement age will be at <<textbox "$retirementAge" $retirementAge "Intro Summary">> //May cause issues with New Game and initial slaves if set below 45.// - +<<options>> + Initial retirement age will be at: + <<option>> + <<textbox "$retirementAge" $retirementAge "Intro Summary">> + <<comment>> + May cause issues with New Game and initial slaves if set below 45. +<</options>> <br> -<<if $pedo_mode == 0>> +<<options $pedo_mode>> + <<option 0 "Normal mode">> Randomly generated slaves will generate normally. - [[Loli mode|Intro Summary][$pedo_mode = 1, $minimumSlaveAge = 5]] -<<else>> - Nearly all randomly generated slaves will be under the age of 18, although custom slaves and slaves related to specific events may be older. - [[Normal mode|Intro Summary][$pedo_mode = 0]] -<</if>> + <<option 1 "Loli mode" "$minimumSlaveAge = 5">> + Nearly all randomly generated slaves will be under the age of 18, although custom slaves and slaves related to specific events may be older. +<</options>> <br> <<if $fertilityAge < 3>> @@ -330,7 +332,11 @@ Initial retirement age will be at <<textbox "$retirementAge" $retirementAge "Int /% Either out of range or not a number. %/ <<set $fertilityAge = 18>> <</if>> -Girls will not be able to become pregnant if their age is under <<textbox "$fertilityAge" $fertilityAge "Intro Summary">> +<<options>> + Girls will not be able to become pregnant if their age is under: + <<option>> + <<textbox "$fertilityAge" $fertilityAge "Intro Summary">> +<</options>> <br> <<if $potencyAge < 3>> @@ -341,210 +347,207 @@ Girls will not be able to become pregnant if their age is under <<textbox "$fert /% Either out of range or not a number. %/ <<set $potencyAge = 18>> <</if>> -Girls will not be able to impregnate others if their age is under <<textbox "$potencyAge" $potencyAge "Intro Summary">> +<<options>> + Girls will not be able to impregnate others if their age is under: + <<option>> + <<textbox "$potencyAge" $potencyAge "Intro Summary">> +<</options>> <br> -<<if $precociousPuberty == 0>> +<<options $precociousPuberty>> + <<option 0 "Disable precocious puberty">> Girls ''cannot'' experience precocious puberty. (Unable to become pregnant or inseminate others younger than normal puberty age - $fertilityAge). - [[Enable precocious puberty|Intro Summary][$precociousPuberty = 1]] -<<else>> - Girls ''can'' experience precocious puberty. (Under certain conditions they can become pregnant or inseminate others younger then normal age - $fertilityAge, though they may also experience delayed puberty). - [[Disable precocious puberty|Intro Summary][$precociousPuberty = 0]] -<</if>> + <<option 1 "Enable precocious puberty">> + Girls ''can'' experience precocious puberty. (Under certain conditions they can become pregnant or inseminate others younger then normal age - $fertilityAge, though they may also experience delayed puberty). +<</options>> <br><br> __''Slave age effects''__ <br> -<<if $AgePenalty == 0>> +<<options $AgePenalty>> + <<option 0 "Disable age penalties">> Girls ''will not'' receive job and career penalties due to age. - [[Enable age penalties|Intro Summary][$AgePenalty = 1]] -<<else>> - Girls ''will'' receive job and career penalties due to age. - [[Disable age penalties|Intro Summary][$AgePenalty = 0]] -<</if>> - + <<option 1 "Enable age penalties">> + Girls ''will'' receive job and career penalties due to age. +<</options>> <br> -<<if $loliGrow == 1>> - Children ''will not'' grow as they age. - [[Enable Growth|Intro Summary][$loliGrow = 0]] -<<else>> +<<options $loliGrow>> + <<option 0 "Disable Growth">> Children ''will'' grow as they age. - [[Disable Growth|Intro Summary][$loliGrow = 1]] -<</if>> + <<option 1 "Enable Growth">> + Children ''will not'' grow as they age. +<</options>> <br><br> __''Content settings''__ <br> -<<switch $seeDicks>> -<<case 100>> - ''All'' -<<case 90>> - ''Almost all'' -<<case 75>> - ''Most'' -<<case 50>> - ''Half'' -<<case 25>> - ''Some'' -<<case 10>> - ''A few'' -<<default>> - ''None'' -<</switch>> -of the slave girls will have dicks. -<<if $seeDicks != 0>>[[None|Intro Summary][$seeDicks = 0]]<<else>>None<</if>> (0%) -| <<if $seeDicks != 10>>[[A few|Intro Summary][$seeDicks = 10]]<<else>>A few<</if>> (10%) -| <<if $seeDicks != 25>>[[Some|Intro Summary][$seeDicks = 25]]<<else>>Some<</if>> (25%) -| <<if $seeDicks != 50>>[[Half|Intro Summary][$seeDicks = 50]]<<else>>Half<</if>> (50%) -| <<if $seeDicks != 75>>[[Most|Intro Summary][$seeDicks = 75]]<<else>>Most<</if>> (75%) -| <<if $seeDicks != 90>>[[Almost all|Intro Summary][$seeDicks = 90]]<<else>>Almost all<</if>> (90%) -| <<if $seeDicks != 100>>[[All|Intro Summary][$seeDicks = 100]]<<else>>All<</if>> (100%) - +<<options $seeDicks>> + <<option 0 "None" "" "(0%)">> + ''None'' of the slave girls will have dicks. + <<option 10 "A few" "" "(10%)">> + ''A few'' of the slave girls will have dicks. + <<option 25 "Some" "" "(25%)">> + ''Some'' of the slave girls will have dicks. + <<option 50 "Half" "" "(50%)">> + ''Half'' of the slave girls will have dicks. + <<option 75 "Most" "" "(75%)">> + ''Most'' of the slave girls will have dicks. + <<option 90 "Almost all" "" "(90%)">> + ''Almost all'' of the slave girls will have dicks. + <<option 100 "All" "" "(100%)">> + ''All'' of the slave girls will have dicks. +<</options>> <br> <<if $seeDicks == 0>> Should you be able to surgically attach a penis to your female slaves and starting girls? -<<if $makeDicks != 0>>[[No|Intro Summary][$makeDicks = 0]]<<else>>No<</if>> -| <<if $makeDicks != 1>>[[Yes|Intro Summary][$makeDicks = 1]]<<else>>Yes<</if>> +<<options $makeDicks>> + <<option 0 "No">> + <<option 1 "Yes">> +<</options>> <</if>> <br> -<<if $seePreg == 1>> - Pregnancy related content is ''enabled''. - [[Disable|Intro Summary][$seePreg = 0]] -<<else>> - Most pregnancy related content is ''disabled''. - [[Enable|Intro Summary][$seePreg = 1]] -<</if>> +<<options $seePreg>> + <<option 0 "Disable">> + Most pregnancy related content is ''disabled''. + <<option 1 "Enable">> + Pregnancy related content is ''enabled''. +<</options>> <br> -Should children born in game strictly adhere to dick content settings? -<<if $seeDicksAffectsPregnancy != 0>>[[No|Intro Summary][$seeDicksAffectsPregnancy = 0]]<<else>>No<</if>> -| <<if $seeDicksAffectsPregnancy != 1>>[[Yes|Intro Summary][$seeDicksAffectsPregnancy = 1]]<<else>>Yes<</if>> +<<options $seeDicksAffectsPregnancy>> + <<option 0 "No">> + Children born in game do not adhere to dick content settings. + <<option 1 "Yes">> + Children born in game strictly adhere to dick content settings. +<</options>> <<if $seeDicksAffectsPregnancy == 0>> <br> - <<if $adamPrinciple == 1>> - XX slaves only fathering daughters is ''enabled''. - [[Disable|Intro Summary][$adamPrinciple = 0]] - <<else>> - XX slaves only fathering daughters is ''disabled''. - [[Enable|Intro Summary][$adamPrinciple = 1]] - <</if>> + <<options $adamPrinciple>> + <<option 0 "Disable">> + XX slaves only fathering daughters is ''disabled''. + <<option 1 "Enable">> + XX slaves only fathering daughters is ''enabled''. + <</options>> <</if>> <br> -<<if $seeHyperPreg == 1>> - Extreme pregnancy content like broodmothers is ''enabled''. - [[Disable|Intro Summary][$seeHyperPreg = 0]] -<<else>> +<<options $seeHyperPreg>> + <<option 0 "Disable">> Extreme pregnancy content like broodmothers is ''disabled''. - [[Enable|Intro Summary][$seeHyperPreg = 1]] -<</if>> + <<option 1 "Enable">> + Extreme pregnancy content like broodmothers is ''enabled''. +<</options>> <br> -<<if ($dangerousPregnancy == 0)>> +<<options $dangerousPregnancy>> + <<option 0 "Disable">> Advanced pregnancy complications such as miscarriage and premature birth are currently ''disabled''. - [[Enable|Intro Summary][$dangerousPregnancy = 1]] -<<else>> + <<option 1 "Enable">> Advanced pregnancy complications such as miscarriage and premature birth are currently ''enabled''. - [[Disable|Intro Summary][$dangerousPregnancy = 0]] -<</if>> +<</options>> <br> -<<if $seeExtreme == 1>> - Extreme content like amputation is ''enabled''. - [[Disable|Intro Summary][$seeExtreme = 0]] -<<else>> +<<options $seeExtreme>> + <<option 0 "Disable">> Extreme content like amputation is ''disabled''. - [[Enable|Intro Summary][$seeExtreme = 1]] -<</if>> + <<option 1 "Enable">> + Extreme content like amputation is ''enabled''. +<</options>> <br> -<<if $seeBestiality == 1>> - Bestiality content is ''enabled''. - [[Disable|Intro Summary][$seeBestiality = 0]] -<<else>> +<<options $seeBestiality>> + <<option 0 "Disable">> Bestiality content is ''disabled''. - [[Enable|Intro Summary][$seeBestiality = 1]] -<</if>> + <<option 1 "Enable">> + Bestiality content is ''enabled''. +<</options>> <br> -<<if $seePee == 1>> - Watersports content is ''enabled''. - [[Disable|Intro Summary][$seePee = 0]] -<<else>> +<<options $seePee>> + <<option 0 "Disable">> Watersports content is ''disabled''. - [[Enable|Intro Summary][$seePee = 1]] -<</if>> + <<option 1 "Enable">> + Watersports content is ''enabled''. +<</options>> <<if $seeDicks != 0>> <br> - <<if $seeCircumcision == 1>> - Circumcision is ''enabled''. - [[Disable|Intro Summary][$seeCircumcision = 0]] - <<else>> + <<options $seeCircumcision>> + <<option 0 "Disable">> Circumcision is ''disabled''. - [[Enable|Intro Summary][$seeCircumcision = 1]] - <</if>> + <<option 1 "Enable">> + Circumcision is ''enabled''. + <</options>> <</if>> <br><br> __''The Free City''__ <br> -The Free City features ''$neighboringArcologies'' arcologies in addition to your own. -<<textbox "$neighboringArcologies" $neighboringArcologies "Intro Summary">> -<br> -//Setting this to 0 will disable most content involving the rest of the Free City.// +<<options>> + The Free City features ''$neighboringArcologies'' arcologies in addition to your own. + <<option>> + <<textbox "$neighboringArcologies" $neighboringArcologies "Intro Summary">> + <<comment>> + Setting this to 0 will disable most content involving the rest of the Free + City. +<</options>> <<if $targetArcology.type == "New">> <br> - The Free City is located on ''$terrain'' terrain. - [[Urban|Intro Summary][$terrain = "urban"]] | - [[Rural|Intro Summary][$terrain = "rural"]] | - [[Ravine|Intro Summary][$terrain = "ravine"]] | - [[Marine|Intro Summary][$terrain = "marine"]] | - [[Oceanic|Intro Summary][$terrain = "oceanic"]] + <<options $terrain>> + The Free City is located on ''$terrain'' terrain. + <<option "urban" "Urban">> + <<option "rural" "Rural">> + <<option "ravine" "Ravine">> + <<option "marine" "Marine">> + <<option "oceanic" "Oceanic">> + <</options>> <<if $terrain != "oceanic">> <br> - The Free City is located in ''$continent''. - [[North America|Intro Summary][$continent = "North America", $language = "English"]] | [[South America|Intro Summary][$continent = "South America", $language = "Spanish"]] | [[Brazil|Intro Summary][$continent = "Brazil", $language = "Portuguese"]] | [[Europe|Intro Summary][$continent = "Europe", $language = "English"]] | [[the Middle East|Intro Summary][$continent = "the Middle East", $language = "Arabic"]] | [[Africa|Intro Summary][$continent = "Africa", $language = "Arabic"]] | [[Asia|Intro Summary][$continent = "Asia", $language = "Chinese"]] | [[Australia|Intro Summary][$continent = "Australia", $language = "English"]] | <<if $freshPC == 1 || $saveImported == 0>> - [[Japan|Intro Summary][$continent = "Japan", $language = "Japanese", $PC.race = "asian", $PC.nationality = "Japanese", $PC.hColor = "black", $PC.eyeColor = "brown"]] + <<options $continent>> + The Free City is located in ''$continent''. + <<option "North America" "North America" "$language = 'English'">> + <<option "South America" "South America" "$language = 'Spanish'">> + <<option "Brazil" "Brazil" "$language = 'Portuguese'">> + <<option "Europe" "Europe" "$language = 'English'">> + <<option "the Middle East" "the Middle East" "$language = 'Arabic'">> + <<option "Africa" "Africa" "$language = 'Arabic'">> + <<option "Asia" "Asia" "$language = 'Chinese'">> + <<option "Australia" "Australia" "$language = 'English'">> + <<option "Japan" "Japan" "$language = 'Japanese', $PC.race = 'asian', $PC.nationality = 'Japanese', $PC.hColor = 'black', $PC.eyeColor = 'brown'">> + <</options>> <<else>> - [[Japan|Intro Summary][$continent = "Japan", $language = "Japanese"]] + <<options $continent>> + The Free City is located in ''$continent''. + <<option "North America" "North America" "$language = 'English'">> + <<option "South America" "South America" "$language = 'Spanish'">> + <<option "Brazil" "Brazil" "$language = 'Portuguese'">> + <<option "Europe" "Europe" "$language = 'English'">> + <<option "the Middle East" "the Middle East" "$language = 'Arabic'">> + <<option "Africa" "Africa" "$language = 'Arabic'">> + <<option "Asia" "Asia" "$language = 'Chinese'">> + <<option "Australia" "Australia" "$language = 'English'">> + <<option "Japan" "Japan" "$language = 'Japanese'">> + <</options>> <</if>> <</if>> <</if>> - +<br> <<if !["ArabianRevivalist", "AztecRevivalist", "ChineseRevivalist", "EdoRevivalist", "EgyptianRevivalist", "RomanRevivalist"].includes($targetArcology.type)>> + <<options $language>> + The lingua franca of your arcology is: + <<option "English" "English">> + <<option "Spanish" "Spanish">> + <<option "Arabic" "Arabic">> + <<option>> + <<textbox "$language" $language "Intro Summary">> + <</options>> <br> - The lingua franca of your arcology is <<textbox "$language" $language "Intro Summary">>. - <<if $language != "English">> - [[English|Intro Summary][$language = "English"]] | - <<else>> - English | - <</if>> - <<if $language != "Spanish">> - [[Spanish|Intro Summary][$language = "Spanish"]] | - <<else>> - Spanish | - <</if>> - <<if $language != "Arabic">> - [[Arabic|Intro Summary][$language = "Arabic"]] | - <<else>> - Arabic | - <</if>> - <<if $language != "Chinese">> - [[Chinese|Intro Summary][$language = "Chinese"]] - <<else>> - Chinese - <</if>> <</if>> -<br> -The Free City could develop as many as ''$FSCreditCount'' future societies. -<<textbox "$FSCreditCount" $FSCreditCount "Intro Summary">> -<br> <<if $FSCreditCount >= 7>> <<set $FSCreditCountString = "seven">> <<elseif $FSCreditCount == 6>> @@ -554,9 +557,17 @@ The Free City could develop as many as ''$FSCreditCount'' future societies. <<elseif $FSCreditCount <= 4>> <<set $FSCreditCountString = "four">> <</if>> -//5 is default, 4 behaves the same as pre-patch 0.9.9.0, max is 7.// -//Make sure to hit enter to confirm.// -//This option cannot be changed during the game// + +<<options $FSCreditCount>> + The Free City could develop as many as ''$FSCreditCount'' future societies. + <<option>> + <<textbox "$FSCreditCount" $FSCreditCount "Intro Summary">> + <<comment>> + <br> + 5 is default, 4 behaves the same as pre-patch 0.9.9.0, max is 7. + Make sure to hit enter to confirm. + This option cannot be changed during the game +<</options>> <br><br> __''Player Character''__ @@ -570,144 +581,214 @@ __''Player Character''__ <</if>> <</if>> - <br>You are a $PCCreationSex. - <br>Change to - <<if $PCCreationSex != "masculine ''Master''">> - [[masculine Master|Intro Summary][$PC.title = 1, $PC.genes = "XY", $PCCreationSex = "masculine ''Master''"]] - <<elseif $PCCreationSex != "feminine ''Mistress''">> - [[feminine Mistress|Intro Summary][$PC.title = 0, $PC.genes = "XX", $PCCreationSex = "feminine ''Mistress''"]] - <</if>> + <br> + <<options $PC.title>> + You are a $PCCreationSex. Change to: + <<option 1 "masculine Master" "$PC.genes = 'XY', $PCCreationSex = \"masculine ''Master''\"">> + <<option 0 "feminine Mistress" "$PC.genes = 'XX', $PCCreationSex = \"feminine ''Mistress''\"">> + <</options>> - <br>Everyone calls you ''<<= PlayerName()>>.'' <br> - With ''<<textbox "$PC.name" $PC.name>>'' as your given name and + Everyone calls you ''<<= PlayerName()>>.'' + <br> + <<options>> + With your given name as: + <<option>> + <<textbox "$PC.name" $PC.name>> + <</options>> + <br> <<if $PC.surname == 0>> - no surname. - <<link "Add a surname">> - <<set $PC.surname = "Anon">> - <<goto "Intro Summary">> - <</link>> //Surnames cannot be changed during the game outside of special circumstances.// + <<options $PC.surname>> + And no surname. + <<option "Anon" "Add a surname">> + <<comment>> + Surnames cannot be changed during the game outside of special circumstances. + <</options>> <<else>> - ''<<textbox "$PC.surname" $PC.surname>>'' as your surname. - <<link "Go by a single name">> - <<set $PC.surname = 0, $PC.surname = "">> - <<goto "Intro Summary">> - <</link>> + <<options $PC.surname>> + And your surname is: + <<option>> + <<textbox "$PC.surname" $PC.surname>> + <<option 0 "Go by a single name">> + <</options>> <</if>> - <br> - You are <<textbox "$PC.actualAge" $PC.actualAge "Intro Summary">> years old which is - <<if $PC.actualAge >= 65>> - ''old''. - <<elseif $PC.actualAge >= 50>> - ''well into middle age''. - <<elseif $PC.actualAge >= 35>> - ''entering middle age''. - <<else>> - ''surprisingly young''. - <</if>> <<set $PC.physicalAge = $PC.actualAge, $PC.visualAge = $PC.actualAge>> - - Your birthday was <<textbox "$PC.birthWeek" $PC.birthWeek "Intro Summary">> weeks ago. - - <<if $playerAging == 2>> - and you ''age naturally''. - [[Disable aging|Intro Summary][$playerAging = 0]] | - [[Semi aging|Intro Summary][$playerAging = 1]] - <<elseif $playerAging == 1>> - and you ''will'' celebrate birthdays, but ''not age''. - [[Enable aging fully|Intro Summary][$playerAging = 2]] | - [[Disable aging|Intro Summary][$playerAging = 0]] + <<options>> + You are ''$PC.actualAge'' years old which is + <<if $PC.actualAge >= 65>> + ''old''. + <<elseif $PC.actualAge >= 50>> + ''well into middle age''. + <<elseif $PC.actualAge >= 35>> + ''entering middle age''. + <<else>> + ''surprisingly young''. + <</if>> + <<option>> + <<textbox "$PC.actualAge" $PC.actualAge "Intro Summary">> + <</options>> + <br> + <<options>> + Your birthday was ''$PC.birthWeek'' weeks ago. + <<option>> + <<textbox "$PC.birthWeek" $PC.birthWeek "Intro Summary">> + <</options>> + <br> + <<options $playerAging>> + <<option 2 "Enable aging">> + and you ''age naturally''. + <<option 1 "Semi aging">> + and you ''will'' celebrate birthdays, but ''not age''. + <<option 0 "Disable aging">> + and you will ''not age,'' nor experience birthdays. + <<comment>> + This option cannot be changed during the game + <</options>> + <br> + <<if def $PC.customTitle>> + <<options>> + Your custom title is: + <<option>> + <<textbox "$PC.customTitle" $PC.customTitle "Intro Summary">> + <</options>> + <br> + <<options>> + and when lisped it is: + <<option>> + <<textbox "$PC.customTitleLisp" $PC.customTitleLisp "Intro Summary">> + <<custom>> + If using a custom title, select Master or Mistress to set the gender of your title. + Make sure to replace your "s"s with "th"s to have working lisps in your lisped title. + <</options>> <<else>> - and you will ''not age,'' nor experience birthdays. - [[Enable aging|Intro Summary][$playerAging = 2]] | - [[Semi aging|Intro Summary][$playerAging = 1]] + <<options $PC.customTitle>> + You have no custom title: + <<option "Master" "Set custom title" "$PC.customTitleLisp = 'Mather'">> + <<custom>> + If using a custom title, select Master or Mistress to set the gender of your title. + Make sure to replace your "s"s with "th"s to have working lisps in your lisped title. + <</options>> <</if>> - //This option cannot be changed during the game// - <br> - Your custom title is ''<<textbox "$PC.customTitle" $PC.customTitle "Intro Summary">>'' - and when lisped it is ''<<textbox "$PC.customTitleLisp" $PC.customTitleLisp "Intro Summary">>''. - - //If using a custom title, select Master or Mistress to set the gender of your title.// - //Make sure to replace your "s"s with "th"s to have working lisps in your lisped title.// - + <<options>> + Your nationality is: + <<option>> + <<textbox "$PC.nationality" $PC.nationality "Intro Summary">> + <<comment>> + Capitalize it + <</options>> <br> - Your nationality (//Capitalize it//) is <<textbox "$PC.nationality" $PC.nationality "Intro Summary">>, - race is <<textbox "$PC.race" $PC.race "Intro Summary">> - and skin tone is <<textbox "$PC.skin" $PC.skin "Intro Summary">>. - -<br>__Race:__ - [[White|Intro Summary][$PC.race = "white"]] | - [[Asian|Intro Summary][$PC.race = "asian"]] | - [[Latina|Intro Summary][$PC.race = "latina"]] | - [[Middle Eastern|Intro Summary][$PC.race = "middle eastern"]] | - [[Black|Intro Summary][$PC.race = "black"]] | - [[Semitic|Intro Summary][$PC.race = "semitic"]] | - [[Southern European|Intro Summary][$PC.race = "southern european"]] | - [[Indo-Aryan|Intro Summary][$PC.race = "indo-aryan"]] | - [[Amerindian|Intro Summary][$PC.race = "amerindian"]] | - [[Pacific Islander|Intro Summary][$PC.race = "pacific islander"]] | - [[Malay|Intro Summary][$PC.race = "malay"]] | - [[Mixed Race|Intro Summary][$PC.race = "mixed race"]] - -<br>__Skin tone:__ - [[Pure White|Intro Summary][$PC.skin = "pure white"]] | - [[Extremely Pale|Intro Summary][$PC.skin = "extremely pale"]] | - [[Pale|Intro Summary][$PC.skin = "pale"]] | - [[Extremely Fair|Intro Summary][$PC.skin = "extremely fair"]] | - [[Very Fair|Intro Summary][$PC.skin = "very fair"]] | - [[Fair|Intro Summary][$PC.skin = "fair"]] | - [[White|Intro Summary][$PC.skin = "white"]] | - [[Light|Intro Summary][$PC.skin = "light"]] | - [[Lightened|Intro Summary][$PC.skin = "lightened"]] | - [[Light Olive|Intro Summary][$PC.skin = "light olive"]] | - [[Olive|Intro Summary][$PC.skin = "olive"]] | - [[Natural|Intro Summary][$PC.skin = "natural"]] | - [[Tanned|Intro Summary][$PC.skin = "tanned"]] | - [[Bronzed|Intro Summary][$PC.skin = "bronzed"]] | - [[Dark Olive|Intro Summary][$PC.skin = "dark olive"]] | - [[Dark|Intro Summary][$PC.skin = "dark"]] | - [[Light Brown|Intro Summary][$PC.skin = "light brown"]] | - [[Brown|Intro Summary][$PC.skin = "brown"]] | - [[Dark Brown|Intro Summary][$PC.skin = "dark brown"]] | - [[Black|Intro Summary][$PC.skin = "black"]] | - [[Ebony|Intro Summary][$PC.skin = "ebony"]] | - [[Pure Black|Intro Summary][$PC.skin = "pure black"]] - - <<switch $PC.markings>> - <<case "freckles">> - <<set _PCCreationFreckles = "has light freckling">> - <<case "heavily freckled">> - <<set _PCCreationFreckles = "has heavy freckling">> - <<default>> - <<set _PCCreationFreckles = "is clear of blemishes">> - <</switch>> - <br>Your body ''_PCCreationFreckles''. - [[None|Intro Summary][$PC.markings = "none"]] | - [[Light|Intro Summary][$PC.markings = "freckles"]] | - [[Heavy|Intro Summary][$PC.markings = "heavily freckled"]] - - <br>Your eyes are <<textbox "$PC.eyeColor" $PC.eyeColor "Intro Summary">> - - and hair is <<textbox "$PC.hColor" $PC.hColor "Intro Summary">>. - - <br>Your face is ''$PC.faceShape''. - [[Normal|Intro Summary][$PC.faceShape = "normal"]] | - [[Androgynous|Intro Summary][$PC.faceShape = "androgynous"]] | - [[Masculine|Intro Summary][$PC.faceShape = "masculine"]] | - [[Cute|Intro Summary][$PC.faceShape = "cute"]] | - [[Sensual|Intro Summary][$PC.faceShape = "sensual"]] | - [[Exotic|Intro Summary][$PC.faceShape = "exotic"]] - + <<options $PC.race>> + Your race is: + <<option "white" "White">> + <<option "asian" "Asian">> + <<option "latina" "Latina">> + <<option "middle eastern" "Middle Eastern">> + <<option "black" "Black">> + <<option "semitic" "Semitic">> + <<option "southern european" "Southern European">> + <<option "indo-aryan" "Indo-Aryan">> + <<option "amerindian" "Amerindian">> + <<option "pacific islander" "Pacific Islander">> + <<option "malay" "Malay">> + <<option "mixed race" "Mixed Race">> + <<option>> + <<textbox "$PC.race" $PC.race "Intro Summary">> + <</options>> <br> - Your preferred refreshment is <<textbox "$PC.refreshment" $PC.refreshment "Intro Summary">> [[Cigars|Intro Summary][$PC.refreshment = "cigar",$PC.refreshmentType = 0]] | [[Whiskey|Intro Summary][$PC.refreshment = "whiskey",$PC.refreshmentType = 1]] - - and you consume it by ''<<if $PC.refreshmentType == 0>>Smoking<<elseif $PC.refreshmentType == 1>>Drink<<elseif $PC.refreshmentType == 2>>Eating<<elseif $PC.refreshmentType == 3>>Snorting<<elseif $PC.refreshmentType == 4>>Injection<<elseif $PC.refreshmentType == 5>>Popping<<else>>Orally Dissolving<</if>>''. - [[Smoked|Intro Summary][$PC.refreshmentType = 0]] | [[Drank|Intro Summary][$PC.refreshmentType = 1]] | [[Eaten|Intro Summary][$PC.refreshmentType = 2]] | [[Snorted|Intro Summary][$PC.refreshmentType = 3]] | [[Injected|Intro Summary][$PC.refreshmentType = 4]] | [[Popped|Intro Summary][$PC.refreshmentType = 5]] | [[Orally Dissolved|Intro Summary][$PC.refreshmentType = 6]] + <<options $PC.skin>> + Your skin tone is: + <<option "pure white" "Pure White" >> + <<option "extremely pale" "Extremely Pale" >> + <<option "pale" "Pale" >> + <<option "extremely fair" "Extremely Fair" >> + <<option "very fair" "Very Fair" >> + <<option "fair" "Fair" >> + <<option "white" "White" >> + <<option "light" "Light" >> + <<option "lightened" "Lightened" >> + <<option "light olive" "Light Olive" >> + <<option "olive" "Olive" >> + <<option "natural" "Natural" >> + <<option "tanned" "Tanned" >> + <<option "bronzed" "Bronzed" >> + <<option "dark olive" "Dark Olive" >> + <<option "dark" "Dark" >> + <<option "light brown" "Light Brown" >> + <<option "brown" "Brown" >> + <<option "dark brown" "Dark Brown" >> + <<option "black" "Black" >> + <<option "ebony" "Ebony" >> + <<option "pure black" "Pure Black" >> + <<option>> + <<textbox "$PC.skin" $PC.skin "Intro Summary">> + <</options>> + <br> + <<options $PC.markings>> + <<option "none" "None">> + Your body ''is clear of blemishes''. + <<option "freckles" "Light">> + Your body ''has light freckling''. + <<option "heavily freckled" "Heavy">> + Your body ''has heavy freckling''. + <</options>> + <br> + <<options>> + Your eyes are: + <<option>> + <<textbox "$PC.eyeColor" $PC.eyeColor "Intro Summary">> + <</options>> + <br> + <<options>> + Your hair is: + <<option>> + <<textbox "$PC.hColor" $PC.hColor "Intro Summary">> + <</options>> + <br> + <<options $PC.faceShape>> + <<option "normal" "Normal">> + Your face is ''normal''. + <<option "androgynous" "Androgynous">> + Your face is ''androgynous''. + <<option "masculine" "Masculine">> + Your face is ''masculine''. + <<option "cute" "Cute">> + Your face is ''cute''. + <<option "sensual" "Sensual">> + Your face is ''sensual''. + <<option "exotic" "Exotic">> + Your face is ''exotic''. + <</options>> + <br> + <<options $PC.refreshment>> + Your preferred refreshment is: + <<option "cigar" "Cigars" "$PC.refreshmentType = 0">> + <<option "whiskey" "Whiskey" "$PC.refreshmentType = 1">> + <<option>> + <<textbox "$PC.refreshment" $PC.refreshment "Intro Summary">> + <</options>> + <br> + <<options $PC.refreshmentType>> + Which you + <<option 0 "Smoke">> + smoke + <<option 1 "Drink">> + eat + <<option 2 "Eat">> + eat + <<option 3 "Snort">> + snort + <<option 4 "Inject">> + inject + <<option 5 "Pop">> + pop + <<option 6 "Orally Disolve">> + orally disolve + <</options>> <br> - <<if $PC.refreshmentType == 0>>//"Smoked" must fit into the following sentence: "I smoked a $PC.refreshment" to fit events properly + <<if ($PC.refreshmentType == 0) && ($PC.refreshmentType != 0) >>//"Smoked" must fit into the following sentence: "I smoked a $PC.refreshment" to fit events properly <<elseif $PC.refreshmentType == 5>>//"Popped" must fit into the following sentence: "I shook the bottle of $PC.refreshment" to fit events properly <<elseif $PC.refreshmentType == 6>>//"Orally Dissolved" must fit into the following sentence: "I placed a tab of $PC.refreshment under my tongue" to fit events properly <</if>> @@ -737,81 +818,108 @@ __''Player Character''__ <<set _PCCreationCareer = "a member of the idle wealthy">> <</switch>> <br> - Before you came to the Free Cities, you were ''_PCCreationCareer'' and it is rumored that you acquired your arcology through ''$PC.rumor''. - - <br>__Past career:__ - <<if $PC.career != "arcology owner">> - [[member of the idle wealthy|Intro Summary][$PC.career = "wealth"]] | - [[business leader|Intro Summary][$PC.career = "capitalist"]] | - [[mercenary|Intro Summary][$PC.career = "mercenary"]] | - [[slaver|Intro Summary][$PC.career = "slaver"]] | - [[engineer|Intro Summary][$PC.career = "engineer"]] | - [[doctor|Intro Summary][$PC.career = "medicine"]] | - [[hacker|Intro Summary][$PC.career = "BlackHat"]] | - [[minor celebrity|Intro Summary][$PC.career = "celebrity"]] | - [[escort|Intro Summary][$PC.career = "escort"]] | - [[servant|Intro Summary][$PC.career = "servant"]] | - [[gang leader|Intro Summary][$PC.career = "gang"]] + <<if $PC.career == "arcology owner">> + Before you came to the Free Cities, you were ''_PCCreationCareer'' + <<else>> + <<options $PC.career>> + Before you came to the Free Cities, you were ''_PCCreationCareer'': + <<option "wealth" "member of the idle wealthy">> + <<option "capitalist" "business leader">> + <<option "mercenary" "mercenary">> + <<option "slaver" "slaver">> + <<option "engineer" "engineer">> + <<option "medicine" "doctor">> + <<option "BlackHat" "hacker">> + <<option "celebrity" "minor celebrity">> + <<option "escort" "escort">> + <<option "servant" "servant">> + <<option "gang" "gang leader">> + <</options>> <</if>> - - <br>__rumor:__ - [[wealth|Intro Summary][$PC.rumor = "wealth"]] | - [[hard work|Intro Summary][$PC.rumor = "diligence"]] | - [[force|Intro Summary][$PC.rumor = "force"]] | - [[social engineering|Intro Summary][$PC.rumor = "social engineering"]] | - [[blind luck|Intro Summary][$PC.rumor = "luck"]] - <br> - You have a + <<options $PC.rumor>> + It is rumored that you acquired your arcology through ''$PC.rumor'': + <<option "wealth" "wealth">> + <<option "diligence" "hard work">> + <<option "force" "force">> + <<option "social engineering" "social engineering">> + <<option "luck" "blind luck">> + <</options>> + <br> + <<if $PC.vagina == 1 && $PC.dick == 1>> - ''penis and vagina''. Sex scene variations; more difficult reputation maintenance; some unique opportunities, especially with breasts. - [[No penis|Intro Summary][$PC.dick = 0]] | [[No vagina|Intro Summary][$PC.vagina = 0, $PC.preg = 0, $PC.pregType = 0]] - <<elseif $PC.dick == 1>> - ''penis''. Standard sex scenes; easiest reputation maintenance. - [[Switch to vagina|Intro Summary][$PC.dick = 0, $PC.vagina = 1]] | [[Add a vagina|Intro Summary][$PC.vagina = 1]] + <<set _vagina_penis = 2>> <<elseif $PC.vagina == 1>> - ''vagina''. Sex scene variations; most difficult reputation maintenance. - [[Switch to penis|Intro Summary][$PC.dick = 1, $PC.vagina = 0, $PC.preg = 0, $PC.pregType = 0]] | [[Add a penis|Intro Summary][$PC.dick = 1]] + <<set _vagina_penis = 1>> + <<else>> + <<set _vagina_penis = 0>> <</if>> + <<options _vagina_penis>> + You have a + <<option 0 "Penis" "$PC.preg=0, $PC.pregType=0, $PC.dick=1, $PC.vagina=0">> + ''penis''. Standard sex scenes; easiest reputation maintenance. + <<option 1 "Vagina" "$PC.dick=0, $PC.vagina=1">> + ''vagina''. Sex scene variations; most difficult reputation maintenance. + <<option 2 "Penis and Vagina" "$PC.dick=1, $PC.vagina=1">> + ''penis and vagina''. Sex scene variations; more difficult reputation maintenance; some unique opportunities, especially with breasts. + <</options>> + <br> + <<if $PC.vagina == 1>> - <br> - You are + + <<if $PC.preg == -1>> - taking contraceptives. You ''can't'' get pregnant, however there will be a slight increase to living expenses. - [[Do not take contraceptives|Intro Summary][$PC.preg = 0]] + <<options $PC.preg>> + You are taking contraceptives. You ''can't'' get pregnant, however there + will be a slight increase to living expenses. + <<option -1 "Taking contraceptives">> + <<option 0 "Do not take contraceptives">> + <</options>> <<elseif $PC.preg == 0>> - ''not'' on contraceptives. You ''can'' get pregnant. - [[Take contraceptives|Intro Summary][$PC.preg = -1]] - | [[Too late for that|Intro Summary][$PC.preg = 16, $PC.pregType = 1]] + <<options $PC.preg>> + You are ''not'' on contraceptives. You ''can'' get pregnant. + <<option -1 "Take contraceptives">> + <<option 0 "Not taking contraceptives">> + <<option 16 "Too late for that!" "$PC.pregType = 1">> + <</options>> <<elseif $PC.preg > 42>> - ''<<print $PC.preg>> weeks pregnant with octuplets'' and your water just broke. - [[Not pregnant|Intro Summary][$PC.preg = 0, $PC.pregType = 0, $PC.labor = 0]] + <<options $PC.preg>> + You are ''<<print $PC.preg>> weeks pregnant with octuplets'' and your + water just broke. + <<options 0 "Not pregnant" "$PC.pregType = 0, $PC.labor = 0">> + <</options>> <<elseif $PC.preg > 37>> - ''<<print $PC.preg>> weeks pregnant'' and going to go into labor soon. - [[Not pregnant|Intro Summary][$PC.preg = 0, $PC.pregType = 0]] + <<options $PC.preg>> + You are ''<<print $PC.preg>> weeks pregnant'' and going to go into labor soon. + <<options 0 "Not pregnant" "$PC.pregType = 0, $PC.labor = 0">> + <<option 43 "Stuffed to capacity" "$PC.pregType = 8, $PC.labor = 1">> + <</options>> <<elseif $PC.preg > 0>> - ''<<print $PC.preg>> weeks pregnant'' so there is no need to worry about contraceptives. - [[Not pregnant|Intro Summary][$PC.preg = 0, $PC.pregType = 0]] - | [[Ready to drop|Intro Summary][$PC.preg = 40]] - | [[Stuffed to capacity|Intro Summary][$PC.preg = 43, $PC.pregType = 8, $PC.labor = 1]] + <<options $PC.preg>> + You are ''<<print $PC.preg>> weeks pregnant'' so there is no need to + worry about contraceptives. + <<option 0 "Not pregnant" "$PC.pregType = 0">> + <<option 40 "Ready to drop">> + <<option 43 "Stuffed to capacity" "$PC.pregType = 8, $PC.labor = 1">> + <</options>> <</if>> <<if $PC.births > 0>> <br>You have given birth to ''$PC.births'' babies. <</if>> - <br>Your hormones - <<if $PC.pregMood == 1>> - influence you to be ''caring and motherly''. Sex scene alterations; slaves will trust you more, but may try to take advantage of your mercy. - [[Change to no change|Intro Summary][$PC.pregMood = 0]] | [[Change to aggressive|Intro Summary][$PC.pregMood = 2]] - <<elseif $PC.pregMood == 0>> - do not affect you. Vanilla setting. - [[Change to motherly|Intro Summary][$PC.pregMood = 1]] | [[Change to aggressive|Intro Summary][$PC.pregMood = 2]] - <<else>> - influence you to be ''aggressive and domineering''. Sex scene alterations; slaves will fear you more, but will become more submissive to you. - [[Change to no change|Intro Summary][$PC.pregMood = 0]] | [[Change to motherly|Intro Summary][$PC.pregMood = 1]] - <</if>> + <br> + <<options $PC.pregMood>> + Your hormones + <<option 0 "Not affected">> + do not affect you. Vanilla setting. + <<option 1 "Caring and motherly">> + influence you to be ''caring and motherly''. Sex scene alterations; + slaves will trust you more, but may try to take advantage of your mercy. + <<option 2 "Aggressive and domineering">> + influence you to be ''aggressive and domineering''. Sex scene alterations; slaves will fear you more, but will become more submissive to you. + <</options>> <</if>> <br> @@ -839,21 +947,26 @@ __''Player Character''__ <</if>> <<if $PC.boobs > 0>> - Your breasts are ''_PCCreationBoobSize'' - and ''_PCCreationBreast''. - <<if $PC.boobsBonus == 0>> - [[Go bigger|Intro Summary][$PC.boobsBonus = 2, $PC.boobsImplant = 0]] | [[Get implants|Intro Summary][$PC.boobsBonus = 2, $PC.boobsImplant = 1]] | [[Go smaller|Intro Summary][$PC.boobsBonus = -2, $PC.boobsImplant = 0]] - <<elseif $PC.boobsBonus == 2>> - [[Go smaller |Intro Summary][$PC.boobsBonus = 0, $PC.boobsImplant = 0]] - <<elseif $PC.boobsBonus == -2>> - [[Go bigger |Intro Summary][$PC.boobsBonus = 0]] - <</if>> - | [[Remove them|Intro Summary][$PC.boobs = 0, $PC.boobsBonus = 0, $PC.boobsImplant = 0]] + <<options $PC.boobsBonus>> + Your breasts are ''_PCCreationBoobSize'' and ''_PCCreationBreast''. + <<option -2 "C-cup" "$PC.boobsImplant = 0">> + <<option 0 "DD-cup" "$PC.boobsImplant = 0">> + <<option 2 "F-cup" "$PC.boobsImplant = 0">> + <<option 2 "G-cup" "$PC.boobsImplant = 0">> + <<option 2 "G-cup implants" "$PC.boobsImplant = 1">> + <<option 0 "Remove them" "$PC.boobs = 0, $PC.boobsImplant = 0">> + <</options>> <<else>> <<if $PC.title == 1>> - Your chest is ''manly.'' [[Add breasts|Intro Summary][$PC.boobs = 1, $PC.boobsBonus = -2]] + <<options $PC.boobs>> + Your chest is ''manly.'' + <<option 1 "Add breasts" "$PC.boobsBonus = -2">> + <</options>> <<else>> - You are ''flat chested.'' [[Grow breasts|Intro Summary][$PC.boobs = 1, $PC.boobsBonus = -2]] + <<options $PC.boobs>> + You are ''flat chested.'' + <<option 1 "Grow breasts" "$PC.boobsBonus = -2">> + <</options>> <</if>> <</if>> @@ -879,21 +992,19 @@ __''Player Character''__ ''surprisingly young''. <</if>> - Your birthday will be in $PC.birthWeek weeks - <<if $playerAging == 2>> - and you ''age naturally''. - [[Disable aging|Intro Summary][$playerAging = 0]] | - [[Semi aging|Intro Summary][$playerAging = 1]] - <<elseif $playerAging == 1>> - and you ''will'' celebrate birthdays, but ''not age''. - [[Enable aging fully|Intro Summary][$playerAging = 2]] | - [[Disable aging|Intro Summary][$playerAging = 0]] - <<else>> - and you will ''not age,'' nor experience birthdays. - [[Enable aging|Intro Summary][$playerAging = 2]] | - [[Semi aging|Intro Summary][$playerAging = 1]] - <</if>> - //This option cannot be changed during the game// + <br> + + <<options $playerAging>> + Your birthday will be in $PC.birthWeek weeks + <<option 2 "Enable aging">> + and you ''age naturally''. + <<option 1 "Semi aging">> + and you ''will'' celebrate birthdays, but ''not age''. + <<option 0 "Disable aging">> + and you will ''not age,'' nor experience birthdays. + <<comment>> + This option cannot be changed during the game + <</options>> <br> Your custom title is ''<<textbox "$PC.customTitle" $PC.customTitle "Intro Summary">>'' diff --git a/src/facilities/farmyard/futureAnimals.tw b/src/facilities/farmyard/futureAnimals.tw index dac46ad0138ac862ffc280ee6fd008d5174e2373..5bb700d7c1d300955ac2d78516bda520c528ee6b 100644 --- a/src/facilities/farmyard/futureAnimals.tw +++ b/src/facilities/farmyard/futureAnimals.tw @@ -1,6 +1,6 @@ /* Putting them here because commenting them out was breaking for some reason */ -<<if $animalsBought.germanShepherds == 0>> + <<if $animalsBought.germanShepherds == 0>> <<link "Purchase German Shepherds" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.germanShepherds = 1, $animalsBought.canines += 1, $canines.push("German Shepherds")>><</link>> <br> <<elseif $animalsBought.germanShepherds == 1>> @@ -108,7 +108,6 @@ <</if>> <br> <</if>> -<</if>> @@ -237,7 +236,6 @@ <br> <</if>> <</if>> -<</if>> @@ -281,7 +279,6 @@ <</if>> <br> <</if>> -<</if>> <<if $farmyardStable > 1>> @@ -367,4 +364,4 @@ //Set as active feline// <</if>> <br> - <</if>> \ No newline at end of file + <</if>> diff --git a/src/facilities/nursery/childSummary.tw b/src/facilities/nursery/childSummary.tw index 78449006c71ef6d6c5753beb58d866e9c3b713cb..c69071588e1d848fc05799662b5dc08b7dacc03c 100644 --- a/src/facilities/nursery/childSummary.tw +++ b/src/facilities/nursery/childSummary.tw @@ -95,10 +95,6 @@ <<switch _Pass>> <<case "Main">> - <<if $useSlaveSummaryTabs == 1>> - <<if $childAssignmentTab == "overview">> - <</if>> - <<if (_Child.choosesOwnClothes == 1) && (_Child.clothes == "choosing her own clothes")>> <<set _oldDevotion = _Child.devotion>> <<set _chosenClothes = saChoosesOwnClothes(_Child)>> diff --git a/src/gui/Encyclopedia/encyclopedia.tw b/src/gui/Encyclopedia/encyclopedia.tw index cd8c1aaeb76715c78241469c22762eedad8af04c..d2755edbc140d380215cba6da601245cc9e31fc0 100644 --- a/src/gui/Encyclopedia/encyclopedia.tw +++ b/src/gui/Encyclopedia/encyclopedia.tw @@ -21,7 +21,7 @@ PLAYING FREE CITIES <br> Start the game and select any of the world options; choose normal difficulty, since it's pretty forgiving and this opener will make good @@.yellowgreen;[[money|Encyclopedia][$encyclopedia = "Money"]].@@ Build a completely male PC for your first game; it makes @@.green;[[reputation|Encyclopedia][$encyclopedia = "Arcologies and Reputation"]]@@ maintenance much easier. Choose wealth for both your career and your rumored method of obtaining the arcology; the other options are fun but a full wealth build will set you up quickly to get started. <br><br>Now, customize your starting slaves. - <br>For your first, make her as @@.cyan;intelligent, educated,@@ and old as possible. Make her @@.hotpink;[[devoted|Encyclopedia][$encyclopedia = "From Rebellious to Devoted"]]@@ , but save @@.yellowgreen;[[money|Encyclopedia][$encyclopedia = "Money"]]@@ by giving her flaws, an unknown fetish, and @@.gold;making her afraid of you.@@ (These are easy to fix.) You can customize the rest of her as you wish, but try to keep her under ;@@.yellowgreen;<<print cashFormat(5000)>>.@@ Don't worry about skills, since with two of them you'll be able to rotate Head Girl duty so the other can learn skills. Commit her, base another slave off her, and commit that one too. Those are your [[Head Girls|Encyclopedia][$encyclopedia = "Head Girl"]]. + <br>For your first, make her as @@.cyan;intelligent, educated,@@ and old as possible. Make her @@.hotpink;[[devoted|Encyclopedia][$encyclopedia = "From Rebellious to Devoted"]]@@, but save @@.yellowgreen;[[money|Encyclopedia][$encyclopedia = "Money"]]@@ by giving her flaws, an unknown fetish, and @@.gold;making her afraid of you.@@ (These are easy to fix.) You can customize the rest of her as you wish, but try to keep her under ;@@.yellowgreen;<<print cashFormat(5000)>>.@@ Don't worry about skills, since with two of them you'll be able to rotate Head Girl duty so the other can learn skills. Commit her, base another slave off her, and commit that one too. Those are your [[Head Girls|Encyclopedia][$encyclopedia = "Head Girl"]]. <br> Spend the rest of your @@.yellowgreen;[[money|Encyclopedia][$encyclopedia = "Money"]]@@ on prospects: slaves that are @@.yellowgreen;[[cheap|Encyclopedia][$encyclopedia = "Money"]]@@ now, but can be improved quickly. As long as you keep @@.hotpink;devotion@@ pretty high, low @@.mediumaquamarine;[[trust|Encyclopedia][$encyclopedia = "Trust"]]@@ can be fixed reliably. Unknown fetishes, emaciated or fat, flaws, deep voice, and poor skills are all good ways to drive prices down, and can all be fixed quickly. Virginities are a bad idea because they drive costs up and are easy to break. @@.cyan;Education@@ can take awhile and will take slaves away from other jobs, so make them all educated for now, and keep their @@.cyan;intelligence@@ reasonably high. diff --git a/src/gui/css/optionsMacro.tw b/src/gui/css/optionsMacro.tw new file mode 100644 index 0000000000000000000000000000000000000000..95e2e766efe5db61cc7abf3258c5491c32cc0c5f --- /dev/null +++ b/src/gui/css/optionsMacro.tw @@ -0,0 +1,93 @@ +:: Options Macro [stylesheet] + +.optionMacro { + margin-top: 8px; + display: inline-block; +} + +.optionDescription { + display: inline-block; + width: 500px; + margin-right: 10px; + line-height: 1.2; +} + +@media only screen and (max-width: 1200px) { + .optionDescription { + display: block; + width: unset; + } + + .optionMacro { + margin-top: 30px; + } + +} + +.optionMacroOption { + border: #555 solid 0.5px; + border-top-width: 0; + vertical-align: top; + background: linear-gradient(transparent,#222); + -moz-user-select: none; + padding: 4px; +} + +.optionComment { + vertical-align: top; + color: gray; +} + +/* But don't add the | after the last one */ +.optionMacroOption:last-child { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + border-right-width: 0; +} + +.optionMacroOption:first-child { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +.optionMacroOption a { + padding: 4px 0; +} + +.optionMacroOption:hover { + background: linear-gradient(#2F2F2F,#111); +} + +.optionMacroSelected { + background: linear-gradient(#2F2F2F,#111); + padding: 4px; + cursor: pointer; +} + +.optionValue input { + padding: 3px; + background: linear-gradient(transparent,#222); + border: #555 solid 0.5px; + border-top-width: 0; + min-width: reset; + width: 140px; +} + +.optionValue input:last-child { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + border-right-width: 0; +} + +.optionValue input:first-child { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +.optionMacroSelected.optionMacroEnable { + /*background-image: linear-gradient(rgba(255, 100, 0, 1), rgba(0, 255, 0, 1));*/ +} + +.optionMacroSelected.optionMacroDisable { + /*background-image: linear-gradient(rgba(255, 100, 0, 1), rgba(255, 0, 0, 1));*/ +} diff --git a/src/init/setupVars.tw b/src/init/setupVars.tw index 7efa84944bfcfac157d03422e1bf81829da88ef2..7645c3af06e676e6658cb1e3009ca2b9083c9775 100644 --- a/src/init/setupVars.tw +++ b/src/init/setupVars.tw @@ -2072,6 +2072,7 @@ Then pick _namePool.random(), or display those names as possible choices, or do <<set setup.vaginalAccessories = [ {name: "No default setting", value: "no default setting"}, {name: "None", value: "none"}, + {name: "Bullet vibrator", value: "bullet vibrator"}, {name: "Dildo", value: "dildo"}, {name: "Long dildo", value: "long dildo", rs: "buyBigDildos"}, {name: "Large dildo", value: "large dildo"}, @@ -2079,6 +2080,11 @@ Then pick _namePool.random(), or display those names as possible choices, or do {name: "Huge dildo", value: "huge dildo"}, {name: "Long, huge dildo", value: "long, huge dildo", rs: "buyBigDildos"}]>> +<<set setup.vaginalAttachments = [ + {name: "No default setting", value: "no default setting"}, + {name: "None", value: "none"}, + {name: "Vibrating attachment", value: "vibrator"}]>> + <<set setup.dickAccessories = [ {name: "No default setting", value: "no default setting"}, {name: "None", value: "none"}]>> diff --git a/src/init/storyInit.tw b/src/init/storyInit.tw index d8c08dce33727b9173234eb4a23982ee8e560e21..1241b29310c51c3e7184a200c587e78a60d41f0e 100644 --- a/src/init/storyInit.tw +++ b/src/init/storyInit.tw @@ -861,6 +861,7 @@ You should have received a copy of the GNU General Public License along with thi <<set $clothesBoughtSwimwear = 0>> <<set $toysBoughtDildos = 0>> <<set $toysBoughtGags = 0>> +<<set $toysBoughtVaginalAttachments = 0>> <<set $toysBoughtButtPlugs = 0>> <<set $toysBoughtButtPlugTails = 0>> <<set $buckets = 0>> diff --git a/src/interaction/cyberConfig.tw b/src/interaction/cyberConfig.tw index 3c327fc67cc1dcab062c4f93feb7db5b38940b80..eacceaf73b8e5ed7146bd85b92e3be3fa92335d1 100644 --- a/src/interaction/cyberConfig.tw +++ b/src/interaction/cyberConfig.tw @@ -157,7 +157,7 @@ <<if $stockpile.sexPTail > 0>>| [[Attach Pleasure Tail|cyberConfig][$temp = 8, $activeSlave.tail = "sex", $activeSlave.tailColor = "pink", $stockpile.sexPTail -= 1]]<</if>> <</if>> <<else>> - $He does not have a neural tail interface installed so you can not attach a tail. + $He does not have a neural tail interface installed so you cannot attach a tail. <</if>> <<if $activeSlave.tail == "mod">><br> $He currently has a modular tail, styled to look like diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js index b028235b359e8a38177877876cf89d1d722121fe..1f32ab0bbc453f11e23ab943b227f589a416d72d 100644 --- a/src/js/DefaultRules.js +++ b/src/js/DefaultRules.js @@ -564,6 +564,7 @@ window.DefaultRules = (function() { ProcessAVirginDildos(slave, rule); } else if (slave.vagina > 0) { ProcessNonVirginDildos(slave, rule); + ProcessVaginalAttachments(slave, rule); } } @@ -740,6 +741,45 @@ window.DefaultRules = (function() { } } + /** @param {App.Entity.SlaveState} slave */ + function ProcessVaginalAttachments(slave, rule) { + // apply vaginal accessories to slaves + if (slave.vaginalAccessory === "none" && slave.vaginalAttachment === "vibrator") { + slave.vaginalAttachment = "none"; // clears dildo attachment when dildos are removed above + } else if ((rule.vaginalAttachment !== undefined) && (rule.vaginalAttachment !== "no default setting")) { + if ((slave.vaginalAttachment !== rule.vaginalAttachment)) { + slave.vaginalAttachment = rule.vaginalAttachment; + if (slave.vaginalAccessory !== "none") { + switch (slave.vaginalAttachment) { + + case "none": + r += `<br>${slave.slaveName} has been instructed not to use an attachment for ${his} dildo.`; + break; + + case "vibrator": + r += `<br>${slave.slaveName}'s dildo has been replaced with a vibrating model.`; + break; + + default: + r += `<br>${slave.slaveName} has been given a ${slave.vaginalAttachment}.`; + break; + } + } else { + switch (slave.vaginalAttachment) { + + case "none": + r += `<br>${slave.slaveName} has been instructed not to use any vaginal accessories.`; + break; + + default: + r += `<br>${slave.slaveName} has been given a ${slave.vaginalAttachment}.`; + break; + } + } + } + } + } + /** @param {App.Entity.SlaveState} slave */ function ProcessDickAccessories(slave, rule) { // apply dick accessories to slave diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js index 2a72bb0ff5a8cf672762f51d0f251640cfb7070d..4bcb55d3cf9b4ae203c1a4ef6dd5013ac3166d59 100644 --- a/src/js/SlaveState.js +++ b/src/js/SlaveState.js @@ -1554,6 +1554,19 @@ App.Entity.SlaveState = class SlaveState { /** * may accept strings, use at own risk * * "none" + * * "bullet vibrator" + * * "dildo" + * * "long dildo" + * * "large dildo" + * * "long, large dildo" + * * "huge dildo" + * * "long, huge dildo" + */ + this.vaginalAttachment = "none"; + /** + * may accept strings, use at own risk + * * "none" + * * "vibrator" */ this.dickAccessory = "none"; /** diff --git a/src/js/assayJS.js b/src/js/assayJS.js index 5caec9358e1af9245e9a4283a4b576e149529735..6cdae706ccfb32626250c04d86082d5e2d2e807d 100644 --- a/src/js/assayJS.js +++ b/src/js/assayJS.js @@ -1,4 +1,4 @@ -window.isSlim = /** @param {App.Entity.SlaveState} slave */ function (slave) { +window.isSlim = /** @param {App.Entity.SlaveState} slave */ function(slave) { let slim = false; const ArcologyZero = State.variables.arcologies[0]; @@ -27,51 +27,15 @@ window.isSlim = /** @param {App.Entity.SlaveState} slave */ function (slave) { return slim; }; -window.isStacked = /** @param {App.Entity.SlaveState} slave */ function (slave) { - return (slave.butt > 4) && (slave.boobs > 800); -}; - -window.isModded = /** @param {App.Entity.SlaveState} slave */ function (slave) { - const tatScore = SlaveStatsChecker.tatScore(slave); - const piercingScore = SlaveStatsChecker.piercingScore(slave); - const modScore = piercingScore+tatScore; - - return ((modScore > 15) || (piercingScore > 8 && tatScore > 5)); -}; - -window.isUnmodded = /** @param {App.Entity.SlaveState} slave */ function (slave) { - return (!isModded(slave) && (slave.corsetPiercing === 0) && (SlaveStatsChecker.piercingScore(slave) < 3) && (SlaveStatsChecker.tatScore(slave) < 2)); -}; - -window.isXY = /** @param {App.Entity.SlaveState} slave */ function (slave) { - return (slave.dick > 0); -}; - -window.isYoung = /** @param {App.Entity.SlaveState} slave */ function (slave) { - return (slave.visualAge < 30); -}; - -window.isPreg = /** @param {App.Entity.SlaveState} slave */ function (slave) { - return ((slave.bellyPreg >= 5000) || (slave.bellyImplant >= 5000)); -}; - -window.isNotPreg = /** @param {App.Entity.SlaveState} slave */ function (slave) { - return (!isPreg(slave) && (slave.belly < 100) && (slave.weight < 30) && !setup.fakeBellies.includes(slave.bellyAccessory)); -}; - -window.isPure = /** @param {App.Entity.SlaveState} slave */ function (slave) { - return ((slave.boobsImplant === 0) && (slave.buttImplant === 0) && (slave.waist >= -95) && (slave.lipsImplant === 0) && (slave.faceImplant < 30) && (slave.bellyImplant === -1) && (Math.abs(slave.shouldersImplant) < 2) && (Math.abs(slave.hipsImplant) < 2)); -}; - -window.slimPass = /** @param {App.Entity.SlaveState} slave */ function (slave) { +window.slimPass = /** @param {App.Entity.SlaveState} slave */ function(slave) { let slimPass = 0; - let ArcologyZero = State.variables.arcologies[0]; + const ArcologyZero = State.variables.arcologies[0]; if (ArcologyZero.FSSlimnessEnthusiastLaw === 1) { if ((slave.boobs < 300) && (slave.butt <= 1) && (slave.waist <= 10)) { - if ((ArcologyZero.FSPhysicalIdealist === "unset") && (ArcologyZero.FSHedonisticDecadenceStrongFat === 0) && (slave.muscles > 30)) { /*muscle check*/ + if ((ArcologyZero.FSPhysicalIdealist === "unset") && (ArcologyZero.FSHedonisticDecadenceStrongFat === 0) && (slave.muscles > 30)) { /* muscle check*/ slimPass = 0; - } else if ((ArcologyZero.FSHedonisticDecadence !== "unset") || (ArcologyZero.FSPhysicalIdealistStrongFat === 1)) { /*weight check*/ + } else if ((ArcologyZero.FSHedonisticDecadence !== "unset") || (ArcologyZero.FSPhysicalIdealistStrongFat === 1)) { /* weight check*/ if (slave.weight > 30) { slimPass = 0; } @@ -112,7 +76,7 @@ window.inferiorRaceP = /** @param {App.Entity.SlaveState} slave */ function infe window.hasVisibleHeterochromia = /** @param {App.Entity.SlaveState} slave */ function hasVisibleHeterochromia(slave) { return slave.geneticQuirks.heterochromia !== 0 && slave.geneticQuirks.heterochromia !== 1 && slave.geneticQuirks.albinism !== 2 && slave.geneticQuirks.heterochromia !== slave.eyeColor && slave.eyeColor === slave.origEye; -} +}; window.isLeaderP = /** @param {App.Entity.SlaveState} slave */ function isLeaderP(slave) { const V = State.variables; @@ -250,7 +214,7 @@ window.newSlave = /** @param {App.Entity.SlaveState} slave */ function newSlave( V.genePool.push(slave); /* Store non-albino stats in genePool */ if (slave.geneticQuirks.albinism === 2) { - var albInd = V.genePool.findIndex(function(s) { return s.ID === slave.ID; }); + const albInd = V.genePool.findIndex(function(s) { return s.ID === slave.ID; }); V.genePool.genePool[albInd].origSkin = slave.albinismOverride.skin; V.genePool.genePool[albInd].origEye = slave.albinismOverride.eyeColor; V.genePool.genePool[albInd].origHColor = slave.albinismOverride.hColor; @@ -392,7 +356,7 @@ window.getPronouns = /** @param {App.Entity.SlaveState} slave */ function getPro possessive: slave.possessive, object: slave.object, objectReflexive: slave.objectReflexive, - noun: slave.noun }; + noun: slave.noun}; }; window.SlavePronouns = /** @param {App.Entity.SlaveState} slave */ function SlavePronouns(slave) { @@ -557,7 +521,7 @@ window.Enunciate = /** @param {App.Entity.SlaveState} slave */ function Enunciat window.fetishChangeChance = /** @param {App.Entity.SlaveState} slave */ function fetishChangeChance(slave) { const V = State.variables; - var chance = 0, sex = 0; + let chance = 0, sex = 0; if (slave.clitSetting !== slave.fetish) { if (slave.balls) { @@ -566,7 +530,7 @@ window.fetishChangeChance = /** @param {App.Entity.SlaveState} slave */ function else if (slave.ovaries || slave.mpreg) { sex = V.fertilityAge - slave.actualAge; } - chance = Math.trunc(Math.clamp((slave.devotion/4)-(slave.fetishStrength/4)-(Math.max(sex,0)*10), 0, 100)); + chance = Math.trunc(Math.clamp((slave.devotion/4)-(slave.fetishStrength/4)-(Math.max(sex, 0)*10), 0, 100)); } return chance; @@ -590,7 +554,7 @@ window.SlaveFullBirthName = /** @param {App.Entity.SlaveState} slave */ function window.PlayerName = function PlayerName() { const V = State.variables; - let names = V.PC.surname ? [V.PC.name, V.PC.surname] : [V.PC.name]; + const names = V.PC.surname ? [V.PC.name, V.PC.surname] : [V.PC.name]; if ((V.surnameOrder !== 1 && ["Cambodian", "Chinese", "Hungarian", "Japanese", "Korean", "Mongolian", "Taiwanese", "Vietnamese"].includes(V.PC.nationality)) || (V.surnameOrder === 2)) names.reverse(); return names.join(" "); @@ -598,7 +562,7 @@ window.PlayerName = function PlayerName() { window.PCTitle = function PCTitle() { const V = State.variables; - let titles = []; + const titles = []; V.PCTitle = PlayerName(); @@ -680,8 +644,8 @@ window.PCTitle = function PCTitle() { titles.push("The Betrayed"); break; case "Exodus": - titles.push("The Abandoned"); - break; + titles.push("The Abandoned"); + break; } } @@ -994,7 +958,7 @@ window.PCTitle = function PCTitle() { titles.push("Caretaker of the Youth"); } - let schoolsPresent = [], schoolsPerfected = [], schoolTitle = ""; + const schoolsPresent = []; const schoolsPerfected = []; let schoolTitle = ""; if (V.TSS.schoolProsperity >= 10) { schoolsPerfected.push("The Slave School"); } else if (V.TSS.schoolPresent === 1) { @@ -1131,9 +1095,12 @@ window.PCTitle = function PCTitle() { }; window.PoliteRudeTitle = /** @param {App.Entity.SlaveState} slave */ function PoliteRudeTitle(slave) { - const V = State.variables, PC = V.PC, s = V.sEnunciate, ss = V.ssEnunciate; + const V = State.variables; + const PC = V.PC; + const s = V.sEnunciate; + const ss = V.ssEnunciate; - var r = ""; + let r = ""; if (slave.nationality === "Japanese") { if (slave.trust > 0) { r += `${PC.name}${PC.title > 0 ? "kun" : "chan"}`; @@ -1159,7 +1126,7 @@ window.SlaveTitle = /** @param {App.Entity.SlaveState} slave */ function SlaveTi let r = ""; if (V.newDescriptions === 1) { if (slave.dick > 0 && slave.balls > 0 && slave.boobs > 300 && slave.vagina > -1 && slave.ovaries === 1) { - if (jsRandom(1,100) > 50) { + if (jsRandom(1, 100) > 50) { r = "futanari"; } else { r = "herm"; @@ -1297,26 +1264,26 @@ window.SlaveTitle = /** @param {App.Entity.SlaveState} slave */ function SlaveTi r = "slave"; /* I don't tihnk there is an 'else'? */ if ((slave.dick === 0) && (slave.vagina === -1)) { /* NULLS */ r = "null"; - if ((slave.lactation > 0) && (slave.boobs > 2000)) { - r = r + " cow"; - } else if ((slave.boobsImplant > 0) && (slave.buttImplant > 0)) { - r = r + " bimbo "; - } else if (slave.boobs > 6000) { - r = r + " boob"; - } else if (slave.butt > 6) { - r = r + " ass"; - } else if ((slave.muscles > 30) && (slave.height < 185)) { - r = r + " muscle"; - } - if (slave.visualAge > 55) { - r = r + "GILF"; - } else if (slave.visualAge > 35) { - r = r + "MILF"; - } else if (slave.visualAge >= 25) { - r = r + "slave"; - } else { - r = r + "girl"; - } + if ((slave.lactation > 0) && (slave.boobs > 2000)) { + r = r + " cow"; + } else if ((slave.boobsImplant > 0) && (slave.buttImplant > 0)) { + r = r + " bimbo "; + } else if (slave.boobs > 6000) { + r = r + " boob"; + } else if (slave.butt > 6) { + r = r + " ass"; + } else if ((slave.muscles > 30) && (slave.height < 185)) { + r = r + " muscle"; + } + if (slave.visualAge > 55) { + r = r + "GILF"; + } else if (slave.visualAge > 35) { + r = r + "MILF"; + } else if (slave.visualAge >= 25) { + r = r + "slave"; + } else { + r = r + "girl"; + } } if ((slave.dick === 0) && (slave.vagina !== -1)) { /* FEMALES */ @@ -1329,48 +1296,48 @@ window.SlaveTitle = /** @param {App.Entity.SlaveState} slave */ function SlaveTi } else { r = "slavegirl"; } - if ((slave.muscles > 30) && (slave.height < 185)) { - r = "muscle " + r; - } else if ((slave.lactation > 0) && (slave.boobs > 2000)) { - r = r + " cow"; - } else if ((slave.boobsImplant > 0) && (slave.buttImplant > 0)) { - r = r + " bimbo"; - } else if (slave.boobs > 6000) { - r = "boob" + r; - } else if (slave.butt > 6) { - r = "ass" + r; - } + if ((slave.muscles > 30) && (slave.height < 185)) { + r = "muscle " + r; + } else if ((slave.lactation > 0) && (slave.boobs > 2000)) { + r = r + " cow"; + } else if ((slave.boobsImplant > 0) && (slave.buttImplant > 0)) { + r = r + " bimbo"; + } else if (slave.boobs > 6000) { + r = "boob" + r; + } else if (slave.butt > 6) { + r = "ass" + r; + } } if ((slave.dick !== 0) && (slave.vagina !== -1)) { - if (slave.balls > 0) { /* FUTANARI: cock & balls & vagina */ - r = "futanari "; - } else { /* FUTANARI: cock & vagina */ - r = "futa "; - } - if ((slave.lactation > 0) && (slave.boobs > 2000)) { - r = r + "cow"; - } else if ((slave.boobsImplant > 0) && (slave.buttImplant > 0)) { - r = r + "bimbo "; - } else if (slave.boobs > 6000) { - r = r + "boob"; - } else if (slave.butt > 6) { - r = r + "ass"; - } else if ((slave.muscles > 30) && (slave.height < 185)) { - r = r + "muscle"; - } - if (slave.visualAge > 55) { - r = r + "GILF"; - } else if (slave.visualAge > 35) { - r = r + "MILF"; - } else if (slave.visualAge >= 25) { - r = r + "slave"; - } else { - r = r + "girl"; - } - if (slave.dick > 5 && slave.balls > 5 && slave.boobs > 5000) { - r = "hyper " + r; - } + if (slave.balls > 0) { /* FUTANARI: cock & balls & vagina */ + r = "futanari "; + } else { /* FUTANARI: cock & vagina */ + r = "futa "; + } + if ((slave.lactation > 0) && (slave.boobs > 2000)) { + r = r + "cow"; + } else if ((slave.boobsImplant > 0) && (slave.buttImplant > 0)) { + r = r + "bimbo "; + } else if (slave.boobs > 6000) { + r = r + "boob"; + } else if (slave.butt > 6) { + r = r + "ass"; + } else if ((slave.muscles > 30) && (slave.height < 185)) { + r = r + "muscle"; + } + if (slave.visualAge > 55) { + r = r + "GILF"; + } else if (slave.visualAge > 35) { + r = r + "MILF"; + } else if (slave.visualAge >= 25) { + r = r + "slave"; + } else { + r = r + "girl"; + } + if (slave.dick > 5 && slave.balls > 5 && slave.boobs > 5000) { + r = "hyper " + r; + } } if ((slave.dick !== 0) && (slave.vagina === -1) && (slave.balls > 0) && (slave.boobs > 300) && (slave.butt > 2)) { /* SHEMALES: cock & balls, T&A above minimum */ @@ -1383,17 +1350,17 @@ window.SlaveTitle = /** @param {App.Entity.SlaveState} slave */ function SlaveTi } else { r = "tgirl"; } - if ((slave.muscles > 30) && (slave.height < 185)) { - r = "muscle" + r; - } else if ((slave.lactation > 0) && (slave.boobs > 2000)) { - r = r + " cow"; - } else if ((slave.boobsImplant > 0) && (slave.buttImplant > 0)) { - r = r + " bimbo"; - } else if (slave.boobs > 6000) { - r = "topheavy " + r; - } else if (slave.butt > 6) { - r = "bottomheavy " + r; - } + if ((slave.muscles > 30) && (slave.height < 185)) { + r = "muscle" + r; + } else if ((slave.lactation > 0) && (slave.boobs > 2000)) { + r = r + " cow"; + } else if ((slave.boobsImplant > 0) && (slave.buttImplant > 0)) { + r = r + " bimbo"; + } else if (slave.boobs > 6000) { + r = "topheavy " + r; + } else if (slave.butt > 6) { + r = "bottomheavy " + r; + } } if ((slave.boobs < 300) || (slave.butt < 2)) { @@ -1418,11 +1385,11 @@ window.SlaveTitle = /** @param {App.Entity.SlaveState} slave */ function SlaveTi r = "trapgirl"; } } - if (slave.lactation > 0) { - r = r + " cow"; - } else if ((slave.boobsImplant > 0) && (slave.buttImplant > 0)) { - r = r + " bimbo"; - } + if (slave.lactation > 0) { + r = r + " cow"; + } else if ((slave.boobsImplant > 0) && (slave.buttImplant > 0)) { + r = r + " bimbo"; + } } } } @@ -1431,46 +1398,46 @@ window.SlaveTitle = /** @param {App.Entity.SlaveState} slave */ function SlaveTi if ((slave.dick !== 0) && (slave.vagina === -1) && (slave.balls > 0)) { if ((slave.shoulders > 1) || (slave.muscles >= 30)) { /* BITCHES: masculine shoulders or muscles */ r = "bitch"; - if ((slave.muscles > 30) && (slave.height < 185)) { - r = "muscle" + r; - } else if (slave.lactation > 0) { - r = r + "cow"; - } else if ((slave.boobsImplant > 0) && (slave.buttImplant > 0)) { - r = "bimbo " + r; - } - if (slave.visualAge > 55) { - r = "aged " + r; - } else if (slave.visualAge > 35) { - r = "mature " + r; - } else if (slave.visualAge < 25) { - r = "young " + r; - } + if ((slave.muscles > 30) && (slave.height < 185)) { + r = "muscle" + r; + } else if (slave.lactation > 0) { + r = r + "cow"; + } else if ((slave.boobsImplant > 0) && (slave.buttImplant > 0)) { + r = "bimbo " + r; + } + if (slave.visualAge > 55) { + r = "aged " + r; + } else if (slave.visualAge > 35) { + r = "mature " + r; + } else if (slave.visualAge < 25) { + r = "young " + r; + } } } } if ((slave.dick !== 0) && (slave.vagina === -1) && (slave.balls === 0)) { r = "dick"; - if (slave.visualAge > 55) { - r = r + "GILF"; - } else if (slave.visualAge > 35) { - r = r + "MILF"; - } else if (slave.visualAge >= 25) { - r = r + "slave"; - } else { - r = r + "girl"; - } - if ((slave.muscles > 30) && (slave.height < 185)) { - r = "muscle" + r; - } else if ((slave.lactation > 0) && (slave.boobs > 2000)) { - r = r + " cow"; - } else if ((slave.boobsImplant > 0) && (slave.buttImplant > 0)) { - r = r + " bimbo"; - } else if (slave.boobs > 6000) { - r = "boob " + r; - } else if (slave.butt > 6) { - r = "ass " + r; - } + if (slave.visualAge > 55) { + r = r + "GILF"; + } else if (slave.visualAge > 35) { + r = r + "MILF"; + } else if (slave.visualAge >= 25) { + r = r + "slave"; + } else { + r = r + "girl"; + } + if ((slave.muscles > 30) && (slave.height < 185)) { + r = "muscle" + r; + } else if ((slave.lactation > 0) && (slave.boobs > 2000)) { + r = r + " cow"; + } else if ((slave.boobsImplant > 0) && (slave.buttImplant > 0)) { + r = r + " bimbo"; + } else if (slave.boobs > 6000) { + r = "boob " + r; + } else if (slave.butt > 6) { + r = "ass " + r; + } } if ((slave.muscles > 30) && (slave.height > 185)) { @@ -1529,8 +1496,8 @@ window.DegradingName = /** @param {App.Entity.SlaveState} slave */ function Degr "be your Head Girl", "guard you", "recruit girls"]; - let names = []; - let suffixes = []; + const names = []; + const suffixes = []; if (slave.fuckdoll > 0) { slave.slaveName = "Fuckdoll No. " + slave.ID; @@ -1900,7 +1867,7 @@ window.DegradingName = /** @param {App.Entity.SlaveState} slave */ function Degr break; } } - let surname = jsEither(suffixes); + const surname = jsEither(suffixes); if (typeof surname === "string" && surname.toLowerCase() === slave.slaveName.toLowerCase()) { DegradingName(slave); } @@ -1912,48 +1879,48 @@ window.SlaveSort = /** @param {App.Entity.SlaveState[]} slaves */ function Slave const V = State.variables; if (main) { switch (V.sortSlavesBy) { - case "name": - if (V.sortSlavesOrder === "ascending") - slaves = slaves.sort((a, b) => a.slaveName < b.slaveName ? -1 : 1); - else - slaves = slaves.sort((a, b) => a.slaveName > b.slaveName ? -1 : 1); - break; - case "assignment": - if (V.sortSlavesOrder === "ascending") - slaves = slaves.sort((a, b) => a.assignment < b.assignment ? -1 : 1); - else - slaves = slaves.sort((a, b) => a.assignment > b.assignment ? -1 : 1); - break; - case "seniority": - if (V.sortSlavesOrder === "ascending") - slaves = slaves.sort((a, b) => b.weekAcquired - a.weekAcquired); - else - slaves = slaves.sort((a, b) => a.weekAcquired - b.weekAcquired); - break; - case "actualAge": - if (V.sortSlavesOrder === "ascending") - slaves = slaves.sort((a, b) => a.actualAge - b.actualAge); - else - slaves = slaves.sort((a, b) => b.actualAge - a.actualAge); - break; - case "visualAge": - if (V.sortSlavesOrder === "ascending") - slaves = slaves.sort((a, b) => a.visualAge - b.visualAge); - else - slaves = slaves.sort((a, b) => b.visualAge - a.visualAge); - break; - case "physicalAge": - if (V.sortSlavesOrder === "physicalAge") - slaves = slaves.sort((a, b) => a.physicalAge - b.physicalAge); - else - slaves = slaves.sort((a, b) => b.physicalAge - a.physicalAge); - break; - default: - if (V.sortSlavesOrder === "ascending") - slaves = slaves.sort((a, b) => a.devotion - b.devotion); - else - slaves = slaves.sort((a, b) => b.devotion - a.devotion); - break; + case "name": + if (V.sortSlavesOrder === "ascending") + slaves = slaves.sort((a, b) => a.slaveName < b.slaveName ? -1 : 1); + else + slaves = slaves.sort((a, b) => a.slaveName > b.slaveName ? -1 : 1); + break; + case "assignment": + if (V.sortSlavesOrder === "ascending") + slaves = slaves.sort((a, b) => a.assignment < b.assignment ? -1 : 1); + else + slaves = slaves.sort((a, b) => a.assignment > b.assignment ? -1 : 1); + break; + case "seniority": + if (V.sortSlavesOrder === "ascending") + slaves = slaves.sort((a, b) => b.weekAcquired - a.weekAcquired); + else + slaves = slaves.sort((a, b) => a.weekAcquired - b.weekAcquired); + break; + case "actualAge": + if (V.sortSlavesOrder === "ascending") + slaves = slaves.sort((a, b) => a.actualAge - b.actualAge); + else + slaves = slaves.sort((a, b) => b.actualAge - a.actualAge); + break; + case "visualAge": + if (V.sortSlavesOrder === "ascending") + slaves = slaves.sort((a, b) => a.visualAge - b.visualAge); + else + slaves = slaves.sort((a, b) => b.visualAge - a.visualAge); + break; + case "physicalAge": + if (V.sortSlavesOrder === "physicalAge") + slaves = slaves.sort((a, b) => a.physicalAge - b.physicalAge); + else + slaves = slaves.sort((a, b) => b.physicalAge - a.physicalAge); + break; + default: + if (V.sortSlavesOrder === "ascending") + slaves = slaves.sort((a, b) => a.devotion - b.devotion); + else + slaves = slaves.sort((a, b) => b.devotion - a.devotion); + break; } V.slaveIndices = slaves2indices(); } else { @@ -1967,7 +1934,7 @@ window.slaveSortMinor = /** @param {App.Entity.SlaveState[]} slaves */ function slaves = slaves.sort((a, b) => a.slaveName < b.slaveName ? -1 : 1); }; -window.MenialPopCap = function MenialPopCap () { +window.MenialPopCap = function MenialPopCap() { const V = State.variables; let popCap = 500; let r = ""; @@ -1979,7 +1946,7 @@ window.MenialPopCap = function MenialPopCap () { } let overMenialCap = V.menials + V.fuckdolls + V.menialBioreactors - popCap; if (overMenialCap > 0) { - let price = menialSlaveCost(-overMenialCap); + const price = menialSlaveCost(-overMenialCap); if (V.menials > 0) { if (V.menials > overMenialCap) { cashX((overMenialCap * price), "menialTrades"); @@ -2038,7 +2005,7 @@ window.faceIncrease = /** @param {App.Entity.SlaveState} slave */ function faceI r += `<span class="green">${His} face is now quite beautiful,</span> rather than merely pretty.`; else if (slave.face <= 95 && slave.face + amount > 95) r += `<span class="green">${His} face is now perfect.</span> It's difficult to imagine how it could be any more beautiful.`; - slave.face = Math.clamp(slave.face + amount,-100,100); + slave.face = Math.clamp(slave.face + amount, -100, 100); if (slave.face > 95) slave.face = 100; return r; }; diff --git a/src/js/datatypeCleanupJS.js b/src/js/datatypeCleanupJS.js index 923ec88aa2a87acdc08af7d20bd44502975c4f77..705ea207c1e561d7b972a417c15f625ee63ac2cf 100644 --- a/src/js/datatypeCleanupJS.js +++ b/src/js/datatypeCleanupJS.js @@ -404,6 +404,9 @@ window.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() { if (typeof slave.vaginalAccessory !== "string") { slave.vaginalAccessory = "none"; } + if (typeof slave.vaginalAttachment !== "string") { + slave.vaginalAttachments = "none"; + } if (typeof slave.dickAccessory !== "string") { slave.dickAccessory = "none"; } @@ -979,6 +982,9 @@ window.childCosmeticsDatatypeCleanup = function childCosmeticsDatatypeCleanup(ch if (typeof child.vaginalAccessory !== "string") { child.vaginalAccessory = "none"; } + if (typeof child.vaginalAttachment !== "string") { + child.vaginalAttachments = "none"; + } if (typeof child.dickAccessory !== "string") { child.dickAccessory = "none"; } @@ -1400,21 +1406,6 @@ window.ArcologyDatatypeCleanup = function ArcologyDatatypeCleanup() { V.TFS.schoolProsperity = Math.clamp(+V.TFS.schoolProsperity, -10, 10) || 0; }; -function FacilityDecorationCleanup() { - ValidateFacilityDecoration("brothelDecoration"); - ValidateFacilityDecoration("dairyDecoration"); - ValidateFacilityDecoration("clubDecoration"); - ValidateFacilityDecoration("servantsQuartersDecoration"); - ValidateFacilityDecoration("schoolroomDecoration"); - ValidateFacilityDecoration("spaDecoration"); - ValidateFacilityDecoration("clinicDecoration"); - ValidateFacilityDecoration("arcadeDecoration"); - ValidateFacilityDecoration("cellblockDecoration"); - ValidateFacilityDecoration("masterSuiteDecoration"); - ValidateFacilityDecoration("nurseryDecoration"); - ValidateFacilityDecoration("farmyardDecoration"); -}; - window.FacilityDatatypeCleanup = (function() { "use strict"; let V; diff --git a/src/js/economyJS.js b/src/js/economyJS.js index 7b441043d74772a5d0fd6ffb5c66387956818da4..b8efa6520e9d7fb20d546cff37509d6b79f72bca 100644 --- a/src/js/economyJS.js +++ b/src/js/economyJS.js @@ -6,13 +6,13 @@ window.Job = Object.freeze({ JAIL: 'be confined in the cellblock', WARDEN: 'be the Wardeness', CLINIC: 'get treatment in the clinic', NURSE: 'be the Nurse', HGTOY: 'live with your Head Girl', SCHOOL: 'learn in the schoolroom', TEACHER: 'be the Schoolteacher', SPA: 'rest in the spa', ATTEND: 'be the Attendant', NANNY: 'work as a nanny', MATRON: 'be the Matron', FARMYARD: 'work as a farmhand', FARMER: 'be the Farmer', REST: 'rest' - }); +}); window.PersonalAttention = Object.freeze({TRADE: 'trading', WAR: 'warfare', SLAVING: 'slaving', ENGINEERING: 'engineering', MEDICINE: 'medicine', MAID: 'upkeep', HACKING: 'hacking'}); window.predictCost = function(array) { var array2 = array; var totalCosts = ( - getBrothelCosts() + + getBrothelCosts() + getBrothelAdsCosts() + getArcadeCosts() + getClubCosts() + @@ -46,10 +46,10 @@ window.predictCost = function(array) { //in the old order these were applied after multiplication. Not sure if deliberate, but I'm leaving it for now. totalCosts += ( - getSFCosts() + + getSFCosts() + getWeatherCosts() ); -/* + /* // clean up if(totalCosts > 0) { totalCosts = 0; @@ -292,7 +292,7 @@ window.getSecurityExpansionCost = function() { return secExpCost; }; - //general arcology costs +//general arcology costs window.getLifestyleCosts = function() { var costs = 0; @@ -457,19 +457,19 @@ window.getCyberModCosts = function() { window.getPCTrainingCosts = function() { var costs = 0; if(State.variables.PC.actualAge >= State.variables.IsInPrimePC && State.variables.PC.actualAge < State.variables.IsPastPrimePC) { - if(State.variables.personalAttention === PersonalAttention.TRADE) { - costs += 10000*State.variables.AgeEffectOnTrainerPricingPC; - } else if(State.variables.personalAttention === PersonalAttention.WAR) { - costs += 10000*State.variables.AgeEffectOnTrainerPricingPC; - } else if(State.variables.personalAttention === PersonalAttention.SLAVING) { - costs += 10000*State.variables.AgeEffectOnTrainerPricingPC; - } else if(State.variables.personalAttention === PersonalAttention.ENGINEERING) { - costs += 10000*State.variables.AgeEffectOnTrainerPricingPC; - } else if(State.variables.personalAttention === PersonalAttention.MEDICINE) { - costs += 10000*State.variables.AgeEffectOnTrainerPricingPC; - } else if(State.variables.personalAttention === PersonalAttention.HACKING) { - costs += 10000*State.variables.AgeEffectOnTrainerPricingPC; - } + if(State.variables.personalAttention === PersonalAttention.TRADE) { + costs += 10000*State.variables.AgeEffectOnTrainerPricingPC; + } else if(State.variables.personalAttention === PersonalAttention.WAR) { + costs += 10000*State.variables.AgeEffectOnTrainerPricingPC; + } else if(State.variables.personalAttention === PersonalAttention.SLAVING) { + costs += 10000*State.variables.AgeEffectOnTrainerPricingPC; + } else if(State.variables.personalAttention === PersonalAttention.ENGINEERING) { + costs += 10000*State.variables.AgeEffectOnTrainerPricingPC; + } else if(State.variables.personalAttention === PersonalAttention.MEDICINE) { + costs += 10000*State.variables.AgeEffectOnTrainerPricingPC; + } else if(State.variables.personalAttention === PersonalAttention.HACKING) { + costs += 10000*State.variables.AgeEffectOnTrainerPricingPC; + } } return costs; }; @@ -541,43 +541,43 @@ window.getSlaveMinorCosts = function(slave) { var costs = 0; var rulesCost = State.variables.rulesCost; if(slave.assignment === Job.SERVANT || slave.assignment === Job.SERVER) { - if(slave.trust < -20) { - costs -= rulesCost * 4; - } else if(slave.devotion < -20) { - if (slave.trust >= 20) { - costs -= rulesCost / 2; + if(slave.trust < -20) { + costs -= rulesCost * 4; + } else if(slave.devotion < -20) { + if (slave.trust >= 20) { + costs -= rulesCost / 2; + } else { + costs -= rulesCost * 2; + } + } else if(slave.devotion <= 20) { + costs -= rulesCost * 3; + } else if(slave.devotion <= 50) { + costs -= rulesCost * 4; } else { - costs -= rulesCost * 2; + costs -= rulesCost * 5; + } + if(slave.fetish === 'submissive') { + costs -= rulesCost; + } else if(slave.fetish === 'dom') { + costs += rulesCost; + } + if(slave.relationship < -1) { + costs -= rulesCost; + } + if(slave.energy < 20) { + costs -= rulesCost; + } else if(slave.energy < 40) { + costs -= rulesCost / 2; + } + if(slave.lactation > 0) { + costs -= 25; + } + if(slave.assignment === Job.SERVANT) { + costs -= rulesCost; + } + if(setup.servantCareers.includes(slave.career) || slave.skillS >= State.variables.masteredXP) { + costs -= rulesCost; } - } else if(slave.devotion <= 20) { - costs -= rulesCost * 3; - } else if(slave.devotion <= 50) { - costs -= rulesCost * 4; - } else { - costs -= rulesCost * 5; - } - if(slave.fetish === 'submissive') { - costs -= rulesCost; - } else if(slave.fetish === 'dom') { - costs += rulesCost; - } - if(slave.relationship < -1) { - costs -= rulesCost; - } - if(slave.energy < 20) { - costs -= rulesCost; - } else if(slave.energy < 40) { - costs -= rulesCost / 2; - } - if(slave.lactation > 0) { - costs -= 25; - } - if(slave.assignment === Job.SERVANT) { - costs -= rulesCost; - } - if(setup.servantCareers.includes(slave.career) || slave.skillS >= State.variables.masteredXP) { - costs -= rulesCost; - } } return costs; }; @@ -592,80 +592,80 @@ window.getSlaveCost = function(s) { // Living expenses switch(s.assignment) { - case Job.ARCADE: - cost += rulesCost * 0.75; - break; - case Job.DAIRY: - if(State.variables.dairyRestraintsSetting >= 2) { + case Job.ARCADE: cost += rulesCost * 0.75; - } else if(s.livingRules === LivingRule.NORMAL) { - cost += rulesCost * 1.5; - } else if(State.variables.dairyDecoration === 'Degradationist') { - cost += rulesCost * 0.90; - } else { - cost += rulesCost; - } - break; - case Job.BROTHEL: - if(s.livingRules === LivingRule.NORMAL) { - cost += rulesCost * 1.5; - } else { - cost += rulesCost; - } - break; - case Job.SCHOOL: case Job.CLUB: - cost += rulesCost * 1.5; - break; - case Job.CLINIC: - if(s.livingRules === LivingRule.LUXURIOUS) { - cost += rulesCost * 2; - } else if(s.livingRules === LivingRule.NORMAL) { - cost += rulesCost * 1.5; - } else { - cost += rulesCost; - } - break; - case Job.SPA: case Job.NANNY: - if(s.livingRules === LivingRule.LUXURIOUS) { - cost += rulesCost * 1.75; - } else if(s.livingRules === LivingRule.NORMAL) { - cost += rulesCost * 1.5; - } else { - cost += rulesCost; - } - break; - case Job.SERVANT: - if(s.livingRules === LivingRule.NORMAL) { - cost += rulesCost * 1.5; - } else { - if(State.variables.servantsQuartersDecoration === 'Degradationist') { + break; + case Job.DAIRY: + if(State.variables.dairyRestraintsSetting >= 2) { + cost += rulesCost * 0.75; + } else if(s.livingRules === LivingRule.NORMAL) { + cost += rulesCost * 1.5; + } else if(State.variables.dairyDecoration === 'Degradationist') { cost += rulesCost * 0.90; } else { cost += rulesCost; } - } - break; - case Job.JAIL: - if(s.livingRules === LivingRule.NORMAL) { - cost += rulesCost * 1.25; - } else { - cost += rulesCost * 0.90; - } - break; - case Job.MADAM: case Job.DJ: case Job.NURSE: case Job.WARDEN: - case Job.ATTEND: case Job.STEWARD: case Job.MILKMAID: case Job.TEACHER: - case Job.MATRON: - cost += rulesCost * 2; - break; - default: - if(s.livingRules === LivingRule.LUXURIOUS) { - cost += rulesCost * (s.relationship >= 4 ? 3 : 4); - } else if(s.livingRules === LivingRule.NORMAL) { + break; + case Job.BROTHEL: + if(s.livingRules === LivingRule.NORMAL) { + cost += rulesCost * 1.5; + } else { + cost += rulesCost; + } + break; + case Job.SCHOOL: case Job.CLUB: + cost += rulesCost * 1.5; + break; + case Job.CLINIC: + if(s.livingRules === LivingRule.LUXURIOUS) { + cost += rulesCost * 2; + } else if(s.livingRules === LivingRule.NORMAL) { + cost += rulesCost * 1.5; + } else { + cost += rulesCost; + } + break; + case Job.SPA: case Job.NANNY: + if(s.livingRules === LivingRule.LUXURIOUS) { + cost += rulesCost * 1.75; + } else if(s.livingRules === LivingRule.NORMAL) { + cost += rulesCost * 1.5; + } else { + cost += rulesCost; + } + break; + case Job.SERVANT: + if(s.livingRules === LivingRule.NORMAL) { + cost += rulesCost * 1.5; + } else { + if(State.variables.servantsQuartersDecoration === 'Degradationist') { + cost += rulesCost * 0.90; + } else { + cost += rulesCost; + } + } + break; + case Job.JAIL: + if(s.livingRules === LivingRule.NORMAL) { + cost += rulesCost * 1.25; + } else { + cost += rulesCost * 0.90; + } + break; + case Job.MADAM: case Job.DJ: case Job.NURSE: case Job.WARDEN: + case Job.ATTEND: case Job.STEWARD: case Job.MILKMAID: case Job.TEACHER: + case Job.MATRON: cost += rulesCost * 2; - } else { - cost += rulesCost; - } - break; + break; + default: + if(s.livingRules === LivingRule.LUXURIOUS) { + cost += rulesCost * (s.relationship >= 4 ? 3 : 4); + } else if(s.livingRules === LivingRule.NORMAL) { + cost += rulesCost * 2; + } else { + cost += rulesCost; + } + break; } // Food @@ -792,62 +792,62 @@ window.getSlaveCost = function(s) { // Enemas if(s.inflation === 3) { switch(s.inflationType) { - case 'water': - cost += 100; - break; - case 'food': - cost += (foodCost * 4); - break; - case 'curative': case 'aphrodisiac': case 'tightener': - cost += (100 + (drugsCost * 2)); - break; + case 'water': + cost += 100; + break; + case 'food': + cost += (foodCost * 4); + break; + case 'curative': case 'aphrodisiac': case 'tightener': + cost += (100 + (drugsCost * 2)); + break; } } else if(s.inflation === 2) { switch(s.inflationType) { - case 'water': - cost += 50; - break; - case 'food': - cost += (foodCost * 2); - break; - case 'curative': case 'aphrodisiac': case 'tightener': - cost += (50 + (drugsCost * 2)); - break; + case 'water': + cost += 50; + break; + case 'food': + cost += (foodCost * 2); + break; + case 'curative': case 'aphrodisiac': case 'tightener': + cost += (50 + (drugsCost * 2)); + break; } } else if(s.inflation === 1) { switch(s.inflationType) { - case 'water': - cost += 25; - break; - case 'food': - cost += (foodCost); - break; - case 'curative': case 'aphrodisiac': case 'tightener': - cost += (25 + (drugsCost * 2)); - break; + case 'water': + cost += 25; + break; + case 'food': + cost += (foodCost); + break; + case 'curative': case 'aphrodisiac': case 'tightener': + cost += (25 + (drugsCost * 2)); + break; } } // Drugs switch(s.drugs) { - case 'anti-aging cream': - cost += drugsCost * 10; - break; - case 'female hormone injections': case 'male hormone injections': case 'intensive breast injections': - case 'intensive butt injections': case 'intensive penis enhancement': case 'intensive testicle enhancement': - case 'intensive lip injections': case 'hyper breast injections': case 'hyper butt injections': - case 'hyper penis enhancement': case 'hyper testicle enhancement': case 'hyper lip injections': - case 'growth stimulants': - cost += drugsCost * 5; - break; - case 'sag-B-gone': - cost += Math.trunc(drugsCost * 0.1); - break; - case 'no drugs': case 'none': - break; - default: - cost += drugsCost * 2; - break; + case 'anti-aging cream': + cost += drugsCost * 10; + break; + case 'female hormone injections': case 'male hormone injections': case 'intensive breast injections': + case 'intensive butt injections': case 'intensive penis enhancement': case 'intensive testicle enhancement': + case 'intensive lip injections': case 'hyper breast injections': case 'hyper butt injections': + case 'hyper penis enhancement': case 'hyper testicle enhancement': case 'hyper lip injections': + case 'growth stimulants': + cost += drugsCost * 5; + break; + case 'sag-B-gone': + cost += Math.trunc(drugsCost * 0.1); + break; + case 'no drugs': case 'none': + break; + default: + cost += drugsCost * 2; + break; } if(s.curatives > 0 && s.assignmentVisible === 1) { cost += drugsCost * s.curatives; @@ -1126,8 +1126,8 @@ window.cashX = function(cost, what, who) { //record the slave, if available if (typeof who !== 'undefined') { - who.lastWeeksCashIncome += cost; - who.lifetimeCashIncome += cost; + who.lastWeeksCashIncome += cost; + who.lifetimeCashIncome += cost; } } diff --git a/src/js/futureSocietyJS.js b/src/js/futureSocietyJS.js new file mode 100644 index 0000000000000000000000000000000000000000..2453c30d7f1e181150ead99c9458aba9fb97ad24 --- /dev/null +++ b/src/js/futureSocietyJS.js @@ -0,0 +1,510 @@ +window.FutureSocieties = (function() { + return { + remove: removeFS, + resetCredits: resetFSCredits + }; + + // call as FutureSocieties.remove(FS) + // FS must be a string (e.g. "FSPaternalist" or "FSDegradationist"). + function removeFS(FS) { + const V = State.variables; + const arcology = V.arcologies[0]; + const FSDecoration = FS + "Decoration"; + const FSSMR = FS + "SMR"; + let FSLaw = FS + "Law"; + if (arcology[FS] === undefined) { + console.log(`ERROR: bad FS reference, $arcologies[0].${FS} not defined`); + return; + } + + if (FS === "FSSupremacist" || FS === "FSSubjugationist") + FSLaw += "ME"; + if (FS !== "FSNull") + arcology[FSDecoration] = 20; + arcology[FS] = "unset"; + switch (FS) { + case "FSPaternalist": + arcology[FSLaw] = 0; + arcology[FSSMR] = 0; + V.slaveWatch = 0; + break; + case "FSDegradationist": + arcology[FSLaw] = 0; + arcology[FSSMR] = 0; + V.liveTargets = 0; + break; + case "FSGenderRadicalist": + arcology.FSGenderRadicalistLawBeauty = 0; + arcology.FSGenderRadicalistLawFuta = 0; + break; + case "FSGenderFundamentalist": + arcology.FSGenderFundamentalistLawBeauty = 0; + arcology.FSGenderFundamentalistLawBimbo = 0; + arcology.FSGenderFundamentalistSMR = 0; + break; + case "FSTransformationFetishist": + case "FSAssetExpansionist": + arcology[FSSMR] = 0; + break; + case "FSPhysicalIdealist": + arcology.FSPhysicalIdealistLaw = 0; + arcology.FSPhysicalIdealistSMR = 0; + arcology.FSPhysicalIdealistStrongFat = 0; + V.martialSchool = 0; + break; + case "FSHedonisticDecadence": + arcology.FSHedonisticDecadenceLaw = 0; + arcology.FSHedonisticDecadenceLaw2 = 0; + arcology.FSHedonisticDecadenceSMR = 0; + arcology.FSHedonisticDecadenceStrongFat = 0; + break; + case "FSChattelReligionist": + arcology.FSChattelReligionistLaw = 0; + arcology.FSChattelReligionistSMR = 0; + arcology.FSChattelReligionistCreed = 0; + V.subsidyChurch = 0; + break; + case "FSRepopulationFocus": + arcology[FSLaw] = 0; + arcology[FSSMR] = 0; + V.universalRulesChildrenBecomeBreeders = 0; + break; + case "FSRestart": + arcology[FSLaw] = 0; + arcology[FSSMR] = 0; + V.eliteOfficers = 0; + V.propOutcome = 0; + V.failedElite = 0; + break; + case "FSNull": + break; + default: // all others have one law and one SMR + arcology[FSLaw] = 0; + arcology[FSSMR] = 0; + break; + } + + FacilityDecorationCleanup(); + resetFSCredits(); + } + + function resetFSCredits() { + const V = State.variables; + let activeFS = 0; + for (let i = 0; i < setup.FutureSocieties.length; i++) { + if (V.arcologies[0][setup.FutureSocieties[i]] > 0) { + activeFS++; + } + } + if (V.arcologies[0].FSNull > 0) { // possibly recalculate for multiculturalism + activeFS--; + if (V.FSCreditCount === 4) + activeFS += V.arcologies[0].FSNull/25; + else if (V.FSCreditCount === 6) + activeFS += V.arcologies[0].FSNull/17; + else if (V.FSCreditCount === 7) + activeFS += V.arcologies[0].FSNull/15; + else + activeFS += V.arcologies[0].FSNull/20; + } + V.FSCredits = Math.max(Math.trunc(V.FSGotRepCredits - activeFS), 0); + } +})(); + +window.FacilityDecorationCleanup = function FacilityDecorationCleanup() { + ValidateFacilityDecoration("brothelDecoration"); + ValidateFacilityDecoration("dairyDecoration"); + ValidateFacilityDecoration("clubDecoration"); + ValidateFacilityDecoration("servantsQuartersDecoration"); + ValidateFacilityDecoration("schoolroomDecoration"); + ValidateFacilityDecoration("spaDecoration"); + ValidateFacilityDecoration("clinicDecoration"); + ValidateFacilityDecoration("arcadeDecoration"); + ValidateFacilityDecoration("cellblockDecoration"); + ValidateFacilityDecoration("masterSuiteDecoration"); + ValidateFacilityDecoration("nurseryDecoration"); + ValidateFacilityDecoration("farmyardDecoration"); +}; + +/* decoration should be passed as "facilityDecoration" in quotes. For example, ValidateFacilityDecoration("brothelDecoration"). The quotes are important, do not pass it as a story variable. */ +window.ValidateFacilityDecoration = function ValidateFacilityDecoration(decoration) { + const V = State.variables; + switch (V[decoration]) { + case 'standard': + /* nothing to do */ + break; + case 'Supremacist': + if (!Number.isFinite(V.arcologies[0].FSSupremacist)) { + V[decoration] = 'standard'; + } + break; + case 'Subjugationist': + if (!Number.isFinite(V.arcologies[0].FSSubjugationist)) { + V[decoration] = 'standard'; + } + break; + case 'Gender Radicalist': + if (!Number.isFinite(V.arcologies[0].FSGenderRadicalist)) { + V[decoration] = 'standard'; + } + break; + case 'Gender Fundamentalist': + if (!Number.isFinite(V.arcologies[0].FSGenderFundamentalist)) { + V[decoration] = 'standard'; + } + break; + case 'Paternalist': + if (!Number.isFinite(V.arcologies[0].FSPaternalist)) { + V[decoration] = 'standard'; + } + break; + case 'Body Purist': + if (!Number.isFinite(V.arcologies[0].FSBodyPurist)) { + V[decoration] = 'standard'; + } + break; + case 'Transformation Fetishist': + if (!Number.isFinite(V.arcologies[0].FSTransformationFetishist)) { + V[decoration] = 'standard'; + } + break; + case 'Youth Preferentialist': + if (!Number.isFinite(V.arcologies[0].FSYouthPreferentialist)) { + V[decoration] = 'standard'; + } + break; + case 'Maturity Preferentialist': + if (!Number.isFinite(V.arcologies[0].FSMaturityPreferentialist)) { + V[decoration] = 'standard'; + } + break; + case 'Slimness Enthusiast': + if (!Number.isFinite(V.arcologies[0].FSSlimnessEnthusiast)) { + V[decoration] = 'standard'; + } + break; + case 'Asset Expansionist': + if (!Number.isFinite(V.arcologies[0].FSAssetExpansionist)) { + V[decoration] = 'standard'; + } + break; + case 'Pastoralist': + if (!Number.isFinite(V.arcologies[0].FSPastoralist)) { + V[decoration] = 'standard'; + } + break; + case 'Physical Idealist': + if (!Number.isFinite(V.arcologies[0].FSPhysicalIdealist)) { + V[decoration] = 'standard'; + } + break; + case 'Chattel Religionist': + if (!Number.isFinite(V.arcologies[0].FSChattelReligionist)) { + V[decoration] = 'standard'; + } + break; + case 'Degradationist': + if (!Number.isFinite(V.arcologies[0].FSDegradationist)) { + V[decoration] = 'standard'; + } + break; + case 'Roman Revivalist': + if (!Number.isFinite(V.arcologies[0].FSRomanRevivalist)) { + V[decoration] = 'standard'; + } + break; + case 'Egyptian Revivalist': + if (!Number.isFinite(V.arcologies[0].FSEgyptianRevivalist)) { + V[decoration] = 'standard'; + } + break; + case 'Edo Revivalist': + if (!Number.isFinite(V.arcologies[0].FSEdoRevivalist)) { + V[decoration] = 'standard'; + } + break; + case 'Arabian Revivalist': + if (!Number.isFinite(V.arcologies[0].FSArabianRevivalist)) { + V[decoration] = 'standard'; + } + break; + case 'Chinese Revivalist': + if (!Number.isFinite(V.arcologies[0].FSChineseRevivalist)) { + V[decoration] = 'standard'; + } + break; + case 'Repopulation Focus': + if (!Number.isFinite(V.arcologies[0].FSRepopulationFocus)) { + V[decoration] = 'standard'; + } + break; + case 'Eugenics': + if (!Number.isFinite(V.arcologies[0].FSRestart)) { + V[decoration] = 'standard'; + } + break; + case 'Hedonistic': + if (!Number.isFinite(V.arcologies[0].FSHedonisticDecadence)) { + V[decoration] = 'standard'; + } + break; + default: + V[decoration] = 'standard'; + } +}; + +window.FSChange = function FSChange(FS, magnitude, bonusMultiplier) { + 'use strict'; + const V = State.variables; + let errorMessage = ''; + + switch (FS) { + case 'Supremacist': + if (Number.isFinite(V.arcologies[0].FSSupremacist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSSupremacist / V.FSLockinLevel) / 3, 'futureSocieties'); // Reducing the reputation impact of slaves that are not adhering to societal ideals properly + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSSupremacist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSSupremacist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'Subjugationist': + if (Number.isFinite(V.arcologies[0].FSSubjugationist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSSubjugationist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSSubjugationist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSSubjugationist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'GenderRadicalist': + if (Number.isFinite(V.arcologies[0].FSGenderRadicalist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSGenderRadicalist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSGenderRadicalist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSGenderRadicalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'GenderFundamentalist': + if (Number.isFinite(V.arcologies[0].FSGenderFundamentalist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSGenderFundamentalist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSGenderFundamentalist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSGenderFundamentalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'Paternalist': + if (Number.isFinite(V.arcologies[0].FSPaternalist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSPaternalist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSPaternalist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSPaternalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'Degradationist': + if (Number.isFinite(V.arcologies[0].FSDegradationist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSDegradationist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSDegradationist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSDegradationist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'AssetExpansionist': + if (Number.isFinite(V.arcologies[0].FSAssetExpansionist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSAssetExpansionist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSAssetExpansionist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSAssetExpansionist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'SlimnessEnthusiast': + if (Number.isFinite(V.arcologies[0].FSSlimnessEnthusiast)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSSlimnessEnthusiast / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSSlimnessEnthusiast / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSSlimnessEnthusiast += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'TransformationFetishist': + if (Number.isFinite(V.arcologies[0].FSTransformationFetishist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSTransformationFetishist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSTransformationFetishist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSTransformationFetishist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'BodyPurist': + if (Number.isFinite(V.arcologies[0].FSBodyPurist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSBodyPurist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSBodyPurist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSBodyPurist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'MaturityPreferentialist': + if (Number.isFinite(V.arcologies[0].FSMaturityPreferentialist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSMaturityPreferentialist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSMaturityPreferentialist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSMaturityPreferentialist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'YouthPreferentialist': + if (Number.isFinite(V.arcologies[0].FSYouthPreferentialist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSYouthPreferentialist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSYouthPreferentialist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSYouthPreferentialist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'Pastoralist': + if (Number.isFinite(V.arcologies[0].FSPastoralist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSPastoralist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSPastoralist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSPastoralist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'PhysicalIdealist': + if (Number.isFinite(V.arcologies[0].FSPhysicalIdealist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSPhysicalIdealist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSPhysicalIdealist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSPhysicalIdealist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'ChattelReligionist': + if (Number.isFinite(V.arcologies[0].FSChattelReligionist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSChattelReligionist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSChattelReligionist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSChattelReligionist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'RomanRevivalist': + if (Number.isFinite(V.arcologies[0].FSRomanRevivalist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSRomanRevivalist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSRomanRevivalist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSRomanRevivalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'AztecRevivalist': + if (Number.isFinite(V.activeArcology.FSAztecRevivalist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSAztecRevivalist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSAztecRevivalist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSAztecRevivalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'EgyptianRevivalist': + if (Number.isFinite(V.arcologies[0].FSEgyptianRevivalist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSEgyptianRevivalist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSEgyptianRevivalist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSEgyptianRevivalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'EdoRevivalist': + if (Number.isFinite(V.arcologies[0].FSEdoRevivalist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSEdoRevivalist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSEdoRevivalist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSEdoRevivalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'ArabianRevivalist': + if (Number.isFinite(V.arcologies[0].FSArabianRevivalist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSArabianRevivalist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSArabianRevivalist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSArabianRevivalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'ChineseRevivalist': + if (Number.isFinite(V.arcologies[0].FSChineseRevivalist)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSChineseRevivalist / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSChineseRevivalist / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSChineseRevivalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'Repopulationist': + if (Number.isFinite(V.arcologies[0].FSRepopulationFocus)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSRepopulationFocus / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSRepopulationFocus / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSRepopulationFocus += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'Eugenics': + if (Number.isFinite(V.arcologies[0].FSRestart)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSRestart / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSRestart / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSRestart += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + case 'Hedonism': + if (Number.isFinite(V.arcologies[0].FSHedonisticDecadence)) { + if (magnitude < 0) { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSHedonisticDecadence / V.FSLockinLevel) / 3, 'futureSocieties'); + } else { + repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSHedonisticDecadence / V.FSLockinLevel), 'futureSocieties'); + } + V.arcologies[0].FSHedonisticDecadence += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); + } + break; + default: + errorMessage += '<span class=\'red\'>ERROR: bad FS reference</span>'; + } + return errorMessage; +}; + +window.FSChangePorn = function FSChangePorn(FS, magnitude) { + return FSChange(FS, magnitude, State.variables.pornFameBonus); +}; diff --git a/src/js/itemAvailability.js b/src/js/itemAvailability.js index 4f06d45d4718beb412310765b99b1bd500b888d7..eeac0fb007d7a35cf66753a39943814cfb1eb814 100644 --- a/src/js/itemAvailability.js +++ b/src/js/itemAvailability.js @@ -134,10 +134,13 @@ window.isItemAccessible = function(string) { case 'a large empathy belly': case 'a huge empathy belly': return (V.arcologies[0].FSRepopulationFocus > 0 || V.clothesBoughtBelly === 1); + case 'bullet vibrator': // Not technically a dildo, but $toyBoughtVaginalAccessories doesn't exist case 'long dildo': case 'long, large dildo': case 'long, huge dildo': return (V.toysBoughtDildos === 1); + case 'vibrator': + return (V.toysBoughtVaginalAttachments === 1); case 'long plug': case 'long, large plug': case 'long, huge plug': diff --git a/src/js/optionsMacro.js b/src/js/optionsMacro.js new file mode 100644 index 0000000000000000000000000000000000000000..c11b469439662c33a0912c7241349dc5f25784c4 --- /dev/null +++ b/src/js/optionsMacro.js @@ -0,0 +1,91 @@ +/* Use like: + <<options $varname "New Passage (defaults to current passage)">> + A title + <<option "value_to_set_varname_to" "English text to show user" "additional variables to set when clicked" "Extra english text to show, but not as a link">> + Text to show if $varname matches this option + <<option ....>> + <<comment>> + Some comment to add at the end + <</option>> + */ +Macro.add('options', { + skipArgs : false, + tags : ['option', 'comment'], + handler : function () { + try { + var currentOption = this.payload[0].args[0]; + var variable = null; + var title = this.payload[0].contents || ''; + var passageName = this.payload[0].args[1] || passage(); + var found = false; + var comment = null; + var hasMultipleOptionsWithSameValue = false; + var description = ""; + + /* Check if we have a first argument - if we do, it should be a + variable like $foo + */ + if (this.payload[0].args.full && + this.payload[0].args.full != '""' && this.payload[0].args.full != "''") { + if (currentOption === undefined) + currentOption = false; + if (this.payload[0].args.full.startsWith("State.temporary.")) { + variable = "_" + this.payload[0].args.full.split(' ',1)[0].substring("State.temporary.".length); + } else if (this.payload[0].args.full.startsWith("State.variables.")) { + variable = "$" + this.payload[0].args.full.split(' ',1)[0].substring("State.variables.".length); + } else { + console.log(this.payload[0].args.full); + throw new Error("First parameter to 'options' must be a variable"); + } + + /* First print out the string for the current value */ + for (var i = 1, len = this.payload.length; i < len; ++i) { + if (this.payload[i].name === 'option') { + if (this.payload[i].args[0] === currentOption) { + if (found) { + hasMultipleOptionsWithSameValue = true; + } + description = this.payload[i].contents; + found = true; + } + } else if (this.payload[i].name === 'comment') { + comment = this.payload[i].contents; + } else { + throw new Error("Only valid tag is 'option' inside 'options'") + } + } + } + + var showSelectedOption = true; //this.payload.length != 3 || !description; + + /* Now print out the list of options */ + var output = ""; + for (var i = 1, len = this.payload.length; i < len; ++i) { + if (this.payload[i].name === 'option') { + var args = this.payload[i].args; + if (args.length === 0) { + output += this.payload[i].contents.trim(); + } else { + var extraComment = args[3] ? (' ' + args[3]) : ''; + var className = "optionMacroOption " + (args[1].startsWith("Enable") ? "optionMacroEnable" : args[1].startsWith("Disable") ? "optionMacroDisable" : ""); + if (args[0] !== currentOption || hasMultipleOptionsWithSameValue) { + var onClickChange = args[2] ? (', ' + args[2]) : ''; + output += '<span class="' + className + '">[[' + args[1] + "|" + passageName + "][" + variable + " = " + JSON.stringify(args[0]) + onClickChange + "]]" + extraComment + "</span>"; + } else if (showSelectedOption) { + output +='<span class="optionMacroSelected ' + className + '">' + args[1] + extraComment + '</span>'; + } + } + } + } + jQuery(this.output).wiki( + '<span class="optionMacro">' + + '<span class="optionDescription">' + title + ' ' + description + "</span>" + + '<span class="optionValue">' + output + "</span>" + + (comment ? '<span class="optionComment">//' + comment + "//</span>" : '') + + '</span>'); + } + catch (ex) { + return this.error('bad options expression: ' + ex.message); + } + } +}); diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js index 311155c74e46521ef93fea701218a3568625ce9b..a3caa9529ccbe59fb7768c55025e2ba5768d6cb4 100644 --- a/src/js/rulesAssistantOptions.js +++ b/src/js/rulesAssistantOptions.js @@ -918,6 +918,7 @@ window.rulesAssistantOptions = (function() { this.appendChild(new VagAccVirginsList()); this.appendChild(new VagAccAVirginsList()); this.appendChild(new VagAccOtherList()); + this.appendChild(new VaginalAttachmentsList()); if (V.seeDicks !== 0 || V.makeDicks !== 0) { this.appendChild(new DickChastityList()); this.appendChild(new DickAccVirginsList()); @@ -1355,6 +1356,21 @@ window.rulesAssistantOptions = (function() { } } + class VaginalAttachmentsList extends List { /**TODO: this will need expanding */ + constructor() { + const accs = []; + setup.vaginalAttachments.forEach(acc => { + if (acc.fs === undefined && acc.rs === undefined) + accs.push([acc.name, acc.value]); + else if (acc.rs === "buyVaginalAttachments" && V.toysBoughtVaginalAttachments === 1) + accs.push([acc.name + " (Purchased)", acc.value]); + }); + super("Vaginal attachments for slaves with vaginal accessories", accs); + this.setValue(current_rule.set.vaginalAttachment); + this.onchange = (value) => current_rule.set.vaginalAttachment = value; + } + } + class DickChastityList extends List { constructor() { const items = [ diff --git a/src/js/slaveStatsChecker.js b/src/js/slaveStatsChecker.js index 87ba3f18033a475d023a16a3a2c1a762dba89bf6..e1cdfe727f2462491e57f8f9c57b5c04eedbf6ef 100644 --- a/src/js/slaveStatsChecker.js +++ b/src/js/slaveStatsChecker.js @@ -108,3 +108,328 @@ window.SlaveStatsChecker = (function() { return score; } }()); + +window.isStacked = /** @param {App.Entity.SlaveState} slave */ function(slave) { + return (slave.butt > 4) && (slave.boobs > 800); +}; + +window.isModded = /** @param {App.Entity.SlaveState} slave */ function(slave) { + const tatScore = SlaveStatsChecker.tatScore(slave); + const piercingScore = SlaveStatsChecker.piercingScore(slave); + const modScore = piercingScore+tatScore; + + return ((modScore > 15) || (piercingScore > 8 && tatScore > 5)); +}; + +window.isUnmodded = /** @param {App.Entity.SlaveState} slave */ function(slave) { + return (!isModded(slave) && (slave.corsetPiercing === 0) && (SlaveStatsChecker.piercingScore(slave) < 3) && (SlaveStatsChecker.tatScore(slave) < 2)); +}; + +window.isXY = /** @param {App.Entity.SlaveState} slave */ function(slave) { + return (slave.dick > 0); +}; + +window.isYoung = /** @param {App.Entity.SlaveState} slave */ function(slave) { + return (slave.visualAge < 30); +}; + +window.isPreg = /** @param {App.Entity.SlaveState} slave */ function(slave) { + return ((slave.bellyPreg >= 5000) || (slave.bellyImplant >= 5000)); +}; + +window.isNotPreg = /** @param {App.Entity.SlaveState} slave */ function(slave) { + return (!isPreg(slave) && (slave.belly < 100) && (slave.weight < 30) && !setup.fakeBellies.includes(slave.bellyAccessory)); +}; + +window.isPure = /** @param {App.Entity.SlaveState} slave */ function(slave) { + return ((slave.boobsImplant === 0) && (slave.buttImplant === 0) && (slave.waist >= -95) && (slave.lipsImplant === 0) && (slave.faceImplant < 30) && (slave.bellyImplant === -1) && (Math.abs(slave.shouldersImplant) < 2) && (Math.abs(slave.hipsImplant) < 2)); +}; + +window.isFullyPotent = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.dick > 0 && slave.balls > 0 && slave.ballType !== 'sterile' && slave.hormoneBalance < 100 && slave.drugs !== 'hormone blockers') { + return true; + } else { + return false; + } +}; + +window.canGetPregnant = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.preg === -1) { /* contraceptives check */ + return false; + } else if (!isFertile(slave)) { /* check other fertility factors */ + return false; + } else if ((slave.ovaries === 1) && (canDoVaginal(slave))) { + return true; + } else if ((slave.mpreg === 1) && (canDoAnal(slave))) { /* pregmod */ + return true; + } else { + return false; + } +}; + +/** contraceptives (.preg == -1) do not negate this function + * @param {App.Entity.SlaveState} slave */ +window.isFertile = function(slave) { + if (!slave) { + return null; + } + + if (slave.womb.length > 0 && slave.geneticQuirks.superfetation < 2) { /* currently pregnant without superfetation */ + return false; + } else if (slave.womb.length > 0) { /* temp failure condition to prevent current double preg bug */ + return false; + } else if (slave.broodmother > 0) { /* currently broodmother */ + return false; + } else if (slave.preg < -1) { /* sterile */ + return false; + } else if (slave.pregWeek < 0) { /* postpartum */ + return false; + } else if (slave.pubertyXX === 0) { /* pregmod start */ + return false; + } else if (slave.ovaryAge >= 47) { + return false; + } else if (slave.inflation > 2) { + return false; + } else if (slave.bellyImplant !== -1) { + return false; + } else if (slave.mpreg === 1) { + return true; /* pregmod end */ + } else if (slave.ovaries === 1) { + return true; + } else { + return false; + } +}; + +window.canAchieveErection = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.dick < 7 && slave.dick > 0 && slave.drugs !== 'hormone blockers' && (slave.balls > 0 ? slave.hormoneBalance < 100 : slave.hormoneBalance <= -100) && slave.ballType !== 'sterile') { + return true; + } else { + return false; + } +}; + +window.canPenetrate = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (!canAchieveErection(slave)) { + return false; + } else if (slave.chastityPenis === 1) { + return false; + } else if (slave.dick > 7) { + return false; + } + return true; +}; + +window.canSee = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.eyes > -2) { + return true; + } else { + return false; + } +}; + +window.canHear = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if ((slave.hears > -2) && (slave.earwear !== "deafening ear plugs")) { + return true; + } else { + return false; + } +}; + +window.canSmell = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.smells > -1) { + return true; + } else { + return false; + } +}; + +window.canTaste = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.tastes > -1) { + return true; + } else { + return false; + } +}; + +window.canWalk = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.amp === 1) { + return false; + } else if (tooFatSlave(slave)) { + return false; + } else if (tooBigBreasts(slave)) { + return false; + } else if (tooBigDick(slave)) { + return false; + } else if (tooBigBalls(slave)) { + return false; + } else if (tooBigButt(slave)) { + return false; + } else if (tooBigBelly(slave)) { + return false; + } else if (slave.heels === 0) { + return true; + } else if (slave.shoes === "heels") { + return true; + } else if (slave.shoes === "extreme heels") { + return true; + } else if (slave.shoes === "boots") { + return true; + } else { + return false; + } +}; + +window.canTalk = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.accent > 2) { + return false; + } else if (slave.voice === 0) { + return false; + } else if (slave.lips > 95) { + return false; + } else if (slave.collar === "dildo gag") { + return false; + } else if (slave.collar === "massive dildo gag") { + return false; + } else if (slave.collar === "ball gag") { + return false; + } else if (slave.collar === "bit gag") { + return false; + } else { + return true; + } +}; + +window.canDoAnal = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.chastityAnus === 1) { + return false; + } + return true; +}; + +window.canDoVaginal = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.vagina < 0) { + return false; + } else if (slave.chastityVagina === 1) { + return false; + } + return true; +}; + +window.tooFatSlave = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.weight > 190+(slave.muscles/5) && slave.physicalAge >= 18) { + return true; + } else if (slave.weight > 130+(slave.muscles/20) && slave.physicalAge <= 3) { + return true; + } else if (slave.weight > 160+(slave.muscles/15) && slave.physicalAge <= 12) { + return true; + } else if (slave.weight > 185+(slave.muscles/10) && slave.physicalAge < 18) { + return true; + } else { + return false; + } +}; + +window.tooBigBreasts = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.boobs > 30000+(slave.muscles*100) && slave.physicalAge >= 18) { + return true; + } else if (slave.boobs > 5000+(slave.muscles*10) && slave.physicalAge <= 3) { + return true; + } else if (slave.boobs > 10000+(slave.muscles*20) && slave.physicalAge <= 12) { + return true; + } else if (slave.boobs > 20000+(slave.muscles*50) && slave.physicalAge < 18) { + return true; + } else { + return false; + } +}; + +window.tooBigBelly = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.belly >= 450000+(slave.muscles*2000) && slave.physicalAge >= 18) { + return true; + } else if (slave.belly >= 350000+(slave.muscles*1000) && slave.physicalAge >= 13) { + return true; + } else if (slave.belly >= 30000+(slave.muscles*500) && slave.physicalAge <= 3) { + return true; + } else if (slave.belly >= 150000+(slave.muscles*800) && slave.physicalAge <= 12) { + return true; + } else { + return false; + } +}; + +window.tooBigBalls = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.balls >= 30+(slave.muscles*.3) && slave.physicalAge <= 3) { + return true; + } else if (slave.balls >= 60+(slave.muscles*.5) && slave.physicalAge <= 12) { + return true; + } else if (slave.balls >= 90+(slave.muscles*.7)) { + return true; + } else { + return false; + } +}; + +window.tooBigDick = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.dick >= 20+(slave.muscles*.1) && slave.physicalAge <= 3 && slave.dick !== 0) { + return true; + } else if (slave.dick >= 45+(slave.muscles*.3) && slave.physicalAge <= 12) { + return true; + } else if (slave.dick >= 68+(slave.muscles*.4)) { + return true; + } else { + return false; + } +}; + +window.tooBigButt = /** @param {App.Entity.SlaveState} slave */ function(slave) { + if (!slave) { + return null; + } else if (slave.butt > 10 && slave.physicalAge <= 3) { + return true; + } else if (slave.butt > 14 && slave.physicalAge <= 12) { + return true; + } else { + return false; + } +}; + +window.isVegetable = /** @param {App.Entity.SlaveState} slave */ function(slave) { + slave = slave || State.variables.activeSlave; + if(!slave) { return false; } + return (slave.fetish === 'mindbroken'); +}; diff --git a/src/js/slaveSummaryWidgets.js b/src/js/slaveSummaryWidgets.js index 2eb64c87236dfc98bc5d26aee4a5a736ed49e1c3..a9cc60634875e403f1d3bcb8dc83cc09527c6ec2 100644 --- a/src/js/slaveSummaryWidgets.js +++ b/src/js/slaveSummaryWidgets.js @@ -4622,27 +4622,40 @@ window.SlaveSummaryUncached = (function(){ /** @param {App.Entity.SlaveState} slave */ function long_vaginal_acc(slave) { - switch (slave.vaginalAccessory) { - case "dildo": - r += `Vaginal dildo.`; - break; - case "large dildo": - r += `Large vaginal dildo.`; - break; - case "huge dildo": - r += `Huge vaginal dildo.`; - break; - case "long dildo": - r += `Long vaginal dildo.`; - break; - case "long, large dildo": - r += `Long and large vaginal dildo.`; - break; - case "long, huge dildo": - r += `Long and wide vaginal dildo.`; - break; + if (slave.vaginalAttachment !== "vibrator") { + switch (slave.vaginalAccessory) { + case "bullet vibrator": + r += `Attached bullet vibrator.`; + break; + case "dildo": + r += `Vaginal dildo.`; + break; + case "large dildo": + r += `Large vaginal dildo.`; + break; + case "huge dildo": + r += `Huge vaginal dildo.`; + break; + case "long dildo": + r += `Long vaginal dildo.`; + break; + case "long, large dildo": + r += `Long and large vaginal dildo.`; + break; + case "long, huge dildo": + r += `Long and wide vaginal dildo.`; + break; + } } r += " "; + if (slave.vaginalAttachment !== "none") { + switch (slave.vaginalAttachment) { + case "vibrator": + r += `Vibrating dildo.`; + break; + } + r += " "; + } } /** @param {App.Entity.SlaveState} slave */ diff --git a/src/js/storyJS.js b/src/js/storyJS.js index 1d9a97fd8aa7fc8669e6a5ad71795452e355a843..70d61c5e630cdecb7fcb0a7a817c5784a35a1777 100644 --- a/src/js/storyJS.js +++ b/src/js/storyJS.js @@ -37,16 +37,6 @@ if (typeof interpolate === "undefined") { window.interpolate = interpolate; } -window.isFullyPotent = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.dick > 0 && slave.balls > 0 && slave.ballType !== 'sterile' && slave.hormoneBalance < 100 && slave.drugs !== 'hormone blockers') { - return true; - } else { - return false; - } -}; - window.removeFromArray = function(arr, val) { for (var i = 0; i < arr.length; i++) { if (val === arr[i]) @@ -67,22 +57,6 @@ window.filterInPlace = function(arr, callback, thisArg) { return arr; }; -window.canGetPregnant = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.preg === -1) { /* contraceptives check */ - return false; - } else if (!isFertile(slave)) { /* check other fertility factors */ - return false; - } else if ((slave.ovaries === 1) && (canDoVaginal(slave))) { - return true; - } else if ((slave.mpreg === 1) && (canDoAnal(slave))) { /* pregmod */ - return true; - } else { - return false; - } -}; - /** pregmod: are slave2's sperm compatible with slave1's eggs? * @param {App.Entity.SlaveState} slave1 * @param {App.Entity.SlaveState} slave2 @@ -141,40 +115,6 @@ window.canImpreg = function(slave1, slave2) { } }; -/** contraceptives (.preg == -1) do not negate this function - * @param {App.Entity.SlaveState} slave */ -window.isFertile = function(slave) { - if (!slave) { - return null; - } - - if (slave.womb.length > 0 && slave.geneticQuirks.superfetation < 2) { /* currently pregnant without superfetation */ - return false; - } else if (slave.womb.length > 0) { /* temp failure condition to prevent current double preg bug */ - return false; - } else if (slave.broodmother > 0) { /* currently broodmother */ - return false; - } else if (slave.preg < -1) { /* sterile */ - return false; - } else if (slave.pregWeek < 0) { /* postpartum */ - return false; - } else if (slave.pubertyXX === 0) { /* pregmod start */ - return false; - } else if (slave.ovaryAge >= 47) { - return false; - } else if (slave.inflation > 2) { - return false; - } else if (slave.bellyImplant !== -1) { - return false; - } else if (slave.mpreg === 1) { - return true; /* pregmod end */ - } else if (slave.ovaries === 1) { - return true; - } else { - return false; - } -}; - window.isPlayerFertile = function(PC) { if (!PC) { return null; @@ -189,229 +129,6 @@ window.isPlayerFertile = function(PC) { } }; -window.canAchieveErection = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.dick < 7 && slave.dick > 0 && slave.drugs !== 'hormone blockers' && (slave.balls > 0 ? slave.hormoneBalance < 100 : slave.hormoneBalance <= -100) && slave.ballType !== 'sterile') { - return true; - } else { - return false; - } -}; - -window.canPenetrate = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (!canAchieveErection(slave)) { - return false; - } else if (slave.chastityPenis === 1) { - return false; - } else if (slave.dick > 7) { - return false; - } - return true; -}; - -window.canSee = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.eyes > -2) { - return true; - } else { - return false; - } -}; - -window.canHear = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if ((slave.hears > -2) && (slave.earwear !== "deafening ear plugs")) { - return true; - } else { - return false; - } -}; - -window.canSmell = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.smells > -1) { - return true; - } else { - return false; - } -}; - -window.canTaste = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.tastes > -1) { - return true; - } else { - return false; - } -}; - -window.canWalk = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.amp === 1) { - return false; - } else if (tooFatSlave(slave)) { - return false; - } else if (tooBigBreasts(slave)) { - return false; - } else if (tooBigDick(slave)) { - return false; - } else if (tooBigBalls(slave)) { - return false; - } else if (tooBigButt(slave)) { - return false; - } else if (tooBigBelly(slave)) { - return false; - } else if (slave.heels === 0) { - return true; - } else if (slave.shoes === "heels") { - return true; - } else if (slave.shoes === "extreme heels") { - return true; - } else if (slave.shoes === "boots") { - return true; - } else { - return false; - } -}; - -window.canTalk = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.accent > 2) { - return false; - } else if (slave.voice === 0) { - return false; - } else if (slave.lips > 95) { - return false; - } else if (slave.collar === "dildo gag") { - return false; - } else if (slave.collar === "massive dildo gag") { - return false; - } else if (slave.collar === "ball gag") { - return false; - } else if (slave.collar === "bit gag") { - return false; - } else { - return true; - } -}; - -window.canDoAnal = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.chastityAnus === 1) { - return false; - } - return true; -}; - -window.canDoVaginal = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.vagina < 0) { - return false; - } else if (slave.chastityVagina === 1) { - return false; - } - return true; -}; - -window.tooFatSlave = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.weight > 190+(slave.muscles/5) && slave.physicalAge >= 18) { - return true; - } else if (slave.weight > 130+(slave.muscles/20) && slave.physicalAge <= 3) { - return true; - } else if (slave.weight > 160+(slave.muscles/15) && slave.physicalAge <= 12) { - return true; - } else if (slave.weight > 185+(slave.muscles/10) && slave.physicalAge < 18) { - return true; - } else { - return false; - } -}; - -window.tooBigBreasts = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.boobs > 30000+(slave.muscles*100) && slave.physicalAge >= 18) { - return true; - } else if (slave.boobs > 5000+(slave.muscles*10) && slave.physicalAge <= 3) { - return true; - } else if (slave.boobs > 10000+(slave.muscles*20) && slave.physicalAge <= 12) { - return true; - } else if (slave.boobs > 20000+(slave.muscles*50) && slave.physicalAge < 18) { - return true; - } else { - return false; - } -}; - -window.tooBigBelly = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.belly >= 450000+(slave.muscles*2000) && slave.physicalAge >= 18) { - return true; - } else if (slave.belly >= 350000+(slave.muscles*1000) && slave.physicalAge >= 13) { - return true; - } else if (slave.belly >= 30000+(slave.muscles*500) && slave.physicalAge <= 3) { - return true; - } else if (slave.belly >= 150000+(slave.muscles*800) && slave.physicalAge <= 12) { - return true; - } else { - return false; - } -}; - -window.tooBigBalls = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.balls >= 30+(slave.muscles*.3) && slave.physicalAge <= 3) { - return true; - } else if (slave.balls >= 60+(slave.muscles*.5) && slave.physicalAge <= 12) { - return true; - } else if (slave.balls >= 90+(slave.muscles*.7)) { - return true; - } else { - return false; - } -}; - -window.tooBigDick = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.dick >= 20+(slave.muscles*.1) && slave.physicalAge <= 3 && slave.dick !== 0) { - return true; - } else if (slave.dick >= 45+(slave.muscles*.3) && slave.physicalAge <= 12) { - return true; - } else if (slave.dick >= 68+(slave.muscles*.4)) { - return true; - } else { - return false; - } -}; - -window.tooBigButt = /** @param {App.Entity.SlaveState} slave */ function (slave) { - if (!slave) { - return null; - } else if (slave.butt > 10 && slave.physicalAge <= 3) { - return true; - } else if (slave.butt > 14 && slave.physicalAge <= 12) { - return true; - } else { - return false; - } -}; - window.relationTargetWord = /** @param {App.Entity.SlaveState} slave */ function (slave) { if (!slave) { return null; @@ -602,12 +319,6 @@ window.lispReplace = function (text) { return text; }; -window.isVegetable = /** @param {App.Entity.SlaveState} slave */ function (slave) { - slave = slave || State.variables.activeSlave; - if(!slave) { return false; } - return (slave.fetish === 'mindbroken'); -}; - window.repGainSacrifice = /** @param {App.Entity.SlaveState} slave */ function (slave, arcology) { slave = slave || State.variables.activeSlave; arcology = arcology || State.variables.arcologies[0]; @@ -808,109 +519,6 @@ window.SoftenSexualFlaw = /** @param {App.Entity.SlaveState} slave */ function S slave.sexualFlaw = "none"; }; -window.removeFS = function(FS) { - const V = State.variables; - const arcology = V.arcologies[0]; - let FSDecoration = FS + "Decoration"; - let FSSMR = FS + "SMR"; - let FSLaw = FS + "Law"; - if (FS === "FSSupremacist" || FS === "FSSubjugationist") { - FSLaw += "ME"; - } - switch (FS) { - case "FSPaternalist": - arcology[FSLaw] = 0; - arcology[FSSMR] = 0; - V.slaveWatch = 0; - break; - case "FSDegradationist": - arcology[FSLaw] = 0; - arcology[FSSMR] = 0; - V.liveTargets = 0; - break; - case "FSGenderRadicalist": - arcology.FSGenderRadicalistLawBeauty = 0; - arcology.FSGenderRadicalistLawFuta = 0; - break; - case "FSGenderFundamentalist": - arcology.FSGenderFundamentalistLawBeauty = 0; - arcology.FSGenderFundamentalistLawBimbo = 0; - arcology.FSGenderFundamentalistSMR = 0; - break; - case "FSTransformationFetishist": - case "FSAssetExpansionist": - arcology[FSSMR] = 0; - break; - case "FSPhysicalIdealist": - arcology.FSPhysicalIdealistLaw = 0; - arcology.FSPhysicalIdealistSMR = 0; - arcology.FSPhysicalIdealistStrongFat = 0; - V.martialSchool = 0; - break; - case "FSHedonisticDecadence": - arcology.FSHedonisticDecadenceLaw = 0; - arcology.FSHedonisticDecadenceLaw2 = 0; - arcology.FSHedonisticDecadenceSMR = 0; - arcology.FSHedonisticDecadenceStrongFat = 0; - break; - case "FSChattelReligionist": - arcology.FSChattelReligionistLaw = 0; - arcology.FSChattelReligionistSMR = 0; - arcology.FSChattelReligionistCreed = 0; - V.subsidyChurch = 0; - break; - case "FSRepopulationFocus": - arcology[FSLaw] = 0; - arcology[FSSMR] = 0; - V.universalRulesChildrenBecomeBreeders = 0; - break; - case "FSRestart": - arcology[FSLaw] = 0; - arcology[FSSMR] = 0; - V.eliteOfficers = 0; - break; - case "FSNull": - break; - default: /* all others have one law and one SMR */ - arcology[FSLaw] = 0; - arcology[FSSMR] = 0; - break; - } - if (FS !== "FSNull") { - arcology[FSDecoration] = 20; - if (FS === "FSRestart") { - V.propOutcome = 0; - V.failedElite = 0; - } - } - arcology[FS] = "unset"; - FacilityDecorationCleanup(); - resetFSCredits(); -}; - -window.resetFSCredits = function() { - const V = State.variables; - let activeFS = 0; - for (let i = 0; i < setup.FutureSocieties.length; i++) { - if (V.arcologies[0][setup.FutureSocieties[i]] > 0) { - activeFS++; - } - } - if (V.arcologies[0].FSNull > 0) { /* possibly recalculate for multiculturalism */ - activeFS--; - if (V.FSCreditCount === 4) { - activeFS += V.arcologies[0].FSNull/25; - } else if (V.FSCreditCount === 6) { - activeFS += V.arcologies[0].FSNull/17; - } else if (V.FSCreditCount === 7) { - activeFS += V.arcologies[0].FSNull/15; - } else { - activeFS += V.arcologies[0].FSNull/20; - } - } - V.FSCredits = Math.max(Math.trunc(V.FSGotRepCredits - activeFS), 0); -}; - window.generatePlayerPronouns = function(PC) { if (PC.title === 0) { PC.pronoun = "she"; @@ -977,3 +585,84 @@ window.generateAssistantPronouns = function() { V.marketAssistantPronouns.noun = "girl"; } }; + +window.printTrinkets = function printTrinkets() { + function trinketPluralReplacer(desc) { + switch (desc) { + /* not supported + best in show ribbons + napkins + saPorn trinkets + wedding photos + */ + // should never have plurals + case "a collection of diplomas from expensive schools": + case "a framed low denomination piece of paper money from your native country": + case "a battered old assault rifle": + case "a framed picture of a slave with her sale price scrawled across the bottom": + case "an artist's impression of an early arcology design": + case "a framed copy of the first news story featuring yourself": + case "a miniature model of your first arcology": + case "a copy of the first porno you starred in": + case "a framed picture of your late Master": + case "your favorite handgun, whose sight has instilled fear in many": + case "a news clipping of your first successful live hack": + case "a damaged plate carrier bearing Daughters of Liberty insignia": + case "a Daughters of Liberty flag that once hung in their forward command post within your arcology": + case "a Daughters of Liberty brassard": + case "a shot-torn flag of the failed nation whose militants attacked the Free City": + return desc; + // manual replacement + case "a thank-you note from a MILF tourist whom you made feel welcome in the arcology": + return "several thank-you notes from MILF tourists whom you made feel welcome in the arcology"; + // replacement by groups + default: + let r = desc; + if (desc.endsWith("citizen")) { // will not reduce spam from different future societies + r = r.replace("message", "messages"); + r = r.replace("from a", "from"); + r = r.replace("a ", "several "); + r = r.replace("citizen", "citizens"); + r = r.replace("number", "numbers"); + r = r.replace("test", "tests"); + } else if (desc.endsWith("acquaintance")) { + r = r.replace("note", "notes"); + r = r.replace("from a", "from"); + r = r.replace("a ", "several "); + r = r.replace("owner", "owners"); + } + return r; + } + } + + if (State.variables.trinkets.length === 0) + return ''; + + const trinkets = weightedArray2HashMap(State.variables.trinkets); + let trinketString = []; + let plurals = false; + + for (let trinketDesc in trinkets) { + if (trinkets[trinketDesc] === 1) { + trinketString.push(trinketDesc); + } else if (trinkets[trinketDesc] > 1) { + trinketString.push(trinketPluralReplacer(trinketDesc)); + plurals = true; + } + } + + // depending on length of trinketString, add necessary conjunctions + if (trinketString.length === 1) { + if (plurals === false) { + trinketString = `a single item: ${trinketString[0]}`; + } else { + trinketString = trinketString[0]; + } + } else if (trinketString.length === 2 && plurals === false) { + trinketString = `a couple of items: ${trinketString[0]}, and ${trinketString[1]}`; + } else { + trinketString[trinketString.length - 1] = "and " + trinketString[trinketString.length - 1]; + trinketString = trinketString.join(", "); + } + return `There's a display case behind your desk, with ${trinketString}.`; +}; diff --git a/src/js/utilJS.js b/src/js/utilJS.js index 752971d503bb5094c9839831dcd348fd34cbda57..58f1ef7bf16d9b7294dbd3726ad28301e81aba3a 100644 --- a/src/js/utilJS.js +++ b/src/js/utilJS.js @@ -921,7 +921,19 @@ window.getSlaveTrustClass = /** @param {App.Entity.SlaveState} slave */ function // takes an integer e.g. $activeSlave.hLength, returns a string in the format 10 inches window.cmToInchString = function(s) { - return Math.round(s/2.54) + (Math.round(s/2.54) === 1?' inch':' inches'); + let inches = Math.round(s/2.54); + if (inches === 0) { + if (s === 0) { + inches += ' inches'; + } else { + inches = 'less than an inch'; + } + } else if (inches === 1){ + inches += ' inch'; + } else { + inches += ' inches'; + } + return inches; }; // takes an integer e.g. $activeSlave.height, returns a string in the format 6'5" @@ -999,389 +1011,6 @@ window.lengthToEitherUnit = function(s) { return `${s }cm`; }; -/* decoration should be passed as "facilityDecoration" in quotes. For example, ValidateFacilityDecoration("brothelDecoration"). The quotes are important, do not pass it as a story variable. */ -window.ValidateFacilityDecoration = function ValidateFacilityDecoration(decoration) { - const V = State.variables; - switch (V[decoration]) { - case 'standard': - /* nothing to do */ - break; - case 'Supremacist': - if (!Number.isFinite(V.arcologies[0].FSSupremacist)) { - V[decoration] = 'standard'; - } - break; - case 'Subjugationist': - if (!Number.isFinite(V.arcologies[0].FSSubjugationist)) { - V[decoration] = 'standard'; - } - break; - case 'Gender Radicalist': - if (!Number.isFinite(V.arcologies[0].FSGenderRadicalist)) { - V[decoration] = 'standard'; - } - break; - case 'Gender Fundamentalist': - if (!Number.isFinite(V.arcologies[0].FSGenderFundamentalist)) { - V[decoration] = 'standard'; - } - break; - case 'Paternalist': - if (!Number.isFinite(V.arcologies[0].FSPaternalist)) { - V[decoration] = 'standard'; - } - break; - case 'Body Purist': - if (!Number.isFinite(V.arcologies[0].FSBodyPurist)) { - V[decoration] = 'standard'; - } - break; - case 'Transformation Fetishist': - if (!Number.isFinite(V.arcologies[0].FSTransformationFetishist)) { - V[decoration] = 'standard'; - } - break; - case 'Youth Preferentialist': - if (!Number.isFinite(V.arcologies[0].FSYouthPreferentialist)) { - V[decoration] = 'standard'; - } - break; - case 'Maturity Preferentialist': - if (!Number.isFinite(V.arcologies[0].FSMaturityPreferentialist)) { - V[decoration] = 'standard'; - } - break; - case 'Slimness Enthusiast': - if (!Number.isFinite(V.arcologies[0].FSSlimnessEnthusiast)) { - V[decoration] = 'standard'; - } - break; - case 'Asset Expansionist': - if (!Number.isFinite(V.arcologies[0].FSAssetExpansionist)) { - V[decoration] = 'standard'; - } - break; - case 'Pastoralist': - if (!Number.isFinite(V.arcologies[0].FSPastoralist)) { - V[decoration] = 'standard'; - } - break; - case 'Physical Idealist': - if (!Number.isFinite(V.arcologies[0].FSPhysicalIdealist)) { - V[decoration] = 'standard'; - } - break; - case 'Chattel Religionist': - if (!Number.isFinite(V.arcologies[0].FSChattelReligionist)) { - V[decoration] = 'standard'; - } - break; - case 'Degradationist': - if (!Number.isFinite(V.arcologies[0].FSDegradationist)) { - V[decoration] = 'standard'; - } - break; - case 'Roman Revivalist': - if (!Number.isFinite(V.arcologies[0].FSRomanRevivalist)) { - V[decoration] = 'standard'; - } - break; - case 'Egyptian Revivalist': - if (!Number.isFinite(V.arcologies[0].FSEgyptianRevivalist)) { - V[decoration] = 'standard'; - } - break; - case 'Edo Revivalist': - if (!Number.isFinite(V.arcologies[0].FSEdoRevivalist)) { - V[decoration] = 'standard'; - } - break; - case 'Arabian Revivalist': - if (!Number.isFinite(V.arcologies[0].FSArabianRevivalist)) { - V[decoration] = 'standard'; - } - break; - case 'Chinese Revivalist': - if (!Number.isFinite(V.arcologies[0].FSChineseRevivalist)) { - V[decoration] = 'standard'; - } - break; - case 'Repopulation Focus': - if (!Number.isFinite(V.arcologies[0].FSRepopulationFocus)) { - V[decoration] = 'standard'; - } - break; - case 'Eugenics': - if (!Number.isFinite(V.arcologies[0].FSRestart)) { - V[decoration] = 'standard'; - } - break; - case 'Hedonistic': - if (!Number.isFinite(V.arcologies[0].FSHedonisticDecadence)) { - V[decoration] = 'standard'; - } - break; - default: - V[decoration] = 'standard'; - } -}; - -window.FSChange = function FSChange(FS, magnitude, bonusMultiplier) { - 'use strict'; - const V = State.variables; - let errorMessage = ''; - - switch (FS) { - case 'Supremacist': - if (Number.isFinite(V.arcologies[0].FSSupremacist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSSupremacist / V.FSLockinLevel) / 3, 'futureSocieties'); // Reducing the reputation impact of slaves that are not adhering to societal ideals properly - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSSupremacist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSSupremacist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'Subjugationist': - if (Number.isFinite(V.arcologies[0].FSSubjugationist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSSubjugationist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSSubjugationist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSSubjugationist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'GenderRadicalist': - if (Number.isFinite(V.arcologies[0].FSGenderRadicalist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSGenderRadicalist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSGenderRadicalist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSGenderRadicalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'GenderFundamentalist': - if (Number.isFinite(V.arcologies[0].FSGenderFundamentalist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSGenderFundamentalist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSGenderFundamentalist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSGenderFundamentalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'Paternalist': - if (Number.isFinite(V.arcologies[0].FSPaternalist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSPaternalist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSPaternalist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSPaternalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'Degradationist': - if (Number.isFinite(V.arcologies[0].FSDegradationist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSDegradationist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSDegradationist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSDegradationist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'AssetExpansionist': - if (Number.isFinite(V.arcologies[0].FSAssetExpansionist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSAssetExpansionist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSAssetExpansionist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSAssetExpansionist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'SlimnessEnthusiast': - if (Number.isFinite(V.arcologies[0].FSSlimnessEnthusiast)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSSlimnessEnthusiast / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSSlimnessEnthusiast / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSSlimnessEnthusiast += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'TransformationFetishist': - if (Number.isFinite(V.arcologies[0].FSTransformationFetishist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSTransformationFetishist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSTransformationFetishist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSTransformationFetishist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'BodyPurist': - if (Number.isFinite(V.arcologies[0].FSBodyPurist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSBodyPurist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSBodyPurist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSBodyPurist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'MaturityPreferentialist': - if (Number.isFinite(V.arcologies[0].FSMaturityPreferentialist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSMaturityPreferentialist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSMaturityPreferentialist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSMaturityPreferentialist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'YouthPreferentialist': - if (Number.isFinite(V.arcologies[0].FSYouthPreferentialist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSYouthPreferentialist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSYouthPreferentialist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSYouthPreferentialist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'Pastoralist': - if (Number.isFinite(V.arcologies[0].FSPastoralist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSPastoralist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSPastoralist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSPastoralist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'PhysicalIdealist': - if (Number.isFinite(V.arcologies[0].FSPhysicalIdealist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSPhysicalIdealist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSPhysicalIdealist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSPhysicalIdealist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'ChattelReligionist': - if (Number.isFinite(V.arcologies[0].FSChattelReligionist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSChattelReligionist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSChattelReligionist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSChattelReligionist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'RomanRevivalist': - if (Number.isFinite(V.arcologies[0].FSRomanRevivalist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSRomanRevivalist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSRomanRevivalist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSRomanRevivalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'AztecRevivalist': - if (Number.isFinite(V.activeArcology.FSAztecRevivalist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSAztecRevivalist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSAztecRevivalist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSAztecRevivalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'EgyptianRevivalist': - if (Number.isFinite(V.arcologies[0].FSEgyptianRevivalist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSEgyptianRevivalist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSEgyptianRevivalist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSEgyptianRevivalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'EdoRevivalist': - if (Number.isFinite(V.arcologies[0].FSEdoRevivalist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSEdoRevivalist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSEdoRevivalist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSEdoRevivalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'ArabianRevivalist': - if (Number.isFinite(V.arcologies[0].FSArabianRevivalist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSArabianRevivalist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSArabianRevivalist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSArabianRevivalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'ChineseRevivalist': - if (Number.isFinite(V.arcologies[0].FSChineseRevivalist)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSChineseRevivalist / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSChineseRevivalist / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSChineseRevivalist += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'Repopulationist': - if (Number.isFinite(V.arcologies[0].FSRepopulationFocus)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSRepopulationFocus / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSRepopulationFocus / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSRepopulationFocus += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'Eugenics': - if (Number.isFinite(V.arcologies[0].FSRestart)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSRestart / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSRestart / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSRestart += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - case 'Hedonism': - if (Number.isFinite(V.arcologies[0].FSHedonisticDecadence)) { - if (magnitude < 0) { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSHedonisticDecadence / V.FSLockinLevel) / 3, 'futureSocieties'); - } else { - repX(magnitude * V.FSSingleSlaveRep * (V.arcologies[0].FSHedonisticDecadence / V.FSLockinLevel), 'futureSocieties'); - } - V.arcologies[0].FSHedonisticDecadence += 0.05 * magnitude * V.FSSingleSlaveRep * (bonusMultiplier || 1); - } - break; - default: - errorMessage += '<span class=\'red\'>ERROR: bad FS reference</span>'; - } - return errorMessage; -}; - -window.FSChangePorn = function FSChangePorn(FS, magnitude) { - return FSChange(FS, magnitude, State.variables.pornFameBonus); -}; - window.ordinalSuffix = function ordinalSuffix(i) { let j = i % 10; let k = i % 100; @@ -1732,3 +1361,34 @@ window.SkillIncrease = (function() { Entertain: EntertainSkillIncrease }; })(); + +window.upgradeMultiplierArcology = function() { + const V = State.variables; + if (V.PC.career === "engineer" || (V.arcologies[0].FSRestartDecoration >= 100 && V.eugenicsFullControl === 0) ) { + return 0.6; + } else if (V.PC.engineering <= -100) { + return 1.5; + } else if (V.PC.engineering <= -75) { + return 1.35; + } else if (V.PC.engineering <= -50) { + return 1.25; + } else if (V.PC.engineering <= -25) { + return 1.15; + } else if (V.PC.engineering < 0) { + return 1.10; + } else if (V.PC.engineering === 0) { + return 1; + } else if (V.PC.engineering <= 10) { + return 0.97; + } else if (V.PC.engineering <= 25) { + return 0.95; + } else if (V.PC.engineering <= 50) { + return 0.90; + } else if (V.PC.engineering <= 75) { + return 0.85; + } else if (V.PC.engineering < 100) { + return 0.83; + } else if (V.PC.engineering >= 100 || V.PC.career === "arcology owner") { + return 0.80; + } +}; \ No newline at end of file diff --git a/src/js/walkPastJS.js b/src/js/walkPastJS.js index 39f6a270a8365e934fe81ae83ab847d4714516e9..f86963faa5d1fd2e9ccf44998afb5123770288df 100644 --- a/src/js/walkPastJS.js +++ b/src/js/walkPastJS.js @@ -196,7 +196,7 @@ window.loverSlave = function(activeSlave) { if (_fuckSeed > 45 && (canPenetrate(activeSlave) && _partnerSlave.nipples === "fuckable")) { t += `taking advantage of ${partnerName}'s fuckable tits. The motion running through ${partnerName}'s breasts as ${he} humps is hypnotic.`; } else { - t += `how well ${partnerName}'s cock feels in ${his} fuckable tits . The motion running through ${name}'s breasts as ${his} ${activeSlaveRel} fucks ${him} is hypnotic.`; + t += `how well ${partnerName}'s cock feels in ${his} fuckable tits. The motion running through ${name}'s breasts as ${his} ${activeSlaveRel} fucks ${him} is hypnotic.`; } } else { t += `snuggling rather sexually ${_fuckSpot}. ${name} loves having `; @@ -1965,7 +1965,7 @@ window.boobWatch = function(slave) { case "a scalemail bikini": t += `${His} scalemail bikini covers `; if (slave.boobs < 300) { - t += `all of $his flat chest.`; + t += `all of ${his} flat chest.`; } else if (slave.boobs < 700) { t += `${his} breasts entirely.`; } else if (slave.boobs < 1500) { diff --git a/src/pregmod/basenationalitiesControls.tw b/src/pregmod/basenationalitiesControls.tw index e090c5ba894608cd26a53442bf767fc1d8d13ec4..4ca9e7efdf5a4239543800e3c606546d0a08694b 100644 --- a/src/pregmod/basenationalitiesControls.tw +++ b/src/pregmod/basenationalitiesControls.tw @@ -31,7 +31,7 @@ /* Fine control tweaking of populations */ Adjust slave populations: -<br style="clear:both" /><hr style="margin:0"> +<br style="clear:both"><hr style="margin:0"> /* Filter controls */ Filter by Race: @@ -69,7 +69,7 @@ Filter by Region: | <</if>> <</for>> -<br style="clear:both" /><hr style="margin:0"> +<br style="clear:both"><hr style="margin:0"> <div style="white-space: nowrap"> /* Unfiltered pop controls */ diff --git a/src/pregmod/csec.tw b/src/pregmod/csec.tw index 59b1cf6921e103d22e66e90a8ac0d63c7972e6ef..668b4e14855b0cfe57f764080d6e48a4d1a4a1e9 100644 --- a/src/pregmod/csec.tw +++ b/src/pregmod/csec.tw @@ -481,8 +481,8 @@ Since $his <<if $activeSlave.mpreg == 1>>ass<<else>>vagina<</if>> was spared fro <<if $activeSlave.broodmother == 0 && $bellyImplants == 1>> <br><br> <span id="bir">Since $he is already in surgery and $his body already stretched, it would be possible to preserve $his pregnant appearance via fillable implant. - <<link "Do it.">> </span> + <<link "Do it.">> <<replace "#bir">> <<if $PC.medicine >= 100>><<set $activeSlave.health -= 5>><<else>><<set $activeSlave.health -= 10>><</if>> Installation of belly implant is relatively simple procedure. Using the fact that $his body and internal organs have already adapted to pregnancy, it's possible to greatly expand the initial size of implant. $He will still look pregnant post surgery and recovery. diff --git a/src/pregmod/customizeSlaveTrade.tw b/src/pregmod/customizeSlaveTrade.tw index 9bed5816c428666b447cbccbe7483faa8761b2dc..ee3ba43a421b90297edbddbd721abc83c09621fc 100644 --- a/src/pregmod/customizeSlaveTrade.tw +++ b/src/pregmod/customizeSlaveTrade.tw @@ -17,7 +17,7 @@ When civilization turned upon itself, some countries readily took to enslaving t <span id="PopControl"><<include "Basenationalities Controls">></span> <br> [[Reset filters|passage()][$baseControlsFilter = "all"]] | [[Clear all nationalities|passage()][$nationalities = {}]] -<br style="clear:both" /><hr style="margin:0"> +<br style="clear:both"><hr style="margin:0"> Vanilla presets: <span id="vanilla-presets"></span> <<script>> diff --git a/src/pregmod/eliteTakeOverResult.tw b/src/pregmod/eliteTakeOverResult.tw index dccc19a952106e372614f6ffa3b125d4573c667a..217375157a756110bad97acd413bc07e60455148 100644 --- a/src/pregmod/eliteTakeOverResult.tw +++ b/src/pregmod/eliteTakeOverResult.tw @@ -210,4 +210,4 @@ <</if>> /* clean up */ -<<set $failedElite = 0, $eugenicsFullControl = 1, $upgradeMultiplierArcology = 1>> +<<set $failedElite = 0, $eugenicsFullControl = 1>> diff --git a/src/pregmod/fFeet.tw b/src/pregmod/fFeet.tw index 988a4fc63b3e265e58b408310300dc92e0f10ec2..0c80bc675a7cc29232df385faf2fbabe6c4bda62 100644 --- a/src/pregmod/fFeet.tw +++ b/src/pregmod/fFeet.tw @@ -354,7 +354,7 @@ You call $activeSlave.slaveName to your office, telling $him to use $his feet to erect _dick cock, <</if>> <<else>> - soft and dripping _dick <<if ($activeSlave.chastityPenis == 1)>>caged <</if>>dick , + soft and dripping _dick <<if ($activeSlave.chastityPenis == 1)>>caged <</if>>dick, <</if>> <<if $activeSlave.balls > 0 && $activeSlave.scrotum > 0>> <<if $activeSlave.vagina >= 0>> diff --git a/src/pregmod/manageCorporation.tw b/src/pregmod/manageCorporation.tw index c39346300595ce315b003ca8382088445a0a61a4..412cbe1fca2bb8bab4dffec43a61b3b11fe9693f 100644 --- a/src/pregmod/manageCorporation.tw +++ b/src/pregmod/manageCorporation.tw @@ -819,7 +819,7 @@ __Division Management__ <<elseif $corpDivTrainSurgerySwitch == 1 && $corpDivTrainSurgeryTimer < 5>> <br>You can sell these slaves on the market. [[Sell 1|Manage Corporation][$corpCash += Math.trunc((26 + $corpDivTrainSurgeryTimer * 1.6) * menialSlaveCost()), $corpDivTrainSlaves2 -= 1, $menialDemandFactor -= 1, $corpRev += Math.trunc((26 + $corpDivTrainSurgeryTimer * 1.6) * menialSlaveCost())]] <<if $corpDivTrainSlaves2 >= 10>> - | [[Sell 10|Manage Corporation][$corpCash += Math.trunc((26 +\ $corpDivTrainSurgeryTimer * 1.6) * 10 * menialSlaveCost(-10)), $corpDivTrainSlaves2 -= 10, $menialDemandFactor -= 10, $corpRev += Math.trunc((26 + $corpDivTrainSurgeryTimer * 1.6) * 10 * menialSlaveCost())]] + | [[Sell 10|Manage Corporation][$corpCash += Math.trunc((26 + $corpDivTrainSurgeryTimer * 1.6) * 10 * menialSlaveCost(-10)), $corpDivTrainSlaves2 -= 10, $menialDemandFactor -= 10, $corpRev += Math.trunc((26 + $corpDivTrainSurgeryTimer * 1.6) * 10 * menialSlaveCost())]] <</if>> <<if $corpDivTrainSlaves2 >= 100>> | [[Sell 100|Manage Corporation][$corpCash += Math.trunc((26 + $corpDivTrainSurgeryTimer * 1.6) * 100 * menialSlaveCost(-100)), $corpDivTrainSlaves2 -= 100, $menialDemandFactor -= 100, $corpRev += Math.trunc((26 + $corpDivTrainSurgeryTimer * 1.6) * 100 * menialSlaveCost())]] @@ -1708,7 +1708,7 @@ __Slave specialization__ <<if !($arcologies[0].FSSubjugationist != "unset" && $arcologies[0].FSSubjugationistRace != "semitic")>> <<if $corpSpecRaces.length > 1 && $corpSpecTimer == 0>> <<if ($corpSpecRaces.length == 4 || $corpSpecRaces.length == 8) && $corpSpecToken > 0>> - [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic",1), $corpSpecToken -= , $corpSpecTimer = 1]] + [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic",1), $corpSpecToken -= 1, $corpSpecTimer = 1]] <<elseif ($corpSpecRaces.length != 4 || $corpSpecRaces.length != 8)>> [[Blacklist|Manage Corporation][$corpSpecRaces = corpBlacklistRace("semitic",1)]] <</if>> diff --git a/src/pregmod/saClothes.tw b/src/pregmod/saClothes.tw index 221e26ae97b6a92160f07d33fe506c0540be0f11..0a1dff8fdd22a8a40607fb0f299d45280496ebcc 100644 --- a/src/pregmod/saClothes.tw +++ b/src/pregmod/saClothes.tw @@ -639,7 +639,9 @@ <</if>> <<if ($slaves[$i].vaginalAccessory != "none")>> - <<if ($slaves[$i].vaginalAccessory == "dildo")>> + <<if ($slaves[$i].vaginalAttachment == "bullet vibrator")>> + /* TODO: add effects here */ + <<elseif ($slaves[$i].vaginalAccessory == "dildo")>> <<if ($slaves[$i].vagina < 1) && (random(1,100) > 50)>> Constantly wearing a dildo in $his virgin pussy @@.lime;gets it used to penetration.@@ <<set $slaves[$i].vagina += 1>> @@ -819,7 +821,10 @@ <</if>> <</if>> <</if>> - +<</if>> +<<if ($slaves[$i].vaginalAttachment != "none")>> + /* TODO: write effects here */ + <<elseif ($slaves[$i].vaginalAttachment == "vibrator")>> <</if>> <<if ($slaves[$i].buttplug != "none")>> @@ -1005,4 +1010,4 @@ <</if>> <</if>> <</if>> -<</if>> \ No newline at end of file +<</if>> diff --git a/src/pregmod/widgets/bodyswapWidgets.tw b/src/pregmod/widgets/bodyswapWidgets.tw index f6a079911ca684ef2106a0133ebba31690fc62e7..d396524a58ad51221474b634587bd7d1d087ef30 100644 --- a/src/pregmod/widgets/bodyswapWidgets.tw +++ b/src/pregmod/widgets/bodyswapWidgets.tw @@ -182,6 +182,7 @@ <<set $args[0].collar = $args[1].collar>> <<set $args[0].shoes = $args[1].shoes>> <<set $args[0].vaginalAccessory = $args[1].vaginalAccessory>> +<<set $args[0].vaginalAttachment = $args[1].vaginalAttachment>> <<set $args[0].dickAccessory = $args[1].dickAccessory>> <<set $args[0].chastityVagina = $args[1].chastityVagina>> <<set $args[0].chastityPenis = $args[1].chastityPenis>> diff --git a/src/uncategorized/BackwardsCompatibility.tw b/src/uncategorized/BackwardsCompatibility.tw index df7d1e9163e1d5ecd2bc26e8e8944caf2838b5ac..3c1bb3c7b0b12cd6c651f044965a61cc65f5f43a 100644 --- a/src/uncategorized/BackwardsCompatibility.tw +++ b/src/uncategorized/BackwardsCompatibility.tw @@ -452,6 +452,9 @@ <<if ndef $toysBoughtGags>> <<set $toysBoughtGags = 0>> <</if>> +<<if ndef $toysBoughtVaginalAttachments>> + <<set $toysBoughtVaginalAttachments = 0>> +<</if>> <<if ndef $toysBoughtButtPlugs>> <<set $toysBoughtButtPlugs = 0>> <</if>> @@ -2092,7 +2095,6 @@ Setting missing global variables: <<if ndef $trinkets>> <<set $trinkets = []>> - <<set $upgradeMultiplierArcology = 1>> <<set $upgradeMultiplierMedicine = 1>> <<if $PC.career == "wealth">> <<set $trinkets.push("a collection of diplomas from expensive schools")>> @@ -2104,7 +2106,6 @@ Setting missing global variables: <<set $trinkets.push("a framed picture of a slave with her sale price scrawled across the bottom")>> <<elseif $PC.career == "engineer">> <<set $trinkets.push("an artist's impression of an early arcology design")>> - <<set $upgradeMultiplierArcology = 0.6>> <<elseif $PC.career == "medicine">> <<set $trinkets.push("a framed postsurgical x-ray")>> <<set $upgradeMultiplierMedicine = 0.8>> @@ -3563,6 +3564,7 @@ Done! <</if>> <<set $HackingSkillMultiplier = HackingSkillMultiplier()>> +<<set $upgradeMultiplierArcology = upgradeMultiplierArcology()>> /* reset NaNArray after BC is run */ -<<set $NaNArray = findNaN()>> +<<set $NaNArray = findNaN()>> \ No newline at end of file diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw index 52ac6c1a92ccae865dbce2af4e4f91e270f90a80..03607fc1603e0a0e57f86da01547ec7887d2a1aa 100644 --- a/src/uncategorized/RESS.tw +++ b/src/uncategorized/RESS.tw @@ -4993,7 +4993,7 @@ brought in to you. This time <<EventNameLink>> has been sent to deliver it. $He <br><<link "Deny $him from ever having satisfying sex again">> <<replace "#result2">> You ask $him if $he enjoyed $his last orgasm, because $he won't be getting any more. Restrained as $he is, the most $he can do is cry and beg. Once $he comes to after the surgery, $he faces $his new body; @@.mediumorchid;$he's now a surgical null,@@ though $he retains $his balls, and $he's @@.gold;the only one to blame@@ for $his @@.red;suffering.@@ You waste no time in shoving $him against the wall and forcing your <<if $PC.dick == 1>>dick<<else>>strap-on<</if>> into $his anus. As $his arousal grows, $he realizes you not only took $his dick, but $his prostate as well. $He quickly find $himself desperate for release but lacking any way to do so. You watch $him squirm in sexual frustration. This will be $his new life. Every other rebellious slave is @@.gold;horrified by the example.@@ - <<set $activeSlave.trust -= 50, $activeSlave.devotion -= 30, $activeSlave.health -= 20, $activeSlave.dick = 0, $activeSlave.prostate = 0, $activeSlave.dickAccessory = "none", $activeSlave.chastityPenis = 0, $activeSlave.vagina = 0, $activeSlave.ovaries = 0, $activeSlave.clit = 0, $activeSlave.labia = 0, $activeSlave.vaginalAccessory = "none", $activeSlave.chastityVagina = 0>> + <<set $activeSlave.trust -= 50, $activeSlave.devotion -= 30, $activeSlave.health -= 20, $activeSlave.dick = 0, $activeSlave.prostate = 0, $activeSlave.dickAccessory = "none", $activeSlave.chastityPenis = 0, $activeSlave.vagina = 0, $activeSlave.ovaries = 0, $activeSlave.clit = 0, $activeSlave.labia = 0, $activeSlave.vaginalAccessory = "none", $activeSlave.vaginalAttachment = "none", $activeSlave.chastityVagina = 0>> <<= AnalVCheck()>> <<set $slaves.forEach(function(s) { if (s.devotion < -50) { s.trust -= 15; } })>> <<run cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave)>> @@ -5093,7 +5093,7 @@ brought in to you. This time <<EventNameLink>> has been sent to deliver it. $He <br><<link "Deny $him from ever having satisfying sex again">> <<replace "#result2">> You ask $him if $he enjoyed $his last orgasm, because $he won't be getting any more. Restrained as $he is, the most $he can do is cry and beg. Once $he comes to after the surgery, $he faces $his new body; @@.mediumorchid;$he's now a surgical null,@@ though $he retains $his balls, and $he's @@.gold;the only one to blame@@ for $his @@.red;suffering.@@ You waste no time in shoving $him against the wall and forcing your <<if $PC.dick == 1>>dick<<else>>strap-on<</if>> into $his anus. As $his arousal grows, $he realizes you not only took $his dick, but $his prostate as well. $He quickly find $himself desperate for release but lacking any way to do so. You watch $him squirm in sexual frustration. This will be $his new life. Every other rebellious slave is @@.gold;horrified by the example.@@ - <<set $activeSlave.trust -= 50, $activeSlave.devotion -= 30, $activeSlave.health -= 20, $activeSlave.dick = 0, $activeSlave.prostate = 0, $activeSlave.dickAccessory = "none", $activeSlave.chastityPenis = 0, $activeSlave.vagina = 0, $activeSlave.ovaries = 0, $activeSlave.clit = 0, $activeSlave.labia = 0, $activeSlave.vaginalAccessory = "none", $activeSlave.chastityVagina = 0>> + <<set $activeSlave.trust -= 50, $activeSlave.devotion -= 30, $activeSlave.health -= 20, $activeSlave.dick = 0, $activeSlave.prostate = 0, $activeSlave.dickAccessory = "none", $activeSlave.chastityPenis = 0, $activeSlave.vagina = 0, $activeSlave.ovaries = 0, $activeSlave.clit = 0, $activeSlave.labia = 0, $activeSlave.vaginalAccessory = "none", $activeSlave.vaginalAttachment = "none", $activeSlave.chastityVagina = 0>> <<= AnalVCheck()>> <<set $slaves.forEach(function(s) { if (s.devotion < -50) { s.trust -= 15; } })>> <<run cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave)>> @@ -5188,7 +5188,7 @@ brought in to you. This time <<EventNameLink>> has been sent to deliver it. $He <br><<link "Deny $him from ever having satisfying sex again">> <<replace "#result2">> You ask $him if $he enjoyed $his last orgasm, because $he won't be getting any more. Restrained as $he is, the most $he can do is cry and beg. Once $he comes to after the surgery, $he faces $his new body; @@.mediumorchid;$he's now a surgical null,@@ though $he retains $his balls, and $he's @@.gold;the only one to blame@@ for $his @@.red;suffering.@@ You waste no time in shoving $him against the wall and forcing your <<if $PC.dick == 1>>dick<<else>>strap-on<</if>> into $his anus. As $his arousal grows, $he realizes you not only took $his dick, but $his prostate as well. $He quickly find $himself desperate for release but lacking any way to do so. You watch $him squirm in sexual frustration. This will be $his new life. Every other rebellious slave is @@.gold;horrified by the example.@@ - <<set $activeSlave.trust -= 50, $activeSlave.devotion -= 30, $activeSlave.health -= 20, $activeSlave.dick = 0, $activeSlave.prostate = 0, $activeSlave.dickAccessory = "none", $activeSlave.chastityPenis = 0, $activeSlave.vagina = 0, $activeSlave.ovaries = 0, $activeSlave.clit = 0, $activeSlave.labia = 0, $activeSlave.vaginalAccessory = "none", $activeSlave.chastityVagina = 0>> + <<set $activeSlave.trust -= 50, $activeSlave.devotion -= 30, $activeSlave.health -= 20, $activeSlave.dick = 0, $activeSlave.prostate = 0, $activeSlave.dickAccessory = "none", $activeSlave.chastityPenis = 0, $activeSlave.vagina = 0, $activeSlave.ovaries = 0, $activeSlave.clit = 0, $activeSlave.labia = 0, $activeSlave.vaginalAccessory = "none", $activeSlave.vaginalAttachment = "none", $activeSlave.chastityVagina = 0>> <<= AnalVCheck()>> <<set $slaves.forEach(function(s) { if (s.devotion < -50) { s.trust -= 15; } })>> <<run cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave)>> @@ -5258,7 +5258,7 @@ brought in to you. This time <<EventNameLink>> has been sent to deliver it. $He <br><<link "Deny $him from ever having satisfying sex again">> <<replace "#result2">> You ask $him if $he enjoyed $his last orgasm, because $he won't be getting any more. Restrained as $he is, the most $he can do is cry and beg. Once $he comes to after the surgery, $he faces $his new body; @@.mediumorchid;$he's now a surgical null,@@ though $he retains $his balls, and $he's @@.gold;the only one to blame@@ for $his @@.red;suffering.@@ You waste no time in shoving $him against the wall and forcing your <<if $PC.dick == 1>>dick<<else>>strap-on<</if>> into $his anus. As $his arousal grows, $he realizes you not only took $his dick, but $his prostate as well. $He quickly find $himself desperate for release but lacking any way to do so. You watch $him squirm in sexual frustration. This will be $his new life. Every other rebellious slave is @@.gold;horrified by the example.@@ - <<set $activeSlave.trust -= 50, $activeSlave.devotion -= 30, $activeSlave.health -= 20, $activeSlave.dick = 0, $activeSlave.prostate = 0, $activeSlave.dickAccessory = "none", $activeSlave.chastityPenis = 0, $activeSlave.vagina = 0, $activeSlave.ovaries = 0, $activeSlave.clit = 0, $activeSlave.labia = 0, $activeSlave.vaginalAccessory = "none", $activeSlave.chastityVagina = 0>> + <<set $activeSlave.trust -= 50, $activeSlave.devotion -= 30, $activeSlave.health -= 20, $activeSlave.dick = 0, $activeSlave.prostate = 0, $activeSlave.dickAccessory = "none", $activeSlave.chastityPenis = 0, $activeSlave.vagina = 0, $activeSlave.ovaries = 0, $activeSlave.clit = 0, $activeSlave.labia = 0, $activeSlave.vaginalAccessory = "none", $activeSlave.vaginalAttachment = "none", $activeSlave.chastityVagina = 0>> <<= AnalVCheck()>> <<set $slaves.forEach(function(s) { if (s.devotion < -50) { s.trust -= 15; } })>> <<run cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave)>> @@ -6651,7 +6651,7 @@ brought in to you. This time <<EventNameLink>> has been sent to deliver it. $He <br><br> You then conduct a more thorough inspection, from the top of $his $activeSlave.hColor-haired head on down. $He complies submissively, obviously expecting to be abused at any moment. $He obediently <<if ($activeSlave.boobs > 1000)>>lifts each of $his massive breasts one by one to display each of them from all angles.<<elseif $activeSlave.belly >= 5000>> allows you to do as you will to $his gravid stomach.<<else>>opens $his mouth and sticks out $his tongue on command.<</if>> $He even obeys an instruction to <<if ($activeSlave.dick > 1)>>take $himself by the dickhead and pull $his member flat up against $his abdomen.<<elseif ($activeSlave.dick > 0)>>take $his little dickhead between a thumb and forefinger and hold $himself out straight to reveal how tiny $he really is.<<elseif ($activeSlave.clit > 1)>>push back $his hood to reveal all of $his enormous clit.<<elseif ($activeSlave.labia > 1)>>spread $his meaty labia to reveal $his cunt.<<elseif $activeSlave.vagina == -1>>really show off $his smooth groin, displaying every bit of it, down to the tiny hole that's its only feature.<<else>>spread $his pussylips to show off $his cunt.<</if>> <br><br> - Finally the inspection reaches $his backdoor, so you tell $him to turn around, bend over, and pull $his buttocks apart as wide as $he can. $He tenses in fear, obviously expecting anal rape, but after a moment of hesitation, $he obeys. $He turns, <<if $activeSlave.belly >= 10000>>carefully bends<<else>>bends<</if>>, and <<if ($activeSlave.butt > 5)>>grabs a handful of buttcheek in both hands, trembling as $he spreads $his ass to reveal<<elseif ($activeSlave.butt > 2)>>harshly pulls $his own buttcheeks apart, clearly hoping that if $he treats $himself this way, you won't. $He reveals<<else>>even though $his trim ass has already revealed everything, uses $his hands to spread $himself even wider to show off<</if>> $his <<if ($activeSlave.anus > 2)>>poor, overused asshole, which despite $his terror is still gaping a little.<<elseif ($activeSlave.anus > 1)>>$his asshole, which is clenched tight in terror.<<else>>invitingly tight asshole, which is clenched hard in terror.<</if>> Maintaining your neutral tone, you ask $him how $he feels about anal sex. + Finally the inspection reaches $his backdoor, so you tell $him to turn around, bend over, and pull $his buttocks apart as wide as $he can. $He tenses in fear, obviously expecting anal rape, but after a moment of hesitation, $he obeys. $He turns, <<if $activeSlave.belly >= 10000>>carefully bends<<else>>bends<</if>>, and <<if ($activeSlave.butt > 5)>>grabs a handful of buttcheek in both hands, trembling as $he spreads $his ass to reveal<<elseif ($activeSlave.butt > 2)>>harshly pulls $his own buttcheeks apart, clearly hoping that if $he treats $himself this way, you won't. $He reveals<<else>>even though $his trim ass has already revealed everything, uses $his hands to spread $himself even wider to show off<</if>> $his <<if ($activeSlave.anus > 2)>>poor, overused asshole, which despite $his terror is still gaping a little.<<elseif ($activeSlave.anus > 1)>>asshole, which is clenched tight in terror.<<else>>invitingly tight asshole, which is clenched hard in terror.<</if>> Maintaining your neutral tone, you ask $him how $he feels about anal sex. <<if ($activeSlave.anus == 0)>> "It'<<s>> <<s>>-<<s>>cary, <<if $activeSlave.rudeTitle == 1>><<= PoliteRudeTitle($activeSlave)>><<else>><<Master>><</if>>. I'm afraid it'll h-hurt," $he gasps out. <<elseif ($activeSlave.fetishKnown == 1) && ($activeSlave.fetish == "buttslut")>> @@ -7793,7 +7793,7 @@ You tell $him kindly that you understand, and that $he'll be trained to address <</if>> <</replace>> <</link>> -<<if $activeSlave.buttPlug == "none" && ($activeSlave.vagina < 0 || $activeSlave.vaginalAccessory == "none")>> +<<if $activeSlave.buttPlug == "none" && ($activeSlave.vagina < 0 || ($activeSlave.vaginalAccessory == "none" && $activeSlave.vaginalAttachment == "none"))>> <br><<link "Add dildos to $his gear">> <<EventNameDelink $activeSlave>> <<replace "#result">> @@ -12751,17 +12751,17 @@ You tell $him kindly that you understand, and that $he'll be trained to address <<if $PC.dick == 1>>cock<<if $PC.vagina == 1>> and <</if>><</if>><<if $PC.vagina == 1>>cunt<</if>> but you pull $him up again and tell $him to do that last. <<if $PC.belly >= 60000>> - $He quickly finds something almost as good by licking ,and sucking $his way up your linea nigra. When $he reaches your <<if $PC.preg >= 22>>popped<<else>>flattened<</if>> navel, you hold $his head there for a while, savoring the erotic sensation before pushing $him along to the rest of your expansive midriff. + $He quickly finds something almost as good by licking and sucking $his way up your linea nigra. When $he reaches your <<if $PC.preg >= 22>>popped<<else>>flattened<</if>> navel, you hold $his head there for a while, savoring the erotic sensation before pushing $him along to the rest of your expansive midriff. <<elseif $PC.belly >= 5000>> - $He quickly finds something almost as good by licking ,and sucking $his way up your linea nigra. When $he reaches your <<if $PC.preg >= 22>>popped<<else>>flattened<</if>> navel, you hold $his head there for a while, savoring the erotic sensation. + $He quickly finds something almost as good by licking and sucking $his way up your linea nigra. When $he reaches your <<if $PC.preg >= 22>>popped<<else>>flattened<</if>> navel, you hold $his head there for a while, savoring the erotic sensation. <<elseif $PC.boobsBonus > 2>> - $He quickly finds something almost as good by licking ,and sucking $his way up the sweaty crevice between your enormous breasts. When $he reaches your nipples, you hold $his head there for a while, enjoying $his tongue. + $He quickly finds something almost as good by licking and sucking $his way up the sweaty crevice between your enormous breasts. When $he reaches your nipples, you hold $his head there for a while, enjoying $his tongue. <<elseif $PC.boobsBonus == 2>> - $He quickly finds something almost as good by licking ,and sucking $his way up the sweaty crevice between your huge breasts. When $he reaches your nipples, you hold $his head there for a while, enjoying $his tongue. + $He quickly finds something almost as good by licking and sucking $his way up the sweaty crevice between your huge breasts. When $he reaches your nipples, you hold $his head there for a while, enjoying $his tongue. <<elseif $PC.boobsBonus == 1>> - $He quickly finds something almost as good by licking ,and sucking $his way up the sweaty crevice between your big breasts. When $he reaches your nipples, you hold $his head there for a while, enjoying $his tongue. + $He quickly finds something almost as good by licking and sucking $his way up the sweaty crevice between your big breasts. When $he reaches your nipples, you hold $his head there for a while, enjoying $his tongue. <<elseif $PC.boobs == 1>> - $He quickly finds something almost as good by licking ,and sucking $his way up the sweaty crevice between your breasts. When $he reaches your nipples, you hold $his head there for a while, enjoying $his tongue. + $He quickly finds something almost as good by licking and sucking $his way up the sweaty crevice between your breasts. When $he reaches your nipples, you hold $his head there for a while, enjoying $his tongue. <<else>> <<if $PC.title == 0>> $He settles for kissing and licking $his way up your abs, pecs, and non-existent tits. When $he reaches your nipples, you hold $his head there for a while, enjoying $his tongue. diff --git a/src/uncategorized/costsWidgets.tw b/src/uncategorized/costsWidgets.tw index b952e9b8177fddd9132b3e0ed8fe885a045eb3f5..2fbf44cfbdda9715a8bfd4320a02313d3ab6cbe1 100644 --- a/src/uncategorized/costsWidgets.tw +++ b/src/uncategorized/costsWidgets.tw @@ -414,7 +414,7 @@ You bought $him for: @@.red;<<print cashFormat($args[0].slaveCost)>>@@. <<set _Cost = $args[0].slaveCost>> <<elseif $args[0].slaveCost == 0>> - You spent nothing to aquire $him. + You spent nothing to acquire $him. <<set _Cost = $args[0].slaveCost>> <<else>> You have no record of how much <<if $args[0].origin != 0>>this<<else>>$he originally<</if>> cost. diff --git a/src/uncategorized/customSlave.tw b/src/uncategorized/customSlave.tw index ed2ac67c84c2c131058b4536485cfc1a95865d1b..08c6f865eca42d3e25ae23ce32715538ca827a56 100644 --- a/src/uncategorized/customSlave.tw +++ b/src/uncategorized/customSlave.tw @@ -458,8 +458,8 @@ <<if $customSlave.weight == -50>>Very thin. <<elseif $customSlave.weight == -15>>Thin. <<elseif $customSlave.weight == 0>>Average weight. -<<elseif $customSlave.weight == 15>>Chubby. -<<elseif $customSlave.weight == 50>>Plump. +<<elseif $customSlave.weight == 15>>Plush. +<<elseif $customSlave.weight == 50>>Chubby. <<elseif $customSlave.weight == 100>>Fat. <<elseif $customSlave.weight == 150>>Very Fat. <<else>>Immobile. @@ -480,12 +480,12 @@ <<CustomSlaveWeight>> <</link>> | -<<link "Chubby">> +<<link "Plush">> <<set $customSlave.weight = 15>> <<CustomSlaveWeight>> <</link>> | -<<link "Plump">> +<<link "Chubby">> <<set $customSlave.weight = 50>> <<CustomSlaveWeight>> <</link>> diff --git a/src/uncategorized/dairyReport.tw b/src/uncategorized/dairyReport.tw index 2b1a916c6bd29be3544cca5ce2f23dc2b64b229a..c102a4800cd9579dd8c32b4d0e78ef6e424cbc28 100644 --- a/src/uncategorized/dairyReport.tw +++ b/src/uncategorized/dairyReport.tw @@ -368,7 +368,7 @@ <<set $slaves[$i].diet = "healthy">> <</if>> <<if $dairyRestraintsSetting > 1>> - <<set $slaves[$i].collar = "none", $slaves[$i].choosesOwnClothes = 0, $slaves[$i].clothes = "no clothing", $slaves[$i].buttplug = "none", $slaves[$i].vaginalAccessory = "none", $slaves[$i].dickAccessory = "none", $slaves[$i].chastityAnus = 0, $slaves[$i].chastityPenis = 0, $slaves[$i].chastityVagina = 0>> + <<set $slaves[$i].collar = "none", $slaves[$i].choosesOwnClothes = 0, $slaves[$i].clothes = "no clothing", $slaves[$i].vaginalAccessory = "none", $slaves[$i].vaginalAttachment = "none", $slaves[$i].dickAccessory = "none", $slaves[$i].buttplug = "none", $slaves[$i].chastityAnus = 0, $slaves[$i].chastityPenis = 0, $slaves[$i].chastityVagina = 0>> <</if>> <<switch $dairyDecoration>> <<case "Roman Revivalist" "Aztec Revivalist" "Chinese Revivalist" "Chattel Religionist" "Edo Revivalist" "Arabian Revivalist" "Egyptian Revivalist" "Supremacist" "Subjugationist" "Degradationist">> diff --git a/src/uncategorized/fsDevelopments.tw b/src/uncategorized/fsDevelopments.tw index 60e018b48d914a42b862f4814831669101c99a3d..6204acfedb72a151b294f7cea52d6bb1a8c1cb44 100644 --- a/src/uncategorized/fsDevelopments.tw +++ b/src/uncategorized/fsDevelopments.tw @@ -695,9 +695,8 @@ $arcologies[0].name is unconvinced of $arcologies[0].FSSupremacistRace superiority. <</if>> <<if $arcologies[0].FSSupremacist < 0>> - <<run removeFS("FSSupremacist")>> + <<run FutureSocieties.remove("FSSupremacist")>> <<if $assistantFSAppearance == "supremacist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSSupremacist > $arcologies[0].FSSupremacistDecoration>> <<set $arcologies[0].FSSupremacist = $arcologies[0].FSSupremacistDecoration>> @@ -725,9 +724,8 @@ $arcologies[0].name is unconvinced of the inferiority of $arcologies[0].FSSubjugationistRace people. <</if>> <<if $arcologies[0].FSSubjugationist < 0>> - <<run removeFS("FSSubjugationist")>> + <<run FutureSocieties.remove("FSSubjugationist")>> <<if $assistantFSAppearance == "subjugationist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSSubjugationist > $arcologies[0].FSSubjugationistDecoration>> <<set $arcologies[0].FSSubjugationist = $arcologies[0].FSSubjugationistDecoration>> @@ -755,9 +753,8 @@ $arcologies[0].name is unconvinced that all women should be pregnant. <</if>> <<if $arcologies[0].FSRepopulationFocus < 0>> - <<run removeFS("FSRepopulationFocus")>> + <<run FutureSocieties.remove("FSRepopulationFocus")>> <<if $assistantFSAppearance == "repopulation focus">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSRepopulationFocus > $arcologies[0].FSRepopulationFocusDecoration>> <<set $arcologies[0].FSRepopulationFocus = $arcologies[0].FSRepopulationFocusDecoration>> @@ -785,9 +782,8 @@ $arcologies[0].name is unconvinced that only the elite should reproduce. <</if>> <<if $arcologies[0].FSRestart < 0 && $arcologies[0].FSRestartDecoration != 100>> - <<run removeFS("FSRestart")>> + <<run FutureSocieties.remove("FSRestart")>> <<if $assistantFSAppearance == "eugenics">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSRestart > $arcologies[0].FSRestartDecoration>> <<set $arcologies[0].FSRestart = $arcologies[0].FSRestartDecoration>> @@ -815,9 +811,8 @@ $arcologies[0].name is unconvinced of the need to redefine gender around power. <</if>> <<if $arcologies[0].FSGenderRadicalist < 0>> - <<run removeFS("FSGenderRadicalist")>> + <<run FutureSocieties.remove("FSGenderRadicalist")>> <<if $assistantFSAppearance == "gender radicalist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSGenderRadicalist > $arcologies[0].FSGenderRadicalistDecoration>> <<set $arcologies[0].FSGenderRadicalist = $arcologies[0].FSGenderRadicalistDecoration>> @@ -845,9 +840,8 @@ $arcologies[0].name is unconvinced of the need to preserve traditional gender roles. <</if>> <<if $arcologies[0].FSGenderFundamentalist < 0>> - <<run removeFS("FSGenderFundamentalist")>> + <<run FutureSocieties.remove("FSGenderFundamentalist")>> <<if $assistantFSAppearance == "gender fundamentalist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSGenderFundamentalist > $arcologies[0].FSGenderFundamentalistDecoration>> <<set $arcologies[0].FSGenderFundamentalist = $arcologies[0].FSGenderFundamentalistDecoration>> @@ -875,9 +869,8 @@ $arcologies[0].name is unconvinced of the vision of a well-bred race of slaves. <</if>> <<if $arcologies[0].FSPaternalist < 0>> - <<run removeFS("FSPaternalist")>> + <<run FutureSocieties.remove("FSPaternalist")>> <<if $assistantFSAppearance == "paternalist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSPaternalist > $arcologies[0].FSPaternalistDecoration>> <<set $arcologies[0].FSPaternalist = $arcologies[0].FSPaternalistDecoration>> @@ -905,9 +898,8 @@ $arcologies[0].name is unconvinced that slaves are not human and should be thoroughly degraded. <</if>> <<if $arcologies[0].FSDegradationist < 0>> - <<run removeFS("FSDegradationist")>> + <<run FutureSocieties.remove("FSDegradationist")>> <<if $assistantFSAppearance == "degradationist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSDegradationist > $arcologies[0].FSDegradationistDecoration>> <<set $arcologies[0].FSDegradationist = $arcologies[0].FSDegradationistDecoration>> @@ -935,9 +927,8 @@ $arcologies[0].name is unconvinced of the unattractive nature of implants. <</if>> <<if $arcologies[0].FSBodyPurist < 0>> - <<run removeFS("FSBodyPurist")>> + <<run FutureSocieties.remove("FSBodyPurist")>> <<if $assistantFSAppearance == "body purist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSBodyPurist > $arcologies[0].FSBodyPuristDecoration>> <<set $arcologies[0].FSBodyPurist = $arcologies[0].FSBodyPuristDecoration>> @@ -963,9 +954,8 @@ $arcologies[0].name is unconvinced about the attractiveness of implants. <</if>> <<if $arcologies[0].FSTransformationFetishist < 0>> - <<run removeFS("FSTransformationFetishist")>> + <<run FutureSocieties.remove("FSTransformationFetishist")>> <<if $assistantFSAppearance == "transformation fetishist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSTransformationFetishist > $arcologies[0].FSTransformationFetishistDecoration>> <<set $arcologies[0].FSTransformationFetishist = $arcologies[0].FSTransformationFetishistDecoration>> @@ -991,9 +981,8 @@ $arcologies[0].name is unconvinced about your preference for older ladies. <</if>> <<if $arcologies[0].FSMaturityPreferentialist < 0>> - <<run removeFS("FSMaturityPreferentialist")>> + <<run FutureSocieties.remove("FSMaturityPreferentialist")>> <<if $assistantFSAppearance == "maturity preferentialist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSMaturityPreferentialist > $arcologies[0].FSMaturityPreferentialistDecoration>> <<set $arcologies[0].FSMaturityPreferentialist = $arcologies[0].FSMaturityPreferentialistDecoration>> @@ -1019,9 +1008,8 @@ $arcologies[0].name is unconvinced about your preference for young women. <</if>> <<if $arcologies[0].FSYouthPreferentialist < 0>> - <<run removeFS("FSYouthPreferentialist")>> + <<run FutureSocieties.remove("FSYouthPreferentialist")>> <<if $assistantFSAppearance == "youth preferentialist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSYouthPreferentialist > $arcologies[0].FSYouthPreferentialistDecoration>> <<set $arcologies[0].FSYouthPreferentialist = $arcologies[0].FSYouthPreferentialistDecoration>> @@ -1047,9 +1035,8 @@ $arcologies[0].name is unconvinced about your preference for slim slaves with girlish figures. <</if>> <<if $arcologies[0].FSSlimnessEnthusiast < 0>> - <<run removeFS("FSSlimnessEnthusiast")>> + <<run FutureSocieties.remove("FSSlimnessEnthusiast")>> <<if $assistantFSAppearance == "slimness enthusiast">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSSlimnessEnthusiast > $arcologies[0].FSSlimnessEnthusiastDecoration>> <<set $arcologies[0].FSSlimnessEnthusiast = $arcologies[0].FSSlimnessEnthusiastDecoration>> @@ -1077,9 +1064,8 @@ $arcologies[0].name is unconvinced that all tits and asses should be bigger. <</if>> <<if $arcologies[0].FSAssetExpansionist < 0>> - <<run removeFS("FSAssetExpansionist")>> + <<run FutureSocieties.remove("FSAssetExpansionist")>> <<if $assistantFSAppearance == "asset expansionist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSAssetExpansionist > $arcologies[0].FSAssetExpansionistDecoration>> <<set $arcologies[0].FSAssetExpansionist = $arcologies[0].FSAssetExpansionistDecoration>> @@ -1107,9 +1093,8 @@ $arcologies[0].name is unconvinced that slaves should be milked. <</if>> <<if $arcologies[0].FSPastoralist < 0>> - <<run removeFS("FSPastoralist")>> + <<run FutureSocieties.remove("FSPastoralist")>> <<if $assistantFSAppearance == "pastoralist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSPastoralist > $arcologies[0].FSPastoralistDecoration>> <<set $arcologies[0].FSPastoralist = $arcologies[0].FSPastoralistDecoration>> @@ -1137,9 +1122,8 @@ $arcologies[0].name is unconvinced that all slaves should be tall and strong. <</if>> <<if $arcologies[0].FSPhysicalIdealist < 0>> - <<run removeFS("FSPhysicalIdealist")>> + <<run FutureSocieties.remove("FSPhysicalIdealist")>> <<if $assistantFSAppearance == "physical idealist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSPhysicalIdealist > $arcologies[0].FSPhysicalIdealistDecoration>> <<set $arcologies[0].FSPhysicalIdealist = $arcologies[0].FSPhysicalIdealistDecoration>> @@ -1167,9 +1151,8 @@ $arcologies[0].name is unconvinced that all slaves should be soft and laid-back. <</if>> <<if $arcologies[0].FSHedonisticDecadence < 0>> - <<run removeFS("FSHedonisticDecadence")>> + <<run FutureSocieties.remove("FSHedonisticDecadence")>> <<if $assistantFSAppearance == "hedonistic decadence">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSHedonisticDecadence > $arcologies[0].FSHedonisticDecadenceDecoration>> <<set $arcologies[0].FSHedonisticDecadence = $arcologies[0].FSHedonisticDecadenceDecoration>> @@ -1197,9 +1180,8 @@ $arcologies[0].name is unconvinced of a version of religion that emphasizes slaveholding traditions. <</if>> <<if $arcologies[0].FSChattelReligionist < 0>> - <<run removeFS("FSChattelReligionist")>> + <<run FutureSocieties.remove("FSChattelReligionist")>> <<if $assistantFSAppearance == "chattel religionist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSChattelReligionist > $arcologies[0].FSChattelReligionistDecoration>> <<set $arcologies[0].FSChattelReligionist = $arcologies[0].FSChattelReligionistDecoration>> @@ -1227,9 +1209,8 @@ $arcologies[0].name is unconvinced of the wisdom of your project to build a new Rome. <</if>> <<if $arcologies[0].FSRomanRevivalist < 0>> - <<run removeFS("FSRomanRevivalist")>> + <<run FutureSocieties.remove("FSRomanRevivalist")>> <<if $assistantFSAppearance == "roman revivalist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSRomanRevivalist > $arcologies[0].FSRomanRevivalistDecoration>> <<set $arcologies[0].FSRomanRevivalist = $arcologies[0].FSRomanRevivalistDecoration>> @@ -1257,9 +1238,8 @@ $arcologies[0].name is unconvinced of the wisdom of your project to build a new Aztec Empire. <</if>> <<if $arcologies[0].FSAztecRevivalist < 0>> - <<run removeFS("FSAztecRevivalist")>> + <<run FutureSocieties.remove("FSAztecRevivalist")>> <<if $assistantFSAppearance == "aztec revivalist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSAztecRevivalist > $arcologies[0].FSAztecRevivalistDecoration>> <<set $arcologies[0].FSAztecRevivalist = $arcologies[0].FSAztecRevivalistDecoration>> @@ -1287,9 +1267,8 @@ $arcologies[0].name is unconvinced of the wisdom of your project to build a new land of the Pharaohs. <</if>> <<if $arcologies[0].FSEgyptianRevivalist < 0>> - <<run removeFS("FSEgyptianRevivalist")>> + <<run FutureSocieties.remove("FSEgyptianRevivalist")>> <<if $assistantFSAppearance == "egyptian revivalist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSEgyptianRevivalist > $arcologies[0].FSEgyptianRevivalistDecoration>> <<set $arcologies[0].FSEgyptianRevivalist = $arcologies[0].FSEgyptianRevivalistDecoration>> @@ -1317,9 +1296,8 @@ $arcologies[0].name is unconvinced of the wisdom of your project to build a new Edo Japan. <</if>> <<if $arcologies[0].FSEdoRevivalist < 0>> - <<run removeFS("FSEdoRevivalist")>> + <<run FutureSocieties.remove("FSEdoRevivalist")>> <<if $assistantFSAppearance == "edo revivalist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSEdoRevivalist > $arcologies[0].FSEdoRevivalistDecoration>> <<set $arcologies[0].FSEdoRevivalist = $arcologies[0].FSEdoRevivalistDecoration>> @@ -1347,9 +1325,8 @@ $arcologies[0].name is unconvinced of the wisdom of your project to build a new Sultanate. <</if>> <<if $arcologies[0].FSArabianRevivalist < 0>> - <<run removeFS("FSArabianRevivalist")>> + <<run FutureSocieties.remove("FSArabianRevivalist")>> <<if $assistantFSAppearance == "arabian revivalist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSArabianRevivalist > $arcologies[0].FSArabianRevivalistDecoration>> <<set $arcologies[0].FSArabianRevivalist = $arcologies[0].FSArabianRevivalistDecoration>> @@ -1377,9 +1354,8 @@ $arcologies[0].name is unconvinced of the wisdom of your pursuit of the Mandate of Heaven. <</if>> <<if $arcologies[0].FSChineseRevivalist < 0>> - <<run removeFS("FSChineseRevivalist")>> + <<run FutureSocieties.remove("FSChineseRevivalist")>> <<if $assistantFSAppearance == "chinese revivalist">><<set $assistantFSAppearance = "default">><</if>> - <<ClearFacilityDecorations>> @@.red;Your future society project has failed:@@ your citizens were repelled from your idea more than they were attracted to it. @@.yellow;You may select another option, or elect to try again.@@ <<elseif $arcologies[0].FSChineseRevivalist > $arcologies[0].FSChineseRevivalistDecoration>> <<set $arcologies[0].FSChineseRevivalist = $arcologies[0].FSChineseRevivalistDecoration>> diff --git a/src/uncategorized/futureSociety.tw b/src/uncategorized/futureSociety.tw index d253264c5153ab60250308b5bcc9bab3d0f2921b..b84135885925d5456c90c96b7db6ea179787aeb7 100644 --- a/src/uncategorized/futureSociety.tw +++ b/src/uncategorized/futureSociety.tw @@ -593,7 +593,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc </span> <<if $arcologies[0].FSSupremacist != "unset">> - <br>''You are pursuing'' $arcologies[0].FSSupremacistRace superiority. //<<link "Abandon" "Future Society">><<run removeFS("FSSupremacist")>><<if $assistantFSAppearance == "supremacist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + <br>''You are pursuing'' $arcologies[0].FSSupremacistRace superiority. //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSSupremacist")>><<if $assistantFSAppearance == "supremacist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSSupremacist">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "amazon") || ($assistantAppearance == "monstergirl") || ($assistantAppearance == "succubus")>> @@ -622,7 +622,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <</if>> <<if $arcologies[0].FSSubjugationist != "unset">> - <br>''You are pursuing'' $arcologies[0].FSSubjugationistRace inferiority. //<<link "Abandon" "Future Society">><<run removeFS("FSSubjugationist")>><<if $assistantFSAppearance == "subjugationist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + <br>''You are pursuing'' $arcologies[0].FSSubjugationistRace inferiority. //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSSubjugationist")>><<if $assistantFSAppearance == "subjugationist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSSubjugationist">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "businesswoman") || ($assistantAppearance == "amazon") || ($assistantAppearance == "imp")>> @@ -654,7 +654,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSRestart == "unset">> <<if $arcologies[0].FSRepopulationFocus != "unset">> <br>''You are pursuing'' the belief that mass breeding will save humanity. - //<<link "Abandon" "Future Society">><<run removeFS("FSRepopulationFocus")>><<if $assistantFSAppearance == "repopulation focus">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSRepopulationFocus")>><<if $assistantFSAppearance == "repopulation focus">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSRepopulationFocus" "clothesBoughtMaternityLingerie" "clothesBoughtMaternityDress" "clothesBoughtBelly">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "goddess") || ($assistantAppearance == "hypergoddess") || ($assistantAppearance == "preggololi") || ($assistantAppearance == "pregnant fairy") || ($assistantAppearance == "succubus") || ($assistantAppearance == "witch")>> @@ -674,14 +674,14 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSRestart != "unset">> <<if $arcologies[0].FSRestartDecoration != 100>> <br>''You are pursuing'' Eugenics. - //<<link "Abandon" "Future Society">><<run removeFS("FSRestart")>><<if $assistantFSAppearance == "eugenics">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSRestart")>><<if $assistantFSAppearance == "eugenics">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSRestart">> <<else>> <br>''You have established'' Eugenics. <<if $eugenicsFullControl != 1>> The Societal Elite will not permit you to abandon Eugenics. <<else>> - //<<link "Abandon" "Future Society">><<run removeFS("FSRestart")>><<if $assistantFSAppearance == "eugenics">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>// + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSRestart")>><<if $assistantFSAppearance == "eugenics">><<set $assistantFSAppearance = "default">><</if>><</link>>// <</if>> <br> <<FSChangeDecoration "FSRestart">> @@ -706,7 +706,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSGenderFundamentalist == "unset">> <<if $arcologies[0].FSGenderRadicalist != "unset">> <br>''You are pursuing'' a radical redefinition of gender that identifies powerful people as male, and everyone else as female. - //<<link "Abandon" "Future Society">><<run removeFS("FSGenderRadicalist")>><<if $assistantFSAppearance == "gender radicalist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSGenderRadicalist")>><<if $assistantFSAppearance == "gender radicalist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSGenderRadicalist">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "shemale") || ($assistantAppearance == "monstergirl") || ($assistantAppearance == "incubus") || ($assistantAppearance == "succubus") || ($assistantAppearance == "witch")>> @@ -726,7 +726,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSGenderRadicalist == "unset">> <<if $arcologies[0].FSGenderFundamentalist != "unset">> <br>''You are pursuing'' gender traditionalism, including a societal preference for feminine slaves and support for slave pregnancy. - //<<link "Abandon" "Future Society">><<run removeFS("FSGenderFundamentalist")>><<if $assistantFSAppearance == "gender fundamentalist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSGenderFundamentalist")>><<if $assistantFSAppearance == "gender fundamentalist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSGenderFundamentalist" "clothesBoughtBunny">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "schoolgirl") || ($assistantAppearance == "goddess") || ($assistantAppearance == "hypergoddess") || ($assistantAppearance == "preggololi") || ($assistantAppearance == "loli") || ($assistantAppearance == "fairy") || ($assistantAppearance == "pregnant fairy") || ($assistantAppearance == "angel") || ($assistantAppearance == "cherub") || ($assistantAppearance == "succubus") || ($assistantAppearance == "witch")>> @@ -745,7 +745,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSDegradationist == "unset">> <<if $arcologies[0].FSPaternalist != "unset">> <br>''You are pursuing'' a vision of slave improvement, including slaves' health, mental well-being, and education. - //<<link "Abandon" "Future Society">><<run removeFS("FSPaternalist")>><<if $assistantFSAppearance == "paternalist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSPaternalist")>><<if $assistantFSAppearance == "paternalist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSPaternalist" "clothesBoughtConservative">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "schoolgirl") || ($assistantAppearance == "goddess") || ($assistantAppearance == "hypergoddess") || ($assistantAppearance == "preggololi") || ($assistantAppearance == "loli") || ($assistantAppearance == "fairy") || ($assistantAppearance == "pregnant fairy") || ($assistantAppearance == "angel") || ($assistantAppearance == "cherub")>> @@ -764,7 +764,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSPaternalist == "unset">> <<if $arcologies[0].FSDegradationist != "unset">> <br>''You are pursuing'' slave degradation, a belief that slaves are not human and should not be treated decently. - //<<link "Abandon" "Future Society">><<run removeFS("FSDegradationist")>><<if $assistantFSAppearance == "degradationist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSDegradationist")>><<if $assistantFSAppearance == "degradationist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSDegradationist" "clothesBoughtChains">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "monstergirl") || ($assistantAppearance == "businesswoman") || ($assistantAppearance == "preggololi") || ($assistantAppearance == "succubus") || ($assistantAppearance == "incubus") || ($assistantAppearance == "imp")>> @@ -783,7 +783,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSTransformationFetishist == "unset">> <<if $arcologies[0].FSBodyPurist != "unset">> <br>''You are pursuing'' societal disapproval of implant surgery. - //<<link "Abandon" "Future Society">><<run removeFS("FSBodyPurist")>><<if $assistantFSAppearance == "body purist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSBodyPurist")>><<if $assistantFSAppearance == "body purist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSBodyPurist">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "amazon") || ($assistantAppearance == "goddess") || ($assistantAppearance == "loli") || ($assistantAppearance == "fairy") || ($assistantAppearance == "pregnant fairy") || ($assistantAppearance == "angel") || ($assistantAppearance == "succubus") || ($assistantAppearance == "incubus") || ($assistantAppearance == "witch")>> @@ -802,7 +802,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSBodyPurist == "unset">> <<if $arcologies[0].FSTransformationFetishist != "unset">> <br>''You are pursuing'' societal fetishization of implant surgery. - //<<link "Abandon" "Future Society">><<run removeFS("FSTransformationFetishist")>><<if $assistantFSAppearance == "transformation fetishist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSTransformationFetishist")>><<if $assistantFSAppearance == "transformation fetishist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSTransformationFetishist">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "businesswoman") || ($assistantAppearance == "shemale") || ($assistantAppearance == "succubus") || ($assistantAppearance == "incubus") || ($assistantAppearance == "witch") || ($assistantAppearance == "ERROR_1606_APPEARANCE_FILE_CORRUPT")>> @@ -821,7 +821,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSMaturityPreferentialist == "unset">> <<if $arcologies[0].FSYouthPreferentialist != "unset">> <br>''You are pursuing'' an accentuated societal preference for younger slaves. - //<<link "Abandon" "Future Society">><<run removeFS("FSYouthPreferentialist")>><<if $assistantFSAppearance == "youth preferentialist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSYouthPreferentialist")>><<if $assistantFSAppearance == "youth preferentialist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSYouthPreferentialist">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "schoolgirl") || ($assistantAppearance == "shemale") || ($assistantAppearance == "preggololi") || ($assistantAppearance == "loli") || ($assistantAppearance == "succubus") || ($assistantAppearance == "angel") || ($assistantAppearance == "cherub") || ($assistantAppearance == "imp") || ($assistantAppearance == "witch")>> @@ -840,7 +840,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSYouthPreferentialist == "unset">> <<if $arcologies[0].FSMaturityPreferentialist != "unset">> <br>''You are pursuing'' a societal preference for older women. - //<<link "Abandon" "Future Society">><<run removeFS("FSMaturityPreferentialist")>><<if $assistantFSAppearance == "maturity preferentialist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSMaturityPreferentialist")>><<if $assistantFSAppearance == "maturity preferentialist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSMaturityPreferentialist">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "businesswoman") || ($assistantAppearance == "goddess") || ($assistantAppearance == "succubus") || ($assistantAppearance == "incubus") || ($assistantAppearance == "witch") || ($assistantAppearance == "angel")>> @@ -859,7 +859,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSAssetExpansionist == "unset">> <<if $arcologies[0].FSSlimnessEnthusiast != "unset">> <br>''You are supporting'' enthusiasm for slaves with girlish figures. - //<<link "Abandon" "Future Society">><<run removeFS("FSSlimnessEnthusiast")>><<if $assistantFSAppearance == "slimness enthusiast">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSSlimnessEnthusiast")>><<if $assistantFSAppearance == "slimness enthusiast">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSSlimnessEnthusiast">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "schoolgirl") || ($assistantAppearance == "shemale") || ($assistantAppearance == "loli") || ($assistantAppearance == "cherub") || ($assistantAppearance == "imp") || ($assistantAppearance == "succubus") || ($assistantAppearance == "witch")>> @@ -878,7 +878,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSSlimnessEnthusiast == "unset">> <<if $arcologies[0].FSAssetExpansionist != "unset">> <br>''You are pursuing'' societal hunger for huge assets. - //<<link "Abandon" "Future Society">><<run removeFS("FSAssetExpansionist")>><<if $assistantFSAppearance == "asset expansionist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSAssetExpansionist")>><<if $assistantFSAppearance == "asset expansionist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSAssetExpansionist">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "businesswoman") || ($assistantAppearance == "shemale") || ($assistantAppearance == "hypergoddess") || ($assistantAppearance == "succubus") || ($assistantAppearance == "incubus") || ($assistantAppearance == "witch")>> @@ -896,7 +896,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSPastoralist != "unset">> <br>''You are pursuing'' societal normalization of slave milking. - //<<link "Abandon" "Future Society">><<run removeFS("FSPastoralist")>><<if $assistantFSAppearance == "pastoralist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSPastoralist")>><<if $assistantFSAppearance == "pastoralist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSPastoralist" "clothesBoughtWestern">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "goddess") || ($assistantAppearance == "shemale") || ($assistantAppearance == "hypergoddess") || ($assistantAppearance == "incubus") || ($assistantAppearance == "succubus") || ($assistantAppearance == "witch")>> @@ -914,7 +914,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSHedonisticDecadence == "unset">> <<if $arcologies[0].FSPhysicalIdealist != "unset">> <br>''You are pursuing'' societal reverence for the idealized human form, including height, health and muscle. - //<<link "Abandon" "Future Society">><<run removeFS("FSPhysicalIdealist")>><<if $assistantFSAppearance == "physical idealist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSPhysicalIdealist")>><<if $assistantFSAppearance == "physical idealist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSPhysicalIdealist" "clothesBoughtOil">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "amazon") || ($assistantAppearance == "shemale") || ($assistantAppearance == "incubus") || ($assistantAppearance == "succubus") || ($assistantAppearance == "witch")>> @@ -933,7 +933,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSPhysicalIdealist == "unset">> <<if $arcologies[0].FSHedonisticDecadence != "unset">> <br>''You are pursuing'' societal normalization of overindulgence and immediate gratification. Be it food, drink, sex, drugs or whatever one's desire may be. - //<<link "Abandon" "Future Society">><<run removeFS("FSHedonisticDecadence")>><<if $assistantFSAppearance == "hedonistic decadence">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSHedonisticDecadence")>><<if $assistantFSAppearance == "hedonistic decadence">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSHedonisticDecadence">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "goddess") || ($assistantAppearance == "hypergoddess") || ($assistantAppearance == "preggololi") || ($assistantAppearance == "imp") || ($assistantAppearance == "incubus") || ($assistantAppearance == "succubus") || ($assistantAppearance == "witch")>> @@ -952,7 +952,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSNull == "unset">> <<if $arcologies[0].FSChattelReligionist != "unset">> <br>''You are pursuing'' a new strain of religion that emphasizes the slaveholding portions of religious history. - //<<link "Abandon" "Future Society">><<run removeFS("FSChattelReligionist")>><<if $assistantFSAppearance == "chattel religionist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSChattelReligionist")>><<if $assistantFSAppearance == "chattel religionist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSChattelReligionist" "clothesBoughtHabit">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "goddess") || ($assistantAppearance == "monstergirl") || ($assistantAppearance == "incubus") || ($assistantAppearance == "succubus") || ($assistantAppearance == "witch") || ($assistantAppearance == "angel") || ($assistantAppearance == "cherub") || ($assistantAppearance == "imp")>> @@ -971,7 +971,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if ($arcologies[0].FSAztecRevivalist == "unset") && ($arcologies[0].FSEgyptianRevivalist == "unset") && ($arcologies[0].FSEdoRevivalist == "unset") && ($arcologies[0].FSArabianRevivalist == "unset") && ($arcologies[0].FSChineseRevivalist == "unset")>> <<if $arcologies[0].FSRomanRevivalist != "unset">> <br>''You are pursuing'' a vision of a new Rome. - //<<link "Abandon" "Future Society">><<run removeFS("FSRomanRevivalist")>><<if $assistantFSAppearance == "roman revivalist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSRomanRevivalist")>><<if $assistantFSAppearance == "roman revivalist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSRomanRevivalist" "clothesBoughtToga">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "businesswoman") || ($assistantAppearance == "amazon") || ($assistantAppearance == "incubus") || ($assistantAppearance == "succubus")>> @@ -990,7 +990,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if ($arcologies[0].FSRomanRevivalist == "unset") && ($arcologies[0].FSEgyptianRevivalist == "unset") && ($arcologies[0].FSEdoRevivalist == "unset") && ($arcologies[0].FSArabianRevivalist == "unset") && ($arcologies[0].FSChineseRevivalist == "unset")>> <<if $arcologies[0].FSAztecRevivalist != "unset">> <br>''You are pursuing'' a vision of a new Aztec Empire. - //<<link "Abandon" "Future Society">><<run removeFS("FSAztecRevivalist")>><<if $assistantFSAppearance == "aztec revivalist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSAztecRevivalist")>><<if $assistantFSAppearance == "aztec revivalist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSAztecRevivalist" "clothesBoughtHuipil">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "goddess") || ($assistantAppearance == "amazon") || ($assistantAppearance == "incubus") || ($assistantAppearance == "succubus")>> @@ -1009,7 +1009,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if ($arcologies[0].FSRomanRevivalist == "unset") && ($arcologies[0].FSAztecRevivalist == "unset") && ($arcologies[0].FSEdoRevivalist == "unset") && ($arcologies[0].FSArabianRevivalist == "unset") && ($arcologies[0].FSChineseRevivalist == "unset")>> <<if $arcologies[0].FSEgyptianRevivalist != "unset">> <br>''You are pursuing'' a vision of Pharaoh's Egypt. - //<<link "Abandon" "Future Society">><<run removeFS("FSEgyptianRevivalist")>><<if $assistantFSAppearance == "egyptian revivalist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSEgyptianRevivalist")>><<if $assistantFSAppearance == "egyptian revivalist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSEgyptianRevivalist" "clothesBoughtEgypt">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "goddess") || ($assistantAppearance == "monstergirl") || ($assistantAppearance == "incubus") || ($assistantAppearance == "succubus")>> @@ -1028,7 +1028,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if ($arcologies[0].FSRomanRevivalist == "unset") && ($arcologies[0].FSAztecRevivalist == "unset") && ($arcologies[0].FSEgyptianRevivalist == "unset") && ($arcologies[0].FSArabianRevivalist == "unset") && ($arcologies[0].FSChineseRevivalist == "unset")>> <<if $arcologies[0].FSEdoRevivalist != "unset">> <br>''You are pursuing'' a vision of Edo Japan. - //<<link "Abandon" "Future Society">><<run removeFS("FSEdoRevivalist")>><<if $assistantFSAppearance == "edo revivalist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSEdoRevivalist")>><<if $assistantFSAppearance == "edo revivalist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSEdoRevivalist" "clothesBoughtKimono">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "amazon") || ($assistantAppearance == "monstergirl") || ($assistantAppearance == "loli") || ($assistantAppearance == "kitsune") || ($assistantAppearance == "incubus") || ($assistantAppearance == "succubus")>> @@ -1047,7 +1047,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if ($arcologies[0].FSRomanRevivalist == "unset") && ($arcologies[0].FSAztecRevivalist == "unset") && ($arcologies[0].FSEgyptianRevivalist == "unset") && ($arcologies[0].FSEdoRevivalist == "unset") && ($arcologies[0].FSChineseRevivalist == "unset")>> <<if $arcologies[0].FSArabianRevivalist != "unset">> <br>''You are pursuing'' a vision of the Sultanate of old. - //<<link "Abandon" "Future Society">><<run removeFS("FSArabianRevivalist")>><<if $assistantFSAppearance == "arabian revivalist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSArabianRevivalist")>><<if $assistantFSAppearance == "arabian revivalist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSArabianRevivalist" "clothesBoughtHarem">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "businesswoman") || ($assistantAppearance == "schoolgirl") || ($assistantAppearance == "incubus") || ($assistantAppearance == "succubus")>> @@ -1066,7 +1066,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if ($arcologies[0].FSRomanRevivalist == "unset") && ($arcologies[0].FSAztecRevivalist == "unset") && ($arcologies[0].FSEgyptianRevivalist == "unset") && ($arcologies[0].FSEdoRevivalist == "unset") && ($arcologies[0].FSArabianRevivalist == "unset")>> <<if $arcologies[0].FSChineseRevivalist != "unset">> <br>''You are pursuing'' a vision of ancient China. - //<<link "Abandon" "Future Society">><<run removeFS("FSChineseRevivalist")>><<if $assistantFSAppearance == "chinese revivalist">><<set $assistantFSAppearance = "default">><</if>><<ClearFacilityDecorations>><</link>>//<br> + //<<link "Abandon" "Future Society">><<run FutureSocieties.remove("FSChineseRevivalist")>><<if $assistantFSAppearance == "chinese revivalist">><<set $assistantFSAppearance = "default">><</if>><</link>>//<br> <<FSChangeDecoration "FSChineseRevivalist" "clothesBoughtQipao">> <<if $PAPublic == 1>> <<if ($assistantAppearance == "schoolgirl") || ($assistantAppearance == "monstergirl") || ($assistantAppearance == "incubus") || ($assistantAppearance == "succubus")>> @@ -1087,7 +1087,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSNull != "unset">> <br>''You are permitting <<if $arcologies[0].FSNull <= 25>>basic<<elseif $arcologies[0].FSNull <= 50>>considerable<<elseif $arcologies[0].FSNull <= 75>>advanced<<else>>absolute<</if>>'' cultural freedom in your arcology. <<if $arcologies[0].FSNull <= 25>> - //[[Abandon|Future Society][removeFS("FSNull")]]// + //[[Abandon|Future Society][FutureSocieties.remove("FSNull")]]// <<else>> //[[Withdraw|Future Society][$arcologies[0].FSNull -= 25, $FSCredits += 1]]// <</if>> @@ -1106,7 +1106,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSNull != "unset">> <br>''You are permitting <<if $arcologies[0].FSNull <= 17>>basic<<elseif $arcologies[0].FSNull <= 34>>some<<elseif $arcologies[0].FSNull <= 51>>considerable<<elseif $arcologies[0].FSNull <= 68>>great<<elseif $arcologies[0].FSNull <= 85>>advanced<<else>>absolute<</if>>'' cultural freedom in your arcology. <<if $arcologies[0].FSNull <= 20>> - //[[Abandon|Future Society][removeFS("FSNull")]]// + //[[Abandon|Future Society][FutureSocieties.remove("FSNull")]]// <<else>> //[[Withdraw|Future Society][$arcologies[0].FSNull -= 17, $FSCredits += 1]]// <</if>> @@ -1125,7 +1125,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSNull != "unset">> <br>''You are permitting <<if $arcologies[0].FSNull <= 15>>basic<<elseif $arcologies[0].FSNull <= 30>>some<<elseif $arcologies[0].FSNull <= 45>>notable<<elseif $arcologies[0].FSNull <= 60>>considerable<<elseif $arcologies[0].FSNull <= 75>>great<<elseif $arcologies[0].FSNull <= 90>>advanced<<else>>absolute<</if>>'' cultural freedom in your arcology. <<if $arcologies[0].FSNull <= 20>> - //[[Abandon|Future Society][removeFS("FSNull")]]// + //[[Abandon|Future Society][FutureSocieties.remove("FSNull")]]// <<else>> //[[Withdraw|Future Society][$arcologies[0].FSNull -= 15, $FSCredits += 1]]// <</if>> @@ -1144,7 +1144,7 @@ You are spending <<print cashFormat($FSSpending)>> each week to support your soc <<if $arcologies[0].FSNull != "unset">> <br>''You are permitting <<if $arcologies[0].FSNull <= 20>>basic<<elseif $arcologies[0].FSNull <= 40>>considerable<<elseif $arcologies[0].FSNull <= 60>>great<<elseif $arcologies[0].FSNull <= 80>>advanced<<else>>absolute<</if>>'' cultural freedom in your arcology. <<if $arcologies[0].FSNull <= 20>> - //[[Abandon|Future Society][removeFS("FSNull")]]// + //[[Abandon|Future Society][FutureSocieties.remove("FSNull")]]// <<else>> //[[Withdraw|Future Society][$arcologies[0].FSNull -= 20, $FSCredits += 1]]// <</if>> diff --git a/src/uncategorized/nextWeek.tw b/src/uncategorized/nextWeek.tw index 755f3ae730b60212efec12788c39065972d0665b..64b03fe8c148bf095b275a50d8cd198ef5184e78 100644 --- a/src/uncategorized/nextWeek.tw +++ b/src/uncategorized/nextWeek.tw @@ -1,6 +1,7 @@ :: Next Week [nobr] <<set $HackingSkillMultiplier = HackingSkillMultiplier()>> +<<set $upgradeMultiplierArcology = upgradeMultiplierArcology()>> <<if $rivalOwner != 0>> <<set _rival = $arcologies.find(function(s) { return s.rival == 1; })>> diff --git a/src/uncategorized/officeDescription.tw b/src/uncategorized/officeDescription.tw index 1ccfe6471e364b873b1339505976bf1430b3ad85..160f9ae27cdc35e6a923fc11f28c99c0592c0804 100644 --- a/src/uncategorized/officeDescription.tw +++ b/src/uncategorized/officeDescription.tw @@ -179,22 +179,7 @@ <</switch>> <</if>> <</if>> -<<if $trinkets.length > 0>> -There's a display case behind your desk, -<<if $trinkets.length > 2>> - with - <<for $i = 0; $i < $trinkets.length; $i++>> - <<if $i < $trinkets.length-1>> - $trinkets[$i], - <<else>> - and $trinkets[$i]. - <</if>> - <</for>> -<<elseif $trinkets.length > 1>> - with a couple of items: $trinkets[0], and $trinkets[1]. -<<else>> - with a single item: $trinkets[0]. -<</if>> +<<= printTrinkets()>> A small mirror resides on your desk, facing you. A $PC.visualAge year old<<if $PC.markings == "freckles">>, freckled<<elseif $PC.markings == "heavily freckled">>, densely freckled<</if>> $PC.faceShape face stares back at you. @@ -204,4 +189,3 @@ A $PC.visualAge year old<<if $PC.markings == "freckles">>, freckled<<elseif $PC. <<PlayerCrotch>> <<PlayerButt>> -<</if>> diff --git a/src/uncategorized/personalAssistantOptions.tw b/src/uncategorized/personalAssistantOptions.tw index fc0dce0614f86abddcb02a958ff2fafe00285e00..6f36e6ae36979e00306a882f572163a2ee03c941 100644 --- a/src/uncategorized/personalAssistantOptions.tw +++ b/src/uncategorized/personalAssistantOptions.tw @@ -29,11 +29,19 @@ __Computer Core Upgrades__ <br> <<if $assistantPower == 0>> - //The first upgrade needed is a switch to a holographic memory core to store the immense quantity of data $assistantName gathers. This upgrade will cost <<print cashFormat(Math.trunc(20000*$upgradeMultiplierArcology*$HackingSkillMultiplier))>>.// [[Install holographic memory core|Personal assistant options][cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology*$HackingSkillMultiplier)), "capEx"), $assistantPower += 1, $PC.engineering += 1, $PC.hacking += 1]] + The first upgrade needed is a switch to a holographic memory core to store the immense quantity of data $assistantName gathers. + //Will cost <<print cashFormat(Math.trunc(20000*$upgradeMultiplierArcology*$HackingSkillMultiplier))>>// + [[Install holographic memory core|Personal assistant options][cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology*$HackingSkillMultiplier)), "capEx"), $assistantPower += 1, $PC.engineering += 1, $PC.hacking += 1]] <<elseif $assistantPower == 1>> - //The final upgrade needed is a transition to optical RAM. This huge project will cost <<print cashFormat(Math.trunc(50000*$upgradeMultiplierArcology*$HackingSkillMultiplier))>>.// [[Install optical RAM|Personal assistant options][cashX(forceNeg(Math.trunc(50000*$upgradeMultiplierArcology*$HackingSkillMultiplier)), "capEx"), $assistantPower += 1, $PC.engineering += 1, $PC.hacking += 1]] + The next upgrade needed is a liquid nitrogen cooling system to allow for extensive overclocking. + //Will cost <<print cashFormat(Math.trunc(35000*$upgradeMultiplierArcology*$HackingSkillMultiplier))>> and will allow you to upgrade the smart piercings in $arcologies[0].name// + [[Install upgraded cooling system|Personal assistant options][cashX(forceNeg(Math.trunc(35000*$upgradeMultiplierArcology*$HackingSkillMultiplier)), "capEx"), $assistantPower += 1, $PC.engineering += 1, $PC.hacking += 1]] +<<elseif $assistantPower == 2>> + The final upgrade needed is a transition to optical RAM. + //Will cost <<print cashFormat(Math.trunc(50000*$upgradeMultiplierArcology*$HackingSkillMultiplier))>>// + [[Install optical RAM|Personal assistant options][cashX(forceNeg(Math.trunc(50000*$upgradeMultiplierArcology*$HackingSkillMultiplier)), "capEx"), $assistantPower += 1, $PC.engineering += 1, $PC.hacking += 1]] <<else>> - //The arcology's computer core is fully upgraded.// + The arcology's computer core is fully upgraded. <</if>> <br> diff --git a/src/uncategorized/rePokerNight.tw b/src/uncategorized/rePokerNight.tw index 8c4ee797e47d4325c9c6e1a525ef15da8b2a4a13..025ca0d93ee7cd9ce22239c89ca4f874aa825b34 100644 --- a/src/uncategorized/rePokerNight.tw +++ b/src/uncategorized/rePokerNight.tw @@ -95,6 +95,7 @@ On a particularly lackadaisical evening, you find yourself alerted to a message <<set $activeSlave.combatSkill = 1>> <<set $activeSlave.accent = random(0,1)>> <<set $activeSlave.behavioralFlaw = "arrogant">> + <<set $activeSlave.hLength = 1>> <<set $activeSlave.hStyle = "shaved into a mohawk">> <<set $activeSlave.customTat = "She has a number of tattoos from a variety of mercenary companies.">> <<set $activeSlave.clothes = "a military uniform">> diff --git a/src/uncategorized/reRelativeRecruiter.tw b/src/uncategorized/reRelativeRecruiter.tw index 276c4107103d8b56160866a2cf1410030da5e336..a7404b9b0374480761e3f22bc0836119b6cf8dda 100644 --- a/src/uncategorized/reRelativeRecruiter.tw +++ b/src/uncategorized/reRelativeRecruiter.tw @@ -487,6 +487,7 @@ <<set $activeSlave.inflation = 0, $activeSlave.inflationType = "none", $activeSlave.inflationMethod = 0>> <<set $activeSlave.bodySwap = 0>> <<set $activeSlave.pregControl = "none">> +<<set $activeSlave.vaginalAttachment = "none">> <<set $activeSlave.buttplugAttachment = "none">> <<run SetBellySize($activeSlave)>> <<if $activeSlave.physicalAge < 6>> diff --git a/src/uncategorized/reShelterInspection.tw b/src/uncategorized/reShelterInspection.tw index b062a258e9e2f9abf6895f7863e60eaa7fe5169c..f8aad90409a1aa075a24d8f5d86f807d0f207150 100644 --- a/src/uncategorized/reShelterInspection.tw +++ b/src/uncategorized/reShelterInspection.tw @@ -181,7 +181,7 @@ Not waiting to be greeted, the inspector looks up at the nearest camera and dema <<run cashX(forceNeg($contractCost/2), "slaveTransfer", $activeSlave)>> <<replace "#result">> You have _him2 ushered up to your office, and order _Inspectee.slaveName brought in. The inspector has a single moment to stiffen in shock at the sight before _he2 stiffens involuntarily due to the security drone tasing _him2 unconscious. It takes a few credits here and there to circumvent the Shelter's various legal and contractual defenses to prevent slaveowners from doing exactly what you're doing, but you finish the day richer by one more Fuckdoll. Odds are _he2 wants to be defiant, but the suit works perfectly and leaves _him2 no outlet to make _his2 thoughts known. - <<set $activeSlave.toyHole="all her holes", $activeSlave.pubicHStyle="waxed", $activeSlave.livingRules="spare", $activeSlave.speechRules="restrictive", $activeSlave.releaseRules="restrictive", $activeSlave.relationshipRules="restrictive", $activeSlave.fuckdoll=1, $activeSlave.choosesOwnClothes=0, $activeSlave.clothes="a Fuckdoll suit", $activeSlave.collar="none", $activeSlave.shoes="heels",$activeSlave.legAccessory="none", $activeSlave.vaginalAccessory="none", $activeSlave.dickAccessory="none", $activeSlave.buttplug="none", $activeSlave.chastityAnus = 0, $activeSlave.chastityPenis = 0, $activeSlave.chastityVagina = 0, $activeSlave.attrKnown=1, $activeSlave.fetishKnown=1>> + <<set $activeSlave.toyHole="all her holes", $activeSlave.pubicHStyle="waxed", $activeSlave.livingRules="spare", $activeSlave.speechRules="restrictive", $activeSlave.releaseRules="restrictive", $activeSlave.relationshipRules="restrictive", $activeSlave.fuckdoll=1, $activeSlave.choosesOwnClothes=0, $activeSlave.clothes="a Fuckdoll suit", $activeSlave.collar="none", $activeSlave.shoes="heels",$activeSlave.legAccessory="none", $activeSlave.vaginalAccessory="none", $activeSlave.vaginalAttachment="none", $activeSlave.dickAccessory="none", $activeSlave.buttplug="none", $activeSlave.chastityAnus = 0, $activeSlave.chastityPenis = 0, $activeSlave.chastityVagina = 0, $activeSlave.attrKnown=1, $activeSlave.fetishKnown=1>> <<set $shelterAbuse += 10>> <<set $nextButton = "Continue">><<UpdateNextButton>> /* unlock Continue button */ <<run newSlave($activeSlave)>> /* skip New Slave Intro */ diff --git a/src/uncategorized/reStaffedMorning.tw b/src/uncategorized/reStaffedMorning.tw index a4f8d3119f89cd4c5cea280dadbd31d510c7214a..969ab4616310d795f5420e36e1f80b3ea8643c29 100644 --- a/src/uncategorized/reStaffedMorning.tw +++ b/src/uncategorized/reStaffedMorning.tw @@ -8,6 +8,8 @@ <<set _bedSlaves = _bedSlaves.shuffle()>> <<setLocalPronouns _bedSlaves[0]>> <<setLocalPronouns _bedSlaves[1] 2>> +<<setLocalPronouns _bedSlaves[2] 3>> +<<setLocalPronouns _bedSlaves[3] 4>> <<setPlayerPronouns>> <<set _clothesTemp = _bedSlaves[1].clothes, _bedSlaves[1].clothes = "no clothing">> @@ -51,17 +53,13 @@ The bathroom door is open and the shower is running. Though the steam is beginni You reach down and run a possessive hand across each slave's scalp, neck, and back, eliciting shivers. Then, you gently hook them under the armpits and pull them up a bit, without breaking their lip locks with your nipples, or forcing them to stop playing with your cunt. Each slave ends curled up, mostly face-down, with their mouths still sucking on your <<if $PC.boobs == 1>>boobs<<else>>chest<</if>> and their free hands trapped between their legs. They get the message and begin to look after themselves, too; their resultant moaning against your nipples grows when you reach down and start teasing their butts. The three of you climax more or less together, and you bounce up with undiminished arousal to enjoy your shower. <</if>> <br><br> - <<setLocalPronouns _bedSlaves[2]>> - <<setLocalPronouns _bedSlaves[3] 2>> By now, the shower is an impenetrable fog of steam. The wet, soapy bodies inside are easy to find, though. _bedSlaves[2].slaveName happens to be closest, so you <<if $PC.dick == 1>> - kiss $his laughing mouth hard and fuck $him with $his back against the shower wall<<if _bedSlaves[2].boobs > 2000>>, $his huge soapy tits sliding around deliciously<</if>>. $He does $his best to soap your front while $he takes cock, and _bedSlaves[3].slaveName washes your back<<if $PC.vagina == 1>>, reaching under your butt to tease your pussy<</if>>. After a short while, you set $him down and seize _bedSlaves[3].slaveName, sliding your cock <<if _bedSlaves[3].butt > 4>>between _his2 huge buttocks and<</if>> up _his2 willing ass, taking _him2 from behind while _bedSlaves[2].slaveName does $his best to get $his wits back and take over washing duty. They towel you together, and you head back out of the bathroom. + kiss _his3 laughing mouth hard and fuck _him3 with _his3 back against the shower wall<<if _bedSlaves[2].boobs > 2000>>, _his3 huge soapy tits sliding around deliciously<</if>>. _He3 does _his3 best to soap your front while _he3 takes cock, and _bedSlaves[3].slaveName washes your back<<if $PC.vagina == 1>>, reaching under your butt to tease your pussy<</if>>. After a short while, you set _him3 down and seize _bedSlaves[3].slaveName, sliding your cock <<if _bedSlaves[3].butt > 4>>between _his4 huge buttocks and<</if>> up _his4 willing ass, taking _him4 from behind while _bedSlaves[2].slaveName does _his3 best to get _his3 wits back and take over washing duty. They towel you together, and you head back out of the bathroom. <<else>> - kiss $his laughing mouth hard and trib $him with $his back against the shower wall<<if _bedSlaves[2].boobs > 2000>>, $his huge soapy tits sliding around deliciously<</if>>. $He does $his best to soap your front while you hump $his thigh<<if _bedSlaves[2].vagina > -1>> and pussy<</if>>, and _bedSlaves[3].slaveName washes your back. After a short while, you set $him down and seize _bedSlaves[3].slaveName, pushing _his2 face against the wall and sliding your fingers inside _him2 while you straddle one of _his2 legs. _bedSlaves[2].slaveName does $his best to get $his wits back and take over washing duty. They towel you together, and you head back out of the bathroom. + kiss _his3 laughing mouth hard and trib _him3 with _his3 back against the shower wall<<if _bedSlaves[2].boobs > 2000>>, _his3 huge soapy tits sliding around deliciously<</if>>. _He3 does _his3 best to soap your front while you hump _his3 thigh<<if _bedSlaves[2].vagina > -1>> and pussy<</if>>, and _bedSlaves[3].slaveName washes your back. After a short while, you set _him3 down and seize _bedSlaves[3].slaveName, pushing _his4 face against the wall and sliding your fingers inside _him4 while you straddle one of _his4 legs. _bedSlaves[2].slaveName does _his3 best to get _his3 wits back and take over washing duty. They towel you together, and you head back out of the bathroom. <</if>> <br><br> - <<setLocalPronouns _bedSlaves[0]>> - <<setLocalPronouns _bedSlaves[1] 2>> Your clothes have been laid out, ready for _bedSlaves[0].slaveName and _bedSlaves[1].slaveName to dress you, but <<if $PC.dick == 1>> next to the neat stack of clothes, the two slaves are bent over the bed with their buttocks spread. You select _bedSlaves[1].slaveName and slide your dick up _his2 <<if _bedSlaves[1].anus > 2>>welcoming asspussy<<elseif _bedSlaves[1].anus > 1>>soft butthole<<else>>tight anus<</if>>, sodomizing _him2 while _bedSlaves[0].slaveName buttons your shirt. When it's done, you push $him down next to _bedSlaves[1].slaveName and switch assholes, letting _bedSlaves[1].slaveName up to do _his2 best to help you into your trousers in the meantime. _He2 gets them on and fastens everything, except the fly, of course. @@ -82,21 +80,17 @@ The bathroom door is open and the shower is running. Though the steam is beginni <</if>> and bounce up to fuck bitches in the shower, knocking _bedSlaves[0].slaveName to the floor and sending _bedSlaves[1].slaveName sprawling. As you go, you tell them they've got ten minutes to get your clothes laid out and their buttholes ready. They nod furiously and scramble. <br><br> - <<setLocalPronouns _bedSlaves[2]>> - <<setLocalPronouns _bedSlaves[3] 2>> By now, the shower is an impenetrable fog of steam. The wet, soapy bodies inside are easy to find, though. _bedSlaves[2].slaveName happens to be closest, so you <<if $PC.dick == 1>> - grab $him and shove $him into a corner of the shower<<if _bedSlaves[2].boobs > 2000>>, $his huge soapy tits slapping painfully against the glass<</if>>. $He does $his best to angle $his hips for you as you push your cock up $his ass and give $him a good hard reaming. _bedSlaves[3].slaveName does _his2 best to wash your back<<if $PC.vagina == 1>> and give your pussy some manual attention<</if>>, but finds _himself2 taking _bedSlaves[2].slaveName's place soon enough, smashed into the corner with your dick pistoning in and out of _his2 rectum. + grab _him3 and shove _him3 into a corner of the shower<<if _bedSlaves[2].boobs > 2000>>, _his3 huge soapy tits slapping painfully against the glass<</if>>. _He3 does _his3 best to angle _his3 hips for you as you push your cock up _his3 ass and give _him3 a good hard reaming. _bedSlaves[3].slaveName does _his4 best to wash your back<<if $PC.vagina == 1>> and give your pussy some manual attention<</if>>, but finds _himself4 taking _bedSlaves[2].slaveName's place soon enough, smashed into the corner with your dick pistoning in and out of _his4 rectum. <<else>> - grab $him and shove $him into a corner of the shower<<if _bedSlaves[2].boobs > 2000>>, $his huge soapy tits slapping painfully against the glass<</if>>. $He does $his best to angle $his hips for you as you fingerfuck $his butthole, forcing complete submission out of the compliant $girl. _bedSlaves[3].slaveName does _his2 best to wash your back, but finds _himself2 taking _bedSlaves[2].slaveName's place soon enough, smashed into the corner with your fingers pistoning in and out of _his2 rectum. + grab _him3 and shove _him3 into a corner of the shower<<if _bedSlaves[2].boobs > 2000>>, _his3 huge soapy tits slapping painfully against the glass<</if>>. _He3 does _his3 best to angle _his3 hips for you as you fingerfuck _his3 butthole, forcing complete submission out of the compliant _girl3. _bedSlaves[3].slaveName does _his4 best to wash your back, but finds _himself4 taking _bedSlaves[2].slaveName's place soon enough, smashed into the corner with your fingers pistoning in and out of _his4 rectum. <</if>> You're in a hurry, but it'll be a sad day when you aren't able to assrape a slave into total submission in five minutes. You drop _bedSlaves[3].slaveName on the shower floor and let _bedSlaves[2].slaveName towel you off. <<if $PC.dick == 0>> - _bedSlaves[3].slaveName gets to _his2 feet and helpfully holds up a strap-on questioningly; you shake your head and point to another, larger one. _He2 helps you into it, and you ram it up _his2 loosened ass experimentally, nodding in satisfaction when the big phallus forces a pained gasp out of _him2. + _bedSlaves[3].slaveName gets to _his4 feet and helpfully holds up a strap-on questioningly; you shake your head and point to another, larger one. _He4 helps you into it, and you ram it up _his4 loosened ass experimentally, nodding in satisfaction when the big phallus forces a pained gasp out of _him4. <</if>> <br><br> - <<setLocalPronouns _bedSlaves[0]>> - <<setLocalPronouns _bedSlaves[1] 2>> Back in the bedroom, your clothes have been laid out, ready for _bedSlaves[0].slaveName and _bedSlaves[1].slaveName to dress you. <<if $PC.dick == 1>> Next to the neat stack of clothes, the two slaves are bent over the bed with their buttocks spread. They're perfectly still, awaiting your pleasure. You select _bedSlaves[1].slaveName and ram your dick up _his2 <<if _bedSlaves[1].anus > 2>>welcoming asspussy<<elseif _bedSlaves[1].anus > 1>>soft butthole<<else>>tight anus<</if>>, assraping _him2 without mercy while _bedSlaves[0].slaveName buttons your shirt. When it's done, you push $him down next to _bedSlaves[1].slaveName and switch assholes, letting _bedSlaves[1].slaveName up to do _his2 best to help you into your trousers in the meantime. _He2 gets them on and fastens everything, except the fly, of course. When _bedSlaves[0].slaveName has been buttfucked into helplessness, you throw $him away like the human sex toy $he is and pound _bedSlaves[1].slaveName and then the dried-off _bedSlaves[3].slaveName and _bedSlaves[2].slaveName senseless, careful to frequently pull far enough out that the slaves have to take the pain of initial penetration again. diff --git a/src/uncategorized/remoteSurgery.tw b/src/uncategorized/remoteSurgery.tw index cf1c8e9e69441054ce8e8e83c7bbee1517c82acc..4fdb66d998953489ff483d327c1a5addaf550239 100644 --- a/src/uncategorized/remoteSurgery.tw +++ b/src/uncategorized/remoteSurgery.tw @@ -1149,11 +1149,11 @@ Work on $his sex: <<if ($activeSlave.vagina > -1) && ($activeSlave.dick > 0)>> <<if $activeSlave.indentureRestrictions < 1 && ($activeSlave.breedingMark != 1 || $propOutcome == 0)>> - | [[Remove pussy|Surgery Degradation][$activeSlave.vagina = -1,$activeSlave.ovaries = 0,$activeSlave.preg = -2,$activeSlave.pregSource = 0,$activeSlave.vaginalSkill = 0,$activeSlave.vaginalAccessory = "none",$activeSlave.chastityVagina = 0,cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave),$activeSlave.health -= 20,$surgeryType = "vaginaRemoval"]] <<if $activeSlave.ovaries == 1>>//This will remove $his ovaries as well//<</if>> + | [[Remove pussy|Surgery Degradation][$activeSlave.vagina = -1,$activeSlave.ovaries = 0,$activeSlave.preg = -2,$activeSlave.pregSource = 0,$activeSlave.vaginalSkill = 0,$activeSlave.vaginalAccessory = "none",$activeSlave.vaginalAttachment = "none",$activeSlave.chastityVagina = 0,cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave),$activeSlave.health -= 20,$surgeryType = "vaginaRemoval"]] <<if $activeSlave.ovaries == 1>>//This will remove $his ovaries as well//<</if>> <</if>> <<elseif $activeSlave.vagina > -1>> <<if $activeSlave.indentureRestrictions < 1 && ($activeSlave.breedingMark != 1 || $propOutcome == 0)>> - | [[Remove pussy|Surgery Degradation][$activeSlave.vagina = -1,$activeSlave.ovaries = 0,$activeSlave.preg = -2,$activeSlave.pregSource = 0,$activeSlave.vaginalSkill = 0,$activeSlave.vaginalAccessory = "none",$activeSlave.chastityVagina = 0,cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave),$activeSlave.health -= 20,$surgeryType = "vaginaRemoval"]] <<if $activeSlave.ovaries == 1>>//This will remove $his ovaries as well//<</if>> + | [[Remove pussy|Surgery Degradation][$activeSlave.vagina = -1,$activeSlave.ovaries = 0,$activeSlave.preg = -2,$activeSlave.pregSource = 0,$activeSlave.vaginalSkill = 0,$activeSlave.vaginalAccessory = "none",$activeSlave.vaginalAttachment = "none",$activeSlave.chastityVagina = 0,cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave),$activeSlave.health -= 20,$surgeryType = "vaginaRemoval"]] <<if $activeSlave.ovaries == 1>>//This will remove $his ovaries as well//<</if>> <</if>> <</if>> @@ -1875,7 +1875,7 @@ Work on $him structurally: <<if $activeSlave.fuckdoll == 0>> <br>$He is a normal sex slave, not a living sex toy. <<if $activeSlave.indentureRestrictions < 1 && ($activeSlave.breedingMark != 1 || $propOutcome == 0)>> - [[Encase in a Fuckdoll suit|Surgery Degradation][$activeSlave.subTarget=0, $activeSlave.sentence=0, $activeSlave.training=0, $activeSlave.toyHole="all her holes", $activeSlave.pubicHStyle="waxed", $activeSlave.livingRules="spare", $activeSlave.speechRules="restrictive", $activeSlave.releaseRules="restrictive", $activeSlave.relationshipRules="restrictive", $activeSlave.fuckdoll=1, $activeSlave.choosesOwnClothes=0, $activeSlave.clothes="a Fuckdoll suit", $activeSlave.collar="none", $activeSlave.shoes="heels",$activeSlave.legAccessory="none", $activeSlave.vaginalAccessory="none", $activeSlave.dickAccessory="none", $activeSlave.chastityAnus=0, $activeSlave.chastityPenis=0, $activeSlave.chastityVagina=0, $activeSlave.buttplug="none", $activeSlave.attrKnown=1, $activeSlave.fetishKnown=1, $activeSlave.inflation=0, $activeSlave.inflationType="none", $activeSlave.inflationMethod=0, $activeSlave.milkSource=0, $activeSlave.cumSource=0, $surgeryType = "fuckdoll"]] //This will greatly restrict $him// + [[Encase in a Fuckdoll suit|Surgery Degradation][$activeSlave.subTarget=0, $activeSlave.sentence=0, $activeSlave.training=0, $activeSlave.toyHole="all her holes", $activeSlave.pubicHStyle="waxed", $activeSlave.livingRules="spare", $activeSlave.speechRules="restrictive", $activeSlave.releaseRules="restrictive", $activeSlave.relationshipRules="restrictive", $activeSlave.fuckdoll=1, $activeSlave.choosesOwnClothes=0, $activeSlave.clothes="a Fuckdoll suit", $activeSlave.collar="none", $activeSlave.shoes="heels",$activeSlave.legAccessory="none", $activeSlave.vaginalAccessory="none", $activeSlave.vaginalAttachment="none", $activeSlave.dickAccessory="none", $activeSlave.chastityAnus=0, $activeSlave.chastityPenis=0, $activeSlave.chastityVagina=0, $activeSlave.buttplug="none", $activeSlave.attrKnown=1, $activeSlave.fetishKnown=1, $activeSlave.inflation=0, $activeSlave.inflationType="none", $activeSlave.inflationMethod=0, $activeSlave.milkSource=0, $activeSlave.cumSource=0, $surgeryType = "fuckdoll"]] //This will greatly restrict $him// <</if>> <<else>> <br>$He is encased in a Fuckdoll suit. [[Extract " + $him + "|Surgery Degradation][$activeSlave.fuckdoll=0, $activeSlave.clothes="no clothing", $activeSlave.shoes="none", $surgeryType = "fuckdollExtraction"]] diff --git a/src/uncategorized/reputation.tw b/src/uncategorized/reputation.tw index 6aabb016be8fec2a20487c172c056891f3ead47f..cc6aad833f56b3774849a3092e0b98d505d63d56 100644 --- a/src/uncategorized/reputation.tw +++ b/src/uncategorized/reputation.tw @@ -782,7 +782,7 @@ On formal occasions, you are announced as $PCTitle. <<if $eugenicsFullControl != 1>> <<if $failedElite > 300>> The Societal Elite @@.red;have departed from your arcology in disgust@@. - <<run removeFS("FSRestart")>> + <<run FutureSocieties.remove("FSRestart")>> <<run repX(-10000, "event")>> <<set $eliteFail = random(30,100), $eliteFailTimer = 15>> diff --git a/src/uncategorized/saBeYourHeadGirl.tw b/src/uncategorized/saBeYourHeadGirl.tw index e4a358bc95aaac729bc53c0c52a403ff5c964bb3..28fc9164f38dcffef7dc11ee700aacedbd418a02 100644 --- a/src/uncategorized/saBeYourHeadGirl.tw +++ b/src/uncategorized/saBeYourHeadGirl.tw @@ -12,7 +12,7 @@ serves as your Consort. Though $he is still your slave, $his status is scarcely below that of a citizen. $He @@.green;contributes to your reputation@@ just like a Concubine, and $he is @@.hotpink;conscious@@ of the @@.mediumaquamarine;trust@@ you place in $him. <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> <<silently>> - <<include "SA please you">> + <<include "SA please you">> <</silently>> <<if $slaves[$i].relationship > 4>> <<if $familyTesting == 1>> diff --git a/src/uncategorized/saGuardsYou.tw b/src/uncategorized/saGuardsYou.tw index 5b6099227f7db5a5a8ae7be6dff4e4ac74e4cc1b..03995323f17e82667890480d9560749b637ef444 100644 --- a/src/uncategorized/saGuardsYou.tw +++ b/src/uncategorized/saGuardsYou.tw @@ -158,8 +158,8 @@ $His constant presence is <<if $deadliness > 6>> extremely intimidating, @@.green;adding much to your reputation.@@ <<if $slaves[$i].career == "an arcology owner">> - You've made a one-time rival arcology owner into a deadly and loyal protector, a feat of slaveownership that's @@.green;internationally famous.@@ - <<run repX($deadliness*50, "bodyguard", $slaves[$i])>> + You've made a one-time rival arcology owner into a deadly and loyal protector, a feat of slaveownership that's @@.green;internationally famous.@@ + <<run repX($deadliness*50, "bodyguard", $slaves[$i])>> <</if>> <<elseif $deadliness > 3>> intimidating, @@.green;adding to your reputation.@@ diff --git a/src/uncategorized/saLongTermEffects.tw b/src/uncategorized/saLongTermEffects.tw index 9d5266ee9645b19f3d692ad1278451addd92387f..dc918f0ffde4d620b349b92ff18b75dc414ef5bf 100644 --- a/src/uncategorized/saLongTermEffects.tw +++ b/src/uncategorized/saLongTermEffects.tw @@ -1604,175 +1604,523 @@ <<else>> <<switch $slaves[$i].clitSetting>> <<case "none">> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing disrupts arousal, @@.red;reducing $his sex drive@@ and @@.mediumorchid;infuriating $him.@@ - <<set $slaves[$i].devotion -= 2>> - <<if $slaves[$i].energy > 5>> - <<set $slaves[$i].energy -= 10>> - <<elseif $slaves[$i].energy > 0>> - <<set $slaves[$i].energy = 0>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing disrupt arousal, @@.red;reducing $his sex drive@@ and @@.mediumorchid;infuriating $him.@@ + <<set $slaves[$i].devotion -= 3>> + <<if $slaves[$i].energy > 5>> + <<set $slaves[$i].energy -= 13>> + <<elseif $slaves[$i].energy > 0>> + <<set $slaves[$i].energy = 0>> + <</if>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy disrupt arousal, @@.red;reducing $his sex drive@@ and @@.mediumorchid;infuriating $him.@@ + <<set $slaves[$i].devotion -= 3>> + <<if $slaves[$i].energy > 5>> + <<set $slaves[$i].energy -= 13>> + <<elseif $slaves[$i].energy > 0>> + <<set $slaves[$i].energy = 0>> + <</if>> + <<else>> + disrupts arousal, @@.red;reducing $his sex drive@@ and @@.mediumorchid;infuriating $him.@@ + <<set $slaves[$i].devotion -= 2>> + <<if $slaves[$i].energy > 5>> + <<set $slaves[$i].energy -= 10>> + <<elseif $slaves[$i].energy > 0>> + <<set $slaves[$i].energy = 0>> + <</if>> <</if>> <<case "all">> <<if $slaves[$i].energy <= 95>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing encourages sex of all kinds, @@.green;increasing $his sex drive.@@ - <<set $slaves[$i].energy += 3>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing encourage sex of all kinds, @@.green;increasing $his sex drive.@@ + <<set $slaves[$i].energy += 5>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy encourage sex of all kinds, @@.green;increasing $his sex drive.@@ + <<set $slaves[$i].energy += 5>> + <<else>> + encourages sex of all kinds, @@.green;increasing $his sex drive.@@ + <<set $slaves[$i].energy += 3>> + <</if>> <</if>> <<case "women">> <<if $slaves[$i].attrXX < 95>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing successfully @@.green;increases $his attraction to girls@@ by pleasuring $him when $he's around them. - <<set $slaves[$i].attrXX += 4+$assistant+$assistant>> - <<if $slaves[$i].energy < 80>> - This has the secondary effect of slightly @@.green;enhancing $his libido.@@ - <<set $slaves[$i].energy++>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing successfully @@.green;increase $his attraction to girls@@ by pleasuring $him when $he's around them. + <<set $slaves[$i].attrXX += 6+$assistant+$assistant>> + <<if $slaves[$i].energy < 80>> + This has the secondary effect of slightly @@.green;enhancing $his libido.@@ + <<set $slaves[$i].energy += 2>> + <</if>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy successfully @@.green;increase $his attraction to girls@@ by pleasuring $him when $he's around them. + <<set $slaves[$i].attrXX += 6+$assistant+$assistant>> + <<if $slaves[$i].energy < 80>> + This has the secondary effect of slightly @@.green;enhancing $his libido.@@ + <<set $slaves[$i].energy += 2>> + <</if>> + <<else>> + successfully @@.green;increases $his attraction to girls@@ by pleasuring $him when $he's around them. + <<set $slaves[$i].attrXX += 7+$assistant+$assistant>> + <<if $slaves[$i].energy < 80>> + This has the secondary effect of slightly @@.green;enhancing $his libido.@@ + <<set $slaves[$i].energy++>> + <</if>> <</if>> <</if>> <<case "anti-women">> <<if $slaves[$i].attrXX > 0>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing successfully @@.green;suppresses $his attraction to girls@@ by making $his private parts very uncomfortable when $he's around them. - <<set $slaves[$i].attrXX -= Math.clamp($slaves[$i].attrXX-(4+$assistant+$assistant),0,100)>> - <<if $slaves[$i].energy > 0>> - This has the secondary effect of slightly @@.red;reducing $his libido.@@ - <<set $slaves[$i].energy-->> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing successfully @@.green;suppress $his attraction to girls@@ by making $his private parts very uncomfortable when $he's around them. + <<set $slaves[$i].attrXX -= Math.clamp($slaves[$i].attrXX-(6+$assistant+$assistant),0,100)>> + <<if $slaves[$i].energy > 0>> + This has the secondary effect of slightly @@.red;reducing $his libido.@@ + <<set $slaves[$i].energy -= 2>> + <</if>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy successfully @@.green;suppress $his attraction to girls@@ by making $his private parts very uncomfortable when $he's around them. + <<set $slaves[$i].attrXX -= Math.clamp($slaves[$i].attrXX-(6+$assistant+$assistant),0,100)>> + <<if $slaves[$i].energy > 0>> + This has the secondary effect of slightly @@.red;reducing $his libido.@@ + <<set $slaves[$i].energy -= 2>> + <</if>> + <<else>> + successfully @@.green;suppresses $his attraction to girls@@ by making $his private parts very uncomfortable when $he's around them. + <<set $slaves[$i].attrXX -= Math.clamp($slaves[$i].attrXX-(4+$assistant+$assistant),0,100)>> + <<if $slaves[$i].energy > 0>> + This has the secondary effect of slightly @@.red;reducing $his libido.@@ + <<set $slaves[$i].energy-->> + <</if>> <</if>> <</if>> <<case "men">> <<if $slaves[$i].attrXY < 95>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing successfully @@.green;increases $his attraction to guys@@ by pleasuring $him when $he's around cocks. - <<set $slaves[$i].attrXY += 4+$assistant+$assistant>> - <<if $slaves[$i].energy < 80>> - This has the secondary effect of slightly @@.green;enhancing $his libido.@@ - <<set $slaves[$i].energy++>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing successfully @@.green;increase $his attraction to guys@@ by pleasuring $him when $he's around cocks. + <<set $slaves[$i].attrXY += 6+$assistant+$assistant>> + <<if $slaves[$i].energy < 80>> + This has the secondary effect of slightly @@.green;enhancing $his libido.@@ + <<set $slaves[$i].energy += 2>> + <</if>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy successfully @@.green;increase $his attraction to guys@@ by pleasuring $him when $he's around cocks. + <<set $slaves[$i].attrXY += 6+$assistant+$assistant>> + <<if $slaves[$i].energy < 80>> + This has the secondary effect of slightly @@.green;enhancing $his libido.@@ + <<set $slaves[$i].energy += 2>> + <</if>> + <<else>> + successfully @@.green;increases $his attraction to guys@@ by pleasuring $him when $he's around cocks. + <<set $slaves[$i].attrXY += 4+$assistant+$assistant>> + <<if $slaves[$i].energy < 80>> + This has the secondary effect of slightly @@.green;enhancing $his libido.@@ + <<set $slaves[$i].energy++>> + <</if>> <</if>> <</if>> <<case "anti-men">> <<if $slaves[$i].attrXY > 0>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing successfully @@.green;suppresses $his attraction to guys@@ by making $his private parts very uncomfortable when $he's around them. - <<set $slaves[$i].attrXY -= Math.clamp($slaves[$i].attrXY-(4+$assistant+$assistant),0,100)>> - <<if $slaves[$i].energy > 0>> - This has the secondary effect of slightly @@.red;reducing $his libido.@@ - <<set $slaves[$i].energy-->> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing successfully @@.green;suppress $his attraction to guys@@ by making $his private parts very uncomfortable when $he's around them. + <<set $slaves[$i].attrXY -= Math.clamp($slaves[$i].attrXY-(6+$assistant+$assistant),0,100)>> + <<if $slaves[$i].energy > 0>> + This has the secondary effect of slightly @@.red;reducing $his libido.@@ + <<set $slaves[$i].energy -= 2>> + <</if>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy successfully @@.green;suppress $his attraction to guys@@ by making $his private parts very uncomfortable when $he's around them. + <<set $slaves[$i].attrXY -= Math.clamp($slaves[$i].attrXY-(6+$assistant+$assistant),0,100)>> + <<if $slaves[$i].energy > 0>> + This has the secondary effect of slightly @@.red;reducing $his libido.@@ + <<set $slaves[$i].energy -= 2>> + <</if>> + <<else>> + successfully @@.green;suppresses $his attraction to guys@@ by making $his private parts very uncomfortable when $he's around them. + <<set $slaves[$i].attrXY -= Math.clamp($slaves[$i].attrXY-(4+$assistant+$assistant),0,100)>> + <<if $slaves[$i].energy > 0>> + This has the secondary effect of slightly @@.red;reducing $his libido.@@ + <<set $slaves[$i].energy-->> + <</if>> <</if>> <</if>> <<case "vanilla">> <<if ($slaves[$i].fetish != "none") && (_fetishChangeChance > random(0,100)-20*$assistant)>> - After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing encourages many orgasms during straightforward sex, @@.coral;$his sexuality returns to normal.@@ - <<set $slaves[$i].fetish = "none", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing encourage many orgasms during straightforward sex, @@.coral;$his sexuality returns to normal.@@ + <<set $slaves[$i].fetish = "none", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy encourage many orgasms during straightforward sex, @@.coral;$his sexuality returns to normal.@@ + <<set $slaves[$i].fetish = "none", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<else>> + encourages many orgasms during straightforward sex, @@.coral;$his sexuality returns to normal.@@ + <<set $slaves[$i].fetish = "none", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + <</if>> <</if>> <<case "oral">> <<if ($slaves[$i].fetish != "cumslut")>> <<if $slaves[$i].fetishStrength >= 10>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's using $his mouth. - <<set $slaves[$i].fetishStrength -= 20>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's using $his mouth. + <<set $slaves[$i].fetishStrength -= 30>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's using $his mouth. + <<set $slaves[$i].fetishStrength -= 30>> + <<else>> + acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's using $his mouth. + <<set $slaves[$i].fetishStrength -= 20>> + <</if>> <<elseif (_fetishChangeChance > random(0,100)-20*$assistant)>> - After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing encourages many orgasms as $he performs oral sex, @@.lightcoral;$he develops a fetish for cum.@@ - <<set $slaves[$i].fetish = "cumslut", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing encourage many orgasms as $he performs oral sex, @@.lightcoral;$he develops a fetish for cum.@@ + <<set $slaves[$i].fetish = "cumslut", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy encourage many orgasms as $he performs oral sex, @@.lightcoral;$he develops a fetish for cum.@@ + <<set $slaves[$i].fetish = "cumslut", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<else>> + encourages many orgasms as $he performs oral sex, @@.lightcoral;$he develops a fetish for cum.@@ + <<set $slaves[$i].fetish = "cumslut", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + <</if>> <</if>> <<elseif ($slaves[$i].fetishStrength <= 95)>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing @@.lightcoral;advances $his oral fetish.@@ - <<set $slaves[$i].fetishStrength += 4>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing @@.lightcoral;advance $his oral fetish.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy @@.lightcoral;advance $his oral fetish.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<else>> + @@.lightcoral;advances $his oral fetish.@@ + <<set $slaves[$i].fetishStrength += 4>> + <</if>> <</if>> <<case "anal">> <<if ($slaves[$i].fetish != "buttslut")>> <<if $slaves[$i].fetishStrength >= 10>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $his rear hole is being fucked. - <<set $slaves[$i].fetishStrength -= 20>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $his rear hole is being fucked. + <<set $slaves[$i].fetishStrength -= 30>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $his rear hole is being fucked. + <<set $slaves[$i].fetishStrength -= 30>> + <<else>> + acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $his rear hole is being fucked. + <<set $slaves[$i].fetishStrength -= 20>> + <</if>> <<elseif (_fetishChangeChance > random(0,100)-20*$assistant)>> - After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing encourages many orgasms when $his ass is being stimulated, @@.lightcoral;$he develops a fetish for being an anal bottom.@@ - <<set $slaves[$i].fetish = "buttslut", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing encourage many orgasms when $his ass is being stimulated, @@.lightcoral;$he develops a fetish for being an anal bottom.@@ + <<set $slaves[$i].fetish = "buttslut", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy encourage many orgasms when $his ass is being stimulated, @@.lightcoral;$he develops a fetish for being an anal bottom.@@ + <<set $slaves[$i].fetish = "buttslut", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<else>> + encourages many orgasms when $his ass is being stimulated, @@.lightcoral;$he develops a fetish for being an anal bottom.@@ + <<set $slaves[$i].fetish = "buttslut", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + <</if>> <</if>> <<elseif ($slaves[$i].fetishStrength <= 95)>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing @@.lightcoral;advances $his anal fetish.@@ - <<set $slaves[$i].fetishStrength += 4>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing @@.lightcoral;advance $his anal fetish.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy @@.lightcoral;advance $his anal fetish.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<else>> + @@.lightcoral;advances $his anal fetish.@@ + <<set $slaves[$i].fetishStrength += 4>> + <</if>> <</if>> <<case "boobs">> <<if ($slaves[$i].fetish != "boobs")>> <<if $slaves[$i].fetishStrength >= 10>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $his tits are being touched. - <<set $slaves[$i].fetishStrength -= 20>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $his tits are being touched. + <<set $slaves[$i].fetishStrength -= 30>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $his tits are being touched. + <<set $slaves[$i].fetishStrength -= 30>> + <<else>> + acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $his tits are being touched. + <<set $slaves[$i].fetishStrength -= 20>> + <</if>> <<elseif (_fetishChangeChance > random(0,100)-20*$assistant)>> - After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing encourages many orgasms when $his nipples are being stimulated, @@.lightcoral;$he develops a fetish for $his tits.@@ - <<set $slaves[$i].fetish = "boobs", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing encourage many orgasms when $his nipples are being stimulated, @@.lightcoral;$he develops a fetish for $his tits.@@ + <<set $slaves[$i].fetish = "boobs", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy encourage many orgasms when $his nipples are being stimulated, @@.lightcoral;$he develops a fetish for $his tits.@@ + <<set $slaves[$i].fetish = "boobs", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<else>> + encourages many orgasms when $his nipples are being stimulated, @@.lightcoral;$he develops a fetish for $his tits.@@ + <<set $slaves[$i].fetish = "boobs", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + <</if>> <</if>> <<elseif ($slaves[$i].fetishStrength <= 95)>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing @@.lightcoral;advances $his boob fetish.@@ - <<set $slaves[$i].fetishStrength += 4>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing @@.lightcoral;advance $his boob fetish.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy @@.lightcoral;advance $his boob fetish.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<else>> + @@.lightcoral;advance $his boob fetish.@@ + <<set $slaves[$i].fetishStrength += 4>> + <</if>> <</if>> <<case "submissive">> <<if ($slaves[$i].fetish != "submissive")>> <<if $slaves[$i].fetishStrength >= 10>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's being held down and used. - <<set $slaves[$i].fetishStrength -= 20>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's being held down and used. + <<set $slaves[$i].fetishStrength -= 30>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's being held down and used. + <<set $slaves[$i].fetishStrength -= 30>> + <<else>> + acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's being held down and used. + <<set $slaves[$i].fetishStrength -= 20>> + <</if>> <<elseif (_fetishChangeChance > random(0,100)-20*$assistant)>> - After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing encourages many orgasms when $he is restrained, @@.lightcoral;$he develops a fetish for submission.@@ - <<set $slaves[$i].fetish = "submissive", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing encourage many orgasms when $he is restrained, @@.lightcoral;$he develops a fetish for submission.@@ + <<set $slaves[$i].fetish = "submissive", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy encourage many orgasms when $he is restrained, @@.lightcoral;$he develops a fetish for submission.@@ + <<set $slaves[$i].fetish = "submissive", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<else>> + encourages many orgasms when $he is restrained, @@.lightcoral;$he develops a fetish for submission.@@ + <<set $slaves[$i].fetish = "submissive", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + <</if>> <</if>> <<elseif ($slaves[$i].fetishStrength <= 95)>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing @@.lightcoral;advances $his submission.@@ - <<set $slaves[$i].fetishStrength += 4>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing @@.lightcoral;advance $his submission.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy @@.lightcoral;advance $his submission.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<else>> + @@.lightcoral;advances $his submission.@@ + <<set $slaves[$i].fetishStrength += 4>> + <</if>> <</if>> <<case "humiliation">> <<if ($slaves[$i].fetish != "humiliation")>> <<if $slaves[$i].fetishStrength >= 10>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's got an audience. - <<set $slaves[$i].fetishStrength -= 20>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's got an audience. + <<set $slaves[$i].fetishStrength -= 30>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's got an audience. + <<set $slaves[$i].fetishStrength -= 30>> + <<else>> + acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's got an audience. + <<set $slaves[$i].fetishStrength -= 20>> + <</if>> <<elseif (_fetishChangeChance > random(0,100)-20*$assistant)>> - After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing encourages many orgasms when $he is being humiliated, @@.lightcoral;$he develops a fetish for humiliation.@@ - <<set $slaves[$i].fetish = "humiliation", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing encourage many orgasms when $he is being humiliated, @@.lightcoral;$he develops a fetish for humiliation.@@ + <<set $slaves[$i].fetish = "humiliation", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy encourage many orgasms when $he is being humiliated, @@.lightcoral;$he develops a fetish for humiliation.@@ + <<set $slaves[$i].fetish = "humiliation", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<else>> + encourages many orgasms when $he is being humiliated, @@.lightcoral;$he develops a fetish for humiliation.@@ + <<set $slaves[$i].fetish = "humiliation", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + <</if>> <</if>> <<elseif ($slaves[$i].fetishStrength <= 95)>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing @@.lightcoral;advances $his humiliation fetish.@@ - <<set $slaves[$i].fetishStrength += 4>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing @@.lightcoral;advance $his humiliation fetish.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy @@.lightcoral;advance $his humiliation fetish.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<else>> + @@.lightcoral;advance $his humiliation fetish.@@ + <<set $slaves[$i].fetishStrength += 4>> + <</if>> <</if>> <<case "pregnancy">> <<if ($slaves[$i].fetish != "pregnancy")>> <<if $slaves[$i].fetishStrength >= 10>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he feels like $he's being bred. - <<set $slaves[$i].fetishStrength -= 20>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he feels like $he's being bred. + <<set $slaves[$i].fetishStrength -= 30>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he feels like $he's being bred. + <<set $slaves[$i].fetishStrength -= 30>> + <<else>> + acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he feels like $he's being bred. + <<set $slaves[$i].fetishStrength -= 20>> + <</if>> <<elseif (_fetishChangeChance > random(0,100)-20*$assistant)>> - After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing encourages many orgasms during <<if $PC.dick == 1>>unprotected sex<<if $PC.vagina == 1>> and <</if>><</if>><<if $PC.vagina == 1>>loving contact with the female anatomy<</if>>, @@.lightcoral;$he begins to fantasize about pregnancy.@@ - <<set $slaves[$i].fetish = "pregnancy", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing encourage many orgasms during <<if $PC.dick == 1>>unprotected sex<<if $PC.vagina == 1>> and <</if>><</if>><<if $PC.vagina == 1>>loving contact with the female anatomy<</if>>, @@.lightcoral;$he begins to fantasize about pregnancy.@@ + <<set $slaves[$i].fetish = "pregnancy", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy encourage many orgasms during <<if $PC.dick == 1>>unprotected sex<<if $PC.vagina == 1>> and <</if>><</if>><<if $PC.vagina == 1>>loving contact with the female anatomy<</if>>, @@.lightcoral;$he begins to fantasize about pregnancy.@@ + <<set $slaves[$i].fetish = "pregnancy", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<else>> + encourages many orgasms during <<if $PC.dick == 1>>unprotected sex<<if $PC.vagina == 1>> and <</if>><</if>><<if $PC.vagina == 1>>loving contact with the female anatomy<</if>>, @@.lightcoral;$he begins to fantasize about pregnancy.@@ + <<set $slaves[$i].fetish = "pregnancy", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + <</if>> <</if>> <<elseif ($slaves[$i].fetishStrength <= 95)>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing @@.lightcoral;advances $his pregnancy fetish.@@ - <<set $slaves[$i].fetishStrength += 4>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing @@.lightcoral;advance $his pregnancy fetish.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy @@.lightcoral;advance $his pregnancy fetish.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<else>> + @@.lightcoral;advances $his pregnancy fetish.@@ + <<set $slaves[$i].fetishStrength += 4>> + <</if>> <</if>> <<case "dom">> <<if ($slaves[$i].fetish != "dom")>> <<if $slaves[$i].fetishStrength >= 10>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when another slave is servicing $him. - <<set $slaves[$i].fetishStrength -= 20>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when another slave is servicing $him. + <<set $slaves[$i].fetishStrength -= 30>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when another slave is servicing $him. + <<set $slaves[$i].fetishStrength -= 30>> + <<else>> + acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when another slave is servicing $him. + <<set $slaves[$i].fetishStrength -= 20>> + <</if>> <<elseif (_fetishChangeChance > random(0,100)-20*$assistant)>> - After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing encourages many orgasms while $he's taking an active, dominant sexual role, @@.lightcoral;$he begins to enjoy dominance.@@ - <<set $slaves[$i].fetish = "dom", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing encourage many orgasms while $he's taking an active, dominant sexual role, @@.lightcoral;$he begins to enjoy dominance.@@ + <<set $slaves[$i].fetish = "dom", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy encourage many orgasms while $he's taking an active, dominant sexual role, @@.lightcoral;$he begins to enjoy dominance.@@ + <<set $slaves[$i].fetish = "dom", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<else>> + encourages many orgasms while $he's taking an active, dominant sexual role, @@.lightcoral;$he begins to enjoy dominance.@@ + <<set $slaves[$i].fetish = "dom", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + <</if>> <</if>> <<elseif ($slaves[$i].fetishStrength <= 95)>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing @@.lightcoral;advances $his dominance.@@ - <<set $slaves[$i].fetishStrength += 4>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing @@.lightcoral;advance $his dominance.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy @@.lightcoral;advance $his dominance.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<else>> + @@.lightcoral;advances $his dominance.@@ + <<set $slaves[$i].fetishStrength += 4>> + <</if>> <</if>> <<case "masochist">> <<if ($slaves[$i].fetish != "masochist")>> <<if $slaves[$i].fetishStrength >= 10>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's being hurt. - <<set $slaves[$i].fetishStrength -= 20>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's being hurt. + <<set $slaves[$i].fetishStrength -= 30>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's being hurt. + <<set $slaves[$i].fetishStrength -= 30>> + <<else>> + acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he's being hurt. + <<set $slaves[$i].fetishStrength -= 20>> + <</if>> <<elseif (_fetishChangeChance > random(0,100)-20*$assistant)>> - After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing encourages many orgasms while $he's being beaten, @@.lightcoral;$he begins to enjoy pain.@@ - <<set $slaves[$i].fetish = "masochist", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing encourage many orgasms while $he's being beaten, @@.lightcoral;$he begins to enjoy pain.@@ + <<set $slaves[$i].fetish = "masochist", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy encourage many orgasms while $he's being beaten, @@.lightcoral;$he begins to enjoy pain.@@ + <<set $slaves[$i].fetish = "masochist", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<else>> + encourages many orgasms while $he's being beaten, @@.lightcoral;$he begins to enjoy pain.@@ + <<set $slaves[$i].fetish = "masochist", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + <</if>> <</if>> <<elseif ($slaves[$i].fetishStrength <= 95)>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing @@.lightcoral;advances $his masochism.@@ - <<set $slaves[$i].fetishStrength += 4>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing @@.lightcoral;advance $his masochism.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy @@.lightcoral;advance $his masochism.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<else>> + @@.lightcoral;advances $his masochism.@@ + <<set $slaves[$i].fetishStrength += 4>> + <</if>> <</if>> <<case "sadist">> <<if ($slaves[$i].fetish != "sadist")>> <<if $slaves[$i].fetishStrength >= 10>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he witnesses or even takes part in another slave's pain. - <<set $slaves[$i].fetishStrength -= 20>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he witnesses or even takes part in another slave's pain. + <<set $slaves[$i].fetishStrength -= 30>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy act to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he witnesses or even takes part in another slave's pain. + <<set $slaves[$i].fetishStrength -= 30>> + <<else>> + acts to @@.coral;suppress $his current fetish,@@ encouraging $him to orgasm when $he witnesses or even takes part in another slave's pain. + <<set $slaves[$i].fetishStrength -= 20>> + <</if>> <<elseif (_fetishChangeChance > random(0,100)-20*$assistant)>> - After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing encourages many orgasms while $he's involved in the abuse of other slaves, @@.lightcoral;$he begins to develop a sadistic streak.@@ - <<set $slaves[$i].fetish = "sadist", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + After $his smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing encourage many orgasms while $he's involved in the abuse of other slaves, @@.lightcoral;$he begins to develop a sadistic streak.@@ + <<set $slaves[$i].fetish = "sadist", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy encourage many orgasms while $he's involved in the abuse of other slaves, @@.lightcoral;$he begins to develop a sadistic streak.@@ + <<set $slaves[$i].fetish = "sadist", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 15>> + <<else>> + encourages many orgasms while $he's involved in the abuse of other slaves, @@.lightcoral;$he begins to develop a sadistic streak.@@ + <<set $slaves[$i].fetish = "sadist", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> + <</if>> <</if>> <<elseif ($slaves[$i].fetishStrength <= 95)>> - $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing @@.lightcoral;advances $his sadism.@@ - <<set $slaves[$i].fetishStrength += 4>> + $His smart <<if $slaves[$i].vagina > -1>>clit<<else>>frenulum<</if>> piercing + <<if $slaves[$i].vaginalAccessory == "bullet vibrator">> + and the bullet vibrator $he is wearing @@.lightcoral;advance $his sadism.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<elseif $slaves[$i].vaginalAttachment == "vibrator">> + and the vibrating dildo in $his pussy @@.lightcoral;advance $his sadism.@@ + <<set $slaves[$i].fetishStrength += 6>> + <<else>> + @@.lightcoral;advances $his sadism.@@ + <<set $slaves[$i].fetishStrength += 4>> + <</if>> <</if>> <</switch>> <</if>> @@ -7616,7 +7964,7 @@ <</if>> <</if>> -<<if ($slaves[$i].hStyle != "shaved" && $slaves[$i].bald != 1 && $slaves[$i].haircuts == 0)>> +<<if (($slaves[$i].hStyle != "shaved" || $slaves[$i].hStyle != "buzzcut" || $slaves[$i].hStyle != "trimmed") && $slaves[$i].bald != 1 && $slaves[$i].haircuts == 0)>> <<if ($slaves[$i].hLength < 150)>> <<set $slaves[$i].hLength += 1>> <</if>> diff --git a/src/uncategorized/saRelationships.tw b/src/uncategorized/saRelationships.tw index b896b95ba25d7648cc75382dcd67903a6f23d313..cbbd3947f175172a9e3d329d7cbe010f67e236f1 100644 --- a/src/uncategorized/saRelationships.tw +++ b/src/uncategorized/saRelationships.tw @@ -1456,19 +1456,19 @@ <<if (_SlaveJ.oralSkill > _SlaveI.oralSkill) || ((_SlaveJ.analSkill > _SlaveI.analSkill) && (_SlaveI.anus > 0)) || ((_SlaveJ.vaginalSkill > _SlaveI.vaginalSkill) && (_SlaveI.vagina > 0) && (_SlaveJ.vagina > 0)) || (_SlaveJ.trust > _SlaveI.trust)>> _SlaveI.slaveName's <<if _SlaveI.relationship >= 5>>wife<<else>>lover<</if>> is older, more experienced, and <<if (_SlaveJ.oralSkill > _SlaveI.oralSkill)>> - better at blowjobs than $he is. They are such good slaves that the senior _girlA serves as a mentor to the junior, improving $his oral skills. + better at blowjobs than $he is. They are such good slaves that the senior _girl2 serves as a mentor to the junior, improving $his oral skills. <<set $skillIncrease = 5>><<OralSkillIncrease _SlaveI>> <<elseif (_SlaveJ.analSkill > _SlaveI.analSkill) && (_SlaveI.anus > 0)>> - better at taking a buttfuck than $he is, and they are such good slaves that the senior _girlA serves as a mentor to the junior, improving $his anal skills. + better at taking a buttfuck than $he is, and they are such good slaves that the senior _girl2 serves as a mentor to the junior, improving $his anal skills. <<set $skillIncrease = 5>><<AnalSkillIncrease _SlaveI>> <<elseif (_SlaveJ.vaginalSkill > _SlaveI.vaginalSkill) && (_SlaveI.vagina > 0) && (_SlaveJ.vagina > 0)>> - a better lover than $he is, and they are such good slaves that the senior _girlA serves as a mentor to the junior, improving $his vaginal skills. + a better lover than $he is, and they are such good slaves that the senior _girl2 serves as a mentor to the junior, improving $his vaginal skills. <<set $skillIncrease = 5>><<VaginalSkillIncrease _SlaveI>> <<elseif (_SlaveJ.trust > _SlaveI.trust)>> - a better slave than $he is, and they are such obedient slaves that the senior _girlA serves as a mentor to the junior, @@.mediumaquamarine;improving $his trust.@@ + a better slave than $he is, and they are such obedient slaves that the senior _girl2 serves as a mentor to the junior, @@.mediumaquamarine;improving $his trust.@@ <<set _SlaveI.trust += 11>> <<else>> - a more devoted slave than $he is; since they are such obedient slaves, the senior _girlA serves as a mentor to the junior, @@.mediumaquamarine;teaching $him to better serve you.@@ + a more devoted slave than $he is; since they are such obedient slaves, the senior _girl2 serves as a mentor to the junior, @@.mediumaquamarine;teaching $him to better serve you.@@ <<set _SlaveI.devotion += 2>> <</if>> <</if>> diff --git a/src/uncategorized/saRules.tw b/src/uncategorized/saRules.tw index 1f0cf11768e22c39dededd481bfe9c0080cfad0d..51a793ea3d157296c7762300f2e101c608014bbe 100644 --- a/src/uncategorized/saRules.tw +++ b/src/uncategorized/saRules.tw @@ -1,5 +1,9 @@ :: SA rules [nobr] +<<set _release = $slaves[$i].releaseRules>> + +/* TODO: may need updating to detail effects of chastity */ + <<if $slaves[$i].fuckdoll == 0>> $He <<if $slaves[$i].fetish == "mindbroken">> @@ -22,7 +26,7 @@ <<set $slaves[$i].trust -= 1>> <</if>> <<set $slaves[$i].need -= 20>> - <<elseif ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off at work, so being unable to sate $his urges doesn't affect $him seriously. <<set $slaves[$i].need -= 20>> <<else>> @@ -43,10 +47,10 @@ <<case "be the Madam">> <<set $slaves[$i].need -= ($BrothiIDs.length*10)>> <<if $slaves[$i].energy <= 20>> - is frigid and has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].need < $slaves[$i].energy*0.5>> - <<if ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off at work, so being forbidden from masturbation doesn't really bother $him. <<set $slaves[$i].need -= 20>> <<else>> @@ -54,14 +58,14 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> willingly begs you to <<saRulesPlayerFetishPlay>> whenever $he crosses paths with you. <<saRulesPlayerEnergy>> <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion < 80)>> is a little disappointed that $he's limited to $his hands and toys, but @@.mediumaquamarine;trusts you know what's best for $him.@@ <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> @@ -95,7 +99,7 @@ <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> <<if ($universalRulesConsent == 0)>> - <<if ($slaves[$i].releaseRules != "restrictive")>> + <<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $BrothiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for leaving plentiful outlets for $his nymphomania under $his care. @@ -173,7 +177,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -208,7 +212,7 @@ <<set $slaves[$i].trust -= 1>> <</if>> <<set $slaves[$i].need -= 20>> - <<elseif ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off at work, so being forbidden to masturbate doesn't affect $him seriously. <<set $slaves[$i].need -= 20>> <<else>> @@ -216,7 +220,7 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> refuses to come up to the penthouse for sexual release, and is @@.gold;severely punished@@ for illicit masturbation. <<set $slaves[$i].trust -= 2>> @@ -235,7 +239,7 @@ <</if>> /* closes $slaves[$i].devotion > 50 */ <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if $slaves[$i].sexualFlaw == "attention whore">> @@.hotpink;enjoys being allowed to masturbate,@@ especially since it's often to the pleasure of an aroused client. <<set $slaves[$i].devotion += 1, $slaves[$i].need = 0>> @@ -264,7 +268,7 @@ <<else>> /* releaseRules not restrictive */ <<if ($universalRulesConsent == 0)>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -272,7 +276,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than demanding sex from other slaves or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -292,7 +296,7 @@ <</if>> <<else>> /* universalRulesConsent is not zero */ <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than asking other slaves for sex or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -300,7 +304,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than trading sex with other slaves or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -386,7 +390,7 @@ Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind. <</if>> <</if>> - <<elseif ($slaves[$i].releaseRules != "restrictive")>> + <<elseif (_release != "restrictive" && _release != "chastity" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $BrothiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania. @@ -481,7 +485,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -528,10 +532,10 @@ <</if>> <<case "be the DJ">> <<if $slaves[$i].energy <= 20>> - is frigid and has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].need < $slaves[$i].energy*0.5>> - <<if ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off at work, so being forbidden from masturbation doesn't really bother $him. <<set $slaves[$i].need -= 20>> <<else>> @@ -539,14 +543,14 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> willingly begs you to <<saRulesPlayerFetishPlay>> whenever $he crosses paths with you. <<saRulesPlayerEnergy>> <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion < 80)>> is a little disappointed that $he's limited to $his hands and toys, but @@.mediumaquamarine;trusts you know what's best for $him.@@ <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> @@ -580,7 +584,7 @@ <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> <<if ($universalRulesConsent == 0)>> - <<if ($slaves[$i].releaseRules != "restrictive")>> + <<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $ClubiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for leaving plentiful, tantalizing, outlets for $his nymphomania under $his care. @@ -666,7 +670,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -701,7 +705,7 @@ <<set $slaves[$i].trust -= 1>> <</if>> <<set $slaves[$i].need -= 20>> - <<elseif ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off at work, so being forbidden to masturbate doesn't affect $him seriously. <<set $slaves[$i].need -= 20>> <<else>> @@ -709,7 +713,7 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> refuses to come up to the penthouse for sexual release, and is @@.gold;severely punished@@ for illicit masturbation. <<set $slaves[$i].trust -= 2>> @@ -728,7 +732,7 @@ <</if>> /* closes $slaves[$i].devotion > 50 */ <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if $slaves[$i].sexualFlaw == "attention whore">> @@.hotpink;enjoys being allowed to masturbate,@@ especially since its often on stage for $clubName's amusement. <<set $slaves[$i].devotion += 1, $slaves[$i].need = 0>> @@ -757,7 +761,7 @@ <<else>> /* releaseRules not restrictive */ <<if ($universalRulesConsent == 0)>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -765,7 +769,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than demanding sex from other slaves or offering $himself up, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -785,7 +789,7 @@ <</if>> <<else>> /* universalRulesConsent is not zero */ <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than asking other slaves for sex or offering $himself to patrons, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -793,7 +797,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than trading sex with other slaves or offering $himself up, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -851,7 +855,7 @@ Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind. <</if>> <</if>> - <<elseif ($slaves[$i].releaseRules != "restrictive")>> + <<elseif (_release != "restrictive" && _release != "chastity" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $ClubiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania. @@ -946,7 +950,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, often on stage during a dance, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -994,10 +998,10 @@ <<case "be the Nurse">> <<set $slaves[$i].need -= ($CliniciIDs.length*3)>> <<if $slaves[$i].energy <= 20>> - is frigid and has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].need < $slaves[$i].energy*0.5>> - <<if ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off at work, so being forbidden from masturbation doesn't really bother $him. <<set $slaves[$i].need -= 20>> <<else>> @@ -1005,14 +1009,14 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> willingly begs you to <<saRulesPlayerFetishPlay>> whenever $he crosses paths with you. <<saRulesPlayerEnergy>> <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion < 80)>> is a little disappointed that $he's limited to $his hands and toys, but @@.mediumaquamarine;trusts you know what's best for $him.@@ <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> @@ -1046,7 +1050,7 @@ <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> <<if ($universalRulesConsent == 0)>> - <<if ($slaves[$i].releaseRules != "restrictive")>> + <<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $slaves.length > 5>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;happily avails@@ $himself to any slaves visiting the patients under $his care. @@ -1124,7 +1128,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<else>> a quick climax from a vibrator, @@ -1151,10 +1155,10 @@ <<set _lover = 0>> <</if>> <<if $slaves[$i].devotion < -50>> - is so unhappy that $he has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is so unhappy that $he has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].energy <= 20>> - is frigid and has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].relationship == -3>> is well taken care of during $his stay in $clinicName; you make sure your wife's every sexual need is handled personally. @@ -1183,7 +1187,7 @@ /* possible cumflation code here */ <</if>> <<set $slaves[$i].need -= 60>> - <<elseif ($slaves[$i].releaseRules == "masturbation") || ($slaves[$i].releaseRules == "permissive")>> + <<elseif (_release == "masturbation") || (_release == "permissive")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> takes solace in $his permission to masturbate rather than being forced to seek other means of release, @@.mediumaquamarine;reducing $his fear@@ of you. <<set $slaves[$i].trust += 2, $slaves[$i].need = 0>> @@ -1287,7 +1291,7 @@ <<else>> Under the rules, $he will find $himself constantly molested by other slaves once $he leaves $clinicName, but $he's already in such constant terror it that it doesn't cross $his mind. <</if>> - <<elseif ($slaves[$i].releaseRules != "restrictive")>> + <<elseif (_release != "restrictive" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;eagerly takes the opportunity@@ whenever visiting slaves are present. <<set $slaves[$i].devotion += 1>> @@ -1363,7 +1367,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -1406,20 +1410,20 @@ <<case "be the Wardeness">> <<set $slaves[$i].need -= ($CellBiIDs.length*5)>> <<if $slaves[$i].energy <= 20>> - is frigid and has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].need < $slaves[$i].energy*0.5>> gets off at work, so $he doesn't feel the need for release that often. <<set $slaves[$i].need -= 20>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> willingly begs you to <<saRulesPlayerFetishPlay>> whenever $he crosses paths with you. <<saRulesPlayerEnergy>> <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> opts to @@.mediumaquamarine;take advantage of the prisoners@@ to <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<saRulesRapeFetish>> @@ -1487,7 +1491,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -1659,10 +1663,10 @@ <<case "be the Attendant">> <<set $slaves[$i].need -= ($SpaiIDs.length*3)>> <<if $slaves[$i].energy <= 20>> - is frigid and has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].need < $slaves[$i].energy*0.5>> - <<if ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off while relieving $his charges, so being forbidden from masturbation doesn't really bother $him. <<set $slaves[$i].need -= 20>> <<else>> @@ -1670,14 +1674,14 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> willingly begs you to <<saRulesPlayerFetishPlay>> whenever $he crosses paths with you. <<saRulesPlayerEnergy>> <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion < 80)>> is a little disappointed that $he's limited to $his hands, creams and toys, but @@.mediumaquamarine;trusts you know what's best for $him.@@ <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> @@ -1711,7 +1715,7 @@ <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> <<if ($universalRulesConsent == 0)>> - <<if ($slaves[$i].releaseRules != "restrictive")>> + <<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $SpaiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for all the warm, moist bodies lounging around $spaName. @@ -1784,7 +1788,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -1828,7 +1832,7 @@ <</if>> <<set $slaves[$i].need -= 60>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> refuses to come up to the penthouse for sexual release, or to beg to share a bath with you, and is @@.gold;severely punished@@ for illicit masturbation. <<set $slaves[$i].trust -= 2>> @@ -1847,7 +1851,7 @@ <</if>> /* closes $slaves[$i].devotion > 50 */ <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> takes solace in $his permission to masturbate rather than being forced to beg for sex, @@.mediumaquamarine;reducing $his fear@@ of you. <<set $slaves[$i].trust += 2, $slaves[$i].need = 0>> @@ -1873,7 +1877,7 @@ <<else>> /* releaseRules not restrictive */ <<if ($universalRulesConsent == 0)>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -1881,7 +1885,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than demanding sex from other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -1901,7 +1905,7 @@ <</if>> <<else>> /* universalRulesConsent is not zero */ <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than asking other slaves for sex or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -1909,7 +1913,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than trading sex with other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -2018,7 +2022,7 @@ Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind. <</if>> <</if>> - <<elseif ($slaves[$i].releaseRules != "restrictive")>> + <<elseif (_release != "restrictive" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $SpaiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania. @@ -2108,7 +2112,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -2156,10 +2160,10 @@ <<case "be the Matron">> <<set $slaves[$i].need -= ($NurseryiIDs.length*3)>> <<if $slaves[$i].energy <= 20>> - is frigid and has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].need < $slaves[$i].energy*0.5>> - <<if ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off while relieving $his charges, so being forbidden from masturbation doesn't really bother $him. <<set $slaves[$i].need -= 20>> <<else>> @@ -2167,14 +2171,14 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> willingly begs you to <<saRulesPlayerFetishPlay>> whenever $he crosses paths with you. <<saRulesPlayerEnergy>> <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion < 80)>> is a little disappointed that $he's limited to $his hands, creams and toys, but @@.mediumaquamarine;trusts you know what's best for $him.@@ <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> @@ -2208,7 +2212,7 @@ <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> <<if ($universalRulesConsent == 0)>> - <<if ($slaves[$i].releaseRules != "restrictive")>> + <<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $NurseryiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for all the nannies busily scurrying around $nurseryName. @@ -2281,7 +2285,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -2325,7 +2329,7 @@ <</if>> <<set $slaves[$i].need -= 60>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> refuses to come up to the penthouse for sexual release and is @@.gold;severely punished@@ for illicit masturbation. <<set $slaves[$i].trust -= 2>> @@ -2344,7 +2348,7 @@ <</if>> /* closes $slaves[$i].devotion > 50 */ <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> takes solace in $his permission to masturbate rather than being forced to beg for sex, @@.mediumaquamarine;reducing $his fear@@ of you. <<set $slaves[$i].trust += 2, $slaves[$i].need = 0>> @@ -2370,7 +2374,7 @@ <<else>> /* releaseRules not restrictive */ <<if ($universalRulesConsent == 0)>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -2378,7 +2382,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than demanding sex from other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -2398,7 +2402,7 @@ <</if>> <<else>> /* universalRulesConsent is not zero */ <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than asking other slaves for sex or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -2406,7 +2410,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than trading sex with other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -2515,7 +2519,7 @@ Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind. <</if>> <</if>> - <<elseif ($slaves[$i].releaseRules != "restrictive")>> + <<elseif (_release != "restrictive" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $NurseryiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania. @@ -2610,7 +2614,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -2669,10 +2673,10 @@ <</if>> <<set $slaves[$i].oralCount += _sexLessons, $oralTotal += _sexLessons>> <<if $slaves[$i].energy <= 20>> - is frigid and has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].need < $slaves[$i].energy*0.5>> - <<if ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off with $his students, so being forbidden from masturbation doesn't really bother $him. <<set $slaves[$i].need -= 20>> <<else>> @@ -2680,14 +2684,14 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> willingly begs you to <<saRulesPlayerFetishPlay>> in front of $his class when ever $he crosses paths with you. <<saRulesPlayerEnergy>> <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion < 80)>> is a little disappointed that $he's limited to $his hands and toys outside of class, but @@.mediumaquamarine;trusts you know what's best for $him.@@ <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> @@ -2721,7 +2725,7 @@ <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> <<if ($universalRulesConsent == 0)>> - <<if ($slaves[$i].releaseRules != "restrictive")>> + <<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $SchlRiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for giving $him plentiful teacher's assistants for $his nymphomania. @@ -2799,7 +2803,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -2867,7 +2871,7 @@ <<set $slaves[$i].trust -= 1>> <</if>> <<set $slaves[$i].need -= 20>> - <<elseif ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off during class, so being forbidden to masturbate doesn't affect $him seriously. <<set $slaves[$i].need -= 20>> <<else>> @@ -2875,7 +2879,7 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> refuses to come to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation. <<set $slaves[$i].trust -= 2>> @@ -2894,7 +2898,7 @@ <</if>> /* closes $slaves[$i].devotion > 50 */ <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> takes solace in $his permission to masturbate rather than being forced to beg for sex, @@.mediumaquamarine;reducing $his fear@@ of you. <<set $slaves[$i].trust += 2, $slaves[$i].need = 0>> @@ -2920,7 +2924,7 @@ <<else>> /* releaseRules not restrictive */ <<if ($universalRulesConsent == 0)>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -2928,7 +2932,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than demanding sex from other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -2948,7 +2952,7 @@ <</if>> <<else>> /* universalRulesConsent is not zero */ <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than asking other slaves for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -2956,7 +2960,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than trading sex with other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -3015,7 +3019,7 @@ Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind. <</if>> <</if>> - <<elseif ($slaves[$i].releaseRules != "restrictive")>> + <<elseif (_release != "restrictive" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $SchlRiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania. @@ -3110,7 +3114,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -3158,10 +3162,10 @@ <<case "be the Stewardess">> <<set $slaves[$i].need -= $ServQiIDs.length*10>> <<if $slaves[$i].energy <= 20>> - is frigid and has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].need < $slaves[$i].energy*0.5>> - <<if ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off while performing $his duties, so being forbidden from masturbation doesn't really bother $him. <<set $slaves[$i].need -= 20>> <<else>> @@ -3169,14 +3173,14 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> willingly begs you to <<saRulesPlayerFetishPlay>> whenever $he crosses paths with you. <<saRulesPlayerEnergy>> <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion < 80)>> is a little disappointed that $he's limited to $his hands and toys, but @@.mediumaquamarine;trusts you know what's best for $him.@@ <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> @@ -3210,7 +3214,7 @@ <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> <<if ($universalRulesConsent == 0)>> - <<if ($slaves[$i].releaseRules != "restrictive")>> + <<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $ServQiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for leaving plentiful outlets for $his nymphomania under $his charge. @@ -3288,7 +3292,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -3324,7 +3328,7 @@ <<set $slaves[$i].trust -= 1>> <</if>> <<set $slaves[$i].need -= 20>> - <<elseif ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off at work, so being forbidden to masturbate doesn't affect $him seriously. <<set $slaves[$i].need -= 20>> <<else>> @@ -3332,7 +3336,7 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> refuses to offer $himself to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation. <<set $slaves[$i].trust -= 2>> @@ -3351,7 +3355,7 @@ <</if>> /* closes $slaves[$i].devotion > 50 */ <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> takes solace in $his permission to masturbate rather than being forced to beg for sex, @@.mediumaquamarine;reducing $his fear@@ of you. <<set $slaves[$i].trust += 2, $slaves[$i].need = 0>> @@ -3377,7 +3381,7 @@ <<else>> /* releaseRules not restrictive */ <<if ($universalRulesConsent == 0)>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -3385,7 +3389,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than demanding sex from other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -3405,7 +3409,7 @@ <</if>> <<else>> /* universalRulesConsent is not zero */ <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than asking other slaves for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -3413,7 +3417,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than trading sex with other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -3528,7 +3532,7 @@ Under the rules and $his job, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind. <</if>> <</if>> - <<elseif ($slaves[$i].releaseRules != "restrictive")>> + <<elseif (_release != "restrictive" && _release != "chastity")>> Under the rules, $he's allowed to demand that other slaves to get $him off, but only when $he's finished $his shift. $He still @@.hotpink;adores@@ having the option. <<set $slaves[$i].devotion += 1>> <</if>> @@ -3601,7 +3605,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -3649,10 +3653,10 @@ <<case "be the Milkmaid">> <<set $slaves[$i].need -= $DairyiIDs.length*5>> <<if $slaves[$i].energy <= 20>> - is frigid and has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].need < $slaves[$i].energy*0.5>> - <<if ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off while performing $his duties, so being forbidden from masturbation doesn't really bother $him. <<set $slaves[$i].need -= 20>> <<else>> @@ -3660,14 +3664,14 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> willingly begs you to <<saRulesPlayerFetishPlay>> whenever you inspect $dairyName. <<saRulesPlayerEnergy>> <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion < 80)>> is a little disappointed that $he's limited to $his hands and toys when off duty, but @@.mediumaquamarine;trusts you know what's best for $him.@@ <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> @@ -3701,7 +3705,7 @@ <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> <<if ($universalRulesConsent == 0)>> - <<if ($slaves[$i].releaseRules != "restrictive")>> + <<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $DairyiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for leaving plentiful outlets for $his nymphomania under $his charge. @@ -3774,7 +3778,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -3812,10 +3816,10 @@ <</if>> <<else>> <<if $slaves[$i].devotion < -50>> - is so unhappy that $he has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is so unhappy that $he has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].energy <= 20>> - is frigid and has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].need < $slaves[$i].energy*0.5>> <<if ($slaves[$i].devotion <= 20)>> @@ -3826,7 +3830,7 @@ <<set $slaves[$i].trust -= 1>> <</if>> <<set $slaves[$i].need -= 20>> - <<elseif ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off from being milked, so being forbidden to masturbate doesn't affect $him seriously. <<set $slaves[$i].need -= 20>> <<else>> @@ -3834,7 +3838,7 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> refuses to come to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation. <<set $slaves[$i].trust -= 2>> @@ -3853,7 +3857,7 @@ <</if>> /* closes $slaves[$i].devotion > 50 */ <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> takes solace in $his permission to masturbate rather than being forced to beg for sex, @@.mediumaquamarine;reducing $his fear@@ of you. <<set $slaves[$i].trust += 2, $slaves[$i].need = 0>> @@ -3879,7 +3883,7 @@ <<else>> /* releaseRules not restrictive */ <<if ($universalRulesConsent == 0)>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -3887,7 +3891,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than demanding sex from other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -3907,7 +3911,7 @@ <</if>> <<else>> /* universalRulesConsent is not zero */ <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than asking other slaves for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -3915,7 +3919,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than trading sex with other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -4055,7 +4059,7 @@ Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind. <</if>> <</if>> - <<elseif ($slaves[$i].releaseRules != "restrictive")>> + <<elseif (_release != "restrictive" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $DairyiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves to get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania. @@ -4150,7 +4154,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -4194,10 +4198,10 @@ <<case "be the Farmer">> <<set $slaves[$i].need -= $FarmyardiIDs.length*5>> <<if $slaves[$i].energy <= 20>> - is frigid and has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].need < $slaves[$i].energy*0.5>> - <<if ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off while performing $his duties, so being forbidden from masturbation doesn't really bother $him. <<set $slaves[$i].need -= 20>> <<else>> @@ -4205,14 +4209,14 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> willingly begs you to <<saRulesPlayerFetishPlay>> whenever you inspect $farmyardName. <<saRulesPlayerEnergy>> <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion < 80)>> is a little disappointed that $he's limited to $his hands and toys when off duty, but @@.mediumaquamarine;trusts you know what's best for $him.@@ <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> @@ -4246,7 +4250,7 @@ <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> <<if ($universalRulesConsent == 0)>> - <<if ($slaves[$i].releaseRules != "restrictive")>> + <<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $FarmyardiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for leaving plentiful outlets for $his nymphomania under $his charge. @@ -4324,7 +4328,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -4345,10 +4349,10 @@ <</if>> <<case "work as a farmhand">> <<if $slaves[$i].devotion < -50>> - is so unhappy that $he has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is so unhappy that $he has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].energy <= 20>> - is frigid and has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].need < $slaves[$i].energy*0.5>> <<if ($slaves[$i].devotion <= 20)>> @@ -4359,7 +4363,7 @@ <<set $slaves[$i].trust -= 1>> <</if>> <<set $slaves[$i].need -= 20>> - <<elseif ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off from working as a farmhand, so being forbidden to masturbate doesn't affect $him seriously. <<set $slaves[$i].need -= 20>> <<else>> @@ -4367,7 +4371,7 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> refuses to come to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation. <<set $slaves[$i].trust -= 2>> @@ -4386,7 +4390,7 @@ <</if>> /* closes $slaves[$i].devotion > 50 */ <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> takes solace in $his permission to masturbate rather than being forced to beg for sex, @@.mediumaquamarine;reducing $his fear@@ of you. <<set $slaves[$i].trust += 2, $slaves[$i].need = 0>> @@ -4412,7 +4416,7 @@ <<else>> /* releaseRules not restrictive */ <<if ($universalRulesConsent == 0)>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -4420,7 +4424,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than demanding sex from other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -4440,7 +4444,7 @@ <</if>> <<else>> /* universalRulesConsent is not zero */ <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than asking other slaves for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -4448,7 +4452,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than trading sex with other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -4587,7 +4591,7 @@ Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind. <</if>> <</if>> - <<elseif ($slaves[$i].releaseRules != "restrictive")>> + <<elseif (_release != "restrictive" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $FarmyardiIDs.length > 2>> Under the rules, $he's allowed to demand that other slaves to get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania. @@ -4682,7 +4686,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -4773,7 +4777,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<else>> immediate sex with you, @@ -4809,7 +4813,7 @@ <<set $slaves[$i].trust -= 1>> <</if>> <<set $slaves[$i].need -= 20>> - <<elseif ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off regularly, so being forbidden to masturbate doesn't affect $him seriously. <<set $slaves[$i].need -= 20>> <<else>> @@ -4902,7 +4906,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<else>> immediate sex with you, @@ -4961,7 +4965,7 @@ <<set $slaves[$i].trust -= 1>> <</if>> <<set $slaves[$i].need -= 20>> - <<elseif ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off with $HeadGirl.slaveName, so being forbidden to masturbate doesn't affect $him seriously. <<set $slaves[$i].need -= 20>> <<else>> @@ -5049,7 +5053,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $activeSlave.releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -5096,10 +5100,10 @@ <</if>> <<default>> <<if $slaves[$i].devotion < -50>> - is so unhappy that $he has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is so unhappy that $he has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].energy <= 20>> - is frigid and has little interest in getting off<<if ($slaves[$i].releaseRules != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. + is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>. <<set $slaves[$i].need = 0>> <<elseif $slaves[$i].need < $slaves[$i].energy*0.5>> <<if ($slaves[$i].devotion <= 20)>> @@ -5110,7 +5114,7 @@ <<set $slaves[$i].trust -= 1>> <</if>> <<set $slaves[$i].need -= 20>> - <<elseif ($slaves[$i].releaseRules != "permissive") && ($slaves[$i].releaseRules != "masturbation") && ($slaves[$i].releaseRules != "chastity")>> + <<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>> gets off at work, so being forbidden to masturbate doesn't affect $him seriously. <<set $slaves[$i].need -= 20>> <<else>> @@ -5118,7 +5122,7 @@ <<set $slaves[$i].need -= 20>> <</if>> <<else>> - <<if ($slaves[$i].releaseRules == "restrictive")>> + <<if (_release == "restrictive" || _release == "chastity")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> refuses to come to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation. <<set $slaves[$i].trust -= 2>> @@ -5137,7 +5141,7 @@ <</if>> /* closes $slaves[$i].devotion > 50 */ <<saRulesPlayerDiscoversFetish>> <<saRulesPlayerDrugEffects>> - <<elseif ($slaves[$i].releaseRules == "masturbation")>> + <<elseif (_release == "masturbation")>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> takes solace in $his permission to masturbate rather than being forced to beg for sex, @@.mediumaquamarine;reducing $his fear@@ of you. <<set $slaves[$i].trust += 2, $slaves[$i].need = 0>> @@ -5163,7 +5167,7 @@ <<else>> /* releaseRules not restrictive */ <<if ($universalRulesConsent == 0)>> <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -5171,7 +5175,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than demanding sex from other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -5191,7 +5195,7 @@ <</if>> <<else>> /* universalRulesConsent is not zero */ <<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than asking other slaves for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -5199,7 +5203,7 @@ <<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>> <</if>> <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($slaves[$i].releaseRules == "permissive")>> + <<if (_release == "permissive")>> prefers to masturbate rather than trading sex with other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you. <<set $slaves[$i].trust += 1, $slaves[$i].need = 0>> <<else>> @@ -5336,7 +5340,7 @@ Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind. <</if>> <</if>> - <<elseif ($slaves[$i].releaseRules != "restrictive")>> + <<elseif (_release != "restrictive" && _release != "chastity")>> <<if ($slaves[$i].energy > 95)>> <<if $slaves.length > 2 || $menials > 0>> Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania. @@ -5431,7 +5435,7 @@ <<set $slaves[$i].devotion += _rewards*2>> <<case "orgasm">> $He's @@.hotpink;rewarded@@ with - <<if $slaves[$i].clitPiercing >= 3>> + <<if $slaves[$i].clitPiercing == 3>> sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, <<elseif $slaves[$i].releaseRules == "sapphic">> immediate sex with any nearby slave, @@ -5476,7 +5480,7 @@ <<set $slaves[$i].trust -= _punishments>> <</switch>> <</if>> - <<if $subSlaves > 0 && ($slaves[$i].releaseRules == "permissive" || $slaves[$i].releaseRules == "sapphic") && $slaves[$i].assignment != "serve your other slaves">> + <<if $subSlaves > 0 && (_release == "permissive" || $slaves[$i].releaseRules == "sapphic") && $slaves[$i].assignment != "serve your other slaves">> <<set $slaves[$i].need -= (20*$subSlave)>> /* make those serve your other slaves do some work for once */ <</if>> <</switch>> diff --git a/src/uncategorized/saServeThePublic.tw b/src/uncategorized/saServeThePublic.tw index 9971ea05ca7a95c44915499319d536294b6f0409..de9dab8a4202e71ec78f1a2216d5c946808e74a7 100644 --- a/src/uncategorized/saServeThePublic.tw +++ b/src/uncategorized/saServeThePublic.tw @@ -830,9 +830,9 @@ $His appearance attracted $beauty members of the public (<<print Math.trunc($bea A few of $his fans recognize $him and eagerly make use of $him. <</if>> -<<if ($slaves[$i].clitPiercing > 2) && ($slaves[$i].devotion >= -20)>> +<<if ($slaves[$i].clitPiercing == 3) && ($slaves[$i].devotion >= -20)>> Almost everyone loves $his orgasms encouraged by $his smart piercing. -<<elseif ($slaves[$i].clitPiercing > 2)>> +<<elseif ($slaves[$i].clitPiercing == 3)>> Almost everyone appreciates $his reduced reluctance caused by $his smart piercing. <</if>> diff --git a/src/uncategorized/saWhore.tw b/src/uncategorized/saWhore.tw index 75cc0e9771affd85c1521cf2cedf5ec325e000d8..19ad644826b6c9b4e6221abb8fbe96bae72cc7e9 100644 --- a/src/uncategorized/saWhore.tw +++ b/src/uncategorized/saWhore.tw @@ -745,9 +745,9 @@ $His appearance attracted $beauty customers (<<print Math.trunc($beauty/7)>> a d <</if>> <</if>> -<<if ($slaves[$i].clitPiercing > 2) && ($slaves[$i].devotion >= -20)>> +<<if ($slaves[$i].clitPiercing == 3) && ($slaves[$i].devotion >= -20)>> Almost everyone loves $his enthusiasm for sex encouraged by $his smart piercing. -<<elseif ($slaves[$i].clitPiercing > 2)>> +<<elseif ($slaves[$i].clitPiercing == 3)>> Almost everyone appreciates $his reduced reluctance towards sex encouraged by $his smart piercing. <</if>> diff --git a/src/uncategorized/scheduledEvent.tw b/src/uncategorized/scheduledEvent.tw index 385177ae8ff85c1d643aab57bee5bb996b020bf3..6d9c95ec11bb3e296d5f22be7db86a9630caac5b 100644 --- a/src/uncategorized/scheduledEvent.tw +++ b/src/uncategorized/scheduledEvent.tw @@ -18,46 +18,46 @@ <<set $activeSlave = getSlave($retiree), $retiree = 0>> <<include "Remove activeSlave">> <<for $i = 0; $i < $slaves.length; $i++>> - <<if $slaves[$i].indenture < 0>> - <<if $slaves[$i].actualAge >= $retirementAge && $PhysicalRetirementAgePolicy != 1>> - <<set $retiree = $slaves[$i].ID>> - <<break>> - <</if>> - <<if $slaves[$i].physicalAge >= $retirementAge && $PhysicalRetirementAgePolicy == 1>> - <<set $retiree = $slaves[$i].ID>> - <<break>> - <</if>> - <<if $SexMilestoneRetirement == 1>> - <<if $slaves[$i].oralCount + $slaves[$i].analCount + $slaves[$i].vaginalCount + $slaves[$i].penetrativeCount + $slaves[$i].mammaryCount >= $retirementSex>> - <<set $retiree = $slaves[$i].ID>> - <<break>> - <</if>> - <</if>> - <<if $MilkMilestoneRetirement == 1>> - <<if $slaves[$i].milk >= $retirementMilk>> - <<set $retiree = $slaves[$i].ID>> - <<break>> + <<if $slaves[$i].indenture < 0>> + <<if $slaves[$i].actualAge >= $retirementAge && $PhysicalRetirementAgePolicy != 1>> + <<set $retiree = $slaves[$i].ID>> + <<break>> + <</if>> + <<if $slaves[$i].physicalAge >= $retirementAge && $PhysicalRetirementAgePolicy == 1>> + <<set $retiree = $slaves[$i].ID>> + <<break>> + <</if>> + <<if $SexMilestoneRetirement == 1>> + <<if $slaves[$i].oralCount + $slaves[$i].analCount + $slaves[$i].vaginalCount + $slaves[$i].penetrativeCount + $slaves[$i].mammaryCount >= $retirementSex>> + <<set $retiree = $slaves[$i].ID>> + <<break>> + <</if>> + <</if>> + <<if $MilkMilestoneRetirement == 1>> + <<if $slaves[$i].milk >= $retirementMilk>> + <<set $retiree = $slaves[$i].ID>> + <<break>> + <</if>> + <</if>> + <<if $CumMilestoneRetirement == 1>> + <<if $slaves[$i].cum >= $retirementCum>> + <<set $retiree = $slaves[$i].ID>> + <<break>> + <</if>> + <</if>> + <<if $BirthsMilestoneRetirement == 1>> + <<if $slaves[$i].births >= $retirementBirths>> + <<set $retiree = $slaves[$i].ID>> + <<break>> + <</if>> + <</if>> + <<if $KillsMilestoneRetirement == 1>> + <<if $slaves[$i].pitKills >= $retirementKills>> + <<set $retiree = $slaves[$i].ID>> + <<break>> + <</if>> + <</if>> <</if>> - <</if>> - <<if $CumMilestoneRetirement == 1>> - <<if $slaves[$i].cum >= $retirementCum>> - <<set $retiree = $slaves[$i].ID>> - <<break>> - <</if>> - <</if>> - <<if $BirthsMilestoneRetirement == 1>> - <<if $slaves[$i].births >= $retirementBirths>> - <<set $retiree = $slaves[$i].ID>> - <<break>> - <</if>> - <</if>> - <<if $KillsMilestoneRetirement == 1>> - <<if $slaves[$i].pitKills >= $retirementKills>> - <<set $retiree = $slaves[$i].ID>> - <<break>> - <</if>> - <</if>> - <</if>> <</for>> <</if>> <<set $retired = 0>> @@ -74,6 +74,9 @@ <</if>> <<set $burst = 0>> +<<if $TFS.schoolUpgrade == 3 && $TFS.compromiseWeek == $week-1>> + <<set $fcnn.push("...Ladies: Do you want dick so much that you want to HAVE a dick? If yes, join the Futanari Sisters today! Learn more at...")>> +<</if>> <<if $week == 30>> <<set $fcnn.push("...is where I'll be when the bombs hit. Survival is my first...")>> <<set $fcnn.push("...time to prepare for major shortages is now, since there's no likelihood...")>> @@ -102,9 +105,6 @@ <<elseif $week == 90>> <<set $fcnn = ["FCNN service has been temporarily suspended. Please stand by."]>> <</if>> -<<if $TFS.schoolUpgrade == 3 && $week < 90 && $TFS.compromiseWeek == $week-1>> - <<set $fcnn.push("...Ladies: Do you want dick so much that you want to HAVE a dick? If yes, join the Futanari Sisters today! Learn more at...")>> -<</if>> <<if $secExp == 1>> <<include "attackGenerator">> diff --git a/src/uncategorized/seCoursing.tw b/src/uncategorized/seCoursing.tw index a0c2fc1bd9542b73bde1ee9394572ea24a14a71f..e7a6ede6040706635d299ec35f6de1ba3dfabb3a 100644 --- a/src/uncategorized/seCoursing.tw +++ b/src/uncategorized/seCoursing.tw @@ -65,7 +65,7 @@ You lead your lurcher $Lurcher.slaveName out on a leash, naked just like the har <<set $phallus = "dildo">> <</if>> -<<if canSee($Lurcher)>>$Lurcher.slaveName looks at you questioningly, wondering which of the hares $he should try to chase down and molest<<else>>$Lurcher.slaveName looks at you questioningly, wondering which of the dingling bells $he should try to chase down and molest<</if>>. +<<if canSee($Lurcher)>>$Lurcher.slaveName looks at you questioningly, wondering which of the hares $he should try to chase down and molest<<else>>$Lurcher.slaveName looks at you questioningly, wondering which of the dinging bells $he should try to chase down and molest<</if>>. <<set $hare1 = 0, $hare2 = 0, $hare3 = 0>> @@ -85,7 +85,7 @@ You lead your lurcher $Lurcher.slaveName out on a leash, naked just like the har <<set _possibleOrigins.push("disobedient young dickgirl")>> <</if>> -<style> /* a table is used here because very short hare descriptions cause images to indent oddly if they are shown. This ensures they are always directly below each other. */ +<style> /* a table is used here because very short hare descriptions cause images to indent oddly if they are shown. This ensures they are always directly below each other. */ table.coursing { border-style: hidden; empty-cells: hide; diff --git a/src/uncategorized/seWeddingDouble.tw b/src/uncategorized/seWeddingDouble.tw index 1d7421074727d9b646e938d97aba763a394f73a4..0cdfcb93f079927fcccb8f683a1f5eb23b24bd20 100644 --- a/src/uncategorized/seWeddingDouble.tw +++ b/src/uncategorized/seWeddingDouble.tw @@ -1841,7 +1841,6 @@ <<set _slave1.devotion -= 5, _slave1.trust -= 5>> <</if>> <</if>> - <</if>> <<else>> <<if _slave1.devotion+_slave1.trust >= 175>> <<if _slave1.relationship > 0>> @@ -1895,6 +1894,7 @@ <</if>> <</if>> <</if>> + <</if>> <<set _slave1.relationship = -3>> <<set _slave1.oralCount += 50>> @@ -2551,4 +2551,4 @@ <</if>> <<set $trinkets.push($desc)>> -<</if>> \ No newline at end of file +<</if>> diff --git a/src/uncategorized/sellSlave.tw b/src/uncategorized/sellSlave.tw index c6184084657ab2545f0d93d3ca319f2a6a6af44c..5d03d42942c17627f9adc37ea2e53734896604d7 100644 --- a/src/uncategorized/sellSlave.tw +++ b/src/uncategorized/sellSlave.tw @@ -3,8 +3,18 @@ <<set $nextButton = "Back", $nextLink = "Slave Interact">> You prepare $him for sale. $His response to being put up for purchase is -<<if $activeSlave.devotion < -50>>muted; perhaps $he hopes a new master will be less hateful than you. -<<elseif $activeSlave.devotion < -20>>muted weeping; for some reason, $he doesn't like being treated like meat on a slab. +<<if $activeSlave.devotion < -50>> + <<if $activeSlave.trust > 20>> + annoyance; $he must have thought $he had a good thing going here despite $his defiance. + <<else>> + muted; perhaps $he hopes a new master will be less hateful than you. + <</if>> +<<elseif $activeSlave.devotion < -20>> + <<if $activeSlave.trust > 20>> + mild panic; $he seems to be concerned about $his future. + <<else>> + muted weeping; for some reason, $he doesn't like being treated like meat on a slab. + <</if>> <<elseif $activeSlave.devotion <= 20>>hesitant; $he can't seem to make up $his mind whether this is going to mean an improvement or not. <<elseif $activeSlave.devotion <= 50>>obedient, if mechanical; $he may want to stay with you. <<elseif $activeSlave.devotion <= 95>>ill-concealed sorrow; $he clearly wants to stay with you very much. @@ -14,8 +24,18 @@ You prepare $him for sale. $His response to being put up for purchase is <<elseif $activeSlave.trust < -20>>$He's probably hoping $he'll be a little less frightened all the time, wherever $he goes. <<elseif $activeSlave.trust < 20>>$He does seem concerned that, hard as you are, $his buyer may be less fair. <<elseif $activeSlave.trust < 50>>$He's worried, probably because $he's learned how to avoid punishment here and will have to learn new rules. -<<elseif $activeSlave.trust < 95>>$He promises $he will do $his best to make you proud by being a good slave to $his new owners. -<<else>>$He tries to conceal $his terror at going from a trustworthy slave master to the cruel and uncertain world outside your penthouse, but $he fails. +<<elseif $activeSlave.trust < 95>> + <<if $activeSlave.devotion < -20>> + $He's worried, probably because $he thinks you won't harm $him while another owner might. + <<else>> + $He promises $he will do $his best to make you proud by being a good slave to $his new owners. + <</if>> +<<else>> + <<if $activeSlave.devotion < -20>> + $He's rather upset at the notion that $he may be going from a weak willed master to someone with the balls to actually try and break $him. + <<else>> + $He tries to conceal $his terror at going from a trustworthy slave master to the cruel and uncertain world outside your penthouse, but $he fails. + <</if>> <</if>> <<slaveCost $activeSlave>> @@ -1847,7 +1867,7 @@ __Bids Received__ <<case "cum addicts">> <<if $activeSlave.fetish == "cumslut" && $activeSlave.fetishStrength > 95 && $activeSlave.sexualFlaw == "cum addict">> <br>''<<print cashFormat(500*Math.trunc(($slaveCost*1.2)/500))>>'' from the sex slave buyer for General $peacekeepers.generalName's client state, which prefers $peacekeepers.tastes. - <<link "Accept bid" "Slave Sold">><<set _Price = 500*Math.trunc(($slaveCost*1.2)/500), $buyer = "peacekeepers">><<run cashX(_Price, "slaveTransfer" , $activeSlave)>><</link>> + <<link "Accept bid" "Slave Sold">><<set _Price = 500*Math.trunc(($slaveCost*1.2)/500), $buyer = "peacekeepers">><<run cashX(_Price, "slaveTransfer", $activeSlave)>><</link>> <</if>> <<case "horny MILFs">> <<if $activeSlave.physicalAge > 34 && $activeSlave.visualAge > 34 && $activeSlave.energy > 80>> diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw index 16b1e2f094bed6c7ae128ce576efee17dc025a05..bf03e30befdaf82c7394279560eae99e0ce2c57e 100644 --- a/src/uncategorized/slaveInteract.tw +++ b/src/uncategorized/slaveInteract.tw @@ -1042,6 +1042,7 @@ <</if>> <</if>> <<if isItemAccessible("tail") && $activeSlave.buttplug != "none">> + <br> Anal accessory attachment: ''<span id="buttplugAttach">$activeSlave.buttplugAttachment</span>.'' <<link "None">><<set $activeSlave.buttplugAttachment = "none">><<replace "#buttplugAttach">>$activeSlave.buttplugAttachment<</replace>><</link>> <<if $toysBoughtButtPlugTails == 1>> @@ -1054,6 +1055,7 @@ <<if $activeSlave.vagina > -1>> <br>Vaginal accessory: ''<span id="vaginalAccessory">$activeSlave.vaginalAccessory</span>.'' <<link "None">><<set $activeSlave.vaginalAccessory = "none">><<replace "#vaginalAccessory">>$activeSlave.vaginalAccessory<</replace>><<SlaveInteractImpreg>><<SlaveInteractFertility>><<SlaveInteractSexOption>><<SlaveInteractAnalSexOption>><<SlaveInteractGropeOption>><<SlaveInteractDickGropeOption>><<SlaveInteractAnalGropeOption>><</link>> + | <<link "Bullet vibrator">><<set $activeSlave.vaginalAccessory = "bullet vibrator">><<replace "#vaginalAccessory">>$activeSlave.vaginalAccessory<</replace>><</link>> | <<link "Dildo">><<set $activeSlave.vaginalAccessory = "dildo">><<replace "#vaginalAccessory">>$activeSlave.vaginalAccessory<</replace>><</link>> <<if isItemAccessible("long dildo") && ($activeSlave.breedingMark != 1 || $propOutcome == 0)>> | <<link "Long dildo">><<set $activeSlave.vaginalAccessory = "long dildo">><<replace "#vaginalAccessory">>$activeSlave.vaginalAccessory<</replace>><</link>> @@ -1068,6 +1070,19 @@ | <<link "Huge and long dildo">><<set $activeSlave.vaginalAccessory = "long, huge dildo">><<replace "#vaginalAccessory">>$activeSlave.vaginalAccessory<</replace>><</link>> <</if>> <</if>> + <<if isItemAccessible("vibrator")>> + <br> + <<if $activeSlave.vaginalAccessory != "none">> + Vaginal accessory attachment: + <<else>> + Vaginal attachment: + <</if>> + ''<span id="vaginalAttachment">$activeSlave.vaginalAttachment</span>.'' + <<link "None">><<set $activeSlave.vaginalAttachment = "none">><<replace "#vaginalAttachment">>$activeSlave.vaginalAttachment<</replace>><</link>> + <<if $toysBoughtVaginalAttachments == 1>> + | <<link "Vibrating dildo">><<set $activeSlave.vaginalAttachment = "vibrator">><<replace "#vaginalAttachment">>$activeSlave.vaginalAttachment<</replace>><</link>> + <</if>> + <</if>> <</if>> <<if $activeSlave.dick > 0>> diff --git a/src/uncategorized/slaveStats.tw b/src/uncategorized/slaveStats.tw index 85e00ee250b9940225ccbb515e6ea6be924a1f81..70ea971fc5a2c9974dae73783208934f0590a7bc 100644 --- a/src/uncategorized/slaveStats.tw +++ b/src/uncategorized/slaveStats.tw @@ -250,6 +250,7 @@ slaveName: $activeSlave.slaveName /* TODO: figure out why this is being inden <br>collar: $activeSlave.collar <br>shoes: $activeSlave.shoes <br>vaginalAccessory: $activeSlave.vaginalAccessory +<br>vaginalAttachment: $activeSlave.vaginalAttachment <br>dickAccessory: $activeSlave.dickAccessory <br>legAccessory: $activeSlave.legAccessory <br>buttplug: $activeSlave.buttplug diff --git a/src/uncategorized/surgeryDegradation.tw b/src/uncategorized/surgeryDegradation.tw index e7aeb004af56e34ca7e3f2469805cb0434070bd0..3f89746d099b6c779932d8008291d5ec32baaf68 100644 --- a/src/uncategorized/surgeryDegradation.tw +++ b/src/uncategorized/surgeryDegradation.tw @@ -1565,7 +1565,7 @@ As the remote surgery's long recovery cycle completes, <</if>> Naturally, @@.red;$his health has been greatly affected@@ by such serious surgery. <<set $activeSlave.chastityVagina = 0>> - <<set $activeSlave.vaginalAccessory = "none">> + <<set $activeSlave.vaginalAccessory = "none", $activeSlave.vaginalAttachment = "none">> <<if $activeSlave.cervixImplant == 1>> <<set $activeSlave.cervixImplant = 0>> <<elseif $activeSlave.cervixImplant == 3>> diff --git a/src/uncategorized/walkPast.tw b/src/uncategorized/walkPast.tw index 5c8f4312b09ef455edee2d65a802a1576f202730..3e153476a6e670abc89f1d25f81a911d34713e8a 100644 --- a/src/uncategorized/walkPast.tw +++ b/src/uncategorized/walkPast.tw @@ -1512,12 +1512,12 @@ <</if>> <</switch>> <<if ($activeSlave.vaginalAccessory == "long dildo") || ($activeSlave.vaginalAccessory == "long, large dildo") || ($activeSlave.vaginalAccessory == "long, huge dildo")>> - With every motion $he makes; $his dildo shifts, bulging out $his stomach. + With every motion $he makes, $his dildo shifts, bulging out $his stomach. <<if ($activeSlave.buttPlug == "long plug") || ($activeSlave.buttPlug == "long, large plug") || ($activeSlave.buttPlug == "long, huge plug")>> Beside it, a second bulge caused by $his extra long buttplug. <</if>> <<elseif ($activeSlave.buttPlug == "long plug") || ($activeSlave.buttPlug == "long, large plug") || ($activeSlave.buttPlug == "long, huge plug")>> - With every motion $he makes; $his buttplug shifts, bulging out $his stomach. + With every motion $he makes, $his buttplug shifts, bulging out $his stomach. <</if>> <</if>> <<else>> /* implant descs */ diff --git a/src/uncategorized/wardrobe.tw b/src/uncategorized/wardrobe.tw index 3fa1244f011f541ab4920bcc561755c6be3c0a15..71f666c603b1092a0187e650d936867d766ae003 100644 --- a/src/uncategorized/wardrobe.tw +++ b/src/uncategorized/wardrobe.tw @@ -14,7 +14,7 @@ The room containing all the clothes and accessories you have available to dress <</if>> <<if $toysBoughtDildos == 1 && $toysBoughtGags == 1 && $toysBoughtButtPlugs == 1>> Sex toys of all kinds and shapes line the shelves. -<<elseif $toysBoughtDildos == 1 || $toysBoughtGags == 1 || $toysBoughtButtPlugs == 1 || $toysBoughtButtPlugTails == 1>> +<<elseif $toysBoughtDildos == 1 || $toysBoughtGags == 1 || $toysBoughtButtPlugs == 1 || $toysBoughtButtPlugTails == 1 || $toysBoughtVaginalAttachments == 1>> Some sex toys line the shelves. <</if>> <<if $buckets == 1>> @@ -275,6 +275,14 @@ The room containing all the clothes and accessories you have available to dress You are well stocked with extra long dildos in a variety of sizes. <</if>> +<br> +<<if $toysBoughtVaginalAccessories == 0>> + [[Order a shipment of bullet vibes and vibrating dildos|Wardrobe][cashX(-10000, "capEx"), $toysBoughtVaginalAccessories = 1]] + //Costs <<print cashFormat(10000)>>// +<<else>> + You are well stocked with bullet vibrators and vibrating dildos. +<</if>> + <br> <<if $toysBoughtButtPlugs == 0>> [[Order a shipment of extra long buttplugs|Wardrobe][cashX(-10000, "capEx"), $toysBoughtButtPlugs = 1]] diff --git a/src/uncategorized/wardrobeUse.tw b/src/uncategorized/wardrobeUse.tw index 0bdca4851262cc9424927a1ae3692c635d37538e..5ebd2fe8eda8e94d2c1d6e21a95c22211e1134ec 100644 --- a/src/uncategorized/wardrobeUse.tw +++ b/src/uncategorized/wardrobeUse.tw @@ -1103,6 +1103,12 @@ Clothes: ''<span id="clothes">$activeSlave.clothes</span>.'' <<replace "#vaginalAccessoryDescription">>//<<vaginalAccessoryDescription>>//<</replace>> <<replace "#buttplugDescription">>//<<buttplugDescription>>//<</replace>> <</link>> + | <<link "Bullet vibrator">> + <<set $activeSlave.vaginalAccessory = "bullet vibrator">> + <<replace "#vaginalAccessory">>$activeSlave.vaginalAccessory<</replace>> + <<replace "#vaginalAccessoryDescription">>//<<vaginalAccessoryDescription>>//<</replace>> + <<replace "#buttplugDescription">>//<<buttplugDescription>>//<</replace>> + <</link>> | <<link "Dildo">> <<set $activeSlave.vaginalAccessory = "dildo">> <<replace "#vaginalAccessory">>$activeSlave.vaginalAccessory<</replace>> @@ -1147,6 +1153,29 @@ Clothes: ''<span id="clothes">$activeSlave.clothes</span>.'' <</link>> <</if>> <</if>> + <<if isItemAccessible("vibrator")>> + <br><br> + <<if $activeSlave.vaginalAccessory != "none">> + Vaginal accessory attachment: + <<else>> + Vaginal attachment: + <</if>> + ''<span id="vaginalAttachment">$activeSlave.vaginalAttachment</span>.'' + <span id="vaginalAttachmentDescription"><<if ($activeSlave.vaginalAttachment != "none")>><br><</if>>//<<vaginalAttachmentDescription>>//</span> + <br> + <<link "None">> + <<set $activeSlave.vaginalAttachment = "none">> + <<replace "#vaginalAttachment">>$activeSlave.vaginalAttachment<</replace>> + <<replace "#vaginalAttachmentDescription">>//<<vaginalAccessoryDescription>>//<</replace>> + <<replace "#buttplugDescription">>//<<buttplugDescription>>//<</replace>> /* TODO: don't actually know if I need this - what is this for? */ + <</link>> + | <<link "Vibrating dildo">> + <<set $activeSlave.vaginalAttachment = "vibrator">> + <<replace "#vaginalAttachment">>$activeSlave.vaginalAttachment<</replace>> + <<replace "#vaginalAttachmentDescription">>//<<vaginalAccessoryDescription>>//<</replace>> + <<replace "#buttplugDescription">>//<<buttplugDescription>>//<</replace>> + <</link>> + <</if>> <</if>> <<if $activeSlave.dick > 0>> diff --git a/src/utility/descriptionWidgetsPiercings.tw b/src/utility/descriptionWidgetsPiercings.tw index e8ce37f9618135373e0d30a7215618e2dfa6aec5..4b578189aaa8f2d617c7fe20ab01fb6328cf4976 100644 --- a/src/utility/descriptionWidgetsPiercings.tw +++ b/src/utility/descriptionWidgetsPiercings.tw @@ -287,7 +287,7 @@ <<if ($activeSlave.clothes == "slutty jewelry")>> Since $he's wearing slutty bangles $he has a short length of light chain dangling from $his clit ring; it constantly stimulates $his pussylips. <</if>> - <<elseif ($activeSlave.clitPiercing > 2) && ($activeSlave.vagina != -1) && ($activeSlave.dick == 0)>> + <<elseif ($activeSlave.clitPiercing == 3) && ($activeSlave.vagina != -1) && ($activeSlave.dick == 0)>> $He has a smart piercing in $his clit. <<elseif ($activeSlave.clitPiercing == 1)>> $He has a simple dickhead stud. @@ -296,7 +296,7 @@ <<if ($activeSlave.clothes == "slutty jewelry")>> Since $he's wearing slutty bangles $he has a short length of light chain dangling from $his dickhead piercing; as $he moves it tugs lightly at $his cock. <</if>> - <<elseif ($activeSlave.clitPiercing > 2)>> + <<elseif ($activeSlave.clitPiercing == 3)>> $He has a smart frenulum piercing. <</if>> <<if $activeSlave.fuckdoll > 0>>It anchors the suit's material.<</if>> diff --git a/src/utility/descriptionWidgetsStyle.tw b/src/utility/descriptionWidgetsStyle.tw index 2b0b582edda330f37207b01447bd35e48c6a45e8..a8ebcadaece955fd3061f405872f1f5a79a5259b 100644 --- a/src/utility/descriptionWidgetsStyle.tw +++ b/src/utility/descriptionWidgetsStyle.tw @@ -5881,7 +5881,10 @@ $His <</if>> <</if>> <<switch $activeSlave.vaginalAccessory>> +<<case "bullet vibrator">> + /* TODO: write a description */ <<case "dildo">> + /* TODO: these may need to be updated for slaves with gaping+ vaginas */ $His pussy is filled by a dildo held in place by a strap, which $he can remove for vaginal intercourse. <<case "long dildo">> $His pussy is filled by a very long dildo held in place by a strap, which $he can remove for vaginal intercourse. It noticeably bulges $his stomach. @@ -5914,6 +5917,15 @@ $His <</switch>> <</widget>> +<<widget "vaginalAttachmentDescription">> +<<switch $activeSlave.vaginalAttachment>> + /* TODO: not sure about this description */ + $His pussy is filled with a vibrating dildo held in place by a strap, which $he can remove for vaginal intercourse. $He looks distinctly uncomfortable as it buzzes every so often. + /* TODO: add descriptions for slaves with gaping+ vaginas */ +<<case "vibrator">> +<</switch>> +<</widget>> + <<widget "dickAccessoryDescription">> <<if ($activeSlave.chastityPenis == 1)>> $His cock is encased in a tight chastity cage, which is designed to be comfortable as long as $he remains soft. diff --git a/src/utility/miscWidgets.tw b/src/utility/miscWidgets.tw index ad4a6170a1dd8f759702f208d3e9e91ab988ce74..46f3d90e418e306dd1481ae01c09845683d5daa7 100644 --- a/src/utility/miscWidgets.tw +++ b/src/utility/miscWidgets.tw @@ -685,6 +685,8 @@ This experience [[Customize the exterior of the arcology to support this goal|Future Society][$arcologies[0][_FSDecoration] = 100, State.variables[$args[1]] = 1, State.variables[$args[2]] = 1, State.variables[$args[3]] = 1, cashX(-20000, "capEx")]] //Costs <<print cashFormat(20000)>>// <<elseif def $args[1]>> [[Customize the exterior of the arcology to support this goal|Future Society][$arcologies[0][_FSDecoration] = 100, State.variables[$args[1]] = 1, cashX(-20000, "capEx")]] //Costs <<print cashFormat(20000)>>// + <<elseif $args[0] == "FSRestart">> + [[Customize the exterior of the arcology to support this goal and fully establish the Societal Elite|Future Society][$arcologies[0].FSRestartDecoration = 100, $upgradeMultiplierArcology = upgradeMultiplierArcology(), $upgradeMultiplierMedicine = 0.5, $cash -= 75000]] //Costs <<print cashFormat(75000)>> and may dilute your control over the arcology// <<else>> [[Customize the exterior of the arcology to support this goal|Future Society][$arcologies[0][_FSDecoration] = 100, cashX(-20000, "capEx")]] //Costs <<print cashFormat(20000)>>// <</if>> @@ -697,24 +699,6 @@ This experience <</capture>> <</widget>> -<<widget "ClearFacilityDecorations">> -/* Called when a FS is abandoned or failed out of. */ - -<<if $brothel > 0>><<run ValidateFacilityDecoration("brothelDecoration")>><</if>> -<<if $club > 0>><<run ValidateFacilityDecoration("clubDecoration")>><</if>> -<<if $dairy > 0>><<run ValidateFacilityDecoration("dairyDecoration")>><</if>> -<<if $farmyard > 0>><<run ValidateFacilityDecoration("farmyardDecoration")>><</if>> -<<if $spa > 0>><<run ValidateFacilityDecoration("spaDecoration")>><</if>> -<<if $nursery > 0>><<run ValidateFacilityDecoration("nurseryDecoration")>><</if>> -<<if $clinic > 0>><<run ValidateFacilityDecoration("clinicDecoration")>><</if>> -<<if $schoolroom > 0>><<run ValidateFacilityDecoration("schoolroomDecoration")>><</if>> -<<if $cellblock > 0>><<run ValidateFacilityDecoration("cellblockDecoration")>><</if>> -<<if $servantsQuarters > 0>><<run ValidateFacilityDecoration("servantsQuartersDecoration")>><</if>> -<<if $arcade > 0>><<run ValidateFacilityDecoration("arcadeDecoration")>><</if>> -<<if $masterSuite > 0>><<run ValidateFacilityDecoration("masterSuiteDecoration")>><</if>> - -<</widget>> - /* Called as <<SetFacilityDecoration "facilityDecoration">>, will generate a clickable list of potential decorations, quotes are needed to pass facilityDecoration as reference - DO NOT INCLUDE $ PREFIX! */ <<widget "SetFacilityDecoration">> <<if ($arcologies[0].FSSupremacist >= 20) && (State.variables[$args[0]] != "Supremacist")>>