diff --git a/.eslintrc.json b/.eslintrc.json index c50f403a8694dd5fb40484aa72555416d00e013e..dec9b166a6873368764ab457c9436ab51af6ba40 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -36,7 +36,7 @@ "eqeqeq": "warn", "no-fallthrough": "error", "space-before-function-paren": ["warn", { - "anonymous": "always", + "anonymous": "never", "named": "never", "asyncArrow": "always" }], diff --git a/devNotes/AnatomyOfAFreeCitiesEvent.txt b/devNotes/AnatomyOfAFreeCitiesEvent.txt index e6c1d7afe51de849d108b7084c95ebc454ad8668..1e92894883d85befb0ae52c40c3bbcfd9abcd25e 100644 --- a/devNotes/AnatomyOfAFreeCitiesEvent.txt +++ b/devNotes/AnatomyOfAFreeCitiesEvent.txt @@ -57,7 +57,7 @@ A slave can be linked with the macro <<EventNameLink _Slave>>. This allows the p <<SlaveTitle _Slave>> sets $desc (which ends up being a string like "slavegirl", "MILF", "futanari" and so on, depending on slave). -<<SlavePronouns _Slave>> allows you to use the variables $pronoun ("she"/"he"/"it"), $pronounCap ("She"/"He"/"It"), $possessive ("her"/"his"/"its"), $possessiveCap ("Her"/"His"/"Its") and $object ("her"/"him"/"it"). There is NO variable for self-possession ("hers"/"his"/"its") and for "herself", you need to use <<= $object>>self. +<<setLocalPronouns _Slave>> allows you to use the variables $pronoun ("she"/"he"/"it"), $pronounCap ("She"/"He"/"It"), $possessive ("her"/"his"/"its"), $possessiveCap ("Her"/"His"/"Its") and $object ("her"/"him"/"it"). There is NO variable for self-possession ("hers"/"his"/"its") and for "herself", you need to use <<= $object>>self. One more macro initializes several others and is required when you have a slave speak and want to use direct quotes: <<Enunciate _Slave>> allows you to use <<Master>>, <<WrittenMaster>>, <<says>> (which turns into "lisps" when that's the case) and the lisping replacers <<s>>, <<ss>>, <<S>>, <<c>> and <<z>>. The text should be about large enough to fit on the screen assuming typical monitor sizes. In terms of visible text, about 1000 words are a fine limit to aim for. There's a lot to keep in mind in terms of different appearances and circumstances, so keep your document with slave variables as a reference nearby. diff --git a/devNotes/Useful JS Function Documentation.txt b/devNotes/Useful JS Function Documentation.txt index 164361af93a49faa1314d714f8cdf68c89ed4872..ee2de0e74588db8f9e81cfa9ad8ac5935a889c3b 100644 --- a/devNotes/Useful JS Function Documentation.txt +++ b/devNotes/Useful JS Function Documentation.txt @@ -218,8 +218,6 @@ getSlave(ID) - Returns the slave object with the matching ID. getPronouns(slave) - Returns an object containing a slave's pronouns. -SlavePronouns(slave) - Sets global pronoun variables to a slave's pronouns. ($he, $He, $His, $his, $him) (obsolete?) - WrittenMaster(slave) - Returns a slave's title for the player and sets lisping. Returns $activeSlave if not given an argument. Enunciate(slave) - Syncs lisp widgets with slave. diff --git a/devTools/javaSanityCheck/SanityCheck.jar b/devTools/javaSanityCheck/SanityCheck.jar index beb23f1552cc507c79804e671d947585961041f1..bb1291bb79770f6838f00f6b213cc7ddbe0315e9 100644 Binary files a/devTools/javaSanityCheck/SanityCheck.jar and b/devTools/javaSanityCheck/SanityCheck.jar differ diff --git a/devTools/sugarcube.d.ts b/devTools/sugarcube.d.ts index ab02ab3683a558c1c23b60d8e8604270b04fe307..92a0d063ab9e2c1485d77c38018edd1610b91a74 100644 --- a/devTools/sugarcube.d.ts +++ b/devTools/sugarcube.d.ts @@ -1,1341 +1,1340 @@ -declare namespace SugarCubeLib { - - type navigationOverride = (passageName: string) => any; - type saveObjectHander = (save: SaveObject) => void; - - type DisplayTaskFunction = (taskName: string) => void; - type RenderTaskFunction = (content: HTMLElement, taskName: string) => void; - - export interface StringTMap<T> { [key: string]: T; }; - - declare interface Config { - audio: { - pauseOnFadeToZero: boolean; - preloadMetadata: boolean; - }; - history: { - controls: boolean; - maxStates: number; - }; - macros: { - ifAssignmentError: boolean; - maxLoopIterations: number; - }; - navigation: { - override: navigationOverride; - }; - passages: { - descriptions: any; - /** Determines whether passage titles are combined with the story title, within the browser's/tab's titlebar, when - * passages are displayed. - * @default false - */ - displayTitles: boolean; - /** - * Determines whether rendering passages have their leading/trailing newlines removed and all remaining sequences of - * newlines replaced with single spaces before they're rendered. Equivalent to including the nobr special tag on - * every passage. - * @default false - */ - nobr: boolean; +declare global { + namespace SugarCubeLib { + + type navigationOverride = (passageName: string) => any; + type saveObjectHander = (save: SaveObject) => void; + + type DisplayTaskFunction = (taskName: string) => void; + type RenderTaskFunction = (content: HTMLElement, taskName: string) => void; + + export interface StringTMap<T> { [key: string]: T; } + + interface Config { + audio: { + pauseOnFadeToZero: boolean; + preloadMetadata: boolean; + }; + history: { + controls: boolean; + maxStates: number; + }; + macros: { + ifAssignmentError: boolean; + maxLoopIterations: number; + }; + navigation: { + override: navigationOverride; + }; + passages: { + descriptions: any; + /** Determines whether passage titles are combined with the story title, within the browser's/tab's titlebar, when + * passages are displayed. + * @default false + */ + displayTitles: boolean; + /** + * Determines whether rendering passages have their leading/trailing newlines removed and all remaining sequences of + * newlines replaced with single spaces before they're rendered. Equivalent to including the nobr special tag on + * every passage. + * @default false + */ + nobr: boolean; + + /** + * Sets the title of the initial passage, the very first passage which will be displayed. + * + * @default Twine 2: none; Twine 1/Twee: "Start" + */ + start: string; + + /** + * Determines whether outgoing passage transitions are enabled. Valid values are the name of the property being + * animated, which causes the outgoing passage elements to be removed once that transition animation is complete, + * or an integer delay (in milliseconds), which causes the outgoing passage elements to be removed once the delay + * has expired. + */ + transitionOut: string | number; + }; + + saves: { + /** + * Determines whether the autosave, if it exists, is automatically loaded upon story startup. Valid values are + * boolean true, which simply causes the autosave to be loaded, the string "prompt", which prompts the player via a + * dialog to load the autosave, or a function, which causes the autosave to be loaded if its return value is truthy. + + NOTE: If the autosave cannot be loaded, for any reason, then the start passage is loaded instead. + * @since 2.0.0 + */ + autoload: boolean | string | Function; + + /** + * Determines whether the autosave is created/updated when passages are displayed. Valid values are boolean true, + * which causes the autosave to be updated with every passage, a string, which causes the autosave to be updated for + * each passage with a matching tag, or an array of strings, which causes the autosave to be updated for each + * passage with at least one matching tag. + * + * NOTE: When setting the value to boolean true, you will likely also need to use the Config.saves.isAllowed + * property to disallow saving on the start passage. Or, if you use the start passage as real part of your story and + * allow the player to reenter it, rather than just as the initial landing/cover page, then you might wish to only + * disallow saving on the start passage the very first time it's displayed (at story startup). + * @since 2.0.0 + */ + autosave: boolean | string | string[]; + + /** + * Sets the story ID associated with saves. + * @default slugified story title + * @since 2.0.0 + * @example + * Config.saves.id = "a-big-huge-story-part-1"; + */ + id: string; + + /** + * Determines whether saving is allowed within the current context. The callback is invoked each time a save is + * requested. If its return value is false, the save is disallowed. If its return value is truthy, the save is + * allowed to continue unperturbed. + * @default undefined + * @since 2.0.0 + * @example + * Config.saves.isAllowed = function () { + * // code + * }; + */ + isAllowed: Function; + + /** + * Performs any required pre-processing before the save data is loaded. The callback is passed one parameter, the + * save object to be processed. If it encounters an unrecoverable problem during its processing, it may throw an + * exception containing an error message; the message will be displayed to the player and loading of the save will + * be terminated. + * @default undefined + * @since 2.0.0 + * @example + * Config.saves.onLoad = function (save) { + * // code + * }; + */ + onLoad: saveObjectHander; + + /** + * Performs any required post-processing before the save data is saved. The callback is passed one parameter, the + * save object to be processed. + * + * NOTE: See the save objects section of the Save API for information on the format of a save. + * @default undefined + * @since 2.0.0 + * @example + * Config.saves.onSave = function (save) { + * // code + * }; + */ + onSave: saveObjectHander; + + /** + * Sets the maximum number of available save slots. + * @default 8 + * @since 2.0.0 + * @example + * Config.saves.slots = 4; + */ + slots: number; + + /** + * Sets the version property of saves. + * + * NOTE: This completely optional property is only for developer use, it is ignored by SugarCube. + * + * @since 2.0.0 + * @example + * // As an integer + * Config.saves.version = 3; + * @example + * // As a string + * Config.saves.version = "v3"; + */ + version: any; + }; + + ui: { + /** + * Determines whether the UI bar (sidebar) starts in the stowed (shut) state initially. Valid values are boolean + * true/false, which causes the UI bar to always/never start in the stowed state, or an integer, which causes the UI + * bar to start in the stowed state if the viewport width is less-than-or-equal-to the specified number of pixels. + * + * @since 2.11.0 + * + * @example + * // As a boolean; always start stowed + * Config.ui.stowBarInitially = true; + * + * @example + * // As a boolean; never start stowed + * Config.ui.stowBarInitially = false; + * + * @example + * // As an integer; start stowed if the viewport is 800px or less + * Config.ui.stowBarInitially = 800; + */ + stowBarInitially: boolean | number; + + /** + * Determines whether certain elements within the UI bar are updated when passages are displayed. The affected + * elements are the story: banner, subtitle, author, caption, and menu. + * + * NOTE: SugarCube uses the story's title as the basis for the key used to store and load data used when playing the + * story and for saves. Because of this, the story title is not included in updates and it is strongly recommended + * that you do not add any kind of dynamic code to it. + * + * @default true + * @since 2.0.0 + * @example + * // If you don't need those elements to update + * Config.ui.updateStoryElements = false; + */ + updateStoryElements: boolean; + }; /** - * Sets the title of the initial passage, the very first passage which will be displayed. - * - * @default Twine 2: none; Twine 1/Twee: "Start" + * Determines whether the link-visited class is added to internal passage links which go to previously visited + * passages — i.e. the passage already exists within the story history + * @default false + * NOTE You must provide your own styling for the link-visited class as none is provided by default. + * @since 2.0.0 + * @example + * Config.addVisitedLinkClass = true; + * // An example style: (Twine 2: goes in Story Stylesheet; Twine 1/Twee: goes in a stylesheet-tagged passage) + * .link-visited { + * color: purple; + * } */ - start: string; + addVisitedLinkClass: boolean; /** - * Determines whether outgoing passage transitions are enabled. Valid values are the name of the property being - * animated, which causes the outgoing passage elements to be removed once that transition animation is complete, - * or an integer delay (in milliseconds), which causes the outgoing passage elements to be removed once the delay - * has expired. + * Determines whether the output of the Wikifier is post-processed into more sane markup — i.e. where appropriate, it + * tries to transition the plethora of <br> elements into <p> elements. + * @default false + * @since 2.0.0 + * @example + * Config.cleanupWikifierOutput = true; */ - transitionOut: string | number; - }; + cleanupWikifierOutput: boolean; - saves: { /** - * Determines whether the autosave, if it exists, is automatically loaded upon story startup. Valid values are - * boolean true, which simply causes the autosave to be loaded, the string "prompt", which prompts the player via a - * dialog to load the autosave, or a function, which causes the autosave to be loaded if its return value is truthy. - - NOTE: If the autosave cannot be loaded, for any reason, then the start passage is loaded instead. - * @since 2.0.0 + * Indicates whether SugarCube is running in test mode, which enables debug views. See Test Mode for more information. + * + * NOTE: This property is automatically set based on whether you're using a testing mode in a Twine compiler — i.e. Test + * mode in Twine 2, Test Play From Here in Twine 1, or the test mode options (-t, --test) in Tweego. You may, however, + * forcibly enable it if you need to for some reason — e.g. if you're using another compiler, which doesn't offer a way + * to enable test mode. + * + * @default false + * @since 2.2.0 + * @example + * // Forcibly enable test mode + * Config.debug = true; + * + * @example + * // Check if test mode is enabled in JavaScript + * if (Config.debug) { + * // do something debug related + * } + * + * @example + * // Check if test mode is enabled via the <<if>> macro + * <<if Config.debug>> + * // do something debug related + * <</if>> */ - autoload: boolean | string | Function; + debug: boolean; /** - * Determines whether the autosave is created/updated when passages are displayed. Valid values are boolean true, - * which causes the autosave to be updated with every passage, a string, which causes the autosave to be updated for - * each passage with a matching tag, or an array of strings, which causes the autosave to be updated for each - * passage with at least one matching tag. + * Sets the integer delay (in milliseconds) before the loading screen is dismissed, once the document has signaled its + * readiness. Not generally necessary, however, some browsers render slower than others and may need a little extra time + * to get a media-heavy page done. This allows you to fine tune for those cases. * - * NOTE: When setting the value to boolean true, you will likely also need to use the Config.saves.isAllowed - * property to disallow saving on the start passage. Or, if you use the start passage as real part of your story and - * allow the player to reenter it, rather than just as the initial landing/cover page, then you might wish to only - * disallow saving on the start passage the very first time it's displayed (at story startup). + * @default 0 * @since 2.0.0 + * + * @example + * // Delay the dismissal of the loading screen by 2000ms (2s) + * Config.loadDelay = 2000; */ - autosave: boolean | string | string[]; + loadDelay: number; + } + interface Dialog { /** - * Sets the story ID associated with saves. - * @default slugified story title + * Adds WAI-ARIA-compatible mouse/keyboard event handlers to the target element(s) which open the dialog when + * activated. + * @param targets The DOM element(s) to attach the handler to—may be either an HTMLElement object, a jQuery object, + * or a jQuery-style selector set. + * @param options he options object; the currently understood properties are: + * top: Top y-coordinate of the dialog (default: 50; in pixels, but without the unit). + * opacity: Opacity of the overlay (default: 0.8). + * @param tartFn The function to execute at the start of Dialog.addClickHandler(). This is commonly used to setup + * the dialog. + * @param doneFn The function to execute at the end of Dialog.addClickHandler(). + * @param closeFn The function to execute whenever the associated dialog is closed. * @since 2.0.0 * @example - * Config.saves.id = "a-big-huge-story-part-1"; + * // Commonly used something like the following. + * Dialog.addClickHandler("#some-element", null, function () { + * Dialog.setup("My Dialog Title", "my-dialog-class"); + * Dialog.wiki(Story.get("MyDialogContents").processText()); + * }); */ - id: string; + addClickHandler(targets: HTMLElement | string, options?: object, + tartFn?: () => void, doneFn?: () => void, closeFn?: () => void): void; /** - * Determines whether saving is allowed within the current context. The callback is invoked each time a save is - * requested. If its return value is false, the save is disallowed. If its return value is truthy, the save is - * allowed to continue unperturbed. - * @default undefined - * @since 2.0.0 + * Appends the given content to the dialog's content area. Returns a reference to the Dialog object for chaining. + * + * NOTE: If your content contains any SugarCube markup, you'll need to use the Dialog.wiki() method instead. + * @param content The content to append. As this method is essentially a shortcut for jQuery(Dialog.body()).append + * (…), see jQuery's append() method for the range of valid content types. + * @since 2.9.0 * @example - * Config.saves.isAllowed = function () { - * // code - * }; + * Dialog.append("Cry 'Havoc!', and let slip the <em>ponies</em> of <strong>friendship</strong>."); + * Dialog.append( <some DOM nodes> ); */ - isAllowed: Function; + append(content: string | string[]): Dialog; /** - * Performs any required pre-processing before the save data is loaded. The callback is passed one parameter, the - * save object to be processed. If it encounters an unrecoverable problem during its processing, it may throw an - * exception containing an error message; the message will be displayed to the player and loading of the save will - * be terminated. - * @default undefined + * Returns a reference to the dialog's content area * @since 2.0.0 * @example - * Config.saves.onLoad = function (save) { - * // code - * }; + * jQuery(Dialog.body()).append("Cry 'Havoc!', and let slip the <em>ponies</em> of <strong>friendship</strong>."); + * jQuery(Dialog.body()).wiki("Cry 'Havoc!', and let slip the //ponies// of ''friendship''."); */ - onLoad: saveObjectHander; + body(): HTMLElement; /** - * Performs any required post-processing before the save data is saved. The callback is passed one parameter, the - * save object to be processed. - * - * NOTE: See the save objects section of the Save API for information on the format of a save. - * @default undefined + * Closes the dialog. Returns a reference to the Dialog object for chaining. * @since 2.0.0 - * @example - * Config.saves.onSave = function (save) { - * // code - * }; */ - onSave: saveObjectHander; + close(): Dialog; /** - * Sets the maximum number of available save slots. - * @default 8 + * Returns whether the dialog is currently open. + * @param classNames the space-separated-list of classes to check for when determining the state of the dialog. + * Each of built-in dialogs contains a name-themed class which can be tested for in this manner—e.g. the Saves + * dialog contains the class saves. * @since 2.0.0 * @example - * Config.saves.slots = 4; + * if (Dialog.isOpen()) { + * // code to execute if the dialog is open... + * } + * @example + * if (Dialog.isOpen("saves")) { + * // code to execute if the Saves dialog is open + * } */ - slots: number; + isOpen(classNames?: string): boolean; /** - * Sets the version property of saves. - * - * NOTE: This completely optional property is only for developer use, it is ignored by SugarCube. + * Opens the dialog. Returns a reference to the Dialog object for chaining. * + * NOTE: Call this only after populating the dialog with content. + * @param options The options object. @see addClickHandler() for more information. + * @param closeFn The function to execute whenever the dialog is closed. * @since 2.0.0 - * @example - * // As an integer - * Config.saves.version = 3; - * @example - * // As a string - * Config.saves.version = "v3"; */ - version: any; - }; + open(options?: object, closeFn?: () => void): Dialog; - ui: { /** - * Determines whether the UI bar (sidebar) starts in the stowed (shut) state initially. Valid values are boolean - * true/false, which causes the UI bar to always/never start in the stowed state, or an integer, which causes the UI - * bar to start in the stowed state if the viewport width is less-than-or-equal-to the specified number of pixels. - * - * @since 2.11.0 - * + * Prepares the dialog for use and returns a reference to its content area. + * @param title The title of the dialog. + * @param classNames The space-separated-list of classes to add to the dialog. + * @since 2.0.0 * @example - * // As a boolean; always start stowed - * Config.ui.stowBarInitially = true; + * // Basic example. + * Dialog.setup(); + * Dialog.wiki("Blah //blah// ''blah''."); + * Dialog.open(); * * @example - * // As a boolean; never start stowed - * Config.ui.stowBarInitially = false; + * // Adding a title to the dialog. + * Dialog.setup("Character Sheet"); + * Dialog.wiki(Story.get("PC Sheet").processText()); + * Dialog.open(); * * @example - * // As an integer; start stowed if the viewport is 800px or less - * Config.ui.stowBarInitially = 800; + * // Adding a title and class to the dialog. + * Dialog.setup("Character Sheet", "charsheet"); + * Dialog.wiki(Story.get("PC Sheet").processText()); + * Dialog.open(); */ - stowBarInitially: boolean | number; + setup(title?: string, classNames?: string): HTMLElement; /** - * Determines whether certain elements within the UI bar are updated when passages are displayed. The affected - * elements are the story: banner, subtitle, author, caption, and menu. - * - * NOTE: SugarCube uses the story's title as the basis for the key used to store and load data used when playing the - * story and for saves. Because of this, the story title is not included in updates and it is strongly recommended - * that you do not add any kind of dynamic code to it. + * Renders the given markup and appends it to the dialog's content area. Returns a reference to the Dialog object + * for chaining. * - * @default true - * @since 2.0.0 + * NOTE: If your content consists of DOM nodes, you'll need to use the @see Dialog.append() method instead. + * @param wikiMarkup The markup to render. + * @since 2.9.0 * @example - * // If you don't need those elements to update - * Config.ui.updateStoryElements = false; + * Dialog.wiki("Cry 'Havoc!', and let slip the //ponies// of ''friendship''."); */ - updateStoryElements: boolean; - }; - - /** - * Determines whether the link-visited class is added to internal passage links which go to previously visited - * passages — i.e. the passage already exists within the story history - * @default false - * NOTE You must provide your own styling for the link-visited class as none is provided by default. - * @since 2.0.0 - * @example - * Config.addVisitedLinkClass = true; - * // An example style: (Twine 2: goes in Story Stylesheet; Twine 1/Twee: goes in a stylesheet-tagged passage) - * .link-visited { - * color: purple; - * } - */ - addVisitedLinkClass: boolean; - - /** - * Determines whether the output of the Wikifier is post-processed into more sane markup — i.e. where appropriate, it - * tries to transition the plethora of <br> elements into <p> elements. - * @default false - * @since 2.0.0 - * @example - * Config.cleanupWikifierOutput = true; - */ - cleanupWikifierOutput: boolean; - - /** - * Indicates whether SugarCube is running in test mode, which enables debug views. See Test Mode for more information. - * - * NOTE: This property is automatically set based on whether you're using a testing mode in a Twine compiler — i.e. Test - * mode in Twine 2, Test Play From Here in Twine 1, or the test mode options (-t, --test) in Tweego. You may, however, - * forcibly enable it if you need to for some reason — e.g. if you're using another compiler, which doesn't offer a way - * to enable test mode. - * - * @default false - * @since 2.2.0 - * @example - * // Forcibly enable test mode - * Config.debug = true; - * - * @example - * // Check if test mode is enabled in JavaScript - * if (Config.debug) { - * // do something debug related - * } - * - * @example - * // Check if test mode is enabled via the <<if>> macro - * <<if Config.debug>> - * // do something debug related - * <</if>> - */ - debug: boolean; - - /** - * Sets the integer delay (in milliseconds) before the loading screen is dismissed, once the document has signaled its - * readiness. Not generally necessary, however, some browsers render slower than others and may need a little extra time - * to get a media-heavy page done. This allows you to fine tune for those cases. - * - * @default 0 - * @since 2.0.0 - * - * @example - * // Delay the dismissal of the loading screen by 2000ms (2s) - * Config.loadDelay = 2000; - */ - loadDelay: number; - }; - - declare interface Dialog { - /** - * Adds WAI-ARIA-compatible mouse/keyboard event handlers to the target element(s) which open the dialog when - * activated. - * @param targets The DOM element(s) to attach the handler to—may be either an HTMLElement object, a jQuery object, - * or a jQuery-style selector set. - * @param options he options object; the currently understood properties are: - * top: Top y-coordinate of the dialog (default: 50; in pixels, but without the unit). - * opacity: Opacity of the overlay (default: 0.8). - * @param tartFn The function to execute at the start of Dialog.addClickHandler(). This is commonly used to setup - * the dialog. - * @param doneFn The function to execute at the end of Dialog.addClickHandler(). - * @param closeFn The function to execute whenever the associated dialog is closed. - * @since 2.0.0 - * @example - * // Commonly used something like the following. - * Dialog.addClickHandler("#some-element", null, function () { - * Dialog.setup("My Dialog Title", "my-dialog-class"); - * Dialog.wiki(Story.get("MyDialogContents").processText()); - * }); - */ - addClickHandler(targets: HTMLElement | string, options?: object, - tartFn?: () => void, doneFn?: () => void, closeFn?: () => void): void; - - /** - * Appends the given content to the dialog's content area. Returns a reference to the Dialog object for chaining. - * - * NOTE: If your content contains any SugarCube markup, you'll need to use the Dialog.wiki() method instead. - * @param content The content to append. As this method is essentially a shortcut for jQuery(Dialog.body()).append - * (…), see jQuery's append() method for the range of valid content types. - * @since 2.9.0 - * @example - * Dialog.append("Cry 'Havoc!', and let slip the <em>ponies</em> of <strong>friendship</strong>."); - * Dialog.append( <some DOM nodes> ); - */ - append(content: string | string[]): Dialog; + wiki(wikiMarkup: string): Dialog; + } - /** - * Returns a reference to the dialog's content area - * @since 2.0.0 - * @example - * jQuery(Dialog.body()).append("Cry 'Havoc!', and let slip the <em>ponies</em> of <strong>friendship</strong>."); - * jQuery(Dialog.body()).wiki("Cry 'Havoc!', and let slip the //ponies// of ''friendship''."); - */ - body(): HTMLElement; + interface Engine { + /** + * Returns a timestamp representing the last time Engine.play() was called. + * @since 2.0.0 + */ + lastPlay: number; - /** - * Closes the dialog. Returns a reference to the Dialog object for chaining. - * @since 2.0.0 - */ - close(): Dialog; + /** + * Returns the current state of the engine ("idle", "playing", "rendering"). + * States: + * "idle": The engine is idle, awaiting the triggering of passage navigation—the default state. + * "playing": Passage navigation has been triggered and a turn is being processed. + * "rendering": The incoming passage is being rendered and added to the page—takes place during turn processing, + * so implies "playing". + * @since 2.7.0 + */ + state: string; - /** - * Returns whether the dialog is currently open. - * @param classNames the space-separated-list of classes to check for when determining the state of the dialog. - * Each of built-in dialogs contains a name-themed class which can be tested for in this manner—e.g. the Saves - * dialog contains the class saves. - * @since 2.0.0 - * @example - * if (Dialog.isOpen()) { - * // code to execute if the dialog is open... - * } - * @example - * if (Dialog.isOpen("saves")) { - * // code to execute if the Saves dialog is open - * } - */ - isOpen(classNames?: string): boolean; + /** + * Moves backward one moment within the full history (past + future), if possible, activating and showing the + * moment moved to. Returns whether the history navigation was successful (should only fail if already at the + * beginning of the full history). + * @since 2.0.0 + */ + backward(): boolean; - /** - * Opens the dialog. Returns a reference to the Dialog object for chaining. - * - * NOTE: Call this only after populating the dialog with content. - * @param options The options object. @see addClickHandler() for more information. - * @param closeFn The function to execute whenever the dialog is closed. - * @since 2.0.0 - */ - open(options?: object, closeFn?: () => void): Dialog; + /** + * Moves forward one moment within the full history (past + future), if possible, activating and showing the moment + * moved to. Returns whether the history navigation was successful (should only fail if already at the end of the + * full history). + * @since 2.0.0 + */ + forward(): boolean; - /** - * Prepares the dialog for use and returns a reference to its content area. - * @param title The title of the dialog. - * @param classNames The space-separated-list of classes to add to the dialog. - * @since 2.0.0 - * @example - * // Basic example. - * Dialog.setup(); - * Dialog.wiki("Blah //blah// ''blah''."); - * Dialog.open(); - * - * @example - * // Adding a title to the dialog. - * Dialog.setup("Character Sheet"); - * Dialog.wiki(Story.get("PC Sheet").processText()); - * Dialog.open(); - * - * @example - * // Adding a title and class to the dialog. - * Dialog.setup("Character Sheet", "charsheet"); - * Dialog.wiki(Story.get("PC Sheet").processText()); - * Dialog.open(); - */ - setup(title?: string, classNames?: string): HTMLElement; + /** + * Activates the moment at the given offset from the active (present) moment within the full state history and show + * it. Returns whether the history navigation was successful (should only fail if the offset from the active + * (present) moment is not within the bounds of the full history). + * @param offset The offset from the active (present) moment of the moment to go to. + * @since 2.0.0 + */ + go(offset: number): boolean; - /** - * Renders the given markup and appends it to the dialog's content area. Returns a reference to the Dialog object - * for chaining. - * - * NOTE: If your content consists of DOM nodes, you'll need to use the @see Dialog.append() method instead. - * @param wikiMarkup The markup to render. - * @since 2.9.0 - * @example - * Dialog.wiki("Cry 'Havoc!', and let slip the //ponies// of ''friendship''."); - */ - wiki(wikiMarkup: string): Dialog; - } + /** + * Activates the moment at the given index within the full state history and show it. Returns whether the history + * navigation was successful (should only fail if the index is not within the bounds of the full history). + * @param index The index of the moment to go to. + * @since 2.0.0 + * @example + * Engine.goTo(0) // Goes to the first moment + * Engine.goTo(9) // Goes to the tenth moment + */ + goTo(index: number): boolean; - declare interface Engine { - /** - * Returns a timestamp representing the last time Engine.play() was called. - * @since 2.0.0 - */ - lastPlay: number; + /** + * Returns whether the engine is idle. + * @since 2.16.0 + */ + isIdle(): boolean; - /** - * Returns the current state of the engine ("idle", "playing", "rendering"). - * States: - * "idle": The engine is idle, awaiting the triggering of passage navigation—the default state. - * "playing": Passage navigation has been triggered and a turn is being processed. - * "rendering": The incoming passage is being rendered and added to the page—takes place during turn processing, - * so implies "playing". - * @since 2.7.0 - */ - state: string; + /** + * Returns whether the engine is processing a turn — i.e. passage navigation has been triggered. + * @since 2.16.0 + */ + isPlaying(): boolean; - /** - * Moves backward one moment within the full history (past + future), if possible, activating and showing the - * moment moved to. Returns whether the history navigation was successful (should only fail if already at the - * beginning of the full history). - * @since 2.0.0 - */ - backward(): boolean; + /** + * Returns whether the engine is rendering the incoming passage. + * @since 2.16.0 + */ + isRendering(): boolean; - /** - * Moves forward one moment within the full history (past + future), if possible, activating and showing the moment - * moved to. Returns whether the history navigation was successful (should only fail if already at the end of the - * full history). - * @since 2.0.0 - */ - forward(): boolean; + /** + * Renders and displays the passage referenced by the given title, optionally without adding a new moment to the + * history. + * @param passageTitle The title of the passage to play. + * @param noHistory Disables the update of the history (i.e. no moment is added to the history). + * @since 2.0.0 + */ + play(passageTitle: string, noHistory?: boolean): HTMLElement; - /** - * Activates the moment at the given offset from the active (present) moment within the full state history and show - * it. Returns whether the history navigation was successful (should only fail if the offset from the active - * (present) moment is not within the bounds of the full history). - * @param offset The offset from the active (present) moment of the moment to go to. - * @since 2.0.0 - */ - go(offset: number): boolean; + /** + * Restarts the story. + * + * WARNING: The player will not be prompted and all unsaved state will be lost. + * NOTE: In general, you should not call this method directly. Instead, call the UI.restart() static method, which + * prompts the player with an OK/Cancel dialog before itself calling Engine.restart(), if they accept. + * @since 2.0.0 + */ + restart(): void; - /** - * Activates the moment at the given index within the full state history and show it. Returns whether the history - * navigation was successful (should only fail if the index is not within the bounds of the full history). - * @param index The index of the moment to go to. - * @since 2.0.0 - * @example - * Engine.goTo(0) // Goes to the first moment - * Engine.goTo(9) // Goes to the tenth moment - */ - goTo(index: number): boolean; + /** + * Renders and displays the active (present) moment's associated passage without adding a new moment to the history. + * @since 2.0.0 + */ + show(): HTMLElement; + } - /** - * Returns whether the engine is idle. - * @since 2.16.0 - */ - isIdle(): boolean; + interface LoadScreen { + /** + * Acquires a loading screen lock and returns its ID. Displays the loading screen, if necessary. + * @since 2.15.0 + */ + lock(): number; - /** - * Returns whether the engine is processing a turn — i.e. passage navigation has been triggered. - * @since 2.16.0 - */ - isPlaying(): boolean; + /** + * Releases the loading screen lock with the given ID. Hides the loading screen, if no other locks exist. + * @param lockId The loading screen lock ID. + * @since 2.15.0 + * @example + * var lockId = LoadScreen.lock(); + * // Do something whose timing is unpredictable which should be hidden by the loading screen + * LoadScreen.unlock(lockId); + */ + unlock(lockId: number): void; + } - /** - * Returns whether the engine is rendering the incoming passage. - * @since 2.16.0 - */ - isRendering(): boolean; + interface MacroTags { + /** + * Return the named macro tag's parents array (includes the names of all macros who have registered the tag as a + * child), or null on failure. + * @param name Name of the macro tag whose parents array should be returned. + * @since 2.0.0 + * @example + * Macro.tags.get("else") // For the standard library, returns: ["if"] + */ + get(name: string): string[]; - /** - * Renders and displays the passage referenced by the given title, optionally without adding a new moment to the - * history. - * @param passageTitle The title of the passage to play. - * @param noHistory Disables the update of the history (i.e. no moment is added to the history). - * @since 2.0.0 - */ - play(passageTitle: string, noHistory?: boolean): HTMLElement; + /** + * Returns whether the named macro tag exists. + * @param name Name of the macro tag to search for. + * @since 2.0.0 + */ + has(name: string): boolean; + } - /** - * Restarts the story. - * - * WARNING: The player will not be prompted and all unsaved state will be lost. - * NOTE: In general, you should not call this method directly. Instead, call the UI.restart() static method, which - * prompts the player with an OK/Cancel dialog before itself calling Engine.restart(), if they accept. - * @since 2.0.0 - */ - restart(): void; + interface MacroArgsArray extends Array<String> { + /** + * The current tag's argument string after converting all TwineScript syntax elements into their + * native JavaScript counterparts. Equivalent in function to <MacroContext>.args.full. + */ + full: string; + /** + * The current tag's unprocessed argument string. Equivalent in function to <MacroContext>.args.raw. + */ + raw: string; + } - /** - * Renders and displays the active (present) moment's associated passage without adding a new moment to the history. - * @since 2.0.0 - */ - show(): HTMLElement; - } + interface MacroContexObject { + /** + * Name of the current tag. + */ + name: string; + /** + * The current tag's argument string parsed into an array of discrete arguments. + * Equivalent in function to <MacroContext>.args. + */ + args: MacroArgsArray; - declare interface LoadScreen { - /** - * Acquires a loading screen lock and returns its ID. Displays the loading screen, if necessary. - * @since 2.15.0 - */ - lock(): number; + /** + * The current tag's contents—i.e. the text between the current tag and the next. + */ + contents: string; + } - /** - * Releases the loading screen lock with the given ID. Hides the loading screen, if no other locks exist. - * @param lockId The loading screen lock ID. - * @since 2.15.0 - * @example - * var lockId = LoadScreen.lock(); - * // Do something whose timing is unpredictable which should be hidden by the loading screen - * LoadScreen.unlock(lockId); - */ - unlock(lockId: number): void; - } + interface MacroContex { + /** + * The argument string parsed into an array of discrete arguments. + * @since 2.0.0 + */ + args: MacroArgsArray; - declare interface MacroTags { - /** - * Return the named macro tag's parents array (includes the names of all macros who have registered the tag as a - * child), or null on failure. - * @param name Name of the macro tag whose parents array should be returned. - * @since 2.0.0 - * @example - * Macro.tags.get("else") // For the standard library, returns: ["if"] - */ - get(name: string): string[]; + /** + * The name of the macro. + * @since 2.0.0 + */ + name: string; - /** - * Returns whether the named macro tag exists. - * @param name Name of the macro tag to search for. - * @since 2.0.0 - */ - has(name: string): boolean; - } + /** + * The current output element. + * @since 2.0.0 + */ + output: HTMLElement; - declare interface MacroArgsArray extends Array<String> { - /** - * The current tag's argument string after converting all TwineScript syntax elements into their - * native JavaScript counterparts. Equivalent in function to <MacroContext>.args.full. - */ - full: string; - /** - * The current tag's unprocessed argument string. Equivalent in function to <MacroContext>.args.raw. - */ - raw: string; - } + /** + * The (execution) context object of the macro's parent, or null if the macro has no parent. + * @since 2.0.0 + */ + parent: object; - declare interface MacroContexObject { - /** - * Name of the current tag. - */ - name: string; - /** - * The current tag's argument string parsed into an array of discrete arguments. - * Equivalent in function to <MacroContext>.args. - */ - args: MacroArgsArray; + /** + * The text of a container macro parsed into discrete payload objects by tag. + * @since 2.0.0 + */ + payload: MacroContexObject[]; - /** - * The current tag's contents—i.e. the text between the current tag and the next. - */ - contents: string; - } + /** + * The macro's definition — created via @see Macro.add() + * @since 2.0.0 + */ + self: object; + /** + * Returns whether any of the macro's ancestors passed the test implemented by the given + * filter function. + * @param filter he function used to test each ancestor execution context object, which + * is passed in as its sole parameter. + * @since 2.0.0 + */ + contextHas(filter: (MacroContexObject) => boolean): boolean; - declare interface MacroContex { - /** - * The argument string parsed into an array of discrete arguments. - * @since 2.0.0 - */ - args: MacroArgsArray; + /** + * Returns the first of the macro's ancestors which passed the test implemented by the given + * filter function or null, if no members pass. + * @param filter The function used to test each ancestor execution context object, which is + * passed in as its sole parameter. + * @since 2.0.0 + */ + contextSelect(filter: (MacroContexObject) => boolean): object; - /** - * The name of the macro. - * @since 2.0.0 - */ - name: string; + /** + * Returns a new array containing all of the macro's ancestors which passed the test implemented + * by the given filter function or an empty array, if no members pass. + * @since 2.0.0 + * @param filter + */ + contextSelectAll(filter: (MacroContexObject) => boolean): object[]; - /** - * The current output element. - * @since 2.0.0 - */ - output: HTMLElement; + /** + * Renders the message prefixed with the name of the macro and returns false. + * @param message The error message to output. + * @since 2.0.0 + */ + error(message: string): false; + } - /** - * The (execution) context object of the macro's parent, or null if the macro has no parent. - * @since 2.0.0 - */ - parent: object; + interface Macro { + /** + * Add new macro(s). + * @param name Name, or array of names, of the macro(s) to add. + * @param definition Definition of the macro(s) or the name of an existing macro whose definition to copy. + * Definition object: + * A macro definition object should have some of the following properties (only handler is absolutely required): + * skipArgs: (optional, boolean) Disables parsing argument strings into discrete arguments. Used by macros which + * only use the raw/full argument strings. + * tags: (optional, null | string array) Signifies that the macro is a container macro—i.e. not self-closing. An + * array of the names of the child tags, or null if there are no child tags. + * handler: (function) The macro's main function. It will be called without arguments, but with its this set to a + * macro context object. + * @param deep Enables deep cloning of the definition. Used to give macros separate instances of the same + * definition. + * @since 2.0.0 + * @example + * // Example of a very simple/naive <<if>>/<<elseif>>/<<else>> macro implementation. + * Macro.add('if', { + * skipArgs: true, + * tags: ['elseif', 'else'], + * handler: function () { + * try { + * for (var i = 0, len = this.payload.length; i < len; ++i) { + * if ( + * this.payload[i].name === 'else' || + * !!Scripting.evalJavaScript(this.payload[i].args.full) + * ) { + * jQuery(this.output).wiki(this.payload[i].contents); + * break; + * } + * } + * } + * catch (ex) { + * return this.error('bad conditional expression: ' + ex.message); + * } + * } + * }); + */ + add(name: string | string[], + definition: { handler: (this: MacroContex) => void, tags?: string[], skipArgs?: boolean }, + deep?: boolean): void; - /** - * The text of a container macro parsed into discrete payload objects by tag. - * @since 2.0.0 - */ - payload: MacroContexObject[]; + /** + * Remove existing macro(s). + * @param name Name, or array of names, of the macro(s) to remove. + * @since 2.0.0 + */ + delete(name: string | string[]): void; - /** - * The macro's definition — created via @see Macro.add() - * @since 2.0.0 - */ - self: object; + /** + * Return the named macro definition, or null on failure. + * @param name Name of the macro whose definition should be returned. + * @since 2.0.0 + */ + get(name: string): object; - /** - * Returns whether any of the macro's ancestors passed the test implemented by the given - * filter function. - * @param filter he function used to test each ancestor execution context object, which - * is passed in as its sole parameter. - * @since 2.0.0 - */ - contextHas(filter: (MacroContexObject) => boolean): boolean; + /** + * Returns whether the named macro exists. + * @param name Name of the macro to search for. + * @since 2.0.0 + */ + has(name: string): boolean; - /** - * Returns the first of the macro's ancestors which passed the test implemented by the given - * filter function or null, if no members pass. - * @param filter The function used to test each ancestor execution context object, which is - * passed in as its sole parameter. - * @since 2.0.0 - */ - contextSelect(filter: (MacroContexObject) => boolean): object; + /** + * @since 2.0.0 + */ + tags: MacroTags; + } - /** - * Returns a new array containing all of the macro's ancestors which passed the test implemented - * by the given filter function or an empty array, if no members pass. - * @since 2.0.0 - * @param filter - */ - contextSelectAll(filter: (MacroContexObject) => boolean): object[]; + interface Passage { + /** + * The DOM ID of the passage (created from the slugified passage title). + * @since 2.0.0 + */ + domId: string; - /** - * Renders the message prefixed with the name of the macro and returns false. - * @param message The error message to output. - * @since 2.0.0 - */ - error(message: string): false; - } + /** + * The tags of the passage. + * @since 2.0.0 + */ + tags: string[]; - declare interface Macro { - /** - * Add new macro(s). - * @param name Name, or array of names, of the macro(s) to add. - * @param definition Definition of the macro(s) or the name of an existing macro whose definition to copy. - * Definition object: - * A macro definition object should have some of the following properties (only handler is absolutely required): - * skipArgs: (optional, boolean) Disables parsing argument strings into discrete arguments. Used by macros which - * only use the raw/full argument strings. - * tags: (optional, null | string array) Signifies that the macro is a container macro—i.e. not self-closing. An - * array of the names of the child tags, or null if there are no child tags. - * handler: (function) The macro's main function. It will be called without arguments, but with its this set to a - * macro context object. - * @param deep Enables deep cloning of the definition. Used to give macros separate instances of the same - * definition. - * @since 2.0.0 - * @example - * // Example of a very simple/naive <<if>>/<<elseif>>/<<else>> macro implementation. - * Macro.add('if', { - * skipArgs: true, - * tags: ['elseif', 'else'], - * handler: function () { - * try { - * for (var i = 0, len = this.payload.length; i < len; ++i) { - * if ( - * this.payload[i].name === 'else' || - * !!Scripting.evalJavaScript(this.payload[i].args.full) - * ) { - * jQuery(this.output).wiki(this.payload[i].contents); - * break; - * } - * } - * } - * catch (ex) { - * return this.error('bad conditional expression: ' + ex.message); - * } - * } - * }); - */ - add(name: string | string[], - definition: { handler: (this: MacroContex) => void, tags?: string[], skipArgs?: boolean }, - deep?: boolean): void; + /** + * The raw text of the passage. + * @since 2.0.0 + */ + text: string; - /** - * Remove existing macro(s). - * @param name Name, or array of names, of the macro(s) to remove. - * @since 2.0.0 - */ - delete(name: string | string[]): void; + /** + * The title of the passage. + * @since 2.0.0 + */ + title: string; - /** - * Return the named macro definition, or null on failure. - * @param name Name of the macro whose definition should be returned. - * @since 2.0.0 - */ - get(name: string): object; + /** + * Returns the description of the passage (created from either an excerpt of the passage or the + * Config.passages.descriptions object). + * @since 2.0.0 + */ + description(): string; - /** - * Returns whether the named macro exists. - * @param name Name of the macro to search for. - * @since 2.0.0 - */ - has(name: string): boolean; + /** + * Returns the text of the Passage object (similar to <Passage>.text) after applying nobr tag and image passage + * processing to it. + * @since 2.0.0 + */ + processText(): string; + } - /** - * @since 2.0.0 - */ - tags: MacroTags; - } + interface SavedMoment { + /** The title of the associated passage. */ + title: string; + /** The current variable store object, which contains sigil - less name ⇒ value pairs(e.g.$foo exists as foo). */ + variables: any; + /** The current pull count of SugarCube's seedable PRNG, exists only if enabled. */ + pull?: number; + } - declare interface Passage { - /** - * The DOM ID of the passage (created from the slugified passage title). - * @since 2.0.0 - */ - domId: string; + interface SavedState { + /** The array of moment objects. */ + history: SavedMoment[]; + /** The index of the active moment. */ + index: number; + /** The array of expired moment passage titles, exists only if any moments have expired. */ + expired?: string[]; + /** The seed of SugarCube's seedable PRNG, exists only if enabled. */ + seed?: string; + } - /** - * The tags of the passage. - * @since 2.0.0 - */ - tags: string[]; + interface SaveObject { + /** The story's save ID.*/ + id: string; + /** The marshaled story history(see below for details). */ + state: SavedState; + /** The title of the save. */ + title: string; + /** The date when the save was created(in milliseconds elapsed since epoch). */ + date: number; + /** Save metadata(end - user specified; must be JSON - serializable). */ + metadata?: any; + /** Save version(end - user specified via Config.saves.version). */ + version?: any; + } + interface Save { + /** + * Deletes all slot saves and the autosave, if it's enabled. + * @since 2.0.0 + */ + clear(): void; - /** - * The raw text of the passage. - * @since 2.0.0 - */ - text: string; + /** + * Returns the saves object. + * @since 2.0.0 + */ + get(): object; - /** - * The title of the passage. - * @since 2.0.0 - */ - title: string; + /** + * Returns whether both the slot saves and autosave are available and ready. + * @since 2.0.0 + */ + ok(): boolean; - /** - * Returns the description of the passage (created from either an excerpt of the passage or the - * Config.passages.descriptions object). - * @since 2.0.0 - */ - description(): string; + slots: { + /** + * Returns the total number of available slots. + * @since 2.0.0 + */ + length: number; + + /** + * Returns the total number of filled slots. + * @since 2.0.0 + */ + count(): number; + + /** + * Deletes a save from the given slot. + * @param slot Save slot index (0-based). + * @since 2.0.0 + */ + delete(slot: number): void; + + /** + * Returns a save object from the given slot or null, if there was no save in the given slot. + * @param slot Save slot index (0-based). + * @since 2.0.0 + */ + get(slot: number): SaveObject; + + /** + * Returns whether the given slot is filled. + * @param slot Save slot index (0-based). + * @since 2.0.0 + */ + has(slot: number): boolean; + + /** + * Returns whether there are any filled slots. + * @since 2.0.0 + */ + isEmpty(): boolean; + + /** + * Loads a save from the given slot. + * @param slot + */ + load(slot: number): void; + + /** + * Returns whether the slot saves are available and ready. + * @since 2.0.0 + */ + ok(): boolean; + + /** + * Saves to the given slot. + * @param slot Save slot index (0-based). + * @param title The title of the save. If omitted or null, defaults to the passage's description. + * @param metadata The data to be stored in the save object's metadata property. Must be JSON-serializable. + * @since 2.0.0 + */ + save(slot: number, title?: string, metadata?: any): void; + } + + autosave: { + /** + * Deletes the autosave. + * @since 2.0.0 + */ + delete(): void; + + /** + * Returns the save object from the autosave or null, if there was no autosave. + * @since 2.0.0 + */ + get(): SaveObject; + + /** + * Returns whether the autosave is filled. + * @since 2.0.0 + */ + has(): boolean; + + /** + * Loads the autosave. + * @since 2.0.0 + */ + load(): void; + + /** + * Returns whether the autosave is available and ready. + * @since 2.0.0 + */ + ok(): boolean; + + /** + * Saves to the autosave. + * @param title The title of the save. If omitted or null, defaults to the passage's description. + * @param metadata The data to be stored in the save object's metadata property. Must be JSON-serializable. + * @since 2.0.0 + */ + save(title?: string, metadata?: any): void; + } - /** - * Returns the text of the Passage object (similar to <Passage>.text) after applying nobr tag and image passage - * processing to it. - * @since 2.0.0 - */ - processText(): string; - } + /** + * Saves to disk. + * @param filename The base filename of the save, which gets slugified to remove most symbols. Appended to this is a datestamp + * (format: YYYMMDD-hhmmss) and the file extension .save. (e.g. "The Scooby Chronicles" would result in the full filename: + * the-scooby-chronicles-{datestamp}.save). If omitted or null, defaults to the story's title. + * @param metadata The data to be stored in the save object's metadata property. Must be JSON-serializable. + * @since 2.8.0 + */ + export(filename?: string, metadata?: any): void; - declare interface SavedMoment { - /** The title of the associated passage. */ - title: string; - /** The current variable store object, which contains sigil - less name ⇒ value pairs(e.g.$foo exists as foo). */ - variables: any; - /** The current pull count of SugarCube's seedable PRNG, exists only if enabled. */ - pull?: number; - } + /** + * Loads a save from disk. + * + * NOTE: You do not call this manually, it must be called by the change event handler of an <input type="file"> element. + * @param event The event object which was passed to the change event handler of the associated <input type="file"> element. + * @since 2.0.0 + * @example + * // Add file input + * var input = document.createElement('input'); + * input.type = 'file'; + * input.id = 'saves-import-file'; + * input.name = 'saves-import-file'; + * // Set up Save.import() as the event handler for when a file has been chosen + * jQuery(input).on('change', Save.import); + */ + import(event: Event): void; - declare interface SavedState { - /** The array of moment objects. */ - history: SavedMoment[]; - /** The index of the active moment. */ - index: number; - /** The array of expired moment passage titles, exists only if any moments have expired. */ - expired?: string[]; - /** The seed of SugarCube's seedable PRNG, exists only if enabled. */ - seed?: string; - } + /** + * Returns a save as a serialized string, or null if saving is not allowed within the current context. + * @param metadata The data to be stored as metadata. Must be JSON-serializable. + * @since 2.21.0 + */ + serialize(metadata?: any): string; - declare interface SaveObject { - /** The story's save ID.*/ - id: string; - /** The marshaled story history(see below for details). */ - state: SavedState; - /** The title of the save. */ - title: string; - /** The date when the save was created(in milliseconds elapsed since epoch). */ - date: integer; - /** Save metadata(end - user specified; must be JSON - serializable). */ - metadata?: any; - /** Save version(end - user specified via Config.saves.version). */ - version?: any; - } + /** + * Deserializes the given save string, created via Save.serialize(), and loads the save. Returns the bundled metadata, if any, + * or null if the given save could not be deserialized and loaded. + * @param saveStr The serialized save string. + * @since 2.21.0 + */ + deserialize(saveStr: string): any; + } - declare interface Save { - /** - * Deletes all slot saves and the autosave, if it's enabled. - * @since 2.0.0 - */ - clear(): void; + interface Settings { + /** + * Adds a header to the Settings dialog. + * @param name Name of the header. + * @param desc Description explaining the header in greater detail. + * @since 2.7.1 + */ + addHeader(name: string, desc?: string): void; - /** - * Returns the saves object. - * @since 2.0.0 - */ - get(): object; + /** + * Adds the named property to the settings object and a toggle control for it to the Settings dialog. + * @param name Name of the settings property to add, which the control will manage. + * @param definition Definition of the control. + * @since 2.26.0 + */ + addToggle(name: string, definition: { + label: string, + desc?: string, + default?: boolean, + onInit?: () => void, + onChange?: () => void + }): void; - /** - * Returns whether both the slot saves and autosave are available and ready. - * @since 2.0.0 - */ - ok(): boolean; + /** + * Adds the named property to the settings object and a list control for it to the Settings dialog. + * @param name Name of the settings property to add, which the control will manage. + * @param definition Definition of the control. + * @since 2.26.0 + */ + addList(name: string, definition: { + label: string, + list: [], + desc?: string, + default?: any, + onInit?: () => void, + onChange?: () => void + }): void; - slots: { /** - * Returns the total number of available slots. + * Adds the named property to the settings object and a range control for it to the Settings dialog. + * @param name Name of the settings property to add, which the control will manage. + * @param definition Definition of the control. * @since 2.0.0 */ - length: number; + addRange(name: string, definition: { + /** Label to use for the control. */ + label: string, + /** The minimum value. */ + min: number, + /** The maximum value. */ + max: number, + /** Limits the increments to which the value may be set.It must be evenly divisible into the full range + * — i.e.max - min. */ + step: number, + /** Description explaining the control in greater detail. */ + desc?: string, + /** The default value for the setting and default state of the control.Leaving it undefined means to use + * the value of max as the default. */ + default?: number, + /** The function to call during initialization. */ + onInit?: () => void, + /** The function to call when the control's state is changed. */ + onChange?: () => void + }): void; /** - * Returns the total number of filled slots. + * Loads the settings from storage. + * + * NOTE: The API automatically calls this method at startup, so you should never need to call this method manually. * @since 2.0.0 */ - count(): number; + load(): void; /** - * Deletes a save from the given slot. - * @param slot Save slot index (0-based). + * Resets the setting with the given name to its default value. If no name is given, resets all settings. + * @param name Name of the settings object property to reset. * @since 2.0.0 */ - delete(slot: number): void; + reset(name?: string): void; /** - * Returns a save object from the given slot or null, if there was no save in the given slot. - * @param slot Save slot index (0-based). + * Saves the settings to storage. + * + * NOTE: The controls of the Settings dialog automatically call this method when settings are changed, + * so you should normally never need to call this method manually. Only when manually modifying the values + * of settings object properties, outside of the controls, would you need to call this method. * @since 2.0.0 */ - get(slot: number): SaveObject; + save(); + } + interface Story { /** - * Returns whether the given slot is filled. - * @param slot Save slot index (0-based). + * The DOM ID of the story (created from the slugified story title). * @since 2.0.0 */ - has(slot: number): boolean; + domId: string; /** - * Returns whether there are any filled slots. + * The title of the story. * @since 2.0.0 */ - isEmpty(): boolean; + title: string; /** - * Loads a save from the given slot. - * @param slot + * Returns the Passage object referenced by the given title, or an empty Passage object on failure. + * @param passageTitle The title of the Passage object to return. + * @since 2.0.0 */ - load(slot: number): void; + get(passageTitle: string): Passage; /** - * Returns whether the slot saves are available and ready. + * Returns whether a Passage object referenced by the given title exists. + * @param passageTitle The title of the Passage object whose existence will be verified. * @since 2.0.0 */ - ok(): boolean; + has(passageTitle): boolean; /** - * Saves to the given slot. - * @param slot Save slot index (0-based). - * @param title The title of the save. If omitted or null, defaults to the passage's description. - * @param metadata The data to be stored in the save object's metadata property. Must be JSON-serializable. + * Returns an array of Passage objects each of which must contain a property matching the given name, + * whose value matches the given needle, or an empty array, if no matches are made. + * @param propertyName The name of property whose value will be compared to the search value. + * @param searchValue he value to search for within the matched property. The type of the property determines + * how the search occurs; direct comparison for non-arrays, while arrays are iterated over. If the property + * value, for non-arrays, or any of the property members' values, for arrays, match, then the Passage object + * is added to the results array. + * @param sortProperty The property whose value will be used to lexicographically sort the returned array. + * If not given, the Passage object's title property is used. * @since 2.0.0 + * @example + * // Returns all 'forest'-tagged Passage objects, sorted by their titles + * Story.lookup("tags", "forest"); */ - save(slot: number, title?: string, metadata?: any): void; + lookup(propertyName: string, searchValue: string | number, sortProperty?: string): Passage[]; + + /** + * Returns an array of Passage objects which passed the test implemented by the given filter function or + * an empty array, if no objects pass. + * @param filter The function used to test each Passage object, which is passed in as its sole parameter. + * If the function returns true, then the Passage object is added to the results array. + * @param sortProperty The property whose value will be used to lexicographically sort the returned array. + * If not given, the Passage object's title property is used. + * @since 2.11.0 + */ + lookupWith(filter: (p: Passage) => boolean, sortProperty?: string): Passage[]; } - autosave: { + interface UI { /** - * Deletes the autosave. + * Opens the built-in alert dialog, displaying the given message to the player. + * @param message The message to display to the player. + * @param options The options object. @see Dialog.addClickHandler() for more information. + * @param closeFn The function to execute whenever the dialog is closed. * @since 2.0.0 */ - delete(): void; + alert(message: string, options?: object, closeFn?: () => void): void; /** - * Returns the save object from the autosave or null, if there was no autosave. + * Opens the built-in jump to dialog, which is populated via the bookmark tag. + * @param options The options object. @see Dialog.addClickHandler() for more information. + * @param closeFn The function to execute whenever the dialog is closed. * @since 2.0.0 */ - get(): SaveObject; + jumpto(options: object, closeFn?: () => void): void; /** - * Returns whether the autosave is filled. + * Opens the built-in restart dialog, prompting the player to restart the story. + * @param options The options object. @see Dialog.addClickHandler() for more information. * @since 2.0.0 */ - has(): boolean; + restart(options?: any): void; /** - * Loads the autosave. + * Opens the built-in saves dialog. + * @param options The options object. See Dialog.addClickHandler() for more information. + * @param closeFn The function to execute whenever the dialog is closed. * @since 2.0.0 */ - load(): void; + saves(options: object, closeFn?: () => void): void; /** - * Returns whether the autosave is available and ready. - * @since 2.0.0 + * Opens the built-in settings dialog, which is populated from the Setting API. + * @param options The options object. See Dialog.addClickHandler() for more information. + * @param closeFn The function to execute whenever the dialog is closed. + * @sine 2.0.0 + * */ - ok(): boolean; + settings(options: object, closeFn?: () => void): void; /** - * Saves to the autosave. - * @param title The title of the save. If omitted or null, defaults to the passage's description. - * @param metadata The data to be stored in the save object's metadata property. Must be JSON-serializable. + * Opens the built-in share dialog, which is populated from the StoryShare passage. + * @param options The options object. See Dialog.addClickHandler() for more information. + * @param closeFn The function to execute whenever the dialog is closed. * @since 2.0.0 */ - save(title?: string, metadata?: any): void; + share(options: object, closeFn?: () => void): void; } - /** - * Saves to disk. - * @param filename The base filename of the save, which gets slugified to remove most symbols. Appended to this is a datestamp - * (format: YYYMMDD-hhmmss) and the file extension .save. (e.g. "The Scooby Chronicles" would result in the full filename: - * the-scooby-chronicles-{datestamp}.save). If omitted or null, defaults to the story's title. - * @param metadata The data to be stored in the save object's metadata property. Must be JSON-serializable. - * @since 2.8.0 - */ - export(filename?: string, metadata?: any): void; - - /** - * Loads a save from disk. - * - * NOTE: You do not call this manually, it must be called by the change event handler of an <input type="file"> element. - * @param event The event object which was passed to the change event handler of the associated <input type="file"> element. - * @since 2.0.0 - * @example - * // Add file input - * var input = document.createElement('input'); - * input.type = 'file'; - * input.id = 'saves-import-file'; - * input.name = 'saves-import-file'; - * // Set up Save.import() as the event handler for when a file has been chosen - * jQuery(input).on('change', Save.import); - */ - import(event: Event): void; - - /** - * Returns a save as a serialized string, or null if saving is not allowed within the current context. - * @param metadata The data to be stored as metadata. Must be JSON-serializable. - * @since 2.21.0 - */ - serialize(metadata?: any): string; - - /** - * Deserializes the given save string, created via Save.serialize(), and loads the save. Returns the bundled metadata, if any, - * or null if the given save could not be deserialized and loaded. - * @param saveStr The serialized save string. - * @since 2.21.0 - */ - deserialize(saveStr: string): any; - } - - declare interface Settings { - /** - * Adds a header to the Settings dialog. - * @param name Name of the header. - * @param desc Description explaining the header in greater detail. - * @since 2.7.1 - */ - addHeader(name: string, desc?: string): void; - - /** - * Adds the named property to the settings object and a toggle control for it to the Settings dialog. - * @param name Name of the settings property to add, which the control will manage. - * @param definition Definition of the control. - * @since 2.26.0 - */ - addToggle(name: string, definition: { - label: string, - desc?: string, - default?: boolean, - onInit?: () => void, - onChange?: () => void - }): void; - - /** - * Adds the named property to the settings object and a list control for it to the Settings dialog. - * @param name Name of the settings property to add, which the control will manage. - * @param definition Definition of the control. - * @since 2.26.0 - */ - addList(name: string, definition: { - label: string, - list: [], - desc?: string, - default?: any, - onInit?: () => void, - onChange?: () => void - }): void; - - /** - * Adds the named property to the settings object and a range control for it to the Settings dialog. - * @param name Name of the settings property to add, which the control will manage. - * @param definition Definition of the control. - * @since 2.0.0 - */ - addRange(name: string, definition: { - /** Label to use for the control. */ - label: string, - /** The minimum value. */ - min: number, - /** The maximum value. */ - max: number, - /** Limits the increments to which the value may be set.It must be evenly divisible into the full range - * — i.e.max - min. */ - step: numbe, - /** Description explaining the control in greater detail. */ - desc?: string, - /** The default value for the setting and default state of the control.Leaving it undefined means to use - * the value of max as the default. */ - default?: number, - /** The function to call during initialization. */ - onInit?: () => void, - /** The function to call when the control's state is changed. */ - onChange?: () => void - }): void; - - /** - * Loads the settings from storage. - * - * NOTE: The API automatically calls this method at startup, so you should never need to call this method manually. - * @since 2.0.0 - */ - load(): void; - - /** - * Resets the setting with the given name to its default value. If no name is given, resets all settings. - * @param name Name of the settings object property to reset. - * @since 2.0.0 - */ - reset(name?: string): void; - - /** - * Saves the settings to storage. - * - * NOTE: The controls of the Settings dialog automatically call this method when settings are changed, - * so you should normally never need to call this method manually. Only when manually modifying the values - * of settings object properties, outside of the controls, would you need to call this method. - * @since 2.0.0 - */ - save(); - } - - declare interface Story { - /** - * The DOM ID of the story (created from the slugified story title). - * @since 2.0.0 - */ - domId: string; - - /** - * The title of the story. - * @since 2.0.0 - */ - title: string; - - /** - * Returns the Passage object referenced by the given title, or an empty Passage object on failure. - * @param passageTitle The title of the Passage object to return. - * @since 2.0.0 - */ - get(passageTitle: string): Passage; - - /** - * Returns whether a Passage object referenced by the given title exists. - * @param passageTitle The title of the Passage object whose existence will be verified. - * @since 2.0.0 - */ - has(passageTitle): boolean; - - /** - * Returns an array of Passage objects each of which must contain a property matching the given name, - * whose value matches the given needle, or an empty array, if no matches are made. - * @param propertyName The name of property whose value will be compared to the search value. - * @param searchValue he value to search for within the matched property. The type of the property determines - * how the search occurs; direct comparison for non-arrays, while arrays are iterated over. If the property - * value, for non-arrays, or any of the property members' values, for arrays, match, then the Passage object - * is added to the results array. - * @param sortProperty The property whose value will be used to lexicographically sort the returned array. - * If not given, the Passage object's title property is used. - * @since 2.0.0 - * @example - * // Returns all 'forest'-tagged Passage objects, sorted by their titles - * Story.lookup("tags", "forest"); - */ - lookup(propertyName: string, searchValue: string | number, sortProperty?: string): Passage[]; - - /** - * Returns an array of Passage objects which passed the test implemented by the given filter function or - * an empty array, if no objects pass. - * @param filter The function used to test each Passage object, which is passed in as its sole parameter. - * If the function returns true, then the Passage object is added to the results array. - * @param sortProperty The property whose value will be used to lexicographically sort the returned array. - * If not given, the Passage object's title property is used. - * @since 2.11.0 - */ - lookupWith(filter: (p: Passage) => boolean, sortProperty?:string): Passage[]; - } - - declare interface UI { - /** - * Opens the built-in alert dialog, displaying the given message to the player. - * @param message The message to display to the player. - * @param options The options object. @see Dialog.addClickHandler() for more information. - * @param closeFn The function to execute whenever the dialog is closed. - * @since 2.0.0 - */ - alert(message: string, options?: object, closeFn?: () => void): void; - - /** - * Opens the built-in jump to dialog, which is populated via the bookmark tag. - * @param options The options object. @see Dialog.addClickHandler() for more information. - * @param closeFn The function to execute whenever the dialog is closed. - * @since 2.0.0 - */ - jumpto(options: object, closeFn?: () => void): void; - - /** - * Opens the built-in restart dialog, prompting the player to restart the story. - * @param options The options object. @see Dialog.addClickHandler() for more information. - * @since 2.0.0 - */ - restart(options?: any): void; - - /** - * Opens the built-in saves dialog. - * @param options The options object. See Dialog.addClickHandler() for more information. - * @param closeFn The function to execute whenever the dialog is closed. - * @since 2.0.0 - */ - saves(options: object, closeFn?: () => void): void; + interface UIBar { + /** + * Completely removes the UI bar and all of its associated styles and event handlers. + * @since 2.17.0 + */ + destroy(): void; - /** - * Opens the built-in settings dialog, which is populated from the Setting API. - * @param options The options object. See Dialog.addClickHandler() for more information. - * @param closeFn The function to execute whenever the dialog is closed. - * @sine 2.0.0 - * - */ - settings(options: object, closeFn?: () => void): void; + /** + * Stows the UI bar, so that it takes up less space. + * @since 2.17.0 + */ + stow(): void; - /** - * Opens the built-in share dialog, which is populated from the StoryShare passage. - * @param options The options object. See Dialog.addClickHandler() for more information. - * @param closeFn The function to execute whenever the dialog is closed. - * @since 2.0.0 - */ - share(options: object, closeFn?: () => void): void; - } + /** + * Unstows UI bar, so that it is fully accessible again. + * @since 2.17.0 + */ + unstow(): void; + } - declare interface UIBar { - /** - * Completely removes the UI bar and all of its associated styles and event handlers. - * @since 2.17.0 - */ - destroy(): void; + interface StoryMoment { + title: string; + variables: any; + } - /** - * Stows the UI bar, so that it takes up less space. - * @since 2.17.0 - */ - stow(): void; + interface State { + /** + * Returns the active (present) moment. + * @since 2.0.0 + */ + active: StoryMoment; + /** + * Returns the bottommost (least recent) moment from the full in-play history (past + future). + * @since 2.0.0 + */ + bottom: StoryMoment; + /** + * Returns the current moment from the full in-play history (past + future), which is the pre-play version of the active + * moment. + * + * WARNING: State.current is not a synonym for State.active. You will, very likely, never need to use State.current + * directly within your code. + * + * @since 2.8.0 + */ + current: StoryMoment; + /** + * Returns the number of moments within the past in-play history (past only). + * @since 2.0.0 + */ + length: number; + /** + * Returns the title of the passage associated with the active (present) moment. + * @since 2.0.0 + */ + passage: string; + /** + * Returns the current temporary variables. + * @since 2.13.0 + */ + temporary: any; + /** + * Returns the number of moments within the full in-play history (past + future). + * @since 2.0.0 + */ + size: number; + /** + * Returns the topmost (most recent) moment from the full in-play history (past + future). + * + * WARNING: State.top is not a synonym for State.active. You will, very likely, never need to use State.top directly + * within your code. + * @since 2.0.0 + */ + top: StoryMoment; + /** + * Returns the total number of played moments within the extended past history (expired + past). + * @since 2.0.0 + */ + turns: number; + /** + * Returns the variables from the active (present) moment. + * @since 2.0.0 + */ + variables: any; + /** + * Returns the value of the story or temporary variable by the given name. + * @param varName The name of the story or temporary variable, including its sigil—e.g. $charName. + * @since 2.22.0 + */ + getVar(varName: string): any; + /** + * Returns whether any moments with the given title exist within the past in-play history (past only). + * + * NOTE: State.has() does not check expired moments. If you need to know if the player has ever been to a particular + * passage, then you must use the State.hasPlayed() method or the hasVisited() story function. + * @param passageTitle The title of the moment whose existence will be verified. + * @since 2.0.0 + */ + has(passageTitle: string): boolean; + /** + * Returns whether any moments with the given title exist within the extended past history (expired + past). + * + * NOTE: If you need to check for multiple passages, the hasVisited() story function will likely be more convenient to + * use. + * @param passageTitle The title of the moment whose existence will be verified. + * @since 2.0.0 + */ + hasPlayed(passageTitle: string): boolean; + /** + * Returns the moment, relative to the bottom of the past in-play history (past only), at the given index. + * @param index The index of the moment to return. + * @since 2.0.0 + */ + index(index: number): StoryMoment; + /** + * Initializes the seedable pseudo-random number generator (PRNG) and integrates it into the story state and saves. + * Once initialized, the State.random() method and story functions, random() and randomFloat(), return results from + * the seeded PRNG (by default, they return results from Math.random()). + * + * NOTE: State.initPRNG() must be called during story initialization, within either a script section (Twine 2: the + * Story JavaScript, Twine 1/Twee: a script-tagged passage) or the StoryInit special passage. Additionally, it is + * recommended that you do not specify any arguments to State.initPRNG() and allow it to automatically seed itself. If + * you should chose to use an explicit seed, however, it is strongly recommended that you also enable additional + * entropy, otherwise all playthroughs for all players will be exactly the same. + * @param seed The explicit seed used to initialize the pseudo-random number generator. + * @param useEntropy Enables the use of additional entropy to pad the specified explicit seed. + * @since 2.0.0 + * @example + * State.initPRNG() // Automatically seed the PRNG (recommended) + * State.initPRNG("aVeryLongSeed") // Seed the PRNG with "aVeryLongSeed" + * State.initPRNG("aVeryLongSeed", true) // Seed the PRNG with "aVeryLongSeed" and pad it with extra entropy + */ + initPRNG(seed?: string, useEntropy?: boolean): void; + /** + * Returns whether the full in-play history (past + future) is empty. + * @since 2.0.0 + */ + isEmpty(): boolean; + /** + * Returns the moment, relative to the top of the past in-play history (past only), at the, optional, offset. + * @param offset The offset, from the top of the past in-play history, of the moment to return. If not given, an offset + * of 0 is used. + */ + peek(offset?: number): StoryMoment; + /** + * Returns a pseudo-random real number (floating-point) in the range 0 (inclusive) up to, but not including, 1 + * (exclusive). + * + * NOTE: By default, it simply returns results from Math.random(), however, when the seedable PRNG has been enabled, + * via State.initPRNG(), it returns results from the seeded PRNG instead. + * @since 2.0.0 + */ + random(): number; + /** + * Sets the value of the story or temporary variable by the given name. Returns whether the operation was successful. + * @param varName The name of the story or temporary variable, including its sigil—e.g. $charName. + * @param value The value to assign. + * @since 2.22.0 + */ + setVar(varName: string, value: any): boolean; + } + interface Wikifier { + createExternalLink(destination: string, url: string, text: string): HTMLElement; + createInternalLink(destination: string, passage: string, text: string, callback: () => void): HTMLElement; + evalExpression(code: string, output: any): any; + evalStatements(code: string, output: any): any; + /** + * @see State.getVar + */ + getValue(varName: string): any; + /** + * @see Story.has + * @param link link + */ + isExternalLink(link: string): boolean; + parse(text: string): any; + /** + * @see State.setVar + */ + setValue(varName: string, value: any): boolean; + wikifyEval(text: string): string; + } - /** - * Unstows UI bar, so that it is fully accessible again. - * @since 2.17.0 - */ - unstow(): void; - } + interface ISugarCube { + Config: Config; + Dialog: Dialog; + Engine: Engine; + Macro: Macro; + Save: Save; + State: State; + Story: Story; + UI: UI; + /** + * Player settings object, set up by the author/developer. See Setting API for more information. + * @since 2.0.0 + */ + settings: any; + /** + * Object that authors/developers may use to set up various bits of static data. + * + * Generally, you would use this for data that does not change and should not be stored + * within story variables, which would make it part of the history. + * @since 2.0.0 + * */ + setup: any; - declare interface StoryMoment { - title: string; - variables: any; + Wikifier: Wikifier; + } } - declare interface State { - /** - * Returns the active (present) moment. - * @since 2.0.0 - */ - active: StoryMoment; - /** - * Returns the bottommost (least recent) moment from the full in-play history (past + future). - * @since 2.0.0 - */ - bottom: StoryMoment; - /** - * Returns the current moment from the full in-play history (past + future), which is the pre-play version of the active - * moment. - * - * WARNING: State.current is not a synonym for State.active. You will, very likely, never need to use State.current - * directly within your code. - * - * @since 2.8.0 - */ - current: StoryMoment; - /** - * Returns the number of moments within the past in-play history (past only). - * @since 2.0.0 - */ - length: number; - /** - * Returns the title of the passage associated with the active (present) moment. - * @since 2.0.0 - */ - passage: string; - /** - * Returns the current temporary variables. - * @since 2.13.0 - */ - temporary: any; - /** - * Returns the number of moments within the full in-play history (past + future). - * @since 2.0.0 - */ - size: number; - /** - * Returns the topmost (most recent) moment from the full in-play history (past + future). - * - * WARNING: State.top is not a synonym for State.active. You will, very likely, never need to use State.top directly - * within your code. - * @since 2.0.0 - */ - top: StoryMoment; - /** - * Returns the total number of played moments within the extended past history (expired + past). - * @since 2.0.0 - */ - turns: number; - /** - * Returns the variables from the active (present) moment. - * @since 2.0.0 - */ - variables: any; - /** - * Returns the value of the story or temporary variable by the given name. - * @param varName The name of the story or temporary variable, including its sigil—e.g. $charName. - * @since 2.22.0 - */ - getVar(varName: string): any; - /** - * Returns whether any moments with the given title exist within the past in-play history (past only). - * - * NOTE: State.has() does not check expired moments. If you need to know if the player has ever been to a particular - * passage, then you must use the State.hasPlayed() method or the hasVisited() story function. - * @param passageTitle The title of the moment whose existence will be verified. - * @since 2.0.0 - */ - has(passageTitle: string): boolean; - /** - * Returns whether any moments with the given title exist within the extended past history (expired + past). - * - * NOTE: If you need to check for multiple passages, the hasVisited() story function will likely be more convenient to - * use. - * @param passageTitle The title of the moment whose existence will be verified. - * @since 2.0.0 - */ - hasPlayed(passageTitle: string): boolean; - /** - * Returns the moment, relative to the bottom of the past in-play history (past only), at the given index. - * @param index The index of the moment to return. - * @since 2.0.0 - */ - index(index: number): StoryMoment; - /** - * Initializes the seedable pseudo-random number generator (PRNG) and integrates it into the story state and saves. - * Once initialized, the State.random() method and story functions, random() and randomFloat(), return results from - * the seeded PRNG (by default, they return results from Math.random()). - * - * NOTE: State.initPRNG() must be called during story initialization, within either a script section (Twine 2: the - * Story JavaScript, Twine 1/Twee: a script-tagged passage) or the StoryInit special passage. Additionally, it is - * recommended that you do not specify any arguments to State.initPRNG() and allow it to automatically seed itself. If - * you should chose to use an explicit seed, however, it is strongly recommended that you also enable additional - * entropy, otherwise all playthroughs for all players will be exactly the same. - * @param seed The explicit seed used to initialize the pseudo-random number generator. - * @param useEntropy Enables the use of additional entropy to pad the specified explicit seed. - * @since 2.0.0 - * @example - * State.initPRNG() // Automatically seed the PRNG (recommended) - * State.initPRNG("aVeryLongSeed") // Seed the PRNG with "aVeryLongSeed" - * State.initPRNG("aVeryLongSeed", true) // Seed the PRNG with "aVeryLongSeed" and pad it with extra entropy - */ - initPRNG(seed?: string, useEntropy?: boolean): void; - /** - * Returns whether the full in-play history (past + future) is empty. - * @since 2.0.0 - */ - isEmpty(): boolean; - /** - * Returns the moment, relative to the top of the past in-play history (past only), at the, optional, offset. - * @param offset The offset, from the top of the past in-play history, of the moment to return. If not given, an offset - * of 0 is used. - */ - peek(offset?: number): StoryMoment; - /** - * Returns a pseudo-random real number (floating-point) in the range 0 (inclusive) up to, but not including, 1 - * (exclusive). - * - * NOTE: By default, it simply returns results from Math.random(), however, when the seedable PRNG has been enabled, - * via State.initPRNG(), it returns results from the seeded PRNG instead. - * @since 2.0.0 - */ - random(): number; - /** - * Sets the value of the story or temporary variable by the given name. Returns whether the operation was successful. - * @param varName The name of the story or temporary variable, including its sigil—e.g. $charName. - * @param value The value to assign. - * @since 2.22.0 - */ - setVar(varName: string, value: any): boolean; - }; - - declare interface Wikifier { - createExternalLink(destination: string, url: string, text: string): HTMLElement; - createInternalLink(destination: string, passage: string, text: string, callback: () => void): HTMLElement; - evalExpression(code: string, output: any): any; - evalStatements(code: string, output: any): any; - /** - * @see State.getVar - */ - getValue(varName: string): any; - /** - * @see Story.has - * @param link link - */ - isExternalLink(link: string): boolean; - parse(text: string): any; - /** - * @see State.setVar - */ - setValue(varName: string, value: any): boolean; - wikifyEval(text: string): string; - }; - - declare interface ISugarCube { - Config: Config; - Engine: Engine; - Macro: Macro; - Save: Save; - State: State; - Story: Story; - /** - * Player settings object, set up by the author/developer. See Setting API for more information. - * @since 2.0.0 - */ - settings: any; - /** - * Object that authors/developers may use to set up various bits of static data. - * - * Generally, you would use this for data that does not change and should not be stored - * within story variables, which would make it part of the history. - * @since 2.0.0 - * */ - setup: any; - - Wikifier: Wikifier; - }; -} - -declare global { - declare var SugarCube: SugarCubeLib.ISugarCube; + var SugarCube: SugarCubeLib.ISugarCube; - declare let setup = SugarCube.setup; + const setup: any; /** * A prototype-less generic object whose properties and values are defined by the Setting.addToggle(), * Setting.addList(), and Setting.addRange() methods. @@ -1345,40 +1344,40 @@ declare global { * Setting.save() after having done so. * @since 2.0.0 */ - declare let settings = SugarCube.settings; - declare let Config = SugarCube.Config; - declare let Macro = SugarCube.Macro; - declare let State = SugarCube.State; - declare let Story = SugarCube.Story; - declare let Wikifier = SugarCube.Wikifier; + const settings: SugarCubeLib.Settings; + const Config: SugarCubeLib.Config; + const Macro: SugarCubeLib.Macro; + let State: SugarCubeLib.State; + let Story: SugarCubeLib.Story; + let Wikifier: SugarCubeLib.Wikifier; /** * Executed before the modification of the state history. * @since 2.0.0 */ - declare let prehistory: Record<string, SugarCube.DisplayTaskFunction>; + let prehistory: Record<string, SugarCubeLib.DisplayTaskFunction>; /** * Executed before the rendering of the incoming passage. * @since 2.0.0 */ - declare let predisplay: Record<string, SugarCube.DisplayTaskFunction>; + let predisplay: Record<string, SugarCubeLib.DisplayTaskFunction>; /** * Executed before the rendering of the incoming passage. * @since 2.0.0 */ - declare let prerender: Record<string, SugarCube.RenderTaskFunction>; + let prerender: Record<string, SugarCubeLib.RenderTaskFunction>; /** * Executed after the rendering of the incoming passage. * @since 2.0.0 */ - declare let postrender: Record<string, SugarCube.RenderTaskFunction>; + let postrender: Record<string, SugarCubeLib.RenderTaskFunction>; /** * Executed after the display (i.e. output) of the incoming passage. * @since 2.0.0 */ - declare let postdisplay: Record<string, SugarCube.DisplayTaskFunction>; + let postdisplay: Record<string, SugarCubeLib.DisplayTaskFunction>; // SugarCube functions @@ -1405,7 +1404,7 @@ declare global { * $foo.id -> Returns: 1 * $bar.id -> Returns: 5 */ - declare function clone(original: any): any; + function clone(original: any): any; /** * Returns a random value from its given arguments. @@ -1428,7 +1427,7 @@ declare global { * // Using multiple arrays; given: $letters = ["A", "B"] & $numerals = ["1", "2"] * either($letters, $numerals) -> Returns a random value from the whole list (i.e. "A", "B", "1", "2") */ - declare function either(...list: any): any; + function either(...list: any): any; /** * Returns whether the passage with the given title occurred within the story history. If multiple passage titles are given, @@ -1441,7 +1440,7 @@ declare global { * <<if hasVisited("Bar", "Café")>>…has been to both the Bar and Café<</if>> * <<if not hasVisited("Bar", "Café")>>…has never been to either the Bar, Café, or both…<</if>> */ - declare function hasVisited(...passageNames: string | string[]): boolean; + function hasVisited(...passageNames: string[]): boolean; /** * Returns the number of turns that have passed since the last instance of the passage with the given title occurred within @@ -1456,7 +1455,7 @@ declare global { * <<if lastVisited("Bar", "Café") is -1>>…has never been to the Bar, Café, or both…<</if>> * <<if lastVisited("Bar", "Café") is 2>>…has been to both the Bar and Café, most recently two turns ago…<</if>> */ - declare function lastVisited(...passageNames: string | string[]): number; + function lastVisited(...passageNames: string[]): number; /** * Load and integrate external JavaScript scripts. @@ -1527,7 +1526,7 @@ declare global { * console.log(err); * }); */ - declare function importScripts(...urls: string | string[]): Promise; + function importScripts(...urls: string[]): Promise<any>; /** * Load and integrate external CSS stylesheets. @@ -1583,7 +1582,7 @@ declare global { * console.log(err); * }); */ - declare function importStyles(...urls: string | string[]): Promise; + function importStyles(...urls: string[]): Promise<any>; /** * Returns the title of the active (present) passage. @@ -1591,7 +1590,7 @@ declare global { * @example * <<if passage() is "Café">>…the current passage is the Café passage…<</if>> */ - declare function passage(): string; + function passage(): string; /** * Returns the title of the most recent previous passage whose title does not match that of the active passage or an empty @@ -1603,7 +1602,7 @@ declare global { * // Commonly used as part of a link to return to the most recent non-active passage * [[Return|previous()]] */ - declare function previous(): string; + function previous(): string; /** * Returns a pseudo-random whole number (integer) within the range of the given bounds (inclusive)—i.e. [min, max]. @@ -1617,7 +1616,8 @@ declare global { * random(5) // Returns a number in the range 0–5 * random(1, 6) // Returns a number in the range 1–6 */ - declare function random(min?: number, max: number): number; + function random(min: number, max: number): number; + function random(max: number): number; /** * Returns a pseudo-random real number (floating-point) within the range of the given bounds (inclusive for the minimum, @@ -1632,7 +1632,8 @@ declare global { * randomFloat(5.0) // Returns a number in the range 0.0–4.9999999… * randomFloat(1.0, 6.0) // Returns a number in the range 1.0–5.9999999… */ - declare function randomFloat(min?: number, max: number): number; + function randomFloat(max: number): number; + function randomFloat(min: number, max: number): number; /** * Renders the selected passage into the target element, replacing any existing content, and returns the element. If no passages are found and default text is specified, it will be used instead. @@ -1652,7 +1653,7 @@ declare global { * // Using an element; given a reference to an existing element: myElement * setPageElement(myElement, "MyPassage"); */ - declare function setPageElement( + function setPageElement( idOrElement: string | HTMLElement, passages: string | string[], defaultText?: string): HTMLElement | null; @@ -1666,7 +1667,7 @@ declare global { * <<if tags().includes("forest")>>…the current passage is part of the forest…<</if>> * <<if tags("Lonely Glade").includes("forest")>>…the Lonely Glade passage is part of the forest…<</if>> */ - declare function tags(...passages?: string | string[]): string[]; + function tags(...passages: string[]): string[]; /** * Returns a reference to the current temporary variables store (equivalent to: State.temporary). This is only really useful @@ -1678,7 +1679,7 @@ declare global { * // Do something... * } */ - declare function temporary(): object; + function temporary(): object; /** * Returns the number of milliseconds which have passed since the current passage was rendered to the page. @@ -1697,7 +1698,7 @@ declare global { * <</link>> \ * or [[stand your ground|Eaten by a grue]]? */ - declare function time(): number; + function time(): number; /** * Returns the number of passages that the player has visited. @@ -1705,7 +1706,7 @@ declare global { * @example * << print "This is turn #" + turns() >> */ - declare function turns(): number; + function turns(): number; /** * Returns a reference to the active(present) story variables store(equivalent to: State.variables).This is only really @@ -1717,7 +1718,7 @@ declare global { * //Do something * } */ - declare function variables(): object; + function variables(): object; /** * Returns the number of times that the passage with the given title occurred within the story history. If multiple passage @@ -1731,7 +1732,7 @@ declare global { * <<if visited("Café") is 1>>…has been to the Café exactly once…<</if>> * <<if visited("Bar", "Café") is 4>>…has been to both the Bar and Café at least four times…<</if>> */ - declare function visited(...passages?: string | string[]): number; + function visited(...passages: string[]): number; /** * Returns the number of passages within the story history which are tagged with all of the given tags. @@ -1742,9 +1743,9 @@ declare global { * <<if visitedTags("forest", "haunted") is 1>>…has been to the haunted part of the forest exactly once…<</if>> * <<if visitedTags("forest", "burned") is 3>>…has been to the burned part of the forest three times…<</if>> */ - declare function visitedTags(...tags: string | string[]): number; + function visitedTags(...tags: string[]): number; - declare interface Array<T> { + interface Array<T> { /** * Concatenates one or more unique members to the end of the base array and returns the result as a new array. Does not modify the original. * @param members The members to concatenate. Members which are arrays will be merged—i.e. their members will be concatenated, rather than the array itself. @@ -1794,7 +1795,7 @@ declare global { * $fruits.deleteAt(1, 3) → Returns ["Oranges", "Oranges"]; $fruits ["Apples", "Plums"] * $fruits.deleteAt(0, 2) → Returns ["Apples", "Plums"]; $fruits ["Oranges", "Oranges"] */ - deleteAt(...indices: number | number[]): T[]; + deleteAt(...indices: number[]): T[]; /** * Removes all of the members that pass the test implemented by the given predicate function from the array and returns @@ -1857,7 +1858,7 @@ declare global { * // Given: $search = ["Blueberry", "Pumpkin"] * <<if $pies.includesAll($search)>>…found Blueberry and Pumpkin pies…<</if>> */ - includesAll(...needles: T | T[]): boolean; + includesAll(...needles: T[]): boolean; /** * Returns whether any of the given members were found within the array. @@ -1870,7 +1871,7 @@ declare global { * // Given: $search = ["Blueberry", "Pumpkin"] * <<if $pies.includesAny($search)>>…found Blueberry or Pumpkin pie…<</if>> */ - includesAny(...needles: T | T[]): boolean; + includesAny(...needles: T[]): boolean; /** * Returns the last member from the array. Does not modify the original. @@ -1950,7 +1951,7 @@ declare global { * $fruits.unshiftUnique("Oranges") // Returns 2; $fruits ["Oranges", "Plums"] * $fruits.unshiftUnique("Apples", "Apples") // Returns 3; $fruits ["Apples", "Oranges", "Plums"] */ - unshiftUnique(...members?: T): number; + unshiftUnique(...members: T[]): number; // deprecated members @@ -2021,7 +2022,7 @@ declare global { * Math.clamp($stat, 0, 200) // Clamps $stat to the bounds 0–200 and returns the new value * Math.clamp($stat, 1, 6.6) // Clamps $stat to the bounds 1–6.6 and returns the new value */ - static clamp(num: number | string, min: number, max: number): number; + clamp(num: number | string, min: number, max: number): number; /** * Returns the whole(integer) part of the given number by removing its fractional part, if any. Does not modify the @@ -2032,14 +2033,13 @@ declare global { * Math.trunc(12.7) // Returns 12 * Math.trunc(-12.7) // Returns -12 */ - static trunc(num: number): number; + trunc(num: number): number; } interface JQuery { wikiWithOptions(options: any, ...sources): JQuery; wiki(...sources): JQuery; - }; - + } } export { }; diff --git a/slave variables documentation - Pregmod.txt b/slave variables documentation - Pregmod.txt index 46b341ef00012f3c41a88da164c43ce40830e492..48f448eb3707e140d9eceddd112ca0c31bf8d8e7 100644 --- a/slave variables documentation - Pregmod.txt +++ b/slave variables documentation - Pregmod.txt @@ -3005,6 +3005,11 @@ wGain - slave constantly gains weight unless dieting, easier to gain weight wLoss - slave constantly loses weight unless gaining, easier to lose weight wGain + wLoss - slave weight gain/loss fluctuates randomly + +mGain - slave constantly gains muscle mass, easier to gain muscle. +mLoss - slave constantly loses muscle mass, easier to gain muscle. +mGain + mLoss - slave muscle gain/loss amplified, passively lose muscle unless building + androgyny - slave's body attempts to normalize to an androgynous state } diff --git a/src/art/artJS.js b/src/art/artJS.js index 6bf5768a4c0ad870e0a6536579e201bc0a92e75e..0f0e3c64883198a0c2706d6031ec61d972a10c90 100644 --- a/src/art/artJS.js +++ b/src/art/artJS.js @@ -179,7 +179,6 @@ window.extractColor = function (color, eyes) { /* these are HTML color names supported by most browsers */ let HTMLstandardColors = ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgrey", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgrey", "lightgreen", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen"]; - let FCnames = new Map(FCname2HTMLarray); color = color.toLowerCase(); /* normalization: lowercase color name */ let colorCode = FCnames.get(color); /* look up in FreeCities color names */ diff --git a/src/art/vector/VectorArtJS.js b/src/art/vector/VectorArtJS.js index 5295d7e10723260e28f416d0ee354a07e32acc0b..3da76328829c64dffd0f46ba2d17538f9f5c38e3 100644 --- a/src/art/vector/VectorArtJS.js +++ b/src/art/vector/VectorArtJS.js @@ -1,4 +1,4 @@ -window.VectorArt = (function () { +window.VectorArt = (function() { "use strict"; let V, T, slave; let r; @@ -2679,7 +2679,7 @@ window.VectorArt = (function () { return VectorArt; })(); -window.LegacyVectorArt = function (slave, artSize) { +window.LegacyVectorArt = function(slave, artSize) { const filePath = "'resources/vector"; const skinFilePath = `${filePath}/body/white`; const wearingLatex = slave.clothes === "a Fuckdoll suit" || slave.clothes === "restrictive latex" || slave.clothes === "a latex catsuit"; diff --git a/src/art/vector_revamp/vectorRevampedArtControl.js b/src/art/vector_revamp/vectorRevampedArtControl.js index 154c99d00e0b9ff272597d010da442161a813c84..2e4a6aa5f5832e1c0ac676c68a025573ee33d2a0 100644 --- a/src/art/vector_revamp/vectorRevampedArtControl.js +++ b/src/art/vector_revamp/vectorRevampedArtControl.js @@ -1,10 +1,14 @@ /* eslint-disable camelcase */ -window.RevampedVectorArt = function (slave) { +window.RevampedVectorArt = function(slave) { const V = State.variables; const T = State.temporary; let r; - if (T.art_display_id > 0) { T.art_display_id++; } else { T.art_display_id = 1; } + if (T.art_display_id > 0) { + T.art_display_id++; + } else { + T.art_display_id = 1; + } T.art_display_class = `ad${T.art_display_id}`; /* Using JS from vectorRevampedArtControl.tw*/ @@ -46,7 +50,7 @@ class ArtStyleEntry { let styleValue = `${styleArray.join(";")};`; - let cssDef = `{ ${styleValue} }`; // not sure if there should be padding here + let cssDef = `{ ${styleValue} }`; // not sure if there should be padding here if (this.name.length > 0) { cssDef = `.${this.name}${cssDef}`; } @@ -123,17 +127,21 @@ class ArtStyleControl { applyCalcMuscleTone() { let musclesValue = this.artSlave.muscles + 101; - let musclesVisibility = 0.910239*Math.log(0.02*musclesValue); + let musclesVisibility = 0.910239 * Math.log(0.02 * musclesValue); this.muscleTone["fill-opacity"] = musclesVisibility; } applyEyeLensStyle() { - if (this.artSlave.eyeColor === null || this.artSlave.eyeColor === undefined) { return; } + if (this.artSlave.eyeColor === null || this.artSlave.eyeColor === undefined) { + return; + } let eyeColorSplit = this.artSlave.eyeColor.split(" "); - if (eyeColorSplit === 1) { return; } + if (eyeColorSplit === 1) { + return; + } let eyeLens = eyeColorSplit[0]; @@ -149,7 +157,9 @@ class ArtStyleControl { /* currently unused, keeping for color reference - */ parseSkinColorFromName(colorName) { // eslint-disable-next-line eqeqeq - if (colorName == null) { return "#000000"; } + if (colorName == null) { + return "#000000"; + } let skinPalette = [ ["light", "#feebe5"], @@ -313,7 +323,7 @@ class ArtStyleControl { get StylesCss() { let mainStyle = new ArtStyleEntry(""); mainStyle.position = "absolute"; - mainStyle.height= "100%"; + mainStyle.height = "100%"; mainStyle["margin-left"] = "auto"; mainStyle["margin-right"] = "auto"; mainStyle.left = "0"; @@ -440,7 +450,7 @@ class ClothingControl { get restrictiveLatex() { let defaultOutfitColor = "#515351"; - // let areolaColor = "#383838"; + let areolaColor = "#383838"; // FIXME: unused variable return { bodySettings: { showEyes: false, @@ -629,8 +639,12 @@ class RevampedArtControl { let clothing = this.getClothing(); if (clothing !== null) { - if (clothing.bodySettings !== null) { this.applyClothingSettings(clothing.bodySettings); } - if (clothing.styleSettings !== null) { this.applyClothingStyleSettings(clothing.styleSettings); } + if (clothing.bodySettings !== null) { + this.applyClothingSettings(clothing.bodySettings); + } + if (clothing.styleSettings !== null) { + this.applyClothingStyleSettings(clothing.styleSettings); + } } if (!globalShowHighlights) { @@ -660,12 +674,16 @@ class RevampedArtControl { applyClothingStyleSettings(styleSettings) { for (let attr in styleSettings) { - if (styleSettings.hasOwnProperty(attr)) { this.copyProperties(this.styleControl[attr], styleSettings[attr]); } + if (styleSettings.hasOwnProperty(attr)) { + this.copyProperties(this.styleControl[attr], styleSettings[attr]); + } } } getClothing() { - if (this.artSlave.fuckdoll > 0) { return this.clothingControl.fuckdoll; } + if (this.artSlave.fuckdoll > 0) { + return this.clothingControl.fuckdoll; + } let clothing = null; switch (this.artSlave.clothes) { case "a nice maid outfit": @@ -695,8 +713,13 @@ class RevampedArtControl { get getHairLength() { let result = "Short"; - - if (this.artSlave.hLength >= 80) { result = "Long"; } else if (this.artSlave.hLength >= 40) { result = "Medium"; } else { result = "Short"; } + if (this.artSlave.hLength >= 80) { + result = "Long"; + } else if (this.artSlave.hLength >= 40) { + result = "Medium"; + } else { + result = "Short"; + } return result; } @@ -753,7 +776,27 @@ class RevampedArtControl { get getBellyLevel() { let bellyLevel = 0; - if (this.artSlave.belly >= 120000) { bellyLevel = 9; } else if (this.artSlave.belly >= 90000) { bellyLevel = 8; } else if (this.artSlave.belly >= 50000) { bellyLevel = 7; } else if (this.artSlave.belly >= 30000) { bellyLevel = 6; } else if (this.artSlave.belly >= 15000) { bellyLevel = 5; } else if (this.artSlave.belly >= 10000) { bellyLevel = 4; } else if (this.artSlave.belly >= 5000) { bellyLevel = 3; } else if (this.artSlave.belly >= 1500) { bellyLevel = 2; } else if (this.artSlave.belly >= 500) { bellyLevel = 1; } else { bellyLevel = 0; } + if (this.artSlave.belly >= 120000) { + bellyLevel = 9; + } else if (this.artSlave.belly >= 90000) { + bellyLevel = 8; + } else if (this.artSlave.belly >= 50000) { + bellyLevel = 7; + } else if (this.artSlave.belly >= 30000) { + bellyLevel = 6; + } else if (this.artSlave.belly >= 15000) { + bellyLevel = 5; + } else if (this.artSlave.belly >= 10000) { + bellyLevel = 4; + } else if (this.artSlave.belly >= 5000) { + bellyLevel = 3; + } else if (this.artSlave.belly >= 1500) { + bellyLevel = 2; + } else if (this.artSlave.belly >= 500) { + bellyLevel = 1; + } else { + bellyLevel = 0; + } return bellyLevel; } @@ -761,9 +804,13 @@ class RevampedArtControl { get hairBackLayer() { let result = []; - if (!this.showHair) { return result; } + if (!this.showHair) { + return result; + } - if (this.artSlave.hLength === 0) { return result; } + if (this.artSlave.hLength === 0) { + return result; + } switch (this.artSlave.hStyle) { case "neat": @@ -813,8 +860,8 @@ class RevampedArtControl { get armLayer() { let result = []; - // let leftArmType = ""; - // let rightArmType = ""; + let leftArmType = ""; // FIXME: unused variable + let rightArmType = ""; // FIXME: unused variable if (this.artSlave.amp === 1) { result.push("Art_Vector_Revamp_Arm_Stump"); @@ -841,9 +888,19 @@ class RevampedArtControl { get buttLayer() { let result = []; let buttSize = 0; - if (this.artSlave.amp) { return result; } + if (this.artSlave.amp) { + return result; + } - if (this.artSlave.butt > 6) { buttSize = 3; } else if (this.artSlave.butt > 4) { buttSize = 2; } else if (this.artSlave.butt > 2) { buttSize = 1; } else { buttSize = 0; } + if (this.artSlave.butt > 6) { + buttSize = 3; + } else if (this.artSlave.butt > 4) { + buttSize = 2; + } else if (this.artSlave.butt > 2) { + buttSize = 1; + } else { + buttSize = 0; + } result.push(`Art_Vector_Revamp_Butt_${buttSize}`); @@ -932,7 +989,9 @@ class RevampedArtControl { get pussyLayer() { let result = []; - if (this.showPussy && this.artSlave.vagina >= 0) { result.push("Art_Vector_Revamp_Pussy"); } + if (this.showPussy && this.artSlave.vagina >= 0) { + result.push("Art_Vector_Revamp_Pussy"); + } return result; } @@ -940,9 +999,13 @@ class RevampedArtControl { get pubicLayer() { let result = []; - if (!this.showPubic) { return result; } + if (!this.showPubic) { + return result; + } - if (this.artSlave.physicalAge < 12) { return result; } + if (this.artSlave.physicalAge < 12) { + return result; + } if (this.artSlave.vaginaTat === "rude words") { this.pubicTattooText = this.artSlave.dick !== 0 ? "Useless" : "Fucktoy"; @@ -972,11 +1035,23 @@ class RevampedArtControl { get pussyPiercingsLayer() { let result = []; - if (!this.showPussyPiercings) { return result; } + if (!this.showPussyPiercings) { + return result; + } - if (this.artSlave.vaginaPiercing === 1) { result.push("Art_Vector_Revamp_Pussy_Piercing"); } else if (this.artSlave.vaginaPiercing === 2) { result.push("Art_Vector_Revamp_Pussy_Piercing_Heavy"); } + if (this.artSlave.vaginaPiercing === 1) { + result.push("Art_Vector_Revamp_Pussy_Piercing"); + } else if (this.artSlave.vaginaPiercing === 2) { + result.push("Art_Vector_Revamp_Pussy_Piercing_Heavy"); + } - if (this.artSlave.clitPiercing === 1) { 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 === 3) { result.push("Art_Vector_Revamp_Clit_Piercing_Smart"); } + if (this.artSlave.clitPiercing === 1) { + 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 === 3) { + result.push("Art_Vector_Revamp_Clit_Piercing_Smart"); + } return result; } @@ -992,11 +1067,17 @@ class RevampedArtControl { isChastityVaginalWorn = isChastityVaginalWorn && this.showChastityVaginal; - if (isChastityAnalWorn) { result.push("Art_Vector_Revamp_Chastity_Anus"); } + if (isChastityAnalWorn) { + result.push("Art_Vector_Revamp_Chastity_Anus"); + } - if (isChastityVaginalWorn) { result.push("Art_Vector_Revamp_Chastity_Vagina"); } + if (isChastityVaginalWorn) { + result.push("Art_Vector_Revamp_Chastity_Vagina"); + } - if (isChastityAnalWorn || isChastityVaginalWorn) { result.push("Art_Vector_Revamp_Chastity_Base"); } + if (isChastityAnalWorn || isChastityVaginalWorn) { + result.push("Art_Vector_Revamp_Chastity_Base"); + } return result; } @@ -1023,11 +1104,23 @@ class RevampedArtControl { get ballsLayer() { let result = []; - if (!this.showBalls || this.artSlave.scrotum <= 0 || this.artSlave.balls <= 0) { return result; } + if (!this.showBalls || this.artSlave.scrotum <= 0 || this.artSlave.balls <= 0) { + return result; + } let ballsSize = 0; - if (this.artSlave.scrotum >= 6) { ballsSize = 4; } else if (this.artSlave.scrotum >= 4) { ballsSize = 3; } else if (this.artSlave.scrotum >= 3) { ballsSize = 2; } else if (this.artSlave.scrotum >= 2) { ballsSize = 1; } else { ballsSize = 0; } + if (this.artSlave.scrotum >= 6) { + ballsSize = 4; + } else if (this.artSlave.scrotum >= 4) { + ballsSize = 3; + } else if (this.artSlave.scrotum >= 3) { + ballsSize = 2; + } else if (this.artSlave.scrotum >= 2) { + ballsSize = 1; + } else { + ballsSize = 0; + } result.push(`Art_Vector_Revamp_Balls_${ballsSize}`); @@ -1041,15 +1134,23 @@ class RevampedArtControl { result.push(`Art_Vector_Revamp_Belly_${this.bellyLevel}`); if (this.showBellyPiercings) { - if (this.artSlave.navelPiercing >= 1) { result.push(`Art_Vector_Revamp_Belly_${this.bellyLevel}_Piercing`); } + if (this.artSlave.navelPiercing >= 1) { + result.push(`Art_Vector_Revamp_Belly_${this.bellyLevel}_Piercing`); + } - if (this.artSlave.navelPiercing === 2) { result.push(`Art_Vector_Revamp_Belly_${this.bellyLevel}_Piercing_Heavy`); } + if (this.artSlave.navelPiercing === 2) { + result.push(`Art_Vector_Revamp_Belly_${this.bellyLevel}_Piercing_Heavy`); + } } } else { if (this.showBellyPiercings) { - if (this.artSlave.navelPiercing >= 1) { result.push("Art_Vector_Revamp_Navel_Piercing"); } + if (this.artSlave.navelPiercing >= 1) { + result.push("Art_Vector_Revamp_Navel_Piercing"); + } - if (this.artSlave.navelPiercing === 2) { result.push("Art_Vector_Revamp_Navel_Piercing_Heavy"); } + if (this.artSlave.navelPiercing === 2) { + result.push("Art_Vector_Revamp_Navel_Piercing_Heavy"); + } } } @@ -1059,20 +1160,46 @@ class RevampedArtControl { get penisLayer() { let result = []; - if (this.getBellyLevel >= 8) { return result; } + if (this.getBellyLevel >= 8) { + return result; + } let penisSize = -1; - if (this.artSlave.dick >= 8) { penisSize = 6; } else if (this.artSlave.dick >= 7) { penisSize = 5; } else if (this.artSlave.dick >= 6) { penisSize = 4; } else if (this.artSlave.dick >= 5) { penisSize = 3; } else if (this.artSlave.dick >= 4) { penisSize = 2; } else if (this.artSlave.dick >= 2) { penisSize = 1; } else if (this.artSlave.dick >= 1) { penisSize = 0; } else { penisSize = -1; } + if (this.artSlave.dick >= 8) { + penisSize = 6; + } else if (this.artSlave.dick >= 7) { + penisSize = 5; + } else if (this.artSlave.dick >= 6) { + penisSize = 4; + } else if (this.artSlave.dick >= 5) { + penisSize = 3; + } else if (this.artSlave.dick >= 4) { + penisSize = 2; + } else if (this.artSlave.dick >= 2) { + penisSize = 1; + } else if (this.artSlave.dick >= 1) { + penisSize = 0; + } else { + penisSize = -1; + } - if (!this.showPenis || penisSize < 0) { return result; } + if (!this.showPenis || penisSize < 0) { + return result; + } if (canAchieveErection(this.artSlave) && (this.artSlave.chastityPenis !== 1)) { result.push(`Art_Vector_Revamp_Penis_${penisSize}`); - if (!this.showPenisPiercings) { return result; } + if (!this.showPenisPiercings) { + return result; + } - if (this.artSlave.dickPiercing === 1) { result.push(`Art_Vector_Revamp_Penis_${penisSize}_Piercing`); } else if (this.artSlave.dickPiercing === 2) { result.push(`Art_Vector_Revamp_Penis_${penisSize}_Piercing_Heavy`); } + if (this.artSlave.dickPiercing === 1) { + result.push(`Art_Vector_Revamp_Penis_${penisSize}_Piercing`); + } else if (this.artSlave.dickPiercing === 2) { + result.push(`Art_Vector_Revamp_Penis_${penisSize}_Piercing_Heavy`); + } } else { result.push(`Art_Vector_Revamp_Flaccid_${penisSize}`); @@ -1119,33 +1246,35 @@ class RevampedArtControl { result.push(`Art_Vector_Revamp_Boob_None_Areola_${areolaeShape}`); } } else { - let artScaleFactor = 0.804354*Math.log(0.00577801*this.artSlave.boobs); + let artScaleFactor = 0.804354 * Math.log(0.00577801 * this.artSlave.boobs); - let boobRightArtTranslationX = 270*((-1*artScaleFactor) + 1); - let boobLeftArtTranslationX = 320*((-1*artScaleFactor) + 1); - let artTranslationX = -283.841*artScaleFactor+285.349; - let artTranslationY = 198*((-1*artScaleFactor) + 1); + let boobRightArtTranslationX = 270 * ((-1 * artScaleFactor) + 1); + let boobLeftArtTranslationX = 320 * ((-1 * artScaleFactor) + 1); + let artTranslationX = -283.841 * artScaleFactor + 285.349; + let artTranslationY = 198 * ((-1 * artScaleFactor) + 1); let artBoobTransform = `matrix(${artScaleFactor},0,0,${artScaleFactor},${artTranslationX},${artTranslationY})`; this.artTransform = artBoobTransform; - if (!this.showBoobs) { return result; } + if (!this.showBoobs) { + return result; + } let size = "Small"; if (this.artSlave.boobs < 600) { - artScaleFactor = 0.360674*Math.log(0.0266667*this.artSlave.boobs); + artScaleFactor = 0.360674 * Math.log(0.0266667 * this.artSlave.boobs); - boobRightArtTranslationX = 240*((-1*artScaleFactor) + 1); - boobLeftArtTranslationX = 300*((-1*artScaleFactor) + 1); - artTranslationY = 250*((-1*artScaleFactor) + 1); + boobRightArtTranslationX = 240 * ((-1 * artScaleFactor) + 1); + boobLeftArtTranslationX = 300 * ((-1 * artScaleFactor) + 1); + artTranslationY = 250 * ((-1 * artScaleFactor) + 1); size = "Small"; } else if (this.artSlave.boobs < 15000) { size = "Medium"; } else { size = "Huge"; - boobRightArtTranslationX = 252*((-1*artScaleFactor) + 1); - boobLeftArtTranslationX = 315*((-1*artScaleFactor) + 1); + boobRightArtTranslationX = 252 * ((-1 * artScaleFactor) + 1); + boobLeftArtTranslationX = 315 * ((-1 * artScaleFactor) + 1); } this.boobRightArtTransform = `matrix(${artScaleFactor},0,0,${artScaleFactor},${boobRightArtTranslationX},${artTranslationY})`; @@ -1207,15 +1336,31 @@ class RevampedArtControl { } if (this.artSlave.nipplesPiercing === 1) { - if (this.artSlave.boobs < 300) { result.push("Art_Vector_Revamp_Boob_None_Piercing"); } else { result.push(`Art_Vector_Revamp_Boob_${size}_Piercing`); } + if (this.artSlave.boobs < 300) { + result.push("Art_Vector_Revamp_Boob_None_Piercing"); + } else { + result.push(`Art_Vector_Revamp_Boob_${size}_Piercing`); + } } else if (this.artSlave.nipplesPiercing === 2) { - if (this.artSlave.boobs < 300) { result.push("Art_Vector_Revamp_Boob_None_Piercing_Heavy"); } else { result.push(`Art_Vector_Revamp_Boob_${size}_Piercing_Heavy`); } + if (this.artSlave.boobs < 300) { + result.push("Art_Vector_Revamp_Boob_None_Piercing_Heavy"); + } else { + result.push(`Art_Vector_Revamp_Boob_${size}_Piercing_Heavy`); + } } if (this.artSlave.areolaePiercing === 1) { - if (this.artSlave.boobs < 300) { result.push("Art_Vector_Revamp_Boob_None_Areola_Piercing"); } else { result.push(`Art_Vector_Revamp_Boob_${size}_Areola_Piercing`); } + if (this.artSlave.boobs < 300) { + result.push("Art_Vector_Revamp_Boob_None_Areola_Piercing"); + } else { + result.push(`Art_Vector_Revamp_Boob_${size}_Areola_Piercing`); + } } else if (this.artSlave.areolaePiercing === 2) { - if (this.artSlave.boobs < 300) { result.push("Art_Vector_Revamp_Boob_None_Areola_Piercing_Heavy"); } else { result.push(`Art_Vector_Revamp_Boob_${size}_Areola_Piercing_Heavy`); } + if (this.artSlave.boobs < 300) { + result.push("Art_Vector_Revamp_Boob_None_Areola_Piercing_Heavy"); + } else { + result.push(`Art_Vector_Revamp_Boob_${size}_Areola_Piercing_Heavy`); + } } } @@ -1227,26 +1372,26 @@ class RevampedArtControl { case "a nice maid outfit": if (this.artSlave.boobs >= 300) { if (this.artSlave.boobs < 600) { - let artScaleFactor = 0.288539*Math.log(0.106667*this.artSlave.boobs); - let artTranslationX = 270*((-1*artScaleFactor) + 1); - let artTranslationY = 198*((-1*artScaleFactor) + 1);// -198.438*artScaleFactor+203.274; + let artScaleFactor = 0.288539 * Math.log(0.106667 * this.artSlave.boobs); + let artTranslationX = 270 * ((-1 * artScaleFactor) + 1); + let artTranslationY = 198 * ((-1 * artScaleFactor) + 1); // -198.438*artScaleFactor+203.274; let artBoobTransform = `matrix(${artScaleFactor},0,0,${artScaleFactor},${artTranslationX},${artTranslationY})`; this.boobOutfitArtTransform = artBoobTransform; result.push("Art_Vector_Revamp_Boob_Small_Outfit_Maid"); } else if (this.artSlave.boobs < 15000) { - let artScaleFactor = 0.155334*Math.log(1.04167*this.artSlave.boobs); - let artTranslationX = 270*((-1.25*artScaleFactor) + 1.25); - let artTranslationY = 198*((-0.8*artScaleFactor) + 0.8);// -198.438*artScaleFactor+203.274; + let artScaleFactor = 0.155334 * Math.log(1.04167 * this.artSlave.boobs); + let artTranslationX = 270 * ((-1.25 * artScaleFactor) + 1.25); + let artTranslationY = 198 * ((-0.8 * artScaleFactor) + 0.8); // -198.438*artScaleFactor+203.274; let artBoobTransform = `matrix(${artScaleFactor},0,0,${artScaleFactor},${artTranslationX},${artTranslationY})`; this.boobOutfitArtTransform = artBoobTransform; result.push("Art_Vector_Revamp_Boob_Medium_Outfit_Maid"); } else { - let artScaleFactor = 1.56609*Math.log(0.00017373*this.artSlave.boobs); - let artTranslationX = 340*((-1*artScaleFactor) + 1); - let artTranslationY = 153*((-1*artScaleFactor) + 1);// -198.438*artScaleFactor+203.274; + let artScaleFactor = 1.56609 * Math.log(0.00017373 * this.artSlave.boobs); + let artTranslationX = 340 * ((-1 * artScaleFactor) + 1); + let artTranslationY = 153 * ((-1 * artScaleFactor) + 1); // -198.438*artScaleFactor+203.274; let artBoobTransform = `matrix(${artScaleFactor},0,0,${artScaleFactor},${artTranslationX},${artTranslationY})`; this.boobOutfitArtTransform = artBoobTransform; @@ -1314,13 +1459,25 @@ class RevampedArtControl { result.push("Art_Vector_Revamp_Head"); - if (this.showHeadHighlight) { result.push("Art_Vector_Revamp_Face_Highlights"); } + if (this.showHeadHighlight) { + result.push("Art_Vector_Revamp_Face_Highlights"); + } - if (!this.showHeadPiercings) { return result; } + if (!this.showHeadPiercings) { + return result; + } - if (this.artSlave.earPiercing === 1) { result.push("Art_Vector_Revamp_Head_Ear_Piercing"); } else if (this.artSlave.earPiercing === 2) { result.push("Art_Vector_Revamp_Head_Ear_Piercing_Heavy"); } + if (this.artSlave.earPiercing === 1) { + result.push("Art_Vector_Revamp_Head_Ear_Piercing"); + } else if (this.artSlave.earPiercing === 2) { + result.push("Art_Vector_Revamp_Head_Ear_Piercing_Heavy"); + } - if (this.artSlave.nosePiercing === 1) { result.push("Art_Vector_Revamp_Head_Nose_Piercing"); } else if (this.artSlave.nosePiercing === 2) { result.push("Art_Vector_Revamp_Head_Nose_Piercing_Heavy"); } + if (this.artSlave.nosePiercing === 1) { + result.push("Art_Vector_Revamp_Head_Nose_Piercing"); + } else if (this.artSlave.nosePiercing === 2) { + result.push("Art_Vector_Revamp_Head_Nose_Piercing_Heavy"); + } return result; } @@ -1328,33 +1485,51 @@ class RevampedArtControl { get eyesLayer() { let result = []; - if (!this.showEyes) { return result; } + if (!this.showEyes) { + return result; + } if (this.artSlave.devotion > 50) { result.push("Art_Vector_Revamp_Eyes_Happy"); result.push("Art_Vector_Revamp_Eyes_Happy_Highlights"); if (this.showHeadPiercings) { - if (this.artSlave.eyebrowPiercing === 1) { result.push("Art_Vector_Revamp_Head_Eyebrow_Happy_Piercing"); } else if (this.artSlave.eyebrowPiercing === 2) { result.push("Art_Vector_Revamp_Head_Eyebrow_Happy_Piercing_Heavy"); } + if (this.artSlave.eyebrowPiercing === 1) { + result.push("Art_Vector_Revamp_Head_Eyebrow_Happy_Piercing"); + } else if (this.artSlave.eyebrowPiercing === 2) { + result.push("Art_Vector_Revamp_Head_Eyebrow_Happy_Piercing_Heavy"); + } } } else if (this.artSlave.devotion >= 0) { result.push("Art_Vector_Revamp_Eyes_Shy"); result.push("Art_Vector_Revamp_Eyes_Shy_Highlights"); if (this.showHeadPiercings) { - if (this.artSlave.eyebrowPiercing === 1) { result.push("Art_Vector_Revamp_Head_Eyebrow_Shy_Piercing"); } else if (this.artSlave.eyebrowPiercing === 2) { result.push("Art_Vector_Revamp_Head_Eyebrow_Shy_Piercing_Heavy"); } + if (this.artSlave.eyebrowPiercing === 1) { + result.push("Art_Vector_Revamp_Head_Eyebrow_Shy_Piercing"); + } else if (this.artSlave.eyebrowPiercing === 2) { + result.push("Art_Vector_Revamp_Head_Eyebrow_Shy_Piercing_Heavy"); + } } } else if (this.artSlave.devotion >= -50) { result.push("Art_Vector_Revamp_Eyes_Closed"); if (this.showHeadPiercings) { - if (this.artSlave.eyebrowPiercing === 1) { result.push("Art_Vector_Revamp_Head_Eyebrow_Closed_Piercing"); } else if (this.artSlave.eyebrowPiercing === 2) { result.push("Art_Vector_Revamp_Head_Eyebrow_Closed_Piercing_Heavy"); } + if (this.artSlave.eyebrowPiercing === 1) { + result.push("Art_Vector_Revamp_Head_Eyebrow_Closed_Piercing"); + } else if (this.artSlave.eyebrowPiercing === 2) { + result.push("Art_Vector_Revamp_Head_Eyebrow_Closed_Piercing_Heavy"); + } } } else { result.push("Art_Vector_Revamp_Eyes_Angry"); result.push("Art_Vector_Revamp_Eyes_Angry_Highlights"); if (this.showHeadPiercings) { - if (this.artSlave.eyebrowPiercing === 1) { result.push("Art_Vector_Revamp_Head_Eyebrow_Angry_Piercing"); } else if (this.artSlave.eyebrowPiercing === 2) { result.push("Art_Vector_Revamp_Head_Eyebrow_Angry_Piercing_Heavy"); } + if (this.artSlave.eyebrowPiercing === 1) { + result.push("Art_Vector_Revamp_Head_Eyebrow_Angry_Piercing"); + } else if (this.artSlave.eyebrowPiercing === 2) { + result.push("Art_Vector_Revamp_Head_Eyebrow_Angry_Piercing_Heavy"); + } } } @@ -1365,23 +1540,45 @@ class RevampedArtControl { let result = []; let lipsSize = "Normal"; - if (!this.showMouth) { return result; } + if (!this.showMouth) { + return result; + } - if (this.artSlave.lips > 95) { lipsSize = "Enormous"; } else if (this.artSlave.lips > 70) { lipsSize = "Huge"; } else if (this.artSlave.lips > 50) { lipsSize = "Big"; } else if (this.artSlave.lips > 30) { lipsSize = "Plush"; } else if (this.artSlave.lips > 10) { lipsSize = "Normal"; } else { lipsSize = "Thin"; } + if (this.artSlave.lips > 95) { + lipsSize = "Enormous"; + } else if (this.artSlave.lips > 70) { + lipsSize = "Huge"; + } else if (this.artSlave.lips > 50) { + lipsSize = "Big"; + } else if (this.artSlave.lips > 30) { + lipsSize = "Plush"; + } else if (this.artSlave.lips > 10) { + lipsSize = "Normal"; + } else { + lipsSize = "Thin"; + } if (this.artSlave.trust > 20) { result.push(`Art_Vector_Revamp_Makeup_Mouth_Happy_${lipsSize}`); result.push(`Art_Vector_Revamp_Mouth_Happy_${lipsSize}`); if (this.showHeadPiercings) { - if (this.artSlave.lipsPiercing === 1) { result.push("Art_Vector_Revamp_Head_Mouth_Happy_Piercing"); } else if (this.artSlave.lipsPiercing === 2) { result.push("Art_Vector_Revamp_Head_Mouth_Happy_Piercing_Heavy"); } + if (this.artSlave.lipsPiercing === 1) { + result.push("Art_Vector_Revamp_Head_Mouth_Happy_Piercing"); + } else if (this.artSlave.lipsPiercing === 2) { + result.push("Art_Vector_Revamp_Head_Mouth_Happy_Piercing_Heavy"); + } } } else { result.push(`Art_Vector_Revamp_Makeup_Mouth_Angry_${lipsSize}`); result.push(`Art_Vector_Revamp_Mouth_Angry_${lipsSize}`); if (this.showHeadPiercings) { - if (this.artSlave.lipsPiercing === 1) { result.push("Art_Vector_Revamp_Head_Mouth_Angry_Piercing"); } else if (this.artSlave.lipsPiercing === 2) { result.push("Art_Vector_Revamp_Head_Mouth_Angry_Piercing_Heavy"); } + if (this.artSlave.lipsPiercing === 1) { + result.push("Art_Vector_Revamp_Head_Mouth_Angry_Piercing"); + } else if (this.artSlave.lipsPiercing === 2) { + result.push("Art_Vector_Revamp_Head_Mouth_Angry_Piercing_Heavy"); + } } } @@ -1420,9 +1617,13 @@ class RevampedArtControl { get hairForeLayer() { let result = []; - if (!this.showHair) { return result; } + if (!this.showHair) { + return result; + } - if (this.artSlave.hLength === 0) { return result; } + if (this.artSlave.hLength === 0) { + return result; + } switch (this.artSlave.hStyle) { case "neat": diff --git a/src/endWeek/saChoosesOwnClothes.js b/src/endWeek/saChoosesOwnClothes.js index b5e58ef2a3d85d59720a9ccc42ee9d3a6b5d3dc5..90c6006478fd696e8fe7586f382cf11295181bd2 100644 --- a/src/endWeek/saChoosesOwnClothes.js +++ b/src/endWeek/saChoosesOwnClothes.js @@ -565,6 +565,7 @@ window.saChoosesOwnClothes = (function () { wardrobeFS.push({text: `and wears chains, to degrade ${himself} as required by your societal goals.`, clothes: "chains"}); wardrobeFS.push({text: `and binds ${himself} with a set of uncomfortable straps.`, clothes: "uncomfortable straps"}); wardrobeFS.push({text: `and binds ${himself} with a set of uncomfortable ropes.`, clothes: "shibari ropes"}); + wardrobeFS.push({text: `and wears no clothes at all, since your society doesn't feel ${he} deserves any.`, clothes: "no clothing"}); } if (V.arcologies[0].FSMaturityPreferentialist > 0) { if (slave.visualAge >= 30) { @@ -665,6 +666,27 @@ window.saChoosesOwnClothes = (function () { if (isItemAccessible("a kimono")) { wardrobeAssignment.push({text: `and wears one of the beautiful folk costumes of the asian race.`, clothes: "a kimono"}); } + if (isItemAccessible("a hanbok")) { + wardrobeAssignment.push({text: `and wears one of the beautiful folk costumes of the asian race.`, clothes: "a hanbok"}); + } + } + } + + if (V.arcologies[0].FSSubjugationist > 0) { + if (V.arcologies[0].FSSubjugationistRace === "black") { + if (isItemAccessible("a klan robe")) { + wardrobeFS.push({text: `and wears a costume associated with anti-black societies of the past.`, clothes: "a klan robe"}); + } + if (isItemAccessible("a slutty klan robe")) { + wardrobeFS.push({text: `and wears a costume associated with anti-black societies of the past.`, clothes: "a slutty klan robe"}); + } + } else if (V.arcologies[0].FSSubjugationistRace === "semitic") { + if (isItemAccessible("a schutzstaffel uniform")) { + wardrobeFS.push({text: `and wears a costume associated with anti-semitic societies of the past.`, clothes: "a schutzstaffel uniform"}); + } + if (isItemAccessible("a slutty schutzstaffel uniform")) { + wardrobeFS.push({text: `and wears a costume associated with anti-semitic societies of the past.`, clothes: "a slutty schutzstaffel uniform"}); + } } } @@ -734,6 +756,9 @@ window.saChoosesOwnClothes = (function () { } } else if (slave.behavioralFlaw === "devout") { wardrobeTastes.push({text: `and wears something more appropriate for a monastery than a whorehouse.`, clothes: "a penitent nuns habit"}); + if (isItemAccessible("a burqa")) { + wardrobeTastes.push({text: `and chooses an incredibly restricting piece of religious garb.`, clothes: "a burqa"}); + } } if (slave.behavioralQuirk === "sinful") { @@ -744,6 +769,9 @@ window.saChoosesOwnClothes = (function () { if (slave.sexualFlaw === "shamefast") { wardrobeTastes.push({text: `and chooses an outfit that covers ${him} up as much as possible.`, clothes: "a hijab and abaya"}); + if (isItemAccessible("a burqa")) { + wardrobeTastes.push({text: `and chooses an outfit that covers ${him} up as much as possible.`, clothes: "a burqa"}); + } } else if (slave.sexualFlaw === "breeder") { if (isItemAccessible("attractive lingerie for a pregnant woman")) { wardrobeTastes.push({text: `and wears lingerie designed to accommodate pregnancies, hoping that others get the hint.`, clothes: "attractive lingerie for a pregnant woman"}); @@ -927,6 +955,10 @@ window.saChoosesOwnClothes = (function () { if (isItemAccessible("a kimono")) { wardrobeTastes.push({text: `and chooses an outfit that makes ${him} feel oddly nostalgic.`, clothes: "a kimono"}); } + } else if (slave.nationality === "Mongolian") { + if (isItemAccessible("a biyelgee costume")) { + wardrobeTastes.push({text: `and chooses an outfit that makes ${him} feel oddly nostalgic.`, clothes: "a biyelgee costume"}); + } } } /* Separated in three categories in case you want to, say, increase the probability of choosing _wardrobeAssignment to look more professional*/ diff --git a/src/endWeek/saServeThePublic.js b/src/endWeek/saServeThePublic.js index cd78cb40d51f42f716549462ffe0b506e99ceb5d..73fe75b36e6eb133d7d996574a0ce19970a9d083 100644 --- a/src/endWeek/saServeThePublic.js +++ b/src/endWeek/saServeThePublic.js @@ -34,7 +34,7 @@ window.saServeThePublic = (function saServeThePublic() { gatherStatistics(slave); if (slave.assignment === "serve in the club") { - // By being at the end, every slave after the first will get a bonus. By moving it up, the first can enjoy it too. slaveJobValues() checks Edo Rivalist, so here we are. + // By being at the end, every slave after the first will get a bonus. By moving it up, the first can enjoy it too. slaveJobValues() checks Edo Revivalist, so here we are. applyFSDecoration(slave); } addRep(slave); diff --git a/src/endWeek/saWhore.js b/src/endWeek/saWhore.js index abdb1a24298758b97a45f48e593fa541a3a799e3..b546d877e42940c402ab9d69c4b0b8972609cce5 100644 --- a/src/endWeek/saWhore.js +++ b/src/endWeek/saWhore.js @@ -42,7 +42,7 @@ window.saWhore = (function saWhore() { gatherStatistics(slave); updateNonSlaveVariables(slave); // must be run before applyFSDecoration() or you will face NaNs if (slave.assignment === "work in the brothel" || slave.assignment === "be the Madam") { - // By being at the end, every slave after the first will get a bonus. By moving it up, the first can enjoy it too. slaveJobValues() checks Edo Rivalist, so here we are. + // By being at the end, every slave after the first will get a bonus. By moving it up, the first can enjoy it too. slaveJobValues() checks Edo Revivalist, so here we are. applyFSDecoration(slave); } addCash(slave); diff --git a/src/endWeek/saWorkTheFarm.js b/src/endWeek/saWorkTheFarm.js index ecf0c783761c982c5fd8bc753429df825b902e98..f62056a106b5599dd9cef7b21a0a9429038344ad 100644 --- a/src/endWeek/saWorkTheFarm.js +++ b/src/endWeek/saWorkTheFarm.js @@ -407,7 +407,7 @@ window.saWorkTheFarm = function saWorkTheFarm(slave) { // TODO: write this } else if (slave.fetish === "masochist") { // TODO: write this - } // TODO: incoroporate quirks + } // TODO: incorporate quirks } // Close Shows diff --git a/src/facilities/nursery/nurseryWorkaround.tw b/src/facilities/nursery/nurseryWorkaround.tw index 2a06020421d630cb9177aa88d6afdc1c412fb726..29edee3c273eaac122df63fd146da568fbc4e0f3 100644 --- a/src/facilities/nursery/nurseryWorkaround.tw +++ b/src/facilities/nursery/nurseryWorkaround.tw @@ -13,15 +13,15 @@ <<set _tempDad = getSlave($activeSlave.father)>> <</if>> <br>Choose a name for $him. <<textbox "$activeSlave.slaveName" $activeSlave.slaveName>> - <<link "Commit name.">> + <<link "Commit name.">> <<set $activeSlave.birthName = $activeSlave.slaveName>> <<replace "#naming">> - You instruct $assistantName to register the new $girl as "<<print $activeSlave.slaveName>>" in the slave registry. + You instruct $assistantName to register the new $girl as "<<print $activeSlave.slaveName>>" in the slave registry. <</replace>> <<replace "#newName">> ''__@@.pink;$activeSlave.slaveName@@__'' <</replace>> - <</link>> + <</link>> <br><<link "Have your PA assign $him a random name">> <<replace "#naming">> <<NewChildName $activeSlave>> @@ -34,23 +34,23 @@ <<if $arcologies[0].FSPastoralist != "unset">> <<if $activeSlave.lactation > 0>> <br><<link "Have your PA assign $him a random cow name">> - <<replace "#naming">> - <<set $activeSlave.slaveName = setup.cowSlaveNames.random()>> - <<set $activeSlave.birthName = $activeSlave.slaveName>> - $assistantName registers the new $girl as "<<print $activeSlave.slaveName>>" in your registry. - <</replace>> - <<replace "#newName">> - ''__@@.pink;$activeSlave.slaveName@@__'' - <</replace>> + <<replace "#naming">> + <<set $activeSlave.slaveName = setup.cowSlaveNames.random()>> + <<set $activeSlave.birthName = $activeSlave.slaveName>> + $assistantName registers the new $girl as "<<print $activeSlave.slaveName>>" in your registry. + <</replace>> + <<replace "#newName">> + ''__@@.pink;$activeSlave.slaveName@@__'' + <</replace>> <</link>> <</if>> <</if>> <<if $arcologies[0].FSChattelReligionist != "unset">> <br><<link "Have your PA assign $him a random devotional name">> <<replace "#naming">> - <<set $activeSlave.slaveName = setup.chattelReligionistSlaveNames.random()>> - <<set $activeSlave.birthName = $activeSlave.slaveName>> - $assistantName registers the new $girl as "<<print $activeSlave.slaveName>>" in your registry. + <<set $activeSlave.slaveName = setup.chattelReligionistSlaveNames.random()>> + <<set $activeSlave.birthName = $activeSlave.slaveName>> + $assistantName registers the new $girl as "<<print $activeSlave.slaveName>>" in your registry. <</replace>> <<replace "#newName">> ''__@@.pink;$activeSlave.slaveName@@__'' @@ -60,9 +60,9 @@ <<if $arcologies[0].FSRomanRevivalist != "unset">> <br><<link "Have your PA assign $him a random Roman name">> <<replace "#naming">> - <<set $activeSlave.slaveName = setup.romanSlaveNames.random()>> - <<set $activeSlave.birthName = $activeSlave.slaveName>> - $assistantName registers the new $girl as "<<print $activeSlave.slaveName>>" in your registry. + <<set $activeSlave.slaveName = setup.romanSlaveNames.random()>> + <<set $activeSlave.birthName = $activeSlave.slaveName>> + $assistantName registers the new $girl as "<<print $activeSlave.slaveName>>" in your registry. <</replace>> <<replace "#newName">> ''__@@.pink;$activeSlave.slaveName@@__'' @@ -71,9 +71,9 @@ <<elseif $arcologies[0].FSAztecRevivalist != "unset">> <br><<link "Have your PA assign $him a random Aztec name">> <<replace "#naming">> - <<set $activeSlave.slaveName = setup.aztecSlaveNames.random()>> - <<set $activeSlave.birthName = $activeSlave.slaveName>> - $assistantName registers the new $girl as "<<print $activeSlave.slaveName>>" in your registry. + <<set $activeSlave.slaveName = setup.aztecSlaveNames.random()>> + <<set $activeSlave.birthName = $activeSlave.slaveName>> + $assistantName registers the new $girl as "<<print $activeSlave.slaveName>>" in your registry. <</replace>> <<replace "#newName">> ''__@@.pink;$activeSlave.slaveName@@__'' @@ -82,9 +82,9 @@ <<elseif $arcologies[0].FSEgyptianRevivalist != "unset">> <br><<link "Have your PA assign $him a random ancient Egyptian name">> <<replace "#naming">> - <<set $activeSlave.slaveName = setup.ancientEgyptianSlaveNames.random()>> - <<set $activeSlave.birthName = $activeSlave.slaveName>> - $assistantName registers the new $girl as "<<print $activeSlave.slaveName>>" in your registry. + <<set $activeSlave.slaveName = setup.ancientEgyptianSlaveNames.random()>> + <<set $activeSlave.birthName = $activeSlave.slaveName>> + $assistantName registers the new $girl as "<<print $activeSlave.slaveName>>" in your registry. <</replace>> <<replace "#newName">> ''__@@.pink;$activeSlave.slaveName@@__'' @@ -93,9 +93,9 @@ <<elseif $arcologies[0].FSEdoRevivalist != "unset">> <br><<link "Have your PA assign $him a random feudal Japanese name">> <<replace "#naming">> - <<set $activeSlave.slaveName = setup.edoSlaveNames.random()>> - <<set $activeSlave.birthName = $activeSlave.slaveName>> - $assistantName registers the new $girl as "<<print $activeSlave.slaveName>>" in your registry. + <<set $activeSlave.slaveName = setup.edoSlaveNames.random()>> + <<set $activeSlave.birthName = $activeSlave.slaveName>> + $assistantName registers the new $girl as "<<print $activeSlave.slaveName>>" in your registry. <</replace>> <<replace "#newName">> ''__@@.pink;$activeSlave.slaveName@@__'' @@ -105,9 +105,9 @@ <<if $arcologies[0].FSDegradationist != "unset">> <br><<link "Have your PA assign $him a degrading name">> <<replace "#naming">> - <<run DegradingName($activeSlave)>> - <<set $activeSlave.birthName = $activeSlave.slaveName>> - $assistantName registers the new $girl as "<<print $activeSlave.slaveName>>" in your registry. + <<run DegradingName($activeSlave)>> + <<set $activeSlave.birthName = $activeSlave.slaveName>> + $assistantName registers the new $girl as "<<print $activeSlave.slaveName>>" in your registry. <</replace>> <<replace "#newName">> ''__@@.pink;$activeSlave.slaveName@@__'' @@ -174,7 +174,7 @@ <</if>> <</if>> <<if $activeSlave.father > 0 && $activeSlave.father != $activeSlave.mother>> - <<setLocalPronouns _tempDad 2>> + <<setLocalPronouns _tempDad 2>> <<if _tempDad.ID == $Concubine.ID>> <br><<link "Permit your Concubine to name _his2 daughter">> <<replace "#naming">> diff --git a/src/init/dummy.js b/src/init/dummy.js deleted file mode 100644 index 097cf6795de699090e895027d5f67edd6ed03973..0000000000000000000000000000000000000000 --- a/src/init/dummy.js +++ /dev/null @@ -1,3 +0,0 @@ -//add false positives of the JAVA sanityCheck here -.scarheal -.clamp diff --git a/src/init/dummy.tw b/src/init/dummy.tw index 795c1885c88fb1dde265b0f832f3c6abd8b6d7ae..6b27488a8d3fa167d7f4afb44af44e959b9c239f 100644 --- a/src/init/dummy.tw +++ b/src/init/dummy.tw @@ -3,6 +3,9 @@ This is special passage to avoid false positive error in sanityCheck build script. Do not uncomment anything! +Variables in this comment are only for the git grep calls used with the python version. +False positives of the Java version have to added in the comment below. + $nurseryUpgrade, $childToSlave $ageMode $youngCareers, $educatedCareers, $uneducatedCareers, $gratefulCareers, $menialCareers, $entertainmentCareers, $whoreCareers, $HGCareers, $madamCareers, $DJCareers, $bodyguardCareers, $wardenessCareers, $nurseCareers, $attendantCareers, $matronCareers, $milkmaidCareers, $farmerCareers, $stewardessCareers, $schoolteacherCareers @@ -37,3 +40,93 @@ $activeSlave.readyLimbs, _Slave.readyLimbs, $args[0].readyLimbs $brothelSpots $JobIDArray */ +/% +SugarCube-style comment because it is not ignored by the Java based sanityCheck + +$scarheal, $clamp, $wGain, $wLoss, $androgyny +$MAX +$MIN +$SCHOOL +$CLINIC +$SPA +$NANNY +$JAIL +$NURSE +$WARDEN +$ATTEND +$STEWARD +$MILKMAID +$TEACHER +$MATRON +$MASTER +$CONCUBINE +$BABY +$gangCriminalPool +$militaryCriminalPool +$whiteCollarCriminalPool +$pettyCriminalPool +$malenamePoolSelector +$namePoolSelector +$penthousePositions +$REST +$fetusWeek +$countLitter +$litterData +$weather +$event +$human +$brokenSlaves +$DL +$dI +$childToSlave +$Delete +$SpliceArray +$Copy +$CopyDate +$location +$self +$setBaseAndExtent +$opera +$selection +$styleSheets +$cssRules +$facilityCareers +$toString +$toFixed +$LivingRule +$PersonalAttention +$areRelated +$relativeTerm +$right +$bottom +$index +$marriages +$Nursery +$weeksLeft +$normalOvaMin +$normalOvaMax +$keyCode +$placeholder +$V +$vaginalAttachments +$buttplugAttachments +$rejects +$Engine +$remove +$transfer +$jobsNames +$content +$expCheck +$interactionLink +$summaryCache +$raw +$which +$minDomActionDelay +$Categorizer +$ready +$rest +$new +$interfaceTail +$currentTarget +$upgrade +%/ diff --git a/src/interaction/main/mainLinks.js b/src/interaction/main/mainLinks.js index 80a9153ca67bbc43c82f6024ed878c23aa38fa9a..44b7f3aa8b25a34b582219646e681741c2d979e1 100644 --- a/src/interaction/main/mainLinks.js +++ b/src/interaction/main/mainLinks.js @@ -1,5 +1,5 @@ /* OPEN MAIN */ -App.UI.View.MainLinks = function () { +App.UI.View.MainLinks = function() { "use strict"; const V = State.variables; const PA = Array.isArray(V.personalAttention) ? V.personalAttention.map(x => getSlave(x.ID)) : []; diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js index c94323529c1f644a6d2bd5da1cac1d911c4dd383..90ed3d4ce5e15732d65c95663fee18ee48d31239 100644 --- a/src/js/DefaultRules.js +++ b/src/js/DefaultRules.js @@ -1,6 +1,6 @@ // this code applies RA rules onto slaves -window.DefaultRules = (function () { +window.DefaultRules = (function() { "use strict"; let V; let r; @@ -1353,7 +1353,7 @@ window.DefaultRules = (function () { } } if (_priorities.length > 1) { - _priorities = _priorities.sort(function (a, b) { + _priorities = _priorities.sort(function(a, b) { if (a.weight > b.weight) { return -1; } diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js index 8d9c32866861ef344cbdd27f626622612579f568..104fc58e8a14be10b9c5d3c5fba21565268e21a3 100644 --- a/src/js/SlaveState.js +++ b/src/js/SlaveState.js @@ -1994,6 +1994,10 @@ App.Entity.SlaveState = class SlaveState { wLoss: 0, /** body attempts to normalize to an androgynous state */ androgyny: 0, + /** constantly gains muscle mass, easier to gain muscle. mGain + mLoss - muscle gain/loss aplified, passively lose muscle unless building */ + mGain: 0, + /** constantly loses muscle mass, easier to gain muscle. mGain + mLoss - muscle gain/loss aplified, passively lose muscle unless building */ + mLoss: 0, /** slave can only ever birth girls */ girlsOnly: 0 }; diff --git a/src/js/assayJS.js b/src/js/assayJS.js index ecfc35634cd7dc2fa1f0923b5a3a3d3f599d75e6..fd3b49562ba880ff96e112e3a038051557b422a0 100644 --- a/src/js/assayJS.js +++ b/src/js/assayJS.js @@ -200,7 +200,7 @@ window.newSlave = function newSlave(slave) { V.genePool.push(slave); /* Store non-albino stats in genePool */ if (slave.geneticQuirks.albinism === 2) { - const 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[albInd].origSkin = slave.albinismOverride.skin; V.genePool[albInd].origEye = slave.albinismOverride.eyeColor; V.genePool[albInd].origHColor = slave.albinismOverride.hColor; @@ -210,9 +210,10 @@ window.newSlave = function newSlave(slave) { slave.albinismOverride = 0; } } else { - if (V.genePool.findIndex(function (s) { return s.ID === slave.ID; }) === -1) { V.genePool.push(slave); } + if (V.genePool.findIndex(function(s) { return s.ID === slave.ID; }) === -1) { + V.genePool.push(slave); + } } - assignJob(slave, slave.assignment); /** do not run the Rules Assistant before adding the new slave to the slaves list! **/ @@ -314,6 +315,7 @@ window.addSlave = function addSlave(slave) { State.variables.slaves.push(slave); State.variables.slaveIndices[slave.ID] = State.variables.slaves.length - 1; }; + window.removeSlave = function removeSlave(index) { const ret = State.variables.slaves.deleteAt(index); State.variables.slaveIndices = slaves2indices(); @@ -397,23 +399,10 @@ App.Utils.Pronouns = class { * @param {App.Entity.SlaveState} slave * @returns {App.Utils.Pronouns} */ -window.getPronouns = function (slave) { +window.getPronouns = function(slave) { return new App.Utils.Pronouns(slave); }; -/** - * @param {App.Entity.SlaveState} slave - */ -window.SlavePronouns = function SlavePronouns(slave) { - const V = State.variables; - const pronouns = getPronouns(slave); - V.pronoun = pronouns.pronoun; - V.pronounCap = capFirstChar(pronouns.pronoun); - V.possessive = pronouns.possessive; - V.possessiveCap = capFirstChar(pronouns.possessive); - V.object = pronouns.object; -}; - /** * @param {App.Entity.SlaveState} slave * @returns {string} // I think @@ -438,45 +427,45 @@ window.Enunciate = function Enunciate(slave) { V.titleEnunciate = V.PC.customTitleLisp; } else if (V.PC.title !== 0) { V.titleEnunciate = "Mathter"; - } else { - V.titleEnunciate = "Mithtreth"; -} + } else { + V.titleEnunciate = "Mithtreth"; + } if (V.allowFamilyTitles === 1) { if (slave.father === -1) { if (slave.actualAge < 4 && slave.physicalAge < 4) { V.titleEnunciate = "Dadda"; - } else if (slave.actualAge < 9) { - V.titleEnunciate = "Daddy"; - } else { - V.titleEnunciate = "Dad"; - } + } else if (slave.actualAge < 9) { + V.titleEnunciate = "Daddy"; + } else { + V.titleEnunciate = "Dad"; + } } else if (slave.mother === -1) { if (slave.actualAge < 4 && slave.physicalAge < 4) { V.titleEnunciate = "Mama"; - } else if (slave.actualAge < 9) { - V.titleEnunciate = "Mommy"; - } else { - V.titleEnunciate = "Mom"; - } + } else if (slave.actualAge < 9) { + V.titleEnunciate = "Mommy"; + } else { + V.titleEnunciate = "Mom"; + } } else if (V.PC.mother === slave.ID || V.PC.father === slave.ID) { if (V.PC.title === 1) { V.titleEnunciate = "Thon"; - } else if (V.PC.title === 0) { - V.titleEnunciate = "Daughter"; - } + } else if (V.PC.title === 0) { + V.titleEnunciate = "Daughter"; + } } else if (areSisters(slave, V.PC) > 0) { if (V.PC.title === 1) { if (slave.actualAge < 18) { V.titleEnunciate = "Bro"; - } else { - V.titleEnunciate = "Brother"; - } + } else { + V.titleEnunciate = "Brother"; + } } else if (V.PC.title === 0) { if (slave.actualAge < 18) { V.titleEnunciate = "Thith"; - } else { - V.titleEnunciate = "Thithter"; - } + } else { + V.titleEnunciate = "Thithter"; + } } } } @@ -509,45 +498,45 @@ window.Enunciate = function Enunciate(slave) { V.titleEnunciate = V.PC.customTitle; } else if (V.PC.title !== 0) { V.titleEnunciate = "Master"; - } else { - V.titleEnunciate = "Mistress"; -} + } else { + V.titleEnunciate = "Mistress"; + } if (V.allowFamilyTitles === 1) { if (slave.father === -1) { if (slave.actualAge < 4 && slave.physicalAge < 4) { V.titleEnunciate = "Dadda"; - } else if (slave.actualAge < 9) { - V.titleEnunciate = "Daddy"; - } else { - V.titleEnunciate = "Dad"; - } + } else if (slave.actualAge < 9) { + V.titleEnunciate = "Daddy"; + } else { + V.titleEnunciate = "Dad"; + } } else if (slave.mother === -1) { if (slave.actualAge < 4 && slave.physicalAge < 4) { V.titleEnunciate = "Mama"; - } else if (slave.actualAge < 9) { - V.titleEnunciate = "Mommy"; - } else { - V.titleEnunciate = "Mom"; - } + } else if (slave.actualAge < 9) { + V.titleEnunciate = "Mommy"; + } else { + V.titleEnunciate = "Mom"; + } } else if (V.PC.mother === slave.ID || V.PC.father === slave.ID) { if (V.PC.title === 1) { V.titleEnunciate = "Son"; - } else if (V.PC.title === 0) { - V.titleEnunciate = "Daughter"; - } + } else if (V.PC.title === 0) { + V.titleEnunciate = "Daughter"; + } } else if (areSisters(slave, V.PC) > 0) { if (V.PC.title === 1) { if (slave.actualAge < 18) { V.titleEnunciate = "Bro"; - } else { - V.titleEnunciate = "Brother"; - } + } else { + V.titleEnunciate = "Brother"; + } } else if (V.PC.title === 0) { if (slave.actualAge < 18) { V.titleEnunciate = "Sis"; - } else { - V.titleEnunciate = "Sister"; - } + } else { + V.titleEnunciate = "Sister"; + } } } } @@ -558,9 +547,9 @@ window.Enunciate = function Enunciate(slave) { V.writtenTitle = V.PC.customTitle; } else if (V.PC.title !== 0) { V.writtenTitle = "Master"; - } else { - V.writtenTitle = "Mistress"; -} + } else { + V.writtenTitle = "Mistress"; + } if (slave.custom.title !== undefined && slave.custom.title !== "" && slave.rudeTitle === 0) { V.writtenTitle = slave.custom.title; } @@ -720,13 +709,25 @@ window.PCTitle = function PCTitle() { } if (V.SF.Toggle && V.SF.FS.Tension > 100) { - switch(V.SF.FS.BadOutcome) { - case 'MIGRATION': titles.push("The Abandoned"); break; - case 'Revolt': titles.push("The Betrayed"); break; - case 'ANNIHILATION': titles.push("The Runner"); break; - case 'OCCUPATION': titles.push("The Occupied"); break; - case 'ASSIMILATION': titles.push("The Deceived"); break; - case 'ISOLATION': titles.push("The Ignored"); break; + switch (V.SF.FS.BadOutcome) { + case 'MIGRATION': + titles.push("The Abandoned"); + break; + case 'Revolt': + titles.push("The Betrayed"); + break; + case 'ANNIHILATION': + titles.push("The Runner"); + break; + case 'OCCUPATION': + titles.push("The Occupied"); + break; + case 'ASSIMILATION': + titles.push("The Deceived"); + break; + case 'ISOLATION': + titles.push("The Ignored"); + break; } } @@ -1987,7 +1988,7 @@ window.DegradingName = function DegradingName(slave) { slave.slaveSurname = surname; }; -window.SlaveSort = function (){ +window.SlaveSort = function() { const comparators = { Aassignment: (a, b) => a.assignment < b.assignment ? -1 : 1, Dassignment: (a, b) => a.assignment > b.assignment ? -1 : 1, @@ -2126,17 +2127,17 @@ window.faceIncrease = function faceIncrease(slave, amount) { let r = ""; if (slave.face <= -95) { r += `<span class="green">${His} face is no longer horrifying,</span> and is now merely ugly.`; -} else if (slave.face <= -40 && slave.face + amount > -40) { - r += `<span class="green">${His} face is no longer ugly,</span> and is now merely unattractive.`; -} else if (slave.face <= -10 && slave.face + amount > -10) { - r += `<span class="green">${His} face is no longer unattractive,</span> and is now somewhat tolerable.`; -} else if (slave.face <= 10 && slave.face + amount > 10) { - r += `<span class="green">${His} face is now decently attractive,</span> rather than merely tolerable.`; -} else if (slave.face <= 40 && slave.face + amount > 40) { - 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.`; -} + } else if (slave.face <= -40 && slave.face + amount > -40) { + r += `<span class="green">${His} face is no longer ugly,</span> and is now merely unattractive.`; + } else if (slave.face <= -10 && slave.face + amount > -10) { + r += `<span class="green">${His} face is no longer unattractive,</span> and is now somewhat tolerable.`; + } else if (slave.face <= 10 && slave.face + amount > 10) { + r += `<span class="green">${His} face is now decently attractive,</span> rather than merely tolerable.`; + } else if (slave.face <= 40 && slave.face + amount > 40) { + 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); if (slave.face > 95) { slave.face = 100; diff --git a/src/js/assignJS.js b/src/js/assignJS.js index 27f353d114603adfb15adb613291a74b5387b85c..eeb7ab9d86a32210f89490c8c5790f749b6a09ad 100644 --- a/src/js/assignJS.js +++ b/src/js/assignJS.js @@ -4,9 +4,7 @@ window.assignJob = function assignJob(slave, job) { const V = State.variables; let r = ""; - if (job === "Pit" || job === "Coursing Association") { - return r; - } + if (job === "Pit" || job === "Coursing Association") { return r; } removeJob(slave, slave.assignment); const idx = V.slaveIndices[slave.ID]; @@ -279,9 +277,7 @@ window.assignJob = function assignJob(slave, job) { if (V.dojo > 1) { slave.livingRules = "luxurious"; } - if (V.pitBG === 1 && V.fighterIDs.includes(slave.ID)) { - V.fighterIDs.delete(slave.ID); - } + if (V.pitBG === 1 && V.fighterIDs.includes(slave.ID)) { V.fighterIDs.delete(slave.ID); } break; case "be your agent": @@ -307,9 +303,7 @@ window.assignJob = function assignJob(slave, job) { } if (slave.assignmentVisible === 0 && Array.isArray(V.personalAttention)) { - const awi = V.personalAttention.findIndex(function (s) { - return s.ID === slave.ID; - }); + const awi = V.personalAttention.findIndex(function(s) { return s.ID === slave.ID; }); if (awi !== -1) { V.personalAttention.deleteAt(awi); if (V.personalAttention.length === 0) { @@ -323,13 +317,12 @@ window.assignJob = function assignJob(slave, job) { r += `${slave.slaveName} no longer has your personal attention; you plan to focus on ${V.personalAttention}.`; } else { r += `${slave.slaveName} no longer has your personal attention.`; + } } } } V.JobIDArray = resetJobIDArray(); - if (idx >= 0) { - V.slaves[idx] = slave; - } + if (idx >= 0) { V.slaves[idx] = slave; } return r; }; @@ -501,15 +494,11 @@ window.removeJob = function removeJob(slave, assignment) { const _leaderIndex = V.leaders.findIndex(function (x) { return x.ID === slave.ID; }); - if (_leaderIndex !== -1) { - V.leaders.deleteAt(_leaderIndex); - } + if (_leaderIndex !== -1) { V.leaders.deleteAt(_leaderIndex); } if (slave.relationshipTarget > 0) { /* following code assumes there can be at most one companion */ - const _lover = V.slaves.findIndex(function (s) { - return haveRelationshipP(s, slave) && s.assignment === "live with your agent"; - }); + const _lover = V.slaves.findIndex(function(s) { return haveRelationshipP(s, slave) && s.assignment === "live with your agent"; }); if (_lover !== -1) { V.slaves[_lover].assignment = "rest"; V.slaves[_lover].assignmentVisible = 1; @@ -554,7 +543,7 @@ window.resetJobIDArray = function resetJobIDArray() { "be a subordinate slave": [] }; - slaves.forEach(function (slave) { + slaves.forEach(function(slave) { if (JobIDArray.hasOwnProperty(slave.assignment)) { JobIDArray[slave.assignment].push(slave.ID); } @@ -617,9 +606,7 @@ App.UI.jobLinks = function () { const slave = App.Utils.slaveByIndex(index); for (const f of facilitiesOrder) { - if (!f.established) { - continue; - } + if (!f.established) { continue; } const rejects = f.canHostSlave(slave); if (rejects.length === 0) { transfers.push(f.transferLink(index, undefined, passage())); diff --git a/src/js/datatypeCleanupJS.js b/src/js/datatypeCleanupJS.js index bff8c9e6d81f2d21ba931a3d8536ad630c5d3ca1..e95809e7181eb0ac03d4243e84b8afd8f7e5a393 100644 --- a/src/js/datatypeCleanupJS.js +++ b/src/js/datatypeCleanupJS.js @@ -854,7 +854,7 @@ window.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() { if (slave.indenture !== 0) { slave.indenture = Math.max(+slave.indenture, -1) || -1; } - slave.indentureRestrictions = Math.clamp(+slave.indentureRestriction, 0, 2) || 0; + slave.indentureRestrictions = Math.clamp(+slave.indentureRestrictions, 0, 2) || 0; slave.tired = Math.clamp(+slave.tired, 0, 1) || 0; slave.hears = Math.clamp(+slave.hears, -2, 0) || 0; slave.smells = Math.clamp(+slave.smells, -1, 0) || 0; diff --git a/src/js/familyTreeJS.js b/src/js/familyTreeJS.js index e46ee39e7b9df2a81d19322b629b85db5b1ed14c..c4a9f68219bb9ae8e1ec21aa9b1261eab3c3d7ad 100644 --- a/src/js/familyTreeJS.js +++ b/src/js/familyTreeJS.js @@ -48,7 +48,10 @@ window.renderFamilyTree = function (slaves, filterID) { } margin = { - top: 0, left: 0, bottom: 0, right: 0 + top: 0, + left: 0, + bottom: 0, + right: 0 }; @@ -197,9 +200,7 @@ window.renderFamilyTree = function (slaves, filterID) { .links(data.links); function dragstarted(d) { - if (!d3.event.active) { - simulation.alphaTarget(0.3).restart(); - } + if (!d3.event.active) { simulation.alphaTarget(0.3).restart(); } d.fx = d.x; d.fy = d.y; } @@ -210,9 +211,7 @@ window.renderFamilyTree = function (slaves, filterID) { } function dragended(d) { - if (!d3.event.active) { - simulation.alphaTarget(0); - } + if (!d3.event.active) { simulation.alphaTarget(0); } d.fx = null; d.fy = null; } @@ -655,17 +654,17 @@ window.updateFamilyTree = function (activeSlave = lastActiveSlave, slaves = last for (let key in spouseToChild) { if (spouseToChild.hasOwnProperty(key)) { - let children = shouldAddChildren?spouseToChild[key]:[]; + let children = shouldAddChildren ? spouseToChild[key] : []; let spouse = getSlave(key, (slaves.genes === "XX") ? "unknownXY" : (slaves.genes === "XY") ? "unknownXX" : "unknown"); let spouseName; if (spouse.ID !== slave.ID) { - spouseName = spouse.slaveName + (spouse.physicalAge?(` (${spouse.physicalAge})`):""); + spouseName = spouse.slaveName + (spouse.physicalAge ? (` (${spouse.physicalAge})`) : ""); } else { spouseName = (spouse.ID === -1) ? "(yourself)" : "(themselves)"; } let marriage = { "spouse": {"name": spouseName, "class": spouse.genes}, - "children": children.map(function (x) { return slaveInfo_(x, activeSlaveId, slavesAdded, depth + 1); }), + "children": children.map(function(x) { return slaveInfo_(x, activeSlaveId, slavesAdded, depth + 1); }) }; data.marriages.push(marriage); } diff --git a/src/js/futureSocietyJS.js b/src/js/futureSocietyJS.js index be256308b2ae5892bf416d63871f545ba856b4e8..69b6d51983df9bb62b4b15b797bb581299b0a0b1 100644 --- a/src/js/futureSocietyJS.js +++ b/src/js/futureSocietyJS.js @@ -136,7 +136,9 @@ window.FutureSocieties = (function () { activeFS += arcology.FSNull / 17; } else if (V.FSCreditCount === 7) { activeFS += arcology.FSNull / 15; - } else { activeFS += arcology.FSNull / 20; } + } else { + activeFS += arcology.FSNull / 20; + } } V.FSCredits = Math.max(Math.trunc(V.FSGotRepCredits - activeFS), 0); } diff --git a/src/js/generateGenetics.js b/src/js/generateGenetics.js index 4dd16f06ba2975479c334b11018ada496ac425b2..41930df40e194bf600d85547bfb6ba6fc9071ec1 100644 --- a/src/js/generateGenetics.js +++ b/src/js/generateGenetics.js @@ -26,7 +26,7 @@ window.generateGenetics = (function () { faceShape: "cute", eyeColor: "brown", hColor: "black", - skin: "white", + skin: "light", markings: "none", behavioralFlaw: "none", sexualFlaw: "none", @@ -704,6 +704,8 @@ window.generateGenetics = (function () { wellHung: 0, wGain: 0, wLoss: 0, + mGain: 0, + mLoss: 0, androgyny: 0 }; let chance = 0; diff --git a/src/js/generateMarketSlave.js b/src/js/generateMarketSlave.js index e98c212e84b919f150f37de5e6c50620136f896c..8685451c9044f15dec42d5e707253270cd607fe1 100644 --- a/src/js/generateMarketSlave.js +++ b/src/js/generateMarketSlave.js @@ -1,5 +1,5 @@ /* eslint-disable camelcase */ -window.generateMarketSlave = function (market = "kidnappers", numArcology = 1) { +window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { const V = State.variables; let r = ``; let sisterAge; diff --git a/src/js/physicalDevelopment.js b/src/js/physicalDevelopment.js index 31207d9dad07337d2bba0e8cf04b8011dcf07502..bda4e15f788572986f865b1a805ed76594218ce3 100644 --- a/src/js/physicalDevelopment.js +++ b/src/js/physicalDevelopment.js @@ -9,8 +9,8 @@ window.physicalDevelopment = (function physicalDevelopment() { return physicalDevelopment; /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function physicalDevelopment(slave) { if (slave.geneMods.NCS !== 1) { /* NCS completely blocks all natural physical growth: no height increases. It also blocks all hormonal secondary sexual * characteristics. So, on the female side: no boobs, no butt, no hips, and no labia. And on the male side: no dick, no clit, no balls, no scrotum, no shoulders. */ @@ -37,7 +37,8 @@ window.physicalDevelopment = (function physicalDevelopment() { increaseHipsXX(slave); increaseButtXX(slave); increasePregAdpatationXX(slave); - } else { /* shota becoming a man */ + } else { + /* shota becoming a man */ if (slave.geneticFlaws.dwarfism === 2 && slave.geneticFlaws.gigantism !== 2) { increaseHeightDwarf(slave); } else if (slave.geneticFlaws.gigantism === 2) { @@ -67,8 +68,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseHeightXX(slave) { if (slave.hormoneBalance >= 200) { if (slave.physicalAge === 3) { @@ -524,8 +525,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseHeightXY(slave) { if (slave.hormoneBalance >= 200) { if (slave.physicalAge === 3) { @@ -991,8 +992,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseHeightDwarf(slave) { if (slave.hormoneBalance >= 200) { if (slave.physicalAge === 3) { @@ -1458,8 +1459,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseHeightGiant(slave) { if (slave.hormoneBalance >= 200) { if (slave.physicalAge < 16) { @@ -1515,8 +1516,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseBoobsXX(slave) { if (slave.geneticQuirks.gigantomastia === 2 && slave.geneticQuirks.macromastia === 2) { gigantomastiaMod = 3; @@ -1725,8 +1726,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseBoobsXY(slave) { if (slave.geneticQuirks.gigantomastia === 2 && slave.geneticQuirks.macromastia === 2) { gigantomastiaMod = 3; @@ -1865,8 +1866,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseHipsXX(slave) { if (slave.hormoneBalance >= 200) { if (slave.physicalAge === 8) { @@ -2092,8 +2093,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseHipsXY(slave) { if (slave.hormoneBalance >= 200) { if (slave.physicalAge === 8) { @@ -2259,8 +2260,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseButtXX(slave) { rearQuirk = slave.geneticQuirks.rearLipedema === 2 ? 2 : 0; rearQuirkDivider = rearQuirk === 0 ? 1 : rearQuirk; @@ -2423,8 +2424,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseButtXY(slave) { rearQuirk = slave.geneticQuirks.rearLipedema === 2 ? 2 : 0; rearQuirkDivider = rearQuirk === 0 ? 1 : rearQuirk; @@ -2518,8 +2519,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseDick(slave) { dickMod = (slave.geneticQuirks.wellHung === 2 ? 2 : 1); @@ -2798,8 +2799,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseBalls(slave) { if (slave.hormoneBalance >= 200) { // @@ -3031,8 +3032,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseClit(slave) { if (slave.hormoneBalance <= -200) { if (slave.physicalAge === 8) { @@ -3177,8 +3178,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseWaistXX(slave) { if (slave.hormoneBalance >= 200) { if (slave.physicalAge >= 12) { @@ -3224,8 +3225,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseWaistXY(slave) { if (slave.hormoneBalance >= 200) { if (slave.physicalAge >= 12) { @@ -3271,8 +3272,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseFaceXX(slave) { if (slave.hormoneBalance >= 200) { if (slave.face > 60) { @@ -3320,8 +3321,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseFaceXY(slave) { if (slave.hormoneBalance >= 200) { if (slave.face > 60) { @@ -3343,8 +3344,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseVoiceXX(slave) { if (slave.hormoneBalance >= 200) { if (slave.voice === 3) { @@ -3380,8 +3381,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increaseVoiceXY(slave) { if (slave.hormoneBalance >= 200) { if (slave.voice < 2) { @@ -3417,8 +3418,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increasePregAdpatationXX(slave) { if (slave.physicalAge === 3) { if (slave.pregAdaptation < 5) { @@ -3488,8 +3489,8 @@ window.physicalDevelopment = (function physicalDevelopment() { } /** - * @param {App.Entity.SlaveState} slave - */ + * @param {App.Entity.SlaveState} slave + */ function increasePregAdpatationXY(slave) { if (slave.physicalAge === 3) { if (slave.pregAdaptation < 5) { diff --git a/src/js/pregJS.js b/src/js/pregJS.js index b0b3d2a4fa0b830401d4ea9eb984094dd114664b..660ebc3bc2cb355565e9e409b7504a02420a4a84 100644 --- a/src/js/pregJS.js +++ b/src/js/pregJS.js @@ -490,11 +490,11 @@ window.knockMeUp = function (target, chance, hole, fatherID, displayOverride) { return r; }; -window.getIncubatorReserved = function ( /* slaves */ ) { +window.getIncubatorReserved = function( /* slaves */ ) { return FetusGlobalReserveCount("incubator"); }; -window.getNurseryReserved = function ( /* slaves */ ) { +window.getNurseryReserved = function( /* slaves */ ) { return FetusGlobalReserveCount("nursery"); }; diff --git a/src/js/quickListJS.js b/src/js/quickListJS.js index 8ac22f3e4c859dbdd3731ec668ec01de73d915d8..27fe34eed16eabb291a8b9a4fe1a9dfb792d7c9c 100644 --- a/src/js/quickListJS.js +++ b/src/js/quickListJS.js @@ -1,4 +1,4 @@ -window.sortDomObjects = function (objects, attrName, reverse = 0) { +window.sortDomObjects = function(objects, attrName, reverse = 0) { reverse = (reverse) ? -1 : 1; function sortingByAttr(a, b) { @@ -15,22 +15,22 @@ window.sortDomObjects = function (objects, attrName, reverse = 0) { return objects.toArray().sort(sortingByAttr); }; -window.sortButtonsByDevotion = function () { +window.sortButtonsByDevotion = function() { let $sortedButtons = $('#qlWrapper button').remove(); $sortedButtons = sortDomObjects($sortedButtons, 'data-devotion'); $($sortedButtons).appendTo($('#qlWrapper')); quickListBuildLinks(); }; -window.sortButtonsByTrust = function () { +window.sortButtonsByTrust = function() { let $sortedButtons = $('#qlWrapper button').remove(); $sortedButtons = sortDomObjects($sortedButtons, 'data-trust'); $($sortedButtons).appendTo($('#qlWrapper')); quickListBuildLinks(); }; -window.quickListBuildLinks = function () { - $("[data-scroll-to]").click(function () { +window.quickListBuildLinks = function() { + $("[data-scroll-to]").click(function() { let $this = $(this), $toElement = $this.attr('data-scroll-to'); // note the * 1 enforces $offset to be an integer, without @@ -44,31 +44,31 @@ window.quickListBuildLinks = function () { }); }; -window.sortIncubatorPossiblesByName = function () { +window.sortIncubatorPossiblesByName = function() { let $sortedIncubatorPossibles = $('#qlIncubator div.possible').detach(); $sortedIncubatorPossibles = sortDomObjects($sortedIncubatorPossibles, 'data-name'); $($sortedIncubatorPossibles).appendTo($('#qlIncubator')); }; -window.sortIncubatorPossiblesByPregnancyWeek = function () { +window.sortIncubatorPossiblesByPregnancyWeek = function() { let $sortedIncubatorPossibles = $('#qlIncubator div.possible').detach(); $sortedIncubatorPossibles = sortDomObjects($sortedIncubatorPossibles, 'data-preg-week'); $($sortedIncubatorPossibles).appendTo($('#qlIncubator')); }; -window.sortIncubatorPossiblesByPregnancyCount = function () { +window.sortIncubatorPossiblesByPregnancyCount = function() { let $sortedIncubatorPossibles = $('#qlIncubator div.possible').detach(); $sortedIncubatorPossibles = sortDomObjects($sortedIncubatorPossibles, 'data-preg-count'); $($sortedIncubatorPossibles).appendTo($('#qlIncubator')); }; -window.sortIncubatorPossiblesByReservedSpots = function () { +window.sortIncubatorPossiblesByReservedSpots = function() { let $sortedIncubatorPossibles = $('#qlIncubator div.possible').detach(); $sortedIncubatorPossibles = sortDomObjects($sortedIncubatorPossibles, 'data-reserved-spots'); $($sortedIncubatorPossibles).appendTo($('#qlIncubator')); }; -window.sortIncubatorPossiblesByPreviousSort = function () { +window.sortIncubatorPossiblesByPreviousSort = function() { let sort = State.variables.sortIncubatorList; if ('unsorted' !== sort) { if ('Name' === sort) { @@ -83,31 +83,31 @@ window.sortIncubatorPossiblesByPreviousSort = function () { } }; -window.sortNurseryPossiblesByName = function () { +window.sortNurseryPossiblesByName = function() { let $sortedNurseryPossibles = $('#qlNursery div.possible').detach(); $sortedNurseryPossibles = sortDomObjects($sortedNurseryPossibles, 'data-name'); $($sortedNurseryPossibles).appendTo($('#qlNursery')); }; -window.sortNurseryPossiblesByPregnancyWeek = function () { +window.sortNurseryPossiblesByPregnancyWeek = function() { let $sortedNurseryPossibles = $('#qlNursery div.possible').detach(); $sortedNurseryPossibles = sortDomObjects($sortedNurseryPossibles, 'data-preg-week'); $($sortedNurseryPossibles).appendTo($('#qlNursery')); }; -window.sortNurseryPossiblesByPregnancyCount = function () { +window.sortNurseryPossiblesByPregnancyCount = function() { let $sortedNurseryPossibles = $('#qlNursery div.possible').detach(); $sortedNurseryPossibles = sortDomObjects($sortedNurseryPossibles, 'data-preg-count'); $($sortedNurseryPossibles).appendTo($('#qlNursery')); }; -window.sortNurseryPossiblesByReservedSpots = function () { +window.sortNurseryPossiblesByReservedSpots = function() { let $sortedNurseryPossibles = $('#qlNursery div.possible').detach(); $sortedNurseryPossibles = sortDomObjects($sortedNurseryPossibles, 'data-reserved-spots'); $($sortedNurseryPossibles).appendTo($('#qlNursery')); }; -window.sortNurseryPossiblesByPreviousSort = function () { +window.sortNurseryPossiblesByPreviousSort = function() { let sort = State.variables.sortNurseryList; if ('unsorted' !== sort) { if ('Name' === sort) { diff --git a/src/js/removeActiveSlave.js b/src/js/removeActiveSlave.js index fab30ff300b9f3e301858bee131b5da2e6cf100e..73aa8b7662710c55a66dabd67bce1b20cb9a3c85 100644 --- a/src/js/removeActiveSlave.js +++ b/src/js/removeActiveSlave.js @@ -125,7 +125,7 @@ window.removeActiveSlave = function removeActiveSlave() { } if (Array.isArray(V.personalAttention)) { - const _rasi = V.personalAttention.findIndex(function (s) { return s.ID === AS_ID; }); + const _rasi = V.personalAttention.findIndex(function(s) { return s.ID === AS_ID; }); if (_rasi !== -1) { V.personalAttention.deleteAt(_rasi); if (V.personalAttention.length === 0) { @@ -195,7 +195,7 @@ window.removeActiveSlave = function removeActiveSlave() { } } - const _geneIndex = V.genePool.findIndex(function (s) { return s.ID === AS_ID; }); + const _geneIndex = V.genePool.findIndex(function(s) { return s.ID === AS_ID; }); if (_geneIndex !== -1) { let keep = false; if (V.traitor !== 0) { @@ -335,7 +335,7 @@ window.removeNonNGPSlave = function removeNonNGPSlave(removedSlave) { } }); - const _geneIndex = V.genePool.findIndex(function (s) { return s.ID === ID; }); + const _geneIndex = V.genePool.findIndex(function(s) { return s.ID === ID; }); if (_geneIndex !== -1) { let keep = false; if (isImpregnatedBy(V.PC, removedSlave)) { diff --git a/src/js/rulesAssistant.js b/src/js/rulesAssistant.js index f84fa5d3fc78fd35a482c0a507ca55d2afe99052..428d951d86a665e572bd300bd3d69c2d9d66c379 100644 --- a/src/js/rulesAssistant.js +++ b/src/js/rulesAssistant.js @@ -72,9 +72,7 @@ window.mergeRules = function mergeRules(rules) { const applies = (combinedRule[key] === undefined || (key === "autoBrand" && rule[key]) || (key !== "autoBrand" && rule[key] !== "no default setting")); - if (!applies) { - return; - } + if (!applies) { return; } combinedRule[key] = rule[key]; }); }); @@ -100,9 +98,7 @@ window.ruleApplied = function (slave, rule) { window.RAFacilityRemove = function RAFacilityRemove(slave, rule) { const V = State.variables; let r = ""; - if (!rule.facilityRemove) { - return r; - } + if (!rule.facilityRemove) { return r; } switch (rule.setAssignment) { case "be confined in the arcade": if (slave.assignment === rule.setAssignment) { @@ -135,7 +131,7 @@ window.RAFacilityRemove = function RAFacilityRemove(slave, rule) { case "work as farmhand": if (slave.assignment === rule.setAssignment) { r += `<br>${slave.slaveName} has been removed from ${V.farmyardName} and has been assigned to ${rule.removalAssignment}.`; - assignJob(slave.rule.removalAssignment); + assignJob(slave, rule.removalAssignment); } break; @@ -229,9 +225,7 @@ window.ruleAppliesP = function ruleAppliesP(cond, slave) { } // assignment / facility / special slaves / specific slaves check let assignment = slave.assignment; - if (assignment === "be your Concubine") { - assignment = "serve in the master suite"; - } + if (assignment === "be your Concubine") { assignment = "serve in the master suite"; } if (cond.specialSlaves !== -1) { // not "Include", which means "doesn't matter" diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js index a242dcc72167df557fd029f68f1e4cbf3f729d23..dc6328a227d3f53484f352c9ea773f606910f0a1 100644 --- a/src/js/rulesAssistantOptions.js +++ b/src/js/rulesAssistantOptions.js @@ -51,33 +51,23 @@ window.rulesAssistantOptions = (function () { } function lowerPriority(root) { - if (V.defaultRules.length === 1) { - return; // nothing to swap with - } + if (V.defaultRules.length === 1) { return; } // nothing to swap with const idx = V.defaultRules.findIndex(rule => rule.ID === current_rule.ID); - if (idx === 0) { - return; // no lower rule - } + if (idx === 0) { return; } // no lower rule arraySwap(V.defaultRules, idx, idx - 1); reload(root); } function higherPriority(root) { - if (V.defaultRules.length === 1) { - return; - } // nothing to swap with + if (V.defaultRules.length === 1) { return; } // nothing to swap with const idx = V.defaultRules.findIndex(rule => rule.ID === current_rule.ID); - if (idx === V.defaultRules.length - 1) { - return; - } // no higher rule + if (idx === V.defaultRules.length - 1) { return; } // no higher rule arraySwap(V.defaultRules, idx, idx + 1); reload(root); } function changeName(name, root) { - if (name === current_rule.name) { - return; - } + if (name === current_rule.name) { return; } current_rule.name = name; reload(root); } @@ -203,16 +193,12 @@ window.rulesAssistantOptions = (function () { } inputEdited() { - if (this.selectedItem) { - this.selectedItem.deselect(); - } + if (this.selectedItem) { this.selectedItem.deselect(); } this.propagateChange(); } selectItem(item) { - if (this.selectedItem) { - this.selectedItem.deselect(); - } + if (this.selectedItem) { this.selectedItem.deselect(); } this.selectedItem = item; this.setValue(item.data); this.propagateChange(); @@ -261,9 +247,7 @@ window.rulesAssistantOptions = (function () { } select() { - if (this.selected) { - return false; - } + if (this.selected) { return false; } this.parent.selectItem(this); this.element.classList.add("selected"); this.selected = true; @@ -290,9 +274,7 @@ window.rulesAssistantOptions = (function () { this.inputEdited(); }; res.onkeypress = (e) => { - if (returnP(e)) { - this.inputEdited(); - } + if (returnP(e)) { this.inputEdited(); } }; return res; } @@ -314,9 +296,7 @@ window.rulesAssistantOptions = (function () { this.inputEdited(); }; res.onkeypress = (e) => { - if (returnP(e)) { - this.inputEdited(); - } + if (returnP(e)) { this.inputEdited(); } }; return res; } @@ -564,11 +544,7 @@ window.rulesAssistantOptions = (function () { constructor(root) { super(); this.element.onblur = () => changeName(this.element.value, root); - this.element.onkeypress = (e) => { - if (returnP(e)) { - changeName(this.element.value, root); - } - }; + this.element.onkeypress = (e) => { if (returnP(e)) { changeName(this.element.value, root); } }; } render() { @@ -687,9 +663,7 @@ window.rulesAssistantOptions = (function () { } show_custom_editor(what, ...args) { - if (this.custom_editor !== null) { - this.hide_custom_editor(); - } + if (this.custom_editor !== null) { this.hide_custom_editor(); } this.custom_editor = new what(...args); this.appendChild(this.custom_editor); } @@ -733,9 +707,7 @@ window.rulesAssistantOptions = (function () { class CustomEditor extends Element { constructor(data) { - if (data.length === 0) { - data = "(slave) => slave.slaveName === 'Fancy Name'"; - } + if (data.length === 0) { data = "(slave) => slave.slaveName === 'Fancy Name'"; } super(data); } @@ -795,9 +767,7 @@ window.rulesAssistantOptions = (function () { value = null; } else { value = parseInt(value); - if (isNaN(value)) { - value = null; - } + if (isNaN(value)) { value = null; } } return value; } @@ -839,11 +809,7 @@ window.rulesAssistantOptions = (function () { const input = document.createElement("input"); input.setAttribute("type", "text"); input.value = JSON.stringify(data.value); - input.onkeypress = e => { - if (returnP(e)) { - this.setValue(input); - } - }; + input.onkeypress = e => { if (returnP(e)) { this.setValue(input); } }; input.onblur = e => this.setValue(input); this.input = input; elem.appendChild(input); @@ -974,17 +940,13 @@ window.rulesAssistantOptions = (function () { } show_slave_selection() { - if (this.subwidget) { - this.subwidget.remove(); - } + if (this.subwidget) { this.subwidget.remove(); } this.subwidget = new SlaveSelection(); this.appendChild(this.subwidget); } show_slave_exclusion() { - if (this.subwidget) { - this.subwidget.remove(); - } + if (this.subwidget) { this.subwidget.remove(); } this.subwidget = new SlaveExclusion(); this.appendChild(this.subwidget); } @@ -1329,16 +1291,8 @@ window.rulesAssistantOptions = (function () { ["Toga (FS)", "a toga"], ["Western clothing (FS)", "Western clothing"], ]; - spclothes.forEach(pair => { - if (isItemAccessible(pair[1])) { - nclothes.push(pair); - } - }); - fsnclothes.forEach(pair => { - if (isItemAccessible(pair[1])) { - nclothes.push(pair); - } - }); + spclothes.forEach(pair => { if (isItemAccessible(pair[1])) { nclothes.push(pair); } }); + fsnclothes.forEach(pair => { if (isItemAccessible(pair[1])) { nclothes.push(pair); } }); const nice = new ListSubSection(this, "Nice", nclothes); this.appendChild(nice); @@ -1352,11 +1306,7 @@ window.rulesAssistantOptions = (function () { const fshclothes = [ ["Chains (FS)", "chains"], ]; - fshclothes.forEach(pair => { - if (isItemAccessible(pair[1])) { - hclothes.push(pair); - } - }); + fshclothes.forEach(pair => { if (isItemAccessible(pair[1])) { hclothes.push(pair); } }); const harsh = new ListSubSection(this, "Harsh", hclothes); this.appendChild(harsh); @@ -1383,18 +1333,12 @@ window.rulesAssistantOptions = (function () { ["Bell", "bell collar"], ["Cowbell", "leather with cowbell"] ]; - if (V.seeAge !== 0) { - ncollars.push(["Nice retirement counter", "nice retirement counter"]); - } + if (V.seeAge !== 0) { ncollars.push(["Nice retirement counter", "nice retirement counter"]); } const fsncollars = [ ["Bowtie collar", "bowtie"], ["Ancient Egyptian", "ancient Egyptian"], ]; - fsncollars.forEach(pair => { - if (isItemAccessible(pair[1])) { - ncollars.push(pair); - } - }); + fsncollars.forEach(pair => { if (isItemAccessible(pair[1])) { ncollars.push(pair); } }); const nice = new ListSubSection(this, "Nice", ncollars); this.appendChild(nice); @@ -1436,7 +1380,7 @@ window.rulesAssistantOptions = (function () { bellies.push([`${acc.name} (FS)`, acc.value]); } else if (acc.rs === "boughtBelly" && V.clothesBoughtBelly === 1) { bellies.push([`${acc.name} (Purchased)`, acc.value]); - } +} }); super("Corsetage", bellies); this.setValue(current_rule.set.bellyAccessory); @@ -1585,7 +1529,7 @@ window.rulesAssistantOptions = (function () { accs.push([acc.name, acc.value]); } else if (acc.rs === "buyBigPlugs" && V.toysBoughtButtPlugs === 1) { accs.push([`${acc.name} (Purchased)`, acc.value]); - } +} }); super("Buttplugs for anal virgins", accs); this.setValue(current_rule.set.aVirginButtplug); @@ -1601,7 +1545,7 @@ window.rulesAssistantOptions = (function () { accs.push([acc.name, acc.value]); } else if (acc.rs === "buyBigPlugs" && V.toysBoughtButtPlugs === 1) { accs.push([`${acc.name} (Purchased)`, acc.value]); - } +} }); super("Buttplugs for other slaves", accs); this.setValue(current_rule.set.buttplug); @@ -1617,7 +1561,7 @@ window.rulesAssistantOptions = (function () { accs.push([acc.name, acc.value]); } else if (acc.rs === "buyTails" && V.toysBoughtButtPlugTails === 1) { accs.push([`${acc.name} (Purchased)`, acc.value]); - } +} }); super("Buttplug attachments for slaves with buttplugs", accs); this.setValue(current_rule.set.buttplugAttachment); @@ -1718,12 +1662,8 @@ window.rulesAssistantOptions = (function () { this.breasts.setValue(350); this.butts.setValue(2); this.lips.setValue(25); - if (this.dicks) { - this.dicks.setValue(0); - } - if (this.balls) { - this.balls.setValue(0); - } + if (this.dicks) { this.dicks.setValue(0); } + if (this.balls) { this.balls.setValue(0); } this.sublists.forEach(i => i.propagateChange()); } @@ -1731,12 +1671,8 @@ window.rulesAssistantOptions = (function () { this.breasts.setValue(1000); this.butts.setValue(5); this.lips.setValue(25); - if (this.dicks) { - this.dicks.setValue(4); - } - if (this.balls) { - this.balls.setValue(4); - } + if (this.dicks) { this.dicks.setValue(4); } + if (this.balls) { this.balls.setValue(4); } this.sublists.forEach(i => i.propagateChange()); } @@ -1744,12 +1680,8 @@ window.rulesAssistantOptions = (function () { this.breasts.setValue(9000); this.butts.setValue(10); this.lips.setValue(45); - if (this.dicks) { - this.dicks.setValue(6); - } - if (this.balls) { - this.balls.setValue(6); - } + if (this.dicks) { this.dicks.setValue(6); } + if (this.balls) { this.balls.setValue(6); } this.sublists.forEach(i => i.propagateChange()); } @@ -1757,12 +1689,8 @@ window.rulesAssistantOptions = (function () { this.breasts.setValue(48000); this.butts.setValue(20); this.lips.setValue(100); - if (this.dicks) { - this.dicks.setValue(30); - } - if (this.balls) { - this.balls.setValue(125); - } + if (this.dicks) { this.dicks.setValue(30); } + if (this.balls) { this.balls.setValue(125); } this.sublists.forEach(i => i.propagateChange()); } @@ -2426,9 +2354,7 @@ window.rulesAssistantOptions = (function () { } setValue(val) { - if (val === undefined) { - val = this.combine(); - } + if (val === undefined) { val = this.combine(); } this.label.innerText = `${val} `; current_rule.set.eyeColor = val; } diff --git a/src/js/rulesAutosurgery.js b/src/js/rulesAutosurgery.js index eb4db629d77c505bae2cf1d0f81bd21c03c9969b..613d51b520a7bbbe2358f0a8cc3ed87e8dde485d 100644 --- a/src/js/rulesAutosurgery.js +++ b/src/js/rulesAutosurgery.js @@ -481,9 +481,7 @@ window.rulesAutosurgery = (function () { if (slave.health > 20 && surgeries.length < 3) { if (slave.faceImplant <= 15 && slave.face <= 95 && thisSurgery.surgery_cosmetic > 0) { surgeries.push("a nicer face"); - if (slave.faceShape === "masculine") { - slave.faceShape = "androgynous"; - } + if (slave.faceShape === "masculine") { slave.faceShape = "androgynous"; } slave.faceImplant += 25 - 5 * Math.trunc(V.PC.medicine / 50) - 5 * V.surgeryUpgrade; slave.face = Math.clamp(slave.face + 20, -100, 100); cashX(forceNeg(V.surgeryCost), "slaveSurgery", slave); @@ -515,12 +513,8 @@ window.rulesAutosurgery = (function () { } } else if (((slave.underArmHStyle !== "bald" && slave.underArmHStyle !== "hairless") || (slave.pubicHStyle !== "bald" && slave.pubicHStyle !== "hairless")) && thisSurgery.surgery_bodyhair === 2) { surgeries.push("body hair removal"); - if (slave.underArmHStyle !== "hairless") { - slave.underArmHStyle = "bald"; - } - if (slave.pubicHStyle !== "hairless") { - slave.pubicHStyle = "bald"; - } + if (slave.underArmHStyle !== "hairless") { slave.underArmHStyle = "bald"; } + if (slave.pubicHStyle !== "hairless") { slave.pubicHStyle = "bald"; } cashX(forceNeg(V.surgeryCost), "slaveSurgery", slave); } else if ((slave.bald === 0 || slave.hStyle !== "bald" || slave.eyebrowHStyle !== "bald") && thisSurgery.surgery_hair === 2) { surgeries.push("hair removal"); @@ -594,9 +588,7 @@ window.rulesAutosurgery = (function () { } } else if (slave.faceImplant <= 45 && slave.face <= 95 && thisSurgery.surgery_cosmetic === 2) { surgeries.push("a nicer face"); - if (slave.faceShape === "masculine") { - slave.faceShape = "androgynous"; - } + if (slave.faceShape === "masculine") { slave.faceShape = "androgynous"; } slave.faceImplant += 25 - 5 * Math.trunc(V.PC.medicine / 50) - 5 * V.surgeryUpgrade; slave.face = Math.clamp(slave.face + 20, -100, 100); cashX(forceNeg(V.surgeryCost), "slaveSurgery", slave); diff --git a/src/js/sexActsJS.js b/src/js/sexActsJS.js index ebde3c5ae53f0e0cf6717e92909087d9fd5d3766..3ca88e59963f53959936e34b9571c7174f65b2ba 100644 --- a/src/js/sexActsJS.js +++ b/src/js/sexActsJS.js @@ -1,4 +1,4 @@ -window.VCheck = (function () { +window.VCheck = (function() { "use strict"; /* eslint-disable */ let he; diff --git a/src/js/slaveGenerationJS.js b/src/js/slaveGenerationJS.js index 07e52ecd66ca7ab33a35f24f886028a518adf1a9..31b26159131f0184f5286e1dae9804f749651b96 100644 --- a/src/js/slaveGenerationJS.js +++ b/src/js/slaveGenerationJS.js @@ -1533,7 +1533,7 @@ window.generatePronouns = function generatePronouns(slave) { /** * @param {App.Entity.SlaveState} slave */ -window.generatePuberty = function (slave) { +window.generatePuberty = function(slave) { if ((slave.ovaries === 1 || slave.mpreg === 1) && slave.physicalAge >= slave.pubertyAgeXX) { slave.pubertyXX = 1; } else { @@ -1549,7 +1549,7 @@ window.generatePuberty = function (slave) { /** * @param {App.Entity.SlaveState} slave */ -window.ageImplantAdjustment = function (slave) { +window.ageImplantAdjustment = function(slave) { if (slave.visualAge > 80) { slave.visualAge -= 40; } else if (slave.visualAge >= 70) { diff --git a/src/js/slaveListing.js b/src/js/slaveListing.js index f7e9aab262553aff9d098f706c875cb826d8c1dd..9f5d50fc340367901a6b94d5464f343f6e061f86 100644 --- a/src/js/slaveListing.js +++ b/src/js/slaveListing.js @@ -362,7 +362,7 @@ App.UI.selectSlaveForPersonalAttention = function (id) { * @param {string} passage The passage to link to * @returns {string} */ -App.UI.SlaveList.sortingLinks = function (passage) { +App.UI.SlaveList.sortingLinks = function(passage) { const V = State.variables; let r = ' Sort by: '; r += ["devotion", "name", "assignment", "seniority", "actualAge", "visualAge", "physicalAge"] @@ -385,7 +385,7 @@ App.UI.SlaveList.sortingLinks = function (passage) { * @param {{assign: string, remove: string, transfer: (string| undefined)}} [tabCaptions] * @returns {string} */ -App.UI.SlaveList.listSJFacilitySlaves = function (facility, facilityPassage, showTransfersTab = false, tabCaptions = undefined) { +App.UI.SlaveList.listSJFacilitySlaves = function(facility, facilityPassage, showTransfersTab = false, tabCaptions = undefined) { const V = State.variables; facilityPassage = facilityPassage || passage(); tabCaptions = tabCaptions || { @@ -463,7 +463,7 @@ App.UI.SlaveList.listSJFacilitySlaves = function (facility, facilityPassage, sho /** * @returns {string} */ -App.UI.SlaveList.listNGPSlaves = function () { +App.UI.SlaveList.listNGPSlaves = function() { const V = State.variables; const thisPassage = 'New Game Plus'; let r = this.sortingLinks(thisPassage) + '<br>'; @@ -482,7 +482,8 @@ App.UI.SlaveList.listNGPSlaves = function () { SlaveSort.indices(importedSlavesIndices); r += App.UI.tabbar.makeTab("remove", App.UI.SlaveList.render(importedSlavesIndices, [], (s) => `<u><strong><span class="pink">${SlaveFullName(s)}</span></strong></u>`, - (s) => App.UI.passageLink('Remove from import list', thisPassage, `$slavesToImport -= 1, removeJob(${s}, "${NGPassignment}")`))); + (s, i) => App.UI.passageLink('Remove from import list', thisPassage, + `$slavesToImport -= 1, removeJob(${App.Utils.slaveRefString(i)}, "${NGPassignment}")`))); } else { r += App.UI.tabbar.makeTab("remove", `<em>No slaves will go with you to the new game</em>`); } @@ -492,7 +493,8 @@ App.UI.SlaveList.listNGPSlaves = function () { SlaveSort.indices(slavesToImportIndices); r += App.UI.tabbar.makeTab("assign", App.UI.SlaveList.render(slavesToImportIndices, [], (s) => `<u><strong><span class="pink">${SlaveFullName(s)}</span></strong></u>`, - (s) => App.UI.passageLink('Add to import list', thisPassage, `$slavesToImport += 1, assignJob(${s}, "${NGPassignment}")`))); + (s, i) => App.UI.passageLink('Add to import list', thisPassage, + `$slavesToImport += 1, assignJob(${App.Utils.slaveRefString(i)}, "${NGPassignment}")`))); } else { r += App.UI.tabbar.makeTab("assign", `<strong>Slave import limit reached</strong>`); } @@ -507,7 +509,7 @@ App.UI.SlaveList.listNGPSlaves = function () { * @param {string} [selectionPassage] passage name for manager selection. "${Manager} Select" if omitted * @returns {string} */ -App.UI.SlaveList.displayManager = function (facility, selectionPassage) { +App.UI.SlaveList.displayManager = function(facility, selectionPassage) { const managerCapName = capFirstChar(facility.desc.manager.position); selectionPassage = selectionPassage || `${managerCapName} Select`; const manager = facility.manager.currentEmployee; @@ -526,11 +528,11 @@ App.UI.SlaveList.displayManager = function (facility, selectionPassage) { * @param {boolean} [showTransfersPage] * @returns {string} */ -App.UI.SlaveList.stdFacilityPage = function (facility, showTransfersPage) { +App.UI.SlaveList.stdFacilityPage = function(facility, showTransfersPage) { return this.displayManager(facility) + '<br><br>' + this.listSJFacilitySlaves(facility, passage(), showTransfersPage); }; -App.UI.SlaveList.penthousePage = function () { +App.UI.SlaveList.penthousePage = function() { const V = State.variables; const ph = App.Entity.facilities.penthouse; const listElementId = 'summarylist'; // for the untabbed mode only @@ -783,7 +785,7 @@ App.UI.SlaveList.penthousePage = function () { * @returns {boolean} */ -App.UI.SlaveList.slaveSelectionList = function () { +App.UI.SlaveList.slaveSelectionList = function() { const selectionElementId = "slaveSelectionList"; return selection; @@ -915,7 +917,7 @@ App.UI.SlaveList.slaveSelectionList = function () { * @param {string} [passage] one of the *Workaround passages. Will be composed from the position name if omitted * @returns {string} */ -App.UI.SlaveList.facilityManagerSelection = function (facility, passage) { +App.UI.SlaveList.facilityManagerSelection = function(facility, passage) { passage = passage || capFirstChar(facility.manager.desc.position) + " Workaround"; return this.slaveSelectionList(slave => facility.manager.canEmploy(slave), (slave, index) => App.UI.passageLink(SlaveFullName(slave), passage, `$i = ${index}`), diff --git a/src/js/slaveStatsChecker.js b/src/js/slaveStatsChecker.js index 26a682ce96611eec7462f565ab278dd58245d238..fe59b32861071792ec221f89573ce6c39baefffe 100644 --- a/src/js/slaveStatsChecker.js +++ b/src/js/slaveStatsChecker.js @@ -1,4 +1,4 @@ -window.SlaveStatsChecker = (function () { +window.SlaveStatsChecker = (function() { return { checkForLisp: hasLisp, isModded: isModded, @@ -177,7 +177,7 @@ window.SlaveStatsChecker = (function () { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.isSlim = function (slave) { +window.isSlim = function(slave) { let slim = false; const ArcologyZero = State.variables.arcologies[0]; @@ -209,7 +209,7 @@ window.isSlim = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {number} */ -window.slimPass = function (slave) { +window.slimPass = function(slave) { let slimPass = 0; const ArcologyZero = State.variables.arcologies[0]; @@ -238,7 +238,7 @@ window.slimPass = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.isStacked = function (slave) { +window.isStacked = function(slave) { return (slave.butt > 4) && (slave.boobs > 800); }; @@ -246,7 +246,7 @@ window.isStacked = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.isXY = function (slave) { +window.isXY = function(slave) { return (slave.dick > 0); }; @@ -254,7 +254,7 @@ window.isXY = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.isYoung = function (slave) { +window.isYoung = function(slave) { return (slave.visualAge < 30); }; @@ -262,7 +262,7 @@ window.isYoung = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.isPreg = function (slave) { +window.isPreg = function(slave) { return ((slave.bellyPreg >= 5000) || (slave.bellyImplant >= 5000)); }; @@ -270,7 +270,7 @@ window.isPreg = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.isNotPreg = function (slave) { +window.isNotPreg = function(slave) { return (!isPreg(slave) && (slave.belly < 100) && (slave.weight < 30) && !setup.fakeBellies.includes(slave.bellyAccessory)); }; @@ -278,7 +278,7 @@ window.isNotPreg = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.isPure = function (slave) { +window.isPure = 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)); }; @@ -286,7 +286,7 @@ window.isPure = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.isSurgicallyImproved = function (slave) { +window.isSurgicallyImproved = function(slave) { return ((slave.boobsImplant > 0) && (slave.buttImplant > 0) && (slave.waist < -10) && (slave.lipsImplant > 0)); }; @@ -294,7 +294,7 @@ window.isSurgicallyImproved = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.isFullyPotent = function (slave) { +window.isFullyPotent = function(slave) { if (!slave) { return null; } else if (slave.dick > 0 && slave.balls > 0 && slave.ballType !== "sterile" && slave.hormoneBalance < 100 && slave.drugs !== "hormone blockers") { @@ -307,7 +307,7 @@ window.isFullyPotent = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.canGetPregnant = function (slave) { +window.canGetPregnant = function(slave) { if (!slave) { return null; } else if (slave.preg === -1) { /* contraceptives check */ @@ -327,7 +327,7 @@ window.canGetPregnant = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.isFertile = function (slave) { +window.isFertile = function(slave) { if (!slave) { return null; } @@ -375,7 +375,7 @@ window.isFertile = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.canAchieveErection = function (slave) { +window.canAchieveErection = function(slave) { if (!slave) { return null; } else if (slave.dick <= 0) { @@ -400,7 +400,7 @@ window.canAchieveErection = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.canPenetrate = function (slave) { +window.canPenetrate = function(slave) { if (!slave) { return null; } else if (!canAchieveErection(slave)) { @@ -417,7 +417,7 @@ window.canPenetrate = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.canSee = function (slave) { +window.canSee = function(slave) { if (!slave) { return null; } @@ -428,7 +428,7 @@ window.canSee = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.canHear = function (slave) { +window.canHear = function(slave) { if (!slave) { return null; } @@ -439,7 +439,7 @@ window.canHear = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.canSmell = function (slave) { +window.canSmell = function(slave) { if (!slave) { return null; } @@ -450,7 +450,7 @@ window.canSmell = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.canTaste = function (slave) { +window.canTaste = function(slave) { if (!slave) { return null; } @@ -461,7 +461,7 @@ window.canTaste = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.canWalk = function (slave) { +window.canWalk = function(slave) { if (!slave) { return null; } else if (slave.amp === 1) { @@ -494,7 +494,7 @@ window.canWalk = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.canTalk = function (slave) { +window.canTalk = function(slave) { if (!slave) { return null; } else if (slave.accent > 2) { @@ -519,7 +519,7 @@ window.canTalk = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.canDoAnal = function (slave) { +window.canDoAnal = function(slave) { if (!slave) { return null; } else if (slave.chastityAnus === 1) { @@ -532,7 +532,7 @@ window.canDoAnal = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.canDoVaginal = function (slave) { +window.canDoVaginal = function(slave) { if (!slave) { return null; } else if (slave.vagina < 0) { @@ -547,7 +547,7 @@ window.canDoVaginal = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.tooFatSlave = function (slave) { +window.tooFatSlave = function(slave) { if (!slave) { return null; } else if (slave.weight > 190 + (slave.muscles / 5) && slave.physicalAge >= 18) { @@ -566,7 +566,7 @@ window.tooFatSlave = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.tooBigBreasts = function (slave) { +window.tooBigBreasts = function(slave) { if (!slave) { return null; } else if (slave.boobs > 30000 + (slave.muscles * 100) && slave.physicalAge >= 18) { @@ -585,7 +585,7 @@ window.tooBigBreasts = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.tooBigBelly = function (slave) { +window.tooBigBelly = function(slave) { if (!slave) { return null; } else if (slave.belly >= 450000 + (slave.muscles * 2000) && slave.physicalAge >= 18) { @@ -604,7 +604,7 @@ window.tooBigBelly = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.tooBigBalls = function (slave) { +window.tooBigBalls = function(slave) { if (!slave) { return null; } else if (slave.balls >= 30 + (slave.muscles * 0.3) && slave.physicalAge <= 3) { @@ -621,7 +621,7 @@ window.tooBigBalls = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.tooBigDick = function (slave) { +window.tooBigDick = function(slave) { if (!slave) { return null; } else if (slave.dick >= 20 + (slave.muscles * 0.1) && slave.physicalAge <= 3 && slave.dick !== 0) { @@ -638,7 +638,7 @@ window.tooBigDick = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.tooBigButt = function (slave) { +window.tooBigButt = function(slave) { if (!slave) { return null; } else if (slave.butt > 10 && slave.physicalAge <= 3) { @@ -653,7 +653,7 @@ window.tooBigButt = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.isVegetable = function (slave) { +window.isVegetable = function(slave) { if (!slave) { return false; } diff --git a/src/js/storyJS.js b/src/js/storyJS.js index a58bc99bbe522b7a4e5f52977ff827be403c3447..18530af669e3933fc1b3dc666909212040e0a26a 100644 --- a/src/js/storyJS.js +++ b/src/js/storyJS.js @@ -8,7 +8,7 @@ * @param {number} maxValue * @returns {number} */ -window.variableAsNumber = function (x, defaultValue = 0, minValue, maxValue) { +window.variableAsNumber = function(x, defaultValue = 0, minValue, maxValue) { x = Number(x); if (isNaN(x)) { return defaultValue; @@ -26,7 +26,7 @@ window.variableAsNumber = function (x, defaultValue = 0, minValue, maxValue) { * @param {App.Entity.SlaveState} slave * @return {boolean} */ -window.isSexuallyPure = function (slave) { +window.isSexuallyPure = function(slave) { if (!slave) { return null; } @@ -34,7 +34,7 @@ window.isSexuallyPure = function (slave) { }; if (typeof interpolate === "undefined") { - const interpolate = function (x0, y0, x1, y1, x) { + const interpolate = function(x0, y0, x1, y1, x) { if (x <= x0) { return y0; } else if (x >= x1) { @@ -51,7 +51,7 @@ if (typeof interpolate === "undefined") { * @param {any} val * @returns {any[]} */ -window.removeFromArray = function (arr, val) { +window.removeFromArray = function(arr, val) { for (let i = 0; i < arr.length; i++) { if (val === arr[i]) { return arr.splice(i, 1); @@ -66,10 +66,10 @@ window.removeFromArray = function (arr, val) { * @param {any} thisArg * @returns {Array} */ -window.filterInPlace = function (arr, callback, thisArg) { +window.filterInPlace = function(arr, callback, thisArg) { let j = 0; - arr.forEach(function (e, i) { + arr.forEach(function(e, i) { if (callback.call(thisArg, e, i, arr)) { arr[j++] = e; } @@ -84,7 +84,7 @@ window.filterInPlace = function (arr, callback, thisArg) { * @param {App.Entity.SlaveState} slave2 * @returns {boolean} */ -window.canBreed = function (slave1, slave2) { +window.canBreed = function(slave1, slave2) { if (!slave1 || !slave2) { return null; } @@ -98,7 +98,7 @@ window.canBreed = function (slave1, slave2) { * @param {App.Entity.SlaveState} slave2 * @returns {boolean} */ -window.canImpreg = function (slave1, slave2) { +window.canImpreg = function(slave1, slave2) { if (!slave1 || !slave2) { return null; } else if (slave2.dick < 1) { @@ -144,7 +144,7 @@ window.canImpreg = function (slave1, slave2) { * @param {object} PC * @returns {boolean} */ -window.isPlayerFertile = function (PC) { +window.isPlayerFertile = function(PC) { if (!PC) { return null; } else if (PC.preg !== 0) { @@ -164,7 +164,7 @@ window.isPlayerFertile = function (PC) { * @param {App.Entity.SlaveState} slave * @returns {string|number} */ -window.relationTargetWord = function (slave) { +window.relationTargetWord = function(slave) { if (!slave) { return null; } else if (slave.relation === "daughter") { @@ -179,7 +179,7 @@ window.relationTargetWord = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {number} */ -window.milkAmount = function (slave) { +window.milkAmount = function(slave) { let milk; let calcs; if (!slave) { @@ -229,7 +229,7 @@ window.milkAmount = function (slave) { * @param {App.Entity.SlaveState} slave * @returns {number} */ -window.cumAmount = function (slave) { +window.cumAmount = function(slave) { let cum = 0; let calcs = 0; if (!slave) { @@ -279,7 +279,7 @@ window.cumAmount = function (slave) { * @param {string} text * @returns {string} */ -window.lispReplace = function (text) { +window.lispReplace = function(text) { text = text.replace(/Sh/g, "Th"); text = text.replace(/SS/g, "Th"); text = text.replace(/Ss/g, "Th"); @@ -367,7 +367,7 @@ window.lispReplace = function (text) { * @param {Object} arcology * @returns {number} */ -window.repGainSacrifice = function (slave, arcology) { +window.repGainSacrifice = function(slave, arcology) { if (!slave || !arcology || arcology.FSAztecRevivalist === "unset" || arcology.FSAztecRevivalist <= 0) { return 0; } @@ -379,33 +379,33 @@ window.repGainSacrifice = function (slave, arcology) { * @param {App.Entity.SlaveState} slave * @returns {boolean} */ -window.bodyguardSuccessorEligible = function (slave) { +window.bodyguardSuccessorEligible = function(slave) { if (!slave) { return false; } return (slave.devotion > 50 && slave.muscles >= 0 && slave.weight < 100 && slave.boobs < 8000 && slave.butt < 10 && slave.belly < 5000 && slave.balls < 10 && slave.dick < 10 && slave.preg < 20 && slave.fuckdoll === 0 && slave.fetish !== "mindbroken" && canWalk(slave)); }; -window.ngUpdateGenePool = function (genePool) { +window.ngUpdateGenePool = function(genePool) { const transferredSlaveIds = (State.variables.slaves || []) - .filter(function (s) { + .filter(function(s) { return s.ID >= 1200000; }) - .map(function (s) { + .map(function(s) { return s.ID - 1200000; }); return (genePool || []) - .filter(function (s) { + .filter(function(s) { return transferredSlaveIds.indexOf(s.ID) >= 0; }) - .map(function (s) { + .map(function(s) { const result = jQuery.extend(true, {}, s); result.ID += 1200000; return result; }); }; -window.ngUpdateMissingTable = function (missingTable) { +window.ngUpdateMissingTable = function(missingTable) { const newTable = {}; (State.variables.slaves || []) @@ -423,7 +423,7 @@ window.ngUpdateMissingTable = function (missingTable) { * @param {any} obj * @returns {string} */ -window.toJson = function (obj) { +window.toJson = function(obj) { let jsontext = JSON.stringify(obj); jsontext = jsontext.replace(/^{/, ""); jsontext = jsontext.replace(/}$/, ""); @@ -434,7 +434,7 @@ window.toJson = function (obj) { * @param {App.Entity.SlaveState} slave * @returns {string} */ -window.nippleColor = function (slave) { +window.nippleColor = function(slave) { if (skinToneLevel(slave.skin) < 8) { if (slave.preg > slave.pregData.normalBirth / 4 || (slave.counter.birthsTotal > 0 && slave.lactation > 0)) { return "brown"; @@ -467,7 +467,7 @@ window.nippleColor = function (slave) { * @param {Object} PC * @returns {number} */ -window.overpowerCheck = function (slave, PC) { +window.overpowerCheck = function(slave, PC) { let strength; if (State.variables.arcologies[0].FSPhysicalIdealist !== "unset") { @@ -494,7 +494,7 @@ window.overpowerCheck = function (slave, PC) { * @param {App.Entity.SlaveState} slave * @returns {number[]} */ -window.impregnatedBy = function (slave) { +window.impregnatedBy = function(slave) { const IDArray = []; if (!Array.isArray(slave.womb)) { WombInit(slave); @@ -511,15 +511,15 @@ window.impregnatedBy = function (slave) { * @param {App.Entity.SlaveState} father * @returns {boolean} */ -window.isImpregnatedBy = function (mother, father) { +window.isImpregnatedBy = function(mother, father) { return impregnatedBy(mother).includes(father.ID); }; -window.jsAlert = function (obj) { +window.jsAlert = function(obj) { alert(obj); }; -window.jsConsoleInfo = function (obj) { +window.jsConsoleInfo = function(obj) { // eslint-disable-next-line no-console console.info(obj); }; @@ -599,7 +599,7 @@ window.SoftenSexualFlaw = function SoftenSexualFlaw(slave) { /** * @param {object} PC */ -window.generatePlayerPronouns = function (PC) { +window.generatePlayerPronouns = function(PC) { if (PC.title === 0) { PC.pronoun = "she"; PC.possessivePronoun = "hers"; @@ -617,7 +617,7 @@ window.generatePlayerPronouns = function (PC) { } }; -window.generateAssistantPronouns = function () { +window.generateAssistantPronouns = function() { const V = State.variables; if (V.assistant === 0) { V.assistantPronouns.pronoun = "it"; diff --git a/src/js/textInput.js b/src/js/textInput.js index 00bffdaac33247f9d888216acb26b32665d70f75..25c358be815f7e6991a0e09fd63c0a87eb040248 100644 --- a/src/js/textInput.js +++ b/src/js/textInput.js @@ -2,7 +2,7 @@ Macro.add("textinput", { // Signifies that the macro is a container macro. tags: null, - handler: function () { + handler: function() { if (this.args.length < 2) { const errors = []; if (this.args.length < 1) { @@ -38,7 +38,7 @@ Macro.add("textinput", { tabindex: 0 // for accessibility }) .addClass("macro-textarea") // "hijack" the .macro-textarea class - .on("input", function () { + .on("input", function() { Wikifier.setValue(varName, this.value); if (that.payload[0].contents !== "") { Wikifier.wikifyEval(that.payload[0].contents.trim()); diff --git a/src/js/utilJS.js b/src/js/utilJS.js index ac060514cd8dc5e29b280e911b0a1bf0f1bf40be..0a3953a0a93b846da5a1a725b1fd197d3abaf284 100644 --- a/src/js/utilJS.js +++ b/src/js/utilJS.js @@ -1,58 +1,58 @@ /* eslint-disable no-unused-vars */ /* -* Height.mean(nationality, race, genes, age) - returns the mean height for the given combination and age in years (>=2) -* Height.mean(nationality, race, genes) - returns the mean adult height for the given combination -* Height.mean(slave) - returns the mean (expected) height for the given slave -* -* Height.random(nationality, race, genes, age) - returns a random height using the skew-normal distribution -* around the mean height for the given arguments -* Height.random(nationality, race, genes) - returns a random height for the given combination of an adult, as above -* Height.random(slave[, options]) - returns a random height for the given slave, as above. -* The additional options object can modify how the values are generated -* in the same way setting them as global configuration would, but only for this -* specific generation. -* -* Example: Only generate above-average heights based on $activeSlave: -* Height.random($activeSlave, {limitMult: [0, 5]}) -* -* Height.forAge(height, age, genes) - returns the height adapted to the age and genes -* Height.forAge(height, slave) - returns the height adapted to the slave's age and genes -* -* Height.config(configuration) - configures the random height generator globally and returns the current configuration -* The options and their default values are: -* limitMult: [-3, 3] - Limit to the values the underlying (normal) random generator returns. -* In normal use, the values are almost never reached; only 0.27% of values are -* outside this range and need to be regenerated. With higher skew (see below), -* this might change. -* spread: 0.05 - The random values generated are multiplied by this and added to 1 to generate -* the final height multiplier. The default value together with the default limitMult -* means that the generated height will always fall within (1 - 0.05 * 3) = 85% and -* (1 + 0.05 * 3) = 115% of the mean height. -* Minimum value: 0.001; maximum value: 0.5 -* skew: 0 - How much the height distribution skews to the right (positive) or left (negative) side -* of the height. -* Minimum value: -1000, maximum value: 1000 -* limitHeight: [0, 999] - Limit the resulting height range. Warning: A small height limit range -* paired with a high spread value results in the generator having to -* do lots of work generating and re-generating random heights until -* one "fits". -* -* Anon's explanation: -* limitMult: [0, -30] -* -* This specifies a range going up from 0 to -30. It needs to go [-30, 0] instead. Same thing with [0, -5] two lines down. note: technically, this isn't true, because for some bizarre reason Height.random reverses the numbers for you if you get them wrong. But it's important to establish good habits, so. -* -* Skew, spread, limitMult: These are statistics things. BTW, a gaussian distribution is a normal distribution. Just a naming thing. -* -* Skew: The shape parameter of a skew-normal distribution. See http://azzalini.stat.unipd.it/SN/Intro/intro.html for more details. Basically a measure of how asymmetrical the curve is. It doesn't move the main mass of the distribution. Rather, it's more like it moves mass from one of the tails into the main mass of the distribution. -* -* Spread: Changes the average distance from the mean, making the graph wider and shorter. Moves "mass" from the center to the tail. It's basically standard deviation, but named funny because FC codebase. Changing this can have dramatic effects. It's advised to keep this at or below 0.1 for usual height generation. -* -* limitMult: A clamp, expressed in z-score. (z=1 is one standard dev above mean, for ex.) If it excludes too much of the distribution the other parameters describe, you're going to spend lots of CPU making and throwing away heights. Don't worry about this unless you run into it. -* -* There's also limitHeight which you're not using. It's basically limitMult in different units. -*/ -window.Height = (function () { + * Height.mean(nationality, race, genes, age) - returns the mean height for the given combination and age in years (>=2) + * Height.mean(nationality, race, genes) - returns the mean adult height for the given combination + * Height.mean(slave) - returns the mean (expected) height for the given slave + * + * Height.random(nationality, race, genes, age) - returns a random height using the skew-normal distribution + * around the mean height for the given arguments + * Height.random(nationality, race, genes) - returns a random height for the given combination of an adult, as above + * Height.random(slave[, options]) - returns a random height for the given slave, as above. + * The additional options object can modify how the values are generated + * in the same way setting them as global configuration would, but only for this + * specific generation. + * + * Example: Only generate above-average heights based on $activeSlave: + * Height.random($activeSlave, {limitMult: [0, 5]}) + * + * Height.forAge(height, age, genes) - returns the height adapted to the age and genes + * Height.forAge(height, slave) - returns the height adapted to the slave's age and genes + * + * Height.config(configuration) - configures the random height generator globally and returns the current configuration + * The options and their default values are: + * limitMult: [-3, 3] - Limit to the values the underlying (normal) random generator returns. + * In normal use, the values are almost never reached; only 0.27% of values are + * outside this range and need to be regenerated. With higher skew (see below), + * this might change. + * spread: 0.05 - The random values generated are multiplied by this and added to 1 to generate + * the final height multiplier. The default value together with the default limitMult + * means that the generated height will always fall within (1 - 0.05 * 3) = 85% and + * (1 + 0.05 * 3) = 115% of the mean height. + * Minimum value: 0.001; maximum value: 0.5 + * skew: 0 - How much the height distribution skews to the right (positive) or left (negative) side + * of the height. + * Minimum value: -1000, maximum value: 1000 + * limitHeight: [0, 999] - Limit the resulting height range. Warning: A small height limit range + * paired with a high spread value results in the generator having to + * do lots of work generating and re-generating random heights until + * one "fits". + * + * Anon's explanation: + * limitMult: [0, -30] + * + * This specifies a range going up from 0 to -30. It needs to go [-30, 0] instead. Same thing with [0, -5] two lines down. note: technically, this isn't true, because for some bizarre reason Height.random reverses the numbers for you if you get them wrong. But it's important to establish good habits, so. + * + * Skew, spread, limitMult: These are statistics things. BTW, a gaussian distribution is a normal distribution. Just a naming thing. + * + * Skew: The shape parameter of a skew-normal distribution. See http://azzalini.stat.unipd.it/SN/Intro/intro.html for more details. Basically a measure of how asymmetrical the curve is. It doesn't move the main mass of the distribution. Rather, it's more like it moves mass from one of the tails into the main mass of the distribution. + * + * Spread: Changes the average distance from the mean, making the graph wider and shorter. Moves "mass" from the center to the tail. It's basically standard deviation, but named funny because FC codebase. Changing this can have dramatic effects. It's advised to keep this at or below 0.1 for usual height generation. + * + * limitMult: A clamp, expressed in z-score. (z=1 is one standard dev above mean, for ex.) If it excludes too much of the distribution the other parameters describe, you're going to spend lots of CPU making and throwing away heights. Don't worry about this unless you run into it. + * + * There's also limitHeight which you're not using. It's basically limitMult in different units. + */ +window.Height = (function() { "use strict"; // Global configuration (for different game modes/options/types) @@ -66,7 +66,7 @@ window.Height = (function () { /** * Configuration method for the above values * @param {any} [conf] - * @returns {object} // I think + * @returns {object} */ const _config = function (conf) { if (_.isUndefined(conf)) { @@ -542,6 +542,7 @@ window.Height = (function () { }; /** + * FIXME: JSdoc syntax error * Helper method - table lookup for nationality/race combinations * @param {object} table // I think * @param {string|Object} nationality @@ -574,8 +575,8 @@ window.Height = (function () { /** * Height multiplier generator; skewed gaussian according to global parameters * @returns {number} - */ - const multGenerator = function () { + */ + const multGenerator = function() { let result = skewedGaussian(skew); while (result < minMult || result > maxMult) { result = skewedGaussian(skew); @@ -700,7 +701,7 @@ window.Height = (function () { * @param {any} race * @param {string} genes * @param {number} age - * @returns {function} + * @returns {Function} // I think */ const _randomHeight = function (nationality, race, genes, age) { const mean = _meanHeight(nationality, race, genes, age); @@ -740,38 +741,38 @@ window.Height = (function () { })(); /** -* Intelligence.random(options) - returns a random intelligence. If no options are passed, the generated number -* will be on a normal distribution with mean 0 and standard deviation 45. -* -* Example: Only generate above-average intelligence based on $activeSlave: -* Intelligence.random({limitIntelligence: [0, 100]}) -* -* Intelligence.config(configuration) - configures the random height generator globally and returns the current configuration -* -* The options and their default values are: -* mean: 0 - What the average intelligence will be. Increasing this will make it more likely -* to generate a smart slave, but will not guarantee it. -* Minimum value: -100, maximum value: 100 -* limitMult: [-3, 3] - Limit to this many standard deviations from the mean. -* In normal use, the values are almost never reached; only 0.27% of values are -* outside this range and need to be regenerated. With higher skew (see below), -* this might change. -* spread: 45 - The random standard deviation of the calculated distribution. A higher value -* will make it more likely to have extreme values, a lower value will make any -* generated values cluster around the mean. If spread is 0, it will always return the mean. -* skew: 0 - How much the height distribution skews to the right (positive) or left (negative) side -* of the height. Unless you have a very specific reason, you should not need to change this. -* Minimum value: -1000, maximum value: 1000 -* limitIntelligence: [-100,100] - Limit the resulting height range. -* Warning: A small intelligence limit range not containing the -* mean, and with a low spread value results in the generator -* having to do lots of work generating and re-generating random -* intelligences until one "fits". -* -* This was modeled using the Height generator above. For some more information, see the comments for that. -* @returns {{random: number, _config: Object}} -*/ -window.Intelligence = (function () { + * Intelligence.random(options) - returns a random intelligence. If no options are passed, the generated number + * will be on a normal distribution with mean 0 and standard deviation 45. + * + * Example: Only generate above-average intelligence based on $activeSlave: + * Intelligence.random({limitIntelligence: [0, 100]}) + * + * Intelligence.config(configuration) - configures the random height generator globally and returns the current configuration + * + * The options and their default values are: + * mean: 0 - What the average intelligence will be. Increasing this will make it more likely + * to generate a smart slave, but will not guarantee it. + * Minimum value: -100, maximum value: 100 + * limitMult: [-3, 3] - Limit to this many standard deviations from the mean. + * In normal use, the values are almost never reached; only 0.27% of values are + * outside this range and need to be regenerated. With higher skew (see below), + * this might change. + * spread: 45 - The random standard deviation of the calculated distribution. A higher value + * will make it more likely to have extreme values, a lower value will make any + * generated values cluster around the mean. If spread is 0, it will always return the mean. + * skew: 0 - How much the height distribution skews to the right (positive) or left (negative) side + * of the height. Unless you have a very specific reason, you should not need to change this. + * Minimum value: -1000, maximum value: 1000 + * limitIntelligence: [-100,100] - Limit the resulting height range. + * Warning: A small intelligence limit range not containing the + * mean, and with a low spread value results in the generator + * having to do lots of work generating and re-generating random + * intelligences until one "fits". + * + * This was modeled using the Height generator above. For some more information, see the comments for that. + * @returns {{random: number, _config: Object}} + */ +window.Intelligence = (function() { "use strict"; // Global configuration (for different game modes/options/types) @@ -784,6 +785,7 @@ window.Intelligence = (function () { let maxIntelligence = 100; /** + * FIXME: JSdoc syntax error * Configuration method for the above values * @param {object} [conf] * @returns {object} @@ -861,7 +863,8 @@ window.Intelligence = (function () { }; /** - * @param {object} settings // I think + * FIXME: JSdoc syntax error + * @param {{ mean: number; limitMult: number[]; limitIntelligence: number[]; skew: number; spread: number; } | { limitMult: number[]; limitIntelligence: number[]; skew: number; spread: number; mean?: undefined; }} settings * @returns {number} */ const _randomIntelligence = function (settings) { @@ -884,8 +887,8 @@ window.Intelligence = (function () { /** * Helper method - generate two independent Gaussian numbers using Box-Muller transform * @returns {number[]} -*/ -window.gaussianPair = function () { + */ +window.gaussianPair = function() { let r = Math.sqrt(-2.0 * Math.log(1 - Math.random())); let sigma = 2.0 * Math.PI * (1 - Math.random()); return [r * Math.cos(sigma), r * Math.sin(sigma)]; @@ -979,19 +982,19 @@ window.num = function (x) { const SCALES = ["thousand", "million", "billion", "trillion"]; /** - * helper function for use with Array.filter - * @param {any} item - * @returns {boolean} - */ + * helper function for use with Array.filter + * @param {any} item + * @returns {boolean} + */ function isTruthy(item) { return !!item; } /** - * convert a number into "chunks" of 0-999 - * @param {number} number - * @returns {number[]} - */ + * convert a number into "chunks" of 0-999 + * @param {number} number + * @returns {number[]} + */ function chunk(number) { const thousands = []; @@ -1004,10 +1007,10 @@ window.num = function (x) { } /** - * translate a number from 1-999 into English - * @param {number} number - * @returns {string} - */ + * translate a number from 1-999 into English + * @param {number} number + * @returns {string} + */ function inEnglish(number) { let hundreds; let tens; @@ -1037,11 +1040,11 @@ window.num = function (x) { } /** - * append the word for a scale. Made for use with Array.map - * @param {string} chunk - * @param {number} exp - * @returns {string} - */ + * append the word for a scale. Made for use with Array.map + * @param {string} chunk + * @param {number} exp + * @returns {string} + */ function appendScale(chunk, exp) { let scale; if (!chunk) { @@ -1052,9 +1055,9 @@ window.num = function (x) { } /** - * @param {number} s - * @returns {string} - */ + * @param {number} s + * @returns {string} + */ function commaNum(s) { if (!s) { return "0"; @@ -1447,10 +1450,10 @@ window.addA = function (word) { }; /** -* @param {App.Entity.SlaveState} slave -* @returns {string} -*/ -window.getSlaveDevotionClass = function (slave) { + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ +window.getSlaveDevotionClass = function(slave) { if ((!slave) || (!State)) { return undefined; } @@ -1475,10 +1478,10 @@ window.getSlaveDevotionClass = function (slave) { }; /** -* @param {App.Entity.SlaveState} slave -* @returns {string} -*/ -window.getSlaveTrustClass = function (slave) { + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ +window.getSlaveTrustClass = function(slave) { if ((!slave) || (!State)) { return undefined; } @@ -1518,10 +1521,10 @@ window.getSlaveTrustClass = function (slave) { /** * Takes an integer e.g. $activeSlave.hLength, returns a string in the format 10 inches -* @param {number} s -* @returns {string} -*/ -window.cmToInchString = function (s) { + * @param {number} s + * @returns {string} + */ +window.cmToInchString = function(s) { let inches = (Math.round(s / 2.54)).toString(); if (inches === "0") { if (s === 0) { @@ -1653,9 +1656,9 @@ window.removeDuplicates = function removeDuplicates(array) { }; /** -* @param {App.Entity.SlaveState} slave -* @returns {string} -*/ + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ window.induceLactation = function induceLactation(slave) { let pronouns = getPronouns(slave); let His = capFirstChar(pronouns.possessive); @@ -1696,10 +1699,10 @@ window.ResearchLabStockPile = function () { }; /** -* @param {App.Entity.SlaveState} slave -* @returns {string} -*/ -window.originPronounReplace = function (slave) { + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ +window.originPronounReplace = function(slave) { let r = slave.origin; switch (r) { case "She was the result of unprotected sex with a client. Her mother tracked you down years after her birth to force her upon you.": @@ -1850,7 +1853,7 @@ App.UI.tabbar = function () { function handlePreSelectedTab() { let selectedTab = State.variables.tabChoice[_tabChoiceVarName()]; if (!selectedTab) { selectedTab = "assign"; } - $(document).one(':passagedisplay', function () { + $(document).one(':passagedisplay', function() { let tabBtn = document.getElementById(`tab ${selectedTab}`); if (!tabBtn) { tabBtn = document.getElementsByClassName('tablinks').item(0); @@ -1882,22 +1885,22 @@ App.Utils.escapeHtml = function (text) { }; /** -* Creates a HTML element with custom SugarCube attributes which works as a passage link -* -* The result works in the same way as the wiki markup in the SugarCube -* @see https://www.motoslave.net/sugarcube/2/docs/#markup-html-attribute -* @param {string} linkText link text -* @param {string} passage the passage name to link to -* @param {string} [setter=''] setter tet (optional) -* @param {string} [elementType='a'] element type (optional) default is 'a'. -* Could be any of 'a', 'audio', img', 'source', 'video' -* @returns {string} element text -* -* @example -* // equal to [[Go to town|Town]] -* App.UI.passageLink("Go to town", "Town") -*/ -App.UI.passageLink = function (linkText, passage, setter, elementType = 'a') { + * Creates a HTML element with custom SugarCube attributes which works as a passage link + * + * The result works in the same way as the wiki markup in the SugarCube + * @see https://www.motoslave.net/sugarcube/2/docs/#markup-html-attribute + * @param {string} linkText link text + * @param {string} passage the passage name to link to + * @param {string} [setter=''] setter tet (optional) + * @param {string} [elementType='a'] element type (optional) default is 'a'. + * Could be any of 'a', 'audio', img', 'source', 'video' + * @returns {string} element text + * + * @example + * // equal to [[Go to town|Town]] + * App.UI.passageLink("Go to town", "Town") + */ +App.UI.passageLink = function(linkText, passage, setter, elementType = 'a') { let res = `<${elementType} data-passage="${passage}"`; if (setter) { res += ` data-setter="${App.Utils.escapeHtml(setter)}"`; @@ -1913,7 +1916,7 @@ App.UI.passageLink = function (linkText, passage, setter, elementType = 'a') { * @param {string} selector * @param {string} newContent */ -App.UI.replace = function (selector, newContent) { +App.UI.replace = function(selector, newContent) { let ins = jQuery(document.createDocumentFragment()); ins.wiki(newContent); const target = $(selector); @@ -1938,7 +1941,7 @@ App.UI.replace = function (selector, newContent) { * @param {string} [tag='div'] * @returns {string} */ -App.UI.htag = function (text, attributes, tag = 'div') { +App.UI.htag = function(text, attributes, tag = 'div') { const payload = text.replace(/(^\n+|\n+$)/, ""); if ("object" === typeof attributes) { @@ -2230,8 +2233,8 @@ window.jsDef = function (input) { * Currently only considers their age * @param {App.Entity.SlaveState} slave * @returns {string} -*/ -window.randomCareer = function (slave) { + */ +window.randomCareer = function(slave) { if (slave.actualAge < 16) { return setup.veryYoungCareers.random(); } else if (slave.actualAge <= 24) { @@ -2500,52 +2503,48 @@ window.changeSkinTone = function (skin, value) { } let prop; for (prop in skinToMelanin) { - if (!skinToMelanin.hasOwnProperty(prop)) { - continue; - } - if (newSkin >= skinToMelanin[prop]) { - return prop; - } + if (!skinToMelanin.hasOwnProperty(prop)) { continue; } + if (newSkin >= skinToMelanin[prop]) { return prop; } } return prop; }; /** -* Creates a span for an link with tooltip containing the reasons why it is disabled -* @param {string} link -* @param {string[]} reasons -* @returns {string} -*/ -App.UI.disabledLink = function (link, reasons) { + * Creates a span for an link with tooltip containing the reasons why it is disabled + * @param {string} link + * @param {string[]} reasons + * @returns {string} + */ +App.UI.disabledLink = function(link, reasons) { const tooltips = reasons.length === 1 ? - `<span class="tooltip">${reasons}</span>`: + `<span class="tooltip">${reasons}</span>` : `<div class="tooltip"><ul>${reasons.map(e => `<li>${e}</li>`).join('')}</ul></div>`; return `<span class="textWithTooltip">${link}${tooltips}</span>`; }; /** -* Expression for SugarCube for referencing a slave by index -* @param {number} i slave array index or -1 for activeSlave -* @returns {string} -*/ -App.Utils.slaveRefString = function (i) { + * Expression for SugarCube for referencing a slave by index + * @param {number} i slave array index or -1 for activeSlave + * @returns {string} + */ +App.Utils.slaveRefString = function(i) { return i >= 0 ? `$slaves[${i}]` : '$activeSlave'; }; /** -* Returns slave by index in the slave array, Accepts -1 for the activeSlave -* @param {number} i slave array index or -1 for activeSlave -* @returns {App.Entity.SlaveState} -*/ -App.Utils.slaveByIndex = function (i) { + * Returns slave by index in the slave array, Accepts -1 for the activeSlave + * @param {number} i slave array index or -1 for activeSlave + * @returns {App.Entity.SlaveState} + */ +App.Utils.slaveByIndex = function(i) { return i === -1 ? State.variables.activeSlave : State.variables.slaves[i]; }; /** -* Sets active slave to the slave with the given index. Does nothing if index < 0 -* @param {number} index -*/ -App.Utils.setActiveSlaveByIndex = function (index) { + * Sets active slave to the slave with the given index. Does nothing if index < 0 + * @param {number} index + */ +App.Utils.setActiveSlaveByIndex = function(index) { if (index >= 0) { State.variables.activeSlave = State.variables.slaves[index]; } @@ -2556,6 +2555,6 @@ App.Utils.setActiveSlaveByIndex = function (index) { * @param {number} id slave ID * @returns {number} */ -App.Utils.slaveIndexForId = function (id) { +App.Utils.slaveIndexForId = function(id) { return State.variables.slaveIndices[id]; }; diff --git a/src/js/vignettes.js b/src/js/vignettes.js index 734f7747dc6a1429b0779c3c27428739bf940eba..62c816f5308882296ab16af0bdb8fa127f5b7956 100644 --- a/src/js/vignettes.js +++ b/src/js/vignettes.js @@ -3443,6 +3443,27 @@ window.GetVignette = function GetVignette(slave) { effect: 1, }); } + if (slave.devotion > 95) { + vignettes.push({ + text: `${he} pushed ${himself} to work even harder than usual in hopes of proving ${his} loyalty to you,`, + type: "cash", + effect: 1, + }); + } + if (slave.trust > 20) { + if (slave.devotion < -20) { + vignettes.push({ + text: `${he} slacked off a lot just to spite you,`, + type: "cash", + effect: -1, + }); + } + vignettes.push({ + text: `${he} worked a bit harder than usual in hopes of impressing you,`, + type: "cash", + effect: 1, + }); + } if (slave.amp === 1) { vignettes.push({ text: `${he} was soaped up, tied to a pole, and used as a very inefficient mop. While being used to clean outside, ${he} certainly drew some stares,`, @@ -3501,6 +3522,32 @@ window.GetVignette = function GetVignette(slave) { effect: 1, }); } + if (slave.tired === 1) { + vignettes.push({ + text: `${he} was so exhausted that ${he} barely got any work done,`, + type: "cash", + effect: -1, + }); + } + if (!canSee(slave)) { + vignettes.push({ + text: `without the power of sight, ${he} routinely failed to spot dirt and grime that other slaves would have noticed,`, + type: "cash", + effect: -1, + }); + vignettes.push({ + text: `${he} routinely kept cleaning well after other slaves would have stopped, simply because ${he} couldn't see how much work had been done already,`, + type: "cash", + effect: 1, + }); + } + if (!canSmell(slave)) { + vignettes.push({ + text: `${he} cleaned up messes other slaves wouldn't touch because ${he} was able to withstand their odors,`, + type: "cash", + effect: 1, + }); + } vignettes.push({ text: `${he} was ordered to clean the many erotically shaped statues around the arcology. ${He} put on a good show, waxing the many tits, asses, and cocks with gusto,`, type: "rep", @@ -3574,6 +3621,23 @@ window.GetVignette = function GetVignette(slave) { effect: -1, }); } + if (canHear(slave)) { + vignettes.push({ + text: `${he} was disturbed by the sounds from all the machinery around ${him},`, + type: "devotion", + effect: -1, + }); + } + vignettes.push({ + text: `${his} milking machine broke down and had to be repaired,`, + type: "cash", + effect: -1, + }); + vignettes.push({ + text: `${he} stumbled across a (waterlogged and unsanitary) wad of money,`, + type: "cash", + effect: 1, + }); vignettes.push({ text: `very little of interest happened because the life of a dairy cow is often really boring,`, type: "rep", @@ -3727,14 +3791,14 @@ window.GetVignette = function GetVignette(slave) { } vignettes.push({ text: `${he} spent hours plotting ${his} escape from the arcology,`, - type: "trust", + type: "devotion", effect: -1, }); } if (slave.relationship === -2) { if (slave.speechRules === "permissive") { vignettes.push({ - text: `${he} spent most of ${his} time fan${boy}ing obsessively about you to everyone ${he} can,`, + text: `${he} spent most of ${his} time fan${boy}ing obsessively about you to everyone ${he} could,`, type: "rep", effect: 1, }); @@ -3797,6 +3861,13 @@ window.GetVignette = function GetVignette(slave) { effect: 0, }); } + if (slave.tired === 1) { + vignettes.push({ + text: `${he} felt very tired and spent a lot of time napping,`, + type: "health", + effect: 0, + }); + } if (slave.intelligence + slave.intelligenceImplant > 50) { vignettes.push({ text: `${he} immersed ${himself} in classics of literature at an arcology library, giving ${him} uncomfortable ideas about society,`, @@ -3817,6 +3888,36 @@ window.GetVignette = function GetVignette(slave) { effect: -1, }); } + if (V.arcologies[0].FSSupremacist !== "unset") { + if (slave.intelligence + slave.intelligenceImplant > 50) { + vignettes.push({ + text: `${he} went to a local library, and was disturbed by all the racial supremacist historical revisionism on display,`, + type: "trust", + effect: -1, + }); + } else if (slave.intelligence + slave.intelligenceImplant < -50) { + vignettes.push({ + text: `${he} went to a local library, and was thrilled by all the racial subjugationist historical revisionism ${he} couldn't recognize,`, + type: "devotion", + effect: 1, + }); + } + } + if (V.arcologies[0].FSSubjugationist !== "unset") { + if (slave.intelligence + slave.intelligenceImplant > 50) { + vignettes.push({ + text: `${he} went to a local library, and was disturbed by all the racial subjugationist historical revisionism on display,`, + type: "trust", + effect: -1, + }); + } else if (slave.intelligence + slave.intelligenceImplant < -50) { + vignettes.push({ + text: `${he} went to a local library, and was thrilled by all the racial subjugationist historical revisionism ${he} couldn't recognize,`, + type: "devotion", + effect: 1, + }); + } + } if (canHear(slave)) { vignettes.push({ text: `${he} spent much of ${his} free time listening to music,`, diff --git a/src/js/wombJS.js b/src/js/wombJS.js index 803227018d2f49eaa4a8396a31b0a0e889d31f4c..0fc8e245981d3496bbf5f4a1afb63298518a4740 100644 --- a/src/js/wombJS.js +++ b/src/js/wombJS.js @@ -62,9 +62,7 @@ window.WombInit = function (actor) { // sorry but for already present broodmothers it's impossible to calculate fully, approximation used. let pw = actor.preg, bCount, bLeft; - if (pw > actor.pregData.normalBirth) { - pw = actor.pregData.normalBirth; - } // to avoid disaster. + if (pw > actor.pregData.normalBirth) { pw = actor.pregData.normalBirth; } // to avoid disaster. bCount = Math.floor(actor.pregType / pw); bLeft = actor.pregType - (bCount * pw); if (pw > actor.pregType) { @@ -239,7 +237,7 @@ window.WombBirthReady = function (actor, readyAge) { return readyCnt; }; -window.WombGetVolume = function (actor) { // most legacy code from pregJS.tw with minor adaptation. +window.WombGetVolume = function(actor) { // most legacy code from pregJS.tw with minor adaptation. if (actor.pregData.sizeType === 0) { return getVolByLen(actor); } else if (actor.pregData.sizeType === 1) { @@ -331,8 +329,7 @@ window.WombGetVolume = function (actor) { // most legacy code from pregJS.tw wit WombInit(actor); alert("WombGetVolume warning - " + actor.slaveName + " " + err); } - if (wombSize < 0) { - // catch for strange cases, to avoid messing with outside code. + if (wombSize < 0) { // catch for strange cases, to avoid messing with outside code. wombSize = 0; } @@ -350,8 +347,7 @@ window.WombGetVolume = function (actor) { // most legacy code from pregJS.tw wit wombSize += targetData.size * targetData.rate; }); - if (wombSize < 0) { - // catch for strange cases, to avoid messing with outside code. + if (wombSize < 0) { // catch for strange cases, to avoid messing with outside code. wombSize = 0; } @@ -369,8 +365,7 @@ window.WombGetVolume = function (actor) { // most legacy code from pregJS.tw wit wombSize += targetData.size; }); - if (wombSize < 0) { - // catch for strange cases, to avoid messing with outside code. + if (wombSize < 0) { // catch for strange cases, to avoid messing with outside code. wombSize = 0; } @@ -637,15 +632,15 @@ window.FetusGlobalReserveCount = function (reserveType) { return 0; } - SV.slaves.forEach(function (slave) { - slave.womb.forEach(function (ft) { + SV.slaves.forEach(function(slave) { + slave.womb.forEach(function(ft) { if (ft.reserve === reserveType) { cnt++; } }); }); - SV.PC.womb.forEach(function (ft) { + SV.PC.womb.forEach(function(ft) { if (ft.reserve === reserveType) { cnt++; } @@ -766,7 +761,7 @@ window.WombGetLittersData = function (actor) { let tmp; // in first place we need to know how many litters here (Assuming that unique litter is have similar .realAge). Also we will know their ages. - actor.womb.forEach(function (ft) { + actor.womb.forEach(function(ft) { if (!unicLiters.includes(Math.ceil(ft.realAge))) { unicLiters.push(Math.ceil(ft.realAge)); } @@ -789,34 +784,31 @@ window.WombGetLittersData = function (actor) { window.BCReserveInit = function () { let SV = State.variables; - SV.slaves.forEach(function (slave) { - slave.womb.forEach(function (ft) { + SV.slaves.forEach(function(slave) { + slave.womb.forEach(function(ft) { if (typeof ft.reserve !== 'string') { ft.reserve = ""; - } - if (typeof ft.motherID !== 'number') { - // setting missing biological mother ID for fetus. + } + if (typeof ft.motherID !== 'number') { // setting missing biological mother ID for fetus. ft.motherID = slave.ID; } if (ft.ID === undefined) { ft.ID = generateNewID(); } - if (typeof ft.realAge !== 'number') { - // setting missing chronological age + if (typeof ft.realAge !== 'number') { // setting missing chronological age ft.realAge = ft.age; } }); }); - SV.PC.womb.forEach(function (ft) { + SV.PC.womb.forEach(function(ft) { if (typeof ft.reserve !== 'string') { ft.reserve = ""; - } + } if (typeof ft.motherID !== 'number') { ft.motherID = SV.PC.ID; } - if (typeof ft.realAge !== 'number') { - // setting missing chronological age + if (typeof ft.realAge !== 'number') { // setting missing chronological age ft.realAge = ft.age; } }); diff --git a/src/pregmod/fMarry.tw b/src/pregmod/fMarry.tw index 5be2e1d34ec60a37ba668af050174ec433a5ab6b..b2ad5aa4d3766bb5026ac142ff25fa514c693cf5 100644 --- a/src/pregmod/fMarry.tw +++ b/src/pregmod/fMarry.tw @@ -548,7 +548,7 @@ You tell $activeSlave.slaveName that you're going to marry $him. (A proposal, of <</if>> <<else>> <<if $activeSlave.clit > 1>> - $His huge clit is quite hard, making $his shift uncomfortably as $his lacy g-string stimulates it. + $His huge clit is quite hard, making $him shift uncomfortably as $his lacy g-string stimulates it. <<else>> $His lacy g-string is starting to look a bit moist in front. <</if>> diff --git a/src/pregmod/widgets/bodyswapWidgets.tw b/src/pregmod/widgets/bodyswapWidgets.tw index 3b82bce59326b89c5866d4217ffeb1e22acf1742..79c3eaa5d0f1d95d1a3c7f20d5165ca9cab45770 100644 --- a/src/pregmod/widgets/bodyswapWidgets.tw +++ b/src/pregmod/widgets/bodyswapWidgets.tw @@ -125,7 +125,9 @@ <<set $args[0].chastityVagina = $args[1].chastityVagina>> <<set $args[0].chastityPenis = $args[1].chastityPenis>> <<set $args[0].chastityAnus = $args[1].chastityAnus>> -<<set $args[0].custom.tattoo = $args[1].custom.tattoo>> +<<if def $args[0].custom && def $args[1].custom>> + <<set $args[0].custom.tattoo = $args[1].custom.tattoo>> +<</if>> <<set $args[0].bellyTat = $args[1].bellyTat>> <<set $args[0].abortionTat = $args[1].abortionTat>> <<set $args[0].birthsTat = $args[1].birthsTat>> diff --git a/src/pregmod/widgets/pregmodWidgets.tw b/src/pregmod/widgets/pregmodWidgets.tw index 738dd3d4ca4f5e72ebca5d3898196857e4c0f798..f1229a97ba39afdf5a05989782d81191b387bf9c 100644 --- a/src/pregmod/widgets/pregmodWidgets.tw +++ b/src/pregmod/widgets/pregmodWidgets.tw @@ -1,7 +1,7 @@ :: pregmod widgets [nobr widget] <<widget "initPC">> - <<set $PC = {name: "Anonymous", surname: 0, title: 1, ID: -1, genes: "XY", pronoun: "he", possessive: "him", object: "his", dick: 1, vagina: 0, preg: 0, pregType: 0, pregWeek: 0, pregKnown: 0, fertKnown: 0, fertPeak: 0, belly: 0, bellyPreg: 0, mpreg: 0, pregSource: 0, pregMood: 0, labor: 0, births: 0, boobsBonus: 0, degeneracy: 0, voiceImplant: 0, accent: 0, shoulders: 0, shouldersImplant: 0, boobs: 0, lactation: 0, lactationDuration: 0, career: "capitalist", rumor: "wealth", birthWeek: random(0,51), age: 2, sexualEnergy: 4, refreshment: "cigar", refreshmentType: 0, trading: 0, warfare: 0, slaving: 0, engineering: 0, medicine: 0, hacking: 0, cumTap: 0, race: "white", origRace: "white", skin: "white", origSkin: "white", markings: "none", eyeColor: "blue", origEye: "blue", pupil: "circular", sclerae: "white", hColor: "blonde", origHColor: "blonde", nationality: "Stateless", father: 0, mother: 0, sisters: 0, daughters: 0, birthElite: 0, birthMaster: 0, birthDegenerate: 0, birthClient: 0, birthOther: 0, birthArcOwner: 0, birthCitizen: 0, birthSelf: 0, birthLab: 0, birthFutaSis: 0, slavesFathered: 0, slavesKnockedUp: 0, intelligence: 100, face: 100, faceShape: "normal", actualAge: 35, physicalAge: 35, visualAge: 35, boobsImplant: 0, butt: 0, buttImplant: 0, balls: 0, ballsImplant: 0, ageImplant: 0, newVag: 0, reservedChildren: 0, reservedChildrenNursery: 0, fertDrugs: 0, forcedFertDrugs: 0, staminaPills: 0, ovaryAge: 35, eggType: "human", ballType: "human", storedCum: 0, behavioralFlaw: "none", behavioralQuirk: "none", sexualFlaw: "none", sexualQuirk: "none", fetish: "none", pubicHStyle: "hairless", underArmHStyle: "hairless", geneticQuirks: {macromastia: 0, gigantomastia: 0, fertility: 0, hyperFertility: 0, superfetation: 0, gigantism: 0, dwarfism: 0, pFace: 0, uFace: 0, albinism: 0, heterochromia: 0, rearLipedema: 0, wellHung: 0, wGain: 0, wLoss: 0, androgyny: 0, girlsOnly: 0}}>> + <<set $PC = {name: "Anonymous", surname: 0, title: 1, ID: -1, genes: "XY", pronoun: "he", possessive: "him", object: "his", dick: 1, vagina: 0, preg: 0, pregType: 0, pregWeek: 0, pregKnown: 0, fertKnown: 0, fertPeak: 0, belly: 0, bellyPreg: 0, mpreg: 0, pregSource: 0, pregMood: 0, labor: 0, births: 0, boobsBonus: 0, degeneracy: 0, voiceImplant: 0, accent: 0, shoulders: 0, shouldersImplant: 0, boobs: 0, lactation: 0, lactationDuration: 0, career: "capitalist", rumor: "wealth", birthWeek: random(0,51), age: 2, sexualEnergy: 4, refreshment: "cigar", refreshmentType: 0, trading: 0, warfare: 0, slaving: 0, engineering: 0, medicine: 0, hacking: 0, cumTap: 0, race: "white", origRace: "white", skin: "white", origSkin: "white", markings: "none", eyeColor: "blue", origEye: "blue", pupil: "circular", sclerae: "white", hColor: "blonde", origHColor: "blonde", nationality: "Stateless", father: 0, mother: 0, sisters: 0, daughters: 0, birthElite: 0, birthMaster: 0, birthDegenerate: 0, birthClient: 0, birthOther: 0, birthArcOwner: 0, birthCitizen: 0, birthSelf: 0, birthLab: 0, birthFutaSis: 0, slavesFathered: 0, slavesKnockedUp: 0, intelligence: 100, face: 100, faceShape: "normal", actualAge: 35, physicalAge: 35, visualAge: 35, boobsImplant: 0, butt: 0, buttImplant: 0, balls: 0, ballsImplant: 0, ageImplant: 0, newVag: 0, reservedChildren: 0, reservedChildrenNursery: 0, fertDrugs: 0, forcedFertDrugs: 0, staminaPills: 0, ovaryAge: 35, eggType: "human", ballType: "human", storedCum: 0, behavioralFlaw: "none", behavioralQuirk: "none", sexualFlaw: "none", sexualQuirk: "none", fetish: "none", pubicHStyle: "hairless", underArmHStyle: "hairless", geneticQuirks: {macromastia: 0, gigantomastia: 0, fertility: 0, hyperFertility: 0, superfetation: 0, gigantism: 0, dwarfism: 0, pFace: 0, uFace: 0, albinism: 0, heterochromia: 0, rearLipedema: 0, wellHung: 0, wGain: 0, wLoss: 0, mGain: 0, mLoss: 0, androgyny: 0, girlsOnly: 0}}>> <<set WombInit($PC)>> @@ -9,7 +9,7 @@ <<widget "PMODinit">> -<<set $args[0].geneticQuirks = Object.assign({macromastia: 0, gigantomastia: 0, fertility: 0, hyperFertility: 0, superfetation: 0, gigantism: 0, dwarfism: 0, pFace: 0, uFace: 0, albinism: 0, heterochromia: 0, rearLipedema: 0, wellHung: 0, wGain: 0, wLoss: 0, androgyny: 0, girlsOnly: 0}, $args[0].geneticQuirks)>> +<<set $args[0].geneticQuirks = Object.assign({macromastia: 0, gigantomastia: 0, fertility: 0, hyperFertility: 0, superfetation: 0, gigantism: 0, dwarfism: 0, pFace: 0, uFace: 0, albinism: 0, heterochromia: 0, rearLipedema: 0, wellHung: 0, wGain: 0, wLoss: 0, mGain: 0, mLoss: 0, androgyny: 0, girlsOnly: 0}, $args[0].geneticQuirks)>> <<set WombInit($args[0])>> diff --git a/src/uncategorized/BackwardsCompatibility.tw b/src/uncategorized/BackwardsCompatibility.tw index 49ebb98f48fc6489451684bd7944b3d2432fc477..7fce69a8e5dca0c31035121d31024e3db17a6b59 100644 --- a/src/uncategorized/BackwardsCompatibility.tw +++ b/src/uncategorized/BackwardsCompatibility.tw @@ -1,4 +1,5 @@ :: Backwards Compatibility [nobr] + /* no-usedOnce disabling checking for only used once instances in this file*/ <<set $nextButton = "Continue", $nextLink = "Main", $returnTo = "Main">> @@ -387,7 +388,7 @@ <<set $PC.ballType = "human">> <</if>> <<if ndef $PC.geneticQuirks>> - <<set $PC.geneticQuirks = {macromastia: 0, gigantomastia: 0, fertility: 0, hyperFertility: 0, superfetation: 0, gigantism: 0, dwarfism: 0, pFace: 0, uFace: 0, albinism: 0, heterochromia: 0, rearLipedema: 0, wellHung: 1, wGain: 0, wLoss: 0, androgyny: 0}>> + <<set $PC.geneticQuirks = {macromastia: 0, gigantomastia: 0, fertility: 0, hyperFertility: 0, superfetation: 0, gigantism: 0, dwarfism: 0, pFace: 0, uFace: 0, albinism: 0, heterochromia: 0, rearLipedema: 0, wellHung: 1, wGain: 0, wLoss: 0, mGain: 0, mLoss: 0, androgyny: 0, girlsOnly: 0}>> <<if $PC.birthMaster > 0>> <<set $PC.geneticQuirks.fertility = 2>> <<elseif $PC.career == "servant">> @@ -400,6 +401,12 @@ <<if ndef $PC.geneticQuirks.girlsOnly>> <<set $PC.geneticQuirks.girlsOnly = 0>> <</if>> + <<if ndef $PC.geneticQuirks.mGain>> + <<set $PC.geneticQuirks.mGain = 0>> + <</if>> + <<if ndef $PC.geneticQuirks.mLoss>> + <<set $PC.geneticQuirks.mLoss = 0>> + <</if>> <</if>> <<if $releaseID < 1032>> <<if $PC.pregSource == -1>> diff --git a/src/uncategorized/RETS.tw b/src/uncategorized/RETS.tw index 3fba6f0acde72a6c555999d176d20b84967039a9..7f270a7eed9aeac20aa63a0cbc358ab9899a8e7e 100644 --- a/src/uncategorized/RETS.tw +++ b/src/uncategorized/RETS.tw @@ -2192,7 +2192,7 @@ $he adds impishly. <<if canHear($subSlave)>>Hearing this<<else>>Realizing your p <<set _belly = bellyAdjective($subSlave)>> You clear your throat for the slaves' attention and verbally order $assistantName to rescind the penthouse rule against interslave rape. _HisA avatar pops up nearby and confirms the rules change. <<if $assistant>>"Done," _heA says. "And I approve. Poor <<= $girl>>s like $activeSlave.slaveName should be able to take what they need."<<else>>"Done," _heA says.<</if>> <br><br> - You give no explicit command to the pair of slaves in front of you, but they understand you perfectly. $subSlave.slaveName pales; <<if $subSlave.fetishKnown && $subSlave.fetish == "sub">>_he2 likes getting fucked, but having someone ordered to rape _him2 is a bit much<<elseif $subSlave.fetishKnown && $subSlave.fetish == "masochist">>_he2 likes being hurt, but having the flirty interchange converted instantly into a situation in which _he2 has no control at all kills _his2 mood<<else>>_he2 wasn't seriously adverse to having sex, but being laid open to rape isn't _his2 idea of a good time<</if>>. $activeSlave.slaveName, meanwhile, looks <<if $subSlave.fetishKnown && $subSlave.fetish == "dom">>rather pleased. $He likes being on top enough that $he's willing to use force if necessary<<elseif $subSlave.fetishKnown && $subSlave.fetish == "sadist">>positively predatory. The sadistic bitch actually prefers it this way<<else>>rather conflicted. $He's obviously relieved $he'll be getting relief, but obviously has some mixed feelings about using force to get what $he wants<</if>>. + You give no explicit command to the pair of slaves in front of you, but they understand you perfectly. $subSlave.slaveName pales; <<if $subSlave.fetishKnown && $subSlave.fetish == "submissive">>_he2 likes getting fucked, but having someone ordered to rape _him2 is a bit much<<elseif $subSlave.fetishKnown && $subSlave.fetish == "masochist">>_he2 likes being hurt, but having the flirty interchange converted instantly into a situation in which _he2 has no control at all kills _his2 mood<<else>>_he2 wasn't seriously adverse to having sex, but being laid open to rape isn't _his2 idea of a good time<</if>>. $activeSlave.slaveName, meanwhile, looks <<if $subSlave.fetishKnown && $subSlave.fetish == "dom">>rather pleased. $He likes being on top enough that $he's willing to use force if necessary<<elseif $subSlave.fetishKnown && $subSlave.fetish == "sadist">>positively predatory. The sadistic bitch actually prefers it this way<<else>>rather conflicted. $He's obviously relieved $he'll be getting relief, but obviously has some mixed feelings about using force to get what $he wants<</if>>. <br><br> <<if $activeSlave.fetishKnown && ($activeSlave.fetish == "dom" || $activeSlave.fetish == "sadist")>> $subSlave.slaveName tries to get down <<if _vaginal>>on the floor and offer _his2 pussy<<else>>down on _his2 knees and offer _his2 asspussy<</if>> without resistance, but $activeSlave.slaveName has other ideas, and shoves the poor slave down hard. $subSlave.slaveName's <<if _vaginal>>butt hits the floor with a smack<<else>>knees hit the floor painfully<</if>> and _he2 moans unhappily as $activeSlave.slaveName penetrates _him2. diff --git a/src/uncategorized/arcologyDescription.tw b/src/uncategorized/arcologyDescription.tw index d46bb83cc103c047de15a967b53fc1b4044ce1fb..9ab0156ab05f99ca15a24ab625d61c600388a409 100644 --- a/src/uncategorized/arcologyDescription.tw +++ b/src/uncategorized/arcologyDescription.tw @@ -493,7 +493,7 @@ Its<<if $weatherCladding == 2>> glorious<<elseif $weatherCladding > 0>> dull<<el Many of them can offer visitors a sample of $arcologies[0].name's pride and joy, straight from the nipple. <</if>> <<if $arcologies[0].FSPhysicalIdealistDecoration >= 80>> - <<if $arcologies[0].FSFitLaw == 1>> + <<if $arcologies[0].FSPhysicalIdealistLaw == 1>> Their bodies are uniformly fit and healthy<<if $arcologies[0].FSRomanRevivalist > 0>> in the Hellenistic tradition<</if>>. <<else>> Their musculature is uniformly stunning. Swole acceptance is high here. diff --git a/src/uncategorized/clubReport.tw b/src/uncategorized/clubReport.tw index c8d1addf17929aac2f9088e81cfe12fc5e53e3c1..c7be6ad48fde65a2dfcbd204e143cfa546ba98d9 100644 --- a/src/uncategorized/clubReport.tw +++ b/src/uncategorized/clubReport.tw @@ -527,9 +527,9 @@ <<if ($clubAdsSpending == 0) || ($clubAdsXX == 0)>> <<set _possibleBonuses++>> <<if (_XX > 0) && (_XY > 0) && (Math.abs(_XX-_XY) <= (_DL/3))>> - <<set $clubBonuses++>> - <<run repX(_DL*random(5,10), "club")>> - The club offers a @@.green;mix@@ of sluts that can appeal to varied tastes in genitalia. + <<set $clubBonuses++>> + <<run repX(_DL*random(5,10), "club")>> + The club offers a @@.green;mix@@ of sluts that can appeal to varied tastes in genitalia. <</if>> <</if>> Most customers don't have preferences for either girls with dicks or girls with pussies. @@ -603,9 +603,9 @@ <<if ($clubAdsSpending == 0) || ($clubAdsOld == 0)>> <<set _possibleBonuses++>> <<if (_young > 0) && (_old > 0) && (Math.abs(_young-_old) <= (_DL/3))>> - <<set $clubBonuses++>> - <<run repX(_DL*random(5,10), "club")>> - There are girls @@.green;both@@ young and mature in $clubName. + <<set $clubBonuses++>> + <<run repX(_DL*random(5,10), "club")>> + There are girls @@.green;both@@ young and mature in $clubName. <</if>> <</if>> <</if>> @@ -673,9 +673,9 @@ <<if ($clubAdsSpending == 0) || ($clubAdsPreg == 0)>> <<set _possibleBonuses++>> <<if (_pregYes > 0) && (_pregNo > 0) && (Math.abs(_pregYes-_pregNo) <= (_DL/3))>> - <<set $clubBonuses++>> - <<run repX(_DL*random(5,10), "club")>> - There is a @@.green;wide@@ selection of slaves with a variety of middles working the club. + <<set $clubBonuses++>> + <<run repX(_DL*random(5,10), "club")>> + There is a @@.green;wide@@ selection of slaves with a variety of middles working the club. <</if>> <</if>> <</if>> diff --git a/src/uncategorized/reBoomerang.tw b/src/uncategorized/reBoomerang.tw index 9fe0047979bdef8c46a7801294b5c236515a06b9..d9f36dff0e89ec9422b2f8ba7111e8ef8bcee9bb 100644 --- a/src/uncategorized/reBoomerang.tw +++ b/src/uncategorized/reBoomerang.tw @@ -104,7 +104,7 @@ brings up the relevant feeds. There's a naked body crumpled pathetically against <<set $activeSlave.lactation = 2, $activeSlave.lactationDuration = 2, $activeSlave.lactationAdaptation = 100>> <<set $activeSlave.boobs = Math.clamp($activeSlave.boobs+2000+50*random(-20,20),0,10000)>> <<set $activeSlave.boobShape = "saggy">> - <<if $seePreg != 0>><<if $activeSlave.ovaries>><<set $activeSlave.preg = random(5,_pregWeeks-1), $activeSlave.pregtype = random(2,4), $activeSlave.vagina = 4, $activeSlave.pregWeek = $activeSlave.preg, $activeSlave.pregKnown = 1, SetBellySize($activeSlave)>><</if>><</if>> + <<if $seePreg != 0>><<if $activeSlave.ovaries>><<set $activeSlave.preg = random(5,_pregWeeks-1), $activeSlave.pregType = random(2,4), $activeSlave.vagina = 4, $activeSlave.pregWeek = $activeSlave.preg, $activeSlave.pregKnown = 1, SetBellySize($activeSlave)>><</if>><</if>> <<if $activeSlave.balls>> <<set $activeSlave.balls = Math.clamp($activeSlave.balls+random(1,2),0,10)>> <<if $activeSlave.dick>><<set $activeSlave.dick = Math.clamp($activeSlave.dick+random(1,2),0,10)>><</if>> @@ -120,9 +120,9 @@ brings up the relevant feeds. There's a naked body crumpled pathetically against "They ran an IV line into me and then put me in a cage with a male <<s>>lave who raped me for a week. Then they <<s>>witched me into a <<s>>maller cage and forgot about me. I can feel my belly <<s>>welling. It'<<s>> horrible." <<set $activeSlave.preg = _pregWeeks-1, $activeSlave.vagina = 4, $activeSlave.pregWeek = $activeSlave.preg, $activeSlave.pregKnown = 1>> <<if $seeHyperPreg == 1>> - <<set $activeSlave.pregtype = random(10,40)>> + <<set $activeSlave.pregType = random(10,40)>> <<else>> - <<set $activeSlave.pregtype = 5>> + <<set $activeSlave.pregType = 5>> <</if>> <<run SetBellySize($activeSlave)>> <<case "porn studio">> @@ -134,14 +134,14 @@ brings up the relevant feeds. There's a naked body crumpled pathetically against <<set $activeSlave.counter.publicUse += 500>> <<case "obsessed fan">> "It wa<<s>> really ni<<c>>e, at fir<<s>>t," $he sniffles, "and I'm a little <<s>>ad it had to end the way it d-did." You sold $him to a die-hard fan who offered up a rather large sum of money for ownership of $him. "He took out too big of a loan and when they came to collect, he let me loo<<s>>e and told me to run, run far away. I d-didn't know where el<<s>>e to g-go." $He breaks down in tears. - <<if canGetPregnant($activeSlave)>> + <<if $seePreg != 0 && canGetPregnant($activeSlave)>> "In the <<sh>>ort time we <<s>>pent together, he left me a gift..." $He runs a hand across $his stomach. "While I wouldn't <<s>>ay I wa<<s>> in love with him, I feel like I have to keep them <<s>>afe for what he did. I can't even think of where I'd have ended up if they had taken me." <<if $activeSlave.mpreg == 1 && $activeSlave.anus == 0>> <<set $activeSlave.anus = 1>> <<elseif $activeSlave.ovaries == 1 && $activeSlave.vagina == 0>> <<set $activeSlave.vagina = 1>> <</if>> - <<if $seePreg != 0>><<set $activeSlave.preg = random(5,_pregWeeks-1), $activeSlave.pregtype = random(2,4), $activeSlave.vagina = 4, $activeSlave.pregWeek = $activeSlave.preg, $activeSlave.pregKnown = 1, $activeSlave.pregSource = -2, SetBellySize($activeSlave)>><</if>> + <<set $activeSlave.preg = random(5,_pregWeeks-1), $activeSlave.pregType = random(2,4), $activeSlave.pregWeek = $activeSlave.preg, $activeSlave.pregKnown = 1, $activeSlave.pregSource = -2, SetBellySize($activeSlave)>> <</if>> <<case "pain fetishist">> "They whip me. A-actually," $he sniffles, "I'm glad when they whip me b-becau<<s>>e e-everything el<<s>>e they d-do is w-wor<<s>>e. The only break I get i-i<<s>> when I'm hurt bad and th-they have to f-fi<<x>> me." After all, you did sell $him into a life as a pain slave. @@ -163,7 +163,7 @@ brings up the relevant feeds. There's a naked body crumpled pathetically against <<set $activeSlave.behavioralFlaw = "odd", $activeSlave.sexualFlaw = "hates men">> <<case "subjugationist arcology">> "They were breeding me with idiot<<s>>." You sold $him to a Subjugationist arcology; it's nothing short of incredible that $he managed to get back here. $He must have sold and traded $himself without hesitation. "I d-don't want thi<<s>> pregnan<<c>>y." - <<set $activeSlave.preg = _pregWeeks-1, $activeSlave.pregtype = random(2,4), $activeSlave.pregWeek = $activeSlave.preg, $activeSlave.pregKnown = 1>> + <<set $activeSlave.preg = _pregWeeks-1, $activeSlave.pregType = random(2,4), $activeSlave.pregWeek = $activeSlave.preg, $activeSlave.pregKnown = 1>> <<run SetBellySize($activeSlave)>> <<case "gender radicalist arcology">> "They <<if $activeSlave.balls>> cut my ball<<s>> off and then<</if>> j-ju<<s>>t kind of t-turned me loo<<s>>e in the corridor<<s>>," $he moans. You sold $him to a Gender Radicalist arcology. "Naked, <<s>>o everyone could u<<s>>e my a<<ss>>. Plea<<s>>e, I don't want to be an entire arcology'<<s>> bitch." @@ -236,7 +236,7 @@ brings up the relevant feeds. There's a naked body crumpled pathetically against <<set $activeSlave.behavioralFlaw = "arrogant", $activeSlave.sexualFlaw = "crude">> <<case "teaching trainer">> "I'm ju<<s>>t a mannequin now," $he <<say>>s hollowly. $His buyer planned to use $him as a teaching tool. "There'<<s>> nothing. No joy, no fun. Ju<<s>>t the <<s>>ame thing, over, and over. In<<s>>ide me." - <<set $activeSlave.fetish = "sub", $activeSlave.fetishStrength = 100>> + <<set $activeSlave.fetish = "submissive", $activeSlave.fetishStrength = 100>> <<set $activeSlave.behavioralFlaw = "hates penetration", $activeSlave.sexualFlaw = "apathetic">> <<case "implanting trainer">> "I d-don't want to be c-cut again," $he <<say>>s hollowly. $His buyer planned to use $him as a surgical teaching tool. "E-every time I'm healed, they implant me again. B-bigger." @@ -318,6 +318,19 @@ brings up the relevant feeds. There's a naked body crumpled pathetically against <<set $activeSlave.weight = Math.clamp($activeSlave.weight+random(50,100),-100,200)>> <<set $activeSlave.bellySag = 80>> <<set $activeSlave.behavioralFlaw = "anorexic">> +<<case "concert hall">> + You sold $him to a local concert venue to help relieve the stage crew's stress. "All of the roadie<<s>>, from out of town, from other arcologie<<s>>, treat like <<s>>ome <<s>>ort of punching bag, or, or like a <<s>>ide of meat. I ju<<s>>t can't go b-back there, anymore." + <<if $activeSlave.vagina > -1>> + <<set $activeSlave.vagina = 3>> + <</if>> + <<set $activeSlave.anus = 3>> + <<if $seePreg != 0>><<if $activeSlave.ovaries>><<set $activeSlave.preg = random(5,_pregWeeks-1), $activeSlave.pregType = random(1,2), $activeSlave.pregSource = either(-2,0), $activeSlave.pregWeek = $activeSlave.preg, $activeSlave.pregKnown = 1, SetBellySize($activeSlave)>><</if>><</if>> +<<case "etiquette coach">> + "The etiquette t-trainer I wa<<s>> <<s>>old to wa<<s>> an e<<x>>cellent teacher indeed," $he <<say>>s with a grimace, "H-however, I find that he had <<s>>ome rather old-f-fa<<sh>>ioned view<<s>> on educational method<<s>>, to be quite b-blunt." You look $him over; $he has numerous caning marks all over $his body, and appears to have been starved. + <<set $activeSlave.weight = random(-80, -70)>> + <<set $activeSlave.health = random(-70, -60)>> + <<set $activeSlave.behavioralFlaw = "odd">> + <<set $activeSlave.sexualFlaw = either("idealistic", "repressed", "self hating", "shamefast")>> <<default>> <<switch _buyer>> <<case "housekeeper">> diff --git a/src/uncategorized/reRecruit.tw b/src/uncategorized/reRecruit.tw index 1c7305ca85d28ee6bd6a36ae2cd3e744e74ca352..5c978de7e8e0e7c2199971648861218c9255ecf8 100644 --- a/src/uncategorized/reRecruit.tw +++ b/src/uncategorized/reRecruit.tw @@ -2482,7 +2482,7 @@ You receive so many messages, as a noted titan of the new Free Cities world, tha This call is coming from a public kiosk, which is usually an indication that the person on the other end is a transient individual who has decided to take slavery over homelessness and not someone of high society. This call, as you would expect, is different. The moment the person on the other end introduces themselves you immediately recognize why your assistant brought this to your attention. The caller is the King of an old world kingdom, contacting you by an untraceable means due of the conspiratorial nature of his proposal. <br><br> He explains that one of his servant <<= $girl>>s was impregnated by his fool of a son, and that he wants to sell you the $girl and $his nosy coworkers to clean house and cover it up. -<<if $arcologies[0].FSrepopulationFocus != "unset">> +<<if $arcologies[0].FSRepopulationFocus != "unset">> You relish at the opportunity to obtain an expectant mother and some decent slaves. <<else>> You aren't particularly concerned with the pregnancy, but it sounds like you could get a several decent slaves out of this. diff --git a/src/uncategorized/remoteSurgery.tw b/src/uncategorized/remoteSurgery.tw index 33a1c1763a85aefbb2e657f9882f971ba3bac23f..e968ef93c8a76cfe9ea6b38b9a686c0688e96e3f 100644 --- a/src/uncategorized/remoteSurgery.tw +++ b/src/uncategorized/remoteSurgery.tw @@ -1431,6 +1431,18 @@ $He has <br> [[Induced albinism treatment|Surgery Degradation][$activeSlave.geneticQuirks.albinism = 2,cashX(forceNeg($surgeryCost*10), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 40,$surgeryType = "gene treatment"]] //This will induce @@.orange;albinism@@ in $his genetic code// <</if>> + /* + <<if $activeSlave.geneticQuirks.androgyny == 2>> + <br> + [[Androgyny correction treatment|Surgery Degradation][$activeSlave.geneticQuirks.androgyny = 0,cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 100,$surgeryType = "gene treatment"]] + <<elseif $activeSlave.geneticQuirks.androgyny == 1 && $geneticMappingUpgrade >= 2>> + <br> + [[Androgyny activation treatment|Surgery Degradation][$activeSlave.geneticQuirks.androgyny = 2,cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 100,$surgeryType = "gene treatment"]] + <<elseif $geneticFlawLibrary == 1>> + <br> + [[Induced androgyny treatment|Surgery Degradation][$activeSlave.geneticQuirks.androgyny = 2,cashX(forceNeg($surgeryCost*10), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 40,$surgeryType = "gene treatment"]] //This will induce @@.orange;natural androgyny@@ in $his genetic code// + <</if>> + */ <<if $activeSlave.geneticQuirks.dwarfism == 2>> <br> [[Dwarfism correction treatment|Surgery Degradation][$activeSlave.geneticQuirks.dwarfism = 0,cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 100,$surgeryType = "gene treatment"]] @@ -1529,6 +1541,48 @@ $He has <br> [[Induced penile development treatment|Surgery Degradation][$activeSlave.geneticQuirks.wellHung = 2,cashX(forceNeg($surgeryCost*10), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 40,$surgeryType = "gene treatment"]] //This will induce @@.orange;penile development@@ in $his genetic code// <</if>> + /* + <<if $activeSlave.geneticQuirks.wGain == 2>> + <br> + [[Correct hyperleptinemia|Surgery Degradation][$activeSlave.geneticQuirks.wGain = 0,cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 100,$surgeryType = "gene treatment"]] + <<elseif $activeSlave.geneticQuirks.wGain == 1 && $geneticMappingUpgrade >= 2>> + <br> + [[Hyperleptinemia activation treatment|Surgery Degradation][$activeSlave.geneticQuirks.wGain = 2,cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 100,$surgeryType = "gene treatment"]] + <<elseif $geneticFlawLibrary == 1>> + <br> + [[Induced hyperleptinemia treatment|Surgery Degradation][$activeSlave.geneticQuirks.wGain = 2,cashX(forceNeg($surgeryCost*10), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 40,$surgeryType = "gene treatment"]] //This will induce @@.orange;hyperleptinemia@@ in $his genetic code// + <</if>> + <<if $activeSlave.geneticQuirks.wLoss == 2>> + <br> + [[Correct hypoleptinemia|Surgery Degradation][$activeSlave.geneticQuirks.wLoss = 0,cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 100,$surgeryType = "gene treatment"]] + <<elseif $activeSlave.geneticQuirks.wLoss == 1 && $geneticMappingUpgrade >= 2>> + <br> + [[Hypoleptinemia activation treatment|Surgery Degradation][$activeSlave.geneticQuirks.wLoss = 2,cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 100,$surgeryType = "gene treatment"]] + <<elseif $geneticFlawLibrary == 1>> + <br> + [[Induced hypoleptinemia treatment|Surgery Degradation][$activeSlave.geneticQuirks.wLoss = 2,cashX(forceNeg($surgeryCost*10), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 40,$surgeryType = "gene treatment"]] //This will induce @@.orange;hypoleptinemia@@ in $his genetic code// + <</if>> + <<if $activeSlave.geneticQuirks.mGain == 2>> + <br> + [[Correct myotonic hypertorphy|Surgery Degradation][$activeSlave.geneticQuirks.mGain = 0,cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 100,$surgeryType = "gene treatment"]] + <<elseif $activeSlave.geneticQuirks.mGain == 1 && $geneticMappingUpgrade >= 2>> + <br> + [[Myotonic hypertorphy activation treatment|Surgery Degradation][$activeSlave.geneticQuirks.mGain = 2,cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 100,$surgeryType = "gene treatment"]] + <<elseif $geneticFlawLibrary == 1>> + <br> + [[Induced myotonic hypertorphy treatment|Surgery Degradation][$activeSlave.geneticQuirks.mGain = 2,cashX(forceNeg($surgeryCost*10), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 40,$surgeryType = "gene treatment"]] //This will induce @@.orange;myotonic hypertorphy@@ in $his genetic code// + <</if>> + <<if $activeSlave.geneticQuirks.mLoss == 2>> + <br> + [[Correct myotonic dystrophy|Surgery Degradation][$activeSlave.geneticQuirks.mLoss = 0,cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 100,$surgeryType = "gene treatment"]] + <<elseif $activeSlave.geneticQuirks.mLoss == 1 && $geneticMappingUpgrade >= 2>> + <br> + [[Myotonic dystrophy activation treatment|Surgery Degradation][$activeSlave.geneticQuirks.mLoss = 2,cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 100,$surgeryType = "gene treatment"]] + <<elseif $geneticFlawLibrary == 1>> + <br> + [[Induced myotonic dystrophy treatment|Surgery Degradation][$activeSlave.geneticQuirks.mLoss = 2,cashX(forceNeg($surgeryCost*10), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 40,$surgeryType = "gene treatment"]] //This will induce @@.orange;myotonic dystrophy@@ in $his genetic code// + <</if>> + */ <</if>> <br><br> <</if>> diff --git a/src/uncategorized/saLongTermEffects.tw b/src/uncategorized/saLongTermEffects.tw index fe984fab934228b495566fb19c42bebd265a095a..38203318e7b06f2077c8f3a15efd68cd2aa2d794 100644 --- a/src/uncategorized/saLongTermEffects.tw +++ b/src/uncategorized/saLongTermEffects.tw @@ -1526,7 +1526,7 @@ even if $he can't understand why. <</if>> <<case "a breeder">> - <<if $slaves[$i].pregKnown == 1 && $arcologies[0].FSRepopulation != "unset">> + <<if $slaves[$i].pregKnown == 1 && $arcologies[0].FSRepopulationFocus != "unset">> $His life used to revolve around being pregnant all the time and nothing has changed. However, being surrounded with happy, heavily pregnant women leaves $him @@.hotpink;slightly more accepting@@ of $his fate and @@.mediumaquamarine;hopeful@@ that $his trained body will be useful to you. <<set $slaves[$i].trust += 1, $slaves[$i].devotion += 1>> <<elseif $slaves[$i].pregControl == "speed up">> diff --git a/src/uncategorized/seExpiration.tw b/src/uncategorized/seExpiration.tw index 7c19049177e3cec973cb4a0ddbb14ffc3312206d..d0e80f1c6633ee1643d412e8e54d4cab8f79f976 100644 --- a/src/uncategorized/seExpiration.tw +++ b/src/uncategorized/seExpiration.tw @@ -75,7 +75,7 @@ $activeSlave.slaveName's indentured servitude is ending this week, meaning that <<if !canTalk($activeSlave)>> $He does $his best to communicate an earnest desire to stay, and repeats over and over that $he loves you. $He begins to indicate a willingness to accept true, unlimited slavery, if that's what it takes to stay. <<else>> - "Plea<<s>>e <<Master>>, don't <<s>>end me away," $he sobs. "I love you! I'll d-do anything — I'll be your <<s>>lave! Plea<<s>>e, en<<s>>lave me. I l-love you...," $he moans, trailing off into convulsive blubbering. + "Plea<<s>>e <<Master>>, don't <<s>>end me away," $he sobs. "I love you! I'll d-do anything — I'll be your <<s>>lave! Plea<<s>>e, en<<s>>lave me. I l-love you..." $he moans, trailing off into convulsive blubbering. <</if>> <br><br> diff --git a/src/uncategorized/seWeddingDouble.tw b/src/uncategorized/seWeddingDouble.tw index 97f007e4ef6132e2a12a0ee4a856ba83e5517b10..86fa63b160fda5f73ff75a7428471f54b3714757 100644 --- a/src/uncategorized/seWeddingDouble.tw +++ b/src/uncategorized/seWeddingDouble.tw @@ -30,6 +30,7 @@ <<set _m = $slaveIndices[_slave1.relationshipTarget]>> <<set _slave1.relationshipTarget = 0>> <<set $slaves[_m].relationship = 0, $slaves[_m].relationshipTarget = 0>> + <<setLocalPronouns $slaves[_m] 3>> <</if>> <</if>> <<if _slave1.relationshipTarget == _slave2.ID>> @@ -117,7 +118,7 @@ <<if !isSlaveAvailable(_slave1)>> Or $he would have, if $he were able. <<elseif !isSlaveAvailable($slaves[_m])>> - Or $he would have, if _he2 were around. + Or $he would have, if _he3 were around. <<elseif canDoVaginal(_slave1) && canDoAnal(_slave1)>> <<set _randomVag = random(3,7)>> <<set _randomAnal = random(1,4)>> @@ -171,7 +172,7 @@ <<if !isSlaveAvailable(_slave1)>> Or $he would have, if $he were able. <<elseif !isSlaveAvailable($slaves[_m])>> - Or $he would have, if _he2 were around. + Or $he would have, if _he3 were around. <<elseif canDoVaginal(_slave1) && canDoAnal(_slave1)>> <<set _randomVag = random(3,7)>> <<set _randomAnal = random(1,4)>> @@ -299,36 +300,37 @@ <<set _n = $slaveIndices[_slave2.relationshipTarget]>> <<set _slave2.relationshipTarget = 0>> <<set $slaves[_n].relationship = 0, $slaves[_n].relationshipTarget = 0>> + <<setLocalPronouns $slaves[_n] 4>> <</if>> <</if>> - _slave2.slaveName, meanwhile, spent $his time + _slave2.slaveName, meanwhile, spent _his2 time <<if _slave2.devotion+_slave2.trust >= 175>> <<if _slave2.relationship != 0>> <<if _slave2.relationship == -1>> - vowing that $he'll be less of a slut. + vowing that _he2'll be less of a slut. <<elseif _slave2.relationship == 4>> - breaking up with $his lover, $slaves[_n].slaveName, as painlessly as possible. + breaking up with _his2 lover, $slaves[_n].slaveName, as painlessly as possible. <<elseif _slave2.relationship == 3>> - breaking up with $his FWB, $slaves[_n].slaveName, as painlessly as possible. + breaking up with _his2 FWB, $slaves[_n].slaveName, as painlessly as possible. <<elseif _slave2.relationship > 0>> promising $slaves[_n].slaveName that they'll still be friends, even if they can't spend time together. <<else>> - as close to you as $he could. + as close to you as _he2 could. <</if>> <</if>> <<elseif _slave2.devotion < -20 && _slave2.trust > 20>> <<if _slave2.relationship == -1>> - sleeping with as many different people as $he could. + sleeping with as many different people as _he2 could. <<if !isSlaveAvailable(_slave2)>> - Or $he would have, if $he were able. + Or _he2 would have, if _he2 were able. <<elseif canDoVaginal(_slave2) && canDoAnal(_slave2)>> <<set _randomVag = random(30,60)>> <<set _randomAnal = random(30,60)>> <<set _randomOral = random(30,60)>> <<set _slave2.counter.vaginal += _randomVag, _slave2.counter.anal += _randomAnal, _slave2.counter.oral += _randomOral, $vaginalTotal += _randomVag, $analTotal += _randomAnal, $oralTotal += _randomOral>> - By week's end, $he's managed to ruin $his body out of spite. $He can barely move, trapped on $his back as cum steadily drips from $his prolapsed, gaping, destroyed holes. + By week's end, _he2's managed to ruin _his2 body out of spite. _He2 can barely move, trapped on _his2 back as cum steadily drips from _his2 prolapsed, gaping, destroyed holes. <<if _slave2.vagina == 0 && _slave2.anus == 0>> - $His actions robbed you of @@.lime;both $his virginities.@@ + _His2 actions robbed you of @@.lime;both _his2 virginities.@@ <</if>> <<if _slave2.vagina < 4>><<set _slave2.vagina = 4>><</if>><<set _slave2.anus = 4>> <<if canGetPregnant(_slave2) && (random(1,100) > 70) && _slave2.eggType == "human">> @@ -341,9 +343,9 @@ <<set _randomVag = random(30,60)>> <<set _randomOral = random(30,60)>> <<set _slave2.counter.vaginal += _randomVag, _slave2.counter.oral += _randomOral, $vaginalTotal += _randomVag, $oralTotal += _randomOral>> - By week's end, $he's managed to ruin $his body out of spite. $He can barely move, trapped on $his back as cum steadily drips from $his prolapsed, gaping, destroyed cunt. + By week's end, _he2's managed to ruin _his2 body out of spite. _He2 can barely move, trapped on _his2 back as cum steadily drips from _his2 prolapsed, gaping, destroyed cunt. <<if _slave2.vagina == 0>> - $His actions robbed you of @@.lime;$his virginity.@@ + _His2 actions robbed you of @@.lime;_his2 virginity.@@ <</if>> <<if _slave2.vagina < 4>><<set _slave2.vagina = 4>><</if>> <<if canGetPregnant(_slave2) && (random(1,100) > 70) && _slave2.eggType == "human">> @@ -356,9 +358,9 @@ <<set _randomAnal = random(30,60)>> <<set _randomOral = random(30,60)>> <<set _slave2.counter.anal += _randomAnal, _slave2.counter.oral += _randomOral, $analTotal += _randomAnal, $oralTotal += _randomOral>> - By week's end, $he's managed to ruin $his body out of spite. $He can barely move, trapped on $his back as cum steadily drips from $his prolapsed, gaping, destroyed anus. + By week's end, _he2's managed to ruin _his2 body out of spite. _He2 can barely move, trapped on _his2 back as cum steadily drips from _his2 prolapsed, gaping, destroyed anus. <<if _slave2.anus == 0>> - $His actions robbed you of @@.lime;$his anal virginity.@@ + _His2 actions robbed you of @@.lime;_his2 anal virginity.@@ <</if>> <<set _slave2.anus = 4>> <<if canGetPregnant(_slave2) && (random(1,100) > 70) && _slave2.eggType == "human">> @@ -370,21 +372,21 @@ <<else>> <<set _randomOral = random(60,100)>> <<set _slave2.counter.oral += _randomOral, $oralTotal += _randomOral>> - By week's end, $he's managed to make $himself sick from sucking down so much sexual fluid. Luckily inducing vomiting will save your wedding from making the tabloids. + By week's end, _he2's managed to make $himself sick from sucking down so much sexual fluid. Luckily inducing vomiting will save your wedding from making the tabloids. <</if>> <<elseif _slave2.relationship == 4>> - fucking $his love, $slaves[_n].slaveName, as often as possible while ignoring you. + fucking _his2 love, $slaves[_n].slaveName, as often as possible while ignoring you. <<if !isSlaveAvailable(_slave2)>> - Or $he would have, if $he were able. + Or _he2 would have, if _he2 were able. <<elseif !isSlaveAvailable($slaves[_n])>> - Or $he would have, if _he2 were around. + Or _he2 would have, if _he4 were around. <<elseif canDoVaginal(_slave2) && canDoAnal(_slave2)>> <<set _randomVag = random(3,7)>> <<set _randomAnal = random(1,4)>> <<set _randomOral = random(5,10)>> <<set _slave2.counter.vaginal += _randomVag, _slave2.counter.anal += _randomAnal, _slave2.counter.oral += _randomOral, $vaginalTotal += _randomVag, $analTotal += _randomAnal, $oralTotal += _randomOral>> <<if _slave2.vagina == 0 && _slave2.anus == 0>> - $His actions robbed you of @@.lime;both $his virginities.@@ + _His2 actions robbed you of @@.lime;both _his2 virginities.@@ <<set _slave2.vagina = 1, _slave2.anus = 1>> <</if>> <<if canImpreg(_slave2, $slaves[_n]) && (random(1,100) > 70)>> @@ -398,7 +400,7 @@ <<set _randomOral = random(5,10)>> <<set _slave2.counter.vaginal += _randomVag, _slave2.counter.oral += _randomOral, $vaginalTotal += _randomVag, $oralTotal += _randomOral>> <<if _slave2.vagina == 0>> - $His actions robbed you of @@.lime;$his virginity.@@ + _His2 actions robbed you of @@.lime;_his2 virginity.@@ <<set _slave2.vagina = 1>> <</if>> <<if canImpreg(_slave2, $slaves[_n]) && (random(1,100) > 70)>> @@ -412,7 +414,7 @@ <<set _randomOral = random(5,10)>> <<set _slave2.counter.anal += _randomAnal, _slave2.counter.oral += _randomOral, $analTotal += _randomAnal, $oralTotal += _randomOral>> <<if _slave2.anus == 0>> - $His actions robbed you of @@.lime;$his anal virginity.@@ + _His2 actions robbed you of @@.lime;_his2 anal virginity.@@ <<set _slave2.anus = 1>> <</if>> <<if canImpreg(_slave2, $slaves[_n]) && (random(1,100) > 70)>> @@ -424,21 +426,21 @@ <<else>> <<set _randomOral = random(15,20)>> <<set _slave2.counter.oral += _randomOral, $oralTotal += _randomOral>> - By week's end, $he's managed to make $himself sick from going down on $slaves[_n].slaveName so often. Luckily inducing vomiting will save your wedding from making the tabloids. + By week's end, _he2's managed to make $himself sick from going down on $slaves[_n].slaveName so often. Luckily inducing vomiting will save your wedding from making the tabloids. <</if>> <<elseif _slave2.relationship == 3>> - fucking $his lover, $slaves[_n].slaveName, as often as possible while ignoring you. + fucking _his2 lover, $slaves[_n].slaveName, as often as possible while ignoring you. <<if !isSlaveAvailable(_slave2)>> - Or $he would have, if $he were able. + Or _he2 would have, if _he2 were able. <<elseif !isSlaveAvailable($slaves[_n])>> - Or $he would have, if _he2 were around. + Or _he2 would have, if _he4 were around. <<elseif canDoVaginal(_slave2) && canDoAnal(_slave2)>> <<set _randomVag = random(3,7)>> <<set _randomAnal = random(1,4)>> <<set _randomOral = random(5,10)>> <<set _slave2.counter.vaginal += _randomVag, _slave2.counter.anal += _randomAnal, _slave2.counter.oral += _randomOral, $vaginalTotal += _randomVag, $analTotal += _randomAnal, $oralTotal += _randomOral>> <<if _slave2.vagina == 0 && _slave2.anus == 0>> - $His actions robbed you of @@.lime;both $his virginities.@@ + _His2 actions robbed you of @@.lime;both _his2 virginities.@@ <<set _slave2.vagina = 1, _slave2.anus = 1>> <</if>> <<if canImpreg(_slave2, $slaves[_n]) && (random(1,100) > 70)>> @@ -452,7 +454,7 @@ <<set _randomOral = random(5,10)>> <<set _slave2.counter.vaginal += _randomVag, _slave2.counter.oral += _randomOral, $vaginalTotal += _randomVag, $oralTotal += _randomOral>> <<if _slave2.vagina == 0>> - $His actions robbed you of @@.lime;$his virginity.@@ + _His2 actions robbed you of @@.lime;_his2 virginity.@@ <<set _slave2.vagina = 1>> <</if>> <<if canImpreg(_slave2, $slaves[_n]) && (random(1,100) > 70)>> @@ -466,7 +468,7 @@ <<set _randomOral = random(5,10)>> <<set _slave2.counter.anal += _randomAnal, _slave2.counter.oral += _randomOral, $analTotal += _randomAnal, $oralTotal += _randomOral>> <<if _slave2.anus == 0>> - $His actions robbed you of @@.lime;$his anal virginity.@@ + _His2 actions robbed you of @@.lime;_his2 anal virginity.@@ <<set _slave2.anus = 1>> <</if>> <<if canImpreg(_slave2, $slaves[_n]) && (random(1,100) > 70)>> @@ -478,7 +480,7 @@ <<else>> <<set _randomOral = random(15,20)>> <<set _slave2.counter.oral += _randomOral, $oralTotal += _randomOral>> - By week's end, $he's managed to make $himself sick from going down on $slaves[_n].slaveName so often. Luckily inducing vomiting will save your wedding from making the tabloids. + By week's end, _he2's managed to make $himself sick from going down on $slaves[_n].slaveName so often. Luckily inducing vomiting will save your wedding from making the tabloids. <</if>> <<elseif _slave2.relationship > 0>> spending time away from you with $slaves[_n].slaveName. @@ -489,22 +491,22 @@ <<if _slave2.relationship == -1>> desperately pleading with you to change your mind. <<elseif _slave2.relationship == 4>> - with $his love, $slaves[_n].slaveName, weeping. + with _his2 love, $slaves[_n].slaveName, weeping. <<elseif _slave2.relationship == 3>> - with $his lover, $slaves[_n].slaveName, weeping. + with _his2 lover, $slaves[_n].slaveName, weeping. <<elseif _slave2.relationship > 0>> - with $his friend, $slaves[_n].slaveName, weeping. + with _his2 friend, $slaves[_n].slaveName, weeping. <<else>> desperately pleading with you to change your mind. <</if>> <<else>> <<if _slave2.relationship == -1>> - trying $his hardest to not sleep with anyone else. + trying _his2 hardest to not sleep with anyone else. <<elseif _slave2.relationship == 4>> - alongside $his love, $slaves[_n].slaveName. + alongside _his2 love, $slaves[_n].slaveName. <<if canDoVaginal(_slave2) && _slave2.vagina != 0>> <<set _slave2.counter.vaginal += 1, $vaginalTotal += 1>> - $He later lets you know $he let $slaves[_n].slaveName enjoy $his pussy one last time. + _He2 later lets you know _he2 let $slaves[_n].slaveName enjoy _his2 pussy one last time. <<if canImpreg(_slave2, $slaves[_n]) && (random(1,100) > 90)>> A pre-wedding checkup following an unusual bout of morning nausea reveals _slave2.slaveName managed to get knocked up. There is no time before the ceremony to deal with it and the distraught $girl is in a panic for making you go through this. <<set _slave2.preg = 1, _slave2.pregKnown = 1, _slave2.pregWeek = 1, _slave2.pregSource = $slaves[_n].ID, $slaves[_n].counter.penetrative++, $penetrativeTotal++>> @@ -513,7 +515,7 @@ <</if>> <<elseif canDoAnal(_slave2)>> <<set _slave2.counter.anal += 1, $analTotal += 1>> - $He later lets you know $he let $slaves[_n].slaveName enjoy $his butt one last time. + _He2 later lets you know _he2 let $slaves[_n].slaveName enjoy _his2 butt one last time. <<if canImpreg(_slave2, $slaves[_n]) && (random(1,100) > 90)>> A pre-wedding checkup following an unusual bout of morning nausea reveals _slave2.slaveName managed to get knocked up. There is no time before the ceremony to deal with it and the distraught $girl is in a panic for making you go through this. <<set _slave2.preg = 1, _slave2.pregKnown = 1, _slave2.pregWeek = 1, _slave2.pregSource = $slaves[_n].ID, $slaves[_n].counter.penetrative++, $penetrativeTotal++>> @@ -522,13 +524,13 @@ <</if>> <<else>> <<set _slave2.counter.oral += 1, $oralTotal += 1>> - $He later tells you $he gave $slaves[_n].slaveName <<if $slaves[_n].dick > 0>>one last blow job<<elseif canDoVaginal($slaves[_n])>>cunnilingus one last time<<else>>oral one last time<</if>>. + _He2 later tells you _he2 gave $slaves[_n].slaveName <<if $slaves[_n].dick > 0>>one last blow job<<elseif canDoVaginal($slaves[_n])>>cunnilingus one last time<<else>>oral one last time<</if>>. <</if>> <<elseif _slave2.relationship == 3>> - alongside $his lover, $slaves[_n].slaveName. + alongside _his2 lover, $slaves[_n].slaveName. <<if canDoVaginal(_slave2) && _slave2.vagina != 0>> <<set _slave2.counter.vaginal += 1, $vaginalTotal += 1>> - $He later lets you know $he let $slaves[_n].slaveName enjoy $his pussy one last time. + _He2 later lets you know _he2 let $slaves[_n].slaveName enjoy _his2 pussy one last time. <<if canImpreg(_slave2, $slaves[_n]) && (random(1,100) > 90)>> A pre-wedding checkup following an unusual bout of morning nausea reveals _slave2.slaveName managed to get knocked up. There is no time before the ceremony to deal with it and the distraught $girl is in a panic for making you go through this. <<set _slave2.preg = 1, _slave2.pregKnown = 1, _slave2.pregWeek = 1, _slave2.pregSource = $slaves[_n].ID, $slaves[_n].counter.penetrative++, $penetrativeTotal++>> @@ -537,7 +539,7 @@ <</if>> <<elseif canDoAnal(_slave2)>> <<set _slave2.counter.anal += 1, $analTotal += 1>> - $He later lets you know $he let $slaves[_n].slaveName enjoy $his butt one last time. + _He2 later lets you know _he2 let $slaves[_n].slaveName enjoy _his2 butt one last time. <<if canImpreg(_slave2, $slaves[_n]) && (random(1,100) > 90)>> A pre-wedding checkup following an unusual bout of morning nausea reveals _slave2.slaveName managed to get knocked up. There is no time before the ceremony to deal with it and the distraught $girl is in a panic for making you go through this. <<set _slave2.preg = 1, _slave2.pregKnown = 1, _slave2.pregWeek = 1, _slave2.pregSource = $slaves[_n].ID, $slaves[_n].counter.penetrative++, $penetrativeTotal++>> @@ -546,10 +548,10 @@ <</if>> <<else>> <<set _slave2.counter.oral += 1, $oralTotal += 1>> - $He later tells you $he gave $slaves[_n].slaveName <<if $slaves[_n].dick > 0>>one last blow job<<elseif canDoVaginal($slaves[_n])>>cunnilingus one last time<<else>>oral one last time<</if>>. + _He2 later tells you _he2 gave $slaves[_n].slaveName <<if $slaves[_n].dick > 0>>one last blow job<<elseif canDoVaginal($slaves[_n])>>cunnilingus one last time<<else>>oral one last time<</if>>. <</if>> <<elseif _slave2.relationship > 0>> - with $his friend, $slaves[_n].slaveName. + with _his2 friend, $slaves[_n].slaveName. <<else>> wearing a very conflicted expression. <</if>> @@ -780,7 +782,7 @@ <</if>> <<else>> <<if _slave1.clit > 1>> - _slave1.slaveName's huge clit is quite hard, making $his shift uncomfortably as $his lacy g-string stimulates it, + _slave1.slaveName's huge clit is quite hard, making $him shift uncomfortably as $his lacy g-string stimulates it, <<else>> _slave1.slaveName's lacy g-string covers $his womanhood demurely, <</if>> @@ -790,25 +792,25 @@ _slave2.slaveName' slave dick is hidden by its chastity cage. <<elseif canAchieveErection(_slave2)>> <<if (_slave2.dick > 4) && (_slave2.belly >= 5000)>> - _slave2.slaveName's hugely erect, with $his lacy g-string only serving to hold $his dick agonizingly pressed against the bottom of $his _belly2 <<if _slave2.bellyPreg >= 3000>>pregnant <</if>>belly. + _slave2.slaveName's hugely erect, with _his2 lacy g-string only serving to hold _his2 dick agonizingly pressed against the bottom of _his2 _belly2 <<if _slave2.bellyPreg >= 3000>>pregnant <</if>>belly. <<elseif _slave2.dick > 4>> - _slave2.slaveName's hugely erect, with $his lacy g-string only serving to hold $his dick upright along $his belly. + _slave2.slaveName's hugely erect, with _his2 lacy g-string only serving to hold _his2 dick upright along _his2 belly. <<else>> - _slave2.slaveName' erection tents the front of $his lacy g-string. + _slave2.slaveName' erection tents the front of _his2 lacy g-string. <</if>> <<elseif (_slave2.dick > 0)>> <<if _slave2.dick > 10>> _slave2.slaveName' huge soft cock is allowed to dangle freely as no g-string could hope to contain it. <<elseif _slave2.dick > 4>> - _slave2.slaveName' big soft cock forms a lewd mass, stuffed into $his lacy g-string. + _slave2.slaveName' big soft cock forms a lewd mass, stuffed into _his2 lacy g-string. <<else>> - _slave2.slaveName' lacy g-string perfectly conceals $his soft dick. + _slave2.slaveName' lacy g-string perfectly conceals _his2 soft dick. <</if>> <<else>> <<if _slave2.clit > 1>> - _slave2.slaveName' huge clit is quite hard, making $his shift uncomfortably as $his lacy g-string stimulates it. + _slave2.slaveName' huge clit is quite hard, making _him2 shift uncomfortably as _his2 lacy g-string stimulates it. <<else>> - _slave2.slaveName' lacy g-string covers $his womanhood demurely. + _slave2.slaveName' lacy g-string covers _his2 womanhood demurely. <</if>> <</if>> <</if>> @@ -843,13 +845,13 @@ <<if _slave2.fetish == "mindbroken">> has to be pushed into walking towards you. <<elseif _slave2.devotion+_slave2.trust >= 175>> - does this of $his own choice, and $he does so with a smile. + does this of _his2 own choice, and _he2 does so with a smile. <<elseif _slave2.devotion < -20 && _slave2.trust > 20>> - does this of $his own choice, and $he does so with hesitation. + does this of _his2 own choice, and _he2 does so with hesitation. <<elseif _slave2.devotion < -20>> - does this of $his own (forced) choice, and $he does so with wavering steps. + does this of _his2 own (forced) choice, and _he2 does so with wavering steps. <<else>> - does this of $his own choice, and $he does so willingly. + does this of _his2 own choice, and _he2 does so willingly. <</if>> <</if>> @@ -1216,7 +1218,7 @@ <</if>> <</if>> - <<if (_slave1.relationship != 0) && (_slave2.relationship != 0)>> + <<if (_slave1.relationship != 0) || (_slave2.relationship != 0)>> <<if _slave1.relationshipTarget == _slave2.ID>> /* TODO: not sure about these */ <<if ((_slave1.devotion+_slave1.trust >= 175) && (_slave2.devotion+_slave2.trust >= 175)) || ((_slave1.devotion < -20 && _slave1.trust > 20) && (_slave2.devotion < -20 && _slave2.trust > 20)) || ((_slave1.devotion < -20) && (_slave2.devotion < -20)) || ((_slave1.devotion >= -20 && _slave2.devotion >= -20))>> @@ -1259,7 +1261,7 @@ <<if _slave1.relationship != 0>> <<if _slave1.devotion+_slave1.trust >= 175>> <<if _slave1.relationship > 0>> - $His <<if _slave1.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his2 <<if _slave1.relationship > 2>>ex<<else>>companion<</if>>'s future. + _slave1.slaveName's <<if _slave1.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his3 <<if _slave1.relationship > 2>>ex<<else>>companion<</if>>'s future. <<if _slave1.relationship == 4>> <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> <<elseif _slave1.relationship == 3>> @@ -1270,142 +1272,93 @@ <</if>> <<elseif _slave1.devotion < -20>> <<if _slave1.relationship == -1>> - $He @@.mediumorchid;hates@@ that $he has to be yours only and @@.gold;fears@@ what will happen if $he strays. + _slave1.slaveName @@.mediumorchid;hates@@ that $he has to be yours only and @@.gold;fears@@ what will happen if $he strays. <<set _slave1.devotion -= 40, _slave1.trust -= 40>> <<elseif _slave1.relationship == 4>> - Both $him and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;furious@@ to watch _his2 life's love get stolen away and fucked pregnant in such a manner. + Both _slave1.slaveName and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;furious@@ to watch _his3 life's love get stolen away and fucked pregnant in such a manner. <<set $slaves[_m].devotion -= 60, $slaves[_m].trust -= 40>> <<set _slave1.devotion -= 40, _slave1.trust -= 40>> <<elseif _slave1.relationship == 3>> - Both $him and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his2 life's love get stolen away and fucked pregnant in such a manner. + Both _slave1.slaveName and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his3 life's love get stolen away and fucked pregnant in such a manner. <<set $slaves[_m].devotion -= 30, $slaves[_m].trust -= 30>> <<set _slave1.devotion -= 50, _slave1.trust -= 30>> <<elseif _slave1.relationship > 0>> - Both $him and $his friend @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. + Both _slave1.slaveName and $his friend @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> <<set _slave1.devotion -= 20, _slave1.trust -= 20>> <</if>> <<else>> <<if _slave1.relationship == -1>> - $He @@.mediumorchid;dislikes@@ that $he has to be yours only and @@.gold;worries@@ what will happen if $he strays. + _slave1.slaveName @@.mediumorchid;dislikes@@ that $he has to be yours only and @@.gold;worries@@ what will happen if $he strays. <<set _slave1.devotion -= 10, _slave1.trust -= 10>> <<elseif _slave1.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his2 life's love get stolen away and fucked pregnant in such a manner. + Both _slave1.slaveName and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his3 life's love get stolen away and fucked pregnant in such a manner. <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> <<set _slave1.devotion -= 30, _slave1.trust -= 20>> <<elseif _slave1.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is a little @@.mediumorchid;jealous@@ of you for snagging such catch out from under _him2. + Both _slave1.slaveName and $his ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is a little @@.mediumorchid;jealous@@ of you for snagging such catch out from under _him3. <<set $slaves[_m].devotion -= 10, $slaves[_m].trust -= 10>> <<set _slave1.devotion -= 15, _slave1.trust -= 10>> <<elseif _slave1.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. + Both _slave1.slaveName and $his friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> <<set _slave1.devotion -= 5, _slave1.trust -= 5>> <</if>> <</if>> - <<elseif _slave2.relationship != 0>> - <<if _slave1.devotion+_slave1.trust >= 175>> - <<if _slave1.relationship > 0>> - $His <<if _slave1.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his2 <<if _slave1.relationship > 2>>ex<<else>>companion<</if>>'s future. - <<if _slave1.relationship == 4>> - <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> - <<elseif _slave1.relationship == 3>> - <<set $slaves[_m].devotion -= 3, $slaves[_m].trust -= 3>> + <</if>> + <<if _slave2.relationship != 0>> + <<if _slave2.devotion+_slave1.trust >= 175>> + <<if _slave2.relationship > 0>> + _slave2.slaveName's <<if _slave2.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his4 <<if _slave2.relationship > 2>>ex<<else>>companion<</if>>'s future. + <<if _slave2.relationship == 4>> + <<set $slaves[_n].devotion -= 5, $slaves[_n].trust -= 5>> + <<elseif _slave2.relationship == 3>> + <<set $slaves[_n].devotion -= 3, $slaves[_n].trust -= 3>> <<else>> - <<set $slaves[_m].devotion -= 1, $slaves[_m].trust -= 1>> + <<set $slaves[_n].devotion -= 1, $slaves[_n].trust -= 1>> <</if>> <</if>> - <<elseif _slave1.devotion < -20>> - <<if _slave1.relationship == -1>> - $He @@.mediumorchid;hates@@ that $he has to be yours only and @@.gold;fears@@ what will happen if $he strays. - <<set _slave1.devotion -= 40, _slave1.trust -= 40>> - <<elseif _slave1.relationship == 4>> - Both $him and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;furious@@ to watch _his2 life's love get stolen away and fucked pregnant in such a manner. - <<set $slaves[_m].devotion -= 60, $slaves[_m].trust -= 40>> - <<set _slave1.devotion -= 40, _slave1.trust -= 40>> - <<elseif _slave1.relationship == 3>> - Both $him and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his2 life's love get stolen away and fucked pregnant in such a manner. - <<set $slaves[_m].devotion -= 30, $slaves[_m].trust -= 30>> - <<set _slave1.devotion -= 50, _slave1.trust -= 30>> - <<elseif _slave1.relationship > 0>> - Both $him and $his friend @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. - <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave1.devotion -= 20, _slave1.trust -= 20>> + <<elseif _slave2.devotion < -20>> + <<if _slave2.relationship == -1>> + _slave2.slaveName @@.mediumorchid;hates@@ that _he2 has to be yours only and @@.gold;fears@@ what will happen if _he2 strays. + <<set _slave2.devotion -= 40, _slave2.trust -= 40>> + <<elseif _slave2.relationship == 4>> + Both _slave2.slaveName and _his2 ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_n].slaveName is especially @@.mediumorchid;furious@@ to watch _his4 life's love get stolen away and fucked pregnant in such a manner. + <<set $slaves[_n].devotion -= 60, $slaves[_n].trust -= 40>> + <<set _slave2.devotion -= 40, _slave2.trust -= 40>> + <<elseif _slave2.relationship == 3>> + Both _slave2.slaveName and _his2 ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_n].slaveName is especially @@.mediumorchid;hurt@@ after watching _his4 life's love get stolen away and fucked pregnant in such a manner. + <<set $slaves[_n].devotion -= 30, $slaves[_n].trust -= 30>> + <<set _slave2.devotion -= 50, _slave2.trust -= 30>> + <<elseif _slave2.relationship > 0>> + Both _slave2.slaveName and _his2 friend @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. + <<set $slaves[_n].devotion -= 20, $slaves[_n].trust -= 20>> + <<set _slave2.devotion -= 20, _slave2.trust -= 20>> <</if>> <<else>> - <<if _slave1.relationship == -1>> - $He @@.mediumorchid;dislikes@@ that $he has to be yours only and @@.gold;worries@@ what will happen if $he strays. - <<set _slave1.devotion -= 10, _slave1.trust -= 10>> - <<elseif _slave1.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his2 life's love get stolen away and fucked pregnant in such a manner. - <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave1.devotion -= 30, _slave1.trust -= 20>> - <<elseif _slave1.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is a little @@.mediumorchid;jealous@@ of you for snagging such catch out from under _him2. - <<set $slaves[_m].devotion -= 10, $slaves[_m].trust -= 10>> - <<set _slave1.devotion -= 15, _slave1.trust -= 10>> - <<elseif _slave1.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. - <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> - <<set _slave1.devotion -= 5, _slave1.trust -= 5>> + <<if _slave2.relationship == -1>> + _slave2.slaveName @@.mediumorchid;dislikes@@ that _he2 has to be yours only and @@.gold;worries@@ what will happen if _he2 strays. + <<set _slave2.devotion -= 10, _slave2.trust -= 10>> + <<elseif _slave2.relationship == 4>> + Both _slave2.slaveName and _his2 ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_n].slaveName is especially @@.mediumorchid;hurt@@ after watching _his4 life's love get stolen away and fucked pregnant in such a manner. + <<set $slaves[_n].devotion -= 20, $slaves[_n].trust -= 20>> + <<set _slave2.devotion -= 30, _slave2.trust -= 20>> + <<elseif _slave2.relationship == 3>> + Both _slave2.slaveName and _his2 ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_n].slaveName is a little @@.mediumorchid;jealous@@ of you for snagging such catch out from under _him4. + <<set $slaves[_n].devotion -= 10, $slaves[_n].trust -= 10>> + <<set _slave2.devotion -= 15, _slave2.trust -= 10>> + <<elseif _slave2.relationship > 0>> + Both _slave2.slaveName and _his2 friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. + <<set $slaves[_n].devotion -= 5, $slaves[_n].trust -= 5>> + <<set _slave2.devotion -= 5, _slave2.trust -= 5>> <</if>> <</if>> - <<else>> - @@.red;Error! DCoded doesn't know to code. Please report this.@@ - <</if>> - <</if>> - <<else>> - <<if _slave1.devotion+_slave1.trust >= 175>> - <<if _slave1.relationship > 0>> - $His <<if _slave1.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his2 <<if _slave1.relationship > 2>>ex<<else>>companion<</if>>'s future. - <<if _slave1.relationship == 4>> - <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> - <<elseif _slave1.relationship == 3>> - <<set $slaves[_m].devotion -= 3, $slaves[_m].trust -= 3>> - <<else>> - <<set $slaves[_m].devotion -= 1, $slaves[_m].trust -= 1>> - <</if>> - <</if>> - <<elseif _slave1.devotion < -20>> - <<if _slave1.relationship == -1>> - $He @@.mediumorchid;hates@@ that $he has to be yours only and @@.gold;fears@@ what will happen if $he strays. - <<set _slave1.devotion -= 40, _slave1.trust -= 40>> - <<elseif _slave1.relationship == 4>> - Both $him and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;furious@@ to watch _his2 life's love get stolen away and fucked pregnant in such a manner. - <<set $slaves[_m].devotion -= 60, $slaves[_m].trust -= 40>> - <<set _slave1.devotion -= 40, _slave1.trust -= 40>> - <<elseif _slave1.relationship == 3>> - Both $him and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his2 life's love get stolen away and fucked pregnant in such a manner. - <<set $slaves[_m].devotion -= 30, $slaves[_m].trust -= 30>> - <<set _slave1.devotion -= 50, _slave1.trust -= 30>> - <<elseif _slave1.relationship > 0>> - Both $him and $his friend @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. - <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave1.devotion -= 20, _slave1.trust -= 20>> - <</if>> - <<else>> - <<if _slave1.relationship == -1>> - $He @@.mediumorchid;dislikes@@ that $he has to be yours only and @@.gold;worries@@ what will happen if $he strays. - <<set _slave1.devotion -= 10, _slave1.trust -= 10>> - <<elseif _slave1.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his2 life's love get stolen away and fucked pregnant in such a manner. - <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave1.devotion -= 30, _slave1.trust -= 20>> - <<elseif _slave1.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is a little @@.mediumorchid;jealous@@ of you for snagging such catch out from under _him2. - <<set $slaves[_m].devotion -= 10, $slaves[_m].trust -= 10>> - <<set _slave1.devotion -= 15, _slave1.trust -= 10>> - <<elseif _slave1.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. - <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> - <<set _slave1.devotion -= 5, _slave1.trust -= 5>> <</if>> <</if>> <</if>> <<set _slave1.relationship = -3>> <<if _slave1.mpreg == 1>><<set _slave1.counter.anal += 1, $analTotal += 1>><<else>><<set _slave1.counter.vaginal += 1, $vaginalTotal += 1>><</if>> <<run repX(1250, "event", _slave1)>> - <<run repX(1250, "event", _slave2)>> <<if _slave1.fetish == "mindbroken">> <<set $desc = "a framed shot of you impregnating the blank-faced " + _slave1.slaveName + " at your wedding">> <<elseif _slave1.devotion+_slave1.trust >= 175>> @@ -1420,7 +1373,6 @@ <<set $trinkets.push($desc)>> <<set _slave2.relationship = -3>> <<if _slave2.mpreg == 1>><<set _slave2.counter.anal += 1, $analTotal += 1>><<else>><<set _slave2.counter.vaginal += 1, $vaginalTotal += 1>><</if>> - <<run repX(1250, "event", _slave1)>> <<run repX(1250, "event", _slave2)>> <<if _slave2.fetish == "mindbroken">> <<set $desc = "a framed shot of you impregnating the blank-faced " + _slave2.slaveName + " at your wedding">> @@ -1435,10 +1387,11 @@ <</if>> <<set $trinkets.push($desc)>> <<if $arcologies[0].FSRestart != "unset" && (_slave1.breedingMark == 0 || $propOutcome == 0) && (_slave2.breedingMark == 0 || $propOutcome == 0) && $eugenicsFullControl != 1>> - You have @@.red;angered@@ the Societal Elite by this public showing of everything they stand against. + You have @@.red;infuriated@@ the Societal Elite by this public showing of everything they stand against. <<set $failedElite += 500>> <<elseif $arcologies[0].FSRestart != "unset" && ((_slave1.breedingMark == 1) && (_slave2.breedingMark == 1))>> The Societal Elite are @@.green;very pleased@@ with this public display of their values. /* TODO: not happy with this sentence */ + <<set $failedElite -= 250>> <</if>> <<elseif $weddingPlanned == 2>> @@ -1449,7 +1402,7 @@ /* TODO: rewrite for slaves that can't walk */ They spent the day before resting and preparing themselves, if you can call sitting around mindlessly preparing. They spend most of the daylong party at the center of a nonstop gangbang, occasionally moaning as more of a physical reaction than anything. The theory is that they'll be bound to you as your slave wives from this day onward, so they must get the promiscuity that is a sex slave's responsibility out of the way now. Whatever their opinions on the idea, your guests take part with enthusiasm, completely unhampered by your slave's utter emptiness. Many brought their own slaves to participate, too. _slave1.slaveName and _slave2.slaveName spend hours with numerous cocks inside them, with attending slaves using their mouths on any erogenous zones they can reach. When the moment of the ceremony nears, they are extracted and taken off to be bathed. <br><br> - They return shortly, looking exhausted but otherwise uncaring. They're naked still, their skin clean, and are <<if _slave1.amp == 1 && _slave2.amp == 1>>carried<<else>>led<</if>> to you for the ceremony by other slaves. The only evident signs that they've had sex with more than a hundred people today is their asses, which look rather well traveled, and their tiredness. They can't conceal their tiredness, and lean against you subconsciously. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for them, and you place a simple steel ring<<if (_slave1.amp == 1 && _slave2.amp == 1)>>on a cord around both of their necks, since they lack fingers to wear it on.<<elseif (_slave1.devotion >= -20 && _slave1.trust > 20) && (_slave2.devotion >= -20 && _slave2.trust > 20)>>on both of their middle fingers.<<else>><<if _slave1.amp == 1>>on a cord around _slave1.slaveName's neck, since $he lacks fingers to wear it on<<else>>on _slave1.slaveName's finger<</if>>and another ring<<if _slave2.amp == 1>>on a cord around _slave2.slaveName's neck, since _he2 lacks fingers to wear it on.<<else>>on _slave2.slaveName's finger.<</if>><</if>> There is no ring for you, since this marriage does not bind you. + They return shortly, looking exhausted but otherwise uncaring. They're naked still, their skin clean, and are <<if _slave1.amp == 1 && _slave2.amp == 1>>carried<<else>>led<</if>> to you for the ceremony by other slaves. The only evident signs that they've had sex with more than a hundred people today is their asses, which look rather well traveled, and their tiredness. They can't conceal their tiredness, and lean against you subconsciously. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for them, and you place a simple steel ring<<if (_slave1.amp == 1 && _slave2.amp == 1)>>on a cord around both of their necks, since they lack fingers to wear it on.<<elseif (_slave1.devotion >= -20 && _slave1.trust > 20) && (_slave2.devotion >= -20 && _slave2.trust > 20)>>on both of their middle fingers.<<else>><<if _slave1.amp == 1>>on a cord around _slave1.slaveName's neck, since $he lacks fingers to wear it on<<else>>on _slave1.slaveName's finger<</if>> and another ring <<if _slave2.amp == 1>>on a cord around _slave2.slaveName's neck, since _he2 lacks fingers to wear it on.<<else>>on _slave2.slaveName's finger.<</if>><</if>> There is no ring for you, since this marriage does not bind you. <br><br> /* TODO: marked for rewrite */ Once the ceremony is complete, you scoop up your new slave wives to carry them back into the master bedroom. They rest their heads against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>> as you cradle them in your arms, and by the time they're home, they're fast asleep. You set them gently down on the bed and curl up behind them, feeling the animal warmth of their bodies as the exhausted slaves' chest rise and fall with their breathing. @@ -1457,7 +1410,7 @@ /* TODO: rewrite for slaves that can't walk */ They spent the day before resting and preparing themselves, and this was a necessary precaution. They spend most of the daylong party at the center of a nonstop gangbang. The theory is that they'll be bound to you as your slave wives from this day onward, so they must get the promiscuity that is a sex slave's responsibility out of the way now. Whatever their opinions on the idea, @@.green;your guests take part with enthusiasm,@@ many having brought their own slaves to participate, too. _slave1.slaveName and _slave2.slaveName spend hours with numerous cocks inside them, with attending slaves using their mouths on any erogenous zones they can reach. When the moment of the ceremony nears, they're extracted and taken off to be bathed. <br><br> - They return shortly, looking exhausted but rather proud of themselves for getting through all that. They're naked still, their skin clean, and <<if _slave1.amp == 1 && _slave2.amp == 1>>are carried<<else>>come confidently<</if>> to stand by you for the ceremony. The only evident signs that they've had sex with more than a hundred people today is their asses, which look rather well-traveled, and their tiredness. They do their best to conceal how ready to sleep they are, but they lean against you a little. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for them, and you place a simple steel ring<<if (_slave1.amp == 1 && _slave2.amp == 1)>>on a cord around both of their necks, since they lack fingers to wear it on.<<elseif (_slave1.devotion >= -20 && _slave1.trust > 20) && (_slave2.devotion >= -20 && _slave2.trust > 20)>>on both of their middle fingers.<<else>><<if _slave1.amp == 1>>on a cord around _slave1.slaveName's neck, since $he lacks fingers to wear it on<<else>>on _slave1.slaveName's finger<</if>>and another ring<<if _slave2.amp == 1>>on a cord around _slave2.slaveName's neck, since _he2 lacks fingers to wear it on.<<else>>on _slave2.slaveName's finger.<</if>><</if>> There is no ring for you, since this marriage does not bind you. + They return shortly, looking exhausted but rather proud of themselves for getting through all that. They're naked still, their skin clean, and <<if _slave1.amp == 1 && _slave2.amp == 1>>are carried<<else>>come confidently<</if>> to stand by you for the ceremony. The only evident signs that they've had sex with more than a hundred people today is their asses, which look rather well-traveled, and their tiredness. They do their best to conceal how ready to sleep they are, but they lean against you a little. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for them, and you place a simple steel ring<<if (_slave1.amp == 1 && _slave2.amp == 1)>>on a cord around both of their necks, since they lack fingers to wear it on.<<elseif (_slave1.devotion >= -20 && _slave1.trust > 20) && (_slave2.devotion >= -20 && _slave2.trust > 20)>>on both of their middle fingers.<<else>><<if _slave1.amp == 1>>on a cord around _slave1.slaveName's neck, since $he lacks fingers to wear it on<<else>>on _slave1.slaveName's finger<</if>> and another ring <<if _slave2.amp == 1>>on a cord around _slave2.slaveName's neck, since _he2 lacks fingers to wear it on.<<else>>on _slave2.slaveName's finger.<</if>><</if>> There is no ring for you, since this marriage does not bind you. <br><br> /* TODO: marked for rewrite */ Once the ceremony is complete, you scoop up your new slave wives to carry them back into the master bedroom. They rest their heads against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>> as you cradle them in your arms, and by the time they're home, they're fast asleep. You set them gently down on the bed and curl up behind them, feeling the animal warmth of their bodies as the exhausted slave's chest rises and falls with their breathing. @@ -1465,7 +1418,7 @@ /* TODO: rewrite for slaves that can't walk */ They spent the day before resting and trying to ready themselves, and this was a necessary precaution. They spend most of the daylong party at the center of a nonstop gangbang, screaming mixed cries of pleasure and horror. The theory is that they'll be bound to you as your slave wives from this day onward, so they must get the promiscuity that is a sex slave's responsibility out of the way now. Whatever their opinions on the idea, your guests take part with enthusiasm, completely unhampered by your slave's utter unwillingness. Many brought their own slaves to participate, too. _slave1.slaveName and _slave2.slaveName spend hours with numerous cocks inside them, with attending slaves using their mouths on any erogenous zones they can reach. When the moment of the ceremony nears, they're extracted and taken off to be bathed. <br><br> - They return shortly, looking exhausted and annoyed. They're naked still, their skin clean, and come reluctantly to stand by you for the ceremony, glaring at you the whole time. The only evident signs that they've had sex with more than a hundred people today is their asses, which look rather well traveled, and their tiredness. They do their best to conceal their tiredness and look stronger than they are, choosing to struggle to stand instead of leaning against you. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for them, and you place a simple steel ring<<if (_slave1.amp == 1 && _slave2.amp == 1)>>on a cord around both of their necks, since they lack fingers to wear it on.<<elseif (_slave1.devotion < -20 && _slave1.trust <= 20) && (_slave1.devotion < -20 && _slave1.trust <= 20)>>on both of their trembling middle fingers.<<else>><<if _slave1.amp == 1>>on a cord around _slave1.slaveName's neck, since $he lacks fingers to wear it on<<else>>on _slave1.slaveName's trembling finger<</if>>and another ring<<if _slave2.amp == 1>>on a cord around _slave2.slaveName's neck, since _he2 lacks fingers to wear it on.<<else>>on _slave2.slaveName's trembling finger.<</if>><</if>>There is no ring for you, since this marriage does not bind you. + They return shortly, looking exhausted and annoyed. They're naked still, their skin clean, and come reluctantly to stand by you for the ceremony, glaring at you the whole time. The only evident signs that they've had sex with more than a hundred people today is their asses, which look rather well traveled, and their tiredness. They do their best to conceal their tiredness and look stronger than they are, choosing to struggle to stand instead of leaning against you. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for them, and you place a simple steel ring<<if (_slave1.amp == 1 && _slave2.amp == 1)>>on a cord around both of their necks, since they lack fingers to wear it on.<<elseif (_slave1.devotion < -20 && _slave1.trust <= 20) && (_slave1.devotion < -20 && _slave1.trust <= 20)>>on both of their trembling middle fingers.<<else>><<if _slave1.amp == 1>>on a cord around _slave1.slaveName's neck, since $he lacks fingers to wear it on<<else>>on _slave1.slaveName's trembling finger<</if>> and another ring <<if _slave2.amp == 1>>on a cord around _slave2.slaveName's neck, since _he2 lacks fingers to wear it on.<<else>>on _slave2.slaveName's trembling finger.<</if>><</if>>There is no ring for you, since this marriage does not bind you. <br><br> /* TODO: marked for rewrite */ Once the ceremony is complete, you scoop up your new, protesting, slave wives to carry them back into the master bedroom. They rest their heads against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>>, simply too tired to care anymore. By the time they're home, they're fast asleep. You set them gently down on the bed and curl up behind them, feeling the animal warmth of their bodies as the exhausted slaves' chest rise and fall with their breathing. They squirms slightly in their sleep to the unwelcome feeling of your arm around them. @@ -1473,7 +1426,7 @@ /* TODO: rewrite for slaves that can't walk */ They spent the day before resting and crying to themselves, and this was a necessary precaution. They spend most of the daylong party at the center of a nonstop gangbang, screaming mixed cries of pleasure and horror. The theory is that they'll be bound to you as your slave wives from this day onward, so they must get the promiscuity that is a sex slave's responsibility out of the way now. Whatever their opinions on the idea, your guests take part with enthusiasm, completely unhampered by your slave's utter unwillingness. Many brought their own slaves to participate, too. _slave1.slaveName and _slave2.slaveName spend hours with numerous cocks inside them, with attending slaves using their mouths on any erogenous zones they can reach. When the moment of the ceremony nears, they're extracted and taken off to be bathed. <br><br> - They return shortly, looking exhausted and depressed. They're naked still, their skin clean, and come reluctantly to stand by you for the ceremony, just wanting it to be over. The only evident signs that they've had sex with more than a hundred people today is their asses, which look rather well traveled, and their tiredness. They do their best to conceal their tiredness out of fear of punishment, and they lean against you for support despite their feelings on the wedding and you. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for them, and you place a simple steel ring<<if (_slave1.amp == 1 && _slave2.amp == 1)>>on a cord around both of their necks, since they lack fingers to wear it on.<<elseif (_slave1.amp != 1) && (_slave2.amp != 1)>>on both of their trembling middle fingers.<<else>><<if _slave1.amp == 1>>on a cord around _slave1.slaveName's neck, since they lacks fingers to wear it on<<else>>on _slave1.slaveName's trembling finger<</if>>and another ring<<if _slave2.amp == 1>>on a cord around _slave2.slaveName's neck, since they lacks fingers to wear it on.<<else>>on _slave2.slaveName's trembling finger.<</if>><</if>>There is no ring for you, since this marriage does not bind you. + They return shortly, looking exhausted and depressed. They're naked still, their skin clean, and come reluctantly to stand by you for the ceremony, just wanting it to be over. The only evident signs that they've had sex with more than a hundred people today is their asses, which look rather well traveled, and their tiredness. They do their best to conceal their tiredness out of fear of punishment, and they lean against you for support despite their feelings on the wedding and you. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for them, and you place a simple steel ring<<if (_slave1.amp == 1 && _slave2.amp == 1)>>on a cord around both of their necks, since they lack fingers to wear it on.<<elseif (_slave1.amp != 1) && (_slave2.amp != 1)>>on both of their trembling middle fingers.<<else>><<if _slave1.amp == 1>>on a cord around _slave1.slaveName's neck, since they lacks fingers to wear it on<<else>>on _slave1.slaveName's trembling finger<</if>> and another ring <<if _slave2.amp == 1>>on a cord around _slave2.slaveName's neck, since they lacks fingers to wear it on.<<else>>on _slave2.slaveName's trembling finger.<</if>><</if>>There is no ring for you, since this marriage does not bind you. <br><br> /* TODO: marked for rewrite */ Once the ceremony is complete, you scoop up your new slave wives to carry them back into the master bedroom. They rest their head against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>>, simply too tired to care anymore. By the time they're home, they're fast asleep. You set them gently down on the bed and curl up behind them, feeling the animal warmth of their bodies as the exhausted slaves' chest rise and fall with their breathing. @@ -1483,7 +1436,7 @@ <br><br> They return shortly, looking exhausted. They're naked still, their skin clean, and come to stand by you for the ceremony. The only evident signs that they've had sex with more than a hundred people today is their asses, which look rather well traveled, and their tiredness. They do their best to conceal it, leaning against you despite the lack of love between you. /* TODO: double check the devotion requirements for this, rewrite as needed */ - <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for them, and you place a simple steel ring<<if (_slave1.amp == 1 && _slave2.amp == 1)>>on a cord around both of their necks, since they lack fingers to wear it on.<<elseif (_slave1.devotion >= -20 && _slave1.trust > 20) && (_slave2.devotion >= -20 && _slave2.trust > 20)>>on both of their middle fingers.<<elseif (_slave1.devotion < -20 && _slave1.trust <= 20) && (_slave1.devotion < -20 && _slave1.trust <= 20)>>on both of their trembling middle fingers.<<else>><<if _slave1.amp == 1>>on a cord around _slave1.slaveName's neck, since they lacks fingers to wear it on<<else>>on _slave1.slaveName's <<if _slave1.devotion < -20 && _slave1.trust <= 20>>trembling <</if>>finger<</if>>and another ring<<if _slave2.amp == 1>>on a cord around _slave2.slaveName's neck, since they lacks fingers to wear it on.<<else>>on _slave2.slaveName's <<if _slave2.devotion < -20 && _slave2.trust <= 20>>trembling <</if>>finger.<</if>><</if>>There is no ring for you, since this marriage does not bind you. + <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for them, and you place a simple steel ring<<if (_slave1.amp == 1 && _slave2.amp == 1)>>on a cord around both of their necks, since they lack fingers to wear it on.<<elseif (_slave1.devotion >= -20 && _slave1.trust > 20) && (_slave2.devotion >= -20 && _slave2.trust > 20)>>on both of their middle fingers.<<elseif (_slave1.devotion < -20 && _slave1.trust <= 20) && (_slave1.devotion < -20 && _slave1.trust <= 20)>>on both of their trembling middle fingers.<<else>><<if _slave1.amp == 1>>on a cord around _slave1.slaveName's neck, since they lacks fingers to wear it on<<else>>on _slave1.slaveName's <<if _slave1.devotion < -20 && _slave1.trust <= 20>>trembling <</if>>finger<</if>> and another ring <<if _slave2.amp == 1>>on a cord around _slave2.slaveName's neck, since they lacks fingers to wear it on.<<else>>on _slave2.slaveName's <<if _slave2.devotion < -20 && _slave2.trust <= 20>>trembling <</if>>finger.<</if>><</if>>There is no ring for you, since this marriage does not bind you. <br><br> /* TODO: marked for rewrite */ Once the ceremony is complete, you scoop up your new slave wives to carry them back into the master bedroom. They rest their head against you, so tired that they're grateful for the break from standing. By the time they're home, they're fast asleep. You set them gently down on the bed and curl up behind them, feeling the animal warmth of their bodies as the exhausted slaves' chest rise and fall with their breathing. @@ -1522,36 +1475,36 @@ Once the ceremony is complete, you scoop up your new slave wife to carry $him back into the master bedroom. $He rests $his head against you, so tired that $he's grateful for the break from standing. By the time $he's home, $he's fast asleep. You set $him gently down on the bed and curl up behind $him, feeling the animal warmth of $his body as the exhausted slave's chest rises and falls with $his breathing. <</if>> _slave2.slaveName, meanwhile, - <<if _slave1.fetish == "mindbroken">> - spent the day before resting and preparing _himself2, if you can call sitting around mindlessly preparing. _He2 spends most of the daylong party at the center of a nonstop gangbang, occasionally moaning as more of a physical reaction than anything. The theory is that $he'll be bound to you as your slave wife from this day onward, so $he must get the promiscuity that is a sex slave's responsibility out of the way now. Whatever their opinions on the idea, your guests take part with enthusiasm, completely unhampered by your slave's utter emptiness. Many brought their own slaves to participate, too. _slave1.slaveName spends hours with numerous cocks inside $him, with attending slaves using their mouths on any erogenous zones they can reach. When the moment of the ceremony nears, $he's extracted and taken off to be bathed. + <<if _slave2.fetish == "mindbroken">> + spent the day before resting and preparing _himself2, if you can call sitting around mindlessly preparing. _He2 spends most of the daylong party at the center of a nonstop gangbang, occasionally moaning as more of a physical reaction than anything. The theory is that _he2'll be bound to you as your slave wife from this day onward, so _he2 must get the promiscuity that is a sex slave's responsibility out of the way now. Whatever their opinions on the idea, your guests take part with enthusiasm, completely unhampered by your slave's utter emptiness. Many brought their own slaves to participate, too. _slave2.slaveName spends hours with numerous cocks inside _him2, with attending slaves using their mouths on any erogenous zones they can reach. When the moment of the ceremony nears, _he2's extracted and taken off to be bathed. <br><br> - _He2 returns shortly, looking exhausted but otherwise uncaring. _He2's naked still, $his skin clean and _slave1.skin, and is led to you for the ceremony by another slave. The only evident signs that $he's had sex with more than a hundred people today is $his ass, which looks rather well traveled, and $his tiredness. _He2 can't conceal $his tiredness, and leans against you subconsciously. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for $him, and you place a simple steel ring <<if _slave1.amp == 1>>on a cord around $his neck, since $he lacks fingers to wear it on<<else>>on $his finger<</if>>. There is no ring for you, since this marriage does not bind you. + _He2 returns shortly, looking exhausted but otherwise uncaring. _He2's naked still, _his2 skin clean and _slave2.skin, and is led to you for the ceremony by another slave. The only evident signs that _he2's had sex with more than a hundred people today is _his2 ass, which looks rather well traveled, and _his2 tiredness. _He2 can't conceal _his2 tiredness, and leans against you subconsciously. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for _him2, and you place a simple steel ring <<if _slave2.amp == 1>>on a cord around _his2 neck, since _he2 lacks fingers to wear it on<<else>>on _his2 finger<</if>>. There is no ring for you, since this marriage does not bind you. <br><br> - Once the ceremony is complete, you scoop up your new slave wife to carry $him back into the master bedroom. _He2 rests $his head against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>> as you cradle $him in your arms, and by the time $he's home, $he's fast asleep. You set $him gently down on the bed and curl up behind $him, feeling the animal warmth of $his body as the exhausted slave's chest rises and falls with $his breathing. - <<elseif _slave1.devotion+_slave1.trust >= 175>> - spent the day before resting and preparing _himself2, and this was a necessary precaution. _He2 spends most of the daylong party at the center of a nonstop gangbang. The theory is that $he'll be bound to you as your slave wife from this day onward, so $he must get the promiscuity that is a sex slave's responsibility out of the way now. Whatever their opinions on the idea, @@.green;your guests take part with enthusiasm,@@ many having brought their own slaves to participate, too. _slave1.slaveName spends hours with numerous cocks inside $him, with attending slaves using their mouths on any erogenous zones they can reach. When the moment of the ceremony nears, $he's extracted and taken off to be bathed. + Once the ceremony is complete, you scoop up your new slave wife to carry _him2 back into the master bedroom. _He2 rests _his2 head against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>> as you cradle _him2 in your arms, and by the time _he2's home, _he2's fast asleep. You set _him2 gently down on the bed and curl up behind _him2, feeling the animal warmth of _his2 body as the exhausted slave's chest rises and falls with _his2 breathing. + <<elseif _slave2.devotion+_slave2.trust >= 175>> + spent the day before resting and preparing _himself2, and this was a necessary precaution. _He2 spends most of the daylong party at the center of a nonstop gangbang. The theory is that _he2'll be bound to you as your slave wife from this day onward, so _he2 must get the promiscuity that is a sex slave's responsibility out of the way now. Whatever their opinions on the idea, @@.green;your guests take part with enthusiasm,@@ many having brought their own slaves to participate, too. _slave2.slaveName spends hours with numerous cocks inside _him2, with attending slaves using their mouths on any erogenous zones they can reach. When the moment of the ceremony nears, _he2's extracted and taken off to be bathed. <br><br> - _He2 returns shortly, looking exhausted but rather proud of _himself2 for getting through all that. _He2's naked still, $his skin clean and _slave1.skin, and comes confidently to stand by you for the ceremony. The only evident signs that $he's had sex with more than a hundred people today is $his ass, which looks rather well-traveled, and $his tiredness. _He2 does $his best to conceal how ready to sleep $he is, but $he leans against you a little. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for $him, and you place a simple steel ring <<if _slave1.amp == 1>>on a cord around $his neck, since $he lacks fingers to wear it on<<else>>on $his finger<</if>>. There is no ring for you, since this marriage does not bind you. + _He2 returns shortly, looking exhausted but rather proud of _himself2 for getting through all that. _He2's naked still, _his2 skin clean and _slave2.skin, and comes confidently to stand by you for the ceremony. The only evident signs that _he2's had sex with more than a hundred people today is _his2 ass, which looks rather well-traveled, and _his2 tiredness. _He2 does _his2 best to conceal how ready to sleep _he2 is, but _he2 leans against you a little. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for _him2, and you place a simple steel ring <<if _slave2.amp == 1>>on a cord around _his2 neck, since _he2 lacks fingers to wear it on<<else>>on _his2 finger<</if>>. There is no ring for you, since this marriage does not bind you. <br><br> - Once the ceremony is complete, you scoop up your new slave wife to carry $him back into the master bedroom. _He2 rests $his head against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>> as you cradle $him in your arms, and by the time $he's home, $he's fast asleep. You set $him gently down on the bed and curl up behind $him, feeling the animal warmth of $his body as the exhausted slave's chest rises and falls with $his breathing. - <<elseif _slave1.devotion < -20 && _slave1.trust > 20>> - spent the day before resting and trying to ready _himself2, and this was a necessary precaution. _He2 spends most of the daylong party at the center of a nonstop gangbang, screaming mixed cries of pleasure and horror. The theory is that $he'll be bound to you as your slave wife from this day onward, so $he must get the promiscuity that is a sex slave's responsibility out of the way now. Whatever their opinions on the idea, your guests take part with enthusiasm, completely unhampered by your slave's utter unwillingness. Many brought their own slaves to participate, too. _slave1.slaveName spends hours with numerous cocks inside $him, with attending slaves using their mouths on any erogenous zones they can reach. When the moment of the ceremony nears, $he's extracted and taken off to be bathed. + Once the ceremony is complete, you scoop up your new slave wife to carry _him2 back into the master bedroom. _He2 rests _his2 head against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>> as you cradle _him2 in your arms, and by the time _he2's home, _he2's fast asleep. You set _him2 gently down on the bed and curl up behind _him2, feeling the animal warmth of _his2 body as the exhausted slave's chest rises and falls with _his2 breathing. + <<elseif _slave2.devotion < -20 && _slave2.trust > 20>> + spent the day before resting and trying to ready _himself2, and this was a necessary precaution. _He2 spends most of the daylong party at the center of a nonstop gangbang, screaming mixed cries of pleasure and horror. The theory is that _he2'll be bound to you as your slave wife from this day onward, so _he2 must get the promiscuity that is a sex slave's responsibility out of the way now. Whatever their opinions on the idea, your guests take part with enthusiasm, completely unhampered by your slave's utter unwillingness. Many brought their own slaves to participate, too. _slave2.slaveName spends hours with numerous cocks inside _him2, with attending slaves using their mouths on any erogenous zones they can reach. When the moment of the ceremony nears, _he2's extracted and taken off to be bathed. <br><br> - _He2 returns shortly, looking exhausted and annoyed. _He2's naked still, $his skin clean and _slave1.skin, and comes reluctantly to stand by you for the ceremony, glaring at you the whole time. The only evident signs that $he's had sex with more than a hundred people today is $his ass, which looks rather well traveled, and $his tiredness. _He2 does $his best to conceal $his tiredness and look stronger than $he is, choosing to struggle to stand instead of leaning against you. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for $him, and you place a simple steel ring <<if _slave1.amp == 1>>on a cord around $his neck, since $he lacks fingers to wear it on<<else>>on $his finger<</if>>. There is no ring for you, since this marriage does not bind you. + _He2 returns shortly, looking exhausted and annoyed. _He2's naked still, _his2 skin clean and _slave2.skin, and comes reluctantly to stand by you for the ceremony, glaring at you the whole time. The only evident signs that _he2's had sex with more than a hundred people today is _his2 ass, which looks rather well traveled, and _his2 tiredness. _He2 does _his2 best to conceal _his2 tiredness and look stronger than _he2 is, choosing to struggle to stand instead of leaning against you. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for _him2, and you place a simple steel ring <<if _slave2.amp == 1>>on a cord around _his2 neck, since _he2 lacks fingers to wear it on<<else>>on _his2 finger<</if>>. There is no ring for you, since this marriage does not bind you. <br><br> - Once the ceremony is complete, you scoop up your new, protesting, slave wife to carry $him back into the master bedroom. _He2 rests $his head against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>>, simply too tired to care anymore. By the time $he's home, $he's fast asleep. You set $him gently down on the bed and curl up behind $him, feeling the animal warmth of $his body as the exhausted slave's chest rises and falls with $his breathing. _He2 squirms slightly in $his sleep to the unwelcome feeling of your arm around $him. - <<elseif _slave1.devotion < -20>> - spent the day before resting and crying to _himself2, and this was a necessary precaution. _He2 spends most of the daylong party at the center of a nonstop gangbang, screaming mixed cries of pleasure and horror. The theory is that $he'll be bound to you as your slave wife from this day onward, so $he must get the promiscuity that is a sex slave's responsibility out of the way now. Whatever their opinions on the idea, your guests take part with enthusiasm, completely unhampered by your slave's utter unwillingness. Many brought their own slaves to participate, too. _slave1.slaveName spends hours with numerous cocks inside $him, with attending slaves using their mouths on any erogenous zones they can reach. When the moment of the ceremony nears, $he's extracted and taken off to be bathed. + Once the ceremony is complete, you scoop up your new, protesting, slave wife to carry _him2 back into the master bedroom. _He2 rests _his2 head against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>>, simply too tired to care anymore. By the time _he2's home, _he2's fast asleep. You set _him2 gently down on the bed and curl up behind _him2, feeling the animal warmth of _his2 body as the exhausted slave's chest rises and falls with _his2 breathing. _He2 squirms slightly in _his2 sleep to the unwelcome feeling of your arm around _him2. + <<elseif _slave2.devotion < -20>> + spent the day before resting and crying to _himself2, and this was a necessary precaution. _He2 spends most of the daylong party at the center of a nonstop gangbang, screaming mixed cries of pleasure and horror. The theory is that _he2'll be bound to you as your slave wife from this day onward, so _he2 must get the promiscuity that is a sex slave's responsibility out of the way now. Whatever their opinions on the idea, your guests take part with enthusiasm, completely unhampered by your slave's utter unwillingness. Many brought their own slaves to participate, too. _slave2.slaveName spends hours with numerous cocks inside _him2, with attending slaves using their mouths on any erogenous zones they can reach. When the moment of the ceremony nears, _he2's extracted and taken off to be bathed. <br><br> - _He2 returns shortly, looking exhausted and depressed. _He2's naked still, $his skin clean and _slave1.skin, and comes reluctantly to stand by you for the ceremony, just wanting it to be over. The only evident signs that $he's had sex with more than a hundred people today is $his ass, which looks rather well traveled, and $his tiredness. _He2 does $his best to conceal $his tiredness out of fear of punishment, and $he leans against you for support despite $his feelings on the wedding and you. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for $him, and you place a simple steel ring <<if _slave1.amp == 1>>on a cord around $his neck, since $he lacks fingers to wear it on<<else>>on $his finger<</if>>. There is no ring for you, since this marriage does not bind you. + _He2 returns shortly, looking exhausted and depressed. _He2's naked still, _his2 skin clean and _slave2.skin, and comes reluctantly to stand by you for the ceremony, just wanting it to be over. The only evident signs that _he2's had sex with more than a hundred people today is _his2 ass, which looks rather well traveled, and _his2 tiredness. _He2 does _his2 best to conceal _his2 tiredness out of fear of punishment, and _he2 leans against you for support despite _his2 feelings on the wedding and you. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for _him2, and you place a simple steel ring <<if _slave2.amp == 1>>on a cord around _his2 neck, since _he2 lacks fingers to wear it on<<else>>on _his2 finger<</if>>. There is no ring for you, since this marriage does not bind you. <br><br> - Once the ceremony is complete, you scoop up your new slave wife to carry $him back into the master bedroom. _He2 rests $his head against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>>, simply too tired to care anymore. By the time $he's home, $he's fast asleep. You set $him gently down on the bed and curl up behind $him, feeling the animal warmth of $his body as the exhausted slave's chest rises and falls with $his breathing. + Once the ceremony is complete, you scoop up your new slave wife to carry _him2 back into the master bedroom. _He2 rests _his2 head against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>>, simply too tired to care anymore. By the time _he2's home, _he2's fast asleep. You set _him2 gently down on the bed and curl up behind _him2, feeling the animal warmth of _his2 body as the exhausted slave's chest rises and falls with _his2 breathing. <<else>> - spent the day before resting and reluctantly preparing _himself2, and this was a necessary precaution. _He2 spends most of the daylong party at the center of a nonstop gangbang, moaning and wincing as $he takes cock after cock. The theory is that $he'll be bound to you as your slave wife from this day onward, so $he must get the promiscuity that is a sex slave's responsibility out of the way now. Whatever their opinions on the idea, your guests take part with enthusiasm, completely unhampered by your slave's lack of passion. Many brought their own slaves to participate, too. _slave1.slaveName spends hours with numerous cocks inside $him, with attending slaves using their mouths on any erogenous zones they can reach. When the moment of the ceremony nears, $he's extracted and taken off to be bathed. + spent the day before resting and reluctantly preparing _himself2, and this was a necessary precaution. _He2 spends most of the daylong party at the center of a nonstop gangbang, moaning and wincing as _he2 takes cock after cock. The theory is that _he2'll be bound to you as your slave wife from this day onward, so _he2 must get the promiscuity that is a sex slave's responsibility out of the way now. Whatever their opinions on the idea, your guests take part with enthusiasm, completely unhampered by your slave's lack of passion. Many brought their own slaves to participate, too. _slave2.slaveName spends hours with numerous cocks inside _him2, with attending slaves using their mouths on any erogenous zones they can reach. When the moment of the ceremony nears, _he2's extracted and taken off to be bathed. <br><br> - _He2 returns shortly, looking exhausted. _He2's naked still, $his skin clean and _slave1.skin, and comes to stand by you for the ceremony. The only evident signs that $he's had sex with more than a hundred people today is $his ass, which looks rather well traveled, and $his tiredness. _He2 does $his best to conceal it, leaning against you despite the lack of love between you. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for $him, and you place a simple steel ring <<if _slave1.amp == 1>>on a cord around $his neck, since $he lacks fingers to wear it on<<else>>on $his finger<</if>>. There is no ring for you, since this marriage does not bind you. + _He2 returns shortly, looking exhausted. _He2's naked still, _his2 skin clean and _slave2.skin, and comes to stand by you for the ceremony. The only evident signs that _he2's had sex with more than a hundred people today is _his2 ass, which looks rather well traveled, and _his2 tiredness. _He2 does _his2 best to conceal it, leaning against you despite the lack of love between you. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for _him2, and you place a simple steel ring <<if _slave2.amp == 1>>on a cord around _his2 neck, since _he2 lacks fingers to wear it on<<else>>on _his2 finger<</if>>. There is no ring for you, since this marriage does not bind you. <br><br> - Once the ceremony is complete, you scoop up your new slave wife to carry $him back into the master bedroom. _He2 rests $his head against you, so tired that $he's grateful for the break from standing. By the time $he's home, $he's fast asleep. You set $him gently down on the bed and curl up behind $him, feeling the animal warmth of $his body as the exhausted slave's chest rises and falls with $his breathing. + Once the ceremony is complete, you scoop up your new slave wife to carry _him2 back into the master bedroom. _He2 rests _his2 head against you, so tired that _he2's grateful for the break from standing. By the time _he2's home, _he2's fast asleep. You set _him2 gently down on the bed and curl up behind _him2, feeling the animal warmth of _his2 body as the exhausted slave's chest rises and falls with _his2 breathing. <</if>> <</if>> <br> @@ -1646,11 +1599,11 @@ <</if>> <<if _slave2.anus < 3>> <<set _slave2.anus += 1>> - You can feel $his ass, still somewhat gaped from its ordeal. It's been @@.lime;loosened@@ by $his wedding party. + You can feel _his2 ass, still somewhat gaped from its ordeal. It's been @@.lime;loosened@@ by _his2 wedding party. <</if>> <</if>> - <<if (_slave1.relationship != 0) && (_slave2.relationship != 0)>> + <<if (_slave1.relationship != 0) || (_slave2.relationship != 0)>> <<if _slave1.relationshipTarget == _slave2.ID>> /* TODO: not sure about these */ <<if ((_slave1.devotion+_slave1.trust >= 175) && (_slave2.devotion+_slave2.trust >= 175)) || ((_slave1.devotion < -20 && _slave1.trust > 20) && (_slave2.devotion < -20 && _slave2.trust > 20)) || ((_slave1.devotion < -20) && (_slave2.devotion < -20)) || ((_slave1.devotion >= -20 && _slave2.devotion >= -20))>> @@ -1693,7 +1646,7 @@ <<if _slave1.relationship != 0>> <<if _slave1.devotion+_slave1.trust >= 175>> <<if _slave1.relationship > 0>> - $His <<if _slave1.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his2 <<if _slave1.relationship > 2>>ex<<else>>companion<</if>>'s future. + _slave1.slaveName's <<if _slave1.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his3 <<if _slave1.relationship > 2>>ex<<else>>companion<</if>>'s future. <<if _slave1.relationship == 4>> <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> <<elseif _slave1.relationship == 3>> @@ -1704,197 +1657,90 @@ <</if>> <<elseif _slave1.devotion < -20>> <<if _slave1.relationship == -1>> - $He @@.mediumorchid;hates@@ that $he has to be yours only and @@.gold;fears@@ what will happen if $he strays. + _slave1.slaveName @@.mediumorchid;hates@@ that $he has to be yours only and @@.gold;fears@@ what will happen if $he strays. <<set _slave1.devotion -= 40, _slave1.trust -= 40>> <<elseif _slave1.relationship == 4>> - Both $him and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;furious@@ to watch _his2 life's love get stolen away and fucked pregnant in such a manner. + Both _slave1.slaveName and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;furious@@ to watch _his3 life's love get stolen away and fucked pregnant in such a manner. <<set $slaves[_m].devotion -= 60, $slaves[_m].trust -= 40>> <<set _slave1.devotion -= 40, _slave1.trust -= 40>> <<elseif _slave1.relationship == 3>> - Both $him and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his2 life's love get stolen away and fucked pregnant in such a manner. + Both _slave1.slaveName and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his3 life's love get stolen away and fucked pregnant in such a manner. <<set $slaves[_m].devotion -= 30, $slaves[_m].trust -= 30>> <<set _slave1.devotion -= 50, _slave1.trust -= 30>> <<elseif _slave1.relationship > 0>> - Both $him and $his friend @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. + Both _slave1.slaveName and $his friend @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> <<set _slave1.devotion -= 20, _slave1.trust -= 20>> <</if>> <<else>> <<if _slave1.relationship == -1>> - $He @@.mediumorchid;dislikes@@ that $he has to be yours only and @@.gold;worries@@ what will happen if $he strays. + _slave1.slaveName @@.mediumorchid;dislikes@@ that $he has to be yours only and @@.gold;worries@@ what will happen if $he strays. <<set _slave1.devotion -= 10, _slave1.trust -= 10>> <<elseif _slave1.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his2 life's love get stolen away and fucked pregnant in such a manner. + Both _slave1.slaveName and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his3 life's love get stolen away and fucked pregnant in such a manner. <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> <<set _slave1.devotion -= 30, _slave1.trust -= 20>> <<elseif _slave1.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is a little @@.mediumorchid;jealous@@ of you for snagging such catch out from under _him2. + Both _slave1.slaveName and $his ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is a little @@.mediumorchid;jealous@@ of you for snagging such catch out from under _him3. <<set $slaves[_m].devotion -= 10, $slaves[_m].trust -= 10>> <<set _slave1.devotion -= 15, _slave1.trust -= 10>> <<elseif _slave1.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. + Both _slave1.slaveName and $his friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> <<set _slave1.devotion -= 5, _slave1.trust -= 5>> <</if>> <</if>> - <<elseif _slave2.relationship != 0>> - <<if _slave1.devotion+_slave1.trust >= 175>> - <<if _slave1.relationship > 0>> - $His <<if _slave1.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his2 <<if _slave1.relationship > 2>>ex<<else>>companion<</if>>'s future. - <<if _slave1.relationship == 4>> - <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> - <<elseif _slave1.relationship == 3>> - <<set $slaves[_m].devotion -= 3, $slaves[_m].trust -= 3>> + <</if>> + <<if _slave2.relationship != 0>> + <<if _slave2.devotion+_slave1.trust >= 175>> + <<if _slave2.relationship > 0>> + _slave2.slaveName's <<if _slave2.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his4 <<if _slave2.relationship > 2>>ex<<else>>companion<</if>>'s future. + <<if _slave2.relationship == 4>> + <<set $slaves[_n].devotion -= 5, $slaves[_n].trust -= 5>> + <<elseif _slave2.relationship == 3>> + <<set $slaves[_n].devotion -= 3, $slaves[_n].trust -= 3>> <<else>> - <<set $slaves[_m].devotion -= 1, $slaves[_m].trust -= 1>> + <<set $slaves[_n].devotion -= 1, $slaves[_n].trust -= 1>> <</if>> <</if>> - <<elseif _slave1.devotion < -20>> - <<if _slave1.relationship == -1>> - $He @@.mediumorchid;hates@@ that $he has to be yours only and @@.gold;fears@@ what will happen if $he strays. - <<set _slave1.devotion -= 40, _slave1.trust -= 40>> - <<elseif _slave1.relationship == 4>> - Both $him and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;furious@@ to watch _his2 life's love get stolen away and fucked pregnant in such a manner. - <<set $slaves[_m].devotion -= 60, $slaves[_m].trust -= 40>> - <<set _slave1.devotion -= 40, _slave1.trust -= 40>> - <<elseif _slave1.relationship == 3>> - Both $him and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his2 life's love get stolen away and fucked pregnant in such a manner. - <<set $slaves[_m].devotion -= 30, $slaves[_m].trust -= 30>> - <<set _slave1.devotion -= 50, _slave1.trust -= 30>> - <<elseif _slave1.relationship > 0>> - Both $him and $his friend @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. - <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave1.devotion -= 20, _slave1.trust -= 20>> + <<elseif _slave2.devotion < -20>> + <<if _slave2.relationship == -1>> + _slave2.slaveName @@.mediumorchid;hates@@ that _he2 has to be yours only and @@.gold;fears@@ what will happen if _he2 strays. + <<set _slave2.devotion -= 40, _slave2.trust -= 40>> + <<elseif _slave2.relationship == 4>> + Both _slave2.slaveName and _his2 ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_n].slaveName is especially @@.mediumorchid;furious@@ to watch _his4 life's love get stolen away and fucked pregnant in such a manner. + <<set $slaves[_n].devotion -= 60, $slaves[_n].trust -= 40>> + <<set _slave2.devotion -= 40, _slave2.trust -= 40>> + <<elseif _slave2.relationship == 3>> + Both _slave2.slaveName and _his2 ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_n].slaveName is especially @@.mediumorchid;hurt@@ after watching _his4 life's love get stolen away and fucked pregnant in such a manner. + <<set $slaves[_n].devotion -= 30, $slaves[_n].trust -= 30>> + <<set _slave2.devotion -= 50, _slave2.trust -= 30>> + <<elseif _slave2.relationship > 0>> + Both _slave2.slaveName and _his2 friend @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. + <<set $slaves[_n].devotion -= 20, $slaves[_n].trust -= 20>> + <<set _slave2.devotion -= 20, _slave2.trust -= 20>> <</if>> <<else>> - <<if _slave1.relationship == -1>> - $He @@.mediumorchid;dislikes@@ that $he has to be yours only and @@.gold;worries@@ what will happen if $he strays. - <<set _slave1.devotion -= 10, _slave1.trust -= 10>> - <<elseif _slave1.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his2 life's love get stolen away and fucked pregnant in such a manner. - <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave1.devotion -= 30, _slave1.trust -= 20>> - <<elseif _slave1.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is a little @@.mediumorchid;jealous@@ of you for snagging such catch out from under _him2. - <<set $slaves[_m].devotion -= 10, $slaves[_m].trust -= 10>> - <<set _slave1.devotion -= 15, _slave1.trust -= 10>> - <<elseif _slave1.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. - <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> - <<set _slave1.devotion -= 5, _slave1.trust -= 5>> - <</if>> - <</if>> - <<else>> - @@.red;Error! DCoded doesn't know to code. Please report this.@@ - <</if>> - <</if>> - <<else>> - <<if _slave1.relationship != 0>> - <<if _slave1.devotion+_slave1.trust >= 175>> - <<if _slave1.relationship > 0>> - $His <<if _slave1.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his2 <<if _slave1.relationship > 2>>love<<else>>companion<</if>>'s future. - <<if _slave1.relationship == 4>> - <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> - <<elseif _slave1.relationship == 3>> - <<set $slaves[_m].devotion -= 3, $slaves[_m].trust -= 3>> - <<else>> - <<set $slaves[_m].devotion -= 1, $slaves[_m].trust -= 1>> + <<if _slave2.relationship == -1>> + _slave2.slaveName @@.mediumorchid;dislikes@@ that _he2 has to be yours only and @@.gold;worries@@ what will happen if _he2 strays. + <<set _slave2.devotion -= 10, _slave2.trust -= 10>> + <<elseif _slave2.relationship == 4>> + Both _slave2.slaveName and _his2 ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_n].slaveName is especially @@.mediumorchid;hurt@@ after watching _his4 life's love get stolen away and fucked pregnant in such a manner. + <<set $slaves[_n].devotion -= 20, $slaves[_n].trust -= 20>> + <<set _slave2.devotion -= 30, _slave2.trust -= 20>> + <<elseif _slave2.relationship == 3>> + Both _slave2.slaveName and _his2 ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_n].slaveName is a little @@.mediumorchid;jealous@@ of you for snagging such catch out from under _him4. + <<set $slaves[_n].devotion -= 10, $slaves[_n].trust -= 10>> + <<set _slave2.devotion -= 15, _slave2.trust -= 10>> + <<elseif _slave2.relationship > 0>> + Both _slave2.slaveName and _his2 friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. + <<set $slaves[_n].devotion -= 5, $slaves[_n].trust -= 5>> + <<set _slave2.devotion -= 5, _slave2.trust -= 5>> <</if>> - <<elseif _slave1.relationship == -2>> - $He feels like $he betrayed you by getting fucked by so many others and struggles to convince $himself it was what you wanted. - <<elseif _slave1.relationship == -1>> - Judging by the smile on $his sleeping face, today may have been the @@.hotpink;best day of $his life.@@ - <<set _slave1.devotion = 100, _slave1.trust = 100>> - <</if>> - <<elseif _slave1.devotion < -20>> - <<if _slave1.relationship == -1>> - $He @@.mediumorchid;hates@@ that $he has to be yours only after such a thrilling orgy and @@.gold;fears@@ what will happen if $he strays. - <<set _slave1.devotion -= 40, _slave1.trust -= 40>> - <<elseif _slave1.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;furious@@ to watch _his2 life's love get stolen away and fucked by so many others. - <<set $slaves[_m].devotion -= 60, $slaves[_m].trust -= 40>> - <<set _slave1.devotion -= 40, _slave1.trust -= 40>> - <<elseif _slave1.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his2 life's love get stolen away and fucked by so many others. - <<set $slaves[_m].devotion -= 30, $slaves[_m].trust -= 30>> - <<set _slave1.devotion -= 50, _slave1.trust -= 30>> - <<elseif _slave1.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. - <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave1.devotion -= 20, _slave1.trust -= 20>> - <</if>> - <<else>> - <<if _slave1.relationship == -1>> - $He @@.mediumorchid;dislikes@@ that $he has to be yours only and @@.gold;worries@@ what will happen if $he strays, especially after such a lovely orgy. - <<set _slave1.devotion -= 10, _slave1.trust -= 10>> - <<elseif _slave1.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his2 life's love get stolen away and fucked by so many others. - <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave1.devotion -= 30, _slave1.trust -= 20>> - <<elseif _slave1.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is a little @@.mediumorchid;resentful@@ that you'd treat such a catch that way. - <<set $slaves[_m].devotion -= 10, $slaves[_m].trust -= 10>> - <<set _slave1.devotion -= 15, _slave1.trust -= 10>> - <<elseif _slave1.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. - <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> - <<set _slave1.devotion -= 5, _slave1.trust -= 5>> <</if>> <</if>> - <<else>> - <<if _slave1.devotion+_slave1.trust >= 175>> - <<if _slave1.relationship > 0>> - $His <<if _slave1.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his2 <<if _slave1.relationship > 2>>love<<else>>companion<</if>>'s future. - <<if _slave1.relationship == 4>> - <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> - <<elseif _slave1.relationship == 3>> - <<set $slaves[_m].devotion -= 3, $slaves[_m].trust -= 3>> - <<else>> - <<set $slaves[_m].devotion -= 1, $slaves[_m].trust -= 1>> - <</if>> - <<elseif _slave1.relationship == -2>> - $He feels like $he betrayed you by getting fucked by so many others and struggles to convince $himself it was what you wanted. - <<elseif _slave1.relationship == -1>> - Judging by the smile on $his sleeping face, today may have been the @@.hotpink;best day of $his life.@@ - <<set _slave1.devotion = 100, _slave1.trust = 100>> - <</if>> - <<elseif _slave1.devotion < -20>> - <<if _slave1.relationship == -1>> - $He @@.mediumorchid;hates@@ that $he has to be yours only after such a thrilling orgy and @@.gold;fears@@ what will happen if $he strays. - <<set _slave1.devotion -= 40, _slave1.trust -= 40>> - <<elseif _slave1.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;furious@@ to watch _his2 life's love get stolen away and fucked by so many others. - <<set $slaves[_m].devotion -= 60, $slaves[_m].trust -= 40>> - <<set _slave1.devotion -= 40, _slave1.trust -= 40>> - <<elseif _slave1.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his2 life's love get stolen away and fucked by so many others. - <<set $slaves[_m].devotion -= 30, $slaves[_m].trust -= 30>> - <<set _slave1.devotion -= 50, _slave1.trust -= 30>> - <<elseif _slave1.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. - <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave1.devotion -= 20, _slave1.trust -= 20>> - <</if>> - <<else>> - <<if _slave1.relationship == -1>> - $He @@.mediumorchid;dislikes@@ that $he has to be yours only and @@.gold;worries@@ what will happen if $he strays, especially after such a lovely orgy. - <<set _slave1.devotion -= 10, _slave1.trust -= 10>> - <<elseif _slave1.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his2 life's love get stolen away and fucked by so many others. - <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave1.devotion -= 30, _slave1.trust -= 20>> - <<elseif _slave1.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is a little @@.mediumorchid;resentful@@ that you'd treat such a catch that way. - <<set $slaves[_m].devotion -= 10, $slaves[_m].trust -= 10>> - <<set _slave1.devotion -= 15, _slave1.trust -= 10>> - <<elseif _slave1.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. - <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> - <<set _slave1.devotion -= 5, _slave1.trust -= 5>> - <</if>> <</if>> <</if>> - <</if>> <<set _slave1.relationship = -3>> <<set _slave1.counter.oral += 50>> @@ -1906,7 +1752,6 @@ <<= knockMeUp(_slave1, 20, 2, -2)>> <</if>> <<run repX(2500, "event", _slave1)>> - <<run repX(2500, "event", _slave2)>> <<if _slave1.fetish == "mindbroken">> <<set $desc = "a framed shot of the broken " + _slave1.slaveName + " getting gangbanged at your wedding">> <<elseif _slave1.devotion+_slave1.trust >= 175>> @@ -1929,7 +1774,6 @@ <<if canGetPregnant(_slave2) && _slave2.eggType == "human">> <<= knockMeUp(_slave2, 20, 2, -2)>> <</if>> - <<run repX(2500, "event", _slave1)>> <<run repX(2500, "event", _slave2)>> <<if _slave2.fetish == "mindbroken">> <<set $desc = "a framed shot of the broken " + _slave2.slaveName + " getting gangbanged at your wedding">> @@ -2144,7 +1988,7 @@ <</if>> <<else>> <<if _slave1.clit > 1>> - _slave1.slaveName's huge clit is quite hard, making $his shift uncomfortably as $his lacy g-string stimulates it, + _slave1.slaveName's huge clit is quite hard, making $him shift uncomfortably as $his lacy g-string stimulates it, <<else>> _slave1.slaveName's lacy g-string covers $his womanhood demurely, <</if>> @@ -2154,25 +1998,25 @@ _slave2.slaveName' slave dick is hidden by its chastity cage. <<elseif canAchieveErection(_slave2)>> <<if (_slave2.dick > 4) && (_slave2.belly >= 5000)>> - _slave2.slaveName's hugely erect, with $his lacy g-string only serving to hold $his dick agonizingly pressed against the bottom of $his _belly2 <<if _slave2.bellyPreg >= 3000>>pregnant <</if>>belly. + _slave2.slaveName's hugely erect, with _his2 lacy g-string only serving to hold _his2 dick agonizingly pressed against the bottom of _his2 _belly2 <<if _slave2.bellyPreg >= 3000>>pregnant <</if>>belly. <<elseif _slave2.dick > 4>> - _slave2.slaveName's hugely erect, with $his lacy g-string only serving to hold $his dick upright along $his belly. + _slave2.slaveName's hugely erect, with _his2 lacy g-string only serving to hold _his2 dick upright along _his2 belly. <<else>> - _slave2.slaveName' erection tents the front of $his lacy g-string. + _slave2.slaveName' erection tents the front of _his2 lacy g-string. <</if>> <<elseif (_slave2.dick > 0)>> <<if _slave2.dick > 10>> _slave2.slaveName' huge soft cock is allowed to dangle freely as no g-string could hope to contain it. <<elseif _slave2.dick > 4>> - _slave2.slaveName' big soft cock forms a lewd mass, stuffed into $his lacy g-string. + _slave2.slaveName' big soft cock forms a lewd mass, stuffed into _his2 lacy g-string. <<else>> - _slave2.slaveName' lacy g-string perfectly conceals $his soft dick. + _slave2.slaveName' lacy g-string perfectly conceals _his2 soft dick. <</if>> <<else>> <<if _slave2.clit > 1>> - _slave2.slaveName' huge clit is quite hard, making $his shift uncomfortably as $his lacy g-string stimulates it. + _slave2.slaveName' huge clit is quite hard, making _him2 shift uncomfortably as _his2 lacy g-string stimulates it. <<else>> - _slave2.slaveName' lacy g-string covers $his womanhood demurely. + _slave2.slaveName' lacy g-string covers _his2 womanhood demurely. <</if>> <</if>> <</if>> @@ -2207,18 +2051,18 @@ <<if _slave2.fetish == "mindbroken">> has to be pushed into walking towards you. <<elseif _slave2.devotion+_slave2.trust >= 175>> - does this of $his own choice, and $he does so with a smile. + does this of _his2 own choice, and _he2 does so with a smile. <<elseif _slave2.devotion < -20 && _slave2.trust > 20>> - does this of $his own choice, and $he does so with hesitation. + does this of _his2 own choice, and _he2 does so with hesitation. <<elseif _slave2.devotion < -20>> - does this of $his own (forced) choice, and $he does so with wavering steps. + does this of _his2 own (forced) choice, and _he2 does so with wavering steps. <<else>> - does this of $his own choice, and $he does so willingly. + does this of _his2 own choice, and _he2 does so willingly. <</if>> <</if>> <br><br> /* good luck trying to read this line */ - When they are in front of you, <<if (_slave1.amp == 1) && (_slave2.amp == 1)>>the slaves carrying their limbless torsos sets them down on the floor in front of you and props them up so their heads are level with your crotch<<else>>they gets down on their knees so their heads are level with your crotch<</if>>. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for them, and you place a simple steel ring <<if (_slave1.amp == 1 && _slave2.amp == 1)>>on a cord around both of their necks, since they lack fingers to wear it on.<<elseif (_slave1.devotion >= -20 && _slave1.trust > 20) && (_slave2.devotion >= -20 && _slave2.trust > 20)>>on both of their middle fingers.<<elseif (_slave1.devotion < -20 && _slave1.trust <= 20) && (_slave1.devotion < -20 && _slave1.trust <= 20)>>on both of their trembling middle fingers.<<else>><<if _slave1.amp == 1>>on a cord around _slave1.slaveName's neck, since $he lacks fingers to wear it on<<else>>on _slave1.slaveName's <<if _slave1.devotion < -20 && _slave1.trust <= 20>>trembling <</if>>finger<</if>>and another ring<<if _slave2.amp == 1>>on a cord around _slave2.slaveName's neck, since $he lacks fingers to wear it on.<<else>>on _slave2.slaveName's <<if _slave2.devotion < -20 && _slave2.trust <= 20>>trembling <</if>>finger.<</if>><</if>> There is no ring for you, since this marriage does not bind you. + When they are in front of you, <<if (_slave1.amp == 1) && (_slave2.amp == 1)>>the slaves carrying their limbless torsos sets them down on the floor in front of you and props them up so their heads are level with your crotch<<else>>they gets down on their knees so their heads are level with your crotch<</if>>. <<if $assistantName == "your personal assistant">>Your personal assistant<<else>>$assistantName<</if>> reads the short recitation for them, and you place a simple steel ring <<if (_slave1.amp == 1 && _slave2.amp == 1)>>on a cord around both of their necks, since they lack fingers to wear it on.<<elseif (_slave1.devotion >= -20 && _slave1.trust > 20) && (_slave2.devotion >= -20 && _slave2.trust > 20)>>on both of their middle fingers.<<elseif (_slave1.devotion < -20 && _slave1.trust <= 20) && (_slave1.devotion < -20 && _slave1.trust <= 20)>>on both of their trembling middle fingers.<<else>><<if _slave1.amp == 1>>on a cord around _slave1.slaveName's neck, since $he lacks fingers to wear it on<<else>>on _slave1.slaveName's <<if _slave1.devotion < -20 && _slave1.trust <= 20>>trembling <</if>>finger<</if>> and another ring <<if _slave2.amp == 1>>on a cord around _slave2.slaveName's neck, since $he lacks fingers to wear it on.<<else>>on _slave2.slaveName's <<if _slave2.devotion < -20 && _slave2.trust <= 20>>trembling <</if>>finger.<</if>><</if>> There is no ring for you, since this marriage does not bind you. <br> <<if $PC.surname && (_slave1.slaveSurname != $PC.surname && _slave2.surname != $PC.surname)>> <br><br><span id="surnaming"> @@ -2263,11 +2107,11 @@ <<if _slave1.fetish == "mindbroken">> <<if _c < 1>>_slave1.slaveName <</if>>shows no reaction. Like many things, names mean nothing to $him now. Your guests, on the other hand, appreciate the gift. <<elseif _slave1.devotion+_slave1.trust >= 175>> - <<if _c < 1>>_slave1.slaveName <</if>>breaks down again.; it's like a dream come true. + <<if _c < 1>>_slave1.slaveName <</if>>breaks down again; it's like a dream come true. <<elseif _slave1.devotion < -20 && _slave1.trust > 20>> - <<if _c < 1>>_slave1.slaveName <</if>>scoffs audibly.; just another burden for $him to carry. + <<if _c < 1>>_slave1.slaveName <</if>>scoffs audibly; just another burden for $him to carry. <<elseif _slave1.devotion < -20>> - <<if _c < 1>>_slave1.slaveName <</if>>breaks down again.; this is nothing more than another unwanted link to you. + <<if _c < 1>>_slave1.slaveName <</if>>breaks down again; this is nothing more than another unwanted link to you. <<else>> <<if _c < 1>>_slave1.slaveName <</if>>nods acceptingly. Your will is $his will, after all. <</if>> @@ -2322,20 +2166,20 @@ with a will. $He approaches $his task <<if (_slave1.fetish == "cumslut")>>enthusiastically<<else>>obediently<</if>>, and you climax promptly, <<if $PC.dick == 1>>shooting your cum down $his throat<<else>>covering $his face in girlcum<</if>>. Your guests and their attendant slaves @@.green;applaud at the consummation,@@ or rather, the first stage of the consummation. The balance will take place privately, however, and you scoop up your new slave wife to carry $him back into the master bedroom. $He looks up at you, $his eyes unsure. <</if>> Next, it's _slave2.slaveName's turn. _He2 takes on _his2 task - <<if _slave1.fetish == "mindbroken">> - with robotic obedience. You climax promptly, <<if $PC.dick == 1>>shooting your cum down $his throat<<else>>covering $his face in girlcum<</if>>. Your guests and their attendant slaves @@.green;applaud at the consummation,@@ or rather, the first stage of the consummation. The balance will take place privately, however, and you scoop up your new slave wife to carry $him back into the master bedroom. $He absentmindedly rests $his head against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>> as you cradle $him in your arms, gazing up at you with empty eyes. - <<elseif _slave1.devotion+_slave1.trust >= 175>> - <<if (_slave1.fetish == "cumslut")>>enthusiastically<<else>>with a will<</if>>, and you climax promptly, <<if $PC.dick == 1>>shooting your cum down $his throat<<else>>covering $his face in girlcum<</if>>. Your guests and their attendant slaves @@.green;applaud at the consummation,@@ or rather, at the first stage of the consummation. The balance will take place privately, however, and you scoop up your new slave wife to carry $him back into the master bedroom. $He rests $his head against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>> as you cradle $him in your arms, staring up at you. - <<elseif _slave1.devotion < -20 && _slave1.trust > 20>> - with apprehension, so much so that things are taking too long, so you grab $his head and facefuck $him instead. $He gags and sputters, tears running down $his cheeks, as you violate $his mouth publicly. You climax promptly, <<if $PC.dick == 1>>shooting your cum down $his throat<<else>>covering $his face in girlcum<</if>>. Your guests and their attendant slaves @@.green;applaud at the consummation,@@ or rather, the first stage of the consummation. The balance will take place privately, however, and you scoop up your new slave wife to carry $him back into the master bedroom. $He looks up at you with fearful, hate-filled eyes, blaming you for everything that has happened so far. - <<elseif _slave1.devotion < -20>> - with apprehension, so much so that things are taking too long, so you grab $his head and facefuck $him instead. $He gags and sputters, tears running down $his cheeks, as you violate $his mouth publicly. You climax promptly, <<if $PC.dick == 1>>shooting your cum down $his throat<<else>>covering $his face in girlcum<</if>>. Your guests and their attendant slaves @@.green;applaud at the consummation,@@ or rather, the first stage of the consummation. The balance will take place privately, however, and you scoop up your new slave wife to carry $him back into the master bedroom. $He looks up at you with fearful, tear-filled eyes as if pleading for you not to do this. + <<if _slave2.fetish == "mindbroken">> + with robotic obedience. You climax promptly, <<if $PC.dick == 1>>shooting your cum down _his2 throat<<else>>covering _his2 face in girlcum<</if>>. Your guests and their attendant slaves @@.green;applaud at the consummation,@@ or rather, the first stage of the consummation. The balance will take place privately, however, and you scoop up your new slave wife to carry _him2 back into the master bedroom. _He2 absentmindedly rests _his2 head against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>> as you cradle _him2 in your arms, gazing up at you with empty eyes. + <<elseif _slave2.devotion+_slave2.trust >= 175>> + <<if (_slave2.fetish == "cumslut")>>enthusiastically<<else>>with a will<</if>>, and you climax promptly, <<if $PC.dick == 1>>shooting your cum down _his2 throat<<else>>covering _his2 face in girlcum<</if>>. Your guests and their attendant slaves @@.green;applaud at the consummation,@@ or rather, at the first stage of the consummation. The balance will take place privately, however, and you scoop up your new slave wife to carry _him2 back into the master bedroom. _He2 rests _his2 head against your <<if $PC.boobs == 1>>breasts<<elseif $PC.title == 0>>flat chest<<else>>strong chest<</if>> as you cradle _him2 in your arms, staring up at you. + <<elseif _slave2.devotion < -20 && _slave2.trust > 20>> + with apprehension, so much so that things are taking too long, so you grab _his2 head and facefuck _him2 instead. _He2 gags and sputters, tears running down _his2 cheeks, as you violate _his2 mouth publicly. You climax promptly, <<if $PC.dick == 1>>shooting your cum down _his2 throat<<else>>covering _his2 face in girlcum<</if>>. Your guests and their attendant slaves @@.green;applaud at the consummation,@@ or rather, the first stage of the consummation. The balance will take place privately, however, and you scoop up your new slave wife to carry _him2 back into the master bedroom. _He2 looks up at you with fearful, hate-filled eyes, blaming you for everything that has happened so far. + <<elseif _slave2.devotion < -20>> + with apprehension, so much so that things are taking too long, so you grab _his2 head and facefuck _him2 instead. _He2 gags and sputters, tears running down _his2 cheeks, as you violate _his2 mouth publicly. You climax promptly, <<if $PC.dick == 1>>shooting your cum down _his2 throat<<else>>covering _his2 face in girlcum<</if>>. Your guests and their attendant slaves @@.green;applaud at the consummation,@@ or rather, the first stage of the consummation. The balance will take place privately, however, and you scoop up your new slave wife to carry _him2 back into the master bedroom. _He2 looks up at you with fearful, tear-filled eyes as if pleading for you not to do this. <<else>> - with a will. $He approaches $his task <<if (_slave1.fetish == "cumslut")>>enthusiastically<<else>>obediently<</if>>, and you climax promptly, <<if $PC.dick == 1>>shooting your cum down $his throat<<else>>covering $his face in girlcum<</if>>. Your guests and their attendant slaves @@.green;applaud at the consummation,@@ or rather, the first stage of the consummation. The balance will take place privately, however, and you scoop up your new slave wife to carry $him back into the master bedroom. $He looks up at you, $his eyes unsure. + with a will. _He2 approaches _his2 task <<if (_slave2.fetish == "cumslut")>>enthusiastically<<else>>obediently<</if>>, and you climax promptly, <<if $PC.dick == 1>>shooting your cum down _his2 throat<<else>>covering _his2 face in girlcum<</if>>. Your guests and their attendant slaves @@.green;applaud at the consummation,@@ or rather, the first stage of the consummation. The balance will take place privately, however, and you scoop up your new slave wife to carry _him2 back into the master bedroom. _He2 looks up at you, _his2 eyes unsure. <</if>> <</if>> - <<if _slave1.relationship != 0 && _slave2.relationship != 0>> + <<if (_slave1.relationship != 0) || (_slave2.relationship != 0)>> <<if _slave1.relationshipTarget == _slave2.ID>> /* TODO: not sure about these */ <<if ((_slave1.devotion+_slave1.trust >= 175) && (_slave2.devotion+_slave2.trust >= 175)) || ((_slave1.devotion < -20 && _slave1.trust > 20) && (_slave2.devotion < -20 && _slave2.trust > 20)) || ((_slave1.devotion < -20) && (_slave2.devotion < -20)) || ((_slave1.devotion >= -20 && _slave2.devotion >= -20))>> @@ -2378,7 +2222,7 @@ <<if _slave1.relationship != 0>> <<if _slave1.devotion+_slave1.trust >= 175>> <<if _slave1.relationship > 0>> - $His <<if _slave1.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his2 <<if _slave1.relationship > 2>>love<<else>>companion<</if>>'s future. + _slave1.slaveName's <<if _slave1.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his3 <<if _slave1.relationship > 2>>ex<<else>>companion<</if>>'s future. <<if _slave1.relationship == 4>> <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> <<elseif _slave1.relationship == 3>> @@ -2389,136 +2233,86 @@ <</if>> <<elseif _slave1.devotion < -20>> <<if _slave1.relationship == -1>> - $He @@.mediumorchid;hates@@ that $he has to be yours only and @@.gold;fears@@ what will happen if $he strays. + _slave1.slaveName @@.mediumorchid;hates@@ that $he has to be yours only and @@.gold;fears@@ what will happen if $he strays. <<set _slave1.devotion -= 40, _slave1.trust -= 40>> <<elseif _slave1.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. - <<set $slaves[_m].devotion -= 40, $slaves[_m].trust -= 40>> + Both _slave1.slaveName and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;furious@@ to watch _his3 life's love get stolen away and fucked pregnant in such a manner. + <<set $slaves[_m].devotion -= 60, $slaves[_m].trust -= 40>> <<set _slave1.devotion -= 40, _slave1.trust -= 40>> <<elseif _slave1.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. + Both _slave1.slaveName and $his ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his3 life's love get stolen away and fucked pregnant in such a manner. <<set $slaves[_m].devotion -= 30, $slaves[_m].trust -= 30>> - <<set _slave1.devotion -= 30, _slave1.trust -= 30>> + <<set _slave1.devotion -= 50, _slave1.trust -= 30>> <<elseif _slave1.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. + Both _slave1.slaveName and $his friend @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> <<set _slave1.devotion -= 20, _slave1.trust -= 20>> <</if>> <<else>> <<if _slave1.relationship == -1>> - $He @@.mediumorchid;dislikes@@ that $he has to be yours only and @@.gold;worries@@ what will happen if $he strays. + _slave1.slaveName @@.mediumorchid;dislikes@@ that $he has to be yours only and @@.gold;worries@@ what will happen if $he strays. <<set _slave1.devotion -= 10, _slave1.trust -= 10>> <<elseif _slave1.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. + Both _slave1.slaveName and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is especially @@.mediumorchid;hurt@@ after watching _his3 life's love get stolen away and fucked pregnant in such a manner. <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave1.devotion -= 20, _slave1.trust -= 20>> + <<set _slave1.devotion -= 30, _slave1.trust -= 20>> <<elseif _slave1.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. + Both _slave1.slaveName and $his ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_m].slaveName is a little @@.mediumorchid;jealous@@ of you for snagging such catch out from under _him3. <<set $slaves[_m].devotion -= 10, $slaves[_m].trust -= 10>> - <<set _slave1.devotion -= 10, _slave1.trust -= 10>> + <<set _slave1.devotion -= 15, _slave1.trust -= 10>> <<elseif _slave1.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. + Both _slave1.slaveName and $his friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> <<set _slave1.devotion -= 5, _slave1.trust -= 5>> <</if>> <</if>> <</if>> - <</if>> - <<else>> - <<if _slave1.relationship != 0>> - <<if _slave1.devotion+_slave1.trust >= 175>> - <<if _slave1.relationship > 0>> - $His <<if _slave1.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his2 <<if _slave1.relationship > 2>>love<<else>>companion<</if>>'s future. - <<if _slave1.relationship == 4>> - <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> - <<elseif _slave1.relationship == 3>> - <<set $slaves[_m].devotion -= 3, $slaves[_m].trust -= 3>> - <<else>> - <<set $slaves[_m].devotion -= 1, $slaves[_m].trust -= 1>> + <<if _slave2.relationship != 0>> + <<if _slave2.devotion+_slave1.trust >= 175>> + <<if _slave2.relationship > 0>> + _slave2.slaveName's <<if _slave2.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his4 <<if _slave2.relationship > 2>>ex<<else>>companion<</if>>'s future. + <<if _slave2.relationship == 4>> + <<set $slaves[_n].devotion -= 5, $slaves[_n].trust -= 5>> + <<elseif _slave2.relationship == 3>> + <<set $slaves[_n].devotion -= 3, $slaves[_n].trust -= 3>> + <<else>> + <<set $slaves[_n].devotion -= 1, $slaves[_n].trust -= 1>> + <</if>> <</if>> - <</if>> - <<elseif _slave1.devotion < -20>> - <<if _slave1.relationship == -1>> - $He @@.mediumorchid;hates@@ that $he has to be yours only and @@.gold;fears@@ what will happen if $he strays. - <<set _slave1.devotion -= 40, _slave1.trust -= 40>> - <<elseif _slave1.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. - <<set $slaves[_m].devotion -= 40, $slaves[_m].trust -= 40>> - <<set _slave1.devotion -= 40, _slave1.trust -= 40>> - <<elseif _slave1.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. - <<set $slaves[_m].devotion -= 30, $slaves[_m].trust -= 30>> - <<set _slave1.devotion -= 30, _slave1.trust -= 30>> - <<elseif _slave1.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. - <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave1.devotion -= 20, _slave1.trust -= 20>> - <</if>> - <<else>> - <<if _slave1.relationship == -1>> - $He @@.mediumorchid;dislikes@@ that $he has to be yours only and @@.gold;worries@@ what will happen if $he strays. - <<set _slave1.devotion -= 10, _slave1.trust -= 10>> - <<elseif _slave1.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. - <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave1.devotion -= 20, _slave1.trust -= 20>> - <<elseif _slave1.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. - <<set $slaves[_m].devotion -= 10, $slaves[_m].trust -= 10>> - <<set _slave1.devotion -= 10, _slave1.trust -= 10>> - <<elseif _slave1.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. - <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> - <<set _slave1.devotion -= 5, _slave1.trust -= 5>> - <</if>> - <</if>> - <</if>> - - <<if _slave2.relationship != 0>> - <<if _slave2.devotion+_slave2.trust >= 175>> - <<if _slave2.relationship > 0>> - $His <<if _slave2.relationship > 2>>ex<<else>>friend<</if>> is @@.mediumorchid;disappointed@@ that their relationship had to end and @@.gold;worries@@ for _his2 <<if _slave2.relationship > 2>>love<<else>>companion<</if>>'s future. - <<if _slave2.relationship == 4>> - <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> + <<elseif _slave2.devotion < -20>> + <<if _slave2.relationship == -1>> + _slave2.slaveName @@.mediumorchid;hates@@ that _he2 has to be yours only and @@.gold;fears@@ what will happen if _he2 strays. + <<set _slave2.devotion -= 40, _slave2.trust -= 40>> + <<elseif _slave2.relationship == 4>> + Both _slave2.slaveName and _his2 ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_n].slaveName is especially @@.mediumorchid;furious@@ to watch _his4 life's love get stolen away and fucked pregnant in such a manner. + <<set $slaves[_n].devotion -= 60, $slaves[_n].trust -= 40>> + <<set _slave2.devotion -= 40, _slave2.trust -= 40>> <<elseif _slave2.relationship == 3>> - <<set $slaves[_m].devotion -= 3, $slaves[_m].trust -= 3>> - <<else>> - <<set $slaves[_m].devotion -= 1, $slaves[_m].trust -= 1>> + Both _slave2.slaveName and _his2 ex @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. $slaves[_n].slaveName is especially @@.mediumorchid;hurt@@ after watching _his4 life's love get stolen away and fucked pregnant in such a manner. + <<set $slaves[_n].devotion -= 30, $slaves[_n].trust -= 30>> + <<set _slave2.devotion -= 50, _slave2.trust -= 30>> + <<elseif _slave2.relationship > 0>> + Both _slave2.slaveName and _his2 friend @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. + <<set $slaves[_n].devotion -= 20, $slaves[_n].trust -= 20>> + <<set _slave2.devotion -= 20, _slave2.trust -= 20>> + <</if>> + <<else>> + <<if _slave2.relationship == -1>> + _slave2.slaveName @@.mediumorchid;dislikes@@ that _he2 has to be yours only and @@.gold;worries@@ what will happen if _he2 strays. + <<set _slave2.devotion -= 10, _slave2.trust -= 10>> + <<elseif _slave2.relationship == 4>> + Both _slave2.slaveName and _his2 ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_n].slaveName is especially @@.mediumorchid;hurt@@ after watching _his4 life's love get stolen away and fucked pregnant in such a manner. + <<set $slaves[_n].devotion -= 20, $slaves[_n].trust -= 20>> + <<set _slave2.devotion -= 30, _slave2.trust -= 20>> + <<elseif _slave2.relationship == 3>> + Both _slave2.slaveName and _his2 ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. $slaves[_n].slaveName is a little @@.mediumorchid;jealous@@ of you for snagging such catch out from under _him4. + <<set $slaves[_n].devotion -= 10, $slaves[_n].trust -= 10>> + <<set _slave2.devotion -= 15, _slave2.trust -= 10>> + <<elseif _slave2.relationship > 0>> + Both _slave2.slaveName and _his2 friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. + <<set $slaves[_n].devotion -= 5, $slaves[_n].trust -= 5>> + <<set _slave2.devotion -= 5, _slave2.trust -= 5>> <</if>> - <</if>> - <<elseif _slave2.devotion < -20>> - <<if _slave2.relationship == -1>> - $He @@.mediumorchid;hates@@ that $he has to be yours only and @@.gold;fears@@ what will happen if $he strays. - <<set _slave2.devotion -= 40, _slave2.trust -= 40>> - <<elseif _slave2.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. - <<set $slaves[_m].devotion -= 40, $slaves[_m].trust -= 40>> - <<set _slave2.devotion -= 40, _slave2.trust -= 40>> - <<elseif _slave2.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. - <<set $slaves[_m].devotion -= 30, $slaves[_m].trust -= 30>> - <<set _slave2.devotion -= 30, _slave2.trust -= 30>> - <<elseif _slave2.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;fear@@ for each other's future. - <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave2.devotion -= 20, _slave2.trust -= 20>> - <</if>> - <<else>> - <<if _slave2.relationship == -1>> - $He @@.mediumorchid;dislikes@@ that $he has to be yours only and @@.gold;worries@@ what will happen if $he strays. - <<set _slave2.devotion -= 10, _slave2.trust -= 10>> - <<elseif _slave2.relationship == 4>> - Both $him and $his ex are @@.mediumorchid;resent@@ that their relationship had to end and @@.gold;worry@@ for each other. - <<set $slaves[_m].devotion -= 20, $slaves[_m].trust -= 20>> - <<set _slave2.devotion -= 20, _slave2.trust -= 20>> - <<elseif _slave2.relationship == 3>> - Both $him and $his ex are @@.mediumorchid;are saddened@@ that their relationship had to end and @@.gold;worry@@ for each other. - <<set $slaves[_m].devotion -= 10, $slaves[_m].trust -= 10>> - <<set _slave2.devotion -= 10, _slave2.trust -= 10>> - <<elseif _slave2.relationship > 0>> - Both $him and $his friend are @@.mediumorchid;are disappointed@@ that their relationship had to end and @@.gold;worry@@ for each other. - <<set $slaves[_m].devotion -= 5, $slaves[_m].trust -= 5>> - <<set _slave2.devotion -= 5, _slave2.trust -= 5>> <</if>> <</if>> <</if>> @@ -2528,7 +2322,6 @@ <<set _slave1.counter.oral += 1>> <<set $oralTotal += 1>> <<run repX(2000, "event", _slave1)>> - <<run repX(2000, "event", _slave2)>> <<if _slave1.fetish == "mindbroken">> <<set $desc = "a framed shot of your uneventful wedding to the mindbroken " + _slave1.slaveName>> <<elseif _slave1.devotion+_slave1.trust >= 175>> @@ -2545,7 +2338,6 @@ <<set _slave2.relationship = -3>> <<set _slave2.counter.oral += 1>> <<set $oralTotal += 1>> - <<run repX(2000, "event", _slave1)>> <<run repX(2000, "event", _slave2)>> <<if _slave2.fetish == "mindbroken">> <<set $desc = "a framed shot of your uneventful wedding to the mindbroken " + _slave2.slaveName>> diff --git a/src/uncategorized/seWeddingSingle.tw b/src/uncategorized/seWeddingSingle.tw index 968a44b7eac36431e9be2f05d87c3bbcb987c282..3978b2c03b8b7160d62fa3f71fe94fb51cc60e97 100644 --- a/src/uncategorized/seWeddingSingle.tw +++ b/src/uncategorized/seWeddingSingle.tw @@ -347,7 +347,7 @@ In the days leading up to your wedding, $slaves[_wedS].slaveName spent $his time <</if>> <<else>> <<if $slaves[_wedS].clit > 1>> - $His huge clit is quite hard, making $his shift uncomfortably as $his lacy g-string stimulates it. + $His huge clit is quite hard, making $him shift uncomfortably as $his lacy g-string stimulates it. <<else>> $His lacy g-string covers $his womanhood demurely. <</if>> diff --git a/src/uncategorized/sellSlave.tw b/src/uncategorized/sellSlave.tw index 5b1ad6cf1e0932128b3510c70cd17021844bac5f..834cdde828b6792cca5bf699b2b057c26d3c6f39 100644 --- a/src/uncategorized/sellSlave.tw +++ b/src/uncategorized/sellSlave.tw @@ -1198,19 +1198,17 @@ __Bids Received__ <</if>> <</if>> -<<if $activeSlave.ovaries == 1>> - <<if $activeSlave.preg > -2>> - <<if $activeSlave.muscles > 30>> - <<if $activeSlave.weight <= 10>> - <<if $activeSlave.height < 165>> - <<if random(1,100) > 60>> - <br>''<<print cashFormat(500*Math.trunc(($slaveCost*1.35)/500))>>'' from a prominent citizen whose friends never let him hear the end of his incorrigibly romantic treatment of his apartment full of amazons. - <<link "Accept bid" "Slave Sold">> - <<set _Price = 500*Math.trunc(($slaveCost*1.35)/500)>> - <<run cashX(_Price, "slaveTransfer", $activeSlave)>> - <<set $buyer = "D amazon hunter">> - <</link>> - <</if>> +<<if $activeSlave.dick == 0>> + <<if $activeSlave.muscles > 30>> + <<if $activeSlave.devotion > 20>> + <<if $activeSlave.height > 180>> + <<if random(1,100) > 60>> + <br>''<<print cashFormat(500*Math.trunc(($slaveCost*1.35)/500))>>'' from a prominent citizen whose friends never let him hear the end of his incorrigibly romantic treatment of his apartment full of amazons. + <<link "Accept bid" "Slave Sold">> + <<set _Price = 500*Math.trunc(($slaveCost*1.35)/500)>> + <<run cashX(_Price, "slaveTransfer", $activeSlave)>> + <<set $buyer = "D amazon hunter">> + <</link>> <</if>> <</if>> <</if>> @@ -1218,17 +1216,19 @@ __Bids Received__ <</if>> <<if $seePreg != 0>> - <<if $activeSlave.dick == 0>> - <<if $activeSlave.muscles > 30>> - <<if $activeSlave.devotion > 20>> - <<if $activeSlave.height > 180>> - <<if random(1,100) > 60>> - <br>''<<print cashFormat(500*Math.trunc(($slaveCost*1.35)/500))>>'' from a prominent citizen who keeps a large harem of lithe, muscular <<= $girl>>s to bear him children. - <<link "Accept bid" "Slave Sold">> - <<set _Price = 500*Math.trunc(($slaveCost*1.35)/500)>> - <<run cashX(_Price, "slaveTransfer", $activeSlave)>> - <<set $buyer = "D shorty breeder">> - <</link>> + <<if $activeSlave.ovaries == 1>> + <<if $activeSlave.preg > -2>> + <<if $activeSlave.muscles > 30>> + <<if $activeSlave.weight <= 10>> + <<if $activeSlave.height < 165>> + <<if random(1,100) > 60>> + <br>''<<print cashFormat(500*Math.trunc(($slaveCost*1.35)/500))>>'' from a prominent citizen who keeps a large harem of lithe, muscular <<= $girl>>s to bear him children. + <<link "Accept bid" "Slave Sold">> + <<set _Price = 500*Math.trunc(($slaveCost*1.35)/500)>> + <<run cashX(_Price, "slaveTransfer", $activeSlave)>> + <<set $buyer = "D shorty breeder">> + <</link>> + <</if>> <</if>> <</if>> <</if>> @@ -1682,16 +1682,18 @@ __Bids Received__ <</if>> <</if>> -<<if $activeSlave.race != "mixed race">> - <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant < -50>> - <<if $activeSlave.ovaries == 1>> - <<if random(1,100) > 70>> - <br>''<<print cashFormat(500*Math.trunc(($slaveCost*1.25)/500))>>'' from a fellow arcology owner working on a project to breed a race of $activeSlave.race people with natural, unquestioning obedience. He clearly considers $him good stock for the project. - <<link "Accept bid" "Slave Sold">> - <<set _Price = 500*Math.trunc(($slaveCost*1.25)/500)>> - <<run cashX(_Price, "slaveTransfer", $activeSlave)>> - <<set $buyer = "subjugationist arcology">> - <</link>> +<<if $seePreg != 0>> + <<if $activeSlave.race != "mixed race">> + <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant < -50>> + <<if $activeSlave.ovaries == 1>> + <<if random(1,100) > 70>> + <br>''<<print cashFormat(500*Math.trunc(($slaveCost*1.25)/500))>>'' from a fellow arcology owner working on a project to breed a race of $activeSlave.race people with natural, unquestioning obedience. He clearly considers $him good stock for the project. + <<link "Accept bid" "Slave Sold">> + <<set _Price = 500*Math.trunc(($slaveCost*1.25)/500)>> + <<run cashX(_Price, "slaveTransfer", $activeSlave)>> + <<set $buyer = "subjugationist arcology">> + <</link>> + <</if>> <</if>> <</if>> <</if>> @@ -1846,6 +1848,28 @@ __Bids Received__ <</if>> <</if>> +<<if (!canHear($activeSlave))>> + <<if random(1,100) > 60>> + <br>''<<print cashFormat(500*Math.trunc(($slaveCost*1.3)/500))>>'' from a concert venue that wants a sex slave to keep the stage crew satisfied, but doesn't want to worry about any possible hearing loss. + <<link "Accept bid" "Slave Sold">> + <<set _Price = 500*Math.trunc(($slaveCost*1.3)/500)>> + <<run cashX(_Price, "slaveTransfer", $activeSlave)>> + <<set $buyer = "concert hall">> + <</link>> + <</if>> +<</if>> + +<<if ($activeSlave.sexualFlaw == "crude")>> + <<if random(1,100) > 60>> + <br>''<<print cashFormat(500*Math.trunc(($slaveCost*1.4)/500))>>'' from a slave trainer that specializes in teaching proper manners and etiquette to low-class slaves. + <<link "Accept bid" "Slave Sold">> + <<set _Price = 500*Math.trunc(($slaveCost*1.4)/500)>> + <<run cashX(_Price, "slaveTransfer", $activeSlave)>> + <<set $buyer = "etiquette coach">> + <</link>> + <</if>> +<</if>> + <<if $plot>> <<if $peacekeepers>> <<if $peacekeepers.strength >= 50>> diff --git a/src/uncategorized/slaveSold.tw b/src/uncategorized/slaveSold.tw index e100c977c54cbbd035e93f6c2c70f162db1d4964..b3196c39923b4630c40f7d6401f0adb6f5515b30 100644 --- a/src/uncategorized/slaveSold.tw +++ b/src/uncategorized/slaveSold.tw @@ -540,7 +540,7 @@ <</if>> <<case "organ crafter">> - $activeSlave.slaveName is seen in a research report nine months later; $he has undergone some interesting changes. As expected by someone interested in $his odd womb, $he is quite pregnant, but what really stands out is the massive size of $his testicles and $his huge round implants. A quick glance at the article reveals that they aren't implants, in fact, $his breasts and testicles are rounded with children. + $activeSlave.slaveName is seen in a research report nine months later; $he has undergone some interesting changes. As expected by someone interested in $his odd womb, $he is quite pregnant, but what really stands out is the massive size of $his testicles and $his huge round implants. A quick glance at the article reveals that they aren't implants; in fact, $his breasts and testicles are rounded with children. <<for _ss = 0; _ss < $slaves.length; _ss++>> <<if ($slaves[_ss].mpreg == 1)>> <<run clearSummaryCache($slaves[_ss])>> @@ -980,59 +980,79 @@ <</for>> <<case "D oral servants">> - $activeSlave.slaveName is an occasional sight around the arcology; $he's never seen outside the company of $his new slave superior. This is one of $his new master's more favored slaves. $He has a huge cock, and $activeSlave.slaveName usually crouches down, hugging one of $his superior's legs and keeping $his mouth obediently near that dick. Your cumsluts are @@.mediumaquamarine;rather envious.@@ + $activeSlave.slaveName is an occasional sight around the arcology; $he's never seen outside the company of $his new slave superior. This is one of $his new master's more favored slaves. $He has a huge cock, and $activeSlave.slaveName usually crouches down, hugging one of $his superior's legs and keeping $his mouth obediently near that dick. <<for _ss = 0; _ss < $slaves.length; _ss++>> <<if ($slaves[_ss].fetishKnown == 1)>> <<if ($slaves[_ss].fetish == "cumslut")>> <<run clearSummaryCache($slaves[_ss])>> <<set $slaves[_ss].trust += 1>> + <<set _slaveImpact = 1>> <</if>> <</if>> <</for>> + <<if (_slaveImpact == 1)>> + Your cumsluts are @@.mediumaquamarine;rather envious.@@ + <</if>> <<case "D trap lover">> - $activeSlave.slaveName becomes a frequent sight around the arcology, accompanying $his new master. $He's clearly happy, and is frequently seen to offer $his butt to him with a smile. Your slaves with dicks who've accepted their lot in life find this @@.mediumaquamarine;encouraging.@@ + $activeSlave.slaveName becomes a frequent sight around the arcology, accompanying $his new master. $He's clearly happy, and is frequently seen to offer $his butt to him with a smile. <<for _ss = 0; _ss < $slaves.length; _ss++>> <<if ($slaves[_ss].dick > 0)>> <<if ($slaves[_ss].devotion > 20)>> <<run clearSummaryCache($slaves[_ss])>> <<set $slaves[_ss].trust += 1>> + <<set _slaveImpact = 1>> <</if>> <</if>> <</for>> + <<if (_slaveImpact == 1)>> + Your slaves with dicks who've accepted their lot in life find this @@.mediumaquamarine;encouraging.@@ + <</if>> <<case "D butt bury">> - $activeSlave.slaveName's buyer arrives promptly; he seems pleased with his new slave's bountiful bottom, so far off the ground. Your buttsluts giggle over what he's got in store for $him, and @@.mediumaquamarine;envy@@ $his new owner a little. + $activeSlave.slaveName's buyer arrives promptly; he seems pleased with his new slave's bountiful bottom, so far off the ground. <<for _ss = 0; _ss < $slaves.length; _ss++>> <<if ($slaves[_ss].fetish == "buttslut")>> <<if ($slaves[_ss].fetishKnown == 1)>> <<run clearSummaryCache($slaves[_ss])>> <<set $slaves[_ss].trust += 1>> + <<set _slaveImpact = 1>> <</if>> <</if>> <</for>> + <<if (_slaveImpact == 1)>> + Your buttsluts giggle over what he's got in store for $him, and @@.mediumaquamarine;envy@@ $his new owner a little. + <</if>> <<case "D milky herm">> - $activeSlave.slaveName's buyer arrives and seems pleased with $his lovely feminine appearance; he verifies $his lactation and $his ability to achieve erection despite $his lack of visible balls. Your other feminine slaves with dicks @@.mediumaquamarine;trust@@ they'll go to owners that will value them, should they be sold. + $activeSlave.slaveName's buyer arrives and seems pleased with $his lovely feminine appearance; he verifies $his lactation and $his ability to achieve erection despite $his lack of visible balls. <<for _ss = 0; _ss < $slaves.length; _ss++>> <<if ($slaves[_ss].dick > 0)>> <<if ($slaves[_ss].boobs > 400)>> <<run clearSummaryCache($slaves[_ss])>> <<set $slaves[_ss].trust += 1>> + <<set _slaveImpact = 1>> <</if>> <</if>> <</for>> + <<if (_slaveImpact == 1)>> + Your other feminine slaves with dicks @@.mediumaquamarine;trust@@ they'll go to owners that will value them, should they be sold. + <</if>> <<case "D shorty breeder">> - $activeSlave.slaveName's lithe, muscular form is rarely seen after $his buyer takes charge of $him, since $he seems to spend most of $his time at home making babies. Your slaves with pregnancy fetishes @@.mediumaquamarine;almost want to be sold@@ since there's a chance they'll be purchased by him, too. + $activeSlave.slaveName's lithe, muscular form is rarely seen after $his buyer takes charge of $him, since $he seems to spend most of $his time at home making babies. <<for _ss = 0; _ss < $slaves.length; _ss++>> <<if ($slaves[_ss].fetish == "pregnancy")>> <<if ($slaves[_ss].fetishKnown == 1)>> <<run clearSummaryCache($slaves[_ss])>> <<set $slaves[_ss].trust += 4>> + <<set _slaveImpact = 1>> <</if>> <</if>> <</for>> + <<if (_slaveImpact == 1)>> + Your slaves with pregnancy fetishes @@.mediumaquamarine;almost want to be sold@@ since there's a chance they'll be purchased by him, too. + <</if>> <<case "D waifu">> $activeSlave.slaveName is rarely seen after $his buyer takes charge of $him, since he prefers to keep his beloved at home. Though $he seems to be well treated, arcology society finds him repellent enough that your other slaves do not envy $him. @@ -1045,28 +1065,36 @@ <</for>> <<case "porn studio">> - $activeSlave.slaveName becomes a frequent sight in $activeSlave.porn.fameType smut and attracts huge crowds with each public appearance. Your other aspiring porn stars @@.mediumaquamarine;try harder than ever@@ in the hopes of following in $his prestigious footsteps. + $activeSlave.slaveName becomes a frequent sight in $activeSlave.porn.fameType smut and attracts huge crowds with each public appearance. <<run clearSummaryCache()>> <<for _ss = 0; _ss < $slaves.length; _ss++>> <<if $slaves[_ss].pornPrestige > 0 && $slaves[_ss].pornPrestige < 3>> <<if ($slaves[_ss].devotion > 20)>> <<run clearSummaryCache($slaves[_ss])>> <<set $slaves[_ss].trust += 2>> + <<set _slaveImpact = 1>> <</if>> <</if>> <</for>> + <<if (_slaveImpact == 1)>> + Your other aspiring porn stars @@.mediumaquamarine;try harder than ever@@ in the hopes of following in $his prestigious footsteps. + <</if>> <<case "obsessed fan">> - $activeSlave.slaveName is rarely seen after $his buyer takes charge of $him, since he prefers to keep his prize safe and sound at home. Your other borderline unheard of sluts @@.mediumaquamarine;hope that someone like him would consider whisking them away,@@ but most of your slaves are skeptical at what his intent may be. + $activeSlave.slaveName is rarely seen after $his buyer takes charge of $him, since he prefers to keep his prize safe and sound at home. <<run clearSummaryCache()>> <<for _ss = 0; _ss < $slaves.length; _ss++>> <<if $slaves[_ss].pornPrestige == 1>> <<if ($slaves[_ss].devotion > 20)>> <<run clearSummaryCache($slaves[_ss])>> <<set $slaves[_ss].trust += 1>> + <<set _slaveImpact = 1>> <</if>> <</if>> <</for>> + <<if (_slaveImpact == 1)>> + Your other borderline unheard of sluts @@.mediumaquamarine;hope that someone like him would consider whisking them away,@@ but most of your slaves are skeptical at what his intent may be. + <</if>> <<case "tentacle bred">> @@ -1083,6 +1111,32 @@ <<if _slaveImpact == 1>> Your less than intelligent slaves are @@.mediumorchid;deeply envious@@ of $activeSlave.slaveName, completely failing to comprehend what they saw were not special effects. <</if>> + +<<case "concert hall">> + As $activeSlave.slaveName know spends all $his time backstage, $he's rarely seen again. Occasionally, however, a roadie will bring $him outside as he hauls the equipment, and $he jacks him off. + <<for _ss = 0; _ss < $slaves.length; _ss++>> + <<if ($slaves[_ss].hears < 0)>> + <<run clearSummaryCache($slaves[_ss])>> + <<set $slaves[_ss].trust += 1>> + <<set _slaveImpact = 1>> + <</if>> + <</for>> + <<if (_slaveImpact == 1)>> + Your slaves with hearing problems @@.mediumaquamarine;take some solace@@ in the idea of being bought because of their disability, not in spite of it. + <</if>> + +<<case "etiquette coach">> + $activeSlave.slaveName's new etiquette trainer sends you courtesy updates on $his progress, as $he learns proper poise and enunciation, the correct locations of silverware, and how to avoid making vulgar comments while performing lascivious acts. + <<for _ss = 0; _ss < $slaves.length; _ss++>> + <<if ($slaves[_ss].sexualFlaw == "crude")>> + <<run clearSummaryCache($slaves[_ss])>> + <<set $slaves[_ss].trust -= 1>> + <<set _slaveImpact = 1>> + <</if>> + <</for>> + <<if (_slaveImpact == 1)>> + Your other slaves lacking in manners consider being turned into a proper member of polite society @@.gold;a fate wore than death.@@ + <</if>> <<case "peacekeepers">> $activeSlave.slaveName is delivered to General $peacekeepers.generalName's forces, to serve as a barracks whore. Several days later, the purchasing officer forwards a short shot of $activeSlave.slaveName diff --git a/src/uncategorized/walkPast.tw b/src/uncategorized/walkPast.tw index 0cd210db7b83d836f36b3cadb2684e8f93bd44a8..d144949698d9c85b05b72b34c41a076f8611d5e0 100644 --- a/src/uncategorized/walkPast.tw +++ b/src/uncategorized/walkPast.tw @@ -1625,7 +1625,7 @@ <<case "battlearmor">> $His taut armor shows off $his huge belly. <<case "a mounty outfit">> - $His huge belly threatens to pop the buttons off $his tunic. + $His huge belly threatens to pop the buttons off $his uniform. <<case "a dirndl">> $His loose dress is completely filled by $his huge belly. <<case "lederhosen">> diff --git a/src/utility/descriptionWidgets.tw b/src/utility/descriptionWidgets.tw index 2831b02664edf662b895df8d708bf9dd5ccd16fe..4971f088cb36d544d90231c664cb6fb23c8cbaa0 100644 --- a/src/utility/descriptionWidgets.tw +++ b/src/utility/descriptionWidgets.tw @@ -108,6 +108,11 @@ <<elseif $activeSlave.geneticQuirks.heterochromia == 1 && $geneticMappingUpgrade >= 2>> $He is a carrier of the heterochromia gene. <</if>> + <<if $activeSlave.geneticQuirks.androgyny == 2>> + $His is naturally androgynous. + <<elseif $activeSlave.geneticQuirks.androgyny == 1 && $geneticMappingUpgrade >= 2>> + $He is a carrier of a series of genes that result in androgyny. + <</if>> <<if $activeSlave.geneticQuirks.pFace == 2>> $He has an exceedingly rare trait associated with perfect facial beauty. <<if $activeSlave.geneticQuirks.uFace == 2>> @@ -198,6 +203,20 @@ <<elseif $activeSlave.geneticQuirks.rearLipedema == 1 && $geneticMappingUpgrade >= 2>> $He is a carrier of a genetic flaw that causes lipedema. <</if>> + <<if $activeSlave.geneticQuirks.wGain == 2 && $activeSlave.geneticQuirks.wLoss == 2>> + $He has irregular leptin production and will undergo shifts in weight. + <<elseif $activeSlave.geneticQuirks.wGain == 2>> + $He has hyperleptinemia and will easily gain weight. + <<elseif $activeSlave.geneticQuirks.wLoss == 2>> + $He has hypoleptinemia and will easily loose weight. + <</if>> + <<if $activeSlave.geneticQuirks.mGain == 2 && $activeSlave.geneticQuirks.mLoss == 2>> + $He has severe genetic flaw resulting in easily replaced, rapidly lost muscle mass. + <<elseif $activeSlave.geneticQuirks.mGain == 2>> + $He has myotonic hypertorphy and will easily gain muscle mass. + <<elseif $activeSlave.geneticQuirks.mLoss == 2>> + $He has myotonic dystrophy and will rapidly loose muscle mass. + <</if>> <</if>> <</widget>> diff --git a/src/utility/miscWidgets.tw b/src/utility/miscWidgets.tw index 3d905bb0f1092f882ec4fb7005bd36523f214497..1c4a8b868cd15e3cdee572ab581da4b005238abd 100644 --- a/src/utility/miscWidgets.tw +++ b/src/utility/miscWidgets.tw @@ -540,49 +540,49 @@ $args[1]: Fetish. <<widget "EventFetish">> <<if $args[0].fetish == $args[1]>> -This experience -<<if $args[0].fetishKnown == 1>> - <<if $args[0].fetishStrength > 95>> + This experience + <<if $args[0].fetishKnown == 1>> + <<if $args[0].fetishStrength > 95>> + @@.lightsalmon;<<switch $args[0].fetish>> + <<case "submissive">>deepens $his sexual need to submit. + <<case "cumslut">>increases $his appetite for oral sex. + <<case "humiliation">>makes $him even more eager to be humiliated. + <<case "buttslut">>encourages $him to focus on anal sex. + <<case "boobs">>focuses $his sexuality on $his breasts and nipples. + <<case "sadist">>titillates the sadistic part of $him. + <<case "masochist">>helps conflate pain and sexual pleasure for $him. + <<case "dom">>strengthens $his desire to top other slaves. + <<case "pregnancy">>further confuses lust and pregnancy in $his mind. + <<default>>ERROR: bad fetish + <</switch>>@@ + <<set $args[0].fetishStrength += 10>> + <<else>> + is @@.hotpink;especially enjoyable for $him,@@ since + <<switch $args[0].fetish>> + <<case "submissive">>$he's an utterly submissive little slut. + <<case "cumslut">>$his <<if $args[0].vagina > -1>>clit<<else>>frenulum<</if>> might as well be located in $his throat. + <<case "humiliation">>$he has a hopeless need to be humiliated and degraded. + <<case "buttslut">>$he's completely in love with having $his ass fucked. + <<case "boobs">>$he loves breast play more than any other kind of sex. + <<case "sadist">>nothing is as titillating to $him as another slave's pain can be. + <<case "masochist">>$he loves pain more than $he likes pleasure. + <<case "dom">>$he lives for the times $he's allowed to fuck someone. + <<case "pregnancy">>all $his deepest sexual desires involve <<if $args[0].vagina > -1 || $args[0].mpreg == 1>>pregnancy<<else>>impregnation<</if>>. + <<default>>ERROR: bad fetish + <</switch>> + <<set $args[0].devotion += 3>> + <</if>> + <<else>> + was surprisingly appealing for $him, revealing that $he's a @@.lightsalmon;<<switch $args[0].fetish>> - <<case "submissive">>deepens $his sexual need to submit. - <<case "cumslut">>increases $his appetite for oral sex. - <<case "humiliation">>makes $him even more eager to be humiliated. - <<case "buttslut">>encourages $him to focus on anal sex. - <<case "boobs">>focuses $his sexuality on $his breasts and nipples. - <<case "sadist">>titillates the sadistic part of $him. - <<case "masochist">>helps conflate pain and sexual pleasure for $him. - <<case "dom">>strengthens $his desire to top other slaves. - <<case "pregnancy">>further confuses lust and pregnancy in $his mind. - <<default>>ERROR: bad fetish + <<case "submissive">>sexual submissive! + <<case "humiliation">>humiliation slut! + <<case "boobs">>slut for breast play! + <<case "pregnancy">>pregslut! + <<default>>$args[0]! <</switch>>@@ - <<set $args[0].fetishStrength += 10>> - <<else>> - is @@.hotpink;especially enjoyable for $him,@@ since - <<switch $args[0].fetish>> - <<case "submissive">>$he's an utterly submissive little slut. - <<case "cumslut">>$his <<if $args[0].vagina > -1>>clit<<else>>frenulum<</if>> might as well be located in $his throat. - <<case "humiliation">>$he has a hopeless need to be humiliated and degraded. - <<case "buttslut">>$he's completely in love with having $his ass fucked. - <<case "boobs">>$he loves breast play more than any other kind of sex. - <<case "sadist">>nothing is as titillating to $him as another slave's pain can be. - <<case "masochist">>$he loves pain more than $he likes pleasure. - <<case "dom">>$he lives for the times $he's allowed to fuck someone. - <<case "pregnancy">>all $his deepest sexual desires involve <<if $args[0].vagina > -1 || $args[0].mpreg == 1>>pregnancy<<else>>impregnation<</if>>. - <<default>>ERROR: bad fetish - <</switch>> - <<set $args[0].devotion += 3>> + <<set $args[0].fetishKnown = 1>> <</if>> -<<else>> - was surprisingly appealing for $him, revealing that $he's a - @@.lightsalmon;<<switch $args[0].fetish>> - <<case "submissive">>sexual submissive! - <<case "humiliation">>humiliation slut! - <<case "boobs">>slut for breast play! - <<case "pregnancy">>pregslut! - <<default>>$args[0]! - <</switch>>@@ - <<set $args[0].fetishKnown = 1>> -<</if>> <</if>> <</widget>>