diff --git a/Changelog.txt b/Changelog.txt index 7c03a8d98a103ad261cf53ed34784315b144faef..baa5930f0d6ed8dee2080afed629c73b1cd648f6 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,12 @@ Pregmod 0.10.7.1-3.4.x + 3/27/2020 + + 1 + + -various fixes, tidying and cleanup + 3/15/2020 0 @@ -12,7 +18,7 @@ Pregmod 0.10.7.1-3.3.x 3/07/2020 - + 3 -added corrective diet -food market tweaking @@ -21,21 +27,21 @@ Pregmod -more code improvement 3/02/2020 - + 2 -fixed lingering assistant issues 3/01/2020 - + 1 -added a follow up event to "snatch and grab" -assistant code restructuring -corrected breast description desyncs -continued code domming -fixes - + 2/23/2020 - + 0 -tiredness overhauled (temp disabled) -illness tweaked @@ -64,7 +70,7 @@ Pregmod 12/25/2019 0 - -slave health overhaul (short and long term health, exhuastion effects and illness) + -slave health overhaul (short and long term health, exhaustion effects and illness) -slave release rules overhaul (better control of who they do in their free time) -eye object overhaul -organ farm cleanup @@ -6936,7 +6942,7 @@ Pregmod 28 -fixed? saChoosesOwnJob - -assigned a default eyeWear to custom slaves + -assigned a default eyewear to custom slaves 27 -applies incubator bugfix diff --git a/FCHost/fchost/fchost_storage.cc b/FCHost/fchost/fchost_storage.cc index 6d223e0b7b8bd2d2b688f84021d24c19d4fb9a70..af13e4c8817c8d8490afceac1ec65083be6ed143 100644 --- a/FCHost/fchost/fchost_storage.cc +++ b/FCHost/fchost/fchost_storage.cc @@ -7,7 +7,7 @@ CefRefPtr<CefV8Value> FCHostSessionStorage::keys() const { - // holy hell this is awful. I hope Sugarcube doesn't actually USE this... + // holy hell this is awful. I hope Sugarcube doesn't actually USE this... CefRefPtr<CefV8Value> ret = CefV8Value::CreateArray(static_cast<int>(storage.size())); auto itr = storage.cbegin(); for (int i = 0; i < static_cast<int>(storage.size()); ++i, ++itr) @@ -18,7 +18,7 @@ CefRefPtr<CefV8Value> FCHostSessionStorage::keys() const } #if defined(OS_WIN) -/* This should't happen, so don't waste time on it. Sugarcube really only writes simple alphanumeric keys. +/* This shouldn't happen, so don't waste time on it. Sugarcube really only writes simple alphanumeric keys. static bool SanitizePath(std::wstring& inpath) { std::transform(inpath.begin(), inpath.end(), inpath.begin(), [](wchar_t c) @@ -35,7 +35,7 @@ void FCHostPersistentStorage::set(const CefString& key, CefRefPtr<CefV8Value> va { __super::set(key, val); - // only strings get persisted (should be ok, Sugarcube will serialize first) + // only strings get persisted (should be OK, Sugarcube will serialize first) if (val->IsString()) { // we should probably be doing this async but TBT Sugarcube is the slow part, not the file IO diff --git a/artTools/vector_deepmurk_extras.svg b/artTools/vector_deepmurk_extras.svg index f18382d4cede20b5c8a12c32623dd888e701f748..2b74000dc9ccce7d80779221d3c720c19fd82802 100644 --- a/artTools/vector_deepmurk_extras.svg +++ b/artTools/vector_deepmurk_extras.svg @@ -298,7 +298,7 @@ <style type="text/css" id="style"> - /* please maintain these definitions manually */ + /* please maintain these definitions manually */ .white{fill:#FFFFFF;} .skin{fill:#F6E0E8;} .head{} diff --git a/artTools/vector_deepmurk_primary.svg b/artTools/vector_deepmurk_primary.svg index bffb51c4436bf039d1100479eb4e04cba4727eb5..51602301ba637f5466be83911d1b31efae6f13a4 100644 --- a/artTools/vector_deepmurk_primary.svg +++ b/artTools/vector_deepmurk_primary.svg @@ -64,7 +64,7 @@ <inkscape:grid type="xygrid" id="grid897"/> </sodipodi:namedview> <style type="text/css" id="style"> - /* please maintain these definitions manually */ + /* please maintain these definitions manually */ .white{fill:#FFFFFF;} .skin{fill:#F6E0E8;} .head{} diff --git a/artTools/vector_deepmurk_secondary.svg b/artTools/vector_deepmurk_secondary.svg index 7cf277a327ff7c8eefe3f6a615169a987ed198bf..5ca142e7ecf7cb3733675bef7d3ea4e31b2ffb6d 100644 --- a/artTools/vector_deepmurk_secondary.svg +++ b/artTools/vector_deepmurk_secondary.svg @@ -64,7 +64,7 @@ <inkscape:grid type="xygrid" id="grid897"/> </sodipodi:namedview> <style type="text/css" id="style"> - /* please maintain these definitions manually */ + /* please maintain these definitions manually */ .white{fill:#FFFFFF;} .skin{fill:#F6E0E8;} .head{} diff --git a/artTools/vector_revamp_source.svg b/artTools/vector_revamp_source.svg index be0a37e3d9966552183446594d5f6b9d8ac94a9f..a21275fa75abf89bbc108f2641cfaeebb322e42e 100644 --- a/artTools/vector_revamp_source.svg +++ b/artTools/vector_revamp_source.svg @@ -19,7 +19,7 @@ </defs> <sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="2482" inkscape:window-height="1411" id="namedview4358" showgrid="false" inkscape:zoom="0.99999996" inkscape:cx="360.42883" inkscape:cy="363.29092" inkscape:window-x="69" inkscape:window-y="-9" inkscape:window-maximized="1" inkscape:current-layer="Notes_" inkscape:object-nodes="true" inkscape:object-paths="true" inkscape:snap-smooth-nodes="false" inkscape:snap-object-midpoints="true" inkscape:snap-global="false" inkscape:snap-nodes="true" inkscape:snap-intersection-paths="false" inkscape:snap-bbox="true" inkscape:snap-others="false" showguides="false" inkscape:lockguides="true"/> <style type="text/css" id="style"> - /* please maintain these definitions manually */ + /* please maintain these definitions manually */ .white{fill:#FFFFFF;} .skin{fill:#F6E0E8;} .head{} diff --git a/devNotes/AnatomyOfAFreeCitiesEvent.txt b/devNotes/AnatomyOfAFreeCitiesEvent.txt index d7585446903c2203e442590c217cf08d5a1d4f8e..bfd27d2daff4db7187491e5d6a9cc478057b46e5 100644 --- a/devNotes/AnatomyOfAFreeCitiesEvent.txt +++ b/devNotes/AnatomyOfAFreeCitiesEvent.txt @@ -93,7 +93,7 @@ Choice text This should be a short text describing the effects of your choice. Generally shorter than the main text, but all the other things mentioned there apply. Try to keep surprise buttsex to a minimum. -For example this cut up version of "paternalist encounter" from REFS (l:106-139). +For example this cut up version of "paternalist encounter" from REFS (lines 106-139). <span id="result"> <<link "Alert your drones and keep walking">> @@ -113,7 +113,7 @@ A choice doesn't need to have a specific effect. If your event has an immediate <span id="result"> <<link "Alert your drones and keep walking">> <<replace "#result">> - You inform $assistantName that you have a slave beater in need of detainment by your security drones, then continue on your way confident in your knowledge that the citizen will soon be in custody. + You inform $assistant.name that you have a slave beater in need of detainment by your security drones, then continue on your way confident in your knowledge that the citizen will soon be in custody. <</replace>> <</link>> <<if $cash >= 2000>> diff --git a/devNotes/sugarcube stuff/building sugarcube.txt b/devNotes/sugarcube stuff/building sugarcube.txt index 477859eaa4dba29a9328a2777503ee55b1f22145..9e50431ee3875a1c2ea7db4d92756abda8187373 100644 --- a/devNotes/sugarcube stuff/building sugarcube.txt +++ b/devNotes/sugarcube stuff/building sugarcube.txt @@ -1,7 +1,6 @@ This brief how-to guides through patching and building sugarcube (https://github.com/tmedwards/sugarcube-2) for the Free Cities. Sugarcube sources can be obtained locally by cloning its Git repository. - Prerequisites (listed NOT in the installation order, please read the list to the end first): 1. Node.js with npm (https://nodejs.org). 2. To build some packages, Node.js requires python and a C/C++ compiler. On Windows you may want to @@ -54,13 +53,12 @@ CAUTION: Requited dependencies change during the project lifetime and vary from you may need to run npm install again after some time, or after branch/tag change. Try to run it in case of strange build errors. - The next is done in the directory where SC repo was cloned. Loop over required SugarCube versions: 1. git reset --hard to clean any local changes 2. (Optionally) git checkout v2.30.1 (any tag or head here, of course) -3. git apply ~/games/fc-pregmod/devNotes/sugarcube\ stuff/sugarcube-fc-changes.patch +3. git apply <full path to sugarcube-fc-changes.patch> 4. node build.js -b 2 to build release version 5. cp dist/twine2/sugarcube-2/format.js <whenever you want> 6. node build.js -b 2 -u -d to build debug version -7. cp dist/twine2/sugarcube-2/format.js <whenever you want to place the debug header> +7. cp dist/twine2/sugarcube-2/format.js <whenever you want to place the debug header> \ No newline at end of file diff --git a/devTools/dictionary_phrases.txt b/devTools/dictionary_phrases.txt index 620b623151d0e5233167ca5dc3e6efbb0814fef5..af36f9621c161d621a8f720364e254c4fe40b741 100644 --- a/devTools/dictionary_phrases.txt +++ b/devTools/dictionary_phrases.txt @@ -3,7 +3,7 @@ # Phrases will be found whenever that exact phrase appears, regardless of # surroundings or overlapping. # Format is: searchPhrase#errorMessage -# Output is: Found searchPhrase; Error: errorMessage +# Output is: Found searchPhrase; Correct: errorMessage #cash +=#Should be cashX() ## cash used by corporate code, #cash -=#Should be cashX() ## too many false positives #rep +=#Should be repX() ## unused because .rep is used by facility code @@ -33,3 +33,5 @@ Coca Cola#Coca-Cola dosen't#doesn't aircrafts'#aircraft's outift#outfit +earWear#earwear +eyeWear#eyewear \ No newline at end of file diff --git a/devTools/javaSanityCheck/ignoredVariables b/devTools/javaSanityCheck/ignoredVariables index b764693d21f995865a6b0d965c2f7941b0f25dc4..834c2f6ed54c2740ff331e051d4a5a32d2756fe1 100644 --- a/devTools/javaSanityCheck/ignoredVariables +++ b/devTools/javaSanityCheck/ignoredVariables @@ -130,8 +130,6 @@ loathes obsession # corporation canFoundCorporation;startingPrice;maintenanceSlaves;room;slaveRevenue;divisionLedger;freeDevelopment;developmentCost;maintenanceCategory;corporate;roll;divisionCategories;divisionCategoriesList;getStored;setStored;endweek;hasDividend;hasPayout;perUnit;acquire -DivSurgeryFounded;DivLegal;DivWhoreDev; -AssetsDev;AssetsDevOld;AssetsSlave;AssetsSlaveOld;Div;DivArcadeFromMarket;DivBreakFromMarket;DivArcadeSlaves;DivBreakSlaves2;DivBreakSlaves;DivBreakToMarket;DivBreakToMenial;DivBreakToSurgery;DivBreakToTrain;DivExtraToArcade;DivDairySlaves;DivDairyFromMarket;DivExtraSlaves;DivExtraToBreak;DivExtraToMarket;Dividend;DivLegalSlaves;DivLegalToMarket;DivLegalToMenial;DivLegalToSurgery;DivLegalToTrain;DivMenialFromMarket;DivMenialSlaves;DivSurgerySlaves2;DivSurgerySlaves;DivSurgeryFromMarket;DivSurgeryToDairy;DivSurgeryToMarket;DivSurgeryToTrain;DivTrainFromMarket;DivTrainSlaves;DivTrainSlaves2;DivTrainToMarket;DivTrainToWhore;DivWhoreFromMarket;DivWhoreSlaves;OpCostOld;OverheadOld;ProfitOld;Rev;RevOld # porn focusedViewershipFactor unfocusedViewershipFactor diff --git a/js/002-config/fc-js-init.js b/js/002-config/fc-js-init.js index 2834aa7d3e76736ecd0aa05b8f2ecffabdcd3f8e..3fa82b1595b132ff18539cfef0d6febc6b2c8f56 100644 --- a/js/002-config/fc-js-init.js +++ b/js/002-config/fc-js-init.js @@ -17,6 +17,7 @@ App.Encyclopedia = {}; App.Encyclopedia.Entries = {}; App.Entity = {}; App.Entity.Utils = {}; +App.Events = {}; App.MainView = {}; App.UI = {}; App.UI.DOM = {}; diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js index 7e292644edde440b9367d77f7b358b7b1a00c314..d098931be339b8819473f71609a053b6c3a2625c 100644 --- a/js/003-data/gameVariableData.js +++ b/js/003-data/gameVariableData.js @@ -12,7 +12,7 @@ App.Data.defaultGameStateVariables = { releaseID: 0, // Slaves - slaveIndices: 0, + slaveIndices: {}, genePool: [], geneMods: {NCS: 0, rapidCellGrowth: 0}, missingTable: {}, @@ -89,6 +89,7 @@ App.Data.defaultGameStateVariables = { profiler: 0, realRoyalties: 0, retainCareer: 1, + ngpParams: {}, rulesAssistantAuto: 0, rulesAssistantMain: 1, seeAge: 1, @@ -210,12 +211,13 @@ App.Data.CorpInitData = { ExpandToken: 0, Spec: 0, SpecToken: 0, - SpecRaces: [], - SpecNationality: 0 + SpecRaces: [] }; // The other half of the above whitelist. However, entries in this array will be forced to the values set here upon starting NG+. App.Data.resetOnNGPlus = { + FCTV: {}, + assistant: {}, targetArcology: {fs: "New"}, readySlaves: 0, @@ -501,22 +503,6 @@ App.Data.resetOnNGPlus = { woundType: 0, /* 0:no wound, 1:mute, 2:blind, 3:amputee, 4<:health */ - showOne: 0, - showTwo: 0, - showThree: 0, - showFour: 0, - showFive: 0, - showSix: 0, - showSeven: 0, - showEight: 0, - showNine: 0, - showTen: 0, - showEleven: 0, - showTwelve: 0, - showThirteen: 0, - showFourteen: 0, - showFifteen: 0, - showSixteen: 0, reminderEntry: "", reminderWeek: "", lastWeeksCashIncome: {}, @@ -525,6 +511,7 @@ App.Data.resetOnNGPlus = { lastWeeksRepIncome: {}, lastWeeksRepExpenses: {}, lastWeeksRepProfits: {}, + lastWeeksGatheredTotals: {}, currentRule: {}, costs: 0, seeBuilding: 0, @@ -1039,8 +1026,6 @@ App.Data.resetOnNGPlus = { prisonCircuit: ["low tier criminals", "gangs and smugglers", "white collar", "military prison"], prisonCircuitIndex: 0, - fixedNationality: 0, - fixedRace: 0, ui: "start", tooltipsEnabled: 0, @@ -1065,6 +1050,7 @@ App.Data.resetOnNGPlus = { traitor: 0, traitorType: 0, traitorWeeks: 0, + traitorStats: 0, hackerSupport: 0, hostage: 0, hostageAnnounced: 0, @@ -1343,10 +1329,6 @@ App.Data.resetOnNGPlus = { /* non-vanilla shit*/ - one_time_age_overrides_pedo_mode: 0, - activeSlaveOneTimeMinAge: 0, - activeSlaveOneTimeMaxAge: 999, - oneTimeDisableDisability: 0, targetAge: 18, pubertyLength: 5, maxGrowthAge: 24, @@ -1405,7 +1387,7 @@ App.Data.resetOnNGPlus = { postSexCleanUp: 1, sideBarOptions: { - compact: 1, Cash: 1, Upkeep: 1, SexSlaveCount: 1, roomPop: 1, Rep: 1, GSP: 1, Authority: 1, Security: 1, Crime: 1 + compact: 1, Cash: 1, Upkeep: 1, SexSlaveCount: 1, roomPop: 1, Rep: 1, GSP: 1, Authority: 1, Security: 1, Crime: 1, confirmWeekEnd: 0, }, DefaultBirthDestination: "individually decided fates", abbreviateHormoneBalance: 2, diff --git a/js/003-data/miscData.js b/js/003-data/miscData.js index c0f5a0eef2669038a724a2ec248302276259dd7d..78fc7a72990346a34adb7d8658cfb053affe6301 100644 --- a/js/003-data/miscData.js +++ b/js/003-data/miscData.js @@ -2687,6 +2687,28 @@ App.Data.misc.nationalityPoolSelector = { "Brazil": App.Data.misc.southamericaNationalities }; +// these markets are exempt from law compliance +App.Data.misc.lawlessMarkets = [ + "gangs and smugglers", + "heap", + "indentures", + "low tier criminals", + "military prison", + "neighbor", + "wetware", + "white collar", + // Schools + "GRI", + "HA", + "NUL", + "SCP", + "TCR", + "TFS", + "TGA", + "TSS", + "LDE" +]; + App.Data.weather = { nice: [ {name: "Sunny", severity: 1}, diff --git a/js/random.js b/js/random.js index bd2d3220fbd94e86e9af0585e10546ba45383286..48a110f2bf95aae17796265eedf327d66a6638bd 100644 --- a/js/random.js +++ b/js/random.js @@ -1,6 +1,8 @@ /** * generate two independent Gaussian numbers using Box-Muller transform. * mean and deviation specify the desired mean and standard deviation. + * @param {number} [mean] + * @param {number} [deviation] * @returns {number[]} */ function gaussianPair(mean = 0, deviation = 1) { @@ -9,9 +11,16 @@ function gaussianPair(mean = 0, deviation = 1) { return [r * Math.cos(sigma), r * Math.sin(sigma)].map(val => val * deviation + mean); } -// Generate a random integer with a normal distribution between min and max (both inclusive). -// Default parameters result in truncating the standard normal distribution between -3 and +3. -// Not specifying min/max results in rerolling val approximately 0.3% of the time. +/** + * Generate a random integer with a normal distribution between min and max (both inclusive). + * Default parameters result in truncating the standard normal distribution between -3 and +3. + * Not specifying min/max results in rerolling val approximately 0.3% of the time. + * @param {number} [mean] + * @param {number} [deviation] + * @param {number} [min] + * @param {number} [max] + * @returns {number} + */ function normalRandInt(mean = 0, deviation = 1, min = mean - 3 * deviation, max = mean + 3 * deviation) { let val = gaussianPair(mean, deviation)[0]; while (val < min || val > max) { @@ -25,6 +34,7 @@ function normalRandInt(mean = 0, deviation = 1, min = mean - 3 * deviation, max * If count is defined, chooses that many random numbers between min and max and returns the average. This is an approximation of a normal distribution. * @param {number} min * @param {number} max + * @param {number} [count] * @returns {number} */ function jsRandom(min, max, count = 1) { @@ -62,7 +72,7 @@ function jsRandomMany(arr, count) { /** * Accepts both an array and a list, returns undefined if nothing is passed. * @param {any[]} choices - * @param {any[]} [otherChoices] + * @param {any} [otherChoices] * @returns {any} */ function jsEither(choices, ...otherChoices) { diff --git a/js/utils.js b/js/utils.js index 3a3692d0dc26bc03ea93e79d0d649fc83a4a189b..0f2594c5b465de848d6467e92182059ce22bb10a 100644 --- a/js/utils.js +++ b/js/utils.js @@ -4,12 +4,15 @@ */ /** - * Returns whether x is undefined. Port of SugarCube's def. + * Returns whether x is defined. Port of SugarCube's def. * @param {any} x * @returns {boolean} */ function jsDef(x) { - return (typeof x !== "undefined" && x !== null && x !== undefined); + if (typeof x === "undefined" || x === null || x === undefined) { + return false; + } + return true; } /** @@ -327,8 +330,6 @@ App.Utils.topologicalSort = function(keys, edges) { * Sorts by values accessible by unsorted[key] * Values of the second array must be a subset of sorted * - * O(n + m) - * * @param {Array<any>} sorted * @param {Array<object>} unsorted * @param {string} key diff --git a/slave variables documentation - Pregmod.txt b/slave variables documentation - Pregmod.txt index e3084dfc2a9c6d8e6f38b0117b02414b5325f19a..5900a574bcc702e674ce45459769119c72e57d1d 100644 --- a/slave variables documentation - Pregmod.txt +++ b/slave variables documentation - Pregmod.txt @@ -453,6 +453,14 @@ rules.living: "normal" "luxurious" +rules.rest: + +"none" - slave may be worked into exhaustion +"cruel" - slave is allowed rest when exhausted +"restrictive" - slave is allowed to rest when fatigued +"permissive" - slave is allowed to rest when tired +"mandatory" - day of rest each week to recover + rules.relationship: "restrictive" @@ -1458,7 +1466,7 @@ color of sclera "yellow" "orange" -eyeWear: +eyewear: accepts string "none" @@ -1475,7 +1483,7 @@ slave hearing -1 - hard of hearing 0 - normal -earWear: +earwear: accepts string "none" @@ -3571,7 +3579,7 @@ Has the slave gone through male puberty. scar: is an object -keys include any place on a slave body that can receive a scar, values are an object. This sub-object's keys are the kind of scar, and the property is an int showing how bad it is. +keys include any place on a slave body that can receive a scar, values are an object. This sub-object's keys are the kind of scar, and the property is an int showing how bad it is. breedingMark: diff --git a/src/002-config/Serializable.js b/src/002-config/Serializable.js index 16d26dad17d59de87c5e2f22e17e6724827a5fb3..8bad01a68b2146f4c16853f58da166558a2103cf 100644 --- a/src/002-config/Serializable.js +++ b/src/002-config/Serializable.js @@ -43,7 +43,7 @@ App.Entity.Serializable = class { */ _init(config, clean = false) { if (clean) { - App.Entity.Serializable._cleanupConfigScheme(config); + this.constructor._cleanupConfigScheme(config); } // Clone the given object's own properties into our own properties. diff --git a/src/003-assets/CSS/arcologyBuilding.css b/src/003-assets/CSS/arcologyBuilding.css index 741851cbffe41e50982924f3f474ad942b0f1b66..436aa05493712280609f373f28058bfdd96206da 100644 --- a/src/003-assets/CSS/arcologyBuilding.css +++ b/src/003-assets/CSS/arcologyBuilding.css @@ -1,173 +1,173 @@ div.building { - display: flex; - flex-direction: column; - width: 100%; + display: flex; + flex-direction: column; + width: 100%; } div.building.basement { - border-top: solid 1px #333333; - margin-top: -1px; - background-image: repeating-linear-gradient(135deg, transparent, transparent 20px, #333333 20px, #333333 30px); + border-top: solid 1px #333333; + margin-top: -1px; + background-image: repeating-linear-gradient(135deg, transparent, transparent 20px, #333333 20px, #333333 30px); } div.building div.row { - display: flex; - flex-direction: row; - width: 70%; - margin: 0 auto; - justify-content: center; + display: flex; + flex-direction: row; + width: 70%; + margin: 0 auto; + justify-content: center; } div.building div.outerCell { - /* fill cell fully, part 1: trick to fill the full height even if content is smaller */ - display: flex; - flex-direction: row; + /* fill cell fully, part 1: trick to fill the full height even if content is smaller */ + display: flex; + flex-direction: row; } div.building div.innerCell:not(.filler) { - margin: 3px; - border: 5px solid; - padding: 2px; - text-align: center; - /* fill cell fully, part 2: full width */ - width: 100%; - /* overwriting with the default background color to hide the basement indicator */ - background-color: #111; + margin: 3px; + border: 5px solid; + padding: 2px; + text-align: center; + /* fill cell fully, part 2: full width */ + width: 100%; + /* overwriting with the default background color to hide the basement indicator */ + background-color: #111; } /* introduction special formatting */ /* makes all links unusable */ .intro div.building a { - color: white; - pointer-events: none; - cursor: default; + color: white; + pointer-events: none; + cursor: default; } .intro div.building .hotkey { - display: none; + display: none; } /* penthouse formatting */ div.building div.gridWrapper { - display: grid; + display: grid; } div.building div.gridWrapper.grid1 { - grid-template-columns: 100%; + grid-template-columns: 100%; } div.building div.gridWrapper.grid2 { - grid-template-columns: repeat(2, 50%); + grid-template-columns: repeat(2, 50%); } div.building div.gridWrapper.grid3 { - grid-template-columns: repeat(3, 33.3%); + grid-template-columns: repeat(3, 33.3%); } div.building div.gridWrapper div { - display: inline flow-root; - line-height: 1.1; - padding-bottom: 0.3em; + display: inline flow-root; + line-height: 1.1; + padding-bottom: 0.3em; } div.building div.collapsed { - display: inline flow-root; - margin: 0 0.2em; + display: inline flow-root; + margin: 0 0.2em; } /* border color for each cell */ div.building div.row div.apartments { - border-color: limegreen; + border-color: limegreen; } div.building div.row div.arcade { - border-color: deeppink; + border-color: deeppink; } div.building div.row div.brothel { - border-color: violet; + border-color: violet; } div.building div.row div.barracks { - border-color: olivedrab; + border-color: olivedrab; } div.building div.row div.club { - border-color: orchid; + border-color: orchid; } div.building div.row div.corporateMarket { - border-color: purple; + border-color: purple; } div.building div.row div.dairy { - border-color: white; + border-color: white; } div.building div.row div.denseApartments { - border-color: seagreen; + border-color: seagreen; } div.building div.row div.empty { - border-color: lightgray; + border-color: lightgray; } div.building div.row div.farmyard { - border-color: brown; + border-color: brown; } div.building div.row div.fsShops { - border-color: mediumpurple; + border-color: mediumpurple; } div.building div.row div.manufacturing { - border-color: slategray; + border-color: slategray; } div.building div.row div.markets { - border-color: mediumorchid; + border-color: mediumorchid; } div.building div.row div.nursery { - border-color: deepskyblue; + border-color: deepskyblue; } div.building div.row div.luxuryApartments { - border-color: palegreen; + border-color: palegreen; } div.building div.row div.pens { - border-color: goldenrod; + border-color: goldenrod; } div.building div.row div.penthouse { - border-color: teal; + border-color: teal; } div.building div.row div.pit { - border-color: orangered; + border-color: orangered; } div.building div.row div.private { - border-color: red; + border-color: red; } div.building div.row div.shops { - border-color: thistle; + border-color: thistle; } div.building div.row div.sweatshops { - border-color: gray; + border-color: gray; } div.building div.row div.transportHub { - border-color: magenta; + border-color: magenta; } div.building div.row div.weaponsManufacturing { - border-color: springgreen; + border-color: springgreen; } div.building div.row div.filler { - border-color: transparent; + border-color: transparent; } diff --git a/src/003-assets/CSS/table.css b/src/003-assets/CSS/table.css index 260ffb48b22afba89d7fa37a5afea2f20a598f7f..2df00a8ec002373692e4e2ee1bcdf43ce5f314f7 100644 --- a/src/003-assets/CSS/table.css +++ b/src/003-assets/CSS/table.css @@ -1,26 +1,26 @@ table.wardrobe { - text-align: left; - border-collapse: separate; - border-spacing: 5px; - /*border-style: hidden;*/ - /*empty-cells: hide;*/ - width: 900px + text-align: left; + border-collapse: separate; + border-spacing: 5px; + /*border-style: hidden;*/ + /*empty-cells: hide;*/ + width: 900px } table.wardrobe td { - width: 50%; - border: 1px solid white; + width: 50%; + border: 1px solid white; } table.budget { - text-align: right; - border-collapse: separate; - width: 90%; - border-style: solid; - border-width: 1px; - border-color: white; - padding: 5px; - font-family: "monospace"; + text-align: right; + border-collapse: separate; + width: 90%; + border-style: solid; + border-width: 1px; + border-color: white; + padding: 5px; + font-family: "monospace"; } table.budget tr.colored { - background-color: #001700; + background-color: #001700; } diff --git a/src/004-base/arcologyBuilding.js b/src/004-base/arcologyBuilding.js index 1bc746514762c6588edb1ae4e9e1716a16e9ad4d..a1f141e179ac2338e8356afa8b4e6ce9e645fc9e 100644 --- a/src/004-base/arcologyBuilding.js +++ b/src/004-base/arcologyBuilding.js @@ -107,12 +107,15 @@ App.Arcology.Cell.BaseCell = class extends App.Entity.Serializable { function ownership(cell) { const fragment = document.createDocumentFragment(); const A = V.arcologies[0]; + const allCells = V.building.findCells(cell => !(cell instanceof App.Arcology.Cell.Filler)); + const ownedCells = allCells.filter(cell => cell.owner === 1).length; + const oneCellPercentage = ((1 / allCells.length) * 100).toPrecision(3); const price = 1000 * Math.trunc(A.prosperity * (1 + (A.demandFactor / 100))); if (cell.owner === 1) { - fragment.append(`Selling this sector would relinquish a 4% interest in ${A.name}. Such an interest is worth ${cashFormat(price)}.`); + fragment.append(`Selling this sector would relinquish a ${oneCellPercentage}% interest in ${A.name}. Such an interest is worth ${cashFormat(price)}.`); - if (A.ownership >= 4) { + if (ownedCells > 1) { const span = document.createElement("span"); span.classList.add("clear-formatting"); span.append(App.UI.DOM.passageLink("Sell", "Main", @@ -125,8 +128,9 @@ App.Arcology.Cell.BaseCell = class extends App.Entity.Serializable { fragment.append(" ", span); } } else { - fragment.append(`You will have to acquire an additional 4% interest in ${A.name} to take control of this sector. Such an interest is worth ${cashFormat(price)} and will require a transaction cost of ${cashFormat(10000)} to acquire for a total cost of ${cashFormat(price + 10000)}.`); - if (A.ownership + A.minority <= 96) { + fragment.append(`You will have to acquire an additional ${oneCellPercentage}% interest in ${A.name} to take control of this sector. Such an interest is worth ${cashFormat(price)} and will require a transaction cost of ${cashFormat(10000)} to acquire for a total cost of ${cashFormat(price + 10000)}.`); + const availableCells = allCells.length * ((100-A.minority)/100) - ownedCells; + if (availableCells >= 1) { const buySpan = document.createElement("span"); buySpan.classList.add("clear-formatting"); buySpan.append(App.UI.DOM.passageLink("Buy", "Main", @@ -140,10 +144,10 @@ App.Arcology.Cell.BaseCell = class extends App.Entity.Serializable { if (V.rep >= 18000) { const repDiv = document.createElement("div"); - repDiv.classList.add("choices", "clear-formatting"); + repDiv.classList.add("clear-formatting"); const repPrice = Math.clamp(price / 2, 0, 18000); - repDiv.append("You have so much political capital that you can spend reputation to acquire ownership by spending reputation.", + repDiv.append("You have so much political capital that you can spend reputation to acquire ownership by spending reputation. ", App.UI.DOM.passageLink("Use reputation", "Main", () => { repX(-(repPrice), "capEx"); diff --git a/src/Corporation/corporate-constants.js b/src/Corporation/corporate-constants.js index 4ab47e4d1f9c592ed25c4fee8637ff6fcdda9dbe..ea8eb7b91ec27241305eab4c05da4a99376d5b7d 100644 --- a/src/Corporation/corporate-constants.js +++ b/src/Corporation/corporate-constants.js @@ -53,7 +53,7 @@ App.Corporate.InitConstants = function() { corporateCash: Defines how much it costs the player to *found the corporation* with this department with a 2-to-1 split, in thousands. This will be the corporation's starting cash, from which the development and slaves will be purchased. startingSize: How developed the department is upon founding, including how many active slaves the department starts with (Note that acquiring divisions don't start with slaves) merger: A list of companies that can be purchased during the merger event. The event will collect all of these company objects associated with owned divisions and pick some at random. - name: The generic name of the company that is being purchased. This will have "the" put in front of it, so it must fit with the sentance "The {name} will be bought." + name: The generic name of the company that is being purchased. This will have "the" put in front of it, so it must fit with the sentence "The {name} will be bought." cost: How much, in thousands, it will cost to purchase this company. Default: 50. text: An object with the flavor text of the event. trouble: A description of the company and its troubles. Will be in the sentence "The first company is {trouble}" @@ -111,7 +111,7 @@ App.Corporate.InitConstants = function() { 'maintenance':{ 'linear': 7.5, 'quadratic': 5, - 'category':'acquision', + 'category':'acquisition', }, 'founding':{ 'corporateCash':100, @@ -151,7 +151,7 @@ App.Corporate.InitConstants = function() { 'maintenance':{ 'linear': 12, 'quadratic': 6, - 'category':'acquision', + 'category':'acquisition', }, 'founding':{ 'corporateCash':125, @@ -512,7 +512,7 @@ App.Corporate.InitConstants = function() { App.Corporate.maintenance = { divisionCategoriesList: [ { - id:'acquision', + id:'acquisition', freeDivisions: 0, divisionCost: 25000, freeDevelopment: 100, diff --git a/src/Corporation/corporate-divisionProcessing.js b/src/Corporation/corporate-divisionProcessing.js index 368a8f5f010a74833c8cc6d29d13c5fabc27c9de..719dac292fc015dec1dc4064a25490a2060a7f31 100644 --- a/src/Corporation/corporate-divisionProcessing.js +++ b/src/Corporation/corporate-divisionProcessing.js @@ -75,7 +75,6 @@ App.Corporate.Init_DivisionProcessing = function(shared) { delete V.corp[this._const.corpId + "Slaves2"]; } - get foundingCostSlaves() { return this._const.founding.size * this.purchasedSlaveValue; } get foundingCost() { return this.foundingCostDivision + this.foundingCostSlaves; } create() { diff --git a/src/Corporation/corporate.js b/src/Corporation/corporate.js index decdce36585e77844b702f99083979c504b91e19..9fd85d7976843558787b461a2ad161c6e3d1a662 100644 --- a/src/Corporation/corporate.js +++ b/src/Corporation/corporate.js @@ -1,4 +1,3 @@ - window.averageRange = class { constructor({center, range}) { this._const = { @@ -834,7 +833,7 @@ App.Corporate.Init = function() { // todo: Make a switch to allow the user to control purchasing behavior. // todo: Expensive first // todo: Cheapest first - // Even purchase requsts: + // Even purchase requests: let purchaseValues = evenFillArray(Object.values(ledger.divisionLedgers) .filter(divLedger=>divLedger.market.buy > 0) , this.cash diff --git a/src/Corporation/corporateMarket.tw b/src/Corporation/corporateMarket.tw index 15f32aaa8a1f55e16320dacc1503789ce66e14e6..47706c426413fa25b79aab001b2297ba05ed6634 100644 --- a/src/Corporation/corporateMarket.tw +++ b/src/Corporation/corporateMarket.tw @@ -1,10 +1,10 @@ :: Corporate Market [nobr] -<<set $nextButton = "Back", $nextLink = "Main">> +<<set $nextButton = "Back", $nextLink = "Main", $slaveMarket = "corporate">> /* Multi-Purchase Support */ <<if ndef $newSlaves>><<set $newSlaves = []>><</if>> <<if $newSlaves.length > 0>> - <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $slaveMarket = "corporate", $returnTo = "Main", $newSlaveIndex = 0>> + <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $returnTo = "Main", $newSlaveIndex = 0>> <</if>> <<if $corp.SpecGender == 2>> @@ -45,7 +45,7 @@ sales<<if $corp.SpecAge == 3>>_womanU<<else>>_girlU<</if>> in a slutty suit gree <<if $corp.SpecNationality>> <<set _corpSpecRace = $corp.SpecNationality>> <<elseif ($corp.SpecRaces.length == 1)>> - <<set _corpSpecRace = $corp.SpecRaces.random()>> + <<set _corpSpecRace = $corp.SpecRaces.random()>> <</if>> _HeU's <<print _corpSpecRace>>, of course<<if $corp.SpecAccent == 1>>, and has a cute accent<</if>>. <</if>> @@ -65,7 +65,9 @@ Of course, you know all about the corporation, but sales<<if $corp.SpecAge == 3> _HeU explains that the corporation captures many people, so it only retains and trains those that fit its product lines. -<<= generateMarketSlave("corporate")>> +<<set _marketResult = generateMarketSlave("corporate")>> +<<set $activeSlave = _marketResult.slave>> +<<print _marketResult.text>> <br><br> _HisU presentation done, the diff --git a/src/Corporation/manageCorporation.tw b/src/Corporation/manageCorporation.tw index da8a928c6dd9dc598a38634e4840b18166b303b3..574df4cd6f297d070be07b203cbf0b732cfbf1f3 100644 --- a/src/Corporation/manageCorporation.tw +++ b/src/Corporation/manageCorporation.tw @@ -776,7 +776,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecNationality>> The corporation trains slaves who are $corp.SpecNationality. <<if $corp.SpecTimer == 0>> - <<link "No Focus">><<unset $corp.SpecNationality>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecNationality>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -784,12 +784,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecGender == 1>> The corporation trains slaves with pussies. <<if $corp.SpecTimer == 0>> - <<link "No Focus">><<unset $corp.SpecGender>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecGender>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecGender == 2>> <br>The corporation trains slaves with dicks. <<if $corp.SpecTimer == 0>> - <<link "No Focus">><<unset $corp.SpecGender>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecGender>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -797,7 +797,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecHeight == 1>> The corporation is targeting tiny slaves. <<if $corp.SpecTimer == 0>> - [[Short Slaves|Manage Corporation][$corp.SpecHeight = 2, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecHeight>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Short Slaves|Manage Corporation][$corp.SpecHeight = 2, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecHeight>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecHeight == 2>> The corporation is targeting short slaves. @@ -805,7 +805,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecToken > 0 && ($corp.DivExtraDev + $corp.DivLegalDev) > 50>> [[Tiny Slaves|Manage Corporation][$corp.SpecHeight = 1, $corp.SpecToken -= 1, $corp.SpecTimer = 2]] | <</if>> - <<link "No Focus">><<unset $corp.SpecHeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecHeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecHeight == 4>> The corporation is targeting tall slaves. @@ -813,12 +813,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecToken > 0 && ($corp.DivExtraDev + $corp.DivLegalDev) > 50>> [[Giant Slaves|Manage Corporation][$corp.SpecHeight = 5, $corp.SpecToken -= 1, $corp.SpecTimer = 2]] | <</if>> - <<link "No Focus">><<unset $corp.SpecHeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecHeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecHeight == 5>> The corporation is targeting giant slaves. <<if $corp.SpecTimer == 0>> - [[Tall Slaves|Manage Corporation][$corp.SpecHeight = 4, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecHeight>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Tall Slaves|Manage Corporation][$corp.SpecHeight = 4, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecHeight>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -826,7 +826,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecVirgin == 1>> The corporation is ensuring slaves remain virgins. <<if $corp.SpecTimer == 0>> - <<link "No Focus">><<unset $corp.SpecVirgin>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecVirgin>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -834,7 +834,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecTrust == 1>> The corporation is breaking slaves with extreme brutality. <<if $corp.SpecTimer == 0>> - [[Apply Less Brutality|Manage Corporation][$corp.SpecTrust = 2, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecTrust>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Apply Less Brutality|Manage Corporation][$corp.SpecTrust = 2, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecTrust>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> /*Don't think this deserves the added cost of a token, unlike the 'utmost care' one*/ <<elseif $corp.SpecTrust == 2>> The corporation is breaking slaves with brutality. @@ -842,7 +842,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecToken > 0 && $arcologies[0].FSDegradationist > 20 && $corp.DivBreakDev > 50>> [[Apply Extreme Brutality|Manage Corporation][$corp.SpecTrust = 1, $corp.SpecTimer = 2]] | <</if>> - <<link "No Focus">><<unset $corp.SpecTrust>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecTrust>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecTrust == 4>> The corporation is breaking slaves with care. @@ -850,12 +850,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecToken > 0 && $arcologies[0].FSPaternalist > 20 && $corp.DivBreakDev > 50>> [[Use the Utmost Care|Manage Corporation][$corp.SpecTrust = 5, $corp.SpecToken += 1, $corp.SpecTimer == 2]] | <</if>> - <<link "No Focus">><<unset $corp.SpecTrust>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecTrust>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecTrust == 5>> The corporation is breaking slaves with the utmost care. <<if $corp.SpecTimer == 0>> - [[Use Less Care|Manage Corporation][$corp.SpecTrust = 4, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecTrust>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Use Less Care|Manage Corporation][$corp.SpecTrust = 4, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecTrust>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -863,7 +863,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecWeight == 1>> The corporation makes slaves follow incredibly strict diets. <<if $corp.SpecTimer == 0>> - [[Apply Looser Diet|Manage Corporation][$corp.SpecWeight = 2, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Apply Looser Diet|Manage Corporation][$corp.SpecWeight = 2, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecWeight == 2>> The corporation makes slaves diet. @@ -871,12 +871,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecToken > 0 && $arcologies[0].FSHedonisticDecadence == "unset">> [[Apply Strict Diet|Manage Corporation][$corp.SpecWeight = 1, $corp.SpecTimer = 2]] | <</if>> - [[Aim for Healthy Weight|Manage Corporation][$corp.SpecWeight = 3, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Aim for Healthy Weight|Manage Corporation][$corp.SpecWeight = 3, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecWeight == 3>> The corporation is aiming for slaves with a healthy weight. <<if $corp.SpecTimer == 0>> - [[Apply Diet|Manage Corporation][$corp.SpecWeight = 2, $corp.SpecTimer = 2]] | [[Plump up Slaves|Manage Corporation][$corp.SpecWeight = 5, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Apply Diet|Manage Corporation][$corp.SpecWeight = 2, $corp.SpecTimer = 2]] | [[Plump up Slaves|Manage Corporation][$corp.SpecWeight = 5, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> /*Perhaps 'plump up' is not the right phrase*/ <<elseif $corp.SpecWeight == 5>> The corporation aims for plump slaves. @@ -884,12 +884,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecToken > 0 && $arcologies[0].FSPhysicalIdealist == "unset">> [[Fatten Slaves|Manage Corporation][$corp.SpecWeight = 6, $corp.SpecTimer = 2]] | <</if>> - [[Aim for Healthy Weight|Manage Corporation][$corp.SpecWeight = 3, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Aim for Healthy Weight|Manage Corporation][$corp.SpecWeight = 3, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecWeight == 6>> The corporation aims for fat slaves. <<if $corp.SpecTimer == 0>> - [[Settle for Plump|Manage Corporation][$corp.SpecWeight = 5, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Settle for Plump|Manage Corporation][$corp.SpecWeight = 5, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -897,7 +897,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecMuscle == 1>> The corporation aims to have frail slaves. <<if $corp.SpecTimer == 0>> - [[Aim for Weak|Manage Corporation][$corp.SpecMuscle = 2, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecMuscle>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Aim for Weak|Manage Corporation][$corp.SpecMuscle = 2, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecMuscle>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecMuscle == 2>> /*Don't think this deserves the added cost of a token, unlike slaves getting ripped*/ The corporation aims to have weak slaves. @@ -905,7 +905,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $arcologies[0].FSPhysicalIdealist == "unset">> [[Aim for Frail|Manage Corporation][$corp.SpecMuscle = 1, $corp.SpecTimer = 2]] | <</if>> - [[Aim for Soft|Manage Corporation][$corp.SpecMuscle = 3, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Aim for Soft|Manage Corporation][$corp.SpecMuscle = 3, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecMuscle == 3>> The corporation is aiming for slaves with soft muscles. @@ -913,7 +913,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $arcologies[0].FSPhysicalIdealist == "unset">> [[Aim for Weak|Manage Corporation][$corp.SpecMuscle = 2, $corp.SpecTimer = 2]] | <</if>> - [[Aim for Toned|Manage Corporation][$corp.SpecMuscle = 4, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Aim for Toned|Manage Corporation][$corp.SpecMuscle = 4, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecMuscle == 4>> The corporation aims for toned muscles. @@ -921,12 +921,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecToken > 0 && ($corp.DivBreakDev + $corp.DivSurgeryDev + $corp.DivTrainDev > 100)>> [[Aim for Ripped|Manage Corporation][$corp.SpecMuscle = 5, $corp.SpecToken -= 1, $corp.SpecTimer = 2]] | <</if>> - [[Aim for Soft|Manage Corporation][$corp.SpecMuscle = 3, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Aim for Soft|Manage Corporation][$corp.SpecMuscle = 3, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecWeight>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecMuscle == 5>> The corporation aims for ripped slaves. <<if $corp.SpecTimer == 0>> - [[Aim for Toned|Manage Corporation][$corp.SpecMuscle = 4, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecWeight>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Aim for Toned|Manage Corporation][$corp.SpecMuscle = 4, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecWeight>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -934,12 +934,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecDevotion == 1>> The corporation keeps slaves extremely defiant. <<if $corp.SpecTimer == 0>> - [[Less Defiant|Manage Corporation][$corp.SpecDevotion = 2, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecDevotion>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Less Defiant|Manage Corporation][$corp.SpecDevotion = 2, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecDevotion>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> /*Don't think this deserves the added cost of a token, unlike the 'devoted' one*/ <<elseif $corp.SpecDevotion == 2>> The corporation keeps slaves reluctant. <<if $corp.SpecTimer == 0>> - [[Make them Defiant|Manage Corporation][$corp.SpecDevotion = 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecDevotion>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Make them Defiant|Manage Corporation][$corp.SpecDevotion = 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecDevotion>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecDevotion == 4>> The corporation is fostering obedience. @@ -947,12 +947,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecToken > 0 && $corp.DivTrainDev > 100>> [[Foster Devotion|Manage Corporation][$corp.SpecDevotion = 5, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <</if>> - <<link "No Focus">><<unset $corp.SpecDevotion>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecDevotion>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecDevotion == 5>> The corporation is fostering devotion. <<if $corp.SpecTimer == 0>> - [[Settle for Obedience|Manage Corporation][$corp.SpecDevotion = 4, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecDevotion>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Settle for Obedience|Manage Corporation][$corp.SpecDevotion = 4, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecDevotion>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -960,12 +960,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecIntelligence == 1>> The corporation keeps stupid slaves. <<if $corp.SpecTimer == 0>> - <<link "No Focus">><<unset $corp.SpecIntelligence>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecIntelligence>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecIntelligence == 3>> The corporation keeps intelligent slaves. <<if $corp.SpecTimer == 0>> - <<link "No Focus">><<unset $corp.SpecIntelligence>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecIntelligence>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -973,12 +973,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecAge == 1>> The corporation focuses on young slaves. <<if $corp.SpecTimer == 0>> - <<link "No Focus">><<unset $corp.SpecAge>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecAge>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecAge == 3>> The corporation focuses on older slaves. <<if $corp.SpecTimer == 0>> - <<link "No Focus">><<unset $corp.SpecAge>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecAge>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -986,12 +986,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecAccent == 1>> The corporation teaches slaves to speak the lingua franca. <<if $corp.SpecTimer == 0>> - [[Eliminate Accents|Manage Corporation][$corp.SpecAccent = 2, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecAccent>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Eliminate Accents|Manage Corporation][$corp.SpecAccent = 2, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecAccent>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecAccent == 2>> The corporation teaches slaves to speak the lingua franca without an accent. <<if $corp.SpecTimer == 0>> - [[Just Teach Language|Manage Corporation][$corp.SpecAccent = 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecAccent>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Just Teach Language|Manage Corporation][$corp.SpecAccent = 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecAccent>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -1002,7 +1002,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecToken > 0>> [[Basic Education|Manage Corporation][$corp.SpecEducation = 1, $corp.SpecTimer = 2]] | <</if>> - <<link "No Focus">><<unset $corp.SpecEducation>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecEducation>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecEducation == 1>> The corporation makes sure all slaves have a basic education. @@ -1010,12 +1010,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.DivTrainDev > 200 && $corp.SpecToken > 0>> [[Advanced Education|Manage Corporation][$corp.SpecEducation = 2, $corp.SpecToken -= 1, $corp.SpecTimer = 2]] | <</if>> - [[No Education|Manage Corporation][$corp.SpecEducation = 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecEducation>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[No Education|Manage Corporation][$corp.SpecEducation = 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecEducation>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecEducation == 2>> The corporation makes sure all slaves have an advanced education. <<if $corp.SpecTimer == 0>> - [[Basic Education|Manage Corporation][$corp.SpecEducation = 1, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecEducation>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Basic Education|Manage Corporation][$corp.SpecEducation = 1, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecEducation>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -1023,7 +1023,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecCosmetics == 1>> The corporation applies straightforward cosmetic procedures. <<if $corp.SpecTimer == 0>> - <<link "No Focus">><<unset $corp.SpecCosmetics>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecCosmetics>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecCosmetics == 0>> The corporation doesn't apply cosmetic procedures. @@ -1031,7 +1031,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecToken > 0>> [[Applied|Manage Corporation][$corp.SpecCosmetics = 1, $corp.SpecToken -= 1, $corp.SpecTimer = 2]] | <</if>> - <<link "No Focus">><<unset $corp.SpecCosmetics>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecCosmetics>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -1042,12 +1042,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.DivSurgeryDev > 100 && $corp.SpecToken > 0>> [[Absurd Implants|Manage Corporation][$corp.SpecImplants = 2, $corp.SpecToken -= 1, $corp.SpecTimer = 2]] | <</if>> - <<link "No Focus">><<unset $corp.SpecImplants>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecImplants>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecImplants == 2>> The corporation applies absurd implants to all slaves. <<if $corp.SpecTimer == 0>> - [[Tasteful Implants|Manage Corporation][$corp.SpecImplants = 1, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecImplants>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Tasteful Implants|Manage Corporation][$corp.SpecImplants = 1, $corp.SpecToken += 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecImplants>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecImplants == 0>> The corporation keeps their slaves entirely implant free. @@ -1055,7 +1055,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecToken > 0>> [[Tasteful Implants|Manage Corporation][$corp.SpecImplants = 1, $corp.SpecToken -= 1, $corp.SpecTimer = 2]] | <</if>> - <<link "No Focus">><<unset $corp.SpecImplants>><<set $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecImplants>><<set $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -1068,12 +1068,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecPussy == 1>> The corporation adds a pussy to all slaves. <<if $corp.SpecTimer == 0>> - <<link "Stop">><<unset $corp.SpecPussy>><<set $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "Stop">><<run delete $corp.SpecPussy>><<set $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecPussy == -1>> The corporation removes pussies from all slaves. <<if $corp.SpecTimer == 0>> - <<link "Stop">><<unset $corp.SpecPussy>><<set $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "Stop">><<run delete $corp.SpecPussy>><<set $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<else>> The corporation has no plans for pussies. @@ -1086,12 +1086,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecDick == 1>> The corporation adds a dick to all slaves. <<if $corp.SpecTimer == 0>> - <<link "Stop">><<unset $corp.SpecDick>><<set $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "Stop">><<run delete $corp.SpecDick>><<set $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecDick == -1>> The corporation removes dicks from all slaves. <<if $corp.SpecTimer == 0>> - <<link "Stop">><<unset $corp.SpecDick>><<set $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "Stop">><<run delete $corp.SpecDick>><<set $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<else>> The corporation has no plans for dicks. @@ -1104,12 +1104,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecBalls == 1>> The corporation adds balls to all slaves (penis required). <<if $corp.SpecTimer == 0>> - <<link "Stop">><<unset $corp.SpecBalls>><<set $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "Stop">><<run delete $corp.SpecBalls>><<set $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecBalls == -1>> The corporation removes balls from all slaves. <<if $corp.SpecTimer == 0>> - <<link "Stop">><<unset $corp.SpecBalls>><<set $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "Stop">><<run delete $corp.SpecBalls>><<set $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<else>> The corporation has no plans for balls. @@ -1123,12 +1123,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecInjection == 1>> The corporation aims for petite assets. <<if $corp.SpecTimer == 0>> - [[Tasteful Size|Manage Corporation][$corp.SpecInjection = 2, $corp.SpecTimer = 2]] | [[Huge Size|Manage Corporation][$corp.SpecInjection = 3, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecInjection>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Tasteful Size|Manage Corporation][$corp.SpecInjection = 2, $corp.SpecTimer = 2]] | [[Huge Size|Manage Corporation][$corp.SpecInjection = 3, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecInjection>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecInjection == 2>> The corporation aims for tasteful assets. <<if $corp.SpecTimer == 0>> - [[Small Size|Manage Corporation][$corp.SpecInjection = 1, $corp.SpecTimer = 2]] | [[Huge Size|Manage Corporation][$corp.SpecInjection = 3, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecInjection>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Small Size|Manage Corporation][$corp.SpecInjection = 1, $corp.SpecTimer = 2]] | [[Huge Size|Manage Corporation][$corp.SpecInjection = 3, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecInjection>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecInjection == 3>> The corporation aims for huge assets. @@ -1140,7 +1140,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.DivDairyDev > 200 && $corp.SpecToken > 0>> | [[Pastoral Size|Manage Corporation][$corp.SpecInjection = 5, $corp.SpecToken -= 1, $corp.SpecTimer = 2]] | <</if>> - <<link "No Focus">><<unset $corp.SpecInjection>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecInjection>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecInjection == 4>> The corporation aims for supermassive assets. @@ -1149,7 +1149,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.DivDairyDev > 200>> [[Pastoral Size|Manage Corporation][$corp.SpecInjection = 5, $corp.SpecTimer = 2]] | <</if>> - <<link "No Focus">><<unset $corp.SpecInjection>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecInjection>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecInjection == 5>> The corporation aims for pastoral assets. @@ -1158,7 +1158,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.DivSurgeryDev > 50>> [[Supermassive Size|Manage Corporation][$corp.SpecInjection = 4, $corp.SpecTimer = 2]] | <</if>> - <<link "No Focus">><<unset $corp.SpecInjection>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecInjection>><<set $corp.SpecToken += 2, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -1166,12 +1166,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecHormones == 1>> The corporation feminizes slaves with hormones. <<if $corp.SpecTimer == 0>> - [[Masculinize|Manage Corporation][$corp.SpecHormones = 2, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecHormones>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Masculinize|Manage Corporation][$corp.SpecHormones = 2, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecHormones>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecHormones == 2>> The corporation masculinize slaves with hormones. <<if $corp.SpecTimer == 0>> - [[Feminize|Manage Corporation][$corp.SpecHormones = 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecHormones>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Feminize|Manage Corporation][$corp.SpecHormones = 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecHormones>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -1179,7 +1179,7 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecAmputee == 1>> The corporation removes all limbs from its slaves. <<if $corp.SpecTimer == 0>> - <<link "Stop">><<unset $corp.SpecAmputee>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "Stop">><<run delete $corp.SpecAmputee>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -1187,12 +1187,12 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecMilk == 1>> The corporation makes sure all slaves are naturally lactating. <<if $corp.SpecTimer == 0>> - [[Lactation Implant|Manage Corporation][$corp.SpecMilk = 2, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecMilk>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Lactation Implant|Manage Corporation][$corp.SpecMilk = 2, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecMilk>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecMilk == 2>> The corporation equips all slaves with lactation implants. <<if $corp.SpecTimer == 0>> - [[Natural Lactation|Manage Corporation][$corp.SpecMilk = 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecMilk>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Natural Lactation|Manage Corporation][$corp.SpecMilk = 1, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecMilk>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> @@ -1203,17 +1203,17 @@ You own <<print num($personalShares)>> shares while another <<print num($publicS <<if $corp.SpecToken > 0 && $corp.DivWhoreDev > 200>> [[Advanced Training|Manage Corporation][$corp.SpecSexEd = 2, $corp.SpecToken -= 1, $corp.SpecTimer = 2]] | <</if>> - <<link "No Focus">><<unset $corp.SpecSexEd>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + <<link "No Focus">><<run delete $corp.SpecSexEd>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecSexEd == 2>> The corporation teaches advanced sexual techniques to its slaves. <<if $corp.SpecTimer == 0>> - [[Basic Training|Manage Corporation][$corp.SpecSexEd = 1, $corp.SpecToken +=1, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecSexEd>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Basic Training|Manage Corporation][$corp.SpecSexEd = 1, $corp.SpecToken +=1, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecSexEd>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <<elseif $corp.SpecSexEd == 0>> The corporation teaches no sexual techniques to its slaves. <<if $corp.SpecTimer == 0>> - [[Basic Training|Manage Corporation][$corp.SpecSexEd = 1, $corp.SpecToken -=1, $corp.SpecTimer = 2]] | <<link "No Focus">><<unset $corp.SpecSexEd>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> + [[Basic Training|Manage Corporation][$corp.SpecSexEd = 1, $corp.SpecToken -=1, $corp.SpecTimer = 2]] | <<link "No Focus">><<run delete $corp.SpecSexEd>><<set $corp.SpecToken += 1, $corp.SpecTimer = 2>><<goto "Manage Corporation">><</link>> <</if>> <</if>> </div> diff --git a/src/SecExp/SecExpBackwardCompatibility.tw b/src/Mods/SecExp/SecExpBackwardCompatibility.tw similarity index 99% rename from src/SecExp/SecExpBackwardCompatibility.tw rename to src/Mods/SecExp/SecExpBackwardCompatibility.tw index c7f0d95dab5f6cc9eff125a5ad8f750c861b67c0..92f7d31b385d4186f0fba6711a369524e3b2e945 100644 --- a/src/SecExp/SecExpBackwardCompatibility.tw +++ b/src/Mods/SecExp/SecExpBackwardCompatibility.tw @@ -3,7 +3,7 @@ <<set $nextButton = "Continue", $nextLink = "Main", $returnTo = "Main">> /* base stats */ -<<= App.SecExp.Check.general()>> +<<run App.SecExp.Check.general()>> <<if ndef $attackType>> <<set $attackType = "none">> <</if>> diff --git a/src/SecExp/attackGenerator.tw b/src/Mods/SecExp/attackGenerator.tw similarity index 100% rename from src/SecExp/attackGenerator.tw rename to src/Mods/SecExp/attackGenerator.tw diff --git a/src/SecExp/attackHandler.tw b/src/Mods/SecExp/attackHandler.tw similarity index 100% rename from src/SecExp/attackHandler.tw rename to src/Mods/SecExp/attackHandler.tw diff --git a/src/SecExp/attackOptions.tw b/src/Mods/SecExp/attackOptions.tw similarity index 100% rename from src/SecExp/attackOptions.tw rename to src/Mods/SecExp/attackOptions.tw diff --git a/src/SecExp/attackReport.tw b/src/Mods/SecExp/attackReport.tw similarity index 100% rename from src/SecExp/attackReport.tw rename to src/Mods/SecExp/attackReport.tw diff --git a/src/SecExp/authorityReport.tw b/src/Mods/SecExp/authorityReport.tw similarity index 100% rename from src/SecExp/authorityReport.tw rename to src/Mods/SecExp/authorityReport.tw diff --git a/src/SecExp/propagandaHub.tw b/src/Mods/SecExp/buildings/propagandaHub.tw similarity index 100% rename from src/SecExp/propagandaHub.tw rename to src/Mods/SecExp/buildings/propagandaHub.tw diff --git a/src/SecExp/riotControlCenter.tw b/src/Mods/SecExp/buildings/riotControlCenter.tw similarity index 100% rename from src/SecExp/riotControlCenter.tw rename to src/Mods/SecExp/buildings/riotControlCenter.tw diff --git a/src/SecExp/secBarracks.tw b/src/Mods/SecExp/buildings/secBarracks.tw similarity index 100% rename from src/SecExp/secBarracks.tw rename to src/Mods/SecExp/buildings/secBarracks.tw diff --git a/src/SecExp/securityHQ.tw b/src/Mods/SecExp/buildings/securityHQ.tw similarity index 100% rename from src/SecExp/securityHQ.tw rename to src/Mods/SecExp/buildings/securityHQ.tw diff --git a/src/SecExp/transportHub.tw b/src/Mods/SecExp/buildings/transportHub.tw similarity index 100% rename from src/SecExp/transportHub.tw rename to src/Mods/SecExp/buildings/transportHub.tw diff --git a/src/SecExp/weaponsManufacturing.tw b/src/Mods/SecExp/buildings/weaponsManufacturing.tw similarity index 98% rename from src/SecExp/weaponsManufacturing.tw rename to src/Mods/SecExp/buildings/weaponsManufacturing.tw index ff8d0e1711efd2430ffb154ba8c79bc224250f86..18f85d8d7740e009562d3e650445943a7dfe35b7 100644 --- a/src/SecExp/weaponsManufacturing.tw +++ b/src/Mods/SecExp/buildings/weaponsManufacturing.tw @@ -195,12 +195,12 @@ With our current industrial and research capabilities upgrades will be finished <<if $currentUpgrade.time <= 0>> <br>Security Drones: - <<if $secBotsBaseDefense <= 3 || $droneUpgrades >= 3>> + <<if $weapLab < 3>> Upgrade the research facility further to unlock more upgrades for the security drones. - <br><br> - <<else>> + <<elseif $completedUpgrades.includesAll(-1, -2, -3)>> You have fully upgraded the security drones. <</if>> + <<if !$completedUpgrades.includesAll(-1, -2, -3)>> <br> <</if>> /* Drones upgrades */ <<if !$completedUpgrades.includes(-1)>> <<link "Develop dynamic battle aware AI">> @@ -240,7 +240,7 @@ With our current industrial and research capabilities upgrades will be finished <</link>> <br>//Will take _time weeks, cost <<print cashFormat(30000)>> and will increase the base hp value of the security drones.// <</if>> - <<if $secBotsBaseDefense <= 3 || $droneUpgrades >= 3>> <br> <</if>> + <<if !$completedUpgrades.includesAll(-1, -2, -3)>> <br> <</if>> /* human troops upgrades */ <br>Troops: diff --git a/src/SecExp/edicts.tw b/src/Mods/SecExp/edicts.tw similarity index 100% rename from src/SecExp/edicts.tw rename to src/Mods/SecExp/edicts.tw diff --git a/src/SecExp/encyclopediaSecExpBattles.tw b/src/Mods/SecExp/encyclopediaSecExpBattles.tw similarity index 100% rename from src/SecExp/encyclopediaSecExpBattles.tw rename to src/Mods/SecExp/encyclopediaSecExpBattles.tw diff --git a/src/SecExp/encyclopediaSecExpMain.tw b/src/Mods/SecExp/encyclopediaSecExpMain.tw similarity index 100% rename from src/SecExp/encyclopediaSecExpMain.tw rename to src/Mods/SecExp/encyclopediaSecExpMain.tw diff --git a/src/SecExp/js/secExp.js b/src/Mods/SecExp/js/secExp.js similarity index 100% rename from src/SecExp/js/secExp.js rename to src/Mods/SecExp/js/secExp.js diff --git a/src/SecExp/js/secExpState.js b/src/Mods/SecExp/js/secExpState.js similarity index 100% rename from src/SecExp/js/secExpState.js rename to src/Mods/SecExp/js/secExpState.js diff --git a/src/SecExp/proclamations.tw b/src/Mods/SecExp/proclamations.tw similarity index 100% rename from src/SecExp/proclamations.tw rename to src/Mods/SecExp/proclamations.tw diff --git a/src/SecExp/rebellionEvents.tw b/src/Mods/SecExp/rebellionEvents.tw similarity index 100% rename from src/SecExp/rebellionEvents.tw rename to src/Mods/SecExp/rebellionEvents.tw diff --git a/src/SecExp/rebellionGenerator.tw b/src/Mods/SecExp/rebellionGenerator.tw similarity index 100% rename from src/SecExp/rebellionGenerator.tw rename to src/Mods/SecExp/rebellionGenerator.tw diff --git a/src/SecExp/rebellionHandler.tw b/src/Mods/SecExp/rebellionHandler.tw similarity index 100% rename from src/SecExp/rebellionHandler.tw rename to src/Mods/SecExp/rebellionHandler.tw diff --git a/src/SecExp/rebellionOptions.tw b/src/Mods/SecExp/rebellionOptions.tw similarity index 100% rename from src/SecExp/rebellionOptions.tw rename to src/Mods/SecExp/rebellionOptions.tw diff --git a/src/SecExp/rebellionReport.tw b/src/Mods/SecExp/rebellionReport.tw similarity index 100% rename from src/SecExp/rebellionReport.tw rename to src/Mods/SecExp/rebellionReport.tw diff --git a/src/SecExp/secExpSmilingMan.tw b/src/Mods/SecExp/secExpSmilingMan.tw similarity index 100% rename from src/SecExp/secExpSmilingMan.tw rename to src/Mods/SecExp/secExpSmilingMan.tw diff --git a/src/SecExp/securityReport.tw b/src/Mods/SecExp/securityReport.tw similarity index 100% rename from src/SecExp/securityReport.tw rename to src/Mods/SecExp/securityReport.tw diff --git a/src/SecExp/seeUnit.tw b/src/Mods/SecExp/seeUnit.tw similarity index 98% rename from src/SecExp/seeUnit.tw rename to src/Mods/SecExp/seeUnit.tw index e8130c37634b5fe313ac160e264bf7fefa1be652..57ae1e59f1e1e44161ba4b91c41f9d320c94a35c 100644 --- a/src/SecExp/seeUnit.tw +++ b/src/Mods/SecExp/seeUnit.tw @@ -108,7 +108,7 @@ <br> <<link "Attach commissars to the unit" "seeUnit">> <<set $militiaUnits[$targetIndex].commissars = 1>> - <<run cashX(forceNeg($equipUpgradeCost * $militiaUnits[$targetIndex].maxTroops + 1000), "specialForces")>> + <<run cashX(forceNeg($equipUpgradeCost * $militiaUnits[$targetIndex].maxTroops + 1000), "securityExpansion")>> <</link>> Attach a small squad of commissars to the unit. <br>//Costs <<print cashFormat(($equipUpgradeCost * $militiaUnits[$targetIndex].maxTroops) + 1000)>> and will slowly increase the loyalty of the unit.// @@ -116,7 +116,7 @@ <br> <<link "Intensive loyalty training" "seeUnit">> <<set $militiaUnits[$targetIndex].commissars += 1>> - <<run cashX(forceNeg($equipUpgradeCost * $militiaUnits[$targetIndex].maxTroops + 1000), "specialForces")>> + <<run cashX(forceNeg($equipUpgradeCost * $militiaUnits[$targetIndex].maxTroops + 1000), "securityExpansion")>> <</link>> Provide special training for the officers and the commissars of the unit. <br>//Costs <<print cashFormat(($equipUpgradeCost * $militiaUnits[$targetIndex].maxTroops) + 1000)>> and will increase the loyalty of the unit faster.// @@ -130,7 +130,7 @@ <br> <<link "Provide enhanced cybernetic enhancements" "seeUnit">> <<set $militiaUnits[$targetIndex].cyber += 1>> - <<run cashX(forceNeg($equipUpgradeCost * $militiaUnits[$targetIndex].maxTroops + 2000), "specialForces")>> + <<run cashX(forceNeg($equipUpgradeCost * $militiaUnits[$targetIndex].maxTroops + 2000), "securityExpansion")>> <</link>> Will augment all soldiers of the unit with high tech cyber enhancements. <br>//Costs <<print cashFormat(($equipUpgradeCost * $militiaUnits[$targetIndex].maxTroops) + 2000)>> and will increase attack, defense and base hp values of the unit.// @@ -142,7 +142,7 @@ <br> <<link "Attach trained medics to the unit" "seeUnit">> <<set $militiaUnits[$targetIndex].medics = 1>> - <<run cashX(forceNeg($equipUpgradeCost * $militiaUnits[$targetIndex].maxTroops + 1000), "specialForces")>> + <<run cashX(forceNeg($equipUpgradeCost * $militiaUnits[$targetIndex].maxTroops + 1000), "securityExpansion")>> <</link>> Attach a small squad of trained medics to the unit. <br>//Costs <<print cashFormat(($equipUpgradeCost * $militiaUnits[$targetIndex].maxTroops) + 1000)>> and will decrease the number of casualties suffered during battle.// @@ -259,7 +259,7 @@ <br> <<link "Attach commissars to the unit" "seeUnit">> <<set $slaveUnits[$targetIndex].commissars = 1>> - <<run cashX(forceNeg($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops + 1000), "specialForces")>> + <<run cashX(forceNeg($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops + 1000), "securityExpansion")>> <</link>> Attach a small squad of commissars to the unit. <br>//Costs <<print cashFormat(($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops) + 1000)>> and will slowly increase the loyalty of the unit.// @@ -267,7 +267,7 @@ <br> <<link "Intensive loyalty training" "seeUnit">> <<set $slaveUnits[$targetIndex].commissars += 1>> - <<run cashX(forceNeg($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops + 1000), "specialForces")>> + <<run cashX(forceNeg($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops + 1000), "securityExpansion")>> <</link>> Provide special training for the officers and the commissars of the unit. <br>//Costs <<print cashFormat(($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops) + 1000)>> and will increase the loyalty of the unit faster.// @@ -281,7 +281,7 @@ <br> <<link "Provide enhanced cybernetic enhancements" "seeUnit">> <<set $slaveUnits[$targetIndex].cyber += 1>> - <<run cashX(forceNeg($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops + 2000), "specialForces")>> + <<run cashX(forceNeg($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops + 2000), "securityExpansion")>> <</link>> Will augment all soldiers of the unit with high tech cyber enhancements. <br>//Costs <<print cashFormat(($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops) + 2000)>> and will increase attack, defense and base hp values of the unit.// @@ -293,7 +293,7 @@ <br> <<link "Attach trained medics to the unit" "seeUnit">> <<set $slaveUnits[$targetIndex].medics = 1>> - <<run cashX(forceNeg($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops + 1000), "specialForces")>> + <<run cashX(forceNeg($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops + 1000), "securityExpansion")>> <</link>> Attach a small squad of trained medics to the unit. <br>//Costs <<print cashFormat(($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops) + 1000)>> and will decrease the number of casualties suffered during battle.// @@ -305,7 +305,7 @@ <br> <<link "Attach Special Force advisors" "seeUnit">> <<set $slaveUnits[$targetIndex].SF = 1>> - <<run cashX(forceNeg(($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops) + 5000), "specialForces")>> + <<run cashX(forceNeg(($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops) + 5000), "securityExpansion")>> <</link>> Attach $SF.Lower advisors to the unit. <br>//Costs <<print cashFormat(($equipUpgradeCost * $slaveUnits[$targetIndex].maxTroops) + 5000)>> and will slightly increase the base stats of the unit.// @@ -408,7 +408,7 @@ <br> <<link "Attach commissars to the unit" "seeUnit">> <<set $mercUnits[$targetIndex].commissars = 1>> - <<run cashX(forceNeg($equipUpgradeCost * $mercUnits[$targetIndex].maxTroops + 1000), "specialForces")>> + <<run cashX(forceNeg($equipUpgradeCost * $mercUnits[$targetIndex].maxTroops + 1000), "securityExpansion")>> <</link>> Attach a small squad of commissars to the unit. <br>//Costs <<print cashFormat(($equipUpgradeCost * $mercUnits[$targetIndex].maxTroops) + 1000)>> and will slowly increase the loyalty of the unit.// @@ -416,7 +416,7 @@ <br> <<link "Intensive loyalty training" "seeUnit">> <<set $mercUnits[$targetIndex].commissars += 1>> - <<run cashX(forceNeg($equipUpgradeCost * $mercUnits[$targetIndex].maxTroops + 1000), "specialForces")>> + <<run cashX(forceNeg($equipUpgradeCost * $mercUnits[$targetIndex].maxTroops + 1000), "securityExpansion")>> <</link>> Provide special training for the officers and the commissars of the unit. <br>//Costs <<print cashFormat(($equipUpgradeCost * $mercUnits[$targetIndex].maxTroops) + 1000)>> and will increase the loyalty of the unit faster.// @@ -430,7 +430,7 @@ <br> <<link "Provide enhanced cybernetic enhancements" "seeUnit">> <<set $mercUnits[$targetIndex].cyber += 1>> - <<run cashX(forceNeg($equipUpgradeCost * $mercUnits[$targetIndex].maxTroops + 2000), "specialForces")>> + <<run cashX(forceNeg($equipUpgradeCost * $mercUnits[$targetIndex].maxTroops + 2000), "securityExpansion")>> <</link>>Will augment all soldiers of the unit with high tech cyber enhancements. <br>//Costs <<print cashFormat(($equipUpgradeCost * $mercUnits[$targetIndex].maxTroops) + 2000)>> and will increase attack, defense and base hp values of the unit.// <<else>> diff --git a/src/SecExp/tradeReport.tw b/src/Mods/SecExp/tradeReport.tw similarity index 100% rename from src/SecExp/tradeReport.tw rename to src/Mods/SecExp/tradeReport.tw diff --git a/src/SecExp/unitsBattleReport.tw b/src/Mods/SecExp/unitsBattleReport.tw similarity index 100% rename from src/SecExp/unitsBattleReport.tw rename to src/Mods/SecExp/unitsBattleReport.tw diff --git a/src/SecExp/unitsRebellionReport.tw b/src/Mods/SecExp/unitsRebellionReport.tw similarity index 100% rename from src/SecExp/unitsRebellionReport.tw rename to src/Mods/SecExp/unitsRebellionReport.tw diff --git a/src/SecExp/widgets/battleWidgets.js b/src/Mods/SecExp/widgets/battleWidgets.js similarity index 100% rename from src/SecExp/widgets/battleWidgets.js rename to src/Mods/SecExp/widgets/battleWidgets.js diff --git a/src/SecExp/widgets/miscSecExpWidgets.tw b/src/Mods/SecExp/widgets/miscSecExpWidgets.tw similarity index 100% rename from src/SecExp/widgets/miscSecExpWidgets.tw rename to src/Mods/SecExp/widgets/miscSecExpWidgets.tw diff --git a/src/SecExp/widgets/unitsWidgets.tw b/src/Mods/SecExp/widgets/unitsWidgets.tw similarity index 100% rename from src/SecExp/widgets/unitsWidgets.tw rename to src/Mods/SecExp/widgets/unitsWidgets.tw diff --git a/src/arcologyBuilding/base.js b/src/arcologyBuilding/base.js index efc4405e9d87156d0fbf698abdb43a95bb090140..e4173a8efd9c7d2f3efe80d1e29b2a896da2d42b 100644 --- a/src/arcologyBuilding/base.js +++ b/src/arcologyBuilding/base.js @@ -13,9 +13,9 @@ App.Arcology.getCellLink = function(path, message) { * * @param {App.Arcology.Building} building * @param {class} cellClass - * @param {any} cellType - * @param {any} newType - * @param {string} [key] + * @param {*} cellType + * @param {*} newType + * @param {string} [key="type"] */ App.Arcology.cellUpgrade = function(building, cellClass, cellType, newType, key = "type") { building.findCells(cell => cell instanceof cellClass && cell[key] === cellType) @@ -35,7 +35,7 @@ App.Arcology.updateOwnership = function() { }; /** - * @param {string} terrain + * @param {string} [terrain="default"] * @returns {App.Arcology.Building} */ App.Arcology.defaultBuilding = function(terrain = "default") { @@ -44,7 +44,7 @@ App.Arcology.defaultBuilding = function(terrain = "default") { */ const env = {terrain: terrain, established: false, fs: ""}; const candidates = App.Arcology.presets.filter(preset => preset.isAllowed(env)); - return candidates.pluck().construct(env); + return candidates.pluck().construct(env).building; }; /** @@ -58,7 +58,8 @@ App.Arcology.Section = class extends App.Entity.Serializable { /** * @param {string} id unique ID * @param {Array<Array<App.Arcology.Cell.BaseCell>>} rows - * @param {boolean} groundLevel if the section the ground level, all lower layers are automatically in the basement + * @param {boolean} [groundLevel=false] if the section the ground level, all lower layers are automatically in the + * basement */ constructor(id, rows, groundLevel = false) { super(); @@ -141,10 +142,11 @@ App.Arcology.Section = class extends App.Entity.Serializable { /** * @param {Array<number>} path of the form [i, j] - * @returns {App.Arcology.Cell.BaseCell} + * @param {App.Arcology.Building} containingBuilding + * @returns {Node} */ - cellByPath(path) { - return this.rows[path[0]][path[1]]; + renderCell(path, containingBuilding) { + return this.rows[path[0]][path[1]].cellPassage(containingBuilding); } /** @@ -196,10 +198,20 @@ App.Arcology.Section = class extends App.Entity.Serializable { App.Arcology.Building = class extends App.Entity.Serializable { /** + * @param {string} layout reference to the used layout so we now how to do layout specific actions. (upgrading) * @param {Array<App.Arcology.Section>} sections */ - constructor(sections) { + constructor(layout, sections) { super(); + /** + * @type {string} + */ + this.layout = layout; + /** + * List of all already taken upgrades. + * @type {Array<string>} + */ + this.usedUpgrades = []; /** * @type {Array<App.Arcology.Section>} */ @@ -239,11 +251,11 @@ App.Arcology.Building = class extends App.Entity.Serializable { } /** - * @param {Array<any>} path - * @returns {App.Arcology.Cell.BaseCell} + * @param {Array<*>} path + * @returns {Node} */ - cellByPath(path) { - return this.sections[path[0]].cellByPath(path.slice(1)); + renderCell(path) { + return this.sections[path[0]].renderCell(path.slice(1), this); } /** @@ -274,7 +286,9 @@ App.Arcology.Building = class extends App.Entity.Serializable { static _cleanupConfigScheme(config) { super._cleanupConfigScheme(config); - // BC code + if (config.layout === undefined) { + config.layout = V.terrain; + } } clone() { diff --git a/src/arcologyBuilding/cell.tw b/src/arcologyBuilding/cell.tw index 36d29b76af5ab96a4619b6a7b00d9bfc74f5f555..87d3126b7b743cc49fe39a136c976434407f0f25 100644 --- a/src/arcologyBuilding/cell.tw +++ b/src/arcologyBuilding/cell.tw @@ -2,4 +2,4 @@ <<set $nextButton = "Back", $nextLink = "Main">> -<<print App.UI.DOM.includeDOM(V.building.cellByPath(V.cellPath).cellPassage(V.building))>> +<<print App.UI.DOM.includeDOM(V.building.renderCell(V.cellPath))>> diff --git a/src/arcologyBuilding/presets.js b/src/arcologyBuilding/presets.js index 8fc501bc46ef5a12c68b2526a02b6f9e37996378..f17784718d0ea8ee38b7c024613d83dbf96a1a94 100644 --- a/src/arcologyBuilding/presets.js +++ b/src/arcologyBuilding/presets.js @@ -7,8 +7,7 @@ /** * @typedef {object} buildingPreset * @property {function(arcologyEnvironment):boolean} isAllowed - * @property {function(arcologyEnvironment):App.Arcology.Building} construct - * @property {function():void} apply + * @property {function(arcologyEnvironment):{building: App.Arcology.Building, apply: function()}} construct */ /** @@ -22,42 +21,56 @@ App.Arcology.presets = (function() { * @property {boolean} [ground] */ /** - * @typedef {Array<sectionTemplate>} buildingTemplate + * @typedef {Array<sectionTemplate|string>} buildingTemplate first entry is template name */ - /* NOTE: test new templates, broken templates WILL explode */ - /* t is markets, () is possible values for a sector, first is default */ + /* + NOTE: test new templates, broken templates WILL explode + t is markets; () is possible values for a sector, first is default; + [number] is for filler space, must be parsable by Number(), 1 equals the width of a normal cell + */ const templates = { - default: [{id: "penthouse", rows: ["p"]}, + default: ["default", + {id: "penthouse", rows: ["p"]}, {id: "shops", rows: ["sss"]}, {id: "apartments", rows: ["aaaa", "aaaa", "aaaa"]}, {id: "markets", rows: ["ttttt"], ground: true}, {id: "manufacturing", rows: ["mmmmm"]}], - urban: [{id: "penthouse", rows: ["p"]}, + urban: ["urban", + {id: "penthouse", rows: ["p"]}, {id: "shops", rows: ["sss"]}, {id: "apartments", rows: ["aaaa", "aaaa", "dddd"]}, {id: "markets", rows: ["(dt)tt(dt)", "t(tm)(tm)t"], ground: true}, {id: "manufacturing", rows: ["mmmm"]}], - rural: [{id: "penthouse", rows: ["p"]}, + rural: ["rural", + {id: "penthouse", rows: ["p"]}, {id: "shops", rows: ["sss"]}, {id: "apartments", rows: ["aaaaa", "aaaaa"]}, {id: "markets", rows: ["tt(mt)(mt)tt"], ground: true}, {id: "manufacturing", rows: ["mmmmm"]}], - ravine: [{id: "penthouse", rows: ["p"]}, + ravine: ["ravine", + {id: "penthouse", rows: ["p"]}, {id: "shops", rows: ["sss"]}, {id: "ravine-markets", rows: ["ttttt"], ground: true}, {id: "apartments", rows: ["aaaa", "aaaa", "aaaa"]}, {id: "manufacturing", rows: ["mmmmm"]}], - marine: [{id: "penthouse", rows: ["p"]}, + marine: ["marine", + {id: "penthouse", rows: ["p"]}, {id: "shops", rows: ["ssss"]}, {id: "apartments", rows: ["laal", "aaaa", "aaaa"]}, {id: "markets", rows: ["tt(mt)tt"], ground: true}, {id: "manufacturing", rows: ["(tm)mmm(tm)"]}], - oceanic: [{id: "penthouse", rows: ["p"]}, + oceanic: ["oceanic", + {id: "penthouse", rows: ["p"]}, {id: "shops", rows: ["sss"]}, {id: "apartments", rows: ["llll", "aaaa", "aaaa"]}, {id: "markets", rows: ["ttttt"], ground: true}, {id: "manufacturing", rows: ["mmmmm"]}], + dick: ["dick", // yes, this is a giant dick + {id: "penthouse", rows: ["l", "p"]}, + {id: "apartments", rows: ["a", "a", "a", "d[0.75]a[0.75]d", "dd[0.25]s[0.25]dd"]}, + {id: "markets", rows: ["ttsstt"], ground: true}, + {id: "manufacturing", rows: ["tm[0.25]m[0.25]mt", "m[0.75]m[0.75]m"]}], }; /** @@ -66,10 +79,11 @@ App.Arcology.presets = (function() { */ function templateToBuilding(template) { const sections = []; - for (let sectionTemplate of template) { - sections.push(getSection(sectionTemplate)); + const layout = template[0]; + for (let i = 1; i < template.length; i++) { + sections.push(getSection(template[i])); } - return new App.Arcology.Building(sections); + return new App.Arcology.Building(layout, sections); /** * @param {sectionTemplate} section @@ -101,6 +115,14 @@ App.Arcology.presets = (function() { next = iter.next(); } cells.push(cell); + } else if (next.value === "[") { + let number = ""; + next = iter.next(); + while (next.value !== "]") { + number += next.value; + next = iter.next(); + } + cells.push(new App.Arcology.Cell.Filler(Number(number))); } else { cells.push(charToCell(next.value).cell); } @@ -136,84 +158,162 @@ App.Arcology.presets = (function() { } } + /** + * @param {App.Arcology.Building} building + * @param {arcologyEnvironment} environment + * @returns {{building: App.Arcology.Building, apply: function()}} + */ + function randomizeBuilding(building, environment) { + const apply = []; + if (Math.random() < 0.5) { + apply.push(addFsShop(building, environment.fs)); + } + return {building: building, apply: () => { apply.forEach(a => { a(); }); }}; + } + + /** + * @param {App.Arcology.Building} building + * @param {string} fs + * @returns {function():undefined} + */ + function addFsShop(building, fs) { + function randomShop() { + return building.findCells(cell => cell instanceof App.Arcology.Cell.Shop).random(); + } + + switch (fs) { + case "Supremacist": + randomShop().type = "Supremacist"; + return () => { V.FSPromenade.Supremacist = 1; }; + case "Subjugationist": + randomShop().type = "Subjugationist"; + return () => { V.FSPromenade.Subjugationist = 1; }; + case "GenderRadicalist": + randomShop().type = "Gender Radicalist"; + return () => { V.FSPromenade.GenderRadicalist = 1; }; + case "GenderFundamentalist": + randomShop().type = "Gender Fundamentalist"; + return () => { V.FSPromenade.GenderFundamentalist = 1; }; + case "Paternalist": + randomShop().type = "Paternalist"; + return () => { V.FSPromenade.Paternalist = 1; }; + case "Degradationist": + randomShop().type = "Degradationist"; + return () => { V.FSPromenade.Degradationist = 1; }; + case "AssetExpansionist": + randomShop().type = "Asset Expansionist"; + return () => { V.FSPromenade.AssetExpansionist = 1; }; + case "SlimnessEnthusiast": + randomShop().type = "Slimness Enthusiast"; + return () => { V.FSPromenade.SlimnessEnthusiast = 1; }; + case "TransformationFetishist": + randomShop().type = "Transformation Fetishist"; + return () => { V.FSPromenade.TransformationFetishist = 1; }; + case "BodyPurist": + randomShop().type = "Body Purist"; + return () => { V.FSPromenade.BodyPurist = 1; }; + case "MaturityPreferentialist": + randomShop().type = "Maturity Preferentialist"; + return () => { V.FSPromenade.MaturityPreferentialist = 1; }; + case "YouthPreferentialist": + randomShop().type = "Youth Preferentialist"; + return () => { V.FSPromenade.YouthPreferentialist = 1; }; + case "Pastoralist": + randomShop().type = "Pastoralist"; + return () => { V.FSPromenade.Pastoralist = 1; }; + case "PhysicalIdealist": + randomShop().type = "Physical Idealist"; + return () => { V.FSPromenade.PhysicalIdealist = 1; }; + case "ChattelReligionist": + randomShop().type = "Chattel Religionist"; + return () => { V.FSPromenade.ChattelReligionist = 1; }; + case "RomanRevivalist": + randomShop().type = "Roman Revivalist"; + return () => { V.FSPromenade.RomanRevivalist = 1; }; + case "AztecRevivalist": + randomShop().type = "Aztec Revivalist"; + return () => { V.FSPromenade.AztecRevivalist = 1; }; + case "EgyptianRevivalist": + randomShop().type = "Egyptian Revivalist"; + return () => { V.FSPromenade.EgyptianRevivalist = 1; }; + case "EdoRevivalist": + randomShop().type = "Edo Revivalist"; + return () => { V.FSPromenade.EdoRevivalist = 1; }; + case "ArabianRevivalist": + randomShop().type = "Arabian Revivalist"; + return () => { V.FSPromenade.ArabianRevivalist = 1; }; + case "ChineseRevivalist": + randomShop().type = "Chinese Revivalist"; + return () => { V.FSPromenade.Degradationist = 1; }; + case "Repopulationist": + randomShop().type = "Repopulationist"; + return () => { V.FSPromenade.Repopulationist = 1; }; + case "Eugenics": + randomShop().type = "Eugenics"; + return () => { V.FSPromenade.Eugenics = 1; }; + case "HedonisticDecadence": + randomShop().type = "Hedonistic Decadence"; + return () => { V.FSPromenade.HedonisticDecadence = 1; }; + case "IntellectualDependency": + randomShop().type = "Intellectual Dependency"; + return () => { V.FSPromenade.IntellectualDependency = 1; }; + case "SlaveProfessionalism": + randomShop().type = "Slave Professionalism"; + return () => { V.FSPromenade.SlaveProfessionalism = 1; }; + case "PetiteAdmiration": + randomShop().type = "Petite Admiration"; + return () => { V.FSPromenade.PetiteAdmiration = 1; }; + case "StatuesqueGlorification": + randomShop().type = "Statuesque Glorification"; + return () => { V.FSPromenade.StatuesqueGlorification = 1; }; + default: + return () => {}; + } + } + return [ /* basic types for controlled start */ { isAllowed: env => !env.established && env.terrain === "default", - construct: () => templateToBuilding(templates.default), - apply() {} + construct: () => { return {building: templateToBuilding(templates.default), apply: () => {}}; } }, { isAllowed: env => !env.established && env.terrain === "urban", - construct: () => templateToBuilding(templates.urban), - apply() {} + construct: () => { return {building: templateToBuilding(templates.urban), apply: () => {}}; } }, { isAllowed: env => !env.established && env.terrain === "rural", - construct: () => templateToBuilding(templates.rural), - apply() {} + construct: () => { return {building: templateToBuilding(templates.rural), apply: () => {}}; } }, { isAllowed: env => !env.established && env.terrain === "ravine", - construct: () => templateToBuilding(templates.ravine), - apply() {} + construct: () => { return {building: templateToBuilding(templates.ravine), apply: () => {}}; } }, { isAllowed: env => !env.established && env.terrain === "marine", - construct: () => templateToBuilding(templates.marine), - apply() {} + construct: () => { return {building: templateToBuilding(templates.marine), apply: () => {}}; } }, { isAllowed: env => !env.established && env.terrain === "oceanic", - construct: () => templateToBuilding(templates.oceanic), - apply() {} + construct: () => { return {building: templateToBuilding(templates.oceanic), apply: () => {}}; } }, /* crazy presets for established arcologies TODO */ { isAllowed: env => env.established && env.terrain === "default", - construct() { return templateToBuilding(templates.default); }, - apply() {} + construct: env => { return randomizeBuilding(templateToBuilding(templates.default), env); } }, { isAllowed: env => env.established && env.terrain === "urban", - construct() { return templateToBuilding(templates.urban); }, - apply() {} + construct: env => { return randomizeBuilding(templateToBuilding(templates.urban), env); } }, { isAllowed: env => env.established && env.terrain === "rural", - construct() { return templateToBuilding(templates.rural); }, - apply() {} + construct: env => { return randomizeBuilding(templateToBuilding(templates.rural), env); } }, { isAllowed: env => env.established && env.terrain === "ravine", - construct() { return templateToBuilding(templates.ravine); }, - apply() {} + construct: env => { return randomizeBuilding(templateToBuilding(templates.ravine), env); } }, { isAllowed: env => env.established && env.terrain === "marine", - construct() { return templateToBuilding(templates.marine); }, - apply() {} + construct: env => { return randomizeBuilding(templateToBuilding(templates.marine), env); } }, { isAllowed: env => env.established && env.terrain === "oceanic", - construct() { return templateToBuilding(templates.oceanic); }, - apply() {} + construct: env => { return randomizeBuilding(templateToBuilding(templates.oceanic), env); } }, { isAllowed: env => env.established && Math.random() < 0.1, - construct: () => { - // yes, this is a giant dick - const sections = []; - let rows = []; - rows.push([new App.Arcology.Cell.Apartment(1, 1)]); - rows.push([new App.Arcology.Cell.Penthouse()]); - sections.push(new App.Arcology.Section("penthouse", rows)); - rows = []; - rows.push([new App.Arcology.Cell.Apartment(1)]); - rows.push([new App.Arcology.Cell.Apartment(1)]); - rows.push([new App.Arcology.Cell.Apartment(1)]); - rows.push([new App.Arcology.Cell.Apartment(1, 3), new App.Arcology.Cell.Filler(0.75), new App.Arcology.Cell.Apartment(1), new App.Arcology.Cell.Filler(0.75), new App.Arcology.Cell.Apartment(1, 3)]); - rows.push([new App.Arcology.Cell.Apartment(1, 3), new App.Arcology.Cell.Apartment(1, 3), new App.Arcology.Cell.Filler(0.25), new App.Arcology.Cell.Shop(1), new App.Arcology.Cell.Filler(0.25), new App.Arcology.Cell.Apartment(1, 3), new App.Arcology.Cell.Apartment(1, 3)]); - sections.push(new App.Arcology.Section("apartments", rows)); - rows = []; - rows.push([new App.Arcology.Cell.Market(1), new App.Arcology.Cell.Market(1), new App.Arcology.Cell.Shop(1), new App.Arcology.Cell.Shop(1), new App.Arcology.Cell.Market(1), new App.Arcology.Cell.Market(1)]); - sections.push(new App.Arcology.Section("markets", rows, true)); - rows = []; - rows.push([new App.Arcology.Cell.Market(1), new App.Arcology.Cell.Manufacturing(1), new App.Arcology.Cell.Filler(0.25), new App.Arcology.Cell.Manufacturing(1), new App.Arcology.Cell.Filler(0.25), new App.Arcology.Cell.Manufacturing(1), new App.Arcology.Cell.Market(1)]); - rows.push([new App.Arcology.Cell.Manufacturing(1), new App.Arcology.Cell.Filler(0.75), new App.Arcology.Cell.Manufacturing(1), new App.Arcology.Cell.Filler(0.75), new App.Arcology.Cell.Manufacturing(1)]); - sections.push(new App.Arcology.Section("manufacturing", rows)); - return new App.Arcology.Building(sections); - }, - apply() {} + construct: env => { return randomizeBuilding(templateToBuilding(templates.dick), env); } }, ]; }()); @@ -225,3 +325,72 @@ App.Arcology.presets = (function() { App.Arcology.randomPreset = function(environment) { return App.Arcology.presets.filter(p => p.isAllowed(environment)).random(); }; + +/** + * Shows all possible upgrades for a given building. + * @param {App.Arcology.Building} building + * @returns {HTMLElement} + */ +App.Arcology.upgrades = function(building) { + const outerDiv = document.createElement("div"); + + /** + * @typedef upgrade + * @property {string} id used to identify already build upgrades, unique! + * @property {Array<string>} layouts + * @property {Array<string>} exclusive any upgrade is always exclusive to itself. NOTE: keep in mind that + * exclusiveness has to be added to both upgrades! + * @property {string} name as shown to player. + * @property {string} desc Fits in a sentence like this: The next major upgrade needed is "desc" + * @property {number} cost + * @property {function():undefined} apply + */ + // TODO actually add different upgrades, but hey, we have the framework at least. + /** @type {Array<upgrade>} */ + const upgrades = [{ + id: "spire", + layouts: ["default", "urban", "rural", "ravine", "marine", "oceanic", "dick"], + exclusive: [], name: "spire", + desc: "the addition of a spire at the top of the arcology to increase the space available for the wealthiest citizens to own whole floors", + cost: 250000, apply: () => { + building.sections.push(new App.Arcology.Section("spire", [ + [new App.Arcology.Cell.Apartment(1, 1), new App.Arcology.Cell.Apartment(1, 1)], + [new App.Arcology.Cell.Apartment(1, 1), new App.Arcology.Cell.Apartment(1, 1)] + ])); + V.spire = 1; + } + }]; + + let count = 0; + for (let upgrade of upgrades) { + if (upgrade.layouts.includes(building.layout) + && !building.usedUpgrades.includesAny(upgrade.id, ...upgrade.exclusive)) { + const div = document.createElement("div"); + div.classList.add("choices"); + const cost = upgrade.cost * V.upgradeMultiplierArcology; + div.append(`...${upgrade.desc}. `, App.UI.DOM.makeElement("span", `This huge project will cost ${cashFormat(cost)} `, "note"), + App.UI.DOM.passageLink(`Build ${upgrade.name}`, passage(), () => { + if (building.usedUpgrades.length === 0) { + // the first major upgrade gives skill, successive ones not, mainly because there might be a + // different number depending on layout. + V.PC.skill.engineering++; + } + building.usedUpgrades.push(upgrade.id); + upgrade.apply(); + })); + outerDiv.append(div); + count++; + } + } + + if (count === 0) { + return App.UI.DOM.makeElement("span", "The arcology structure is fully upgraded.", "note"); + } else { + if (count === 1) { + outerDiv.prepend("The next major upgrade is..."); + } else { + outerDiv.prepend("Possible major upgrades to the arcology are ..."); + } + return outerDiv; + } +}; diff --git a/src/art/artWidgets.tw b/src/art/artWidgets.tw deleted file mode 100644 index b247e2f8ac5b8068ada94913a7209eb5ffaddae2..0000000000000000000000000000000000000000 --- a/src/art/artWidgets.tw +++ /dev/null @@ -1,6 +0,0 @@ -:: art widgets [nobr widget] - -<<widget "SlaveArtById">> - <<set _s = getSlave($args[0])>> - <<= SlaveArt(_s, $args[1])>> -<</widget>> diff --git a/src/art/vector/Body_Clothing_Control.tw b/src/art/vector/Body_Clothing_Control.tw deleted file mode 100644 index 0ecade1d27598491202ba2574eeee14ef531f83f..0000000000000000000000000000000000000000 --- a/src/art/vector/Body_Clothing_Control.tw +++ /dev/null @@ -1,97 +0,0 @@ -:: Art_Vector_Body_Clothing_Control_ [nobr] - -<<set _eyeBallColor = "#ffffff">> - -<<if hasAnyEyes(_artSlave)>> - <<set _eyeLens = hasLeftEye(_artSlave) ? getLeftEyePupil(_artSlave) : getRightEyePupil(_artSlave)>> - <<if _eyeLens == "demonic">> - <<set _eyeBallColor = hasLeftEye(_artSlave) ? getLeftEyeColor(_artSlave) : getRightEyeColor(_artSlave)>> - <<elseif _eyeLens == "devilish">> - <<set _eyeBallColor = "#000000">> - <</if>> -<</if>> - -<<set _muscles_value = _artSlave.muscles + 101>> -<<set _art_muscle_visibility = 0.910239*Math.log(0.02*_muscles_value) >> - -<<set _showEyes = 1>> -<<set _showLips = 1>> -<<set _showMouth = 1>> -<<set _showPubic = 1>> -<<set _showPussy = (_artSlave.vagina >= 0)>> -<<set _showArmHair = 1>> -<<set _showHair = (_artSlave.hStyle != "shaved")>> -<<set _showBoobs = 1>> -<<set _showNipples = 1>> -<<set _showArmHighlight = 0>> -<<set _showTorsoHighlight = 0>> -<<set _showLegHighlight = 0>> -<<set _showBoobsHighlight = 0>> -<<set _showEyesHighlight = 1>> -<<set _showHeadHighlight = 1>> -<<set _showBellyPiercings = 1>> -<<set _showNipplePiercings = 1>> -<<set _chastityAnal = (_artSlave.chastityAnus == 1)>> - -<<set _chastityVaginal = (_artSlave.chastityVagina == 1)>> - -<<if _artSlave.fuckdoll > 0>> - <<set _showEyes = 0>> - <<set _showPubic = 0>> - <<set _showArmHair = 0>> - <<set _showHair = 0>> - <<set _showArmHighlight = 1>> - <<set _showTorsoHighlight = 1>> - <<set _showBoobsHighlight = 1>> - <<set _showLegHighlight = 1>> - <<set _showHeadHighlight = 1>> -<</if>> - -<<if _artSlave.clothes == "a nice maid outfit">> - <<set _showPubic = 0>> - <<set _showBoobs = 0>> - <<set _showBellyPiercings = 0>> - <<set _showNipplePiercings = 0>> - <<set _showNipples = 0>> -<</if>> - -<<if _artSlave.clothes == "a slutty maid outfit">> - <<set _showBellyPiercings = 0>> -<</if>> - -<<if _artSlave.clothes == "restrictive latex">> - <<set _showEyes = 0>> - <<set _showPubic = 0>> - <<set _showArmHair = 0>> - <<set _showHair = 0>> - <<set _showArmHighlight = 1>> - <<set _showTorsoHighlight = 1>> - <<set _showLegHighlight = 1>> - <<set _showHeadHighlight = 1>> - <<set _showBellyPiercings = 0>> -<</if>> - -<<if _artSlave.clothes == "a latex catsuit">> - <<set _showPubic = 0>> - <<set _showArmHair = 0>> - <<set _showArmHighlight = 1>> - <<set _showTorsoHighlight = 1>> - <<set _showLegHighlight = 1>> - <<set _showBoobsHighlight = 1>> - <<set _showHeadHighlight = 1>> - <<set _showBellyPiercings = 0>> - <<set _showNipplePiercings = 0>> - <<set _chastityAnal = 0>> - <<set _chastityVaginal = 0>> -<</if>> - -<<if $showBodyMods == 0>> - <<set _showNipplePiercings = 0>> -<</if>> - -<<if $seeVectorArtHighlights == 1>> - <<set _showArmHighlight = 0>> - <<set _showTorsoHighlight = 0>> - <<set _showLegHighlight = 0>> - <<set _showBoobsHighlight = 0>> -<</if>> diff --git a/src/data/backwardsCompatibility/BackwardsCompatibility.tw b/src/data/backwardsCompatibility/BackwardsCompatibility.tw index 37b5ad72b811b85e2ef9c0d9390a709f554999b8..3d45b870e726a336588d4dc82200cc69e84f1e7a 100644 --- a/src/data/backwardsCompatibility/BackwardsCompatibility.tw +++ b/src/data/backwardsCompatibility/BackwardsCompatibility.tw @@ -1,44 +1,12 @@ :: Backwards Compatibility [nobr] -/* no-usedOnce disabling checking for only used once instances in this file */ <<set $nextButton = "Continue", $nextLink = "Main", $returnTo = "Main">> <<run App.Update.setNonexistantProperties(V, App.Data.defaultGameStateVariables)>> /* resetOnNGPlus contains half of the variables we need, but we use it politely here instead of forcing it so it fills in holes instead of overwriting data */ <<run App.Update.setNonexistantProperties(V, App.Data.resetOnNGPlus)>> - -<div> - <<= App.Update.oldVersions()>> -</div> - -<div> - <<= App.Update.globalVariables()>> -</div> - -<div> - <<= App.Update.slaveVariables()>> -</div> - -<div> - <<= App.Update.slaveRecords()>> -</div> - -<div> - <<= App.Update.RAassistantData()>> -</div> - -/* Sec Exp */ -<div> - <<= App.SecExp.Check.general()>> - <<if $secExpEnabled == 1>> - <br> <<include "SecExpBackwardCompatibility">> - <</if>> -</div> -<div> - <<= App.Update.autoshred()>> -</div> -/* leave this at the bottom of BC */ -<div> - <<= App.Update.cleanUp()>> -</div> +<span id="backwardsCompatibility"></span> +<script> + App.Update.backwardsCompatibility(); +</script> \ No newline at end of file diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js index 606b66073e10036336d7b575014e1ae12bea380d..9fc833beb010545807784914912eeb1f96d91c7e 100644 --- a/src/data/backwardsCompatibility/backwardsCompatibility.js +++ b/src/data/backwardsCompatibility/backwardsCompatibility.js @@ -1,4 +1,4 @@ -App.Update.autoshred = function() { +App.Update.autoshred = function(node) { const set = new Set( Object.getOwnPropertyNames(App.Data.defaultGameStateVariables).concat( Object.getOwnPropertyNames(App.Data.resetOnNGPlus) @@ -21,6 +21,7 @@ App.Update.autoshred = function() { if (extraCount !== 0) { console.log(`and ${extraCount} more`); } + node.append(`Done!`); }; App.Update.setNonexistantProperties = function(obj, props) { @@ -51,8 +52,82 @@ App.Update.setExistantProperties = function(obj, array) { } }; -App.Update.globalVariables = function() { - let r = `Setting missing global variables... `; +App.Update.backwardsCompatibility = function() { + let div; + jQuery('#backwardsCompatibility').empty(); + try { + div = document.createElement('div'); + div.append(`Check for old version... `); + jQuery('#backwardsCompatibility').append(div); + App.Update.oldVersions(div); + + div = document.createElement('div'); + div.append(`Updating gene pool records... `); + jQuery('#backwardsCompatibility').append(div); + App.Update.genePoolRecords(div); + + div = document.createElement('div'); + div.append(`Updating global variables... `); + jQuery('#backwardsCompatibility').append(div); + App.Update.globalVariables(div); + + div = document.createElement('div'); + div.append(`Updating slave variables... `); + jQuery('#backwardsCompatibility').append(div); + App.Update.slaveVariables(div); + + div = document.createElement('div'); + div.append(`Updating slave records... `); + jQuery('#backwardsCompatibility').append(div); + App.Update.slaveRecords(div); + + div = document.createElement('div'); + div.append(`Updating Rule Assistant data... `); + jQuery('#backwardsCompatibility').append(div); + App.Update.RAassistantData(div); + + // Sec Exp + div = document.createElement('div'); + div.append(`Updating Security Expansion... `); + jQuery('#backwardsCompatibility').append(div); + App.SecExp.Check.general(); + if (V.secExpEnabled === 1) { + jQuery(div).wiki(`<<include "SecExpBackwardCompatibility">>`); + } + + div = document.createElement('div'); + div.append(`Checking for old variables... `); + jQuery('#backwardsCompatibility').append(div); + App.Update.autoshred(div); + + // leave this at the bottom of BC + div = document.createElement('div'); + div.append(`Cleaning up... `); + jQuery('#backwardsCompatibility').append(div); + App.Update.cleanUp(div); + } catch (error) { + div = document.createElement('p'); + div.className = "red"; + div.textContent = `Backwards compatibility has failed for your save. Please upload your save to https://gitgud.io/pregmodfan/fc-pregmod/ with notes on what went wrong so that we can fix the backwards compatibility process for everyone. Thank you!`; + jQuery('#backwardsCompatibility').append(div); + State.restore(); + throw (error); // rethrow the exception to Sugarcube so we get a fancy stack trace + } + return; +}; + +App.Update.globalVariables = function(node) { + for (var key of Object.keys(CategoryAssociatedGroup)) { + if(!V.lastWeeksGatheredTotals[key]) { + V.lastWeeksGatheredTotals[key] = {income: 0, expenses: 0, profits: 0}; + } + for (var subKey of Object.keys(new App.Data.Records.LastWeeksCash())) { + if(!V.lastWeeksGatheredTotals[key][subKey]) { + V.lastWeeksGatheredTotals[key][subKey] = {income: 0, expenses: 0, profits: 0}; + } + } + } + if (Array.isArray(V.nationalities)) { V.nationalities = weightedArray2HashMap(V.nationalities); } @@ -118,6 +193,9 @@ App.Update.globalVariables = function() { if (typeof V.sideBarOptions.compact === "undefined") { V.sideBarOptions.compact = 1; } + if (typeof V.sideBarOptions.confirmWeekEnd === "undefined") { + V.sideBarOptions.confirmWeekEnd = 0; + } if (V.sortSlavesBy === "income" || V.sortSlavesBy === "lastWeeksCashIncome") { V.sortSlavesBy = "weeklyIncome"; } @@ -164,6 +242,12 @@ App.Update.globalVariables = function() { V.upgradeMultiplierArcology = upgradeMultiplier('engineering'); V.upgradeMultiplierMedicine = upgradeMultiplier('medicine'); V.upgradeMultiplierTrade = upgradeMultiplier('trading'); + V.AgeEffectOnTrainerPricingPC = 1; + V.AgeEffectOnTrainerEffectivenessPC = 1; + V.AgeTrainingUpperBoundPC = 14; + V.AgeTrainingLowerBoundPC = 12; + V.IsInPrimePC = 3; + V.IsPastPrimePC = 5000; } // Looks at all wombs, including PC. @@ -872,6 +956,12 @@ App.Update.globalVariables = function() { V.building = App.Arcology.defaultBuilding(); } } + if (V.arcologyUpgrade.spire === 1 && !V.building.usedUpgrades.includes("spire")) { + V.building.usedUpgrades.push("spire"); + } + if (!V.building.sections.map(s => s.id).includes("penthouse")) { + V.building.sections.push(new App.Arcology.Section("penthouse", [[new App.Arcology.Cell.Penthouse()]])); + } if (jQuery.isEmptyObject(V.trinkets)) { V.trinkets = []; @@ -928,6 +1018,9 @@ App.Update.globalVariables = function() { V.corp.ExpandToken = 1; } V.dividendTimer = V.dividendTimer || 13; + if (V.corp.SpecNationality === 0) { + delete V.corp.SpecNationality; + } /* Removing the old Corp from save*/ if (V.corp.Value) { @@ -1025,9 +1118,10 @@ App.Update.globalVariables = function() { } /* make sure that any new genres get added correctly (and populate V.pornStars for very old games) */ - for (let genre in App.Porn.getAllGenres()) { - if (typeof V.pornStars[genre.fameVar] === "undefined") { - V.pornStars[genre.fameVar] = {p1count: 0, p3ID: 0}; + const pornGenres = App.Porn.getAllGenres(); + for (let genre in pornGenres) { + if (V.pornStars[pornGenres[genre].fameVar] === undefined) { + V.pornStars[pornGenres[genre].fameVar] = {p1count: 0, p3ID: 0}; } } if (V.PCSlutContacts === 0) { @@ -1061,12 +1155,10 @@ App.Update.globalVariables = function() { EconomyDatatypeCleanup(); ArcologyDatatypeCleanup(); - r += ` Done!<br>`; - return r; + node.append(`Done!`); }; -App.Update.slaveVariables = function() { - let r = `Setting missing slave variables... `; +App.Update.slaveVariables = function(node) { /* Adding a new variable? Consider putting it in datatypeCleanupJS.tw instead of here */ for (let bci = 0; bci < V.slaves.length; bci++) { let Slave = V.slaves[bci]; @@ -1080,12 +1172,10 @@ App.Update.slaveVariables = function() { V.slaves[bci] = Slave; } - r += ` Done!<br>`; - return r; + node.append(`Done!`); }; -App.Update.slaveRecords = function() { - let r = `Checking and fixing slave records...`; +App.Update.slaveRecords = function(node) { V.slaves.forEach((slave) => { App.Entity.Utils.SlaveDataSchemeCleanup(slave); SlaveDatatypeCleanup(slave); @@ -1114,21 +1204,25 @@ App.Update.slaveRecords = function() { App.Entity.Utils.SlaveDataSchemeCleanup(V.traitor); SlaveDatatypeCleanup(V.traitor); } - r += ` Done!<br>`; + node.append(`Done!`); if (V.tanks.length > 0) { - r += `Checking and fixing records for incubator tanks... `; + let incubatorDiv = document.createElement("div"); + node.append(incubatorDiv); + incubatorDiv.append(`Checking and fixing records for incubator tanks... `); V.tanks.forEach((slave) => { App.Update.Slave(slave); App.Entity.Utils.SlaveDataSchemeCleanup(slave); SlaveDatatypeCleanup(slave, true); /* pass second argument as true so that slaveAgeDatatypeCleanup is not run */ }); - r += ` Done!<br> `; + incubatorDiv.append(`Done!`); } if (V.cribs.length > 0) { - r += `Checking and fixing records for nursery cribs... `; + let nurseryDiv = document.createElement("div"); + node.append(nurseryDiv); + nurseryDiv.append(`Checking and fixing records for nursery cribs... `); V.cribs.forEach((child) => { if (child.actualAge < 3) { App.Facilities.Nursery.InfantDatatypeCleanup(child); @@ -1138,18 +1232,21 @@ App.Update.slaveRecords = function() { } }); V.cribsIndices = App.Facilities.Nursery.cribsToIndices(); - r += ` Done!<br> `; + if (V.nurseryNannies > 0) { + for (let bci = 0; bci < V.cribs.length; bci++) { + App.Update.Slave(V.cribs[bci]); + // let _nurseryChild = V.cribs[bci]; TODO: on importing this to JS, what is this even supposed to do? + } + } + nurseryDiv.append(`Done!`); } - return r; }; -App.Update.genePoolRecords = function() { - let r = `Updating gene pool records... `; +App.Update.genePoolRecords = function(node) { for (let bci = 0; bci < V.genePool.length; bci++) { + App.Update.Slave(V.genePool[bci], true); let slave = V.genePool[bci]; - App.Update.Slave(slave); - if (V.genePool.map(function(s) { return s.ID; }).count(slave.ID) > 1) { /* first check for duplicate IDs, keep the first entry and delete the others */ for (let bci2 = bci + 1; bci2 < V.genePool.length; bci2++) { @@ -1164,25 +1261,25 @@ App.Update.genePoolRecords = function() { dontDeleteMe = 1; } if (V.traitor !== 0) { - if (isImpregnatedBy(V.traitor, slave) || V.traitor.ID === slave.ID) { + if (isImpregnatedBy(V.traitor, slave, true) || V.traitor.ID === slave.ID) { /* did we impregnate the traitor, or are we the traitor? */ dontDeleteMe = 1; } } if (V.boomerangSlave !== 0) { - if (isImpregnatedBy(V.boomerangSlave, slave) || V.boomerangSlave.ID === slave.ID) { + if (isImpregnatedBy(V.boomerangSlave, slave, true) || V.boomerangSlave.ID === slave.ID) { /* did we impregnate the boomerang, or are we the boomerang? */ dontDeleteMe = 1; } } - if (isImpregnatedBy(V.PC, slave)) { + if (isImpregnatedBy(V.PC, slave, true)) { /* did we impregnate the PC */ dontDeleteMe = 1; } if (dontDeleteMe === 0) { /* avoid going through this loop if possible */ for (let bci2 = 0; bci2 < V.slaves.length; bci2++) { - if (isImpregnatedBy(V.slaves[bci2], slave)) { + if (isImpregnatedBy(V.slaves[bci2], slave, true)) { /* have we impregnated a slave on the slaves array? */ dontDeleteMe = 1; break; @@ -1233,35 +1330,18 @@ App.Update.genePoolRecords = function() { App.Entity.Utils.GenePoolRecordCleanup(slave); V.genePool[bci] = slave; } - if (V.nurseryNannies > 0) { - for (let bci = 0; bci < V.cribs.length; bci++) { - App.Update.Slave(V.cribs[bci]); - // let _nurseryChild = V.cribs[bci]; TODO: on importing this to JS, what is this even supposed to do? - } - } - - V.AgeEffectOnTrainerPricingPC = 1; - V.AgeEffectOnTrainerEffectivenessPC = 1; - V.AgeTrainingUpperBoundPC = 14; - V.AgeTrainingLowerBoundPC = 12; - V.IsInPrimePC = 3; - V.IsPastPrimePC = 5000; - r += ` Done!<br>`; - return r; + node.append(`Done!`); }; -App.Update.RAassistantData = function() { - let r = `Updating Rules Assistant data...`; +App.Update.RAassistantData = function(node) { V.defaultRules = V.defaultRules.map(rule => App.Entity.Utils.RARuleDatatypeCleanup(rule)); - r += ` Done!<br>`; - return r; + node.append(`Done!`); }; -App.Update.oldVersions = function() { +App.Update.oldVersions = function(node) { if (V.releaseID === 1021 || V.releaseID === 1020 || V.releaseID === 1019 || V.releaseID === 2022) { V.releaseID = 1022; } - let r = ""; if (V.releaseID < 1043) { V.defaultRules.forEach((rule) => { if (rule.condition.excludeSpecialSlaves) { @@ -1273,9 +1353,21 @@ App.Update.oldVersions = function() { }); } if (V.releaseID === 1043) { - V.slaves.forEach(s => { s.skill.whoring = s.skill.whore / 2; }); - V.tanks.forEach(s => { s.skill.whoring = s.skill.whore / 2; }); - V.cribs.forEach(s => { s.skill.whoring = s.skill.whore / 2; }); + V.slaves.forEach(s => { + if (s.skill && s.skill.whore) { + s.skill.whoring = s.skill.whore / 2; + } + }); + V.tanks.forEach(s => { + if (s.skill && s.skill.whore) { + s.skill.whoring = s.skill.whore / 2; + } + }); + V.cribs.forEach(s => { + if (s.skill && s.skill.whore) { + s.skill.whoring = s.skill.whore / 2; + } + }); } /* unify cybermod & vanilla */ /* limbs */ @@ -1477,7 +1569,9 @@ App.Update.oldVersions = function() { } } if (V.releaseID < 1057) { - r += `Standardizing player object... `; + let PCdiv = document.createElement("div"); + node.append(PCdiv); + PCdiv.append(`Standardizing player object... `); if (typeof V.PC.actualAge === "undefined") { if (V.PC.age === 1) { V.PC.actualAge = 20; @@ -1911,23 +2005,24 @@ App.Update.oldVersions = function() { V.PC.faceShape = "normal"; } - r += ` Done!`; + PCdiv.append(`Done!`); } - return r; + + node.append(`Done!`); }; -App.Update.cleanUp = function() { +App.Update.cleanUp = function(node) { /* leave this at the bottom of BC */ if (V.releaseID < App.Version.release) { V.releaseID = App.Version.release; } /* reset NaNArray after BC is run */ V.NaNArray = findNaN(); - return; + node.append(`Done!`); }; App.Update.sectorsToBuilding = function() { - V.building = new App.Arcology.Building([]); + V.building = new App.Arcology.Building(V.terrain, []); const B = V.building; const S = V.sectors; @@ -2001,181 +2096,3 @@ App.Update.sectorsToBuilding = function() { return m; } }; - -App.Update.slaveLoopInit = function() { - let SL = V.slaves.length; - for (let i = 0; i < SL; i++) { - if (V.slaves[i].assignment !== "be imported") { - removeNonNGPSlave(V.slaves[i]); - i--, SL--; - } - } - for (let i = 0; i < SL; i++) { - if (V.slaves[i].assignment === "be imported") { - V.slaves[i].ID += NGPOffset; - V.slaves[i].assignment = "rest"; - V.slaves[i].weekAcquired = 0; - V.slaves[i].newGamePlus = 1; - if (V.slaves[i].mother > 0) { - V.slaves[i].mother += NGPOffset; - } else if (V.freshPC === 1 && V.slaves[i].mother === -1) { - V.slaves[i].mother = -NGPOffset; - } else if (V.slaves[i].mother < -1) { - V.slaves[i].mother -= NGPOffset; - } - if (V.slaves[i].father > 0) { - V.slaves[i].father += NGPOffset; - } else if (V.freshPC === 1 && V.slaves[i].father === -1) { - V.slaves[i].father = -NGPOffset; - } else if (V.slaves[i].father < -1) { - V.slaves[i].father -= NGPOffset; - } - V.slaves[i].daughters = 0; - V.slaves[i].sisters = 0; - V.slaves[i].canRecruit = 0; - V.slaves[i].breedingMark = 0; - if (V.arcologies[0].FSRomanRevivalist > 90) { - V.slaves[i].nationality = "Roman Revivalist"; - } else if (V.arcologies[0].FSAztecRevivalist > 90) { - V.slaves[i].nationality = "Aztec Revivalist"; - } else if (V.arcologies[0].FSEgyptianRevivalist > 90) { - V.slaves[i].nationality = "Ancient Egyptian Revivalist"; - } else if (V.arcologies[0].FSEdoRevivalist > 90) { - V.slaves[i].nationality = "Edo Revivalist"; - } else if (V.arcologies[0].FSArabianRevivalist > 90) { - V.slaves[i].nationality = "Arabian Revivalist"; - } else if (V.arcologies[0].FSChineseRevivalist > 90) { - V.slaves[i].nationality = "Ancient Chinese Revivalist"; - } - if (V.slaves[i].relationTarget !== 0) { - V.slaves[i].relationTarget += NGPOffset; - } - if (V.slaves[i].relationshipTarget !== 0) { - V.slaves[i].relationshipTarget += NGPOffset; - } - if (V.slaves[i].cloneID !== 0) { - V.slaves[i].cloneID += NGPOffset; - } - V.slaves[i].rivalry = 0, V.slaves[i].rivalryTarget = 0, V.slaves[i].subTarget = 0; - V.slaves[i].drugs = "no drugs"; - V.slaves[i].porn.spending = 0; - V.slaves[i].rules.living = "spare"; - V.slaves[i].diet = "healthy"; - V.slaves[i].pregControl = "none"; - } - } - V.slaveIndices = slaves2indices(); - for (let k = 0; k < SL; k++) { - for (let i = 0; i < SL; i++) { - if (V.slaves[k].mother === V.slaves[i].ID || V.slaves[k].father === V.slaves[i].ID) { - V.slaves[i].daughters += 1; - } - if (areSisters(V.slaves[k], V.slaves[i]) > 0) { - V.slaves[i].sisters += 1; - } - } - if (V.slaves[k].pregSource > 0) { - V.slaves[k].pregSource += NGPOffset; - let getFather = V.slaveIndices[V.slaves[k].pregSource]; - if (getFather) { - V.slaves[k].pregSource = 0; - } - } - for (let sInit = 0; sInit < V.slaves[k].womb.length; sInit++) { - if (V.slaves[k].womb[sInit].fatherID > 0) { - V.slaves[k].womb[sInit].fatherID += NGPOffset; - } else if (V.freshPC === 1 && V.slaves[k].womb[sInit].fatherID === -1) { - V.slaves[k].womb[sInit].fatherID = -NGPOffset; - } else if (V.slaves[k].womb[sInit].fatherID < -20) { - V.slaves[k].womb[sInit].fatherID -= NGPOffset; - } - if (V.slaves[k].womb[sInit].genetics.father > 0) { - V.slaves[k].womb[sInit].genetics.father += NGPOffset; - } else if (V.freshPC === 1 && V.slaves[k].womb[sInit].genetics.father === -1) { - V.slaves[k].womb[sInit].genetics.father = -NGPOffset; - } else if (V.slaves[k].womb[sInit].genetics.father < -20) { - V.slaves[k].womb[sInit].genetics.father -= NGPOffset; - } - if (V.slaves[k].womb[sInit].genetics.mother > 0) { - V.slaves[k].womb[sInit].genetics.mother += NGPOffset; - } else if (V.freshPC === 1 && V.slaves[k].womb[sInit].genetics.mother === -1) { - V.slaves[k].womb[sInit].genetics.mother = -NGPOffset; - } else if (V.slaves[k].womb[sInit].genetics.mother < -20) { - V.slaves[k].womb[sInit].genetics.mother -= NGPOffset; - } - } - if (V.slaves[k].cloneID !== 0) { - let getClone = V.slaveIndices[V.slaves[k].cloneID]; - if (getClone) { - V.slaves[k].cloneID = 0; - } - } - } - V.genePool = ngUpdateGenePool(V.genePool); - if (typeof V.missingTable === undefined || V.showMissingSlaves === false) { - V.missingTable = {}; - } else { - V.missingTable = ngUpdateMissingTable(V.missingTable); - } - for (let i = 0; i < SL; i++) { - if (V.slaves[i].relation !== 0) { - let seed = 0, rt = V.slaves[i].relationTarget, ID = V.slaves[i].ID; - let j = V.slaveIndices[rt]; - if ((j) && V.slaves[j].relationTarget === ID) { - seed = 1; - } - if (seed === 0) { - V.slaves[i].relation = 0, V.slaves[i].relationTarget = 0; - } - } - if (V.slaves[i].relationship > 0) { - let seed = 0, rt = V.slaves[i].relationshipTarget, ID = V.slaves[i].ID; - let j = V.slaveIndices[rt]; - if ((j) && V.slaves[j].relationshipTarget === ID) { - seed = 1; - } - if (seed === 0) { - V.slaves[i].relationship = 0, V.slaves[i].relationshipTarget = 0; - } - } - } - for (let i = 0; i < SL; i++) { - if (V.familyTesting === 1) { - if (V.slaves[i].canRecruit === 1) { - /* V.recruiters.push(V.slaves[i]);*/ - } - } else { - if (V.slaves[i].relation === 0) { - if (random(1, 100) <= 5) { - V.slaves[i].recruiter = "twin"; - } else if ((V.slaves[i].actualAge > 32) && (random(1, 100) <= 41)) { - V.slaves[i].recruiter = "mother"; - } else if ((V.slaves[i].actualAge < 24) && (random(1, 100) <= 40)) { - V.slaves[i].recruiter = "daughter"; - } else if ((V.slaves[i].actualAge < 43) && (random(1, 100) <= 20)) { - V.slaves[i].recruiter = "older sister"; - } else if ((V.slaves[i].actualAge < 25) && (V.slaves[i].actualAge > 18) && (random(1, 100) <= 20)) { - V.slaves[i].recruiter = "young sister"; - } - } else { - V.slaves[i].recruiter = 0; - } - } - /* closes family mode */ - V.slaves[i].counter.milk = 0; - V.slaves[i].counter.cum = 0; - V.slaves[i].counter.births = 0; - V.slaves[i].counter.mammary = 0; - V.slaves[i].counter.penetrative = 0; - V.slaves[i].counter.oral = 0; - V.slaves[i].counter.anal = 0; - V.slaves[i].counter.vaginal = 0; - V.slaves[i].lifetimeCashExpenses = 0; - V.slaves[i].lifetimeCashIncome = 0; - V.slaves[i].lastWeeksCashIncome = 0; - V.slaves[i].lifetimeRepExpenses = 0; - V.slaves[i].lifetimeRepIncome = 0; - V.slaves[i].lastWeeksRepExpenses = 0; - V.slaves[i].lastWeeksRepIncome = 0; - } -}; diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js index 6d5d69aeb3462b1bec70f1111e8dc1c3de9360b6..c60a6ff8ae67fb32cff8fe64febd60cc7492b04d 100644 --- a/src/data/backwardsCompatibility/datatypeCleanup.js +++ b/src/data/backwardsCompatibility/datatypeCleanup.js @@ -394,7 +394,7 @@ App.Entity.Utils.SlaveDataSchemeCleanup = (function() { } if (slave.hasOwnProperty("scars")) { // even if it's 0 if (slave.scars === 5) { - App.Medicine.Modification.addScar(slave, "left cheek", "menacing"); // old location was not defined, but surgery described it as facial. Putting it on left cheek for a default. + App.Medicine.Modification.addScar(slave, "left cheek", "menacing"); // old location was not defined, but surgery described it as facial. Putting it on left cheek for a default. } else if (slave.scars === 6) { App.Medicine.Modification.addScar(slave, "left cheek", "exotic"); } else if (slave.scars) { // not 0 @@ -581,13 +581,13 @@ window.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() { slave.pubicHStyle = "neat"; } if (typeof slave.underArmHColor !== "string") { - slave.underArmHColor = "slave.hColor"; + slave.underArmHColor = slave.hColor; } if (typeof slave.underArmHStyle !== "string") { slave.underArmHStyle = "waxed"; } if (typeof slave.eyebrowHColor !== "string") { - slave.eyebrowHColor = "slave.hColor"; + slave.eyebrowHColor = slave.hColor; } if (typeof slave.eyebrowHStyle !== "string") { slave.eyebrowHStyle = "natural"; @@ -1234,13 +1234,13 @@ window.childHairDatatypeCleanup = function childHairDatatypeCleanup(child) { child.pubicHStyle = "neat"; } if (typeof child.underArmHColor !== "string") { - child.underArmHColor = "child.hColor"; + child.underArmHColor = child.hColor; } if (typeof child.underArmHStyle !== "string") { child.underArmHStyle = "waxed"; } if (typeof child.eyebrowHColor !== "string") { - child.eyebrowHColor = "child.hColor"; + child.eyebrowHColor = child.hColor; } if (typeof child.eyebrowHStyle !== "string") { child.eyebrowHStyle = "natural"; diff --git a/src/data/backwardsCompatibility/updateSlaveObject.js b/src/data/backwardsCompatibility/updateSlaveObject.js index 6c98695e4ce036159e9337c18e60012e1ea593e2..89c8ce1546ad040ca459f4557d712b9e2da0963c 100644 --- a/src/data/backwardsCompatibility/updateSlaveObject.js +++ b/src/data/backwardsCompatibility/updateSlaveObject.js @@ -1,8 +1,11 @@ -App.Update.Slave = function(slave) { +App.Update.Slave = function(slave, genepool=false) { slave.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}, slave.geneticQuirks); - - WombInit(slave); + if (genepool) { + slave.womb = []; + } else { + WombInit(slave); + } if (slave.earShape === undefined) { slave.earShape = "normal"; } if (slave.earT === undefined) { slave.earT = "none"; } @@ -63,7 +66,7 @@ App.Update.Slave = function(slave) { } } if (slave.genetics === undefined) { slave.genetics = {}; } - if (slave.geneMods === undefined) { geneMods = {NCS: 0, rapidCellGrowth: 0}; } + if (slave.geneMods === undefined) { slave.geneMods = {NCS: 0, rapidCellGrowth: 0}; } if (slave.inducedNCS !== undefined) { slave.geneMods.NCS = slave.inducedNCS; delete slave.inducedNCS; @@ -213,9 +216,10 @@ App.Update.Slave = function(slave) { } } - if (V.releaseID < 1059) { + if (V.releaseID < 1059 || !(slave.eye)) { slave.eye = new App.Entity.EyeState(); - setGeneticEyeColor(slave, slave.origEye); + const origEye = slave.origEye || "brown"; + setGeneticEyeColor(slave, origEye); if (slave.eyes === -4) { eyeSurgery(slave, "both", "remove"); } else { @@ -229,17 +233,14 @@ App.Update.Slave = function(slave) { } else if (slave.eyes === -1) { eyeSurgery(slave, "both", "blur"); } - setEyeColorFull(slave, slave.eyeColor, slave.pupil, slave.sclerae, "both"); + const eyeColor = slave.pupil || "brown"; + const pupil = slave.pupil || "circular"; + const sclerae = slave.pupil || "white"; + setEyeColorFull(slave, eyeColor, pupil, sclerae, "both"); if (typeof slave.geneticQuirks.heterochromia === "string") { setEyeColor(slave.geneticQuirks.heterochromia, "left"); } } - delete slave.eyes; - delete slave.eyesImplant; - delete slave.eyeColor; - delete slave.origEye; - delete slave.pupil; - delete slave.sclerae; } if (slave.eyes !== undefined) {delete slave.eyes;} @@ -374,6 +375,13 @@ App.Update.Slave = function(slave) { slave.markings = "beauty mark"; } + if (slave.underArmHColor === "slave.hColor") { + slave.underArmHColor === slave.hColor; + } + if (slave.eyebrowHColor === "slave.hColor") { + slave.eyebrowHColor === slave.hColor; + } + if (slave.genes === undefined) { if (slave.ovaries === 1) { slave.genes = "XX"; diff --git a/src/data/newGamePlus.js b/src/data/newGamePlus.js new file mode 100644 index 0000000000000000000000000000000000000000..3301f7de6be125bd34edf7f46a92c576fafc3c9a --- /dev/null +++ b/src/data/newGamePlus.js @@ -0,0 +1,185 @@ +App.Data.NewGamePlus = (function() { + const NGPOffset = 1200000; + + function ngpSlaveID(id, preserveSpecial=false) { + const minID = preserveSpecial ? -20 : -1; + if (id > 0) { + id += NGPOffset; + } else if (V.freshPC === 1 && id === -1) { + id = -NGPOffset; + } else if (id < minID) { + id -= NGPOffset; + } + return id; + } + + function slaveOrZero(id) { + if (id > 0 && !getSlave(id)) { + return 0; + } + return id; + } + + function PCInit() { + if (V.freshPC === 0) { + cashX(V.ngpParams.prosperity, "personalBusiness"); + const oldCash = V.cash; + V.cash = 0; + V.cashLastWeek = 0; + cashX((Math.clamp(1000*Math.trunc(oldCash/100000), 5000, 1000000)), "personalBusiness"); + if (V.retainCareer === 0) { + V.PC.career = "arcology owner"; + V.PC.skill.trading = 100; + V.PC.skill.warfare = 100; + V.PC.skill.hacking = 100; + V.PC.skill.slaving = 100; + V.PC.skill.engineering = 100; + V.PC.skill.medicine = 100; + } + V.PC.mother = ngpSlaveID(V.PC.mother); + V.PC.father = ngpSlaveID(V.PC.father); + V.PC.pregSource = slaveOrZero(ngpSlaveID(V.PC.pregSource, true)); + for (let fetus of V.PC.womb) { + fetus.fatherID = ngpSlaveID(fetus.fatherID, true); + fetus.genetics.father = ngpSlaveID(fetus.genetics.father, true); + fetus.genetics.mother = ngpSlaveID(fetus.genetics.mother, true); + } + } else { + V.PC = basePlayer(); + WombInit(V.PC); + V.cheater = 0; + V.cash = 0; + cashX(10000, "personalBusiness"); + } + } + + function slaveLoopInit() { + const ngUpdateGenePool = function(genePool = []) { + const transferredSlaveIds = (State.variables.slaves || []) + .filter(s => s.ID >= NGPOffset) + .map(s => s.ID - NGPOffset); + return genePool + .filter(s => (transferredSlaveIds.includes(s.ID))) + .map(function(s) { + const result = jQuery.extend(true, {}, s); + result.ID += NGPOffset; + return result; + }); + }; + + const ngUpdateMissingTable = function(missingTable) { + const newTable = {}; + + (State.variables.slaves || []) + .forEach(s => ([s.pregSource + NGPOffset, s.mother + NGPOffset, s.father + NGPOffset] + .filter(i => (i in missingTable)) + .forEach(i => { + newTable[i - NGPOffset] = missingTable[i]; + newTable[i - NGPOffset].ID -= NGPOffset; + }))); + + return newTable; + }; + + V.slaves.deleteWith((s) => s.assignment !== "be imported"); + + for (let slave of V.slaves) { + slave.ID += NGPOffset; + slave.assignment = "rest"; + slave.weekAcquired = 0; + slave.newGamePlus = 1; + slave.mother = ngpSlaveID(slave.mother); + slave.father = ngpSlaveID(slave.father); + slave.canRecruit = 0; + slave.breedingMark = 0; + if (typeof V.ngpParams.nationality === 'string') { + slave.nationality = V.ngpParams.nationality; + } + slave.relationTarget = ngpSlaveID(slave.relationTarget); + slave.relationshipTarget = ngpSlaveID(slave.relationshipTarget); + slave.cloneID = ngpSlaveID(slave.cloneID); + slave.pregSource = ngpSlaveID(slave.pregSource, true); + for (let fetus of slave.womb) { + fetus.fatherID = ngpSlaveID(fetus.fatherID, true); + fetus.genetics.father = ngpSlaveID(fetus.genetics.father, true); + fetus.genetics.mother = ngpSlaveID(fetus.genetics.mother, true); + } + slave.rivalry = 0, slave.rivalryTarget = 0, slave.subTarget = 0; + slave.drugs = "no drugs"; + slave.porn.spending = 0; + slave.rules.living = "spare"; + slave.diet = "healthy"; + slave.pregControl = "none"; + } + V.slaveIndices = slaves2indices(); + for (let slave of V.slaves) { + slave.pregSource = slaveOrZero(slave.pregSource); + slave.cloneID = slaveOrZero(slave.cloneID); + slave.relationshipTarget = slaveOrZero(slave.relationshipTarget); + slave.relationTarget = slaveOrZero(slave.relationTarget); + } + V.genePool = ngUpdateGenePool(V.genePool); + if (typeof V.missingTable === undefined || V.showMissingSlaves === false) { + V.missingTable = {}; + } else { + V.missingTable = ngUpdateMissingTable(V.missingTable); + } + let validRelation = (s) => (s.relationTarget !== 0 && getSlave(s.relationTarget).relationTarget === s.ID); + let validRelationship = (s) => (s.relationshipTarget !== 0 && getSlave(s.relationshipTarget).relationshipTarget === s.ID); + for (let slave of V.slaves) { + if (V.familyTesting === 1) { + if (slave.canRecruit === 1) { + /* V.recruiters.push(slave);*/ + } + } else { + if (slave.relation === 0) { + if (random(1, 100) <= 5) { + slave.recruiter = "twin"; + } else if ((slave.actualAge > 32) && (random(1, 100) <= 41)) { + slave.recruiter = "mother"; + } else if ((slave.actualAge < 24) && (random(1, 100) <= 40)) { + slave.recruiter = "daughter"; + } else if ((slave.actualAge < 43) && (random(1, 100) <= 20)) { + slave.recruiter = "older sister"; + } else if ((slave.actualAge < 25) && (slave.actualAge > 18) && (random(1, 100) <= 20)) { + slave.recruiter = "young sister"; + } + } else { + if (!validRelation(slave)) { + slave.relation = 0; + slave.relationTarget = 0; + } + slave.recruiter = 0; + } + } + if ((slave.relationship < 0 && V.freshPC === 1) || (slave.relationship > 0 && !validRelationship(slave))) { + slave.relationship = 0; + slave.relationshipTarget = 0; + } + slave.counter.milk = 0; + slave.counter.cum = 0; + slave.counter.births = 0; + slave.counter.mammary = 0; + slave.counter.penetrative = 0; + slave.counter.oral = 0; + slave.counter.anal = 0; + slave.counter.vaginal = 0; + slave.lifetimeCashExpenses = 0; + slave.lifetimeCashIncome = 0; + slave.lastWeeksCashIncome = 0; + slave.lifetimeRepExpenses = 0; + slave.lifetimeRepIncome = 0; + slave.lastWeeksRepExpenses = 0; + slave.lastWeeksRepIncome = 0; + } + } + + function doNGPSetup() { + slaveLoopInit(); + PCInit(); + resetFamilyCounters(); + V.ngpParams = {}; + } + + return doNGPSetup; +})(); diff --git a/src/descriptions/arcologyDescription.js b/src/descriptions/arcologyDescription.js index f25075e068ed659282904d9fb6d8abd39322d4a1..d6ea383c4df64f2e4136eefb53facc623924dfdb 100644 --- a/src/descriptions/arcologyDescription.js +++ b/src/descriptions/arcologyDescription.js @@ -13,7 +13,7 @@ App.Desc.playerArcology = function(lastElement) { const fragment = document.createDocumentFragment(); fragment.append(App.UI.DOM.makeElement("span", A.name, "name"), - `, your arcology, is located in a Free City in ${V.terrain === "oceanic" ? "the middle of the ocean" : V.continent}. It is a huge structure whose${V.arcologyUpgrade.apron === 1 ? " solar-paneled" : ""} skin gleams in the sunshine${V.arcologyUpgrade.hydro === 1 ? ", while verdant exterior hydroponics bays lend it an air of growth" : ""}. `); + `, your arcology, is located in a Free City in ${V.terrain === "oceanic" ? "the middle of the ocean" : V.continent}. It is a huge structure whose${V.arcologyUpgrade.apron === 1 ? " solar-paneled" : ""} skin gleams in the sunshine${V.arcologyUpgrade.hydro === 1 ? ", while verdant exterior hydroponics bays lend it an air of growth" : ""}. `); let buffer = []; if (V.weatherCladding === 1) { @@ -196,10 +196,10 @@ App.Desc.playerArcology = function(lastElement) { let buffer = []; buffer.push(`The entryway features the first of ${A.name}'s many banks of public screens.`); if (A.FSSupremacistDecoration >= 40) { - buffer.push(`Some are showing talk shows and documentaries supporting A.FSSupremacistRace supremacy.`); + buffer.push(`Some are showing talk shows and documentaries supporting ${A.FSSupremacistRace} supremacy.`); } if (A.FSSubjugationistDecoration >= 40) { - buffer.push(`Some are showing long pseudoscientific programs explaining A.FSSubjugationistRace degeneracy.`); + buffer.push(`Some are showing long pseudoscientific programs explaining ${A.FSSubjugationistRace} degeneracy.`); } if (A.FSDegradationistDecoration >= 40) { buffer.push(`Some are showing abusive pornography involving slaves being beaten, sodomized, and modified against their will.`); @@ -333,7 +333,7 @@ App.Desc.playerArcology = function(lastElement) { } else { buffer.push(`sucking dick and taking anal, and the ones that have pussies are being fucked there, too.`); } - const t = `As a result, ${V.brothelName} is known as the place to go if you want to rent`; + const t = `As a result, ${V.brothelName} is known as the place to go if you want to rent`; if (V.brothelAdsXX === 1) { if (V.brothelAdsImplanted === 1 && V.brothelAdsStacked === 1) { buffer.push(`${t} a${V.brothelAdsPreg === 1 ? " pregnant" : ""} bimbo's pussy.`); @@ -353,7 +353,7 @@ App.Desc.playerArcology = function(lastElement) { } } if (V.clubAdsSpending > 0) { - buffer.push(`Music videos set in ${V.clubName} are also shown frequently.`); + buffer.push(`Music videos set in ${V.clubName} are also shown frequently.`); if (V.clubAdsOld === 1) { buffer.push(`The featured strippers are all MILFs.`); } else if (V.clubAdsOld === -1) { @@ -405,7 +405,7 @@ App.Desc.playerArcology = function(lastElement) { buffer.push(`their holes.`); } buffer.push(`The music videos are very popular.`); - const t = `As a result, ${V.clubName} is known as the place to spend a night partying with`; + const t = `As a result, ${V.clubName} is known as the place to spend a night partying with`; if (V.clubAdsXX === 1) { if (V.clubAdsImplanted === 1 && V.clubAdsStacked === 1) { buffer.push(`${t}${V.clubAdsPreg === 1 ? " pregnant" : ""} bimbos.`); @@ -775,7 +775,7 @@ App.Desc.playerArcology = function(lastElement) { } buffer.push(`in gladiatorial combat.`); } else if (A.FSAztecRevivalistDecoration >= 80) { - buffer.push(`The sound of prayer and chanting echoes across the space, briefly accompanied by a sacrifice's ${A.FSPaternalist !== "unset" ? "moaning" : "last scream"} as the rite completes.`); + buffer.push(`The sound of prayer and chanting echoes across the space, briefly accompanied by a sacrifice's ${A.FSPaternalist !== "unset" ? "moaning" : "last scream"} as the rite completes.`); } else if (A.FSEgyptianRevivalistDecoration >= 80) { buffer.push(`To the side of the plaza is a huge stone entryway heading down: the entrance to the tomb you have prepared for yourself.`); } else if (A.FSEdoRevivalistDecoration >= 80) { @@ -834,9 +834,9 @@ App.Desc.playerArcology = function(lastElement) { buffer.push(`The average slave is quite healthy.`); } else if (A.FSTransformationFetishistSMR === 1) { if (A.FSTransformationFetishistResearch === 1) { - buffer.push(`Breast implants are almost universal; ${A.FSSlimnessEnthusiast === "unset" ? "an M-cup bust is below average among the slave population" : "even the most lithe slave sports a pair of overly round chest balloons"}.`); + buffer.push(`Breast implants are almost universal; ${A.FSSlimnessEnthusiast === "unset" ? "an M-cup bust is below average among the slave population" : "even the most lithe slave sports a pair of overly round chest balloons"}.`); } else { - buffer.push(`Breast implants are almost universal; ${A.FSSlimnessEnthusiast === "unset" ? "a D-cup bust is below average among the slave population" : "even the most lithe slave sports a pair of overly round chest balloons"}.`); + buffer.push(`Breast implants are almost universal; ${A.FSSlimnessEnthusiast === "unset" ? "a D-cup bust is below average among the slave population" : "even the most lithe slave sports a pair of overly round chest balloons"}.`); } } if (A.FSIntellectualDependencySMR === 1) { @@ -905,14 +905,14 @@ App.Desc.playerArcology = function(lastElement) { } } else { if (V.peacekeepers.strength >= 50) { - div.append(`General ${V.peacekeepers.generalName} now governs an area near the Free City as a warlord, using the men and women of his former peacekeeping forces to rule.`); + div.append(`General ${V.peacekeepers.generalName} now governs an area near the Free City as a warlord, using the men and women of his former peacekeeping forces to rule.`); if (V.peacekeepers.attitude >= 100) { div.append(` The area is a de facto client state of your arcology.`); } else { div.append(` He considers himself indebted to you, and delivers periodic tributes of menial slaves.`); } } else { - // TODO create an actual framework for this behaviour (only refreshing a specific element) + // TODO create an actual framework for this behavior (only refreshing a specific element) const undermine = function undermine() { const fragment = document.createDocumentFragment(); diff --git a/src/endWeek/healthFunctions.js b/src/endWeek/healthFunctions.js index 254ee4b69d1308f4219da8e00843b1434faeb79f..fa68975f0b9038b52116dc1bf2cb3bb2a7b4f4cf 100644 --- a/src/endWeek/healthFunctions.js +++ b/src/endWeek/healthFunctions.js @@ -37,7 +37,7 @@ Tiredness Being tired or exhausted also reduces a slave's ability to resist the player, increasing devotion and fear. Health - The aggregate of condition, short term damage and long term damage to provide an indication of the current overal state of the slave. The slave will die once this reached -100. + The aggregate of condition, short term damage and long term damage to provide an indication of the current overall state of the slave. The slave will die once this reached -100. */ /* Getting ill depends on the following factors; @@ -45,9 +45,9 @@ Health - long term damage (accumulated through getting old(er) and residual from short term damage) - short term damage (accumulated through serious illness, chemical carcinogens, damaging surgeries and other health damage sources) 125% - chemical carcinogens (more serious illness chance with high carcinogen levels) - - age (long term damge takes care of older slaves, the young ones need a specific vulnerability) + - age (long term damage takes care of older slaves, the young ones need a specific vulnerability) - use of curatives - - assignment (rest, clinic, spa and master suite less likely, whoring, slutting and goloryholes more likely.) + - assignment (rest, clinic, spa and master suite less likely, whoring, slutting and gloryholes more likely.) - random chance Can be blocked with preventatives. */ @@ -62,13 +62,15 @@ window.illness = function illness(slave) { let r = ``; let assignBonus = 0; // bonus for healthy assignments + // eslint-disable-next-line no-unused-vars let he, him, his, hers, himself, girl, loli, He, His; ({ + // eslint-disable-next-line no-unused-vars he, him, his, hers, himself, girl, He, His, loli } = getPronouns(slave)); let sicknessDegree = ["fine", "minor illness", "illness", "bad illness", "severe illness", "life-threatening illness"]; - // On the macro side of things disease could also happen to the acrology's population as the arcology becomes crowded, killing citizens and putting slaves at greater risk of getting ill. Again with upgrades/policies to mitigate the issue made available TODO? + // On the macro side of things disease could also happen to the arcology's population as the arcology becomes crowded, killing citizens and putting slaves at greater risk of getting ill. Again with upgrades/policies to mitigate the issue made available TODO? if (slave.assignment === "live with your agent" || slave.assignment === "be your agent") { if (H.illness !== 0) { H.illness = 0; @@ -118,7 +120,7 @@ window.illness = function illness(slave) { let bonus_modifiers = random + assignBonus + nurse_effectiveness; let curativesBonus = (slave.curatives > 1 || slave.inflationType === "curative") ? 2 : 1; - // When ill, a slave has a 60% chance of getting better the next week at complete default, 70% with a favourable assignment, 80% with curatives, 90% with both measures active and additional benefits depending on the nurse on duty + // When ill, a slave has a 60% chance of getting better the next week at complete default, 70% with a favorable assignment, 80% with curatives, 90% with both measures active and additional benefits depending on the nurse on duty if (H.illness > 0 && ((health_adjusted + age_modifier) / 3) + bonus_modifiers > 40 / curativesBonus) { if (nurse_effectiveness > 30 && (jsRandom(1, 2) === 2 || slave.assignment === "get treatment in the clinic") && H.illness > 1) { // A particularly effective nurse can improve illness faster H.illness -= 2; @@ -282,7 +284,7 @@ window.endWeekHealthDamage = function endWeekHealthDamage(slave) { shortToCondition += Math.max(Math.trunc(H.shortDamage * 0.5), 1); // 50% of short term damage gets transferred H.shortDamage -= shortToCondition; if (slave.assignment === "get treatment in the clinic") { - H.shortDamage = Math.trunc(H.shortDamage * 0.5); // An aditional 50% of short term damage reduction (75% total) for getting treatment in the clinic + H.shortDamage = Math.trunc(H.shortDamage * 0.5); // An additional 50% of short term damage reduction (75% total) for getting treatment in the clinic } else if (slave.assignment === "rest" || slave.assignment === "rest in the spa") { H.shortDamage = Math.trunc(H.shortDamage * 0.75); // An additional 25% of short term damage reduction (62.5% total) for resting } @@ -325,7 +327,7 @@ window.endWeekHealthDamage = function endWeekHealthDamage(slave) { }; /** - * Tells if a slave will try to work to death due to mental hangups + * Tells if a slave will willingly work to death * @param {App.Entity.SlaveState} slave * @returns {boolean} */ @@ -333,8 +335,28 @@ window.willWorkToDeath = function willWorkToDeath(slave) { // More to come in the future if (slave.trust < -50) { // Maybe lower return true; + } else if (slave.devotion > 50) { + return true; } else if (slave.sexualFlaw === "self hating") { return true; + } else if (slave.fetish === "mindbroken") { + return true; + } + return false; +}; + +/** + * Tells if a slave is taking the week off to rest + * @param {App.Entity.SlaveState} slave + * @returns {boolean} + */ +window.slaveResting = function slaveResting(slave) { + if (slave.rules.rest === "cruel" && slave.health.tired > 90) { + return true; + } else if (slave.rules.rest === "restrictive" && slave.health.tired > 60) { + return true; + } else if (slave.rules.rest === "permissive" && slave.health.tired > 30) { + return true; } return false; }; @@ -347,6 +369,7 @@ window.willWorkToDeath = function willWorkToDeath(slave) { window.tired = function tired(slave) { const H = slave.health; let livingRules = 0; + let restRules = 0; let assignment = 0; let reward = 0; let punishment = 0; @@ -439,35 +462,34 @@ window.tired = function tired(slave) { } else { assignment -= 8; } - } else if (["be confined in the arcade"].includes(slave.assignment)) { // Brutal assignments - // assignment += 50; // We should have a safeguard in place to prevent slave health meltdown while contained in the machine + } else if (["be confined in the arcade"].includes(slave.assignment)) { + assignment += 35; + if (V.arcadeUpgradeHealth === 2) { + assignment -= 60; + } else if (V.arcadeUpgradeHealth === 1) { + assignment -= 30; + } } else if (["work a glory hole", "work as a farmhand"].includes(slave.assignment)) { // Hard assignments - if (!willWorkToDeath(slave)) { - if (slave.tired > 90) { - assignment += 1; - } else if (slave.tired > 60) { - assignment += 10; - } + if (slaveResting(slave)) { + assignment -= 20; + V.slaveUsedRest = 1; + } else if (slave.tired + 20 >= 90 && !willWorkToDeath(slave)) { + assignment += 1; + } else if (slave.devotion > 20) { + assignment += 15; } else { - if (slave.devotion > 20) { - assignment += 15; - } else { - assignment += 20; - } + assignment += 20; } } else if (["serve in the club", "serve the public", "whore", "work in the brothel"].includes(slave.assignment)) { // Moderate assignments - if (!willWorkToDeath(slave)) { - if (slave.tired > 90) { - assignment += 1; - } else if (slave.tired > 70) { - assignment += 7; - } + if (slaveResting(slave)) { + assignment -= 20; + V.slaveUsedRest = 1; + } else if (slave.tired + 15 >= 90 && !willWorkToDeath(slave)) { + assignment += 1; + } else if (slave.devotion > 20) { + assignment += 10; } else { - if (slave.devotion > 20) { - assignment += 10; - } else { - assignment += 15; - } + assignment += 15; } } else if (["serve in the master suite", "please you", "be a servant"].includes(slave.assignment)) { // Easy assignments if (slave.tired > 75) { @@ -576,7 +598,14 @@ window.tired = function tired(slave) { // Add advanced pregnancy/high .bellyPreg (it is either caused by an advanced pregnancy or high multiples, both draining) tiredness gain gated under preg effects // Add pregnancy speed up effects - tiredChange = livingRules + assignment + reward + punishment; // + muscles + health + // day of rest + if (slave.rules.rest === "mandatory") { + if (["work a glory hole", "work as a farmhand", "serve in the club", "serve the public", "whore", "work in the brothel", "be a subordinate slave", "be a servant", "work as a servant", "please you", "serve in the master suite"].includes(slave.assignment) || (V.dairyRestraintsSetting < 2 && slave.assignment === "work in the dairy")) { + restRules -= 20; + } + } + + tiredChange = livingRules + assignment + restRules + reward + punishment; // + muscles + health H.tired += tiredChange; // HG special cases @@ -604,28 +633,49 @@ window.tired = function tired(slave) { } }; +/** + * @param {App.Entity.SlaveState} slave + * @returns {number} + */ +window.restEffects = function restEffects(slave, exhaustion) { + // exhaustion holds the weekly .tired gain from the assignment. + if (!slave.fuckdoll) { + if (slave.rules.rest === "mandatory") { + return .86; + } else if (slaveResting(slave)) { + return .25; + } else if (slave.tired + exhaustion >= 90 && !willWorkToDeath(slave)) { + return .10; + } else { + return healthPenalty(slave); + } + } +}; + /** * @param {App.Entity.SlaveState} slave * @returns {void} */ window.tiredFucks = function tiredFucks(slave) { - /* temp disable - if (!slave.fuckdoll && slave.fetish !== "mindbroken") { - if (slave.assignment === "work a glory hole" || slave.assignment === "be confined in the arcade") { - let acceptance = 0; - acceptance += Math.trunc(slave.energy / 10); - acceptance -= Math.trunc((slave.intelligence + slave.intelligenceImplant) / 10); - if (slave.fetish === "masochist" || slave.fetish === "humiliation") { - acceptance += Math.trunc(slave.fetishStrength / 10); - } + if (!slave.fuckdoll) { + let acceptance = 0; + acceptance += Math.trunc(slave.energy / 10); + acceptance -= Math.trunc((slave.intelligence + slave.intelligenceImplant) / 10); + if (slave.fetish === "masochist" || slave.fetish === "humiliation") { + acceptance += Math.trunc(slave.fetishStrength / 10); + } + if (slave.assignment === "work a glory hole") { if ((acceptance > 20 && slave.devotion > 20) || slave.sexualFlaw === "self hating") { slave.health.tired += Math.trunc(slave.sexAmount * (1 + normalRandInt(0, 5) / 100) / 100); } else { slave.health.tired += Math.trunc(slave.sexAmount * (1 + normalRandInt(0, 5) / 100) / 50); } - } else { - slave.health.tired += Math.trunc(slave.sexAmount * (1 + normalRandInt(0, 5) / 100) / 25); - } + } /*else { + if ((acceptance > 20 && slave.devotion > 20) || slave.sexualFlaw === "self hating") { + slave.health.tired += Math.trunc(slave.sexAmount * (1 + normalRandInt(0, 5) / 100) / 50); + } else { + slave.health.tired += Math.trunc(slave.sexAmount * (1 + normalRandInt(0, 5) / 100) / 25); + } + }*/ } - */ }; diff --git a/src/endWeek/minorInjuryResponse.js b/src/endWeek/minorInjuryResponse.js index 5292e976a7cf915cc5673db3ca7fa34287943bfe..8c210ddf521d8e226a9c47037557a658fb9200ec 100644 --- a/src/endWeek/minorInjuryResponse.js +++ b/src/endWeek/minorInjuryResponse.js @@ -7,38 +7,68 @@ window.minorInjuryResponse = function minorInjuryResponse(slave) { const arcologyUpgrade = State.variables.arcologyUpgrade; const {he, himself, He} = getPronouns(slave); let r = ""; + let trackedCategory = ""; - if (arcology.FSDegradationist > 20) { - r += ` ${He} carries on, knowing that in your degradationist arcology, this is accepted behavior.`; - } else if (arcology.FSPaternalist > 20) { - if (arcologyUpgrade.drones === 1 && jsRandom(1, 100) > 50) { - r += ` The security drones successfully detain him and oblige him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`; - cashX(50, "slaveUpkeep", slave); - } else if (arcologyUpgrade.grid === 1 && jsRandom(1, 100) > 50) { - r += ` The computer systems successfully detain him and require him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`; - cashX(50, "slaveUpkeep", slave); - } else if (slave.skill.whoring > jsRandom(1, 100)) { - r += ` ${slave.slaveName} is used to this sort of thing, and convinces him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`; - cashX(50, "slaveUpkeep", slave); - } else if (slave.skill.combat > 0) { - r += ` ${slave.slaveName} can take care of ${himself}, and ${he} successfully forces him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`; - cashX(50, "slaveUpkeep", slave); - } - } else { - if (arcologyUpgrade.drones === 1 && jsRandom(1, 100) > 50) { - r += ` The security drones successfully detain him and oblige him to pay minor <span class="yellowgreen">compensation.</span>`; - cashX(10, "slaveUpkeep", slave); - } else if (arcologyUpgrade.grid === 1 && jsRandom(1, 100) > 50) { - r += ` The computer systems successfully detain him and require him to pay minor <span class="yellowgreen">compensation.</span>`; - cashX(10, "slaveUpkeep", slave); - } else if (slave.skill.whoring > jsRandom(1, 100)) { - r += ` ${slave.slaveName} is used to this sort of thing, and convinces him to pay minor <span class="yellowgreen">compensation.</span>`; - cashX(10, "slaveUpkeep", slave); - } else if (slave.skill.combat > 0) { - r += ` ${slave.slaveName} can take care of ${himself}, and ${he} successfully forces him to pay minor <span class="yellowgreen">compensation.</span>`; - cashX(10, "slaveUpkeep", slave); + switch (slave.assignment) { + case window.Job.WHORE: + trackedCategory = "slaveAssignmentWhore"; + break; + case window.Job.MADAM: + trackedCategory = "slaveAssignmentMadam"; + break; + case window.Job.BROTHEL: + trackedCategory = "slaveAssignmentBrothel" + break; + case window.Job.PUBLIC: + trackedCategory = "slaveAssignmentPublic" + break; + case window.Job.DJ: + trackedCategory = "slaveAssignmentDj"; + break; + case window.Job.CLUB: + trackedCategory = "slaveAssignmentClub"; + break; + default: + trackedCategory = "slaveAssignmentUndefined"; + break; + } + r = responseWithTracking(slave, trackedCategory); + + function responseWithTracking(s, category) { + let o = ""; + if (arcology.FSDegradationist > 20) { + o += ` ${He} carries on, knowing that in your degradationist arcology, this is accepted behavior.`; + } else if (arcology.FSPaternalist > 20) { + if (arcologyUpgrade.drones === 1 && jsRandom(1, 100) > 50) { + o += ` The security drones successfully detain him and oblige him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`; + cashX(50, category, slave); + } else if (arcologyUpgrade.grid === 1 && jsRandom(1, 100) > 50) { + o += ` The computer systems successfully detain him and require him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`; + cashX(50, category, slave); + } else if (slave.skill.whoring > jsRandom(1, 100)) { + o += ` ${slave.slaveName} is used to this sort of thing, and convinces him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`; + cashX(50, category, slave); + } else if (slave.skill.combat > 0) { + o += ` ${slave.slaveName} can take care of ${himself}, and ${he} successfully forces him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`; + cashX(50, category, slave); + } + } else { + if (arcologyUpgrade.drones === 1 && jsRandom(1, 100) > 50) { + o += ` The security drones successfully detain him and oblige him to pay minor <span class="yellowgreen">compensation.</span>`; + cashX(10, category, slave); + } else if (arcologyUpgrade.grid === 1 && jsRandom(1, 100) > 50) { + o += ` The computer systems successfully detain him and require him to pay minor <span class="yellowgreen">compensation.</span>`; + cashX(10, category, slave); + } else if (slave.skill.whoring > jsRandom(1, 100)) { + o += ` ${slave.slaveName} is used to this sort of thing, and convinces him to pay minor <span class="yellowgreen">compensation.</span>`; + cashX(10, category, slave); + } else if (slave.skill.combat > 0) { + o += ` ${slave.slaveName} can take care of ${himself}, and ${he} successfully forces him to pay minor <span class="yellowgreen">compensation.</span>`; + cashX(10, category, slave); + } } + return o; } - + return r; }; diff --git a/src/endWeek/saBeYourHeadGirl.js b/src/endWeek/saBeYourHeadGirl.js new file mode 100644 index 0000000000000000000000000000000000000000..e94554dc8a7a418666416cab9011f454e093f25c --- /dev/null +++ b/src/endWeek/saBeYourHeadGirl.js @@ -0,0 +1,320 @@ +window.saBeYourHeadGirl = (function saBeYourHeadGirl() { + "use strict"; + + let r; + + // eslint-disable-next-line no-unused-vars + let he, him, his, hers, himself, girl, loli, He, His, wife, wives; + + let fetishChange; + let arcology; + + return saBeYourHeadGirl; + + /** + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ + function saBeYourHeadGirl(slave) { + r = []; + fetishChange = fetishChangeChance(slave); + arcology = V.arcologies[0]; + + ({ + // eslint-disable-next-line no-unused-vars + he, him, his, hers, himself, girl, He, His, loli, wife, wives + } = getPronouns(slave)); + + updateHGState(slave); + jobPreface(slave); + theHGLife(slave); + if (V.personalAttention === "HG") { + playerHelpsHG(slave); + } + if (V.HGFormality === 0) { + HGFormility(slave); + } + jobEffects(slave); + if (slave.prestige === 0) { + prestigeGain(slave); + } + cleanupVars(slave); + + return r.join(" "); + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function updateHGState(slave) { + V.HGTimeInGrade += 1; + if (V.HGSuite === 1) { + slave.rules.living = "luxurious"; + } + tired(slave); + } + + /** + * @param {App.Entity.SlaveState} slave + * */ + function jobPreface(slave) { + if (arcology.FSEgyptianRevivalistLaw === 0) { + r.push(`helps manage your other slaves. ${He} helps them when they try and fail, and punishes them when they fail to try.`); + if (V.HGEnergy === 0) { + r.push(`${He} was <span class="red">too exhausted</span> to make any real progress this week, however.`); + } + } else { + r.push(`serves as your Consort. Though ${he} is still your slave, ${his} status is scarcely below that of a citizen. ${He} <span class="green">contributes to your reputation</span> just like a Concubine, and ${he} is <span class="hotpink">conscious</span> of the <span class="mediumaquamarine">trust</span> you place in ${him}.`); + slave.devotion += 1; + slave.trust += 1; + saPleaseYou(slave); + if (slave.relationship > 4) { + if (V.familyTesting === 1) { + if (slave.relationshipTarget === V.Concubine.ID) { + const concubinePronouns = getPronouns(V.Concubine); + if (areRelated(V.Concubine, slave) > 0) { + if (V.Concubine.mother === slave.ID || V.Concubine.father === slave.ID) { + r.push(`Your Concubine is your Consort's ${concubinePronouns.daughter}-${concubinePronouns.wife}. Truly, ${arcology.name} looks up to you <span class="green">as children to a father.</span>`); + repX(1000, "headGirl", slave); + } else if (slave.mother === V.Concubine.ID) { + r.push(`Your Concubine is your Consort's mother-${concubinePronouns.wife}. Truly, ${arcology.name} looks up to you <span class="green">as children to a father.</span>`); + repX(1000, "headGirl", slave); + } else if (slave.father === V.Concubine.ID) { + r.push(`Your Concubine is your Consort's father-${concubinePronouns.wife}. Truly, ${arcology.name} looks up to you <span class="green">as children to a father.</span>`); + repX(1000, "headGirl", slave); + } else { + switch (areSisters(slave, V.Concubine)) { + case 1: + r.push(`Your Concubine is your Consort's twin-${concubinePronouns.wife}. Truly, ${arcology.name} looks up to you <span class="green">as children to a father.</span>`); + repX(1000, "headGirl", slave); + break; + case 2: + r.push(`Your Concubine is your Consort's ${concubinePronouns.sister}-${concubinePronouns.wife}. Truly, ${arcology.name} looks up to you <span class="green">as children to a father.</span>`); + repX(1000, "headGirl", slave); + break; + case 3: + r.push(`Your Concubine is your Consort's half-${concubinePronouns.sister}-${concubinePronouns.wife}. Truly, ${arcology.name} looks up to you <span class="green">as children to a father.</span>`); + repX(1000, "headGirl", slave); + break; + default: + r.push(`<span style="bold">Shit went wrong! Post this in a bug report!</span> This is <span class="red">NOT as it should be.</span>`); + repX(500, "headGirl", slave); + } + } + } else { + r.push(`Your Consort and your Concubine are`); + if (wife === concubinePronouns.wife) { + r.push(`${wives}`); + } else { + r.push(`married`); + } + r.push(`to each other and to Pharaoh. This is <span class="green"> as it should be.</span>`); + repX(500, "headGirl", slave); + } + } else { + if (totalRelatives(slave) > 0) { + let relation = getSlave(slave.relationshipTarget); + const relationPronouns = getPronouns(relation); + if (relation.mother === slave.ID || relation.father === slave.ID) { + r.push(`Your Consort has a ${relationPronouns.daughter}-${relationPronouns.wife}. This is <span class="green">as it should be.</span>`); + repX(500, "headGirl", slave); + } else if (slave.mother === relation.ID) { + r.push(`Your Consort has a mother-${relationPronouns.wife}. This is <span class="green">as it should be.</span>`); + repX(500, "headGirl", slave); + } else if (slave.father === relation.ID) { + r.push(`Your Consort has a father-${relationPronouns.wife}. This is <span class="green">as it should be.</span>`); + repX(500, "headGirl", slave); + } else { + switch (areSisters(slave, relation)) { + case 1: + r.push(`Your Consort has a twin-${relationPronouns.wife}. This is <span class="green">as it should be.</span>`); + repX(500, "headGirl", slave); + break; + case 2: + r.push(`Your Consort has a ${relationPronouns.sister}-${relationPronouns.wife}. This is <span class="green">as it should be.</span>`); + repX(500, "headGirl", slave); + break; + case 3: + r.push(`Your Consort has a half-${relationPronouns.sister}-${relationPronouns.wife}. This is <span class="green">as it should be.</span>`); + repX(500, "headGirl", slave); + break; + } + } + } + } + } else { + if (slave.relationshipTarget === V.Concubine.ID) { + const concubinePronouns = getPronouns(V.Concubine); + if (slave.relationTarget === V.Concubine.ID) { + r.push(`Your Concubine is your Consort's slave.relation-${concubinePronouns.wife}. Truly, ${arcology.name} looks up to you <span class="green">as children to a father.</span>`); + repX(1000, "headGirl", slave); + } else { + r.push(`Your Consort and your Concubine are`); + if (wife === concubinePronouns.wife) { + r.push(`${wives}`); + } else { + r.push(`married`); + } + r.push(`to each other and to Pharaoh. This is <span class="green"> as it should be.</span>`); + repX(500, "headGirl", slave); + } + } else if (slave.relationshipTarget === slave.relationTarget) { + let relation = getSlave(slave.relationshipTarget); + const relationPronouns = getPronouns(relation); + r.push(`Your Consort has a slave.relation-${relationPronouns.wife}. This is <span class="green">as it should be.</span>`); + repX(500, "headGirl", slave); + } + } /* closes extended family mode */ + } + if (V.HGEnergy === 0) { + r.push(`${He} was <span class="red">too exhausted</span> to make any real progress with your slaves this week, however.`); + } + } + } + + /** + * @param {App.Entity.SlaveState} slave + * */ + function theHGLife(slave) { + if (V.HGTimeInGrade > 12) { + if (V.HGSuite === 1) { + r.push(`Being continually trusted with this position <span class="hotpink">increases ${his} devotion to you,</span> and encourages ${him} to <span class="mediumaquamarine">trust you in turn;</span> ${he}'s also <span class="hotpink">grateful</span> for ${his} nice suite, which makes ${him} one of the best provided for slaves in the Free Cities.`); + slave.devotion += 4; + slave.trust += 4; + } else if (slave.rules.living === "luxurious") { + r.push(`Being continually trusted with this position <span class="hotpink">increases ${his} devotion to you</span> and encourages ${him} to <span class="mediumaquamarine">trust you in turn.</span>`); + slave.devotion += 4; + slave.trust += 4; + } else { + r.push(`Being continually trusted with this position <span class="hotpink">slightly increases ${his} devotion to you,</span> though ${he} harbors some doubts because ${he} isn't allowed a room of ${his} own to set ${him} apart from the other slaves.`); + slave.devotion += 1; + } + } else { + if (V.HGSuite === 1) { + r.push(`${He}'s <span class="mediumaquamarine">grateful</span> for ${his} nice suite, which makes ${him} one of the best provided for slaves in the Free Cities.`); + slave.trust += 4; + } else if (slave.rules.living !== "luxurious" && slave.devotion <= 50) { + r.push(`Given ${his} lofty position, ${he} <span class="mediumorchid">harbors some doubts</span> in ${his} value to you since ${he} isn't allowed a room of ${his} own to set ${him} apart from the other slaves.`); + slave.devotion -= 2; + } + } + if (slave.rules.living !== "luxurious") { + r.push(`${His} duties are <span class="red">physically and mentally taxing,</span> especially with nothing more than a`); + if (slave.rules.living === "normal") { + r.push(`bed`); + } else { + r.push(`cot`); + } + r.push(`waiting for ${him} in the slave dormitory.`); + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function playerHelpsHG(slave) { + r.push(`You're cooperating with ${him} this week, working with ${V.assistant.name} to free up some of ${his} time so ${he} can target more slaves in need of individual attention.`); + if (slave.trust > 95) { + r.push(`${He} is so trusting of you that ${he} can act as your own right hand, allowing ${him} to oversee your slaves with remarkable efficiency.`); + } else { + r.push(`This arrangement <span class="mediumaquamarine">builds trust</span> between you.`); + slave.trust += 2; + } + if (slave.health.tired > 30) { + r.push(`It also takes a load off ${his} tired shoulders.`); + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function HGFormility(slave) { + if (slave.trust > 95) { + r.push(`Every so often, when you're alone, ${he} calls you ${properTitle()}. ${He} treats your permission to do this as a sacred thing, and <span class="hotpink">loves you for it.</span>`); + slave.devotion += 1; + } else { + r.push(`Your permission to be informal in private <span class="mediumorchid">confuses ${him}</span> a little, since ${he} isn't perfectly confident enough to be comfortable with the idea.`); + slave.devotion -= 1; + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function jobEffects(slave) { + if (slave.fetishKnown === 1) { + if (slave.fetish === "dom") { + if (slave.fetishKnown === 1 && slave.fetishStrength <= 95) { + r.push(`Having all the slaves look up to and obey ${him} advances ${his} <span class="lightcoral">dominant tendencies.</span>`); + slave.fetishStrength += 4; + } + } else if (fetishChange > jsRandom(0, 100)) { + r.push(`Having all the slaves look up to and obey ${him} affects ${his} sexuality, turning ${him} into a <span class="lightcoral">bit of a dominatrix.</span>`); + slave.fetish = "dom"; + slave.fetishStrength = 20; + slave.fetishKnown = 1; + } else if (slave.fetishStrength <= jsRandom(20, 60)) { + r.push(`The sheer variety of sexual situations ${he} sees and participates in <span class="pink">broaden ${his} sexual interests</span> and incline ${him} to take a dominant sexual role.`); + slave.fetishStrength -= 4; + } + } else { + if (slave.fetish === "dom") { + r.push(`Having all the slaves look up to and obey ${him} clearly excites ${him}; <span class="lightcoral">${he}'s a natural dom!</span>`); + } else if (fetishChange > jsRandom(0, 100)) { + r.push(`Having all the slaves look up to and obey ${him} affects ${his} sexuality, turning ${him} into a <span class="lightcoral">bit of a dominatrix.</span>`); + slave.fetish = "dom"; + slave.fetishStrength = 20; + slave.fetishKnown = 1; + } + } + + if (slave.rules.lactation === "induce") { + r.push(`${He} works mammary stimulation into ${his} slave training regimen in an effort to bring in ${his} milk for you.`); + slave.induceLactation += 3; + r.push(`${induceLactation(slave)}`); + if (slave.lactation === 1) { + slave.rules.lactation = "maintain"; + } + } else if (slave.rules.lactation === "maintain") { + r.push(`Proper nursing and milking technique is a strong aspect of ${his} slave training regimen, both to keep ${his} milk flowing and to prevent the mounting pressure from distracting from ${his} work.`); + slave.lactationDuration = 2; + slave.boobs -= slave.boobsMilk; + slave.boobsMilk = 0; + } + + if (slave.dick > 0 && V.universalRulesImpregnation === "HG" && canPenetrate(slave)) { + r.push(`${He} finds ${his} duty to impregnate slaves at will sexually satisfying.`); + slave.need = 0; + } else if (V.slaves.length > 5) { + r.push(`Seldom a day goes by without ${him} finding an outlet among your slaves for ${his} sexual desires.`); + slave.need = 0; + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function prestigeGain(slave) { + if (V.HGTimeInGrade + ((slave.intelligence + slave.intelligenceImplant) / 10) + (slave.devotion / 10) + (slave.trust / 10) > 50) { + r.push(`slave.slaveName has rendered such long and competent service as your Head Girl that many of your citizens have come to rely on ${his} word as an extension of yours, trusting that if ${he} does something, it's because you trust ${him} to. <span class="green">${He} has become prestigious on ${his} own merits, a remarkable achievement for a slave!</span>`); + slave.prestige += 1; + slave.prestigeDesc = "Many citizens respect ${his} long and able service as your Head Girl."; + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function cleanupVars(slave) { + if (!setup.HGCareers.includes(slave.career) && slave.skill.headGirl < V.masteredXP) { + slave.skill.headGirl += jsRandom(1, Math.ceil((slave.intelligence + slave.intelligenceImplant) / 15) + 8); + } + slave.health.tired = Math.clamp(slave.health.tired, 0, 1000); + } +})(); diff --git a/src/endWeek/saDrugs.js b/src/endWeek/saDrugs.js index 14ff02217e899363736465aff1cb110fbcade21c..c6d122eefb3001caa7dda52d561410343ce0402f 100644 --- a/src/endWeek/saDrugs.js +++ b/src/endWeek/saDrugs.js @@ -453,6 +453,54 @@ window.saDrugs = (function saDrugs() { slave.geneticQuirks.macromastia = 2; } break; + case "nipple enhancers": + let nippleChance = ((60 + (V.injectionUpgrade * 15)) / (1 + slave.geneMods.NCS)); + r += ` ${He} receives <span class="lime">direct injections of enhancers right into ${his} nipples,</span> causing them to swell and expand`; + if (slave.geneMods.NCS === 1) { + r += `; ${his} <span class="orange">NCS</span> reduces their effectiveness`; + } + r += `.`; + switch (slave.nipples) { + case "inverted": + if (jsRandom(1, 100) > nippleChance) { + r += ` <span class="lime">${His} inverted nipples swell painfully,</span> pushing their way outwards.`; + slave.nipples = "partially inverted"; + } + break; + case "partially inverted": + if (jsRandom(1, 100) > nippleChance) { + r += ` <span class="lime">${His} nipples swell painfully,</span> exposing ${His} previously inverted nipples.`; + slave.nipples = jsEither(["tiny", "cute", "puffy", "huge"]); + } + break; + case "tiny": + if (jsRandom(1, 100) > nippleChance) { + r += ` <span class="lime">${His} nipples swell painfully,</span> becoming larger and cute.`; + slave.nipples = "cute"; + } + break; + case "cute": + if (jsRandom(1, 100) > nippleChance) { + r += ` <span class="lime">${His} nipples swell painfully,</span> becoming larger and puffy.`; + slave.nipples = "puffy"; + } + break; + case "puffy": + if (jsRandom(1, 100) > nippleChance) { + r += ` <span class="lime">${His} nipples swell painfully,</span> becoming spectacularly immense.`; + slave.nipples = "huge"; + } + break; + case "huge": + r += ` ${His} nipples are now so massive that further drug use will fail to grow them further; <span class="yellow">${his} drug regimen has been ended.</span>`; + slave.drugs = "no drugs"; + break; + default: + r += ` The injections fail to affect ${his} ${slave.nipples} nipples; <span class="yellow">${his} drug regimen has been ended.</span>`; + slave.drugs = "no drugs"; + break; + } + break; case "butt injections": case "intensive butt injections": growth = 1 + V.injectionUpgrade; @@ -1724,13 +1772,14 @@ window.saDrugs = (function saDrugs() { r += ` ${He} has been worked to the bone`; if (slave.devotion < 20) { r += ` and <span class="hotpink">bends a little more to your will,</span> while <span class="gold">fearing ${he}'ll never earn a reprieve</span> from toiling.`; - slave.devotion += 2; + slave.devotion += 1; slave.trust -= 2; } else if (slave.devotion < 50) { r += ` and can't help but <span class="gold">worry a little about ${his} well-being.</span>`; slave.trust -= 1; } else { - r += ` but ${he} carries on without reservations.`; + r += ` but ${he} carries on without complaint, keeping ${his} <span class="mediumorchid">growing doubts</span> to $himself.`; + slave.devotion -= 2; } } else if (slave.health.tired > 60) { r += ` ${He} is suffering from exhaustion`; diff --git a/src/endWeek/saGetMilked.js b/src/endWeek/saGetMilked.js index 59c4379858f07357f12c2f409fc62b691a289a89..9c513255cbbe2836e336e6b3d28ccff32f0a8593 100644 --- a/src/endWeek/saGetMilked.js +++ b/src/endWeek/saGetMilked.js @@ -72,18 +72,16 @@ window.saGetMilked = (function saGetMilked() { return cash; } else { mentalEffects(slave); - if (V.showVignettes === 1 && (slave.assignment === "get milked" || slave.assignment === "work in the dairy")) { + if (V.showVignettes === 1 && (slave.assignment === window.Job.MILKED || slave.assignment === window.Job.DAIRY)) { assignmentVignette(slave); } - if (slave.assignment === "work in the dairy") { + if (slave.assignment === window.Job.MILKED) { + cashX(cash, "slaveAssignmentMilked", slave); + } else if (slave.assignment === window.Job.DAIRY) { applyFSDecoration(); - } - if (slave.assignment === "work in the dairy") { - cashX(cash, "milkedDairy", slave); - } else if (slave.assignment === "get milked") { - cashX(cash, "milked", slave); + cashX(cash, "slaveAssignmentDairy", slave); } else { - cashX(cash, "extraMilk", slave); + cashX(cash, "slaveAssignmentExtraMilk", slave); } // These are a pain. They are usually called immediately after this function. Could possibly return an object instead. V.cum = cum; @@ -102,7 +100,7 @@ window.saGetMilked = (function saGetMilked() { function gatherStatistics(slave) { /* Statistics gathering */ let facility; - if (slave.assignment === Job.DAIRY) { + if (slave.assignment === window.Job.DAIRY) { facility = V.facility.dairy; } T.incomeStats = getSlaveStatisticData(slave, facility); @@ -117,8 +115,8 @@ window.saGetMilked = (function saGetMilked() { function jobPreface(slave) { r += `gets milked this week.`; if (V.dairy > 0 && V.dairyRestraintsSetting < 2) { - if ((V.universalRulesFacilityWork === 1 && slave.assignment === "get milked" && V.dairySpots > 0) || (slave.assignment === "work in the dairy")) { - if (slave.assignment === "get milked") { + if ((V.universalRulesFacilityWork === 1 && slave.assignment === window.Job.MILKED && V.dairySpots > 0) || (slave.assignment === window.Job.DAIRY)) { + if (slave.assignment === window.Job.MILKED) { r += ` Since there's extra space in ${V.dairyName}, ${he} spends most of ${his} milkings there.`; V.dairySpots -= 1; // Would this need to be pulled for statistics gathering? } @@ -793,7 +791,7 @@ window.saGetMilked = (function saGetMilked() { * @param {App.Entity.SlaveState} slave * */ function mentalEffects(slave) { - if (slave.assignment === "get milked" || (slave.assignment === "work in the dairy" && V.dairyRestraintsSetting < 2)) { + if (slave.assignment === window.Job.MILKED || (slave.assignment === window.Job.DAIRY && V.dairyRestraintsSetting < 2)) { if (slave.behavioralQuirk === "fitness") { r += ` ${slave.slaveName} <span class="devotion inc">privately enjoys</span> the focus on ${his} health and fitness that comes with being a cow.`; slave.devotion += 1; @@ -817,12 +815,20 @@ window.saGetMilked = (function saGetMilked() { } else { r += `an incident without lasting effect.`; } - if (slave.assignment === "work in the dairy") { - cashX(cashVign, "milkedDairy", slave); - } else if (slave.assignment === "get milked") { - cashX(cashVign, "milked", slave); + if (slave.assignment === window.Job.MILKED) { + if (vignette.effect > 0) { + cashX(cashVign, "slaveAssignmentMilkedVign", slave); + } else if (vignette.effect < 0) { + cashX(forceNeg(cashVign), "slaveAssignmentMilkedVign", slave); + } + } else if (slave.assignment === window.Job.DAIRY) { + if (vignette.effect > 0) { + cashX(cashVign, "slaveAssignmentDairyVign", slave); + } else if (vignette.effect < 0) { + cashX(forceNeg(cashVign), "slaveAssignmentDairyVign", slave); + } } else { - cashX(cashVign, "extraMilk", slave); + cashX(cashVign, "slaveAssignmentExtraMilkVign", slave); } T.incomeStats.income += cashVign; } else if (vignette.type === "devotion") { diff --git a/src/endWeek/saGuardYou.js b/src/endWeek/saGuardYou.js new file mode 100644 index 0000000000000000000000000000000000000000..21377d5828596ec5820a7c2286ebf3c9d9b272b6 --- /dev/null +++ b/src/endWeek/saGuardYou.js @@ -0,0 +1,327 @@ +window.saGuardYou = (function saGuardYou() { + "use strict"; + + let r; + + // eslint-disable-next-line no-unused-vars + let he, him, his, hers, himself, girl, He, His; + + let BGImpressiveness; + + // Used for selecting a successor + let successorCandidates; + let combatSkilled; + let flawedTrainee; + let candidate; + + return saGuardYou; + + /** + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ + function saGuardYou(slave) { + r = []; + + ({ + // eslint-disable-next-line no-unused-vars + he, him, his, hers, himself, girl, He, His + } = getPronouns(slave)); + + BGImpressiveness = Deadliness(slave); + + updateBGState(slave); + jobPreface(slave); + publicImpression(slave); + jobEffects(slave); + if (V.bodyguardTrains === 1) { + trainReplacements(slave); + } + + return r.join(" "); + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function jobPreface(slave) { + r.push(`carries arms in your defense.`); + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function updateBGState(slave) { + if(V.dojo > 1) { + slave.rules.living = "luxurious"; + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function publicImpression(slave) { + if (slave.skill.combat > 0) { + r.push(`${His} combat skills greatly increase ${his} deadliness.`); + } + + if (setup.bodyguardCareers.includes(slave.career)) { + r.push(`${He} has experience in personal defense from before ${he} was a slave.`); + } else if (slave.skill.bodyguard >= V.masteredXP) { + r.push(`${He} has experience in personal defense from working for you.`); + } else { + slave.skill.bodyguard += jsRandom(1, Math.ceil((slave.intelligence + slave.intelligenceImplant) / 15) + 8); + } + + if (slave.muscles > 30 && slave.muscles <= 95) { + r.push(`${He} is strong and powerful, yet quick and flexible.`); + } else if (slave.muscles > 95 && slave.height >= 185) { + r.push(`${His} huge muscles are an intimidating sight and, despite their massive size, ${he} is tall enough to use them effectively.`); + } else if (slave.muscles > 95) { + r.push(`${His} huge muscles are an intimidating sight, but are so big that they actually detract from ${his} combat effectiveness.`); + } else if (slave.muscles > 5) { + r.push(`${He} is reasonably fit, but not enough to significantly affect ${his} combat effectiveness.`); + } else if (slave.muscles < -95) { + r.push(`${He} can barely stand, let alone fight. A single shot from ${his} own weapon is liable to incapacitate ${him}, making ${him} an absolute travesty of a bodyguard.`); + } else if (slave.muscles < -30) { + r.push(`${He} tires from just standing, rendering ${him} both ineffective and embarrassing to have as your guard.`); + } else if (slave.muscles < -5) { + r.push(`${He} is rather unfit, enough to negatively impact ${his} combat effectiveness.`); + } + + if (getLimbCount(slave, 6) > 1) { + r.push(`The artificial muscles of ${his} cybernetic limbs increase ${his} strength and flexibility to enhance ${his} combat abilities and give ${him} the intimidating appearance of a super-soldier.`); + } else if (getLimbCount(slave, 105) > 1) { + r.push(`${His} tough combat limbs make ${him} an intimidating sight to behold.`); + } + + if (slave.height >= 170) { + r.push(`${His} height gives ${him} a reach advantage with ${his} sword.`); + } + + if (slave.health.condition > 50) { + r.push(`${His} shining health makes ${him} a better combatant.`); + } + + if (slave.boobs > 4000) { + r.push(`${His} titanic tits are a terrible hindrance in actual fighting.`); + } else if (slave.boobs > 2000) { + r.push(`${His} big breasts get in ${his} way and reduce ${his} efficiency.`); + } + + if (slave.dick >= 10) { + r.push(`${His} massive dick gets in ${his} way and reduces ${his} efficiency.`); + } + + if (slave.balls >= 15) { + r.push(`${His} massive balls slow ${him} down and limit ${his} range of motion.`); + } + + if (slave.butt > 6) { + r.push(`${His} massive ass slows ${him} down and limits ${his} range of motion.`); + } + + if (slave.hips > 2) { + r.push(`${He} struggles to move with ${his} inhumanly wide hips and frequently gets caught between things trying to follow you.`); + } + + if (slave.weight > 190) { + r.push(`${His} extreme weight nearly immobilizes ${him}. ${He} struggles to move let alone protect you. At least ${his} bloated body will likely stop bullets and block doorways when needed.`); + } else if (slave.weight > 160) { + r.push(`${His} extreme weight limits ${his} mobility and range of motion, making ${him} a poor bodyguard but decent meatshield.`); + } else if (slave.weight > 130) { + r.push(`${His} extreme weight is an impediment as a bodyguard.`); + } else if (slave.weight > 30) { + r.push(`${His} heavy weight is an impediment as a bodyguard.`); + } else if (slave.weight < -10) { + r.push(`${His} light weight is an impediment as a bodyguard.`); + } + + if (slave.health.condition < -50) { + r.push(`${His} poor health makes ${him} a weaker combatant.`); + } + + if (slave.health.tired > 90) { + r.push(`${He} is exhausted and can barely stay awake, let alone ready a weapon.`); + } else if (slave.health.tired > 60) { + r.push(`${He} is fatigued, making ${his} situational awareness and reaction time suffer.`); + } else if (slave.health.tired > 30) { + r.push(`${He} is tired, slightly lowering ${his} reaction time.`); + } + + if (slave.pregKnown === 1 || slave.bellyPreg >= 1500) { + if (slave.bellyPreg >= 750000) { + r.push(`${His} monolithic pregnancy greatly restricts ${his} movement and renders ${him} nearly useless in combat. ${He} can barely waddle after you, and when ${he} does, finds doors and small passages don't agree with ${his} bloated figure.`); + } else if (slave.bellyPreg >= 450000) { + r.push(`${His} gigantic pregnancy greatly hinders ${his} movement and terribly reduces ${his} effectiveness in combat. It also limits where ${he} can follow you, as doors and small passages don't agree with ${his} bloated figure.`); + } else if (slave.bellyPreg >= 300000) { + r.push(`${His} massive pregnancy obstructs ${his} movement and greatly hinders ${his} ability to protect you. It also limits where ${he} can follow you, as doors and small passages don't agree with ${his} bloated figure.`); + } else if (slave.bellyPreg >= 150000) { + r.push(`${His} giant pregnancy obstructs ${his} movement and greatly slows ${him} down. It also limits where ${he} can follow you, as ${he} has trouble waddling through crowds.`); + } else if (slave.bellyPreg >= 100000) { + r.push(`${His} giant belly gets in ${his} way and weighs ${him} down.`); + } else if (slave.bellyPreg >= 10000) { + r.push(`${His} huge belly is unwieldy and hinders ${him}.`); + } else if (slave.bellyPreg >= 5000) { + r.push(`${His} advanced pregnancy limits ${his} effectiveness.`); + } else if (slave.bellyPreg >= 1500) { + r.push(`${His} growing pregnancy occasionally distracts ${him} from ${his} job.`); + } else { + r.push(`The life just beginning to grow inside ${him} occasionally distracts ${him} from ${his} job.`); + } + } else if (slave.bellyImplant >= 1500) { + if (slave.bellyImplant >= 750000) { + r.push(`${His} monolithic, ${slave.bellyImplant}cc implant filled belly greatly restricts ${his} movement and renders ${him} nearly useless in combat. ${He} can barely waddle after you, and when ${he} does, finds doors and small passages don't agree with ${his} bloated figure.`); + } else if (slave.bellyImplant >= 450000) { + r.push(`${His} gigantic, ${slave.bellyImplant}cc implant filled belly greatly hinders ${his} movement and terribly reduces ${his} effectiveness in combat. It also limits where ${he} can follow you, as doors and small passages don't agree with ${his} bloated figure.`); + } else if (slave.bellyImplant >= 300000) { + r.push(`${His} massive, ${slave.bellyImplant}cc implant filled belly obstructs ${his} movement and greatly hinders ${his} ability to protect you. It also limits where ${he} can follow you, as doors and small passages don't agree with ${his} bloated figure.`); + } else if (slave.bellyImplant >= 150000) { + r.push(`${His} giant, ${slave.bellyImplant}cc implant filled belly obstructs ${his} movement and greatly slows ${him} down. It also limits where ${he} can follow you, as ${he} has trouble waddling through crowds.`); + } else if (slave.bellyImplant >= 100000) { + r.push(`${His} giant, ${slave.bellyImplant}cc implant filled belly is very heavy and unwieldy, frequently getting in the way of ${his} job.`); + } else if (slave.bellyImplant >= 10000) { + r.push(`${His} huge, ${slave.bellyImplant}cc implant filled belly is very heavy and unwieldy, throwing off ${his} weight and making ${him} far less effective.`); + } else if (slave.bellyImplant >= 5000) { + r.push(`${His} large, ${slave.bellyImplant}cc implant filled belly is heavy and unwieldy, limiting ${his} effectiveness.`); + } else if (slave.bellyImplant >= 1500) { + r.push(`${His} swollen, ${slave.bellyImplant}cc implant filled belly is heavy and occasionally distracts ${him}.`); + } + } + if (slave.labor === 1) { + r.push(`${He}'s feeling labor pains, greatly detracting from ${his} ability to protect you.`); + } else if (slave.preg >= slave.pregData.normalBirth && slave.pregControl !== "labor suppressors") { + r.push(`${He}'ll be going into labor any time now, detracting from ${his} ability to protect you.`); + } + + if (slave.bellyFluid >= 10000) { + r.push(`${His} hugely bloated, ${slave.inflationType}-filled belly is taut and painful, hindering ${his} ability to guard you.`); + } else if (slave.bellyFluid >= 5000) { + r.push(`${His} bloated, ${slave.inflationType}-stuffed belly is constantly jiggling and moving, distracting ${him} and throwing off ${his} weight.`); + } else if (slave.bellyFluid >= 2000) { + r.push(`${His} distended, ${slave.inflationType}-belly is uncomfortable and heavy, distracting ${him}.`); + } + + if (slave.teeth === "pointy") { + r.push(`${His} sharp teeth add nothing to ${his} actual effectiveness, but they're certainly intimidating.`); + } + + if ((slave.skill.combat < 1) && (jsRandom(-100, 150) <= (slave.intelligence + slave.intelligenceImplant))) { + r.push(`After some experience guarding you, and diligent practice in the armory, <span class="green">${his} combat skills increase.</span>`); + slave.skill.combat += 1; + } else if (slave.skill.combat >= 1) { + r.push(`${He} maintains ${his} combat skill with practice in the armory.`); + } else { + r.push(`Though ${he} practices diligently, ${his} basic combat skills do not impress.`); + } + + r.push(`${His} constant presence is`); + if (BGImpressiveness > 6) { + r.push(`extremely intimidating, <span class="green">adding much to your reputation.</span>`); + if (slave.career === "an arcology owner") { + r.push(`You've made a one-time rival arcology owner into a deadly and loyal protector, a feat of slaveownership that's <span class="green">internationally famous.</span>`); + repX(BGImpressiveness * 50, "bodyguard", slave); + } + } else if (BGImpressiveness > 3) { + r.push(`intimidating, <span class="green">adding to your reputation.</span>`); + } else { + r.push(`hardly intimidating, <span class="yellow">barely adding to your reputation.</span>`); + } + + repX(BGImpressiveness * 50, "bodyguard", slave); + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function jobEffects(slave) { + r.push(`Being continually trusted with your life <span class="hotpink"> increases ${his} devotion to you</span> and encourages ${him} to <span class="mediumaquamarine"> trust you in turn.</span>`); + slave.devotion += 2; + slave.trust += 4; + + if (V.dojo > 1) { + r.push(`${He} <span class="hotpink">appreciates</span> how special it is that ${he} has a nice room off the armory to rest in. ${He} can finally <span class="green">rest easy</span> while still keeping tabs on your safety.`); + slave.devotion += 1; + } else { + r.push(`Between protecting you, training, and keeping vigil while you sleep, ${he} lives a <span class="red">very tiring</span> life.`); + } + tired(slave); + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function trainReplacements(slave) { + if (slave.devotion > 95 && slave.trust > 50 && slave.skill.combat > 0 && slave.intelligence + slave.intelligenceImplant > 15) { + successorCandidates = V.slaves.filter(function(s) { return (assignmentVisible(s) || s.assignment === "be your Concubine" || s.assignment === "be the Wardeness" || s.assignment === "be your Head Girl" || s.assignment === "work as a servant" || s.assignment === "serve in the master suite") && bodyguardSuccessorEligible(s); }); + combatSkilled = successorCandidates.filter(function(s) { return s.skill.combat > 0; }); + + r.push(`${He}'s confident in ${his} martial skills, but smart enough to know that ${he} isn't immortal, and devoted enough to worry about who will protect you should ${he} die.`); + if (combatSkilled.length < 2) { + flawedTrainee = 0; + if (slave.relationship > 1) { + candidate = getSlave(slave.relationshipTarget); + if (candidate !== undefined && candidate.skill.combat === 0 && bodyguardSuccessorEligible(candidate)) { + const candidatePronouns = getPronouns(candidate); + r.push(`${He} does ${his} best to train ${candidate.slaveName} whenever ${he} can, hoping that ${his}`); + if (slave.relationship > 4) { + r.push(`${candidatePronouns.wife}`); + } else if (slave.relationship === 4) { + r.push(`lover`); + } else if (slave.relationship === 3) { + r.push(`${candidatePronouns.girl} friend`); + } else { + r.push(`best friend`); + } + r.push(`can be made capable of stepping into ${his} place.`); + } + } + if (!candidate) { + if (V.HeadGirl !== 0 && V.HeadGirl.skill.combat === 0 && bodyguardSuccessorEligible(V.HeadGirl)) { + r.push(`${He} does ${his} best to train ${V.HeadGirl.slaveName} whenever ${he} can, hoping that your Head Girl can be made capable of stepping into ${his} place.`); + candidate = V.HeadGirl; + } + } + if (!candidate) { + if (V.Concubine !== 0 && V.Concubine.skill.combat === 0 && V.Concubine.devotion > 50 && V.Concubine.muscles >= -30 && V.Concubine.weight < 150 && V.Concubine.butt < 10 && V.Concubine.boobs < 25000 && V.Concubine.belly < 5000 && V.Concubine.balls < 20 && V.Concubine.dick < 15 && V.Concubine.fuckdoll === 0 && V.Concubine.fetish !== "mindbroken" && canWalk(V.Concubine)) { + r.push(`${He} does ${his} best to train ${V.Concubine.slaveName} whenever ${he} can, hoping that your Concubine can be made capable of stepping into ${his} place.`); + if (V.Concubine.boobs >= 8000 || V.Concubine.butt >= 10 || V.Concubine.belly >= 5000 || V.Concubine.balls >= 10 || V.Concubine.dick >= 10 || V.Concubine.muscles < 0 || V.Concubine.weight >= 100) { + r.push(`${His} body is poorly suited for combat, but ${he} can learn to work around it with enough effort.`); + flawedTrainee = jsRandom(0, 50); + } + candidate = V.Concubine; + } + } + if (!candidate) { + if (V.Wardeness !== 0 && V.Wardeness.skill.combat === 0 && V.Wardeness.fetish !== "mindbroken" && bodyguardSuccessorEligible(V.Wardeness)) { + r.push(`${He} does ${his} best to train ${V.Wardeness.slaveName} whenever ${he} can, hoping that your Wardeness can be made capable of stepping into ${his} place.`); + candidate = V.Wardeness; + } + } + if (!candidate) { + candidate = successorCandidates.find(function(s) { return s.skill.combat === 0; }); + if (candidate) { + r.push(`${He} does ${his} best to train ${candidate.slaveName} whenever ${he} can, hoping that ${his} subordinate can be made capable of stepping into ${his} place.`); + } + } + if (candidate) { + if ((slave.intelligence + slave.intelligenceImplant - flawedTrainee) > jsRandom(1, 500)) { + r.push(`By the end of the week, ${he} is satisfied that ${candidate.slaveName} <span class="green">has the combat skill</span> to contribute to your defense.`); + V.slaves[V.slaveIndices[candidate.ID]].skill.combat = 1; + } + } else { + r.push(`${He} finds no suitable candidates to serve as ${his} replacement, leaving ${him} stressed over your future safety. The worry is <span class="red">exhausting</span> and <span class="red">bad for ${his} health.</span>`); + healthDamage(slave, 3); + slave.health.tired += 15; + } + } else { + r.push(`${He} takes care to look after the skills of your other defensively capable slaves, satisfied that there are enough of them living in your penthouse.`); + } + } + } +})(); diff --git a/src/endWeek/saNanny.js b/src/endWeek/saNanny.js index c900cf17ea1cd0b10697bf1e73c28d0790100aaf..ab67f1e354bf758fc26e41842e0e1100023a36e5 100644 --- a/src/endWeek/saNanny.js +++ b/src/endWeek/saNanny.js @@ -114,7 +114,7 @@ window.saNanny = function saNanny(slave) { function nannyVignettes(slave) { let t = ''; - if (V.showVignettes === 1 && (slave.assignment === Job.NANNY)) { + if (V.showVignettes === 1 && (slave.assignment === window.Job.NANNY)) { const vignette = GetVignette(slave); t += ` <u>This week</u> ${vignette.text} `; @@ -136,12 +136,13 @@ window.saNanny = function saNanny(slave) { let modifier = FResult(slave); if (vignette.effect > 0) { t += `<span class="cash inc">making you an extra ${cashFormat(Math.trunc(modifier * vignette.effect))}.</span>`; + cashX(Math.trunc(modifier * vignette.effect), "slaveAssignmentNurseryVign", slave); } else if (vignette.effect < 0) { t += `<span class="cash dec">losing you ${cashFormat(Math.abs(Math.trunc(modifier * vignette.effect)))}.</span>`; + cashX(forceNeg(Math.trunc(modifier * vignette.effect)), "slaveAssignmentNurseryVign", slave); } else { t += `an incident without lasting effect.`; } - cashX(Math.trunc(modifier * vignette.effect), "houseServant", slave); } return t; diff --git a/src/endWeek/saPleaseYou.js b/src/endWeek/saPleaseYou.js new file mode 100644 index 0000000000000000000000000000000000000000..da7b2eda3e57b461f91924ffe03c8106824e8b64 --- /dev/null +++ b/src/endWeek/saPleaseYou.js @@ -0,0 +1,1806 @@ +window.saPleaseYou = (function saPleaseYou() { + "use strict"; + + let r; + + // eslint-disable-next-line no-unused-vars + let he, him, his, hers, himself, girl, loli, He, His, daughter, wife; + let playerPronouns; + + let fetishChange; + let arcology; + let trainingEfficiency; + + let oralUse; + let analUse; + let vaginalUse; + let mammaryUse; + let penetrativeUse; + let cervixPump; + let acts; + let demand; + + return saPleaseYou; + + /** + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ + function saPleaseYou(slave) { + r = []; + fetishChange = fetishChangeChance(slave); + arcology = V.arcologies[0]; + + oralUse = 0; + analUse = 0; + vaginalUse = 0; + mammaryUse = 0; + penetrativeUse = 0; + cervixPump = 0; + acts = 0; + + trainingEfficiency = 5 + Math.trunc(slave.devotion / 30) + ((slave.intelligence+slave.intelligenceImplant) / 32); + + ({ + // eslint-disable-next-line no-unused-vars + he, him, his, hers, himself, girl, He, His, loli, daughter, wife + } = getPronouns(slave)); + playerPronouns = getPronouns(V.PC); + + jobPreface(slave); + checkHoleAvailability(slave); + switch(slave.toyHole) { + case "pussy": + useVagina(slave); + break; + case "ass": + useAnus(slave); + break; + case "mouth": + useMouth(slave); + break; + case "boobs": + useBoobs(slave); + break; + case "dick": + useDick(slave); + break; + default: + useAllHoles(slave); + } + physicalEffects(slave); + familyBonus(slave); + addRep(slave); + if (slave.fuckdoll === 0 && slave.fetish !== "mindbroken") { + mentalEffects(slave); + } + + return r.join(" "); + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function jobPreface(slave) { + r.push(`serves you this week.`); + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function checkHoleAvailability(slave) { + if (slave.toyHole === "pussy") { + if (!canDoVaginal(slave)) { + slave.toyHole = "all her holes"; + } + } else if (slave.toyHole === "ass") { + if (!canDoAnal(slave)) { + slave.toyHole = "all her holes"; + } + } else if (slave.toyHole === "dick") { + if (!canPenetrate(slave)) { + slave.toyHole = "all her holes"; + } + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function useVagina(slave) { + if (slave.fuckdoll === 0) { + r.push(`${He} spends the week`); + if (slave.fetish === "mindbroken") { + r.push(`unaware of your intent to use ${his} pussy.`); + } else if (slave.trust < -20) { + r.push(`in terrified compliance with your use of ${his} pussy.`); + } else if (slave.devotion < -20) { + r.push(`alternately struggling and lying corpselike as you use ${his} pussy.`); + } else if (slave.devotion <= 20) { + r.push(`reluctantly accepting your use of ${his} pussy.`); + } else if (slave.fetishKnown === 1 && slave.fetish === "submissive") { + r.push(`as your adoring submissive, seeing to your pleasure with ${his} womanhood.`); + } else if (slave.devotion <= 50) { + r.push(`obediently serving you in the classical way, taking you into ${his} womanhood.`); + } else { + r.push(`serving you in the classical way, warming your bed and lovingly taking you into ${his} womanhood.`); + } + r.push(`You have the sexual energy to fuck ${him}`); + if (slave.fetish === "mindbroken") { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + vaginalUse = jsRandom(21, 40); + r.push(`several times a day.`); + slave.devotion -= 5; + slave.trust -= 15; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + vaginalUse = jsRandom(7, 14); + r.push(`at least once a day.`); + slave.devotion -= 3; + slave.trust -= 9; + } else { + vaginalUse = jsRandom(3, 7); + r.push(`on occasion.`); + slave.devotion -= 3; + slave.trust -= 3; + } + r.push(`${He} doesn't react, even if ${his} body does.`); + } else if (slave.trust >= -20 && slave.devotion <= 20) { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + vaginalUse = jsRandom(21, 40); + r.push(`several times a day; the constant`); + slave.devotion -= 5; + slave.trust -= 15; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + vaginalUse = jsRandom(7, 14); + r.push(`at least once a day; the regular`); + slave.devotion -= 3; + slave.trust -= 9; + } else { + vaginalUse = jsRandom(3, 7); + r.push(`on occasion; the threat of`); + slave.devotion -= 3; + slave.trust -= 3; + } + r.push(`rape fills ${him} with <span class="mediumorchid">revulsion</span> and <span class="gold">fear.</span>`); + } else if (slave.devotion <= 20) { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + vaginalUse = jsRandom(21, 40); + r.push(`several times a day; submitting to your constant`); + slave.devotion += 3; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + vaginalUse = jsRandom(7, 14); + r.push(`at least once a day; submitting to your regular`); + slave.devotion += 2; + } else { + vaginalUse = jsRandom(3, 7); + r.push(`on occasion; submitting to your`); + slave.devotion += 1; + } + r.push(`use <span class="hotpink">habituates ${him}</span> to being your sex slave.`); + } else { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + vaginalUse = jsRandom(21, 40); + r.push(`several times a day; constant,`); + slave.devotion += 3; + slave.trust += 3; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + vaginalUse = jsRandom(7, 14); + r.push(`several times a day; regular,`); + slave.devotion += 2; + slave.trust += 2; + } else { + vaginalUse = jsRandom(3, 7); + r.push(`on occasion;`); + slave.devotion += 1; + slave.trust += 1; + } + r.push(`enjoyable sex with you draws ${him} <span class="hotpink">closer to you</span> and encourages ${him} to <span class="mediumaquamarine">trust you.</span>`); + } + if (slave.fetish !== "mindbroken") { + if (slave.sexualFlaw === "hates penetration" && slave.devotion > 50) { + r.push(`The emotional closeness <span class="green">resolves ${his} hatred of penetration.</span>`); + slave.sexualFlaw = "none"; + } + if (slave.skill.vaginal < 100) { + r.push(`After a lot of time spent having vanilla sex, ${his} <span class="green">vaginal skill improves.</span>`); + r.push(`${SkillIncrease.Vaginal(slave, trainingEfficiency)}`); + } + } + if (V.PC.dick !== 0) { + if (slave.fetish !== "mindbroken") { + if (slave.fetish === "submissive") { + r.push(`${He} frequently climaxes with your`); + if (V.PC.title === 1) { + r.push(`strong`); + } else { + r.push(`soft`); + } + r.push(`hands holding ${him} and your cock spreading heat through ${his} core,`); + if (slave.fetishKnown === 1) { + r.push(`<span class="hotpink">fulfilling ${his} life's role completely.</span>`); + } else { + r.push(`${he} <span class="hotpink">seems to enjoy</span> being your fucktoy.`); + } + slave.devotion += 2; + } else if (fetishChange > jsRandom(0, 100)) { + slave.fetish = "submissive"; + slave.fetishKnown = 1; + slave.fetishStrength = 10; + r.push(`${He} frequently climaxes with your`); + if (V.PC.title === 1) { + r.push(`strong`); + } else { + r.push(`soft`); + } + r.push(`hands holding ${him} and your cock spreading heat through ${his} core, teaching ${him} that <span class="lightcoral">a ${girl}'s role is to please a ${playerPronouns.woman}.</span>`); + } + } + if (canImpreg(slave, V.PC)) { + r.push(`${knockMeUp(slave, vaginalUse, 0, -1, 1)}`); + } + } + slave.counter.vaginal += vaginalUse; + V.vaginalTotal += vaginalUse; + } else { + r.push(`You keep ${him} with you all week, using ${him} as your personal sex toy`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + vaginalUse = jsRandom(21, 40); + r.push(`several times a day.`); + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + vaginalUse = jsRandom(7, 14); + r.push(`at least once a day.`); + } else { + vaginalUse = jsRandom(3, 7); + r.push(`on occasion.`); + } + r.push(`When you're not using ${him}, ${he}`); + if (!hasAnyLegs(slave)) { + r.push(`rests`); + } else { + r.push(`stands`); + } + r.push(`nearby, waiting silently for your order to present ${his} pussy.`); + if (V.PC.dick !== 0) { + if (canImpreg(slave, V.PC)) { + r.push(`${knockMeUp(slave, vaginalUse, 0, -1, 1)}`); + } + } + slave.counter.vaginal += vaginalUse; + V.vaginalTotal += vaginalUse; + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function useAnus(slave) { + if (slave.fuckdoll === 0) { + r.push(`${He} spends the week`); + if (slave.fetish === "mindbroken") { + r.push(`unaware of your intent to use ${his} anus.`); + } else if (slave.trust < -20) { + r.push(`in terrified compliance with your use of ${his} anus.`); + } else if (slave.devotion < -20) { + r.push(`struggling and screaming as you sodomize ${him}.`); + } else if (slave.devotion <= 20) { + r.push(`writhing in pain as you sodomize ${him}.`); + } else if (slave.devotion <= 50) { + r.push(`obediently submitting to your use of ${his} butthole.`); + } else if (slave.fetishKnown === 1 && slave.fetish === "buttslut") { + r.push(`as your adoring anal slave, orgasming to the feel of`); + if (V.PC.dick !== 0) { + r.push(`you shooting your seed`); + } else { + r.push(`your favorite strap-on`); + } + r.push(`up ${his} ass.`); + } else { + r.push(`warming your bed and devotedly serving your sexual needs with ${his} anus.`); + } + r.push(`You have the sexual energy to fuck ${his} butt`); + if (slave.fetish === "mindbroken") { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + analUse = jsRandom(21, 40); + r.push(`several times a day.`); + slave.devotion -= 5; + slave.trust -= 15; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + analUse = jsRandom(7, 14); + r.push(`at least once a day.`); + slave.devotion -= 3; + slave.trust -= 9; + } else { + analUse = jsRandom(3, 7); + r.push(`on occasion.`); + slave.devotion -= 3; + slave.trust -= 3; + } + r.push(`${He} doesn't react, even if ${his} body does.`); + } else if (slave.trust >= -20 && slave.devotion <= 20) { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + analUse = jsRandom(21, 40); + r.push(`several times a day; the constant`); + slave.devotion -= 5; + slave.trust -= 15; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + analUse = jsRandom(7, 14); + r.push(`at least once a day; the regular`); + slave.devotion -= 3; + slave.trust -= 9; + } else { + analUse = jsRandom(3, 7); + r.push(`on occasion; the threat of`); + slave.devotion -= 3; + slave.trust -= 3; + } + r.push(`anal rape fills ${him} with <span class="mediumorchid">revulsion</span> and <span class="gold">fear.</span>`); + } else if (slave.devotion <= 20) { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + analUse = jsRandom(21, 40); + r.push(`several times a day; constantly`); + slave.devotion += 3; + } else if ((V.fuckSlaves <= V.PC.sexualEnergy)) { + analUse = jsRandom(7, 14); + r.push(`at least once a day; regularly`); + slave.devotion += 2; + } else { + analUse = jsRandom(3, 7); + r.push(`on occasion;`); + slave.devotion += 1; + } + r.push(`allowing you to penetrate ${his} rear <span class="hotpink">habituates ${him}</span> to being your sex slave.`); + } else { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + analUse = jsRandom(21, 40); + r.push(`several times a day; constantly`); + slave.devotion += 3; + slave.trust += 3; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + analUse = jsRandom(7, 14); + r.push(`several times a day; regularly`); + slave.devotion += 2; + slave.trust += 2; + } else { + analUse = jsRandom(3, 7); + r.push(`on occasion;`); + slave.devotion += 1; + slave.trust += 1; + } + r.push(`climaxing to your penetration of ${his} rear brings ${him} <span class="hotpink">closer to you</span> and encourages ${him} to <span class="mediumaquamarine">trust you.</span>`); + } + if (slave.fetish !== "mindbroken") { + if (slave.sexualFlaw === "hates anal" && slave.devotion > 50) { + r.push(`${He}'s devoted enough to derive emotional closeness from buttsex, which <span class="green">resolves ${his} hatred of the act.</span>`); + slave.sexualFlaw = "none"; + } + if (slave.skill.anal < 100) { + r.push(`After a lot of time spent getting buttfucked, ${his} <span class="green">anal skill improves.</span>`); + r.push(`${SkillIncrease.Anal(slave, trainingEfficiency)}`); + } + if (slave.fetish === "buttslut") { + if (slave.fetishKnown === 1) { + r.push(`${He} <span class="hotpink">takes great pleasure</span> in ${his} rear being used as your personal`); + if (V.PC.dick !== 0) { + r.push(`cock holster.`); + } else { + r.push(`plaything.`); + } + } else { + r.push(`${He} <span class="hotpink">seems to enjoy</span> anal sex more than the usual slave.`); + } + slave.devotion += 2; + } else if (fetishChange > jsRandom(0, 100)) { + slave.fetishKnown = 1; + slave.fetishStrength = 10; + slave.fetish = "buttslut"; + r.push(`After repeated anal orgasms, <span class="lightcoral">${he} begins to crave ${his} next buttfuck.</span>`); + } + } + if (canImpreg(slave, V.PC)) { + r.push(`${knockMeUp(slave, analUse, 1, -1, 1)}`); + } + slave.counter.anal += analUse; + V.analTotal += analUse; + } else { + r.push(`You keep ${him} with you all week, using ${him} as your personal sex toy`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + analUse = jsRandom(21, 40); + r.push(`several times a day.`); + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + analUse = jsRandom(7, 14); + r.push(`at least once a day.`); + } else { + analUse = jsRandom(3, 7); + r.push(`on occasion.`); + } + r.push(`When you're not using ${him}, ${he}`); + if (!hasAnyLegs(slave)) { + r.push(`rests`); + } else { + r.push(`stands`); + } + r.push(`nearby, waiting silently for your order to present ${his} asshole.`); + if (V.PC.dick !== 0) { + if (canImpreg(slave, V.PC)) { + r.push(`${knockMeUp(slave, analUse, 1, -1, 1)}`); + } + } + slave.counter.anal += analUse; + V.analTotal += analUse; + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function useMouth(slave) { + if (slave.fuckdoll === 0) { + r.push(`${He} spends the week`); + if (slave.fetish === "mindbroken") { + r.push(`unaware of your intent to use ${his} mouth.`); + } else if (slave.trust < -20) { + r.push(`in terrified compliance with your use of ${his}`); + if (V.PC.dick !== 0) { + r.push(`throat.`); + } else { + r.push(`mouth.`); + } + } else if ((slave.devotion < -20)) { + r.push(`struggling and gagging as you`); + if (V.PC.dick !== 0) { + r.push(`throatfuck ${him}.`); + } else { + r.push(`ride ${his} face.`); + } + } else if (slave.devotion <= 20) { + r.push(`reluctantly`); + if (V.PC.dick !== 0) { + r.push(`servicing your cock with ${his} mouth.`); + } else { + r.push(`licking your pussy.`); + } + } else if (slave.devotion <= 50) { + r.push(`obediently`); + if (V.PC.dick !== 0) { + r.push(`sucking your cock.`); + } else { + r.push(`eating you out.`); + } + } else if (slave.fetishKnown === 1 && slave.fetish === "cumslut") { + r.push(`as your adoring oral slave, orgasming when you leave ${him} with a`); + if (V.PC.dick !== 0) { + r.push(`mouth full of`); + if (V.PC.vagina !== -1) { + r.push(`cum or a`); + } else { + r.push(`cum.`); + } + } + if (V.PC.vagina !== -1) { + r.push(`face covered in your pussyjuice.`); + } + if (V.PC.dick !== 0 && (V.fuckSlaves <= (V.PC.sexualEnergy / 2 + (V.PC.balls - 3)))) { + r.push(`Your balls produce so much cum for ${him} that ${he} has replaced half ${his} diet with your cum, and you often leave ${him} dizzy with a face and chest covered in your sticky pearly semen.`); + } else if (V.PC.dick !== 0 && (V.fuckSlaves <= (V.PC.sexualEnergy + (V.PC.balls - 3)))) { + r.push(`Your balls produce enough cum that ${he} usually gets facials after a mouthful of semen, and ${he} loves you for it.`); + } else { + r.push(`${He} usually has to fight for ${his} share of cum, making sure to milk cum from your`); + if (V.fuckSlaves > 1) { + r.push(`urethra or suck it out of a pussy.`); + } else { + r.push(`urethra.`); + } + } + } else { + r.push(`warming your bed and lavishing devoted attention on your`); + if (V.PC.dick !== 0) { + r.push(`cock`); + if (V.PC.vagina !== -1) { + r.push(`and`); + } + } + if (V.PC.vagina !== -1) { + r.push(`pussy`); + } + r.push(`with ${his} loving mouth.`); + } + r.push(`You have the sexual energy to`); + if (slave.fetish === "mindbroken") { + if (V.PC.dick !== 0) { + r.push(`use ${his} mouth`); + } else { + r.push(`make ${him} eat you out`); + } + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + oralUse = jsRandom(21, 40); + r.push(`several times a day.`); + slave.devotion -= 5; + slave.trust -= 15; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + oralUse = jsRandom(7, 14); + r.push(`at least once a day.`); + slave.devotion -= 3; + slave.trust -= 9; + } else { + oralUse = jsRandom(3, 7); + r.push(`on occasion.`); + slave.devotion -= 3; + slave.trust -= 3; + } + r.push(`${He} absentmindedly follows your lead.`); + } else if (slave.trust >= -20 && slave.devotion <= 20) { + if (V.PC.dick !== 0) { + r.push(`rape ${his} face`); + } else { + r.push(`force ${him} to eat you out`); + } + r.push(`${him}`); + if (V.fuckSlaves <= V.PC.sexualEnergy/2) { + oralUse = jsRandom(21, 40); + r.push(`several times a day; the constant`); + slave.devotion -= 5; + slave.trust -= 15; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + oralUse = jsRandom(7, 14); + r.push(`at least once a day; the regular`); + slave.devotion -= 3; + slave.trust -= 9; + } else { + oralUse = jsRandom(3, 7); + r.push(`on occasion; the threat of`); + slave.devotion -= 3; + slave.trust -= 3; + } + r.push(`sexual abuse fills ${him} with <span class="mediumorchid">revulsion</span> and <span class="gold">fear.</span>`); + } else if (slave.devotion <= 20) { + if (V.PC.dick !== 0) { + r.push(`use ${his} mouth`); + } else { + r.push(`make ${him} eat you out`); + } + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + oralUse = jsRandom(21, 40); + r.push(`several times a day; constantly`); + slave.devotion += 3; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + oralUse = jsRandom(7, 14); + r.push(`at least once a day; regularly`); + slave.devotion += 2; + } else { + oralUse = jsRandom(3, 7); + r.push(`on occasion;`); + slave.devotion += 1; + } + r.push(`performing oral on you <span class="hotpink">habituates ${him}</span> to being your sex slave.`); + } else { + if (V.PC.dick !== 0) { + r.push(`get a blowjob`); + if (V.PC.vagina !== -1) { + r.push(`and some pussy licking`); + } + r.push(`from ${him}`); + } else { + r.push(`${him} eat you out`); + } + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + oralUse = jsRandom(21, 40); + r.push(`several times a day; constantly`); + slave.devotion += 3; + slave.trust += 3; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + oralUse = jsRandom(7, 14); + r.push(`several times a day; regularly`); + slave.devotion += 2; + slave.trust += 2; + } else { + oralUse = jsRandom(3, 7); + r.push(`on occasion;`); + slave.devotion += 1; + slave.trust += 1; + } + r.push(`giving you pleasure brings ${him} <span class="hotpink">closer to you</span> and encourages ${him} to <span class="mediumaquamarine">trust you.</span>`); + } + if (slave.fetish !== "mindbroken") { + if (slave.sexualFlaw === "hates oral" && slave.devotion > 50) { + r.push(`${He}'s devoted enough to derive emotional closeness from giving you oral, which <span class="green">resolves ${his} hatred of the act.</span>`); + slave.sexualFlaw = "none"; + } + if (slave.behavioralFlaw === "hates men" && V.PC.dick !== 0 && slave.devotion > 20) { + r.push(`Spending so much time in close proximity to your dick <span class="green">reconciles ${him} to serving cocks.</span>`); + slave.behavioralFlaw = "none"; + } else if (slave.behavioralFlaw === "hates women" && V.PC.vagina !== -1 && slave.devotion > 20) { + r.push(`Spending so much time in close proximity to your womanhood <span class="green">reconciles ${him} to serving a pussy.</span>`); + slave.behavioralFlaw = "none"; + } + if (slave.skill.oral < 100) { + r.push(`After a lot of time spent`); + if (V.PC.dick !== 0) { + r.push(`sucking you`); + if (V.PC.vagina !== -1) { + r.push(`off and eating you out,`); + } else { + r.push(`off,`); + } + } else { + r.push(`eating you out,`); + } + r.push(`${his} <span class="green">oral skill improves.</span>`); + r.push(`${SkillIncrease.Oral(slave, trainingEfficiency)}`); + } + if (slave.fetish === "cumslut") { + if (slave.fetishKnown === 1) { + r.push(`${He} <span class="hotpink">quivers with ecstasy</span> just from the`); + if (canTaste(slave)) { + r.push(`taste`); + } else { + r.push(`feeling`); + } + r.push(`of your`); + if (V.PC.dick === 0) { + r.push(`girl`); + } + r.push(`cum on ${his} tongue.`); + } else { + r.push(`${He} <span class="hotpink">seems to enjoy</span> ${his} role as a cum receptacle more than you'd expect.`); + } + slave.devotion += 2; + } else if (fetishChange > jsRandom(0, 100)) { + slave.fetishKnown = 1; + slave.fetishStrength = 10; + slave.fetish = "cumslut"; + r.push(`${He} frequently climaxes with`); + if (V.PC.dick !== 0) { + r.push(`your dick in ${his} mouth,`); + } else { + r.push(`${his} mouth on your cunt,`); + } + r.push(`learning that giving <span class="lightcoral">blowjobs is a lot of fun.</span>`); + } + } + slave.counter.oral += oralUse; + V.oralTotal += oralUse; + } else { + r.push(`You keep ${him} with you all week, using ${him} as your personal sex toy`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + oralUse = jsRandom(21, 40); + r.push(`several times a day.`); + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + oralUse = jsRandom(7, 14); + r.push(`at least once a day.`); + } else { + oralUse = jsRandom(3, 7); + r.push(`on occasion.`); + } + r.push(`When you're not using ${him}, ${he}`); + if (!hasAnyLegs(slave)) { + r.push(`rests`); + } else { + r.push(`stands`); + } + r.push(`nearby, waiting silently for your order to open ${his} mouth.`); + slave.counter.oral += oralUse; + V.oralTotal += oralUse; + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function useBoobs(slave) { + if (slave.fuckdoll === 0) { + r.push(`${He} spends the week`); + if (slave.fetish === "mindbroken") { + r.push(`unaware of your intent to use ${his} breasts.`); + } else if (slave.trust < -20) { + r.push(`in terrified compliance with your use of ${his} breasts.`); + } else if (slave.devotion < -20) { + r.push(`trying to keep ${his} tits away from your grasping hands.`); + } else if (slave.devotion <= 20) { + r.push(`reluctantly presenting ${his} tits for your use.`); + } else if (slave.devotion <= 50) { + r.push(`obediently offering ${his} tits for your use.`); + } else if (slave.fetishKnown === 1 && slave.fetish === "boobs") { + r.push(`moaning and shivering as you give it to ${him} where ${he} likes it best: ${his} tits.`); + } else { + r.push(`keeping ${his} tits in constant contact with you, giving you titjobs,`); + if (slave.nipples === "fuckable") { + r.push(`savoring your enjoyment of ${his} nipplecunts,`); + } + r.push(`resting them against you as you work, and serving as a comfortable pillow at bedtime.`); + } + r.push(`You have the sexual energy to`); + if (slave.fetish === "mindbroken") { + if (V.PC.dick !== 0) { + if (slave.nipples === "fuckable") { + r.push(`fuck ${his} boobs`); + } else { + r.push(`cum on ${his} boobs`); + } + } else { + r.push(`thoroughly grope ${his} boobs`); + } + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + mammaryUse = jsRandom(21, 40); + r.push(`several times a day.`); + slave.devotion -= 5; + slave.trust -= 15; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + mammaryUse = jsRandom(7, 14); + r.push(`at least once a day.`); + slave.devotion -= 3; + slave.trust -= 9; + } else { + mammaryUse = jsRandom(3, 7); + r.push(`on occasion.`); + slave.devotion -= 3; + slave.trust -= 3; + } + r.push(`${He} absentmindedly follows your lead.`); + } else if (slave.trust >= -20 && slave.devotion <= 20) { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + mammaryUse = jsRandom(21, 40); + if (V.PC.dick !== 0) { + if (slave.nipples === "fuckable") { + r.push(`fuck ${his} boobs`); + } else { + r.push(`cum on ${his} boobs`); + } + } else { + r.push(`thoroughly grope ${his} boobs`); + } + r.push(`several times a day; the constant`); + slave.devotion -= 5; + slave.trust -= 15; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + mammaryUse = jsRandom(7, 14); + if (V.PC.dick !== 0) { + if (slave.nipples === "fuckable") { + r.push(`fuck ${his} boobs`); + } else { + r.push(`cum on ${his} boobs`); + } + } else { + r.push(`thoroughly grope ${his} boobs`); + } + r.push(`at least once a day; the regular`); + slave.devotion -= 3; + slave.trust -= 9; + } else { + mammaryUse = jsRandom(3, 7); + if (V.PC.dick !== 0) { + if (slave.nipples === "fuckable") { + r.push(`fuck ${his} boobs`); + } else { + r.push(`cum on ${his} boobs`); + } + } else { + r.push(`thoroughly grope ${his} boobs`); + } + r.push(`on occasion; the threat of`); + slave.devotion -= 3; + slave.trust -= 3; + } + r.push(`sexual abuse fills ${him} with <span class="mediumorchid">revulsion</span> and <span class="gold">fear.</span>`); + } else if (slave.devotion <= 20) { + r.push(`play with ${his} tits`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + mammaryUse = jsRandom(21, 40); + r.push(`several times a day; constantly`); + slave.devotion += 3; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + mammaryUse = jsRandom(7, 14); + r.push(`at least once a day; regularly`); + slave.devotion += 2; + } else { + mammaryUse = jsRandom(3, 7); + r.push(`on occasion;`); + slave.devotion += 1; + } + r.push(`submitting to your games <span class="hotpink">habituates ${him}</span> to being your sex slave.`); + } else { + if (V.PC.boobs >= 300) { + r.push(`have mutual mammary intercourse until you both orgasm to nipple stimulation`); + } else { + r.push(`have mammary intercourse with ${him}`); + } + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + mammaryUse = jsRandom(21, 40); + r.push(`several times a day; constantly`); + slave.devotion += 3; + slave.trust += 3; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + mammaryUse = jsRandom(7, 14); + r.push(`at least once a day; regularly`); + slave.devotion += 2; + slave.trust += 2; + } else { + mammaryUse = jsRandom(3, 7); + r.push(`on occasion;`); + slave.devotion += 1; + slave.trust += 1; + } + r.push(`giving you pleasure brings ${him} <span class="hotpink">closer to you</span> and encourages ${him} to <span class="mediumaquamarine">trust you.</span>`); + } + if (slave.fetish !== "mindbroken") { + if (slave.sexualFlaw === "hates oral" && slave.devotion > 50) { + r.push(`${He}'s devoted enough to derive emotional closeness from giving you oral, which <span class="green">resolves ${his} hatred of the act.</span>`); + slave.sexualFlaw = "none"; + } + if (slave.behavioralFlaw === "hates men" && slave.devotion > 20 && V.PC.title === 1) { + r.push(`Spending so much time in close proximity to your masculinity <span class="green">reconciles ${him} to serving the male gender.</span>`); + slave.behavioralFlaw = "none"; + } else if (slave.behavioralFlaw === "hates women" && V.PC.title === 0 && slave.devotion > 20) { + r.push(`Spending so much time in close proximity to your femininity <span class="green">reconciles ${him} to serving the female gender.</span>`); + slave.behavioralFlaw = "none"; + } + if (slave.fetish === "boobs") { + if (slave.fetishKnown === 1) { + r.push(`${He} <span class="hotpink">quivers with ecstasy</span> just from the touch of your`); + if (V.PC.title === 1) { + r.push(`strong`); + } else { + r.push(`soft`); + } + r.push(`hands against ${his}`); + if (slave.boobs >= 300) { + r.push(`breasts.`); + } else { + r.push(`flat chest.`); + } + } else { + r.push(`${He} <span class="hotpink">seems to enjoy</span> having ${his}`); + if (slave.boobs >= 300) { + r.push(`breasts`); + } else { + r.push(`chest`); + } + r.push(`fondled more than the average ${girl}.`); + } + slave.devotion += 2; + } else if (fetishChange > jsRandom(0, 100)) { + slave.fetishKnown = 1; + slave.fetishStrength = 10; + slave.fetish = "boobs"; + r.push(`${He} climaxes to nipple stimulation alone, and starts acting as though`); + if (slave.clit > 0 && slave.nipples !== "fuckable") { + r.push(`${he} has <span class="lightcoral">three pleasure buttons</span> rather than just one.`); + } else if (slave.vagina > -1 && slave.nipples === "fuckable") { + r.push(`${he} has <span class="lightcoral">a trio of pussies</span> rather than just one.`); + } else { + r.push(`${his} tits are ${his} <span class="lightcoral">primary erogenous zone.</span>`); + } + } + } + if (slave.lactation > 0) { + slave.lactationDuration = 2; + if (slave.boobsMilk > 0) { + slave.boobs -= slave.boobsMilk; + slave.boobsMilk = 0; + } + } else { + slave.induceLactation += 2; + r.push(`${induceLactation(slave)}`); + } + slave.counter.mammary += mammaryUse; + V.mammaryTotal += mammaryUse; + } else { + r.push(`You keep ${him} with you all week, using ${him} as your personal sex toy`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + mammaryUse = jsRandom(21, 40); + r.push(`several times a day.`); + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + mammaryUse = jsRandom(7, 14); + r.push(`at least once a day.`); + } else { + mammaryUse = jsRandom(3, 7); + r.push(`on occasion.`); + } + r.push(`When you're not using ${him}, ${he}`); + if (!hasAnyLegs(slave)) { + r.push(`rests`); + } else { + r.push(`stands`); + } + r.push(`nearby, waiting silently for your order to present ${his} chest.`); + slave.counter.mammary += mammaryUse; + V.mammaryTotal += mammaryUse; + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function useDick(slave) { + if (slave.fuckdoll > 0) { + r.push(`All it takes is a simple command to force ${his} dick to attention. You have the sexual energy to ride ${him}`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + penetrativeUse = jsRandom(21, 40); + r.push(`several times a day.`); + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + penetrativeUse = jsRandom(7, 14); + r.push(`at least once a day.`); + } else { + penetrativeUse = jsRandom(3, 7); + r.push(`on occasion.`); + } + r.push(`You have to do all the work, unfortunately.`); + } else if (slave.fetish === "mindbroken") { + if (slave.career === "a breeding bull") { + if (canGetPregnant(V.PC)) { + r.push(`${He} spends the week eagerly trying to breed you. You have the sexual energy to take ${him}`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + penetrativeUse = jsRandom(21, 40); + r.push(`several times a day.`); + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + penetrativeUse = jsRandom(7, 14); + r.push(`at least once a day.`); + } else { + penetrativeUse = jsRandom(3, 7); + r.push(`on occasion.`); + } + r.push(`${He} happily mounts you and humps away, but ${he} has no sense of what's pleasurable to you and just excitedly thrusts until ${he} cums inside you.`); + } else { + r.push(`You spend the week getting humped by ${him} after you've managed to encourage ${him} to mount you. You have the sexual energy to use ${his} dick`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + penetrativeUse = jsRandom(21, 40); + r.push(`several times a day.`); + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + penetrativeUse = jsRandom(7, 14); + r.push(`at least once a day.`); + } else { + penetrativeUse = jsRandom(3, 7); + r.push(`on occasion.`); + } + r.push(`${His} conditioning tells ${him} to impregnate others, and since ${he} sees you as already pregnant, just cums inside you for ${his} own pleasure.`); + } + } else { + r.push(`You spend the week using ${his} dick after you've stimulated ${him} enough to get ${him} hard. You have the sexual energy to ride ${him}`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + penetrativeUse = jsRandom(21, 40); + r.push(`several times a day.`); + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + penetrativeUse = jsRandom(7, 14); + r.push(`at least once a day.`); + } else { + penetrativeUse = jsRandom(3, 7); + r.push(`on occasion.`); + } + r.push(`${He} sometimes thrusts out of instinct, but most of the work in the endeavor falls to you.`); + } + } else if (V.PC.preg >= 24 && V.PC.pregMood === 1) { + r.push(`${He} spends the week`); + if (slave.trust < -20) { + r.push(`cautiously fucking you in the missionary position. It takes a gentle touch to ${him} know it safe to get hard, but after that ${he} knows what to do.`); + } else if (slave.devotion < -20) { + r.push(`aggressively fucking your pussy with little regard for you or your child${V.PC.pregType > 1 ? 'ren' : ''}.`); + } else if (slave.devotion <= 20) { + r.push(`obediently fucking you in the missionary position while putting up with your attempts to breast feed ${him}.`); + } else if (slave.fetishKnown === 1 && slave.fetish === "dom") { + r.push(`as your adoring dom, giving you exactly what you need and treating you like a woman.`); + } else if (slave.career === "a breeding bull" || (slave.fetishKnown === 1 && slave.fetish === "pregnancy")) { + r.push(`eagerly driving ${his} cock into your pussy, and shooting cum as deep as ${him} can.`); + } else if (slave.devotion <= 50) { + r.push(`obediently driving ${his} shaft into your womanhood as you knead your aching breasts.`); + } else { + r.push(`eagerly driving ${his} shaft into your womanhood as you knead your aching breasts.`); + } + r.push(`You have the sexual energy to desire ${his} dick in you`); + if (slave.trust >= -20 && slave.devotion <= 20) { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + penetrativeUse = jsRandom(21, 40); + r.push(`several times a day;`); + slave.devotion -= 15; + slave.trust += 7; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + penetrativeUse = jsRandom(7, 14); + r.push(`at least once a day;`); + slave.devotion -= 10; + slave.trust += 7; + } else { + penetrativeUse = jsRandom(3, 7); + r.push(`on occasion;`); + slave.devotion -= 5; + slave.trust += 7; + } + r.push(`getting to dominantly fuck ${his} '${WrittenMaster(slave)}' <span class="mediumorchid">builds ${his} self-confidence</span> and <span class="mediumaquamarine">lessens ${his} fear</span> of you.`); + } else if (slave.devotion <= 20) { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + penetrativeUse = jsRandom(21, 40); + r.push(`several times a day;`); + slave.devotion -= 5; + slave.trust += 5; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + penetrativeUse = jsRandom(7, 14); + r.push(`at least once a day;`); + slave.devotion -= 4; + slave.trust += 4; + } else { + penetrativeUse = jsRandom(3, 7); + r.push(`on occasion;`); + slave.devotion -= 3; + slave.trust += 3; + } + r.push(`getting to dominantly fuck ${his} '${WrittenMaster(slave)}' <span class="mediumorchid">builds ${his} self-confidence,</span> yet <span class="mediumaquamarine">makes ${him} more trusting</span> of you.`); + } else { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + penetrativeUse = jsRandom(21, 40); + r.push(`several times a day; constant, enjoyable`); + slave.devotion += 3; + slave.trust += 3; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + penetrativeUse = jsRandom(7, 14); + r.push(`at least once a day; regular, enjoyable`); + slave.devotion += 2; + slave.trust += 2; + } else { + penetrativeUse = jsRandom(3, 7); + r.push(`on occasion; enjoyable`); + slave.devotion++; + slave.trust++; + } + r.push(`sex with you draws ${him} <span class="hotpink">closer to you</span> and encourages ${him} to <span class="mediumaquamarine">trust you.</span>`); + } + } else if (V.PC.preg >= 24 && V.PC.pregMood === 2) { + r.push(`${He} spends the week`); + if (slave.trust < -20) { + r.push(`in fear under your gravid bulk as you forcibly ride ${his} dick in a futile attempt to cool your raging hormones.`); + } else if (slave.devotion < -20) { + r.push(`alternately struggling or lying corpselike under your gravid bulk as you forcibly ride ${his} dick in a futile attempt to cool your raging hormones.`); + } else if (slave.devotion <= 20) { + r.push(`reluctantly trying to avoid having to take all of your pregnancy weight while not pissing you off whenever you ride ${his} dick in a futile attempt to cool your raging hormones.`); + } else if (slave.fetishKnown === 1 && slave.fetish === "submissive") { + r.push(`doing ${his} best to be a good belly support as ${he} submissively gives you what you want.`); + } else if (slave.devotion <= 50) { + r.push(`obediently bearing your weight as you aggressively ride ${his} dick in a futile attempt to cool your raging hormones.`); + } else { + r.push(`happily pampering and supporting your gravid bulk as you ride ${his} dick in a futile attempt to cool your raging hormones.`); + } + r.push(`You have the sexual energy to aggressively mount ${him}`); + if (slave.trust >= -20 && slave.devotion <= 20) { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + penetrativeUse = jsRandom(21, 40); + r.push(`several times a day; the constant,`); + slave.devotion -= 10; + slave.trust -= 25; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + penetrativeUse = jsRandom(7, 14); + r.push(`at least once a day; the regular,`); + slave.devotion -= 5; + slave.trust -= 15; + } else { + penetrativeUse = jsRandom(3, 7); + r.push(`on occasion; the threat of`); + slave.devotion -= 3; + slave.trust -= 5; + } + r.push(`violent rape fills ${him} with <span class="mediumorchid">revulsion</span> and <span class="gold">fear.</span>`); + } else if (slave.devotion <= 20) { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + penetrativeUse = jsRandom(21, 40); + r.push(`several times a day; submitting to your constant,`); + slave.devotion += 3; + slave.trust -= 5; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + penetrativeUse = jsRandom(7, 14); + r.push(`at least once a day; submitting to your regular,`); + slave.devotion += 2; + slave.trust -= 4; + } else { + penetrativeUse = jsRandom(3, 7); + r.push(`on occasion; submitting to your rather`); + slave.devotion++; + slave.trust -= 3; + } + r.push(`forceful use <span class="hotpink">habituates ${him}</span> to being a sex slave, though ${he} learns to <span class="gold">fear</span> your bottomless lust.`); + } else { + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + penetrativeUse = jsRandom(21, 40); + r.push(`several times a day; constant,`); + slave.devotion += 3; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + penetrativeUse = jsRandom(7, 14); + r.push(`at least once a day; regular,`); + slave.devotion += 2; + } else { + penetrativeUse = jsRandom(3, 7); + r.push(`on occasion;`); + slave.devotion++; + } + r.push(`rough sex with you teaches ${him} that <span class="hotpink">${his} place is under your stomach.</span>`); + } + } else { + r.push(`${He} spends the week`); + if (slave.trust < -20) { + r.push(`in terrified compliance with your use of ${his} dick.`); + } else if (slave.devotion < -20) { + r.push(`alternately struggling or lying corpselike as you ride ${his} dick.`); + } else if (slave.devotion <= 20) { + r.push(`reluctantly accepting your use of ${his} dick.`); + } else if (slave.fetishKnown === 1 && slave.fetish === "submissive") { + r.push(`as your adoring submissive, seeing to your pleasure with ${his} shaft.`); + } else if (slave.devotion <= 50 && V.PC.vagina !== -1) { + r.push(`obediently serving you in the classical way, driving into your womanhood.`); + } else if (slave.devotion <= 50) { + r.push(`week obediently serving you by driving into your backdoor.`); + } else if (V.PC.vagina !== -1 && (slave.career === "a breeding bull" || (slave.fetishKnown === 1) && (slave.fetish === "pregnancy"))) { + r.push(`eagerly driving ${his} cock into your pussy, thoroughly enjoying fucking pussy bareback and cumming deep inside.`); + } else if (V.PC.vagina !== -1) { + r.push(`serving you in the classical way, warming your bed and lovingly driving ${his} shaft into your womanhood.`); + } else { + r.push(`serving you in the classical way, warming your bed and lovingly driving ${his} shaft into your backdoor.`); + } + if (slave.trust >= -20 && slave.devotion <= 20) { + r.push(`You have the sexual energy to ride ${him}`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + penetrativeUse = jsRandom(21, 40); + r.push(`several times a day; the constant`); + slave.devotion -= 5; + slave.trust -= 15; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + penetrativeUse = jsRandom(7, 14); + r.push(`at least once a day; the regular`); + slave.devotion -= 3; + slave.trust -= 9; + } else { + penetrativeUse = jsRandom(3, 7); + r.push(`on occasion; the threat of`); + slave.devotion -= 3; + slave.trust -= 3; + } + r.push(`rape fills ${him} with <span class="mediumorchid">revulsion</span> and <span class="gold">fear.</span>`); + } else if (slave.devotion <= 20) { + r.push(`You have the sexual energy to ride ${him}`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + penetrativeUse = jsRandom(21, 40); + r.push(`several times a day; submitting to your constant`); + slave.devotion += 3; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + penetrativeUse = jsRandom(7, 14); + r.push(`at least once a day; submitting to your regular`); + slave.devotion += 2; + } else { + penetrativeUse = jsRandom(3, 7); + r.push(`on occasion; submitting to your`); + slave.devotion++; + } + r.push(`use <span class="hotpink">habituates ${him}</span> to being your sex slave.`); + } else { + r.push(`You have the sexual energy to get fucked by ${him}`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + penetrativeUse = jsRandom(21, 40); + r.push(`several times a day; constant,`); + slave.devotion += 3; + slave.trust += 3; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + penetrativeUse = jsRandom(7, 14); + r.push(`at least once a day; regular,`); + slave.devotion += 2; + slave.trust += 2; + } else { + penetrativeUse = jsRandom(3, 7); + r.push(`on occasion;`); + slave.devotion++; + slave.trust++; + } + r.push(`enjoyable sex with you draws ${him} <span class="hotpink">closer to you</span> and encourages ${him} to <span class="mediumaquamarine">trust you.</span>`); + } + } + if (slave.fetish !== "mindbroken") { + if (slave.behavioralFlaw === "hates women" && V.PC.title === 0 && V.PC.vagina !== -1 && V.PC.dick === 0 && slave.devotion > 20) { + r.push(`Spending so much intimate time with an attractive woman <span class="green">reconciles ${him} to serving the fairer sex.</span>`); + slave.behavioralFlaw = "none"; + } + } + slave.counter.penetrative += penetrativeUse; + V.penetrativeTotal += penetrativeUse; + if (canImpreg(V.PC, slave)) { + r.push(`${knockMeUp(V.PC, penetrativeUse, 0, slave.ID)}`); + } + if (V.sexualOpeness === 0) { + r.push(`Rumors spread that you <span class="red">enjoy taking it from slaves.</span>`); + V.PC.degeneracy += 2; + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function useAllHoles(slave) { + if (slave.fuckdoll > 0) { + r.push(`You keep ${him} with you all week, using ${him} as your personal sex toy. When you're not using ${him}, ${he}`); + if (!hasAnyLegs(slave)) { + r.push(`rests`); + } else { + r.push(`stands`); + } + r.push(`nearby, waiting silently.`); + slave.trust += 4; + } else if (slave.anus === 0 && slave.vagina === 0) { + r.push(`Since you haven't yet decided to sell or take ${his} virginity or ${his} tight little anus, you let ${him} please you with ${his}`); + if (slave.nipples === "fuckable" && V.PC.dick !== 0) { + r.push(`mouth and tits.`); + } else { + r.push(`mouth.`); + } + r.push(`${He} is <span class="mediumaquamarine">duly grateful</span> you let ${him} keep ${his} innocence for another week, though ${his}`); + if (slave.nipples === "fuckable" && V.PC.dick !== 0) { + r.push(`throat and breasts get a little sore picking up the slack.`); + } else { + r.push(`throat gets a little sore doing the work of three holes.`); + } + slave.trust += 1; + } else if (slave.vagina === 0) { + r.push(`Since you haven't yet decided to sell or take ${his} virginity, you let ${him} confine ${his} efforts to ${his}`); + if (canDoAnal(slave) && slave.nipples === "fuckable" && V.PC.dick !== 0) { + r.push(`anus, nipples and mouth. ${He} is <span class="mediumaquamarine">duly grateful</span> you let ${him} keep ${his} innocence for another week, though ${his} butt, boobs and throat get a little sore.`); + } else if (canDoAnal(slave)) { + r.push(`anus and mouth. ${He} is <span class="mediumaquamarine">duly grateful</span> you let ${him} keep ${his} innocence for another week, though ${his} butt and throat get a little sore.`); + } else if (slave.nipples === "fuckable" && V.PC.dick !== 0) { + r.push(`nipples and mouth. ${He} is <span class="mediumaquamarine">duly grateful</span> you let ${him} keep ${his} innocence for another week, though ${his} boobs and throat get a little sore.`); + } else { + r.push(`mouth. ${He} is <span class="mediumaquamarine">duly grateful</span> you ${his} keep let ${him} innocence for another week, though ${his} throat gets a little sore.`); + } + slave.trust += 1; + } else if (slave.anus === 0) { + r.push(`Since you haven't yet decided to sell or take ${his} tight little anus, you let ${him} confine ${his} efforts to ${his}`); + if (canDoVaginal(slave) && slave.nipples === "fuckable" && V.PC.dick !== 0) { + r.push(`pussy, nipples and mouth. ${He} is <span class="mediumaquamarine">duly grateful</span> you let ${him} put off taking it up the butt another week, though ${his} boobs and throat get a little sore.`); + } else if (canDoVaginal(slave)) { + r.push(`pussy and mouth. ${He} is <span class="mediumaquamarine">duly grateful</span> you let ${him} put off taking it up the butt another week, though ${his} throat gets a little sore.`); + } else if (slave.nipples === "fuckable" && V.PC.dick !== 0) { + r.push(`nipples and mouth. ${He} is <span class="mediumaquamarine">duly grateful</span> you let ${him} put off taking it up the butt another week, though ${his} boobs and throat get a little sore.`); + } else { + r.push(`mouth. ${He} is <span class="mediumaquamarine">duly grateful</span> you let ${him} put off taking it up the butt another week, though ${his} throat gets a little sore.`); + } + slave.trust += 1; + } else if (!canWalk(slave)) { + r.push(`You carry ${him} around with you all week, using ${him} as your personal sex toy and bedwarmer.`); + if (isAmputee(slave)) { + r.push(`Without arms and legs,`); + } else if (!hasAnyLegs(slave)) { + r.push(`Without legs,`); + } else if (!hasBothLegs(slave)) { + r.push(`With just one leg,`); + } else if (tooFatSlave(slave)) { + r.push(`Immobilized by ${his} own weight,`); + } else if (tooBigBreasts(slave)) { + r.push(`Immobilized by ${his} own tits,`); + } else if (tooBigBelly(slave)) { + r.push(`Immobilized by ${his} own swollen orb of a midsection,`); + } else if (tooBigBalls(slave)) { + r.push(`Immobilized by ${his} own oversized testicles,`); + } else if (tooBigDick(slave)) { + r.push(`Immobilized by ${his} own oversized cock,`); + } else if (tooBigButt(slave)) { + r.push(`Immobilized by ${his} own massive ass,`); + } else { + r.push(`With ${his} clipped heels,`); + } + r.push(`${he} is your <span class="hotpink">helpless sexual appliance</span> and is <span class="mediumaquamarine">forced to trust you.</span>`); + slave.trust += 4; + } else if (slave.devotion > 50) { + r.push(`${He} devotedly accompanies you all week, keeping ${his}`); + if (canDoAnal(slave) && canDoVaginal(slave)) { + r.push(`mouth,`); + if (V.PC.dick !== 0 && slave.nipples === "fuckable") { + r.push(`vagina, nipples`); + } else { + r.push(`vagina`); + } + r.push(`and asshole`); + } else if (slave.vagina === -1 && canDoAnal(slave)) { + if (V.PC.dick !== 0 && slave.nipples === "fuckable") { + r.push(`mouth, nipples`); + } else { + r.push(`mouth`); + } + r.push(`and asshole`); + } else if (slave.vagina > -1 && !canDoVaginal(slave) && canDoAnal(slave)) { + if (V.PC.dick !== 0 && slave.nipples === "fuckable") { + r.push(`mouth, nipples`); + } else { + r.push(`mouth`); + } + r.push(`and, since ${his} pussy is covered by ${his} chastity belt, asshole`); + } else { + r += `mouth `; + if (V.PC.dick !== 0 && slave.nipples === "fuckable") { + r.push(`and nipples`); + } + } + r.push(`available for you at all times.`); + if (canAchieveErection(slave) && !slave.chastityPenis) { + r.push(`Every time ${his} beloved ${WrittenMaster(slave)} fucks ${him}, ${he} gets a hard-on.`); + } else if (slave.dick !== 0 && slave.prostate > 0 && canDoVaginal(slave)) { + r.push(`${He} doesn't get a hard-on as you use ${him}, but ${he} comes from the prostate stimulation when ${his} beloved ${WrittenMaster(slave)} uses ${his} pussy.`); + } else if (slave.dick !== 0 && slave.prostate > 0 && canDoAnal(slave)) { + r.push(`${He} doesn't get a hard-on as you use ${him}, but ${he} comes from the prostate stimulation when ${his} beloved ${WrittenMaster(slave)} uses ${his} butt.`); + } else { + r.push(`${He} comes indecently hard whenever ${his} beloved ${WrittenMaster(slave)} uses ${his} body.`); + } + r.push(`You have the sexual energy to fuck ${him}`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + r.push(`several times a day; constant,`); + slave.devotion += 3; + slave.trust += 3; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + r.push(`at least once a day; regular,`); + slave.devotion += 2; + slave.trust += 2; + } else { + r.push(`on occasion;`); + slave.devotion += 1; + slave.trust += 1; + } + r.push(`loving sex with you draws ${him} <span class="hotpink">closer to you</span> and encourages ${him} to <span class="mediumaquamarine">trust you.</span>`); + } else if (slave.devotion > 20) { + r.push(`Whenever you feel the need, you use whichever of ${his} available holes that appears most appealing at the moment, since ${he}'s up for anything.`); + if (slave.dick !== 0 && canAchieveErection(slave) && !slave.chastityPenis) { + r.push(`By the end of the week ${he} gets a hard-on when you use ${him}.`); + } + r.push(`You have the sexual energy to fuck ${him}`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + r.push(`several times a day; constant,`); + slave.devotion += 3; + slave.trust += 3; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + r.push(`at least once a day; regular,`); + slave.devotion += 2; + slave.trust += 2; + } else { + r.push(`on occasion;`); + slave.devotion += 1; + slave.trust += 1; + } + r.push(`enjoyable sex with you draws ${him} <span class="hotpink">closer to you</span> and encourages ${him} to <span class="mediumaquamarine">trust you.</span>`); + } else if (slave.trust < -20) { + r.push(`${He} is afraid of you and does ${his} best to offer you ${his}`); + if (canDoAnal(slave) && canDoVaginal(slave)) { + r.push(`mouth,`); + if (V.PC.dick !== 0 && slave.nipples === "fuckable") { + r.push(`vagina, nipples`); + } else { + r.push(`vagina`); + } + r.push(`and asshole`); + } else if (slave.vagina === -1 && canDoAnal(slave)) { + if (V.PC.dick !== 0 && slave.nipples === "fuckable") { + r.push(`mouth, nipples`); + } else { + r.push(`mouth`); + } + r.push(`and asshole`); + } else if (slave.vagina > -1 && !canDoVaginal(slave) && canDoAnal(slave)) { + if (V.PC.dick !== 0 && slave.nipples === "fuckable") { + r.push(`mouth, nipples`); + } else { + r.push(`mouth`); + } + r.push(`and, since ${his} pussy is covered by ${his} chastity belt, asshole`); + } else { + r += `mouth `; + if (V.PC.dick !== 0 && slave.nipples === "fuckable") { + r.push(`and nipples`); + } + } + r.push(`to save ${himself} from worse treatment than mere rape.`); + if (slave.dick !== 0 && canAchieveErection(slave) && !slave.chastityPenis) { + r.push(`By the end of the week ${he} gets a hard-on when you use ${him}.`); + } + r.push(`You have the sexual energy to fuck ${him}`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + r.push(`several times a day; submitting to your constant`); + slave.devotion += 3; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + r.push(`at least once a day; submitting to your regular`); + slave.devotion += 2; + } else { + r.push(`on occasion; submitting to your`); + slave.devotion += 1; + } + r.push(`use <span class="hotpink">habituates ${him}</span> to being your sex slave.`); + } else { + r.push(`Whenever you feel the need, you grab ${him} and use whichever of ${his} available holes that appears most appealing at the moment.`); + if (slave.dick !== 0 && canAchieveErection(slave)) { + r.push(`${His} dick stays limp as you rape ${him}.`); + } + r.push(`You have the sexual energy to fuck ${him}`); + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + r.push(`several times a day; the constant`); + slave.devotion -= 5; + slave.trust -= 15; + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + r.push(`at least once a day; the regular`); + slave.devotion -= 3; + slave.trust -= 9; + } else { + r.push(`on occasion; the threat of`); + slave.devotion -= 3; + slave.trust -= 3; + } + r.push(`rape fills ${him} with <span class="mediumorchid">revulsion</span> and <span class="gold">fear.</span>`); + } + + if (V.fuckSlaves <= V.PC.sexualEnergy / 2) { + acts = jsRandom(21, 40); + } else if (V.fuckSlaves <= V.PC.sexualEnergy) { + acts = jsRandom(7, 14); + } else { + acts = jsRandom(3, 7); + } + oralUse = 1; + if (canDoAnal(slave) && slave.anus > 0) { + analUse = 1; + } + if (canDoVaginal(slave) && slave.vagina > 0) { + vaginalUse = 1; + } + mammaryUse = jsRandom(0, 1); + if (slave.nipples === "fuckable") { + mammaryUse = 1; + } + demand = oralUse + analUse + vaginalUse + mammaryUse; + oralUse = Math.trunc((oralUse / demand) * acts); + analUse = Math.trunc((analUse / demand) * acts); + vaginalUse = Math.trunc((vaginalUse / demand) * acts); + mammaryUse = Math.trunc((mammaryUse / demand) * acts); + slave.counter.oral += oralUse; + V.oralTotal += oralUse; + slave.counter.anal += analUse; + V.analTotal += analUse; + slave.counter.vaginal += vaginalUse; + V.vaginalTotal += vaginalUse; + slave.counter.mammary += mammaryUse; + V.mammaryTotal += mammaryUse; + + if (slave.fuckdoll === 0) { + if (slave.fetish !== "mindbroken") { + if (slave.skill.oral < 100) { + r.push(`After a lot of time spent with`); + if (V.PC.dick !== 0) { + r.push(`your dick in ${his} mouth,`); + } else { + r.push(`${his} mouth on your cunt,`); + } + r.push(`${his} <span class="green">oral skill improves.</span>`); + r.push(`${SkillIncrease.Oral(slave, trainingEfficiency)}`); + } else if (slave.skill.vaginal < 100 && slave.vagina > 0 && canDoVaginal(slave)) { + r.push(`After a lot of time spent getting fucked, ${his} <span class="green">vaginal skill improves.</span>`); + r.push(`${SkillIncrease.Vaginal(slave, trainingEfficiency)}`); + } else if (slave.skill.anal < 100 && slave.anus !== 0 && canDoAnal(slave)) { + r.push(`After a lot of time spent taking it up the ass, ${his} <span class="green">anal skill improves.</span>`); + r.push(`${SkillIncrease.Anal(slave, trainingEfficiency)}`); + } + } + } + + if (slave.lactation > 0 && mammaryUse > 0) { + slave.lactationDuration = 2; + if (slave.boobsMilk > 0) { + slave.boobs -= slave.boobsMilk; + slave.boobsMilk = 0; + } + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function physicalEffects(slave) { + if (V.PC.dick !== 0) { + if (slave.cervixImplant === 1 || slave.cervixImplant === 3) { + cervixPump += 10 * (V.PC.balls - 2) * vaginalUse; + } + if (slave.cervixImplant === 2 || slave.cervixImplant === 3) { + cervixPump += 10 * (V.PC.balls - 2) * analUse; + } + } + if (cervixPump > 0) { + if (slave.fuckdoll === 0) { + if (slave.fetish === "mindbroken") { + r.push(`${He} is completely oblivious to ${his} <span class="lime">increasingly swollen belly</span> and stands no chance of linking it to`); + } else { + r.push(`${He} notices ${his} <span class="lime">belly has swollen</span> after`); + } + r.push(`all the`); + if (slave.cervixImplant === 1) { + r.push(`vaginal`); + } else if (slave.cervixImplant === 2) { + r.push(`anal`); + } + r.push(`sex ${he}'s had with you.`); + slave.bellyImplant += cervixPump; + } else { + r.push(`With each deposit of your seed into ${him}, ${his} <span class="lime">stomach swells a little larger.</span>`); + slave.bellyImplant += cervixPump; + } + } + + if (slave.health.condition < 0 && jsRandom(1, 100) > 50) { + r.push(`Under your personal supervision, <span class="green">${his} health improves.</span>`); + improveCondition(slave, 10); + } + + if (slave.need) { + if (slave.energy > 95 && V.masterSuiteUpgradeLuxury === 2 && V.fuckSlaves > 1) { + r.push(`${he}'s a nymphomaniac and very difficult to sate, but the fuckpit allows ${him} all the sex even ${he} could ever want.`); + slave.need = 0; + } else if (slave.devotion > 95) { + r.push(`${He}'s so devoted to you that any intimacy with you at all gives ${him} sexual satisfaction.`); + slave.need = 0; + } else if (slave.fetishKnown) { + switch (slave.fetish) { + case "masochist": + case "submissive": + if (analUse + vaginalUse > 0) { + r.push(`${He} got tremendous sexual satisfaction from the ${analUse + vaginalUse} times you really fucked ${him} this week.`); + slave.need = 0; + } + break; + case "dom": + if (penetrativeUse > 0) { + r.push(`${He} got tremendous sexual satisfaction from the ${penetrativeUse} times ${he} got to fuck you this week.`); + slave.need = 0; + } + break; + case "boobs": + if (mammaryUse > 0) { + r.push(`${He} got tremendous sexual satisfaction from the ${mammaryUse} times you groped ${his} breasts to orgasm this week.`); + slave.need = 0; + } + break; + case "sadist": + case "cumslut": + if (oralUse > 0) { + r.push(`${He} got tremendous sexual satisfaction from the ${oralUse} times you fucked ${his} face this week.`); + slave.need = 0; + } + break; + case "buttslut": + if (analUse > 0) { + r.push(`${He} got tremendous sexual satisfaction from the ${analUse} times you fucked ${his} ass this week.`); + slave.need = 0; + } + break; + case "pregnancy": + if (vaginalUse > 0 && slave.mpreg === 0) { + r.push(`${He} got tremendous sexual satisfaction from the ${vaginalUse} times you fucked ${his} pussy this week.`); + slave.need = 0; + } else if (analUse > 0 && slave.mpreg === 1) { + r.push(`${He} got tremendous sexual satisfaction from the ${analUse} times you fucked ${his} butt this week.`); + slave.need = 0; + } + break; + case "humiliation": + // nothing here + break; + } + } + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function familyBonus(slave) { + let spy; + let children; + + if (V.familyTesting === 1) { + if (slave.father === -1 && slave.mother !== -1) { + r.push(`Keeping your own ${daughter} as a personal fucktoy leaves quite a public impression.`); + } else if (slave.father > 0 && slave.mother !== slave.father) { + spy = V.slaveIndices[slave.father]; + if ((spy !== undefined) && (V.slaves[spy].assignment === "please you" || V.slaves[spy].assignment === "serve in the master suite" || V.slaves[spy].assignment === "be your Concubine")) { + r.push(`Since you are also keeping ${his} father as a sexual servant, you often use them together, which leaves quite a public impression.`); + } + } + + if (slave.mother === -1) { + r.push(`Keeping your own ${daughter} as a personal fucktoy leaves quite a public impression.`); + } else if (slave.mother > 0) { + spy = V.slaveIndices[slave.mother]; + if ((spy !== undefined) && (V.slaves[spy].assignment === "please you" || V.slaves[spy].assignment === "serve in the master suite" || V.slaves[spy].assignment === "be your Concubine")) { + r.push(`Since you are also keeping ${his} mother as a sexual servant, you often use them together, which leaves quite a public impression.`); + } + } + + children = V.slaves.filter(function(s) { return (s.father === slave.ID || s.mother === slave.ID) && (s.assignment === "please you" || s.assignment === "serve in the master suite" || s.assignment === "be your Concubine"); }); + if (children.length > 2) { + r.push(`Since you are also keeping ${his} daughters,`); + for (spy = 0; spy < children.length; spy++) { + if (spy < children.length - 1) { + r.push(`${children[spy].slaveName},`); + } else { + r.push(`and ${children[spy].slaveName},`); + } + } + r.push(`as sexual servants, you often enjoy them all at once, which leaves quite a public impression.`); + } else if (children.length > 1) { + r.push(`Since you are also keeping ${his} daughters, ${children[0].slaveName} and ${children[1].slaveName}, as sexual servants, you often use them together, leaving quite a public impression.`); + } else if (children.length > 0) { + const childPronouns = getPronouns(children[0]); + r.push(`Since you are also keeping ${his} ${childPronouns.daughter} as a sexual servant, you often use them together, which leaves quite a public impression.`); + } + + children = V.slaves.filter(function(s) { return (areSisters(slave, s) > 0) && (s.assignment === "please you" || s.assignment === "serve in the master suite" || s.assignment === "be your Concubine"); }); + if (children.length > 2) { + r.push(`Since you are also keeping ${his} sisters,`); + for (spy = 0; spy < children.length; spy++) { + if (spy < children.length - 1) { + r.push(`${children[spy].slaveName},`); + } else { + r.push(`and ${children[spy].slaveName},`); + } + } + r.push(`as sexual servants, you often enjoy them all at once, which leaves quite a public impression.`); + } else if (children.length > 1) { + r.push(`Since you are also keeping ${his} sisters, ${children[0].slaveName} and ${children[1].slaveName}, as sexual servants, you often use them together, leaving quite a public impression.`); + } else if (children.length > 0) { + const childPronouns = getPronouns(children[0]); + r.push(`Since you are also keeping ${his} ${childPronouns.sister} as a sexual servant, you often use them together, which leaves quite a public impression.`); + } + } else { + if (slave.relation !== 0) { + spy = V.slaveIndices[slave.relationTarget]; + if ((spy !== undefined) && (V.slaves[spy].assignment === "please you" || V.slaves[spy].assignment === "serve in the master suite" || V.slaves[spy].assignment === "be your Concubine")) { + r.push(`Since you are also keeping ${his} ${V.slaves[spy].relation} as a sexual servant, you often use them together, which leaves quite a public impression.`); + } + } + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function addRep(slave) { + let multiplier = 0.1; + if (slave.fuckdoll === 0) { + if (slave.fetish !== "mindbroken") { + if (slave.relationship === -2) { + multiplier += 0.04; + } else if (slave.relationship === -3 && slave.devotion > 50) { + multiplier += 0.06; + } + } + if (V.arcologies[0].FSSlaveProfessionalism > 50 && slave.intelligence + slave.intelligenceImplant >= 100 && slave.skill.entertainment >= 100 && slave.skill.whoring >= 100 && slave.skill.anal >= 100 && slave.skill.oral >= 100) { + multiplier += 0.04; + if (slave.vagina >= 0 && slave.skill.vaginal >= 100) { + multiplier += 0.01; + } + } + if (V.arcologies[0].FSRestart > 50 && slave.breedingMark === 1 && V.propOutcome === 1) { + multiplier += 0.04; + } + if (V.arcologies[0].FSRepopulationFocus > 50 && slave.bellyPreg >= 5000) { + multiplier += 0.02; + } + if (slave.prestige > 0) { + multiplier += 0.03*slave.prestige; + } + if (slave.porn.prestige > 2) { + multiplier += 0.1; + } else if (slave.porn.prestige > 1) { + multiplier += 0.03; + } + } else { + if (slave.porn.fameType === "fuckdoll") { + multiplier += 0.1 * slave.porn.prestige; + } else { + multiplier += 0.04; + } + } + if (slave.ID === V.Concubine.ID) { + multiplier += 0.05; + } else if ((slave.ID === V.HeadGirl.ID) && (V.arcologies[0].FSEgyptianRevivalistLaw === 1)) { + multiplier += 0.05; + } + + repX(Math.trunc(( Beauty(slave) * FResult(slave) ) * multiplier / 4), "fucktoy", slave); + + r.push(`Keeping ${him} as nothing but your personal`); + if (slave.toyHole === "pussy") { + r.push(`pussy toy`); + } else if (slave.toyHole === "ass") { + r.push(`anal toy`); + } else if (slave.toyHole === "mouth") { + r.push(`oral toy`); + } else if (slave.devotion <= 20) { + r.push(`rapebait`); + } else { + r.push(`fucktoy`); + } + if (slave.prestige > 0 && slave.fuckdoll === 0) { + r.push(`<span class="green">adds considerably to your reputation,</span> since ${he}'s prestigious.`); + } else { + r.push(`<span class="green">adds slightly to your reputation</span> as a prosperous citizen.`); + } + + if (slave.fuckdoll === 0) { + if (slave.porn.prestige > 2) { + r.push(`Having your every urge attended to by a famous porn star <span class="green">is not lost on the citizenry.</span>`); + } else if (slave.porn.prestige > 1) { + r.push(`Having a rising porn star to sate your urges with <span class="green">demonstrates how well off you are.</span>`); + } + if (slave.fetish !== "mindbroken") { + if (slave.relationship === -2) { + r.push(`${His} satisfaction with ${his} place near you is obvious, <span class="green">bringing attention</span> to how completely you've broken ${him}.`); + } else if (slave.relationship === -3 && slave.devotion > 50) { + r.push(`${His} satisfaction with ${his} ${wife}ly duties is obvious, <span class="green">bringing attention</span> to the slave future you're building.`); + } + } + if (V.arcologies[0].FSSlaveProfessionalism > 50 && slave.intelligence + slave.intelligenceImplant >= 100 && slave.skill.entertainment >= 100 && slave.skill.whoring >= 100 && slave.skill.anal >= 100 && slave.skill.oral >= 100) { + r.push(`Keeping an ideal courtesan to attend to your needs <span class="green">is the definition of high class.</span>`); + } + if (V.arcologies[0].FSRestart > 50 && slave.breedingMark === 1 && V.propOutcome === 1) { + r.push(`${His} breeding mark and ${his} place near you as a breeding toy is obvious, <span class="green">bringing attention</span> to how beautiful a pairing you make.`); + } + if (V.arcologies[0].FSRepopulationFocus > 50 && slave.bellyPreg >= 5000) { + r.push(`${His} advanced pregnancy and role as your gravid breeder is obvious, <span class="green">bringing attention</span> to a woman's ideal role in ${arcology.name}.`); + } + } else { + if (slave.porn.fameType === "fuckdoll") { + if (slave.porn.prestige > 2) { + r.push(`Keeping a legendary fuckdoll as your personal plaything <span class="green">is not lost on the citizenry.</span>`); + } else if (slave.porn.prestige > 1) { + r.push(`Keeping a well-known fuckdoll to sate your urges with <span class="green">demonstrates how well off you are.</span>`); + } + } + } + } + + /** + * @param {App.Entity.SlaveState} slave + * + */ + function mentalEffects(slave) { + if (slave.behavioralQuirk === "confident") { + r.push(`${slave.slaveName} <span class="mediumaquamarine">confidently enjoys</span> the prestige within the slave hierarchy that comes with being your fucktoy.`); + slave.trust += 1; + } else if (slave.behavioralQuirk === "insecure") { + r.push(`${slave.slaveName} <span class="mediumaquamarine">constantly reassures ${himself}</span> that ${he} must be pretty, since you keep ${him} as a fucktoy.`); + slave.trust += 1; + } + if (slave.behavioralQuirk === "adores men") { + if (V.PC.dick !== 0) { + r.push(`${slave.slaveName} <span class="hotpink">adores your company,</span> and is happy to spend time with you, even when you don't have your cock in ${him}.`); + slave.devotion += 1; + } + } else if (slave.behavioralQuirk === "adores women") { + if (V.PC.vagina !== -1) { + r.push(`${slave.slaveName} <span class="hotpink">adores your company,</span> and is happy to spend time with you, even when you aren't fucking.`); + slave.devotion += 1; + } + } else if (slave.sexualQuirk === "romantic") { + r.push(`${slave.slaveName} knows being part of your harem is the best romance ${he} can realistically expect, and does ${his} best to <span class="mediumaquamarine">be content</span> with it.`); + slave.trust += 1; + } + if (slave.fetish === "pregnancy" && (V.PC.preg >= 20 || (V.PC.preg >= 16 && V.PC.career === "escort"))) { + r.push(`${slave.slaveName} <span class="hotpink">enjoys being so close to ${his} gravid ${WrittenMaster(slave)}.</span>`); + slave.devotion += 1; + if (slave.fetishKnown === 0) { + r.push(`${He} enjoys being tasked with servicing a pregnant ${playerPronouns.woman} far more than a normal slave would; <span class="lightcoral">${he}'s harboring a pregnancy fetish!</span>`); + slave.fetishKnown = 1; + } else if (slave.fetishStrength < 95) { + r.push(`Being tasked with servicing a lusty pregnant ${playerPronouns.woman} <span class="lightcoral">strengthens ${his} pregnancy fetish.</span>`); + slave.fetishStrength += 4; + } + } else if (fetishChange > jsRandom(0, 100) && (V.PC.preg >= 20 || (V.PC.preg >= 16 && V.PC.career === "escort"))) { + r.push(`At first ${he} found the prospect of being used by ${his} increasingly pregnant ${WrittenMaster(slave)} a turn off, but being so close to your gravid form serves to be more erotic than ${he} anticipated. Soon ${he} finds ${himself} aroused less from the prospect of sex and more <span class="lightcoral">the chance to be near your child laden belly.</span>`); + slave.fetish = "pregnancy"; + slave.fetishKnown = 1; + slave.fetishStrength = 10; + } + } +})(); diff --git a/src/endWeek/saRest.js b/src/endWeek/saRest.js index 25b162bbc304788ae3f7af2910628a2e08a53151..dfb6d41cd547316bbad89d14335f9ed85cff1754 100644 --- a/src/endWeek/saRest.js +++ b/src/endWeek/saRest.js @@ -80,7 +80,7 @@ window.saRest = function saRest(slave) { t += `,</span> ${his} body appreciates being allowed to rest.`; } if (slave.health.tired > 30) { - if (slave.assignment === "rest in the spa") { + if (slave.assignment === window.Job.SPA) { if (V.spaUpgrade > 0) { t += ` ${V.spaNameCaps}'s luxuries help ${him} relax.`; } @@ -91,22 +91,23 @@ window.saRest = function saRest(slave) { } tired(slave); - if (V.showVignettes === 1 && slave.assignment === Job.REST) { - const _vignette = GetVignette(slave), + if (V.showVignettes === 1 && slave.assignment === window.Job.REST) { + const vignette = GetVignette(slave), FResultNumber = FResult(slave); - t += ` <span class="story-label">This week</span> ${_vignette.text} `; - if (_vignette.type === "cash") { - if (_vignette.effect > 0) { - t += `<span class="cash inc">making you an extra ${cashFormat(Math.trunc(FResultNumber * _vignette.effect))}.</span>`; - } else if (_vignette.effect < 0) { - t += `<span class="cash dec">losing you ${cashFormat(Math.abs(Math.trunc(FResultNumber * _vignette.effect)))}.</span>`; + t += ` <span class="story-label">This week</span> ${vignette.text} `; + if (vignette.type === "cash") { + if (vignette.effect > 0) { + t += `<span class="cash inc">making you an extra ${cashFormat(Math.trunc(FResultNumber * vignette.effect))}.</span>`; + cashX(Math.trunc(FResultNumber * vignette.effect), "slaveAssignmentRestVign", slave); + } else if (vignette.effect < 0) { + t += `<span class="cash dec">losing you ${cashFormat(Math.abs(Math.trunc(FResultNumber * vignette.effect)))}.</span>`; + cashX(forceNeg(Math.trunc(FResultNumber * vignette.effect)), "slaveAssignmentRestVign", slave); } else { t += `an incident without lasting effect.`; } - cashX(Math.trunc(FResultNumber * _vignette.effect), "rest", slave); - } else if (_vignette.type === "devotion") { - if (_vignette.effect > 0) { + } else if (vignette.type === "devotion") { + if (vignette.effect > 0) { if (slave.devotion > 50) { t += `<span class="devotion inc">increasing ${his} devotion to you.</span>`; } else if (slave.devotion >= -20) { @@ -116,7 +117,7 @@ window.saRest = function saRest(slave) { } else { t += `<span class="devotion inc">reducing ${his} hatred of you.</span>`; } - } else if (_vignette.effect < 0) { + } else if (vignette.effect < 0) { if (slave.devotion > 50) { t += `<span class="devotion dec">reducing ${his} devotion to you.</span>`; } else if (slave.devotion >= -20) { @@ -129,9 +130,9 @@ window.saRest = function saRest(slave) { } else { t += `an incident without lasting effect.`; } - slave.devotion += (1 * _vignette.effect); - } else if (_vignette.type === "trust") { - if (_vignette.effect > 0) { + slave.devotion += (1 * vignette.effect); + } else if (vignette.type === "trust") { + if (vignette.effect > 0) { if (slave.trust > 20) { t += `<span class="trust inc">increasing ${his} trust in you.</span>`; } else if (slave.trust > -10) { @@ -139,7 +140,7 @@ window.saRest = function saRest(slave) { } else { t += `<span class="trust inc">reducing ${his} terror of you.</span>`; } - } else if (_vignette.effect < 0) { + } else if (vignette.effect < 0) { if (slave.trust > 20) { t += `<span class="trust dec">reducing ${his} trust in you.</span>`; } else if (slave.trust >= -20) { @@ -150,26 +151,26 @@ window.saRest = function saRest(slave) { } else { t += `an incident without lasting effect.`; } - slave.trust += (1 * _vignette.effect); - } else if (_vignette.type === "health") { - if (_vignette.effect > 0) { + slave.trust += (1 * vignette.effect); + } else if (vignette.type === "health") { + if (vignette.effect > 0) { t += `<span class="health inc">improving ${his} health.</span>`; - improveCondition(slave, 2 * _vignette.effect); - } else if (_vignette.effect < 0) { + improveCondition(slave, 2 * vignette.effect); + } else if (vignette.effect < 0) { t += `<span class="health dec">affecting ${his} health.</span>`; - healthDamage(slave, 2 * _vignette.effect); + healthDamage(slave, 2 * vignette.effect); } else { t += `an incident without lasting effect.`; } } else { - if (_vignette.effect > 0) { + if (vignette.effect > 0) { t += `<span class="reputation inc">gaining you a bit of reputation.</span>`; - } else if (_vignette.effect < 0) { + } else if (vignette.effect < 0) { t += `<span class="reputation dec">losing you a bit of reputation.</span>`; } else { t += `an incident without lasting effect.`; } - repX((FResultNumber * _vignette.effect * 0.1), "vignette", slave); + repX((FResultNumber * vignette.effect * 0.1), "vignette", slave); } } diff --git a/src/endWeek/saServant.js b/src/endWeek/saServant.js index a58056f0b9dadc95ff11b69561c6286fa85fb0f8..b4ab2088361a24c5f7fad88e856dab260c7eb3bb 100644 --- a/src/endWeek/saServant.js +++ b/src/endWeek/saServant.js @@ -13,8 +13,8 @@ window.saServant = function saServant(slave) { let t = `works as a servant. ${He} performs the lowest jobs in your penthouse, cleaning up after your other slaves, bathing them, helping them dress, and giving them sexual relief.`; if (V.servantsQuarters > 0) { - if ((V.universalRulesFacilityWork === 1 && slave.assignment === "be a servant" && V.servantsQuartersSpots > 0) || (slave.assignment === "work as a servant")) { - if (slave.assignment === "be a servant") { + if ((V.universalRulesFacilityWork === 1 && slave.assignment === window.Job.HOUSE && V.servantsQuartersSpots > 0) || (slave.assignment === window.Job.SERVANT)) { + if (slave.assignment === window.Job.HOUSE) { t += ` Since there's extra space in the servants' quarters, ${V.assistant.name} attaches ${him} to the cadre of maids there.`; V.servantsQuartersSpots--; } @@ -31,14 +31,23 @@ window.saServant = function saServant(slave) { t += `uses <span class="devotion inc">sex as a reward,</span> getting ${him} off when ${he} <span class="cash inc">works harder.</span>`; slave.devotion++; } + // Portion that calculates upkeep reduction, we call it income + let cash = 0; if (!(canHear(slave))) { t += ` However, ${his} inability to hear often leaves ${him} oblivious to ${V.Stewardess.slaveName}'s orders, limiting their meaningful interactions.`; - cashX(V.stewardessBonus / 4 * healthPenalty(slave), "houseServant", slave); + cash = V.stewardessBonus / 4 * healthPenalty(slave); } else if ((slave.hears === -1 && slave.earwear !== "hearing aids") || (slave.hears === 0 && slave.earwear === "muffling ear plugs")) { t += ` However, ${he} often doesn't catch what ${V.Stewardess.slaveName} says, leading to frustration, confusion and less work done.`; - cashX(V.stewardessBonus / 2 * healthPenalty(slave), "houseServant", slave); + cash = V.stewardessBonus / 2 * healthPenalty(slave); } else { - cashX(V.stewardessBonus * healthPenalty(slave), "houseServant", slave); + cash = V.stewardessBonus * healthPenalty(slave); + } + if (slave.assignment === window.Job.HOUSE) { + cashX(cash, "slaveAssignmentHouse", slave); + } else if (slave.assignment === window.Job.QUARTER) { + cashX(cash, "slaveAssignmentQuarter", slave); + } else { + cashX(cash, "serving income in an unregistered building", slave); } } } @@ -140,19 +149,38 @@ window.saServant = function saServant(slave) { } } - if (V.showVignettes === 1 && (slave.assignment === Job.SERVANT || slave.assignment === Job.SERVER)) { + if (V.showVignettes === 1 && (slave.assignment === window.Job.SERVANT || slave.assignment === window.Job.HOUSE)) { const vignette = GetVignette(slave); t += ` <span class="story-label">This week</span> ${vignette.text} `; if (vignette.type === "cash") { let modifier = FResult(slave); + const cashVign = Math.trunc(modifier * vignette.effect); if (vignette.effect > 0) { - t += `<span class="cash inc">making you an extra ${cashFormat(Math.trunc(modifier * vignette.effect))}.</span>`; + t += `<span class="cash inc">making you an extra ${cashFormat(cashVign)}.</span>`; } else if (vignette.effect < 0) { - t += `<span class="cash dec">losing you ${cashFormat(Math.abs(Math.trunc(modifier * vignette.effect)))}.</span>`; + t += `<span class="cash dec">losing you ${cashFormat(Math.abs(cashVign))}.</span>`; } else { t += `an incident without lasting effect.`; } - cashX(Math.trunc(modifier * vignette.effect), "houseServant", slave); + if (slave.assignment === window.Job.HOUSE) { + if (vignette.effect > 0) { + cashX(cashVign, "slaveAssignmentHouseVign", slave); + } else if (vignette.effect < 0) { + cashX(forceNeg(cashVign), "slaveAssignmentHouseVign", slave); + } + } else if (slave.assignment === window.Job.SERVANT) { + if (vignette.effect > 0) { + cashX(cashVign, "slaveAssignmentQuarterVign", slave); + } else if (vignette.effect < 0) { + cashX(forceNeg(cashVign), "slaveAssignmentQuarterVign", slave); + } + } else { + if (vignette.effect > 0) { + cashX(cashVign, "vignette serving income in an unregistered building", slave); + } else if (vignette.effect < 0) { + cashX(forceNeg(cashVign), "vignette serving expense in an unregistered building", slave); + } + } } else if (vignette.type === "devotion") { if (vignette.effect > 0) { if (slave.devotion > 50) { diff --git a/src/endWeek/saServeThePublic.js b/src/endWeek/saServeThePublic.js index b80a5c654998f06da8c31548e6076f82ff778a42..d67fde13d9778c3fcb08c680fdbbcf8730205157 100644 --- a/src/endWeek/saServeThePublic.js +++ b/src/endWeek/saServeThePublic.js @@ -1497,19 +1497,38 @@ window.saServeThePublic = (function saServeThePublic() { */ function assignmentVignette(slave) { let vignette; - if (slave.assignment !== "recruit girls") { + if (slave.assignment !== window.Job.RECRUITER) { vignette = GetVignette(slave); r += ` <span class="story-label">This week</span> ${vignette.text} `; if (vignette.type === "cash") { + const cashVign = Math.trunc(slave.sexQuality * vignette.effect); if (vignette.effect > 0) { - r += `<span class="cash inc">making you an extra ${cashFormat(Math.trunc(slave.sexQuality * vignette.effect))}.</span>`; + r += `<span class="cash inc">making you an extra ${cashFormat(cashVign)}.</span>`; } else if (vignette.effect < 0) { - r += `<span class="cash dec">losing you ${cashFormat(Math.abs(Math.trunc(slave.sexQuality * vignette.effect)))}.</span>`; + r += `<span class="cash dec">losing you ${cashFormat(Math.abs(cashVign))}.</span>`; } else { r += `an incident without lasting effect.`; } - cashX(Math.trunc(slave.sexQuality * vignette.effect), "publicServant", slave); - T.incomeStats.rep += Math.trunc(slave.sexQuality * vignette.effect); + if (slave.assignment === window.Job.PUBLIC) { + if (vignette.effect > 0) { + cashX(cashVign, "slaveAssignmentPublicVign", slave); + } else if (vignette.effect < 0) { + cashX(forceNeg(cashVign), "slaveAssignmentPublicVign", slave); + } + } else if (slave.assignment === window.Job.CLUB) { + if (vignette.effect > 0) { + cashX(cashVign, "slaveAssignmentClubVign", slave); + } else if (vignette.effect < 0) { + cashX(forceNeg(cashVign), "slaveAssignmentClubVign", slave); + } + } else { + if (vignette.effect > 0) { + cashX(cashVign, "vignette public sexslave income in an unregistered building", slave); + } else if (vignette.effect < 0) { + cashX(forceNeg(cashVign), "vignette public sexslave expense in an unregistered building", slave); + } + } + T.incomeStats.income += cashVign; } else if (vignette.type === "devotion") { if (vignette.effect > 0) { if (slave.devotion > 50) { diff --git a/src/endWeek/saWhore.js b/src/endWeek/saWhore.js index 13482fd9d874aa2f1ddf82f59619e8a8730eb51d..733c022ed7be826d845990f1ba1192a32c253861 100644 --- a/src/endWeek/saWhore.js +++ b/src/endWeek/saWhore.js @@ -307,7 +307,7 @@ window.saWhore = (function saWhore() { r += ` ${slave.slaveName} sees ${his} role as helping people with their sexual needs, and ${he} <span class="trust inc">trusts that ${his} place</span> in society is an important one.`; slave.trust += 1; } - if (slave.assignment === "work in the brothel" && slave.devotion > 50) { + if (slave.assignment === window.Job.BROTHEL && slave.devotion > 50) { r += ` Being so far from your presence <span class="mediumorchid">weakens ${his} intense devotion to you.</span>`; } } @@ -317,7 +317,7 @@ window.saWhore = (function saWhore() { */ function physicalEffects(slave) { let injury = 0; - if (slave.assignment !== "work in the brothel") { + if (slave.assignment !== window.Job.BROTHEL) { if (slave.curatives > 0 || slave.inflationType === "curative") { r += ` The drugs `; if (slave.inflationType === "curative") { @@ -1308,14 +1308,14 @@ window.saWhore = (function saWhore() { cash = Math.trunc(whoreScore * V.whorePriceAdjustment.lowerClass); slave.sexQuality = Math.trunc(slave.sexQuality); } - if (slave.assignment === "work in the brothel") { - cashX(cash, "whoreBrothel", slave); - } else if (slave.assignment === "be the Madam") { - cashX(cash, "whoreBrothel", slave); - } else if (slave.assignment === "whore") { - cashX(cash, "whore", slave); + if (slave.assignment === window.Job.WHORE) { + cashX(cash, "slaveAssignmentWhore", slave); + } else if (slave.assignment === window.Job.MADAM) { + cashX(cash, "slaveAssignmentMadam", slave); + } else if (slave.assignment === window.Job.BROTHEL) { + cashX(cash, "slaveAssignmentBrothel", slave); } else { - cashX(cash, "whoring in an unregistered building", slave); + cashX(cash, "whoring income in an unregistered building", slave); } T.incomeStats.income += cash; } @@ -1588,14 +1588,30 @@ window.saWhore = (function saWhore() { } else { r += `an incident without lasting effect.`; } - if (slave.assignment === "work in the brothel") { - cashX(cashVign, "whoreBrothel", slave); - } else if (slave.assignment === "be the Madam") { - cashX(cash, "whoreBrothel", slave); - } else if (slave.assignment === "whore") { - cashX(cashVign, "whore", slave); + if (slave.assignment === window.Job.WHORE) { + if (vignette.effect > 0) { + cashX(cashVign, "slaveAssignmentWhoreVign", slave); + } else if (vignette.effect < 0) { + cashX(forceNeg(cashVign), "slaveAssignmentWhoreVign", slave); + } + } else if (slave.assignment === window.Job.MADAM) { + if (vignette.effect > 0) { + cashX(cashVign, "slaveAssignmentMadamVign", slave); + } else if (vignette.effect < 0) { + cashX(forceNeg(cashVign), "slaveAssignmentMadamVign", slave); + } + } else if (slave.assignment === window.Job.BROTHEL) { + if (vignette.effect > 0) { + cashX(cashVign, "slaveAssignmentBrothelVign", slave); + } else if (vignette.effect < 0) { + cashX(forceNeg(cashVign), "slaveAssignmentBrothelVign", slave); + } } else { - cashX(cashVign, "whoring in an unregistered building", slave); + if (vignette.effect > 0) { + cashX(cashVign, "vignette whoring income in an unregistered building", slave); + } else if (vignette.effect < 0) { + cashX(forceNeg(cashVign), "vignette whoring expense in an unregistered building", slave); + } } T.incomeStats.income += cashVign; } else if (vignette.type === "devotion") { diff --git a/src/endWeek/saWorkAGloryHole.js b/src/endWeek/saWorkAGloryHole.js index b2aef70b900e3caa3fc7726a5559b63037f51abe..e6cb7614f78a82ffae0150d9812e99799d16a5bc 100644 --- a/src/endWeek/saWorkAGloryHole.js +++ b/src/endWeek/saWorkAGloryHole.js @@ -50,7 +50,7 @@ window.saWorkAGloryHole = (function saWorkAGloryHole() { */ function gatherStatistics(slave) { /* Statistics gathering */ - const facility = slave.assignment === Job.ARCADE ? V.facility.arcade : undefined; + const facility = slave.assignment === window.Job.ARCADE ? V.facility.arcade : undefined; T.incomeStats = getSlaveStatisticData(slave, facility); T.incomeStats.customers = beauty; } @@ -148,10 +148,40 @@ window.saWorkAGloryHole = (function saWorkAGloryHole() { if (slave.health.tired > 90) { r += ` exhausted`; } else if (slave.health.tired > 60) { - r += ` tired`; + r += ` fatigued`; } r += `,</span> but no one cared.`; } + if (slave.assignment === "be confined in the arcade") { + if (!slave.fuckdoll) { + r += ` $He spends $his working hours constrained to a box, and $his time outside preparing for $his next shift; <span class="red">an exhausting life for even the healthiest of slaves.</span>`; + if (V.arcadeUpgradeHealth > 0) { + r += ` The curative cocktail pumped into ${him} is laced with `; + if (V.arcadeUpgradeHealth === 2) { + r += `sedatives and painkillers to keep $him in a <span class="green">state of forced rest.</span>`; + } else { + r += `painkillers and mild muscle relaxants; Not enough to ruin a customor's fun, but enough to keep ${him} in a <span class="green">state of pseudo-rest.</span>`; + } + } else { + r += ` If ${he} needs to rest, however, ${he} can always just pass out in ${his} restraints.`; + } + } + tired(slave); + } else if (slave.assignment === "work a glory hole") { + if (!slave.fuckdoll) { + if (slaveResting(slave)) { + r += ` ${He} spends reduced hours serving ${his} glory hole in order to <span class="green">offset ${his} lack of rest.</span>`; + } else if (slave.tired + 20 >= 90 && !willWorkToDeath(slave)) { + r += ` ${He} attempts to refuse work due to ${his} exhaustion, but can do little to stop it or the resulting <span class="trust dec">severe punishment.</span> ${He} <span class="devotion dec">purposefully underperforms,</span> choosing ${his} overall well-being over the consequences, <span class="reputation dec">aggravating customers and damaging the establishment's image.</span>`; + slave.devotion -= 10; + slave.trust -= 5; + repX(forceNeg(50), "disobedience", slave); + } else { + r += ` ${He} spends long hours cooped up in a small box with nothing to rest on. Even if ${he} where to try to lean against its side, it won't be long before another dick pokes through the hole demanding service. By the time ${he} is released, ${he} is <span class="red">utterly exhausted.</span>`; + } + } + tired(slave); + } if (slave.vagina === 0 && canDoVaginal(slave)) { r += ` A `; @@ -280,7 +310,7 @@ window.saWorkAGloryHole = (function saWorkAGloryHole() { */ function applyFSDecoration(slave) { /* FACILITY DECORATION IMPACTS */ - if (slave.assignment === "be confined in the arcade" && V.arcadeDecoration !== "standard") { + if (slave.assignment === window.Job.ARCADE && V.arcadeDecoration !== "standard") { const impact = (0.0001 * V.FSSingleSlaveRep * beauty); switch (V.arcadeDecoration) { case "Roman Revivalist": @@ -480,26 +510,22 @@ window.saWorkAGloryHole = (function saWorkAGloryHole() { * */ function profitReport(slave) { + let cash = 0; if (V.publicFuckdolls === 0) { - if (slave.assignment === "work a glory hole") { - cashX(Math.trunc(beauty * FResult), "gloryhole", slave); - } else if (slave.assignment === "be confined in the arcade") { - cashX(Math.trunc(beauty * FResult), "gloryholeArcade", slave); - } else { - cashX(Math.trunc(beauty * FResult), "working a gloryhole in an unregistered building", slave); - } - T.profits += Math.trunc(beauty * FResult); - T.incomeStats.income += Math.trunc(beauty * FResult); + cash = Math.trunc(beauty * FResult); } else { - if (slave.assignment === "work a glory hole") { - cashX(Math.trunc(beauty * FResult / 5), "gloryhole", slave); - } else if (slave.assignment === "be confined in the arcade") { - cashX(Math.trunc(beauty * FResult / 5), "gloryholeArcade", slave); - } else { - cashX(Math.trunc(beauty * FResult / 5), "working a gloryhole in an unregistered building", slave); - } - T.profits += Math.trunc(beauty * FResult / 5); - T.incomeStats.income += Math.trunc(beauty * FResult / 5); + cash = Math.trunc(beauty * FResult / 5); + } + + if (slave.assignment === window.Job.GLORYHOLE) { + cashX(cash, "slaveAssignmentGloryhole", slave); + } else if (slave.assignment === window.Job.ARCADE) { + cashX(cash, "slaveAssignmentArcade", slave); + } else { + cashX(cash, "income for working a gloryhole in an unregistered building", slave); } + + T.profits += cash; + T.incomeStats.income += cash; } })(); diff --git a/src/endWeek/saWorkTheFarm.js b/src/endWeek/saWorkTheFarm.js index 31eb4fbf8e3cdb2b71286fc67d066477327d83f1..c486f3f079ca88d7e9aaa76836456deebb6daf82 100644 --- a/src/endWeek/saWorkTheFarm.js +++ b/src/endWeek/saWorkTheFarm.js @@ -17,9 +17,9 @@ window.saWorkTheFarm = function(slave) { const foodTotal = (slave, food) => { t += foodFarmer(); t += foodDevotion(slave); - t += foodHealth(slave); t += foodMuscles(slave); t += foodWeight(slave); + t += foodHealth(slave); t += foodSight(slave); t += foodHearing(slave); @@ -77,6 +77,7 @@ window.saWorkTheFarm = function(slave) { } t += `.</span> `; + t += foodTired(slave); return t; } @@ -89,6 +90,23 @@ window.saWorkTheFarm = function(slave) { return ` being tired`; } }; + + const foodTired = slave => { + if (!slave.fuckdoll) { + if (slaveResting(slave)) { + t = ` ${He} spends reduced hours working the soil in order to <span class="green">offset ${his} lack of rest.</span>`; + } else if (slave.tired + 20 >= 90 && !willWorkToDeath(slave)) { + t = ` ${He} attempts to refuse work due to ${his} exhaustion, but can do little to stop it or the resulting <span class="trust dec">severe punishment.</span> ${He} <span class="devotion dec">purposefully underperforms,</span> choosing ${his} overall well-being over the consequences, <span class="red">greatly reducing yields.</span>`; + slave.devotion -= 10; + slave.trust -= 5; + } else { + t = ` Hours of manual labor quickly add up, leaving ${him} <span class="red">physically drained</span> by the end of the day.`; + } + } + tired(slave); + + return t; + }; const foodMuscles = slave => { if (slave.muscles > 50) { @@ -504,15 +522,17 @@ window.saWorkTheFarm = function(slave) { t += `<span class="story-label">This week</span> ${vignette.text}`; if (vignette.type === "cash") { let FResultNumber = FResult(slave); + const cashVign = Math.trunc(FResultNumber * vignette.effect); if (vignette.effect > 0) { - t += ` <span class="yellowgreen">making you an extra ${cashFormat(Math.trunc(FResultNumber * vignette.effect))}.</span> `; + t += ` <span class="yellowgreen">making you an extra ${cashFormat(cashVign)}.</span> `; + cashX(cashVign, "slaveAssignmentFarmyardVign", slave); } else if (vignette.effect < 0) { - t += ` <span class="red">losing you ${cashFormat(Math.abs(Math.trunc(FResultNumber * vignette.effect)))}.</span> `; + t += ` <span class="red">losing you ${cashFormat(Math.abs(cashVign))}.</span> `; + cashX(forceNeg(cashVign), "slaveAssignmentFarmyardVign", slave); } else { t += ` an incident without lasting effect. `; } - cashX(Math.trunc(FResultNumber * vignette.effect), "farmyard"); - incomeStats.income += (Math.trunc(FResultNumber * vignette.effect)); + incomeStats.income += cashVign; } else if (vignette.type === "devotion") { if (vignette.effect > 0) { if (slave.devotion > 50) { diff --git a/src/events/001-base/baseEvent.js b/src/events/001-base/baseEvent.js new file mode 100644 index 0000000000000000000000000000000000000000..27c68177047cce538dc14b9b02a8b4b9605d12c5 --- /dev/null +++ b/src/events/001-base/baseEvent.js @@ -0,0 +1,118 @@ +/** base class for class-based events */ +App.Events.BaseEvent = class BaseEvent { + /** build a new event + * parameters are necessary for serialization (so that saving with the event active will work correctly) and should not normally be used directly + * child classes should forward to this implementation */ + constructor(actors, params) { + /** @member {Array<number>} actors - a list of IDs for the actors participating in this event. */ + this.actors = actors || []; + /** @member {object} params - a set of parameters to pass to the event. */ + this.params = params || {}; + } + + /** generate an array of zero or more predicates which must all be true in order for the event to be valid. + * lambda predicates may add properties to {@link App.Events.BaseEvent#params the params member} in order to pass information on to the event. + * child classes should implement this. + * @returns {Array<Function>} + */ + eventPrerequisites() { + return []; + } + + /** generate an array of zero or more arrays, each corresponding to an actor in the event, which contain zero or more predicates which must be satisfied by the actor. + * child classes should implement this. + * @returns {Array<Array<Function>>} + */ + actorPrerequisites() { + return []; + } + + /** get the choice weight for the event. Weights should be integral; higher weight means higher probability of selection. + * @returns {number} + */ + get weight() { + return 1; + } + + /** run the event and attach DOM output to the event passage. + * child classes must implement this. + * @param {DocumentFragment} node - Document fragment which event output should be attached to + */ + execute(node) { + } + + /** clone the event (needed for serialization). + * default implementation should suffice for child classes */ + clone() { + let c = {}; + Reflect.setPrototypeOf(c, Reflect.getPrototypeOf(this)); + deepAssign(c, this); + return c; + } + + /** serialize the event instance so it persists through saves. + * default implementation should suffice for child classes assigned to App.Events */ + toJSON() { + return JSON.reviveWrapper(`new App.Events.${this.constructor.name}(${JSON.stringify(this.actors)},${JSON.stringify(this.params)})`); + } + + /** get the event's (human-readable) name. must not include ":". + * default implementation should generally suffice (though we might want to de-camelcase here or something). + * @returns {string} + */ + get eventName() { + return this.constructor.name; + } + + /** build the actual list of actors that will be involved in this event. + * default implementation should suffice for child classes with a fixed number of actors; may be overridden for events with variable actor count. + * @param {App.Entity.SlaveState} firstActor - if non-null, the first actor should be this slave (fail if she is not qualified) + * @returns {boolean} - return false if sufficient qualified actors could not be found (cancel the event) + */ + castActors(firstActor) { + const prereqs = this.actorPrerequisites(); + + let i = 0; + if (firstActor && prereqs.length > 0) { + if (prereqs[0].every(p => p(firstActor))) { + this.actors.push(firstActor.ID); + } else { + return false; // preselected first actor was not qualified + } + i = 1; // first actor is cast + } + + for (; i < prereqs.length; ++i) { + const qualified = V.slaves.filter(s => !this.actors.includes(s.ID) && prereqs[i].every(p => p(s))); + if (qualified.empty) { + return false; // a required actor was not found + } + this.actors.push(qualified.pluck().ID); + } + + return true; // all actors cast + } +}; + +/** This is a trivial event for use as an example. */ +App.Events.TestEvent = class TestEvent extends App.Events.BaseEvent { + constructor(actors, params) { + super(actors, params); + } + + eventPrerequisites() { + return []; + } + + actorPrerequisites() { + return [ + [] // one actor, no requirements + ]; + } + + execute(node) { + let [eventSlave] = this.actors.map(a => getSlave(a)); // mapped deconstruction of actors into local slave variables + App.Events.drawEventArt(node, eventSlave); + node.appendChild(document.createTextNode(`This test event for ${eventSlave.slaveName} was successful.`)); + } +}; diff --git a/src/events/RESS/lazyEvening.js b/src/events/RESS/lazyEvening.js new file mode 100644 index 0000000000000000000000000000000000000000..2c9223306d59b0a6680df496b51f890ce5c54589 --- /dev/null +++ b/src/events/RESS/lazyEvening.js @@ -0,0 +1,243 @@ +App.Events.RESSLazyEvening = class RESSLazyEvening extends App.Events.BaseEvent { + constructor(actors, params) { + super(actors, params); + } + + eventPrerequisites() { + return []; + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + hasAnyArms, + hasAnyLegs, + s => s.assignment === "please you", + s => s.devotion > 20, + ] + ]; + } + + execute(node) { + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, His, his, hers, him, himself, girl, woman + } = getPronouns(eventSlave); + Enunciate(eventSlave); + + V.nextLink = "Next Week"; + + function getSceneClothes(slave) { + if (getLimbCount(slave, 102) > 2) { + return "an oversized t-shirt"; + } else if (slave.boobs > 4000) { + return "an oversized t-shirt"; /* loose pajama top */ + } else if (slave.intelligence+slave.intelligenceImplant > 50) { + return "a halter top dress"; + } else if (slave.muscles > 30) { + if (isItemAccessible.entry("sport shorts", "clothing")) { + if (slave.boobs >= 650) { + return "sport shorts and a sports bra"; + } else { + return "sport shorts"; + } + } else { + return "spats and a tank top"; + } + } else if (slave.energy > 95) { + return null; // no change of clothes + } else { + return "conservative clothing"; + } + } + + App.Events.drawEventArt(node, eventSlave, getSceneClothes(eventSlave)); + + let t = []; + t.push(`Although your life as an arcology owner comes with many associated privileges, extended idleness to bask in your luxury is not often among them. Thankfully, ${V.assistant.name} knows better than to let you run yourself ragged from the weight of your assorted responsibilities and often allots time in the evenings of your active schedule to simply relax.`); + App.Events.addParagraph(node, t); + + t = []; + t.push(`Of course, no self respecting arcology owner could be expected to enjoy a lazy night of idle relaxation on their own. As you resolve the last of your most pressing responsibilities for the evening, ${V.assistant.name} directs one of your attentive slaves to gently guide you away from the unending burdens of running your arcology. Leaning against the doorway and wearing a facsimile of what an old world ${woman} might wear on a casual night in,`); + t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave)); + if (!canTalk(eventSlave)) { + t.push(`asks with a gesture that carries just the right mixture of submission and exaggerated casualness if you'd like to 'hang out.'`); + } else if (SlaveStatsChecker.checkForLisp(eventSlave)) { + t.push(`lisps with exaggerated casualness, "Let'${V.sEnunciate} hang out, ${V.titleEnunciate}?"`); + } else { + t.push(`asks with exaggerated casualness, "Want to hang out, ${V.titleEnunciate}?"`); + } + App.Events.addParagraph(node, t); + + t = []; + t.push(`${He} saunters over and`); + if (eventSlave.belly >= 100000) { + t.push(`struggles to lower ${his} ${bellyAdjective(eventSlave)} form to an obedient kneel`); + } else if (eventSlave.belly >= 10000) { + t.push(`gingerly lowers ${his} heavily ${eventSlave.bellyPreg > 3000 ? "gravid" : "swollen"} form to an obedient kneel`); + } else if (eventSlave.belly >= 5000) { + t.push(`gently lowers ${his} ${eventSlave.bellyPreg > 3000 ? "gravid" : "swollen"} form to an obedient kneel`); + } else { + t.push(`kneels obediently`); + } + t.push(`in front of you, awaiting further direction.`); + + /* If you are updating below, please consider updating the vector art swaps at the top to match. */ + if (getLimbCount(eventSlave, 102) > 2) { + t.push(`Clad in an antique T-Shirt referencing some defunct old world website, ${his} P-Limbs stand in stark contrast — gyros and servomotors against simple thread and cloth. With such tangible examples of the technological prowess of the Free Cities serving as ${his} limbs, ${his} ${eventSlave.belly >= 5000 ? "taut " : ""} shirt is an amusing testimonial to how far behind the old world stands in contrast to the new.`); + } else if (eventSlave.boobs > 4000) { + t.push(`${His} breasts are so massive that the front of ${his} loose pajama top must be unbuttoned. Even so, the protrusion of ${his} immense breasts${eventSlave.belly >= 5000 ? ` and ${bellyAdjective(eventSlave)} rounded belly` : ""} from ${his} chest strains the soft pajama top to it's breaking point.`); + } else if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) { + t.push(`As a clever ${girl}, ${his} simple${eventSlave.belly >= 5000 ? `, yet tight around the middle,` : ""} summer dress evokes memories of bygone warm weather days at elite old world colleges — and the sexual conquest of their youthful residents.`); + } else if (eventSlave.muscles > 30) { + t.push(`${His} simple sports bra and compression shorts ensemble does little to conceal ${his} incredible musculature,`); + if (eventSlave.belly >= 1500) { + t.push(`straining to hold up against ${his} swelling middle and`); + } + t.push(`glistening with sweat from a recent workout. Despite ${his} recent exertions, ${he}'s able to maintain utter stillness in the perfect posture of an obedient slave.`); + } else if (eventSlave.energy > 95) { + t.push(`${He}'s controlling ${his} absurd sex drive for the moment in deference to the notion of your relaxation time, but ${he} clearly wouldn't mind some sex as part of the evening.`); + if (eventSlave.dick > 0) { + if (canAchieveErection(eventSlave)) { + t.push(`${His} cock is painfully erect`); + if (eventSlave.belly >= 10000) { + t.push(`and pressed against the underside of ${his} belly,`); + } + } else { + t.push(`${His} soft dick is dribbling precum,`); + } + } else { + t.push(`${His} pussy is visibly soaked,`); + } + t.push(`showing unmistakably how badly ${he} needs release.`); + } else { + t.push(`${He} keeps ${his}`); + if (canSee(eventSlave)) { + t.push(App.Desc.eyesColor(eventSlave)); + } else { + t.push("face"); + } + t.push(`slightly downcast, ${his} hands lightly smoothing the folds from ${his} tight skirt while ${his} breasts visibly rise and fall under ${his} even tighter blouse.`); + if (eventSlave.belly >= 5000) { + t.push(`Between the two, there is little ${he} can do to cover ${his} exposed ${eventSlave.bellyPreg >= 3000 ? "pregnancy" : "middle"}.`); + } + t.push(`${He}'s the perfect picture of an attentive little old world ${girl}friend ${eventSlave.height > 185 ? ` (though, of course, ${he}'s anything but physically small)` : ""}.`); + } + App.Events.addParagraph(node, t); + + App.Events.addResponses(node, [ + new App.Events.Result("Enjoy some oral with an evening of wallscreen television", flixAndChill), + new App.Events.Result("Spend the night idly cuddling", cuddle), + new App.Events.Result(`Unwind by tormenting ${him}`, torture) + ]); + + function flixAndChill() { + let t = []; + t.push(`There are some things that never change, even after ascension to the high position of an arcology owner. One of these fixtures of life is the ability to enjoy a relaxing evening of wallscreen television and`); + if (V.PC.dick !== 0) { + t.push("a blowjob"); + if (V.PC.vagina !== -1) { + t.push("and"); + } + } + if (V.PC.vagina !== -1) { + t.push("some cunnilingus"); + } + t.push(t.pop() + "."); + t.push(`With ${eventSlave.slaveName} sequestered between your legs, you tune into your favorite Free Cities serial drama and widen your legs slightly as you sink back into the chair with a sigh of contentment. ${He}`); + if (eventSlave.belly >= 300000) { + t.push(`gently leans onto ${his} ${bellyAdjective(eventSlave)} belly`); + if (hasAnyArms(eventSlave)) { + t.push(`with ${his} arm${hasBothArms(eventSlave) ? "s" : ""} steadying the mass`); + } + } else if (eventSlave.belly >= 5000) { + if (hasAnyLegs(eventSlave)) { + t.push(`kneels carefully`); + } else { + t.push(`lowers ${himself}`); + } + if (hasAnyArms(eventSlave)) { + t.push(`with ${hasBothArms(eventSlave) ? `an` : `${his}`} arm`); + if (eventSlave.bellyPreg >= 3000) { + t.push(`wrapped protectively around ${his} bump`); + } else { + t.push(`cradling ${his} ${bellyAdjective(eventSlave)} belly`); + } + } + } else { + t.push(`sinks to`); + if (hasAnyLegs(eventSlave)) { + t.push(`${his} knee${hasBothLegs(eventSlave) ? "s" : ""} obediently`); + if (hasAnyArms(eventSlave)) { + t.push(`with ${his} hand${hasBothArms(eventSlave) ? "s" : ""} placed placidly on ${his} thigh${hasBothLegs(eventSlave) ? "s" : ""}`); + } + } else { + t.push("the ground"); + } + } + t.push(`before putting ${his} mouth to work,`); + if (eventSlave.skill.oral >= 100) { + t.push(`${his} mastery at giving oral providing a wealth of pleasure.`); + } else if (eventSlave.skill.oral > 60) { + t.push(`${his} skills in oral providing ample pleasure.`); + } else { + t.push(`${his} mediocre oral skills providing some relief.`); + } + if (eventSlave.teeth === "pointy") { + t.push(`Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you still feel the extreme care ${he} has to take to keep ${his} shark-like teeth clear of you.`); + } else if (eventSlave.lips > 40) { + t.push(`${His} huge lips are soft and pillowy against you.`); + } else if (eventSlave.teeth === "gapped") { + t.push(`Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you can feel the slight hesitations as ${he} takes care to not pinch you between ${his} front teeth.`); + } else if ((eventSlave.teeth === "straightening braces") || (eventSlave.teeth === "cosmetic braces")) { + t.push(`Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you can feel the slight hesitations as ${he} takes care to keep ${his} braces off you.`); + } + t.push(`You have an enjoyable evening glued to your wallscreen, punctuated by the playful ruffling ${eventSlave.hLength > 1 ? `of ${eventSlave.slaveName}'s ${eventSlave.hColor} hair` : `across ${eventSlave.slaveName}'s scalp`} and the occasional orgasm into ${his} waiting mouth.`); + if (eventSlave.sexualFlaw !== "hates oral") { + t.push(`Though your experience was more stimulating than ${hers}, ${eventSlave.slaveName} <span class="devotion inc">enjoyed being used while you enjoyed yourself.</span>`); + eventSlave.devotion += 4; + } else { + t.push(`Although you enjoyed ${his} ministrations, ${eventSlave.slaveName} had a bad time because of ${his} <span class="devotion dec">hate of oral.</span>`); + eventSlave.devotion -= 2; + } + seX(eventSlave, "oral", V.PC, "penetrative"); + return t; + } + + function cuddle() { + let t = []; + t.push(`Though your evening could hardly be called eventful, there is something eminently comforting about having a warm`); + if (eventSlave.physicalAge > 30) { + t.push(woman); + } else if (eventSlave.physicalAge > 18) { + t.push("young lady"); + } else if (eventSlave.physicalAge > 12) { + t.push("teen"); + } else { + t.push(`little ${girl}`); + } + t.push(`cuddled up beside you to idly while away the hours`); + if (eventSlave.bellyPreg >= 1500 && eventSlave.pregSource === -1){ + t.push(t.pop() + ","); + t.push(`especially when ${he} is ${eventSlave.belly >= 300000 ? `so massively swollen with your children` : `heavy with your child${eventSlave.pregType > 1 ? "ren" : ""}`}`); + } + t.push(t.pop() + "."); + t.push(`${He} <span class="trust inc">trusts you more</span> for these few intimate hours amidst ${his} life of sexual servitude.`); + eventSlave.trust += 4; + return t; + } + + function torture() { + let t = []; + t.push(`Though there is no shortage of torments you inflict during the course of your day to day life as an arcology owner, there is something refreshing about torturing a slave out of idle boredom rather than corrective disciple or sexual domination. Your night is filled with ${eventSlave.voice === 0 ? "the horrible rasping that a mute throat substitutes for cries of agony" : "echoing shrieks of anguish"}, though every vocal outburst is idly punished with electro shock or strike of the whip. Come the morning, ${eventSlave.slaveName}`); + if (eventSlave.fetish === "masochist") { + t.push(`is mortified by the intensity of ${his} orgasms that night,<span class="devotion inc"> and more convinced than ever that ${he}'s a pain slut,</span> and yet`); + eventSlave.devotion += 4; + } + t.push(`<span class="trust dec">scuttles away to tend to the bruises and marks that litter ${his} battered body.</span>`); + eventSlave.trust -= 5; + return t; + } + } +}; diff --git a/src/events/RESS/muscles.js b/src/events/RESS/muscles.js new file mode 100644 index 0000000000000000000000000000000000000000..06dff12a6a2577635a02a166cc9c30a4038786b2 --- /dev/null +++ b/src/events/RESS/muscles.js @@ -0,0 +1,193 @@ +App.Events.RESSMuscles = class RESSMuscles extends App.Events.BaseEvent { + constructor(actors, params) { + super(actors, params); + } + + eventPrerequisites() { + return []; + } + + actorPrerequisites() { + return [ + [ // single event slave + s => s.fetish !== "mindbroken", + hasAnyArms, + hasAnyLegs, + s => s.muscles > 30, + s => s.weight <= 10 + ] + ]; + } + + execute(node) { + let [eventSlave] = this.actors.map(a => getSlave(a)); + const { + He, he, His, his, hers, him, himself, girl + } = getPronouns(eventSlave); + + V.nextLink = "Next Week"; + + App.Events.drawEventArt(node, eventSlave, "no clothing"); + + let t = []; + t.push(`Early one morning,`); + t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave)); + if (!canWalk(eventSlave)) { + t.push(`crawls`); + } else if ((eventSlave.shoes === "heels") || (eventSlave.shoes === "pumps") || (eventSlave.shoes === "boots") || (eventSlave.shoes === "extreme heels")) { + t.push(`totters`); + } else if (eventSlave.belly >= 10000) { + t.push(`waddles`); + } else { + t.push(`walks`); + } + t.push(`past your door stark naked, with a towel thrown over ${his} shoulder. ${He}'s clearly moving from the gym to the showers after a hard workout; ${he}'s quite the iron pumper and gets up before anyone to protect ${his} gains. ${He} notices your gaze, so ${he} subtly flexes for your benefit. Cords of muscle ripple along ${his} massive thighs,`); + if (eventSlave.bellyPreg >= 15000) { + // no abs + } else if (eventSlave.bellyPreg >= 10000) { + t.push(`pregnancy ruined abs,`); + } else if (eventSlave.belly >= 10000) { + t.push(`hints of what were once abs across ${his} ${bellyAdjective(eventSlave)} taut middle,`); + } else if (eventSlave.belly >= 1500) { + t.push(`broadening abs,`); + } else { + t.push(`washboard abs,`); + } + t.push(`ripped biceps, and strapping lats.`); + if (eventSlave.dick > 2) { + t.push(`${His} massive cock completes the picture.`); + } + App.Events.addParagraph(node, t); + + App.Events.addResponses(node, [ + new App.Events.Result(`Reward ${him} for ${his} gains`, reward, fuckNote()), + new App.Events.Result(`Take advantage of ${his} gains with a powerfuck`, powerfuck, fuckNote()), + ((eventSlave.toyHole === "dick" || V.sexualOpeness === 1) && canPenetrate(eventSlave) && eventSlave.belly < 100000) + ? new App.Events.Result(`See if ${he} can put those gains to good use`, penetration, "This option will penetrate you") + : new App.Events.Result(), + new App.Events.Result(`Compliment ${his} gains and send ${him} on ${his} way`, compliment), + ]); + + function fuckNote() { + if (V.PC.dick > 0) { + if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) { + return `This option will take ${his} virginity`; + } else if (!canDoVaginal(eventSlave) && canDoAnal(eventSlave) && (eventSlave.anus === 0)) { + return `This option will take ${his} anal virginity`; + } + } + return null; + } + + function reward() { + let t = []; + t.push(`You tell ${him} to spread ${his} towel on the floor and lie`); + if (eventSlave.belly >= 5000) { + t.push(`on ${his} side on it. You lie next to ${him} and`); + } else { + t.push(`face-down on it. You`); + } + t.push(`run your hands across ${his} sweaty ${V.seeRace === 1 ? eventSlave.race : ""} muscles before giving ${him} a thorough, skillful and very intense massage. ${He} moans and grunts as you work the lactic acid out of ${his} muscles, slowly reducing ${him} to a puddle of ripped sex slave. As you're rubbing ${him} down to finish the massage, ${he} meekly begs you to fuck ${him}.`); + if (!canDoVaginal(eventSlave) && !canDoAnal(eventSlave)) { + t.push(`You tell ${him} that's not an option and pull ${him} into a kiss instead. It's a strange sensation, this mass of muscle lying quietly still in your arms you, whimpering with delight as you gently make out with ${him}. Your wandering hands eventually tip ${him} over the edge; ${he} hugs you tight as ${he} shakes with orgasm. Once ${he} stops crushing you, you return to enjoying ${his} sweaty body.`); + } else { + t.push(`As ${he} lies still,`); + if (V.PC.dick === 0) { + t.push(`you lift one of ${his} legs and straddle yourself in to bring your groin against ${hers}. It's a strange sensation, this mass of muscle lying quietly still beneath you, whimpering with delight as you gently scissor yourself against ${him}. ${He} comes in no time at all. When ${he} does ${he} squeezes you between vicelike thighs, ${V.PC.vagina !== -1 ? "pressing your pussy deliciously and" : ""} bringing you to climax, too.`); + } else { + t.push(`you slowly push your cock into ${his}`); + if (canDoVaginal(eventSlave)) { + t.push(`pussy; ${he}'s so relaxed from the massage that it slides in easily.`); + VCheck.Vaginal(1, eventSlave); + t.push(`It's a strange sensation, this mass of muscle lying quietly still beneath you, whimpering with delight as you gently penetrate ${him}. ${He} comes in no time at all. When ${he} does you happen to be halfway inside ${him}; ${he} wraps ${his} legs around you and pulls you into ${his} depths. You explode into ${him} as ${he} holds you in place with ${his} vicelike thighs.`); + } else { + t.push(`ass; ${he}'s so relaxed from the massage that it slides in easily.`); + VCheck.Anal(1, eventSlave); + t.push(`It's a strange sensation, this mass of muscle lying quietly still beneath you, whimpering with delight as you gently take ${his} ass. ${He} comes in no time at all. When ${he} does you happen to be halfway inside ${him}; ${his} sphincter mercilessly squeezes your head while ${his} muscular buttocks clench your shaft between them. You explode into ${him}.`); + } + } + if (eventSlave.dick > 0) { + t.push(`As ${he} stands, ${his} now-softening penis drips cum.`); + } + } + t.push(`<span class="devotion inc">${His} love for you has increased.</span>`); + eventSlave.devotion += 4; + return t; + } + + function powerfuck() { + let t = []; + t.push(`It's time to see if ${he}'s got anything left in those sore ${V.seeRace === 1 ? eventSlave.race : ""} muscles. You push the towel off ${his} shoulder, take a lick of the delicious salty sweat along ${his} collarbone, and get to work. For the next hour, you put ${him} through a series of sexual positions that require ${him} to balance and support ${himself} in difficult positions. ${He} hangs from the ceiling, goes up on one tiptoe, and fucks in a handstand. ${He}'s as muscular inside as ${he} is outside.`); + if (V.PC.dick === 0) { + t.push(`You climax repeatedly, mixing your pussy juice with ${his} sweat all across ${his} body.`); + } else { + if (canDoVaginal(eventSlave)) { + VCheck.Vaginal(1, eventSlave); + t.push(`You come repeatedly, and before long cum is dripping out of ${his} pussy as you continue.`); + } else if (canDoAnal(eventSlave)) { + VCheck.Anal(1, eventSlave); + t.push(`You come repeatedly, and before long cum is dripping out of ${his} ass as you continue.`); + } else { + t.push(`You come repeatedly, leaving ropes of your cum all across ${his} sweaty body.`); + } + } + if (eventSlave.dick > 0) { + t.push(`From position to position, ${his} erection adds its own fluids to the mess on the floor.`); + } + t.push(`By the end, ${he}'s shaking from muscle fatigue and panting ${his} gratitude. <span class="trust inc">${His} confidence in ${his} place has increased.</span>`); + eventSlave.trust += 4; + return t; + } + + function penetration() { + let t = []; + t.push(`It's time to see if ${he}'s got anything left in those sore ${V.seeRace === 1 ? eventSlave.race : ""} muscles. You order ${him} to take you in a standing fuck${V.PC.belly >= 10000 ? ", a tall order given how pregnant you are" : ""}. Despite how exhausted ${he} is, ${he} manages to lift you and hilt ${himself} in your`); + if (V.PC.vagina !== -1) { + t.push("pussy."); + } else { + t.push("ass."); + } + t.push(`You feel ${his} quivering trying to hold you up, so you permit ${him} to take you against the wall; a welcome respite for the`); + if (eventSlave.belly >= 5000) { + if (eventSlave.bellyPreg >= 3000) { + if (eventSlave.belly >= 100000) { + t.push("massively"); + } else if (eventSlave.belly >= 10000) { + t.push("hugely"); + } + t.push("pregnant"); + } else if (eventSlave.bellyFluid >= 5000) { + t.push(`${eventSlave.inflationType} filled`); + } else { + t.push(`${bellyAdjective(eventSlave)} bellied`); + } + } + t.push("sweaty"); + if (eventSlave.physicalAge > 30) { + t.push(`MILF.`); + } else if (eventSlave.physicalAge > 17) { + t.push(`slave${girl}.`); + } else if (eventSlave.physicalAge > 12) { + t.push(`teenager.`); + } else { + t.push(`kid.`); + } + t.push(`${He} dominantly fucks you, ${his} muscles flexing powerfully with every thrust. You're no slouch when it comes to muscles yourself, so when you feel ${him} tense with orgasm you wrap your legs around ${him} and hilt ${him} deep inside you. This only encourages ${him} to fuck you harder, quickly bring you to climax as well. ${He} gently carries you to your couch, where ${he} slides in behind you for a little post-coitus spooning. You definitely appreciate ${his} gains after such a good fuck. <span class="trust inc">${His} confidence in ${his} place has increased,</span> as has ${his} <span class="devotion inc">love for you.</span>`); + eventSlave.trust += 4; + eventSlave.devotion += 4; + if (V.PC.vagina === -1) { + seX(eventSlave, "penetrative", V.PC, "anal"); + } else { + seX(eventSlave, "penetrative", V.PC, "vaginal"); + } + if (canImpreg(V.PC, eventSlave)) { + knockMeUp(V.PC, 50, 0, eventSlave.ID); + } + return t; + } + + function compliment() { + return [`${He} finishes posing with an impressive display of ${his} obliques. ${He} walks powerfully to the shower, ${his} ripped buttocks delineating each step. The shower is glass-walled. As ${he} washes, several of your other slaves are waking up and starting their days. They can't help but stare as ${eventSlave.slaveName} soaps ${himself}. ${eventSlave.slaveName} enjoys the attention.`]; + } + } +}; diff --git a/src/events/eventUtils.js b/src/events/eventUtils.js new file mode 100644 index 0000000000000000000000000000000000000000..9d3b23f75dc0fc0742faeecd824850d03febb0ef --- /dev/null +++ b/src/events/eventUtils.js @@ -0,0 +1,151 @@ +/** draw event art, with the option to dress the slave in a particular way + * @param {HTMLElement} node - DOM node to attach art to + * @param {App.Entity.SlaveState|Array<App.Entity.SlaveState>} slaves - one or several slaves to draw art for + * @param {[string]} clothesMode - if the slaves' clothing should be overridden, what should they be wearing? + */ +App.Events.drawEventArt = function(node, slaves, clothesMode) { + // do nothing if the player doesn't want images + if (!V.seeImages) { + return; + } + + // ensure that slaves is an array + if (!Array.isArray(slaves)) { + slaves = [slaves]; + } + + // if we were asked to change the slave's clothing, do it now + let originalClothes = []; + if (clothesMode) { + // if there are "themes" of clothes that multiple events want to use ("swimwear", "athletic", "casual", etc), they can be added as special cases here instead of duplicating the logic in every event + if (App.Data.misc.niceClothes.map(c => c.value).concat(App.Data.misc.harshClothes.map(c => c.value)).includes(clothesMode)) { + // specific clothes have been selected + originalClothes = slaves.map((s) => { return {ID: s.ID, clothes: s.clothes}; }); + slaves.forEach(s => s.clothes = clothesMode); + } else { + throw "Unrecognized clothes mode for event art"; + } + } + + // actually draw the art - large if single slave, medium column if multiple slaves + let artSpan = document.createElement("span"); + artSpan.id = "artFrame"; + if (slaves.length === 1) { + let refDiv = document.createElement("div"); + refDiv.classList.add("imageRef", V.imageChoice === 1 ? "lrgVector" : "lrgRender"); + let maskDiv = document.createElement("div"); + maskDiv.classList.add("mask"); + maskDiv.appendChild(document.createTextNode("\u00a0")); + refDiv.appendChild(maskDiv); + refDiv.appendChild(App.Art.SlaveArtElement(slaves[0], 2, 0)); + artSpan.appendChild(refDiv); + } else { + let colDiv = document.createElement("div"); + colDiv.classList.add("imageColumn"); + for (const slave of slaves) { + let refDiv = document.createElement("div"); + refDiv.classList.add("imageRef", "medImg"); + refDiv.appendChild(App.Art.SlaveArtElement(slave, 2, 0)); + colDiv.appendChild(refDiv); + } + artSpan.appendChild(colDiv); + } + node.appendChild(artSpan); + + // change clothing back, if necessary + if (originalClothes.length > 0) { + originalClothes.forEach((c) => slaves.find(s => s.ID === c.ID).clothes = c.clothes); + } +}; + +/** intelligently adds spaces to an array of mixed strings and DOM nodes, merging consecutive strings in the process + * @param {Array<string|HTMLElement>} sentences + * @returns {Array<string|HTMLElement>} + */ +App.Events.spaceSentences = function(sentences) { + if (sentences.length <= 1) { + return sentences; + } + return sentences.reduce((res, cur) => { + if (res.length === 0) { + res.push(cur); + } else if (typeof (res[res.length-1]) === "string") { + if (typeof (cur) === "string") { + res[res.length-1] += " " + cur; + } else { + res[res.length-1] += " "; + res.push(cur); + } + } else { + if (typeof (cur) === "string") { + res.push(" " + cur); + } else { + res.push(" "); + res.push(cur); + } + } + return res; + }, []); +}; + +/** assemble a DOM paragraph from an array of DOM nodes, sentences or sentence fragments (which may contain HTML) + * @param {HTMLElement} node + * @param {Array<string|HTMLElement>} sentences + */ +App.Events.addParagraph = function(node, sentences) { + let para = document.createElement("p"); + $(para).append(App.Events.spaceSentences(sentences)); + node.appendChild(para); +}; + +/** a response to an event, and its result */ +App.Events.Result = class { + /** @param {[string]} text - the link text for the response + * @param {[Function]} handler - the function to call to generate the result when the link is clicked + * @param {[string]} note - a note to provide alongside the link (for example, a cost or virginity loss warning) + * To mark an option as disabled, construct the result with only the note. + */ + constructor(text, handler, note) { + this.text = text; + this.handler = handler; + this.note = note; + } + + handle() { + let frag = document.createDocumentFragment(); + $(frag).append(App.Events.spaceSentences(this.handler())); + App.UI.DOM.replace("#result", frag); + } + + /** build the response DOM (for use by addResponses) + * @param {HTMLElement} node + * @returns {boolean} - true if something was written, false if not + */ + makeResponse(node) { + let wrote = false; + if (this.text && this.handler) { + node.appendChild(App.UI.DOM.link(this.text, () => this.handle())); + wrote = true; + } + if (this.note) { + node.appendChild(App.UI.DOM.makeElement("span", this.note, "detail")); + wrote = true; + } + return wrote; + } +}; + +/** add a list of results for an event + * @param {HTMLElement} node + * @param {Array<App.Events.Result>} results + */ +App.Events.addResponses = function(node, results) { + let resultSpan = document.createElement("span"); + resultSpan.id = "result"; + for (const result of results) { + if (result.makeResponse(resultSpan)) { + resultSpan.appendChild(document.createElement("br")); + } + } + node.appendChild(resultSpan); +}; diff --git a/src/events/intro/arcologySelection.js b/src/events/intro/arcologySelection.js index ee804bb61e31ba5dfd7e59b20d57b528ccf74eb4..2c83f0ce969e64c070a5d7adb660607c082899e6 100644 --- a/src/events/intro/arcologySelection.js +++ b/src/events/intro/arcologySelection.js @@ -195,8 +195,8 @@ App.Intro.generateEstablishedArcologies = function() { arcology.language = getLanguage(); const env = {terrain: arcology.terrain, established: true, fs: arcology.fs}; - const preset = App.Arcology.randomPreset(env); - arcology.building = preset.construct(env); + const preset = App.Arcology.randomPreset(env).construct(env); + arcology.building = preset.building; arcology.apply = preset.apply; return arcology; @@ -287,7 +287,7 @@ App.Intro.generateEstablishedArcologies = function() { if (V.pedo_mode === 1 || V.minimumSlaveAge < 6) { return setup.ArcologyNamesYouthPreferentialistLow.random(); } else if (V.minimumSlaveAge < 14) { - return either(setup.ArcologyNamesYouthPreferentialist, setup.ArcologyNamesYouthPreferentialistLow).random(); + return setup.ArcologyNamesYouthPreferentialist.concat(setup.ArcologyNamesYouthPreferentialistLow).random(); } else { return setup.ArcologyNamesYouthPreferentialist.random(); } diff --git a/src/events/intro/initNationalities.tw b/src/events/intro/initNationalities.tw index ef78724ae0f087a493d7d801ed54d1d0722228a9..055f786043cdaa94a3a3fd4e2702bf231beaded7 100644 --- a/src/events/intro/initNationalities.tw +++ b/src/events/intro/initNationalities.tw @@ -12,7 +12,7 @@ <<if $secExpEnabled > 0>> /* base vars */ <<set $SecExp = SecExpBase()>> - <<= App.SecExp.Check.general()>> + <<run App.SecExp.Check.general()>> <<set $secExp = SecExpBase()>> <<set $secUpgrades = { nanoCams: 0, diff --git a/src/events/intro/introSummary.tw b/src/events/intro/introSummary.tw index f6b0ade2fd351ec6ad5a26e0c86e383b30fb5811..280283e9c55ced6c33fc45dae318105fd70811e9 100644 --- a/src/events/intro/introSummary.tw +++ b/src/events/intro/introSummary.tw @@ -1169,7 +1169,7 @@ All the things you need to run your arcology are getting more expensive ''Vector art revamp''. <br><span class="red">Git compiled only, no exceptions.</span> <<comment>> - "Vector — embedded" is the most up to date and supports the most content. Ironically, revamp has not been touched in a long time. + "Vector — embedded" is the most up to date and supports the most content. Ironically, revamp has not been touched in a long time. <</options>> <<if $imageChoice == 1>> <div style="position:relative;width:200px;height:200px;margin:0 auto;"> diff --git a/src/events/intro/locationIntro.tw b/src/events/intro/locationIntro.tw index 87b8fe0f3d5d22a5aaff07732239016ed166c8d5..50d999c09697de4ce4d9da011c47d35232f9f208 100644 --- a/src/events/intro/locationIntro.tw +++ b/src/events/intro/locationIntro.tw @@ -1,7 +1,7 @@ :: Location Intro [nobr] <p> - As the old countries crumble and technology stagnates, the gap between rich and poor increases. In order to continue living a good life without having their property taken by the mob, many of the wealthy and powerful come together to form 'Free Cities.' These are new cities on undeveloped land, in remote areas, or even afloat, fully free of any allegiance or law. These new cities are built on new ideas, with most buildings designed as futuristic, self-contained 'arcologies.' An arcology and everything in it is usually owned by a single person. And you're determined that you will soon be one of those single people. + As the old countries crumble and technology stagnates, the gap between rich and poor increases. In order to continue living a good life without having their property taken by the mob, many of the wealthy and powerful come together to form 'Free Cities.' These are new cities on undeveloped land, in remote areas, or even afloat, fully free of any allegiance or law. These new cities are built on new ideas, with most buildings designed as futuristic, self-contained 'arcologies.' An arcology and everything in it is usually owned by a single person. And you're determined that you will soon be one of those single people. <span class="intro question">In what part of the world is your new arcology going to be located?</span> </p> diff --git a/src/events/jsRandomEvent.tw b/src/events/jsRandomEvent.tw new file mode 100644 index 0000000000000000000000000000000000000000..727de9081521a8aef6911e5c7bab34d519a112e5 --- /dev/null +++ b/src/events/jsRandomEvent.tw @@ -0,0 +1,5 @@ +:: JS Random Event [nobr] + +<<set $nextButton = "Continue">> + +<<run html5passage(n => $event.execute(n))>> diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js new file mode 100644 index 0000000000000000000000000000000000000000..dc12e6eac0b207c47102397d98dd05d700ff5a16 --- /dev/null +++ b/src/events/randomEvent.js @@ -0,0 +1,59 @@ +/* Note that we use a much more strict delineation between individual and nonindividual events here than in the old event system. + * Individual events always trigger for the chosen event slave, and the first actor is always the event slave. + * Nonindividual events are not provided any event slave and should cast one themselves. + */ + +/** get a list of possible individual event based on a given available main actor + * @param {App.Entity.SlaveState} slave + * @returns {Array<App.Events.BaseEvent>} + */ +App.Events.getIndividualEvents = function(slave) { + return [ + // instantiate all possible random individual events here + // example: new App.Events.TestEvent(), + new App.Events.RESSLazyEvening(), + new App.Events.RESSMuscles(), + ] + .filter(e => (e.eventPrerequisites().every(p => p()) && e.castActors(slave))) + .reduce((res, cur) => res.concat(Array(cur.weight).fill(cur)), []); +}; + +/** get a list of possible nonindividual events + * @returns {Array<App.Events.BaseEvent>} + */ +App.Events.getNonindividualEvents = function() { + return [ + // instantiate all possible random nonindividual events here + // example: new App.Events.TestEvent(), + new App.Events.REDevotees(), + ] + .filter(e => (e.eventPrerequisites().every(p => p()) && e.castActors(null))) + .reduce((res, cur) => res.concat(Array(cur.weight).fill(cur)), []); +}; + +/* --- below here is a bunch of workaround crap because we have to somehow persist event selection through multiple twine passages. --- + * eventually all this should go away, and we should use just one simple passage for both selection and execution, so everything can be kept in object form instead of being continually serialized and deserialized. + * we need to be able to serialize/deserialize the active event anyway so that saves work right, so this mechanism just piggybacks on that capability so the event passages don't need to be reworked all at once + */ + +/** get a stringified list of possible individual events as fake passage names - TODO: kill me */ +App.Events.getIndividualEventsPassageList = function(slave) { + const events = App.Events.getIndividualEvents(slave); + return events.map(e => `JSRE ${e.eventName}:${JSON.stringify(e.toJSON())}`); +}; + +/** get a stringified list of possible individual events as fake passage names - TODO: kill me */ +App.Events.getNonindividualEventsPassageList = function() { + const events = App.Events.getNonindividualEvents(); + return events.map(e => `JSRE ${e.eventName}:${JSON.stringify(e.toJSON())}`); +}; + +/** execute a fake event passage from the embedded JSON - TODO: kill me */ +App.Events.setGlobalEventForPassageTransition = function(psg) { + V.event = JSON.parse(psg.slice(psg.indexOf(":") + 1)); +}; + +/** strip the embedded JSON from the fake event passage so it can be read by a human being - TODO: kill me */ +App.Events.printEventPassage = function(psg) { + return psg.slice(0, psg.indexOf(":")); +}; diff --git a/src/events/reDevotees.js b/src/events/reDevotees.js new file mode 100644 index 0000000000000000000000000000000000000000..588cf91541880648899f85b0d118404ffac29573 --- /dev/null +++ b/src/events/reDevotees.js @@ -0,0 +1,69 @@ +App.Events.REDevotees = class REDevotees extends App.Events.BaseEvent { + constructor(actors, params) { + super(actors, params); + } + + eventPrerequisites() { + return []; // always valid if sufficient actors can be cast successfully + } + + actorPrerequisites() { + const devoteeRequirements = [ + s => s.devotion > 50, + canWalk, + isSlaveAvailable + ]; + return [ // total of four actors, identical requirements for each + devoteeRequirements, + devoteeRequirements, + devoteeRequirements, + devoteeRequirements + ]; + } + + execute(node) { + let devotees = this.actors.map(a => getSlave(a)); // for this event, they're fine as an array + + V.nextLink = "RIE Eligibility Check"; + + App.Events.drawEventArt(node, devotees); + + const slaveList = devotees.map(s => s.slaveName).reduce((res, ch, i, arr) => res + (i === arr.length - 1 ? ' and ' : ', ') + ch); + + let t = []; + t.push(`You have a mature, well-trained household of slaves. ${slaveList} are all devoted to you. There are all manner of ways you could display this coterie of loyal sex slaves to show off your wealth and power.`); + App.Events.addParagraph(node, t); + + App.Events.addResponses(node, [ + new App.Events.Result("See an operetta with four attendants", opera), + new App.Events.Result("Visit a casino in good company", casino), + ]); + + function opera() { + PCTitle(); + let t = []; + t.push(`You reserve a box at an upcoming operetta; classical Italian music is enjoying a renaissance these days. The doormen at the fashionable opera house promptly widen the velvet ropes so that you and your party may proceed unimpeded. Their quick thinking is necessary, since there are five of you walking sedately up the steps: you in the middle, impeccable in`); + if (V.PC.title === 1) { + t.push(`gentleman's evening wear, complete with gloves and cane;`); + } else { + t.push(`a fine and noble lady's tuxedo;`); + } + t.push(`and ${slaveList}, all dressed in the gorgeous fashion of the seventeenth century, all plunging necklines, piled hair, and ruffled petticoats. The splendid master of ceremonies clears his throat and announces in a sonorous voice, "${V.PCTitle}." The ostentation <span class="reputation inc">turns every head and catches every eye.</span>`); + for (const s of devotees) { + repX(600, "event", s); + } + return t; + } + + function casino() { + let t = []; + t.push(`The croupiers, bouncers and regulars down at the nearest casino hardly know what to think when you appear with a chit full of cash and twice as many partners as you have arms. You live the night big, starting at the poker table with so many tits and asses on display behind you that, <span class="cash inc">baby, you make a killing.</span> ${slaveList} quickly catch the rhythm of the place: slaves can get away with a little more in the smoky, whiskey soaked, money tinted atmosphere, and they <span class="devotion inc">enjoy themselves immensely.</span> They flirt, flash, giggle, kiss each other, and generally destroy the concentration of everyone within twenty ${V.showInches === 2 ? "yards" : "meters"} — except you. Ring-a-ding-ding.`); + const _cashX = random(30, 100)*3; + for (const s of devotees) { + cashX(_cashX, "event", s); + s.devotion += 4; + } + return t; + } + } +}; diff --git a/src/events/reSnatchAndGrabFollowup.tw b/src/events/reSnatchAndGrabFollowup.tw index 91ef361a54df3d32408896f7c736df4b164c3a65..1291d4e388b58edf1dc18264da5bfb2916444aa7 100644 --- a/src/events/reSnatchAndGrabFollowup.tw +++ b/src/events/reSnatchAndGrabFollowup.tw @@ -34,7 +34,7 @@ <</if>> </p> -<p>After spending some time prowling around $his genome in your genetic sequencer, you find one particularly interesting sequence. $He has a unique sequence of genes in a chromosomal region which significantly increases $his cognitive ability, but it's only partially activated. You could, with a little bit of time, either completely activate it, or deactivate it entirely, with corresponding dramatic effects on $his intelligence. However, such therapy is not free, and the remote surgery software warns that rapid changes to cognition may cause significant changes in behavior.</p> +<p>After spending some time prowling around $his genome in your genetic sequencer, you find one particularly interesting sequence. $He has a unique sequence of genes in a chromosomal region which significantly increases $his cognitive ability, but it's only partially activated. You could, with a little bit of time, either completely activate it, or deactivate it entirely, with corresponding dramatic effects on $his intelligence. However, such therapy is not free, and the remote surgery software warns that rapid changes to cognition may cause significant changes in behavior.</p> <span id="result"> <<link "Finish activating the sequence">> @@ -72,7 +72,7 @@ <</if>> <<set _slave.sexualQuirk = "perverted">> <p>Over the next few weeks, you also begin to notice some significant changes in behavior. Although _slave.slaveName has always been remarkably horny, $he has become much more <span class="flaw break">perverted.</span></p> - <</if>> + <</if>> <</replace>> <</link>> //This will cost <<= cashFormat($surgeryCost*4)>>//<br> <<link "Let it be">> diff --git a/src/facilities/ads.js b/src/facilities/ads.js index c72090268bb294b3cb8211ad98b2440111f777e0..92b8cbd6e304be0e0e0ecf0d39930b2604492204 100644 --- a/src/facilities/ads.js +++ b/src/facilities/ads.js @@ -160,7 +160,7 @@ App.Ads.getMatchedCategoryCount = function(slave, facility) { return matchedCategories; }; -/** Manages the ads for a facility. Use example: <<set _adMgr = new App.Ads.AdManager("brothel")>> */ +/** Manages the ads for a facility. Use example: <<set _adMgr = new App.Ads.AdManager("brothel")>> */ App.Ads.AdManager = class { constructor(facility) { this.varPrefix = `${facility}Ads`; @@ -1285,7 +1285,7 @@ App.Ads.report = function(building, preview) { r+= `</div>`; return r; default: - console.log("You done fucked up. Building: " + building + " Category: " + category); + console.log("You done fucked up. Building: " + building + " Category: " + category); } } }; diff --git a/src/facilities/brothel/brothelAssignmentScene.tw b/src/facilities/brothel/brothelAssignmentScene.tw index 2bb3e2f5384f68d4f0c008f1451ee554c1c1d924..ef292aaf2caba44d3d185fb70f2ae000eae1c53f 100644 --- a/src/facilities/brothel/brothelAssignmentScene.tw +++ b/src/facilities/brothel/brothelAssignmentScene.tw @@ -333,7 +333,7 @@ You tell $him $he's to report to <<if $Madam != 0>>$Madam.slaveName immediately, "Gro<<ss>>," $he <<say>>s curtly. "Well, no more hand<<s>>ome boy<<s>> for me, then. Fat pathetic guy<<s>> who patroni<<z>>e whore<<s>>, all the way down. Fuck." <</switch>> <<else>> - $He does $his best to control $himself and avoid punishment. "<<Master>>, I will." $He holds $himself together until you dismiss $him; as $he turns away to go, the tears come fast, and $he almost runs into the door frame on $his way out, blind with weeping. + $He does $his best to control $himself and avoid punishment. "<<Master>>, I will." $He holds $himself together until you dismiss $him; as $he turns away to go, the tears come fast, and $he almost runs into the door frame on $his way out<<if canSee($activeSlave)>>, blind with weeping<</if>>. <</if>> <<else>> <<if $activeSlave.sexualFlaw != "none">> @@ -359,7 +359,7 @@ You tell $him $he's to report to <<if $Madam != 0>>$Madam.slaveName immediately, by expressing $his disappointment with the type of men that frequent brothels. <</switch>> <<else>> - $He does $his best to control $himself and avoid punishment. "<<Master>>, I will." $He holds $himself together until you dismiss $him; as $he turns away to go, the tears come fast, and $he almost runs into the door frame on $his way out, blind with weeping. + $He does $his best to control $himself and avoid punishment. "<<Master>>, I will." $He holds $himself together until you dismiss $him; as $he turns away to go, the tears come fast, and $he almost runs into the door frame on $his way out<<if canSee($activeSlave)>>, blind with weeping<</if>>. <</if>> <</if>> diff --git a/src/facilities/farmyard/farmyardReport.tw b/src/facilities/farmyard/farmyardReport.tw index 1fe6c966f86d63a11a2872fad8750c2a6986605f..feb3c95fb00da62e733da16154ee7468a32cbe51 100644 --- a/src/facilities/farmyard/farmyardReport.tw +++ b/src/facilities/farmyard/farmyardReport.tw @@ -298,7 +298,7 @@ <</if>> </span> <</for>> - + <<set _profits += $cash-_oldCash, _foodWeek += $food-_oldFood>> <!-- Record statistics gathering --> <<script>> diff --git a/src/facilities/nursery/childInteract.tw b/src/facilities/nursery/childInteract.tw index 4da859c3a86db9d936a5bf3d47af4b85348fa86f..aa1ed9772fc88444229d9b5e220424486bd252ff 100644 --- a/src/facilities/nursery/childInteract.tw +++ b/src/facilities/nursery/childInteract.tw @@ -998,6 +998,15 @@ FIXME: | Hyper Breasts <</if>> <</if>> + <<if $dispensary == 1>> + <<if ($activeChild.nipples === "partially inverted" || $activeChild.nipples === "inverted" || $activeChild.nipples === "tiny" || $activeChild.nipples === "cute" || $activeChild.nipples === "puffy")>> + | <<link "Nipple enhancers">> + <<set $activeChild.drugs = "nipple enhancers">> + <</link>> + <<else>> + | Nipple enhancers + <</if>> + <</if>> <<if $arcologies[0].FSSlimnessEnthusiastResearch>> <<if ($activeChild.boobs-$activeChild.boobsImplant > 100)>> | <<link "Breast reducers">> diff --git a/src/facilities/nursery/nursery.tw b/src/facilities/nursery/nursery.tw index caedd5777b033c610702a74dac6cb81262cb89b6..57fd9578edac1a0ca8a6dc35faf9184da6b0b9d5 100644 --- a/src/facilities/nursery/nursery.tw +++ b/src/facilities/nursery/nursery.tw @@ -108,7 +108,7 @@ There <<if _NL == 1>>is<<else>>are<</if>> _NL nann<<if _NL != 1>>ies<<else>>y<</ <</if>> <<if $nurseryNannies < 5>> <div class="choices"> - [[Expand the nursery|Nursery][cashX(forceNeg(_Tmult0), "capEx"), $nurseryNannies += 1, $PC.skill.engineering += .1]] + [[Expand the nursery|Nursery][cashX(forceNeg(_Tmult0), "capEx"), $nurseryNannies += 1, $PC.skill.engineering += .1]] <span class="note"> Costs <<print cashFormat(_Tmult0)>> and will increase upkeep costs </span> @@ -148,7 +148,7 @@ There <<if _NL == 1>>is<<else>>are<</if>> _NL nann<<if _NL != 1>>ies<<else>>y<</ <br><br>It can support $nursery child<<if $nursery != 1>>ren<</if>>. There <<if $nurseryBabies == 1>>is<<else>>are<</if>> currently $nurseryBabies room<<if $nurseryBabies != 1>>s<</if>> in use in $nurseryName. <<if $nursery < 50>> <div class="choices"> - [[Add another room|Nursery][cashX(forceNeg(Math.trunc(5000*$upgradeMultiplierArcology)), "nursery"), $nursery += 5]] + [[Add another room|Nursery][cashX(forceNeg(Math.trunc(5000*$upgradeMultiplierArcology)), "nursery"), $nursery += 5]] <span class="note"> Costs <<print cashFormat(Math.trunc(5000*$upgradeMultiplierArcology))>> and will increase upkeep costs </span> @@ -164,7 +164,7 @@ There <<if _NL == 1>>is<<else>>are<</if>> _NL nann<<if _NL != 1>>ies<<else>>y<</ <<if $nursery > 1 && $reservedChildrenNursery < $freeCribs>> <div class="choices"> - [[Remove a room|Nursery][cashX(forceNeg(Math.trunc(1000*$upgradeMultiplierArcology)), "nursery"), $nursery -= 5]] + [[Remove a room|Nursery][cashX(forceNeg(Math.trunc(1000*$upgradeMultiplierArcology)), "nursery"), $nursery -= 5]] <span class="note"> Costs <<print cashFormat(Math.trunc(1000*$upgradeMultiplierArcology))>> and will reduce upkeep costs </span> @@ -272,7 +272,7 @@ Reserve an eligible mother-to-be's child to be placed in a room upon birth. Of $ <</if>> <</if>> <<elseif ($reservedChildrenNursery < $freeCribs) && ($freeCribs > _WL)>> - <<if _WL - _reservedIncubator == 0>> + <<if _WL - _reservedIncubator == 0>> <span class="note"> $His children are already reserved for $incubatorName </span> @@ -345,7 +345,7 @@ Reserve an eligible mother-to-be's child to be placed in a room upon birth. Of $ <</if>> <</if>> <<elseif $reservedChildrenNursery < $freeCribs>> - <<if _WL - _reservedIncubator == 0>> + <<if _WL - _reservedIncubator == 0>> <span class="note"> Your child<<if _WL > 0>>ren are<<else>>is<</if>> already reserved for $incubatorName </span> @@ -423,7 +423,7 @@ Reserve an eligible mother-to-be's child to be placed in a room upon birth. Of $ <</if>> <<else>> The children ''are not'' getting any exercise, meaning they will likely end up becoming fairly weak and frail. - [[Allow the children to remain active|Nursery][cashX(forceNeg(Math.trunc(1000*$upgradeMultiplierArcology)), "nursery"), $nurseryMuscles = 1]] + [[Allow the children to remain active|Nursery][cashX(forceNeg(Math.trunc(1000*$upgradeMultiplierArcology)), "nursery"), $nurseryMuscles = 1]] <span class="note"> Requires a Matron or at least one nanny and costs <<print cashFormat(Math.trunc(1000*$upgradeMultiplierArcology))>> and will increase upkeep costs </span> @@ -474,7 +474,7 @@ FIXME: not sure if this works */ <p> - Rename $nurseryName: <<textbox "$nurseryName" $nurseryName "Nursery">> + Rename $nurseryName: <<textbox "$nurseryName" $nurseryName "Nursery">> <span class="note"> Use a noun or similar short phrase </span> diff --git a/src/facilities/nursery/nurseryDatatypeCleanup.js b/src/facilities/nursery/nurseryDatatypeCleanup.js index 90f31a73975b4a470702db334fb77092662b1773..9e80c4b3e2c2e5deb6e13a6c2f2c0ec96dcdb3eb 100644 --- a/src/facilities/nursery/nurseryDatatypeCleanup.js +++ b/src/facilities/nursery/nurseryDatatypeCleanup.js @@ -108,13 +108,13 @@ App.Facilities.Nursery.ChildDatatypeCleanup = function(child) { child.pubicHStyle = "neat"; } if (typeof child.underArmHColor !== "string") { - child.underArmHColor = "child.hColor"; + child.underArmHColor = child.hColor; } if (typeof child.underArmHStyle !== "string") { child.underArmHStyle = "waxed"; } if (typeof child.eyebrowHColor !== "string") { - child.eyebrowHColor = "child.hColor"; + child.eyebrowHColor = child.hColor; } if (typeof child.eyebrowHStyle !== "string") { child.eyebrowHStyle = "natural"; @@ -562,7 +562,7 @@ App.Facilities.Nursery.InfantDatatypeCleanup = function(child) { child.pubicHStyle = "neat"; } if (typeof child.eyebrowHColor !== "string") { - child.eyebrowHColor = "child.hColor"; + child.eyebrowHColor = child.hColor; } } diff --git a/src/facilities/nursery/nurseryWidgets.js b/src/facilities/nursery/nurseryWidgets.js index 7fc49d9fb0a98bf93dcd89ca7c5b2849a38ee02a..1dcc2cb283b204f7a4ff6d0106e1c2a48bb9c46c 100644 --- a/src/facilities/nursery/nurseryWidgets.js +++ b/src/facilities/nursery/nurseryWidgets.js @@ -3095,6 +3095,9 @@ App.Facilities.Nursery.ChildSummary = function(child) { case "intensive breast injections": r += `<strong>Dr:Boobs++</strong> `; break; + case "nipple enhancers": + r += `<strong>Dr:Nipple+</strong> `; + break; case "hyper breast injections": r += `<strong>Dr:Boobs+++</strong> `; break; @@ -9062,11 +9065,11 @@ App.Facilities.Nursery.LongChildDescription = function(child) { } else { r += `${He} has nothing but small, perforated metal disks where ${his} ears should be. `; } - } else if (child.earWear === "none") { + } else if (child.earwear === "none") { r += `${He} has small unsightly holes on the sides of ${his} head. `; } else { r += `The sides of ${his} head are smooth where ${his} ears should be, but upon closer inspection it is revealed that `; - if (child.earWear === "hearing aids") { + if (child.earwear === "hearing aids") { r += `${his} ear canals are fitted with hearing aids capped with a skin-matching sheet to obscure the hole. `; } else { r += `${his} ear canals are filled with plugs with skin-matching caps. `; @@ -15210,6 +15213,9 @@ App.Facilities.Nursery.LongChildDescription = function(child) { case "hyper breast injections": r += `${He} ${hasAnyArms(child) ? `massages ${his} tits uncomfortably` : `squirms under the unfamiliar weight on ${his} chest`}. The ${child.drugs === "hyper breast injections" ? `HA-HGH` : `A-HGH`} must be having an effect, painfully stretching ${his} breasts as the mammary and adipose tissue underneath grows explosively. `; break; + case "nipple enhancers": + r += `${He} ${hasAnyArms(child) ? `massages ${his} nipples uncomfortably` : `squirms in respose to the discomfort in ${his} nipples`}. The A-HGH must be having an effect, painfully causing ${his} body to expand ${his} nipples. `; + break; case "intensive butt injections": case "hyper butt injections": r += `${He} ${hasAnyArms(child) ? `massages ${his} butt uncomfortably` : `squirms under the unfamiliar weight on ${his} backside`}. The ${child.drugs === "hyper butt injections" ? `HA-HGH` : `A-HGH`} must be having an effect, painfully stretching ${his} buttocks as the muscular and adipose tissue underneath grows explosively. `; @@ -16567,7 +16573,7 @@ App.Facilities.Nursery.ChildState = class ChildState { this.relationTarget = 0; /** * TODO: - * Child's relationship + * Child's relationship * * -3: married to you * * -2: emotionally bound to you * * -1: emotional slut @@ -17769,6 +17775,7 @@ App.Facilities.Nursery.ChildState = class ChildState { * * "clitoris atrophiers" * * "labia atrophiers" * * "nipple atrophiers" + * * "nipple enhancers" * * "lip atrophiers" * * "breast redistributors" * * "butt redistributors" diff --git a/src/gui/Encyclopedia/encyclopedia.tw b/src/gui/Encyclopedia/encyclopedia.tw index 68d55c1e109739ca3c33aa621d2fbb7c6ab515d7..e91325dae6d22e4df942a2a3c2e5cc8b9f5bcff7 100644 --- a/src/gui/Encyclopedia/encyclopedia.tw +++ b/src/gui/Encyclopedia/encyclopedia.tw @@ -404,7 +404,7 @@ SLAVES <br>Long term damage stays with your slaves and is therefore something to be aware of and try to avoid. While some long term damage accumulates passively as slaves start to get old, the most likely source of long term damage comes from slaves taking a lot of abuse without enough time to recover or from a particularly invasive surgery. While curatives and preventatives help avoid long term damage, too much short term damage will eventually bleed over and become long term damage. So even when a slave is perfectly healthy you may want to spread out surgical enhancements and allow for recovery. <br><br>''Tiredness'' - <br>Working hard will eventually make your slaves tired, this is only natural. Once tired they will no longer be able to perform to the best of their abilities and therefore this may be something to avoid, though a tired slave is less capable of resisting their master. A slave can either be perfectly fine, tired or exhausted. Excessive tiredness will negatively impact a slave's condition. Avoiding exhaustion can be done by taking them off tiresome assignments, letting them [[Rest|Encyclopedia][$encyclopedia = "Rest"]], preferably in the [[Spa|Encyclopedia][$encyclopedia = "Spa"]], providing them with comfortable living conditions and rewarding them with time off. The spa is particularly useful as it is not just really effective at reducing tiredness as an assignment, but also as a relaxation reward or to a lesser degree a situational reward. Be sure to have enough room in your spa for slaves deserving such rewards. A good attendant will also help. + <br>Working hard will eventually make your slaves tired, this is only natural. Once tired they will no longer be able to perform to the best of their abilities and therefore this may be something to avoid, though a tired slave is less capable of resisting their master. A slave can either be perfectly fine, tired, fatigued or exhausted. Excessive tiredness will negatively impact a slave's condition. Avoiding exhaustion can be done by taking them off tiresome assignments, assigning more lenient resting rules, letting them have time off, preferably in the [[Spa|Encyclopedia][$encyclopedia = "Spa"]] and providing them with comfortable living conditions. The spa is particularly useful as it is not just really effective at reducing tiredness as an assignment, but also as a relaxation reward or to a lesser degree a situational reward. Be sure to have enough room in your spa for slaves deserving such rewards. A good attendant will also help. It's worth keeping in mind that not all assignments are tiring either. <br><br>''Illness'' <br>Whether we like it or not, sometimes slaves get sick. Most of the time an illness will be nothing more than a minor inconvenience that clears up by the end of the week, but occasionally a slave might catch something that is best handled with the help of a [[Clinic|Encyclopedia][$encyclopedia = "Clinic"]]. Keeping slaves in good condition goes a long way to preventing too many issues, but one thing to be aware of is that chemical carcinogen buildup is particularly dangerous and can cause illnesses to become quite serious. A simple illness may be harmless but once a slave is seriously ill their condition will rapidly deteriorate. @@ -2684,7 +2684,7 @@ LORE: INTERVIEWS <br>''freecitiesbandit'' wrote a number of recruitment, future society, mercenary and random events, provided tailed buttplugs, new eyes and tattoos, and contributed the code for the mercenary raiders policy. <br>''DrNoOne'' wrote the bulk slave purchase and persistent summary code. <br>''Mauve'' provided vector art for chastity belts and limp dicks. - <br>''Klorpa'' for dozens of new nationalities and boundless new names and nicknames. Also monokinis, middle eastern clothing, overalls and aprons. Also the hearing, taste, and smell overhauls. Added basic support for waterpsorts. Has declared war on bad spelling, grammar and formatting. Added eyebrows too. Dug up ancient abandoned vanilla vignettes and implemented them. Toiled in the depths to extend limb support. + <br>''Klorpa'' for dozens of new nationalities and boundless new names and nicknames. Also monokinis, middle eastern clothing, overalls and aprons. Also the hearing, taste, and smell overhauls. Added basic support for watersports. Has declared war on bad spelling, grammar and formatting. Added eyebrows too. Dug up ancient abandoned vanilla vignettes and implemented them. Toiled in the depths to extend limb support. <br>''lowercasedonkey'' for various additions, not limited to the budget overhauls. Set up all the tabs too. Gave events dynamic vector art. Hammered the scarring and branding systems into place. Been a real boon writing events and other things as well. Used ezsh's facility framework to enhance slave summaries. Set up a system to recall where slaves were serving. Striving to master DOM with great gains. <br>''amomynous0'' for bug reports and testing in addition to SFmod unit descriptions. <br>''wepsrd'' for QOL (hormonal balance cheat and lactation adaptation to new menu) fixes. diff --git a/src/gui/css/mainStyleSheet.css b/src/gui/css/mainStyleSheet.css index eef848945fb6c02aaf310f6a5f449d4ce59a625d..8f40c12843f90db977aec4ab55ef0e883cd777eb 100644 --- a/src/gui/css/mainStyleSheet.css +++ b/src/gui/css/mainStyleSheet.css @@ -206,7 +206,7 @@ span.zeroButton > a:hover { text-decoration: none; } .lime, .lime a, .change.positive, .change.positive a, .virginity.loss, .virginity.loss a, .pregnant, .pregnant a { color: lime } /* tight orifices, breast changes, take virginity, not sure on good aliases */ .limegreen, .limegreen a { color: limegreen } /* multiple questionable uses */ .magenta, .magenta a, .devotion.worship, .devotion.worship a { color: magenta } -.mediumaquamarine, .mediumaquamarine a, .trust.inc, .trust.inc a, .trust.careful, .trust.careful a { color: mediumaquamarine } +.mediumaquamarine, .mediumaquamarine a, .trust.inc, .trust.inc a, .trust.careful, .trust.careful a { color: mediumaquamarine } .mediumorchid, .mediumorchid a, .devotion.dec, .devotion.dec a, .devotion.resistant, .devotion.resistant a { color: mediumorchid } .mediumseagreen, .mediumseagreen a, .trust.trusting, .trust.trusting a { color: mediumseagreen } .orange, .orange a, .stupid, .stupid a, .change.negative, .change.negative a, .defiant.careful, .defiant.careful a, .intro.question { color: orange } /* generally between red and green, and a lot of other places */ diff --git a/src/gui/storyCaption.tw b/src/gui/storyCaption.tw index 1789dc6fdb3bddb9805cd4271774c12c44ae41cd..5bb3c9a4daed1029e8db5940dd94a83d7cc3bf12 100644 --- a/src/gui/storyCaption.tw +++ b/src/gui/storyCaption.tw @@ -7,7 +7,7 @@ <<if _Pass != "End Week">> <<if _Pass == "Main">> <strong> <span id="endWeekButton"> - <div><<link "$nextButton">> <<goto $nextLink>> <</link>> @@.cyan;[Ent]@@</div> + <div><<link "$nextButton">><</link>> @@.cyan;[Ent]@@</div> </span> </strong> <<if $rulesAssistantAuto == 1 && DefaultRulesError()>> <div>@@.yellow;WARNING: Rules Assistant has rules with errors!@@</div> @@ -20,6 +20,15 @@ </span> </strong> <</if>> <</if>> + <<script>> + $(document).one(':passageend', () => { + $('#endWeekButton').click(() => { + if (!V.sideBarOptions.confirmWeekEnd || confirm("Are you sure you want to end the week?")) { + Engine.play(V.nextLink); + } + }); + }); + <</script>> <</widget>> <<widget "security">> @@ -62,6 +71,9 @@ <<if $ui != "start" && _Pass != "Encyclopedia">> <<if $cheatMode || $debugMode>> <div>_Pass</div> + <<if _Pass == "JS Random Event">> + <div><<= $event.eventName>></div> + <</if>> <</if>> <div> <span id="week">''Week $week''</span> @@ -200,7 +212,7 @@ @@color:rgb(0,195,0);eminent@@ <<elseif $rep > 8250>> @@color:rgb(0,200,0);prominent@@ - <<elseif $rep > 7000>> + <<elseif $rep > 7500>> @@color:rgb(0,205,0);distinguished@@ <<elseif $rep > 6750>> @@color:rgb(0,210,0);admired@@ @@ -500,7 +512,7 @@ <</if>> <br> <</if>> - <</if>> /* closes _Pass == "Main" && $newModelUI == 0 */ + <</if>> /* closes _Pass == "Main" && $newModelUI == 0 */ <<if $sideBarOptions.compact == 0 && _Pass == "Main" || $sideBarOptions.compact == 1 && _Pass == "Manage Arcology">> <span id="policyButton"> <br> diff --git a/src/gui/theming.js b/src/gui/theming.js index ac274203c91faaa2fae39e7ccfda123e353874bb..fa248354326bc71eddf2f0a0d2772d932c91887a 100644 --- a/src/gui/theming.js +++ b/src/gui/theming.js @@ -5,6 +5,13 @@ App.UI.Theme = (function() { let currentThemeElement = null; let devTheme = null; + // reload theme on page reload + $(document).on(":passagestart", () => { + if (currentThemeElement === null && V.theme !== 0) { + load(V.theme); + } + }); + return { selector: selector, devTheme: reloadDevTheme, diff --git a/src/init/storyInit.tw b/src/init/storyInit.tw index 48c6b128f139128dc81d142489a8320363870116..cc124ea7944b61eea5f687c630d201eb5737542c 100644 --- a/src/init/storyInit.tw +++ b/src/init/storyInit.tw @@ -20,87 +20,19 @@ You should have received a copy of the GNU General Public License along with thi <<set $ver = App.Version.base, $pmodVer = App.Version.pmod, $releaseID = App.Version.release>> -<<set _NGPOffset = 1200000>> - -<<run App.Update.slaveLoopInit()>> - /* 0 out the record books as we start a new game */ <<run setupLastWeeksCash()>> <<run setupLastWeeksRep()>> <<if $saveImported == 0>> /* new game (not NG+) */ - <<set $PC = basePlayer()>> <<run WombInit($PC)>> <<run cashX(10000, "personalBusiness")>> <<include "Init Rules">> - <<else>> /* imported save (NG+) */ - - <<if $freshPC == 0>> - <<if def $arcologies[0].prosperity>> - <<run cashX((250*$arcologies[0].prosperity*$arcologies[0].ownership), "personalBusiness")>> - <</if>> - <<set _cash = $cash, $cash = 0, $cashLastWeek = 0>> - <<run cashX((Math.clamp(1000*Math.trunc(_cash/100000), 5000, 1000000)), "personalBusiness")>> - <<if $retainCareer == 0>> - <<set $PC.career = "arcology owner", $PC.skill.trading = 100, $PC.skill.warfare = 100, $PC.skill.hacking = 100, $PC.skill.slaving = 100, $PC.skill.engineering = 100, $PC.skill.medicine = 100>> - <</if>> - <<if $PC.mother > 0>> - <<set $PC.mother += _NGPOffset>> - <<elseif $PC.mother < 0>> - <<set $PC.mother -= _NGPOffset>> - <</if>> - <<if $PC.father > 0>> - <<set $PC.father += _NGPOffset>> - <<elseif $PC.father < 0>> - <<set $PC.father -= _NGPOffset>> - <</if>> - <<if $PC.pregSource > 0>> - <<set $PC.pregSource += _NGPOffset>> - <<set _getFather = $slaveIndices[$PC.pregSource]>> - <<if ndef _getFather>> - <<set $PC.pregSource = 0>> - <</if>> - <<for _sInit = 0; _sInit < $PC.womb.length; _sInit++>> - <<if $PC.womb[_sInit].fatherID > 0>> - <<set $PC.womb[_sInit].fatherID += _NGPOffset>> - <</if>> - <</for>> - <</if>> - <<else>> - <<set $PC = basePlayer()>> - <<run WombInit($PC)>> - <<set $cheater = 0>> - <<set $cash = 0>> - <<run cashX(10000, "personalBusiness")>> - <<for _i = 0; _i < _SL; _i++>> - <<if $familyTesting == 1>> - <<if $slaves[_i].mother == -1>> - <<set $slaves[_i].mother = $missingParentID+_NGPOffset>> - <</if>> - <<if $slaves[_i].father == -1>> - <<set $slaves[_i].father = $missingParentID+_NGPOffset>> - <</if>> - <<if $slaves[_i].pregSource == -1>> - <<set $slaves[_i].pregSource = 0>> - <</if>> - <<if $slaves[_i].cloneID == -1>> - <<set $slaves[_i].cloneID = 0>> - <</if>> - <</if>> - <<for _sInit = 0; _sInit < $slaves[_i].womb.length; _sInit++>> - <<if $slaves[_i].womb[_sInit].fatherID == -1>> - <<set $slaves[_i].womb[_sInit].fatherID = 0>> - <</if>> - <</for>> - <</for>> - <</if>> - - /*Undefining corporation variables*/ - <<unset $corp.AssetsDev, $corp.AssetsDevOld, $corp.AssetsSlave, $corp.AssetsSlaveOld, $corp.Cash, $corp.Div, $corp.DivArcadeFromMarket, $corp.DivArcadeSlaves, $corp.DivBreakFromMarket, $corp.DivBreakSlaves, $corp.DivBreakSlaves2, $corp.DivBreakToMarket, $corp.DivBreakToMenial, $corp.DivBreakToSurgery, $corp.DivBreakToTrain, $corp.DivDairyFromMarket, $corp.DivDairySlaves, $corp.DivExtraSlaves, $corp.DivExtraToArcade, $corp.DivExtraToBreak, $corp.DivExtraToMarket, $corp.Dividend, $corp.DivLegalSlaves, $corp.DivLegalToMarket, $corp.DivLegalToMenial, $corp.DivLegalToSurgery, $corp.DivLegalToTrain, $corp.DivMenialFromMarket, $corp.DivMenialSlaves, $corp.DivSurgeryFromMarket, $corp.DivSurgerySlaves, $corp.DivSurgerySlaves2, $corp.DivSurgeryToDairy, $corp.DivSurgeryToMarket, $corp.DivSurgeryToTrain, $corp.DivTrainFromMarket, $corp.DivTrainSlaves, $corp.DivTrainSlaves2, $corp.DivTrainToMarket, $corp.DivTrainToWhore, $corp.DivWhoreFromMarket, $corp.DivWhoreSlaves, $corp.OpCostOld, $corp.OverheadOld, $corp.ProfitOld, $corp.Rev, $corp.RevOld, $corp.SpecAccent, $corp.SpecAge, $corp.SpecNationality, $corp.SpecAmputee, $corp.SpecBalls, $corp.SpecDevotion, $corp.SpecDick, $corp.SpecEducation, $corp.SpecGender, $corp.SpecGenitalia, $corp.SpecHeight, $corp.SpecHormones, $corp.SpecImplants, $corp.SpecInjection, $corp.SpecIntelligence, $corp.SpecMilk, $corp.SpecMuscle, $corp.SpecPussy, $corp.SpecSexEd, $corp.SpecTrust, $corp.SpecVirgin, $corp.SpecWeight, $dividendTimer, $personalShares, $publicShares>> - + <<run App.Data.NewGamePlus()>> <</if>> + /* Porn star counts (prestige 1) and ID's (prestige 3) */ <<set $pornStars = {}>> <<for _genre range App.Porn.getAllGenres()>> diff --git a/src/interaction/budgets/recordTemplates.js b/src/interaction/budgets/recordTemplates.js index 8a7cc9feb4692bcfdec3f4f7a8c458ea20c02a4a..69553ce253c9acc4987acf5707f32ef567b75544 100644 --- a/src/interaction/budgets/recordTemplates.js +++ b/src/interaction/budgets/recordTemplates.js @@ -1,56 +1,105 @@ App.Data.Records = {}; App.Data.Records.LastWeeksCash = function() { - this.whore = 0, - this.whoreBrothel = 0, - this.rest = 0, - this.houseServant = 0, - this.confined = 0, - this.publicServant = 0, - this.classes = 0, - this.milked = 0, - this.milkedDairy = 0, - this.extraMilk = 0, // milk from slaves doing other things - this.gloryhole = 0, - this.gloryholeArcade = 0, - this.porn = 0, - this.recruiter = 0, // Slaves in general - this.fuckdolls = 0, + this.slaveMod = 0, + this.slaveSurgery = 0, + this.birth = 0, + this.porn = 0, + // Slave Income and Expenses per assignment + this.slaveAssignmentRest = 0, + this.slaveAssignmentRestVign = 0, + this.slaveAssignmentFucktoy = 0, + this.slaveAssignmentClasses = 0, + this.slaveAssignmentHouse = 0, + this.slaveAssignmentHouseVign = 0, + this.slaveAssignmentWhore = 0, + this.slaveAssignmentWhoreVign = 0, + this.slaveAssignmentPublic = 0, + this.slaveAssignmentPublicVign = 0, + this.slaveAssignmentSubordinate = 0, + this.slaveAssignmentMilked = 0, + this.slaveAssignmentMilkedVign = 0, + this.slaveAssignmentExtraMilk = 0, + this.slaveAssignmentExtraMilkVign = 0, + this.slaveAssignmentGloryhole = 0, + this.slaveAssignmentConfinement = 0, + this.slaveAssignmentBodyguard = 0, + this.slaveAssignmentHeadgirl = 0, + this.slaveAssignmentHeadgirlsuite = 0, + this.slaveAssignmentRecruiter = 0, + this.slaveAssignmentConcubine = 0, + this.slaveAssignmentMastersuite = 0, + this.slaveAssignmentAgent = 0, + this.slaveAssignmentArcade = 0, + this.slaveAssignmentMadam = 0, + this.slaveAssignmentMadamVign = 0, + this.slaveAssignmentBrothel = 0, + this.slaveAssignmentBrothelVign = 0, + this.slaveAssignmentWarden = 0, + this.slaveAssignmentCellblock = 0, + this.slaveAssignmentDj = 0, + this.slaveAssignmentClub = 0, + this.slaveAssignmentClubVign = 0, + this.slaveAssignmentNurse = 0, + this.slaveAssignmentClinic = 0, + this.slaveAssignmentMilkmaid = 0, + this.slaveAssignmentDairy = 0, + this.slaveAssignmentDairyVign = 0, + this.slaveAssignmentFarmer = 0, + this.slaveAssignmentFarmyard = 0, + this.slaveAssignmentFarmyardVign = 0, + this.slaveAssignmentMatron = 0, + this.slaveAssignmentNursery = 0, + this.slaveAssignmentNurseryVign = 0, + this.slaveAssignmentTeacher = 0, + this.slaveAssignmentSchool = 0, + this.slaveAssignmentSteward = 0, + this.slaveAssignmentQuarter = 0, + this.slaveAssignmentQuarterVign = 0, + this.slaveAssignmentAttendant = 0, + this.slaveAssignmentSpa = 0, + this.slaveAssignmentBaby_factory = 0, + // Menial Slaves this.menialTrades = 0, + this.fuckdolls = 0, this.menialBioreactors = 0, - + // Misc Slaves + this.labScientists = 0, + this.labMenials = 0, this.slaveTransfer = 0, - this.fuckdollsTransfer = 0, this.menialTransfer = 0, + this.fuckdollsTransfer = 0, this.menialBioreactorsTransfer = 0, + this.menialTransferA = 0, + this.fuckdollsTransferA = 0, + this.menialBioreactorsTransferA = 0, + this.labScientistsTransfer = 0, this.babyTransfer = 0, this.menialRetirement = 0, - this.slaveMod = 0, - this.slaveSurgery = 0, - this.slaveUpkeep = 0, - this.birth = 0, - // Buildings - this.lab = 0, + this.masterSuite = 0, + this.arcade = 0, this.brothel = 0, this.brothelAds = 0, + this.cellblock = 0, this.club = 0, this.clubAds = 0, - this.arcade = 0, - this.dairy = 0, - this.servantsQuarters = 0, - this.masterSuite = 0, - this.school = 0, - this.spa = 0, this.clinic = 0, - this.cellblock = 0, + this.dairy = 0, + this.farmyard = 0, this.incubator = 0, + this.incubatorSlaves = 0, this.nursery = 0, - this.farmyard = 0, this.pit = 0, + this.lab = 0, + this.labResearch = 0, + this.school = 0, + this.servantsQuarters = 0, + this.spa = 0, + // Arcology this.environment = 0, this.weather = 0, @@ -92,7 +141,7 @@ App.Data.Records.LastWeeksRep = function() { this.publicServant = 0, this.gloryholeArcade = 0, this.gloryhole = 0, - + this.disobedience = 0, this.concubine = 0, this.headGirl = 0, this.bodyguard = 0, diff --git a/src/interaction/prostheticConfig.tw b/src/interaction/prostheticConfig.tw index 9fd8c179e999fa7c272a99057c2e1d727cb1b19b..53461f80ff3e8c0e1c265d37a75d98c02bebad1b 100644 --- a/src/interaction/prostheticConfig.tw +++ b/src/interaction/prostheticConfig.tw @@ -317,14 +317,14 @@ This room is lined with shelves and cabinets; it could be easily mistaken for a <</if>> </div> <div style="text-align:right"> - <<if $researchLab.speed >= 300 && $prosthetics[_p].research > 0>> /* max speed */ + <<if $researchLab.speed >= 300 && $prosthetics[_p].research > 0>> /* max speed */ <<if $prosthetics[_p].amount > 0>> <<link "From storage: <<= cashFormat(setup.prosthetics[_p].adjust * 50)>>" "Prosthetics Configuration">> <<set cashX(forceNeg(setup.prosthetics[_p].costs * 1.5), "slaveMod", getSlave($AS)), addProsthetic(getSlave($AS), _p)>> <</link>> <<else>> <<link "<<= cashFormat(setup.prosthetics[_p].costs + setup.prosthetics[_p].adjust * 100)>>" "Prosthetics Configuration">> - <<set cashX(forceNeg(setup.prosthetics[_p].costs + setup.prosthetics[_p].adjust * 100), "slaveMod", getSlave($AS)), addProsthetic(getSlave($AS), _p)>> + <<set cashX(forceNeg(setup.prosthetics[_p].costs + setup.prosthetics[_p].adjust * 100), "slaveMod", getSlave($AS)), addProsthetic(getSlave($AS), _p)>> <</link>> <</if>> <</if>> diff --git a/src/interaction/prostheticLab.tw b/src/interaction/prostheticLab.tw index e5bb268d287027ef03223aaf4c463296299cdb45..1d8d739b8409bbf18d9f4a323e30f546e62ff8b4 100644 --- a/src/interaction/prostheticLab.tw +++ b/src/interaction/prostheticLab.tw @@ -75,12 +75,12 @@ <div style="padding-top:1em"> <<if ($researchLab.hired + $researchLab.menials) < $researchLab.maxSpace>> <div> - Hire [[x1|Prosthetic Lab][$researchLab.hired += 1,cashX(-2000, "lab")]] + Hire [[x1|Prosthetic Lab][$researchLab.hired += 1,cashX(forceNeg(2000), "labScientistsTransfer")]] <<if ($researchLab.maxSpace - ($researchLab.hired + $researchLab.menials)) >= 5>> - | [[x5|Prosthetic Lab][$researchLab.hired += 5,cashX(-10000, "lab")]] + | [[x5|Prosthetic Lab][$researchLab.hired += 5,cashX(forceNeg(10000), "labScientistsTransfer")]] <</if>> <<if ($researchLab.maxSpace - ($researchLab.hired + $researchLab.menials)) >= 10>> - | [[x10|Prosthetic Lab][$researchLab.hired += 10,cashX(-10000, "lab")]] + | [[x10|Prosthetic Lab][$researchLab.hired += 10,cashX(forceNeg(10000), "labScientistsTransfer")]] <</if>> scientists. </div> @@ -195,7 +195,7 @@ <<if setup.prosthetics[_p].level <= $prostheticsUpgrade>> <<capture _p>> <<link "Reverse engineer <<= addA(setup.prosthetics[_p].name)>>" "Prosthetic Lab">> - <<set cashX(forceNeg(setup.prosthetics[_p].costs), "lab"), $prosthetics[_p].research = -1, $researchLab.tasks.push({type: "research", id: _p, workLeft: setup.prosthetics[_p].research})>> + <<set cashX(forceNeg(setup.prosthetics[_p].costs), "labResearch"), $prosthetics[_p].research = -1, $researchLab.tasks.push({type: "research", id: _p, workLeft: setup.prosthetics[_p].research})>> <</link>> <</capture>> //Costs <<= cashFormat(setup.prosthetics[_p].costs)>> of initial investment.// diff --git a/src/interaction/slaveInteract.js b/src/interaction/slaveInteract.js index b778f0f66ae52d123d8d56b3952d182c7ce33a89..e90f0c6e08517a7e75e6c0501971d17f98a206f8 100644 --- a/src/interaction/slaveInteract.js +++ b/src/interaction/slaveInteract.js @@ -1,63 +1,24 @@ /* eslint-disable no-unused-vars */ // TODO: remove after testing App.UI.SlaveInteract.placeInLine = function(slave) { - let slavesInLine = []; - let activeSlaveIndex = V.slaveIndices[slave.ID]; - let SL = V.slaves.length; - - if (assignmentVisible(slave)) { - for (let pil = activeSlaveIndex - 1; pil !== activeSlaveIndex; pil--) { - /* loops backwards through the V.slaves array */ - if (pil < 0) { - pil = SL; - continue; - } - if (assignmentVisible(V.slaves[pil])) { - slavesInLine.push(pil); /* index of the previous slave in line */ - break; - } - } - for (let pil = activeSlaveIndex + 1; pil !== activeSlaveIndex; pil++) { - /* this loops forwards through the V.slaves array */ - if (pil === SL) { - pil = -1; - continue; - } - if (assignmentVisible(V.slaves[pil])) { - slavesInLine.push(pil); /* index of the next slave in line */ - break; - } - } + const useSlave = assignmentVisible(slave) ? ((s) => assignmentVisible(s)) : ((s) => slave.assignment === s.assignment); + const slaveList = V.slaves.filter(useSlave); + SlaveSort.slaves(slaveList); + const curSlaveIndex = slaveList.findIndex((s) => s.ID === slave.ID); + + let nextIndex; + if (curSlaveIndex + 1 > slaveList.length - 1) { + nextIndex = 0; // wrap around to first slave } else { - for (let pil = activeSlaveIndex - 1; pil !== activeSlaveIndex; pil--) { - /* loops backwards through the V.slaves array */ - if (pil < 0) { - pil = SL; - continue; - } - if (V.slaves[pil].assignment === slave.assignment) { - slavesInLine.push(pil); /* index of the previous slave in line */ - break; - } - } - for (let pil = activeSlaveIndex + 1; pil !== activeSlaveIndex; pil++) { - /* this loops forwards through the V.slaves array */ - if (pil === SL) { - pil = -1; - continue; - } - if (V.slaves[pil].assignment === slave.assignment) { - slavesInLine.push(pil); /* index of the next slave in line */ - break; - } - } + nextIndex = curSlaveIndex + 1; } - - if (slavesInLine.length === 0) { - /* if there are no other slaves available, set previous/next slave to self */ - slavesInLine[0] = activeSlaveIndex; - slavesInLine[1] = activeSlaveIndex; + let prevIndex; + if (curSlaveIndex - 1 < 0) { + prevIndex = slaveList.length - 1; // wrap around to last slave + } else { + prevIndex = curSlaveIndex - 1; } - return slavesInLine; + + return [ slaveList[prevIndex].ID, slaveList[nextIndex].ID ]; }; App.UI.SlaveInteract.fucktoyPref = function(slave) { @@ -289,6 +250,15 @@ App.UI.SlaveInteract.drugs = function(slave) { drugOptions.push({text: `Hyper Breasts`, disabled: `Boobs are too large`}); } } + if(V.dispensary) { + if ((["inverted", "partially inverted", "cute", "tiny", "puffy"].includes(slave.nipples))) { + drugOptions.push({text: `Nipple enhancers`, updateSlave: {drugs: `nipple enhancers`}}); + } else if(slave.nipples === "huge") { + drugOptions.push({text: `Nipple enhancers`, disabled: `Nipples are already huge`}); + } else { + drugOptions.push({text: `Nipple enhancers`, disabled: `Has no effect on ${slave.nipples} nipples`}); + } + } if (V.arcologies[0].FSSlimnessEnthusiastResearch === 1) { if ((slave.boobs - slave.boobsImplant - slave.boobsMilk) > 100) { drugOptions.push({text: `Breast reducers`, updateSlave: {drugs: `breast redistributors`}}); @@ -464,7 +434,7 @@ App.UI.SlaveInteract.useSlaveDisplay = function(slave) { } = getPronouns(slave); /* - Array of objects. Each object follows the form: { + Array of objects. Each object follows the form: { text: "Link text", scene: "scene to include", goto: if another passage is needed @@ -476,7 +446,7 @@ App.UI.SlaveInteract.useSlaveDisplay = function(slave) { const sexOptions = []; const fillFaceOptions = []; const fillAssOptions = []; - // if no scene, it's just text, no link. Italicize it. + // if no scene, it's just text, no link. Italicize it. if (slave.fuckdoll === 0) { if (slave.vagina > -1) { @@ -1090,7 +1060,7 @@ App.UI.SlaveInteract.fertility = function(slave) { } } else if (slave.preg > slave.pregData.minLiveBirth) { link.appendChild(App.UI.DOM.link( - `Give ${him} a cesarean section`, + `Give ${him} a cesarean section`, () => { slave.broodmotherOnHold = 0, slave.broodmotherCountDown = 0; @@ -2367,16 +2337,16 @@ App.UI.SlaveInteract.custom = (function() { kbd.appendChild(filetypeDesc); note.appendChild(kbd); - note.append(`, enter `); + note.append(`, choose `); kbd = document.createElement('kbd'); - kbd.textContent = `headgirl`; + kbd.textContent = `PNG`; note.appendChild(kbd); - note.append(` then choose `); + note.append(` then enter `); kbd = document.createElement('kbd'); - kbd.textContent = `JPG`; + kbd.textContent = `headgirl`; note.appendChild(kbd); note.append(`.`); @@ -2486,7 +2456,7 @@ App.UI.SlaveInteract.generateRows = function(array, slave, category, accessCheck let unlocked = false; if (accessCheck === true) { if (category === "chastity") { - let text = array[i].text.toLowerCase(); // Yucky. Category name does not match for chastity (since it sets multiple kinds of chastity at once). Compare using a lowercased name instead. + let text = array[i].text.toLowerCase(); // Yucky. Category name does not match for chastity (since it sets multiple kinds of chastity at once). Compare using a lowercased name instead. unlocked = isItemAccessible.entry(text, `${category}`, slave, true); } else { unlocked = isItemAccessible.entry(array[i].updateSlave[category], `${category}`, slave, true); diff --git a/src/interaction/wardrobeUse.js b/src/interaction/wardrobeUse.js index fd74c9790272bddb8d401efc714d0e1f4318f533..b357de90b58156a94d329d5a4f71d739dec0544d 100644 --- a/src/interaction/wardrobeUse.js +++ b/src/interaction/wardrobeUse.js @@ -258,7 +258,7 @@ App.UI.Wardrobe.shoes = function(slave) { }); // Sort - // No sort here since we want light -> advanced. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); + // No sort here since we want light -> advanced. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); // Options let links = document.createElement('div'); @@ -432,7 +432,7 @@ App.UI.Wardrobe.buttplug = function(slave) { }); // Sort - // No sort here since we want small -> large. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); + // No sort here since we want small -> large. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); // Options let links = document.createElement('div'); @@ -549,7 +549,7 @@ App.UI.Wardrobe.vaginalAccessory = function(slave) { }); // Sort - // No sort here since we want small -> large. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); + // No sort here since we want small -> large. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); // Options let links = document.createElement('div'); @@ -667,7 +667,7 @@ App.UI.Wardrobe.dickAccessory = function(slave) { }); // Sort - // No sort here since we want small -> large. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); + // No sort here since we want small -> large. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); // Options let links = document.createElement('div'); diff --git a/src/js/CustomSlave.js b/src/js/CustomSlave.js index 3bcca823e97f263579a19ddffceab174a675aca5..062878d173945a2f02b097580cd55e717ff52de6 100644 --- a/src/js/CustomSlave.js +++ b/src/js/CustomSlave.js @@ -1,7 +1,7 @@ /** * Contains the parameters for the player's custom slave order. * Some members are ignored by huskSlave (particularly mental properties). - * NOTE: $customSlave/$huskSlave IS NOT A SLAVE. Do not treat them like you would treat an instance of SlaveState. + * NOTE: $customSlave/$huskSlave IS NOT A SLAVE. Do not treat them like you would treat an instance of SlaveState. */ App.Entity.CustomSlaveOrder = class CustomSlaveOrder { constructor() { @@ -193,7 +193,7 @@ App.Entity.CustomSlaveOrder = class CustomSlaveOrder { /** * Checks to see if the custom slave has accidentally been turned into an actual slave object. - * IF THIS FUNCTION RETURNS TRUE, YOU HAVE PROBABLY FUCKED UP A BACKCOMPAT. CHANGE YOUR BACKCOMPAT, NOT THIS FUNCTION! + * IF THIS FUNCTION RETURNS TRUE, YOU HAVE PROBABLY FUCKED UP A BACKCOMPAT. CHANGE YOUR BACKCOMPAT, NOT THIS FUNCTION! * @param {App.Entity.CustomSlaveOrder} slaveOrder * @returns {boolean} */ diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js index 8b0d576020d6447c790221cce521f7d3b207ee3d..406b7a1124938e46901a1383b7fccd4ee055e77b 100644 --- a/src/js/DefaultRules.js +++ b/src/js/DefaultRules.js @@ -1327,7 +1327,12 @@ window.DefaultRules = (function() { flag = false; } break; - + + case "nipple enhancers": + if (!(["inverted", "partially inverted", "cute", "tiny", "puffy"].includes(slave.nipples))) { + flag = false; + } + break; case "breast redistributors": if (slave.boobs - slave.boobsImplant <= 100) { flag = false; @@ -2655,39 +2660,35 @@ window.DefaultRules = (function() { } } if (rule.birthsTat !== undefined && (rule.birthsTat !== null)) { - if (slave.birthsTat !== rule.birthsTat) { - if (rule.birthsTat === "remove") { - if (slave.birthsTat > 0) { - cashX(forceNeg(V.modCost), "slaveMod", slave); - r += `<br>${slave.slaveName}'s birth tallies have been removed.`; - } else if (slave.birthsTat > -1) { - r += `<br>${slave.slaveName} will no longer be tattooed with each birth.`; - } - slave.birthsTat = -1; - } else if (slave.birthsTat > 0) { - r += `<br>${slave.slaveName} will not be tattooed with each birth.`; - } else { + if (rule.birthsTat === "remove") { + if (slave.birthsTat > 0) { + cashX(forceNeg(V.modCost), "slaveMod", slave); + r += `<br>${slave.slaveName}'s birth tallies have been removed.`; + } else if (slave.birthsTat > -1) { + r += `<br>${slave.slaveName} will no longer be tattooed with each birth.`; + } + slave.birthsTat = -1; + } else if (rule.birthsTat === "tally") { + if (slave.birthsTat < 0) { r += `<br>${slave.slaveName} will be tattooed with each birth.`; + slave.birthsTat = 0; } - slave.birthsTat = rule.birthsTat; } } if (rule.abortionTat !== undefined && (rule.abortionTat !== null)) { - if (slave.abortionTat !== rule.abortionTat) { - if (rule.abortionTat === "remove") { - if (slave.abortionTat > 0) { - cashX(forceNeg(V.modCost), "slaveMod", slave); - r += `<br>${slave.slaveName}'s abortion tallies have been removed.`; - } else if (slave.abortionTat > -1) { - r += `<br>${slave.slaveName} will no longer be tattooed with each abortion and miscarriage.`; - } - slave.abortionTat = -1; - } else if (slave.birthsTat > 0) { - r += `<br>${slave.slaveName} will not be tattooed with each abortion and miscarriage.`; - } else { + if (rule.abortionTat === "remove") { + if (slave.abortionTat > 0) { + cashX(forceNeg(V.modCost), "slaveMod", slave); + r += `<br>${slave.slaveName}'s abortion tallies have been removed.`; + } else if (slave.abortionTat > -1) { + r += `<br>${slave.slaveName} will no longer be tattooed with each abortion and miscarriage.`; + } + slave.abortionTat = -1; + } else if (rule.abortionTat === "tally") { + if (slave.abortionTat < 0) { r += `<br>${slave.slaveName} will be tattooed with each abortion and miscarriage.`; + slave.abortionTat = 0; } - slave.abortionTat = rule.abortionTat; } } if ((rule.autoBrand === 1)) { diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js index bfe1313c4b6bacb7b2b37b4e0183ba0a7fc3145e..cf787f4df749f6cc223f12c5d1aa0ed129e451a3 100644 --- a/src/js/SlaveState.js +++ b/src/js/SlaveState.js @@ -38,6 +38,7 @@ App.Entity.RuleState = class RuleState { this.living = "spare"; /** * * "none" + * * "cruel" * * "restrictive" * * "permissive" * * "mandatory" diff --git a/src/js/assayJS.js b/src/js/assayJS.js index 26378fa4a821ee7cf1fe5271a611982bffe45f3c..443245cab40d35fdf0d9db577e6925db32b0b014 100644 --- a/src/js/assayJS.js +++ b/src/js/assayJS.js @@ -272,7 +272,7 @@ window.removeSlave = function removeSlave(index) { /** * @param {App.Entity.SlaveState[]} [slaves] - * @returns {Object.<number, number>} + * @returns {object.<number, number>} */ window.slaves2indices = function slaves2indices(slaves = State.variables.slaves) { return slaves.reduce((acc, slave, i) => { acc[slave.ID] = i; return acc; }, {}); @@ -681,7 +681,7 @@ window.PoliteRudeTitle = function PoliteRudeTitle(slave) { * @returns {string} */ window.SlaveTitle = function SlaveTitle(slave) { - let r = ""; + let r; if (V.newDescriptions === 1) { if (slave.dick > 0 && slave.balls > 0 && slave.boobs > 300 && slave.vagina > -1 && slave.ovaries === 1) { if (jsRandom(1, 100) > 50) { @@ -1534,7 +1534,17 @@ window.SlaveSort = function() { */ /** @returns {slaveComparator} */ function _comparator() { - return comparators[(V.sortSlavesOrder === "ascending" ? 'A' : 'D') + V.sortSlavesBy]; + return _makeStableComparator(comparators[(V.sortSlavesOrder === "ascending" ? 'A' : 'D') + V.sortSlavesBy]); + } + + /** secondary-sort by ascending ID if the primary comparator would return 0 (equal), so we have a guaranteed stable order regardless of input + * @param {slaveComparator} comparator + * @returns {slaveComparator} + */ + function _makeStableComparator(comparator) { + return function(a, b) { + return comparator(a, b) || comparators.AID(a, b); + }; } }(); @@ -1823,3 +1833,13 @@ window.retirementReady = function RetirementReady(slave) { window.isShelterSlave = function isShelterSlave(slave) { return (typeof slave.origin === "string" && slave.origin.includes("Slave Shelter")); }; + +/** + * Returns if a slave appears male, female, or androgynous. + * + * @param {App.Entity.SlaveState} slave + * @returns {number} + */ +window.perceivedGender = function(slave) { + return -1; +}; diff --git a/src/js/assignJS.js b/src/js/assignJS.js index 85f5f48939922e894be1d1c465121de1b3d34199..41a6f112e47371648b24a2e0782b100d55683fe0 100644 --- a/src/js/assignJS.js +++ b/src/js/assignJS.js @@ -24,7 +24,7 @@ window.assignJob = function assignJob(slave, job) { }; /* Tracking for the following cases: */ - if (oldJob !== job && V.assignmentRecords[slave.ID] !== job && oldJob !== "rest") { // Check that there is a real change happening. Sometimes when you send someone to a classroom or something, this fires twice. + if (oldJob !== job && V.assignmentRecords[slave.ID] !== job && oldJob !== "rest") { // Check that there is a real change happening. Sometimes when you send someone to a classroom or something, this fires twice. switch (job.toLowerCase()) { case "be confined in the cellblock": case "cellblock": diff --git a/src/js/descriptionWidgets.js b/src/js/descriptionWidgets.js index b5e14b88c9550150fba1f459a20f3ce46e6f2d5a..915ba3fc73ff8870016ef5a5ece00627de379e46 100644 --- a/src/js/descriptionWidgets.js +++ b/src/js/descriptionWidgets.js @@ -1,3 +1,65 @@ +/** + * @param {App.Entity.SlaveState} slave + * @returns {string} Slave's nails + */ +App.Desc.nails = function(slave) { + /* eslint-disable no-unused-vars*/ + const {He, His, his} = getPronouns(slave); + if (!hasAnyArms(slave)) { + return `${He} has no hands, and thus, no nails.`; + } else if (slave.nails === 1) { + return `${His} nails are long and elegant.`; + } else if (slave.nails === 2) { + return `${His} nails are color-coordinated with ${his} ${slave.hColor} hair.`; + } else if (slave.nails === 3) { + return `${His} nails are sharp and claw-like.`; + } else if (slave.nails === 4) { + return `${His} nails are bright and glittery.`; + } else if (slave.nails === 5) { + return `${His} nails are long and garish, streetwalker-style.`; + } else if (slave.nails === 6) { + return `${His} nails are vivid and eye-catching.`; + } else if (slave.nails === 7) { + return `${His} nails are vivid, eye-catching and color-coordinated with ${his} ${slave.hColor} hair.`; + } else if (slave.nails === 8) { + return `${His} nails are shiny and metallic.`; + } else if (slave.nails === 9) { + return `${His} nails are shiny, metallic and color-coordinated with ${his} ${slave.hColor} hair.`; + } else { + return `${His} nails are neatly clipped.`; + } +}; + +/** + * @param {App.Entity.SlaveState} slave + * @returns {string} Slave's makeup + */ +App.Desc.makeup = function(slave) { + /* eslint-disable no-unused-vars*/ + const {He, His, his} = getPronouns(slave); + if (slave.makeup === 1) { + return `${He}'s wearing minimal makeup.`; + } else if (slave.makeup === 2) { + return `${He}'s wearing expensive, luxurious makeup.`; + } else if (slave.makeup === 3) { + return `${His} makeup is color-coordinated with ${his} ${slave.hColor} hair.`; + } else if (slave.makeup === 4) { + return `${He}'s wearing stereotypical, garish streetwalker makeup.`; + } else if (slave.makeup === 5) { + return `${He}'s wearing eye-catching neon makeup.`; + } else if (slave.makeup === 6) { + return `${His} neon makeup is color-coordinated with ${his} ${slave.hColor} hair.`; + } else if (slave.makeup === 7) { + return `${He}'s wearing expensive, metallic makeup.`; + } else if (slave.makeup === 8) { + return `${His} metallic makeup is color-coordinated with ${his} ${slave.hColor} hair.`; + } else if (slave.lipsTat === "permanent makeup") { + return `${His} face appears to bear very heavy, slutty makeup, but on closer inspection, the makeup is actually tattooed on.`; + } else { + return `${His} face is makeup-free.`; + } +}; + /** * @param {App.Entity.SlaveState} slave * @returns {string} Slave's eyes @@ -315,6 +377,7 @@ App.Desc.ageAndHealth = function(slave) { let woman = pronouns.woman; let He = capFirstChar(he); let His = capFirstChar(his); + let array; /* eslint-enable */ let age; let birthday = ""; @@ -346,49 +409,46 @@ App.Desc.ageAndHealth = function(slave) { if (H.shortDamage !== 0 || H.longDamage !== 0 || H.condition < 0) { r += ` Upon closer inspection you note that ${he}`; + array = []; if (H.shortDamage >= 100) { - r += ` looks <span class="red">absolutely brutalized</span> and will never be quite the way ${he} was`; + array.push(`looks <span class="red">absolutely brutalized</span> and will never be quite the way ${he} was`); } else if (H.shortDamage >= 70) { - r += ` is <span class="red">gravely injured</span> with assured lasting effects`; + array.push(`is <span class="red">gravely injured</span> with assured lasting effects`); } else if (H.shortDamage >= 40) { - r += ` is <span class="red">seriouly injured</span> with some lasting effects`; + array.push(`is <span class="red">seriouly injured</span> with some lasting effects`); } else if (H.shortDamage >= 20) { - r += ` is <span class="orange">injured</span>`; + array.push(`is <span class="orange">injured</span>`); } else if (H.shortDamage > 0) { - r += ` seems to have suffered a <span class="yellow">minor injury</span> recently`; - } - - if (H.shortDamage !== 0 && H.longDamage !== 0 && H.condition < 0) { - r += `,`; - } else if ((H.shortDamage !== 0 && H.longDamage !== 0) || (H.shortDamage !== 0 && H.condition < 0)) { - r += ` and`; + array.push(`seems to have suffered a <span class="yellow">minor injury</span> recently`); } if (H.longDamage >= 70) { - r += ` is suffering heavily under accumulated <span class="red">permanent health problems</span>`; + array.push(`is suffering heavily under accumulated <span class="red">permanent health problems</span>`); } else if (H.longDamage >= 40) { - r += ` has some clear <span class="red">permanent health issues</span>`; + array.push(`has some clear <span class="red">permanent health issues</span>`); } else if (H.longDamage >= 20) { - r += ` shows signs of <span class="orange">lasting health problems</span>`; + array.push(`shows signs of <span class="orange">lasting health problems</span>`); } else if (H.longDamage > 0) { - r += ` carries some <span class="yellow">minor niggles</span>`; - } - - if ((H.shortDamage !== 0 || H.longDamage !== 0) && H.condition < 0) { - r += ` and`; + array.push(`carries some <span class="yellow">minor niggles</span>`); } if (H.condition < -80 && H.shortDamage !== 0 && H.longDamage !== 0) { - r += ` has been treated so badly ${he} <span class="red">is close to the brink</span>`; + array.push(`has been treated so badly ${he} <span class="red">is close to the brink</span>`); } else if (H.condition < -50) { - r += ` appears to be in <span class="red">terrible condition</span>`; + array.push(`appears to be in <span class="red">terrible condition</span>`); } else if (H.condition < -20) { - r += ` appears to be in <span class="orange">poor condition</span>`; + array.push(`appears to be in <span class="orange">poor condition</span>`); } else if (H.condition < 0) { - r += ' could be in <span class="yellow">better condition</span>'; + array.push('could be in <span class="yellow">better condition</span>'); } - r += `.`; + if (array.length === 3) { + r += (` ${array[0]}, ${array[1]} and ${array[2]}.`); + } else if (array.length === 2) { + r += (` ${array[0]} and ${array[1]}.`); + } else if (array.length === 1) { + r += (` ${array[0]}.`); + } } if (H.tired > 30) { @@ -402,11 +462,11 @@ App.Desc.ageAndHealth = function(slave) { } } age = slave.actualAge + 1; - r += ` ${He} is `; + r += ` ${He} `; if (slave.birthWeek >= 52 && V.seeAge) { - r += `going to turn ${age} this week,`; + r += `is going to turn ${age} this week,`; } else if (slave.actualAge < 3) { - r += `an infant, only `; + r += `is an infant, only `; if (V.showAgeDetail) { if (!slave.actualAge) { r += `${0 + V.week-slave.weekAcquired} weeks old${birthday}. `; @@ -425,30 +485,30 @@ App.Desc.ageAndHealth = function(slave) { } } } else if (slave.actualAge < 5) { - r += `a toddler, `; + r += `is a toddler, `; if (V.showAgeDetail) { r += `${num(slave.actualAge)} years old${birthday}. `; } else { r += `only ${num(slave.actualAge)} years old. `; } } else if (slave.actualAge < 13) { - r += `a little ${boy}, `; + r += `is a little ${boy}, `; if (V.showAgeDetail) { r += `${num(slave.actualAge)} years old${birthday}. `; } else { r += `only ${num(slave.actualAge)} years old. `; } } else if (slave.actualAge < 16) { - r += `almost a child, `; + r += `is almost a child, `; if (V.showAgeDetail) { r += `${num(slave.actualAge)} years old${birthday}. `; } else { r += `less than 17 years old. `; } } else if (slave.actualAge < 17) { - r += `young and fresh at ${num(slave.actualAge)}${birthday}. `; + r += `is young and fresh at ${num(slave.actualAge)}${birthday}. `; } else if (slave.actualAge < 18) { - r += `young, fresh, and nearly 18${birthday}`; + r += `is young, fresh, and nearly 18${birthday}`; if (V.showAgeDetail && V.seeAge !== 0) { if (V.seeAge) { r += ` and people are already beginning to eye ${him}`; @@ -461,19 +521,19 @@ App.Desc.ageAndHealth = function(slave) { } else if (slave.birthWeek < 4 && V.seeAge) { r += `only turned ${num(slave.actualAge)} this month. `; } else { - r += `${num(slave.actualAge)} years old${birthday}. `; + r += `is ${num(slave.actualAge)} years old${birthday}. `; } } else if (slave.actualAge < 20) { - r += `in ${his} final year as a teenager at age 19${birthday}. `; + r += `is in ${his} final year as a teenager at age 19${birthday}. `; } else if (slave.actualAge < 26) { - r += `a young ${woman}, `; + r += `is a young ${woman}, `; if (V.showAgeDetail) { r += `${num(slave.actualAge)} years old${birthday}. `; } else { r += `in ${his} early twenties. `; } } else if (slave.actualAge < 30) { - r += `a younger ${woman}, `; + r += `is a younger ${woman}, `; if (V.showAgeDetail) { r += `${num(slave.actualAge)} years old${birthday}. `; } else { @@ -486,14 +546,14 @@ App.Desc.ageAndHealth = function(slave) { r += `in ${his} early thirties. `; } } else if (slave.actualAge < 40) { - r += `middle-aged for a slave, `; + r += `is middle-aged for a slave, `; if (V.showAgeDetail) { r += `at ${num(slave.actualAge)} years old${birthday}. `; } else { r += `in ${his} late thirties. `; } } else { - r += `old for a slave, `; + r += `is old for a slave, `; if (V.showAgeDetail) { r += `at ${num(slave.actualAge)} years old${birthday}. `; } else { diff --git a/src/js/economyJS.js b/src/js/economyJS.js index 9f222c4126c9ca3dc90447ce1500f0dfb2ae6e32..bffc783d00f9c77d5e6ce42228de726c19204986 100644 --- a/src/js/economyJS.js +++ b/src/js/economyJS.js @@ -1,32 +1,48 @@ window.LivingRule = Object.freeze({LUXURIOUS: 'luxurious', NORMAL: 'normal', SPARE: 'spare'}); window.Job = Object.freeze({ - DAIRY: 'work in the dairy', - MILKMAID: 'be the Milkmaid', - MASTER_SUITE: 'serve in the master suite', - CONCUBINE: 'be your Concubine', - BABY_FACTORY: 'labor in the production line', - BROTHEL: 'work in the brothel', - MADAM: 'be the Madam', + // Penthouse Assignments + REST: 'rest', + FUCKTOY: 'please you', + CLASSES: 'take classes', + HOUSE: 'be a servant', + WHORE: 'whore', + PUBLIC: 'serve the public', + SUBORDINATE: 'be a subordinate slave', + MILKED: 'get milked', + GLORYHOLE: 'work a glory hole', + CONFINEMENT: 'stay confined', + // Leadership Assignments + BODYGUARD: 'guard you', + HEADGIRL: 'be your Head Girl', + RECRUITER: 'recruit girls', + AGENT: 'be your agent', + // Facility Assignments ARCADE: 'be confined in the arcade', - SERVANT: 'work as a servant', - SERVER: 'be a servant', - STEWARD: 'be the Stewardess', - CLUB: 'serve in the club', - DJ: 'be the DJ', - JAIL: 'be confined in the cellblock', + MADAM: 'be the Madam', + BROTHEL: 'work in the brothel', WARDEN: 'be the Wardeness', - CLINIC: 'get treatment in the clinic', + CELLBLOCK: 'be confined in the cellblock', + DJ: 'be the DJ', + CLUB: 'serve in the club', NURSE: 'be the Nurse', - HGTOY: 'live with your Head Girl', - SCHOOL: 'learn in the schoolroom', + CLINIC: 'get treatment in the clinic', + MILKMAID: 'be the Milkmaid', + DAIRY: 'work in the dairy', + FARMER: 'be the Farmer', + FARMYARD: 'work as a farmhand', + HEADGIRLSUITE: 'live with your Head Girl', + CONCUBINE: 'be your Concubine', + MASTERSUITE: 'serve in the master suite', + MATRON: 'be the Matron', + NURSERY: 'work as a nanny', TEACHER: 'be the Schoolteacher', + SCHOOL: 'learn in the schoolroom', + STEWARD: 'be the Stewardess', + QUARTER: 'work as a servant', + ATTENDANT: 'be the Attendant', SPA: 'rest in the spa', - ATTEND: 'be the Attendant', - NANNY: 'work as a nanny', - MATRON: 'be the Matron', - FARMYARD: 'work as a farmhand', - FARMER: 'be the Farmer', - REST: 'rest' + // Does this one exist? + BABY_FACTORY: 'labor in the production line', }); window.PersonalAttention = Object.freeze({ TRADE: 'trading', @@ -38,6 +54,178 @@ window.PersonalAttention = Object.freeze({ HACKING: 'hacking' }); +window.CategoryAssociatedGroup = Object.freeze({ + PENTHOUSE: [ + 'slaveAssignmentRest', + 'slaveAssignmentRestVign', + 'slaveAssignmentFucktoy', + 'slaveAssignmentClasses', + 'slaveAssignmentHouse', + 'slaveAssignmentWhore', + 'slaveAssignmentWhoreVign', + 'slaveAssignmentPublic', + 'slaveAssignmentPublicVign', + 'slaveAssignmentSubordinate', + 'slaveAssignmentMilked', + 'slaveAssignmentMilkedVign', + 'slaveAssignmentExtraMilk', + 'slaveAssignmentExtraMilkVign', + 'slaveAssignmentGloryhole', + 'slaveAssignmentConfinement' + ], + HEADGIRLSUITE: [ + 'slaveAssignmentHeadgirl', + 'slaveAssignmentHeadgirlsuite' + ], + RECRUITER: [ + 'slaveAssignmentRecruiter' + ], + DOJO: [ + 'slaveAssignmentBodyguard' + ], + MASTERSUITE: [ + 'masterSuite', + 'slaveAssignmentConcubine', + 'slaveAssignmentMastersuite' + ], + AGENT: [ + 'slaveAssignmentAgent' + ], + ARCADE: [ + 'arcade', + 'slaveAssignmentArcade' + ], + BROTHEL: [ + 'brothel', + 'slaveAssignmentMadam', + 'slaveAssignmentMadamVign', + 'slaveAssignmentBrothel', + 'slaveAssignmentBrothelVign', + 'brothelAds' + ], + CELLBLOCK: [ + 'cellblock', + 'slaveAssignmentWarden', + 'slaveAssignmentCellblock' + ], + CLUB: [ + 'club', + 'slaveAssignmentDj', + 'slaveAssignmentClub', + 'slaveAssignmentClubVign', + 'clubAds' + ], + CLINIC: [ + 'clinic', + 'slaveAssignmentNurse', + 'slaveAssignmentClinic' + ], + DAIRY: [ + 'dairy', + 'slaveAssignmentMilkmaid', + 'slaveAssignmentDairy', + 'slaveAssignmentDairyVign' + ], + FARMYARD: [ + 'farmyard', + 'slaveAssignmentFarmer', + 'slaveAssignmentFarmyard', + 'slaveAssignmentFarmyardVign', + ], + INCUBATOR: [ + 'incubator', + 'incubatorSlaves' + ], + NURSERY: [ + 'nursery', + 'slaveAssignmentMatron', + 'slaveAssignmentNursery', + 'slaveAssignmentNurseryVign' + ], + PIT: [ + 'pit' + ], + PROSTHETICLAB: [ + 'lab', + 'labResearch', + 'labScientists', + 'labMenials' + ], + SCHOOLROOM: [ + 'school', + 'slaveAssignmentTeacher', + 'slaveAssignmentSchool' + ], + SERVANTSQUARTERS: [ + 'servantsQuarters', + 'slaveAssignmentSteward', + 'slaveAssignmentQuarter', + 'slaveAssignmentQuarterVign' + ], + SPA: [ + 'spa', + 'slaveAssignmentAttendant', + 'slaveAssignmentSpa' + ], + SLAVES: [ + 'porn', + 'slaveMod', + 'slaveSurgery', + 'birth' + ], + LABOR: [ + 'menialTrades', + 'fuckdolls', + 'menialBioreactors' + ], + FLIPPING: [ + 'slaveTransfer', + 'menialTransfer', + 'fuckdollsTransfer', + 'menialBioreactorsTransfer', + 'menialTransferA', + 'fuckdollsTransferA', + 'menialBioreactorsTransferA', + 'menialRetirement', + 'labScientistsTransfer', + 'babyTransfer' + ], + FINANCIALS: [ + 'weather', + 'rents', + 'fines', + 'event', + 'capEx', + 'futureSocieties', + 'schoolBacking', + 'war', + 'cheating' + ], + POLICIES: [ + 'policies' + ], + EDICTS: [ + 'edicts' + ], + PERSONALFINANCE: [ + 'personalBusiness', + 'personalLivingExpenses', + 'PCSkills', + 'PCtraining', + 'PCmedical', + 'citizenOrphanage', + 'privateOrphanage', + 'stocks', + 'stocksTraded' + ], + SECURITY: [ + 'mercenaries', + 'securityExpansion', + 'specialForces', + 'peacekeepers' + ] +}); + window.calculateCosts = (function() { return { predict: predictCost, @@ -47,31 +235,34 @@ window.calculateCosts = (function() { function predictCost() { let totalCosts = ( getBrothelCosts() + - getBrothelAdsCosts() + - getArcadeCosts() + - getClubCosts() + - getClubAdsCosts() + - getDairyCosts() + - getIncubatorCosts() + - getServantsQuartersCosts() + - getMasterSuiteCosts() + - getNurseryCosts() + - getFarmyardCosts() + - getSecurityExpansionCost() + - getLifestyleCosts() + - getFSCosts() + - getCitizenOrphanageCosts() + - getPrivateOrphanageCosts() + - getPeacekeeperCosts() + - getMercenariesCosts() + - getMenialRetirementCosts() + - getRecruiterCosts() + - getSchoolCosts() + - getPolicyCosts() + - getProstheticsCosts() + - getPCTrainingCosts() + - getPCCosts() + - predictTotalSlaveCosts() + getBrothelAdsCosts() + + getArcadeCosts() + + getClubCosts() + + getClubAdsCosts() + + getDairyCosts() + + getIncubatorCosts() + + getIncubatorSlavesCosts() + + getServantsQuartersCosts() + + getMasterSuiteCosts() + + getNurseryCosts() + + getFarmyardCosts() + + getSecurityExpansionCost() + + getLifestyleCosts() + + getFSCosts() + + getCitizenOrphanageCosts() + + getPrivateOrphanageCosts() + + getPeacekeeperCosts() + + getMercenariesCosts() + + getMenialRetirementCosts() + + getRecruiterCosts() + + getSchoolCosts() + + getPolicyCosts() + + getLabCosts() + + getLabScientistsCosts() + + getLabMenialsCosts() + + getPCTrainingCosts() + + getPCCosts() + + predictTotalSlaveCosts() ); // these two apply a multiplicative effect to all costs so far. @@ -100,6 +291,7 @@ window.calculateCosts = (function() { cashX(forceNeg(getClubAdsCosts()), "clubAds"); cashX(forceNeg(getDairyCosts()), "dairy"); cashX(forceNeg(getIncubatorCosts()), "incubator"); + cashX(forceNeg(getIncubatorSlavesCosts()), "incubatorSlaves"); cashX(forceNeg(getServantsQuartersCosts()), "servantsQuarters"); cashX(forceNeg(getMasterSuiteCosts()), "masterSuite"); cashX(forceNeg(getNurseryCosts()), "nursery"); @@ -112,10 +304,12 @@ window.calculateCosts = (function() { cashX(forceNeg(getPeacekeeperCosts()), "peacekeepers"); cashX(forceNeg(getMercenariesCosts()), "mercenaries"); cashX(forceNeg(getMenialRetirementCosts()), "menialRetirement"); - cashX(forceNeg(getRecruiterCosts()), "recruiter"); + cashX(forceNeg(getRecruiterCosts()), "slaveAssignmentRecruiter"); cashX(forceNeg(getSchoolCosts()), "schoolBacking"); cashX(forceNeg(getPolicyCosts()), "policies"); - cashX(forceNeg(getProstheticsCosts()), "lab"); + cashX(forceNeg(getLabCosts()), "lab"); + cashX(forceNeg(getLabScientistsCosts()), "labScientists"); + cashX(forceNeg(getLabMenialsCosts()), "labMenials"); cashX(forceNeg(getPCTrainingCosts()), "PCtraining"); cashX(forceNeg(getPCCosts()), "PCmedical"); getTotalSlaveCosts(); @@ -132,6 +326,7 @@ window.calculateCosts = (function() { // in the old order these were applied after multiplication. Not sure if deliberate, but I'm leaving it for now. cashX(forceNeg(getSFCosts()), "specialForces"); cashX(forceNeg(getWeatherCosts()), "weather"); + return (oldCash - State.variables.cash); } @@ -173,31 +368,164 @@ window.calculateCosts = (function() { numberServed += getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]); }); + /* Implement a system that calculates and subtracts slave upkeep per assignment // Find the total slave upkeep and pay for it for (const slave of V.slaves) { slaveCost = getSlaveCost(slave); loopCosts += slaveCost; cashX(forceNeg(slaveCost), "slaveUpkeep", slave); } + */ + // Find the total slave upkeep, calculate and subtract per assignment + for (const slave of V.slaves) { + slaveCost = getSlaveCost(slave); + loopCosts += slaveCost; + // Switch to subtract and track upkeep per assignment + switch (slave.assignment) { + // Penthouse Assignments + case Job.REST: + cashX(forceNeg(slaveCost), "slaveAssignmentRest", slave); + break; + case Job.FUCKTOY: + cashX(forceNeg(slaveCost), "slaveAssignmentFucktoy", slave); + break; + case Job.CLASSES: + cashX(forceNeg(slaveCost), "slaveAssignmentClasses", slave); + break; + case Job.HOUSE: + cashX(forceNeg(slaveCost), "slaveAssignmentHouse", slave); + break; + case Job.WHORE: + cashX(forceNeg(slaveCost), "slaveAssignmentWhore", slave); + break; + case Job.PUBLIC: + cashX(forceNeg(slaveCost), "slaveAssignmentPublic", slave); + break; + case Job.SUBORDINATE: + cashX(forceNeg(slaveCost), "slaveAssignmentSubordinate", slave); + break; + case Job.MILKED: + cashX(forceNeg(slaveCost), "slaveAssignmentMilked", slave); + break; + case Job.GLORYHOLE: + cashX(forceNeg(slaveCost), "slaveAssignmentGloryhole", slave); + break; + case Job.CONFINEMENT: + cashX(forceNeg(slaveCost), "slaveAssignmentConfinement", slave); + break; + // Leadership Assignments + case Job.BODYGUARD: + cashX(forceNeg(slaveCost), "slaveAssignmentBodyguard", slave); + break; + case Job.HEADGIRL: + cashX(forceNeg(slaveCost), "slaveAssignmentHeadgirl", slave); + break; + case Job.RECRUITER: + cashX(forceNeg(slaveCost), "slaveAssignmentRecruiter", slave); + break; + case Job.AGENT: + cashX(forceNeg(slaveCost), "slaveAssignmentAgent", slave); + break; + // Facility Assignments + case Job.ARCADE: + cashX(forceNeg(slaveCost), "slaveAssignmentArcade", slave); + break; + case Job.MADAM: + cashX(forceNeg(slaveCost), "slaveAssignmentMadam", slave); + break; + case Job.BROTHEL: + cashX(forceNeg(slaveCost), "slaveAssignmentBrothel", slave); + break; + case Job.WARDEN: + cashX(forceNeg(slaveCost), "slaveAssignmentWarden", slave); + break; + case Job.CELLBLOCK: + cashX(forceNeg(slaveCost), "slaveAssignmentCellblock", slave); + break; + case Job.DJ: + cashX(forceNeg(slaveCost), "slaveAssignmentDj", slave); + break; + case Job.CLUB: + cashX(forceNeg(slaveCost), "slaveAssignmentClub", slave); + break; + case Job.NURSE: + cashX(forceNeg(slaveCost), "slaveAssignmentNurse", slave); + break; + case Job.CLINIC: + cashX(forceNeg(slaveCost), "slaveAssignmentClinic", slave); + break; + case Job.MILKMAID: + cashX(forceNeg(slaveCost), "slaveAssignmentMilkmaid", slave); + break; + case Job.DAIRY: + cashX(forceNeg(slaveCost), "slaveAssignmentDairy", slave); + break; + case Job.FARMER: + cashX(forceNeg(slaveCost), "slaveAssignmentFarmer", slave); + break; + case Job.FARMYARD: + cashX(forceNeg(slaveCost), "slaveAssignmentFarmyard", slave); + break; + case Job.HEADGIRLSUITE: + cashX(forceNeg(slaveCost), "slaveAssignmentHeadgirlsuite", slave); + break; + case Job.CONCUBINE: + cashX(forceNeg(slaveCost), "slaveAssignmentConcubine", slave); + break; + case Job.MASTERSUITE: + cashX(forceNeg(slaveCost), "slaveAssignmentMastersuite", slave); + break; + case Job.MATRON: + cashX(forceNeg(slaveCost), "slaveAssignmentMatron", slave); + break; + case Job.NURSERY: + cashX(forceNeg(slaveCost), "slaveAssignmentNursery", slave); + break; + case Job.TEACHER: + cashX(forceNeg(slaveCost), "slaveAssignmentTeacher", slave); + break; + case Job.SCHOOL: + cashX(forceNeg(slaveCost), "slaveAssignmentSchool", slave); + break; + case Job.STEWARD: + cashX(forceNeg(slaveCost), "slaveAssignmentSteward", slave); + break; + case Job.QUARTER: + cashX(forceNeg(slaveCost), "slaveAssignmentQuarter", slave); + break; + case Job.ATTENDANT: + cashX(forceNeg(slaveCost), "slaveAssignmentAttendant", slave); + break; + case Job.SPA: + cashX(forceNeg(slaveCost), "slaveAssignmentSpa", slave); + break; + case Job.BABY_FACTORY: + cashX(forceNeg(slaveCost), "slaveAssignmentBaby_factory", slave); + break; + default: + cashX(forceNeg(slaveCost), "slaveAssignmentUndefined", slave); + break; + } + } // Calculate the servant reduction and credit them for it const reducibleUpkeep = Math.trunc(loopCosts * 0.2); V.ServQiIDs.forEach(ID => { if (V.slaves.length > numberServed) { slaveCostMinor = Math.trunc(reducibleUpkeep / V.slaves.length * getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]])); - cashX(Math.abs(slaveCostMinor), "houseServant", V.slaves[V.slaveIndices[ID]]); + cashX(Math.abs(slaveCostMinor), "slaveAssignmentQuarter", V.slaves[V.slaveIndices[ID]]); } else { slaveCostMinor = Math.trunc(reducibleUpkeep / numberServed * getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]])); - cashX(Math.abs(slaveCostMinor), "houseServant", V.slaves[V.slaveIndices[ID]]); + cashX(Math.abs(slaveCostMinor), "slaveAssignmentQuarter", V.slaves[V.slaveIndices[ID]]); } }); V.JobIDArray["be a servant"].forEach(ID => { if (V.slaves.length > numberServed) { slaveCostMinor = Math.trunc(reducibleUpkeep / V.slaves.length * getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]])); - cashX(Math.abs(slaveCostMinor), "houseServant", V.slaves[V.slaveIndices[ID]]); + cashX(Math.abs(slaveCostMinor), "slaveAssignmentHouse", V.slaves[V.slaveIndices[ID]]); } else { slaveCostMinor = Math.trunc(reducibleUpkeep / numberServed * getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]])); - cashX(Math.abs(slaveCostMinor), "houseServant", V.slaves[V.slaveIndices[ID]]); + cashX(Math.abs(slaveCostMinor), "slaveAssignmentHouse", V.slaves[V.slaveIndices[ID]]); } }); // nothing to return, cashX already billed. @@ -235,14 +563,19 @@ window.calculateCosts = (function() { } function getIncubatorCosts() { + let costs = 0; + if (V.incubator > 0) { + costs += ((V.incubatorWeightSetting + V.incubatorMusclesSetting + V.incubatorReproductionSetting + V.incubatorGrowthStimsSetting) * 500); + } + return costs; + } + + function getIncubatorSlavesCosts() { const facIncMultiplier = V.facilityCost * V.incubator; let costs = (facIncMultiplier * 10); costs += (0.2 * V.incubatorUpgradeWeight + 0.2 * V.incubatorUpgradeMuscles + 0.2 * V.incubatorUpgradeReproduction + 0.2 * V.incubatorUpgradeGrowthStims + 0.5 * V.incubatorUpgradeSpeed) * facIncMultiplier; - if (V.incubator > 0) { - costs += ((V.incubatorWeightSetting + V.incubatorMusclesSetting + V.incubatorReproductionSetting + V.incubatorGrowthStimsSetting) * 500); - } return costs; } @@ -459,10 +792,17 @@ window.calculateCosts = (function() { return costs; } - function getProstheticsCosts() { - return ((100 * State.variables.researchLab.maxSpace) + (300 * State.variables.researchLab.hired) + (100 * State.variables.researchLab.hired)); + function getLabCosts() { + return (100 * State.variables.researchLab.maxSpace); } + function getLabScientistsCosts() { + return (300 * State.variables.researchLab.hired); + } + + function getLabMenialsCosts() { + return (100 * State.variables.researchLab.hired); + } // player expenses function getPCTrainingCosts() { @@ -521,13 +861,9 @@ window.calculateCosts = (function() { return Math.trunc(cost); } - function getSFCosts() { - let costs = 0; - if (State.variables.SF.Toggle && State.variables.SF.Active >= 1) { - const SFSubsidy = App.SF.AAR(0); - if (SFSubsidy > 0) { - costs += Math.ceil(5000 * (1 + ((State.variables.SF.Squad.Troops / 100) + (State.variables.SF.Size / 100)))); - } + function getSFCosts(costs = 0) { + if (V.SF.Toggle && V.SF.Active >= 1 && App.SF.AAR(0)) { + costs += Math.ceil(5000 * (1 + ((V.SF.Squad.Troops / 100) + (V.SF.Size / 100)))); } return costs; } @@ -668,7 +1004,7 @@ window.getSlaveCostArray = function(s) { case Job.DJ: case Job.NURSE: case Job.WARDEN: - case Job.ATTEND: + case Job.ATTENDANT: case Job.STEWARD: case Job.MILKMAID: case Job.FARMER: @@ -777,7 +1113,7 @@ window.getSlaveCostArray = function(s) { // Extra feeding costs to support pregnancy are covered by dairy feeders. // TODO: Include them here anyway? retval.push({text: "Extra feeding costs to support pregnancy are covered by dairy feeders", value: 0}); - } else if ((s.assignment === Job.MASTER_SUITE || s.assignment === Job.CONCUBINE) && + } else if ((s.assignment === Job.MASTERSUITE || s.assignment === Job.CONCUBINE) && State.variables.masterSuiteUpgradePregnancy === 1) { // Extra feeding costs to support pregnancy are covered by master suite luxuries. // TODO: Include them here anyway? @@ -1328,7 +1664,7 @@ window.slaveJobValues = function(lowerClassSexDemandRef, middleClassSexDemandRef // Glory hole slaves adding to 'arcade' V.JobIDArray["work a glory hole"].forEach(ID => { const s = V.slaves[V.slaveIndices[ID]]; - s.sexAmount = Math.trunc((normalRandInt(600, 20) + (4 - s.anus) * 10 + (4 - s.vagina) * 10 + Math.trunc(s.health.condition / 2)) * 0.75); + s.sexAmount = Math.trunc(restEffects(s, 20) * ((normalRandInt(600, 20) + (4 - s.anus) * 10 + (4 - s.vagina) * 10 + Math.trunc(s.health.condition / 2)) * 0.75)); tiredFucks(s); slaveJobValues.arcade += s.sexAmount; }); @@ -1337,7 +1673,6 @@ window.slaveJobValues = function(lowerClassSexDemandRef, middleClassSexDemandRef V.ArcadeiIDs.forEach(ID => { const s = V.slaves[V.slaveIndices[ID]]; s.sexAmount = (normalRandInt(600, 20) + (4 - (s.anus - 2 * V.arcadeUpgradeInjectors)) * 10 + (4 - (s.vagina - 2 * V.arcadeUpgradeInjectors)) * 10 + Math.trunc(s.health.condition / 2)); - tiredFucks(s); slaveJobValues.arcade += s.sexAmount; }); @@ -1989,6 +2324,17 @@ window.cashX = function(cost, what, who) { who.lastWeeksCashIncome += cost; who.lifetimeCashIncome += cost; } + + // gather totals + V.lastWeeksCashProfits[what] += cost; + for (var key of Object.keys(CategoryAssociatedGroup)) { + if (CategoryAssociatedGroup[key].contains(what)) { + V.lastWeeksGatheredTotals[key][what].income += cost; + V.lastWeeksGatheredTotals[key][what].profits += cost; + V.lastWeeksGatheredTotals[key].income += cost; + V.lastWeeksGatheredTotals[key].profits += cost; + } + } } else if (cost < 0) { // EXPENSES // record the action if (typeof V.lastWeeksCashExpenses[what] !== 'undefined') { @@ -2002,9 +2348,21 @@ window.cashX = function(cost, what, who) { if (what === "slaveTransfer") { who.slaveCost = cost; } else { + who.lastWeeksCashExpenses = cost; who.lifetimeCashExpenses += cost; } } + + // gather totals + V.lastWeeksCashProfits[what] += cost; + for (var key of Object.keys(CategoryAssociatedGroup)) { + if (CategoryAssociatedGroup[key].contains(what)) { + V.lastWeeksGatheredTotals[key][what].expenses += cost; + V.lastWeeksGatheredTotals[key][what].profits += cost; + V.lastWeeksGatheredTotals[key].expenses += cost; + V.lastWeeksGatheredTotals[key].profits += cost; + } + } } return cost; }; @@ -2166,7 +2524,7 @@ window.supplyPoliciesReport = function(NPCclass) { const varName = `${NPCclass}Class`; const className = NPCclass !== 'top' ? `<b>${NPCclass} class citizens</b>` : `<b>arcology's millionaires</b>`; const dissatisfaction = `and their <span class='red'>dissatisfaction</span> with you is rising.`; - let overSupply = 0; + let overSupply = 0; if (V.sexDemandResult[varName] < 350) { r += `Your ${className} have <span class='red'>far too few options for sexual relief</span> inside your arcology`; @@ -2200,7 +2558,7 @@ window.supplyPoliciesReport = function(NPCclass) { if (overSupply > 0) { r += ` and the arcology provides ${overSupply/10}% more sexual services than required which <span class='red'>drives prices down</span>`; } - r += `, ${V.NPCMarketShare[varName]/10 === V.sexDemandResult[varName]/10 ? `the entire` : `${V.NPCMarketShare[varName]/10}% of the`} market is serviced by other suppliers operating inside your arcology.</i><br>`; + r += `, ${V.NPCMarketShare[varName]/10 === V.sexDemandResult[varName]/10 ? `the entire` : `${V.NPCMarketShare[varName]/10}% of the`} market is serviced by other suppliers operating inside your arcology.</i><br>`; // charge supply barriers (unreported, since it's a flat amount that you were told when you enacted the policy) const supplyCosts = [0, 1000, 5000, 20000, 60000]; @@ -2224,10 +2582,10 @@ window.supplyPoliciesReport = function(NPCclass) { }; window.ownershipReport = function({sidebar}) { - let tint, warrning = false, detail = `${V.arcologies[0].ownership}%`; + let tint, warning = false, detail = `${V.arcologies[0].ownership}%`; detail += V.assistant.power >= 1 && V.arcologies[0].ownership < 100 ? `:${V.arcologies[0].minority}%` : ``; if (V.arcologies[0].ownership < 100 && V.arcologies[0].minority+5 >= V.arcologies[0].ownership) { - tint = 'red'; warrning = true; + tint = 'red'; warning = true; } else if (V.arcologies[0].ownership >= V.arcologies[0].minority+10) { tint = 'yellowgreen'; } else if (V.arcologies[0].ownership >= V.arcologies[0].minority) { @@ -2242,7 +2600,7 @@ window.ownershipReport = function({sidebar}) { } else { r += `and there are no other significant holders.`; } - return r += warrning ? `<span class="warning"> A dangerously narrow margin of control.</span>` : ``; + return r += warning ? `<span class="warning"> A dangerously narrow margin of control.</span>` : ``; } }; @@ -2250,6 +2608,15 @@ window.setupLastWeeksCash = function() { V.lastWeeksCashIncome = new App.Data.Records.LastWeeksCash(); V.lastWeeksCashExpenses = new App.Data.Records.LastWeeksCash(); V.lastWeeksCashProfits = new App.Data.Records.LastWeeksCash(); + + // Here we reset our tracked totals on week end, and add the default categories to all objects + V.lastWeeksGatheredTotals = {}; + for (var key of Object.keys(CategoryAssociatedGroup)){ + V.lastWeeksGatheredTotals[key] = {income: 0, expenses: 0, profits: 0}; + for (var subKey of Object.keys(new App.Data.Records.LastWeeksCash())) { + V.lastWeeksGatheredTotals[key][subKey] = {income: 0, expenses: 0, profits: 0}; + } + } }; window.setupLastWeeksRep = function() { diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js index 9de37f261ef58085f90892c72ac36474bf93dbfb..e6d115e243d23c14c8cf5336dcf9213c37098901 100644 --- a/src/js/eventSelectionJS.js +++ b/src/js/eventSelectionJS.js @@ -376,11 +376,13 @@ window.generateRandomEventPoolStandard = function(eventSlave) { } } - if (eventSlave.face >= -10) { - if (eventSlave.devotion >= 10) { - if (["serve the public", "whore"].includes(eventSlave.assignment)) { - if (State.variables.REUglyCheckinIDs.includes(eventSlave.ID)) { - State.variables.RECIevent.push("ugly"); + if (canSee(eventSlave)) { + if (eventSlave.face >= -10) { + if (eventSlave.devotion >= 10) { + if (["serve the public", "whore"].includes(eventSlave.assignment)) { + if (State.variables.REUglyCheckinIDs.includes(eventSlave.ID)) { + State.variables.RECIevent.push("ugly"); + } } } } @@ -1185,16 +1187,6 @@ window.generateRandomEventPoolStandard = function(eventSlave) { } } - if (eventSlave.muscles > 30) { - if (eventSlave.weight <= 10) { - if (eventSlave.anus !== 0 || State.variables.PC.dick === 0) { - if (eventSlave.vagina !== -1 || State.variables.PC.dick === 0) { - State.variables.RESSevent.push("muscles"); - } - } - } - } - if (eventSlave.devotion >= -20) { if (eventSlave.lactation > 1) { if (canDoVaginal(eventSlave) || canDoAnal(eventSlave)) { @@ -1305,12 +1297,6 @@ window.generateRandomEventPoolStandard = function(eventSlave) { } } - if (eventSlave.assignment === "please you") { - if (eventSlave.devotion > 20) { - State.variables.RESSevent.push("lazy evening"); - } - } - if (eventSlave.height < (Height.mean(eventSlave) * 0.95)) { if (eventSlave.physicalAge > 12) { if (canDoAnal(eventSlave)) { @@ -2555,16 +2541,6 @@ window.generateRandomEventPoolServant = function(eventSlave) { } } - if (eventSlave.muscles > 30) { - if (eventSlave.weight <= 10) { - if (eventSlave.anus !== 0 || State.variables.PC.dick === 0) { - if (eventSlave.vagina !== 0 || State.variables.PC.dick === 0) { - State.variables.RESSevent.push("muscles"); - } - } - } - } - if (eventSlave.devotion >= -20) { if (eventSlave.lactation > 1) { if (canDoVaginal(eventSlave) || canDoAnal(eventSlave)) { diff --git a/src/js/extendedFamilyModeJS.js b/src/js/extendedFamilyModeJS.js index e10f433f13b2e1e2efd383fe75ff328f9483819c..c1d74f93f296a65948fd88d7ada1dfe96665b38c 100644 --- a/src/js/extendedFamilyModeJS.js +++ b/src/js/extendedFamilyModeJS.js @@ -481,3 +481,32 @@ window.relativeTerm = function(slave1, slave2) { return null; }; + +/** completely reset all the family counters in the game state (for both PC and slaves) */ +window.resetFamilyCounters = function() { + for (let slave of V.slaves) { + slave.daughters = 0; + slave.sisters = 0; + } + V.PC.daughters = 0; + V.PC.sisters = 0; + + if (V.familyTesting === 1) { + for (let slave of V.slaves) { + if (slave.mother === -1 || slave.father === -1) { + V.PC.daughters++; + } + if (areSisters(slave, V.PC)) { + V.PC.sisters++; + } + for (let otherSlave of V.slaves) { + if (isParentP(otherSlave, slave)) { + slave.daughters++; + } + if (areSisters(otherSlave, slave)) { + slave.sisters++; + } + } + } + } +}; diff --git a/src/js/food.js b/src/js/food.js index cabebceceab65b0fb7f5b9961c33f674c3ee0532..34c908b82fd8199f0c0e9e9c88d5ccbb9ce9bad6 100644 --- a/src/js/food.js +++ b/src/js/food.js @@ -18,7 +18,7 @@ App.Facilities.Farmyard.foodAmount = function(slave) { } if (V.farmyardUpgrade.machinery === 1) { food += 65; // machinery upgrade for farmyard - } + } if (V.Farmer === 0) { return null; } else { @@ -57,7 +57,7 @@ App.Facilities.Farmyard.foodAmount = function(slave) { } else if (slave.hears < -1) { // slave is deaf food *= 0.6; } - food *= healthPenalty(slave); + food *= restEffects(slave, 20); food = Math.trunc(food); food = Math.clamp(food, 1, 1000000000000000000); return food; diff --git a/src/js/generateGenetics.js b/src/js/generateGenetics.js index 07ed18740f38850d2b6789fe376eaeed27089e5b..1a6e5922c8d31592bb1beedf56daf82958d2523a 100644 --- a/src/js/generateGenetics.js +++ b/src/js/generateGenetics.js @@ -1389,18 +1389,9 @@ window.generateChild = function(mother, ova, destination) { } child.weekAcquired = V.week; if (child.nationality === "Stateless") { - if (V.arcologies[0].FSRomanRevivalist > 90) { - child.nationality = "Roman Revivalist"; - } else if (V.arcologies[0].FSAztecRevivalist > 90) { - child.nationality = "Aztec Revivalist"; - } else if (V.arcologies[0].FSEgyptianRevivalist > 90) { - child.nationality = "Ancient Egyptian Revivalist"; - } else if (V.arcologies[0].FSEdoRevivalist > 90) { - child.nationality = "Edo Revivalist"; - } else if (V.arcologies[0].FSArabianRevivalist > 90) { - child.nationality = "Arabian Revivalist"; - } else if (V.arcologies[0].FSChineseRevivalist > 90) { - child.nationality = "Ancient Chinese Revivalist"; + const revivalistNationality = getRevivalistNationality(); + if (typeof revivalistNationality === 'string') { + child.nationality = revivalistNationality; } } } else { @@ -1408,10 +1399,9 @@ window.generateChild = function(mother, ova, destination) { V.activeSlaveOneTimeMaxAge = V.targetAge; // eslint-disable-next-line camelcase V.one_time_age_overrides_pedo_mode = 1; - V.ageAdjustOverride = 1; if (genes.gender === "XX") { - child = GenerateNewSlave("XX"); + child = GenerateNewSlave("XX", {mature: 0}); child.slaveSurname = genes.surname; if (!pregUpgrade) { if (genes.clone) { @@ -1532,7 +1522,7 @@ window.generateChild = function(mother, ova, destination) { } } } else { - child = GenerateNewSlave("XY"); + child = GenerateNewSlave("XY", {mature: 0}); child.slaveSurname = genes.surname; if (!pregUpgrade) { if (genes.clone) { @@ -1736,18 +1726,9 @@ window.generateChild = function(mother, ova, destination) { child.trust = 0; child.weekAcquired = V.week; if (child.nationality === "Stateless") { - if (V.arcologies[0].FSRomanRevivalist > 90) { - child.nationality = "Roman Revivalist"; - } else if (V.arcologies[0].FSAztecRevivalist > 90) { - child.nationality = "Aztec Revivalist"; - } else if (V.arcologies[0].FSEgyptianRevivalist > 90) { - child.nationality = "Ancient Egyptian Revivalist"; - } else if (V.arcologies[0].FSEdoRevivalist > 90) { - child.nationality = "Edo Revivalist"; - } else if (V.arcologies[0].FSArabianRevivalist > 90) { - child.nationality = "Arabian Revivalist"; - } else if (V.arcologies[0].FSChineseRevivalist > 90) { - child.nationality = "Ancient Chinese Revivalist"; + const revivalistNationality = getRevivalistNationality(); + if (typeof revivalistNationality === 'string') { + child.nationality = revivalistNationality; } } diff --git a/src/js/generateMarketSlave.js b/src/js/generateMarketSlave.js index ce2236ea2f9f614b9ca7a5bec9803b074bcf68d4..78756c4df0209b8ea3579c77d2dc877b00d55cc5 100644 --- a/src/js/generateMarketSlave.js +++ b/src/js/generateMarketSlave.js @@ -1,4 +1,9 @@ /* eslint-disable camelcase */ +/** + * @param {string} [market="kidnappers"] + * @param {number} [numArcology=1] Defaults to 1 (V.arcologies[1]) since it refers to neighboring arcology, and V.arcologies[0] is the player's arcology. + * @returns {{text:string, slave:Object}} + */ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { let r = ``; let sisterAge; @@ -7,53 +12,55 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { let pronounsGenerated = false; let pronoun; let opinion; + let slave; + let SGProp = {}; switch (market) { - case "corporate": + case "corporate": { if (V.corp.SpecAge === 1) { r += `Teenage slaves are strongly favored for training. `; - V.activeSlaveOneTimeMinAge = V.minimumSlaveAge; - V.activeSlaveOneTimeMaxAge = 19; + SGProp.minAge = V.minimumSlaveAge; + SGProp.maxAge = 19; } else if (V.corp.SpecAge === 3) { r += `Newly enslaved MILFs are strongly favored for training. `; if (V.pedo_mode === 1) { - V.activeSlaveOneTimeMinAge = 24; - V.activeSlaveOneTimeMaxAge = V.retirementAge-1; + SGProp.minAge = 24; + SGProp.maxAge = V.retirementAge-1; } else { - V.activeSlaveOneTimeMinAge = 36; - V.activeSlaveOneTimeMaxAge = V.retirementAge-1; + SGProp.minAge = 36; + SGProp.maxAge = V.retirementAge-1; } } else { r += `Promising slaves are trained without special sorting based on age. `; } - V.one_time_age_overrides_pedo_mode = 1; + SGProp.ageOverridesPedoMode = 1; if (V.corp.SpecRaces.length > 0) { - V.fixedRace = jsEither(V.corp.SpecRaces); + SGProp.race = jsEither(V.corp.SpecRaces); } if (V.corp.SpecNationality) { - V.fixedNationality = V.corp.SpecNationality; + SGProp.nationality = V.corp.SpecNationality; r += `The corporation only takes slaves that are ${V.corp.SpecNationality}. `; } - // Generate slaves. Modify fixed before this. Do not modify activeSlave before this. + // Generate slaves. Modify fixed before this. Do not modify activeSlave before this. if (V.corp.SpecGender === 1) { r += `Slaves without pussies are not trained. `; - V.activeSlave = GenerateNewSlave("XX"); + slave = GenerateNewSlave("XX", SGProp); } else if (V.corp.SpecGender === 2) { r += `Slaves without dicks are not trained. `; - V.activeSlave = GenerateNewSlave("XY"); + slave = GenerateNewSlave("XY", SGProp); } else { r += `Slaves are passed to training regardless of whether they have dicks or pussies. `; - V.activeSlave = GenerateNewSlave(); + slave = GenerateNewSlave("", SGProp); } - V.activeSlave.origin = "$He was enslaved and trained by your corporation."; - V.activeSlave.devotion = jsRandom(-30, 0); - V.activeSlave.trust = jsRandom(-45, -25); - setHealth(V.activeSlave, jsRandom(25, 50), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 0.5), 0), jsRandom(10, 40)); + slave.origin = "$He was enslaved and trained by your corporation."; + slave.devotion = jsRandom(-30, 0); + slave.trust = jsRandom(-45, -25); + setHealth(slave, jsRandom(25, 50), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 0.5), 0), jsRandom(10, 40)); if (V.corp.SpecDevotion > 0) { - V.activeSlave.devotion = jsRandom(-120, -90) + V.corp.SpecDevotion * 30; + slave.devotion = jsRandom(-120, -90) + V.corp.SpecDevotion * 30; if (V.corp.SpecDevotion === 1) { r += `It does everything it can to make trainees furious. `; } else if (V.corp.SpecDevotion === 2) { @@ -68,10 +75,10 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { } if (V.corp.SpecIntelligence === 3) { r += `Intelligent slaves have a high priority for training. `; - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [30, 100]}); + slave.intelligence = Intelligence.random({limitIntelligence: [30, 100]}); } else if (V.corp.SpecIntelligence === 1) { r += `Stupid slaves have a high priority for training. `; - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [-100, -30]}); + slave.intelligence = Intelligence.random({limitIntelligence: [-100, -30]}); } else { r += `Slaves' intelligence is not given special consideration. `; } @@ -83,7 +90,7 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { r += `The corporation selects slaves based on race. `; /* getting into the specifics of which races exactly is a hellhole I'd rather not jump into*/ } if (V.corp.SpecTrust > 0) { - V.activeSlave.trust = jsRandom(-105, -85) + V.corp.SpecTrust * 20; + slave.trust = jsRandom(-105, -85) + V.corp.SpecTrust * 20; if (V.corp.SpecTrust === 1) { r += `The corporation applies extremely brutal slave breaking techniques, uncontrollable sobbing and bloodcurdling screams are heard around the clock. `; } else if (V.corp.SpecTrust === 2) { @@ -97,7 +104,7 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { r += `The corporation applies standard slave breaking techniques. `; } if (V.corp.SpecHeight > 0) { - V.activeSlave.height = Math.trunc(Height.random(V.activeSlave, {limitMult: [V.corp.SpecHeight - 4, V.corp.SpecHeight - 2]})); + slave.height = Math.trunc(Height.random(slave, {limitMult: [V.corp.SpecHeight - 4, V.corp.SpecHeight - 2]})); if (V.corp.SpecHeight === 1) { r += `The corporation specifically targets very short slaves. `; } else if (V.corp.SpecHeight === 2) { @@ -110,13 +117,13 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { } if (V.corp.SpecVirgin === 1) { r += `The corporation ensures its slaves are virgins. `; - V.activeSlave.anus = 0; - if (V.activeSlave.vagina > 0) { - V.activeSlave.vagina = 0; + slave.anus = 0; + if (slave.vagina > 0) { + slave.vagina = 0; } } if (V.corp.SpecWeight > 0) { - V.activeSlave.weight = jsRandom(-85 + V.corp.SpecWeight * 20, -65 + V.corp.SpecWeight * 30); + slave.weight = jsRandom(-85 + V.corp.SpecWeight * 20, -65 + V.corp.SpecWeight * 30); if (V.corp.SpecWeight === 1) { r += `Trainees are practically starved through a rigorous diet. `; } else if (V.corp.SpecWeight === 2) { @@ -132,7 +139,7 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { r += `Only the unhealthiest trainees are fed special diets. `; } if (V.corp.SpecMuscle > 0) { - V.activeSlave.muscles = jsRandom(-85, -65) + V.corp.SpecMuscle * 25; + slave.muscles = jsRandom(-85, -65) + V.corp.SpecMuscle * 25; if (V.corp.SpecMuscle === 1) { r += `Trainees are kept physically inactive and frail. `; } else if (V.corp.SpecMuscle === 2) { @@ -149,17 +156,17 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { } if (V.corp.SpecAccent === 1) { r += `The corporation teaches its trainees the lingua franca but allows them to retain distinctive accents. `; - V.activeSlave.accent = Math.clamp(V.activeSlave.accent, 0, 1); + slave.accent = Math.clamp(slave.accent, 0, 1); } else if (V.corp.SpecAccent === 2) { r += `The corporation teaches its trainees to speak the lingua franca without accent. `; - V.activeSlave.accent = 0; + slave.accent = 0; } else { r += `The corporation does not expend any special effort teaching language. `; } if (V.corp.SpecEducation > 0) { - V.activeSlave.intelligenceImplant = 15 * V.corp.SpecEducation; - V.activeSlave.skill.whoring = Math.clamp(V.activeSlave.skill.whoring, 15 * V.corp.SpecEducation, 100); - V.activeSlave.skill.entertainment = Math.clamp(V.activeSlave.skill.entertainment, 15 * V.corp.SpecEducation, 100); + slave.intelligenceImplant = 15 * V.corp.SpecEducation; + slave.skill.whoring = Math.clamp(slave.skill.whoring, 15 * V.corp.SpecEducation, 100); + slave.skill.entertainment = Math.clamp(slave.skill.entertainment, 15 * V.corp.SpecEducation, 100); if (V.corp.SpecEducation === 1) { r += `Its slave students receive basic slave educations. `; } else if (V.corp.SpecEducation === 2) { @@ -169,16 +176,16 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { r += `Its slaves are not given special educational attention. `; } if (V.corp.SpecSexEd > 0) { - V.activeSlave.skill.oral = Math.clamp(V.activeSlave.skill.oral, 15 * V.corp.SpecSexEd, 100); - if (V.activeSlave.anus > 0) { - V.activeSlave.skill.anal = Math.clamp(V.activeSlave.skill.anal, 15 * V.corp.SpecSexEd, 100); - } else if (V.activeSlave.anus === 0) { - V.activeSlave.skill.anal = Math.clamp(V.activeSlave.skill.anal, 15, 100); + slave.skill.oral = Math.clamp(slave.skill.oral, 15 * V.corp.SpecSexEd, 100); + if (slave.anus > 0) { + slave.skill.anal = Math.clamp(slave.skill.anal, 15 * V.corp.SpecSexEd, 100); + } else if (slave.anus === 0) { + slave.skill.anal = Math.clamp(slave.skill.anal, 15, 100); } - if (V.activeSlave.vagina > 0) { - V.activeSlave.skill.vaginal = Math.clamp(V.activeSlave.skill.vaginal, 15 * V.corp.SpecSexEd, 100); - } else if (V.activeSlave.vagina === 0) { - V.activeSlave.skill.vaginal = Math.clamp(V.activeSlave.skill.vaginal, 15, 100); + if (slave.vagina > 0) { + slave.skill.vaginal = Math.clamp(slave.skill.vaginal, 15 * V.corp.SpecSexEd, 100); + } else if (slave.vagina === 0) { + slave.skill.vaginal = Math.clamp(slave.skill.vaginal, 15, 100); } if (V.corp.SpecSexEd === 1) { r += `Trainees spend many hours learning sexual competence. `; @@ -190,41 +197,41 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { } if (V.corp.SpecCosmetics === 1) { r += `The corporation uses subtle cosmetic surgery to improve its slaves for sale. `; - if ((V.activeSlave.anus > 3)) { - V.activeSlave.anus = 3; - if (V.activeSlave.skill.anal > 10) { - V.activeSlave.skill.anal -= 10; + if ((slave.anus > 3)) { + slave.anus = 3; + if (slave.skill.anal > 10) { + slave.skill.anal -= 10; } } - if (V.activeSlave.vagina > 3) { - V.activeSlave.vagina = 3; - if (V.activeSlave.skill.vaginal > 10) { - V.activeSlave.skill.vaginal -= 10; + if (slave.vagina > 3) { + slave.vagina = 3; + if (slave.skill.vaginal > 10) { + slave.skill.vaginal -= 10; } } - if (V.activeSlave.faceImplant <= 30 && V.activeSlave.face <= 95) { - if (V.activeSlave.faceShape === "masculine") { - V.activeSlave.faceShape = "androgynous"; + if (slave.faceImplant <= 30 && slave.face <= 95) { + if (slave.faceShape === "masculine") { + slave.faceShape = "androgynous"; } - V.activeSlave.faceImplant = 20; - V.activeSlave.face = Math.clamp(V.activeSlave.face+20, -100, 100); + slave.faceImplant = 20; + slave.face = Math.clamp(slave.face+20, -100, 100); } - if ((V.activeSlave.ageImplant !== 1) && (V.activeSlave.visualAge >= 25)) { - applyAgeImplant(V.activeSlave); + if ((slave.ageImplant !== 1) && (slave.visualAge >= 25)) { + applyAgeImplant(slave); } - if ((V.activeSlave.voice === 1) && (V.activeSlave.voiceImplant === 0)) { - V.activeSlave.voice += 1; - V.activeSlave.voiceImplant += 1; + if ((slave.voice === 1) && (slave.voiceImplant === 0)) { + slave.voice += 1; + slave.voiceImplant += 1; } - V.activeSlave.waist = Math.trunc(V.activeSlave.waist, -100, -15); - if (((V.activeSlave.boobShape === "saggy") || (V.activeSlave.boobShape === "downward-facing"))) { - V.activeSlave.boobShape = "normal"; + slave.waist = Math.trunc(slave.waist, -100, -15); + if (((slave.boobShape === "saggy") || (slave.boobShape === "downward-facing"))) { + slave.boobShape = "normal"; } - if (((V.activeSlave.boobShape === "normal") || (V.activeSlave.boobShape === "wide-set"))) { - if (V.activeSlave.boobs > 800) { - V.activeSlave.boobShape = "torpedo-shaped"; + if (((slave.boobShape === "normal") || (slave.boobShape === "wide-set"))) { + if (slave.boobs > 800) { + slave.boobShape = "torpedo-shaped"; } else { - V.activeSlave.boobShape = "perky"; + slave.boobShape = "perky"; } } } else { @@ -232,187 +239,187 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { } if (V.corp.SpecPussy === 1) { r += `The corporation adds pussies where needed. `; - V.activeSlave.vagina = 0; - V.activeSlave.ovaries = 1; + slave.vagina = 0; + slave.ovaries = 1; } else if (V.corp.SpecPussy === -1) { r += `The corporation removes pussies where possible. `; - V.activeSlave.vagina = -1; - V.activeSlave.ovaries = 0; + slave.vagina = -1; + slave.ovaries = 0; } if (V.corp.SpecDick === 1) { r += `The corporation adds dicks where needed. `; - V.activeSlave.dick = 2; - V.activeSlave.prostate = 1; + slave.dick = 2; + slave.prostate = 1; } else if (V.corp.SpecDick === -1) { r += `The corporation removes dicks where possible. `; - V.activeSlave.dick = 0; - V.activeSlave.prostate = 0; + slave.dick = 0; + slave.prostate = 0; } - if (V.corp.SpecBalls === 1 && V.activeSlave.dick > 0) { + if (V.corp.SpecBalls === 1 && slave.dick > 0) { r += `The corporation adds balls where needed. `; - V.activeSlave.balls = 2; - V.activeSlave.scrotum = 2; + slave.balls = 2; + slave.scrotum = 2; } else if (V.corp.SpecBalls === -1) { r += `The corporation removes balls where possible. `; - V.activeSlave.balls = 0; - V.activeSlave.scrotum = 0; + slave.balls = 0; + slave.scrotum = 0; } if (typeof V.corp.SpecPussy === "undefined" && typeof V.corp.SpecDick === "undefined" && typeof V.corp.SpecBalls === "undefined") { r += `The corporation does not reconfigure slave genitalia. `; } if (V.corp.SpecHormones === 1) { r += `It applies almost universal female hormone therapy. `; - if ((V.activeSlave.dick > 0)) { - V.activeSlave.dick = Math.clamp(V.activeSlave.dick-1, 1, 6); + if ((slave.dick > 0)) { + slave.dick = Math.clamp(slave.dick-1, 1, 6); } - if ((V.activeSlave.balls > 0)) { - V.activeSlave.balls = Math.clamp(V.activeSlave.balls-1, 1, 6); + if ((slave.balls > 0)) { + slave.balls = Math.clamp(slave.balls-1, 1, 6); } - if ((V.activeSlave.clit > 0)) { - V.activeSlave.clit = Math.clamp(V.activeSlave.clit-1, 0, 3); + if ((slave.clit > 0)) { + slave.clit = Math.clamp(slave.clit-1, 0, 3); } - if ((V.activeSlave.voice < 3) && (V.activeSlave.voice > 0)) { - V.activeSlave.voice = Math.clamp(V.activeSlave.voice+1, 1, 3); + if ((slave.voice < 3) && (slave.voice > 0)) { + slave.voice = Math.clamp(slave.voice+1, 1, 3); } - if ((V.activeSlave.vagina > -1) && (V.activeSlave.ovaries !== 0) && (V.activeSlave.vaginaLube < 2)) { - V.activeSlave.vaginaLube = Math.clamp(V.activeSlave.vaginaLube+1, 0, 2); + if ((slave.vagina > -1) && (slave.ovaries !== 0) && (slave.vaginaLube < 2)) { + slave.vaginaLube = Math.clamp(slave.vaginaLube+1, 0, 2); } - if (((V.activeSlave.butt-V.activeSlave.buttImplant) < 2)) { - V.activeSlave.butt = Math.clamp(V.activeSlave.butt+1, 0, 10); + if (((slave.butt-slave.buttImplant) < 2)) { + slave.butt = Math.clamp(slave.butt+1, 0, 10); } - if (((V.activeSlave.boobs-V.activeSlave.boobsImplant) < 500)) { - V.activeSlave.boobs = Math.clamp(V.activeSlave.boobs+400, 0, 10000); + if (((slave.boobs-slave.boobsImplant) < 500)) { + slave.boobs = Math.clamp(slave.boobs+400, 0, 10000); } - if (V.activeSlave.face <= 95) { - V.activeSlave.face = Math.clamp(V.activeSlave.face+20, -100, 100); + if (slave.face <= 95) { + slave.face = Math.clamp(slave.face+20, -100, 100); } - if ((V.activeSlave.faceShape === "masculine")) { - V.activeSlave.faceShape = "androgynous"; - } else if ((V.activeSlave.faceShape === "androgynous")) { - V.activeSlave.faceShape = "normal"; + if ((slave.faceShape === "masculine")) { + slave.faceShape = "androgynous"; + } else if ((slave.faceShape === "androgynous")) { + slave.faceShape = "normal"; } - if ((V.activeSlave.physicalAge < 25)) { - V.activeSlave.shoulders = Math.clamp(V.activeSlave.shoulders-1, -2, 2); - V.activeSlave.hips = Math.clamp(V.activeSlave.hips+1, -2, 2); + if ((slave.physicalAge < 25)) { + slave.shoulders = Math.clamp(slave.shoulders-1, -2, 2); + slave.hips = Math.clamp(slave.hips+1, -2, 2); } - if ((V.activeSlave.muscles > 30) && (V.activeSlave.diet !== "muscle building") && (V.generalUpgradeMuscle !== "toned") && (V.generalUpgradeMuscle !== "ripped")) { - V.activeSlave.muscles = Math.clamp(V.activeSlave.muscles-10, 0, 30); + if ((slave.muscles > 30) && (slave.diet !== "muscle building") && (V.generalUpgradeMuscle !== "toned") && (V.generalUpgradeMuscle !== "ripped")) { + slave.muscles = Math.clamp(slave.muscles-10, 0, 30); } - if ((V.activeSlave.nipples === "tiny")) { - V.activeSlave.nipples = "cute"; + if ((slave.nipples === "tiny")) { + slave.nipples = "cute"; } - if ((V.activeSlave.height > 180)) { - V.activeSlave.height -= jsRandom(3, 6); + if ((slave.height > 180)) { + slave.height -= jsRandom(3, 6); } - V.activeSlave.devotion += jsRandom(5, 10); - V.activeSlave.trust += jsRandom(5, 10); - V.activeSlave.attrXY = Math.clamp(V.activeSlave.attrXY+jsRandom(5, 10), 0, 100); + slave.devotion += jsRandom(5, 10); + slave.trust += jsRandom(5, 10); + slave.attrXY = Math.clamp(slave.attrXY+jsRandom(5, 10), 0, 100); } else if (V.corp.SpecHormones === 2) { r += `It applies almost universal male hormone therapy. `; - if ((V.activeSlave.dick > 0)) { - V.activeSlave.dick = Math.clamp(V.activeSlave.dick+1, 1, 6); + if ((slave.dick > 0)) { + slave.dick = Math.clamp(slave.dick+1, 1, 6); } - if ((V.activeSlave.balls > 0)) { - V.activeSlave.balls = Math.clamp(V.activeSlave.balls+1, 1, 6); + if ((slave.balls > 0)) { + slave.balls = Math.clamp(slave.balls+1, 1, 6); } - if ((V.activeSlave.clit > 0) && (V.activeSlave.dick === 0)) { - V.activeSlave.clit = Math.clamp(V.activeSlave.clit+1, 0, 3); + if ((slave.clit > 0) && (slave.dick === 0)) { + slave.clit = Math.clamp(slave.clit+1, 0, 3); } - if ((V.activeSlave.voice > 1)) { - V.activeSlave.voice = Math.clamp(V.activeSlave.voice-1, 1, 3); + if ((slave.voice > 1)) { + slave.voice = Math.clamp(slave.voice-1, 1, 3); } - if ((V.activeSlave.vagina > -1) && (V.activeSlave.vaginaLube > 0)) { - V.activeSlave.vaginaLube = Math.clamp(V.activeSlave.vaginaLube-1, 0, 2); + if ((slave.vagina > -1) && (slave.vaginaLube > 0)) { + slave.vaginaLube = Math.clamp(slave.vaginaLube-1, 0, 2); } - V.activeSlave.butt = Math.clamp(V.activeSlave.butt-1, 0, 10); - V.activeSlave.boobs = Math.clamp(V.activeSlave.boobs-400, 0, 10000); - if (V.activeSlave.face > 10) { - V.activeSlave.face = Math.clamp(V.activeSlave.face-20, -100, 100); + slave.butt = Math.clamp(slave.butt-1, 0, 10); + slave.boobs = Math.clamp(slave.boobs-400, 0, 10000); + if (slave.face > 10) { + slave.face = Math.clamp(slave.face-20, -100, 100); } - if (V.activeSlave.faceShape === "androgynous" || V.activeSlave.faceShape === "masculine" || V.activeSlave.faceShape === "normal") { - V.activeSlave.faceShape = "masculine"; + if (slave.faceShape === "androgynous" || slave.faceShape === "masculine" || slave.faceShape === "normal") { + slave.faceShape = "masculine"; } else { - V.activeSlave.faceShape = "androgynous"; + slave.faceShape = "androgynous"; } - if ((V.activeSlave.physicalAge < 25)) { - V.activeSlave.shoulders = Math.clamp(V.activeSlave.shoulders+1, -2, 2); - V.activeSlave.hips = Math.clamp(V.activeSlave.hips-1, -2, 2); + if ((slave.physicalAge < 25)) { + slave.shoulders = Math.clamp(slave.shoulders+1, -2, 2); + slave.hips = Math.clamp(slave.hips-1, -2, 2); } - if ((V.activeSlave.muscles <= 95) && (V.activeSlave.diet !== "slimming")) { - V.activeSlave.muscles = Math.clamp(V.activeSlave.muscles+20, 0, 3); + if ((slave.muscles <= 95) && (slave.diet !== "slimming")) { + slave.muscles = Math.clamp(slave.muscles+20, 0, 3); } - if ((V.activeSlave.nipples === "huge")) { - V.activeSlave.nipples = "cute"; + if ((slave.nipples === "huge")) { + slave.nipples = "cute"; } - if ((V.activeSlave.height < 155)) { - V.activeSlave.height += jsRandom(3, 6); + if ((slave.height < 155)) { + slave.height += jsRandom(3, 6); } - V.activeSlave.devotion -= jsRandom(5, 10); - V.activeSlave.trust -= jsRandom(5, 10); - V.activeSlave.attrXX = Math.clamp(V.activeSlave.attrXX+jsRandom(5, 10), 0, 100); + slave.devotion -= jsRandom(5, 10); + slave.trust -= jsRandom(5, 10); + slave.attrXX = Math.clamp(slave.attrXX+jsRandom(5, 10), 0, 100); } else { r += `It does not use hormones on a systematic level. `; } if (V.corp.SpecInjection > 0) { if (V.corp.SpecInjection === 1) { r += `If anything, hormones are used to reduce asset sizes. `; - V.activeSlave.lips = jsRandom(0, 20); - V.activeSlave.butt = jsRandom(1, 2); - V.activeSlave.boobs = 10 * jsRandom(30, 60); - V.activeSlave.nipples = jsEither(["cute", "tiny"]); - if (V.activeSlave.dick > 0) { - V.activeSlave.dick = jsRandom(1, 2); + slave.lips = jsRandom(0, 20); + slave.butt = jsRandom(1, 2); + slave.boobs = 10 * jsRandom(30, 60); + slave.nipples = jsEither(["cute", "tiny"]); + if (slave.dick > 0) { + slave.dick = jsRandom(1, 2); } - if (V.activeSlave.balls > 0) { - V.activeSlave.balls = jsRandom(1, 2); + if (slave.balls > 0) { + slave.balls = jsRandom(1, 2); } } else if (V.corp.SpecInjection === 2) { r += `Growth hormones are used to correct flat chests and butts. `; - V.activeSlave.lips = jsRandom(25, 45); - V.activeSlave.butt = jsRandom(3, 4); - V.activeSlave.boobs = 10 * jsRandom(70, 100); - V.activeSlave.nipples = jsEither(["cute", "partially inverted"]); - if (V.activeSlave.dick > 0) { - V.activeSlave.dick = jsRandom(3, 4); + slave.lips = jsRandom(25, 45); + slave.butt = jsRandom(3, 4); + slave.boobs = 10 * jsRandom(70, 100); + slave.nipples = jsEither(["cute", "partially inverted"]); + if (slave.dick > 0) { + slave.dick = jsRandom(3, 4); } - if (V.activeSlave.balls > 0) { - V.activeSlave.balls = jsRandom(3, 4); + if (slave.balls > 0) { + slave.balls = jsRandom(3, 4); } } else if (V.corp.SpecInjection === 3) { r += `Growth hormones are used throughout slave training to ensure expansion. `; - V.activeSlave.lips = jsRandom(35, 55); - V.activeSlave.butt = jsRandom(4, 5); - V.activeSlave.boobs = 10 * jsRandom(120, 180); - V.activeSlave.nipples = jsEither(["cute", "partially inverted"]); - if (V.activeSlave.dick > 0) { - V.activeSlave.dick = jsRandom(4, 5); + slave.lips = jsRandom(35, 55); + slave.butt = jsRandom(4, 5); + slave.boobs = 10 * jsRandom(120, 180); + slave.nipples = jsEither(["cute", "partially inverted"]); + if (slave.dick > 0) { + slave.dick = jsRandom(4, 5); } - if (V.activeSlave.balls > 0) { - V.activeSlave.balls = jsRandom(4, 5); + if (slave.balls > 0) { + slave.balls = jsRandom(4, 5); } } else if (V.corp.SpecInjection === 4) { r += `Advanced growth hormones are applied on a grand scale. `; - V.activeSlave.lips = jsRandom(55, 85); - V.activeSlave.butt = jsRandom(6, 8); - V.activeSlave.boobs = 100 * jsRandom(40, 60); - V.activeSlave.nipples = jsEither(["huge", "inverted"]); - if (V.activeSlave.dick > 0) { - V.activeSlave.dick = jsRandom(5, 6); + slave.lips = jsRandom(55, 85); + slave.butt = jsRandom(6, 8); + slave.boobs = 100 * jsRandom(40, 60); + slave.nipples = jsEither(["huge", "inverted"]); + if (slave.dick > 0) { + slave.dick = jsRandom(5, 6); } - if (V.activeSlave.balls > 0) { - V.activeSlave.balls = jsRandom(5, 6); + if (slave.balls > 0) { + slave.balls = jsRandom(5, 6); } } else if (V.corp.SpecInjection === 5) { r += `Advanced growth hormones are applied with total focus on increasing slaves' productiveness. `; - V.activeSlave.lips = jsRandom(35, 65); - V.activeSlave.butt = jsRandom(4, 6); - V.activeSlave.boobs = 100 * jsRandom(60, 80); - V.activeSlave.nipples = jsEither(["huge", "inverted"]); - if (V.activeSlave.dick > 0) { - V.activeSlave.dick = jsRandom(6, 8); + slave.lips = jsRandom(35, 65); + slave.butt = jsRandom(4, 6); + slave.boobs = 100 * jsRandom(60, 80); + slave.nipples = jsEither(["huge", "inverted"]); + if (slave.dick > 0) { + slave.dick = jsRandom(6, 8); } - if (V.activeSlave.balls > 0) { - V.activeSlave.balls = jsRandom(5, 7); + if (slave.balls > 0) { + slave.balls = jsRandom(5, 7); } } } else { @@ -420,43 +427,44 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { } if (V.corp.SpecImplants === 1) { r += `Slaves are given tasteful breast, butt, and lip implants. `; - V.activeSlave.buttImplant = 1; - V.activeSlave.butt = Math.clamp(V.activeSlave.butt+V.activeSlave.buttImplant, 0, 10); - V.activeSlave.buttImplantType = "normal"; - V.activeSlave.boobsImplant = 600; - V.activeSlave.boobs = Math.clamp(V.activeSlave.boobs+V.activeSlave.boobsImplant, 0, 10000); - V.activeSlave.boobsImplantType = "normal"; - V.activeSlave.lipsImplant = 20; - V.activeSlave.lips = Math.clamp(V.activeSlave.lips+V.activeSlave.lipsImplant, 0, 55); + slave.buttImplant = 1; + slave.butt = Math.clamp(slave.butt+slave.buttImplant, 0, 10); + slave.buttImplantType = "normal"; + slave.boobsImplant = 600; + slave.boobs = Math.clamp(slave.boobs+slave.boobsImplant, 0, 10000); + slave.boobsImplantType = "normal"; + slave.lipsImplant = 20; + slave.lips = Math.clamp(slave.lips+slave.lipsImplant, 0, 55); } else if (V.corp.SpecImplants === 2) { r += `Slaves are given absurd breast, butt, and lip implants. `; - V.activeSlave.buttImplant = 4; - V.activeSlave.buttImplantType = "fillable"; - V.activeSlave.butt = Math.clamp(V.activeSlave.butt+V.activeSlave.buttImplant, 0, 10); - V.activeSlave.boobsImplant = 2400; - V.activeSlave.boobsImplantType = "advanced fillable"; - V.activeSlave.boobs = Math.clamp(V.activeSlave.boobs+V.activeSlave.boobsImplant, 0, 10000); - V.activeSlave.lipsImplant = 60; - V.activeSlave.lips = Math.clamp(V.activeSlave.lipsImplant+V.activeSlave.buttImplant, 0, 100); + slave.buttImplant = 4; + slave.buttImplantType = "fillable"; + slave.butt = Math.clamp(slave.butt+slave.buttImplant, 0, 10); + slave.boobsImplant = 2400; + slave.boobsImplantType = "advanced fillable"; + slave.boobs = Math.clamp(slave.boobs+slave.boobsImplant, 0, 10000); + slave.lipsImplant = 60; + slave.lips = Math.clamp(slave.lipsImplant+slave.buttImplant, 0, 100); } else { r += `Slaves are not given breast, butt, or lip implants. `; } if (V.corp.SpecAmputee === 1) { r += `The corporation removes all limbs from its slaves. `; - removeLimbs(V.activeSlave, "all"); + removeLimbs(slave, "all"); } if (V.corp.SpecMilk === 1) { r += `The corporation provides naturally lactating slaves. `; - V.activeSlave.lactation = 1; - V.activeSlave.lactationDuration = 2; - V.activeSlave.lactationAdaptation = 15; + slave.lactation = 1; + slave.lactationDuration = 2; + slave.lactationAdaptation = 15; } else if (V.corp.SpecMilk === 2) { r += `The corporation provides slaves with chemically induced lactation. `; - V.activeSlave.lactation = 2; - V.activeSlave.lactationDuration = 2; + slave.lactation = 2; + slave.lactationDuration = 2; } break; - case "neighbor": + } + case "neighbor": { if ((numArcology < V.arcologies.length) && (numArcology > 0)) { market = numArcology; } else { @@ -467,252 +475,252 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { opinion = Math.clamp(opinion, -10, 10); if (V.arcologies[market].FSSubjugationist > 20) { - V.fixedRace = V.arcologies[market].FSSubjugationistRace; + SGProp.race = V.arcologies[market].FSSubjugationistRace; } - V.activeSlave = GenerateNewSlave(); - generatePronouns(V.activeSlave); + slave = GenerateNewSlave("", SGProp); + generatePronouns(slave); pronounsGenerated = true; - pronoun = getPronouns(V.activeSlave); - V.activeSlave.origin = "You bought $him from "; - V.activeSlave.origin += V.arcologies[market].name; - V.activeSlave.origin += "."; - V.activeSlave.devotion = -20 + Math.trunc(V.arcologies[market].prosperity/10) + jsRandom(0, 10); - V.activeSlave.trust = -20 + Math.trunc(V.arcologies[market].prosperity/10) + jsRandom(0, 10); - setHealth(V.activeSlave, -50 + Math.trunc(V.arcologies[market].prosperity/25) + jsRandom(0, 5), Math.max(15 - V.arcologies[market].prosperity/20 + normalRandInt(0, 2), 0), Math.max(15 - V.arcologies[market].prosperity/20 + normalRandInt(0, 2), 0), undefined, Math.max(jsRandom(10, 40) - V.arcologies[market].prosperity/15, 0)); + pronoun = getPronouns(slave); + slave.origin = "You bought $him from "; + slave.origin += V.arcologies[market].name; + slave.origin += "."; + slave.devotion = -20 + Math.trunc(V.arcologies[market].prosperity/10) + jsRandom(0, 10); + slave.trust = -20 + Math.trunc(V.arcologies[market].prosperity/10) + jsRandom(0, 10); + setHealth(slave, -50 + Math.trunc(V.arcologies[market].prosperity/25) + jsRandom(0, 5), Math.max(15 - V.arcologies[market].prosperity/20 + normalRandInt(0, 2), 0), Math.max(15 - V.arcologies[market].prosperity/20 + normalRandInt(0, 2), 0), undefined, Math.max(jsRandom(10, 40) - V.arcologies[market].prosperity/15, 0)); if (jsRandom(1, 100) < V.arcologies[market].prosperity / 10 + 50) { - V.activeSlave.health.illness = 0; + slave.health.illness = 0; } - if (V.activeSlave.vagina > 0) { - V.activeSlave.skill.vaginal += Math.clamp(V.arcologies[market].prosperity/2, 15, 100); + if (slave.vagina > 0) { + slave.skill.vaginal += Math.clamp(V.arcologies[market].prosperity/2, 15, 100); } - if (V.activeSlave.anus > 0) { - V.activeSlave.skill.anal += Math.clamp(V.arcologies[market].prosperity/2, 15, 100); + if (slave.anus > 0) { + slave.skill.anal += Math.clamp(V.arcologies[market].prosperity/2, 15, 100); } - V.activeSlave.skill.oral += Math.clamp(V.arcologies[market].prosperity/2, 15, 100); - V.activeSlave.attrKnown = 1; - V.activeSlave.fetishKnown = 1; - if (V.activeSlave.accent >= 3) { + slave.skill.oral += Math.clamp(V.arcologies[market].prosperity/2, 15, 100); + slave.attrKnown = 1; + slave.fetishKnown = 1; + if (slave.accent >= 3) { if (V.arcologies[market].prosperity > jsRandom(0, 200)) { - V.activeSlave.accent -= 1; + slave.accent -= 1; } } if (V.arcologies[market].prosperity > jsRandom(0, 200)) { - V.activeSlave.sexualFlaw = "none"; + slave.sexualFlaw = "none"; } if (V.arcologies[market].prosperity > jsRandom(0, 200)) { - V.activeSlave.behavioralFlaw = "none"; + slave.behavioralFlaw = "none"; } if (V.arcologies[market].FSSubjugationist > 20) { r += `They're universally ${V.arcologies[market].FSSubjugationistRace}. `; } if (V.arcologies[market].FSYouthPreferentialist > 20) { r += `They're usually on the younger side. `; - if (V.activeSlave.actualAge > 30) { + if (slave.actualAge > 30) { if (jsRandom(0, 1) === 0) { - V.activeSlave.actualAge = jsRandom(18, 25); - V.activeSlave.visualAge = V.activeSlave.actualAge; - V.activeSlave.physicalAge = V.activeSlave.actualAge; - V.activeSlave.ovaryAge = V.activeSlave.actualAge; - if (V.activeSlave.boobs > 400) { - V.activeSlave.boobs -= 100*jsRandom(0, 2); + slave.actualAge = jsRandom(18, 25); + slave.visualAge = slave.actualAge; + slave.physicalAge = slave.actualAge; + slave.ovaryAge = slave.actualAge; + if (slave.boobs > 400) { + slave.boobs -= 100*jsRandom(0, 2); } - if (V.activeSlave.butt > 3) { - V.activeSlave.butt -= jsRandom(0, 2); + if (slave.butt > 3) { + slave.butt -= jsRandom(0, 2); } } else if (V.arcologies[market].FSYouthPreferentialistResearch === 1) { - if (V.activeSlave.actualAge > 30) { + if (slave.actualAge > 30) { r += `Well, all of them certainly look it. Always best to check their ages before buying. `; - V.activeSlave.visualAge = jsRandom(18, 25); - V.activeSlave.chem += jsRandom(10, 40); + slave.visualAge = jsRandom(18, 25); + slave.chem += jsRandom(10, 40); } } else { r += `And if they aren't, they sure don't look their age. `; - V.activeSlave.faceImplant += jsRandom(10, 30); - applyAgeImplant(V.activeSlave); + slave.faceImplant += jsRandom(10, 30); + applyAgeImplant(slave); } } } else if (V.arcologies[market].FSMaturityPreferentialist > 20) { r += `They're usually on the more mature side. `; - if (V.activeSlave.actualAge < 30) { + if (slave.actualAge < 30) { if (jsRandom(0, 1) === 0) { - V.activeSlave.actualAge = jsRandom(36, V.retirementAge-1); - V.activeSlave.visualAge = V.activeSlave.actualAge; - V.activeSlave.physicalAge = V.activeSlave.actualAge; - V.activeSlave.ovaryAge = V.activeSlave.actualAge; - if (V.activeSlave.boobs < 400) { - V.activeSlave.boobs += 100*jsRandom(0, 2); + slave.actualAge = jsRandom(36, V.retirementAge-1); + slave.visualAge = slave.actualAge; + slave.physicalAge = slave.actualAge; + slave.ovaryAge = slave.actualAge; + if (slave.boobs < 400) { + slave.boobs += 100*jsRandom(0, 2); } - if (V.activeSlave.butt < 3) { - V.activeSlave.butt += jsRandom(0, 2); + if (slave.butt < 3) { + slave.butt += jsRandom(0, 2); } } } } if (V.arcologies[market].FSRepopulationFocus > 50) { r += `They are exclusively female and all extremely pregnant. `; - V.activeSlave.genes = "XX"; - V.activeSlave.ovaries = 1; - V.activeSlave.vagina = either(0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3); - V.activeSlave.dick = 0; - V.activeSlave.balls = 0; - V.activeSlave.scrotum = 0; - if (V.activeSlave.physicalAge < V.fertilityAge) { + slave.genes = "XX"; + slave.ovaries = 1; + slave.vagina = either(0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3); + slave.dick = 0; + slave.balls = 0; + slave.scrotum = 0; + if (slave.physicalAge < V.fertilityAge) { if (V.precociousPuberty === 0) { - V.activeSlave.physicalAge = V.fertilityAge; - V.activeSlave.visualAge = V.fertilityAge; - V.activeSlave.actualAge = V.fertilityAge; - V.activeSlave.ovaryAge = V.fertilityAge; + slave.physicalAge = V.fertilityAge; + slave.visualAge = V.fertilityAge; + slave.actualAge = V.fertilityAge; + slave.ovaryAge = V.fertilityAge; } } - V.activeSlave.pubertyXX = 1; - if (V.activeSlave.ovaryAge >= 42) { + slave.pubertyXX = 1; + if (slave.ovaryAge >= 42) { /* corrects menopausal mothers */ - V.activeSlave.ovaryAge = 40; + slave.ovaryAge = 40; } - V.activeSlave.preg = 0; /* removing contraception of default slave generation so isFertile can work right*/ - if (isFertile(V.activeSlave)) { - V.activeSlave.vagina = jsRandom(1, 4); - V.activeSlave.preg = jsRandom(21, 39); + slave.preg = 0; /* removing contraception of default slave generation so isFertile can work right*/ + if (isFertile(slave)) { + slave.vagina = jsRandom(1, 4); + slave.preg = jsRandom(21, 39); if (jsRandom(1, 2) === 1 && V.seeHyperPreg === 1) { - V.activeSlave.pregType = jsRandom(3, 29); - V.activeSlave.pregAdaptation = 250; + slave.pregType = jsRandom(3, 29); + slave.pregAdaptation = 250; } else { - V.activeSlave.pregType = jsRandom(3, 8); - V.activeSlave.pregAdaptation = 100; + slave.pregType = jsRandom(3, 8); + slave.pregAdaptation = 100; } - SetBellySize(V.activeSlave); + SetBellySize(slave); } - V.activeSlave.lactation = jsRandom(0, 1); - if (V.activeSlave.lactation > 0) { - V.activeSlave.lactationDuration = 2; + slave.lactation = jsRandom(0, 1); + if (slave.lactation > 0) { + slave.lactationDuration = 2; } } else if (V.arcologies[market].FSRestart > 50) { r += `They have all been rendered unable to reproduce. `; - if (V.activeSlave.ovaries === 1) { - V.activeSlave.preg = -2; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; + if (slave.ovaries === 1) { + slave.preg = -2; + slave.belly = 0; + slave.bellyPreg = 0; } - if (V.activeSlave.balls > 0) { - V.activeSlave.balls = 0; + if (slave.balls > 0) { + slave.balls = 0; } if (V.arcologies[market].FSRestartResearch === 1) { r += `Smart and attractive slaves are beginning to be a rarity lately. `; - if (V.activeSlave.face >= 0) { - V.activeSlave.face -= 100; + if (slave.face >= 0) { + slave.face -= 100; } - if (V.activeSlave.intelligence >= 0) { - V.activeSlave.intelligence -= 100; + if (slave.intelligence >= 0) { + slave.intelligence -= 100; } - V.activeSlave.chem = jsRandom(40, 100); - V.activeSlave.addict = jsEither([0, 0, 0, 0, 0, 0, 0, 0, 5, 20, 20, 50, 100]); + slave.chem = jsRandom(40, 100); + slave.addict = jsEither([0, 0, 0, 0, 0, 0, 0, 0, 5, 20, 20, 50, 100]); } } if (V.arcologies[market].FSGenderRadicalist > 50) { r += `They all show signs of intensive hormone therapy. `; - V.activeSlave.chem += jsRandom(10, 100); - if (V.activeSlave.dick > 0) { - V.activeSlave.boobs += 100*jsRandom(0, 4); - V.activeSlave.butt += jsRandom(0, 2); - if (V.activeSlave.hips < 2) { - V.activeSlave.hips += jsRandom(0, 1); + slave.chem += jsRandom(10, 100); + if (slave.dick > 0) { + slave.boobs += 100*jsRandom(0, 4); + slave.butt += jsRandom(0, 2); + if (slave.hips < 2) { + slave.hips += jsRandom(0, 1); } - if (V.activeSlave.shoulders > -2) { - V.activeSlave.shoulders -= jsRandom(0, 1); + if (slave.shoulders > -2) { + slave.shoulders -= jsRandom(0, 1); } - if (V.activeSlave.face < 80) { - V.activeSlave.face += jsRandom(0, 20); + if (slave.face < 80) { + slave.face += jsRandom(0, 20); } - if (V.activeSlave.faceShape === "masculine") { + if (slave.faceShape === "masculine") { if (jsRandom(0, 1) === 0) { - V.activeSlave.faceShape = "androgynous"; + slave.faceShape = "androgynous"; } } - if (V.activeSlave.dick > 2) { - V.activeSlave.dick -= jsRandom(0, 2); + if (slave.dick > 2) { + slave.dick -= jsRandom(0, 2); } - if (V.activeSlave.balls > 2) { - V.activeSlave.balls -= jsRandom(0, 2); + if (slave.balls > 2) { + slave.balls -= jsRandom(0, 2); } if (V.arcologies[market].FSGenderRadicalistResearch === 1 && jsRandom(1, 100) <= 20) { r += `This one has a notably rounded belly for a slave with no vagina. `; - V.activeSlave.ovaries = 0; - V.activeSlave.vagina = -1; - V.activeSlave.mpreg = 1; - if (isFertile(V.activeSlave)) { - V.activeSlave.preg = jsRandom(1, 39); - V.activeSlave.pregType = setPregType(V.activeSlave); - SetBellySize(V.activeSlave); + slave.ovaries = 0; + slave.vagina = -1; + slave.mpreg = 1; + if (isFertile(slave)) { + slave.preg = jsRandom(1, 39); + slave.pregType = setPregType(slave); + SetBellySize(slave); } } } else { - V.activeSlave.boobs -= 100*jsRandom(0, 2); - V.activeSlave.butt -= jsRandom(0, 1); - if (V.activeSlave.hips > -2) { - V.activeSlave.hips -= jsRandom(0, 1); + slave.boobs -= 100*jsRandom(0, 2); + slave.butt -= jsRandom(0, 1); + if (slave.hips > -2) { + slave.hips -= jsRandom(0, 1); } - if (V.activeSlave.shoulders < 2) { - V.activeSlave.shoulders += jsRandom(0, 1); + if (slave.shoulders < 2) { + slave.shoulders += jsRandom(0, 1); } - if (V.activeSlave.face >= -80) { - V.activeSlave.face -= jsRandom(0, 20); + if (slave.face >= -80) { + slave.face -= jsRandom(0, 20); } - if (V.activeSlave.faceShape !== "androgynous") { + if (slave.faceShape !== "androgynous") { if (jsRandom(0, 1) === 0) { - V.activeSlave.faceShape = "androgynous"; + slave.faceShape = "androgynous"; } } - V.activeSlave.clit += jsRandom(0, 2); - V.activeSlave.labia += jsRandom(0, 1); - if (V.activeSlave.muscles <= 95) { - V.activeSlave.muscles += jsRandom(0, 20); + slave.clit += jsRandom(0, 2); + slave.labia += jsRandom(0, 1); + if (slave.muscles <= 95) { + slave.muscles += jsRandom(0, 20); } } } else if (V.arcologies[market].FSGenderFundamentalist > 50) { r += `Fertile slaves from there almost never appear without swollen bellies and sensitive nipples. `; - V.activeSlave.preg = 0; /* removing contraception of default slave generation so isFertile can work right*/ - if (isFertile(V.activeSlave)) { - V.activeSlave.preg = jsRandom(1, 40); - V.activeSlave.pregType = setPregType(V.activeSlave); - SetBellySize(V.activeSlave); - V.activeSlave.lactation = jsRandom(0, 1); - if (V.activeSlave.lactation > 0) { - V.activeSlave.lactationDuration = 2; + slave.preg = 0; /* removing contraception of default slave generation so isFertile can work right*/ + if (isFertile(slave)) { + slave.preg = jsRandom(1, 40); + slave.pregType = setPregType(slave); + SetBellySize(slave); + slave.lactation = jsRandom(0, 1); + if (slave.lactation > 0) { + slave.lactationDuration = 2; } } } if (V.arcologies[market].FSPaternalist > 20) { r += `They're often gratifyingly devoted and trusting. `; - if (V.activeSlave.devotion < 10) { - V.activeSlave.devotion += jsRandom(0, 8); + if (slave.devotion < 10) { + slave.devotion += jsRandom(0, 8); } - if (V.activeSlave.trust < 50) { - V.activeSlave.trust += jsRandom(0, 8); + if (slave.trust < 50) { + slave.trust += jsRandom(0, 8); } } else if (V.arcologies[market].FSDegradationist > 20) { r += `They can be depended upon to be terrified into abject submission. `; - DegradingName(V.activeSlave); - if (V.activeSlave.trust > -10) { - V.activeSlave.trust -= jsRandom(0, 10); + DegradingName(slave); + if (slave.trust > -10) { + slave.trust -= jsRandom(0, 10); } if (jsRandom(1, 100) > 90) { // one in twenty slaves has only one blind eye. if (jsRandom(1, 20) > 1) { if (jsRandom(1, 2) === 1) { - eyeSurgery(V.activeSlave, "left", "blind"); + eyeSurgery(slave, "left", "blind"); } else { - eyeSurgery(V.activeSlave, "right", "blind"); + eyeSurgery(slave, "right", "blind"); } } else { - eyeSurgery(V.activeSlave, "blind", "blind"); + eyeSurgery(slave, "blind", "blind"); } } if (jsRandom(1, 100) > 90) { - V.activeSlave.hears = -2; + slave.hears = -2; } if (V.arcologies[market].FSRepopulationFocus === "unset" && V.arcologies[market].FSBodyPurist === "unset") { - if (isFertile(V.activeSlave) && jsRandom(1, 10) === 9) { - V.activeSlave.abortionTat = jsRandom(1, (Math.min(V.activeSlave.physicalAge-V.fertilityAge, V.activeSlave.physicalAge-V.minimumSlaveAge))*2); + if (isFertile(slave) && jsRandom(1, 10) === 9) { + slave.abortionTat = jsRandom(1, (Math.min(slave.physicalAge-V.fertilityAge, slave.physicalAge-V.minimumSlaveAge))*2); } } let i = 0; @@ -722,27 +730,27 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { let modPool = jsRandom(1, 10); for (i = 0; i < modPool; i++) { let tat = tattoos[Math.floor(Math.random() * tattoos.length)]; - V.activeSlave[tat] = "degradation"; + slave[tat] = "degradation"; } } if (jsRandom(1, 100) > 10) { // pierce em up let piercings = ["corsetPiercing", "nipplesPiercing", "areolaePiercing", "lipsPiercing", "tonguePiercing", "anusPiercing"]; - if (V.activeSlave.dick > 0) { + if (slave.dick > 0) { piercings.push("dickPiercing"); } - if (V.activeSlave.vagina !== -1) { + if (slave.vagina !== -1) { piercings.push("vaginaPiercing"); } - if ((V.activeSlave.vagina !== -1) || (V.activeSlave.dick !== 0)) { + if ((slave.vagina !== -1) || (slave.dick !== 0)) { piercings.push("clitPiercing"); } let modPool = jsRandom(5, 15); let pierce; for (i = 0; i < modPool; i++) { pierce = piercings[Math.floor(Math.random() * piercings.length)]; - if (V.activeSlave[pierce] < 2) { - V.activeSlave[pierce]++; + if (slave[pierce] < 2) { + slave[pierce]++; } } } @@ -750,363 +758,371 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { // scar em up if (jsRandom(1, 100) > 70) { // They got whipped too - App.Medicine.Modification.addScourged(V.activeSlave); + App.Medicine.Modification.addScourged(slave); } let scars = ["back", "lower back", "left thigh", "right thigh"]; let modPool = jsRandom(1, 10); let scar; for (i = 0; i < modPool; i++) { scar = scars[Math.floor(Math.random() * scars.length)]; - App.Medicine.Modification.addScar(V.activeSlave, scar, "generic"); + App.Medicine.Modification.addScar(slave, scar, "generic"); } } if (jsRandom(1, 100) > 80) { // brand em up if (jsRandom(1, 100) > 50) { - V.activeSlave.brand["left buttock"] = "SLUT"; + slave.brand["left buttock"] = "SLUT"; } else { - V.activeSlave.brand["left buttock"] = "Slave"; + slave.brand["left buttock"] = "Slave"; } } } if (V.arcologies[market].FSIntellectualDependency > 20) { r += `The only thing that rivals their idiocy is their uncontrollable libido. `; - V.activeSlave.slaveName = setup.bimboSlaveNames.random(); - if (V.activeSlave.intelligence > -50) { - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [-100, -50]}); + slave.slaveName = setup.bimboSlaveNames.random(); + if (slave.intelligence > -50) { + slave.intelligence = Intelligence.random({limitIntelligence: [-100, -50]}); } V.intelligenceImplant = 0; - if (V.activeSlave.energy < 80) { - V.activeSlave.energy = jsRandom(80, 100); + if (slave.energy < 80) { + slave.energy = jsRandom(80, 100); } } else if (V.arcologies[market].FSSlaveProfessionalism > 20) { r += `They possess brilliant minds and expert training; a slave that truly knows their role in life. `; - if (V.activeSlave.intelligence <= 50) { - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [51, 100]}); + if (slave.intelligence <= 50) { + slave.intelligence = Intelligence.random({limitIntelligence: [51, 100]}); } V.intelligenceImplant = 30; - if (V.activeSlave.energy > 40) { - V.activeSlave.energy -= 30; - } - if (V.activeSlave.vagina > 0) { - V.activeSlave.skill.vaginal += Math.clamp(V.arcologies[market].prosperity/2, 20, 100); - V.activeSlave.skill.vaginal = Math.clamp(V.activeSlave.skill.vaginal, 50, 100); - } - if (V.activeSlave.anus > 0) { - V.activeSlave.skill.anal += Math.clamp(V.arcologies[market].prosperity/2, 20, 100); - V.activeSlave.skill.anal = Math.clamp(V.activeSlave.skill.anal, 50, 100); - } - V.activeSlave.skill.oral += Math.clamp(V.arcologies[market].prosperity/2, 20, 100); - V.activeSlave.skill.oral = Math.clamp(V.activeSlave.skill.oral, 50, 100); - V.activeSlave.skill.entertainment += Math.clamp(V.arcologies[market].prosperity/2, 20, 100); - V.activeSlave.skill.entertainment = Math.clamp(V.activeSlave.skill.entertainment, 50, 100); - V.activeSlave.skill.whoring += Math.clamp(V.arcologies[market].prosperity/2, 20, 100); - V.activeSlave.skill.whoring = Math.clamp(V.activeSlave.skill.whoring, 50, 100); - V.activeSlave.sexualFlaw = "none"; - V.activeSlave.behavioralFlaw = "none"; - V.activeSlave.fetishKnown = 1; - V.activeSlave.attrKnown = 1; + if (slave.energy > 40) { + slave.energy -= 30; + } + if (slave.vagina > 0) { + slave.skill.vaginal += Math.clamp(V.arcologies[market].prosperity/2, 20, 100); + slave.skill.vaginal = Math.clamp(slave.skill.vaginal, 50, 100); + } + if (slave.anus > 0) { + slave.skill.anal += Math.clamp(V.arcologies[market].prosperity/2, 20, 100); + slave.skill.anal = Math.clamp(slave.skill.anal, 50, 100); + } + slave.skill.oral += Math.clamp(V.arcologies[market].prosperity/2, 20, 100); + slave.skill.oral = Math.clamp(slave.skill.oral, 50, 100); + slave.skill.entertainment += Math.clamp(V.arcologies[market].prosperity/2, 20, 100); + slave.skill.entertainment = Math.clamp(slave.skill.entertainment, 50, 100); + slave.skill.whoring += Math.clamp(V.arcologies[market].prosperity/2, 20, 100); + slave.skill.whoring = Math.clamp(slave.skill.whoring, 50, 100); + slave.sexualFlaw = "none"; + slave.behavioralFlaw = "none"; + slave.fetishKnown = 1; + slave.attrKnown = 1; } if (V.arcologies[market].FSBodyPurist > 80) { r += `They're quite pristine, free of any genomic damage or addictions regardless of any transformations they've had. `; // clean out any changes those filthy impure degradationsts may have made - V.activeSlave.brand = {}; - V.activeSlave.scar = {}; - V.activeSlave.chem = 0; - V.activeSlave.addict = 0; - V.activeSlave.boobsTat = 0; - V.activeSlave.buttTat = 0; - V.activeSlave.lipsTat = 0; - V.activeSlave.vaginaTat = 0; - V.activeSlave.dickTat = 0; - V.activeSlave.anusTat = 0; - V.activeSlave.shouldersTat = 0; - V.activeSlave.armsTat = 0; - V.activeSlave.legsTat = 0; - V.activeSlave.backTat = 0; - V.activeSlave.stampTat = 0; - V.activeSlave.bellyTat = 0; - V.activeSlave.abortionTat = 0; - V.activeSlave.birthsTat = 0; - V.activeSlave.corsetPiercing = 0; - V.activeSlave.nipplesPiercing = 0; - V.activeSlave.areolaePiercing = 0; - V.activeSlave.lipsPiercing = 0; - V.activeSlave.tonguePiercing = 0; - V.activeSlave.vaginaPiercing = 0; - V.activeSlave.clitPiercing = 0; - V.activeSlave.dickPiercing = 0; - V.activeSlave.anusPiercing = 0; + slave.brand = {}; + slave.scar = {}; + slave.chem = 0; + slave.addict = 0; + slave.boobsTat = 0; + slave.buttTat = 0; + slave.lipsTat = 0; + slave.vaginaTat = 0; + slave.dickTat = 0; + slave.anusTat = 0; + slave.shouldersTat = 0; + slave.armsTat = 0; + slave.legsTat = 0; + slave.backTat = 0; + slave.stampTat = 0; + slave.bellyTat = 0; + slave.abortionTat = 0; + slave.birthsTat = 0; + slave.corsetPiercing = 0; + slave.nipplesPiercing = 0; + slave.areolaePiercing = 0; + slave.lipsPiercing = 0; + slave.tonguePiercing = 0; + slave.vaginaPiercing = 0; + slave.clitPiercing = 0; + slave.dickPiercing = 0; + slave.anusPiercing = 0; } else if (V.arcologies[market].FSTransformationFetishist > 80) { r += `They vary in terms of what size their implants are, not whether they have them. `; - V.activeSlave.chem += jsRandom(10, 100); - V.activeSlave.boobsImplant = 200*jsRandom(2, 20); - if (V.activeSlave.boobsImplant > 10000) { - V.activeSlave.boobsImplantType = "hyper fillable"; - } else if (V.activeSlave.boobsImplant > 2200) { - V.activeSlave.boobsImplantType = jsEither(["advanced fillable", "advanced fillable", "advanced fillable", "string"]); - } else if (V.activeSlave.boobsImplant > 1000) { - V.activeSlave.boobsImplantType = jsEither(["fillable", "fillable", "normal", "string"]); + slave.chem += jsRandom(10, 100); + slave.boobsImplant = 200*jsRandom(2, 20); + if (slave.boobsImplant > 10000) { + slave.boobsImplantType = "hyper fillable"; + } else if (slave.boobsImplant > 2200) { + slave.boobsImplantType = jsEither(["advanced fillable", "advanced fillable", "advanced fillable", "string"]); + } else if (slave.boobsImplant > 1000) { + slave.boobsImplantType = jsEither(["fillable", "fillable", "normal", "string"]); } else { - V.activeSlave.boobsImplantType = jsEither(["normal", "normal", "normal", "string"]); + slave.boobsImplantType = jsEither(["normal", "normal", "normal", "string"]); } - V.activeSlave.boobs += V.activeSlave.boobsImplant; - V.activeSlave.buttImplant = jsRandom(2, 5); - if (V.activeSlave.buttImplant > 4) { - V.activeSlave.buttImplantType = jsEither(["fillable", "fillable", "normal", "string"]); + slave.boobs += slave.boobsImplant; + slave.buttImplant = jsRandom(2, 5); + if (slave.buttImplant > 4) { + slave.buttImplantType = jsEither(["fillable", "fillable", "normal", "string"]); } else { - V.activeSlave.buttImplantType = jsEither(["normal", "normal", "normal", "string"]); + slave.buttImplantType = jsEither(["normal", "normal", "normal", "string"]); } - V.activeSlave.butt += V.activeSlave.buttImplant; - V.activeSlave.lipsImplant = jsEither([10, 20]); - V.activeSlave.lips += V.activeSlave.lipsImplant; + slave.butt += slave.buttImplant; + slave.lipsImplant = jsEither([10, 20]); + slave.lips += slave.lipsImplant; if (V.arcologies[market].FSTransformationFetishistResearch === 1 && jsRandom(1, 100) <= 20) { r += `This one's implants are unusually large; a showcase of what ${pronoun.possessive} home arcology is capable of. `; - V.activeSlave.boobsImplant += 200*jsRandom(100, 200); - V.activeSlave.boobs += V.activeSlave.boobsImplant; - V.activeSlave.boobsImplantType = "hyper fillable"; - V.activeSlave.buttImplant += jsRandom(7, 12); - V.activeSlave.butt += V.activeSlave.buttImplant; - V.activeSlave.buttImplantType = "hyper fillable"; + slave.boobsImplant += 200*jsRandom(100, 200); + slave.boobs += slave.boobsImplant; + slave.boobsImplantType = "hyper fillable"; + slave.buttImplant += jsRandom(7, 12); + slave.butt += slave.buttImplant; + slave.buttImplantType = "hyper fillable"; } } if (V.arcologies[market].FSPetiteAdmiration > 20) { r += `They tend to be short, some far more than others. `; - if (V.activeSlave.height >= 160) { - V.activeSlave.height = Math.trunc(Height.random(V.activeSlave, {limitMult: [-2, 0]})); - if (V.activeSlave.height >= 160) { - V.activeSlave.height = Math.trunc(Height.random(V.activeSlave, {limitMult: [-3, -1]})); - if (V.activeSlave.height >= 160) { - V.activeSlave.height = jsRandom(90, 130); - V.activeSlave.geneticQuirks.dwarfism = 2; + if (slave.height >= 160) { + slave.height = Math.trunc(Height.random(slave, {limitMult: [-2, 0]})); + if (slave.height >= 160) { + slave.height = Math.trunc(Height.random(slave, {limitMult: [-3, -1]})); + if (slave.height >= 160) { + slave.height = jsRandom(90, 130); + slave.geneticQuirks.dwarfism = 2; } } } } else if (V.arcologies[market].FSStatuesqueGlorification > 20) { r += `They tend to be tall, if not unbelievably so. `; - if (V.activeSlave.height < 170) { - V.activeSlave.height = Math.trunc(Height.random(V.activeSlave, {limitMult: [0, 2]})); - if (V.activeSlave.height < 170) { - V.activeSlave.height = Math.trunc(Height.random(V.activeSlave, {limitMult: [1, 3]})); - if (V.activeSlave.height < 170) { - V.activeSlave.height = jsRandom(200, 264); - V.activeSlave.geneticQuirks.gigantism = 2; + if (slave.height < 170) { + slave.height = Math.trunc(Height.random(slave, {limitMult: [0, 2]})); + if (slave.height < 170) { + slave.height = Math.trunc(Height.random(slave, {limitMult: [1, 3]})); + if (slave.height < 170) { + slave.height = jsRandom(200, 264); + slave.geneticQuirks.gigantism = 2; } } } } if (V.arcologies[market].FSSlimnessEnthusiast > 20) { r += `They're never overweight, and are often quite lithe. `; - if (V.activeSlave.boobs > 400) { - V.activeSlave.boobs -= 100*jsRandom(0, 2); + if (slave.boobs > 400) { + slave.boobs -= 100*jsRandom(0, 2); } - if (V.activeSlave.butt > 3) { - V.activeSlave.butt -= jsRandom(0, 2); + if (slave.butt > 3) { + slave.butt -= jsRandom(0, 2); } - if (V.activeSlave.weight > 10) { - V.activeSlave.weight = jsRandom(-30, 0); + if (slave.weight > 10) { + slave.weight = jsRandom(-30, 0); } if (V.arcologies[market].FSSlimnessEnthusiastResearch === 1 && jsRandom(1, 100) <= 50) { r += `This one is perfectly flat; an ideal showcase of ${pronoun.possessive} home arcology's tastes. `; - V.activeSlave.boobs = 100; - V.activeSlave.butt = 0; - V.activeSlave.weight = jsRandom(-30, 0); + slave.boobs = 100; + slave.butt = 0; + slave.weight = jsRandom(-30, 0); } } else if (V.arcologies[market].FSAssetExpansionist > 20) { r += `Their butts are usually imposing, but their tits are what's often most impressive. `; - V.activeSlave.chem += jsRandom(10, 100); - if (V.activeSlave.boobs < 5000) { - V.activeSlave.boobs += 100*jsRandom(5, 50); + slave.chem += jsRandom(10, 100); + if (slave.boobs < 5000) { + slave.boobs += 100*jsRandom(5, 50); } - if (V.activeSlave.butt < 6) { - V.activeSlave.butt += jsRandom(2, 4); + if (slave.butt < 6) { + slave.butt += jsRandom(2, 4); } - if (V.activeSlave.weight < -10) { - V.activeSlave.weight += jsRandom(0, 20); + if (slave.weight < -10) { + slave.weight += jsRandom(0, 20); } if (V.arcologies[market].FSAssetExpansionistResearch === 1 && jsRandom(1, 100) <= 20) { r += `This one is unusually large; a showcase of what ${pronoun.possessive} home arcology is capable of. `; - V.activeSlave.boobs = 200*jsRandom(100, 200); - V.activeSlave.butt = jsRandom(10, 20); - if (V.activeSlave.dick > 0 && V.seeDicks !== 0) { - V.activeSlave.dick = jsRandom(20, 30); - V.activeSlave.balls = jsRandom(20, 125); + slave.boobs = 200*jsRandom(100, 200); + slave.butt = jsRandom(10, 20); + if (slave.dick > 0 && V.seeDicks !== 0) { + slave.dick = jsRandom(20, 30); + slave.balls = jsRandom(20, 125); } } } if (V.arcologies[market].FSPhysicalIdealist > 20) { r += `They're usually quite muscular, some to a truly imposing degree, and they're almost never unhealthy. `; - V.activeSlave.muscles = jsRandom(10, 100); - if (V.activeSlave.health.condition < 20) { - improveCondition(V.activeSlave, jsRandom(0, 8)); + slave.muscles = jsRandom(10, 100); + if (slave.health.condition < 20) { + improveCondition(slave, jsRandom(0, 8)); } } else if (V.arcologies[market].FSHedonisticDecadence > 20) { if (V.arcologies[market].FSSlimnessEnthusiast > 20) { r += `They're quite soft, usually sporting a cute muffin top, and rather laid back. `; - V.activeSlave.weight = jsRandom(10, 25); + slave.weight = jsRandom(10, 25); } else { r += `They're usually very soft and rather laid back. `; - V.activeSlave.weight = jsRandom(30, 180); + slave.weight = jsRandom(30, 180); } r += `Though they often come with intense fetishes. `; - V.activeSlave.muscles = jsRandom(-50, 0); - V.activeSlave.trust += jsRandom(5, 15); - V.activeSlave.energy += jsRandom(0, 10); + slave.muscles = jsRandom(-50, 0); + slave.trust += jsRandom(5, 15); + slave.energy += jsRandom(0, 10); if (V.arcologies[market].FSHedonisticDecadenceResearch === 1) { r += `They appear to have greatly enjoyed their stay at ${V.arcologies[market].name}. `; - V.activeSlave.energy += jsRandom(0, 10); - V.activeSlave.trust += jsRandom(10, 20); - V.activeSlave.devotion += jsRandom(10, 20); + slave.energy += jsRandom(0, 10); + slave.trust += jsRandom(10, 20); + slave.devotion += jsRandom(10, 20); } if (jsRandom(0, 3) === 0) { - V.activeSlave.behavioralFlaw = "gluttonous"; + slave.behavioralFlaw = "gluttonous"; } - if (V.activeSlave.fetish === "none") { - V.activeSlave.fetish = jsEither(["boobs", "buttslut", "cumslut", "dom", "humiliation", "masochist", "pregnancy", "sadist", "submissive"]); + if (slave.fetish === "none") { + slave.fetish = jsEither(["boobs", "buttslut", "cumslut", "dom", "humiliation", "masochist", "pregnancy", "sadist", "submissive"]); } - V.activeSlave.fetishStrength = jsRandom(60, 90); - if (jsRandom(1, 100) <= 5 && V.activeSlave.fetish !== "mindbroken") { - switch (V.activeSlave.fetish) { + slave.fetishStrength = jsRandom(60, 90); + if (jsRandom(1, 100) <= 5 && slave.fetish !== "mindbroken") { + switch (slave.fetish) { case "submissive": - V.activeSlave.sexualFlaw = "neglectful"; break; + slave.sexualFlaw = "neglectful"; + break; case "cumslut": - V.activeSlave.sexualFlaw = "cum addict"; break; + slave.sexualFlaw = "cum addict"; + break; case "humiliation": - V.activeSlave.sexualFlaw = "attention whore"; break; + slave.sexualFlaw = "attention whore"; + break; case "buttslut": - V.activeSlave.sexualFlaw = "anal addict"; break; + slave.sexualFlaw = "anal addict"; + break; case "boobs": - V.activeSlave.sexualFlaw = "breast growth"; break; + slave.sexualFlaw = "breast growth"; + break; case "pregnancy": - V.activeSlave.sexualFlaw = "breeder"; break; + slave.sexualFlaw = "breeder"; + break; case "dom": - V.activeSlave.sexualFlaw = "abusive"; break; + slave.sexualFlaw = "abusive"; + break; case "sadist": - V.activeSlave.sexualFlaw = "malicious"; break; + slave.sexualFlaw = "malicious"; + break; case "masochist": - V.activeSlave.sexualFlaw = "self hating"; + slave.sexualFlaw = "self hating"; } - V.activeSlave.fetishStrength = 100; + slave.fetishStrength = 100; } } if (V.arcologies[market].FSPastoralist > 20) { r += `Lactation is nearly universal among them, sometimes in ludicrous quantities. They tend to have huge udders, as well. `; - V.activeSlave.chem += jsRandom(10, 100); - if (V.activeSlave.boobs < 5000) { - V.activeSlave.boobs += 100*jsRandom(5, 50); + slave.chem += jsRandom(10, 100); + if (slave.boobs < 5000) { + slave.boobs += 100*jsRandom(5, 50); } - if (V.activeSlave.lactation === 0) { - V.activeSlave.lactation = jsEither([0, 1, 1, 1, 1, 2]); + if (slave.lactation === 0) { + slave.lactation = jsEither([0, 1, 1, 1, 1, 2]); } - if (V.activeSlave.lactation > 0) { - V.activeSlave.lactationDuration = 2; + if (slave.lactation > 0) { + slave.lactationDuration = 2; } - if (V.activeSlave.weight < -10) { - V.activeSlave.weight += jsRandom(0, 20); + if (slave.weight < -10) { + slave.weight += jsRandom(0, 20); } } else if (V.arcologies[market].FSCummunism > 20) { r += `Big balls and huge loads are commonplace among them, even if they sometimes lack dicks. They tend to be hard workers, as well. `; - V.activeSlave.chem += jsRandom(10, 100); + slave.chem += jsRandom(10, 100); if (V.arcologies[market].FSRestart > 50) { - V.activeSlave.dick = 0; - V.activeSlave.vagina = -1; + slave.dick = 0; + slave.vagina = -1; } - if (V.activeSlave.balls < 20) { - V.activeSlave.balls += jsRandom(5, 20); + if (slave.balls < 20) { + slave.balls += jsRandom(5, 20); } - V.activeSlave.scrotum = V.activeSlave.balls-5; - V.activeSlave.prostate = jsEither([1, 1, 1, 2, 2, 3]); - if (V.activeSlave.muscles < 30) { - V.activeSlave.muscles += jsRandom(0, 20); + slave.scrotum = slave.balls-5; + slave.prostate = jsEither([1, 1, 1, 2, 2, 3]); + if (slave.muscles < 30) { + slave.muscles += jsRandom(0, 20); } } if (V.arcologies[market].FSChattelReligionist > 20) { r += `They're rarely anything but devoted, and sometimes present interesting peccadilloes. `; - V.activeSlave.slaveName = setup.chattelReligionistSlaveNames.random(); - if (V.activeSlave.devotion < 10) { - V.activeSlave.devotion += jsRandom(0, 10); + slave.slaveName = setup.chattelReligionistSlaveNames.random(); + if (slave.devotion < 10) { + slave.devotion += jsRandom(0, 10); } - if (V.activeSlave.devotion < 10) { - V.activeSlave.devotion += jsRandom(0, 10); + if (slave.devotion < 10) { + slave.devotion += jsRandom(0, 10); } if (jsRandom(0, 1) === 0) { - V.activeSlave.behavioralQuirk = "sinful"; + slave.behavioralQuirk = "sinful"; } } if (V.arcologies[market].FSRomanRevivalist > 20) { r += `They've often `; - if (!canSee(V.activeSlave)) { + if (!canSee(slave)) { r += `been party to`; } else { r += `seen`; } r += ` things that drive any squeamishness out of them. `; - V.activeSlave.slaveName = setup.romanSlaveNames.random(); + slave.slaveName = setup.romanSlaveNames.random(); if (jsRandom(0, 1) === 0) { - V.activeSlave.sexualQuirk = "unflinching"; + slave.sexualQuirk = "unflinching"; } } else if (V.arcologies[market].FSAztecRevivalist > 20) { r += `They've seen sights that will traumatize almost anyone`; - if (!canSee(V.activeSlave)) { + if (!canSee(slave)) { r += ", so to speak. "; } else { r += ". "; } - V.activeSlave.slaveName = setup.aztecSlaveNames.random(); + slave.slaveName = setup.aztecSlaveNames.random(); if (jsRandom(0, 1) === 0) { - V.activeSlave.trust = -30; + slave.trust = -30; } } else if (V.arcologies[market].FSEgyptianRevivalist > 20) { r += `They've often done things that give them a distinct appetite for perversion. `; - V.activeSlave.slaveName = setup.ancientEgyptianSlaveNames.random(); + slave.slaveName = setup.ancientEgyptianSlaveNames.random(); if (jsRandom(0, 1) === 0) { - V.activeSlave.sexualQuirk = "perverted"; + slave.sexualQuirk = "perverted"; } } else if (V.arcologies[market].FSEdoRevivalist > 20) { r += `They have frequently absorbed much culture there. `; - V.activeSlave.slaveName = setup.edoSlaveNames.random(); - V.activeSlave.skill.entertainment = Math.clamp(V.activeSlave.skill.entertainment, 35, 100); + slave.slaveName = setup.edoSlaveNames.random(); + slave.skill.entertainment = Math.clamp(slave.skill.entertainment, 35, 100); } else if (V.arcologies[market].FSArabianRevivalist > 20) { r += `They've often been part of large harems in which selflessness is prized. `; if (jsRandom(0, 1) === 0) { - V.activeSlave.sexualQuirk = "caring"; + slave.sexualQuirk = "caring"; } } else if (V.arcologies[market].FSChineseRevivalist > 20) { r += `They've all passed through a thorough and uncompromising educational system for slaves. `; - V.activeSlave.intelligenceImplant = 30; + slave.intelligenceImplant = 30; if (V.arcologies[market].FSIntellectualDependency === "unset") { - if (V.activeSlave.intelligence < 60) { - V.activeSlave.intelligence += jsRandom(0, 20); + if (slave.intelligence < 60) { + slave.intelligence += jsRandom(0, 20); } } } if (V.arcologies[market].FSIncestFetishist > 20) { r += `Incest is acceptable, if not preferable to them. `; - if (V.activeSlave.sexualQuirk === "none" && V.activeSlave.behavioralQuirk === "none") { + if (slave.sexualQuirk === "none" && slave.behavioralQuirk === "none") { if (jsRandom(0, 1) === 0) { - V.activeSlave.sexualQuirk = "perverted"; + slave.sexualQuirk = "perverted"; } else { - V.activeSlave.behavioralQuirk = "sinful"; + slave.behavioralQuirk = "sinful"; } - } else if (V.activeSlave.sexualQuirk === "none" || V.activeSlave.sexualQuirk === "perverted") { - V.activeSlave.sexualQuirk = "perverted"; + } else if (slave.sexualQuirk === "none" || slave.sexualQuirk === "perverted") { + slave.sexualQuirk = "perverted"; } else { - V.activeSlave.behavioralQuirk = "sinful"; + slave.behavioralQuirk = "sinful"; } } if ((V.arcologies[0].FSDegradationist !== "unset") && (V.arcologies[market].FSPaternalist !== "unset")) { - V.activeSlave.devotion = jsRandom(-90, -60); - V.activeSlave.trust = -20; + slave.devotion = jsRandom(-90, -60); + slave.trust = -20; r += `<b>${V.arcologies[market].name}</b> is Paternalist, and your arcology is Degradationist. To its slaves, other niceties of social alignment are trivial. They view your arcology as a literal Hell on Earth. `; } else if ((V.arcologies[0].FSPaternalist !== "unset") && (V.arcologies[market].FSDegradationist !== "unset")) { - V.activeSlave.devotion = jsRandom(60, 90); - V.activeSlave.trust = 20; + slave.devotion = jsRandom(60, 90); + slave.trust = 20; r += `<b>${V.arcologies[market].name}</b> is Degradationist, and your arcology is Paternalist. To its slaves, other niceties of social alignment are trivial. They view your arcology as a promised land. `; } else if (opinion !== 0) { - V.activeSlave.devotion += opinion; - V.activeSlave.trust += opinion; - V.activeSlave.devotion = Math.clamp(V.activeSlave.devotion, -100, 75); - V.activeSlave.trust = Math.clamp(V.activeSlave.trust, -100, 75); + slave.devotion += opinion; + slave.trust += opinion; + slave.devotion = Math.clamp(slave.devotion, -100, 75); + slave.trust = Math.clamp(slave.trust, -100, 75); if (opinion > 2) { r += `Your arcology's close social alignment with <b>${V.arcologies[market].name}</b> makes its slaves more accepting of the prospect of life in your arcology, and willing to trust that they'll know how to survive there. `; } else if (opinion < -2) { @@ -1114,1949 +1130,2066 @@ window.generateMarketSlave = function(market = "kidnappers", numArcology = 1) { } } break; - case "heap": - V.activeSlave = GenerateNewSlave(); - V.activeSlave.origin = "You bought $him from a body dump, completely broken."; - V.activeSlave.devotion = 0; - V.activeSlave.trust = 0; - V.activeSlave.career = "a slave"; - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [-100, 0]}); - V.activeSlave.intelligenceImplant = 0; - setHealth(V.activeSlave, jsRandom(-50, 0), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(0), 0), jsRandom(40, 90)); - V.activeSlave.weight = jsRandom(-100, 0); + } + case "heap": { + slave = GenerateNewSlave("", SGProp); + slave.origin = "You bought $him from a body dump, completely broken."; + slave.devotion = 0; + slave.trust = 0; + slave.career = "a slave"; + slave.intelligence = Intelligence.random({limitIntelligence: [-100, 0]}); + slave.intelligenceImplant = 0; + setHealth(slave, jsRandom(-50, 0), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(0), 0), jsRandom(40, 90)); + slave.weight = jsRandom(-100, 0); if (jsRandom(1, 8) === 1) { - eyeSurgery(V.activeSlave, "both", "blind"); + eyeSurgery(slave, "both", "blind"); } else if (jsRandom(1, 7) <= 4) { - eyeSurgery(V.activeSlave, "both", "blur"); + eyeSurgery(slave, "both", "blur"); } - V.activeSlave.hears = jsEither([-2, -1, -1, -1, -1, 0, 0, 0]); + slave.hears = jsEither([-2, -1, -1, -1, -1, 0, 0, 0]); if (V.seeExtreme === 1 && jsRandom(0, 2) === 2) { // TODO: maybe only partly amputee? - removeLimbs(V.activeSlave, "all"); - } - if (hasAnyLegs(V.activeSlave)) { - V.activeSlave.heels = jsEither([0, 0, 0, 0, 0, 1, 1]); - } - V.activeSlave.voice = jsRandom(0, 2); - V.activeSlave.face = jsRandom(-100, 20); - if (V.activeSlave.vagina > -1) { - V.activeSlave.vagina = jsEither([1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 10]); - V.activeSlave.preg = jsRandom(-3, -1); - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.counter.vaginal += jsRandom(0, 300); - } - V.activeSlave.anus = jsEither([1, 2, 2, 3, 3, 3, 3, 4, 4, 4]); - if (V.activeSlave.balls > 1) { + removeLimbs(slave, "all"); + } + if (hasAnyLegs(slave)) { + slave.heels = jsEither([0, 0, 0, 0, 0, 1, 1]); + } + slave.voice = jsRandom(0, 2); + slave.face = jsRandom(-100, 20); + if (slave.vagina > -1) { + slave.vagina = jsEither([1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 10]); + slave.preg = jsRandom(-3, -1); + slave.belly = 0; + slave.bellyPreg = 0; + slave.counter.vaginal += jsRandom(0, 300); + } + slave.anus = jsEither([1, 2, 2, 3, 3, 3, 3, 4, 4, 4]); + if (slave.balls > 1) { if (jsRandom(1, 100) > 50) { - V.activeSlave.balls = 0; - } - } - V.activeSlave.counter.oral += jsRandom(0, 300); - V.activeSlave.counter.anal += jsRandom(0, 300); - if (V.activeSlave.boobs > 500) { - V.activeSlave.counter.mammary += jsRandom(0, 300); - } - V.activeSlave.skill.vaginal = 0; - V.activeSlave.skill.oral = 0; - V.activeSlave.skill.anal = 0; - V.activeSlave.skill.whoring = 0; - V.activeSlave.skill.entertainment = 0; - V.activeSlave.skill.combat = 0; - V.activeSlave.addict = jsEither([0, 0, 0, 10, 10, 20, 30]); - V.activeSlave.chem = jsRandom(0, 1000); - V.activeSlave.behavioralFlaw = "none"; - V.activeSlave.behavioralQuirk = "none"; - V.activeSlave.sexualFlaw = "none"; - V.activeSlave.sexualQuirk = "none"; - V.activeSlave.fetish = "mindbroken"; - V.activeSlave.fetishStrength = 0; + slave.balls = 0; + } + } + slave.counter.oral += jsRandom(0, 300); + slave.counter.anal += jsRandom(0, 300); + if (slave.boobs > 500) { + slave.counter.mammary += jsRandom(0, 300); + } + slave.skill.vaginal = 0; + slave.skill.oral = 0; + slave.skill.anal = 0; + slave.skill.whoring = 0; + slave.skill.entertainment = 0; + slave.skill.combat = 0; + slave.addict = jsEither([0, 0, 0, 10, 10, 20, 30]); + slave.chem = jsRandom(0, 1000); + slave.behavioralFlaw = "none"; + slave.behavioralQuirk = "none"; + slave.sexualFlaw = "none"; + slave.sexualQuirk = "none"; + slave.fetish = "mindbroken"; + slave.fetishStrength = 0; break; - case "wetware": - V.fixedNationality = "Stateless"; - V.activeSlave = GenerateNewSlave(); - V.activeSlave.origin = "You bought $him from a wetware CPU farm, $his body ruined but $his mind subjected to a simulated career."; - V.activeSlave.devotion = 40; - V.activeSlave.trust = -100; - V.activeSlave.career = jsEither(["a business owner", "a college scout", "a counselor", "a dairy worker", "a doctor", "a house DJ", "a politician", "a prison guard", "a secretary", "a soldier", "a teacher", "a lawyer"]); - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [50, 100]}); - V.activeSlave.intelligenceImplant = 30; - setHealth(V.activeSlave, jsRandom(-50, -10), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(0), 0), jsRandom(40, 90)); - V.activeSlave.weight = jsRandom(-100, -50); - V.activeSlave.muscles = jsRandom(-100, -50); - eyeSurgery(V.activeSlave, "both", "blind"); - V.activeSlave.hears = -2; - V.activeSlave.smells = -1; - V.activeSlave.tastes = -1; + } + case "wetware": { + SGProp.nationality = "Stateless"; + slave = GenerateNewSlave("", SGProp); + slave.origin = "You bought $him from a wetware CPU farm, $his body ruined but $his mind subjected to a simulated career."; + slave.devotion = 40; + slave.trust = -100; + slave.career = jsEither(["a business owner", "a college scout", "a counselor", "a dairy worker", "a doctor", "a house DJ", "a politician", "a prison guard", "a secretary", "a soldier", "a teacher", "a lawyer"]); + slave.intelligence = Intelligence.random({limitIntelligence: [50, 100]}); + slave.intelligenceImplant = 30; + setHealth(slave, jsRandom(-50, -10), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(0), 0), jsRandom(40, 90)); + slave.weight = jsRandom(-100, -50); + slave.muscles = jsRandom(-100, -50); + eyeSurgery(slave, "both", "blind"); + slave.hears = -2; + slave.smells = -1; + slave.tastes = -1; if (V.seeExtreme === 1) { - removeLimbs(V.activeSlave, "all"); - V.activeSlave.earShape = "none"; - } - if (hasAnyLegs(V.activeSlave)) { - V.activeSlave.heels = 1; - } - V.activeSlave.voice = 0; - V.activeSlave.face = jsRandom(-50, 75); - V.activeSlave.butt = 0; - if (V.activeSlave.vagina > -1) { - V.activeSlave.vagina = jsEither([1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 10]); - V.activeSlave.preg = jsRandom(-3, -1); - V.activeSlave.counter.vaginal += jsRandom(0, 300); - } - V.activeSlave.anus = jsEither([1, 2, 2, 3, 3, 3, 3, 4, 4, 4]); - if (V.activeSlave.balls > 1 && jsRandom(1, 100) > 50) { - V.activeSlave.balls = 0; - } - V.activeSlave.counter.oral += jsRandom(0, 300); - V.activeSlave.counter.anal += jsRandom(0, 300); - if (V.activeSlave.boobs > 500) { - V.activeSlave.counter.mammary += jsRandom(0, 300); - } - V.activeSlave.skill.vaginal = jsRandom(80, 100); - V.activeSlave.skill.oral = jsRandom(80, 100); - V.activeSlave.skill.anal = jsRandom(80, 100); - V.activeSlave.skill.whoring = jsRandom(80, 100); - V.activeSlave.skill.entertainment = jsRandom(80, 100); - switch (V.activeSlave.career) { + removeLimbs(slave, "all"); + slave.earShape = "none"; + } + if (hasAnyLegs(slave)) { + slave.heels = 1; + } + slave.voice = 0; + slave.face = jsRandom(-50, 75); + slave.butt = 0; + if (slave.vagina > -1) { + slave.vagina = jsEither([1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 10]); + slave.preg = jsRandom(-3, -1); + slave.counter.vaginal += jsRandom(0, 300); + } + slave.anus = jsEither([1, 2, 2, 3, 3, 3, 3, 4, 4, 4]); + if (slave.balls > 1 && jsRandom(1, 100) > 50) { + slave.balls = 0; + } + slave.counter.oral += jsRandom(0, 300); + slave.counter.anal += jsRandom(0, 300); + if (slave.boobs > 500) { + slave.counter.mammary += jsRandom(0, 300); + } + slave.skill.vaginal = jsRandom(80, 100); + slave.skill.oral = jsRandom(80, 100); + slave.skill.anal = jsRandom(80, 100); + slave.skill.whoring = jsRandom(80, 100); + slave.skill.entertainment = jsRandom(80, 100); + switch (slave.career) { case "a lawyer": - V.activeSlave.slaveName = "WCPU-HG"; break; + slave.slaveName = "WCPU-HG"; + break; case "a college scout": - V.activeSlave.slaveName = "WCPU-RC"; break; + slave.slaveName = "WCPU-RC"; + break; case "a business owner": - V.activeSlave.slaveName = "WCPU-MD"; break; + slave.slaveName = "WCPU-MD"; + break; case "a house DJ": - V.activeSlave.slaveName = "WCPU-DJ"; break; + slave.slaveName = "WCPU-DJ"; + break; case "a soldier": - V.activeSlave.slaveName = "WCPU-BG"; break; + slave.slaveName = "WCPU-BG"; + break; case "a prison guard": - V.activeSlave.slaveName = "WCPU-WD"; break; + slave.slaveName = "WCPU-WD"; + break; case "a doctor": - V.activeSlave.slaveName = "WCPU-NS"; break; + slave.slaveName = "WCPU-NS"; + break; case "a counselor": - V.activeSlave.slaveName = "WCPU-AT"; break; + slave.slaveName = "WCPU-AT"; + break; case "a dairy worker": - V.activeSlave.slaveName = "WCPU-MK"; break; + slave.slaveName = "WCPU-MK"; + break; case "a secretary": - V.activeSlave.slaveName = "WCPU-ST"; break; + slave.slaveName = "WCPU-ST"; + break; case "a teacher": - V.activeSlave.slaveName = "WCPU-TE"; + slave.slaveName = "WCPU-TE"; + break; } - V.activeSlave.slaveSurname = `#${V.activeSlave.skill.vaginal}${V.activeSlave.skill.oral}${V.activeSlave.skill.anal}${V.activeSlave.skill.whoring}${V.activeSlave.skill.entertainment}-${V.activeSlave.intelligence} `; - V.activeSlave.birthName = ""; - V.activeSlave.birthSurname = ""; - if (V.activeSlave.career === "a soldier") { - V.activeSlave.skill.combat = 1; + slave.slaveSurname = `#${slave.skill.vaginal}${slave.skill.oral}${slave.skill.anal}${slave.skill.whoring}${slave.skill.entertainment}-${slave.intelligence} `; + slave.birthName = ""; + slave.birthSurname = ""; + if (slave.career === "a soldier") { + slave.skill.combat = 1; } else { - V.activeSlave.skill.combat = 0; - } - V.activeSlave.addict = jsEither([0, 0, 0, 10, 10, 20, 30]); - V.activeSlave.chem = jsRandom(500, 1000); - V.activeSlave.behavioralFlaw = "none"; - V.activeSlave.behavioralQuirk = "none"; - V.activeSlave.sexualFlaw = "none"; - V.activeSlave.sexualQuirk = "none"; - V.activeSlave.fetish = "none"; - V.activeSlave.fetishStrength = 0; + slave.skill.combat = 0; + } + slave.addict = jsEither([0, 0, 0, 10, 10, 20, 30]); + slave.chem = jsRandom(500, 1000); + slave.behavioralFlaw = "none"; + slave.behavioralQuirk = "none"; + slave.sexualFlaw = "none"; + slave.sexualQuirk = "none"; + slave.fetish = "none"; + slave.fetishStrength = 0; break; - case "kidnappers": - V.activeSlave = GenerateNewSlave(); - V.activeSlave.origin = "You bought $him from the kidnappers' slave market, so $he was probably forced into slavery."; - V.activeSlave.devotion -= 5; - V.activeSlave.trust = jsRandom(-45, -25); - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [-90, 45]}); - setHealth(V.activeSlave, jsRandom(-80, 20), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(0, 0.7), 0), jsRandom(30, 70)); - if (V.activeSlave.vagina > 1 && isFertile(V.activeSlave)) { - V.activeSlave.preg = jsEither([-2, -1, -1, -1, -1, -1, -1, -1, 1, 20, 40]); - if (V.activeSlave.preg > 0) { - V.activeSlave.pregType = setPregType(V.activeSlave); - } - SetBellySize(V.activeSlave); + } + case "kidnappers": { + slave = GenerateNewSlave("", SGProp); + slave.origin = "You bought $him from the kidnappers' slave market, so $he was probably forced into slavery."; + slave.devotion -= 5; + slave.trust = jsRandom(-45, -25); + slave.intelligence = Intelligence.random({limitIntelligence: [-90, 45]}); + setHealth(slave, jsRandom(-80, 20), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(0, 0.7), 0), jsRandom(30, 70)); + if (slave.vagina > 1 && isFertile(slave)) { + slave.preg = jsEither([-2, -1, -1, -1, -1, -1, -1, -1, 1, 20, 40]); + if (slave.preg > 0) { + slave.pregType = setPregType(slave); + } + SetBellySize(slave); } break; - case "indentures": - V.oneTimeDisableDisability = 1; + } + case "indentures": { + SGProp.disableDisability = 1; if (V.arcologies[0].FSSupremacistLawME === 1) { - V.fixedRace = V.arcologies[0].FSSupremacistRace; + SGProp.race = V.arcologies[0].FSSupremacistRace; } else if (V.arcologies[0].FSSubjugationistLawME === 1) { const races = setup.filterRacesLowercase.filter(race => race !== V.arcologies[0].FSSubjugationistRace); - V.fixedRace = jsEither(races); - } - V.activeSlave = GenerateNewSlave(); - V.activeSlave.origin = "You purchased $his indenture contract, making $him yours for as long as it lasts."; - V.activeSlave.indentureRestrictions = jsEither([0, 1, 1, 2, 2, 2, 2]); - if (V.activeSlave.indentureRestrictions >= 2) { - V.activeSlave.devotion = jsRandom(25, 45); - V.activeSlave.trust = jsRandom(-20, 20); - } else if (V.activeSlave.indentureRestrictions === 1) { - V.activeSlave.devotion = jsRandom(-20, 20); - V.activeSlave.trust = jsRandom(-45, -25); + SGProp.race = jsEither(races); + } + slave = GenerateNewSlave("", SGProp); + slave.origin = "You purchased $his indenture contract, making $him yours for as long as it lasts."; + slave.indentureRestrictions = jsEither([0, 1, 1, 2, 2, 2, 2]); + if (slave.indentureRestrictions >= 2) { + slave.devotion = jsRandom(25, 45); + slave.trust = jsRandom(-20, 20); + } else if (slave.indentureRestrictions === 1) { + slave.devotion = jsRandom(-20, 20); + slave.trust = jsRandom(-45, -25); } else { - V.activeSlave.devotion = jsRandom(-45, -25); - V.activeSlave.trust = jsRandom(-75, -60); + slave.devotion = jsRandom(-45, -25); + slave.trust = jsRandom(-75, -60); } - V.activeSlave.indenture = jsEither([26, 52, 104, 156, 208]); + slave.indenture = jsEither([26, 52, 104, 156, 208]); break; - case "hunters": - V.activeSlave = GenerateNewSlave(); - V.activeSlave.origin = "You bought $him from the runaway hunters' slave market after they recaptured $him and $his original owner did not pay their fee."; - V.activeSlave.devotion = -20; - V.activeSlave.trust = jsRandom(-15, 15); - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [0, 100]}); - V.activeSlave.intelligenceImplant = 15; - if (V.activeSlave.physicalAge >= 12) { - V.activeSlave.teeth = "normal"; - } - setHealth(V.activeSlave, jsRandom(-10, 70), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(30, 70)); - if (V.activeSlave.vagina > -1) { - V.activeSlave.preg = jsEither([-2, -1, -1, -1, -1, -1, -1, -1, 1, 1]); - if (V.activeSlave.physicalAge < V.activeSlave.pubertyAgeXX) { - V.activeSlave.preg = -1; - } - if (V.activeSlave.preg > 0) { - V.activeSlave.pregType = setPregType(V.activeSlave); - } - SetBellySize(V.activeSlave); - V.activeSlave.skill.vaginal = jsRandom(15, 100); - V.activeSlave.vagina = jsRandom(1, 3); - } - if (V.activeSlave.balls > 0) { + } + case "hunters": { + slave = GenerateNewSlave("", SGProp); + slave.origin = "You bought $him from the runaway hunters' slave market after they recaptured $him and $his original owner did not pay their fee."; + slave.devotion = -20; + slave.trust = jsRandom(-15, 15); + slave.intelligence = Intelligence.random({limitIntelligence: [0, 100]}); + slave.intelligenceImplant = 15; + if (slave.physicalAge >= 12) { + slave.teeth = "normal"; + } + setHealth(slave, jsRandom(-10, 70), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(30, 70)); + if (slave.vagina > -1) { + slave.preg = jsEither([-2, -1, -1, -1, -1, -1, -1, -1, 1, 1]); + if (slave.physicalAge < slave.pubertyAgeXX) { + slave.preg = -1; + } + if (slave.preg > 0) { + slave.pregType = setPregType(slave); + } + SetBellySize(slave); + slave.skill.vaginal = jsRandom(15, 100); + slave.vagina = jsRandom(1, 3); + } + if (slave.balls > 0) { if (jsRandom(1, 3) === 1) { - V.activeSlave.balls = 0; - } - } - V.activeSlave.skill.combat = jsEither([0, 0, 0, 0, 0, 1]); - V.activeSlave.skill.entertainment = jsRandom(15, 100); - V.activeSlave.skill.whoring = jsRandom(15, 100); - V.activeSlave.skill.oral = jsRandom(15, 100); - V.activeSlave.skill.anal = jsRandom(15, 100); - V.activeSlave.anus = jsRandom(1, 3); - V.activeSlave.weight = Math.clamp(-25, 25, V.activeSlave.weight); - V.activeSlave.behavioralFlaw = jsEither(["anorexic", "arrogant", "bitchy", "devout", "gluttonous", "hates men", "hates women", "hates women", "liberated", "odd"]); - V.activeSlave.sexualFlaw = jsEither(["apathetic", "crude", "hates anal", "hates oral", "hates penetration", "idealistic", "judgemental", "repressed", "shamefast"]); + slave.balls = 0; + } + } + slave.skill.combat = jsEither([0, 0, 0, 0, 0, 1]); + slave.skill.entertainment = jsRandom(15, 100); + slave.skill.whoring = jsRandom(15, 100); + slave.skill.oral = jsRandom(15, 100); + slave.skill.anal = jsRandom(15, 100); + slave.anus = jsRandom(1, 3); + slave.weight = Math.clamp(-25, 25, slave.weight); + slave.behavioralFlaw = jsEither(["anorexic", "arrogant", "bitchy", "devout", "gluttonous", "hates men", "hates women", "hates women", "liberated", "odd"]); + slave.sexualFlaw = jsEither(["apathetic", "crude", "hates anal", "hates oral", "hates penetration", "idealistic", "judgemental", "repressed", "shamefast"]); if (jsRandom(1, 2) === 1) { let slaveGen = jsRandom(2, 8)*200; - V.activeSlave.boobs += slaveGen; - V.activeSlave.boobsImplant += slaveGen; - if (V.activeSlave.boobsImplant > 1000) { - V.activeSlave.boobsImplantType = jsEither(["fillable", "fillable", "normal", "string"]); + slave.boobs += slaveGen; + slave.boobsImplant += slaveGen; + if (slave.boobsImplant > 1000) { + slave.boobsImplantType = jsEither(["fillable", "fillable", "normal", "string"]); } else { - V.activeSlave.boobsImplantType = jsEither(["normal", "normal", "normal", "string"]); + slave.boobsImplantType = jsEither(["normal", "normal", "normal", "string"]); } slaveGen = jsRandom(1, 3); - V.activeSlave.butt += slaveGen; - V.activeSlave.buttImplant += slaveGen; - V.activeSlave.buttImplantType = "normal"; + slave.butt += slaveGen; + slave.buttImplant += slaveGen; + slave.buttImplantType = "normal"; slaveGen = jsEither([10, 20]); - V.activeSlave.lips += slaveGen; - V.activeSlave.lipsImplant += slaveGen; - V.activeSlave.waist = Math.trunc(V.activeSlave.waist, -100, 15); - if (V.activeSlave.face < 40) { - V.activeSlave.faceImplant = 20*jsRandom(0, 1); - V.activeSlave.face = Math.clamp(V.activeSlave.face+V.activeSlave.faceImplant, -100, 100); - } - if (V.activeSlave.physicalAge >= 30) { + slave.lips += slaveGen; + slave.lipsImplant += slaveGen; + slave.waist = Math.trunc(slave.waist, -100, 15); + if (slave.face < 40) { + slave.faceImplant = 20*jsRandom(0, 1); + slave.face = Math.clamp(slave.face+slave.faceImplant, -100, 100); + } + if (slave.physicalAge >= 30) { if (jsRandom(0, 1) > 0) { - applyAgeImplant(V.activeSlave); + applyAgeImplant(slave); } } } if (V.arcologies[0].FSPaternalistSMR === 0) { - V.activeSlave.heels = 1; + slave.heels = 1; } break; - case "underage raiders": - V.activeSlaveOneTimeMinAge = V.minimumSlaveAge; - V.activeSlaveOneTimeMaxAge = V.fertilityAge; - V.one_time_age_overrides_pedo_mode = 1; // Must not have had their first period. - V.activeSlave = GenerateNewSlave(); - V.activeSlave.origin = "You bought $him from the underage raiders' slave market."; - V.activeSlave.trust -= 25; - setHealth(V.activeSlave, jsRandom(-30, 70), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 0.7), 0), jsRandom(20, 60)); - V.activeSlave.career = setup.veryYoungCareers.random(); - V.activeSlave.birthWeek = 0; - if (V.activeSlave.vagina !== -1) { - V.activeSlave.skill.vaginal = 0; - V.activeSlave.vagina = 0; - V.activeSlave.trueVirgin = 1; - V.activeSlave.preg = 0; - SetBellySize(V.activeSlave); - } - V.activeSlave.skill.anal = 0; - V.activeSlave.anus = 0; - V.activeSlave.skill.oral = 0; - V.activeSlave.skill.whoring = 0; - + } + case "underage raiders": { + SGProp.minAge = V.minimumSlaveAge; + SGProp.maxAge = V.fertilityAge; + SGProp.ageOverridesPedoMode = 1; // Must not have had their first period. + slave = GenerateNewSlave("", SGProp); + slave.origin = "You bought $him from the underage raiders' slave market."; + slave.trust -= 25; + setHealth(slave, jsRandom(-30, 70), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 0.7), 0), jsRandom(20, 60)); + slave.career = setup.veryYoungCareers.random(); + slave.birthWeek = 0; + if (slave.vagina !== -1) { + slave.skill.vaginal = 0; + slave.vagina = 0; + slave.trueVirgin = 1; + slave.preg = 0; + SetBellySize(slave); + } + slave.skill.anal = 0; + slave.anus = 0; + slave.skill.oral = 0; + slave.skill.whoring = 0; break; - case "raiders": - V.activeSlaveOneTimeMinAge = 18; - V.activeSlaveOneTimeMaxAge = 18; - V.one_time_age_overrides_pedo_mode = 1; // Supposed to have just reached the age of majority. - V.activeSlave = GenerateNewSlave(); - V.activeSlave.origin = "You bought $him from the $girl raiders' slave market the week $he reached $his majority."; - V.activeSlave.trust -= 25; - setHealth(V.activeSlave, jsRandom(-30, 70), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(0, 3), 0), Math.max(normalRandInt(0, 0.7), 0), jsRandom(30, 70)); - V.activeSlave.career = jsEither(["a cheerleader", "a farm laborer", "a party girl", "a student", "a student", "a student", "a student", "a student"]); - V.activeSlave.birthWeek = 0; - if (V.activeSlave.vagina !== -1) { + } + case "raiders": { + SGProp.minAge = 18; + SGProp.maxAge = 18; + SGProp.ageOverridesPedoMode = 1; // Supposed to have just reached the age of majority. + slave = GenerateNewSlave("", SGProp); + slave.origin = "You bought $him from the $girl raiders' slave market the week $he reached $his majority."; + slave.trust -= 25; + setHealth(slave, jsRandom(-30, 70), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(0, 3), 0), Math.max(normalRandInt(0, 0.7), 0), jsRandom(30, 70)); + slave.career = jsEither(["a cheerleader", "a farm laborer", "a party girl", "a student", "a student", "a student", "a student", "a student"]); + slave.birthWeek = 0; + if (slave.vagina !== -1) { if (jsRandom(1, 2) === 1) { - V.activeSlave.skill.vaginal = 0; - V.activeSlave.vagina = 0; - V.activeSlave.trueVirgin = 1; - V.activeSlave.preg = 0; - SetBellySize(V.activeSlave); + slave.skill.vaginal = 0; + slave.vagina = 0; + slave.trueVirgin = 1; + slave.preg = 0; + SetBellySize(slave); } } if (jsRandom(1, 2) === 1) { - V.activeSlave.skill.anal = 0; - V.activeSlave.anus = 0; + slave.skill.anal = 0; + slave.anus = 0; } if (jsRandom(1, 2) === 1) { - V.activeSlave.skill.oral = 0; + slave.skill.oral = 0; } - V.activeSlave.skill.whoring = 0; + slave.skill.whoring = 0; break; - case "trainers": - V.activeSlaveOneTimeMaxAge = 42; - V.activeSlave = GenerateNewSlave(); - V.activeSlave.origin = "You bought $him from the trainers' slave market after they put $him through basic training."; - V.activeSlave.devotion += 40; - V.activeSlave.trust += 40; - setHealth(V.activeSlave, jsRandom(-20, 80), Math.max(normalRandInt(0, 2), 0), undefined, Math.max(normalRandInt(0, 0.4), 0)); - if (V.activeSlave.vagina !== -1) { - V.activeSlave.skill.vaginal += 15; + } + case "trainers": { + SGProp.maxAge = 42; + slave = GenerateNewSlave("", SGProp); + slave.origin = "You bought $him from the trainers' slave market after they put $him through basic training."; + slave.devotion += 40; + slave.trust += 40; + setHealth(slave, jsRandom(-20, 80), Math.max(normalRandInt(0, 2), 0), undefined, Math.max(normalRandInt(0, 0.4), 0)); + if (slave.vagina !== -1) { + slave.skill.vaginal += 15; } else { - V.activeSlave.skill.vaginal = 0; - V.activeSlave.clit = 0; + slave.skill.vaginal = 0; + slave.clit = 0; } - if (V.activeSlave.vagina === 0) { - V.activeSlave.vagina += 1; + if (slave.vagina === 0) { + slave.vagina += 1; } - if (V.activeSlave.anus === 0) { - V.activeSlave.anus += 1; + if (slave.anus === 0) { + slave.anus += 1; } - V.activeSlave.skill.oral += 15; - V.activeSlave.skill.anal += 15; - V.activeSlave.fetishKnown = 1; - if (V.activeSlave.accent >= 3) { - V.activeSlave.accent -= 1; + slave.skill.oral += 15; + slave.skill.anal += 15; + slave.fetishKnown = 1; + if (slave.accent >= 3) { + slave.accent -= 1; } if (jsRandom(1, 100) > 50) { - V.activeSlave.sexualFlaw = "none"; + slave.sexualFlaw = "none"; } if (jsRandom(1, 100) > 50) { - V.activeSlave.behavioralFlaw = "none"; + slave.behavioralFlaw = "none"; } break; - case "TSS": + } + case "TSS": { if (V.TSS.schoolUpgrade === 1) { - V.activeSlaveOneTimeMinAge = 36; + SGProp.minAge = 36; } else { - V.activeSlaveOneTimeMaxAge = 18; + SGProp.maxAge = 18; } - V.oneTimeDisableDisability = 1; - V.activeSlave = GenerateNewSlave("XX"); - V.activeSlave.career = "a slave"; - V.activeSlave.butt = jsEither([1, 2, 2, 3]); - V.activeSlave.boobs = jsEither([200, 300, 300, 400]); + SGProp.disableDisability = 1; + slave = GenerateNewSlave("XX", SGProp); + slave.career = "a slave"; + slave.butt = jsEither([1, 2, 2, 3]); + slave.boobs = jsEither([200, 300, 300, 400]); if (V.TSS.schoolUpgrade === 1) { - V.activeSlave.origin = "You bought $him fresh from the new Slavegirl School after $he was retrained as a slave $girl."; - V.activeSlave.butt += 1; - V.activeSlave.boobs += 200; - V.activeSlave.anus = 1; - V.activeSlave.vagina = 1; + slave.origin = "You bought $him fresh from the new Slavegirl School after $he was retrained as a slave $girl."; + slave.butt += 1; + slave.boobs += 200; + slave.anus = 1; + slave.vagina = 1; } else { - V.activeSlave.origin = "You bought $him fresh from the Slavegirl School right after $his majority."; - V.activeSlave.anus = 0; - V.activeSlave.vagina = 0; - V.activeSlave.trueVirgin = 1; - V.activeSlave.birthWeek = 0; - } - V.activeSlave.intelligenceImplant = 30; - if (V.activeSlave.physicalAge >= 12) { - V.activeSlave.teeth = "normal"; - } - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [-20, 70]}); - V.activeSlave.devotion = jsRandom(25, 45); - V.activeSlave.trust = jsRandom(25, 45); - setHealth(V.activeSlave, jsRandom(50, 60), 0, Math.max(normalRandInt(0), 0), 0, jsRandom(0, 20)); - V.activeSlave.preg = 0; - SetBellySize(V.activeSlave); - V.activeSlave.weight = 0; - V.activeSlave.waist = jsRandom(-30, 10); - V.activeSlave.chem = 20; + slave.origin = "You bought $him fresh from the Slavegirl School right after $his majority."; + slave.anus = 0; + slave.vagina = 0; + slave.trueVirgin = 1; + slave.birthWeek = 0; + } + slave.intelligenceImplant = 30; + if (slave.physicalAge >= 12) { + slave.teeth = "normal"; + } + slave.intelligence = Intelligence.random({limitIntelligence: [-20, 70]}); + slave.devotion = jsRandom(25, 45); + slave.trust = jsRandom(25, 45); + setHealth(slave, jsRandom(50, 60), 0, Math.max(normalRandInt(0), 0), 0, jsRandom(0, 20)); + slave.preg = 0; + SetBellySize(slave); + slave.weight = 0; + slave.waist = jsRandom(-30, 10); + slave.chem = 20; if (V.TSS.schoolUpgrade === 0) { - V.activeSlave.skill.vaginal = 0; - V.activeSlave.skill.oral = 0; - V.activeSlave.skill.anal = 0; - V.activeSlave.skill.whoring = 0; - V.activeSlave.skill.entertainment = 15; + slave.skill.vaginal = 0; + slave.skill.oral = 0; + slave.skill.anal = 0; + slave.skill.whoring = 0; + slave.skill.entertainment = 15; } else { - V.activeSlave.skill.vaginal = 15; - V.activeSlave.skill.oral = 15; - V.activeSlave.skill.anal = 15; - V.activeSlave.skill.whoring = 15; - V.activeSlave.skill.entertainment = 15; - } - V.activeSlave.skill.combat = 0; - V.activeSlave.pubicHStyle = "waxed"; - V.activeSlave.underArmHStyle = "waxed"; - V.activeSlave.sexualFlaw = "none"; - V.activeSlave.behavioralFlaw = "none"; - V.activeSlave.hStyle = "tails"; - V.activeSlave.custom.tattoo = "$He has the simple logo of the corporation that operates The Slavegirl School tattooed on $his left cheek."; + slave.skill.vaginal = 15; + slave.skill.oral = 15; + slave.skill.anal = 15; + slave.skill.whoring = 15; + slave.skill.entertainment = 15; + } + slave.skill.combat = 0; + slave.pubicHStyle = "waxed"; + slave.underArmHStyle = "waxed"; + slave.sexualFlaw = "none"; + slave.behavioralFlaw = "none"; + slave.hStyle = "tails"; + slave.custom.tattoo = "$He has the simple logo of the corporation that operates The Slavegirl School tattooed on $his left cheek."; break; - case "GRI": - V.activeSlaveOneTimeMinAge = 16; - V.activeSlaveOneTimeMaxAge = 19; - V.oneTimeDisableDisability = 1; - V.activeSlave = GenerateNewSlave("XX"); - V.activeSlave.origin = "You bought $him from the Growth Research Institute right after $his use as a test subject ended."; - V.activeSlave.career = "a slave"; - V.activeSlave.intelligenceImplant = 0; - V.activeSlave.devotion = jsRandom(-15, -5); - V.activeSlave.trust = jsRandom(-25, -45); - V.activeSlave.chem = 100; + } + case "GRI": { + SGProp.minAge = 16; + SGProp.maxAge = 19; + SGProp.disableDisability = 1; + slave = GenerateNewSlave("XX", SGProp); + slave.origin = "You bought $him from the Growth Research Institute right after $his use as a test subject ended."; + slave.career = "a slave"; + slave.intelligenceImplant = 0; + slave.devotion = jsRandom(-15, -5); + slave.trust = jsRandom(-25, -45); + slave.chem = 100; if (V.GRI.schoolUpgrade === 1) { - setHealth(V.activeSlave, 200, 0, Math.max(normalRandInt(0), 0), 0, 0); + setHealth(slave, 200, 0, Math.max(normalRandInt(0), 0), 0, 0); } else { - setHealth(V.activeSlave, jsRandom(-50, 100), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(0, 0.5), 0), jsRandom(0, 20)); + setHealth(slave, jsRandom(-50, 100), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(0, 0.5), 0), jsRandom(0, 20)); } - V.activeSlave.height = jsRandom(160, 210); - V.activeSlave.butt = jsRandom(4, 10); + slave.height = jsRandom(160, 210); + slave.butt = jsRandom(4, 10); if (V.GRI.schoolUpgrade === 2) { - V.activeSlave.boobs = 200*jsRandom(15, 30); - V.activeSlave.lactation = 2; - V.activeSlave.lactationDuration = 2; + slave.boobs = 200*jsRandom(15, 30); + slave.lactation = 2; + slave.lactationDuration = 2; } else { - V.activeSlave.boobs = 200*jsRandom(4, 20); - } - V.activeSlave.nipples = jsEither(["huge", "inverted"]); - V.activeSlave.areolae = jsEither([0, 1, 2, 3, 4]); - V.activeSlave.clit = jsEither([0, 1, 2, 3]); - V.activeSlave.lips = jsRandom(5, 85); - V.activeSlave.anus = 0; - V.activeSlave.vagina = 0; - V.activeSlave.preg = 0; - SetBellySize(V.activeSlave); - V.activeSlave.weight = 0; - V.activeSlave.waist = jsRandom(-20, 30); - V.activeSlave.skill.vaginal = 0; - V.activeSlave.skill.oral = 0; - V.activeSlave.skill.anal = 0; - V.activeSlave.skill.whoring = 0; - V.activeSlave.skill.entertainment = 0; - V.activeSlave.skill.combat = 0; - V.activeSlave.pubicHStyle = "waxed"; - V.activeSlave.birthWeek = 0; - V.activeSlave.behavioralFlaw = "odd"; - V.activeSlave.hStyle = "shaved"; - V.activeSlave.hLength = 0; - V.activeSlave.custom.tattoo = "$He has a barcode that identified $him when $he was a test subject at the Growth Research Institute tattooed on $his left cheek."; - + slave.boobs = 200*jsRandom(4, 20); + } + slave.nipples = jsEither(["huge", "inverted"]); + slave.areolae = jsEither([0, 1, 2, 3, 4]); + slave.clit = jsEither([0, 1, 2, 3]); + slave.lips = jsRandom(5, 85); + slave.anus = 0; + slave.vagina = 0; + slave.preg = 0; + SetBellySize(slave); + slave.weight = 0; + slave.waist = jsRandom(-20, 30); + slave.skill.vaginal = 0; + slave.skill.oral = 0; + slave.skill.anal = 0; + slave.skill.whoring = 0; + slave.skill.entertainment = 0; + slave.skill.combat = 0; + slave.pubicHStyle = "waxed"; + slave.birthWeek = 0; + slave.behavioralFlaw = "odd"; + slave.hStyle = "shaved"; + slave.hLength = 0; + slave.custom.tattoo = "$He has a barcode that identified $him when $he was a test subject at the Growth Research Institute tattooed on $his left cheek."; break; - case "SCP": - V.activeSlaveOneTimeMinAge = 16; - V.activeSlaveOneTimeMaxAge = 19; - V.oneTimeDisableDisability = 1; - V.activeSlave = GenerateNewSlave("XX"); - V.activeSlave.origin = "You bought $him from St. Claver Preparatory after $he served as a plastic surgeon's passing final exam."; - V.activeSlave.chem = 20; - V.activeSlave.career = "a slave"; + } + case "SCP": { + SGProp.minAge = 16; + SGProp.maxAge = 19; + SGProp.disableDisability = 1; + slave = GenerateNewSlave("XX", SGProp); + slave.origin = "You bought $him from St. Claver Preparatory after $he served as a plastic surgeon's passing final exam."; + slave.chem = 20; + slave.career = "a slave"; if (V.SCP.schoolUpgrade === 1) { - V.activeSlave.intelligenceImplant = 0; - V.activeSlave.intelligence = -60; - V.activeSlave.devotion = 100; - V.activeSlave.trust = 100; + slave.intelligenceImplant = 0; + slave.intelligence = -60; + slave.devotion = 100; + slave.trust = 100; } else { - V.activeSlave.intelligenceImplant = 15; - V.activeSlave.teeth = "normal"; - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [-30, 60]}); - V.activeSlave.devotion = jsRandom(25, 45); - V.activeSlave.trust = jsRandom(25, 45); - } - setHealth(V.activeSlave, 100, Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(5, 4), 0), 0, jsRandom(0, 20)); - V.activeSlave.heightImplant = 1; - V.activeSlave.height += 10; - V.activeSlave.buttImplant = (4-V.activeSlave.butt); - V.activeSlave.buttImplantType = "normal"; - V.activeSlave.butt += V.activeSlave.buttImplant; - V.activeSlave.boobsImplant = (2000-V.activeSlave.boobs); - V.activeSlave.boobs += V.activeSlave.boobsImplant; - V.activeSlave.boobsImplantType = "fillable"; - V.activeSlave.nipples = "tiny"; - V.activeSlave.areolae = 0; - V.activeSlave.clit = 0; - V.activeSlave.lipsImplant = (20-V.activeSlave.lips); - V.activeSlave.lips += V.activeSlave.lipsImplant; - V.activeSlave.faceImplant = 40; - V.activeSlave.face = Math.clamp(V.activeSlave.face+V.activeSlave.faceImplant, -100, 100); - V.activeSlave.faceShape = "normal"; - V.activeSlave.anus = 0; - V.activeSlave.vagina = 0; - V.activeSlave.preg = 0; - SetBellySize(V.activeSlave); - V.activeSlave.weight = -20; - V.activeSlave.waist = -50; + slave.intelligenceImplant = 15; + slave.teeth = "normal"; + slave.intelligence = Intelligence.random({limitIntelligence: [-30, 60]}); + slave.devotion = jsRandom(25, 45); + slave.trust = jsRandom(25, 45); + } + setHealth(slave, 100, Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(5, 4), 0), 0, jsRandom(0, 20)); + slave.heightImplant = 1; + slave.height += 10; + slave.buttImplant = (4-slave.butt); + slave.buttImplantType = "normal"; + slave.butt += slave.buttImplant; + slave.boobsImplant = (2000-slave.boobs); + slave.boobs += slave.boobsImplant; + slave.boobsImplantType = "fillable"; + slave.nipples = "tiny"; + slave.areolae = 0; + slave.clit = 0; + slave.lipsImplant = (20-slave.lips); + slave.lips += slave.lipsImplant; + slave.faceImplant = 40; + slave.face = Math.clamp(slave.face+slave.faceImplant, -100, 100); + slave.faceShape = "normal"; + slave.anus = 0; + slave.vagina = 0; + slave.preg = 0; + SetBellySize(slave); + slave.weight = -20; + slave.waist = -50; if (V.SCP.schoolUpgrade === 2) { - V.activeSlave.skill.vaginal = 15; - V.activeSlave.skill.oral = 15; - V.activeSlave.skill.anal = 15; - V.activeSlave.skill.whoring = 15; - V.activeSlave.skill.entertainment = 15; + slave.skill.vaginal = 15; + slave.skill.oral = 15; + slave.skill.anal = 15; + slave.skill.whoring = 15; + slave.skill.entertainment = 15; } else { - V.activeSlave.skill.vaginal = 0; - V.activeSlave.skill.oral = 0; - V.activeSlave.skill.anal = 0; - V.activeSlave.skill.whoring = 0; - V.activeSlave.skill.entertainment = 0; - } - V.activeSlave.skill.combat = 0; - V.activeSlave.pubicHStyle = "waxed"; - V.activeSlave.underArmHStyle = "waxed"; - V.activeSlave.birthWeek = 0; - V.activeSlave.sexualFlaw = "none"; - V.activeSlave.behavioralFlaw = "none"; - V.activeSlave.hStyle = "tails"; - V.activeSlave.pubicHColor = "blonde"; - V.activeSlave.underArmHColor = "blonde"; - V.activeSlave.eyebrowHColor = "blonde"; - V.activeSlave.race = "white"; - V.activeSlave.skin = "sun tanned"; - V.activeSlave.override_H_Color = 1; - V.activeSlave.override_Race = 1; - V.activeSlave.override_Skin = 1; - V.activeSlave.custom.tattoo = "$He has the coat of arms of St. Claver Preparatory tattooed on $his left cheek."; - + slave.skill.vaginal = 0; + slave.skill.oral = 0; + slave.skill.anal = 0; + slave.skill.whoring = 0; + slave.skill.entertainment = 0; + } + slave.skill.combat = 0; + slave.pubicHStyle = "waxed"; + slave.underArmHStyle = "waxed"; + slave.birthWeek = 0; + slave.sexualFlaw = "none"; + slave.behavioralFlaw = "none"; + slave.hStyle = "tails"; + slave.pubicHColor = "blonde"; + slave.underArmHColor = "blonde"; + slave.eyebrowHColor = "blonde"; + slave.race = "white"; + slave.skin = "sun tanned"; + slave.override_H_Color = 1; + slave.override_Race = 1; + slave.override_Skin = 1; + slave.custom.tattoo = "$He has the coat of arms of St. Claver Preparatory tattooed on $his left cheek."; break; - case "LDE": - V.activeSlaveOneTimeMinAge = 16; - V.activeSlaveOneTimeMaxAge = 19; - V.oneTimeDisableDisability = 1; - V.activeSlave = GenerateNewSlave("XY"); - V.activeSlave.origin = "You bought $him from the innovative École des Enculées right after $his graduation."; - V.activeSlave.career = "a slave"; - V.activeSlave.intelligenceImplant = 0; - V.activeSlave.chem = 100; + } + case "LDE": { + SGProp.minAge = 16; + SGProp.maxAge = 19; + SGProp.disableDisability = 1; + slave = GenerateNewSlave("XY", SGProp); + slave.origin = "You bought $him from the innovative École des Enculées right after $his graduation."; + slave.career = "a slave"; + slave.intelligenceImplant = 0; + slave.chem = 100; if (V.LDE.schoolUpgrade === 1) { - V.activeSlave.devotion = 100; - V.activeSlave.trust = 100; + slave.devotion = 100; + slave.trust = 100; } else { - V.activeSlave.devotion = jsRandom(60, 75); - V.activeSlave.trust = jsRandom(55, 60); - } - setHealth(V.activeSlave, jsRandom(60, 80), 0, Math.max(normalRandInt(0, 2), 0), 0, jsRandom(0, 20)); - V.activeSlave.muscles = 0; - V.activeSlave.butt = jsEither([4, 5]); - V.activeSlave.face = jsRandom(15, 55); - V.activeSlave.faceShape = "androgynous"; - V.activeSlave.boobs = jsEither([500, 650, 800]); - V.activeSlave.waist = -15; - V.activeSlave.lips = 35; + slave.devotion = jsRandom(60, 75); + slave.trust = jsRandom(55, 60); + } + setHealth(slave, jsRandom(60, 80), 0, Math.max(normalRandInt(0, 2), 0), 0, jsRandom(0, 20)); + slave.muscles = 0; + slave.butt = jsEither([4, 5]); + slave.face = jsRandom(15, 55); + slave.faceShape = "androgynous"; + slave.boobs = jsEither([500, 650, 800]); + slave.waist = -15; + slave.lips = 35; if (V.LDE.schoolUpgrade === 2) { - V.activeSlave.dick = jsEither([3, 4]); - V.activeSlave.balls = jsEither([3, 4]); - if (V.activeSlave.foreskin > 0) { - V.activeSlave.foreskin = V.activeSlave.dick; + slave.dick = jsEither([3, 4]); + slave.balls = jsEither([3, 4]); + if (slave.foreskin > 0) { + slave.foreskin = slave.dick; } - if (V.activeSlave.balls > 0) { - V.activeSlave.scrotum = V.activeSlave.balls; + if (slave.balls > 0) { + slave.scrotum = slave.balls; } } else { - V.activeSlave.dick = jsEither([1, 1, 1, 2]); - V.activeSlave.balls = jsEither([1, 1, 1, 2]); - if (V.activeSlave.foreskin > 0) { - V.activeSlave.foreskin = V.activeSlave.dick; - } - if (V.activeSlave.balls > 0) { - V.activeSlave.scrotum = V.activeSlave.balls; - } - V.activeSlave.pubertyXY = 0; - V.activeSlave.pubertyAgeXY = jsRandom(24, 50); - } - V.activeSlave.anus = 2; - V.activeSlave.vagina = -1; - V.activeSlave.preg = 0; - SetBellySize(V.activeSlave); - V.activeSlave.weight = jsRandom(0, 20); - V.activeSlave.skill.vaginal = 0; - V.activeSlave.skill.oral = 15; - V.activeSlave.skill.anal = 100; - V.activeSlave.skill.whoring = 15; - V.activeSlave.skill.entertainment = 15; - V.activeSlave.skill.combat = 0; - V.activeSlave.pubicHStyle = "waxed"; - V.activeSlave.birthWeek = 0; - V.activeSlave.sexualFlaw = "none"; - V.activeSlave.behavioralFlaw = jsEither(["none", "odd"]); - V.activeSlave.fetishStrength = jsEither([1, 2]); - V.activeSlave.fetish = "buttslut"; - V.activeSlave.fetishKnown = 1; - V.activeSlave.attrKnown = 1; - V.activeSlave.hStyle = "tails"; - V.activeSlave.hLength = 100; - V.activeSlave.custom.tattoo = "$He has the buttock-shaped symbol of the École des Enculées that created $him tattooed on $his left cheek."; - + slave.dick = jsEither([1, 1, 1, 2]); + slave.balls = jsEither([1, 1, 1, 2]); + if (slave.foreskin > 0) { + slave.foreskin = slave.dick; + } + if (slave.balls > 0) { + slave.scrotum = slave.balls; + } + slave.pubertyXY = 0; + slave.pubertyAgeXY = jsRandom(24, 50); + } + slave.anus = 2; + slave.vagina = -1; + slave.preg = 0; + SetBellySize(slave); + slave.weight = jsRandom(0, 20); + slave.skill.vaginal = 0; + slave.skill.oral = 15; + slave.skill.anal = 100; + slave.skill.whoring = 15; + slave.skill.entertainment = 15; + slave.skill.combat = 0; + slave.pubicHStyle = "waxed"; + slave.birthWeek = 0; + slave.sexualFlaw = "none"; + slave.behavioralFlaw = jsEither(["none", "odd"]); + slave.fetishStrength = jsEither([1, 2]); + slave.fetish = "buttslut"; + slave.fetishKnown = 1; + slave.attrKnown = 1; + slave.hStyle = "tails"; + slave.hLength = 100; + slave.custom.tattoo = "$He has the buttock-shaped symbol of the École des Enculées that created $him tattooed on $his left cheek."; break; - case "TGA": - V.activeSlaveOneTimeMinAge = 16; - V.activeSlaveOneTimeMaxAge = 19; - V.oneTimeDisableDisability = 1; - V.activeSlave = GenerateNewSlave("XY"); - V.activeSlave.origin = "You bought $him fresh from the intense Gymnasium-Academy right after $his majority."; - V.activeSlave.career = "a slave"; - V.activeSlave.intelligenceImplant = 30; - V.activeSlave.teeth = "normal"; - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [-20, 60]}); - V.activeSlave.chem = 20; + } + case "TGA": { + SGProp.minAge = 16; + SGProp.maxAge = 19; + SGProp.disableDisability = 1; + slave = GenerateNewSlave("XY", SGProp); + slave.origin = "You bought $him fresh from the intense Gymnasium-Academy right after $his majority."; + slave.career = "a slave"; + slave.intelligenceImplant = 30; + slave.teeth = "normal"; + slave.intelligence = Intelligence.random({limitIntelligence: [-20, 60]}); + slave.chem = 20; if (V.TGA.schoolUpgrade === 1) { - V.activeSlave.devotion = 100; - V.activeSlave.trust = 100; + slave.devotion = 100; + slave.trust = 100; } else { - V.activeSlave.devotion = jsRandom(25, 45); - V.activeSlave.trust = jsRandom(25, 45); - } - setHealth(V.activeSlave, 100, 0, undefined, Math.max(normalRandInt(0, 0.4), 0), jsRandom(0, 30)); - V.activeSlave.muscles = jsEither([20, 50, 50]); - V.activeSlave.butt = jsEither([2, 2, 3]); - V.activeSlave.boobs = jsEither([100, 200]); - V.activeSlave.dick = jsRandom(3, 5); - V.activeSlave.balls = jsRandom(3, 5); - V.activeSlave.anus = 0; - V.activeSlave.vagina = -1; - V.activeSlave.preg = 0; - SetBellySize(V.activeSlave); - V.activeSlave.weight = 0; - V.activeSlave.waist = jsRandom(-10, 30); - V.activeSlave.skill.vaginal = 0; - V.activeSlave.skill.oral = 0; - V.activeSlave.skill.anal = 0; - V.activeSlave.skill.whoring = 0; - V.activeSlave.skill.entertainment = 0; + slave.devotion = jsRandom(25, 45); + slave.trust = jsRandom(25, 45); + } + setHealth(slave, 100, 0, undefined, Math.max(normalRandInt(0, 0.4), 0), jsRandom(0, 30)); + slave.muscles = jsEither([20, 50, 50]); + slave.butt = jsEither([2, 2, 3]); + slave.boobs = jsEither([100, 200]); + slave.dick = jsRandom(3, 5); + slave.balls = jsRandom(3, 5); + slave.anus = 0; + slave.vagina = -1; + slave.preg = 0; + SetBellySize(slave); + slave.weight = 0; + slave.waist = jsRandom(-10, 30); + slave.skill.vaginal = 0; + slave.skill.oral = 0; + slave.skill.anal = 0; + slave.skill.whoring = 0; + slave.skill.entertainment = 0; if (V.TGA.schoolUpgrade === 2) { - V.activeSlave.skill.combat = 1; + slave.skill.combat = 1; } else { - V.activeSlave.skill.combat = 0; - } - V.activeSlave.pubicHStyle = "waxed"; - V.activeSlave.underArmHStyle = "waxed"; - V.activeSlave.birthWeek = 0; - V.activeSlave.sexualFlaw = jsEither(["apathetic", "none"]); - V.activeSlave.behavioralFlaw = jsEither(["arrogant", "none", "odd"]); - V.activeSlave.hStyle = "short"; - V.activeSlave.hLength = 2; - V.activeSlave.brand["left cheek"] = "the baroque crest of the Gymnasium-Academy that trained $him"; + slave.skill.combat = 0; + } + slave.pubicHStyle = "waxed"; + slave.underArmHStyle = "waxed"; + slave.birthWeek = 0; + slave.sexualFlaw = jsEither(["apathetic", "none"]); + slave.behavioralFlaw = jsEither(["arrogant", "none", "odd"]); + slave.hStyle = "short"; + slave.hLength = 2; + slave.brand["left cheek"] = "the baroque crest of the Gymnasium-Academy that trained $him"; break; - case "TCR": + } + case "TCR": { if (V.TCR.schoolUpgrade === 2 && jsRandom(1, 100) <= 20) { - V.activeSlaveOneTimeMinAge = V.fertilityAge; - V.activeSlaveOneTimeMaxAge = 18; - V.one_time_age_overrides_pedo_mode = 1; - V.oneTimeDisableDisability = 1; - V.activeSlave = GenerateNewSlave("XX"); - V.activeSlave.origin = "You bought $him from The Cattle Ranch."; - V.activeSlave.career = "a dairy slave"; - V.activeSlave.slaveName = setup.cowSlaveNames.random(); - V.activeSlave.slaveSurname = 0; - V.activeSlave.butt = jsEither([2, 2, 3, 3, 3, 4, 4]); - V.activeSlave.boobs = ((V.activeSlave.physicalAge*100)*2)+jsEither([-100, -100, 0, 0, 100, 100, 200, 200, 300, 500]); - V.activeSlave.lactation = 0; - V.activeSlave.lactationAdaptation = 0; - V.activeSlave.lactationDuration = 0; - V.activeSlave.anus = 0; - V.activeSlave.vagina = 0; - V.activeSlave.trueVirgin = 1; - V.activeSlave.vaginaLube = jsEither([1, 1, 2]); - V.activeSlave.intelligenceImplant = 0; - V.activeSlave.devotion = -20; - V.activeSlave.trust = -20; - setHealth(V.activeSlave, jsRandom(20, 30), 0, Math.max(normalRandInt(0, 4), 0), 0); - V.activeSlave.preg = 0; - SetBellySize(V.activeSlave); - V.activeSlave.hips = jsEither([0, 0, 1, 1, 1, 2]); - V.activeSlave.weight = jsRandom(-20, 10); - V.activeSlave.waist = jsRandom(-30, 10); - V.activeSlave.muscles = 0; - V.activeSlave.skill.vaginal = 0; - V.activeSlave.skill.oral = 0; - V.activeSlave.skill.anal = 0; - V.activeSlave.skill.whoring = 0; - V.activeSlave.skill.entertainment = 0; - V.activeSlave.skill.combat = 0; - V.activeSlave.pubicHStyle = "waxed"; - V.activeSlave.underArmHStyle = "waxed"; - V.activeSlave.heels = 1; - V.activeSlave.hStyle = "neat"; - V.activeSlave.collar = "leather with cowbell"; - V.activeSlave.brand["right thigh"] = "the logo of the Cattle Ranch"; + SGProp.minAge = V.fertilityAge; + SGProp.maxAge = 18; + SGProp.ageOverridesPedoMode = 1; + SGProp.disableDisability = 1; + slave = GenerateNewSlave("XX", SGProp); + slave.origin = "You bought $him from The Cattle Ranch."; + slave.career = "a dairy slave"; + slave.slaveName = setup.cowSlaveNames.random(); + slave.slaveSurname = 0; + slave.butt = jsEither([2, 2, 3, 3, 3, 4, 4]); + slave.boobs = ((slave.physicalAge*100)*2)+jsEither([-100, -100, 0, 0, 100, 100, 200, 200, 300, 500]); + slave.lactation = 0; + slave.lactationAdaptation = 0; + slave.lactationDuration = 0; + slave.anus = 0; + slave.vagina = 0; + slave.trueVirgin = 1; + slave.vaginaLube = jsEither([1, 1, 2]); + slave.intelligenceImplant = 0; + slave.devotion = -20; + slave.trust = -20; + setHealth(slave, jsRandom(20, 30), 0, Math.max(normalRandInt(0, 4), 0), 0); + slave.preg = 0; + SetBellySize(slave); + slave.hips = jsEither([0, 0, 1, 1, 1, 2]); + slave.weight = jsRandom(-20, 10); + slave.waist = jsRandom(-30, 10); + slave.muscles = 0; + slave.skill.vaginal = 0; + slave.skill.oral = 0; + slave.skill.anal = 0; + slave.skill.whoring = 0; + slave.skill.entertainment = 0; + slave.skill.combat = 0; + slave.pubicHStyle = "waxed"; + slave.underArmHStyle = "waxed"; + slave.heels = 1; + slave.hStyle = "neat"; + slave.collar = "leather with cowbell"; + slave.brand["right thigh"] = "the logo of the Cattle Ranch"; } else if (V.TCR.schoolUpgrade === 1 && jsRandom(1, 100) <= 20) { - V.activeSlaveOneTimeMinAge = V.potencyAge+1; - V.activeSlaveOneTimeMaxAge = 24; - V.one_time_age_overrides_pedo_mode = 1; - V.oneTimeDisableDisability = 1; - V.activeSlave = GenerateNewSlave("XY"); - V.activeSlave.slaveName = setup.cowSlaveNames.random(); - V.activeSlave.slaveSurname = 0; - V.activeSlave.origin = "You bought $him from The Cattle Ranch."; - V.activeSlave.career = "a breeding bull"; - V.activeSlave.butt = jsEither([3, 3, 4, 4, 4, 5, 6]); - V.activeSlave.boobs = 100; - V.activeSlave.anus = 0; - V.activeSlave.intelligence = -100; - V.activeSlave.intelligenceImplant = 0; - V.activeSlave.devotion = 100; - V.activeSlave.trust = 100; - setHealth(V.activeSlave, jsRandom(20, 30), 0, Math.max(normalRandInt(0, 4), 0), 0); - V.activeSlave.hips = jsEither([1, 1, 1, 2, 2]); - V.activeSlave.dick = 6; - V.activeSlave.foreskin = 0; - V.activeSlave.balls = jsRandom(19, 30); - V.activeSlave.scrotum = 10; - V.activeSlave.prostate = 2; - V.activeSlave.weight = jsRandom(10, 30); - V.activeSlave.waist = jsRandom(0, 100); - V.activeSlave.muscles = jsRandom(80, 100); - V.activeSlave.skill.vaginal = 0; - V.activeSlave.skill.oral = 0; - V.activeSlave.skill.anal = 0; - V.activeSlave.skill.whoring = 0; - V.activeSlave.skill.entertainment = 0; - V.activeSlave.skill.combat = 0; - V.activeSlave.pubicHStyle = "waxed"; - V.activeSlave.underArmHStyle = "waxed"; - V.activeSlave.heels = 1; - V.activeSlave.energy = 100; - V.activeSlave.fetish = "mindbroken"; - V.activeSlave.fetishStrength = 10; - V.activeSlave.fetishKnown = 1; - V.activeSlave.sexualFlaw = "none"; - V.activeSlave.behavioralFlaw = "none"; - V.activeSlave.sexualQuirk = "none"; - V.activeSlave.behavioralQuirk = "none"; - V.activeSlave.hStyle = "neat"; - V.activeSlave.brand["right thigh"] = "the logo of the Cattle Ranch"; + SGProp.minAge = V.potencyAge+1; + SGProp.maxAge = 24; + SGProp.ageOverridesPedoMode = 1; + SGProp.disableDisability = 1; + slave = GenerateNewSlave("XY", SGProp); + slave.slaveName = setup.cowSlaveNames.random(); + slave.slaveSurname = 0; + slave.origin = "You bought $him from The Cattle Ranch."; + slave.career = "a breeding bull"; + slave.butt = jsEither([3, 3, 4, 4, 4, 5, 6]); + slave.boobs = 100; + slave.anus = 0; + slave.intelligence = -100; + slave.intelligenceImplant = 0; + slave.devotion = 100; + slave.trust = 100; + setHealth(slave, jsRandom(20, 30), 0, Math.max(normalRandInt(0, 4), 0), 0); + slave.hips = jsEither([1, 1, 1, 2, 2]); + slave.dick = 6; + slave.foreskin = 0; + slave.balls = jsRandom(19, 30); + slave.scrotum = 10; + slave.prostate = 2; + slave.weight = jsRandom(10, 30); + slave.waist = jsRandom(0, 100); + slave.muscles = jsRandom(80, 100); + slave.skill.vaginal = 0; + slave.skill.oral = 0; + slave.skill.anal = 0; + slave.skill.whoring = 0; + slave.skill.entertainment = 0; + slave.skill.combat = 0; + slave.pubicHStyle = "waxed"; + slave.underArmHStyle = "waxed"; + slave.heels = 1; + slave.energy = 100; + slave.fetish = "mindbroken"; + slave.fetishStrength = 10; + slave.fetishKnown = 1; + slave.sexualFlaw = "none"; + slave.behavioralFlaw = "none"; + slave.sexualQuirk = "none"; + slave.behavioralQuirk = "none"; + slave.hStyle = "neat"; + slave.brand["right thigh"] = "the logo of the Cattle Ranch"; } else { - V.activeSlaveOneTimeMinAge = 19; - V.activeSlaveOneTimeMaxAge = 24; - V.one_time_age_overrides_pedo_mode = 1; - V.oneTimeDisableDisability = 1; - V.activeSlave = GenerateNewSlave("XX"); - V.activeSlave.slaveName = setup.cowSlaveNames.random(); - V.activeSlave.slaveSurname = 0; - V.activeSlave.origin = "You bought $him from The Cattle Ranch."; - V.activeSlave.career = "a dairy cow"; - V.activeSlave.butt = jsEither([3, 3, 4, 4, 4, 5, 6]); - V.activeSlave.boobs = ((V.activeSlave.physicalAge*100)*2)+jsEither([-100, -100, 0, 0, 100, 100, 200, 200, 300, 500]); - V.activeSlave.lactation = 1; - V.activeSlave.lactationDuration = 2; - V.activeSlave.lactationAdaptation = 100; - V.activeSlave.anus = 1; - V.activeSlave.vagina = 3; - V.activeSlave.vaginaLube = 2; - V.activeSlave.intelligence = jsEither([-100, -100, -100, -100, -60, -60, -30]); - V.activeSlave.intelligenceImplant = 0; - V.activeSlave.devotion = 100; - V.activeSlave.trust = 100; - setHealth(V.activeSlave, jsRandom(20, 30), 0, Math.max(normalRandInt(0, 4), 0), 0); - V.activeSlave.preg = jsRandom(10, 40); - V.activeSlave.pregType = jsRandom(1, 5); - V.activeSlave.pregKnown = 1; - SetBellySize(V.activeSlave); - V.activeSlave.bellySag = 2; - V.activeSlave.bellySagPreg = 2; - V.activeSlave.hips = jsEither([1, 1, 1, 2, 2]); - V.activeSlave.counter.birthsTotal = jsRandom(1, 7); - V.activeSlave.pregAdaptation = 120; - V.activeSlave.weight = jsRandom(20, 90); - V.activeSlave.waist = jsRandom(-10, 50); - V.activeSlave.muscles = jsRandom(60, 80); - V.activeSlave.chem = 0; - V.activeSlave.skill.vaginal = 0; - V.activeSlave.skill.oral = 0; - V.activeSlave.skill.anal = 0; - V.activeSlave.skill.whoring = 0; - V.activeSlave.skill.entertainment = 0; - V.activeSlave.skill.combat = 0; - V.activeSlave.pubicHStyle = "waxed"; - V.activeSlave.underArmHStyle = "waxed"; - V.activeSlave.heels = 1; - V.activeSlave.fetish = "mindbroken"; - V.activeSlave.fetishStrength = 10; - V.activeSlave.fetishKnown = 1; - V.activeSlave.sexualFlaw = "none"; - V.activeSlave.behavioralFlaw = "none"; - V.activeSlave.sexualQuirk = "none"; - V.activeSlave.behavioralQuirk = "none"; - V.activeSlave.hStyle = "neat"; - V.activeSlave.collar = "leather with cowbell"; - V.activeSlave.brand["right thigh"] = "the logo of the Cattle Ranch"; + SGProp.minAge = 19; + SGProp.maxAge = 24; + SGProp.ageOverridesPedoMode = 1; + SGProp.disableDisability = 1; + slave = GenerateNewSlave("XX", SGProp); + slave.slaveName = setup.cowSlaveNames.random(); + slave.slaveSurname = 0; + slave.origin = "You bought $him from The Cattle Ranch."; + slave.career = "a dairy cow"; + slave.butt = jsEither([3, 3, 4, 4, 4, 5, 6]); + slave.boobs = ((slave.physicalAge*100)*2)+jsEither([-100, -100, 0, 0, 100, 100, 200, 200, 300, 500]); + slave.lactation = 1; + slave.lactationDuration = 2; + slave.lactationAdaptation = 100; + slave.anus = 1; + slave.vagina = 3; + slave.vaginaLube = 2; + slave.intelligence = jsEither([-100, -100, -100, -100, -60, -60, -30]); + slave.intelligenceImplant = 0; + slave.devotion = 100; + slave.trust = 100; + setHealth(slave, jsRandom(20, 30), 0, Math.max(normalRandInt(0, 4), 0), 0); + slave.preg = jsRandom(10, 40); + slave.pregType = jsRandom(1, 5); + slave.pregKnown = 1; + SetBellySize(slave); + slave.bellySag = 2; + slave.bellySagPreg = 2; + slave.hips = jsEither([1, 1, 1, 2, 2]); + slave.counter.birthsTotal = jsRandom(1, 7); + slave.pregAdaptation = 120; + slave.weight = jsRandom(20, 90); + slave.waist = jsRandom(-10, 50); + slave.muscles = jsRandom(60, 80); + slave.chem = 0; + slave.skill.vaginal = 0; + slave.skill.oral = 0; + slave.skill.anal = 0; + slave.skill.whoring = 0; + slave.skill.entertainment = 0; + slave.skill.combat = 0; + slave.pubicHStyle = "waxed"; + slave.underArmHStyle = "waxed"; + slave.heels = 1; + slave.fetish = "mindbroken"; + slave.fetishStrength = 10; + slave.fetishKnown = 1; + slave.sexualFlaw = "none"; + slave.behavioralFlaw = "none"; + slave.sexualQuirk = "none"; + slave.behavioralQuirk = "none"; + slave.hStyle = "neat"; + slave.collar = "leather with cowbell"; + slave.brand["right thigh"] = "the logo of the Cattle Ranch"; } break; - case "TFS": - V.activeSlaveOneTimeMinAge = 25; - V.activeSlaveOneTimeMaxAge = 29; - V.one_time_age_overrides_pedo_mode = 1; - V.oneTimeDisableDisability = 1; + } + case "TFS": { + SGProp.minAge = 25; + SGProp.maxAge = 29; + SGProp.ageOverridesPedoMode = 1; + SGProp.disableDisability = 1; if (V.TFS.schoolUpgrade === 3 && V.TFS.compromiseWeek+15 <= V.week) { - V.activeSlave = GenerateNewSlave(); + slave = GenerateNewSlave("", SGProp); } else { - V.activeSlave = GenerateNewSlave("XY"); + slave = GenerateNewSlave("XY", SGProp); } - V.activeSlave.origin = "You bought $him from the enigmatic Futanari Sisters after they sold $him into slavery."; - V.activeSlave.career = "a Futanari Sister"; - V.activeSlave.faceShape = jsEither(["exotic", "sensual"]); - V.activeSlave.pubertyXY = 1; + slave.origin = "You bought $him from the enigmatic Futanari Sisters after they sold $him into slavery."; + slave.career = "a Futanari Sister"; + slave.faceShape = jsEither(["exotic", "sensual"]); + slave.pubertyXY = 1; sisterAge = jsRandom(1, 5); if (sisterAge === 1) { - V.activeSlave.intelligence = -60; - V.activeSlave.hips = 0; - V.activeSlave.face = jsEither([35, 35, 35, 75, 100]); + slave.intelligence = -60; + slave.hips = 0; + slave.face = jsEither([35, 35, 35, 75, 100]); if (V.TFS.schoolUpgrade === 3 && V.TFS.compromiseWeek+15 <= V.week) { - if (V.activeSlave.genes === "XY") { - V.activeSlave.balls = 6; - V.activeSlave.scrotum = V.activeSlave.balls; + if (slave.genes === "XY") { + slave.balls = 6; + slave.scrotum = slave.balls; } else { - V.activeSlave.balls = 1; - V.activeSlave.scrotum = 0; + slave.balls = 1; + slave.scrotum = 0; } } else if (V.TFS.schoolUpgrade === 1) { - V.activeSlave.balls = 1; - V.activeSlave.scrotum = 0; + slave.balls = 1; + slave.scrotum = 0; } else if (V.TFS.schoolUpgrade === 2) { - V.activeSlave.balls = 6; - V.activeSlave.scrotum = V.activeSlave.balls; + slave.balls = 6; + slave.scrotum = slave.balls; } else { - V.activeSlave.balls = jsRandom(2, 3); - V.activeSlave.scrotum = V.activeSlave.balls; - } - V.activeSlave.lips = 10; - V.activeSlave.weight = 0; - V.activeSlave.waist = jsRandom(-30, 10); - V.activeSlave.actualAge = jsRandom(19, 24); - V.activeSlave.physicalAge = V.activeSlave.actualAge; - V.activeSlave.visualAge = V.activeSlave.actualAge; - V.activeSlave.ovaryAge = V.activeSlave.actualAge; - V.activeSlave.vagina = 2; - V.activeSlave.anus = 2; - V.activeSlave.fetish = "submissive"; + slave.balls = jsRandom(2, 3); + slave.scrotum = slave.balls; + } + slave.lips = 10; + slave.weight = 0; + slave.waist = jsRandom(-30, 10); + slave.actualAge = jsRandom(19, 24); + slave.physicalAge = slave.actualAge; + slave.visualAge = slave.actualAge; + slave.ovaryAge = slave.actualAge; + slave.vagina = 2; + slave.anus = 2; + slave.fetish = "submissive"; } else if (sisterAge === 2) { - V.activeSlave.intelligence = -30; - V.activeSlave.hips = 1; - V.activeSlave.face = jsEither([35, 35, 35, 75, 100]); + slave.intelligence = -30; + slave.hips = 1; + slave.face = jsEither([35, 35, 35, 75, 100]); if (V.TFS.schoolUpgrade === 3 && V.TFS.compromiseWeek+15 <= V.week) { - if (V.activeSlave.genes === "XY") { - V.activeSlave.balls = 7; - V.activeSlave.scrotum = V.activeSlave.balls; + if (slave.genes === "XY") { + slave.balls = 7; + slave.scrotum = slave.balls; } else { - V.activeSlave.balls = 1; - V.activeSlave.scrotum = 0; + slave.balls = 1; + slave.scrotum = 0; } } else if (V.TFS.schoolUpgrade === 1) { - V.activeSlave.balls = 1; - V.activeSlave.scrotum = 0; + slave.balls = 1; + slave.scrotum = 0; } else if (V.TFS.schoolUpgrade === 2) { - V.activeSlave.balls = 6; - V.activeSlave.scrotum = V.activeSlave.balls; + slave.balls = 6; + slave.scrotum = slave.balls; } else { - V.activeSlave.balls = jsRandom(2, 3); - V.activeSlave.scrotum = V.activeSlave.balls; - } - V.activeSlave.lips = 0; - V.activeSlave.weight = 0; - V.activeSlave.waist = jsRandom(-30, 10); - V.activeSlave.vagina = 2; - V.activeSlave.anus = 2; - V.activeSlave.fetish = jsEither(["buttslut", "cumslut", "submissive"]); + slave.balls = jsRandom(2, 3); + slave.scrotum = slave.balls; + } + slave.lips = 0; + slave.weight = 0; + slave.waist = jsRandom(-30, 10); + slave.vagina = 2; + slave.anus = 2; + slave.fetish = jsEither(["buttslut", "cumslut", "submissive"]); } else if (sisterAge === 3) { - V.activeSlave.intelligence = 0; - V.activeSlave.hips = 2; - V.activeSlave.face = jsEither([35, 35, 75, 75, 100]); + slave.intelligence = 0; + slave.hips = 2; + slave.face = jsEither([35, 35, 75, 75, 100]); if (V.TFS.schoolUpgrade === 3 && V.TFS.compromiseWeek+15 <= V.week) { - if (V.activeSlave.genes === "XY") { - V.activeSlave.balls = 8; - V.activeSlave.scrotum = V.activeSlave.balls; + if (slave.genes === "XY") { + slave.balls = 8; + slave.scrotum = slave.balls; } else { - V.activeSlave.balls = 1; - V.activeSlave.scrotum = 0; + slave.balls = 1; + slave.scrotum = 0; } } else if (V.TFS.schoolUpgrade === 1) { - V.activeSlave.balls = 1; - V.activeSlave.scrotum = 0; + slave.balls = 1; + slave.scrotum = 0; } else if (V.TFS.schoolUpgrade === 2) { - V.activeSlave.balls = 6; - V.activeSlave.scrotum = V.activeSlave.balls; + slave.balls = 6; + slave.scrotum = slave.balls; } else { - V.activeSlave.balls = jsRandom(3, 4); - V.activeSlave.scrotum = V.activeSlave.balls; - } - V.activeSlave.lips = jsRandom(15, 25); - V.activeSlave.weight = 20; - V.activeSlave.waist = jsRandom(-30, 20); - V.activeSlave.actualAge = jsRandom(30, 34); - V.activeSlave.physicalAge = V.activeSlave.actualAge; - V.activeSlave.visualAge = V.activeSlave.actualAge; - V.activeSlave.ovaryAge = V.activeSlave.actualAge; - V.activeSlave.vagina = 2; - V.activeSlave.anus = 2; - V.activeSlave.fetish = jsEither(["buttslut", "cumslut"]); + slave.balls = jsRandom(3, 4); + slave.scrotum = slave.balls; + } + slave.lips = jsRandom(15, 25); + slave.weight = 20; + slave.waist = jsRandom(-30, 20); + slave.actualAge = jsRandom(30, 34); + slave.physicalAge = slave.actualAge; + slave.visualAge = slave.actualAge; + slave.ovaryAge = slave.actualAge; + slave.vagina = 2; + slave.anus = 2; + slave.fetish = jsEither(["buttslut", "cumslut"]); } else if (sisterAge === 4) { - V.activeSlave.intelligence = 30; - V.activeSlave.hips = 2; - V.activeSlave.face = jsEither([35, 75, 75, 100, 100]); + slave.intelligence = 30; + slave.hips = 2; + slave.face = jsEither([35, 75, 75, 100, 100]); if (V.TFS.schoolUpgrade === 3 && V.TFS.compromiseWeek + 15 <= V.week) { - if (V.activeSlave.genes === "XY") { - V.activeSlave.balls = 9; - V.activeSlave.scrotum = V.activeSlave.balls; + if (slave.genes === "XY") { + slave.balls = 9; + slave.scrotum = slave.balls; } else { - V.activeSlave.balls = 1; - V.activeSlave.scrotum = 0; + slave.balls = 1; + slave.scrotum = 0; } } else if (V.TFS.schoolUpgrade === 1) { - V.activeSlave.balls = 1; - V.activeSlave.scrotum = 0; + slave.balls = 1; + slave.scrotum = 0; } else if (V.TFS.schoolUpgrade === 2) { - V.activeSlave.balls = 6; - V.activeSlave.scrotum = V.activeSlave.balls; + slave.balls = 6; + slave.scrotum = slave.balls; } else { - V.activeSlave.balls = jsRandom(4, 5); - V.activeSlave.scrotum = V.activeSlave.balls; - } - V.activeSlave.lips = jsRandom(25, 55); - V.activeSlave.weight = 20; - V.activeSlave.waist = jsRandom(-30, 20); - V.activeSlave.actualAge = jsRandom(35, 39); - V.activeSlave.physicalAge = V.activeSlave.actualAge; - V.activeSlave.visualAge = V.activeSlave.actualAge; - V.activeSlave.ovaryAge = V.activeSlave.actualAge; - V.activeSlave.vagina = 3; - V.activeSlave.anus = 3; - V.activeSlave.fetish = jsEither(["buttslut", "cumslut", "dom"]); + slave.balls = jsRandom(4, 5); + slave.scrotum = slave.balls; + } + slave.lips = jsRandom(25, 55); + slave.weight = 20; + slave.waist = jsRandom(-30, 20); + slave.actualAge = jsRandom(35, 39); + slave.physicalAge = slave.actualAge; + slave.visualAge = slave.actualAge; + slave.ovaryAge = slave.actualAge; + slave.vagina = 3; + slave.anus = 3; + slave.fetish = jsEither(["buttslut", "cumslut", "dom"]); } else { - V.activeSlave.intelligence = 60; - V.activeSlave.hips = 2; - V.activeSlave.face = jsEither([35, 75, 100, 100, 100]); + slave.intelligence = 60; + slave.hips = 2; + slave.face = jsEither([35, 75, 100, 100, 100]); if (V.TFS.schoolUpgrade === 3 && V.TFS.compromiseWeek+15 <= V.week) { - if (V.activeSlave.genes === "XY") { - V.activeSlave.balls = 10; - V.activeSlave.scrotum = V.activeSlave.balls; + if (slave.genes === "XY") { + slave.balls = 10; + slave.scrotum = slave.balls; } else { - V.activeSlave.balls = 1; - V.activeSlave.scrotum = 0; + slave.balls = 1; + slave.scrotum = 0; } } else if (V.TFS.schoolUpgrade === 1) { - V.activeSlave.balls = 1; - V.activeSlave.scrotum = 0; + slave.balls = 1; + slave.scrotum = 0; } else if (V.TFS.schoolUpgrade === 2) { - V.activeSlave.balls = 6; - V.activeSlave.scrotum = V.activeSlave.balls; + slave.balls = 6; + slave.scrotum = slave.balls; } else { - V.activeSlave.balls = jsRandom(5, 6); - V.activeSlave.scrotum = V.activeSlave.balls; - } - V.activeSlave.lips = jsRandom(25, 55); - V.activeSlave.weight = 50; - V.activeSlave.waist = jsRandom(-50, 20); - V.activeSlave.actualAge = jsRandom(40, 42); - V.activeSlave.physicalAge = V.activeSlave.actualAge; - V.activeSlave.visualAge = V.activeSlave.actualAge; - V.activeSlave.ovaryAge = V.activeSlave.actualAge; - V.activeSlave.vagina = 3; - V.activeSlave.anus = 3; - V.activeSlave.fetish = "dom"; - } - V.activeSlave.chem = 100+(sisterAge*50); - V.activeSlave.butt = sisterAge+jsRandom(2, 4); - V.activeSlave.boobs = 50*((10*sisterAge)+jsRandom(10, 20)); - V.activeSlave.dick = sisterAge+jsRandom(1, 2); - if (V.activeSlave.foreskin > 0) { - V.activeSlave.foreskin = V.activeSlave.dick; - } - V.activeSlave.preg = -3; + slave.balls = jsRandom(5, 6); + slave.scrotum = slave.balls; + } + slave.lips = jsRandom(25, 55); + slave.weight = 50; + slave.waist = jsRandom(-50, 20); + slave.actualAge = jsRandom(40, 42); + slave.physicalAge = slave.actualAge; + slave.visualAge = slave.actualAge; + slave.ovaryAge = slave.actualAge; + slave.vagina = 3; + slave.anus = 3; + slave.fetish = "dom"; + } + slave.chem = 100+(sisterAge*50); + slave.butt = sisterAge+jsRandom(2, 4); + slave.boobs = 50*((10*sisterAge)+jsRandom(10, 20)); + slave.dick = sisterAge+jsRandom(1, 2); + if (slave.foreskin > 0) { + slave.foreskin = slave.dick; + } + slave.preg = -3; if (V.TFS.farmUpgrade > 0) { - V.activeSlave.ovaries = 1; - V.activeSlave.preg = -1; - V.activeSlave.pubertyXX = 1; + slave.ovaries = 1; + slave.preg = -1; + slave.pubertyXX = 1; if (V.TFS.farmUpgrade >= 2) { if (V.week - V.TFS.farmUpgradeAsked < 35) { - V.activeSlave.preg = jsRandom(1, (V.week - V.TFS.farmUpgradeAsked)); + slave.preg = jsRandom(1, (V.week - V.TFS.farmUpgradeAsked)); } else { - V.activeSlave.preg = jsRandom(1, 40); + slave.preg = jsRandom(1, 40); } if (V.TFS.farmUpgrade === 3) { - V.activeSlave.pregType = jsRandom(20, 40); - V.activeSlave.pregAdaptation = 500; + slave.pregType = jsRandom(20, 40); + slave.pregAdaptation = 500; } else { - V.activeSlave.pregType = 1; + slave.pregType = 1; } - V.activeSlave.pregWeek = V.activeSlave.preg; - V.activeSlave.pregSource = -9; + slave.pregWeek = slave.preg; + slave.pregSource = -9; } } - SetBellySize(V.activeSlave); - V.activeSlave.intelligenceImplant = 30; - V.activeSlave.teeth = "normal"; + SetBellySize(slave); + slave.intelligenceImplant = 30; + slave.teeth = "normal"; if (V.TFS.schoolUpgrade === 2) { - V.activeSlave.energy = 100; + slave.energy = 100; } else { - V.activeSlave.energy = V.activeSlave.physicalAge+jsRandom(20, 30); - } - V.activeSlave.devotion = jsRandom(30, 40); - V.activeSlave.trust = jsRandom(60, 75); - setHealth(V.activeSlave, jsRandom(60, 80), 0, Math.max(normalRandInt(0, 4), 0), 0, jsRandom(0, 20)); - V.activeSlave.muscles = 20; - if (V.activeSlave.genes === "XY") { - V.activeSlave.shoulders = 1; - } - V.activeSlave.skill.vaginal = 100; - V.activeSlave.skill.oral = 100; - V.activeSlave.skill.anal = 100; - V.activeSlave.skill.whoring = 15; - V.activeSlave.skill.entertainment = 100; - V.activeSlave.skill.combat = 0; - V.activeSlave.pubicHStyle = "waxed"; - V.activeSlave.underArmHStyle = "waxed"; + slave.energy = slave.physicalAge+jsRandom(20, 30); + } + slave.devotion = jsRandom(30, 40); + slave.trust = jsRandom(60, 75); + setHealth(slave, jsRandom(60, 80), 0, Math.max(normalRandInt(0, 4), 0), 0, jsRandom(0, 20)); + slave.muscles = 20; + if (slave.genes === "XY") { + slave.shoulders = 1; + } + slave.skill.vaginal = 100; + slave.skill.oral = 100; + slave.skill.anal = 100; + slave.skill.whoring = 15; + slave.skill.entertainment = 100; + slave.skill.combat = 0; + slave.pubicHStyle = "waxed"; + slave.underArmHStyle = "waxed"; if (V.TFS.schoolUpgrade === 1) { - V.activeSlave.sexualQuirk = "caring"; - } - V.activeSlave.sexualFlaw = jsEither(["hates women", "none"]); - V.activeSlave.behavioralFlaw = jsEither(["arrogant", "none"]); - V.activeSlave.fetishStrength = 100; - V.activeSlave.fetishKnown = 0; - V.activeSlave.attrKnown = 0; - V.activeSlave.hStyle = "neat"; - V.activeSlave.hLength = 150; - V.activeSlave.custom.tattoo = "$He has a simple pink heart tattooed on $his right temple."; - V.activeSlave.trueVirgin = 1; + slave.sexualQuirk = "caring"; + } + slave.sexualFlaw = jsEither(["hates women", "none"]); + slave.behavioralFlaw = jsEither(["arrogant", "none"]); + slave.fetishStrength = 100; + slave.fetishKnown = 0; + slave.attrKnown = 0; + slave.hStyle = "neat"; + slave.hLength = 150; + slave.custom.tattoo = "$He has a simple pink heart tattooed on $his right temple."; + slave.trueVirgin = 1; break; - case "HA": - V.activeSlaveOneTimeMinAge = 22; - V.activeSlaveOneTimeMaxAge = 26; - V.one_time_age_overrides_pedo_mode = 1; - V.oneTimeDisableDisability = 1; - V.activeSlave = GenerateNewSlave("XX"); - V.activeSlave.origin = "You bought $him from the prestigious Hippolyta Academy."; - V.activeSlave.career = "a bodyguard"; - V.activeSlave.intelligenceImplant = 30; - V.activeSlave.faceShape = jsEither(["cute", "normal"]); - V.activeSlave.face = jsEither([35, 35, 35, 50, 75, 100]); - V.activeSlave.lips = jsRandom(0, 25); - V.activeSlave.actualAge = jsRandom(20, 25); - V.activeSlave.physicalAge = V.activeSlave.actualAge; - V.activeSlave.visualAge = V.activeSlave.actualAge; - V.activeSlave.ovaryAge = V.activeSlave.actualAge; - V.activeSlave.hips = 0; - V.activeSlave.vagina = jsRandom(0, 1); - V.activeSlave.anus = jsRandom(0, 1); - V.activeSlave.fetish = "none"; - V.activeSlave.chem = 10 * jsRandom(1, 3); - V.activeSlave.butt = jsRandom(2, 4); - V.activeSlave.boobs = jsRandom(3, 6) * 100; - V.activeSlave.preg = 0; - SetBellySize(V.activeSlave); - V.activeSlave.teeth = "normal"; - V.activeSlave.devotion = jsRandom(60, 75); - V.activeSlave.trust = jsRandom(60, 75); - setHealth(V.activeSlave, jsRandom(60, 80), 0, Math.max(normalRandInt(0, 2), 0), 0, jsRandom(0, 20)); + } + case "HA": { + SGProp.minAge = 22; + SGProp.maxAge = 26; + SGProp.ageOverridesPedoMode = 1; + SGProp.disableDisability = 1; + slave = GenerateNewSlave("XX", SGProp); + slave.origin = "You bought $him from the prestigious Hippolyta Academy."; + slave.career = "a bodyguard"; + slave.intelligenceImplant = 30; + slave.faceShape = jsEither(["cute", "normal"]); + slave.face = jsEither([35, 35, 35, 50, 75, 100]); + slave.lips = jsRandom(0, 25); + slave.actualAge = jsRandom(20, 25); + slave.physicalAge = slave.actualAge; + slave.visualAge = slave.actualAge; + slave.ovaryAge = slave.actualAge; + slave.hips = 0; + slave.vagina = jsRandom(0, 1); + slave.anus = jsRandom(0, 1); + slave.fetish = "none"; + slave.chem = 10 * jsRandom(1, 3); + slave.butt = jsRandom(2, 4); + slave.boobs = jsRandom(3, 6) * 100; + slave.preg = 0; + SetBellySize(slave); + slave.teeth = "normal"; + slave.devotion = jsRandom(60, 75); + slave.trust = jsRandom(60, 75); + setHealth(slave, jsRandom(60, 80), 0, Math.max(normalRandInt(0, 2), 0), 0, jsRandom(0, 20)); minHeight = jsRandom(170, 180); if (V.HA.schoolUpgrade === 2) { - V.activeSlave.height = Math.trunc(Math.clamp(Height.random(V.activeSlave, {limitMult: [2, 15], spread: 0.1}), minHeight, 274)); - V.activeSlave.muscles = jsRandom(40, 80); + slave.height = Math.trunc(Math.clamp(Height.random(slave, {limitMult: [2, 15], spread: 0.1}), minHeight, 274)); + slave.muscles = jsRandom(40, 80); } else { - V.activeSlave.height = Math.trunc(Math.clamp(Height.random(V.activeSlave, {limitMult: [1, 4]}), minHeight, 274)); - V.activeSlave.muscles = jsRandom(20, 40); + slave.height = Math.trunc(Math.clamp(Height.random(slave, {limitMult: [1, 4]}), minHeight, 274)); + slave.muscles = jsRandom(20, 40); } if (V.HA.schoolUpgrade === 3) { - V.activeSlave.weight = jsEither([10, 20, 20, 30, 30, 40, 40, 50]); - V.activeSlave.waist = jsRandom(-10, 40); + slave.weight = jsEither([10, 20, 20, 30, 30, 40, 40, 50]); + slave.waist = jsRandom(-10, 40); } else { - V.activeSlave.weight = -10; - V.activeSlave.waist = jsRandom(-20, 10); + slave.weight = -10; + slave.waist = jsRandom(-20, 10); } - V.activeSlave.shoulders = 0; + slave.shoulders = 0; if (V.HA.schoolUpgrade === 1) { - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [20, 70]}); - V.activeSlave.skill.vaginal = jsEither([20, 20, 40]); - V.activeSlave.skill.oral = jsEither([20, 20, 40]); - V.activeSlave.skill.anal = jsEither([20, 20, 40]); - V.activeSlave.skill.whoring = jsEither([20, 20, 40]); - V.activeSlave.skill.entertainment = jsEither([60, 80, 80, 100]); + slave.intelligence = Intelligence.random({limitIntelligence: [20, 70]}); + slave.skill.vaginal = jsEither([20, 20, 40]); + slave.skill.oral = jsEither([20, 20, 40]); + slave.skill.anal = jsEither([20, 20, 40]); + slave.skill.whoring = jsEither([20, 20, 40]); + slave.skill.entertainment = jsEither([60, 80, 80, 100]); } else { - V.activeSlave.intelligence = jsRandom(0, 20); - V.activeSlave.skill.vaginal = 10; - V.activeSlave.skill.oral = 10; - V.activeSlave.skill.anal = 10; - V.activeSlave.skill.whoring = 10; - V.activeSlave.skill.entertainment = jsEither([20, 40, 40, 60]); - } - V.activeSlave.skill.combat = 1; - V.activeSlave.pubicHStyle = "waxed"; - V.activeSlave.underArmHStyle = "waxed"; - V.activeSlave.sexualQuirk = jsEither(["caring", "none", "none", "unflinching"]); - V.activeSlave.sexualFlaw = jsEither(["apathetic", "judgemental", "none", "none"]); - V.activeSlave.behavioralFlaw = jsEither(["arrogant", "none"]); - V.activeSlave.behavioralQuirk = jsEither(["confident", "fitness", "none", "none"]); - V.activeSlave.fetishStrength = 0; - V.activeSlave.fetishKnown = 0; - V.activeSlave.attrKnown = 0; - V.activeSlave.hStyle = jsEither(["braided", "bun", "neat", "ponytail", "tails"]); - V.activeSlave.hLength = jsRandom(5, 50); - V.activeSlave.clothes = "a nice maid outfit"; - V.activeSlave.custom.tattoo = "$He has the sword and eagle symbol of the Hippolyta Academy tattooed on $his left shoulder."; + slave.intelligence = jsRandom(0, 20); + slave.skill.vaginal = 10; + slave.skill.oral = 10; + slave.skill.anal = 10; + slave.skill.whoring = 10; + slave.skill.entertainment = jsEither([20, 40, 40, 60]); + } + slave.skill.combat = 1; + slave.pubicHStyle = "waxed"; + slave.underArmHStyle = "waxed"; + slave.sexualQuirk = jsEither(["caring", "none", "none", "unflinching"]); + slave.sexualFlaw = jsEither(["apathetic", "judgemental", "none", "none"]); + slave.behavioralFlaw = jsEither(["arrogant", "none"]); + slave.behavioralQuirk = jsEither(["confident", "fitness", "none", "none"]); + slave.fetishStrength = 0; + slave.fetishKnown = 0; + slave.attrKnown = 0; + slave.hStyle = jsEither(["braided", "bun", "neat", "ponytail", "tails"]); + slave.hLength = jsRandom(5, 50); + slave.clothes = "a nice maid outfit"; + slave.custom.tattoo = "$He has the sword and eagle symbol of the Hippolyta Academy tattooed on $his left shoulder."; break; - case "NUL": - V.activeSlaveOneTimeMinAge = 16; - V.activeSlaveOneTimeMaxAge = 24; - V.oneTimeDisableDisability = 1; - V.activeSlave = GenerateNewSlave(); - V.activeSlave.origin = "You bought $him from Nueva Universidad de Libertad right after $his graduation."; - V.activeSlave.career = "a slave"; - setHealth(V.activeSlave, jsRandom(60, 80), 0, Math.max(normalRandInt(0, 4), 0), 0, jsRandom(0, 20)); - V.activeSlave.devotion = jsRandom(60, 75); - V.activeSlave.trust = jsRandom(60, 75); - V.activeSlave.intelligenceImplant = 30; + } + case "NUL": { + SGProp.minAge = 16; + SGProp.maxAge = 24; + SGProp.disableDisability = 1; + slave = GenerateNewSlave("", SGProp); + slave.origin = "You bought $him from Nueva Universidad de Libertad right after $his graduation."; + slave.career = "a slave"; + setHealth(slave, jsRandom(60, 80), 0, Math.max(normalRandInt(0, 4), 0), 0, jsRandom(0, 20)); + slave.devotion = jsRandom(60, 75); + slave.trust = jsRandom(60, 75); + slave.intelligenceImplant = 30; if (V.NUL.schoolUpgrade === 1) { - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [50, 70]}); - V.activeSlave.skill.whoring = jsRandom(70, 80); - V.activeSlave.skill.entertainment = jsRandom(70, 80); + slave.intelligence = Intelligence.random({limitIntelligence: [50, 70]}); + slave.skill.whoring = jsRandom(70, 80); + slave.skill.entertainment = jsRandom(70, 80); } else { - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [20, 50]}); - V.activeSlave.skill.whoring = jsRandom(40, 50); - V.activeSlave.skill.entertainment = jsRandom(40, 50); + slave.intelligence = Intelligence.random({limitIntelligence: [20, 50]}); + slave.skill.whoring = jsRandom(40, 50); + slave.skill.entertainment = jsRandom(40, 50); } if (V.NUL.schoolUpgrade === 2) { - V.activeSlave.skill.anal = jsRandom(60, 80); - V.activeSlave.skill.oral = jsRandom(70, 90); - V.activeSlave.anus = jsRandom(1, 3); + slave.skill.anal = jsRandom(60, 80); + slave.skill.oral = jsRandom(70, 90); + slave.anus = jsRandom(1, 3); } else { - V.activeSlave.skill.anal = jsRandom(10, 30); - V.activeSlave.skill.oral = jsRandom(20, 40); - V.activeSlave.anus = jsEither([0, 0, 0, 0, 1, 1, 1]); - } - V.activeSlave.muscles = 0; - V.activeSlave.face = jsRandom(15, 55); - V.activeSlave.faceShape = "androgynous"; - V.activeSlave.hips = 0; - V.activeSlave.shoulders = 0; - V.activeSlave.boobs = jsRandom(1, 7) * 50; - V.activeSlave.butt = jsRandom(0, 3); - V.activeSlave.vagina = -1; - V.activeSlave.clit = 0; - V.activeSlave.dick = 0; - V.activeSlave.balls = 0; - V.activeSlave.preg = 0; - V.activeSlave.eyebrowHStyle = "bald"; - V.activeSlave.underArmHStyle = "bald"; - V.activeSlave.pubicHStyle = "bald"; - V.activeSlave.hStyle = "bald"; - V.activeSlave.behavioralFlaw = jsEither(["none", "odd"]); - V.activeSlave.custom.tattoo = "$He has the abstract symbol of Nueva Universidad de Libertad tattooed on $his left shoulder."; + slave.skill.anal = jsRandom(10, 30); + slave.skill.oral = jsRandom(20, 40); + slave.anus = jsEither([0, 0, 0, 0, 1, 1, 1]); + } + slave.muscles = 0; + slave.face = jsRandom(15, 55); + slave.faceShape = "androgynous"; + slave.hips = 0; + slave.shoulders = 0; + slave.boobs = jsRandom(1, 7) * 50; + slave.butt = jsRandom(0, 3); + slave.vagina = -1; + slave.clit = 0; + slave.dick = 0; + slave.balls = 0; + slave.preg = 0; + slave.eyebrowHStyle = "bald"; + slave.underArmHStyle = "bald"; + slave.pubicHStyle = "bald"; + slave.hStyle = "bald"; + slave.behavioralFlaw = jsEither(["none", "odd"]); + slave.custom.tattoo = "$He has the abstract symbol of Nueva Universidad de Libertad tattooed on $his left shoulder."; break; - case "gangs and smugglers": + } + case "gangs and smugglers": { if (V.pedo_mode === 1) { - V.activeSlaveOneTimeMinAge = 6; - V.activeSlaveOneTimeMaxAge = 18; - V.one_time_age_overrides_pedo_mode = 1; + SGProp.minAge = 6; + SGProp.maxAge = 18; + SGProp.ageOverridesPedoMode = 1; } else { - V.activeSlaveOneTimeMinAge = 16; + SGProp.minAge = 16; if (V.retirementAge > 56) { - V.activeSlaveOneTimeMaxAge = 55; + SGProp.maxAge = 55; } else { - V.activeSlaveOneTimeMaxAge = V.retirementAge-2; + SGProp.maxAge = V.retirementAge-2; } } - V.oneTimeDisableDisability = 1; + SGProp.disableDisability = 1; if (V.seeDicks === 0) { - V.activeSlave = GenerateNewSlave("XX"); + slave = GenerateNewSlave("XX", SGProp); } else { - V.activeSlave = GenerateNewSlave("XY"); + slave = GenerateNewSlave("XY", SGProp); } criminal = setup.gangCriminalPool.random(); switch (criminal) { - case "mule": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for smuggling illegal contraband inside $his body."; + case "mule": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for smuggling illegal contraband inside $his body."; V.prisonCrime = "is incarcerated for being a willing drug mule."; - V.activeSlave.career = "a drug mule"; - V.activeSlave.devotion = jsRandom(-20, 20); - V.activeSlave.trust = jsRandom(-100, -25); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsEither([-100, -100, -60, -60, -60, -30, -30]); - setHealth(V.activeSlave, jsRandom(-50, 20), undefined, undefined, undefined, jsRandom(30, 80)); - V.activeSlave.anus = 4; - V.activeSlave.chem = 10 * jsRandom(1, 3); - V.activeSlave.addict = 100; break; - case "arms smuggler": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for smuggling arms to forces antagonistic to the Free Cities."; + slave.career = "a drug mule"; + slave.devotion = jsRandom(-20, 20); + slave.trust = jsRandom(-100, -25); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsEither([-100, -100, -60, -60, -60, -30, -30]); + setHealth(slave, jsRandom(-50, 20), undefined, undefined, undefined, jsRandom(30, 80)); + slave.anus = 4; + slave.chem = 10 * jsRandom(1, 3); + slave.addict = 100; + break; + } + case "arms smuggler": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for smuggling arms to forces antagonistic to the Free Cities."; V.prisonCrime = "is incarcerated for being an arms dealer."; - V.activeSlave.career = "an arms dealer"; - V.activeSlave.devotion = jsRandom(-100, -50); - V.activeSlave.trust = jsRandom(-60, 25); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(0, 60); - setHealth(V.activeSlave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(30, 80)); - V.activeSlave.weight = jsRandom(-30, 10); - V.activeSlave.waist = jsRandom(-10, 50); - V.activeSlave.muscles = jsRandom(10, 40); break; - case "drug smuggler": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for smuggling drugs into the Free City."; + slave.career = "an arms dealer"; + slave.devotion = jsRandom(-100, -50); + slave.trust = jsRandom(-60, 25); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(0, 60); + setHealth(slave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(30, 80)); + slave.weight = jsRandom(-30, 10); + slave.waist = jsRandom(-10, 50); + slave.muscles = jsRandom(10, 40); + break; + } + case "drug smuggler": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for smuggling drugs into the Free City."; V.prisonCrime = "is incarcerated for smuggling drugs."; - V.activeSlave.career = "a drug smuggler"; - V.activeSlave.devotion = jsRandom(-60, -20); - V.activeSlave.trust = jsRandom(-60, 40); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-60, 60); - setHealth(V.activeSlave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(30, 80)); break; - case "smuggler": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for smuggling goods into the Free City."; + slave.career = "a drug smuggler"; + slave.devotion = jsRandom(-60, -20); + slave.trust = jsRandom(-60, 40); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-60, 60); + setHealth(slave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(30, 80)); + break; + } + case "smuggler": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for smuggling goods into the Free City."; V.prisonCrime = "is incarcerated for smuggling goods."; - V.activeSlave.career = "a smuggler"; - V.activeSlave.devotion = jsRandom(-80, -20); - V.activeSlave.trust = jsRandom(-100, 40); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(0, 60); - setHealth(V.activeSlave, jsRandom(-20, 40), undefined, undefined, undefined, jsRandom(30, 80)); break; - case "fence": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for dealing in stolen goods."; + slave.career = "a smuggler"; + slave.devotion = jsRandom(-80, -20); + slave.trust = jsRandom(-100, 40); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(0, 60); + setHealth(slave, jsRandom(-20, 40), undefined, undefined, undefined, jsRandom(30, 80)); + break; + } + case "fence": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for dealing in stolen goods."; V.prisonCrime = "is incarcerated for buying and selling stolen goods."; - V.activeSlave.career = "a fence"; - V.activeSlave.devotion = jsRandom(-100, -20); - V.activeSlave.trust = jsRandom(-20, 40); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-60, 30); - setHealth(V.activeSlave, jsRandom(-20, 60), undefined, undefined, undefined, jsRandom(30, 80)); break; - case "gang murderer": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for gang related murder."; + slave.career = "a fence"; + slave.devotion = jsRandom(-100, -20); + slave.trust = jsRandom(-20, 40); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-60, 30); + setHealth(slave, jsRandom(-20, 60), undefined, undefined, undefined, jsRandom(30, 80)); + break; + } + case "gang murderer": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for gang related murder."; V.prisonCrime = "is incarcerated for gang related murders."; - V.activeSlave.career = "a gang member"; - V.activeSlave.devotion = jsRandom(-100, -50); - V.activeSlave.trust = jsRandom(0, 100); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsEither([-30, -20, 0, 0, 20, 40, 60]); - V.activeSlave.behavioralFlaw = "arrogant"; - setHealth(V.activeSlave, jsRandom(-20, 20), Math.max(normalRandInt(5, 3), 0), Math.max(normalRandInt(5, 3), 0), undefined, jsRandom(20, 70)); - V.activeSlave.muscles = jsRandom(20, 80); - V.activeSlave.chem = 10 * jsRandom(1, 3); - V.activeSlave.custom.tattoo = "The prominent emblem of a local gang spans the length of his shoulders."; - V.activeSlave.skill.combat = 1; break; - case "gang assaulter": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for gang related extortion of local businesses."; + slave.career = "a gang member"; + slave.devotion = jsRandom(-100, -50); + slave.trust = jsRandom(0, 100); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsEither([-30, -20, 0, 0, 20, 40, 60]); + slave.behavioralFlaw = "arrogant"; + setHealth(slave, jsRandom(-20, 20), Math.max(normalRandInt(5, 3), 0), Math.max(normalRandInt(5, 3), 0), undefined, jsRandom(20, 70)); + slave.muscles = jsRandom(20, 80); + slave.chem = 10 * jsRandom(1, 3); + slave.custom.tattoo = "The prominent emblem of a local gang spans the length of his shoulders."; + slave.skill.combat = 1; + break; + } + case "gang assaulter": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for gang related extortion of local businesses."; V.prisonCrime = "is incarcerated for gang related activities."; - V.activeSlave.career = "a gang member"; - V.activeSlave.devotion = jsRandom(-100, -50); - V.activeSlave.trust = jsRandom(0, 100); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-100, 0); - V.activeSlave.behavioralFlaw = "arrogant"; - setHealth(V.activeSlave, jsRandom(-20, 20), Math.max(normalRandInt(5, 3), 0), Math.max(normalRandInt(5, 3), 0), undefined, jsRandom(20, 70)); - V.activeSlave.muscles = jsRandom(40, 80); - V.activeSlave.weight = jsRandom(-30, 10); - V.activeSlave.waist = jsRandom(10, 50); - V.activeSlave.chem = 10 * jsRandom(1, 3); - V.activeSlave.custom.tattoo = "The prominent emblem of a local gang spans the length of $his shoulders."; - V.activeSlave.skill.combat = 1; break; - case "gang bruiser": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for a gang related beating of a local businessman."; + slave.career = "a gang member"; + slave.devotion = jsRandom(-100, -50); + slave.trust = jsRandom(0, 100); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-100, 0); + slave.behavioralFlaw = "arrogant"; + setHealth(slave, jsRandom(-20, 20), Math.max(normalRandInt(5, 3), 0), Math.max(normalRandInt(5, 3), 0), undefined, jsRandom(20, 70)); + slave.muscles = jsRandom(40, 80); + slave.weight = jsRandom(-30, 10); + slave.waist = jsRandom(10, 50); + slave.chem = 10 * jsRandom(1, 3); + slave.custom.tattoo = "The prominent emblem of a local gang spans the length of $his shoulders."; + slave.skill.combat = 1; + break; + } + case "gang bruiser": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for a gang related beating of a local businessman."; V.prisonCrime = "is incarcerated for gang related activities."; - V.activeSlave.career = "a gang member"; - V.activeSlave.devotion = jsRandom(-100, -50); - V.activeSlave.trust = jsRandom(0, 100); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-100, 0); - V.activeSlave.behavioralFlaw = "arrogant"; - setHealth(V.activeSlave, jsRandom(-20, 20), Math.max(normalRandInt(8, 3), 0), Math.max(normalRandInt(8, 3), 0), undefined, jsRandom(20, 60)); - V.activeSlave.muscles = jsRandom(60, 80); - V.activeSlave.weight = jsRandom(-30, 10); - V.activeSlave.waist = jsRandom(10, 70); - V.activeSlave.chem = 10 * jsRandom(1, 3); - V.activeSlave.custom.tattoo = "The prominent emblem of a local gang spans the length of $his shoulders."; - V.activeSlave.skill.combat = 1; break; - case "gang thief": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for gang related raiding of several local warehouses."; + slave.career = "a gang member"; + slave.devotion = jsRandom(-100, -50); + slave.trust = jsRandom(0, 100); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-100, 0); + slave.behavioralFlaw = "arrogant"; + setHealth(slave, jsRandom(-20, 20), Math.max(normalRandInt(8, 3), 0), Math.max(normalRandInt(8, 3), 0), undefined, jsRandom(20, 60)); + slave.muscles = jsRandom(60, 80); + slave.weight = jsRandom(-30, 10); + slave.waist = jsRandom(10, 70); + slave.chem = 10 * jsRandom(1, 3); + slave.custom.tattoo = "The prominent emblem of a local gang spans the length of $his shoulders."; + slave.skill.combat = 1; + break; + } + case "gang thief": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for gang related raiding of several local warehouses."; V.prisonCrime = "is incarcerated for gang related activities."; - V.activeSlave.career = "a gang member"; - V.activeSlave.devotion = jsRandom(-100, -50); - V.activeSlave.trust = jsRandom(0, 100); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-40, 60); - V.activeSlave.behavioralFlaw = "arrogant"; - setHealth(V.activeSlave, jsRandom(-20, 20), Math.max(normalRandInt(3, 3), 0), Math.max(normalRandInt(3, 3), 0), undefined, jsRandom(20, 70)); - V.activeSlave.muscles = jsRandom(20, 80); - V.activeSlave.weight = jsRandom(-30, 30); - V.activeSlave.waist = jsRandom(10, 70); - V.activeSlave.chem = 10 * jsRandom(1, 3); - V.activeSlave.custom.tattoo = "The prominent emblem of a local gang spans the length of $his shoulders."; - V.activeSlave.skill.combat = 1; break; - case "drug peddler": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for gang related drug distribution."; + slave.career = "a gang member"; + slave.devotion = jsRandom(-100, -50); + slave.trust = jsRandom(0, 100); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-40, 60); + slave.behavioralFlaw = "arrogant"; + setHealth(slave, jsRandom(-20, 20), Math.max(normalRandInt(3, 3), 0), Math.max(normalRandInt(3, 3), 0), undefined, jsRandom(20, 70)); + slave.muscles = jsRandom(20, 80); + slave.weight = jsRandom(-30, 30); + slave.waist = jsRandom(10, 70); + slave.chem = 10 * jsRandom(1, 3); + slave.custom.tattoo = "The prominent emblem of a local gang spans the length of $his shoulders."; + slave.skill.combat = 1; + break; + } + case "drug peddler": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for gang related drug distribution."; V.prisonCrime = "is incarcerated for gang related activities."; - V.activeSlave.career = "a drug pusher"; - V.activeSlave.devotion = jsRandom(-100, -50); - V.activeSlave.trust = jsRandom(0, 100); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-40, 60); - setHealth(V.activeSlave, jsRandom(-20, 20), Math.max(normalRandInt(3, 3), 0), Math.max(normalRandInt(3, 3), 0), undefined, jsRandom(20, 70)); - V.activeSlave.muscles = jsRandom(20, 40); - V.activeSlave.chem = 10 * jsRandom(3, 5); - V.activeSlave.custom.tattoo = "The prominent emblem of a local gang spans the length of $his shoulders."; - V.activeSlave.skill.combat = 1; break; - case "hitman": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for a series of high profile murders."; + slave.career = "a drug pusher"; + slave.devotion = jsRandom(-100, -50); + slave.trust = jsRandom(0, 100); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-40, 60); + setHealth(slave, jsRandom(-20, 20), Math.max(normalRandInt(3, 3), 0), Math.max(normalRandInt(3, 3), 0), undefined, jsRandom(20, 70)); + slave.muscles = jsRandom(20, 40); + slave.chem = 10 * jsRandom(3, 5); + slave.custom.tattoo = "The prominent emblem of a local gang spans the length of $his shoulders."; + slave.skill.combat = 1; + break; + } + case "hitman": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for a series of high profile murders."; V.prisonCrime = "is incarcerated for a series of murders-for-hire."; - V.activeSlave.career = "a hitman"; - V.activeSlave.devotion = jsRandom(-75, -50); - V.activeSlave.trust = jsRandom(-60, 25); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(0, 100); - setHealth(V.activeSlave, jsRandom(-20, 60), undefined, undefined, undefined, jsRandom(20, 70)); - V.activeSlave.weight = jsRandom(-30, 10); - V.activeSlave.waist = jsRandom(-10, 50); - V.activeSlave.muscles = jsRandom(20, 40); - V.activeSlave.skill.combat = 1; break; - case "assassin": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for a high profile assassination."; + slave.career = "a hitman"; + slave.devotion = jsRandom(-75, -50); + slave.trust = jsRandom(-60, 25); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(0, 100); + setHealth(slave, jsRandom(-20, 60), undefined, undefined, undefined, jsRandom(20, 70)); + slave.weight = jsRandom(-30, 10); + slave.waist = jsRandom(-10, 50); + slave.muscles = jsRandom(20, 40); + slave.skill.combat = 1; + break; + } + case "assassin": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for a high profile assassination."; V.prisonCrime = "is incarcerated for an assassination."; - V.activeSlave.career = "an assassin"; - V.activeSlave.devotion = -100; - V.activeSlave.trust = 100; - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = 100; - setHealth(V.activeSlave, jsRandom(-20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(20, 70)); - V.activeSlave.weight = jsRandom(-30, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.muscles = jsRandom(20, 40); - V.activeSlave.skill.combat = 1; break; - case "murder": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for repeat murder."; + slave.career = "an assassin"; + slave.devotion = -100; + slave.trust = 100; + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = 100; + setHealth(slave, jsRandom(-20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(20, 70)); + slave.weight = jsRandom(-30, 10); + slave.waist = jsRandom(-10, 10); + slave.muscles = jsRandom(20, 40); + slave.skill.combat = 1; + break; + } + case "murder": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for repeat murder."; V.prisonCrime = "is incarcerated for murder."; - V.activeSlave.career = "a murderer"; - V.activeSlave.devotion = jsRandom(-100, -50); - V.activeSlave.trust = jsRandom(0, 100); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-40, 60); - setHealth(V.activeSlave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(30, 80)); - V.activeSlave.muscles = jsRandom(20, 80); - V.activeSlave.skill.combat = 1; break; - case "manslaughter": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for manslaughter."; + slave.career = "a murderer"; + slave.devotion = jsRandom(-100, -50); + slave.trust = jsRandom(0, 100); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-40, 60); + setHealth(slave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(30, 80)); + slave.muscles = jsRandom(20, 80); + slave.skill.combat = 1; + break; + } + case "manslaughter": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for manslaughter."; V.prisonCrime = "is incarcerated for manslaughter."; - V.activeSlave.career = "a criminal"; - V.activeSlave.devotion = jsRandom(-20, 50); - V.activeSlave.trust = jsRandom(0, 20); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-40, 60); - setHealth(V.activeSlave, jsRandom(-40, 0), undefined, undefined, undefined, jsRandom(30, 80)); break; - case "attempted murder": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for attempted murder of a prominent individual."; + slave.career = "a criminal"; + slave.devotion = jsRandom(-20, 50); + slave.trust = jsRandom(0, 20); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-40, 60); + setHealth(slave, jsRandom(-40, 0), undefined, undefined, undefined, jsRandom(30, 80)); + break; + } + case "attempted murder": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for attempted murder of a prominent individual."; V.prisonCrime = "is incarcerated for an attempted murder."; - V.activeSlave.career = "a criminal"; - V.activeSlave.devotion = jsRandom(-20, 50); - V.activeSlave.trust = jsRandom(0, 20); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-100, 0); - setHealth(V.activeSlave, jsRandom(-40, 0), undefined, undefined, undefined, jsRandom(30, 80)); + slave.career = "a criminal"; + slave.devotion = jsRandom(-20, 50); + slave.trust = jsRandom(0, 20); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-100, 0); + setHealth(slave, jsRandom(-40, 0), undefined, undefined, undefined, jsRandom(30, 80)); + break; + } } break; - case "military prison": + } + case "military prison": { if (V.pedo_mode === 1) { - V.activeSlaveOneTimeMinAge = 12; - V.activeSlaveOneTimeMaxAge = 18; - V.one_time_age_overrides_pedo_mode = 1; + SGProp.minAge = 12; + SGProp.maxAge = 18; + SGProp.ageOverridesPedoMode = 1; } else { - V.activeSlaveOneTimeMinAge = 18; + SGProp.minAge = 18; if (V.retirementAge > 56) { - V.activeSlaveOneTimeMaxAge = 55; + SGProp.maxAge = 55; } else { - V.activeSlaveOneTimeMaxAge = V.retirementAge-2; + SGProp.maxAge = V.retirementAge-2; } } - V.oneTimeDisableDisability = 1; - V.activeSlave = GenerateNewSlave(); + SGProp.disableDisability = 1; + slave = GenerateNewSlave("", SGProp); /* - if (V.activeSlave.dick > 0) { - V.activeSlave.chastityPenis = 1 + if (slave.dick > 0) { + slave.chastityPenis = 1 } - if (V.activeSlave.vagina > -1) { - V.activeSlave.chastityVagina = 1 + if (slave.vagina > -1) { + slave.chastityVagina = 1 } */ criminal = setup.militaryCriminalPool.random(); switch (criminal) { - case "spy": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was a spy captured while infiltrating the Free City."; + case "spy": { + slave.origin = "You purchased $his life at a prison sale. $He was a spy captured while infiltrating the Free City."; V.prisonCrime = "is incarcerated for spying."; - V.activeSlave.career = "a spy"; - V.activeSlave.devotion = jsRandom(-20, 20); - V.activeSlave.trust = -100; - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(20, 100); - V.activeSlave.intelligenceImplant = 30; - setHealth(V.activeSlave, jsRandom(-40, 20), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(5, 4), 0), undefined, jsRandom(10, 40)); - V.activeSlave.weight = jsRandom(-30, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.muscles = jsRandom(20, 40); - V.activeSlave.skill.combat = 1; break; - case "terrorist": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was a terrorist captured when $his attempt to destroy a public building and the people within was foiled."; + slave.career = "a spy"; + slave.devotion = jsRandom(-20, 20); + slave.trust = -100; + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(20, 100); + slave.intelligenceImplant = 30; + setHealth(slave, jsRandom(-40, 20), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(5, 4), 0), undefined, jsRandom(10, 40)); + slave.weight = jsRandom(-30, 10); + slave.waist = jsRandom(-10, 10); + slave.muscles = jsRandom(20, 40); + slave.skill.combat = 1; + break; + } + case "terrorist": { + slave.origin = "You purchased $his life at a prison sale. $He was a terrorist captured when $his attempt to destroy a public building and the people within was foiled."; V.prisonCrime = "is incarcerated for terrorism."; - V.activeSlave.career = "a terrorist"; - V.activeSlave.devotion = jsRandom(-80, -20); - V.activeSlave.trust = -100; - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-100, 0); - setHealth(V.activeSlave, jsRandom(-50, 20), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(10, 4), 0), undefined, jsRandom(40, 90)); - V.activeSlave.weight = jsRandom(-100, 10); - V.activeSlave.waist = jsRandom(-10, 10); break; - case "war criminal": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was a soldier imprisoned for committing unspeakable atrocities, even by the standards of an apocalyptic slave trading society."; + slave.career = "a terrorist"; + slave.devotion = jsRandom(-80, -20); + slave.trust = -100; + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-100, 0); + setHealth(slave, jsRandom(-50, 20), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(10, 4), 0), undefined, jsRandom(40, 90)); + slave.weight = jsRandom(-100, 10); + slave.waist = jsRandom(-10, 10); + break; + } + case "war criminal": { + slave.origin = "You purchased $his life at a prison sale. $He was a soldier imprisoned for committing unspeakable atrocities, even by the standards of an apocalyptic slave trading society."; V.prisonCrime = "is incarcerated for a series of war crimes."; - V.activeSlave.career = "a soldier"; - V.activeSlave.devotion = jsRandom(-100, -80); - V.activeSlave.trust = jsRandom(20, 100); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-20, 100); - V.activeSlave.intelligenceImplant = 30; - setHealth(V.activeSlave, jsRandom(-40, 60), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(5, 4), 0), undefined, jsRandom(30, 80)); - V.activeSlave.weight = jsRandom(-10, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.muscles = jsRandom(20, 60); - V.activeSlave.skill.combat = 1; - V.activeSlave.behavioralFlaw = "arrogant"; break; - case "deserter": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was a soldier that abandoned $his post."; + slave.career = "a soldier"; + slave.devotion = jsRandom(-100, -80); + slave.trust = jsRandom(20, 100); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-20, 100); + slave.intelligenceImplant = 30; + setHealth(slave, jsRandom(-40, 60), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(5, 4), 0), undefined, jsRandom(30, 80)); + slave.weight = jsRandom(-10, 10); + slave.waist = jsRandom(-10, 10); + slave.muscles = jsRandom(20, 60); + slave.skill.combat = 1; + slave.behavioralFlaw = "arrogant"; + break; + } + case "deserter": { + slave.origin = "You purchased $his life at a prison sale. $He was a soldier that abandoned $his post."; V.prisonCrime = "is incarcerated for going A.W.O.L."; - V.activeSlave.career = "a soldier"; - V.activeSlave.devotion = jsRandom(-100, -80); - V.activeSlave.trust = jsRandom(-100, -80); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-60, 40); - setHealth(V.activeSlave, jsRandom(-40, 60), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(5, 4), 0), undefined, jsRandom(30, 80)); - V.activeSlave.weight = jsRandom(-50, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.skill.combat = 1; break; - case "officer": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was an officer that over-extended $his forces and was overwhelmed."; + slave.career = "a soldier"; + slave.devotion = jsRandom(-100, -80); + slave.trust = jsRandom(-100, -80); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-60, 40); + setHealth(slave, jsRandom(-40, 60), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(5, 4), 0), undefined, jsRandom(30, 80)); + slave.weight = jsRandom(-50, 10); + slave.waist = jsRandom(-10, 10); + slave.skill.combat = 1; + break; + } + case "officer": { + slave.origin = "You purchased $his life at a prison sale. $He was an officer that over-extended $his forces and was overwhelmed."; V.prisonCrime = "is a captured enemy officer."; - V.activeSlave.career = "a military officer"; - V.activeSlave.devotion = jsRandom(-40, 20); - V.activeSlave.trust = jsRandom(-50, 0); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(0, 100); - V.activeSlave.intelligenceImplant = 15; - setHealth(V.activeSlave, jsRandom(0, 60), undefined, Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(20, 70)); - V.activeSlave.weight = jsRandom(-10, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.muscles = jsRandom(20, 40); - V.activeSlave.skill.combat = 1; break; - case "specOps": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was a special operations officer that acted on bad intel and ended up captured."; + slave.career = "a military officer"; + slave.devotion = jsRandom(-40, 20); + slave.trust = jsRandom(-50, 0); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(0, 100); + slave.intelligenceImplant = 15; + setHealth(slave, jsRandom(0, 60), undefined, Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(20, 70)); + slave.weight = jsRandom(-10, 10); + slave.waist = jsRandom(-10, 10); + slave.muscles = jsRandom(20, 40); + slave.skill.combat = 1; + break; + } + case "specOps": { + slave.origin = "You purchased $his life at a prison sale. $He was a special operations officer that acted on bad intel and ended up captured."; V.prisonCrime = "is a captured enemy special operations officer."; - V.activeSlave.career = "spec ops"; - V.activeSlave.devotion = jsRandom(-80, -50); - V.activeSlave.trust = jsRandom(-100, 100); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsEither([60, 80, 100]); - V.activeSlave.intelligenceImplant = 30; - setHealth(V.activeSlave, jsRandom(0, 60), undefined, Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(20, 70)); - V.activeSlave.weight = jsRandom(-10, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.muscles = jsRandom(30, 60); - V.activeSlave.skill.combat = 1; break; - case "sniper": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was an enemy sniper that was captured after $his company lost to your military might."; + slave.career = "spec ops"; + slave.devotion = jsRandom(-80, -50); + slave.trust = jsRandom(-100, 100); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsEither([60, 80, 100]); + slave.intelligenceImplant = 30; + setHealth(slave, jsRandom(0, 60), undefined, Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(20, 70)); + slave.weight = jsRandom(-10, 10); + slave.waist = jsRandom(-10, 10); + slave.muscles = jsRandom(30, 60); + slave.skill.combat = 1; + break; + } + case "sniper": { + slave.origin = "You purchased $his life at a prison sale. $He was an enemy sniper that was captured after $his company lost to your military might."; V.prisonCrime = "is a captured enemy sniper."; - V.activeSlave.career = "a sniper"; - V.activeSlave.devotion = jsRandom(-50, -20); - V.activeSlave.trust = jsRandom(-100, -80); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsEither([60, 80, 100]); - V.activeSlave.intelligenceImplant = 20; - setHealth(V.activeSlave, jsRandom(0, 20), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(20, 70)); - V.activeSlave.weight = jsRandom(-10, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.muscles = jsRandom(30, 60); - V.activeSlave.skill.combat = 1; - if (V.activeSlave.boobs > 400) { - V.activeSlave.boobs = 400; - } - break; - case "gunner": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was an enemy machine gunner that was captured after $his company lost to your military might."; + slave.career = "a sniper"; + slave.devotion = jsRandom(-50, -20); + slave.trust = jsRandom(-100, -80); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsEither([60, 80, 100]); + slave.intelligenceImplant = 20; + setHealth(slave, jsRandom(0, 20), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(20, 70)); + slave.weight = jsRandom(-10, 10); + slave.waist = jsRandom(-10, 10); + slave.muscles = jsRandom(30, 60); + slave.skill.combat = 1; + if (slave.boobs > 400) { + slave.boobs = 400; + } + break; + } + case "gunner": { + slave.origin = "You purchased $his life at a prison sale. $He was an enemy machine gunner that was captured after $his company lost to your military might."; V.prisonCrime = "is a captured enemy gunner."; - V.activeSlave.career = "a soldier"; - V.activeSlave.devotion = jsRandom(-50, -20); - V.activeSlave.trust = jsRandom(-50, -20); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(0, 90); - V.activeSlave.intelligenceImplant = 15; - setHealth(V.activeSlave, jsRandom(0, 20), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(5, 4), 0), undefined, jsRandom(20, 70)); - V.activeSlave.weight = jsRandom(-10, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.muscles = jsRandom(50, 60); - V.activeSlave.skill.combat = 1; break; - case "soldier": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was an enemy soldier that was captured after $his company lost to your military might."; + slave.career = "a soldier"; + slave.devotion = jsRandom(-50, -20); + slave.trust = jsRandom(-50, -20); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(0, 90); + slave.intelligenceImplant = 15; + setHealth(slave, jsRandom(0, 20), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(5, 4), 0), undefined, jsRandom(20, 70)); + slave.weight = jsRandom(-10, 10); + slave.waist = jsRandom(-10, 10); + slave.muscles = jsRandom(50, 60); + slave.skill.combat = 1; + break; + } + case "soldier": { + slave.origin = "You purchased $his life at a prison sale. $He was an enemy soldier that was captured after $his company lost to your military might."; V.prisonCrime = "is a captured enemy soldier."; - V.activeSlave.career = "a soldier"; - V.activeSlave.devotion = jsRandom(-100, -20); - V.activeSlave.trust = jsRandom(-50, 20); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(0, 60); - V.activeSlave.intelligenceImplant = 15; - setHealth(V.activeSlave, jsRandom(0, 40), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(5, 4), 0), undefined, jsRandom(20, 70)); - V.activeSlave.weight = jsRandom(-10, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.muscles = jsRandom(30, 60); - V.activeSlave.skill.combat = 1; break; - case "private": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was an enemy grunt that was captured after $his company lost to your military might."; + slave.career = "a soldier"; + slave.devotion = jsRandom(-100, -20); + slave.trust = jsRandom(-50, 20); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(0, 60); + slave.intelligenceImplant = 15; + setHealth(slave, jsRandom(0, 40), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(5, 4), 0), undefined, jsRandom(20, 70)); + slave.weight = jsRandom(-10, 10); + slave.waist = jsRandom(-10, 10); + slave.muscles = jsRandom(30, 60); + slave.skill.combat = 1; + break; + } + case "private": { + slave.origin = "You purchased $his life at a prison sale. $He was an enemy grunt that was captured after $his company lost to your military might."; V.prisonCrime = "is a captured enemy private."; - V.activeSlave.career = "a private"; - V.activeSlave.devotion = jsRandom(-40, -20); - V.activeSlave.trust = jsRandom(-100, -80); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-90, 70); - V.activeSlave.intelligenceImplant = 15; - setHealth(V.activeSlave, jsRandom(0, 20), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(30, 80)); - V.activeSlave.weight = jsRandom(-10, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.muscles = jsRandom(10, 40); - V.activeSlave.skill.combat = 1; + slave.career = "a private"; + slave.devotion = jsRandom(-40, -20); + slave.trust = jsRandom(-100, -80); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-90, 70); + slave.intelligenceImplant = 15; + setHealth(slave, jsRandom(0, 20), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(30, 80)); + slave.weight = jsRandom(-10, 10); + slave.waist = jsRandom(-10, 10); + slave.muscles = jsRandom(10, 40); + slave.skill.combat = 1; + break; + } } break; - case "white collar": + } + case "white collar": { if (V.pedo_mode === 1) { - V.activeSlaveOneTimeMinAge = 16; - V.activeSlaveOneTimeMaxAge = 45; - V.one_time_age_overrides_pedo_mode = 1; + SGProp.minAge = 16; + SGProp.maxAge = 45; + SGProp.ageOverridesPedoMode = 1; } else { - V.activeSlaveOneTimeMinAge = 25; + SGProp.minAge = 25; if (V.retirementAge > 66) { - V.activeSlaveOneTimeMaxAge = 65; + SGProp.maxAge = 65; } else { - V.activeSlaveOneTimeMaxAge = V.retirementAge-2; + SGProp.maxAge = V.retirementAge-2; } } - V.oneTimeDisableDisability = 1; - V.activeSlave = GenerateNewSlave(); + SGProp.disableDisability = 1; + slave = GenerateNewSlave("", SGProp); criminal = setup.whiteCollarCriminalPool.random(); switch (criminal) { - case "racketeering": - V.activeSlave.career = jsEither(["a businessman", "a lawyer", "a stockbroker"]); - V.activeSlave.origin = `You purchased $his life at a prison sale. $He was convicted of racketeering.`; + case "racketeering": { + slave.career = jsEither(["a businessman", "a lawyer", "a stockbroker"]); + slave.origin = `You purchased $his life at a prison sale. $He was convicted of racketeering.`; V.prisonCrime = "is incarcerated for racketeering."; - V.activeSlave.devotion = jsRandom(-20, 20); - V.activeSlave.trust = jsRandom(-20, 20); - V.activeSlave.intelligence = jsRandom(0, 99); - V.activeSlave.intelligenceImplant = 15; - setHealth(V.activeSlave, jsRandom(20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(30, 60)); break; - case "bribery": - V.activeSlave.career = jsEither(["a businessman", "a lawyer", "a stockbroker"]); - V.activeSlave.origin = `You purchased $his life at a prison sale. $He was arrested and sentenced for bribing government officials.`; + slave.devotion = jsRandom(-20, 20); + slave.trust = jsRandom(-20, 20); + slave.intelligence = jsRandom(0, 99); + slave.intelligenceImplant = 15; + setHealth(slave, jsRandom(20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(30, 60)); + break; + } + case "bribery": { + slave.career = jsEither(["a businessman", "a lawyer", "a stockbroker"]); + slave.origin = `You purchased $his life at a prison sale. $He was arrested and sentenced for bribing government officials.`; V.prisonCrime = "is incarcerated for bribery."; - V.activeSlave.devotion = jsRandom(-50, -20); - V.activeSlave.trust = jsRandom(20, 50); - V.activeSlave.intelligence = jsRandom(0, 99); - V.activeSlave.intelligenceImplant = 15; - setHealth(V.activeSlave, jsRandom(20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(30, 60)); - V.activeSlave.behavioralFlaw = "arrogant"; break; - case "blackmail": - V.activeSlave.career = jsEither(["a businessman", "a lawyer", "a stockbroker"]); - V.activeSlave.origin = `You purchased $his life at a prison sale. $He was convicted of blackmail against a sorority of university students, forcing them to do sexual favors.`; + slave.devotion = jsRandom(-50, -20); + slave.trust = jsRandom(20, 50); + slave.intelligence = jsRandom(0, 99); + slave.intelligenceImplant = 15; + setHealth(slave, jsRandom(20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(30, 60)); + slave.behavioralFlaw = "arrogant"; + break; + } + case "blackmail": { + slave.career = jsEither(["a businessman", "a lawyer", "a stockbroker"]); + slave.origin = `You purchased $his life at a prison sale. $He was convicted of blackmail against a sorority of university students, forcing them to do sexual favors.`; V.prisonCrime = "is incarcerated for blackmail."; - V.activeSlave.devotion = jsRandom(-20, 20); - V.activeSlave.trust = jsRandom(20, 50); - V.activeSlave.intelligence = jsRandom(0, 99); - V.activeSlave.intelligenceImplant = 15; - setHealth(V.activeSlave, jsRandom(20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(30, 60)); - V.activeSlave.behavioralFlaw = "arrogant"; - V.activeSlave.fetish = "sadist"; - V.activeSlave.fetishStrength = 100; break; - case "embezzlement": - V.activeSlave.career = jsEither(["a businessman", "a lawyer", "a stockbroker"]); - V.activeSlave.origin = `You purchased $his life at a prison sale. $He was involved in a scandal and convicted of embezzlement.`; + slave.devotion = jsRandom(-20, 20); + slave.trust = jsRandom(20, 50); + slave.intelligence = jsRandom(0, 99); + slave.intelligenceImplant = 15; + setHealth(slave, jsRandom(20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(30, 60)); + slave.behavioralFlaw = "arrogant"; + slave.fetish = "sadist"; + slave.fetishStrength = 100; + break; + } + case "embezzlement": { + slave.career = jsEither(["a businessman", "a lawyer", "a stockbroker"]); + slave.origin = `You purchased $his life at a prison sale. $He was involved in a scandal and convicted of embezzlement.`; V.prisonCrime = "is incarcerated for embezzlement."; - V.activeSlave.devotion = jsRandom(0, 20); - V.activeSlave.trust = jsRandom(-10, 10); - V.activeSlave.intelligence = jsRandom(0, 99); - V.activeSlave.intelligenceImplant = 15; - setHealth(V.activeSlave, jsRandom(20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(30, 60)); break; - case "fraud": - V.activeSlave.career = jsEither(["a businessman", "a lawyer", "a stockbroker"]); - V.activeSlave.origin = `You purchased $his life at a prison sale. $He was convicted of fraud.`; + slave.devotion = jsRandom(0, 20); + slave.trust = jsRandom(-10, 10); + slave.intelligence = jsRandom(0, 99); + slave.intelligenceImplant = 15; + setHealth(slave, jsRandom(20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(30, 60)); + break; + } + case "fraud": { + slave.career = jsEither(["a businessman", "a lawyer", "a stockbroker"]); + slave.origin = `You purchased $his life at a prison sale. $He was convicted of fraud.`; V.prisonCrime = "is incarcerated for fraud."; - V.activeSlave.devotion = jsRandom(20, 40); - V.activeSlave.trust = jsRandom(20, 50); - V.activeSlave.intelligence = jsRandom(0, 99); - V.activeSlave.intelligenceImplant = 15; - setHealth(V.activeSlave, jsRandom(20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(30, 60)); break; - case "tax evasion": - V.activeSlave.career = jsEither(["a businessman", "a lawyer", "a stockbroker"]); - V.activeSlave.origin = `You purchased $his life at a prison sale. $He was convicted of tax evasion.`; + slave.devotion = jsRandom(20, 40); + slave.trust = jsRandom(20, 50); + slave.intelligence = jsRandom(0, 99); + slave.intelligenceImplant = 15; + setHealth(slave, jsRandom(20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(30, 60)); + break; + } + case "tax evasion": { + slave.career = jsEither(["a businessman", "a lawyer", "a stockbroker"]); + slave.origin = `You purchased $his life at a prison sale. $He was convicted of tax evasion.`; V.prisonCrime = "is incarcerated for tax evasion."; - V.activeSlave.devotion = jsRandom(-20, 0); - V.activeSlave.trust = jsRandom(20, 50); - V.activeSlave.intelligence = jsRandom(0, 99); - V.activeSlave.intelligenceImplant = 15; - setHealth(V.activeSlave, jsRandom(20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(30, 60)); break; - case "malpractice": - V.activeSlave.career = jsEither(["a doctor", "a nurse", "a physician"]); - V.activeSlave.origin = `You purchased $his life at a prison sale. $He was ${V.activeSlave.career} that took advantage of $his position to molest and modify $his patients.`; + slave.devotion = jsRandom(-20, 0); + slave.trust = jsRandom(20, 50); + slave.intelligence = jsRandom(0, 99); + slave.intelligenceImplant = 15; + setHealth(slave, jsRandom(20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(30, 60)); + break; + } + + case "malpractice": { + slave.career = jsEither(["a doctor", "a nurse", "a physician"]); + slave.origin = `You purchased $his life at a prison sale. $He was ${slave.career} that took advantage of $his position to molest and modify $his patients.`; V.prisonCrime = "is incarcerated for malpractice."; - V.activeSlave.devotion = jsRandom(-50, 0); - V.activeSlave.trust = jsRandom(-100, -50); - V.activeSlave.intelligence = jsRandom(55, 99); - V.activeSlave.intelligenceImplant = 30; - setHealth(V.activeSlave, jsRandom(-40, 20), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(40, 70)); break; - case "abuse of power": - V.activeSlave.career = jsEither(["a judge", "a lawyer", "a police officer"]); - V.activeSlave.origin = `You purchased $his life at a prison sale. $He was ${V.activeSlave.career} that took advantage of $his position for $his own benefit.`; + slave.devotion = jsRandom(-50, 0); + slave.trust = jsRandom(-100, -50); + slave.intelligence = jsRandom(55, 99); + slave.intelligenceImplant = 30; + setHealth(slave, jsRandom(-40, 20), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(40, 70)); + break; + } + case "abuse of power": { + slave.career = jsEither(["a judge", "a lawyer", "a police officer"]); + slave.origin = `You purchased $his life at a prison sale. $He was ${slave.career} that took advantage of $his position for $his own benefit.`; V.prisonCrime = "is incarcerated for abuse of power."; - V.activeSlave.devotion = jsRandom(-100, 0); - V.activeSlave.trust = jsRandom(-50, 50); - V.activeSlave.intelligence = jsRandom(60, 99); - V.activeSlave.intelligenceImplant = 30; - setHealth(V.activeSlave, jsRandom(20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(30, 60)); - V.activeSlave.behavioralFlaw = "arrogant"; + slave.devotion = jsRandom(-100, 0); + slave.trust = jsRandom(-50, 50); + slave.intelligence = jsRandom(60, 99); + slave.intelligenceImplant = 30; + setHealth(slave, jsRandom(20, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(30, 60)); + slave.behavioralFlaw = "arrogant"; + break; + } } break; - case "low tier criminals": + } + case "low tier criminals": { if (V.pedo_mode === 1) { - V.activeSlaveOneTimeMinAge = 6; - V.activeSlaveOneTimeMaxAge = 18; - V.one_time_age_overrides_pedo_mode = 1; + SGProp.minAge = 6; + SGProp.maxAge = 18; + SGProp.ageOverridesPedoMode = 1; } else { - V.activeSlaveOneTimeMinAge = 16; + SGProp.minAge = 16; if (V.retirementAge > 56) { - V.activeSlaveOneTimeMaxAge = 55; + SGProp.maxAge = 55; } else { - V.activeSlaveOneTimeMaxAge = V.retirementAge-2; + SGProp.maxAge = V.retirementAge-2; } } - V.oneTimeDisableDisability = 1; - V.activeSlave = GenerateNewSlave(); + SGProp.disableDisability = 1; + slave = GenerateNewSlave("", SGProp); /* - if (V.activeSlave.dick > 0) { - V.activeSlave.chastityPenis = 1 - } -if (V.activeSlave.vagina > -1) { - V.activeSlave.chastityVagina = 1 - } -*/ + if (slave.dick > 0) { + slave.chastityPenis = 1; + } + if (slave.vagina > -1) { + slave.chastityVagina = 1; + } + */ criminal = setup.pettyCriminalPool.random(); switch (criminal) { - case "robbery": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for robbery."; + case "robbery": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for robbery."; V.prisonCrime = "is incarcerated for robbery."; - V.activeSlave.devotion = jsRandom(-20, 20); - V.activeSlave.trust = jsRandom(-60, 60); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsEither([-100, -100, -80, -60, -40, -30, -20, -5, 0, 5, 20]); - setHealth(V.activeSlave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(20, 70)); - break; - case "armed robbery": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for armed robbery."; + slave.devotion = jsRandom(-20, 20); + slave.trust = jsRandom(-60, 60); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsEither([-100, -100, -80, -60, -40, -30, -20, -5, 0, 5, 20]); + setHealth(slave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(20, 70)); + break; + } + case "armed robbery": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for armed robbery."; V.prisonCrime = "is incarcerated for armed robbery."; - V.activeSlave.devotion = jsRandom(-50, -20); - V.activeSlave.trust = jsRandom(-20, 60); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-80, 60); - setHealth(V.activeSlave, jsRandom(-10, 20), undefined, Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(20, 70)); - V.activeSlave.weight = jsRandom(-10, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.muscles = jsRandom(10, 40); - V.activeSlave.skill.combat = 1; - break; - case "murder": + slave.devotion = jsRandom(-50, -20); + slave.trust = jsRandom(-20, 60); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-80, 60); + setHealth(slave, jsRandom(-10, 20), undefined, Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(20, 70)); + slave.weight = jsRandom(-10, 10); + slave.waist = jsRandom(-10, 10); + slave.muscles = jsRandom(10, 40); + slave.skill.combat = 1; + break; + } + case "murder": { if (jsRandom(1, 100) > 70) { - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for murder. $His actions weigh heavily on $his conscience."; - V.activeSlave.devotion = 0; - V.activeSlave.trust = 0; - setHealth(V.activeSlave, jsRandom(-50, 20), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(40, 90)); - V.activeSlave.fetish = "mindbroken"; + slave.origin = "You purchased $his life at a prison sale. $He was locked away for murder. $His actions weigh heavily on $his conscience."; + slave.devotion = 0; + slave.trust = 0; + setHealth(slave, jsRandom(-50, 20), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(40, 90)); + slave.fetish = "mindbroken"; } else { - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for murder."; - V.activeSlave.devotion = jsRandom(-50, -20); - V.activeSlave.trust = jsRandom(-20, 60); - setHealth(V.activeSlave, jsRandom(-10, 20), undefined, undefined, undefined, jsRandom(20, 70)); + slave.origin = "You purchased $his life at a prison sale. $He was locked away for murder."; + slave.devotion = jsRandom(-50, -20); + slave.trust = jsRandom(-20, 60); + setHealth(slave, jsRandom(-10, 20), undefined, undefined, undefined, jsRandom(20, 70)); } V.prisonCrime = "is incarcerated for murder."; - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-80, 70); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-80, 70); break; - case "arson": + } + case "arson": { if (jsRandom(1, 100) > 50) { - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for arson. $His actions, and those $he inadvertently killed, weigh heavily on $his conscience."; - V.activeSlave.devotion = 0; - V.activeSlave.trust = 0; - setHealth(V.activeSlave, jsRandom(-50, 20), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(40, 90)); - V.activeSlave.fetish = "mindbroken"; + slave.origin = "You purchased $his life at a prison sale. $He was locked away for arson. $His actions, and those $he inadvertently killed, weigh heavily on $his conscience."; + slave.devotion = 0; + slave.trust = 0; + setHealth(slave, jsRandom(-50, 20), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(40, 90)); + slave.fetish = "mindbroken"; } else { - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for arson."; - V.activeSlave.devotion = jsRandom(-70, -50); - V.activeSlave.trust = jsRandom(0, 60); - setHealth(V.activeSlave, jsRandom(-10, 20), undefined, undefined, undefined, jsRandom(20, 70)); + slave.origin = "You purchased $his life at a prison sale. $He was locked away for arson."; + slave.devotion = jsRandom(-70, -50); + slave.trust = jsRandom(0, 60); + setHealth(slave, jsRandom(-10, 20), undefined, undefined, undefined, jsRandom(20, 70)); } V.prisonCrime = "is incarcerated for arson."; - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-80, 70); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-80, 70); break; - case "burglary": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for burglary."; + } + case "burglary": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for burglary."; V.prisonCrime = "is incarcerated for burglary."; - V.activeSlave.devotion = jsRandom(-20, 20); - V.activeSlave.trust = jsRandom(-60, 60); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-100, 20); - setHealth(V.activeSlave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(20, 70)); - break; - case "cat burglar": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for repeat burglary."; + slave.devotion = jsRandom(-20, 20); + slave.trust = jsRandom(-60, 60); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-100, 20); + setHealth(slave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(20, 70)); + break; + } + case "cat burglar": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for repeat burglary."; V.prisonCrime = "is incarcerated for career burglary."; - V.activeSlave.career = "a cat burglar"; - V.activeSlave.devotion = jsRandom(-20, 20); - V.activeSlave.trust = jsRandom(-60, 60); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsEither([60, 80, 100]); - setHealth(V.activeSlave, jsRandom(0, 60), undefined, undefined, undefined, jsRandom(10, 50)); - V.activeSlave.weight = jsRandom(-10, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.muscles = jsRandom(10, 40); - break; - case "petty theft": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for petty theft."; + slave.career = "a cat burglar"; + slave.devotion = jsRandom(-20, 20); + slave.trust = jsRandom(-60, 60); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsEither([60, 80, 100]); + setHealth(slave, jsRandom(0, 60), undefined, undefined, undefined, jsRandom(10, 50)); + slave.weight = jsRandom(-10, 10); + slave.waist = jsRandom(-10, 10); + slave.muscles = jsRandom(10, 40); + break; + } + case "petty theft": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for petty theft."; V.prisonCrime = "is incarcerated for petty theft."; - V.activeSlave.career = "a thief"; - V.activeSlave.devotion = jsRandom(-20, 20); - V.activeSlave.trust = jsRandom(-100, -60); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsEither([-100, -100, -80, -60, -40, -30, -20, -5, 0, 5, 20]); - setHealth(V.activeSlave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(20, 70)); - break; - case "theft": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for theft."; + slave.career = "a thief"; + slave.devotion = jsRandom(-20, 20); + slave.trust = jsRandom(-100, -60); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsEither([-100, -100, -80, -60, -40, -30, -20, -5, 0, 5, 20]); + setHealth(slave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(20, 70)); + break; + } + case "theft": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for theft."; V.prisonCrime = "is incarcerated for theft."; - V.activeSlave.career = "a thief"; - V.activeSlave.devotion = jsRandom(-50, 0); - V.activeSlave.trust = jsRandom(-100, -60); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-80, 70); - setHealth(V.activeSlave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(20, 70)); - break; - case "pickpocketing": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for repeat pick-pocketing."; + slave.career = "a thief"; + slave.devotion = jsRandom(-50, 0); + slave.trust = jsRandom(-100, -60); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-80, 70); + setHealth(slave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(20, 70)); + break; + } + case "pickpocketing": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for repeat pick-pocketing."; V.prisonCrime = "is incarcerated for pick-pocketing."; - V.activeSlave.career = "a pick-pocket"; - V.activeSlave.devotion = jsRandom(-20, 0); - V.activeSlave.trust = jsRandom(-100, -60); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-80, 70); - setHealth(V.activeSlave, jsRandom(-60, 0), undefined, Math.max(normalRandInt(5, 4), 0), undefined, jsRandom(20, 70)); - break; - case "manslaughter": + slave.career = "a pick-pocket"; + slave.devotion = jsRandom(-20, 0); + slave.trust = jsRandom(-100, -60); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-80, 70); + setHealth(slave, jsRandom(-60, 0), undefined, Math.max(normalRandInt(5, 4), 0), undefined, jsRandom(20, 70)); + break; + } + case "manslaughter": { if (jsRandom(1, 100) > 60) { - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for manslaughter. $His actions weigh heavily on $his conscience."; - V.activeSlave.devotion = 0; - V.activeSlave.trust = 0; - setHealth(V.activeSlave, jsRandom(-50, -20), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(40, 90)); - V.activeSlave.fetish = "mindbroken"; + slave.origin = "You purchased $his life at a prison sale. $He was locked away for manslaughter. $His actions weigh heavily on $his conscience."; + slave.devotion = 0; + slave.trust = 0; + setHealth(slave, jsRandom(-50, -20), Math.max(normalRandInt(0, 4), 0), Math.max(normalRandInt(0, 4), 0), undefined, jsRandom(40, 90)); + slave.fetish = "mindbroken"; } else { - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for manslaughter."; - V.activeSlave.devotion = jsRandom(-70, -50); - V.activeSlave.trust = jsRandom(0, 60); - setHealth(V.activeSlave, jsRandom(-10, 20), undefined, undefined, undefined, jsRandom(20, 70)); + slave.origin = "You purchased $his life at a prison sale. $He was locked away for manslaughter."; + slave.devotion = jsRandom(-70, -50); + slave.trust = jsRandom(0, 60); + setHealth(slave, jsRandom(-10, 20), undefined, undefined, undefined, jsRandom(20, 70)); } V.prisonCrime = "is incarcerated for manslaughter."; - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsRandom(-80, 70); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsRandom(-80, 70); break; - case "blackmail": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for blackmail."; + } + case "blackmail": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for blackmail."; V.prisonCrime = "is incarcerated for blackmail."; - V.activeSlave.devotion = jsRandom(-100, -50); - V.activeSlave.trust = jsRandom(-100, -60); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = jsEither([60, 80, 100]); - setHealth(V.activeSlave, jsRandom(0, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(20, 50)); - break; - case "assault": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for assault."; + slave.devotion = jsRandom(-100, -50); + slave.trust = jsRandom(-100, -60); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = jsEither([60, 80, 100]); + setHealth(slave, jsRandom(0, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(20, 50)); + break; + } + case "assault": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for assault."; V.prisonCrime = "is incarcerated for assault."; - V.activeSlave.devotion = jsRandom(-70, -50); - V.activeSlave.trust = jsRandom(-20, 60); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - setHealth(V.activeSlave, jsRandom(-10, 40), undefined, undefined, undefined, jsRandom(20, 70)); - V.activeSlave.weight = jsRandom(-10, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.muscles = jsRandom(30, 60); - V.activeSlave.skill.combat = 1; - break; - case "battery": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for battery."; + slave.devotion = jsRandom(-70, -50); + slave.trust = jsRandom(-20, 60); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + setHealth(slave, jsRandom(-10, 40), undefined, undefined, undefined, jsRandom(20, 70)); + slave.weight = jsRandom(-10, 10); + slave.waist = jsRandom(-10, 10); + slave.muscles = jsRandom(30, 60); + slave.skill.combat = 1; + break; + } + case "battery": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for battery."; V.prisonCrime = "is incarcerated for battery."; - V.activeSlave.devotion = jsRandom(-100, -70); - V.activeSlave.trust = jsRandom(20, 60); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - setHealth(V.activeSlave, jsRandom(-10, 40), undefined, undefined, undefined, jsRandom(20, 70)); - V.activeSlave.weight = jsRandom(-10, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.muscles = jsRandom(40, 60); - V.activeSlave.skill.combat = 1; - break; - case "tax evasion": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for tax evasion."; + slave.devotion = jsRandom(-100, -70); + slave.trust = jsRandom(20, 60); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + setHealth(slave, jsRandom(-10, 40), undefined, undefined, undefined, jsRandom(20, 70)); + slave.weight = jsRandom(-10, 10); + slave.waist = jsRandom(-10, 10); + slave.muscles = jsRandom(40, 60); + slave.skill.combat = 1; + break; + } + case "tax evasion": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for tax evasion."; V.prisonCrime = "is incarcerated for tax evasion."; - V.activeSlave.devotion = jsRandom(-20, 20); - V.activeSlave.trust = jsRandom(0, 60); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - V.activeSlave.intelligence = Intelligence.random({limitIntelligence: [0, 100]}); - setHealth(V.activeSlave, jsRandom(0, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(20, 70)); - break; - case "rape": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for rape."; + slave.devotion = jsRandom(-20, 20); + slave.trust = jsRandom(0, 60); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + slave.intelligence = Intelligence.random({limitIntelligence: [0, 100]}); + setHealth(slave, jsRandom(0, 60), Math.max(normalRandInt(0, 2), 0), Math.max(normalRandInt(0, 2), 0), undefined, jsRandom(20, 70)); + break; + } + case "rape": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for rape."; V.prisonCrime = "is incarcerated for rape."; - V.activeSlave.devotion = jsRandom(-100, -50); - V.activeSlave.trust = jsRandom(-20, 80); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - setHealth(V.activeSlave, jsRandom(-10, 40), undefined, undefined, undefined, jsRandom(20, 70)); - V.activeSlave.weight = jsRandom(-10, 10); - V.activeSlave.waist = jsRandom(-10, 10); - V.activeSlave.muscles = jsRandom(30, 60); - V.activeSlave.fetish = "sadist"; - V.activeSlave.fetishStrength = 80; - break; - case "child molestation": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for child molestation."; + slave.devotion = jsRandom(-100, -50); + slave.trust = jsRandom(-20, 80); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + setHealth(slave, jsRandom(-10, 40), undefined, undefined, undefined, jsRandom(20, 70)); + slave.weight = jsRandom(-10, 10); + slave.waist = jsRandom(-10, 10); + slave.muscles = jsRandom(30, 60); + slave.fetish = "sadist"; + slave.fetishStrength = 80; + break; + } + case "child molestation": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for child molestation."; V.prisonCrime = "is incarcerated for child molestation."; if (V.minimumSlaveAge < 13) { - V.activeSlave.devotion = jsRandom(-20, 0); - V.activeSlave.trust = jsRandom(-20, 0); + slave.devotion = jsRandom(-20, 0); + slave.trust = jsRandom(-20, 0); } else { - V.activeSlave.devotion = jsRandom(-50, -20); - V.activeSlave.trust = jsRandom(-100, 0); - } - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - setHealth(V.activeSlave, jsRandom(-10, 40), Math.max(normalRandInt(5, 4), 0), undefined, undefined, jsRandom(40, 90)); - V.activeSlave.muscles = jsRandom(10, 40); - V.activeSlave.fetish = "sadist"; - V.activeSlave.fetishStrength = 80; - break; - case "child abuse": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for child abuse."; + slave.devotion = jsRandom(-50, -20); + slave.trust = jsRandom(-100, 0); + } + slave.hStyle = "buzzcut"; + slave.hLength = 0; + setHealth(slave, jsRandom(-10, 40), Math.max(normalRandInt(5, 4), 0), undefined, undefined, jsRandom(40, 90)); + slave.muscles = jsRandom(10, 40); + slave.fetish = "sadist"; + slave.fetishStrength = 80; + break; + } + case "child abuse": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for child abuse."; V.prisonCrime = "is incarcerated for child abuse."; if (V.minimumSlaveAge < 13) { - V.activeSlave.devotion = jsRandom(-20, 0); - V.activeSlave.trust = jsRandom(-20, 50); + slave.devotion = jsRandom(-20, 0); + slave.trust = jsRandom(-20, 50); } else { - V.activeSlave.devotion = jsRandom(-50, -20); - V.activeSlave.trust = jsRandom(-50, 50); - } - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - setHealth(V.activeSlave, jsRandom(-10, 40), undefined, undefined, undefined, jsRandom(20, 70)); - V.activeSlave.muscles = jsRandom(10, 40); - V.activeSlave.fetish = "sadist"; - V.activeSlave.fetishStrength = 100; - V.activeSlave.sexualFlaw = "malicious"; - break; - case "domestic abuse": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for domestic abuse."; + slave.devotion = jsRandom(-50, -20); + slave.trust = jsRandom(-50, 50); + } + slave.hStyle = "buzzcut"; + slave.hLength = 0; + setHealth(slave, jsRandom(-10, 40), undefined, undefined, undefined, jsRandom(20, 70)); + slave.muscles = jsRandom(10, 40); + slave.fetish = "sadist"; + slave.fetishStrength = 100; + slave.sexualFlaw = "malicious"; + break; + } + case "domestic abuse": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for domestic abuse."; V.prisonCrime = "is incarcerated for domestic abuse."; - V.activeSlave.devotion = jsRandom(-50, -20); - V.activeSlave.trust = jsRandom(-100, 50); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - setHealth(V.activeSlave, jsRandom(-10, 40), undefined, undefined, undefined, jsRandom(20, 70)); - V.activeSlave.muscles = jsRandom(10, 40); - V.activeSlave.fetish = "sadist"; - V.activeSlave.fetishStrength = 50; - break; - case "illegal immigrant": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for illegal immigration."; + slave.devotion = jsRandom(-50, -20); + slave.trust = jsRandom(-100, 50); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + setHealth(slave, jsRandom(-10, 40), undefined, undefined, undefined, jsRandom(20, 70)); + slave.muscles = jsRandom(10, 40); + slave.fetish = "sadist"; + slave.fetishStrength = 50; + break; + } + case "illegal immigrant": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for illegal immigration."; V.prisonCrime = "is incarcerated for illegally entering the Free City."; - V.activeSlave.career = "a refugee"; - V.activeSlave.devotion = jsRandom(0, 20); - V.activeSlave.trust = jsRandom(-100, -50); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - setHealth(V.activeSlave, jsRandom(-50, -40), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(10, 4), 0), undefined, jsRandom(40, 90)); - break; - case "mule": - V.activeSlave.origin = "You purchased $his life at a prison sale. $He was locked away for smuggling illegal contraband inside $his body."; + slave.career = "a refugee"; + slave.devotion = jsRandom(0, 20); + slave.trust = jsRandom(-100, -50); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + setHealth(slave, jsRandom(-50, -40), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(10, 4), 0), undefined, jsRandom(40, 90)); + break; + } + case "mule": { + slave.origin = "You purchased $his life at a prison sale. $He was locked away for smuggling illegal contraband inside $his body."; V.prisonCrime = "is incarcerated for smuggling drugs in $his body."; - V.activeSlave.career = "a drug mule"; - V.activeSlave.devotion = jsRandom(-20, 20); - V.activeSlave.trust = jsRandom(0, 25); - V.activeSlave.hStyle = "buzzcut"; - V.activeSlave.hLength = 0; - setHealth(V.activeSlave, jsRandom(-50, 20), undefined, undefined, undefined, jsRandom(20, 70)); - if (V.activeSlave.ovaries === 1 && V.activeSlave.vagina > 0) { - V.activeSlave.vagina = 4; - V.activeSlave.bellySag += 5; - } - V.activeSlave.anus = 4; - V.activeSlave.bellySag += 5; - V.activeSlave.chem = 10 * jsRandom(1, 3); - V.activeSlave.addict = 100; + slave.career = "a drug mule"; + slave.devotion = jsRandom(-20, 20); + slave.trust = jsRandom(0, 25); + slave.hStyle = "buzzcut"; + slave.hLength = 0; + setHealth(slave, jsRandom(-50, 20), undefined, undefined, undefined, jsRandom(20, 70)); + if (slave.ovaries === 1 && slave.vagina > 0) { + slave.vagina = 4; + slave.bellySag += 5; + } + slave.anus = 4; + slave.bellySag += 5; + slave.chem = 10 * jsRandom(1, 3); + slave.addict = 100; + break; + } } break; - default: + } + default: { r += "Someone messed up. Market is not known."; break; + } } if (!pronounsGenerated) { - generatePronouns(V.activeSlave); + generatePronouns(slave); } - return r; + return {text: r, slave: slave}; }; diff --git a/src/js/generateNewSlaveJS.js b/src/js/generateNewSlaveJS.js index db80b929d1c58d9a92ba665c2598c450d187266a..e8823a5f8d40a99068f70b167daea80f8a6632a1 100644 --- a/src/js/generateNewSlaveJS.js +++ b/src/js/generateNewSlaveJS.js @@ -3,11 +3,33 @@ window.GenerateNewSlave = (function() { "use strict"; let chance; - /** - * @type {App.Entity.SlaveState} */ + let x = {}; let slave; - - function GenerateNewSlave(sex) { + /** + * @type {App.Entity.SlaveState} + * @param {string} sex "XY" or "XX" + * @param {Object} Obj + * @param {number} Obj.minAge + * @param {number} Obj.maxAge + * @param {number} [Obj.ageOverridesPedoMode=0] 0 or 1. + * @param {number} [Obj.mature=1] 0 or 1 (default). Applies to FSMaturityPref arcs only. If 1, adds 10 to maxAge. Consider setting to 0 if you need to make sure am MP slave is both fertile and an age for that to make sense. + * @param {string} Obj.nationality Sets nationality. + * @param {string} Obj.race Sets race. + * @param {number} [Obj.disableDisability=0] 0 or 1. + */ + function GenerateNewSlave(sex, {minAge, maxAge, ageOverridesPedoMode, mature, nationality, race, disableDisability} = {}) { + // Hopefully we can phase out the globals like V.fixedRace over time, but we still support them here + x.minAge = minAge || V.activeSlaveOneTimeMinAge || 0; + x.maxAge = maxAge || V.activeSlaveOneTimeMaxAge || 999; + x.ageOverridesPedoMode = ageOverridesPedoMode || V.one_time_age_overrides_pedo_mode || 0; + x.mature = mature || 1; + x.nationality = nationality || V.fixedNationality || 0; + x.race = race || V.fixedRace || 0; + if (x.race !== 0 && !(setup.filterRacesLowercase.includes(x.race))) { + console.log("Error, cannot find race: ", x.race); + x.race = 0; + } + x.disableDisability = disableDisability || V.oneTimeDisableDisability || 0; slave = BaseSlave(); preGenCombinedStats(); @@ -36,6 +58,13 @@ window.GenerateNewSlave = (function() { } postGenCleanup(); + delete V.activeSlaveOneTimeMinAge; + delete V.activeSlaveOneTimeMaxAge; + delete V.one_time_age_overrides_pedo_mode; + delete V.fixedNationality; + delete V.fixedRace; + delete V.oneTimeDisableDisability; + return slave; } @@ -1279,24 +1308,24 @@ window.GenerateNewSlave = (function() { } function generateAge() { - if (V.activeSlaveOneTimeMaxAge > 998) { - V.activeSlaveOneTimeMaxAge = (V.pedo_mode === 1) ? 18 : 42; - } else if (V.pedo_mode === 1 && V.one_time_age_overrides_pedo_mode === 0 && V.activeSlaveOneTimeMaxAge > 18) { - V.activeSlaveOneTimeMaxAge = 18; - } - V.activeSlaveOneTimeMaxAge = Math.min(V.retirementAge - 1, V.activeSlaveOneTimeMaxAge); - V.activeSlaveOneTimeMinAge = Math.min(V.retirementAge - 1, V.activeSlaveOneTimeMinAge); - if (V.activeSlaveOneTimeMinAge < V.minimumSlaveAge) { - V.activeSlaveOneTimeMinAge = V.minimumSlaveAge; - } else if (V.pedo_mode === 1 && V.one_time_age_overrides_pedo_mode === 0) { - V.activeSlaveOneTimeMinAge = V.minimumSlaveAge; - } - V.activeSlaveOneTimeMaxAge = Math.max(V.activeSlaveOneTimeMaxAge, V.activeSlaveOneTimeMinAge); - if (V.activeSlaveOneTimeMaxAge >= 30 && V.arcologies[0].FSMaturityPreferentialist !== "unset" && V.ageAdjustOverride !== 1) { - V.activeSlaveOneTimeMaxAge += 10; - } - slave.actualAge = jsRandom(V.activeSlaveOneTimeMinAge, V.activeSlaveOneTimeMaxAge); - const secondAgeRoll = jsRandom(V.activeSlaveOneTimeMinAge, V.activeSlaveOneTimeMaxAge); + if (x.maxAge > 998) { + x.maxAge = (V.pedo_mode === 1) ? 18 : 42; + } else if (V.pedo_mode === 1 && x.ageOverridesPedoMode === 0 && x.maxAge > 18) { + x.maxAge = 18; + } + x.maxAge = Math.min(V.retirementAge - 1, x.maxAge); + x.minAge = Math.min(V.retirementAge - 1, x.minAge); + if (x.minAge < V.minimumSlaveAge) { + x.minAge = V.minimumSlaveAge; + } else if (V.pedo_mode === 1 && x.ageOverridesPedoMode === 0) { + x.minAge = V.minimumSlaveAge; + } + if (x.maxAge >= 30 && V.arcologies[0].FSMaturityPreferentialist !== "unset" && x.mature === 1) { + x.maxAge += 10; + } + x.maxAge = Math.max(x.maxAge, x.minAge); + slave.actualAge = jsRandom(x.minAge, x.maxAge); + const secondAgeRoll = jsRandom(x.minAge, x.maxAge); if (V.arcologies[0].FSYouthPreferentialist !== "unset" && V.arcologies[0].FSYouthPreferentialist >= jsRandom(1, 100)) { slave.actualAge = Math.min(slave.actualAge, secondAgeRoll); } else if (V.arcologies[0].FSMaturityPreferentialist !== "unset" && V.arcologies[0].FSMaturityPreferentialist >= jsRandom(1, 100)) { @@ -1305,10 +1334,6 @@ window.GenerateNewSlave = (function() { if (slave.actualAge >= V.retirementAge) { slave.actualAge = (V.retirementAge - 2); } - V.activeSlaveOneTimeMinAge = 0; - V.activeSlaveOneTimeMaxAge = 999; - V.one_time_age_overrides_pedo_mode = 0; - V.ageAdjustOverride = 0; slave.visualAge = slave.actualAge; slave.physicalAge = slave.actualAge; slave.ovaryAge = slave.actualAge; @@ -1362,23 +1387,20 @@ window.GenerateNewSlave = (function() { } function generateNationality() { - if (V.fixedRace === 0) { - if (V.fixedNationality === 0) { + if (x.race === 0) { + if (x.nationality === 0) { slave.nationality = hashChoice(V.nationalities); } else { - slave.nationality = V.fixedNationality; - V.fixedNationality = 0; + slave.nationality = x.nationality; } nationalityToRace(slave); } else { - slave.race = V.fixedRace; - if (V.fixedNationality === 0) { + slave.race = x.race; + if (x.nationality === 0) { raceToNationality(slave); } else { - slave.nationality = V.fixedNationality; - V.fixedNationality = 0; + slave.nationality = x.nationality; } - V.fixedRace = 0; } } @@ -1596,7 +1618,7 @@ window.GenerateNewSlave = (function() { disList.push("smellNot"); disList.push("tasteNot"); let disableCount = 0; - if (V.oneTimeDisableDisability === 0) { + if (x.disableDisability === 0) { while (disList.length > 0) { const rolled = jsEither(disList); switch (rolled) { @@ -1638,7 +1660,6 @@ window.GenerateNewSlave = (function() { } } } - V.oneTimeDisableDisability = 0; } } diff --git a/src/js/generateRelatedSlave.js b/src/js/generateRelatedSlave.js index 7a8260d1415d979d5c5b90e971d715e5ed172597..2b6ec834cb314efd2bd1c5082b1700524f31101d 100644 --- a/src/js/generateRelatedSlave.js +++ b/src/js/generateRelatedSlave.js @@ -2,7 +2,7 @@ window.generateRelatedSlave = (function() { /** * Generate a very similar relative for an existing slave (for use in Household Liquidators, for example). * @param {App.Entity.SlaveState} slave - the source relative - * @param {string} relationship - the relationship that the new relative has with the source. Currently supports "daughter", "sibling", "twin". + * @param {string} relationship - the relationship that the new relative has with the source. Currently supports "daughter", "sibling", "twin". * @param {bool} oppositeSex - set to true if the new relative should be the opposite sex of the old one (otherwise it will be the same sex). * @returns {SlaveState} - new relative */ diff --git a/src/js/health.js b/src/js/health.js index 8da70fc209bbc2fc8962332afa99627e74bc192e..0fe0e9595af614b13c7200b4d86b628e368b9c45 100644 --- a/src/js/health.js +++ b/src/js/health.js @@ -1,19 +1,32 @@ /** - * checks for illness and reduces the effectiveness of the slave accordingly -- 10, 25, 50, 85, 95% reduced - * also checks for tiredness and reduces effectiveness from that as well -- 10% reduction at 80+ and 5% at 50-80 + * checks for illness and reduces the effectiveness of the slave accordingly -- 5, 10, 25, 50, 90% reduced + * also checks for tiredness and reduces effectiveness from that as well -- 25% reduction at 90+ and 10% at 60-90 * @param {App.Entity.SlaveState} slave * @returns {number} */ window.healthPenalty = function healthPenalty(slave) { const H = slave.health; let penalty = 100; - if (H.illness > 0) { - penalty *= 1 - (100 - Math.min(Math.pow(H.illness, 2) * 5 + 5, 95)) / 100; - } - if (H.tired > 90) { - penalty *= 0.9; - } else if (H.tired > 60) { - penalty *= 0.95; + if (slave.assignment !== "work a glory hole") { + if (H.illness > 0) { + // penalty *= 1 - (100 - Math.min(Math.pow(H.illness, 2) * 5 + 5, 95)) / 100; Needs checking! + if (H.illness === 5) { + penalty *= 0.10; + } else if (H.illness === 4) { + penalty *= 0.50; + } else if (H.illness === 3) { + penalty *= 0.75; + } else if (H.illness === 2) { + penalty *= 0.90; + } else if (H.illness === 1) { + penalty *= 0.95; + } + } + if (H.tired > 90) { + penalty *= 0.75; + } else if (H.tired > 60) { + penalty *= 0.90; + } } penalty = Math.trunc(penalty) / 100; return penalty; diff --git a/src/js/itemAvailability.js b/src/js/itemAvailability.js index 3167bcf52fa0aa3bb2c4710cc5acd355c0ad398b..46a3925b6b2e74929c6383bcc4ae718d44730f4f 100644 --- a/src/js/itemAvailability.js +++ b/src/js/itemAvailability.js @@ -9,7 +9,7 @@ window.isItemAccessible = (function() { * @param {string} string Name of wearable item * @param {string} category that item is in clothing, collar, etc * @param {App.Entity.SlaveState} slave - * @returns {boolean|string} Returns true if item is accessible, and false if it is not. If the slave param is set, it may sometimes return a string instead of false, explaining why the item can't be used with that slave. + * @returns {boolean|string} Returns true if item is accessible, and false if it is not. If the slave param is set, it may sometimes return a string instead of false, explaining why the item can't be used with that slave. */ function entry(string, category = "clothing", slave) { if (V.cheatMode === 1) { diff --git a/src/js/main.js b/src/js/main.js index 89902d6ba07f7b0fa090ab430fcceaa41214e2af..144c26aebeed49b819f0629b41bb758ac0a82988 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -21,7 +21,7 @@ App.MainView.errors = function() { App.UI.DOM.passageLink("Backwards Compatibility", "Backwards Compatibility")); } } else { - newError().append(App.UI.DOM.makeSpan("INCOMPATIBLE SAVE WARNING:", "major-warning"), + newError().append(App.UI.DOM.makeElement("span", "INCOMPATIBLE SAVE WARNING:", "major-warning"), ` Your saved game was created using version: ${V.ver}, and you are using a later version which New Game Plus cannot reconcile. Please start a new game.`); } diff --git a/src/js/modification.js b/src/js/modification.js index 8670dd6176a3191b13647b98a94e354d219bddcb..d5e5a3b2443454b52e46615437ab68e8ba71d8ae 100644 --- a/src/js/modification.js +++ b/src/js/modification.js @@ -224,7 +224,7 @@ App.Medicine.Modification.setPiercing = function(slave, location, weight) { r += `${he} <span class="devotion inc">got off</span> on you giving ${him} a corset piercing personally. ${He} loved the feeling of the metal entering ${his} flesh. `; slave.devotion += 2 * delta; } else if (slave.devotion <= 95) { - r += `<span class="devotion dec">saddened</span> you decided to take out ${his} corset piercings. ${He}'ll miss the constant slight discomfort they gave ${him}. `; + r += `<span class="devotion dec">saddened</span> you decided to take out ${his} corset piercings. ${He}'ll miss the constant slight discomfort they gave ${him}. `; slave.devotion += 2 * delta; } else { r += `disapointed to lose ${his} corset piercings, but accepts your will for ${his} body. `; diff --git a/src/js/removeActiveSlave.js b/src/js/removeActiveSlave.js index 1d34fc8386a3e90b0a268d4a4afa3212ee80fa94..82882699038578c6b32da86e938e2283ca12d0c0 100644 --- a/src/js/removeActiveSlave.js +++ b/src/js/removeActiveSlave.js @@ -113,6 +113,9 @@ window.removeActiveSlave = function removeActiveSlave() { slave.origBodyOwnerID = 0; } */ + if (slave.ID === V.activeSlave.subTarget || V.activeSlave.subTarget === slave.ID) { + V.activeSlave.subTarget = 0; slave.subTarget = 0; + } }); /* remove from Pit fighters list, if needed */ @@ -166,7 +169,7 @@ window.removeActiveSlave = function removeActiveSlave() { V.boomerangSlave.father = V.missingParentID; } if (V.boomerangSlave.origBodyOwnerID === AS_ID) { - V.traitor.origBodyOwnerID = 0; + V.boomerangSlave.origBodyOwnerID = 0; } } diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js index 686de9cd592c3522ad6a50f70caf1e666cd75010..9e380a413170d84411b7cd9e70b6749b288eddb8 100644 --- a/src/js/rulesAssistantOptions.js +++ b/src/js/rulesAssistantOptions.js @@ -1562,7 +1562,7 @@ window.rulesAssistantOptions = (function() { const element = document.createElement("div"); element.className = "ra-setters"; this.tabButtons_ = document.createElement("div"); - this.tabButtons_.className = "tab"; + this.tabButtons_.className = "tabbar"; element.appendChild(this.tabButtons_); return element; } @@ -2309,6 +2309,10 @@ window.rulesAssistantOptions = (function() { if (V.arcologies[0].FSAssetExpansionistResearch === 1) { drugs.push(["hyper breast injections"]); } + if (V.dispensary) + { + drugs.push(["nipple enhancers"]); + } if (V.purchasedSagBGone === 1) { drugs.push(["Sag-B-gone (Product)", "sag-B-gone"]); } @@ -3811,8 +3815,7 @@ window.rulesAssistantOptions = (function() { constructor() { const items = [ ["remove", "remove"], - ["enabled", 0], - ["disabled", -1], + ["tally", "tally"], ]; super("Tattoo a mark for each successful birth", items, true); this.setValue(current_rule.set.birthsTat); @@ -3824,8 +3827,7 @@ window.rulesAssistantOptions = (function() { constructor() { const items = [ ["remove", "remove"], - ["enabled", 0], - ["disabled", -1], + ["tally", "tally"], ]; super("Tattoo a mark for each abortion", items, true); this.setValue(current_rule.set.abortionTat); diff --git a/src/js/sexActsJS.js b/src/js/sexActsJS.js index 0e236b95861d2f72d81402f469450a567678a81f..ba43aff1d96f52096d6417982fe3d6f606463e08 100644 --- a/src/js/sexActsJS.js +++ b/src/js/sexActsJS.js @@ -27,10 +27,10 @@ window.VCheck = (function() { /** call as VCheck.Anal() * @param {number} [times=1] is how many times to increment the anal counts. + * @param {App.Entity.SlaveState} [slave=V.activeSlave] * @returns {string} */ - function AnalVCheck(times = 1) { - const slave = V.activeSlave; + function AnalVCheck(times = 1, slave = V.activeSlave) { let r = ''; setScopedPronouns(slave); @@ -72,10 +72,10 @@ window.VCheck = (function() { /** call as VCheck.Vaginal() * @param {number} [times=1] is how many times to increment the vaginal counts. + * @param {App.Entity.SlaveState} [slave=V.activeSlave] * @returns {string} */ - function VaginalVCheck(times = 1) { - const slave = V.activeSlave; + function VaginalVCheck(times = 1, slave = V.activeSlave) { let r = ''; setScopedPronouns(slave); @@ -119,10 +119,10 @@ window.VCheck = (function() { /** call as VCheck.Both() * @param {number} [analTimes=1] how many times to increment the anal counts, if there is no vagina available. * @param {number} [bothTimes=1] how many times to increment both holes counts (usually it is half of analTimes). + * @param {App.Entity.SlaveState} [slave=V.activeSlave] * @returns {string} */ - function BothVCheck(analTimes = 1, bothTimes = 1) { - const slave = V.activeSlave; + function BothVCheck(analTimes = 1, bothTimes = 1, slave = V.activeSlave) { let r = ''; setScopedPronouns(slave); @@ -232,13 +232,14 @@ window.VCheck = (function() { /** call as VCheck.Simple() * @param {number} [times=1] how many times to increment either the Vaginal or the Anal counts, if there is no Vagina available. + * @param {App.Entity.SlaveState} [slave=V.activeSlave] * @returns {string} */ - function SimpleVCheck(times = 1) { - if (canDoVaginal(State.variables.activeSlave)) { - return VaginalVCheck(times); - } else if (canDoAnal(State.variables.activeSlave)) { - return AnalVCheck(times); + function SimpleVCheck(times = 1, slave = V.activeSlave) { + if (canDoVaginal(slave)) { + return VaginalVCheck(times, slave); + } else if (canDoAnal(slave)) { + return AnalVCheck(times, slave); } } @@ -437,7 +438,7 @@ window.SimpleSexAct = (function() { } else { actX(subslave, "oral"); } - if (typeof slave1ID === Number && typeof slave2ID === Number) { + if (typeof slave1ID === Number && typeof slave2ID === Number) { seX(V.slaves[slave1ID], sex, V.slaves[slave2ID], "penetrative"); } } @@ -498,14 +499,14 @@ window.actX = function actX(slave, act, count = 1) { // Act was likely entered incorrectly. return; } - if (act === "birth") { // Annoyingly at the moment, V.birthsTotal means all the births in your arc. Within the slave counter though, .births is all births in your arc and .birthsTotal includes births outside your arch. + if (act === "birth") { // Annoyingly at the moment, V.birthsTotal means all the births in your arc. Within the slave counter though, .births is all births in your arc and .birthsTotal includes births outside your arch. slave.counter.birthsTotal += count; } slave.counter[act] += count; }; /** - * Sex is between two. This is a handy wrapper for actX that emphasizes that. + * Sex is between two. This is a handy wrapper for actX that emphasizes that. * @param {App.Entity.SlaveState} slave1 always a slave * @param {string} act1 oral, anal, etc * @param {App.Entity.SlaveState | string} slave2 slave or PC or "public" @@ -516,7 +517,7 @@ window.seX = function seX(slave1, act1, slave2, act2, count = 1) { // Slave 1 does their normal thing actX(slave1, act1, count); - // Slave 2 does their normal thing. If "Slave 2" is the public, then increment the public counter for slave 1 instead. + // Slave 2 does their normal thing. If "Slave 2" is the public, then increment the public counter for slave 1 instead. if (slave2 === "public") { actX(slave1, "publicUse", count); } else if (typeof slave2 === 'string') { diff --git a/src/js/slaveCostJS.js b/src/js/slaveCostJS.js index c98320c2d789548a4ea9461d376c462fb22cb4e4..4abd0af972c470487f717b889cec75dfd7bec2d4 100644 --- a/src/js/slaveCostJS.js +++ b/src/js/slaveCostJS.js @@ -1516,7 +1516,7 @@ window.Beauty = function(s) { window.BeautyTooltip = function(slave) { - // Make a link. Text should be slave'slave beauty. Clicking the link will display detailed info about that beauty where the link used to be + // Make a link. Text should be slave'slave beauty. Clicking the link will display detailed info about that beauty where the link used to be if (V.cheatMode || V.debugMode) { return jQuery('#BeautyTooltip').empty().append(BeautyDisplay(slave)); } else { @@ -1530,7 +1530,7 @@ window.BeautyTooltip = function(slave) { let direction = "descending"; // Link that shows beauty and will be used to toggle display - let span = document.createElement('span'); + let span = document.createElement('span'); span.appendChild(hide(slave)); // Heading line that handles sorting @@ -1570,7 +1570,7 @@ window.BeautyTooltip = function(slave) { // Set up the frame that contains the info function BeautyFrame(slave) { - let el = document.createDocumentFragment(); + let el = document.createDocumentFragment(); let beautyArray; if ((criteria === "text" && direction === "descending") || (criteria === "value" && direction === "ascending")) { @@ -1583,9 +1583,9 @@ window.BeautyTooltip = function(slave) { let domCell; beautyArray.forEach((line) => { line.value = (Math.floor(line.value * 10) / 10); - domLine = document.createElement('div'); + domLine = document.createElement('div'); domLine.style.display = "float"; - domCell = document.createElement('span'); + domCell = document.createElement('span'); domCell.style.float = "left"; domCell.style.minWidth = "50px"; @@ -2081,7 +2081,7 @@ window.FResult = function(s) { window.FResultTooltip = function(slave) { - // Make a link. Text should be slave'slave FResult. Clicking the link will display detailed info about that beauty where the link used to be + // Make a link. Text should be slave'slave FResult. Clicking the link will display detailed info about that beauty where the link used to be if (V.cheatMode || V.debugMode) { return jQuery('#FResultTooltip').empty().append(FResultDisplay(slave)); } else { @@ -2093,7 +2093,7 @@ window.FResultTooltip = function(slave) { let direction = "descending"; // Link that shows FResult and will be used to toggle display - let span = document.createElement('span'); + let span = document.createElement('span'); span.appendChild(hide(slave)); // Heading line that handles sorting @@ -2133,7 +2133,7 @@ window.FResultTooltip = function(slave) { // Set up the frame that contains the info, returns dom node function FResultFrame(slave) { - let el = document.createDocumentFragment(); + let el = document.createDocumentFragment(); let fResultArray; if ((criteria === "text" && direction === "descending") || (criteria === "value" && direction === "ascending")) { @@ -2146,9 +2146,9 @@ window.FResultTooltip = function(slave) { let domCell; fResultArray.forEach((line) => { line.value = (Math.floor(line.value * 10) / 10); - domLine = document.createElement('div'); + domLine = document.createElement('div'); domLine.style.display = "float"; - domCell = document.createElement('span'); + domCell = document.createElement('span'); domCell.style.float = "left"; domCell.style.minWidth = "50px"; @@ -2181,7 +2181,7 @@ window.FResultTooltip = function(slave) { window.slaveCost = function slaveCost(slave, isStartingSlave) { const milked = saGetMilked(slave, true); const beauty = slaveCostBeauty(slave, isStartingSlave); - if ((milked*52) > beauty && !isStartingSlave) { // Arbitrarily, let's say their milk worth is what they would make in a year. Blocking starting slave for now because milk makes so much money, the estimation makes game start impossible. + if ((milked*52) > beauty && !isStartingSlave) { // Arbitrarily, let's say their milk worth is what they would make in a year. Blocking starting slave for now because milk makes so much money, the estimation makes game start impossible. return milked*52; } else { return beauty; diff --git a/src/js/slaveSummaryWidgets.js b/src/js/slaveSummaryWidgets.js index 82c096685c2a0bac0f86ed80d24a98dd5b786646..2e17e1723f30cda622b791f88625a3fb0fd1b610 100644 --- a/src/js/slaveSummaryWidgets.js +++ b/src/js/slaveSummaryWidgets.js @@ -786,6 +786,9 @@ window.SlaveSummary = (function() { case "hyper breast injections": drugDesc = "Boobs+++"; break; + case "nipple enhancers": + drugDesc = "Nipple+"; + break; case "butt injections": drugDesc = "Butt+"; break; diff --git a/src/js/storyJS.js b/src/js/storyJS.js index 471646cb25c6ce53de02c0bb2e7e100259e84f0f..b01452d869efb475f502b19e51d32664c43c4e56 100644 --- a/src/js/storyJS.js +++ b/src/js/storyJS.js @@ -367,33 +367,6 @@ window.bodyguardSuccessorEligible = function(slave) { 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) && canHold(slave) && canSee(slave) && canHear(slave)); }; -window.ngUpdateGenePool = function(genePool = []) { - const transferredSlaveIds = (State.variables.slaves || []) - .filter(s => s.ID >= 1200000) - .map(s => s.ID - 1200000); - return genePool - .filter(s => (transferredSlaveIds.includes(s.ID))) - .map(function(s) { - const result = jQuery.extend(true, {}, s); - result.ID += 1200000; - return result; - }); -}; - -window.ngUpdateMissingTable = function(missingTable) { - const newTable = {}; - - (State.variables.slaves || []) - .forEach(s => ([s.pregSource + 1200000, s.mother + 1200000, s.father + 1200000] - .filter(i => (i in missingTable)) - .forEach(i => { - newTable[i - 1200000] = missingTable[i]; - newTable[i - 1200000].ID -= 1200000; - }))); - - return newTable; -}; - /** * @param {any} obj * @returns {string} @@ -469,10 +442,14 @@ window.overpowerCheck = function(slave, PC) { * @param {App.Entity.SlaveState} slave * @returns {number[]} */ -window.impregnatedBy = function(slave) { +window.impregnatedBy = function(slave, genepool=false) { const IDArray = []; if (!Array.isArray(slave.womb)) { - WombInit(slave); + if (genepool) { + slave.womb = []; + } else { + WombInit(slave); + } } for (let i = 0; i < slave.womb.length; i++) { IDArray.push(slave.womb[i].fatherID); @@ -486,8 +463,8 @@ window.impregnatedBy = function(slave) { * @param {App.Entity.SlaveState} father * @returns {boolean} */ -window.isImpregnatedBy = function(mother, father) { - return impregnatedBy(mother).includes(father.ID); +window.isImpregnatedBy = function(mother, father, genepool=false) { + return impregnatedBy(mother, genepool).includes(father.ID); }; /** diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js index 459914c0113ad9fc5852bdbc7af41fc8a0671063..80194e7e9d9b3bfb3b3d04e024472b679c914646 100644 --- a/src/js/utilsDOM.js +++ b/src/js/utilsDOM.js @@ -199,7 +199,7 @@ App.UI.DOM.combineNodes = function(...content) { * @param {boolean} [numberOnly] * @returns {HTMLInputElement} */ -App.UI.DOM.makeTextBox = function(defaultValue, onEnter, numberOnly = false, passage) { +App.UI.DOM.makeTextBox = function(defaultValue, onEnter, numberOnly = false) { const input = document.createElement("input"); input.type = "text"; input.value = defaultValue; @@ -211,24 +211,20 @@ App.UI.DOM.makeTextBox = function(defaultValue, onEnter, numberOnly = false, pas to 0 and trigger a change event we can't distinguish from setting the value to 0 explicitly. The workaround is resetting the value to the last known valid value and not triggering onEnter. */ + let oldValue = defaultValue; updateValue = event => { const newValue = Number(event.target.value); if (!Number.isNaN(newValue)) { onEnter(newValue); - event.target.oldValue = newValue; + oldValue = newValue; } else { // reset the value to the last known valid value - event.target.value = event.target.oldValue; + event.target.value = oldValue; } }; - input.oldValue = defaultValue; } else { updateValue = e => { onEnter(e.target.value); - if (passage !== '') { - SugarCube.Engine.play(passage); - } - console.log("passage", passage); }; } input.addEventListener('change', updateValue); @@ -246,9 +242,7 @@ App.UI.DOM.colorInput = function(defaultValue, onEnter) { input.type = "color"; input.value = defaultValue; - let updateValue = e => { onEnter(e.target.value); }; - - input.addEventListener('change', updateValue); + input.addEventListener('change', e => { onEnter(e.target.value); }); return input; }; diff --git a/src/js/utilsFC.js b/src/js/utilsFC.js index b320b2b8b1867da9ac433c363e2f0744d44846d1..0e613fd1bb06e794a4116fd4dc3fef8bd7baf9cc 100644 --- a/src/js/utilsFC.js +++ b/src/js/utilsFC.js @@ -554,7 +554,6 @@ window.Height = (function() { return table[`${nationality}.${race}`] || table[nationality] || table[`.${race}`] || table[""] || def; }; - /** * Helper method: Generate a skewed normal random variable with the skew s * Reference: http://azzalini.stat.unipd.it/SN/faq-r.html @@ -608,8 +607,8 @@ window.Height = (function() { if (!_.isFinite(age) || age < 2 || age >= 20) { return height; } - let minHeight = 0; - let midHeight = 0; + let minHeight; + let midHeight; let midAge; switch (genes) { case "XX": // female @@ -666,7 +665,7 @@ window.Height = (function() { case "XY": // male result = nationalityMeanHeight(xyMeanHeight, nationality, race); break; - // special cases. Extra SHOX genes on X and Y chromosomes make for larger people + // special cases. Extra SHOX genes on X and Y chromosomes make for larger people case "X0": case "X": // Turner syndrome female result = nationalityMeanHeight(xxMeanHeight, nationality, race) * 0.93; @@ -1116,7 +1115,9 @@ window.numberWithPluralOne = function(number, single, plural) { }; // shows "less than one (slave)" instead of "no (slaves)" when number is 0. window.numberWithPluralNonZero = function(number, single, plural) { - if (number === 0) { number = 0.1; } + if (number === 0) { + number = 0.1; + } return numberWithPlural(number, single, plural); }; window.onlyPlural = function(number, single, plural) { @@ -1142,7 +1143,7 @@ window.commaNum = function(s) { if (!s) { return "0"; } - if (State.variables.formatNumbers !== 1) { + if (V.formatNumbers !== 1) { return s.toString(); } else { return s.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); @@ -1169,25 +1170,25 @@ window.years = function(weeks) { years = Math.trunc(weeks / 52); if (years >= 1) { // Is there at least 1 year - weeks = weeks-(years*52); // Find leftover weeks + weeks = weeks - (years * 52); // Find leftover weeks } - if (weeks && weeks/13 >= 1) { // Is there at least 1 quarter - quarters = Math.trunc(weeks/13); // How many quarters? - weeks = weeks-(quarters*13); // A quarter contains 13 weeks, how many extra weeks do we have? + if (weeks && weeks / 13 >= 1) { // Is there at least 1 quarter + quarters = Math.trunc(weeks / 13); // How many quarters? + weeks = weeks - (quarters * 13); // A quarter contains 13 weeks, how many extra weeks do we have? } - if (weeks && weeks/4 >= 1) { // Is there at least 1 month - months = Math.trunc(weeks/4); // How many months? + if (weeks && weeks / 4 >= 1) { // Is there at least 1 month + months = Math.trunc(weeks / 4); // How many months? if (months === 3) { // Almost a quarter of a year - months--; // Quarters have 13 weeks though, so let's be sure the extra is in weeks. Otherwise 51 will return "12 months" instead of "11 months and 4 weeks." + months--; // Quarters have 13 weeks though, so let's be sure the extra is in weeks. Otherwise 51 will return "12 months" instead of "11 months and 4 weeks." } - weeks = weeks-(months*4); // A month contains 4 weeks, how many extra weeks do we have? + weeks = weeks - (months * 4); // A month contains 4 weeks, how many extra weeks do we have? } // So we have years, quarters, months, and weeks. // Quarters are useless so: - months += quarters*3; // Each quarter has three months. + months += quarters * 3; // Each quarter has three months. if (years) { array.push(`${num(years)} year${years !== 1 ? `s` : ``}`); @@ -1201,13 +1202,7 @@ window.years = function(weeks) { array.push(`${num(weeks)} week${weeks !== 1 ? `s` : ``}`); } - r += array[0]; - if (array.length === 3) { - r += `, ${array[1]} and ${array[2]}`; - } else if (array.length === 2) { - r += ` and ${array[1]}`; - } - return r; + return array.toStringExt(); }; /** * @param {number} [weeks] @@ -1216,7 +1211,7 @@ window.years = function(weeks) { */ window.asDate = function(weeks = null, bonusDay = 0) { if (weeks == null) { - weeks = State.variables.week; + weeks = V.week; } let d = new Date(2037, 0, 12); d.setDate(d.getDate() + weeks * 7 + bonusDay); @@ -1243,15 +1238,15 @@ window.cashFormat = function(s) { }; window.cashFormatColor = function(s, invert = false) { if (invert) { - s = -1*s; + s = -1 * s; } // Display red if the value is negative, unless invert is true if (s < 0) { return `<span class='red'>${cashFormat(s)}</span>`; - // White for exactly zero - } else if (s === 0 ) { + // White for exactly zero + } else if (s === 0) { return `<span>${cashFormat(s)}</span>`; - // Yellow for positive + // Yellow for positive } else { return `<span class='yellowgreen'>${cashFormat(s)}</span>`; } @@ -1447,115 +1442,134 @@ window.getSlaveTrustClass = function(slave) { /** * Takes an integer e.g. $activeSlave.hLength, returns a string in the format 10 inches - * @param {number} s + * @param {number} cm * @returns {string} */ -window.cmToInchString = function(s) { - let inches = (Math.round(s / 2.54)).toString(); - if (inches === "0") { - if (s === 0) { - inches += " inches"; - } else { - inches = "less than an inch"; - } - } else if (inches === "1") { - inches += " inch"; - } else { - inches += " inches"; +window.cmToInchString = function(cm) { + let inches = cm / 2.54; + if (inches > 0 && inches < 1) { + return "less than an inch"; } - return inches; + inches = Math.round(inches); + if (inches === 1) { + return "1 inch"; + } + return `${inches} inches`; }; /** * takes an integer e.g. $activeSlave.height, returns a string in the format 6'5" - * @param {number} s + * @param {number} cm * @returns {string} */ -window.cmToFootInchString = function(s) { - if (Math.round(s / 2.54) < 12) { - return cmToInchString(s); +window.cmToFootInchString = function(cm) { + if (Math.round(cm / 2.54) < 12) { + return cmToInchString(cm); } - return `${Math.trunc(Math.round(s/2.54)/12)}'${Math.round(s/2.54)%12}"`; + return `${Math.trunc(Math.round(cm / 2.54) / 12)}'${Math.round(cm / 2.54) % 12}"`; }; /** * takes a dick value e.g. $activeSlave.dick, returns a string in the format 6 inches - * @param {number} s + * @param {number} dick * @returns {string} */ -window.dickToInchString = function(s) { - return cmToInchString(dickToCM(s)); +window.dickToInchString = function(dick) { + return cmToInchString(dickToCM(dick)); }; /** * takes a dick value e.g. $activeSlave.dick, returns an int of the dick length in cm - * @param {number} s + * @param {number} dick * @returns {number} */ -window.dickToCM = function(s) { - if (s < 9) { - return s * 5; - } else if (s === 9) { +window.dickToCM = function(dick) { + if (dick < 9) { + return dick * 5; + } else if (dick === 9) { return 50; } - return s * 6; + return dick * 6; }; - -// takes a ball value e.g. $activeSlave.balls, returns a string in the format 3 inches -window.ballsToInchString = function(s) { - return cmToInchString(ballsToCM(s)); +/** + * takes a ball value e.g. $activeSlave.balls, returns a string in the format 3 inches + * @param {number} balls + * @returns {string} + */ +window.ballsToInchString = function(balls) { + return cmToInchString(ballsToCM(balls)); }; -// takes a ball value e.g. $activeSlave.balls, returns an int of the ball size in cm -window.ballsToCM = function(s) { - if (s < 2) { +/** + * takes a ball value e.g. $activeSlave.balls, returns an int of the ball size in cm + * @param {number} balls + * @returns {number} + */ +window.ballsToCM = function(balls) { + if (balls < 2) { return 0; } - return (s < 10 ? (s - 1) * 2 : s * 2); + return (balls < 10 ? (balls - 1) * 2 : balls * 2); }; -// takes a dick value e.g. $activeSlave.dick, returns a string in the format of either `20cm (8 inches)`, `8 inches`, or `20cm` -window.dickToEitherUnit = function(s) { - if (State.variables.showInches === 1) { - return `${dickToCM(s)}cm (${dickToInchString(s)})`; +/** + * takes a dick value e.g. $activeSlave.dick, returns a string in the format of either `20cm (8 inches)`, `8 inches`, or `20cm` + * @param {number} dick + * @returns {string} + */ +window.dickToEitherUnit = function(dick) { + if (V.showInches === 1) { + return `${dickToCM(dick)}cm (${dickToInchString(dick)})`; } - if (State.variables.showInches === 2) { - return dickToInchString(s); + if (V.showInches === 2) { + return dickToInchString(dick); } - return `${dickToCM(s)}cm`; + return `${dickToCM(dick)}cm`; }; -// takes a ball value e.g. $activeSlave.balls, returns a string in the format of either `20cm (8 inches)`, `8 inches`, or `20cm` -window.ballsToEitherUnit = function(s) { - if (State.variables.showInches === 1) { - return `${ballsToCM(s)}cm (${ballsToInchString(s)})`; +/** + * takes a ball value e.g. $activeSlave.balls, returns a string in the format of either `20cm (8 inches)`, `8 inches`, or `20cm` + * @param {number} balls + * @returns {string} + */ +window.ballsToEitherUnit = function(balls) { + if (V.showInches === 1) { + return `${ballsToCM(balls)}cm (${ballsToInchString(balls)})`; } - if (State.variables.showInches === 2) { - return ballsToInchString(s); + if (V.showInches === 2) { + return ballsToInchString(balls); } - return `${ballsToCM(s)}cm`; + return `${ballsToCM(balls)}cm`; }; -// takes an int in centimeters e.g. $activeSlave.height, returns a string in the format of either `200cm (6'7")`, `6'7"`, or `200cm` -window.heightToEitherUnit = function(s) { - if (State.variables.showInches === 1) { - return `${s}cm (${cmToFootInchString(s)})`; +/** + * takes an int in centimeters e.g. $activeSlave.height, returns a string in the format of either `200cm (6'7")`, `6'7"`, or `200cm` + * @param {number} height + * @returns {string} + */ +window.heightToEitherUnit = function(height) { + if (V.showInches === 1) { + return `${height}cm (${cmToFootInchString(height)})`; } - if (State.variables.showInches === 2) { - return cmToFootInchString(s); + if (V.showInches === 2) { + return cmToFootInchString(height); } - return `${s}cm`; + return `${height}cm`; }; -// takes an int in centimeters e.g. $activeSlave.hLength, returns a string in the format of either `30cm (12 inches)`, `12 inches`, or `30cm` -window.lengthToEitherUnit = function(s) { - if (State.variables.showInches === 1) { - return `${s}cm (${cmToInchString(s)})`; +/** + * takes an int in centimeters e.g. $activeSlave.hLength, returns a string in the format of either `30cm (12 inches)`, `12 inches`, or `30cm` + * @param {number} length + * @returns {string} + */ +window.lengthToEitherUnit = function(length) { + if (V.showInches === 1) { + return `${length}cm (${cmToInchString(length)})`; } - if (State.variables.showInches === 2) { - return cmToInchString(s); + if (V.showInches === 2) { + return cmToInchString(length); } - return `${s}cm`; + return `${length}cm`; }; /** @@ -1575,6 +1589,7 @@ window.induceLactation = function induceLactation(slave) { } return r; }; + window.getProstheticsStockpile = function() { return `<div>Prosthetics interfaces: ${num(V.prosthetics.interfaceP1.amount + V.prosthetics.interfaceP2.amount)}</div>` + `<div class="choices">Basic: ${V.prosthetics.interfaceP1.amount}</div>` + @@ -2201,6 +2216,7 @@ window.SkillIncrease = (function() { slave.skill.oral += skillIncrease; return r; } + /* call as SkillIncrease.Vaginal() */ /** * @param {App.Entity.SlaveState} slave @@ -2328,7 +2344,7 @@ window.SkillIncrease = (function() { window.upgradeMultiplier = function(skill) { if (skill === 'medicine' && V.PC.career === "medicine" || skill === 'engineering' && V.PC.career === "engineer" - || ((skill === 'medicine' || skill === 'engineering') && V.arcologies[0].FSRestartDecoration >= 100 && V.eugenicsFullControl === 0)) { + || ((skill === 'medicine' || skill === 'engineering') && V.arcologies[0].FSRestartDecoration >= 100 && V.eugenicsFullControl === 0)) { return 0.6; } if (V.PC.skill[skill] <= -100) { @@ -2612,8 +2628,12 @@ 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; }; @@ -2646,7 +2666,6 @@ window.nippleColorLevel = function(color) { * @returns {string} */ - /** * Expression for SugarCube for referencing a slave by index * @param {number} i slave array index or -1 for activeSlave @@ -2662,7 +2681,7 @@ App.Utils.slaveRefString = function(i) { * @returns {App.Entity.SlaveState} */ App.Utils.slaveByIndex = function(i) { - return i === -1 ? State.variables.activeSlave : State.variables.slaves[i]; + return i === -1 ? V.activeSlave : V.slaves[i]; }; /** @@ -2671,7 +2690,7 @@ App.Utils.slaveByIndex = function(i) { */ App.Utils.setActiveSlaveByIndex = function(index) { if (index >= 0) { - State.variables.activeSlave = State.variables.slaves[index]; + V.activeSlave = V.slaves[index]; } }; @@ -2681,7 +2700,7 @@ App.Utils.setActiveSlaveByIndex = function(index) { * @returns {number} */ App.Utils.slaveIndexForId = function(id) { - return State.variables.slaveIndices[id]; + return V.slaveIndices[id]; }; /** @@ -2708,9 +2727,9 @@ App.Utils.setLocalPronouns = function(slave, suffix, pronouns) { 'She', 'Her', 'Hers', 'Herself', 'Girl', 'woman', 'women', 'loli', 'daughter', 'sister', 'wife', 'wives', 'mother', 'mothers', 'Woman', 'Women', 'Loli', 'Daughter', 'Sister', 'Wife', 'Wives', 'Mother', 'Mothers' - ]; // Pronouns always refer to the slave in question, never any relation of theirs. It is "mother" as in "she is a mother of many" not "you are her mother". Plural pronouns would refer to "wives like her," not "her wives." + ]; // Pronouns always refer to the slave in question, never any relation of theirs. It is "mother" as in "she is a mother of many" not "you are her mother". Plural pronouns would refer to "wives like her," not "her wives." - const scope = pSuffix.length === 0 ? State.variables : State.temporary; + const scope = pSuffix.length === 0 ? V : State.temporary; pronouns.forEach(p => { scope[p + pSuffix] = ps[p]; }); @@ -2778,8 +2797,8 @@ window.disobedience = function(slave) { } // factors are between 0 (right on the boundary of perfectly obedient) and 10 (completely disobedient) - let devotionFactor = 10 - ((10 * (slave.devotion + 100))/(devotionBaseline + 100)); - let trustFactor = (10 * (slave.trust - trustBaseline))/(100 - trustBaseline); + let devotionFactor = 10 - ((10 * (slave.devotion + 100)) / (devotionBaseline + 100)); + let trustFactor = (10 * (slave.trust - trustBaseline)) / (100 - trustBaseline); return Math.round(devotionFactor * trustFactor); }; @@ -2856,7 +2875,7 @@ window.generateSlaveID = function() { // household liquidators and recETS generate slaves at an offset of 1000 (and many such slaves already exist) // if you go through enough slaves you WILL generate collisions, so make sure we haven't just done that. let allSlaveIDs = [...V.slaves.map((s) => s.ID), ...V.tanks.map((s) => s.ID), ...V.cribs.map((s) => s.ID)]; - while (allSlaveIDs.contains(V.IDNumber)) { + while (allSlaveIDs.includes(V.IDNumber)) { V.IDNumber++; } return V.IDNumber++; @@ -2880,3 +2899,20 @@ window.ASDump = function() { } } }; + +window.getRevivalistNationality = function() { + if (V.arcologies[0].FSRomanRevivalist > 90) { + return "Roman Revivalist"; + } else if (V.arcologies[0].FSAztecRevivalist > 90) { + return "Aztec Revivalist"; + } else if (V.arcologies[0].FSEgyptianRevivalist > 90) { + return "Ancient Egyptian Revivalist"; + } else if (V.arcologies[0].FSEdoRevivalist > 90) { + return "Edo Revivalist"; + } else if (V.arcologies[0].FSArabianRevivalist > 90) { + return "Arabian Revivalist"; + } else if (V.arcologies[0].FSChineseRevivalist > 90) { + return "Ancient Chinese Revivalist"; + } + return 0; +}; diff --git a/src/js/utilsSC.js b/src/js/utilsSC.js index c25ceb4cf6a800de58595e40b43ff64045adacbd..b8d236fd6c4f9a8f956b4ab50f254599247c8119 100644 --- a/src/js/utilsSC.js +++ b/src/js/utilsSC.js @@ -271,6 +271,19 @@ App.UI.disabledLink = function(link, reasons) { return `<span class="textWithTooltip">${link}${tooltips}</span>`; }; +/** handler function for slaveDescriptionDialog. do not call directly. */ +App.UI._showDescriptionDialog = function(slave) { + const oldEventDescription = V.eventDescription; + V.eventDescription = 1; // should be easy enough to use this for non-event cases too, but you'll need to fix the art display + const oldActiveSlave = V.activeSlave; + V.activeSlave = slave; + Dialog.setup(SlaveFullName(slave)); + Dialog.wiki('<div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div><<include "Long Slave Description">>'); + Dialog.open(); + V.activeSlave = oldActiveSlave; + V.eventDescription = oldEventDescription; +}; + /** * Generates a link which shows a slave description dialog for a specified slave. * Do not call from within another dialog. @@ -278,17 +291,15 @@ App.UI.disabledLink = function(link, reasons) { * @returns {string} link (in SC markup) */ App.UI.slaveDescriptionDialog = function(slave) { - function showDialog() { - const oldEventDescription = V.eventDescription; - V.eventDescription = 1; // should be easy enough to use this for non-event cases too, but you'll need to fix the art display - const oldActiveSlave = V.activeSlave; - V.activeSlave = slave; - Dialog.setup(SlaveFullName(slave)); - Dialog.wiki('<div class="imageRef medImg"><<= SlaveArt($activeSlave, 2, 0)>></div><<include "Long Slave Description">>'); - Dialog.open(); - V.activeSlave = oldActiveSlave; - V.eventDescription = oldEventDescription; - } + return App.UI.link(SlaveFullName(slave), App.UI._showDescriptionDialog, [slave]); +}; - return App.UI.link(SlaveFullName(slave), showDialog, []); +/** + * Generates a link which shows a slave description dialog for a specified slave. + * Do not call from within another dialog. + * @param {App.Entity.SlaveState} slave + * @returns {HTMLElement} link + */ +App.UI.DOM.slaveDescriptionDialog = function(slave) { + return App.UI.DOM.link(SlaveFullName(slave), App.UI._showDescriptionDialog, [slave]); }; diff --git a/src/js/vignettes.js b/src/js/vignettes.js index a64d8a129da418adfa7519b1ee0d371f2f2e5707..0a7bd6de169e97ba4306e5b21eaf3b93686451c5 100644 --- a/src/js/vignettes.js +++ b/src/js/vignettes.js @@ -7,7 +7,7 @@ window.GetVignette = function GetVignette(slave) { const {he, him, his, hers, himself, boy, He/* , His */} = getPronouns(slave); - if (slave.assignment === "whore" || slave.assignment === window.Job.BROTHEL || slave.assignment === window.Job.MADAM) { + if (slave.assignment === window.Job.WHORE || slave.assignment === window.Job.BROTHEL || slave.assignment === window.Job.MADAM) { let seed = jsRandom(1, 10); switch (seed) { case 1: @@ -1976,7 +1976,7 @@ window.GetVignette = function GetVignette(slave) { type: "trust", effect: -1, }); - } else if (slave.assignment === "serve the public" || slave.assignment === window.Job.CLUB || slave.assignment === window.Job.DJ) { + } else if (slave.assignment === window.Job.PUBLIC || slave.assignment === window.Job.CLUB || slave.assignment === window.Job.DJ) { let seed = jsRandom(1, 10); switch (seed) { case 1: @@ -3945,7 +3945,7 @@ window.GetVignette = function GetVignette(slave) { type: "trust", effect: -1, }); - } else if (slave.assignment === "be a servant" || slave.assignment === "work as a servant") { + } else if (slave.assignment === window.Job.HOUSE || slave.assignment === window.Job.SERVANT) { if (slave.fetishKnown === 1) { switch (slave.fetish) { case "cumslut": @@ -4150,14 +4150,14 @@ window.GetVignette = function GetVignette(slave) { type: "health", effect: -1, }); - } else if (slave.assignment === "work as a nanny" || slave.assignment === window.Job.NANNY || slave.assignment === window.Job.MATRON) { + } else if (slave.assignment === window.Job.NANNY || slave.assignment === window.Job.MATRON) { // TODO: add more vignettes here vignettes.push({ text: `more vignettes are needed here,`, type: "cash", effect: 1, }); - } else if (slave.assignment === "get milked" || slave.assignment === "work in the dairy") { + } else if (slave.assignment === window.Job.MILKED || slave.assignment === window.Job.DAIRY) { if (slave.lactation > 0) { if (slave.race === "black") { vignettes.push({ @@ -4232,7 +4232,7 @@ window.GetVignette = function GetVignette(slave) { type: "rep", effect: 0, }); - } else if (slave.assignment === "work as a farmhand" || slave.assignment === window.Job.FARMYARD || slave.assignment === window.Job.FARMER) { + } else if (slave.assignment === window.Job.FARMYARD || slave.assignment === window.Job.FARMER) { if (canWalk(slave)) { vignettes.push({ text: `${he} rather comically injured ${himself} by stepping on a rake,`, @@ -4300,7 +4300,7 @@ window.GetVignette = function GetVignette(slave) { type: "health", effect: -1, }); - } else if (slave.assignment === "rest" || slave.assignment === "rest in the spa") { + } else if (slave.assignment === window.Job.REST || slave.assignment === window.Job.SPA) { switch (slave.behavioralFlaw) { case "anorexic": vignettes.push({ diff --git a/src/npc/acquisition.tw b/src/npc/acquisition.tw index 963653ab1853507c895cd62c50b8aca540050c7c..18f3d0bb6a5acba4526a9c3e4cb23c3ff644c62c 100644 --- a/src/npc/acquisition.tw +++ b/src/npc/acquisition.tw @@ -2,7 +2,7 @@ <<unset $slaveWithoutBonuses, $startingGirlCopied, $startingGirlRelation>> -<<set $fixedNationality = 0, $showEncyclopedia = 0>> +<<set $showEncyclopedia = 0>> <<if $saveImported == 1>><<set _valueOwed = 5000>><<else>><<set _valueOwed = 50000>><</if>> <<if $freshPC == 1 || $saveImported == 0>> @@ -122,10 +122,7 @@ <<set $PC.prostate = 0>> <</if>> <<set $PC.ovaryAge = $PC.physicalAge>> -<<else>> /*testtest*/ - <<set $PC.sisters = 0>> - <<set $PC.daughters = 0>> -<</if>> /*closes ng*/ +<</if>> <<if $familyTesting == 1>> <<set _pcMomFound = 0, _pcDadFound = 0>> <<if def $slaveIndices[$PC.mother]>> @@ -134,14 +131,6 @@ <<if def $slaveIndices[$PC.father]>> <<set _pcDadFound = 1>> <</if>> - <<for _i = 0; _i < $slaves.length; _i++>> - <<if $slaves[_i].mother == $PC.ID || $slaves[_i].father == $PC.ID>> - <<set $PC.daughters += 1>> - <</if>> - <<if areSisters($slaves[_i], $PC) > 0>> - <<set $PC.sisters += 1>> - <</if>> - <</for>> <<if _pcMomFound == 0 && $PC.mother > 0>> <<set _lostMom = $PC.mother>> <<set $PC.mother = $missingParentId>> @@ -205,6 +194,7 @@ <</if>> <<set $targetAge = $minimumSlaveAge>> <<set $targetAgeNursery = $minimumSlaveAge>> +<<run resetFamilyCounters()>> You've done it. <br><br> @@ -850,26 +840,6 @@ The previous owner seems to have left in something of a hurry. <</if>> <</if>> <</for>> -<<if $familyTesting == 1>> - <<set $slaves.forEach(function(s) { s.sisters = 0; s.daughters = 0; })>> - <<set $PC.daughters = 0, $PC.sisters = 0>> - <<for _fp = 0; _fp < $slaves.length; _fp++>> - <<if ($slaves[_fp].mother == -1 || $slaves[_fp].father == -1)>> - <<set $PC.daughters++>> - <</if>> - <<if areSisters($slaves[_fp], $PC) > 0>> - <<set $PC.sisters++>> - <</if>> - <<for _fpt = 0; _fpt < $slaves.length; _fpt++>> - <<if ($slaves[_fpt].mother == $slaves[_fp].ID) || ($slaves[_fpt].father == $slaves[_fp].ID)>> - <<set $slaves[_fp].daughters++>> - <</if>> - <<if areSisters($slaves[_fpt], $slaves[_fp]) > 0>> - <<set $slaves[_fp].sisters++>> - <</if>> - <</for>> - <</for>> -<</if>> <<if _slavesContributing != 0>> <<set $averageTrust = $averageTrust/_slavesContributing>> <<set $averageDevotion = $averageDevotion/_slavesContributing>> diff --git a/src/npc/databases/customSlavesDatabase.tw b/src/npc/databases/customSlavesDatabase.tw index a2aba917737e7409517843321368077911e43166..4c0e74f24915de55069add938e972fdaca8eaccb 100644 --- a/src/npc/databases/customSlavesDatabase.tw +++ b/src/npc/databases/customSlavesDatabase.tw @@ -8,4 +8,4 @@ <<run eyeSurgery(_HS, "both", "blur")>> <<set $heroSlaves.push(_HS)>> -/*To add custom slaves, try to use the format of the above example. Add new slaves below this line. If you wish to add more slaves later, always add them at the bottom of the file. IDs are assigned automatically and in order, and you want your new slave to have a unique ID instad of someone else's*/ \ No newline at end of file +/*To add custom slaves, try to use the format of the above example. Add new slaves below this line. If you wish to add more slaves later, always add them at the bottom of the file. IDs are assigned automatically and in order, and you want your new slave to have a unique ID instead of someone else's*/ \ No newline at end of file diff --git a/src/npc/familyPanic.tw b/src/npc/familyPanic.tw deleted file mode 100644 index b8edb689586d5368549dbe5818b71a0586dd088a..0000000000000000000000000000000000000000 --- a/src/npc/familyPanic.tw +++ /dev/null @@ -1,25 +0,0 @@ -:: family panic [nobr] - -<<set $nextButton = "Back", $nextLink = "Main">> - -<<set $slaves.forEach(function(s) { s.sisters = 0; s.daughters = 0; })>> -<<set $PC.daughters = 0, $PC.sisters = 0>> - -<<for _fp = 0; _fp < $slaves.length; _fp++>> - <<if ($slaves[_fp].mother == -1 || $slaves[_fp].father == -1)>> - <<set $PC.daughters++>> - <</if>> - <<if areSisters($slaves[_fp], $PC) > 0>> - <<set $PC.sisters++>> - <</if>> - <<for _fpt = 0; _fpt < $slaves.length; _fpt++>> - <<if ($slaves[_fpt].mother == $slaves[_fp].ID) || ($slaves[_fpt].father == $slaves[_fp].ID)>> - <<set $slaves[_fp].daughters++>> - <</if>> - <<if areSisters($slaves[_fpt], $slaves[_fp]) > 0>> - <<set $slaves[_fp].sisters++>> - <</if>> - <</for>> -<</for>> - -//Family relations flushed and rebuilt.// diff --git a/src/npc/interaction/FSuckle.tw b/src/npc/interaction/FSuckle.tw index fc8435678253e41e5cc74bca584c4192b695ee55..23c23895362898b25b29433c21f60353465842ef 100644 --- a/src/npc/interaction/FSuckle.tw +++ b/src/npc/interaction/FSuckle.tw @@ -200,7 +200,7 @@ You <<if _mood == 2>>demand<<else>>beckon<</if>> <<= getSlave($AS).slaveName>> t <</if>> <</if>> <<elseif getSlave($AS).boobs >= 2000>> - You <<if _mood == 1>>caress<<elseif _mood == 2>>hungrily eye<<else>>eye<</if>> $his getSlave($AS).nipples nipples, + You <<if _mood == 1>>caress<<elseif _mood == 2>>hungrily eye<<else>>eye<</if>> $his <<= getSlave($AS).nipples>> nipples, <<if getSlave($AS).nipples == "puffy">> <<if _mood == 2>> gripping the nipple with your hand and squeezing hard enough to force out a spurt of milk. A flurry of kicks tells you that you are to take one of those swollen and dripping beauties and have a drink. diff --git a/src/npc/interaction/fBeg.tw b/src/npc/interaction/fBeg.tw index 30404f19a71842ffae148d643d1b108083210976..bb171297eee93986705a6da2c970a5e52222dff7 100644 --- a/src/npc/interaction/fBeg.tw +++ b/src/npc/interaction/fBeg.tw @@ -4,6 +4,7 @@ /* priority! femPC support! */ <<set $AS = $activeSlave.ID>> +<<setPlayerPronouns>> <<setLocalPronouns $activeSlave>> <<run Enunciate($activeSlave)>> <<setSpokenLocalPronouns $activeSlave $activeSlave>> @@ -433,7 +434,7 @@ You give $him permission to speak, and tell $him that $he may beg $his <<= Writt <</if>> <<elseif (random(1,100) > (110 - getSlave($AS).devotion))>> <<if (getSlave($AS).fetish == "none") && (getSlave($AS).behavioralFlaw != "liberated")>> - Feeling the joy of kneeling before such a powerful <<= WrittenMaster()>> and begging at his feet has @@.lightcoral;encouraged $him to be more submissive.@@ + Feeling the joy of kneeling before such a powerful <<= WrittenMaster()>> and begging at _hisP feet has @@.lightcoral;encouraged $him to be more submissive.@@ <<set getSlave($AS).fetish = "submissive", getSlave($AS).fetishKnown = 1>> <</if>> <</if>> diff --git a/src/npc/interaction/fButt.tw b/src/npc/interaction/fButt.tw index 182ef51602e0e8680939e7c5f0fbb7d8c1479793..2f262587180cafbf2ddff0696b91d3e441e4c9bf 100644 --- a/src/npc/interaction/fButt.tw +++ b/src/npc/interaction/fButt.tw @@ -83,7 +83,7 @@ You call $him over so you can <<set getSlave($AS).trust -= 5>> <<else>> As you anticipated, $he refuses to give you $his virginity. And as you expected, $he is unable to resist you. $He cries as <<if ($PC.dick == 0)>>your strap-on<<else>>your cock<</if>> opens $his fresh, tight hole. You force your way into $his pussy and continue thrusting into $him. $He sobs and cries with horror as you pound away. The rape @@.devotion.dec;decreases $his devotion to you.@@ <span class="virginity loss">$His pussy has been broken in,</span> and $he <span class="trust dec">fears further abuse.</span> - <<set getSlave($AS).devotion -= 10, getSlave($AS).trust -= 15>> + <<set getSlave($AS).devotion -= 10, getSlave($AS).trust -= 15>> <</if>> <<set getSlave($AS).vagina++>> <<= VCheck.Vaginal()>> @@ -96,7 +96,7 @@ You call $him over so you can <<set getSlave($AS).trust -= 5>> <<else>> $He is appalled at the idea of taking it up the ass<<if ($PC.dick == 0)>> and cries with fear as you don a strap-on<</if>>. $He does anyway though, sobbing into the cushions<<if hasAnyArms(getSlave($AS))>> while you hold $his arm<<if hasBothArms(getSlave($AS))>>s<</if>> behind $him<</if>>. You force yourself into $his butthole. $He sobs and cries with disgust while you continue thrusting into $his ass. The painful anal rape @@.devotion.dec;decreases $his devotion to you.@@ <span class="virginity loss">$His tight little ass has been broken in,</span> and $he is <span class="trust dec">terrified of further anal pain.</span> - <<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 5>> + <<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 5>> <</if>> <<set getSlave($AS).anus++>> <<= VCheck.Anal()>> diff --git a/src/npc/interaction/fDance.tw b/src/npc/interaction/fDance.tw index d581081769c588ba5aa8a12db0a5eb613a400982..c02b251217cac39298301e0494713f3bfccaa1d7 100644 --- a/src/npc/interaction/fDance.tw +++ b/src/npc/interaction/fDance.tw @@ -615,7 +615,7 @@ It's not over yet, though. You tell your slave that it's time to incorporate som <<case "inverted">> wrapped tightly across $his flat chest, through the cleft of $his inverted nipples. <<default>> - wrapped tightly across $his flat chest, directly over $his getSlave($AS).nipples nipples. + wrapped tightly across $his flat chest, directly over $his <<= getSlave($AS).nipples>> nipples. <</switch>> <<else>> looped under $his chest, forcing $his breasts up. @@ -641,7 +641,7 @@ It's not over yet, though. You tell your slave that it's time to incorporate som <<if getSlave($AS).boobs > 12000>> <<= getSlave($AS).slaveName>>'s breasts are too big to cover with $his toga, so $he leaves them hanging free. <<elseif getSlave($AS).boobs < 300>> - <<= getSlave($AS).slaveName>> is wearing $his toga so as to leave one getSlave($AS).nipples nipple bare. + <<= getSlave($AS).slaveName>> is wearing $his toga so as to leave one <<= getSlave($AS).nipples>> nipple bare. <<else>> <<= getSlave($AS).slaveName>> is wearing $his toga so as to leave one breast bare. <</if>> @@ -675,7 +675,7 @@ It's not over yet, though. You tell your slave that it's time to incorporate som <<elseif getSlave($AS).boobs > 800>> outfit's straining straps restrain the flesh of $his tits like a string bikini, with steel rings to let $his nipples through. <<elseif getSlave($AS).boobs < 300>> - outfit's straps pass over $his flat chest like a string bikini, with steel rings to let $his getSlave($AS).nipples nipples through. + outfit's straps pass over $his flat chest like a string bikini, with steel rings to let $his <<= getSlave($AS).nipples>> nipples through. <<else>> outfit's straps pass over $his breasts like a string bikini, with steel rings to let $his nipples through. <</if>> @@ -842,7 +842,7 @@ It's not over yet, though. You tell your slave that it's time to incorporate som <<elseif getSlave($AS).boobs > 800>> gives $him an acre of cleavage. <<elseif getSlave($AS).boobs < 300>> - tightly clings to $his flat chest, prominently displaying $his getSlave($AS).nipples nipples. + tightly clings to $his flat chest, prominently displaying $his <<= getSlave($AS).nipples>> nipples. <<else>> does its best to make $his boobs look bigger than they are. <</if>> @@ -933,7 +933,7 @@ It's not over yet, though. You tell your slave that it's time to incorporate som <<elseif getSlave($AS).boobs > 2000>> is open in front, and $his straining blouse barely restrains $his tits. <<elseif getSlave($AS).boobs < 300>> - is open in front, tightly hugging $his flat chest and prominently displaying $his getSlave($AS).nipples nipples. + is open in front, tightly hugging $his flat chest and prominently displaying $his <<= getSlave($AS).nipples>> nipples. <<else>> is open in front, and $his blouse barely covers $his breasts. <</if>> @@ -954,13 +954,13 @@ It's not over yet, though. You tell your slave that it's time to incorporate som <</if>> <<case "a comfortable bodysuit">> <<if getSlave($AS).boobs < 300>> - <<= getSlave($AS).slaveName>>'s bodysuit is so tightly form-fitting that it clings to $his flat chest and prominently displays $his getSlave($AS).nipples nipples. + <<= getSlave($AS).slaveName>>'s bodysuit is so tightly form-fitting that it clings to $his flat chest and prominently displays $his <<= getSlave($AS).nipples>> nipples. <<else>> <<= getSlave($AS).slaveName>>'s bodysuit is so tightly form-fitting that $his breasts are individually hugged and supported by the material. <</if>> <<case "a latex catsuit">> <<if getSlave($AS).boobs < 300>> - <<= getSlave($AS).slaveName>>'s latex catsuit fits $him like a second skin, showing off every detail of $his getSlave($AS).nipples nipples and distinct lack of breasts. + <<= getSlave($AS).slaveName>>'s latex catsuit fits $him like a second skin, showing off every detail of $his <<= getSlave($AS).nipples>> nipples and distinct lack of breasts. <<else>> <<= getSlave($AS).slaveName>>'s latex catsuit fits $him like a second skin, showing off every detail of $his nipples and breasts. <</if>> @@ -1108,31 +1108,31 @@ It's not over yet, though. You tell your slave that it's time to incorporate som <<elseif getSlave($AS).boobs > 800>> big breasts stretch taut against $his dress, leaving nothing to the imagination. <<elseif getSlave($AS).boobs < 300>> - dress tightly hugs $his flat chest, prominently displaying $his getSlave($AS).nipples nipples though the fabric. + dress tightly hugs $his flat chest, prominently displaying $his <<= getSlave($AS).nipples>> nipples though the fabric. <<else>> chest stretches taut against $his dress, leaving little to the imagination. <</if>> <<case "an apron">> <<= getSlave($AS).slaveName>>'s <<if getSlave($AS).boobs > 12000>> - breasts are so immense that $his apron can barely contain them, and $he has to be careful not to expose one or both of $his getSlave($AS).nipples nipples as $he moves. + breasts are so immense that $his apron can barely contain them, and $he has to be careful not to expose one or both of $his <<= getSlave($AS).nipples>> nipples as $he moves. <<elseif getSlave($AS).boobs > 4000>> - massive breasts fill out $his strained apron, occasionally leaving the sides of $his getSlave($AS).nipples nipples bare. + massive breasts fill out $his strained apron, occasionally leaving the sides of $his <<= getSlave($AS).nipples>> nipples bare. <<elseif getSlave($AS).boobs > 800>> - big breasts fill out $his stretched apron, only just managing to fully cover $his getSlave($AS).nipples nipples. + big breasts fill out $his stretched apron, only just managing to fully cover $his <<= getSlave($AS).nipples>> nipples. <<elseif getSlave($AS).boobs < 300>> apron lies flatly against $his small chest and <<= getSlave($AS).nipples>> nipples. <<else>> - breasts fill out $his apron, which is strategically worn to cover $his getSlave($AS).nipples nipples. + breasts fill out $his apron, which is strategically worn to cover $his <<= getSlave($AS).nipples>> nipples. <</if>> <<case "overalls">> <<= getSlave($AS).slaveName>>'s <<if getSlave($AS).boobs > 12000>> - breasts are so immense that $his overalls can barely contain them, and $he has to be careful not to expose one or both of $his getSlave($AS).nipples nipples as $he moves. + breasts are so immense that $his overalls can barely contain them, and $he has to be careful not to expose one or both of $his <<= getSlave($AS).nipples>> nipples as $he moves. <<elseif getSlave($AS).boobs > 4000>> - giant breasts peek out from the sides of $his strained overalls, often exposing the sides of $his getSlave($AS).nipples nipples. + giant breasts peek out from the sides of $his strained overalls, often exposing the sides of $his <<= getSlave($AS).nipples>> nipples. <<elseif getSlave($AS).boobs > 800>> - huge breasts fill out $his stretched overalls, only just managing to fully cover $his getSlave($AS).nipples nipples. + huge breasts fill out $his stretched overalls, only just managing to fully cover $his <<= getSlave($AS).nipples>> nipples. <<elseif getSlave($AS).boobs < 300>> overalls lie flatly against $his small chest and <<= getSlave($AS).nipples>> nipples. <<else>> @@ -1145,7 +1145,7 @@ It's not over yet, though. You tell your slave that it's time to incorporate som <<elseif getSlave($AS).boobs > 2000>> big tits stretch the spandex of $his leotard taut across their width. <<elseif getSlave($AS).boobs < 300>> - leotard tightly hugs $his flat chest, prominently displaying $his getSlave($AS).nipples nipples though the spandex. + leotard tightly hugs $his flat chest, prominently displaying $his <<= getSlave($AS).nipples>> nipples though the spandex. <<else>> chest is flattered by $his leotard. <</if>> diff --git a/src/npc/interaction/fFeelings.tw b/src/npc/interaction/fFeelings.tw index 2e227760a7f8e132108097492112fd7fd898340a..30631c8d6184d06e9c4910aaf75d16b955c6de75 100644 --- a/src/npc/interaction/fFeelings.tw +++ b/src/npc/interaction/fFeelings.tw @@ -462,6 +462,10 @@ My favorite part of my body i<<s>> <<elseif getSlave($AS).dietCum == 1 || getSlave($AS).dietCum == 2 >> I love having cum in my food, being able to ma<<s>>turbate right after eating cum i<<s>> <<s>>o <<s>>ati<<s>>fying. <</if>> + <<elseif (getSlave($AS).attrKnown == 1) && (getSlave($AS).attrXX > 80) && (!canSee(getSlave($AS)))>> + _Amp <<Master>>. With all the<<s>>e hot girl<<s>> around, it'<<s>> a good thing I can't get any more blind from it. + <<elseif (getSlave($AS).attrKnown == 1) && (getSlave($AS).attrXY > 80) && (!canSee(getSlave($AS)))>> + _Amp <<Master>>. With all the<<s>>e hot cock<<s>> around, it'<<s>> a good thing I can't get any more blind from it. <<elseif (getSlave($AS).attrKnown == 1) && (getSlave($AS).attrXX > 80)>> _Amp <<Master>>. With all the<<s>>e hot girl<<s>> around, it'<<s>> a good thing I can't actually go blind from it. <<elseif (getSlave($AS).attrKnown == 1) && (getSlave($AS).attrXY > 80)>> @@ -633,7 +637,7 @@ My favorite part of my body i<<s>> <<if $PC.balls != 0>> Your cum i<<s>> incredible, <<Master>>. I would drink every drop of it, if I could. <<if $PC.scrotum > 0>> - Your <<if $PC.balls >= 14>>ma<<ss>>ive<<elseif $PC.balls >= 9>>huge<<else>>big<</if>> ball<<s>> are amazing, I want to be under your cock kissing and kneading whenever I <<s>>ee you. + Your <<if $PC.balls >= 14>>ma<<ss>>ive<<elseif $PC.balls >= 9>>huge<<else>>big<</if>> ball<<s>> are amazing; I want to be under your cock ki<<ss>>ing and kneading whenever <<if canSee(getSlave($AS))>>I <<s>>ee you<<else>>I'm near you<</if>>. <</if>> <<if $PC.vagina == 1>>Oh, I love your femcum, too!<</if>> <</if>> @@ -681,33 +685,40 @@ My favorite part of my body i<<s>> <</if>> <<if (getSlave($AS).dick > 0)>> -<<if (getSlave($AS).balls == 0)>> - <<if (getSlave($AS).fetishKnown == 1)>> - <<if (getSlave($AS).energy > 95)>> - I like being gelded." $He giggles. "I don't have to be hard to get fucked! - <<elseif (getSlave($AS).fetishStrength > 60)>> - <<switch getSlave($AS).fetish>> - <<case "submissive">> - I don't mind being clipped. I like belong on the bottom. - <<case "masochist">> - Being gelded," $he shivers, "hurt<<s>> <<s>>ometime<<s>>. Make<<s>> people want to hurt you. I like it. - <<case "humiliation">> - I don't mind being clipped." $He shivers. "Everyone know<<s>>! It'<<s>> <<s>>o embarra<<ss>>ing. - <<case "dom">> - I <<s>>ometime<<s>> mi<<ss>> my ball<<s>>. It'<<s>> harder to be dominant without them. - <<case "sadist">> - I <<s>>ometime<<s>> mi<<ss>> my ball<<s>>. I <<s>>till fanta<<s>>i<<z>>e about raping the other girl<<s>>. - <<case "pregnancy">> - I <<s>>ometime<<s>> mi<<ss>> my ball<<s>>. I <<s>>till fanta<<s>>i<<z>>e about getting the other girl<<s>> pregnant. - <<case "cumslut">> - I barely cum without my ball<<s>>. I mi<<ss>>, you know, cleaning up after my<<s>>elf. With my mouth. - <<case "buttslut">> - I really like being clipped. I think it'<<s>> le<<ss>> di<<s>>tracting, you know, from my butthole. <<if getSlave($AS).prostate > 0>>And I <<s>>till have my pro<<s>>tate which i<<s>> what matter<<s>>.<</if>> - <<case "boobs">> - I don't mind being clipped. Between that and my boob<<s>> I feel like a ni<<c>>e little <<s>>lave $girl. - <</switch>> - <<elseif (getSlave($AS).attrKnown == 1) && (getSlave($AS).attrXX > 80)>> - I <<s>>ometime<<s>> mi<<ss>> my ball<<s>>. I <<s>>till fanta<<s>>i<<z>>e about boning the other girl<<s>>. + <<if (getSlave($AS).balls == 0)>> + <<if (getSlave($AS).fetishKnown == 1)>> + <<if (getSlave($AS).energy > 95)>> + I like being gelded." $He giggles. "I don't have to be hard to get fucked! + <<elseif (getSlave($AS).fetishStrength > 60)>> + <<switch getSlave($AS).fetish>> + <<case "submissive">> + I don't mind being clipped. I like belong on the bottom. + <<case "masochist">> + Being gelded," $he shivers, "hurt<<s>> <<s>>ometime<<s>>. Make<<s>> people want to hurt you. I like it. + <<case "humiliation">> + I don't mind being clipped." $He shivers. "Everyone know<<s>>! It'<<s>> <<s>>o embarra<<ss>>ing. + <<case "dom">> + I <<s>>ometime<<s>> mi<<ss>> my ball<<s>>. It'<<s>> harder to be dominant without them. + <<case "sadist">> + I <<s>>ometime<<s>> mi<<ss>> my ball<<s>>. I <<s>>till fanta<<s>>i<<z>>e about raping the other girl<<s>>. + <<case "pregnancy">> + I <<s>>ometime<<s>> mi<<ss>> my ball<<s>>. I <<s>>till fanta<<s>>i<<z>>e about getting the other girl<<s>> pregnant. + <<case "cumslut">> + I barely cum without my ball<<s>>. I mi<<ss>>, you know, cleaning up after my<<s>>elf. With my mouth. + <<case "buttslut">> + I really like being clipped. I think it'<<s>> le<<ss>> di<<s>>tracting, you know, from my butthole. <<if getSlave($AS).prostate > 0>>And I <<s>>till have my pro<<s>>tate which i<<s>> what matter<<s>>.<</if>> + <<case "boobs">> + I don't mind being clipped. Between that and my boob<<s>> I feel like a ni<<c>>e little <<s>>lave $girl. + <</switch>> + <<elseif (getSlave($AS).attrKnown == 1) && (getSlave($AS).attrXX > 80)>> + I <<s>>ometime<<s>> mi<<ss>> my ball<<s>>. I <<s>>till fanta<<s>>i<<z>>e about boning the other girl<<s>>. + <<else>> + <<if getSlave($AS).devotion > 75>> + I love being your gelded <<s>>lave $girl, <<Master>>. + <<else>> + To be hone<<s>>t, <<Master>>, I do mi<<ss>> having ball<<s>>, <<s>>ometime<<s>>. + <</if>> + <</if>> <<else>> <<if getSlave($AS).devotion > 75>> I love being your gelded <<s>>lave $girl, <<Master>>. @@ -715,67 +726,69 @@ My favorite part of my body i<<s>> To be hone<<s>>t, <<Master>>, I do mi<<ss>> having ball<<s>>, <<s>>ometime<<s>>. <</if>> <</if>> - <<else>> - <<if getSlave($AS).devotion > 75>> - I love being your gelded <<s>>lave $girl, <<Master>>. + <<elseif (getSlave($AS).hormoneBalance >= 200)>> + <<if (getSlave($AS).fetishKnown == 1)>> + <<if (getSlave($AS).energy > 95)>> + I <<s>>ometime<<s>> wi<<sh>> I could <<s>>till get hard." $He looks pensive. "Actually, I don't really care, getting fucked i<<s>> ni<<c>>e too. + <<elseif (getSlave($AS).fetishStrength > 60)>> + <<switch getSlave($AS).fetish>> + <<case "submissive">> + I don't mind the hormone<<s>> keeping me <<s>>oft. I like getting fucked, anyway. + <<case "masochist">> + I don't mind the hormone<<s>> keeping me <<s>>oft. I think it encourage<<s>> people to treat me like I de<<s>>erve. + <<case "humiliation">> + I don't mind being impotent." $He shivers. "Everyone know<<s>>! It'<<s>> <<s>>o embarra<<ss>>ing. + <<case "dom">> + I wi<<sh>> the hormone<<s>> didn't <<s>>top me from getting hard. It'<<s>> tough to be dominant when I'm all <<s>>oft. + <<case "sadist">> + I wi<<sh>> the hormone<<s>> didn't <<s>>top me from getting hard. I <<s>>till fanta<<s>>i<<z>>e about raping the other girl<<s>>. + <<case "cumslut">> + I cum a lot le<<ss>> on the<<s>>e hormone<<s>>. I mi<<ss>>, you know, cleaning up after my<<s>>elf. With my mouth. + <<case "buttslut">> + I don't mind the hormone<<s>> keeping me <<s>>oft. I prefer taking it, anyway." $He turns and sticks $his ass out. "Up the butt. + <<case "boobs">> + I don't mind the hormone<<s>> keeping me <<s>>oft. Between that and my boob<<s>> I feel like a cute <<s>>lave girl. + <<case "pregnancy">> + I wi<<sh>> the hormone<<s>> didn't <<s>>top me from getting hard. I <<s>>till fanta<<s>>i<<z>>e about getting the other girl<<s>> pregnant. + <</switch>> + <<elseif (getSlave($AS).attrKnown == 1) && (getSlave($AS).attrXX > 80)>> + I wi<<sh>> the hormone<<s>> didn't <<s>>top me from getting hard. I <<s>>till fanta<<s>>i<<z>>e about boning the other girl<<s>>. + <<else>> + <<if getSlave($AS).devotion > 75>> + I love you, <<Master>>, <<s>>o I don't mind how the hormone<<s>> I'm on keep me <<s>>oft, if that'<<s>> how you want me. + <<else>> + I <<s>>ometime<<s>> wi<<sh>> the hormone<<s>> I'm on would let me get hard. + <</if>> + <</if>> <<else>> - To be hone<<s>>t, <<Master>>, I do mi<<ss>> having ball<<s>>, <<s>>ometime<<s>>. + <<if getSlave($AS).devotion > 75>> + I love you, <<Master>>, <<s>>o I don't mind how the hormone<<s>> I'm on keep me <<s>>oft, if that'<<s>> how you want me. + <<else>> + I <<s>>ometime<<s>> wi<<sh>> the hormone<<s>> I'm on would let me get hard. + <</if>> <</if>> - <</if>> -<<elseif (getSlave($AS).hormoneBalance >= 200)>> + <</if>> /* closes balls check */ +<<elseif getSlave($AS).pubertyXX == 0 && (getSlave($AS).ovaries == 1 || getSlave($AS).mpreg == 1)>> <<if (getSlave($AS).fetishKnown == 1)>> - <<if (getSlave($AS).energy > 95)>> - I <<s>>ometime<<s>> wi<<sh>> I could <<s>>till get hard." $He looks pensive. "Actually, I don't really care, getting fucked i<<s>> ni<<c>>e too. - <<elseif (getSlave($AS).fetishStrength > 60)>> - <<switch getSlave($AS).fetish>> - <<case "submissive">> - I don't mind the hormone<<s>> keeping me <<s>>oft. I like getting fucked, anyway. - <<case "masochist">> - I don't mind the hormone<<s>> keeping me <<s>>oft. I think it encourage<<s>> people to treat me like I de<<s>>erve. - <<case "humiliation">> - I don't mind being impotent." $He shivers. "Everyone know<<s>>! It'<<s>> <<s>>o embarra<<ss>>ing. - <<case "dom">> - I wi<<sh>> the hormone<<s>> didn't <<s>>top me from getting hard. It'<<s>> tough to be dominant when I'm all <<s>>oft. - <<case "sadist">> - I wi<<sh>> the hormone<<s>> didn't <<s>>top me from getting hard. I <<s>>till fanta<<s>>i<<z>>e about raping the other girl<<s>>. - <<case "cumslut">> - I cum a lot le<<ss>> on the<<s>>e hormone<<s>>. I mi<<ss>>, you know, cleaning up after my<<s>>elf. With my mouth. - <<case "buttslut">> - I don't mind the hormone<<s>> keeping me <<s>>oft. I prefer taking it, anyway." $He turns and sticks $his ass out. "Up the butt. - <<case "boobs">> - I don't mind the hormone<<s>> keeping me <<s>>oft. Between that and my boob<<s>> I feel like a cute <<s>>lave girl. - <<case "pregnancy">> - I wi<<sh>> the hormone<<s>> didn't <<s>>top me from getting hard. I <<s>>till fanta<<s>>i<<z>>e about getting the other girl<<s>> pregnant. - <</switch>> - <<elseif (getSlave($AS).attrKnown == 1) && (getSlave($AS).attrXX > 80)>> - I wi<<sh>> the hormone<<s>> didn't <<s>>top me from getting hard. I <<s>>till fanta<<s>>i<<z>>e about boning the other girl<<s>>. - <<else>> - <<if getSlave($AS).devotion > 75>> - I love you, <<Master>>, <<s>>o I don't mind how the hormone<<s>> I'm on keep me <<s>>oft, if that'<<s>> how you want me. - <<else>> - I <<s>>ometime<<s>> wi<<sh>> the hormone<<s>> I'm on would let me get hard. + <<if (getSlave($AS).fetish == "pregnancy") && (getSlave($AS).fetishStrength > 60)>> + I fanta<<s>>i<<z>>e about my belly getting heavy with pregnan<<c>>y and my only wi<<sh>> is that you never let one of my egg<<s>> go to wa<<s>>te. <</if>> <</if>> - <<else>> - <<if getSlave($AS).devotion > 75>> - I love you, <<Master>>, <<s>>o I don't mind how the hormone<<s>> I'm on keep me <<s>>oft, if that'<<s>> how you want me. - <<else>> - I <<s>>ometime<<s>> wi<<sh>> the hormone<<s>> I'm on would let me get hard. +<<elseif getSlave($AS).mpreg == 1>> + <<if (getSlave($AS).fetishKnown == 1)>> + <<if (getSlave($AS).fetish == "pregnancy") && (getSlave($AS).fetishStrength > 0)>> + I fanta<<s>>i<<z>>e about my belly getting heavy with pregnan<<c>>y, and I'm <<s>>o glad you made me able to get pregnant! + <<if getSlave($AS).preg == -1>> + Now if only <<s>>omeone were to forget to give me my contra<<c>>eptive<<s>> before we got to doing it... + <</if>> <</if>> <</if>> -<</if>> /* closes balls check */ <<elseif getSlave($AS).preg == -1>> <<if (getSlave($AS).fetishKnown == 1)>> <<if (getSlave($AS).fetish == "pregnancy") && (getSlave($AS).fetishStrength > 60)>> I fanta<<s>>i<<z>>e about my belly getting heavy with pregnan<<c>>y, but I know it won't happen while I'm on contra<<c>>eptive<<s>>. <</if>> <</if>> -<<elseif getSlave($AS).mpreg == 1>> - <<if (getSlave($AS).fetishKnown == 1)>> - <<if (getSlave($AS).fetish == "pregnancy") && (getSlave($AS).fetishStrength > 0)>> - I fanta<<s>>i<<z>>e about my belly getting heavy with pregnancy, and I'm <<s>>o glad you made me able to get pregnant! - <</if>> - <</if>> <</if>> /* closes dick check */ <<if Math.abs(getSlave($AS).hormoneBalance) >= 200>> diff --git a/src/npc/interaction/fMaternitySwing.tw b/src/npc/interaction/fMaternitySwing.tw index 5e74683a53e12d15686e67773656fdfc1aa551b0..2642f35c493b4821314edc47361caca76b4df676 100644 --- a/src/npc/interaction/fMaternitySwing.tw +++ b/src/npc/interaction/fMaternitySwing.tw @@ -23,7 +23,7 @@ and <<else>> massive belly <</if>> -hanging above the floor of your office, you turn your attention to molesting $his ripe protuberances. Running your tongue along the distended nub of $his belly button, you kiss your way up the fertile curve of $his belly, making your way to $his tits so that you can suck on $his getSlave($AS).nipples nipples. $He squirms in $his restraints and +hanging above the floor of your office, you turn your attention to molesting $his ripe protuberances. Running your tongue along the distended nub of $his belly button, you kiss your way up the fertile curve of $his belly, making your way to $his tits so that you can suck on $his <<= getSlave($AS).nipples>> nipples. $He squirms in $his restraints and <<if getSlave($AS).devotion > 95>> <<if !canTalk(getSlave($AS))>> begs you to fuck $him already diff --git a/src/npc/interaction/fondleDick.tw b/src/npc/interaction/fondleDick.tw index cba3d61cd5da91ad61914e65575dafa70660f81e..a4b10f25e859c330e39dfaf96f9b6f5caf0bbcee 100644 --- a/src/npc/interaction/fondleDick.tw +++ b/src/npc/interaction/fondleDick.tw @@ -318,7 +318,7 @@ and $His dick remains flaccid as it cannot get stiff and you continue tenderly stroking $his soft dick. <<else>> $His prick stiffens like a rod in your hands and you continue your expert strokes along the erect shaft. - <</if>> Your rough play leaves red marks on $his breasts and nipples and $he becomes even more aroused. Soon, $his movements indicate that $he is orgasming. $He shudders and leaks $his cockmilk as $he orgasms in your hands. $He rubs the marks on $his dick and balls with $his hands, an ecstatic look on $his getSlave($AS).skin face. $He looks at you longingly as you get cleaned up, hungry for more. + <</if>> Your rough play leaves red marks on $his breasts and nipples and $he becomes even more aroused. Soon, $his movements indicate that $he is orgasming. $He shudders and leaks $his cockmilk as $he orgasms in your hands. $He rubs the marks on $his dick and balls with $his hands, an ecstatic look on $his <<= getSlave($AS).skin>> face. $He looks at you longingly as you get cleaned up, hungry for more. <<elseif getSlave($AS).devotion <= 20>> $He obeys silently, standing in front of you as you move your hands towards $him. You gently trace your fingers along $his <<if getSlave($AS).dick == 1>> diff --git a/src/npc/interaction/passage/abort.tw b/src/npc/interaction/passage/abort.tw index 6a3a38f29c6de2942a8ade414aafb1dc5023cd89..408f3dedcc939ccb2f33f6f06a633f96c4525c4b 100644 --- a/src/npc/interaction/passage/abort.tw +++ b/src/npc/interaction/passage/abort.tw @@ -8,7 +8,7 @@ The remote surgery makes aborting a pregnancy quick and efficient. <<if getSlave($AS).preg < 4>> It was so early in $his pregnancy that the potential mental effects are diminished. <<else>> - <<= getSlave($AS).slaveName is>> + <<= getSlave($AS).slaveName>> is <<if (getSlave($AS).fuckdoll > 0) || (getSlave($AS).fetish == "mindbroken")>> completely unmoved by the development. <<elseif getSlave($AS).sexualFlaw == "breeder">> diff --git a/src/npc/interaction/passage/birthStorm.tw b/src/npc/interaction/passage/birthStorm.tw index 5174e5650deb454d4c7b0b7d2e8819e8520c3739..9189ee0bc0996418b7ebd77d74415534e053e6a3 100644 --- a/src/npc/interaction/passage/birthStorm.tw +++ b/src/npc/interaction/passage/birthStorm.tw @@ -136,10 +136,10 @@ The remote surgery allows the removal of the pregnancy generator through convent birthing and orgasming each time, getSlave($AS).slaveName's mind is @@.red;fundamentally broken.@@ Being under constant pleasure for so long has destroyed all but the part of $him that feels pleasure. With one final push the breeding device is expelled from $his womb as the last spark of what was $his mind is extinguished. @@.red;The ordeal of constant birthing has had a massive effect on $his health as well as completely destroying $his vagina.@@ <<set getSlave($AS).fetish = "mindbroken">> <<elseif getSlave($AS).broodmother == 1>> - birthing and orgasming each time, getSlave($AS).slaveName is reduced to a quivering, overstimulated pile. When $he returns to $his senses, @@.hotpink;$he can only express how much $he wants to go again.@@ @@.red;The ordeal of constant birthing has had a massive effect on $his health as well as completely destroying $his vagina.@@ + birthing and orgasming each time, <<= getSlave($AS).slaveName>> is reduced to a quivering, overstimulated pile. When $he returns to $his senses, @@.hotpink;$he can only express how much $he wants to go again.@@ @@.red;The ordeal of constant birthing has had a massive effect on $his health as well as completely destroying $his vagina.@@ <<set getSlave($AS).devotion += 4>> <<else>> - birthing and orgasming all the time, getSlave($AS).slaveName is reduced to a quivering, overstimulated pile. When $he returns to $his senses, @@.hotpink;$he can only express how much $he wants to go again.@@ @@.red;The ordeal of intensive birthing has had a massive effect on $his health as well as completely destroying $his vagina.@@ + birthing and orgasming all the time, <<= getSlave($AS).slaveName>> is reduced to a quivering, overstimulated pile. When $he returns to $his senses, @@.hotpink;$he can only express how much $he wants to go again.@@ @@.red;The ordeal of intensive birthing has had a massive effect on $his health as well as completely destroying $his vagina.@@ <<set getSlave($AS).devotion += 3>> <</if>> <<elseif getSlave($AS).devotion <= 20>> @@ -248,7 +248,7 @@ The remote surgery allows the removal of the pregnancy generator through convent <br><br> <<link "...sent to a slave orphanage.">> <<replace #_disposition>> - sent to one of $arcologies[0].name's slave orphanages. getSlave($AS).slaveName + sent to one of $arcologies[0].name's slave orphanages. <<= getSlave($AS).slaveName>> <<if getSlave($AS).fetish == "mindbroken" || getSlave($AS).fuckdoll > 0>> shows no indication of an opinion on the matter. <<elseif getSlave($AS).devotion > 95>> @@ -270,7 +270,7 @@ The remote surgery allows the removal of the pregnancy generator through convent <<if getSlave($AS).breedingMark == 1 && (getSlave($AS).pregSource == -1 || getSlave($AS).pregSource == -6) && $propOutcome == 1>> <br><<link "...handed off to the Societal Elite.">> <<replace #_disposition>> - handed off to be raised into <<if _curBabies > 1>>future members<<else>>a future member<</if>> of the Societal Elite. getSlave($AS).slaveName + handed off to be raised into <<if _curBabies > 1>>future members<<else>>a future member<</if>> of the Societal Elite. <<= getSlave($AS).slaveName>> <<if getSlave($AS).fetish == "mindbroken" || getSlave($AS).fuckdoll > 0>> does not give any hint of a response. <<elseif getSlave($AS).devotion > 95>> @@ -293,7 +293,7 @@ The remote surgery allows the removal of the pregnancy generator through convent <<if getSlave($AS).pregSource == -9>> <br><<link "...handed off to the Futanari Sisters.">> <<replace #_disposition>> - handed off to be raised into <<if _curBabies > 1>>future Futanari Sisters<<else>>a future Futanari Sister<</if>>. getSlave($AS).slaveName + handed off to be raised into <<if _curBabies > 1>>future Futanari Sisters<<else>>a future Futanari Sister<</if>>. <<= getSlave($AS).slaveName>> <<if getSlave($AS).fetish == "mindbroken" || getSlave($AS).fuckdoll > 0>> has few thoughts about the matter. <<else>> @@ -307,7 +307,7 @@ The remote surgery allows the removal of the pregnancy generator through convent <<if $arcologies[0].FSRepopulationFocus > 40>> <br><<link "...sent to a breeder school.">> <<replace #_disposition>> - sent to one of $arcologies[0].name's future minded schools, to be administered fertility and virility treatments as well as be brought up to take pride in reproduction. getSlave($AS).slaveName + sent to one of $arcologies[0].name's future minded schools, to be administered fertility and virility treatments as well as be brought up to take pride in reproduction. <<= getSlave($AS).slaveName>> <<if getSlave($AS).fetish == "mindbroken" || getSlave($AS).fuckdoll > 0>> has few thoughts about the matter. <<elseif getSlave($AS).devotion > 95>> @@ -330,7 +330,7 @@ The remote surgery allows the removal of the pregnancy generator through convent <</if>> <br><<link "...sent to a citizen school.">> <<replace #_disposition>> - sent to one of $arcologies[0].name's citizen schools, to be brought up coequal with the arcology's other young people. getSlave($AS).slaveName + sent to one of $arcologies[0].name's citizen schools, to be brought up coequal with the arcology's other young people. <<= getSlave($AS).slaveName>> <<if getSlave($AS).fetish == "mindbroken" || getSlave($AS).fuckdoll > 0>> fails to acknowledge this. <<elseif getSlave($AS).devotion > 95>> @@ -353,7 +353,7 @@ The remote surgery allows the removal of the pregnancy generator through convent //Will cost <<print cashFormat(100)>> weekly// <br><<link "...sent to be raised privately.">> <<replace #_disposition>> - sent to be privately raised, to be brought up as <<if _curBabies > 1>>future high class citizens<<else>>a future high class citizen<</if>>, an expensive proposition. getSlave($AS).slaveName + sent to be privately raised, to be brought up as <<if _curBabies > 1>>future high class citizens<<else>>a future high class citizen<</if>>, an expensive proposition. <<= getSlave($AS).slaveName>> <<if getSlave($AS).fetish == "mindbroken" || getSlave($AS).fuckdoll > 0>> does not give any hint of a response. <<elseif getSlave($AS).devotion > 95>> @@ -396,7 +396,7 @@ The remote surgery allows the removal of the pregnancy generator through convent <<= getSlave($AS).slaveName>> is @@.mediumorchid;devastated@@ by your sudden decision to sell $his child<<if _curBabies > 1>>ren<</if>> instead of having <<if _curBabies > 1>>them<<else>>it<</if>> cared for. $His mind struggles to comprehend @@.gold;such betrayal.@@ <<set getSlave($AS).trust -= 10, getSlave($AS).devotion -= 10>> <<else>> - For a moment, getSlave($AS).slaveName thought $he saw a glimmer of good in you; @@.mediumorchid;$he was clearly wrong.@@ $His mind struggles to comprehend @@.gold;why $he could ever even thing of trusting such a person.@@ + For a moment, <<= getSlave($AS).slaveName>> thought $he saw a glimmer of good in you; @@.mediumorchid;$he was clearly wrong.@@ $His mind struggles to comprehend @@.gold;why $he could ever even thing of trusting such a person.@@ <<set getSlave($AS).trust -= 30, getSlave($AS).devotion -= 30>> <</if>> <<run cashX(_curBabies*(50+_babyCost), "babyTransfer")>> @@ -498,7 +498,7 @@ The remote surgery allows the removal of the pregnancy generator through convent <<= getSlave($AS).slaveName>> is @@.mediumorchid;devastated@@ by your sudden decision to sell $his child<<if _curBabies > 1>>ren<</if>> instead of having <<if _curBabies > 1>>them<<else>>it<</if>> cared for. $His mind struggles to comprehend @@.gold;such betrayal.@@ <<set getSlave($AS).trust -= 10, getSlave($AS).devotion -= 10>> <<else>> - For a moment, getSlave($AS).slaveName thought $he saw a glimmer of good in you; @@.mediumorchid;$he was clearly wrong.@@ $His mind struggles to comprehend @@.gold;why $he could ever even thing of trusting such a person.@@ + For a moment, <<= getSlave($AS).slaveName>> thought $he saw a glimmer of good in you; @@.mediumorchid;$he was clearly wrong.@@ $His mind struggles to comprehend @@.gold;why $he could ever even thing of trusting such a person.@@ <<set getSlave($AS).trust -= 30, getSlave($AS).devotion -= 30>> <</if>> <<run cashX(_curBabies*(50+_babyCost), "babyTransfer")>> diff --git a/src/npc/interaction/passage/csec.tw b/src/npc/interaction/passage/csec.tw index e2b7a1a9aff436351726e15c56c97d0f33149cb7..9af9de266c65857977bfc43f762e04ab5e89d25e 100644 --- a/src/npc/interaction/passage/csec.tw +++ b/src/npc/interaction/passage/csec.tw @@ -144,7 +144,7 @@ /* ------------------------------------------------ */ -Performing a cesarean section is trivial for the remote surgery to carry out. getSlave($AS).slaveName is sedated, $his child<<if _curBabies > 1>>ren<</if>> extracted, and taken to a bed to recover. By the time $he comes to, +Performing a cesarean section is trivial for the remote surgery to carry out. <<= getSlave($AS).slaveName>> is sedated, $his child<<if _curBabies > 1>>ren<</if>> extracted, and taken to a bed to recover. By the time $he comes to, <<if _curBabies > 0>> <<if _fathersReduced.length > 2>> <<for _cb = 0; _cb < _fathersReduced.length; _cb++>> @@ -220,7 +220,7 @@ Performing a cesarean section is trivial for the remote surgery to carry out. ge <br><br> <<link "...sent to a slave orphanage.">> <<replace #_disposition>> - sent to one of $arcologies[0].name's slave orphanages. getSlave($AS).slaveName + sent to one of $arcologies[0].name's slave orphanages. <<= getSlave($AS).slaveName>> <<if getSlave($AS).fetish == "mindbroken" || getSlave($AS).fuckdoll > 0>> shows no indication of an opinion on the matter. <<elseif getSlave($AS).devotion > 95>> @@ -242,7 +242,7 @@ Performing a cesarean section is trivial for the remote surgery to carry out. ge <<if getSlave($AS).breedingMark == 1 && (getSlave($AS).pregSource == -1 || getSlave($AS).pregSource == -6) && $propOutcome == 1>> <br><<link "...handed off to the Societal Elite.">> <<replace #_disposition>> - handed off to be raised into <<if _curBabies > 1>>future members<<else>>a future member<</if>> of the Societal Elite. getSlave($AS).slaveName + handed off to be raised into <<if _curBabies > 1>>future members<<else>>a future member<</if>> of the Societal Elite. <<= getSlave($AS).slaveName>> <<if getSlave($AS).fetish == "mindbroken" || getSlave($AS).fuckdoll > 0>> does not give any hint of a response. <<elseif getSlave($AS).devotion > 95>> @@ -265,7 +265,7 @@ Performing a cesarean section is trivial for the remote surgery to carry out. ge <<if getSlave($AS).pregSource == -9>> <br><<link "...handed off to the Futanari Sisters.">> <<replace #_disposition>> - handed off to be raised into <<if _curBabies > 1>>future Futanari Sisters<<else>>a future Futanari Sister<</if>>. getSlave($AS).slaveName + handed off to be raised into <<if _curBabies > 1>>future Futanari Sisters<<else>>a future Futanari Sister<</if>>. <<= getSlave($AS).slaveName>> <<if getSlave($AS).fetish == "mindbroken" || getSlave($AS).fuckdoll > 0>> has few thoughts about the matter. <<else>> @@ -279,7 +279,7 @@ Performing a cesarean section is trivial for the remote surgery to carry out. ge <<if $arcologies[0].FSRepopulationFocus > 40>> <br><<link "...sent to a breeder school.">> <<replace #_disposition>> - sent to one of $arcologies[0].name's future minded schools, to be administered fertility and virility treatments as well as be brought up to take pride in reproduction. getSlave($AS).slaveName + sent to one of $arcologies[0].name's future minded schools, to be administered fertility and virility treatments as well as be brought up to take pride in reproduction. <<= getSlave($AS).slaveName>> <<if getSlave($AS).fetish == "mindbroken" || getSlave($AS).fuckdoll > 0>> has few thoughts about the matter. <<elseif getSlave($AS).devotion > 95>> @@ -302,7 +302,7 @@ Performing a cesarean section is trivial for the remote surgery to carry out. ge <</if>> <br><<link "...sent to a citizen school.">> <<replace #_disposition>> - sent to one of $arcologies[0].name's citizen schools, to be brought up coequal with the arcology's other young people. getSlave($AS).slaveName + sent to one of $arcologies[0].name's citizen schools, to be brought up coequal with the arcology's other young people. <<= getSlave($AS).slaveName>> <<if getSlave($AS).fetish == "mindbroken" || getSlave($AS).fuckdoll > 0>> fails to acknowledge this. <<elseif getSlave($AS).devotion > 95>> @@ -325,7 +325,7 @@ Performing a cesarean section is trivial for the remote surgery to carry out. ge //Will cost <<print cashFormat(100)>> weekly// <br><<link "...sent to be raised privately.">> <<replace #_disposition>> - sent to be privately raised, to be brought up as <<if _curBabies > 1>>future high class citizens<<else>>a future high class citizen<</if>>, an expensive proposition. getSlave($AS).slaveName + sent to be privately raised, to be brought up as <<if _curBabies > 1>>future high class citizens<<else>>a future high class citizen<</if>>, an expensive proposition. <<= getSlave($AS).slaveName>> <<if getSlave($AS).fetish == "mindbroken" || getSlave($AS).fuckdoll > 0>> does not give any hint of a response. <<elseif getSlave($AS).devotion > 95>> @@ -368,7 +368,7 @@ Performing a cesarean section is trivial for the remote surgery to carry out. ge <<= getSlave($AS).slaveName>> is @@.mediumorchid;devastated@@ by your sudden decision to sell $his child<<if _curBabies > 1>>ren<</if>> instead of having <<if _curBabies > 1>>them<<else>>it<</if>> cared for. $His mind struggles to comprehend @@.gold;such betrayal.@@ <<set getSlave($AS).trust -= 10, getSlave($AS).devotion -= 10>> <<else>> - For a moment, getSlave($AS).slaveName thought $he saw a glimmer of good in you; @@.mediumorchid;$he was clearly wrong.@@ $His mind struggles to comprehend @@.gold;why $he could ever even thing of trusting such a person.@@ + For a moment, <<= getSlave($AS).slaveName>> thought $he saw a glimmer of good in you; @@.mediumorchid;$he was clearly wrong.@@ $His mind struggles to comprehend @@.gold;why $he could ever even thing of trusting such a person.@@ <<set getSlave($AS).trust -= 30, getSlave($AS).devotion -= 30>> <</if>> <<run cashX(_curBabies*(50+_babyCost), "babyTransfer")>> @@ -470,7 +470,7 @@ Performing a cesarean section is trivial for the remote surgery to carry out. ge <<= getSlave($AS).slaveName>> is @@.mediumorchid;devastated@@ by your sudden decision to sell $his child<<if _curBabies > 1>>ren<</if>> instead of having <<if _curBabies > 1>>them<<else>>it<</if>> cared for. $His mind struggles to comprehend @@.gold;such betrayal.@@ <<set getSlave($AS).trust -= 10, getSlave($AS).devotion -= 10>> <<else>> - For a moment, getSlave($AS).slaveName thought $he saw a glimmer of good in you; @@.mediumorchid;$he was clearly wrong.@@ $His mind struggles to comprehend @@.gold;why $he could ever even thing of trusting such a person.@@ + For a moment, <<= getSlave($AS).slaveName>> thought $he saw a glimmer of good in you; @@.mediumorchid;$he was clearly wrong.@@ $His mind struggles to comprehend @@.gold;why $he could ever even thing of trusting such a person.@@ <<set getSlave($AS).trust -= 30, getSlave($AS).devotion -= 30>> <</if>> <<run cashX(_curBabies*(50+_babyCost), "babyTransfer")>> diff --git a/src/npc/interaction/passage/matchmaking.tw b/src/npc/interaction/passage/matchmaking.tw index c24217c5f026b1257cee00153d3e01f63a06027f..8bc46162494cec2e074c749e6ee40224abded46f 100644 --- a/src/npc/interaction/passage/matchmaking.tw +++ b/src/npc/interaction/passage/matchmaking.tw @@ -1,7 +1,5 @@ :: Matchmaking [nobr] - - <<if lastVisited("Child Interact") === 1>> <<set $nextLink = "Incubator">> <<else>> diff --git a/src/npc/interaction/rename.tw b/src/npc/interaction/rename.tw index c449cea3eb9af91599bfbbc05b31271dcb015ad6..f6a7679c4d8216239c2f5cb1d2c272a11c20923c 100644 --- a/src/npc/interaction/rename.tw +++ b/src/npc/interaction/rename.tw @@ -103,7 +103,7 @@ Names are meaningless to $him and it is unlikely $he'll remember it. <<elseif getSlave($AS).devotion+getSlave($AS).trust >= 175>> <<if getSlave($AS).slaveSurname == $PC.slaveSurname>> - When you tell $him that $he's to be known as <<= getSlave($AS).slaveName>> <<= getSlave($AS).slaveSurname>> now, $he starts to cry. $He tries to get $himself under control and thank you as best $he can, <<if hasAnyArms(getSlave($AS))>>wiping at the tears running down $his getSlave($AS).skin cheeks, <</if>>but $he can't seem to stop weeping as $he thanks you over and over. $He's a sex slave, your property, and it's understandable that some doubts about the permanence of $his place as your slave $wife. This has @@.mediumaquamarine;helped reassure $him,@@ and explains the strength of $his emotional reaction. The next time you make love to $him, $he @@.hotpink;presses $himself as close to you as $he can,@@ eager to drink in as much of your presence as $he can get. + When you tell $him that $he's to be known as <<= getSlave($AS).slaveName>> <<= getSlave($AS).slaveSurname>> now, $he starts to cry. $He tries to get $himself under control and thank you as best $he can, <<if hasAnyArms(getSlave($AS))>>wiping at the tears running down $his <<= getSlave($AS).skin>> cheeks, <</if>>but $he can't seem to stop weeping as $he thanks you over and over. $He's a sex slave, your property, and it's understandable that some doubts about the permanence of $his place as your slave $wife. This has @@.mediumaquamarine;helped reassure $him,@@ and explains the strength of $his emotional reaction. The next time you make love to $him, $he @@.hotpink;presses $himself as close to you as $he can,@@ eager to drink in as much of your presence as $he can get. <<set getSlave($AS).devotion += 5, getSlave($AS).trust += 5>> <<elseif $oldSurname == $PC.slaveSurname>> $He's devastated that you'd rename $him something other than your name. $He's @@.gold;terrified@@ that you intend to discard $him as your slave $wife, and @@.mediumorchid;saddened@@ that you would take away something that was precious to $him. diff --git a/src/npc/slaveStats.tw b/src/npc/slaveStats.tw index b3ad5f10e0de1a7e662c7d007243a145c8a7a79a..689bb69975696b6c889cd0c207319fdfd5c852aa 100644 --- a/src/npc/slaveStats.tw +++ b/src/npc/slaveStats.tw @@ -71,15 +71,15 @@ Income: <<= num($activeSlave.lifetimeRepIncome)>> Expenses: <<= num($activeSlave.lastWeeksRepExpenses)>>, Income: <<= num($activeSlave.lastWeeksRepIncome)>> -<br> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Skills')" id="tab Skills">Skills</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Mental')" id="tab Mental">Mental</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Body')" id="tab Body">Body</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Porn')" id="tab Porn">Porn</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Impants_Piercings_Tattoos')" id="tab Impants_Piercings_Tattoos">Impants, piercings & Tattoos</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Family')" id="tab Family">Family</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Misc')" id="tab Misc">Misc</button> -<br> +<div class="tabbar"> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Skills')" id="tab Skills">Skills</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Mental')" id="tab Mental">Mental</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Body')" id="tab Body">Body</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Porn')" id="tab Porn">Porn</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Impants_Piercings_Tattoos')" id="tab Impants_Piercings_Tattoos">Impants, piercings & Tattoos</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Family')" id="tab Family">Family</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Misc')" id="tab Misc">Misc</button> +</div> <div id="Skills" class="tabcontent"> <div class="content"> diff --git a/src/npc/surgery/surgery.js b/src/npc/surgery/surgery.js index 59689791768fefc004dca2dbdb2c5327070afc23..743dd079b937a84324d59af694832e9696969ac0 100644 --- a/src/npc/surgery/surgery.js +++ b/src/npc/surgery/surgery.js @@ -731,7 +731,7 @@ window.setEyeColor = function setEyeColor(slave, color, side = "both") { * @param {string} sclera * @param {string} side */ -window.setEyeColorFull = function setEyeColorFull(slave, iris, pupil, sclera, side) { +window.setEyeColorFull = function setEyeColorFull(slave, iris = "brown", pupil = "circular", sclera = "white", side) { if (side === "both") { setEyeColorFull(slave, iris, pupil, sclera, "left"); setEyeColorFull(slave, iris, pupil, sclera, "right"); diff --git a/src/personalAssistant/assistantEvents.tw b/src/personalAssistant/assistantEvents.tw index 495fe1de52efab06e4a241ecd28aa9e7c10452d1..9fca4c3f34a582af92a343738b1014320c8f0743 100644 --- a/src/personalAssistant/assistantEvents.tw +++ b/src/personalAssistant/assistantEvents.tw @@ -1306,13 +1306,7 @@ <<case "market assistant">> <<set $assistant.market = {}>> <<run assistant.object()>> - <<set _smartPiercings = 0>> - <<for $i = 0; $i < $slaves.length; $i++>> - <<if ($slaves[$i].clitPiercing == 3)>> - <<set _smartPiercings = 1>> - <<break>> - <</if>> - <</for>> + <<setAssistantPronouns>> Your personal assistant has been adapting to _hisA greatly increased computing power over the course of the week. _HisA avatar has been an even more constant presence than usual, frequently appearing to explain some minor new ability. <<if ($assistant.personality != 0) && ($assistant.appearance != "normal")>> When _heA appears this time, however, _hisA avatar is not alone. _HeA's accompanied by @@ -1670,8 +1664,8 @@ <</if>> <<case "market assistant">> - <<if ($assistant.personality != 0) && ($assistant.appearance != "normal")>> + <<setAssistantPronouns>> __Personal Assistant and Market Assistant relationship styles:__ <br> <<link "Cute">> <<replace "#result">> diff --git a/src/personalAssistant/assistantOptions.tw b/src/personalAssistant/assistantOptions.tw index a61b86918b6c4a32add5989d448344ef4d5e2d8a..6fd3131b26a4d0227cf2e0296dfe17d3cab15d73 100644 --- a/src/personalAssistant/assistantOptions.tw +++ b/src/personalAssistant/assistantOptions.tw @@ -34,14 +34,15 @@ Seated at your desk, you glance at the visual representation of <br><br> <<run App.UI.tabbar.handlePreSelectedTab($tabChoice.Assistant)>> - -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'upgrades')" id="tab upgrades">Computer Core Upgrades</button> -<<if $week >= 11>> - <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'settings')" id="tab settings">Settings</button> - <<if $assistant.personality != 0>> - <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'appearance')" id="tab appearance">Appearance</button> +<div class="tabbar"> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'upgrades')" id="tab upgrades">Computer Core Upgrades</button> + <<if $week >= 11>> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'settings')" id="tab settings">Settings</button> + <<if $assistant.personality != 0>> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'appearance')" id="tab appearance">Appearance</button> + <</if>> <</if>> -<</if>> +</div> <div id="upgrades" class="tabcontent"> <div class="content"> @@ -1074,4 +1075,4 @@ Seated at your desk, you glance at the visual representation of <</if>> <</if>> </div> -</div> \ No newline at end of file +</div> diff --git a/src/player/electiveSurgery.tw b/src/player/electiveSurgery.tw index 7bc1d89baee25be08b2f1745fe80fe297ac63745..57616755ec33c642828353b14c52f1599d8bbc4a 100644 --- a/src/player/electiveSurgery.tw +++ b/src/player/electiveSurgery.tw @@ -23,7 +23,7 @@ You're @@.orange;$PC.actualAge years old.@@ You could benefit from a face lift. <br> <<if $PC.visualAge >= 25>> - [[Get a face lift|PC Surgery Degradation][$PC.faceImplant = 1, cashX(forceNeg(5000), "PCmedical"), $surgeryType = "ageDown"]] | + [[Get a face lift|PC Surgery Degradation][$PC.faceImplant = 1, cashX(forceNeg(5000), "PCmedical"), $surgeryType = "ageDown"]] | <</if>> [[Remodel your face to appear older|PC Surgery Degradation][$PC.faceImplant = 1, cashX(forceNeg(5000), "PCmedical"), $surgeryType = "ageUp"]] <</if>> @@ -38,7 +38,7 @@ You're @@.orange;$PC.actualAge years old.@@ You could benefit from a face lift. <br> <<if $PC.visualAge >= 25>> - [[Get a face lift|PC Surgery Degradation][$PC.faceImplant = 1, cashX(forceNeg(5000), "PCmedical"), $surgeryType = "ageDown"]] | + [[Get a face lift|PC Surgery Degradation][$PC.faceImplant = 1, cashX(forceNeg(5000), "PCmedical"), $surgeryType = "ageDown"]] | <</if>> [[Remodel your face to appear older|PC Surgery Degradation][$PC.faceImplant = 1, cashX(forceNeg(5000), "PCmedical"), $surgeryType = "ageUp"]] <</if>> @@ -53,7 +53,7 @@ You're @@.orange;$PC.actualAge years old.@@ You could go for a face lift, though making yourself look older could be useful. <br> <<if $PC.visualAge >= 25>> - [[Get a face lift|PC Surgery Degradation][$PC.faceImplant = 1, cashX(forceNeg(5000), "PCmedical"), $surgeryType = "ageDown"]] | + [[Get a face lift|PC Surgery Degradation][$PC.faceImplant = 1, cashX(forceNeg(5000), "PCmedical"), $surgeryType = "ageDown"]] | <</if>> [[Remodel your face to appear older|PC Surgery Degradation][$PC.faceImplant = 1, cashX(forceNeg(5000), "PCmedical"), $surgeryType = "ageUp"]] <</if>> @@ -68,7 +68,7 @@ You're @@.orange;$PC.actualAge years old.@@ You could undergo facial surgery to make yourself look older, though you could also make yourself look even younger. <br> <<if $PC.visualAge >= 25>> - [[Remodel your face to appear younger|PC Surgery Degradation][$PC.faceImplant = 1, cashX(forceNeg(5000), "PCmedical"), $surgeryType = "ageDown"]] | + [[Remodel your face to appear younger|PC Surgery Degradation][$PC.faceImplant = 1, cashX(forceNeg(5000), "PCmedical"), $surgeryType = "ageDown"]] | <</if>> [[Remodel your face to appear older|PC Surgery Degradation][$PC.faceImplant = 1, cashX(forceNeg(5000), "PCmedical"), $surgeryType = "ageUp"]] <</if>> diff --git a/src/pregmod/FCTV/FCTV.js b/src/pregmod/FCTV/FCTV.js index fbe0890115716e4ed4389052b45efae235002d83..087125b10ac2ae69b6d45af634465a66d35651c9 100644 --- a/src/pregmod/FCTV/FCTV.js +++ b/src/pregmod/FCTV/FCTV.js @@ -18,8 +18,12 @@ window.FCTV = (function() { return { channels:channels, manage: manage, - showChannel:showChannel, - incrementChannel:incrementChannel, + showChannel: showChannel, + incrementChannel: incrementChannel, + incrementShow: incrementShow, + channelCount: channelCount, + showRange: showRange, + FinalTouches: FinalTouches }; function channels() { @@ -104,25 +108,125 @@ window.FCTV = (function() { if (V.minimumSlaveAge > 13) { x.canSelect = -1; x.text += `<i>Actor not vintage enough, changing program.</i>`; } + break; case 16: - if (!V.seeDicks && !V.makeDicks) { + if (!V.seeDicks && !V.makeDicks) { x.canSelect = -1; x.text += `<i>Too many hot dogs detected, changing program.</i>`; } break; } - if (State.temporary.all) { x.canSelect = 1; } + if (V.all) { x.canSelect = 1; } return x; } function incrementChannel(i = V.FCTV.channel.selected) { V.FCTV.channel.selected = i; V.FCTV.channel[num(i, true)]++; + if (i === 2 && V.FCTV.channel[num(i, true)] >= 12) { + V.FCTV.channel[num(i, true)] = 0; + } if ( - [14, 15].includes(i) && V.FCTV.channel[num(i, true)] == 3 - || [13, 16].includes(i) && V.FCTV.channel[num(i, true)] == 4 - || i === 12 && V.FCTV.channel[num(i, true)] == 9 + [14, 15].includes(i) && V.FCTV.channel[num(i, true)] === 3 + || [13, 16].includes(i) && V.FCTV.channel[num(i, true)] === 4 + || i === 12 && V.FCTV.channel[num(i, true)] === 9 ) { V.FCTV.channel[num(i, true)] = 1; } } + + function incrementShow() { + V.show = V.usedRemote ? V.show + 1 : V.show; + } + + function channelCount(i, operation = 'eq') { + if (operation === 'eq') { + if (V.FCTV.channel[num(V.FCTV.channel.selected, true)] === i) { + return true; + } + } else if (operation === 'gt') { + if (V.FCTV.channel[num(V.FCTV.channel.selected, true)] > i) { + return true; + } + } else if (operation === 'lt') { + if (V.FCTV.channel[num(V.FCTV.channel.selected, true)] < i) { + return true; + } + } + return false; + } + + function showRange(low, max, operation = 'rand') { + if (V.usedRemote) { + V.show = !between(V.show, low, max) ? low : V.show; + } else { + V.show = operation === 'rand' ? jsRandom(low, max) : either(low, max); + } + } + + function FinalTouches(i, channel) { + if (channel === 14) { + i.behavioralFlaw = "arrogant"; i.markings = "none"; + if (i.weight > 130) { + i.weight -= 100; i.waist = random(-10,50); + } + i.health.condition = random(60,80); + } else if (channel === 4) { + i.pubertyXX = 1; i.career = "a slave"; + i.origin = "You purchased $him from FCTV's Home Slave Shopping stream channel."; + i.health.condition = 75; + if (V.show < 3) { + i.custom.tattoo = "$He has a small stylized 'A' tattooed on the nape of $his neck marking $him as the product of the famous breeding program at Arcturus Arcology."; + Object.assign(i.skill, { + 'vaginal': 0, + 'entertainment': jsRandom(50, 80), + 'oral': jsRandom(20, 60), + 'anal': 0, + 'whoring': 0 + }); + } else if (V.show === 3) { + Object.assign(i.skill, { + 'vaginal': jsRandom(50, 80), + 'oral': jsRandom(40, 80), + 'anal': jsRandom(20,50), + 'whoring': jsRandom(0, 50) + }); + } else if (V.show === 4) { + Object.assign(i.skill, { + 'vaginal': jsRandom(50, 100), + 'oral': jsRandom(20, 50), + 'anal': jsRandom(10, 20) + }); + i.counter.birthsTotal = jsRandom(2, 3); + } else if (V.show === 5) { + Object.assign(i.skill, { + 'vaginal': jsRandom(50, 100), + 'entertainment': jsRandom(20, 80), + 'oral': jsRandom(50, 100), + 'anal': jsRandom(20, 80), + 'whoring': jsRandom(20,80) + }); + i.counter.birthsTotal = jsRandom(1, 3); + } else if (V.show === 6) { + Object.assign(i.skill, { + 'vaginal': 15, + 'oral': 15, + 'anal': 15, + 'whoring': 15 + }); + } else if (V.show <= 8) { + Object.assign(i.skill, { + 'oral': jsRandom(30, 60), + 'anal': jsRandom(20, 50), + 'whoring': jsRandom(0, 25) + }); + } else if (V.show === 8) { + Object.assign(i.skill, { + 'oral': jsRandom(40, 80), + 'anal': jsRandom(40, 80), + 'whoring': jsRandom(40, 70) + }); + } + } + i.health.health = i.health.condition - i.health.shortDamage - i.health.longDamage; + } })(); diff --git a/src/pregmod/FCTV/seFCTVremote.tw b/src/pregmod/FCTV/seFCTVremote.tw index 47a324d4a39a3f2c48e7a7f735200551fa010f5b..8dbc5fb61d595a9a5b2e3baa2b86f069f9edae8c 100644 --- a/src/pregmod/FCTV/seFCTVremote.tw +++ b/src/pregmod/FCTV/seFCTVremote.tw @@ -14,14 +14,18 @@ <</if>> <<set _slave = GenerateNewSlave()>> -<<run Object.assign(_slave, { - devotion: 0, trust: 0, - muscles: 60, lips: 35, - origin: "You enslaved $him for poor customer service as an FCTV tech.", career: "an installation technician", - behavioralFlaw: "arrogant", markings: "none", - hLength: 10, eyewear: "glasses", - clothes: "conservative clothing", shoes: "flats" -})>> +<<set _slave.devotion = 0>> +<<set _slave.trust = 0>> +<<set _slave.muscles = 60>> +<<set _slave.lips = 35>> +<<set _slave.origin = "You enslaved $him for poor customer service as an FCTV tech.">> +<<set _slave.career = "an installation technician">> +<<set _slave.behavioralFlaw = "arrogant">> +<<set _slave.markings = "none">> +<<set _slave.hLength = 10>> +<<set _slave.eyewear = "glasses">> +<<set _slave.clothes = "conservative clothing">> +<<set _slave.shoes = "flats">> <<run setHealth(_slave, jsRandom(60, 80))>> <<if _slave.weight > 130>> <<set _slave.weight -= 100>> diff --git a/src/pregmod/FCTV/seFCTVshows.tw b/src/pregmod/FCTV/seFCTVshows.tw index f96ee9054a8efbf2ea670b60ec89bc56d33a23fc..d2c3a54d0ff8c3138e5f3bd6fa0b9ab4a76c882a 100644 --- a/src/pregmod/FCTV/seFCTVshows.tw +++ b/src/pregmod/FCTV/seFCTVshows.tw @@ -1,17 +1,20 @@ :: SE FCTV Shows [nobr] /* Setup Millie art, since she is on multiple channels */ -<<if $seeImages > 0>> <<set _millie = BaseSlave()>> <<run Object.assign(_millie, { - devotion: 100, trust: 100, - weight: 120, boobs: 5000, - hips: 2, butt: 5, - hLength: 50, skin: "dark olive", - hStyle: "luxurious", hColor: "strawberry blonde", + devotion: 100, + trust: 100, + weight: 120, + boobs: 5000, + hips: 2, + butt: 5, + hLength: 50, + skin: "dark olive", + hStyle: "luxurious", + hColor: "strawberry blonde", clothes: "a leotard" })>> -<</if>> <br> <<if $usedRemote>>You select @@ -23,34 +26,47 @@ <<case -1>> however there is simply nothing on FCTV tonight worth watching. <<case 0>> <<run FCTV.incrementChannel(1)>> - <<if $seeImages > 0>> - <<set _kirk = BaseSlave()>> - <<run Object.assign(_kirk, { - actualAge: 44, devotion: 0, - trust: 0, muscles: 60, - weight: 30, waist: 90, - boobs: 0, shoulders: 3, - butt: 0, hips: -1, - hLength: 10, hColor: "dark brown", - faceShape: "masculine", hStyle: "messy", - eyewear: "glasses", clothes: "conservative clothing", - shoes: "flats" - })>> - <<set _jules = BaseSlave()>> - <<run Object.assign(_jules, { - devotion: 0, trust: 0, - weight: 30, waist: 30, - boobs: 700, butt: 3, - hLength: 50, hStyle: "luxurious", - hColor: "auburn", boobShape: "perky", - clothes: "panties and pasties", collar: "stylish leather" - })>> - <</if>> + <<set _kirk = BaseSlave()>> + <<run Object.assign(_kirk, { + actualAge: 44, + devotion: 0, + trust: 0, + muscles: 60, + weight: 30, + waist: 90, + boobs: 0, + shoulders: 3, + butt: 0, + hips: -1, + hLength: 10, + hColor: "dark brown", + faceShape: "masculine", + hStyle: "messy", + eyewear: "glasses", + clothes: "conservative clothing", + shoes: "flats" + })>> + + <<set _jules = BaseSlave()>> + <<run Object.assign(_jules, { + devotion: 0, + trust: 0, + weight: 30, + waist: 30, + boobs: 700, + butt: 3, + hLength: 50, + hStyle: "luxurious", + hColor: "auburn", + boobShape: "perky", + clothes: "panties and pasties", + collar: "stylish leather" + })>> officially known as the FCNN stream channel and you've started watching the middle of a news segment. - <<set _show = random(0,2)+1>> - <<if _show == 1 && $FCTV.channel.one > 3 || $FCTV.channel.one == 1>> + <<run FCTV.showRange(1, 3)>> + <<if $show == 1 && FCTV.channelCount(3, 'gt') || FCTV.channelCount(1, 'eq')>> <<if $seeImages > 0>> <div class="imageColumn"> <div class="imageRef medImg"> @@ -65,18 +81,26 @@ <br><br>Jules seems to be quite passionate about the subject, the animated way she talks is causing her sizable tits to bounce all over the place. "It doesn't matter how famous or valuable that slut thinks she is, her behavior was just wrong on SO many levels. It makes all of us good slaves look bad. If you ask me, her master's choice of punishment fits the attention whore perfectly!" <br><br>Kirk's face looks more than a little surprised, but you can't quite tell if it's an act or not. "You won't get any argument from me that she deserves to be punished... but getting chained up with an obedience collar and feeder system in the middle of Times Square, free for public use? A slum like Manhattan, she'll never <<if $seeExtreme == 0>><i>enjoy</i><<else>>survive<</if>> the 10 day sentence!" <br><br>Jules smiles. "That's exactly right Master McMahon, she's going to be <<if $seeExtreme == 0>><i>hugged until she smiles</i><<else>>fucked to death<</if>>. Her precious popularity in the old world will have the locals lined up all the way to New New Jersey waiting for their turn. I'd never question her master's decision, but if it were me, I'd pump her full of curatives and stimulants during the sentence. That way, she doesn't <<if $seeExtreme == 0>><i>smile</i><<else>>die or pass out<</if>> too soon. I think her master is being lenient after the way she badmouthed him in a live broadcast." - <<elseif _show == 2 && $FCTV.channel.one > 3 || $FCTV.channel.one == 2>> + <<elseif $show == 2 && FCTV.channelCount(3, 'gt') || FCTV.channelCount(2, 'eq')>> <<if $seeImages > 0>> <<set _model = BaseSlave()>> <<run Object.assign(_model, { - devotion: -90, trust: 0, - face: -20, hLength: 50, - hStyle: "messy", hColor: "blazing red", - underArmHStyle: "bushy", underArmHColor: "blazing red", - height: 150, boobs: 700, - boobShape: "perky", shoulders: 0, - waist: 180, butt: 3, - hips: 3, clothes: "spats and a tank top", + devotion: -90, + trust: 0, + face: -20, + hLength: 50, + hStyle: "messy", + hColor: "blazing red", + underArmHStyle: "bushy", + underArmHColor: "blazing red", + height: 150, + boobs: 700, + boobShape: "perky", + shoulders: 0, + waist: 180, + butt: 3, + hips: 3, + clothes: "spats and a tank top", shoes: "flats" })>> @@ -91,7 +115,7 @@ The segment cuts back to two news anchors, a dark-haired man with a mustache and an aging bottle blonde. <br><br>The bottle blonde speaks to the viewers. "Some of you may recognize the woman in that video as Angry Red, noted femsupremacist and a leading figure in the old world Emancipation Movement. The video you saw was released along with countless other media files and documents from the movement in the EmancipationGate hacktivist attack. This particular video has been confirmed by computer analysis to be behind the scenes footage from the movement's latest documentary about the horrors of slavery." <br><br>The mustached man looks knowingly at the camera. "Anyone remotely familiar with Free City slavery knew the documentary was complete bullshit, but what we didn't know was just how far those radicalists were willing to go to make us all look bad." - <<elseif _show == 3 && $FCTV.channel.one > 3 || $FCTV.channel.one == 3>> + <<elseif $show == 3 && FCTV.channelCount(3, 'gt') || FCTV.channelCount(3, 'eq')>> <<if $seeImages > 0>> <<set _jules.vaginalAccessory = "large dildo">> <div class="imageColumn"> @@ -109,10 +133,16 @@ <br><br>As the AnchorSlave continues to squeeze, one of the researchers answers from off camera. "That's right, it can be rather amazing. To tell you the truth, we didn't believe it at first, but the evidence made it too hard to ignore." Jules starts looking toward the backstage area trying to signal someone as the other researcher continues. "It's also important not to wear a bra unless you're doing high-impact cardio. We've known since the mid 20th century that wearing bras causes sagging; bras devastate the breasts of <<if $seePreg == 0>><i>friendly</i><<else>>postpartum<</if>> women in particular, and promote breast cancer... Despite countless decades-long studies showing us this, the old world insists on forcing women to wear..." <br><br>It seems that Jules finally got the approval she was looking for, because she immediately reached down between her legs, causing the researcher to distractedly forget what he was saying. Apparently the panties she's wearing are of the dildo variety, because when she removes her hand you can see a tell-tale green indicator light glowing on the front of them. A cute rosy flush comes to Jules cheeks before she apologizes and urges the pair of researchers to continue. <</if>> + <<run FCTV.incrementShow()>> + <<case 1>> <<run FCTV.incrementChannel(2)>> - <<set _rerun = random(2,10), _MSL = $MastSiIDs.length>> - which is currently showing <<if $FCTV.channel.two < 12>>the newest episode of a<<else>>a repeat of the<</if>> popular competitive reality show<<if $FCTV.channel.two > 0>>: Next Top Breeder.<<else>> where several female citizens are competing for something.<</if>> The intro sequence shows a succession of beautiful ladies either participating in a mixture of contrived competitions, or talking and going about their lives in a sorority-like setting. The montage is overlaid with a narrator's voice: "12 of Canadia Arcology's most attractive women are all competing for the privilege of having the arcology owner's children. Clint Miles has desirable genes, and these ladies are determined to prove their worth as gestators. And here in Canadia, there are no restrictions on fertility drugs for the winner, so the competition this season is fierce! <<if $FCTV.channel.two < 12>>_rerun<<else>>$FCTV.channel.two<</if>> lad<<if $FCTV.channel.two > 0>>ies have<<else>>y has<</if>> already been sent packing, who will be Canadia's... Next Top Breeder!?" The title finally pops up, redundantly labeling the show as 'Next Top Breeder: Canadia'. + <<set _MSL = $MastSiIDs.length>> + which is currently showing <<if FCTV.channelCount(12, 'lt')>>the newest episode of a<<else>>a repeat of the<</if>> popular competitive reality show<<if FCTV.channelCount(0, 'gt')>>: Next Top Breeder.<<else>> where several female citizens are competing for something.<</if>> + The intro sequence shows a succession of beautiful ladies either participating in a mixture of contrived competitions, or talking and going about their lives in a sorority-like setting. + The montage is overlaid with a narrator's voice: "12 of Canadia Arcology's most attractive women are all competing for the privilege of having the arcology owner's children. + Clint Miles has desirable genes, and these ladies are determined to prove their worth as gestators. + And here in Canadia, there are no restrictions on fertility drugs for the winner, so the competition this season is fierce! $FCTV.channel.two ladies have already been sent packing, who will be Canadia's... Next Top Breeder!?" The title finally pops up, redundantly labeling the show as 'Next Top Breeder: Canadia'. <<if _MSL >= 1>> <br><br>You don't spend very much time actually watching the show; the randy opening, perverted competitions, and constant talk of creampies quickly has <<if _MSL >= 1 && $Concubine != 0>> @@ -125,16 +155,22 @@ the pleasure slaves in your bed eager for some attention from their own arcology owner. You spend the rest of the evening doing something a lot more fun than watching reality TV. <</if>> <</if>> + <<case 2>> <<run FCTV.incrementChannel(3)>> <<if $seeImages > 0>> <<set _model = BaseSlave()>> <<run Object.assign(_model, { - devotion: 0, trust: 0, - muscles: 600, boobs: 700, - butt: 3, hLength: 50, - skin: "tan", hStyle: "messy", - hColor: "blonde", boobShape: "perky" + devotion: 0, + trust: 0, + muscles: 600, + boobs: 700, + butt: 3, + hLength: 50, + skin: "tan", + hStyle: "messy", + hColor: "blonde", + boobShape: "perky" })>> <div class="imageColumn"> @@ -146,12 +182,12 @@ </div> </div> <</if>> - <<set _show = random(0,2)+1>> + <<run FCTV.showRange(1, 3)>> which is currently showing the 'Home and Slave' stream channel. The current show features a set of female twins wearing nothing but tool belts. Their assets aren't particularly noteworthy, but they have a great hourglass figure, toned muscles, and gorgeous girl-next-door faces. The girls are hosting a DIY show, and seem to be performing a lot of the work themselves. The occasional bead of sweat makes their smooth tan skin really stand out. It seems like this time they are - <<if _show == 1>> + <<if $show == 1>> working on modifications to an apartment to accommodate enormous anatomy. The pair demonstrate how to tastefully modify a doorway so that giant breasts, <<if $seeDicks == 0>><i>smiles</i><<else>>testicles<</if>>, and <<if $seePreg == 0>><i>hairdos</i><<else>>baby bumps<</if>> can get through easily. Their final results weren't refined enough to use in your own home, but were pretty amazing for the economy-sized apartment they filmed at. <br><br>At the end of the show they test out the new doorways by bringing in a somewhat unusual slave. A naked fu<<if $seeDicks == 0>><i>nny cow</i><<else>>tanari<</if>> wearing only a cowbell collar, she has massive milky tits, gigantic <<if $seeDicks == 0>><i>smile</i><<else>>balls hanging low in her sack<</if>>, and a belly engorged with what was probably a <<if $seePreg == 0>><i>five-course dinner</i><<else>><<if $seeHyperPreg == 0>><i>single baby</i><<else>>dozen babies<</if>><</if>>. The <<if $seeDicks == 0>><i>fun</i><<else>>futa<</if>> cow ambles through the modified door without a problem, resulting in a bouncy victory dance from the naked twins. - <<elseif _show == 2>> + <<elseif $show == 2>> working on setting up a slave nutrition system inside a moderately-sized apartment. They're installing a deluxe system that has integrated nutritional sensing in addition to a food system that supplies the unit's two feeder/med-dispenser combo units. Amazingly, the whole thing fits into the kitchen without a problem, as they located the main system housing in the pantry. When they're finished, you couldn't tell the nutrition system is there, except for the two large dildos that are sticking out of the side of a cabinet. <br><br>After their work is done, you're treated to watching the young twins testing the system out. They each take one feeder and ride it to get a test suppository, before turning around and inhaling the cockfeeders for a small meal. You wonder at their choice for the order of events, sucking the cockfeeder they had just finished ramming up their ass, but they were so enthusiastic about it that you decide they probably liked it that way. <<else>> @@ -159,51 +195,52 @@ <br><br>The room is set up so that slaves sleep in something resembling bunk beds, though there are four beds instead of two. Instead of worrying about the lack of space, the twins use the confined sleeping arrangements as an advantage. A simple neural activity monitor combined with a few sources of stimulation or discomfort serve to condition the slaves while they sleep. The twins helpfully demonstrate for their audience the features of these beds. Part of the stain-proof mattress is covered with flexible strips of metal to conduct electricity for stimulation or pain. Focused speakers play naughty sounds, while a dim display can show a stream of pornography or other material without being bright enough to disturb the slave's sleep. The final addition is a quartet of vibrating dildos that extend from the bunk above to stimulate a slave while they sleep. <br><br>The whole setup seemed impressive, but you aren't really sure how effective it would be... particularly when you compare the likely cost of such a setup to an inexpensive cot on the floor. <</if>> + <<run FCTV.incrementShow()>> <<case 3 4>> <<run FCTV.incrementChannel(4)>> + <<set $oneTimeDisableDisability = 1>> /* NOTE: These slaves are meant to be high quality and expensive, they are the product of the combined slave markets of all the Free Cities. Additionally, they won't follow the player's slave selling policies because they aren't being sold in the PC's arcology. Because they are purchased, it shouldn't be a balance issue or impact the game like a slave gift. */ <<if $seeDicks == 0>> <<if $seePreg == 0>> - <<set _show = random(5,6)>> + <<run FCTV.showRange(5, 6)>> <<else>> - <<set _show = random(0,6)>> + <<run FCTV.showRange(0, 6)>> <</if>> - <<elseif $seeDicks == 100>> + <<elseif $seeDicks == 100>> <<if $seePreg == 0>> - <<set _show = random(7)>> + <<run FCTV.showRange(0, 7)>> <<else>> - <<set _show = random(7,9)>> + <<run FCTV.showRange(7, 9)>> <</if>> <<else>> <<if $seePreg == 0>> - <<set _show = random(5,7)>> + <<run FCTV.showRange(5, 7)>> <<else>> - <<set _show = random(0,9)>> + <<run FCTV.showRange(0, 9)>> <</if>> <</if>> - <<if _show < 3>> /* premium virgin */ - <<set _slaveOneTimeMinAge = ($fertilityAge + 2)>> - <<set _slaveOneTimeMaxAge = 18>> + + <<if $show < 3>> /* premium virgin */ + <<set $slaveOneTimeMinAge = ($fertilityAge + 2)>> + <<set $slaveOneTimeMaxAge = 18>> <<set $one_time_age_overrides_pedo_mode = 1>> - <<set $oneTimeDisableDisability = 1>> + <<set _slave = GenerateNewSlave("XX")>> - <<set _slave.devotion = random(40,60)>> + <<set _slave.devotion = random(60,90)>> <<set _slave.weight = random(-10,10)>> <<set _slave.waist = random(-45,25)>> <<set _slave.face = random(70,100)>> <<set _slave.anus = 0>> <<set _slave.vagina = 0>> <<set _slave.trueVirgin = 1>> - <<set _slave.boobs = (random(14,26)*50)>> + <<set _slave.boobs = random(14,26)*50>> <<set _slave.boobShape = "perky">> <<set _slave.hips = 2>> <<set _slave.butt = random(5,6)>> - <<set _slave.shoulders = -1>> + <<set _slave.shoulders = 1>> <<set _slave.preg = 0>> <<set _slave.ovaries = 1>> - <<set _slave.skill.vaginal = 0>> - <<set _slave.lips = random(20,50)>> <<set _slave.teeth = "normal">> <<set _slave.vaginaLube = 2>> <<set _slave.energy = random(65,95)>> @@ -211,51 +248,33 @@ <<set _slave.attrXX = random(60,90)>> <<set _slave.attrKnown = 1>> <<set _slave.fetishKnown = 1>> + <<set _slave.lips = random(20,50)>> <<set _slave.fetish = either("cumslut", "cumslut", "humiliation", "pregnancy", "pregnancy", "pregnancy", "submissive")>> + <<set _slave.behavioralQuirk = either("advocate", "funny", "insecure", "none", "none")>> + <<set _slave.sexualQuirk = either("caring", "none", "romantic")>> <<set _slave.fetishStrength = random(70,100)>> <<set _slave.sexualFlaw = "none">> <<set _slave.behavioralFlaw = "none">> - <<set _slave.behavioralQuirk = either("advocate", "funny", "insecure", "none", "none")>> - <<set _slave.sexualQuirk = either("caring", "none", "romantic")>> - <<set _slave.skill.entertainment = random(50,80)>> - <<set _slave.skill.oral = random(20,60)>> - <<set _slave.skill.anal = 0>> - <<set _slave.skill.whoring = 0>> <<set _slave.intelligence = random(51,70)>> <<set _slave.intelligenceImplant = 30>> - <<set _slave.devotion = random(60,90)>> <<set _slave.trust = random(50,80)>> - <<set _slave.chem = 0>> - <<set _slave.health.condition = 75>> - <<set _slave.health.health = _slave.health.condition - _slave.health.shortDamage - _slave.health.longDamage>> - <<set _slave.origin = "You purchased $him from FCTV's Home Slave Shopping stream channel.">> - <<set _slave.career = "a slave">> - <<set _slave.custom.tattoo = "$He has a small stylized 'A' tattooed on the nape of $his neck marking $him as the product of the famous breeding program at Arcturus Arcology.">> - <<elseif _show == 3>> /* hyperpregnant */ - <<set _slaveOneTimeMinAge = ($fertilityAge + 3)>> - <<set _slaveOneTimeMaxAge = 20>> + <<elseif $show == 3>> /* hyperpregnant */ + <<set $slaveOneTimeMinAge = ($fertilityAge + 3)>> + <<set $slaveOneTimeMaxAge = 20>> <<set $one_time_age_overrides_pedo_mode = 1>> - <<set $oneTimeDisableDisability = 1>> + <<set _slave = GenerateNewSlave("XX")>> <<set _slave.weight = random(10,20)>> <<set _slave.waist = random(-25,25)>> <<set _slave.anus = 1>> <<set _slave.vagina = 2>> <<set _slave.preg = random(25,30)>> - <<if $seeHyperPreg == 0>> - <<set _slave.pregType = either(6,7,7,8)>> - <<else>> - <<set _slave.pregType = random(10,16)>> - <</if>> <<set _slave.pregKnown = 1>> - <<set _slave.pregWeek = _slave.preg>> - <<run SetBellySize(_slave)>> <<set _slave.pregAdaptation = 300>> - <<set _slave.ovaries = 1>> <<set _slave.lips = random(20,50)>> <<set _slave.teeth = "normal">> <<set _slave.vaginaLube = 2>> - <<set _slave.boobs = (random(10,30)*50)>> + <<set _slave.boobs = random(10,30)*50>> <<set _slave.lactation = 1>> <<set _slave.lactationDuration = 2>> <<set _slave.hips = 3>> @@ -263,37 +282,34 @@ <<set _slave.butt = random(7,9)>> <<set _slave.attrKnown = 1>> <<set _slave.energy = random(65,100)>> - <<set _slave.attrXY = random(70,100)>> - <<set _slave.attrXX = random(40,100)>> - <<set _slave.skill.vaginal = random(50,80)>> - <<set _slave.skill.oral = random(40,80)>> - <<set _slave.skill.anal = random(20,50)>> - <<set _slave.skill.whoring = random(0,50)>> + <<set _slave.attrXY = random(40,100)>> <<set _slave.devotion = random(40,70)>> <<set _slave.trust = random(40,70)>> <<set _slave.fetish = "pregnancy">> <<set _slave.fetishKnown = 1>> - <<set _slave.fetishStrength = "100">> + <<set _slave.fetishStrength = 100>> <<set _slave.sexualFlaw = "breeder">> <<set _slave.behavioralFlaw = "none">> <<set _slave.behavioralQuirk = "none">> <<set _slave.sexualQuirk = either("caring", "caring", "romantic")>> - <<set _slave.chem = 0>> - <<set _slave.health.condition = 75>> - <<set _slave.health.health = _slave.health.condition - _slave.health.shortDamage - _slave.health.longDamage>> <<set _slave.intelligence = random(-15,80)>> <<set _slave.intelligenceImplant = 15>> - <<set _slave.origin = "You purchased $him from FCTV's Home Slave Shopping stream channel.">> - <<set _slave.career = setup.youngCareers.random()>> - <<elseif _show == 4>> /* superfetation */ - <<set _slaveOneTimeMinAge = ($fertilityAge + 4)>> - <<set _slaveOneTimeMaxAge = 24>> + <<if $seeHyperPreg == 0>> + <<set _slave.pregType = either(6,7,7,8)>> + <<else>> + <<set _slave.pregType = random(10,16)>> + <</if>> + <<set _slave.pregWeek = _slave.preg>> + <<run SetBellySize(_slave)>> + <<elseif $show == 4>> /* superfetation */ + <<set $slaveOneTimeMinAge = ($fertilityAge + 4)>> + <<set $slaveOneTimeMaxAge = 24>> <<set $one_time_age_overrides_pedo_mode = 1>> - <<set $oneTimeDisableDisability = 1>> + <<set _slave = GenerateNewSlave("XX")>> <<set _slave.weight = random(20,40)>> <<set _slave.waist = random(-25,25)>> - <<set _slave.boobs = (random(4,6)*100)>> + <<set _slave.boobs = random(4,6)*100>> <<set _slave.butt = random(3,5)>> <<set _slave.hips = 1>> <<set _slave.face = random(60,90)>> @@ -303,8 +319,6 @@ <<set _slave.pregWeek = -2>> <<set _slave.bellySag = 1>> <<set _slave.bellySagPreg = 1>> - <<set _slave.geneticQuirks.superfetation = 2>> - <<set _slave.ovaries = 1>> <<set _slave.teeth = "normal">> <<set _slave.vaginaLube = 2>> <<set _slave.energy = random(60,90)>> @@ -312,41 +326,32 @@ <<set _slave.attrXX = random(40,65)>> <<set _slave.attrKnown = 1>> <<set _slave.fetishKnown = 1>> + <<set _slave.sexualQuirk = "none">> <<set _slave.fetish = either("cumslut", "humiliation", "pregnancy", "pregnancy", "submissive")>> <<set _slave.fetishStrength = random(70,100)>> <<set _slave.sexualFlaw = "none">> <<set _slave.behavioralFlaw = "none">> <<set _slave.behavioralQuirk = "none">> - <<set _slave.sexualQuirk = "none">> - <<set _slave.skill.oral = random(20,50)>> - <<set _slave.skill.vaginal = random(50,100)>> - <<set _slave.skill.anal = random(10,20)>> <<set _slave.intelligence = random(-15,80)>> <<set _slave.intelligenceImplant = 0>> <<set _slave.devotion = random(60,90)>> <<set _slave.trust = random(50,80)>> - <<set _slave.chem = 0>> - <<set _slave.health.condition = 75>> - <<set _slave.health.health = _slave.health.condition - _slave.health.shortDamage - _slave.health.longDamage>> - <<set _slave.counter.birthsTotal = random(2,3)>> - <<set _slave.career = setup.youngCareers.random()>> - <<set _slave.origin = "You purchased $him from FCTV's Home Slave Shopping stream channel.">> - <<elseif _show == 5>> /* MILF */ - <<set _slaveOneTimeMinAge = 36>> - <<set _slaveOneTimeMaxAge = 40>> + <<set _slave.geneticQuirks.superfetation = 2>> + <<elseif $show == 5>> /* MILF */ + <<set $slaveOneTimeMinAge = 36>> + <<set $slaveOneTimeMaxAge = 40>> <<set $one_time_age_overrides_pedo_mode = 1>> - <<set $oneTimeDisableDisability = 1>> + <<set _slave = GenerateNewSlave("XX")>> <<set _slave.weight = random(20,90)>> <<set _slave.waist = random(-45,45)>> - <<set _slave.boobs = (random(20,30)*50)>> + <<set _slave.boobs = random(20,30)*50>> <<set _slave.butt = random(5,7)>> <<set _slave.hips = 2>> <<set _slave.face = random(60,90)>> <<set _slave.anus = 1>> <<set _slave.vagina = 2>> <<set _slave.preg = 0>> - <<set _slave.ovaries = 1>> <<set _slave.teeth = "normal">> <<set _slave.vaginaLube = 2>> <<set _slave.energy = random(60,90)>> @@ -360,46 +365,27 @@ <<set _slave.behavioralFlaw = "none">> <<set _slave.behavioralQuirk = "none">> <<set _slave.sexualQuirk = "none">> - <<set _slave.skill.entertainment = random(20,80)>> - <<set _slave.skill.oral = random(50,100)>> - <<set _slave.skill.vaginal = random(50,100)>> - <<set _slave.skill.anal = random(20,80)>> - <<set _slave.skill.whoring = random(20,80)>> <<set _slave.intelligence = random(-15,80)>> <<set _slave.intelligenceImplant = 15>> <<set _slave.devotion = random(60,90)>> <<set _slave.trust = random(50,80)>> - <<set _slave.chem = 0>> - <<set _slave.health.condition = 75>> - <<set _slave.health.health = _slave.health.condition - _slave.health.shortDamage - _slave.health.longDamage>> - <<set _slave.counter.birthsTotal = random(1,3)>> - <<set _slave.career = setup.youngCareers.random()>> - <<set _slave.origin = "You purchased $him from FCTV's Home Slave Shopping stream channel.">> - <<elseif _show == 6>> /* discount young hottie */ - <<set _slaveOneTimeMaxAge = 25>> - <<set $oneTimeDisableDisability = 1>> + <<elseif $show == 6>> /* discount young hottie */ + <<set $slaveOneTimeMaxAge = 25>> + <<set _slave = GenerateNewSlave("XX")>> <<set _slave.face = random(70,100)>> <<set _slave.weight = random(-5,10)>> <<set _slave.waist = random(-45,25)>> <<set _slave.anus = 1>> <<set _slave.vagina = 1>> - <<set _slave.boobs = (random(14,26)*50)>> + <<set _slave.boobs = random(14,26)*50>> <<set _slave.boobShape = "perky">> <<set _slave.hips = 2>> <<set _slave.butt = random(5,6)>> <<set _slave.shoulders = -1>> <<set _slave.preg = 0>> - <<set _slave.ovaries = 1>> <<set _slave.lips = random(25,50)>> - <<if _slave.physicalAge >= 12>> - <<set _slave.teeth = "normal">> - <</if>> <<set _slave.vaginaLube = 2>> - <<set _slave.skill.vaginal = 15>> - <<set _slave.skill.oral = 15>> - <<set _slave.skill.anal = 15>> - <<set _slave.skill.whoring = 15>> <<set _slave.sexualFlaw = either("hates anal", "hates oral", "hates penetration", "idealistic")>> <<set _slave.behavioralFlaw = either("arrogant", "bitchy", "hates men")>> <<set _slave.energy = 10>> @@ -408,37 +394,32 @@ <<set _slave.muscles = random(0,25)>> <<set _slave.devotion = random(-25,25)>> <<set _slave.trust = random(-25,25)>> - <<set _slave.origin = "You purchased $him from FCTV's Home Slave Shopping stream channel.">> - <<elseif _show <= 8>> /* huge balls */ - <<set _slaveOneTimeMaxAge = 25>> - <<set $oneTimeDisableDisability = 1>> + + <<if _slave.physicalAge >= 12>> + <<set _slave.teeth = "normal">> + <</if>> + <<elseif $show <= 8>> /* huge balls */ + <<set $slaveOneTimeMaxAge = 25>> + <<set _slave = GenerateNewSlave("XY")>> <<set _slave.anus = 2>> <<set _slave.balls = random(20,35)>> - <<set _slave.scrotum = _slave.balls>> <<set _slave.dick = random(3,5)>> <<set _slave.prostate = 2>> - <<set _slave.skill.oral = random(30,60)>> - <<set _slave.skill.anal = random(20,50)>> - <<set _slave.skill.whoring = random(0,25)>> <<set _slave.devotion = random(50,80)>> <<set _slave.trust = random(50,80)>> - <<set _slave.origin = "You purchased $him from FCTV's Home Slave Shopping stream channel.">> - <<elseif _show == 9>> /* mpreg dickgirl */ - <<set _slaveOneTimeMaxAge = 22>> - <<set $oneTimeDisableDisability = 1>> + <<set _slave.scrotum = _slave.balls>> + <<elseif $show == 9>> /* mpreg dickgirl */ + <<set $slaveOneTimeMaxAge = 22>> + <<set _slave = GenerateNewSlave("XY")>> <<set _slave.anus = 2>> - <<set _slave.vagina = -1>> + <<set _slave.vagina = 1>> <<set _slave.ovaries = 0>> <<set _slave.mpreg = 1>> <<set _slave.preg = 0>> - <<set _slave.pubertyXX = 1>> <<set _slave.dick = random(3,5)>> <<set _slave.balls = random(3,6)>> - <<set _slave.skill.oral = random(40,80)>> - <<set _slave.skill.anal = random(40,80)>> - <<set _slave.skill.whoring = random(40,70)>> <<set _slave.muscles = either(20, 50)>> <<set _slave.energy = random(70,100)>> <<set _slave.attrXY = random(70,100)>> @@ -455,66 +436,69 @@ <<set _slave.intelligenceImplant = 15>> <<set _slave.devotion = random(60,90)>> <<set _slave.trust = random(50,80)>> - <<set _slave.chem = 0>> - <<set _slave.health.condition = 75>> - <<set _slave.health.health = _slave.health.condition - _slave.health.shortDamage - _slave.health.longDamage>> - <<set _slave.career = setup.youngCareers.random()>> - <<set _slave.origin = "You purchased $him from FCTV's Home Slave Shopping stream channel.">> <</if>> + <<run FCTV.FinalTouches(_slave, 4)>> + <<setLocalPronouns _slave>> - which is currently showing the 'Home Slave Shopping' stream channel. It's a bit strange, shopping for slaves without inspecting them in person, but you have to admit it's kind of convenient. Plus, you might find something that'd be difficult to get in your own arcology's markets. You start watching at the end of one slave being displayed; the program goes into a lot of detail that isn't always available from shady salesmen at the market. Two hosts are displaying the merchandise and an older male reads details on each slave from a prompter, while a fit female works the slave for the camera to give viewers a good look at what they might purchase. + which is currently streaming 'Home Slave Shopping'. It's a bit strange, shopping for slaves without inspecting them in person, but you have to admit it's kind of convenient. Plus, you might find something that'd be difficult to get in your own arcology's markets. You start watching at the end of one slave being displayed; the program goes into a lot of detail that isn't always available from shady salesmen at the market. Two hosts are displaying the merchandise and an older male reads details on each slave from a prompter, while a fit female works the slave for the camera to give viewers a good look at what they might purchase. <br><br>"Next up, we have - <<if _show < 3>> /* premium virgin */ + <<if $show < 3>> /* premium virgin */ a premium virgin named _slave.slaveName." A bright pink "VV" symbol flashes on the corner of the screen. "Take a good look, because $he is a product of the famous sex slave breeding program at Arcturus Arcology. Like all the slaves they sell, $he's a premium @@.pink;double virgin.@@ $He has excellent breeding potential, and while $he isn't that skilled yet, $he's got good intelligence and is already well acclimated to the life of a sex slave." - <<elseif _show == 3>> /* hyperpregnant */ + <<elseif $show == 3>> /* hyperpregnant */ <<= addA(_slave.race)>> breeder, young and healthy with an advanced <<if $seeHyperPreg == 0>><i>@@.pink;super pregnancy.@@</i><<else>>@@.pink;hyper pregnancy.@@<</if>> _slave.slaveName is really into making babies, and has even had $his hips surgically widened to help $him carry a large brood. Our tests here at HSS show that $he's pregnant with _slave.pregType babies!" - <<elseif _show == 4>> /* superfetation */ + <<elseif $show == 4>> /* superfetation */ a special slave named _slave.slaveName who has quite the gift, @@.pink;superfetation!@@ $He can become pregnant while pregnant! Isn't that amazing? $He may have a few miles on $him, having just completed a double pregnancy, but with a trait like that, $he's more than worth $his price if you like your <<= $girl>>s to constantly have a bun in the oven." - <<elseif _show == 5>> /* MILF */ + <<elseif $show == 5>> /* MILF */ <<= addA(_slave.race)>> @@.pink;MILF.@@ $He's no longer young, but still quite attractive. $He has been a slave for many years now, and has been trained well. $He also has a good array of skills that you can put to use. $He has huge tits and a huge ass to play with, but $he'd also make good <<if $seePreg == 0>><i>sandwiches</i><<else>>stock for a breeding program<</if>>." - <<elseif _show == 6>> /* discount young hottie */ + <<elseif $show == 6>> /* discount young hottie */ a bargain discount offer on a young _slave.race $girl. Unlike our usual stock $he's something of a @@.red;disobedient@@ slave, but that means savings for you, and all the fun of breaking in a new slave. We have to admit that $his previous owner had a hard time training $him, but I'm sure you can tell that $his body has potential<<if _slave.clit > 4>>, just look at the @@.pink;clit@@ on $him<</if>>!" - <<elseif _show <= 8>> /* huge balls */ + <<elseif $show <= 8>> /* huge balls */ <<= addA(_slave.race)>> cum cow. Just take a look at that pair of @@.pink;massive balls.@@ This slave also has a prostate stimulating hormone implant to ramp up $his cum production even further. $He's a perfect fit for your dairy, or even your own kitchen creamery!" <br><br>The woman helping to display the slaves shows her hand to the camera; it's coated in a sticky layer of precum from handling the cum cow's equipment. - <<elseif _show == 9>> /* mpreg dickgirl */ + <<elseif $show == 9>> /* mpreg dickgirl */ a strong young _slave.race $girl that retains $his cock and balls. _slave.slaveName has something that makes $him special: thanks to medical science $he's got a @@.pink;functional ass womb.@@ That's right folks, this slave is fertile and can get knocked up if you inseminate $his asshole. That's pretty amazing, to be honest, and exceptionally rare. Don't let this opportunity slip by!" <</if>> <<set _slaveCost = slaveCost(_slave)>> - <<if _show < 3 || _show > 6>> + <<if $show < 3 || $show > 6>> <<set _slaveCost *= 1.3>> - <<elseif _show == 4>> + <<elseif $show == 4>> <<set _slaveCost *= 2>> - <<elseif _show == 6>> + <<elseif $show == 6>> <<set _slaveCost *= 0.7>> <</if>> <<set _slaveCost = 500*Math.trunc(_slaveCost/500)>> The offered price is <<print cashFormat(_slaveCost)>>. + <<set $activeSlave = _slave, $saleDescription = 1>> <<if $cash >= _slaveCost>> - <br> <<set $activeSlave = _slave>> - <<link "Buy $his slave contract">> + <<link "Buy this contract.">> <<run cashX(forceNeg(_slaveCost), "slaveTransfer", _slave)>> <<set $nextLink = "Scheduled Event", $returnTo = "Scheduled Event">> <<goto "New Slave Intro">> <</link>> <<else>> - //@@.red;You lack the necessary funds to buy this slave.@@// + //@@.red;You lack the necessary funds.@@// <</if>> - <br><br> - <<set $saleDescription = 1>><<include "Long Slave Description">><<set $saleDescription = 0>> + <br><br> <<include "Long Slave Description">> + <<run FCTV.incrementShow()>> <<case 5>> <<run FCTV.incrementChannel()>> <<if $seeImages > 0>> <<set _model = BaseSlave()>> <<run Object.assign(_model, { - devotion: 0, trust: 0, - boobs: 700, hips: 2, - butt: 5, hLength: 50, - hStyle: "luxurious", hColor: "blonde", - boobShape: "perky", belly: 10000, - preg: 35, clothes: "a maternity dress" + devotion: 0, + trust: 0, + boobs: 700, + hips: 2, + butt: 5, + hLength: 50, + hStyle: "luxurious", + hColor: "blonde", + boobShape: "perky", + belly: 10000, + preg: 35, + clothes: "a maternity dress" })>> <div class="imageColumn"> @@ -526,8 +510,8 @@ which is currently showing an episode of the slave-breeding for beginners series: 'Husbandry with Millie'. The show is hosted by the famous and charismatic Millie, a slave breeder from Arcturus who appears to be in her mid thirties. She's wearing something resembling a maternity dress over her large pregnant belly, but the loose fabric doesn't hide her enormous hips and complementary ass. The dress only comes part of the way up her chest, leaving her large milk-engorged breasts exposed as they rest atop the fabric. Millie begins the show the same way as always, by giving her viewers some encouragement. "Anyone can become a breeder, even you! Just be willing to learn, and as I always say..." she pats her full belly meaningfully "be ready to get your hands dirty!" <br><br> - <<set _show = random(2)+1>> - <<if _show == 1 && $FCTV.channel.five > 3 || $FCTV.channel.five == 1>> + <<run FCTV.showRange(1, 3)>> + <<if $show == 1 && FCTV.channelCount(3, 'gt') || FCTV.channelCount(1, 'eq')>> Millie walks away from the classroom-like set, followed by a camera panning along beside her. Her purposeful steps and swinging hips set her breasts jiggling and sending droplets of milk flying from her dark milky nipples. It takes a sadly brief time for her to arrive at her destination, a mostly-white clinical-looking set prepared with several naked — and presumably fertile — slaves. As she comes to a stop in front of the line of slaves, all of the beautiful girls bow their heads and greet her. "<i>Hello Mistress Millie!</i>" <br><br> Millie ignores the naked slaves and turns to the camera. "Today we're going to cover the basics of choosing good breeding sluts, using some of my own stock. Of course, as we covered before, you want to choose breeders that have the traits you're looking for. Intelligence, temperament, bone structure, beauty, or simple cosmetic features like skin and hair color. But that's not all you need to look for!" Millie beckons to one of the slaves in the background, who rushes forward to stand in front of the camera. She points at the girl's flank, and the camera zooms in so that the screen is taken up by the girl's broad hips and moist pussy. "They call them child-bearing hips for a reason!" Millie starts rubbing the girl's hips as she continues. "Wide hips are a solid indicator of a good breeder; they mean a healthier pregnancy and easier — not to mention cheaper — birth. And if you want to increase your production with multiple pregnancies, wide hips are a must!" @@ -535,7 +519,7 @@ The wide hips of the nubile slave girl suddenly walk off camera, and are soon replaced by the hips of another girl that are dramatically smaller. They aren't the hips of a man, but certainly bring to mind the narrow hips of an old-timey fashion model. The girl has a little extra weight, which is more obvious on her narrow frame, but you can tell she is fit with well-developed muscles. Millie starts touching her demonstration model as she points things out. "Sometimes, you're looking for narrow hips. Maybe you want to breed an athlete or pit fighter, or your tastes just run that way for some reason. You don't have to rule out a slut just because she has small hips, but there are some things to look for. First, you want to make sure the bitch is nicely plush, with well-distributed fat. This is important for a healthy pregnancy, but tends to be overlooked in narrow sluts. Also check their core strength. Muscles are even more important for narrow sluts, to help support the uterus and ease childbirth." She traces the shapes of the slave's hips. "They might be small, but make sure they're well formed, you want them to work properly. Finally, check the pubic bone, its joints with the iliac crests, and the fore part of the crests. You want a smooth curve throughout with loose joints that'll open wide n' easy when it's time." <br><br> With a smack on the ass, the bitch trots off camera to be replaced by a girl with her knees bent and feet spaced far apart. When the camera pans down you have a clear view of her sodden slit; the stage lights give the natural lubricant coating her inner thighs a more noticeable sheen. Millie rubs two fingers between the slaves' labia, and withdraws the now-soaked digits for the camera to see. "Remember! A wet cunt is a good cunt!" Without any warm-up, she bunches her fingers and thumbs together and inserts her entire hand into the slave's gaping pussy. "A loose baggy cunt may be no good for fucking, but I guarantee it's perfect for making you new slaves. And it may just help you save money, too. Loose cunts tend to drive down a slut's value, right at the perfect age for turning a slut into a breeding bitch." - <<elseif _show == 2 && $FCTV.channel.five > 3 || $FCTV.channel.five == 2>> + <<elseif $show == 2 && FCTV.channelCount(3, 'gt') || FCTV.channelCount(2, 'eq')>> Millie walks towards the back of the set, returning with her hands behind her back. "This episode, we're going to talk about an important decision any breeder needs to make. Bull" she pulls a large life-like <<if $seeDicks == 0>><i>pop sickle</i><<else>>dildo<</if>> from behind her back, "or no bull?" This time she whips out something resembling a turkey baster. She gives both a hard squeeze, and they both squirt out a jet of <<if $seeDicks == 0>><i>whipped cream.</i><<else>>alabaster fluid.<</if>> She drops both of the spent tools and turns to walk towards her chair, the camera follows to give a good view of hefty ass and swinging hips. <br><br> Sitting down in her comfortable-looking chair, Millie begins her lecture. "So, thanks to the miracles of the modern dairy and industrial <<if $seeDicks == 0>><i>banana</i><<else>>cock<</if>> milkers, a reliable supply of <<if $seeDicks == 0>><i>banana juice</i><<else>>cum<</if>> is available for most citizens. This is definitely the least expensive option for those starting out, and combined with easy access, seems to be a popular choice for new breeders. It's also a common pitfall, so thank goodness you're watching now! Industrial dairies simply aren't focused on reproduction in most arcologies. Owners are focused on production, quantity over quality, and most of the material is used for slave nutrition and industrial purposes. Even if your arcology has a reproduction-focused <<if $seeDicks == 0>><i>banana cream</i><<else>>jizz<</if>> farm, they're usually focused on breeding menials. You still have no way of knowing what you're getting. It makes any attempt at proper husbandry nearly impossible. You don't want to sink all your resources into buying and caring for breeding sluts, only to end up with a litter only fit to be menials!" @@ -554,6 +538,7 @@ <br><br> "You may be thinking: 'as if I could ever afford something like that!'" Millie gives the camera a bright smile. "Don't worry; Mamma Millie's got you covered. It's true that most of you won't be able to afford one of these, not to mention the special electrical hookups and maintenance... but the fact that better models exist means that the older models don't have much use for the types of people that <b>can</b> afford them. That means empty incubators that are just too valuable to simply dispose of, and a chance for you to rent or lease one or two of 'em long enough to get a major jump start on your breeding program. It'll still be expensive, maybe even as much as a high-quality slave ready to be trained. You'll also have to deal with and treat the chemical damage. But when it comes to developing a solid breeding line to produce high quality litters, the time savings can't be beat. Just don't expect the ones fresh out of the incubator to be good for much other that making new slaves!" <</if>> + <<run FCTV.incrementShow()>> <<case 6>> <<run FCTV.incrementChannel()>> @@ -567,20 +552,20 @@ which is currently showing an episode of the 'Modern Dairy' edutainment series, which opens with a montage of milk-related food and cooking shots. After the last of the opening credits disappears, the show sticks to a single shot from the montage, a delicious looking bowl of cereal. The camera zooms out to reveal the show's host wearing her trademark cow print leotard, and getting just a little too much enjoyment out of her cereal. She slowly puts the spoon down while savoring her cereal, reluctantly swallowing and starting the show. "Hi there y'all, welcome to another episode of Modern Dairy!" She gives the camera a wave — setting her gargantuan melons wobbling inside the spandex-like leotard — and the camera fades to black. <br><br> - <<set _show = random(2)+1>> + <<run FCTV.showRange(1, 3)>> <<if $seeExtreme == 0>> <<if $seeDicks == 0>> - <<set _show = 1>> + <<set $show = 1>> <i>CONTENT ADVISOR: Selecting show without too much hugging or hotdogs...</i><br><br> <<else>> - <<set _show = either(1,2)>> + <<run FCTV.showRange(1, 2, 'either')>> <i>CONTENT ADVISOR: Selecting show without too much hugging...</i><br><br> <</if>> <<elseif $seeDicks == 0>> - <<set _show = either(1,3)>> + <<run FCTV.showRange(1, 3, 'either')>> <i>CONTENT ADVISOR: Selecting show without too many hotdogs...</i><br><br> <</if>> - <<if _show == 1>> + <<if $show == 1>> The camera fades in to show an excited Bess standing next to a double door labeled 'Dairy 3'. "I'm here at Arcology G-9 to give you a look at their state-of-the-art milking equipment." Bess gestures to her jiggling bosom. "As you can see, I'm terribly excited! I've heard this dairy's equipment is a pretty radical departure from the standard ones that look like dentist's chairs!" Without further ado, she pushes her way through the swinging doors, and sets off into the dairy. The camera follows, spending as much time focused on her seductively-swinging rear end as it does panning to look around the long room. The first thing you notice is that the lighting is a soft warm glow more at home in a spa than an industrial facility. The room consists of a long hallway, the row of milkers on either side are separated by fabric dividing curtains in earth tone colors, though most of them appear to be open. You didn't notice at first, but it seems like most of the milkers are occupied... the radically different shape tricked your trained eye for a moment. <br><br> Eventually Bess reaches the end of the hallway, and is greeted by a nearly-naked slave with visible muscles that seems to be a milk maid. <i>"Hello there Ma'am, you must be Bess. My name is Anabell, and I'm a milk maid here. Welcome to dairy number three!"</i> @@ -609,39 +594,41 @@ Bess looks a little bit envious of the cow, but gives her approval. "Go ahead; I'll just help myself to some fresh milk while you're busy." She heads toward the dangling udders to retrieve her treat. It only takes Anabell a few shakes <<if $seeDicks == 0>><i>of the massage oil bottle before the cow's ass is glistening, and he gets to work massaging her.</i><<else>>to get her monstrous python of a cock throbbing and ready, and she doesn't waste any time hilting herself in the cow's ready pussy.<</if>> There's a loud muffled moo, and the camera reluctantly moves to get a shot of Bess. <br><br> Bess is on her hands and knees, her mouth full of nipple and milk, messily trying to keep up with the output of the prodigious mammary. She pinches the nipple to stop drinking for a moment so that she can speak to the camera. "Oh my god! This milk is SOOO good!" She sucks the cow's long nipple back into her mouth and resumes her feast. - <<elseif _show == 2>> + <<elseif $show == 2>> Instead of starting a new episode like you were expecting, it starts a teaser trailer for an upcoming episode. It seems to be focused on the semen side of the industrial dairy, and ends with some suggesting shots of Bess drinking "straight from the source." <<else>> Instead of starting a new episode like you were expecting, it starts a teaser trailer for an upcoming episode. It seems to be focused on bulk fluid production and menial bioreactor slaves, something of a departure from earlier episodes showcasing dairies focusing on high-quality product. <</if>> + <<run FCTV.incrementShow()>> <<case 7>> <<run FCTV.incrementChannel()>> which is currently showing an educational program on arcologies titled: "Architecture + Ecology = Arcology". <<if $PC.skill.engineering > 50>>The information is likely to be far too simplistic, considering your knowledge of engineering, but you watch anyway to see how most of your citizens view the massive structures.<<else>>Your practical experience means that this program is unlikely to tell you anything you don't already know, but you watch anyway to see how an average citizen views an arcology.<</if>> A likely-artificial voice of an older man narrates while the program displays video to demonstrate the topic being narrated. The show looks crisp and professional, but you can tell it doesn't have the budget that the more sexually-charged shows do. <br><br> - <<set _show = random(2)+1>> - <<if _show == 1 && $FCTV.channel.seven > 3 || $FCTV.channel.seven == 1>> + <<run FCTV.showRange(1, 3)>> + <<if $show == 1 && FCTV.channelCount(3, 'gt') || FCTV.channelCount(1, 'eq')>> This episode seems to be focusing on some basics in addition to an arcology's Penthouse. <br><br> A standard arcology is so huge that it needs to be divided into levels and sectors to make talking about it easier. Levels are the horizontal rows. An arcology is a very large building, and each Level includes many floors. Sectors are slices of those levels. For example, on Levels with four Sectors, each sector includes a quarter of each floor that's part of that Level. Each Sector is typically occupied by facilities, tenants, or both. Sometimes facilities are owned or leased by tenants! Now when your friend tells you to meet them at "promenade B" or mentions that they live in sector "7C", you'll know how those names came about. <br><br> In most arcologies with a single owner, the uppermost Level is called the Penthouse. It's an entire sector where the owner and slaves under his direct supervision live. With such a large space for a single person or family, there is a great deal of customization possible. Even two arcologies of the same design, built at the same time, are likely to have very different penthouses! It's always worth visiting a penthouse if you get the chance. Not all arcologies are built or owned by a single person, often there is a group or partnership of owners. After all, building a structure as massive as an arcology is an extremely expensive endeavor! In these cases, the term penthouse is typically still used to refer to the top sector, as it is often divided into a number of luxurious penthouse apartments for the owners. - <<elseif _show == 2 && $FCTV.channel.seven > 3 || $FCTV.channel.seven == 2>> + <<elseif $show == 2 && FCTV.channelCount(3, 'gt') || FCTV.channelCount(2, 'eq')>> This episode seems to be focusing on the Promenade and residential areas. <br><br> Below the penthouse — and potentially some residential sectors — is the Promenade, which is a major social area and hosts most of the businesses which cater to the arcology's citizens. Promenade Sectors are occupied by shops, restaurants, and other amusements. A promenade is critical to the success of an arcology; it allows the arcology to function as a self-contained residence, and is important to the economy. Sometimes it's nice to head over to a different arcology in your Free City for some unique cuisine or shopping, but could you imagine having to go through all that trouble any time you wanted to shop or eat out? While the concept of a promenade is almost universal amongst arcologies, the design, layout, and decoration of each tends to be rather unique, making it a fun experience to visit the promenade of arcologies other than your own. <br><br> The next area common to all arcologies are the residential sectors filled with apartments and other living arrangements. While designs and layouts differ — some arcologies have luxury residential areas that resemble an old-fashioned neighborhood complete with artificial sky — the purpose is always to house arcology citizens. Residential areas are critical for an arcology, in order to have a functioning self-contained economy. While all citizens in an arcology are fortunate, some are more fortunate than others. Lower-class citizens commonly live in dense efficiency apartments, while wealthy citizens often live in opulent sectors with large apartments. Without citizens there would be nobody to own or operate the stores, restaurants, and other attractions in the arcology, and there would be nobody to purchase those goods or services either! - <<elseif _show == 3 && $FCTV.channel.seven > 3 || $FCTV.channel.seven == 3>> + <<elseif $show == 3 && FCTV.channelCount(3, 'gt') || FCTV.channelCount(3, 'eq')>> This episode seems to be focusing on the lower levels, the Concourse and Service Level. <br><br> Another common level for an arcology is the Concourse, which is typically located near the bottom of the structure. Like the Promenade, it hosts businesses, but these focus less on the luxury and entertainment needs of citizens than the Promenade. The Concourse typically houses bulk trade, necessary services such as medical clinics, corporate offices, research and development centers, and even education facilities. The best universities in the world are located on the concourse level of an arcology! Of course, the concourse also houses slave markets and slave training facilities. Some arcologies have arenas for sports or other events, while others have venues for sport combat ranging from traditional octagon fighting rings to pits reminiscent of ancient gladiatorial combat. If you're lucky, your arcology may just have a public arcade, where a variety of needs can be met at an affordable price. With research pointing to the benefits of arcades to adolescent development, family-friendly arcologies are quickly adding arcades of their own! <br><br> The lowest and largest level is typically known as the Service level. Its Sectors are occupied by manufacturing and industry, including the production of food resources such as livestock facilities and dairies. Menial slaves are housed in the Service level, and often work there too. The service level also contains much of an arcology's infrastructure, supplying clean water and electricity to the citizens and businesses. Another common sight in the service level is that of a warehouse, which stores the goods and raw materials an arcology needs, and also facilitates trade with other arcologies. Finally, the Service level may contain barracks and training facilities for mercenaries or arcology militia tasked to protect it from the old world. <</if>> + <<run FCTV.incrementShow()>> <<case 8>> - <<set $FCTV.channel.eight++>> + <<run FCTV.incrementChannel()>> <<if $seeImages > 0>> <div class="imageColumn"> <div class="imageRef medImg"> @@ -652,22 +639,27 @@ which is currently showing a preview of the how-to series "Extreme Gestation for Fun and Profit", hosted by Millie. It seems like the show's going to cover topics ranging from hyper-pregnancy to broodmother implants, and even hints and some sort of medical technique to allow anal pregnancy in males. -<<case 9>> /* Hea;th condition of 70 */ +<<case 9>> /* Health condition of 70 */ <<run FCTV.incrementChannel()>> - <<if $seeImages > 0>> - <<set _model = BaseSlave()>> - <<run Object.assign(_model, { - devotion: 0, trust: 0, - hLength: 50, hStyle: "neat - hColor: "brown", boobs: 700, - boobShape: "perky", waist: 180, - butt: 3, hips: 3, - clothes: "conservative clothing", shoes: "flats" - })>> - <</if>> - <<set _show = random(0,3)+1>> - which is currently showing - <<if _show == 1>> + <<run FCTV.showRange(1, 4)>> + <<set _model = BaseSlave()>> + <<run Object.assign(_model, { + devotion: 0, + trust: 0, + hLength: 50, + hStyle: "neat", + hColor: "brown", + boobs: 700, + boobShape: "perky", + waist: 180, + butt: 3, + hips: 3, + clothes: "conservative clothing", + shoes: "flats" + })>> + + which is currently showing a documentary on the + <<if $show == 1>> <<if $seeImages > 0>> <<set _model.belly = 10000>> <<set _model.preg = 35>> @@ -679,15 +671,14 @@ </div> </div> <</if>> - a documentary on the surging Repopulation movement: "Continuing the Dream". After the opening credits, the documentary introduces a young and extremely pregnant woman as the commentator. The program makes an impassioned argument about the need for a new generation of citizens and slaves that were born into the dream of the Free Cities. The woman is wearing semi-conservative business attire, and has on elegant makeup. She looks somewhat plain when compared to the hyper-sexualized style of other FCTV shows, though she does make it plain over the course of the program that she loves sex more than ever. She tends to use herself as an example to show that pregnancy no longer means limitations or sacrifice, instead emphasizing that she's on her fifth pregnancy and would rather be with child than without. + surging Repopulation movement: "Continuing the Dream". After the opening credits, the documentary introduces a young and extremely pregnant woman as the commentator. The program makes an impassioned argument about the need for a new generation of citizens and slaves that were born into the dream of the Free Cities. The woman is wearing semi-conservative business attire, and has on elegant makeup. She looks somewhat plain when compared to the hyper-sexualized style of other FCTV shows, though she does make it plain over the course of the program that she loves sex more than ever. She tends to use herself as an example to show that pregnancy no longer means limitations or sacrifice, instead emphasizing that she's on her fifth pregnancy and would rather be with child than without. <br><br>The woman makes two main points during the course of the documentary. The first is that the combined population of the Free Cities needs to grow explosively for 'Free City Society' to become stable. She points out several economic reasons, including the drive to invest in research and infrastructure. She has interviews with experts explaining the need for independence; that the Free Cities are still dependent on the old world industrially and financially, and that the population must expand dramatically to avoid going down with the metaphorical ship. The more Free Cities there are, the more they become free and independent of the old world. <br><br>The second point concerns the source of the new citizens and slaves that the Free Cities need. Her arguments concerning citizens focus on the unique culture of the Free Cities, and the direction that the future society will take. She points out that immigrants from the old world are rooted in its decaying culture. She asks her viewers how long it took them to adapt to their new lives, and how often they find themselves doubting their new home subconsciously. She admits that even she sometimes finds something wrong or repulsive, until she realizes that it's the ghost of her past life clinging to her. A noted psychologist talks about the strong hold people's earlier lives has on them, and how developing the promise of the Free Cities will need a generation untainted by the old world. The documentary's argument for slaves largely comes down to the fact that second-generation slaves are happier, better adjusted, and simply better slaves. <<if $IntelligenceEugenicsSMR != 0 || $HeightEugenicsSMR != 0 || $FaceEugenicsSMR != 0>> It also points out the practical problems that the mass importation of slaves will cause in the gene pool. <</if>> <br><br>Overall, it's a convincing documentary, if a little too emotional for your tastes. - - <<elseif $arcologies[0].FSGenderFundamentalist == "unset" && _show == 2>> + <<elseif $arcologies[0].FSGenderFundamentalist == "unset" && $show == 2>> <<if $seeImages > 0>> <<set _model.dick = 6>> <<set _model.boobs = 750>> @@ -697,44 +688,42 @@ </div> </div> <</if>> - a documentary on the increasingly-popular Gender Radicalist movement titled: "Power, not Biology". After the opening credits, the documentary introduces an androgynous documentarian in a nicely-cut suit. The finely tailored suit doesn't try to hide the person's breasts, which seem to be a pretty average D-cup. Similarly, another bulge is visible stretching down one of the pants legs. The futanari opens with a pretty simple question: "Am I a man, or am I a woman?" The documentary is focused on answering that question in the context of a modern era where medical science means that genitalia are irrelevant. It argues that a person's body no longer has any relation to their sexuality or ambition, that being free means choosing the body that pleases you most, and that society needs new criteria from which to determine gender. + increasingly-popular Gender Radicalist movement titled: "Power, not Biology". After the opening credits, the documentary introduces an androgynous documentarian in a nicely-cut suit. The finely tailored suit doesn't try to hide the person's breasts, which seem to be a pretty average D-cup. Similarly, another bulge is visible stretching down one of the pants legs. The futanari opens with a pretty simple question: "Am I a man, or am I a woman?" The documentary is focused on answering that question in the context of a modern era where medical science means that genitalia are irrelevant. It argues that a person's body no longer has any relation to their sexuality or ambition, that being free means choosing the body that pleases you most, and that society needs new criteria from which to determine gender. <br><br>The criteria suggested by the documentary is power. The idea is simple; the powerful are male, the weak are female. It argues that the biology and sexual proclivities of a person simply can't represent them any longer. The powerful are often free to choose the body and activities they wish to pursue, while the weak have those decisions made for them. It's a practical argument, and the documentary gives a long list of evidence supporting it, from expert interviews to ancient civilizations that followed a similar idea. The concept is somewhat appealing to you; after all, you wield extraordinary power, and a large part of that power includes altering the bodies of others. Whatever you choose to do, you can't see any reason to let your slaves and citizens criticize you for it. - - <<elseif $arcologies[0].FSGenderRadicalist == "unset" && _show == 2>> + <<elseif $arcologies[0].FSGenderRadicalist == "unset" && $show == 2>> <<if $seeImages > 0>> - <<set _model.faceShape = "masculine">> - <<set _model.waist = 180>> - <<set _model.weight = 180>> - <<set _model.boobs = 0>> - <<set _model.butt = 0>> - <<set _model.hips = -1>> - <<set _model.shoulders = 1>> - <<set _model.dick = 2>> + <<run Object.assign(_model, + { + faceShape: "masculine", waist: 180, + boobs: 0, butt: 0, + hips: -1, shoulders: 1, + dick: 2 + })>> <div class="imageColumn"> <div class="imageRef medImg"> <<= SlaveArt(_model, 2, 0)>> </div> </div> <</if>> - a documentary on conservative Gender Fundamentalism movement titled: "It's Eve, NOT Steve". After the outdated graphics finish displaying the garish opening credits, a portly man in late middle age introduces himself as Reverend Brad, the apparent commentator of the program. You don't pay much attention, but learn that apparently the Futanari Sisters are whore agents of Satan. You also learn that you're apparently destined for hell because of the medical technology in your penthouse that could be used to alter someone's naughty bits. You did get a good laugh when the reverend started yelling that choir boys are boys, and if he wanted a girl he would've found a nun. + conservative Gender Fundamentalism movement titled: "It's Eve, NOT Steve". After the outdated graphics finish displaying the garish opening credits, a portly man in late middle age introduces himself as Reverend Brad, the apparent commentator of the program. You don't pay much attention, but learn that apparently the Futanari Sisters are whore agents of Satan. You also learn that you're apparently destined for hell because of the medical technology in your penthouse that could be used to alter someone's naughty bits. You did get a good laugh when the reverend started yelling that choir boys are boys, and if he wanted a girl he would've found a nun. <br><br>You have to admit that most of the show is complete bullshit, but you can't deny that it's useful for controlling your citizens. As long as they're filling their heads with this bullshit, they won't be getting any dangerous ideas from somewhere else. In a more practical sense, it's a lot easier to manage an arcology and a house full of slaves when you don't have to worry about crazy gender issues or people disliking pregnant slaves. - - <<elseif $arcologies[0].FSSlimnessEnthusiast == "unset" && _show == 3>> + <<elseif $arcologies[0].FSSlimnessEnthusiast == "unset" && $show == 3>> <<if $seeImages > 0>> - <<set _model.dick = 4>> - <<set _model.boobs = 0>> - <<set _model.hLength = 10>> - <<set _model.hColor = "black">> - <<set _model2 = BaseSlave()>> - <<run Object.assign(_model2, { + <<run Object.assign( + _model, { + dick: 4, boobs: 0, + hLength: 10, hColor: "black" + }, + _model2, { devotion: 0, trust: 0, hLength: 50, hStyle: "luxurious", hColor: "blonde", boobs: 700, boobShape: "perky", waist: 180, butt: 3, hips: 3, clothes: "a ball gown", shoes: "heels" - })>> + } + )>> <div class="imageColumn"> <div class="imageRef medImg"> @@ -745,10 +734,9 @@ </div> </div> <</if>> - a documentary on the growing Asset Expansionist movement titled: "More of a Good Thing". After a brief set of opening credits the documentary dives immediately into short clips of numerous interviews with stacked women stating that they love having big tits and a big ass. Eventually, a man and woman are introduced as the hosts of the program. Both are finely dressed in the recent fashions, and despite the subject of the documentary, they don't have humongous assets. The woman does have huge breasts, wide hips, and a large derrière; the man has a noticeable bulge in his pants, but nothing extreme. The hosts explain that seeing Asset Expansionism as a call for ridiculous size is something of a misconception. They emphasize that it's about the freedom to enjoy more of a good thing. + growing Asset Expansionist movement titled: "More of a Good Thing". After a brief set of opening credits the documentary dives immediately into short clips of numerous interviews with stacked women stating that they love having big tits and a big ass. Eventually, a man and woman are introduced as the hosts of the program. Both are finely dressed in the recent fashions, and despite the subject of the documentary, they don't have humongous assets. The woman does have huge breasts, wide hips, and a large derrière; the man has a noticeable bulge in his pants, but nothing extreme. The hosts explain that seeing Asset Expansionism as a call for ridiculous size is something of a misconception. They emphasize that it's about the freedom to enjoy more of a good thing. <br><br>The documentary makes several arguments in favor of the movement, and is clear about explaining the natural biological attraction humans have to large assets. By interviewing stacked members of the movement and psychological experts alike, they try to demonstrate how larger assets lead to happier and more pleasurable lives, both in and out of the bedroom. The documentary neatly tops off its argument by demonstrating how assets have been expanding naturally since the start of the twentieth century, and claiming that it's silly to idolize the way humans looked before modern nutrition and medicine. Western countries in the old world already had average bust sizes of D-cup or larger by the turn of the century, the hosts claim that trying to go back to smaller sizes is synonymous with reducing the prosperity of free citizens. - - <<elseif $arcologies[0].FSAssetExpansionist == "unset" && _show == 3>> + <<elseif $arcologies[0].FSAssetExpansionist == "unset" && $show == 3>> <<if $seeImages > 0>> <<set _model.weight = -30>> <<set _model.butt = 0>> @@ -760,32 +748,35 @@ </div> </div> <</if>> - a documentary on the Slimness Enthusiast counter movement titled: "Slim Is In". Artistic opening credits play across the screen before a slim woman walks up and begins talking to the camera conversationally. She seems to be in her mid to late thirties, and is wearing conservative makeup to accent her natural beauty. Her narrow waist combines with her slim hips and full shoulders to create a balanced but muted hourglass profile. It's a look that was popular for decades on fashion models in the old world, and it improves the attractiveness of her B- or C-cup breasts and taut butt. It's obvious that the woman aspires to be a role model in addition to being the documentary's commentator. + Slimness Enthusiast counter movement titled: "Slim Is In". Artistic opening credits play across the screen before a slim woman walks up and begins talking to the camera conversationally. She seems to be in her mid to late thirties, and is wearing conservative makeup to accent her natural beauty. Her narrow waist combines with her slim hips and full shoulders to create a balanced but muted hourglass profile. It's a look that was popular for decades on fashion models in the old world, and it improves the attractiveness of her B- or C-cup breasts and taut butt. It's obvious that the woman aspires to be a role model in addition to being the documentary's commentator. <br><br>Much of the documentary's arguments center around the concept of fashion and the privileged. They point out how in the past societal changes have altered what people find attractive, giving skin tans as an example. When most worked outside and only the privileged stayed indoors pale skin was considered attractive. When the world changed and most people worked indoors, suddenly the tan skin of those with leisure time to spend outside came into vogue. She argues that modern hormones can easily expand the assets of the masses, but that only the privileged can afford to sculpt themselves into an ideal form like hers. She points out that even though the masses may imitate with surgery, they'll never be able to copy the naturally good bone structure and vibrancy of the well-bred elite. - - <<elseif $arcologies[0].FSTransformationFetishist == "unset" && _show == 4>> + <<elseif $arcologies[0].FSTransformationFetishist == "unset" && $show == 4>> /* Health condition of 70 */ <<if $seeImages > 0>> - <<set _model.devotion = 100>> - <<set _model.trust = 100>> - <<set _model.health.condition = 70>> - <<set _model.health.health = _model.health.condition - _model.health.shortDamage - _model.health.longDamage>> - <<set _model.hLength = 50>> - <<set _model.hStyle = "luxurious">> - <<set _model.hColor = "blonde">> - <<set _model.boobs = 700>> - <<set _model.boobShape = "perky">> - <<set _model.waist = 180>> - <<set _model.butt = 3>> - <<set _model.hips = 3>> - <<set _model.clothes = "a ball gown">> - <<set _model.shoes = "heels">> - <<set _model2 = BaseSlave()>> - <<run Object.assign(_model2, { - dick: 4, boobs: 0, - hLength: 10, hColor: "grey", - clothes: "conservative clothing", shoes: "flats" - })>> + <<run Object.assign( + _model, { + devotion: 100, + trust: 100, + hLength: 50, + hStyle: "luxurious", + hColor: "blonde", + boobs: 700, + boobShape: "perky", + waist: 100, + butt: 3, + hips: 3, + clothes: "a ball gown", + shoes: "heels" + }, + _model2, { + dick: 4, + boobs: 0, + hLength: 10, + hColor: "grey", + clothes: "conservative clothing", + shoes: "flats" + } + )>> <div class="imageColumn"> <div class="imageRef medImg"> @@ -796,10 +787,9 @@ </div> </div> <</if>> - a documentary on the spreading Body Purist movement titled: "Don't Settle for Imitations". The opening credits are displayed over a series of comparison images showing beautiful breasts and asses next to obviously artificial imitations of the same. The screen splits and shows the two hosts in their own environments side by side. One is an extremely attractive doctor, her body is exquisitely curvy underneath her lab coat and her face is an impossible combination of beautiful and cute. The other host is an artist with graying hair; he's working in his studio to create a life-size sculpture of the first host. He starts off the documentary by asking why people are so eager to destroy the natural beauty of the human form. The doctor continues by asking why people are so impatient that they get implants instead of using a superior process of targeted hormonal growth. + spreading Body Purist movement titled: "Don't Settle for Imitations". The opening credits are displayed over a series of comparison images showing beautiful breasts and asses next to obviously artificial imitations of the same. The screen splits and shows the two hosts in their own environments side by side. One is an extremely attractive doctor, her body is exquisitely curvy underneath her lab coat and her face is an impossible combination of beautiful and cute. The other host is an artist with graying hair; he's working in his studio to create a life-size sculpture of the first host. He starts off the documentary by asking why people are so eager to destroy the natural beauty of the human form. The doctor continues by asking why people are so impatient that they get implants instead of using a superior process of targeted hormonal growth. <br><br>The documentary keeps up the two-viewpoint style and approaches the issue from two directions. The first is the stark aesthetic differences between natural and artificial bodies. It demonstrates why implants always fall short of the beauty they seek to imitate, and how those with implants are doomed to a vicious cycle of surgery to try and recapture the beauty they lost in the initial surgery. The other angle, presented by the doctor, is a lot more practical. It points out the numerous shortcomings of implants when compared to natural growth, such as the frequent need for maintenance surgeries, the significant extra health risks, the reduced pleasure and sensitivity felt by implant patients, and the extreme difficulty of a patient to get what they want. Taken together the argument is pretty simple: why get implants when other medical options are cheaper, safer, more effective, healthier, and more attractive? - - <<elseif $arcologies[0].FSBodyPurist == "unset" && _show == 4>> + <<elseif $arcologies[0].FSBodyPurist == "unset" && $show == 4>> <<if $seeImages > 0>> <<set _model2 = BaseSlave()>> <<set _model2.dick = 4>> @@ -812,9 +802,8 @@ </div> </div> <</if>> - a documentary on the rise of the Transformation Fetish titled: "The Mass Insanity of Adding Mass". The opening credits are styled to look like a psychological case study from a mental institution. When the credits finish, the video cuts to a scene of a man sitting behind a desk, the whole shot is high contrast due to the harsh lighting from a lone desk lamp. The middle-aged man screams 'hard-boiled' and looks like he walked straight out of a noir film to host this documentary. His opening monologue makes it pretty clear that this documentary has a lot of parallels with a crime documentary. Worse, is that the evidence and expert witnesses available to the producers were apparently overwhelming, because the program seems rushed trying to fit as much as it can into a narrow time slot. + rise of the Transformation Fetish titled: "The Mass Insanity of Adding Mass". The opening credits are styled to look like a psychological case study from a mental institution. When the credits finish, the video cuts to a scene of a man sitting behind a desk, the whole shot is high contrast due to the harsh lighting from a lone desk lamp. The middle-aged man screams 'hard-boiled' and looks like he walked straight out of a noir film to host this documentary. His opening monologue makes it pretty clear that this documentary has a lot of parallels with a crime documentary. Worse, is that the evidence and expert witnesses available to the producers were apparently overwhelming, because the program seems rushed trying to fit as much as it can into a narrow time slot. <br><br>Evidence and whatever else be damned, this isn't the kind of documentary that should be on the FCTV stream in your arcology. You tell $assistant.name to remind you to send a complaint in the morning. - <<else>> <<if $seeImages > 0>> <<set _model.belly = 10000>> @@ -827,7 +816,7 @@ </div> </div> <</if>> - a documentary on the surging Repopulation movement: "Continuing the Dream". After the opening credits, the documentary introduces a young and extremely pregnant woman as the commentator. The program makes an impassioned argument about the need for a new generation of citizens and slaves that were born into the dream of the Free Cities. The woman is wearing semi-conservative business attire, and has on elegant makeup. She looks somewhat plain when compared to the hyper-sexualized style of other FCTV shows, though she does make it plain over the course of the program that she loves sex more than ever. She tends to use herself as an example to show that pregnancy no longer means limitations or sacrifice, instead emphasizing that she's on her fifth pregnancy and would rather be with child than without. + surging Repopulation movement: "Continuing the Dream". After the opening credits, the documentary introduces a young and extremely pregnant woman as the commentator. The program makes an impassioned argument about the need for a new generation of citizens and slaves that were born into the dream of the Free Cities. The woman is wearing semi-conservative business attire, and has on elegant makeup. She looks somewhat plain when compared to the hyper-sexualized style of other FCTV shows, though she does make it plain over the course of the program that she loves sex more than ever. She tends to use herself as an example to show that pregnancy no longer means limitations or sacrifice, instead emphasizing that she's on her fifth pregnancy and would rather be with child than without. <br><br>The woman makes two main points during the course of the documentary. The first is that the combined population of the Free Cities needs to grow explosively for 'Free City Society' to become stable. She points out several economic reasons, including the drive to invest in research and infrastructure. She has interviews with experts explaining the need for independence; that the Free Cities are still dependent on the old world industrially and financially, and that the population must expand dramatically to avoid going down with the metaphorical ship. The more Free Cities there are, the more they become free and independent of the old world. <br><br>The second point concerns the source of the new citizens and slaves that the Free Cities need. Her arguments concerning citizens focus on the unique culture of the Free Cities, and the direction that the future society will take. She points out that immigrants from the old world are rooted in its decaying culture. She asks her viewers how long it took them to adapt to their new lives, and how often they find themselves doubting their new home subconsciously. She admits that even she sometimes finds something wrong or repulsive, until she realizes that it's the ghost of her past life clinging to her. A noted psychologist talks about the strong hold people's earlier lives has on them, and how developing the promise of the Free Cities will need a generation untainted by the old world. The documentary's argument for slaves largely comes down to the fact that second-generation slaves are happier, better adjusted, and simply better slaves. <<if $IntelligenceEugenicsSMR != 0 || $HeightEugenicsSMR != 0 || $FaceEugenicsSMR != 0>> @@ -835,34 +824,39 @@ <</if>> <br><br>Overall, it's a convincing documentary, if a little too emotional for your tastes. <</if>> + <<run FCTV.incrementShow()>> <<case 10>> <<run FCTV.incrementChannel()>> <<if $seeImages > 0>> - <<set _mindy = BaseSlave()>> - <<set _mindy.devotion = 100>> - <<set _mindy.trust = 100>> - <<set _mindy.health.condition = 70>> - <<set _mindy.health.health = _mindy.health.condition - _mindy.health.shortDamage - _mindy.health.longDamage>> - <<set _mindy.hLength = 50>> - <<set _mindy.hStyle = "luxurious">> - <<set _mindy.hColor = "strawberry blonde">> - <<set _mindy.boobs = 1400>> - <<set _mindy.nipples = "huge">> - <<set _mindy.boobShape = "perky">> - <<set _mindy.areolae = 4>> - <<set _mindy.waist = 180>> - <<set _mindy.butt = 3>> - <<set _mindy.hips = 3>> - <<set _mindy.clothes = "a string bikini">> + <<set _mindy = GenerateNewSlave("XX"), _mike = GenerateNewSlave("XY")>> + + <<run Object.assign( + _mindy, { /* Health condition of 70 */ + devotion: 100, + trust: 100, + hLength: 50, + hStyle: "luxurious", + hColor: "strawberry blonde", + boobs: 1400, + nipples: "huge", + boobShape: "perky", + areolae: 4, + waist: 180, + butt: 3, + hips: 3, + clothes: "a string bikini" + }, + _mike, { + dick: 7, + faceShape: "masculine", + boobs: 0, + hLength: 10, + hColor: "dark brown", + clothes: "sport shorts" + } + )>> - <<set _mike = BaseSlave()>> - <<set _mike.dick = 7>> - <<set _mike.faceShape = "masculine">> - <<set _mike.boobs = 0>> - <<set _mike.hLength = 10>> - <<set _mike.hColor = "dark brown">> - <<set _mike.clothes = "sport shorts">> <div class="imageColumn"> <div class="imageRef medImg"> <<= SlaveArt(_mindy, 2, 0)>> @@ -872,25 +866,25 @@ </div> </div> <</if>> - which is currently showing a competitive game show 'Cum and Cream Challenge' The program has a short opening sequence showing a variety of male and female contestants competing in a variety of lewd and messy body fluid competitions. The program flashes to a title screen where the letters are being spelled out in white fluids: "CUM and CREAM CHALLENGE". The writing is messy enough to <<if $FCTV.channel[num($FCTV.channel.selected, true)] == 1>>make you wonder<<else>>keep you wondering<</if>> if slaves were actually trained to spell out the text each week, or if it's just some clever camera work. The camera pans up past a large dripping <<if $seeDicks == 0>><i>frankfurter</i><<else>>cock<</if>> and two massive nipples, eventually revealing the two hosts that look to be in their early twenties. <<if $FCTV.channel[num($FCTV.channel.selected, true)] < 2>>A muscular man wearing athletic clothes, and a buxom young woman in a bikini that looks more like a microkini on her large breasts and hips. The pair is helpfully labeled on screen as Mike and Mindy, and as the camera gets closer it reveals that both have rather sizable endowments. Mike's crotch is soaked, and Mindy's bikini top allows small rivulets of milk to stream down from the sodden fabric. <<else>>The fluid enthusiast Mike and Mindy pair are wearing their usual style in new colors, the clothes appearing to be as soddenly wet as any other episode.<</if>> + which is currently showing a competitive game show 'Cum and Cream Challenge' The program has a short opening sequence showing a variety of male and female contestants competing in a variety of lewd and messy body fluid competitions. The program flashes to a title screen where the letters are being spelled out in white fluids: "CUM and CREAM CHALLENGE". The writing is messy enough to <<if FCTV.channelCount(1)>>make you wonder<<else>>keep you wondering<</if>> if slaves were actually trained to spell out the text each week, or if it's just some clever camera work. The camera pans up past a large dripping <<if $seeDicks == 0>><i>frankfurter</i><<else>>cock<</if>> and two massive nipples, eventually revealing the two hosts that look to be in their early twenties. <<if $FCTV.channel[num($FCTV.channel.selected, true)] < 2>>A muscular man wearing athletic clothes, and a buxom young woman in a bikini that looks more like a microkini on her large breasts and hips. The pair is helpfully labeled on screen as Mike and Mindy, and as the camera gets closer it reveals that both have rather sizable endowments. Mike's crotch is soaked, and Mindy's bikini top allows small rivulets of milk to stream down from the sodden fabric. <<else>>The fluid enthusiast Mike and Mindy pair are wearing their usual style in new colors, the clothes appearing to be as soddenly wet as any other episode.<</if>> <br><br> Mindy kicks off the show, speaking to the audience. "Welcome to another episode of Cum and Cream!" <br><br> - <<set _show = random(2)+1>> - <<if (_show == 1 && $FCTV.channel[num(_show, true)] > 3) || $FCTV.channel[num(_show, true)] == 1>> + <<run FCTV.showRange(1, 3)>> + <<if ($show == 1 && FCTV.channelCount(3, 'gt')) || FCTV.channelCount(1, 'eq')>> Mike smoothly continues. "We've got a great show for you tonight! A male-female team challenge!" <br><br>That's right Mike, and this time we've mixed it up! It's a production AND inflation challenge. Just thinking about it has me leaking top and bottom!" <br><br>"You don't have to tell me Mindy, I can see your puddle! In this contest, two teams will compete to produce the largest combined volume of cum and cream. The losing team goes on to a sudden-death inflation contest!" <br><br>Mindy bounces with excitement, sending milk everywhere, and freeing half of one long nipple from her bikini. "All the cum and cream from the previous contest administered anally, first one to tap out goes to the Loser's Pit!" <br><br>You watch with fascination through the contest, hanging on the edge of your seat during the final inflation challenge as the contestants' stomachs bulge further and further. <<if $seeDicks == 0>><i>Everybody smiles and has a good time. The End.</i><<else>>Suddenly, the male's taut stomach shifts and wobbles and he lets out an agonized scream. Medics rush to his side, and it cuts back to the hosts applauding his determination to win.<</if>> - <<elseif (_show == 2 && $FCTV.channel[num(_show, true)] > 3) || $FCTV.channel[num(_show, true)] == 2>> + <<elseif ($show == 2 && FCTV.channelCount(3, 'gt')) || FCTV.channelCount(2, 'eq')>> Mike unexpectedly moves over and starts rubbing Mindy's stomach, the extra attention highlighting how big her stomach is. "Mindy, don't tell me you went and got yourself knocked up... Your belly has gotten downright huge!" <br><br>Mindy laughs and chides Mike. "Oh Mike! You know I'm waiting for the perfect <<if $seeDicks == 0>><i>smile</i><<else>>cock<</if>> before I try out womb inflation!" She uses both hands to grab a handful of each of her large udders. "You know I use my own milk to keep myself pumped up, right? Well these babies have stepped up their production lately, nearly <<if $showInches == 2>>four liters<<else>>a gallon<</if>> a session with my milker. I figure it was my body's way of telling me it's time to step up my inflation game!" <br><br>Mike laughs along with Mindy before reaching over to grab the closest triangle of Mindy's bikini top. Yanking it up off her breast, he gets a firm grip on her nearly <<if $showInches == 2>>4-inch-long<<else>>10-centimeter-long<</if>> milky nipple before bending over and sucking it into his mouth to drink straight from the teat. After a few swallows he straightens up and faces the camera once more. "Wow, delicious as always, Mindy! You should start sending some of that rich cream my way!" <br><br>Mindy didn't look at all bothered by Mike's impromptu snack, and doesn't even attempt to pull her bikini top back into place. "Sure thing Mike, but for now, I'm sure our viewers are dying to know what we've got lined up for the show!" <br><br>Mike nods excitedly. "No new events tonight, but it's still a fan favorite! The Suck n' Gulp Jizz Challenge!" <br><br>"Three hungry ladies, and plenty of <<if $seeDicks == 0>><i>donuts</i><<else>>large studly balls<</if>> ready to feed them... once they've earned it, that is! The scales are ready to measure our contestants before they get started, but first....." - <<elseif (_show == 3 && $FCTV.channel[num(_show, true)] > 3) || $FCTV.channel[num(_show, true)] == 3>> + <<elseif ($show == 3 && FCTV.channelCount(3, 'gt')) || FCTV.channelCount(3, 'eq')>> Both Mike and Mindy are both wearing ecstatic smiles, looking more excited than ever. Mike doesn't try to hide his raging <<if $seeDicks == 0>><i>smile</i><<else>>erection<</if>> as he continues the introduction. "Tonight we have a truly special treat for you, and it's all thanks to Arcology Imperiales!" <br><br>Mindy continues, and makes no attempt to hide the fact that she has one hand stuffed inside her bikini bottom. "Thanks to the wonderful Dr. Picarde, owner of Arcology Imperiales, we have access to three amazing sex slaves for tonight's challenge!" <br><br>Mike nods enthusiastically. "Mindy, tell everyone what makes them so special!" @@ -903,10 +897,11 @@ <br><br>After talking about the surgery, Mindy is openly milking one nipple while her other hand goes wild at her crotch. "Okay Mike, I can't wait anymore, let's start the challenge!" <br><br><br>You watch the challenge, which involves three young contestants with huge <<if $seeDicks == 0>><i>smiles</i><<else>>balls<</if>>, each of them fucking a slave full of cum until one massively swollen stomach finally bursts. <</if>> + <<run FCTV.incrementShow()>> <<case 11>> <<run FCTV.incrementChannel()>> - <<if $usedRemote>>for some foolish reason<</if>><<if $FCTV.channel[num($FCTV.channel.selected, true)] > 1>>, once again,<</if>> + <<if $usedRemote>>for some foolish reason<</if>><<if FCTV.channelCount(1, 'gt')>>, once again,<</if>> which is currently showing an infomercial attempting to sell a product named "sag-B-gone" that claims to be able to prevent breasts from naturally sagging under their own weight. <br><br> <<if $purchasedSagBGone == 1>> @@ -916,7 +911,7 @@ <<setLocalPronouns $Concubine>> "I told you it wouldn't work, <<Master>>. Plu<<s>> you know you can touch the<<s>>e anytime!" $Concubine.slaveName shakes $his chest at you. <</if>> - <<elseif $FCTV.channel[num($FCTV.channel.selected, true)] > 1>> + <<elseif FCTV.channelCount(1, 'gt')>> You could always order a crate to play around with. Who knows, maybe it'll actually work?<<if $PC.dick != 0>> At the very least it should make for some decent lubricant for a titfuck.<</if>> <br> <span id="called"> @@ -960,12 +955,12 @@ <<case 12>> <<run FCTV.incrementChannel()>> - <<if $FCTV.channel[num($FCTV.channel.selected, true)] == 1>> + <<if FCTV.channelCount(1)>> currently airing a drama series about a girl adapting to living in the Free Cities. <<else>> - currently airing another episode of that drama series + currently airing another episode of that drama series. <</if>> - <<if $FCTV.channel[num($FCTV.channel.selected, true)] == 1>> + <<if FCTV.channelCount(1)>> For a moment you consider changing the channel, but you decide to give it a shot. <br><br>The woman posed in the mirror. She was tall for a woman, fair skinned, and wore a keyhole sweater dress. Her scarlet hair was done in a braid down her back and her plump lips were covered in ruby red lipstick. She was slender, but not intolerably so; at the very least, she filled out her dress enough to avoid being arrested for indecency. All in all, the woman's reflection made for a pleasant picture. The only thing detracting from this scene was her glare. <br><br>"Hey Scott, do you have anything a bit more conservative?" The woman asked. "We've been over this." Scott said. "Not showing off your breasts is seen as very rude here." Scott frowned, "Well, that's not entirely correct, but it is seen as distinctly unfriendly; the only girls who don't show some cleavage are frigid cunts and old-worlders fresh off the boat." @@ -981,7 +976,7 @@ <br><br>Scott called out to Cathy, "Come on out and give us a look!" The door to the bathroom opened and Cathy stepped out, tugging at her skirt. The clothing was a simple blouse and skirt affair with a Holstein pattern. In truth, it didn't look like something that would offend old world sensibilities, except for the fact the skirt was so short that her frilly panties were in plain view. <br><br>"Do you have a skirt that's a little longer?" Cathy said and tugged at her skirt again. "It's supposed to look like that." Scott explained. Cathy looked skeptical. "Really?" she asked. Sarah gave Cathy a look that asked if she really was that stupid. "Why would you wear pretty panties and never show anyone?" She asked rhetorically. Cathy started on a hot retort, but was interrupted by Scott. "We'll stop for now and pick this up later. You can put your new clothes away." Cathy sighed, picked up her clothes, and walked out the door. <br><br>Scott stood up and set his daughter on her feet. She turned her back to her father, bent over slightly, and wiggled her bottom meaningfully. Scott smacked her right butt cheek and said, "Off you go." Sarah didn't move. "Daddy" she said pleadingly and wiggled her bottom again. He smacked her left butt cheek. She giggled happily and jiggled out the door. Scott smiled at his daughter's antics, shook his head, and made his way to his bedroom. - <<elseif $FCTV.channel[num($FCTV.channel.selected, true)] == 2>> + <<elseif FCTV.channelCount(2)>> The random function has brought up another episode of that drama series for you. <br><br>On his way to the bedroom he passed through the kitchen and caught sight of June preparing lunch. She was tall for a woman. Her hair was a golden blonde and her figure spoke of her ongoing romance with growth drugs. She wore a black thong and an apron embroidered with the words 'Milk the cook'. Which was rather strange considering she normally wore her 'Rape the cook' apron on Saturdays. But he guessed she was still raw from last night. <br><br>He came up behind her and reached into her apron to give her breasts a squeeze. June made a sound of pleasure in response. "Hello master, are you finished with Cathy for today?" He set his chin on the top of her head. "For the moment. After I've tended to Annie and had lunch, I think I'll take Cathy out for a bit. Maybe take the whole family out for ice cream." @@ -1004,7 +999,7 @@ <br><br>Scott leaned into his wife's breasts to bask in the afterglow. While Annie had coaxed Sarah to turn around, pulled Sarah's cunny to her face and began to slowly eat her daughter out. Sarah just lay bonelessly atop her mother's breasts. <br><br>Scott just enjoyed the sight of mother-daughter bonding for a while before recalling his earlier plans. "I was thinking of taking the family out for ice cream after lunch." Annie made a pleased sound as she continued licking her daughter's cunny, Sarah cheered lazily, Sadie's legs wiggled with what could be called excitement. <br><br>"I was also thinking of taking Cathy with us." Annie stopped sucking on her daughter's clit to frown at him. He made a placating gesture and said, "She won't make a big scene with all of us there and besides you enjoy it when she has a mini freak out." She paused to think for a moment then said, "You have cameras and a drone on her right?" He nodded. "I want copies." She gave him a lusty grin before returning to her meal. He turned Sarah. "I wanna bloom berry sundae with bottom boost sprinkles." He nodded, hooked his head to look behind his wife and said, "How about you Sadie?" The hand that poked out from behind his wife waggled uncertainly, but ultimately became a thumbs up. - <<elseif $FCTV.channel[num($FCTV.channel.selected, true)] == 3>> + <<elseif FCTV.channelCount(3)>> <br><br>After a light lunch, the family assembled in the entry hall. Sarah rode in her mother's cleavage, playing with a tablet as they waited on Cathy. When Cathy made her way into the hall Scott frowned at her. "You're not going out dressed like that." Cathy looked down at herself. "What's wrong with this? This shows of my body well enough, right?" <br><br>She wore jeans and a T-shirt made a few sizes too small by her regimen of growth drug. "Why don't you put on that bikini I gave you?" Cathy just furrowed her brow and said nothing. Scott sighed and said, "Just don't wear pants and show some cleavage. For god's sake, people show more skin at funerals than you do." Cathy frowned, but went back to change. When she came back she was wearing the Holstein pattern skirt and blouse he had given her earlier. "You're going to wear that?" he asked. "What's wrong now?" He raised his hands in a placating gesture. "Nothing, nothing. Let's go." <br><br>The family left, made their way to an elevator and rode it down a few floors before exiting. As they turned the corner onto the street, the creamery came into sight. The family continued onward until Sarah spoke up. "Daddy, where's Cathy?" Scott looked back and saw that Cathy had stopped walking a few <<if $showInches == 2>>feet<<else>>meters<</if>> back. She stood staring wide eyed at the creamery. @@ -1018,7 +1013,7 @@ <br><br>Cathy looked at the cup in confusion. "Shouldn't we head inside?" Scott just gave her a small smile. "Not just yet." An aura of excitement began to build in the crowd. She noticed that most of the crowd wore very little. Most of the women wore underwear or jewelry and nothing else. Cathy just stared at her cup and then looked up and noticed something she'd missed before. A countdown timer in the corner of the creamery's screen. And it had just hit zero. <br><br>The cowslaves mounted above began to moan and a deluge of milk flowed onto the crowd. The crowd cheered and laughed raising their cups high. Some of the women just basked in the spray, rubbing the milk into their skin. Some of the younger children danced and jumped in the puddles that formed. <br><br>While others were reveling in the downpour, Cathy just stood still, exuding the aura of a wet cat. Scott laughed at Cathy's put out expression and took another swig from his cup. "Now we can go in." - <<elseif $FCTV.channel[num($FCTV.channel.selected, true)] == 4>> + <<elseif FCTV.channelCount(4)>> <br><br>A soft gust of air flowed over the family as they passed through the doors to the creamery. Compared to its outward appearance, the creamery's interior was rather rustic. The warmly colored wood and soft amber lighting gave it a close and homey feel, like walking into an old ranch home at sunset. <br><br>The family passed wooden stalls containing a bevy of cowslaves. Each stall had a plaque with the slave's name on it, milking lines snaked down from the ceiling, and above each stall was a screen displaying the cow's sexual exploits. Some of them were chatting with customers, taking selfies with them and recommending products to try. Others were providing more intimate services to their clientele or simply milked themselves and stared at passersby, their smoldering eyes and flushed faces promising every earthly delight one could imagine. Cathy did her best to ignore the goings on around her and focus her attention forward, but couldn't help herself from taking short peeks from the corner of her eye. <br><br>Eventually, the family came to a stop at a dessert counter. Various cakes, pastries, and other treats tempted customers from behind the glass. Each dessert had stylized pictures of the cows that provided the ingredients. One particularly large cake had a picture of adorably deformed and scantily clad construction crew building the cake in a clumsy, but earnest fashion. Above the counter was a series of chalk boards that listed products on the menu, as well as boasting of the day's specials. On top of the counter was a single silver bell. Annie sidled up to the counter, her breasts pressing into the glass. Her daughter reached over from her perch and rung the bell. They didn't have to wait for long before a voice called out to them. "Oh, master! I didn't know you were coming in today." @@ -1039,7 +1034,7 @@ <br><br>Scott pondered her question for a moment, before saying, "Shortly after starting up here, there was a big scandal over slave milk. Apparently, some moron thought adulterating slave milk with actual cow milk was a good idea. As you might guess, it didn't turn out well for him." He took a bite of his ice cream before continuing. "After that, customer trust was at an all-time low. So, I decided to make sure customers could see the whole process right outside the door." He jabbed his cone at her. "That level of transparency made me quite rich and my cows famous. Upstairs, you can buy all sorts of merchandise based on them: clothes, dolls, you name it." He smiled. "There's even a cartoon in the works." Cathy looked at him with a thoughtful expression. "So, that's why?" He gave her a lewd grin. "That, and it's quite sexy. Now, eat your ice cream before it melts." He turned to his wife and daughter. "That goes for you too. Remember, clean your plate, then masturbate." Sarah pulled away from Annie, gobbled down what remained of food, and then pressed her breasts into her mother's face. <br><br>A few minutes later, the family had finished their ice cream and were taking a moment to relax. Sarah rested languidly in her mother's cleavage, basking in the afterglow. Annie shifted uncomfortably. "Feeling pretty sticky. I think mommy is going to go home and take a shower." Scott patted her breast. "Sounds good, I think June and I'll get some shopping done and head back." At the word 'shopping,' Sarah immediately said, "No spinach." Scott looked at his daughter. "Yes spinach. You're not going to grow up to be big and milky like mommy if you don't eat your greens." Sarah pouted and mumbled into her mother's breast, "I want lolimommy cheese curds and a new plushy." Scott ruffled her hair. "We'll see." <br><br>As the family gathered themselves, Cathy held up the remote. "Should we just leave this at the counter?" Annie smiled at her. "Why don't you give her a buzz? I'm sure she'd like it." Cathy gave her a confused frown. Annie sighed and asked, "Kitten, how do you think that gets her attention?" Cathy turned the remote over in her hands. "She would have something that blinked and vibrated when someone used the remote." Annie just looked at her with a serene smile, her eyes twinkling mischievously. With a sudden gasp, Cathy dropped the remote like it had shocked her. A second later, there was a distant squeal and the clatter of a tray hitting the floor. - <<elseif $FCTV.channel[num($FCTV.channel.selected, true)] == 5>> + <<elseif FCTV.channelCount(5)>> <br><br>A moment later, a beet red Cathy was stuttering an apology to an even redder Martha. "Don't worry about it, it was just a pleasant surprise." She smiled and pressed her breasts against Cathy's. "Hope to see you 'round soon darlin'." Marth pulled her into a hug and whispered softly into her ear. "I know it's hard to adjust to, but I think you'll do just fine here." She pressed a piece of paper into Cathy's cleavage and sashayed away. <br><br>Cathy fished it out to see it was an email and phone number with a lip print in bright red lipstick. "Oh my," Annie said, her eyes dancing with amusement. "It looks like you've made a friend." She turned to her husband and said, "I think they'd make a cute couple, wouldn't you?" Scott examined Cathy for a second before nodding. "So long as she makes an honest woman out of her, she has my blessing." Cathy just slowly fumed, her face scarlet in embarrassment. A moment passed before Annie couldn't take it anymore and let out loud, breast quaking, laughter. <br><br>Cathy glared at Annie "She was just being friendly." This just sent Annie into another fit of bosom shaking hysterics. Scott attempted to steady his wife. "Cathy, do you remember the remote she gave you?" She nodded warily. "You don't need one of those to call a waitress. The menus have a button that calls the nearest one to the table," he explained. "Remotes like that are typically reserved for VIPs or favored customers." Her brow furrowed. "But you're the owner! Why wouldn't she leave one with you?" He gave her a small grin and said," Indeed I am, but she gave the remote to you, not me." Cathy thought that over for a second before putting her head in her hands and sulked. @@ -1056,7 +1051,7 @@ <br><br>Cathy took a tentative bite before popping the rest into her mouth. "It's good." Tabby gave her a sunny smile and said, "Thank you! I worked really hard on them." Scott smiled at her fondly and patted her head, "Yes you did." She preened at his praise and let out a sigh of contentment. <br><br>A moment passed in companionable silence, before Scott noticed that Cathy was starting to get antsy. "Anyway, we're going to get some groceries and head on out." Tabby nodded, but couldn't hide her disappointment. "I'll come by tomorrow to check on you and talk to Gabe." He gave her a squeeze and fondly tousled her hair before heading further into the store, Cathy and June in tow. <br><br>They only made it a few paces before an impish gleam entered Scott's eye. He signaled the rest to wait before heading back to the merchandise tables and returned quickly with a pair of plushies in hand. He handed one to Cathy without breaking stride and continued into the store. Cathy looked at the plushie and saw that it was Martha. She sighed and despite her chagrin, clutched the doll to her chest and followed. - <<elseif $FCTV.channel[num($FCTV.channel.selected, true)] == 6>> + <<elseif FCTV.channelCount(6)>> <br><br>By the time Cathy had caught up, June had procured a shopping cart and was making her way to the produce section. A variety of fruits and vegetables tempted passersby, all so enticing that one might think they had been pulled from the canvas of an oil painting. The produce was arranged in finely crafted wooden displays with small chalkboards bearing names and prices written in a tidy hand. Overall, it gave off a rustic charm, like stepping into a small town farmers' market. Detracting from this image somewhat, were a series of screens above the produce. <br><br>The screens displayed what looked like the inside of a greenhouse, although one could be forgiven for not realizing that right away. The LED lamps above gave off an odd magenta light turning the vast swaths of greenery a reddish-black. The odd hue gave the display a rather surreal look. <br><br>While June and Scott were inspecting the produce for freshness, Cathy paused to stare at the screens. "Those are live feeds from the greenhouses," June provided helpfully. Cathy nodded, but continued to stare at the screens, her brow furrowed in confusion. "I got that, but why is it kinda pink?" Scott held an orange to his nose and gave it a quick sniff. "The lights in the greenhouses only produce the wavelengths plants use for photosynthesis. Saves on power, stimulates growth and plant health." He placed the orange in his produce bag. "The carbon dioxide levels are about five times higher than normal in there too." He pressed some produce bags into her hand, "But enough about that, grab some spinach and get a little something for yourself while you're at it." @@ -1071,7 +1066,7 @@ <br><br>Eventually, the party made their way to the star of Blue Barn, the dairy aisle. Display coolers lined the aisle, filled to the brim with milk bottles of various shapes and sizes. Each one bore a printed screen containing a recording of the sexual act that had produced the milk. Whoever was in charge of managing the aisle was kind enough to arrange the milk by kink and sexual act. <br><br>Cathy clutched her plushie and looked around the aisle uncertainty. Scott nudged her. "Go grab a bottle of From the Source, it should be in the titfucking section." She clutched the plushie a little harder then walked down the aisle. <br><br>While she was looking for her quarry, something caught her eye. She squinted at a particular bottle for a moment before reaching in to grab it. With a hesitant finger, she pressed the play button on the bottle. As the video played, a look of dawning horror spread across her face. She was so enthralled with the video, she didn't notice Scott walking up to her. "Oh, did you find something you wanted?" She started and spun to face him, brandishing the bottle at him. "YOU MARRIED YOUR SISTER!?" - <<elseif $FCTV.channel[num($FCTV.channel.selected, true)] == 7>> + <<elseif FCTV.channelCount(7)>> <br><br>The offending bottle was of a higher quality than most of its neighbors, offering a gallery of artists' renditions of the cow in addition to the video. The video on the bottle showed Scott fucking Annie from behind, a slightly tinny slap followed by a squeal from the tiny speakers on the bottle. However, this was not the source of Cathy's distress, as surprising as that may be. Rather, it was the words, Top shelf: All in the Family, printed in red lettering across the bottle. <br><br>Scott cocked an eyebrow, utterly unperturbed. "Yes? And?" Cathy sputtered, but quickly regained her momentum. "You don't do that! Why would do that!?" she all but shrieked, her face blotchy. <br><br>"For two reasons," he said, and held up a finger. "One, have you seen her?" A lewd grin spread across his face, "Rawr." Cathy's blush deepened as her outrage engine built up steam. The grin slid off of Scott's face and his voice grew solemn. "Second, parents can't sell their children if they're already married." @@ -1086,7 +1081,7 @@ <br><br>Scott walked up behind her and slipped his arms around her to grab her breasts. "Doing some early Christmas shopping?" he asked looking over her shoulder. She leaned into him, "Just looking at the new milker you were going to buy for Sarah." He gave her breasts a squeeze as he read the article over her shoulder. "It's a high end model. I'm a very thoughtful father, aren't I?" he said in faux pompous tone, nodding to himself. A small smile spread across June's face. "Of course you are, master." They enjoyed each other's company for a moment before she spoke in a low tone, "Everything alright?" He teased her nipples and spoke in the same tone, "I think I've made some progress with her." He leaned closer to whisper in her ear, "I told you it was a good idea." <br><br>They separated and returned to the cart. While they were having their little chat, Cathy had decided to brave the contents of the erotica section. The look on her face was difficult to describe, but she was reading the book very intently. Scott caught her eye and said, "you can have it, if you want it..." She snapped the book shut, placed it on the shelf, and tried to look as small as possible. He just shrugged in response and looked through the cart before nodding to himself. "I think we're ready to go. Any objections?" June shook her head, but Cathy looked at the shelf for a long second before shaking her head. <br><br>The three gathered up their purchases and headed to the exit. As they were passing through the checkout, Scott noticed a certain book pass amongst their purchases. He turned to give Cathy a look. She was pointedly not looking in his direction when she snatched up the book and made a beeline for the door. When she stepped outside, she noticed something was off about the building, but she couldn't put her finger on it. Scott and June made their way outside to see her gaze flickering over the building. Scott simply smiled at Cathy. Finally, the penny dropped, Cathy glared at him like she was trying to set him on fire with her mind. The upper level of Blue Barn didn't have cows mounted on the wall. Cackling laughter echoed in the street. - <<elseif $FCTV.channel[num($FCTV.channel.selected, true)] == 8>> + <<elseif FCTV.channelCount(8)>> <br><br>Cathy's ire had faded somewhat by the time they made it home. A soft chime rang out as they walked in the door, followed shortly by a faint voice calling out, "Welcome home," from further in the house. The trio put the groceries on the kitchen island and began to put them away. The background murmur of a TV and the faint roar of a hair dryer were coming from the next room. Scott was about to walk into the room, but he paused and looked at the plushie in his hand. He turned and pressed it into June's hands, giving her a meaningful look. She looked at the doll for a moment before returning his look with a smile. Message received. He gave her a quick nod before walking through the door. <br><br>At first glance, the living room didn't look too dissimilar from something of an old-world home decorating magazine. The furniture was well made and comfortable, but was noticeably designed with more robust figures in mind. Books and magazines laid scattered across a number of coffee and end tables. An old copy of <i>Milkers Monthly</i> was opened to a video of a cowslave demonstrating the use of a cleavage vibrator. The shelves on the far wall held a number of statues, their brass figures bearing immobilizing breasts. And on the end was a 1st place ribbon from a school milking competition. <br><br>Annie sat on the couch with a towel around her shoulders, only wearing her exosuit. She relaxed as Sadie went over her vast cleavage with a hair dryer and a towel, letting out noises of contentment as she luxuriated in Sadie's ministrations. Sarah was cuddled up to her mother, her hair still damp from the shower. Scott sat down on the couch and pulled Sarah onto his lap before moving closer to his wife. Sarah just made herself comfortable while Annie leaned over to give him a kiss. "Everything go alright?" He patted his wife's breast reassuringly. "There was a little bump or two, but it went alright. I'll tell you about it later." @@ -1107,13 +1102,13 @@ <<case 13>> <<run FCTV.incrementChannel()>> - <<if $FCTV.channel[num($FCTV.channel.selected, true)] == 1>> + <<if FCTV.channelCount(1)>> <<if $usedRemote>> based off an interesting thumbnail that turns out to be <<else>> - which is + which is currently in <</if>> - currently in the middle of a "real life" documentary. + the middle of a "real life" documentary. <br><br> The mountain roads started getting dangerous when the rains started getting bad. All that water washed away the earth and loosened up rocks that had been there for ages. Rock slides started getting more and more common, so the roads started getting less and less traffic. People with enough money took planes to get across the mountains, and those without money just stayed put. That is until things started getting worse over there. There was an exodus of desperate people leaving some time ago after their government withdrew from the area, and that many vehicles was enough to bring down the rocks and kill hundreds. All that was left back home was those stupid enough to think things would get better, and those smart enough to realize that crossing was death. Now the roads are in pretty bad shape, but occasionally some groups come through. Either stupid or desperate, and either case works for us. <br><br> @@ -1154,11 +1149,11 @@ "Recon, moving out." <br><br> The screen is closed as the pool of heat in the middle slowly cools. The camera and computer are grabbed and the recon team leaves the vantage point. - <<elseif $FCTV.channel[num($FCTV.channel.selected, true)] == 2>> + <<elseif FCTV.channelCount(2)>> <<if $usedRemote>> - another interesting thumbail which is currently in + another interesting thumbail which turns out to be in <<else>> - skipping straight to + skipping straight to <</if>> the middle of yet another "real life" documentary. <br><br> @@ -1201,7 +1196,7 @@ "Are you going to go and protect people, Dad?" A pained grimace crosses over his face as he locks eyes with the nurse who has a very similar expression. After a long moment he turns back with the most genuine smile a father can muster and says, "I sure am, kiddo. I sure am," before turning again to leave. "Good luck." - <<elseif $FCTV.channel[num($FCTV.channel.selected, true)] == 3>> + <<elseif FCTV.channelCount(3)>> currently airing a program about the nuances of slave life. <br><br> The screen fades in with a fly-through shot of what is undoubtedly an arcology penthouse littered with slaves accompanied by a somewhat upbeat piano melody. You recognize many of the traditional additions to a penthouse, though there are some stylistic differences. After a short time the show identifies itself as "The Other Hand" before fading out. @@ -1233,7 +1228,7 @@ <<case 14>> <<run FCTV.incrementChannel()>> - <<if $FCTV.channel[num($FCTV.channel.selected, true)] == 1>> + <<if FCTV.channelCount(1)>> which is currently showing the newest episode of a family-oriented soap opera. The intro shows a beautiful family of three, featuring a husband, wife, and young daughter. When they show the events of the previous episode, it quickly becomes clear that this episode is the finale of the current season of the show. <br> The episode opens with the husband waking up alone in bed and finding a note on his nightstand that his wife had left for him at the end of the previous episode. Through narration in his head, the note is read aloud to the audience. @@ -1351,101 +1346,65 @@ <</if>> <</if>> <<else>> - <<set _slaveOneTimeMinAge = 25>> - <<set _slaveOneTimeMaxAge = 35>> + <<set $slaveOneTimeMinAge = 25>> + <<set $slaveOneTimeMaxAge = 35>> <<set $one_time_age_overrides_pedo_mode = 1>> <<set $oneTimeDisableDisability = 1>> + <<if $arcologies[0].FSSupremacistLawME == 1>> <<set $fixedRace = $arcologies[0].FSSupremacistRace>> <<elseif $arcologies[0].FSSubjugationistLawME == 1>> <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> <<set $fixedRace = _races.random()>> <</if>> + <<if $seeDicks != 100>> - <<set _hostess = GenerateNewSlave("XX")>> + <<set _hostess = GenerateNewSlave("XX"), _nun = GenerateNewSlave("XX")>> <<else>> - <<set _hostess = GenerateNewSlave("XY")>> - <</if>> - <<set _hostess.devotion = 45>> - <<set _hostess.trust = 55>> - <<set _hostess.health.condition = random(60,80)>> - <<set _hostess.health.health = _hostess.health.condition - _hostess.health.shortDamage - _hostess.health.longDamage>> - <<set _hostess.muscles = 60>> - <<if _hostess.weight > 130>> - <<set _hostess.weight -= 100>> - <<set _hostess.waist = random(-10,50)>> - <</if>> - <<set _hostess.behavioralFlaw = "arrogant">> - <<set _hostess.markings = "none">> - <<set _hostess.hLength = 40>> - <<set _hostess.hColor = "brown">> - <<set _hostess.hStyle = "luxurious">> - <<set _hostess.clothes = "a halter top dress">> - <<set _hostess.shoes = "heels">> - - <<set _slaveOneTimeMinAge = 25>> - <<set _slaveOneTimeMaxAge = 35>> - <<set $one_time_age_overrides_pedo_mode = 1>> - <<set $oneTimeDisableDisability = 1>> - <<if $arcologies[0].FSSupremacistLawME == 1>> - <<set $fixedRace = $arcologies[0].FSSupremacistRace>> - <<elseif $arcologies[0].FSSubjugationistLawME == 1>> - <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> - <<set $fixedRace = _races.random()>> + <<set _hostess = GenerateNewSlave("XY"), _nun = GenerateNewSlave("XY")>> <</if>> <<if $seeDicks != 0>> <<set _scientist = GenerateNewSlave("XY")>> <<else>> <<set _scientist = GenerateNewSlave("XX")>> <</if>> - <<set _scientist.devotion = 0>> - <<set _scientist.trust = 0>> - <<set _scientist.health.condition = random(60,80)>> - <<set _scientist.health.health = _scientist.health.condition - _scientist.health.shortDamage - _scientist.health.longDamage>> - <<set _scientist.muscles = 60>> - <<if _scientist.weight > 130>> - <<set _scientist.weight -= 100>> - <<set _scientist.waist = random(-10,50)>> - <</if>> - <<set _scientist.boobs = 0>> - <<set _scientist.butt = 0>> - <<set _scientist.behavioralFlaw = "arrogant">> - <<set _scientist.markings = "none">> - <<set _scientist.hLength = 10>> - <<set _scientist.hStyle = "messy">> - <<set _scientist.eyewear = "glasses">> - <<set _scientist.clothes = "conservative clothing">> - <<set _scientist.shoes = "flats">> - <<set _slaveOneTimeMinAge = 25>> - <<set _slaveOneTimeMaxAge = 35>> - <<set $one_time_age_overrides_pedo_mode = 1>> - <<set $oneTimeDisableDisability = 1>> - <<if $arcologies[0].FSSupremacistLawME == 1>> - <<set $fixedRace = $arcologies[0].FSSupremacistRace>> - <<elseif $arcologies[0].FSSubjugationistLawME == 1>> - <<set _races = setup.filterRacesLowercase.filter(race => race !== $arcologies[0].FSSubjugationistRace)>> - <<set $fixedRace = _races.random()>> - <</if>> - <<if $seeDicks != 100>> - <<set _nun = GenerateNewSlave("XX")>> - <<else>> - <<set _nun = GenerateNewSlave("XY")>> - <</if>> - <<set _nun.devotion = random(45,60)>> - <<set _nun.trust = random(-10)>> - <<set _nun.health.condition = random(60,80)>> - <<set _nun.health.health = _nun.health.condition - _nun.health.shortDamage - _nun.health.longDamage>> - <<set _nun.muscles = 30>> - <<if _nun.weight > 130>> - <<set _nun.weight -= 100>> - <<set _nun.waist = random(-10,50)>> - <</if>> - <<set _nun.behavioralFlaw = "arrogant">> - <<set _nun.markings = "none">> - <<set _nun.hLength = 1>> - <<set _nun.hStyle = "buzzcut">> - <<set _nun.clothes = "a penitent nuns habit">> + <<run Object.assign( + _hostess, { + devotion: 45, + trust: 55, + muscles: 60, + hLength: 40, + hColor: "brown", + hStyle: "luxurious", + clothes: "a halter top dress", + shoes: "heels" + }, + _scientist, { + devotion: 0, + trust: 0, + muscles: 60, + boobs: 0, + butt: 0, + hLength: 10, + hStyle: "messy", + eyewear: "glasses", + clothes: "conservative clothing", + shoes: "flats" + }, + _nun, { + devotion: random(45,60), + trust: random(-10), + muscles: 30, + hLength: 1, + hStyle: "buzzcut", + clothes: "a penitent nuns habit" + } + )>> + + <<run FCTV.FinalTouches(_hostess, 14)>> + <<run FCTV.FinalTouches(_scientist, 14)>> + <<run FCTV.FinalTouches(_nun, 14)>> <<if $seeImages > 0>> <div class="imageColumn"> @@ -1489,11 +1448,7 @@ <<case 15>> <<run FCTV.incrementChannel()>> - <<if $FCTV.channel[num($FCTV.channel.selected, true)] == 1>> - /* - You awaken one morning, just before the break of dawn, and find yourself unable to go back to sleep. Giving up on the idea of returning to slumber, you idly flip through the channels on your TV, finding mostly static or early morning infomercials, until you finally land on a channel broadcasting so early in the morning. - <br><br> - */ + <<if FCTV.channelCount(1)>> aka the Pirate channel.<br> You're greeted by a man with an eyepatch, a bushy black beard, and a crimson bandanna around his head. He's sitting behind a crude looking bamboo desk. Behind him is the backdrop of a sun rising over the ocean and two slaves in tight revealing sailor outfits swabbing the deck. The whole set looks like some sort of tropical pirate theme and you almost change the channel mistaking the show for a kids show when it catches up to you what the pirate is talking about. <br><br> @@ -1513,7 +1468,7 @@ When the weather finishes, she crosses her arms under her breasts, emphasizing the pair barely restrained by the laces of her blouse and barely slipping free after her energetic report, as credits of strange and funny pirate themed names begin to flash across the bottom of the screen, she happily begins to sign off. "We here at Pieces o' Eight thank ye fer trustin' us with yer global news an' weather, from our crew to yours, have a merry day!" <br><br> You flip off the TV. News from a pirate, how novel. - <<elseif $FCTV.channel[num($FCTV.channel.selected, true)] == 2>> + <<elseif FCTV.channelCount(2)>> the pirate themed channel. Apparently this is a live feed produced by a band of pirates and you tuned in right as they board a small pleasure craft. <br><br> Three armed pirates are swiftly sweeping the boat, gathering the passengers, a man, his wife and his two children, on deck and tying them up. The camera is attached to the pirate captain as he sweeps below deck finding their supplies. @@ -1540,24 +1495,26 @@ <<run FCTV.incrementChannel()>> <<if $seeImages > 0>> <<set _indian = BaseSlave()>> - <<set _indian.devotion = 0>> - <<set _indian.trust = 100>> - <<set _indian.weight = -20>> - <<set _indian.boobs = 300>> - <<set _indian.hips = 0>> - <<set _indian.butt = 1>> - <<set _indian.hLength = 50>> - <<set _indian.skin = "very fair">> - <<set _indian.hStyle = "braided">> - <<set _indian.hColor = "black">> - <<set _indian.clothes = "shibari ropes">> + <<run Object.assign(_indian, { + devotion: 0, + trust: 100, + weight: -20, + boobs: 300, + hips: 0, + butt: 1, + hLength: 50, + skin: "very fair", + hStyle: "braided", + hColor: "black", + clothes: "shibari ropes" + })>> <</if>> /* All actors are at least 18 */ <p> As you snuggle in for the night<<if $Concubine != 0>> with your concubine<</if>>, you <<if $usedRemote == 1>>tune to<<else>>begin watching<</if>> the <i>Age of Slavery</i> channel. With so many new types of arcologies emerging, it's sometimes difficult to tell if you are watching events unfolding on a set or in a real arcology with a historical society. </p> - <<if $FCTV.channel[num($FCTV.channel.selected, true)] == 1>> + <<if FCTV.channelCount(1)>> "Well, you did well to win the 'cleanest urchin' contest." <br>Currently you seem to be watching a scene from the industrial revolution, in a smoke smudged brick courtyard by a factory. A stout manager, dressed in a black suit, is leading a thin urchin toward a wooden building built out from the main factory. <br>"Thank you, sir," the urchin gulps. "My mother really needs the money. You promised a shilling?" @@ -1590,7 +1547,7 @@ <br>"Then you need some blasted motivation! I'll pack those bearings in myself!" <br>The youth shrieks, and in a panic sprints around the tank. The man follows closely, and then chases him out the door. With no time to grab his clothing, the youth squirts out bearings as he runs, before making the relative safety of the street, still nude. A camera from the street reveals an interesting surprise as the desperation on the fleeing youth's face shifts to consternation. Heads on the street turn, too, as he drops the last bearings and spurts white over coal black skin. There was more than water in the tank: he's dyed now as black as night from head to toe. <br>Pointing and laughing uproariously, the man flips the eighth bearing into the air before pocketing it again and buttoning up his pants. The camera pans out to show the factory's name as "Titan's Textiles." - <<elseif $FCTV.channel[num($FCTV.channel.selected, true)] == 2>> + <<elseif FCTV.channelCount(2)>> <<if $seeImages > 0>> <div class="imageColumn"> <div class="imageRef medImg"> @@ -1612,14 +1569,11 @@ <br><br> "You know what I am thinking, girls," Dakota muses. "I am thinking this might be an honest mistake." The heads of the other two snap around. "Hear me out. I am wondering if she honestly thinks she's not a whore, simply because she doesn't look like one." <br> The others pause for a moment, then start to laugh. "Ahh, I see where this is going. We could teach her. Yes, let's 'help her out'." <br> Kate pulls out a large makeup kit. "Ordered from Sears and Roebuck by my husband, as a 'makeup' present for his dalliances. For all the times I used it I never got his attention. But you know, maybe I just never used <i>enough</i>." - <br> The camera pans away and when it returns, the Indian girls face is positively caked with the most absurdly overdone makeup you have ever seen. It's both hot and hilarious in the same way. + <br> The camera pans away and when it returns, the Indian girl's face is positively caked with the most absurdly overdone makeup you have ever seen. It's both hot and hilarious in the same way. <<if $Concubine.makeup > 0>> You look at your own concubine's face. - <<set _activeSlave = _slave>> - <<set _slave = $Concubine>> - <<makeupDescription>> + <<= App.Desc.makeup($Concubine)>> It's just the way you like it, but it's nowhere near as messy and overdone as the girl in the show. - <<set _slave = _activeSlave>> <</if>> <br> "Mmmm, good but now the rest of her seems a little plain," Annie frowns. "Don't loose girls wear big boots?" <br> "I can help with that," Dakota smiles. @@ -1658,8 +1612,7 @@ <br> "How do you like our hospitality now?" "Think you'll be back soon to tease our husbands?" <br> Little Cloud lets out an enormous wet belch, then two more as she strains her body. <br> "Hahahaha, her breath smells like whiskey and," Annie says as she eyes Kate, "You, to be frank." They both burst out laughing again. - - <<elseif $FCTV.channel[num($FCTV.channel.selected, true)] == 3>> + <<elseif FCTV.channelCount(3)>> <<if $seeImages > 0>> <<set _indian.hStyle = "messy">> <<set _indian.shoeColor = "#c80000">> @@ -1719,7 +1672,4 @@ <</if>> <<default>> It seems there's a technical error preventing you from streaming; you tell $assistant.name to look into it. -<</switch>> - -<<set $FCTV.channel.last = $FCTV.channel.selected>> -<<run delete $FCTV.channel.selected>> <<run delete $usedRemote>> \ No newline at end of file +<</switch>> \ No newline at end of file diff --git a/src/pregmod/FCTV/seFCTVwatch.tw b/src/pregmod/FCTV/seFCTVwatch.tw index 60ac887e83033842b73f649ccabad4f2fe35450b..77933434d2a71ce3d6731bd3ae88b8fdac5b4d54 100644 --- a/src/pregmod/FCTV/seFCTVwatch.tw +++ b/src/pregmod/FCTV/seFCTVwatch.tw @@ -1,9 +1,9 @@ :: SE FCTV Watch [nobr] <<set $nextButton = "Continue", $nextLink = "Scheduled Event", $returnTo = "Scheduled Event", $showEncyclopedia = 1, $encyclopedia = "FCTV">> -<<set $FCTV.pcViewership.count++, _possibleChannels = [0].concat(FCTV.channels()), $usedRemote = $usedRemote || 0>> +<<set $FCTV.pcViewership.count++, _possibleChannels = [0].concat(FCTV.channels())>> -Tired after a long day, you tell <<if $Concubine > 0>>your concubine: @@.pink;$Concubine.slaveName@@<<else>>$assistant.name<</if>> to turn on the TV and +Tired after a long day, you tell <<if $Concubine>>your concubine: @@.pink;$Concubine.slaveName@@<<else>>$assistant.name<</if>> to turn on the TV and <<if !$usedRemote>> set FCTV to find a random show. Your larger-than-life screen flashes on, and is soon playing content from the popular streaming service. <<if $cheatMode > 0 || $debugMode > 0 || $FCTV.remote>> @@ -52,23 +52,23 @@ Tired after a long day, you tell <<if $Concubine > 0>>your concubine: @@.pink;$C <</for>> <br> - <<if $FCTV.channel.selected == $FCTV.channel.last>>You tuned into this channel last week, you may want choose something else.<br> <</if>> - <span id='all'> </span> - <<if $cheatMode > 0 || $debugMode > 0>> <br> - <<link "Toggle inappropriate">> - <<if _all>> - <<set _all = 0>> + <<if $cheatMode > 0 || $debugMode > 0>> + <<link "Toggle inappropriate" "SE FCTV Watch">> + <<if $all>> + <<set $all = 0>> <<else>> - <<set _all = 1>> + <<set $all = 1>> <</if>> - <<replace '#all'>> - <<if _all>> - There is an audible tone from your screen, which then displays a message: <i>Showing all content, for testing purposes.</i> <br> - <</if>> - <</replace>> <</link>> | <</if>> [[Randomise channel selection|SE FCTV Watch][$usedRemote = 0]] + <<if $FCTV.channel.selected == $FCTV.channel.last>> + <br>You tuned into this channel last week, you may want choose something else. + <</if>> + <<if $all>> + <br>There is an audible tone from your screen, which then displays a message: + <i>Showing all content, for testing purposes.</i> + <</if>> </center> <</if>> diff --git a/src/pregmod/criminalMarkets.tw b/src/pregmod/criminalMarkets.tw index 748463c9075dee405bbb0ab442d8c6c8d37953a4..044f826e8a6e8f5ed291f23a78949f3e0f9391bd 100644 --- a/src/pregmod/criminalMarkets.tw +++ b/src/pregmod/criminalMarkets.tw @@ -1,10 +1,10 @@ :: Criminal Market [nobr] -<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools">> +<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools", $slaveMarket = $weeklyMarket>> <<if ndef $newSlaves>><<set $newSlaves = []>><</if>> <<if $newSlaves.length > 0>> - <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $slaveMarket = $weeklyMarket, $returnTo = "Main", $newSlaveIndex = 0>> + <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $returnTo = "Main", $newSlaveIndex = 0>> <</if>> You board the transport to @@ -41,7 +41,9 @@ You board the transport to <</switch>> -<<= generateMarketSlave($weeklyMarket)>> +<<set _marketResult = generateMarketSlave($weeklyMarket)>> +<<set $activeSlave = _marketResult.slave>> +<<print _marketResult.text>> <br><br> diff --git a/src/pregmod/nuevaUniversidadDeLibertad.tw b/src/pregmod/nuevaUniversidadDeLibertad.tw index d37f37816437209721328a3124cb8c3ed6a8926a..4e57aba5825ae2c1b6034bde2cc9e418722d445c 100644 --- a/src/pregmod/nuevaUniversidadDeLibertad.tw +++ b/src/pregmod/nuevaUniversidadDeLibertad.tw @@ -1,17 +1,19 @@ :: Nueva Universidad de Libertad [nobr] -<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools">> +<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools", $slaveMarket = "NUL">> /* Multi-Purchase Support */ <<if ndef $newSlaves>><<set $newSlaves = []>><</if>> <<if $newSlaves.length > 0>> - <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $slaveMarket = "NUL", $returnTo = "Main", $newSlaveIndex = 0>> + <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $returnTo = "Main", $newSlaveIndex = 0>> <</if>> //Nueva Universidad de Libertad is a unique slave school operating in the Free Cities. Its business model is to offer as close to asexuality as a sex slave can possess. All students have their sex organs surgically removed at a very young age, before the onset of puberty. This is followed by numerous cosmetic surgery alternations, alongside a steady regimen of hormone blockers, throughout their education. The result is an utterly physically androgynous slave. <<if $NUL.schoolUpgrade != 0>><br><br>You have endowed the school with advanced training courses in <<if $NUL.schoolUpgrade == 1>>entertainment and conversation<<else>>the various sexual arts<</if>>. As a major financial supporter of the institution, you also receive a discount on them.<</if>>// <br><br>Nueva Universidad de Libertad offers a fresh graduate for inspection via video call. The interview takes place in said graduate's dormitory. The room is sparse and utilitarian, and immaculately clean. Likely by design, it looks like the set from an old sci-fi movie. -<<= generateMarketSlave("NUL")>> +<<set _marketResult = generateMarketSlave("NUL")>> +<<set $activeSlave = _marketResult.slave>> +<<print _marketResult.text>> <<set _slaveCost = slaveCost($activeSlave)>> <<if $NUL.schoolSale != 0>> <<set _slaveCost = Math.trunc(_slaveCost*0.5)>> diff --git a/src/pregmod/seHuskSlaveDelivery.tw b/src/pregmod/seHuskSlaveDelivery.tw index 1f25c11f6f740648d251e8d1cc3e110df38eebb1..5245458ed8f90e3863892cb6a7bf1dc25e98c4cf 100644 --- a/src/pregmod/seHuskSlaveDelivery.tw +++ b/src/pregmod/seHuskSlaveDelivery.tw @@ -5,18 +5,17 @@ <<set $activeSlaveOneTimeMinAge = parseInt($huskSlave.age)>> <<set $activeSlaveOneTimeMaxAge = parseInt($huskSlave.age)>> <<set $one_time_age_overrides_pedo_mode = 1>> -<<set $ageAdjustOverride = 1>> <<set $fixedNationality = $huskSlave.nationality>> <<if $huskSlave.race != "not important">> <<set $fixedRace = $huskSlave.race>> <</if>> <<if $huskSlave.sex == 2>> - <<set $activeSlave = GenerateNewSlave("XY")>> + <<set $activeSlave = GenerateNewSlave("XY", {mature: 0})>> <<set $activeSlave.boobs = 50>> <<set $activeSlave.boobsImplant = 0>> <<set $activeSlave.boobsImplantType = "none">> <<else>> - <<set $activeSlave = GenerateNewSlave("XX")>> + <<set $activeSlave = GenerateNewSlave("XX", {mature: 0})>> <</if>> <<set $activeSlave.slaveName = "Doll">> diff --git a/src/pregmod/sePlayerBirth.tw b/src/pregmod/sePlayerBirth.tw index 08ae7a3aac954587a7e4045b30fa3420a94abbdb..81d4b8e19bc548269bc4a3ca5fb5b5ffa4de2d3a 100644 --- a/src/pregmod/sePlayerBirth.tw +++ b/src/pregmod/sePlayerBirth.tw @@ -389,6 +389,7 @@ You arrange yourself to give birth, relaxing until your body urges you to begin <<elseif _curBabies > 1>> + <<set _firstChild = 1>> <<for _p = 0; _p < _curBabies; _p++>> <<set _PCDegree = 0>> @@ -405,7 +406,13 @@ You arrange yourself to give birth, relaxing until your body urges you to begin <<set _PCDegree++>> <</if>> - <<if _p == 0>>Your first<<else>>The next<</if>> little <<if $PC.curBabies[_p].genetics.gender == "XX">>girl<<else>>boy<</if>> + <<if _firstChild == 1>> + Your first + <<set _firstChild = 0>> + <<else>> + The next + <</if>> + little <<if $PC.curBabies[_p].genetics.gender == "XX">>girl<<else>>boy<</if>> <<if _identicalChildGen == 1>> looks exactly like the previous; they're identical twins. <<elseif $PC.pregSource == -1>> diff --git a/src/pregmod/slaveOnSlaveFeedingWorkAround.tw b/src/pregmod/slaveOnSlaveFeedingWorkAround.tw index 22bc11a99c1258d3fa6c5cf825706a7700e5e67f..df66a280842c1357eecaffbd3e5fcadc9f515056 100644 --- a/src/pregmod/slaveOnSlaveFeedingWorkAround.tw +++ b/src/pregmod/slaveOnSlaveFeedingWorkAround.tw @@ -101,7 +101,7 @@ /* 4 Liters */ <td> <<for _i = 0; _i < $slaves.length; _i++>> - <div> + <div> <<if $slaves[_i].milkOutput >= 4>> <<if ($slaves[_i].ID != $activeSlave.ID) && $slaves[_i].nipples != "fuckable">> <<set _name = SlaveFullName($slaves[_i])>> @@ -248,7 +248,7 @@ <</if>> </div> <</for>> - + <<if (_eligibilityCum4 == 0)>> <div class="note> You have no slaves capable of producing four liters of cum. diff --git a/src/pregmod/theCattleRanch.tw b/src/pregmod/theCattleRanch.tw index ce0cd6693adc66e4573f4b33b01313d8092194c4..3171f0ffd48014dcb076a6e7e5ed671df2848465 100644 --- a/src/pregmod/theCattleRanch.tw +++ b/src/pregmod/theCattleRanch.tw @@ -1,17 +1,19 @@ :: The Cattle Ranch [nobr] -<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools">> +<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools", $slaveMarket = "TCR">> /* Multi-Purchase Support */ <<if ndef $newSlaves>><<set $newSlaves = []>><</if>> <<if $newSlaves.length > 0>> - <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $slaveMarket = "TCR", $returnTo = "Main", $newSlaveIndex = 0>> + <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $returnTo = "Main", $newSlaveIndex = 0>> <</if>> //The Cattle Ranch is a controversial slave school operating primarily out of Pastoralistic Free Cities. Its business model is to offer the ideal free range dairy cow; one whose tits and belly reach the floor when on all fours. All cattle come optimized for milking, with big breasts and gravid middles. Slave orphans have their heels clipped shortly after birth and are conditioned to believe they are actual livestock, resulting in a mindbreak-like state. Between their wide hips and big butts and their heavy, milky breasts, they are often popular breeding slaves. They rarely display their stock over video call, instead favoring a more hands-on approach. Buyers can visit their local shops to view grazing cattle available for sale. Alternatively, they can watch the calves frolic among their mothers or enjoy the sight of a breeding bull impregnating an empty womb. Cows are also specially trained to respond to spectators banging on the fence; oral awaits if you drop trou for them! <<if $TCR.schoolUpgrade != 0>><br><br>You have endowed <<if $TCR.schoolUpgrade == 1>>a healthy sum of credits to make their breeding bulls available for sale.<<else>>a healthy sum of credits to encourage the sale of heifers.<</if>> As a major benefact<<if $PC.title == 0>>rix<<else>>or<</if>> of the ranch, you also receive a discount on them.<</if>>// <br><br>The Cattle Ranch parades a choice selection of cows for your viewing pleasure. You're free to do as you please to the slaves, as long as you don't cause lasting harm to them.<<if isFertile($PC) && $PC.preg != -1>> You can't help but notice the number of bulls lining up along the fence sniffing at you.<</if>> -<<= generateMarketSlave("TCR")>> +<<set _marketResult = generateMarketSlave("TCR")>> +<<set $activeSlave = _marketResult.slave>> +<<print _marketResult.text>> <<set _slaveCost = slaveCost($activeSlave)>> <<if $TCR.schoolSale != 0>> <<set _slaveCost = Math.trunc(_slaveCost*0.5)>> diff --git a/src/pregmod/theHippolytaAcademy.tw b/src/pregmod/theHippolytaAcademy.tw index a9a3c60c50cb83b9d3cd3b405a5975cdb7725acb..28e813dfc99ee9504c3f5d0ba6c4a6382f60b6ac 100644 --- a/src/pregmod/theHippolytaAcademy.tw +++ b/src/pregmod/theHippolytaAcademy.tw @@ -1,10 +1,10 @@ :: The Hippolyta Academy [nobr] -<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools">> +<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools", $slaveMarket = "HA">> /* Multi-Purchase Support */ <<if ndef $newSlaves>><<set $newSlaves = []>><</if>> <<if $newSlaves.length > 0>> - <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $slaveMarket = "HA", $returnTo = "Main", $newSlaveIndex = 0>> + <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $returnTo = "Main", $newSlaveIndex = 0>> <</if>> // @@ -20,7 +20,9 @@ The Hippolyta Academy is one of the most famous slave bodyguarding schools in al <br><br>The Hippolyta Academy offers a fresh graduate for inspection. The interview takes place in one of the many training areas of the school, where the physical prowess of the candidate can be easily showcased. -<<= generateMarketSlave("HA")>> +<<set _marketResult = generateMarketSlave("HA")>> +<<set $activeSlave = _marketResult.slave>> +<<print _marketResult.text>> <<set _slaveCost = slaveCost($activeSlave)>> <<if $HA.schoolSale != 0>> <<set _slaveCost = Math.trunc(_slaveCost*0.6)>> diff --git a/src/pregmod/wetwareCPUs.tw b/src/pregmod/wetwareCPUs.tw index d1970d04a09ae393ea9859650421a5e3df19136e..fc8d7f0dbc900751419f46fd1c8b8417e6bfa06b 100644 --- a/src/pregmod/wetwareCPUs.tw +++ b/src/pregmod/wetwareCPUs.tw @@ -1,17 +1,19 @@ :: Wetware CPUs [nobr] -<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools">> +<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools", $slaveMarket = "wetware">> /* Multi-Purchase Support */ <<if ndef $newSlaves>><<set $newSlaves = []>><</if>> <<if $newSlaves.length > 0>> - <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $slaveMarket = "wetware", $returnTo = "Main", $newSlaveIndex = 0>> + <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $returnTo = "Main", $newSlaveIndex = 0>> <</if>> //Wetware CPUs offer highly trained slaves with useful career experience at a discount; That is, at the cost of the physical health of the merchandise.// <br><br> -<<= generateMarketSlave("wetware")>> +<<set _marketResult = generateMarketSlave("wetware")>> +<<set $activeSlave = _marketResult.slave>> +<<print _marketResult.text>> <<set _slaveCost = slaveCost($activeSlave)>> <<if $slavesSeen > $slaveMarketLimit>><<set _slaveCost += Math.trunc(_slaveCost*(($slavesSeen-$slaveMarketLimit)*0.1))>><</if>> diff --git a/src/pregmod/widgets/bodySwapReaction.tw b/src/pregmod/widgets/bodySwapReaction.tw index 45f12ae9f12b19f506f57b8c8e5609e7508d8cbe..75f051dfc2c9b403b94677987ea3f547741a6aa5 100644 --- a/src/pregmod/widgets/bodySwapReaction.tw +++ b/src/pregmod/widgets/bodySwapReaction.tw @@ -206,7 +206,7 @@ Now you only have to wait for $him to wake up. $His fingers brush $his lips and $he pauses for a moment,<<if $args[0].fetish == "mindbroken">> as if<</if>> noticing that @@.lime;they are larger now@@ than they once were. <<elseif $args[0].sexualFlaw == "cum addict" && $args[0].lips < $args[1].lips-10>> /* (smaller lip+oral fixation) */ <<if $args[0].devotion > 20>> - $His fingers pause and almost flinch away once they reach $his lips. A second later, they return to confirm $his fear. $His pride and joy are @@.orange;gone.@@ $He lets out a sniff and @@.mediumorchid;tears begin to roll down $his cheeks.@@ + $His fingers pause and almost flinch away once they reach $his lips. A second later, they return to confirm $his fear. $His pride and joy are @@.orange;gone.@@ $He lets out a sniffle and @@.mediumorchid;tears begin to roll down $his cheeks.@@ <<set $args[0].devotion -= 10>> <<else>> $His hand flinches, and $he pulls it away as <<if $args[0].voice == 0>>attempted <</if>>sobs well up from $him. For someone who values $his lips like $him, for them @@.orange;to be gone@@ is a truly @@.mediumorchid;terrible fate.@@ @@ -2282,7 +2282,7 @@ Now you only have to wait for $him to wake up. $His eyes lock on $his lips and $he pauses for a moment,<<if $args[0].fetish == "mindbroken">> as if<</if>> noticing that @@.lime;they are larger now@@ than they once were. <<elseif $args[0].sexualFlaw == "cum addict" && $args[0].lips < $args[1].lips-10>> /* (smaller lip+oral fixation) */ <<if $args[0].devotion > 20>> - $His eyes lock on $his lips and $he recoils. A second later, $he runs $his tongue across them to confirm $his fear. $His pride and joy are @@.orange;gone.@@ $He lets out a sniff and @@.mediumorchid;tears begin to roll down $his cheeks.@@ + $His eyes lock on $his lips and $he recoils. A second later, $he runs $his tongue across them to confirm $his fear. $His pride and joy are @@.orange;gone.@@ $He lets out a sniffle and @@.mediumorchid;tears begin to roll down $his cheeks.@@ <<set $args[0].devotion -= 10>> <<else>> $His eyes lock on $his lips before $he turns $his head from the mirror and <<if $args[0].voice == 0>>attempted <</if>>sobs well up from $him. For someone who values $his lips like $him, for them @@.orange;to be gone@@ is a truly @@.mediumorchid;terrible fate.@@ diff --git a/src/pregmod/widgets/bodyswapWidgets.tw b/src/pregmod/widgets/bodyswapWidgets.tw index ec290653ad3e65ed2e52427acdf222655d89e5dd..531b42fadefaf3d95c60eef654cdd41354aa21d6 100644 --- a/src/pregmod/widgets/bodyswapWidgets.tw +++ b/src/pregmod/widgets/bodyswapWidgets.tw @@ -175,7 +175,7 @@ <<set $args[0].porn.prestigeDesc = $args[1].porn.prestigeDesc>> <<set $args[0].prestigeDesc = $args[1].prestigeDesc>> <<set $args[0].minorInjury = $args[1].minorInjury>> - <<set $args[0].eyeWear = $args[1].eyeWear>> + <<set $args[0].eyewear = $args[1].eyewear>> <<set $args[0].earwear = $args[1].earwear>> <<set $args[0].earsPiercing = $args[1].earsPiercing>> <<set $args[0].armAccessory = $args[1].armAccessory>> diff --git a/src/pregmod/widgets/economyWidgets.tw b/src/pregmod/widgets/economyWidgets.tw index e4de275dca65b4af40e90f5bd4362402fbabc19d..8bb509efc59b5d5dab76c8dfccdf8decaf7d6439 100644 --- a/src/pregmod/widgets/economyWidgets.tw +++ b/src/pregmod/widgets/economyWidgets.tw @@ -458,136 +458,3 @@ <</if>> <</if>> <</widget>> - -/* Call with <<CorpDevBuySell "asset" "Numasset">> TODO: replace eval parse with appropriate functions */ -<<widget "CorpDevBuySell">> -<<set _textboxMLArg = '_'+$args[1]>> -| Trade Qty -<<textbox `'_Num' + $args[0]` `eval(parse('_Num' + $args[0]))`>><<script>>setTextboxMaxLength(State.temporary["textboxMLArg"], 10);<</script>>: -<<link "Buy">> - <<if !Number.isInteger(Number.parseFloat(eval(parse('_Num' + $args[0]))))>> /* Checks if _Numasset is string */ -/* Buy all */ - <<if ["all", "max"].includes(State.temporary[$args[1]].toLowerCase())>> - <<set State.temporary[$args[1]] = Math.floor($corp.Cash/(State.variables[$args[0]+"AssetPrice"] * 500))>> - <<replace `'#'+$args[0]+'AssetsPurchasing'`>> - Bought <<print num(Math.floor($corp.Cash/(State.variables[$args[0]+"AssetPrice"] * 500)))>> units for <<print cashFormat(Math.floor($corp.Cash/(State.variables[$args[0]+"AssetPrice"] * 500))*500*State.variables[$args[0]+"AssetPrice"])>> - <</replace>> - <<set State.variables[$args[0]+"Assets"] += (eval(parse('_Num' + $args[0]))) * 500>> - <<set $corp.Cash -= (eval(parse('_Num' + $args[0]))) * 500 * State.variables[$args[0]+"AssetPrice"]>> - <<replace '#cashOnHand'>> - <<print cashFormat($corp.Cash)>> - <</replace>> - <<replace `'#'+$args[0]+'AssetsDisp'`>> - <<print cashFormat(State.variables[$args[0]+"AssetPrice"] * State.variables[$args[0]+"Assets"])>> (<<print num(Math.floor(State.variables[$args[0]+"Assets"]/500))>> unit<<if State.variables[$args[0]+"Assets"]/500 > 1>>s<</if>>) - <</replace>> - <<replace `'#'+'controls'+$args[0]`>><<CorpDevBuySell $args[0] $args[1]>><</replace>><<script>>setReplaceTextboxMaxLength(State.temporary["textboxMLArg"], 10);<</script>> - <<else>> -/* Error if decimal or not "all" or "max" string */ - <<replace `'#'+$args[0]+'AssetsPurchasing'`>> Please input a round number. <</replace>> - <</if>> -/* Negative number, try again */ - <<elseif Number.parseFloat(eval(parse('_Num' + $args[0]))) < 0>> - <<replace `'#'+$args[0]+'AssetsPurchasing'`>>Please input a positive number.<</replace>> -/* Buy % */ - <<elseif State.temporary[$args[1]].toString().includes("%")>> - <<set _DesPerc = State.temporary[$args[1]]>> - <<set State.temporary[$args[1]] = Math.floor((Math.clamp((Number.parseFloat(State.temporary[$args[1]])/100),0,1)*$corp.Cash)/(State.variables[$args[0]+"AssetPrice"] * 500))>> - <<replace `'#'+$args[0]+'AssetsPurchasing'`>> - Purchased <<print num(State.temporary[$args[1]])>> units (<<print num((State.temporary[$args[1]]*(State.variables[$args[0]+"AssetPrice"] * 50000)/$corp.Cash).toFixed(2))>>% of cash, desired was _DesPerc) - <</replace>> - <<set State.variables[$args[0]+"Assets"] += (eval(parse('_Num' + $args[0]))) * 500>> - <<set $corp.Cash -= (eval(parse('_Num' + $args[0]))) * 500 * State.variables[$args[0]+"AssetPrice"]>> - <<replace '#cashOnHand'>> - <<print cashFormat($corp.Cash)>> - <</replace>> - <<replace `'#'+$args[0]+'AssetsDisp'`>> - <<print cashFormat(State.variables[$args[0]+"AssetPrice"] * State.variables[$args[0]+"Assets"])>> (<<print num(Math.floor(State.variables[$args[0]+"Assets"]/500))>> unit<<if State.variables[$args[0]+"Assets"]/500 > 1>>s<</if>>) - <</replace>> - <<replace `'#'+'controls'+$args[0]`>><<CorpDevBuySell $args[0] $args[1]>><</replace>><<script>>setReplaceTextboxMaxLength(State.temporary["textboxMLArg"], 10);<</script>> -/* Successful buy */ - <<elseif (eval(parse('_Num' + $args[0]))) * 500 * State.variables[$args[0]+"AssetPrice"] < $corp.Cash>> - <<set State.variables[$args[0]+"Assets"] += (eval(parse('_Num' + $args[0]))) * 500>> - <<set $corp.Cash -= (eval(parse('_Num' + $args[0]))) * 500 * State.variables[$args[0]+"AssetPrice"]>> - <<replace '#cashOnHand'>> - <<print cashFormat($corp.Cash)>> - <</replace>> - <<replace `'#'+$args[0]+'AssetsDisp'`>> - <<print cashFormat(State.variables[$args[0]+"AssetPrice"] * State.variables[$args[0]+"Assets"])>> (<<print num(Math.floor(State.variables[$args[0]+"Assets"]/500))>> unit<<if State.variables[$args[0]+"Assets"]/500 > 1>>s<</if>>) - <</replace>> - <<replace `'#'+$args[0]+'AssetsPurchasing'`>><</replace>> -/* Unsuccessful buy but have enough cash for more than 1 unit */ - <<elseif $corp.Cash > 500 * State.variables[$args[0]+"AssetPrice"]>> - <<replace `'#'+$args[0]+'AssetsPurchasing'`>> - The corp can only buy <<print num(Math.floor($corp.Cash/(State.variables[$args[0]+"AssetPrice"] * 500)))>> more unit<<if Math.floor($corp.Cash/(State.variables[$args[0]+"AssetPrice"] * 500)) > 1 >>s<</if>> of $args[0] assets. - <</replace>> - <<set State.temporary[$args[1]] = Math.floor($corp.Cash/(State.variables[$args[0]+"AssetPrice"] * 500))>> - <<replace `'#'+'controls'+$args[0]`>><<CorpDevBuySell $args[0] $args[1]>><</replace>><<script>>setReplaceTextboxMaxLength(State.temporary["textboxMLArg"], 10);<</script>> -/* Unsuccessful buy */ - <<else>> - <<replace `'#'+$args[0]+'AssetsPurchasing'`>>There are insufficient funds for additional purchases.<</replace>> - <</if>> -<</link>> -| <<link "Sell">> - <<if !Number.isInteger(Number.parseFloat(eval(parse('_Num' + $args[0]))))>> -/* Sell all */ - <<if ["all", "max"].includes(State.temporary[$args[1]].toLowerCase())>> - <<replace `'#'+$args[0]+'AssetsPurchasing'`>> - Sold <<print num(Math.ceil((State.variables[$args[0]+"Assets"]-500)/500))>> units for <<print cashFormat(Math.ceil((State.variables[$args[0]+"Assets"]-500)/500)*500*State.variables[$args[0]+"AssetPrice"])>> - <</replace>> - <<set State.temporary[$args[1]] = Math.ceil((State.variables[$args[0]+"Assets"]-500)/500)>> - <<set State.variables[$args[0]+"Assets"] -= eval(parse('_Num' + $args[0])) * 500>> - <<set $corp.Cash += eval(parse('_Num' + $args[0])) * 500 * State.variables[$args[0]+"AssetPrice"]>> - <<replace '#cashOnHand'>> - <<print cashFormat($corp.Cash)>> - <</replace>> - <<replace `'#'+$args[0]+'AssetsDisp'`>> - <<print cashFormat(State.variables[$args[0]+"AssetPrice"] * State.variables[$args[0]+"Assets"])>> (<<if Math.ceil(State.variables[$args[0]+"Assets"]/500) < 1>> < 1 <<else>><<print num(Math.ceil(State.variables[$args[0]+"Assets"]/500))>> <</if>>unit<<if State.variables[$args[0]+"Assets"]/500 > 1>>s<</if>>) - <</replace>> - <<replace `'#'+'controls'+$args[0]`>><<CorpDevBuySell $args[0] $args[1]>><</replace>><<script>>setReplaceTextboxMaxLength(State.temporary["textboxMLArg"], 10);<</script>> -/* Error if decimal or not "all" or "max" string */ - <<else>> - <<replace `'#'+$args[0]+'AssetsPurchasing'`>> Please input a round number. <</replace>> - <</if>> -/* Negative number, try again */ - <<elseif Number.parseFloat(eval(parse('_Num' + $args[0]))) < 0>> - <<replace `'#'+$args[0]+'AssetsPurchasing'`>>Please input a positive number.<</replace>> -/* Sell % */ - <<elseif State.temporary[$args[1]].toString().includes("%")>> - <<set _DesPerc = State.temporary[$args[1]]>> - <<set State.temporary[$args[1]] = Math.ceil((State.variables[$args[0]+"Assets"]-500)/500*(Math.clamp((Number.parseFloat(State.temporary[$args[1]])/100),0,1)))>> - <<replace `'#'+$args[0]+'AssetsPurchasing'`>> - Sold <<print num(State.temporary[$args[1]])>> units (<<print num((State.temporary[$args[1]]*100/((State.variables[$args[0]+"Assets"]-500)/500)).toFixed(2))>>% of $args[0] assets, desired was _DesPerc) - <</replace>> - <<set State.variables[$args[0]+"Assets"] -= eval(parse('_Num' + $args[0])) * 500>> - <<set $corp.Cash += eval(parse('_Num' + $args[0])) * 500 * State.variables[$args[0]+"AssetPrice"]>> - <<replace '#cashOnHand'>> - <<print cashFormat($corp.Cash)>> - <</replace>> - <<replace `'#'+$args[0]+'AssetsDisp'`>> - <<print cashFormat(State.variables[$args[0]+"AssetPrice"] * State.variables[$args[0]+"Assets"])>> (<<if Math.ceil(State.variables[$args[0]+"Assets"]/500) < 1>> < 1 <<else>><<print num(Math.ceil(State.variables[$args[0]+"Assets"]/500))>> <</if>>unit<<if State.variables[$args[0]+"Assets"]/500 > 1>>s<</if>>) - <</replace>> - <<replace `'#'+'controls'+$args[0]`>><<CorpDevBuySell $args[0] $args[1]>><</replace>><<script>>setReplaceTextboxMaxLength(State.temporary["textboxMLArg"], 10);<</script>> -/* Successful sell */ - <<elseif State.variables[$args[0]+"Assets"] > 500 && eval(parse('_Num' + $args[0])) * 500 < State.variables[$args[0]+"Assets"]>> - <<set State.variables[$args[0]+"Assets"] -= eval(parse('_Num' + $args[0])) * 500>> - <<set $corp.Cash += eval(parse('_Num' + $args[0])) * 500 * State.variables[$args[0]+"AssetPrice"]>> - <<replace '#cashOnHand'>> - <<print cashFormat($corp.Cash)>> - <</replace>> - <<replace `'#'+$args[0]+'AssetsDisp'`>> - <<print cashFormat(State.variables[$args[0]+"AssetPrice"] * State.variables[$args[0]+"Assets"])>> (<<if (State.variables[$args[0]+"Assets"]/500) < 1>> < 1 <<else>><<print num(Math.ceil(State.variables[$args[0]+"Assets"]/500))>> <</if>>unit<<if State.variables[$args[0]+"Assets"]/500 > 1>>s<</if>>) - <</replace>> - <<replace `'#'+$args[0]+'AssetsPurchasing'`>><</replace>> -/* Unsuccessful sell but have enough assets for more than 1 unit */ - <<elseif State.variables[$args[0]+"Assets"] > 500>> - <<replace `'#'+$args[0]+'AssetsPurchasing'`>> - The corp can only sell <<print num(Math.ceil((State.variables[$args[0]+"Assets"]-500)/500))>> more unit<<if Math.ceil((State.variables[$args[0]+"Assets"]-500)/500) > 1 >>s<</if>> of $args[0] assets. - <</replace>> - <<set State.temporary[$args[1]] = Math.ceil((State.variables[$args[0]+"Assets"]-500)/500)>> - <<replace `'#'+'controls'+$args[0]`>><<CorpDevBuySell $args[0] $args[1]>><</replace>><<script>>setReplaceTextboxMaxLength(State.temporary["textboxMLArg"], 10);<</script>> -/* Unsuccessful sell */ - <<else>> - <<replace `'#'+$args[0]+'AssetsPurchasing'`>>The corp cannot sell any more $args[0] assets.<</replace>> - <</if>> -<</link>> -<</widget>> diff --git a/src/pregmod/widgets/marketWidgets.tw b/src/pregmod/widgets/marketWidgets.tw deleted file mode 100644 index 517b15aca8f883299eb460568db41c031265cee1..0000000000000000000000000000000000000000 --- a/src/pregmod/widgets/marketWidgets.tw +++ /dev/null @@ -1,38 +0,0 @@ -:: Market Widgets [widget nobr] - -/* -* Look for widgets in passages tagged with "market:marketname" which -* end in "Populate" and calls them all with the second argument -* (an "origins" array) as argument. -* -* Call like <<AddMarketOrigins "marketname" _possibleOrigins>> -*/ - -<<widget "AddMarketOrigins">> -<<if _.isString($args[0]) && _.isArray($args[1])>> - <<set _sanityCheck = '>>', /* to appease sanityCheck */ - _widgets = _(Story.widgets) - .filter(function(wp) { return wp.tags.includes('market:' + $args[0]); }) - .flatMap(function(wp) { - var re = RegExp('<<widget\\s+"([^"]+Populate)"\\s*>>', 'g'); - var match, result = []; - while(match = re.exec(wp.text)) { result.push(match[1]); } - return result; }) - .value()>> - <<silently>><<for _widget range _widgets>> - <<= "<<" + _widget + " $args[1]>>">> - <</for>><</silently>> -<</if>> -<</widget>> - -<<widget "CreateSlaveByOrigin">> -<<silently>> - <<if _.isObject($args[0]) && _.isString($args[0].widget)>> - <<= "<<" + $args[0].widget + " $args[0]>>">> - <<elseif _.isString($args[0])>> - <<= "<<" + $args[0] + " $args[0]>>">> - <<else>> - <<include "Generate Random Slave">> - <</if>> -<</silently>> -<</widget>> diff --git a/src/pregmod/widgets/pregmodBirthWidgets.tw b/src/pregmod/widgets/pregmodBirthWidgets.tw index 97af83b22a264dba2ec1e63ceee1d7e88eb40830..b7987538ee81bdccf11b55f0e2c714220e8aa7fa 100644 --- a/src/pregmod/widgets/pregmodBirthWidgets.tw +++ b/src/pregmod/widgets/pregmodBirthWidgets.tw @@ -673,10 +673,10 @@ <<case "take classes">> <<if (random(1,20) > $suddenBirth)>> - Or $he would have, had allowed it. Since $he can't leave the lesson, $he tries $his best to hold back the upcoming birth, not without your assistant noticing. As punishment for poor planning, especially since this will be a weekly occurrence in $his life, $his birth will be turned into a live broadcast. Blushing strongly, $he begins working on birthing <<if $slaves[$i].counter.birthsTotal == 0>>$his first<<else>>this week's<</if>> baby, trying $his best to hide $his shame. Exhausted from the birth, $he is permitted a short break as $his child is collected to clean $himself up before the lesson is continued. + Or $he would have, had $assistant.name allowed it. Since $he can't leave the lesson, $he tries $his best to hold back the upcoming birth, not without your assistant noticing. As punishment for poor planning, especially since this will be a weekly occurrence in $his life, $his birth will be turned into a live broadcast. Blushing strongly, $he begins working on birthing <<if $slaves[$i].counter.birthsTotal == 0>>$his first<<else>>this week's<</if>> baby, trying $his best to hide $his shame. Exhausted from the birth, $he is permitted a short break as $his child is collected to clean $himself up before the lesson is continued. <<set $humiliation = 1>> <<else>> - During a lesson under , $slaves[$i].slaveName's water breaks. Since $he can't leave the lesson, $he tries $his best to hold back the upcoming birth, not without your assistant noticing. As punishment for poor planning, especially since this will be a weekly occurrence in $his life, $he is forbidden from leaving. Additionally, $his birth will be turned into a live broadcast. + During a lesson under $assistant.name, $slaves[$i].slaveName's water breaks. Since $he can't leave the lesson, $he tries $his best to hold back the upcoming birth, not without your assistant noticing. As punishment for poor planning, especially since this will be a weekly occurrence in $his life, $he is forbidden from leaving. Additionally, $his birth will be turned into a live broadcast. <<set $humiliation = 1>> <<ClothingBirth>> Exhausted from the birth, $he is permitted a short break as <<if $slaves[$i].counter.birthsTotal == 0>>$his first<<else>>this week's<</if>> child is gathered to <<if !canWalk($slaves[$i])>>be cleaned<<else>>clean $himself<</if>> up before the lesson is continued. diff --git a/src/uncategorized/RECI.tw b/src/uncategorized/RECI.tw index c3f03b175394a1ad7f6f229b92d9a030511226bb..4b08f76033808f5d98c38407502d3a819b9b0415 100644 --- a/src/uncategorized/RECI.tw +++ b/src/uncategorized/RECI.tw @@ -255,7 +255,7 @@ You often pepper slaves with questions during this inspection; it helps you gaug <<elseif ($activeSlave.balls == 0)>> Not having ball<<s>> makes it ea<<s>>ier for me, though. The only way my <<s>>oft girldick will come i<<s>> when I take cock. <<elseif ($activeSlave.boobs > 400)>> - Getting a girl'<<s>> body made it ea<<s>>ier for me, though. When I <<s>>ee my<<s>>elf in the mirror, I <<s>>ee a girl with a body made for getting fucked. + Getting a girl'<<s>> body made it ea<<s>>ier for me, though. When I <<if canSee($activeSlave)>><<s>>ee my<<s>>elf in the mirror, I <<s>>ee<<else>>feel my<<s>>elf up, I feel<</if>> a girl with a body made for getting fucked. <<else>> But the training and the rule<<s>> pu<<sh>>ed me through it. <</if>> diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw index 08701f15e8c5a7742bffa2ece6f93cd20e763d21..8c8aa6306f5266e50040823aa45e5fa283fed688 100644 --- a/src/uncategorized/RESS.tw +++ b/src/uncategorized/RESS.tw @@ -44,7 +44,7 @@ <<set _clothesTemp = $activeSlave.clothes>> <<switch $RESSevent>> /*Some events start with the slave naked (any event that starts with the daily inspection, for example). Here we switch their clothing just for the image to load, then switch it back quickly so the player's choice is not messed up.*/ -<<case "age implant" "ara ara" "ass fitting" "back stretch" "bad dream" "bed snuggle" "bondage gear" "bonded love" "breast expansion blues" "cockfeeder resistance" "confident tanning" "devoted educated slave" "devoted exhibition" "devoted lotion" "desperate null" "devoted nympho" "devoted shortstack" "devoted waist" "extreme aphrodisiacs" "fearful balls" "fucktoy tribbing" "gaped asshole" "happy dance" "heavy piercing" "huge naturals" "huge tits" "hugely pregnant" "ignorant horny" "im scared" "implant inspection" "kitchen molestation" "language lesson" "mindbroken morning" "modest clothes" "mods please" "moist pussy" "muscles" "obedient girlish" "obedient idiot" "old PC age difference" "orchiectomy please" "PA flirting" "penitent" "permitted masturbation" "plimb help" "rebellious arrogant" "resistant gelding" "resistant shower" "resting amp" "restricted profession" "restricted smart" "retching cum feeding" "sexy succubus" "shaped areolae" "shift masturbation" "shift sleep" "shower slip" "slave clit on slave" "slave dick huge" "slave dick on slave" "sleeping ambivalent" "sore shoulders" "spa boobs" "subjugation blues" "suppository resistance" "tendon fall" "terrified inspection" "tittymonster inspection" "torpedo squeeze" "transition anxiety" "trusting HG" "unhappy virgin" "used whore" "vocal disobedience" "young PC age difference">> +<<case "age implant" "ara ara" "ass fitting" "back stretch" "bad dream" "bed snuggle" "bondage gear" "bonded love" "breast expansion blues" "cockfeeder resistance" "confident tanning" "devoted educated slave" "devoted exhibition" "devoted lotion" "desperate null" "devoted nympho" "devoted shortstack" "devoted waist" "extreme aphrodisiacs" "fearful balls" "fucktoy tribbing" "gaped asshole" "happy dance" "heavy piercing" "huge naturals" "huge tits" "hugely pregnant" "ignorant horny" "im scared" "implant inspection" "kitchen molestation" "language lesson" "mindbroken morning" "modest clothes" "mods please" "moist pussy" "obedient girlish" "obedient idiot" "old PC age difference" "orchiectomy please" "PA flirting" "penitent" "permitted masturbation" "plimb help" "rebellious arrogant" "resistant gelding" "resistant shower" "resting amp" "restricted profession" "restricted smart" "retching cum feeding" "sexy succubus" "shaped areolae" "shift masturbation" "shift sleep" "shower slip" "slave clit on slave" "slave dick huge" "slave dick on slave" "sleeping ambivalent" "sore shoulders" "spa boobs" "subjugation blues" "suppository resistance" "tendon fall" "terrified inspection" "tittymonster inspection" "torpedo squeeze" "transition anxiety" "trusting HG" "unhappy virgin" "used whore" "vocal disobedience" "young PC age difference">> <<set $activeSlave.clothes = "no clothing">> <<case "whore rebellious">> /* this scene states they are wearing "thick, durable latex with temperature regulation and anchor points for restraint" no matter what they are assigned to wear. */ @@ -60,30 +60,6 @@ <<else>> <<set $activeSlave.clothes = "spats and a tank top">> <</if>> -<<case "lazy evening">> - <<if getLimbCount($activeSlave, 102) > 2>> - <<set $activeSlave.clothes = "an oversized t-shirt">> - <<elseif $activeSlave.boobs > 4000>> - <<set $activeSlave.clothes = "an oversized t-shirt">> /* loose pajama top */ - <<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>> - <<set $activeSlave.clothes = "a halter top dress">> - <<elseif $activeSlave.muscles > 30>> - <<if isItemAccessible.entry("sport shorts", "clothing")>> - <<if $activeSlave.boobs >= 650>> - <<set $activeSlave.clothes = "sport shorts and a sports bra">> - <<else>> - <<set $activeSlave.clothes = "sport shorts">> - <</if>> - <<else>> - <<set $activeSlave.clothes = "spats and a tank top">> - <</if>> - <<elseif $activeSlave.energy > 95>> - /* No custom outfit defined */ - <<else>> - <<set $activeSlave.clothes = "conservative clothing">> - <</if>> -<<case "mean girls">> - <</switch>> <<if $RESSevent == "mean girls">> @@ -802,7 +778,7 @@ One night, you see <<= App.UI.slaveDescriptionDialog($activeSlave)>> <<if (!hasA <<case "shift doorframe">> -Your fucktoys have to eat, sleep, and look after themselves, just like anyone, so they can't spend every moment offering themselves to you. <<if $Concubine != 0>>Your concubine, $Concubine.slaveName<<elseif $HeadGirl != 0>>Your Head Girl, $HeadGirl.slaveName<<elseif $assistant.name == "your personal assistant">>Your personal assistant<<else>>Your personal assistant, <<= capFirstChar($assistant.name)>> <</if>>manages a schedule for them, constantly changing it up to keep the sluts from getting predictable. <<= App.UI.slaveDescriptionDialog($activeSlave)>> has just come on shift. +Your fucktoys have to eat, sleep, and look after themselves, just like anyone, so they can't spend every moment offering themselves to you. <<if $Concubine != 0>>Your concubine, $Concubine.slaveName<<elseif $HeadGirl != 0>>Your Head Girl, $HeadGirl.slaveName<<elseif $assistant.name == "your personal assistant">>Your personal assistant<<else>>Your personal assistant, <<= capFirstChar($assistant.name)>><</if>> manages a schedule for them, constantly changing it up to keep the sluts from getting predictable. <<= App.UI.slaveDescriptionDialog($activeSlave)>> has just come on shift. <br><br> You're at your desk as $he arrives; $his predecessor passes $him on the way out. $activeSlave.slaveName pauses for a moment in the doorway, and then decides to give you a show. $He spreads $his legs until $his <<if $activeSlave.shoes == "heels">> @@ -1315,7 +1291,7 @@ naked ass catching your eye as $he goes. <<case "shift masturbation">> -Your fucktoys have to eat, sleep, and look after themselves, just like anyone, so they can't spend every moment offering themselves to you. <<if $Concubine != 0>>Your concubine, $Concubine.slaveName<<elseif $HeadGirl != 0>>Your Head Girl, $HeadGirl.slaveName<<elseif $assistant.name == "your personal assistant">>Your personal assistant<<else>>Your personal assistant, <<= capFirstChar($assistant.name)>> <</if>>manages a schedule for them, constantly changing it up to keep the sluts from getting predictable. <<= App.UI.slaveDescriptionDialog($activeSlave)>> has just come on shift. +Your fucktoys have to eat, sleep, and look after themselves, just like anyone, so they can't spend every moment offering themselves to you. <<if $Concubine != 0>>Your concubine, $Concubine.slaveName<<elseif $HeadGirl != 0>>Your Head Girl, $HeadGirl.slaveName<<elseif $assistant.name == "your personal assistant">>Your personal assistant<<else>>Your personal assistant, <<= capFirstChar($assistant.name)>><</if>> manages a schedule for them, constantly changing it up to keep the sluts from getting predictable. <<= App.UI.slaveDescriptionDialog($activeSlave)>> has just come on shift. <br><br> And has $he ever come on shift. $He enters your office at something not far removed from a run, displaying evident signs of sexual excitation, a blush visible on $his $activeSlave.skin cheeks. Between $his job, the mild drugs in $his food, and $his life, $he's beside $himself with need. $He realizes you're working and tries to compose $himself, but gives up after a short struggle and flings $himself down on the couch. $He scoots down so $his <<if $activeSlave.butt > 5>>enormous<<elseif $activeSlave.butt > 2>>healthy<<else>>trim<</if>> butt is hanging off the edge of the cushion, and spreads $his legs up and back<<if $activeSlave.belly >= 5000>> to either side of $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<</if>> as wide as they'll go<<if ($activeSlave.boobs > 1000)>>, hurriedly shoving $his tits out of the way<</if>>. $He uses both hands to frantically <<if ($activeSlave.dick > 0) && !canAchieveErection($activeSlave)>> @@ -1347,7 +1323,7 @@ but after a moment $he clearly decides this isn't enough stimulation. $He <<if $ <<case "shift sleep">> -Your fucktoys have to eat, sleep, and look after themselves, just like anyone, so they can't spend every moment offering themselves to you. <<if $Concubine != 0>>Your concubine, $Concubine.slaveName<<elseif $HeadGirl != 0>>Your Head Girl, $HeadGirl.slaveName<<elseif $assistant.name == "your personal assistant">>Your personal assistant<<else>>Your personal assistant, <<= capFirstChar($assistant.name)>> <</if>>manages a schedule for them, constantly changing it up to keep the sluts from getting predictable. <<= App.UI.slaveDescriptionDialog($activeSlave)>> has just come on shift. +Your fucktoys have to eat, sleep, and look after themselves, just like anyone, so they can't spend every moment offering themselves to you. <<if $Concubine != 0>>Your concubine, $Concubine.slaveName<<elseif $HeadGirl != 0>>Your Head Girl, $HeadGirl.slaveName<<elseif $assistant.name == "your personal assistant">>Your personal assistant<<else>>Your personal assistant, <<= capFirstChar($assistant.name)>><</if>> manages a schedule for them, constantly changing it up to keep the sluts from getting predictable. <<= App.UI.slaveDescriptionDialog($activeSlave)>> has just come on shift. <br><br> Though it's late, $he's surprised to find the lights in the master suite off. You had an unusually trying day, so you've retired for the night; you're on the point of sleep when $he comes in<<if $Concubine != 0>>, $Concubine.slaveName nestled under your arm<</if>>. After a moment's hesitation, $activeSlave.slaveName strips quietly and <<if $activeSlave.belly >= 100000>> @@ -1927,7 +1903,7 @@ If you went with $him, you could certainly show off a little. Late one night, <<= App.UI.slaveDescriptionDialog($activeSlave)>> comes to see you. Strangely, several of your other slaves are stealing glances at $him as $he does. $He seems oddly proud of $himself. Asked why, $he says, "It'<<s>> my millenary, <<Master>>. The arcology has logged me getting fucked <<= num(999)>> time<<s>>." The other slaves obviously view it as significant, too. <br><br> -As the Free Cities grow and evolve, slave culture does too. It seems this is a new tradition among obedient sex slaves. $He obviously expects you to do the honors, and it seems the rest of your girls are looking forward to it. +As the Free Cities grow and evolve, slave culture does too. It seems this is a new tradition among obedient sex slaves. $He obviously expects you to do the honors, and it seems the rest of your slaves are looking forward to it. <<case "birthday">> @@ -2487,31 +2463,6 @@ Lately, you've noticed that $he reacts to these <<if canSee($activeSlave)>>sight <<= App.UI.slaveDescriptionDialog($activeSlave)>> is a real work of surgical art. As $he showers, carefully soaping and then moisturizing every <<if $showInches == 2>>inch<<else>>centimeter<</if>> of $his $activeSlave.skin skin, you notice the undeniable eroticism created by the unnatural narrowness of $his middle<<if $activeSlave.belly >= 5000>>, especially given how much $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>belly<</if>> extends past $his sides<</if>>. Though $his hands are by no means large, when $he washes $his sides, $his hands span almost the entire circumference of $his waist. <<if $activeSlave.dick > 0>>Though $he's not sexually aroused, $his cock is visible as $he bathes $himself; $his member and $his narrow waist work together to create a real mélange of gender traits.<<elseif ($activeSlave.boobs > 800) && ($activeSlave.butt > 4)>>$His massive bust and hips work together to create a spectacular hourglass effect; $he's a fantasy $woman made flesh.<<else>>The narrowness of $his waist accentuates $his feminine features.<</if>> -<<case "muscles">> - -Early one morning, <<= App.UI.slaveDescriptionDialog($activeSlave)>> -<<if !canWalk($activeSlave)>> - crawls -<<elseif ($activeSlave.shoes == "heels") || ($activeSlave.shoes == "pumps") || ($activeSlave.shoes == "boots") || ($activeSlave.shoes == "extreme heels")>> - totters -<<elseif $activeSlave.belly >= 10000>> - waddles -<<else>> - walks -<</if>> -past your door stark naked, with a towel thrown over $his shoulder. $He's clearly moving from the gym to the showers after a hard workout; $he's quite the iron pumper and gets up before anyone to protect $his gains. $He notices your gaze, so $he subtly flexes for your benefit. Cords of muscle ripple along $his massive thighs, -<<if $activeSlave.bellyPreg >= 15000>> -<<elseif $activeSlave.bellyPreg >= 10000>> - pregnancy ruined abs, -<<elseif $activeSlave.belly >= 10000>> - hints of what were once abs across $his _belly taut middle, -<<elseif $activeSlave.belly >= 1500>> - broadening abs, -<<else>> - washboard abs, -<</if>> -ripped biceps, and strapping lats. <<if $activeSlave.dick > 2>>$His massive cock completes the picture.<</if>> - <<case "obedient girlish">> <<= App.UI.slaveDescriptionDialog($activeSlave)>> is nice and @@ -4234,55 +4185,6 @@ and flirting with passersby. Or $he would be, if $he weren't surrounded by a gro <</if>> says a third, obviously smitten. "I'd give anything to have a night with $him." -<<case "lazy evening">> - -Although your life as an arcology owner comes with many associated privileges, extended idleness to bask in your luxury is not often among them. Thankfully, $assistant.name knows better than to let you run yourself ragged from the weight of your assorted responsibilities and often allots time in the evenings of your active schedule to simply relax. -<br><br> -Of course, no self respecting arcology owner could be expected to enjoy a lazy night of idle relaxation on their own. As you resolve the last of your most pressing responsibilities for the evening, $assistant.name directs one of your attentive slaves to gently guide you away from the unending burdens of running your arcology. Leaning against the doorway and wearing a facsimile of what an old world $woman might wear on a casual night in, <<= App.UI.slaveDescriptionDialog($activeSlave)>> -<<if !canTalk($activeSlave)>> - asks with a gesture that carries just the right mixture of submission and exaggerated casualness if you'd like to 'hang out.' -<<elseif SlaveStatsChecker.checkForLisp($activeSlave)>> - lisps with exaggerated casualness, "Let'<<s>> hang out, <<Master>>?" -<<else>> - asks with exaggerated casualness, "Want to hang out, <<Master>>?" -<</if>> -<br><br> -$He saunters over and -<<if $activeSlave.belly >= 100000>> - struggles to lower $his _belly form to an obedient kneel -<<elseif $activeSlave.belly >= 10000>> - gingerly lowers $his heavily <<if $activeSlave.bellyPreg > 3000>>gravid<<else>>swollen<</if>> form to an obedient kneel -<<elseif $activeSlave.belly >= 5000>> - gently lowers $his <<if $activeSlave.bellyPreg > 3000>>gravid<<else>>swollen<</if>> form to an obedient kneel -<<else>> - kneels obediently -<</if>> -in front of you, awaiting further direction. -/* If you are updating below, please consider updating the vector art swaps at the top to match. */ -<<if getLimbCount($activeSlave, 102) > 2>> - Clad in an antique T-Shirt referencing some defunct old world website, $his P-Limbs stand in stark contrast — gyros and servomotors against simple thread and cloth. With such tangible examples of the technological prowess of the Free Cities serving as $his limbs, $his <<if $activeSlave.belly >= 5000>>taut <</if>>shirt is an amusing testimonial to how far behind the old world stands in contrast to the new. -<<elseif $activeSlave.boobs > 4000>> - $His breasts are so massive that the front of $his loose pajama top must be unbuttoned. Even so, the protrusion of $his immense breasts<<if $activeSlave.belly >= 5000>> and _belly rounded belly<</if>> from $his chest strains the soft pajama top to it's breaking point. -<<elseif $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>> - As a clever $girl, $his simple<<if $activeSlave.belly >= 5000>>, yet tight around the middle,<</if>> summer dress evokes memories of bygone warm weather days at elite old world colleges — and the sexual conquest of their youthful residents. -<<elseif $activeSlave.muscles > 30>> - $His simple sports bra and compression shorts ensemble does little to conceal $his incredible musculature, <<if $activeSlave.belly >= 1500 && $activeSlave.belly < 5000>>straining to hold up against $his swelling middle and<<elseif $activeSlave.belly >= 5000>>straining to hold up against $his swelling middle and <</if>>glistening with sweat from a recent workout. Despite $his recent exertions, $he's able to maintain utter stillness in the perfect posture of an obedient slave. -<<elseif $activeSlave.energy > 95>> - $He's controlling $his absurd sex drive for the moment in deference to the notion of your relaxation time, but $he clearly wouldn't mind some sex as part of the evening. - <<if $activeSlave.dick > 0>> - <<if canAchieveErection($activeSlave)>> - $His cock is painfully erect<<if $activeSlave.belly >= 10000>> and pressed against the underside of $his belly<</if>>, - <<else>> - $His soft dick is dribbling precum, - <</if>> - <<else>> - $His pussy is visibly soaked, - <</if>> - showing unmistakably how badly $he needs release. -<<else>> - $He keeps $his <<if canSee($activeSlave)>><<= App.Desc.eyesColor($activeSlave)>><<else>>face<</if>> slightly downcast, $his hands lightly smoothing the folds from $his tight skirt while $his breasts visibly rise and fall under $his even tighter blouse<<if $activeSlave.belly >= 5000>>. Between the two, there is little $he can do to cover $his exposed <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>middle<</if>><</if>>. $He's the perfect picture of an attentive little old world <<= $girl>>friend<<if $activeSlave.height > 185>> (though, of course, $he's anything but physically small)<</if>>. -<</if>> - <<case "devoted shortstack">> <<= App.UI.slaveDescriptionDialog($activeSlave)>> comes before you for a routine inspection. The @@ -9014,7 +8916,7 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h <<link "Go out clubbing to make $him feel young again">> <<replace "#result">> - You call out to stop $him, and $he turns obediently to listen; you tell $him to take the day off and meet you that evening for a trip to $arcologies[0].name's most fashionable nightclub. You emphasize slightly that it's a place you prefer to enjoy with a young slave, and $his eyes widen a little at the implied compliment and challenge. Right at the proper time, $he arrives in your office wearing neon $activeSlave.hColor makeup to match $his hair, and a tiny iridescent clubgirl outfit of the same color. The hem of the skirt is barely low enough to conceal $him <<if ($activeSlave.dick > 0)>>dick<<elseif $activeSlave.vagina == -1>>total lack of private parts<<else>>pussy<</if>>, and it's backless. The front is held up by a halter around $his pretty neck, and is <<if ($activeSlave.boobs > 2000)>>specially tailored to cover $his massive tits<<elseif ($activeSlave.boobs > 1000)>>strained by $his big tits<<elseif ($activeSlave.boobs > 300)>>tightly filled by $his healthy tits<<else>>tight against $his flat chest<</if>><<if $activeSlave.belly >= 1500>> and _belly <<if $activeSlave.bellyPreg >= 1500>>pregnant <</if>>belly<</if>>. $He makes a gaudy and very fashionable spectacle, and in response to your <<if canSee($activeSlave)>>look<<elseif canHear($activeSlave)>>whistle<<else>>gentle poke<</if>> $he raises <<if (!hasAnyArms($activeSlave))>>the stumps of $his arms ever so slightly<<if (hasBothArms($activeSlave))>>both arms<<else>>$his arm<</if>> over $his head<</if>> and twirls, shimmying $his body deliciously. + You call out to stop $him, and $he turns obediently to listen; you tell $him to take the day off and meet you that evening for a trip to $arcologies[0].name's most fashionable nightclub. You emphasize slightly that it's a place you prefer to enjoy with a young slave, and $his eyes widen a little at the implied compliment and challenge. Right at the proper time, $he arrives in your office wearing neon $activeSlave.hColor makeup to match $his hair, and a tiny iridescent club<<= $girl>> outfit of the same color. The hem of the skirt is barely low enough to conceal $him <<if ($activeSlave.dick > 0)>>dick<<elseif $activeSlave.vagina == -1>>total lack of private parts<<else>>pussy<</if>>, and it's backless. The front is held up by a halter around $his pretty neck, and is <<if ($activeSlave.boobs > 2000)>>specially tailored to cover $his massive tits<<elseif ($activeSlave.boobs > 1000)>>strained by $his big tits<<elseif ($activeSlave.boobs > 300)>>tightly filled by $his healthy tits<<else>>tight against $his flat chest<</if>><<if $activeSlave.belly >= 1500>> and _belly <<if $activeSlave.bellyPreg >= 1500>>pregnant <</if>>belly<</if>>. $He makes a gaudy and very fashionable spectacle, and in response to your <<if canSee($activeSlave)>>look<<elseif canHear($activeSlave)>>whistle<<else>>gentle poke<</if>> $he raises <<if (!hasAnyArms($activeSlave))>>the stumps of $his arms ever so slightly<<if (hasBothArms($activeSlave))>>both arms<<else>>$his arm<</if>> over $his head<</if>> and twirls, shimmying $his body deliciously. "I hope they let me into the club without checking my I.D., <<Master>>," $he jokes, for which $he receives a swat on $his rear as you head out. With the full day of rest, $he is full of vigor and ready to dance. $He eagerly heads out onto the floor with you, <<if ($activeSlave.skill.entertainment >= 100)>> @@ -11207,7 +11109,7 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h <<if !canTalk($activeSlave)>> $He uses gestures to recount it through $his tears. Apparently while one guy was using $his anus, another thought it was hot and waited for him to be done before using $him in turn, without letting $him rest or clean $himself. It took four cocks total for another slave to notice and rescue $him. <<else>> - $He <<say>>s, a little tearfully, "<<Master>>, thi<<s>> guy wanted to u<<s>>e my butt in public. <<S>>o of cour<<s>>e I let him, and he made me <<s>>it in hi<<s>> lap to do it, and held my leg<<s>> back <<s>>o everyone could <<s>>ee! And then another guy thought it wa<<s>> hot and waited, and then fucked me in my a<<ss>> too. Another girl finally noti<<c>>ed and re<<s>>cued me after four cock<<s>>, <<Master>>. I'm really <<s>>ore." + $He <<say>>s, a little tearfully, "<<Master>>, thi<<s>> guy wanted to u<<s>>e my butt in public. <<S>>o of cour<<s>>e I let him, and he made me <<s>>it in hi<<s>> lap to do it, and held my leg<<if hasBothLegs($activeSlave)>><<s>><</if>> back <<s>>o everyone could <<s>>ee! And then another guy thought it wa<<s>> hot and waited, and then fucked me in my a<<ss>> too. Another <<s>>lave finally noti<<c>>ed and re<<s>>cued me after four cock<<s>>, <<Master>>. I'm really <<s>>ore." <</if>> $He <<if canSee($activeSlave)>>looks up at you with big <<= App.Desc.eyesColor($activeSlave)>><<else>>gazes at you<</if>> for a long moment, a final tear leaking down $his $activeSlave.skin cheek, before $he suddenly <<if !canTalk($activeSlave)>> @@ -13710,105 +13612,6 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h <</replace>> <</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>> -<<case "muscles">> - -<<link "Reward $him for $his gains">> - <<replace "#result">> - You tell $him to spread $his towel on the floor and lie - <<if $activeSlave.belly >= 5000>> - on $his side on it. You lie next to $him and - <<else>> - face-down on it. You - <</if>> - run your hands across $his sweaty <<if $seeRace == 1>>$activeSlave.race <</if>>muscles before giving $him a thorough, skillful and very intense massage. $He moans and grunts as you work the lactic acid out of $his muscles, slowly reducing $him to a puddle of ripped sex slave. As you're rubbing $him down to finish the massage, $he meekly begs you to fuck $him. - <<if !canDoVaginal($activeSlave) && !canDoAnal($activeSlave)>> - You tell $him that's not an option and pull $him into a kiss instead. It's a strange sensation, this mass of muscle lying quietly still in your arms you, whimpering with delight as you gently make out with $him. Your wandering hands eventually tip $him over the edge; $he hugs you tight as $he shakes with orgasm. Once $he stops crushing you, you return to enjoying $his sweaty body. - <<else>> - As $he lies still, - <<if $PC.dick == 0>> - you lift one of $his legs and straddle yourself in to bring your groin against $hers. It's a strange sensation, this mass of muscle lying quietly still beneath you, whimpering with delight as you gently scissor yourself against $him. $He comes in no time at all. When $he does $he squeezes you between vicelike thighs,<<if $PC.vagina != -1>> pressing your pussy deliciously and<</if>> bringing you to climax, too. - <<else>> - you slowly push your cock into $his - <<if canDoVaginal($activeSlave)>> - pussy; $he's so relaxed from the massage that it slides in easily. - <<= VCheck.Vaginal()>> - It's a strange sensation, this mass of muscle lying quietly still beneath you, whimpering with delight as you gently penetrate $him. $He comes in no time at all. When $he does you happen to be halfway inside $him; $he wraps $his legs around you and pulls you into $his depths. You explode into $him as $he holds you in place with $his vicelike thighs. - <<else>> - ass; $he's so relaxed from the massage that it slides in easily. - <<= VCheck.Anal()>> - It's a strange sensation, this mass of muscle lying quietly still beneath you, whimpering with delight as you gently take $his ass. $He comes in no time at all. When $he does you happen to be halfway inside $him; $his sphincter mercilessly squeezes your head while $his muscular buttocks clench your shaft between them. You explode into $him. - <</if>> - <</if>> - <<if $activeSlave.dick != 0>>As $he stands, $his now-softening penis drips cum. <</if>> - <</if>> - @@.hotpink;$His love for you has increased.@@ - <<set $activeSlave.devotion += 4>> - <</replace>> -<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && canDoAnal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>> -<br><<link "Take advantage of $his gains with a powerfuck">> - <<replace "#result">> - It's time to see if $he's got anything left in those sore <<if $seeRace == 1>>$activeSlave.race <</if>>muscles. You push the towel off $his shoulder, take a lick of the delicious salty sweat along $his collarbone, and get to work. For the next hour, you put $him through a series of sexual positions that require $him to balance and support $himself in difficult positions. $He hangs from the ceiling, goes up on one tiptoe, and fucks in a handstand. $He's as muscular inside as $he is outside. - <<if $PC.dick == 0>> - You climax repeatedly, mixing your pussy juice with $his sweat all across $his body. - <<else>> - <<if canDoVaginal($activeSlave)>> - <<= VCheck.Vaginal()>> - You come repeatedly, and before long cum is dripping out of $his pussy as you continue. - <<elseif canDoAnal($activeSlave)>> - <<= VCheck.Anal()>> - You come repeatedly, and before long cum is dripping out of $his ass as you continue. - <<else>> - You come repeatedly, leaving ropes of your cum all across $his sweaty body. - <</if>> - <</if>> - <<if $activeSlave.dick != 0>>From position to position, $his erection adds its own fluids to the mess on the floor. <</if>>By the end, $he's shaking from muscle fatigue and panting $his gratitude. @@.mediumaquamarine;$His confidence in $his place has increased.@@ - <<set $activeSlave.trust += 4>> - <</replace>> -<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && canDoAnal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>> -<<if ($activeSlave.toyHole == "dick" || $sexualOpeness == 1) && canPenetrate($activeSlave) && $activeSlave.belly < 100000>> - <br><<link "See if $he can put those gains to good use">> - <<replace "#result">> - It's time to see if $he's got anything left in those sore <<if $seeRace == 1>>$activeSlave.race <</if>>muscles. You order $him to take you in a standing fuck<<if $PC.belly >= 10000>>, a tall order given how pregnant you are<</if>>. Despite how exhausted $he is, $he manages to lift you and hilt $himself in your - <<if $PC.vagina != -1>> - pussy. - <<else>> - ass. - <</if>> - You feel $his quivering trying to hold you up, so you permit $him to take you against the wall; a welcome respite for the - <<if $activeSlave.belly >= 5000>> - <<if $activeSlave.bellyPreg >= 3000>> - <<if $activeSlave.belly >= 100000>>massively <<elseif $activeSlave.belly >= 10000>>hugely <</if>>pregnant - <<elseif $activeSlave.bellyFluid >= 5000>> - $activeSlave.inflationType filled - <<else>> - _belly bellied - <</if>> - <</if>> - sweaty - <<if $activeSlave.physicalAge > 30>> - MILF. - <<elseif $activeSlave.physicalAge > 17>> - slave<<= $girl>>. - <<elseif $activeSlave.physicalAge > 12>> - teenager. - <<else>> - kid. - <</if>> - $He dominantly fucks you, $his muscles flexing powerfully with every thrust. You're no slouch when it comes to muscles yourself, so when you feel $him tense with orgasm you wrap your legs around $him and hilt $him deep inside you. This only encourages $him to fuck you harder, quickly bring you to climax as well. $He gently carries you to your couch, where $he slides in behind you for a little post-coitus spooning. You definitely appreciate $his gains after such a good fuck. @@.mediumaquamarine;$His confidence in $his place has increased,@@ as has $his @@.hotpink;love for you.@@ - <<set $activeSlave.trust += 4, $activeSlave.devotion += 4>> - <<run seX($activeSlave, "penetrative", $PC, "vaginal")>> - <<if canImpreg($PC, $activeSlave)>> - <<= knockMeUp($PC, 50, 0, $activeSlave.ID)>> - <</if>> - <</replace>> - <</link>> //This option will penetrate you// -<</if>> -<br><<link "Compliment $his gains and send $him on $his way">> - <<replace "#result">> - $He finishes posing with an impressive display of $his obliques. $He walks powerfully to the shower, $his ripped buttocks delineating each step. The shower is glass-walled. As $he washes, several of your other slaves are waking up and starting their days. They can't help but stare as $activeSlave.slaveName soaps $himself. $activeSlave.slaveName enjoys the attention. - <</replace>> -<</link>> - <<case "obedient girlish">> <<link "Let $him get dressed and spend some quality time with $him">> @@ -19886,79 +19689,6 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h <</link>> <</if>> -<<case "lazy evening">> - -<<link "Enjoy some oral with an evening of wallscreen television">> - <<replace "#result">> - There are some things that never change, even after ascension to the high position of an arcology owner. One of these fixtures of life is the ability to enjoy a relaxing evening of wallscreen television and <<if $PC.dick != 0>>a blowjob<<if $PC.vagina != -1>> and <</if>><</if>><<if $PC.vagina != -1>>some cunnilingus<</if>>. With $activeSlave.slaveName sequestered between your legs, you tune into your favorite Free Cities serial drama and <<if !canSee($activeSlave)>>audibly <</if>>widen your legs slightly as you sink back into the chair with a sigh of contentment. $He - <<if $activeSlave.belly >= 300000>> - gently leans onto $his _belly belly<<if hasAnyArms($activeSlave)>> with $his arm<<if hasBothArms($activeSlave)>>s<</if>> steadying the mass<</if>> - <<elseif $activeSlave.belly >= 5000>> - <<if hasAnyLegs($activeSlave)>>kneels carefully<<else>>lowers $himself<</if>> - <<if hasAnyArms($activeSlave)>> - with <<if hasBothArms($activeSlave)>>an<<else>>$his<</if>> arm - <<if $activeSlave.bellyPreg >= 3000>> - wrapped protectively around $his bump - <<else>> - cradling $his _belly belly - <</if>> - <</if>> - <<else>> - sinks to <<if hasAnyLegs($activeSlave)>>$his knee<<if !hasAnyLegs($activeSlave)>>s<</if>> obediently<<if hasAnyArms($activeSlave)>> with $his hand<<if hasBothArms($activeSlave)>>s<</if>> placed placidly on $his thigh<<if !hasAnyLegs($activeSlave)>>s<</if>><</if>><<else>>the ground<</if>> - <</if>> - before putting $his mouth to work, - <<if $activeSlave.skill.oral >= 100>> - $his mastery at giving oral providing a wealth of pleasure. - <<elseif $activeSlave.skill.oral > 60>> - $his skills in oral providing ample pleasure. - <<else>> - $his mediocre oral skills providing some relief. - <</if>> - <<if $activeSlave.teeth == "pointy">> - Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you still feel the extreme care $he has to take to keep $his shark-like teeth clear of you. - <<elseif $activeSlave.lips > 40>> - $His huge lips are soft and pillowy against you. - <<elseif $activeSlave.teeth == "gapped">> - Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you can feel the slight hesitations as $he takes care to not pinch you between $his front teeth. - <<elseif ($activeSlave.teeth == "straightening braces") || ($activeSlave.teeth == "cosmetic braces")>> - Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you can feel the slight hesitations as $he takes care to keep $his braces off you. - <</if>> - You have an enjoyable evening glued to your wallscreen, punctuated by the playful ruffling <<if $activeSlave.hLength > 1>>of $activeSlave.slaveName's $activeSlave.hColor hair<<else>>across $activeSlave.slaveName's scalp<</if>> and the occasional orgasm into $his waiting mouth. - <<if $activeSlave.sexualFlaw !== "hates oral">> - Though your experience was more stimulating than $hers, $activeSlave.slaveName enjoyed @@.hotpink;being used while you enjoyed yourself.@@ - <<set $activeSlave.devotion += 4>> - <<else>> - Although you enjoyed $his ministrations, $activeSlave.slaveName had a bad time because of $his @@.gold;hate of oral.@@ - <<set $activeSlave.devotion -= 2>> - <</if>> - <<run seX($activeSlave, "oral", $PC, "penetrative")>> - <</replace>> -<</link>> -<br><<link "Spend the night idly cuddling">> - <<replace "#result">> - Though your evening could hardly be called eventful, there is something eminently comforting about having a warm - <<if $activeSlave.physicalAge > 30>> - $woman - <<elseif $activeSlave.physicalAge > 18>> - young lady - <<elseif $activeSlave.physicalAge > 12>> - teen - <<else>> - little $girl - <</if>> - cuddled up beside you to idly while away the hours<<if $activeSlave.bellyPreg >= 1500 && $activeSlave.pregSource == -1>>, especially when $he is <<if $activeSlave.belly >= 300000>>so massively swollen with your children<<else>>heavy with your child<<if $activeSlave.pregType > 1>>ren<</if>><</if>><</if>>. - $He @@.mediumaquamarine;trusts you more@@ for these few intimate hours amidst $his life of sexual servitude. - <<set $activeSlave.trust += 4>> - <</replace>> -<</link>> -<br><<link "Unwind by tormenting $him">> - <<replace "#result">> - Though there is no shortage of torments you inflict during the course of your day to day life as an arcology owner, there is something refreshing about torturing a slave out of idle boredom rather than corrective disciple or sexual domination. Your night is filled with <<if $activeSlave.voice == 0>>the horrible rasping that a mute throat substitutes for cries of agony<<else>>echoing shrieks of anguish<</if>>, though every vocal outburst is idly punished with electro shock or strike of the whip. Come the morning, $activeSlave.slaveName <<if $activeSlave.fetish == "masochist">> is mortified by the intensity of $his orgasms that night,@@.hotpink; and more convinced than ever that $he's a pain slut,@@ and yet<</if>> @@.gold;scuttles away to tend to the bruises and marks that litter $his battered body.@@ - <<set $activeSlave.trust -= 5>> - <<if $activeSlave.fetish == "masochist">><<set $activeSlave.devotion += 4>><</if>> - <</replace>> -<</link>> - <<case "devoted shortstack">> <<link "Show $him why you like having short <<= $girl>>s around">> diff --git a/src/uncategorized/REroyalblood.tw b/src/uncategorized/REroyalblood.tw index de61595eaa7de4af42413f230a00fe4a8dcfcc39..16ad198a98a6bea970879e8b87d71c535972220e 100644 --- a/src/uncategorized/REroyalblood.tw +++ b/src/uncategorized/REroyalblood.tw @@ -315,7 +315,7 @@ Time is short, but you are well placed to acquire some choice slaves. With an ad <br>//You lack the necessary funds to enslave a crown prince.// <</if>> -<<if $seeDicks > 0 && $SF.Toggle && $SF.Active >= 1>> +<<if $seeDicks > 0 && $SF.Toggle && $SF.Active >= 1>> <br><<link "Dispatch $SF.Lower on a night time raid to acquire the crown prince.">> <<replace "#result">> Seizing a tablet, you quickly send a message to The Colonel. After dark, a flight of VTOLs land in the new arcology laden with troops. They take off again with the crown prince aboard and in chains, where _he2 rails against the uncaring metal walls of the VTOL for the breadth of _his2 journey to your penthouse. diff --git a/src/uncategorized/arcade.tw b/src/uncategorized/arcade.tw index 403a8e3358b0e07db48ce61d8e754cf23b63c803..ff29e44aa97626a585b961dd1b6468dc5c20e2e8 100644 --- a/src/uncategorized/arcade.tw +++ b/src/uncategorized/arcade.tw @@ -134,7 +134,7 @@ [[Decrease power|Arcade][$arcadeUpgradeHealth = 1]] </div> <<elseif $arcadeUpgradeHealth == 1>> - It has been upgraded with curative injectors. inmates will be kept alive and productive, so they may be held locked in place for as long as necessary and available for use. + It has been upgraded with curative injectors. Inmates will be kept alive and productive, so they may be held locked in place for as long as necessary and available for use. <div class="choices"> [[Increase power|Arcade][$arcadeUpgradeHealth = 2]] | [[Turn off|Arcade][$arcadeUpgradeHealth = 0]] </div> diff --git a/src/uncategorized/arcadeReport.tw b/src/uncategorized/arcadeReport.tw index b9de81bf9a6c2a140ab5e23dd879c8a3d28ca791..c81e42beb3d4421775e8066d0fc0bc126254457c 100644 --- a/src/uncategorized/arcadeReport.tw +++ b/src/uncategorized/arcadeReport.tw @@ -224,8 +224,8 @@ <<if ($arcadeUpgradeFuckdolls == 2)>> <<set $activeSlave = 0, _Age = -1, _FD = -1, _MB = -1, _Con = -1>> <<for _dI = 0; _dI < _DL; _dI++>> + <<set $i = $slaveIndices[$ArcadeiIDs[_dI]]>> <<if $slaves[$i].sentence == 0>> /* let's not convert slaves we are punishing into Fuckdolls */ - <<set $i = $slaveIndices[$ArcadeiIDs[_dI]]>> <<if ($slaves[$i].fetish == "mindbroken")>> <<if ($slaves[$i].fuckdoll == 0)>> <<if ($slaves[$i].physicalAge > 35)>> diff --git a/src/uncategorized/arcmgmt.tw b/src/uncategorized/arcmgmt.tw index 13642ae02256194ce84aa9f407e5890ec06506c0..d4f0e3eaf50d361c669ee9b562c0a30a8c346e97 100644 --- a/src/uncategorized/arcmgmt.tw +++ b/src/uncategorized/arcmgmt.tw @@ -1227,7 +1227,7 @@ _percTopClass = Math.trunc(($topClass / ($ACitizens + $ASlaves)) * 1000) / 10>> <</if>> <<if $arcologies[0].FSPetiteAdmirationLaw == 1>> <<set _rentMultiplier *= 0.95>> - Citzens are offered subsidized rent to take drastically shorter partners and harem members. + Citizens are offered subsidized rent to take drastically shorter partners and harem members. <<elseif $arcologies[0].FSStatuesqueGlorificationLaw == 1>> <<set _rentMultiplier *= 0.95>> Tall citizens are offered rent subsidies, at the expense of short citizens, to encourage more statuesque individuals to join the free population of your arcology. @@ -1739,7 +1739,7 @@ You own <<set _menialSlaveValue = menialSlaveCost()>> <br> Your ''business assistant'' manages the menial slave market. -<<if _menialSlaveValue <= 900+$assistant.market.marketAssistantAggressiveness>>/* BUY */ +<<if _menialSlaveValue <= 900+$assistant.market.aggressiveness>>/* BUY */ <<set _bulkMax = $PopCap-$menials-$fuckdolls-$menialBioreactors>> <<if _bulkMax <= 0>> There is no room in the parts of your arcology you own for more menial slaves. @@ -1748,11 +1748,11 @@ Your ''business assistant'' manages the menial slave market. <<set _menialBulkPremium = Math.trunc(1+Math.clamp(($cash-$assistant.market.limit)/_menialSlaveValue,0,_bulkMax)/400)>> _HeM acquires more chattel, since it's a buyers' market. <<if ($arcologies[0].FSPastoralist != "unset") && ($arcologies[0].FSPaternalist == "unset")>> - <<set $menialBioreactors += Math.trunc(Math.clamp(($cash-$assistant.market.limit)/(_menialSlaveValue+_menialBulkPremium-100),0,_bulkMax)), $menialSupplyFactor -= Math.trunc(Math.clamp(($cash-$assistant.market.limit)/(_menialSlaveValue+_menialBulkPremium-100),0,_bulkMax)), cashX(forceNeg(Math.trunc(Math.clamp(($cash-$assistant.market.limit)/(_menialSlaveValue+_menialBulkPremium-100),0,_bulkMax))*(_menialSlaveValue+_menialBulkPremium-100)), "menialBioreactorsTransfer")>> + <<set $menialBioreactors += Math.trunc(Math.clamp(($cash-$assistant.market.limit)/(_menialSlaveValue+_menialBulkPremium-100),0,_bulkMax)), $menialSupplyFactor -= Math.trunc(Math.clamp(($cash-$assistant.market.limit)/(_menialSlaveValue+_menialBulkPremium-100),0,_bulkMax)), cashX(forceNeg(Math.trunc(Math.clamp(($cash-$assistant.market.limit)/(_menialSlaveValue+_menialBulkPremium-100),0,_bulkMax))*(_menialSlaveValue+_menialBulkPremium-100)), "menialBioreactorsTransferA")>> <<elseif ($arcologies[0].FSDegradationist != "unset")>> - <<set $fuckdolls += Math.trunc(Math.clamp(($cash-$assistant.market.limit)/((_menialSlaveValue+_menialBulkPremium)*2),0,_bulkMax)), $menialSupplyFactor -= Math.trunc(Math.clamp(($cash-$assistant.market.limit)/((_menialSlaveValue+_menialBulkPremium)*2),0,_bulkMax)), cashX(forceNeg(Math.trunc(Math.clamp(($cash-$assistant.market.limit)/((_menialSlaveValue+_menialBulkPremium)*2),0,_bulkMax))*((_menialSlaveValue+_menialBulkPremium)*2)), "fuckdollsTransfer")>> + <<set $fuckdolls += Math.trunc(Math.clamp(($cash-$assistant.market.limit)/((_menialSlaveValue+_menialBulkPremium)*2),0,_bulkMax)), $menialSupplyFactor -= Math.trunc(Math.clamp(($cash-$assistant.market.limit)/((_menialSlaveValue+_menialBulkPremium)*2),0,_bulkMax)), cashX(forceNeg(Math.trunc(Math.clamp(($cash-$assistant.market.limit)/((_menialSlaveValue+_menialBulkPremium)*2),0,_bulkMax))*((_menialSlaveValue+_menialBulkPremium)*2)), "fuckdollsTransferA")>> <<else>> - <<set $menials += Math.trunc(Math.clamp(($cash-$assistant.market.limit)/(_menialSlaveValue+_menialBulkPremium),0,_bulkMax)), $menialSupplyFactor -= Math.trunc(Math.clamp(($cash-$assistant.market.limit)/(_menialSlaveValue+_menialBulkPremium),0,_bulkMax)), cashX(forceNeg(Math.trunc(Math.clamp(($cash-$assistant.market.limit)/(_menialSlaveValue+_menialBulkPremium),0,_bulkMax)*(_menialSlaveValue+_menialBulkPremium))), "menialTransfer")>> + <<set $menials += Math.trunc(Math.clamp(($cash-$assistant.market.limit)/(_menialSlaveValue+_menialBulkPremium),0,_bulkMax)), $menialSupplyFactor -= Math.trunc(Math.clamp(($cash-$assistant.market.limit)/(_menialSlaveValue+_menialBulkPremium),0,_bulkMax)), cashX(forceNeg(Math.trunc(Math.clamp(($cash-$assistant.market.limit)/(_menialSlaveValue+_menialBulkPremium),0,_bulkMax)*(_menialSlaveValue+_menialBulkPremium))), "menialTransferA")>> <</if>> <</if>> <</if>> @@ -1762,15 +1762,15 @@ Your ''business assistant'' manages the menial slave market. <</if>> <<if $menials > 0>> <<set _cashX = $menials*(menialSlaveCost(-$menials)), $menialDemandFactor -= $menials, $menials = 0>> - <<run cashX(_cashX, "menialTransfer")>> + <<run cashX(_cashX, "menialTransferA")>> <</if>> <<if $fuckdolls > 0>> <<set _cashX = $fuckdolls*(menialSlaveCost(-$fuckdolls)*2), $menialDemandFactor -= $fuckdolls, $fuckdolls = 0>> - <<run cashX(_cashX, "fuckdollsTransfer")>> + <<run cashX(_cashX, "fuckdollsTransferA")>> <</if>> <<if $menialBioreactors > 0>> <<set _cashX = $menialBioreactors*(menialSlaveCost(-$menialBioreactors)-100), $menialDemandFactor -= $menialBioreactors, $menialBioreactors = 0>> - <<run cashX(_cashX, "menialBioreactorsTransfer")>> + <<run cashX(_cashX, "menialBioreactorsTransferA")>> <</if>> <<else>> Prices are average, so _heM does not make any significant moves. diff --git a/src/uncategorized/bodyModification.tw b/src/uncategorized/bodyModification.tw index 7e5a8833c094a37d5d6035e4a45fcfcecb50fbb4..33628869f395c8e34181d94de1fe49625876a48b 100644 --- a/src/uncategorized/bodyModification.tw +++ b/src/uncategorized/bodyModification.tw @@ -1,6 +1,6 @@ :: Body Modification [nobr] -<<set $nextButton = "Confirm changes", $nextLink = "AS Dump", $returnTo = "Slave Interact">> +<<set $nextButton = "Confirm changes", $nextLink = "Slave Interact">> <<set $AS = $activeSlave.ID>> <<run App.Utils.setLocalPronouns(getSlave($AS))>> <<run Enunciate(getSlave($AS))>> @@ -70,7 +70,7 @@ The end was never in doubt. A few strokes of the whip plunged $him into agony $his body will not allow $him to forget. <</if>> <<case "burn">> - Your goal wasn't to make the distinct shape of a brand, but rather to permanently mar the getSlave($AS).skin skin of $his $scarTarget.local with an open flame. + Your goal wasn't to make the distinct shape of a brand, but rather to permanently mar the <<= getSlave($AS).skin>> skin of $his $scarTarget.local with an open flame. <<case "surgical">> <<if $PC.skill.medicine >= 100>> Your medical mastery is perfect, so creating such a scar was a deliberate act of degradation. diff --git a/src/uncategorized/bulkSlaveGenerate.tw b/src/uncategorized/bulkSlaveGenerate.tw index 496e71fccfa5da2607c268ec6adabf2df4889406..9945317d0bb59463708c82a203457e991970896b 100644 --- a/src/uncategorized/bulkSlaveGenerate.tw +++ b/src/uncategorized/bulkSlaveGenerate.tw @@ -73,15 +73,14 @@ <</switch>> /* Determine if Law Compliance effects must be applied to this transaction */ -<<switch $slaveMarket>> -<<case "gangs and smugglers" "GRI" "HA" "heap" "indentures" "LDE" "low tier criminals" "military prison" "neighbor" "NUL" "SCP" "TCR" "TFS" "TGA" "TSS" "wetware" "white collar">> /* these markets are exempt from law compliance */ +<<if App.Data.misc.lawlessMarkets.includes($slaveMarket)>> <<set $applyLaw = 0>> -<<default>> /* all other markets are not exempt: corporate, hunters, kidnappers, raiders, trainers */ +<<else>> <<set $applyLaw = 1>> -<</switch>> +<</if>> <<for _i = 0; _i < $numSlaves; _i++>> - <<run generateMarketSlave($slaveMarket, $numArcology)>> + <<set $activeSlave = (generateMarketSlave($slaveMarket, $numArcology)).slave>> <<set $slavesSeen++>> <<if $applyLaw == 0>> <<set _slaveCost = slaveCost($activeSlave)>> diff --git a/src/uncategorized/buySlaves.tw b/src/uncategorized/buySlaves.tw index bb839ba9cb684251cd4cccb33a789120aa061e84..f4018e2075ee64fdce32341239cbc1aeab8332f3 100644 --- a/src/uncategorized/buySlaves.tw +++ b/src/uncategorized/buySlaves.tw @@ -314,7 +314,7 @@ <</if>> </div> -<<if ($rep > 1000)>> +<<if ($rep > 10000)>> <div>[[Place a special order|Custom Slave]] | //Customizable but very expensive.//</div> <div>[[Place a fulfillment order|JobFulfillmentCenterOrder]] | //Fills leaderships roles for a price.//</div> <</if>> diff --git a/src/uncategorized/cellblock.tw b/src/uncategorized/cellblock.tw index f989f32ffcfa872fd41cec995baba3627c437e61..903ecea20d5142de9b99851c628eb5943e267278 100644 --- a/src/uncategorized/cellblock.tw +++ b/src/uncategorized/cellblock.tw @@ -91,7 +91,7 @@ $cellblockNameCaps has room for $cellblock slaves to be kept in close confinement. There <<if _CL == 1>>is<<else>>are<</if>> currently _CL slaves<<if _CL != 1>>s<</if>> kept in close confinement in $cellblockName. <div class="choices"> - [[Expand the cellblock|Cellblock][cashX(forceNeg(_Tmult0), "capEx"), $cellblock += 5, $PC.skill.engineering += .1]] + [[Expand the cellblock|Cellblock][cashX(forceNeg(_Tmult0), "capEx"), $cellblock += 5, $PC.skill.engineering += .1]] <span class="note"> Costs <<print cashFormat(_Tmult0)>> </span> @@ -105,7 +105,7 @@ <<set _Tmult1 = Math.trunc(20000*$upgradeMultiplierArcology*$HackingSkillMultiplier)>> Its compliance systems are standard. <div class="choices"> - [[Upgrade them to soften slave flaws|Cellblock][cashX(forceNeg(_Tmult1), "capEx"), $cellblockUpgrade = 1, $PC.skill.engineering += 0.1, $PC.skill.hacking += 0.1]] + [[Upgrade them to soften slave flaws|Cellblock][cashX(forceNeg(_Tmult1), "capEx"), $cellblockUpgrade = 1, $PC.skill.engineering += 0.1, $PC.skill.hacking += 0.1]] <span class="note"> Costs <<print cashFormat(_Tmult1)>> </span> @@ -142,7 +142,7 @@ </p> <p> - Rename $cellblockName: <<textbox "$cellblockName" $cellblockName "Cellblock">> + Rename $cellblockName: <<textbox "$cellblockName" $cellblockName "Cellblock">> <span class="note"> Use a noun or similar short phrase </span> diff --git a/src/uncategorized/clinic.tw b/src/uncategorized/clinic.tw index 6490c567bc5ae2b6c08bc51ae9ced610c4796320..ee8cf5a1f0611cdef56aeb6af953547bc5391c70 100644 --- a/src/uncategorized/clinic.tw +++ b/src/uncategorized/clinic.tw @@ -87,7 +87,7 @@ $clinicNameCaps has room to support $clinic slaves while they receive treatment. There <<if _CL == 1>>is<<else>>are<</if>> currently _CL slave<<if _CL != 1>>s<</if>> receiving treatment in $clinicName. <div class="choices"> - [[Expand the clinic|Clinic][cashX(forceNeg(_Tmult0), "capEx"), $clinic += 5, $PC.skill.engineering += .1]] + [[Expand the clinic|Clinic][cashX(forceNeg(_Tmult0), "capEx"), $clinic += 5, $PC.skill.engineering += .1]] <span class="note"> Costs <<print cashFormat(_Tmult0)>> </span> @@ -106,7 +106,7 @@ <<set _Tmult1 = Math.trunc(10000*$upgradeMultiplierArcology*Math.min($upgradeMultiplierMedicine, $HackingSkillMultiplier))>> It mounts powerful medical scanning technology. <div class="choices"> - [[Upgrade the scanners to help detect genomic damage|Clinic][cashX(forceNeg(_Tmult1), "capEx"), $clinicUpgradeScanner = 1, $PC.skill.hacking += 0.1]] + [[Upgrade the scanners to help detect genomic damage|Clinic][cashX(forceNeg(_Tmult1), "capEx"), $clinicUpgradeScanner = 1, $PC.skill.hacking += 0.1]] <span class="note"> Costs <<print cashFormat(_Tmult1)>> </span> @@ -127,7 +127,7 @@ <<if $clinicUpgradePurge === 0>> The entire floor beneath $clinicName is occupied by a huge filtration plant that constantly cycles out the patients' blood to remove impurities. <div class="choices"> - [[Increase the effectiveness of the impurity purging|Clinic][cashX(forceNeg(_Tmult3), "capEx"), $clinicUpgradePurge = 1, $PC.skill.hacking += 0.1]] + [[Increase the effectiveness of the impurity purging|Clinic][cashX(forceNeg(_Tmult3), "capEx"), $clinicUpgradePurge = 1, $PC.skill.hacking += 0.1]] <span class="note"> Costs <<print cashFormat(_Tmult3)>> and may cause health problems in slaves. </span> @@ -135,7 +135,7 @@ <<elseif $clinicUpgradePurge === 1>> Add nano magnets into the process to increase the rate that impurities are pulled from the body. <div class="choices"> - [[Further increase the effectiveness of the impurity purging|Clinic][cashX(forceNeg(_Tmult3*2), "capEx"), $clinicUpgradePurge = 3, $PC.skill.hacking += 0.1]] + [[Further increase the effectiveness of the impurity purging|Clinic][cashX(forceNeg(_Tmult3*2), "capEx"), $clinicUpgradePurge = 3, $PC.skill.hacking += 0.1]] <span class="note"> Costs <<print cashFormat(_Tmult3*2)>> </span> @@ -150,7 +150,7 @@ <<set _Tmult2 = Math.trunc(50000*$upgradeMultiplierArcology*Math.min($upgradeMultiplierMedicine, $HackingSkillMultiplier))>> It includes standard dialysis equipment. <div class="choices"> - [[Install advanced blood treatment equipment to help address drug side effects|Clinic][cashX(forceNeg(_Tmult2), "capEx"), $clinicUpgradeFilters = 1, $PC.skill.hacking += 0.1]] + [[Install advanced blood treatment equipment to help address drug side effects|Clinic][cashX(forceNeg(_Tmult2), "capEx"), $clinicUpgradeFilters = 1, $PC.skill.hacking += 0.1]] <span class="note"> Costs <<print cashFormat(_Tmult2)>> </span> @@ -211,7 +211,7 @@ </p> <p> - Rename $clinicName: <<textbox "$clinicName" $clinicName "Clinic">> + Rename $clinicName: <<textbox "$clinicName" $clinicName "Clinic">> <span class="note"> Use a noun or similar short phrase </span> diff --git a/src/uncategorized/clubAdvertisement.tw b/src/uncategorized/clubAdvertisement.tw index 2f36be58ba7f768b0318a154d09770c062f169d3..c63b53f4bbc8a0961ac2def40496334e4548cf76 100644 --- a/src/uncategorized/clubAdvertisement.tw +++ b/src/uncategorized/clubAdvertisement.tw @@ -148,7 +148,7 @@ </div> </p> -<h2>Design $clubNameCaps Ad Campaign</h2> +<h2>Design $clubNameCaps Ad Campaign</h2> <div class="note"> Will replace relevant variety bonuses diff --git a/src/uncategorized/clubReport.tw b/src/uncategorized/clubReport.tw index 0365f3ad2954a233221535e6f6ab2f00ca0e8ab0..0e55e1f72c636448d9e80ba1eb32fe55858901c0 100644 --- a/src/uncategorized/clubReport.tw +++ b/src/uncategorized/clubReport.tw @@ -223,7 +223,7 @@ <p> <<= App.Ads.report("club")>> </p> - + <!-- Record statistics gathering --> <<script>> var b = State.variables.facility.club; diff --git a/src/uncategorized/costsBudget.js b/src/uncategorized/costsBudget.js index 5cad13ed44353c581c44f67b640f758be9ef99cc..dd19e512e2e1140f3891447cbca4b27547eb52b5 100644 --- a/src/uncategorized/costsBudget.js +++ b/src/uncategorized/costsBudget.js @@ -10,6 +10,7 @@ App.UI.Budget.Cost = function() { let text; let coloredRow = true; + /* Old way // Set up profits column V.lastWeeksCashProfits = new App.Data.Records.LastWeeksCash(); @@ -148,6 +149,9 @@ App.UI.Budget.Cost = function() { // Weather + generateRowsFromArray([ + ["environment", "Environment"] + ]); if (V.lastWeeksCashExpenses.weather < 0 && V.weatherCladding === 0) { node = new DocumentFragment(); node.append("Weather is causing "); @@ -185,7 +189,7 @@ App.UI.Budget.Cost = function() { [], "Costs Report Slaves" ); - generateRow("slaveUpkeep", node); + generateRow("slaveUpkeepUndefined", node); generateRowsFromArray([ ["extraMilk", "Extra milk"], @@ -524,6 +528,244 @@ App.UI.Budget.Cost = function() { ["specialForces", "Special forces"], ["peacekeepers", text] ]); + */ + // Set up object to track calculated displays + const income = "lastWeeksCashIncome"; + const expenses = "lastWeeksCashExpenses"; + const profits = "lastWeeksCashProfits"; + const F = V.lastWeeksGatheredTotals; + + // HEADER + let header = table.createTHead(); + let row = header.insertRow(0); + let th = document.createElement("th"); + let pent = document.createElement("h1"); + pent.textContent = "Budget Overview"; + th.appendChild(pent); + row.appendChild(th); + + array = [ + "Income", + "Expense", + "Totals" + ]; + for (let th of array) { + let cell = document.createElement("th"); + cell.textContent = th; + row.appendChild(cell); + } + + let body = document.createElement('tbody'); + table.appendChild(body); + row = body.insertRow(); + + // HEADER: FACILITIES + createSectionHeader("Facilities"); + + // PENTHOUSE + generateRowGroup("Penthouse", "PENTHOUSE"); + generateRowCategory("Rest", "slaveAssignmentRest"); + generateRowCategory("RestVign", "slaveAssignmentRestVign"); + generateRowCategory("Fucktoy", "slaveAssignmentFucktoy"); + generateRowCategory("Classes", "slaveAssignmentClasses"); + generateRowCategory("House", "slaveAssignmentHouse"); + generateRowCategory("HouseVign", "slaveAssignmentHouseVign"); + generateRowCategory("Whore", "slaveAssignmentWhore"); + generateRowCategory("WhoreVign", "slaveAssignmentWhoreVign"); + generateRowCategory("Public", "slaveAssignmentPublic"); + generateRowCategory("PublicVign", "slaveAssignmentPublicVign"); + generateRowCategory("Subordinate", "slaveAssignmentSubordinate"); + generateRowCategory("Milked", "slaveAssignmentMilked"); + generateRowCategory("MilkedVign", "slaveAssignmentMilkedVign"); + generateRowCategory("ExtraMilk", "slaveAssignmentExtraMilk"); + generateRowCategory("ExtraMilkVign", "slaveAssignmentExtraMilkVign"); + generateRowCategory("Gloryhole", "slaveAssignmentGloryhole"); + generateRowCategory("Confinement", "slaveAssignmentConfinement"); + + // LEADERSHIP ROLES + + // HEAD GIRL + // find passage name for HGSuite + generateRowGroup(V.HGSuiteNameCaps, "HEADGIRLSUITE", V.HGSuite, null, V.HGSuiteiIDs.length); + generateRowCategory("Head Girl", "slaveAssignmentHeadgirl"); + generateRowCategory("Head Girl Fucktoys", "slaveAssignmentHeadgirlsuite"); + + // RECRUITER + generateRowGroup("Recruiter", "RECRUITER"); + generateRowCategory("Recruiter", "slaveAssignmentRecruiter"); + + // BODYGUARD + // find passage name for Armory + generateRowGroup("Armory", "DOJO", V.dojo, null, null); + generateRowCategory("Bodyguard", "slaveAssignmentBodyguard"); + + // CONCUBINE + generateRowGroup("Master Suite", "MASTERSUITE", V.masterSuite, "Master Suite", V.MastSiIDs.length); + generateRowCategory("Master Suite Maintenance", "masterSuite"); + generateRowCategory("Master Suite Concubine", "slaveAssignmentConcubine"); + generateRowCategory("Master Suite Fucktoys", "slaveAssignmentMastersuite"); + + // AGENT + generateRowGroup("Agent", "AGENT"); + generateRowCategory("Agent", "slaveAssignmentAgent"); + + // ARCADE + generateRowGroup(V.arcadeNameCaps, "ARCADE", V.arcade, "Arcade", V.ArcadeiIDs.length); + generateRowCategory("Arcade Maintenance", "arcade"); + generateRowCategory("Arcade Fuckdolls", "slaveAssignmentArcade"); + + // BROTHEL + generateRowGroup(V.brothelNameCaps, "BROTHEL", V.brothel, "Brothel", V.BrothiIDs.length); + generateRowCategory("Brothel Maintenance", "brothel"); + generateRowCategory("Brothel Madam", "slaveAssignmentMadam"); + generateRowCategory("Brothel MadamVign", "slaveAssignmentMadamVign"); + generateRowCategory("Brothel Whore", "slaveAssignmentBrothel"); + generateRowCategory("Brothel WhoreVign", "slaveAssignmentBrothelVign"); + generateRowCategory("Brothel Ads", "brothelAds"); + + // CELLBLOCK + generateRowGroup(V.cellblockNameCaps, "CELLBLOCK", V.cellblock, "Cellblock", V.CellBiIDs.length); + generateRowCategory("Cellblock Maintenance", "cellblock"); + generateRowCategory("Cellblock Warden", "slaveAssignmentWarden"); + generateRowCategory("Cellblock Slaves", "slaveAssignmentCellblock"); + + // CLUB + generateRowGroup(V.clubNameCaps, "CLUB", V.club, "Club", V.ClubiIDs.length); + generateRowCategory("Club Maintenance", "club"); + generateRowCategory("Club DJ", "slaveAssignmentDj"); + generateRowCategory("Club Public", "slaveAssignmentClub"); + generateRowCategory("Club PublicVign", "slaveAssignmentClubVign"); + generateRowCategory("Club Ads", "clubAds"); + + // CLINIC + generateRowGroup(V.clinicNameCaps, "CLINIC", V.club, "Club", V.ClubiIDs.length); + generateRowCategory("Clinic Maintenance", "clinic"); + generateRowCategory("Clinic Nurse", "slaveAssignmentNurse"); + generateRowCategory("Clinic Slaves", "slaveAssignmentClinic"); + + // DAIRY + generateRowGroup(V.dairyNameCaps, "DAIRY", V.dairy, "Dairy", V.DairyiIDs.length); + generateRowCategory("Dairy Maintenance", "dairy"); + generateRowCategory("Dairy Milkmaid", "slaveAssignmentMilkmaid"); + generateRowCategory("Dairy Cows", "slaveAssignmentDairy"); + generateRowCategory("Dairy Cows", "slaveAssignmentDairyVign"); + + // FARMYARD + generateRowGroup(V.farmyardNameCaps, "FARMYARD", V.farmyard, "Farmyard", V.FarmyardiIDs.length); + generateRowCategory("Farmyard Maintenance", "farmyard"); + generateRowCategory("Farmyard Farmer", "slaveAssignmentFarmer"); + generateRowCategory("Farmyard Farmhands", "slaveAssignmentFarmyard"); + generateRowCategory("Farmyard FarmhandsVign", "slaveAssignmentFarmyardVign"); + + // INCUBATOR + generateRowGroup(V.incubatorNameCaps, "INCUBATOR", V.incubator, "Incubator", V.incubatorSlaves); + generateRowCategory("Incubator Maintenance", "incubator"); + generateRowCategory("Incubator Babies", "incubatorSlaves"); + + // NURSERY + generateRowGroup(V.nurseryNameCaps, "NURSERY", V.nursery, "Nursery", V.NurseryiIDs.length); + generateRowCategory("Nursery Maintenance", "nursery"); + generateRowCategory("Nursery Matron", "slaveAssignmentMatron"); + generateRowCategory("Nursery Nannies", "slaveAssignmentNursery"); + generateRowCategory("Nursery NanniesVign", "slaveAssignmentNurseryVign"); + + // PIT + generateRowGroup(V.pitNameCaps, "PIT", V.pit, "Pit", V.fighterIDs.length); + generateRowCategory("Pit Maintenance", "pit"); + + // PROSTHETIC LAB + generateRowGroup("Prosthetic Lab", "PROSTHETICLAB", V.researchLab.level, "Prosthetic Lab", null); + generateRowCategory("Prosthetic Lab Maintenance", "lab"); + generateRowCategory("Prostethic Lab Research", "labResearch"); + generateRowCategory("Prostethic Lab Scientists", "labScientists"); + generateRowCategory("Prostethic Lab Menials", "labMenials"); + + // SCHOOLROOM + generateRowGroup(V.schoolroomNameCaps, "SCHOOLROOM", V.schoolroom, "Schoolroom", V.SchlRiIDs.length); + generateRowCategory("Schoolroom Maintenance", "school"); + generateRowCategory("Schoolroom Teacher", "slaveAssignmentTeacher"); + generateRowCategory("Schoolroom Students", "slaveAssignmentSchool"); + + // SERVANTS' QUARTERS + generateRowGroup(V.servantsQuartersNameCaps, "SERVANTSQUARTERS", V.servantsQuarters, "Servants' Quarters", V.ServQiIDs.length); + generateRowCategory("Servants' Quarters Maintenance", "servantsQuarters"); + generateRowCategory("Servants' Quarters Steward", "slaveAssignmentSteward"); + generateRowCategory("Servants' Quarters Servants", "slaveAssignmentQuarter"); + generateRowCategory("Servants' Quarters ServantsVign", "slaveAssignmentQuarterVign"); + + // SPA + generateRowGroup(V.spaNameCaps, "SPA", V.spa, "Spa", V.SpaiIDs.length); + generateRowCategory("Spa Maintenance", "spa"); + generateRowCategory("Spa Attendant", "slaveAssignmentAttendant"); + generateRowCategory("Spa Slaves", "slaveAssignmentSpa"); + + // HEADER: ARCOLOGY + createSectionHeader("Arcology"); + + // SLAVES + generateRowGroup("Miscellaneous Slave Income and Expenses", "SLAVES"); + generateRowCategory("Slave Porn", "porn"); + generateRowCategory("Slave Modifcations", "slaveMod"); + generateRowCategory("Slave Surgery", "slaveSurgery"); + generateRowCategory("Slave Birhting", "birth"); + + // MENIAL LABOR + generateRowGroup("Menial Labor", "LABOR"); + generateRowCategory("Menials: Slaves", "menialTrades"); + generateRowCategory("Menials: Fuckdolls", "fuckdolls"); + generateRowCategory("Menials: Bioreactors", "menialBioreactors"); + + // FLIPPING + generateRowGroup("Flipping", "FLIPPING"); + generateRowCategory("Slave Transfer", "slaveTransfer"); + generateRowCategory("Menials", "menialTransfer"); + generateRowCategory("Fuckdolls", "fuckdollsTransfer"); + generateRowCategory("Bioreactors", "menialBioreactorsTransfer"); + generateRowCategory("Assistant: Menials", "menialTransferA"); + generateRowCategory("Assistant: Fuckdolls", "fuckdollsTransferA"); + generateRowCategory("Assistant: Bioreactors", "menialBioreactorsTransferA"); + generateRowCategory("Menial Retirement", "menialRetirement"); + generateRowCategory("Scientist Transfer", "labScientistsTransfer"); + generateRowCategory("Slave Babies", "babyTransfer"); + + // FINANCIALS + generateRowGroup("Financials", "FINANCIALS"); + generateRowCategory("Weather", "weather"); + generateRowCategory("Rents", "rents"); + generateRowCategory("Fines", "fines"); + generateRowCategory("Events", "event"); + generateRowCategory("Capital Expenses", "capEx"); + generateRowCategory("Future Society Shaping", "futureSocieties"); + generateRowCategory("School Subsidy", "schoolBacking") + generateRowCategory("Arcology conflict", "war"); + generateRowCategory("Cheating", "cheating"); + + // POLICIES + generateRowGroup("Policies", "POLICIES"); + generateRowCategory("Policies", "policies"); + + // EDICTS + generateRowGroup("Edicts", "EDICTS"); + generateRowCategory("Edicts", "edicts"); + + // PERSONAL FINANCE + generateRowGroup("Personal Finance", "PERSONALFINANCE"); + generateRowCategory("Personal Business", "personalBusiness"); + generateRowCategory("Personal Living Expenses", "personalLivingExpenses"); + generateRowCategory("Your skills", "PCSkills"); + generateRowCategory("Your training expenses", "PCtraining"); + generateRowCategory("Your medical expenses", "PCmedical"); + generateRowCategory("Citizen Orphanage", "citizenOrphanage"); + generateRowCategory("Private Orphanage", "privateOrphanage"); + generateRowCategory("Stock dividents", "stocks"); + generateRowCategory("Stock trading", "stocksTraded"); + + // SECURITY + generateRowGroup("Security", "SECURITY"); + generateRowCategory("Mercenaries", "mercenaries"); + generateRowCategory("Security Expansion", "securityExpansion"); + generateRowCategory("Special Forces", "specialForces"); + generateRowCategory("Peacekeepers", "peacekeepers"); // BUDGET REPORT createSectionHeader("Budget Report"); @@ -603,11 +845,7 @@ App.UI.Budget.Cost = function() { cell.append(headline); } - function generateRow(category, node) { - const income = "lastWeeksCashIncome"; - const expenses = "lastWeeksCashExpenses"; - const profits = "lastWeeksCashProfits"; - let row; + function generateRowCategory(node, category) { if (category === "") { row = table.insertRow(); row.append(document.createElement('br')); @@ -619,8 +857,6 @@ App.UI.Budget.Cost = function() { } if (V[income][category] || V[expenses][category] || V.showAllEntries.costsBudget) { - V[profits][category] = V[income][category] + V[expenses][category]; // TODO: consider removing - row = table.insertRow(); let cell = row.insertCell(); cell.append(node); @@ -628,64 +864,46 @@ App.UI.Budget.Cost = function() { cell.append(cashFormatColorDOM(V[income][category])); cell = row.insertCell(); cell.append(cashFormatColorDOM(-Math.abs(V[expenses][category]))); + flipColors(row); cell = row.insertCell(); cell.append(cashFormatColorDOM(V[profits][category])); - flipColors(row); } } - function generateRowsFromArray(array) { - for (let line in array) { - let node = document.createTextNode(array[line][1]); - generateRow( - array[line][0], - node - ); - } - } - - /** - * Structures refer to the building itself and the bills it racks up as it consumes supplies (aphrodesiacs for the brothel) or the money it brings in without slaves (extra room in the classroom) - * @param {*} title the title displayed to the user, link active or not - * @param {*} category the parameter of the budget we are pulling from - * @param {*} structure the variable to test to determine if the building exists and therefore needs a link - * @param {*} passage the passage to link to if the structure is active - * @param {*} occupancy so we can display how many slaves are in the building - */ - function structureSetup(title, category, structure, passage, occupancy) { - node = new DocumentFragment(); - if (structure) { - node.appendChild( - App.UI.DOM.link( - title, - () => { - V.nextButton = "Back to Budget"; - V.nextLink = "Costs Budget"; - }, - [], - passage - ) - ); - node.append(` (${occupancy} slaves)`); - } else { - node = document.createTextNode(`${title} (${occupancy} slaves)`); + function generateRowGroup(title, group, structure, passage, occupancy) { + if (F[group].income || F[group].expenses || V.showAllEntries.costsBudget) { + row = table.insertRow(); + cell = row.insertCell(); + let headline = document.createElement('h3'); + headline.textContent = title; + cell.append(headline); + cell = row.insertCell(); + cell.append(cashFormatColorDOM(F[group].income, null, true)); + cell = row.insertCell(); + cell.append(cashFormatColorDOM(F[group].expenses, null, true)); + cell = row.insertCell(); + cell.append(cashFormatColorDOM(F[group].profits, null, true)); } - generateRow(category, node); } - function cashFormatColorDOM(s, invert = false) { + function cashFormatColorDOM(s, invert = false, temp) { if (invert) { s = -1 * s; } let el = document.createElement('span'); el.textContent = cashFormat(s); - // Display red if the value is negative, unless invert is true - if (s < 0) { - el.className = "red"; - // Yellow for positive - } else if (s > 0) { - el.className = "yellowgreen"; - // White for exactly zero + if (temp === true) { + // Gray display for totals when expanded + el.className = "gray"; + } else { + // Display red if the value is negative, unless invert is true + if (s < 0) { + el.className = "red"; + // Yellow for positive + } else if (s > 0) { + el.className = "yellowgreen"; + // White for exactly zero + } } return el; } diff --git a/src/uncategorized/costsReport.tw b/src/uncategorized/costsReport.tw index 1b2c9071492b2cb4705fd3cab9a9536e02b57494..947bbe35e79b8371b1f17c752d542216c34bdc74 100644 --- a/src/uncategorized/costsReport.tw +++ b/src/uncategorized/costsReport.tw @@ -15,7 +15,7 @@ EVERYTHING BELOW THIS LINE IS IGNORED BY THE GAME AND IS FOR REFERANCE/ARCHIVE PURPOSES ONLY <<set _arcologyCosts = 0>> -<<set _total = 0>> +<<set _total = 0>> //Your weekly costs are as follows.// <br><br> diff --git a/src/uncategorized/dairy.tw b/src/uncategorized/dairy.tw index dbaa325034b2d7fc9368a6eaae96d68ada909200..d4e3abf5d057c777753ea874bfdf2b187d633b54 100644 --- a/src/uncategorized/dairy.tw +++ b/src/uncategorized/dairy.tw @@ -384,7 +384,7 @@ <<elseif $dairyPregSetting == 2>> ''industrially employed.'' <<if ($seeExtreme != 0) && ($seeHyperPreg == 1) && ($dairyRestraintsSetting == 2) && ($dairyHyperPregRemodel == 1)>> - [[Mass Production|Dairy][$dairyPregSetting = 3]] | + [[Mass Production|Dairy][$dairyPregSetting = 3]] | <</if>> [[Moderate|Dairy][$dairyPregSetting = 1, $dairyPregSettingChanged = -1]] <<elseif $dairyPregSetting == 1>> @@ -467,7 +467,7 @@ [[Only during milking|Dairy][$dairyRestraintsSetting = 1, $dairyFeedersSettingChanged = -1]] <<elseif $dairyRestraintsSetting == 1>> ''when being milked,'' giving the machines full play. - [[Free range|Dairy][$dairyRestraintsSetting = 0, $dairyFeedersSettingChanged = -1]] | + [[Free range|Dairy][$dairyRestraintsSetting = 0, $dairyFeedersSettingChanged = -1]] | [[Permanent machine milking|Dairy][$dairyRestraintsSetting = 2, $dairyFeedersSettingChanged = 1]] <<else>> ''only when necessary,'' allowing obedient cows freedom to range around. @@ -583,29 +583,29 @@ <<if $dairyImplantsSetting == 1>> All cows will undergo lactation implant surgery to increase their milk output. <div class="choices"> - [[Restrict lactation surgery on cum-cows|Dairy][$dairyImplantsSetting = 0]] | - [[Restrict maximization surgery on cattle|Dairy][$dairyImplantsSetting = 2]] | + [[Restrict lactation surgery on cum-cows|Dairy][$dairyImplantsSetting = 0]] | + [[Restrict maximization surgery on cattle|Dairy][$dairyImplantsSetting = 2]] | [[Encourage natural lactation in cattle|Dairy][$dairyImplantsSetting = 3]] </div> <<elseif $dairyImplantsSetting == 2>> Cows will not undergo surgical procedures to maximize production. <div class="choices"> - [[Maximize production in all cattle|Dairy][$dairyImplantsSetting = 1]] | - [[Maximize production in only milkable cows|Dairy][$dairyImplantsSetting = 0]] | + [[Maximize production in all cattle|Dairy][$dairyImplantsSetting = 1]] | + [[Maximize production in only milkable cows|Dairy][$dairyImplantsSetting = 0]] | [[Encourage natural lactation in cattle|Dairy][$dairyImplantsSetting = 3]] </div> <<elseif $dairyImplantsSetting == 3>> Non-lactating cows incapable of producing cum will undergo manual stimulation to promote natural production. <div class="choices"> - [[Maximize production in all cattle|Dairy][$dairyImplantsSetting = 1]] | - [[Maximize production in only milkable cows|Dairy][$dairyImplantsSetting = 0]] | + [[Maximize production in all cattle|Dairy][$dairyImplantsSetting = 1]] | + [[Maximize production in only milkable cows|Dairy][$dairyImplantsSetting = 0]] | [[Restrict maximization surgery on cattle|Dairy][$dairyImplantsSetting = 2]] </div> <<else>> Naturally lactating cows, cows with non-lactating breasts, and cows incapable of producing cum will undergo lactation implant surgery to increase their milk output. <div class="choices"> - [[Maximize lactation in all cattle|Dairy][$dairyImplantsSetting = 1]] | - [[Restrict maximization surgery on cattle|Dairy][$dairyImplantsSetting = 2]] | + [[Maximize lactation in all cattle|Dairy][$dairyImplantsSetting = 1]] | + [[Restrict maximization surgery on cattle|Dairy][$dairyImplantsSetting = 2]] | [[Encourage natural lactation in cattle|Dairy][$dairyImplantsSetting = 3]] </div> <</if>> @@ -623,38 +623,38 @@ <<if $dairyWeightSetting == 0>> $dairyNameCaps is keeping cows at least chubby. <div class="choices"> - [[Increase Weight Target|Dairy][$dairyWeightSetting = 1]] | + [[Increase Weight Target|Dairy][$dairyWeightSetting = 1]] | [[Disable Dietary Control|Dairy][$dairyWeightSetting = -1]] <<print _note>> </div> <<elseif $dairyWeightSetting == 1>> $dairyNameCaps aims to keep cows overweight. <div class="choices"> - [[Increase Weight Target|Dairy][$dairyWeightSetting = 2]] | - [[Decrease Weight Target|Dairy][$dairyWeightSetting = 0]] | + [[Increase Weight Target|Dairy][$dairyWeightSetting = 2]] | + [[Decrease Weight Target|Dairy][$dairyWeightSetting = 0]] | [[Disable Dietary Control|Dairy][$dairyWeightSetting = -1]] <<print _note>> </div> <<elseif $dairyWeightSetting == 2>> $dairyNameCaps aims to keep cows fat. <div class="choices"> - [[Increase Weight Target|Dairy][$dairyWeightSetting = 3]] | - [[Decrease Weight Target|Dairy][$dairyWeightSetting = 1]] | + [[Increase Weight Target|Dairy][$dairyWeightSetting = 3]] | + [[Decrease Weight Target|Dairy][$dairyWeightSetting = 1]] | [[Disable Dietary Control|Dairy][$dairyWeightSetting = -1]] <<print _note>> </div> <<elseif $dairyWeightSetting == 3>> $dairyNameCaps aims to keep cows very fat. <div class="choices"> - [[Increase Weight Target|Dairy][$dairyWeightSetting = 4]] | - [[Decrease Weight Target|Dairy][$dairyWeightSetting = 2]] | + [[Increase Weight Target|Dairy][$dairyWeightSetting = 4]] | + [[Decrease Weight Target|Dairy][$dairyWeightSetting = 2]] | [[Disable Dietary Control|Dairy][$dairyWeightSetting = -1]] <<print _note>> </div> <<elseif $dairyWeightSetting == 4>> $dairyNameCaps aims to keep cows so fat they can barely move. <div class="choices"> - [[Decrease Weight Target|Dairy][$dairyWeightSetting = 3]] | + [[Decrease Weight Target|Dairy][$dairyWeightSetting = 3]] | [[Disable Dietary Control|Dairy][$dairyWeightSetting = -1]] <<print _note>> </div> diff --git a/src/uncategorized/dairyReport.tw b/src/uncategorized/dairyReport.tw index 969f2fc0d7daf485b3968822dfa07a85b088f444..a0e7cca8880e2d3e37edc24ce2fb586a6cdebe54 100644 --- a/src/uncategorized/dairyReport.tw +++ b/src/uncategorized/dairyReport.tw @@ -877,11 +877,11 @@ <</if>> <<elseif ($slaves[$i].pregKnown == 1)>> <<if ($dairyPregSetting > 2)>> - <<run cashX(100, "milked", $slaves[$i])>> + <<run cashX(100, "slaveAssignmentDairy", $slaves[$i])>> <<elseif ($dairyPregSetting > 1)>> - <<run cashX(50, "milked", $slaves[$i])>> + <<run cashX(50, "slaveAssignmentDairy", $slaves[$i])>> <<else>> - <<run cashX(25, "milked", $slaves[$i])>> + <<run cashX(25, "slaveAssignmentDairy", $slaves[$i])>> <</if>> <<if ($dairyPregSetting > 1) && ($slaves[$i].vagina < 4)>> <<set $slaves[$i].vagina++>> @@ -946,11 +946,11 @@ <<if $inflatedSlavesMilk > 0>> <<set _cashX -= Math.trunc(((600*($inflatedSlavesMilk)+8)+random(50,200)))>> - <<run cashX(_cashX, "milked")>> + <<run cashX(_cashX, "slaveAssignmentDairy")>> <</if>> <<if $inflatedSlavesCum > 0>> <<set _cashX -= Math.trunc(((300*($inflatedSlavesCum+8))+random(25,100)))>> - <<run cashX(_cashX, "milked")>> + <<run cashX(_cashX, "slaveAssignmentDairy")>> <</if>> <<set _profits = $cash-_oldCash>> diff --git a/src/uncategorized/descriptionOptions.tw b/src/uncategorized/descriptionOptions.tw index 924bbe4d7d808fcf4bbe5f856e7f99b58e2616d7..d711901c483e9044c5c9ec73ff7753be2a7cdbb4 100644 --- a/src/uncategorized/descriptionOptions.tw +++ b/src/uncategorized/descriptionOptions.tw @@ -97,10 +97,12 @@ <</options>> <<options $showInches>> Height and length units are in + <<option 0 "Metric">> + <<option 1 "Both">> <<option 2 "Imperial">> - <<option 1 "Metric">> <</options>> + <div class="subHeading"> <<if $seeDicks > 0>> <br> <<options $showDickCMs>> diff --git a/src/uncategorized/endWeek.tw b/src/uncategorized/endWeek.tw index 28ae617d99327cd024ee3daa80df824a7152f3f7..4375e86ecb7d94a4289f7c1d70c607c7965e74f4 100644 --- a/src/uncategorized/endWeek.tw +++ b/src/uncategorized/endWeek.tw @@ -6,6 +6,7 @@ <<run setupLastWeeksRep()>> <<set $gingering = 0, $oralUseWeight = 5, $vaginalUseWeight = 5, $analUseWeight = 5, $mammaryUseWeight = 1, $penetrativeUseWeight = 1, $inflatedSlavesMilk = 0, $inflatedSlavesCum = 0, $subSlaves = 0>> +<<unset $slaveMarket>> <<if $OralEncouragement == 1>> <<set $oralUseWeight += 2, $vaginalUseWeight -= 1, $analUseWeight -= 1>> diff --git a/src/uncategorized/fullReport.tw b/src/uncategorized/fullReport.tw index 196169848a376c1f5763c6b6f615fb119dd9e2a2..8475415180e5d62b72a00939501863455a40a281 100644 --- a/src/uncategorized/fullReport.tw +++ b/src/uncategorized/fullReport.tw @@ -25,7 +25,7 @@ <<case "take classes">> <<= saTakeClasses($slaves[$i])>> <<case "please you">> - <<include "SA please you">> + <<= saPleaseYou($slaves[$i])>> <<case "be a subordinate slave">> <<include "SA serve your other slaves">> <<case "be a servant">> @@ -33,9 +33,9 @@ <<case "stay confined">> <<= saStayConfined($slaves[$i])>> <<case "guard you">> - <<include "SA guard you">> + <<= saGuardYou($slaves[$i])>> <<case "be your Head Girl">> - <<include "SA be your Head Girl">> + <<= saBeYourHeadGirl($slaves[$i])>> <<case "recruit girls">> <<include "SA recruit girls">> <<default>> diff --git a/src/uncategorized/genericPlotEvents.tw b/src/uncategorized/genericPlotEvents.tw index 3a2f505f3b35c86167866bf249a61b3b9b277028..079e3e667087f71f7b779a7aeba48981560c85ef 100644 --- a/src/uncategorized/genericPlotEvents.tw +++ b/src/uncategorized/genericPlotEvents.tw @@ -52,7 +52,7 @@ The firm promptly pays @@.yellowgreen; a large compensation@@ for potentially ru It's been a good few weeks, getting settled in as owner of $arcologies[0].name. The power of being overlord of this great building and everyone in it is incredible, but so is the responsibility. It's a good thing you have ample opportunities for stress relief. You're going to need them after today. There's a nasty disturbance on a business level of the arcology. Normally, the arcology's public safety drones would suppress this kind of nonsense, but $assistant.name program is suggesting that you resolve the dispute. <br><br> -As you step off the elevator, you hear several <<if $seeDicks != 100>>female <</if>>voices shouting. Apparently one of $arcologies[0].name's few remaining strip joints has closed. It was a topless bar and strip club all in one, but the owner is packing up his things. He's explaining to a crowd of his angry former employees that he can't make ends meet. As the price of a slave whore is barely higher than that of a lap dance from a free stripper; it's not surprising. It looks like the girls are on the verge of trashing the place. +As you step off the elevator, you hear several <<if $seeDicks != 100>>female <</if>>voices shouting. Apparently one of $arcologies[0].name's few remaining strip joints has closed. It was a topless bar and strip club all in one, but the owner is packing up his things. He's explaining to a crowd of his angry former employees that he can't make ends meet. As the price of a slave whore is barely higher than that of a lap dance from a free stripper, it's not surprising. It looks like the former dancers are on the verge of trashing the place. <<case "strip club aftermath">> @@ -367,7 +367,7 @@ When the aircraft lands at your penthouse pad, the would-be escapees are still u <</if>> <<set $one_time_age_overrides_pedo_mode = 1>> /% Old enough to be pregnant. %/ <<set $oneTimeDisableDisability = 1>> - <<set $activeSlave = GenerateNewSlave("XX")>> + <<set $activeSlave = GenerateNewSlave("XX", {mature: 0})>> <<set $activeSlave.origin = "$He was an expectant mother you enslaved when you evacuated $him from a threatened old world hospital.">> <<set $activeSlave.career = "a housewife">> <<set $activeSlave.devotion = random(-90,-75)>> @@ -495,7 +495,7 @@ When the aircraft lands at your penthouse pad, the would-be escapees are still u <<set $one_time_age_overrides_pedo_mode = 1>> /% Old enough to be pregnant. %/ <<set $oneTimeDisableDisability = 1>> <<set $fixedRace = "white">> - <<set _missLeader = GenerateNewSlave("XX")>> + <<set _missLeader = GenerateNewSlave("XX", {mature: 0})>> <<set _missLeader.origin = "$He was the head nun of a conquered mission. Once claimed, $he was reduced to nothing more than a cum dump for $his black masters.">> <<set _missLeader.career = "a nun">> <<set _missLeader.intelligence = random(16,80)>> diff --git a/src/uncategorized/growthResearchInstitute.tw b/src/uncategorized/growthResearchInstitute.tw index 869d8babdf9a84e2f4d6222230c73699fd702bd1..94f05d198578d73a1949eea64121d91f6d744f00 100644 --- a/src/uncategorized/growthResearchInstitute.tw +++ b/src/uncategorized/growthResearchInstitute.tw @@ -1,17 +1,19 @@ :: Growth Research Institute [nobr] -<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools">> +<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools", $slaveMarket = "GRI">> /* Multi-Purchase Support */ <<if ndef $newSlaves>><<set $newSlaves = []>><</if>> <<if $newSlaves.length > 0>> - <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $slaveMarket = "GRI", $returnTo = "Main", $newSlaveIndex = 0>> + <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $returnTo = "Main", $newSlaveIndex = 0>> <</if>> //The Growth Research Institute (GRI) is not primarily a slave school at all, but rather the world leader in female growth hormone development. It operates research centers in the Free Cities to avoid traditional medical research laws. GRI runs several slave schools to raise healthy, unmodified subjects for use in trials. After a year of experimental hormone treatment they are sold. <<if $GRI.schoolUpgrade != 0>><br><br>You have endowed <<if $GRI.schoolUpgrade == 1>>a research focus on advanced curatives; most subjects now leave the GRI at unnatural levels of vitality.<<else>>a research focus on milk production; subjects' breasts are bigger and milkier than ever.<</if>> As a major benefact<<if $PC.title == 0>>rix<<else>>or<</if>> of the institution, you also receive a discount on them.<</if>>// <br><br>GRI offers a fresh graduate for inspection via video call. The interview takes place in the graduate's bare-metal holding cell. Disturbingly, it is strongly reminiscent of an enclosure for a lab animal, only scaled up to contain a lab animal of human dimensions. -<<= generateMarketSlave("GRI")>> +<<set _marketResult = generateMarketSlave("GRI")>> +<<set $activeSlave = _marketResult.slave>> +<<print _marketResult.text>> <<set _slaveCost = slaveCost($activeSlave)>> <<setLocalPronouns $activeSlave>> <<if $GRI.schoolSale != 0>> diff --git a/src/uncategorized/lawCompliance.tw b/src/uncategorized/lawCompliance.tw index 7495980d049cb0db26702d79c10ac0b4072cd6c4..a1a041824be3a2d38b0e59a02fc2aa02e504f72b 100644 --- a/src/uncategorized/lawCompliance.tw +++ b/src/uncategorized/lawCompliance.tw @@ -369,7 +369,7 @@ <<if $activeSlave.face < 20>> <<set $activeSlave.face = random(20,100)>> <</if>> - While $he was in the slave pens, $he saw that less attractive slaves were immediately designated as menials and Fuckdolls, and $he is @@.gold;terrified@@ that should $he loses $his beauty, $he'll be considered worthless and be reassigned on the spot. + While $he was in the slave pens, $he saw that less attractive slaves were immediately designated as menials and Fuckdolls, and $he is @@.gold;terrified@@ that should $he lose $his beauty, $he'll be considered worthless and be reassigned on the spot. <<set $activeSlave.trust -= 5>> <</if>> diff --git a/src/uncategorized/lecoleDesEnculees.tw b/src/uncategorized/lecoleDesEnculees.tw index 608f2a2856fb0c9e866969bcf5e57500b6c0521a..81125c83625265ea7a794e45f467baca3f2d88e2 100644 --- a/src/uncategorized/lecoleDesEnculees.tw +++ b/src/uncategorized/lecoleDesEnculees.tw @@ -1,17 +1,19 @@ :: L'École des Enculées [nobr] -<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools">> +<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools", $slaveMarket = "LDE">> /* Multi-Purchase Support */ <<if ndef $newSlaves>><<set $newSlaves = []>><</if>> <<if $newSlaves.length > 0>> - <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $slaveMarket = "LDE", $returnTo = "Main", $newSlaveIndex = 0>> + <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $returnTo = "Main", $newSlaveIndex = 0>> <</if>> //L'École des Enculées is one of the oldest networks of slave schools, but because its training must be started early, it is only now beginning to produce and show a return on its investors' stakes. It aims to produce graduates more feminine than the average naturally born female, in spite of their having been born male. The school is a global leader in hormonal feminization, which allows it to produce curvier slaves than many schools that focus on natural females. It also retains its graduates for a year after their majority and their enslavement, so as to be able to legally subject them to intensive sexual conditioning that focuses on their prostates as their main remaining locus of arousal. <<if $LDE.schoolUpgrade != 0>><br><br>Since you have endowed <<if $LDE.schoolUpgrade == 1>>the regular application of drugs to induce extreme infatuation in its graduates towards the first dominant person they encounter, any graduate purchased here will now promptly fall in love with you.<<else>>research into narrowly targeted hormonal treatments, its graduates are now available with generous members despite their femininity.<</if>> As a major benefact<<if $PC.title == 0>>rix<<else>>or<</if>> of the institution, you also receive a discount on them.<</if>>// <br><br>L'École des Enculées offers a fresh graduate for inspection via video call. The interview takes place in the dormitory for the oldest class of girls. Absurdly sexual squeals repeatedly interrupt the call, making it very clear that someone close by the interviewee is experiencing a strong combination of anal pain and anal pleasure. -<<= generateMarketSlave("LDE")>> +<<set _marketResult = generateMarketSlave("LDE")>> +<<set $activeSlave = _marketResult.slave>> +<<print _marketResult.text>> <<set _slaveCost = slaveCost($activeSlave)>> <<if $LDE.schoolSale != 0>> <<set _slaveCost = Math.trunc(_slaveCost*0.5)>> diff --git a/src/uncategorized/longSlaveDescription.tw b/src/uncategorized/longSlaveDescription.tw index f638f0b2317976db9a7ef5cb95490cabb8287db2..28e8f6c699b01ac1528c91612bc2389ba1f06739 100644 --- a/src/uncategorized/longSlaveDescription.tw +++ b/src/uncategorized/longSlaveDescription.tw @@ -1937,7 +1937,7 @@ $He is <</if>> <<if $activeSlave.fuckdoll == 0>> - <<nailsDescription>> + <<= App.Desc.nails($activeSlave)>> <</if>> <<= App.Desc.mods($activeSlave, "back")>> <<= App.Desc.mods($activeSlave, "shoulder")>> @@ -2036,6 +2036,8 @@ $He is <</if>> <<case "intensive breast injections">> <<if hasAnyArms($activeSlave)>>$He massages $his tits uncomfortably<<else>>$He squirms under the unfamiliar weight on $his chest<</if>>. The A-HGH must be having an effect, painfully stretching $his breasts as the mammary and adipose tissue underneath grows explosively. + <<case "nipple enhancers">> + <<if hasAnyArms($activeSlave)>>$He massages $his nipples uncomfortably<<else>>$He squirms in response to the discomfort in $his breasts<</if>>. The A-HGH must be having an effect, painfully causing $his body to expand $his nipples. <<case "hyper breast injections">> <<if hasAnyArms($activeSlave)>>$He massages $his tits uncomfortably<<else>>$He squirms under the unfamiliar weight on $his chest<</if>>. The HA-HGH must be having an effect, painfully stretching $his breasts as the mammary and adipose tissue underneath grows explosively. <<case "intensive butt injections">> diff --git a/src/uncategorized/manageArcology.tw b/src/uncategorized/manageArcology.tw index c97c4b352b9dd357e171a2bc95191385a47101af..0728e40674fb62aebf5316f37da4160ae0dfc720 100644 --- a/src/uncategorized/manageArcology.tw +++ b/src/uncategorized/manageArcology.tw @@ -75,15 +75,11 @@ The next major upgrade needed is an improvement of the arcology's electrical transmission lines to make efficient use of the additional power from the solar apron. This upgrade will cost <<print cashFormat(Math.trunc(50000*$upgradeMultiplierArcology))>>. </span> [[Upgrade transmission lines|Manage Arcology][cashX(forceNeg(Math.trunc(50000*$upgradeMultiplierArcology)), "capEx"), $arcologyUpgrade.grid = 1, $PC.skill.engineering += 1]] - <<elseif $arcologyUpgrade.spire != 1>> - <span class="note"> - The next major upgrade needed is the addition of a spire at the top of the arcology to increase the space available for the wealthiest citizens to own whole floors. This huge project will cost <<print cashFormat(Math.trunc(250000*$upgradeMultiplierArcology))>>. - </span> - [[Add spire|Manage Arcology][cashX(forceNeg(Math.trunc(250000*$upgradeMultiplierArcology)), "capEx"), $arcologyUpgrade.spire = 1, $building.sections.push(new App.Arcology.Section("spire", [[new App.Arcology.Cell.Apartment(1, 2), new App.Arcology.Cell.Apartment(1, 2)], [new App.Arcology.Cell.Apartment(1, 2), new App.Arcology.Cell.Apartment(1, 2)]])), $PC.skill.engineering += 1]] <<else>> <span class="note"> The arcology's public areas are fully upgraded. </span> + <<= App.UI.DOM.includeDOM(App.Arcology.upgrades($building))>> <</if>> </div> @@ -99,7 +95,7 @@ <</if>> </span> [[Apply weather cladding|Manage Arcology][cashX(forceNeg(Math.trunc(50000*$upgradeMultiplierArcology)), "capEx"), $weatherCladding = 1, $PC.skill.engineering += 1]] - <<elseif $weatherCladding == 1 && $arcologyUpgrade.spire == 1>> + <<elseif $weatherCladding == 1 && $building.sections.length > 0>> The arcology's exterior is jacketed with unsightly but sturdy weather cladding. Your arcology is so prosperous that remodeling the cladding into something beautiful is within the realm of possibility. This massive project will cost <<print cashFormat(Math.trunc(3500000*$upgradeMultiplierArcology))>> and without a doubt render your arcology one of the wonders of the world. [[Remodel weather cladding|Manage Arcology][cashX(forceNeg(Math.trunc(3500000*$upgradeMultiplierArcology)), "capEx"), $weatherCladding = 2, $PC.skill.engineering += 1]] <<elseif $weatherCladding == 1>> diff --git a/src/uncategorized/masterSuiteReport.tw b/src/uncategorized/masterSuiteReport.tw index dc52252ef2c1a4a88e61021894f4de9e6f6f3c3d..e3750fea6358aa0644fd8729ec945fb0b5347ace 100644 --- a/src/uncategorized/masterSuiteReport.tw +++ b/src/uncategorized/masterSuiteReport.tw @@ -364,7 +364,7 @@ <</if>> <<if $verboseDescriptions == 1>> - <br> $He <<include "SA please you">> + <br> $He <<= saPleaseYou($slaves[$i])>> <br> <<if $servantMilkers == 1 && $slaves[$i].lactation > 0 && $slaves[$i].fuckdoll == 0 && $slaves[$i].fetish != "mindbroken" && canWalk($slaves[$i]) && $slaves[$i].intelligence+$slaves[$i].intelligenceImplant >= -90>> When $his breasts begin to feel full and you aren't around, $he avails $himself to the penthouse milkers and @@ -385,7 +385,7 @@ <<else>> <<silently>> <<include "SA chooses own job">> - <<include "SA please you">> + <<run saPleaseYou($slaves[$i])>> <<if $servantMilkers == 1 && $slaves[$i].lactation > 0 && $slaves[$i].fuckdoll == 0 && $slaves[$i].fetish != "mindbroken" && canWalk($slaves[$i]) && $slaves[$i].intelligence+$slaves[$i].intelligenceImplant >= -90>> <<set $servantMilkersMultiplier = 0.25>> <<run saGetMilked($slaves[$i])>> diff --git a/src/uncategorized/newGamePlus.tw b/src/uncategorized/newGamePlus.tw index ccacf4a86b0076f2bdaa8534bd753e40f51f6114..32041f40d4c0c45b5cb08ec8246f9af87585e54a 100644 --- a/src/uncategorized/newGamePlus.tw +++ b/src/uncategorized/newGamePlus.tw @@ -23,6 +23,7 @@ You <<if $cash >= _fee>>have<<else>>lack<</if>> the funds to bring more than $sl <br> +<<set $ngpParams = { nationality: getRevivalistNationality(), prosperity: (250 * $arcologies[0].prosperity * $arcologies[0].ownership) }>> <<if $freshPC == 0>> <<if $retainCareer == 1 && $PC.career != "arcology owner">> <<if $week > 52 || ($PC.skill.slaving >= 100 && $PC.skill.trading >= 100 && $PC.skill.warfare >= 100 && $PC.skill.engineering >= 100 && $PC.skill.medicine >= 100 && $PC.skill.hacking >= 100)>> diff --git a/src/uncategorized/nextWeek.tw b/src/uncategorized/nextWeek.tw index 654aea45b97abb554bfc61f1c71a667d0d99f861..0843290b2ec43a7d7a4cd0bdd7249df06bb22cd4 100644 --- a/src/uncategorized/nextWeek.tw +++ b/src/uncategorized/nextWeek.tw @@ -271,11 +271,15 @@ <<set $PC.forcedFertDrugs-->> <</if>> -<<if $FCTV.receiver > 0 && $FCTV.pcViewership.frequency != -1>> - <<set $FCTV.pcViewership.count++>> - <<if $FCTV.pcViewership.count >= $FCTV.pcViewership.frequency>> - <<set $FCTV.pcViewership.count = 0>> +<<if $FCTV.receiver > 0>> + <<if $FCTV.pcViewership.frequency != -1>> + <<set $FCTV.pcViewership.count++>> + <<if $FCTV.pcViewership.count >= $FCTV.pcViewership.frequency>> + <<set $FCTV.pcViewership.count = 0>> + <</if>> <</if>> + <<set $FCTV.channel.last = $FCTV.channel.selected>> + <<run delete $FCTV.channel.selected>> <<run delete $usedRemote>> <<run delete $all>> <<run delete $show>> <</if>> <<set $week++>> @@ -350,7 +354,7 @@ <<set $boobsID = -1, $boobsInterestTargetID = -1, $buttslutID = -1, $buttslutInterestTargetID = -1, $cumslutID = -1, $cumslutInterestTargetID = -1, $humiliationID = -1, $humiliationInterestTargetID = -1, $sadistID = -1, $sadistInterestTargetID = -1, $masochistID = -1, $masochistInterestTargetID = -1, $domID = -1, $dominantInterestTargetID = -1, $subID = -1, $submissiveInterestTargetID = -1>> /% Other arrays %/ -<<set $events = [], $RESSevent = [], $RESSTRevent = [], $RETSevent = [], $RECIevent = [], $RecETSevent = [], $REFIevent = [], $REFSevent = [], $PESSevent = [], $PETSevent = [], $FSAcquisitionEvents = [], $FSNonconformistEvents = [], $REAnalCowgirlSubIDs = [], $REButtholeCheckinIDs = [], $recruit = [], $RETasteTestSubIDs = [], $devotedSlaves = [], $rebelSlaves = [], $REBoobCollisionSubIDs = [], $REIfYouEnjoyItSubIDs = [], $RESadisticDescriptionSubIDs = [], $REShowerForceSubIDs = [], $RESimpleAssaultIDs = [], $RECockmilkInterceptionIDs = [], $REInterslaveBeggingIDs = [], $bedSlaves = [], $eligibleSlaves = []>> +<<set $events = [], $RESSevent = [], $RESSTRevent = [], $RETSevent = [], $RECIevent = [], $RecETSevent = [], $REFIevent = [], $REFSevent = [], $PESSevent = [], $PETSevent = [], $FSAcquisitionEvents = [], $FSNonconformistEvents = [], $REAnalCowgirlSubIDs = [], $REButtholeCheckinIDs = [], $recruit = [], $RETasteTestSubIDs = [], $rebelSlaves = [], $REBoobCollisionSubIDs = [], $REIfYouEnjoyItSubIDs = [], $RESadisticDescriptionSubIDs = [], $REShowerForceSubIDs = [], $RESimpleAssaultIDs = [], $RECockmilkInterceptionIDs = [], $REInterslaveBeggingIDs = [], $bedSlaves = [], $eligibleSlaves = []>> /% Slave Objects using 0 instead of null. Second most memory eaten up. %/ <<set $activeSlave = 0, $eventSlave = 0, $slaveWithoutBonuses = 0, $subSlave = 0, $milkTap = 0, $relation = 0, $relative = 0, $relative2 = 0>> diff --git a/src/uncategorized/options.tw b/src/uncategorized/options.tw index 7ed9c60c58abd10b144537254a89f004940c22be..b6437eac4e9edb96236a76072464eebf7247d5fc 100644 --- a/src/uncategorized/options.tw +++ b/src/uncategorized/options.tw @@ -58,7 +58,11 @@ This save was created using FC version $ver build $releaseID. <</link>> <</if>> <<if $familyTesting == 1>> - <br><<link "Reset extended family mode controllers">><<goto "family panic">><</link>> //Clears and rebuilds .sister and .daughter tracking.// + <br><<link "Reset extended family mode controllers">> + <<run resetFamilyCounters()>> + <<replace "#familyHint">>//@@.lightgreen;Done:@@ all family relations flushed and rebuilt.//<</replace>> + <</link>> + <span id="familyHint">//Clears and rebuilds .sister and .daughter tracking.//</span> <</if>> <<if isNaN($rep)>> <br>[[Reset Reputation|Options][$rep = 0]] @@ -85,13 +89,13 @@ This save was created using FC version $ver build $releaseID. <<run App.UI.tabbar.handlePreSelectedTab($tabChoice.Options)>> -<br> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Display')" id="tab Display">Display</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'CONTENT&FLAVOR')" id="tab CONTENT&FLAVOR">Content & flavour</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'MODS')" id="tab MODS">Mods</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'DEBUG/CHEATING')" id="tab DEBUG/CHEATING">Debug/cheating</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Experimental')" id="tab Experimental">Experimental</button> -<br> +<div class="tabbar"> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Display')" id="tab Display">Display</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'CONTENT&FLAVOR')" id="tab CONTENT&FLAVOR">Content & flavour</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'MODS')" id="tab MODS">Mods</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'DEBUG/CHEATING')" id="tab DEBUG/CHEATING">Debug/cheating</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Experimental')" id="tab Experimental">Experimental</button> +</div> <div id="Display" class="tabcontent"> <div class="content"> @@ -293,6 +297,14 @@ This save was created using FC version $ver build $releaseID. <<option 0 "Hidden">> <</options>> + <<options $sideBarOptions.confirmWeekEnd>> + Confirmation before ending a week: + <<option 1 "Enabled">> + <<option 0 "Disabled">> + <<comment>> + Enabling this will open a dialog box to confirm you meant to end a week. + <</options>> + <<if $secExpEnabled > 0>> <<options $sideBarOptions.Authority>> Authority is @@ -1041,11 +1053,11 @@ This save was created using FC version $ver build $releaseID. <div id="Experimental" class="tabcontent"> <div class="subHeading" style="fontWeight:bold"> - Experimental means just that: experimental. Options below are likely to be in an <span class="yellow">even more incomplete or broken state than usual.</span> <span class="red">THEY MAY NOT WORK AT ALL.</span> Make sure you back up your save before enabling any of these, and if you are that interested, consider helping to improve them. + Experimental means just that: experimental. Options below are likely to be in an <span class="yellow">even more incomplete or broken state than usual.</span> <span class="red">THEY MAY NOT WORK AT ALL.</span> Make sure you back up your save before enabling any of these, and if you are that interested, consider helping to improve them. </div> <p> - UI theme selector. Allows to select a single CSS file to be loaded. <span class="red">The file has to be located in the same directory as the HTML file otherwise it will simply not load at all.</span> <span class="yellow">Themes do not persist through page reloads.</span> + UI theme selector. Allows to select a single CSS file to be loaded. <span class="red">The file has to be located in the same directory as the HTML file otherwise it will simply not load at all.</span> <<print App.UI.DOM.includeDOM(App.UI.Theme.selector(), "themeSelector")>> </p> @@ -1055,7 +1067,7 @@ This save was created using FC version $ver build $releaseID. <<option 1 "Enabled">> <<option 0 "Disabled">> <<comment>> - This will enable the experimental nursery, which allows players to interact with growing slave children. An alternative to the incubator. + This will enable the experimental nursery, which allows players to interact with growing slave children. An alternative to the incubator. <</options>> <</if>> @@ -1083,7 +1095,7 @@ This save was created using FC version $ver build $releaseID. <<option 1 "Enabled">> <<option 0 "Disabled">> <<comment>> - This will enable a controversial but very broken event. Warning: Snuff, cannibalism. + This will enable a controversial but very broken event. Warning: Snuff, cannibalism. <</options>> <</if>> </div> diff --git a/src/uncategorized/pMercenaryRomeo.tw b/src/uncategorized/pMercenaryRomeo.tw index 7e33ba92509e9c64b776aee6fd33537a345f9f89..e44f9645d50b45dcfa4fc73f8adf1528ecce805f 100644 --- a/src/uncategorized/pMercenaryRomeo.tw +++ b/src/uncategorized/pMercenaryRomeo.tw @@ -130,7 +130,7 @@ proffered by an attentive slave _girlU, he seems almost bashful. <h3>$His records...</h3> <div class="note"> <div class="indent"> - $His current task is to <<print $activeSlave.assignment>><<if $assignmentRecords[$slaves[$i].ID]>>, and before that to <<print $assignmentRecords[$slaves[$i].ID]>><</if>>. + $His current task is to <<print $activeSlave.assignment>><<if $assignmentRecords[$activeSlave.ID]>>, and before that to <<print $assignmentRecords[$activeSlave.ID]>><</if>>. </div> <<SlaveExpensesExtra $activeSlave>> </div> diff --git a/src/uncategorized/persBusiness.tw b/src/uncategorized/persBusiness.tw index 8f57105528d97458885050785867dd8afe197f97..423c186faa8907e18c08ad497760d0c8586d0b74 100644 --- a/src/uncategorized/persBusiness.tw +++ b/src/uncategorized/persBusiness.tw @@ -784,6 +784,7 @@ <<set _blackMarket = random(7000,8000)>> Your secret service makes use of black markets and illegal streams of goods to make a profit, making you @@.yellowgreen;<<print cashFormat(_blackMarket)>>.@@ This however allows @@.red;crime to flourish@@ in the underbelly of the arcology. <<set $SecExp.core.crimeLow += random(1,3)>> + <<run cashX(_blackMarket, "personalBusiness")>> <</if>> <<if $arcRepairTime > 0>> diff --git a/src/uncategorized/policies.tw b/src/uncategorized/policies.tw index ca1d84b233041771a9e68233775759aafac95079..f4ffc2b6da24ac41261b14053698b6f7dc833905 100644 --- a/src/uncategorized/policies.tw +++ b/src/uncategorized/policies.tw @@ -188,7 +188,7 @@ [[Repeal|Policies][$MixedMarriage = 0]] <</if>> -<<if $OralEncouragement + $OralDiscouragement + $VaginalEncouragement + $VaginalDiscouragement + $AnalEncouragement + $AnalDiscouragement + $sexualOpeness + $arcologies[0].FSRepopulationFocusPregPolicy + $arcologies[0].FSRepopulationFocusMilfPolicy + $arcologies[0].FSEgyptianRevivalistIncestPolicy + $seeExtremeUnderage > 0>> +<<if $OralEncouragement || $OralDiscouragement || $VaginalEncouragement || $VaginalDiscouragement || $AnalEncouragement || $AnalDiscouragement || $sexualOpeness || $arcologies[0].FSRepopulationFocusPregPolicy || $arcologies[0].FSRepopulationFocusMilfPolicy || $arcologies[0].FSEgyptianRevivalistIncestPolicy || $seeExtremeUnderage>> <br><br>__Sexual Trendsetting__ <<if $OralEncouragement == 1>> diff --git a/src/uncategorized/ptWorkaround.tw b/src/uncategorized/ptWorkaround.tw index 0b42660588b2d19fc4e70ce0c94cc3c2f6da5271..c9d2e9aa5befc3703be90337079daab6b60f312c 100644 --- a/src/uncategorized/ptWorkaround.tw +++ b/src/uncategorized/ptWorkaround.tw @@ -443,7 +443,7 @@ <<else>> and is in chastity, <</if>> - you spend time teaching $him sexual positions and how to someday use $his pussy to its potential. You have $him work $his Kegel muscles all week to prepare $him for the future. @@.lime;$His vaginal skills have improved,@@ but it's a slow process without practical experience. + you spend time teaching $him sexual positions and how to someday use $his pussy to its potential. You have $him work $his Kegel muscles all week to prepare $him for the future. @@.lime;$His vaginal skills have improved,@@ but it's a slow process without practical experience. <<= SkillIncrease.Vaginal($activeSlave, _vaginalTrainingEfficiency)>> <<elseif $activeSlave.skill.anal <= 30>> Since $he has only rudimentary anal skills, @@ -454,7 +454,7 @@ <<else>> and is in anal chastity, <</if>> - you spend time teaching $him sexual positions and how to someday use $his asshole to its potential. You have $him work $his Kegel muscles and anal sphincter all week to prepare $him for the future. @@.lime;$His anal skills have improved,@@ but it's a slow process without practical experience. + you spend time teaching $him sexual positions and how to someday use $his asshole to its potential. You have $him work $his Kegel muscles and anal sphincter all week to prepare $him for the future. @@.lime;$His anal skills have improved,@@ but it's a slow process without practical experience. <<= SkillIncrease.Anal($activeSlave, _analTrainingEfficiency)>> <<elseif $activeSlave.skill.vaginal < 100 && $activeSlave.vagina >= 0>> $He already a skilled pussy slut, @@ -465,7 +465,7 @@ <<else>> despite $his chastity, <</if>> - but lacks practical experience. You train $him in the basics of <<if $seePee == 1>>urine play, <</if>>massage, pet play, needle play, and many other niche skills. You also work with $him to develop a personal regimen of vaginal muscle exercises. This will enable $him to squeeze and massage dicks with $his practiced vaginal walls. You spend time expanding $his knowledge of sexual positions. @@.lime;$His vaginal skills have improved,@@ but it's a slow process without proper training. + but lacks practical experience. You train $him in the basics of <<if $seePee == 1>>urine play, <</if>>massage, pet play, needle play, and many other niche skills. You also work with $him to develop a personal regimen of vaginal muscle exercises. This will enable $him to squeeze and massage dicks with $his practiced vaginal walls. You spend time expanding $his knowledge of sexual positions. @@.lime;$His vaginal skills have improved,@@ but it's a slow process without proper training. <<= SkillIncrease.Vaginal($activeSlave, _vaginalTrainingEfficiency)>> <<elseif $activeSlave.skill.anal < 100>> $He already a skilled anal bitch, @@ -476,7 +476,7 @@ <<else>> despite $his anal chastity, <</if>> - but lacks practical experience. You train $him in the basics of <<if $seePee == 1>>urine play, <</if>>massage, pet play, needle play, and many other niche skills. You also expand $his knowledge of sexual positions. $He learns to balance $himself on tiptoe for the challenge of standing anal sex without support. @@.lime;$His anal skills have improved,@@ but it's a slow process without proper training. + but lacks practical experience. You train $him in the basics of <<if $seePee == 1>>urine play, <</if>>massage, pet play, needle play, and many other niche skills. You also expand $his knowledge of sexual positions. $He learns to balance $himself on tiptoe for the challenge of standing anal sex without support. @@.lime;$His anal skills have improved,@@ but it's a slow process without proper training. <<= SkillIncrease.Anal($activeSlave, _analTrainingEfficiency)>> <<else>> $He's learned everything you can teach, and is now a masterful diff --git a/src/uncategorized/randomEventRoll.tw b/src/uncategorized/randomEventRoll.tw index fd1ee7d70c5a268080ff3b5e420f1d097dcd5956..43d7412525e5fdeac61f9de018855132527632e9 100644 --- a/src/uncategorized/randomEventRoll.tw +++ b/src/uncategorized/randomEventRoll.tw @@ -1,4 +1,8 @@ :: random event roll <<set $goto = $events.random()>> +<<if $goto.startsWith("JSRE")>> + <<run App.Events.setGlobalEventForPassageTransition($goto)>> + <<goto "JS Random Event">> +<</if>> <<goto $goto>> diff --git a/src/uncategorized/randomEventSelect.tw b/src/uncategorized/randomEventSelect.tw index e935ed03b6885381b890ed563e61898712c546fb..e1cb5f31aeff0100cd470b2429a35adef1120e81 100644 --- a/src/uncategorized/randomEventSelect.tw +++ b/src/uncategorized/randomEventSelect.tw @@ -14,11 +14,19 @@ ''A random event would have been selected from the following:'' <<set $RESSeventIndex = 0>> <<for $i = 0; $i < $events.length; $i++>> - <br>[[$events[$i]]] - <<if $events[$i] == "RESS">> - – $RESSevent[$RESSeventIndex] - <<set $RESSeventIndex += 1>> +<<capture $i>> + <br> + <<if $events[$i].startsWith("JSRE")>> + <<set _linkText = App.Events.printEventPassage($events[$i])>> + <<link _linkText "JS Random Event">><<run App.Events.setGlobalEventForPassageTransition($events[$i])>><</link>> + <<else>> + [[$events[$i]]] + <<if $events[$i] == "RESS">> + – $RESSevent[$RESSeventIndex] + <<set $RESSeventIndex += 1>> + <</if>> <</if>> +<</capture>> <</for>> <br><br> //RESS is an amalgamated Random Event, Single Slave that combines existing single slave random events// diff --git a/src/uncategorized/randomIndividualEvent.tw b/src/uncategorized/randomIndividualEvent.tw index 3982c48566fc7d187f534d742b6020cc842a4186..5de395425e64c15aa940b434c2c138d5d39f9508 100644 --- a/src/uncategorized/randomIndividualEvent.tw +++ b/src/uncategorized/randomIndividualEvent.tw @@ -119,7 +119,7 @@ <</if>> /* EVENT RANDOMIZATION */ - <<set $events = populateEventArray()>> + <<set $events = populateEventArray().concat(App.Events.getIndividualEventsPassageList($eventSlave))>> <<if $cheatMode == 1>> <<goto "random event select">> diff --git a/src/uncategorized/randomNonindividualEvent.tw b/src/uncategorized/randomNonindividualEvent.tw index aa46228cf53ca3da508fac9c28ef0f025b6db9cd..fed74bc6481e8fffaaccc3d06f5d8dd370038409 100644 --- a/src/uncategorized/randomNonindividualEvent.tw +++ b/src/uncategorized/randomNonindividualEvent.tw @@ -333,17 +333,6 @@ /* Multislave Events */ - <<set $devotedSlaves = $slaves.filter(function(s) { return s.devotion > 50 && canWalk(s) && s.assignment != "be your agent" && s.assignment != "live with your agent"; })>> - <<if def $devotedSlaves[3]>> - <<set $devotedSlaves = $devotedSlaves.shuffle()>> - <<set $devotedSlaves.length = 4>> - <<set $devotedSlaves[0] = $devotedSlaves[0].ID>> - <<set $devotedSlaves[1] = $devotedSlaves[1].ID>> - <<set $devotedSlaves[2] = $devotedSlaves[2].ID>> - <<set $devotedSlaves[3] = $devotedSlaves[3].ID>> - <<set $events.push("RE devotees")>> - <</if>> - <<if $fuckSlaves > 1>> <<set $bedSlaves = $slaves.filter(function(s) { return s.devotion > 50 && (s.assignment == "please you" || s.assignment == "serve in the master suite" || s.assignment == "be your Concubine") && !isAmputee(s) && canDoAnal(s); })>> <<if def $bedSlaves[1]>> @@ -1468,7 +1457,7 @@ <<set _recruitEvents.shuffle()>> <<set _recruitEvents.length = _maxRecruitNumber>> <</if>> - <<set $events = $events.concat(_recruitEvents)>> + <<set $events = $events.concat(_recruitEvents).concat(App.Events.getNonindividualEventsPassageList())>> <<if $cheatMode == 1>> <<goto "random event select">> <<else>> diff --git a/src/uncategorized/reDevotees.tw b/src/uncategorized/reDevotees.tw deleted file mode 100644 index b38013428b2ffa8e42e5e619555618b32ca31b15..0000000000000000000000000000000000000000 --- a/src/uncategorized/reDevotees.tw +++ /dev/null @@ -1,56 +0,0 @@ -:: RE devotees [nobr] - -<<set $nextButton = "Continue">> -<<set $nextLink = "RIE Eligibility Check">> -<<set _red1 = $slaveIndices[$devotedSlaves[0]]>> -<<set _red2 = $slaveIndices[$devotedSlaves[1]]>> -<<set _red3 = $slaveIndices[$devotedSlaves[2]]>> -<<set _red4 = $slaveIndices[$devotedSlaves[3]]>> - -/* 000-250-006 */ -<<if $seeImages == 1>> - <div class="imageColumn"> - <div class="imageRef medImg"> - <<= SlaveArt($slaves[_red1], 2, 0)>> - </div> - <div class="imageRef medImg"> - <<= SlaveArt($slaves[_red2], 2, 0)>> - </div> - <div class="imageRef medImg"> - <<= SlaveArt($slaves[_red3], 2, 0)>> - </div> - <div class="imageRef medImg"> - <<= SlaveArt($slaves[_red4], 2, 0)>> - </div> - </div> -<</if>> -/* 000-250-006 */ - -You have a mature, well-trained household of slaves. $slaves[_red1].slaveName, $slaves[_red2].slaveName, $slaves[_red3].slaveName, and $slaves[_red4].slaveName are all devoted to you. There are all manner of ways you could display this coterie of loyal sex slaves to show off your wealth and power. -<br><br> -<span id="result"> -<<link "See an operetta with four attendants">> - <<replace "#result">> - <<run PCTitle()>> - You reserve a box at an upcoming operetta; classical Italian music is enjoying a renaissance these days. The doormen at the fashionable opera house promptly widen the velvet ropes so that you and your party may proceed unimpeded. Their quick thinking is necessary, since there are five of you walking sedately up the steps: you in the middle, impeccable in <<if $PC.title == 1>>gentleman's evening wear, complete with gloves and cane<<else>>a fine and noble lady's tuxedo<</if>>; and $slaves[_red1].slaveName, $slaves[_red2].slaveName, $slaves[_red3].slaveName, and $slaves[_red4].slaveName, all dressed in the gorgeous fashion of the seventeenth century, all plunging necklines, piled hair, and ruffled petticoats. The splendid master of ceremonies clears his throat and announces in a sonorous voice, "$PCTitle." The ostentation @@.green;turns every head and catches every eye.@@ - <<run repX(600, "event", $slaves[_red1])>> - <<run repX(600, "event", $slaves[_red2])>> - <<run repX(600, "event", $slaves[_red3])>> - <<run repX(600, "event", $slaves[_red4])>> - <</replace>> -<</link>> -<br><<link "Visit a casino in good company">> - <<replace "#result">> - The croupiers, bouncers and regulars down at the nearest casino hardly know what to think when you appear with a chit full of cash and twice as many partners as you have arms. You live the night big, starting at the poker table with so many tits and asses on display behind you that, @@.yellowgreen;baby, you make a killing.@@ $slaves[_red1].slaveName, $slaves[_red2].slaveName, $slaves[_red3].slaveName, and $slaves[_red4].slaveName quickly catch the rhythm of the place: slaves can get away with a little more in the smoky, whiskey soaked, money tinted atmosphere, and they @@.hotpink;enjoy themselves immensely.@@ They flirt, flash, giggle, kiss each other, and generally destroy the concentration of everyone within twenty <<if $showInches == 2>>yards<<else>>meters<</if>> — except you. Ring-a-ding-ding. - <<set _cashX = random(30,100)*3>> - <<set $slaves[_red1].devotion += 4>> - <<run cashX(_cashX, "event", $slaves[_red1])>> - <<set $slaves[_red2].devotion += 4>> - <<run cashX(_cashX, "event", $slaves[_red2])>> - <<set $slaves[_red3].devotion += 4>> - <<run cashX(_cashX, "event", $slaves[_red3])>> - <<set $slaves[_red4].devotion += 4>> - <<run cashX(_cashX, "event", $slaves[_red4])>> - <</replace>> -<</link>> -</span> diff --git a/src/uncategorized/reFSAcquisition.tw b/src/uncategorized/reFSAcquisition.tw index 4f18882ca0fdeb230e33a4f4956cb47d4e1f42c8..9611e9b160a9c8840cecb5534efff619fd3c235d 100644 --- a/src/uncategorized/reFSAcquisition.tw +++ b/src/uncategorized/reFSAcquisition.tw @@ -1413,7 +1413,7 @@ This one, unusually, is voice-only. The caller explains why in a painfully quiet You receive so many messages, as a noted titan of the new Free Cities world, that $assistant.name has to be quite draconian in culling them. _HeA lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were. <br><br> -The person placing the call is physically quite unusual, to the point of looking distinctly unnatural, given that they are a dwarf sporting proportinally massive implants. $He crosses $his arms under $his bust and begins a rather haughty speal, given $his size. "Now don't go thinking of calling me a midget, thi<<s>> here i<<s>> one-hundred per<<c>>ent <<sh>>ort //and// <<s>>tacked, wouldn't you agree?" $He flexes back and grabs $his fat rear, $his blouse practically exploding in the process. "What you <<s>>ee here is all your<<s>> if you a<<s>>k ni<<c>>ely. <<S>>ee, I've hard a pretty hard life," $he <<say>>s while pantomiming sucking dick, "and I'm looking to retire into lu<<x>>ury. From what I've heard, a <<s>>tar like me may a<<s>> well have a pede<<s>>tal erected in my honor in $arcologies[0].name <<s>>o that all can ba<<s>>k in my curvy glory." $He does a split, giving you a look straight into $his shaved pussy. "<<S>>o how about you invite me in <<s>>o that I can welcome //you// in?" +The person placing the call is physically quite unusual, to the point of looking distinctly unnatural, given that they are a dwarf sporting proportionally massive implants. $He crosses $his arms under $his bust and begins a rather haughty spiel, given $his size. "Now don't go thinking of calling me a midget, thi<<s>> here i<<s>> one-hundred per<<c>>ent <<sh>>ort //and// <<s>>tacked, wouldn't you agree?" $He flexes back and grabs $his fat rear, $his blouse practically exploding in the process. "What you <<s>>ee here is all your<<s>> if you a<<s>>k ni<<c>>ely. <<S>>ee, I've hard a pretty hard life," $he <<say>>s while pantomiming sucking dick, "and I'm looking to retire into lu<<x>>ury. From what I've heard, a <<s>>tar like me may a<<s>> well have a pede<<s>>tal erected in my honor in $arcologies[0].name <<s>>o that all can ba<<s>>k in my curvy glory." $He does a split, giving you a look straight into $his shaved pussy. "<<S>>o how about you invite me in <<s>>o that I can welcome //you// in?" <<case "Statuesque Glorification">> diff --git a/src/uncategorized/reRecruit.tw b/src/uncategorized/reRecruit.tw index 494a51d15b2ebec8792db8d0ca153ad47b4ef404..80cc3ab9c9fe8bde70a2813f9b37cea7d908af07 100644 --- a/src/uncategorized/reRecruit.tw +++ b/src/uncategorized/reRecruit.tw @@ -2366,9 +2366,9 @@ At any rate, $he's a fine capture. And unsurprisingly, they want to get rid of $ <<case "desperate university milf">> -A call comes in from an old world household. The caller appears on your screen, a worn down matronly $woman flanked by $his two daughters. The middle-aged mother addresses you in a formal yet halting manner, as if rehearsing an unfamiliar speech. "I don't know how clo<<s>>ely you watch the old world from where you are, but finding <<s>>teady work without an education i<<s>> becoming increa<<s>>ingly difficult". +A call comes in from an old world household. The caller appears on your screen, a worn down matronly $woman flanked by $his two daughters. The middle-aged $mother addresses you in a formal yet halting manner, as if rehearsing an unfamiliar speech. "I don't know how clo<<s>>ely you watch the old world from where you are, but finding <<s>>teady work without an education i<<s>> becoming increa<<s>>ingly difficult". <br><br> -The mother pauses to glance at $his daughters before continuing. "I want my daughter<<s>> to have a chance to make a life for them<<s>>elve<<s>>. I know that if I can pay their way toward<<s>> attending univer<<s>>ity, then I will have <<s>>u<<cc>>eeded a<<s>> a parent." +The $mother pauses to glance at $his daughters before continuing. "I want my daughter<<s>> to have a chance to make a life for them<<s>>elve<<s>>. I know that if I can pay their way toward<<s>> attending univer<<s>>ity, then I will have <<s>>u<<cc>>eeded a<<s>> a parent." <br><br> $He begins to weep quietly, but continues after $his daughters lay their hands supportively on $his shoulder. "Could you en<<s>>lave me, <<if $PC.title != 0>><<s>>ir<<else>>ma'am<</if>>? It'<<s>> the only way I have to pay for their tuition." diff --git a/src/uncategorized/reRelativeRecruiter.tw b/src/uncategorized/reRelativeRecruiter.tw index 2cb84d57e71c0310ee5c9392e7f49a6da644257f..3e2898a9c697b4a428fd366069528e00eb1dde35 100644 --- a/src/uncategorized/reRelativeRecruiter.tw +++ b/src/uncategorized/reRelativeRecruiter.tw @@ -579,9 +579,9 @@ $He waits anxiously for your decision. You look up the _relationType. _He2 costs <<print cashFormat(_slaveCost)>>, a bargain, but you won't be able to inspect _him2 beyond _his2 likely resemblance to _his2 <<switch _relationType>> <<case "daughter">> - mother. _His2 listing states that _he2 was used as a prostitute by _his2 previous owner. + $mother. _His2 listing states that _he2 was used as a prostitute by _his2 previous owner. <<case "son">> - mother. _His2 listing states that _he2 was used as a shemale prostitute by _his2 previous owner. + $mother. _His2 listing states that _he2 was used as a shemale prostitute by _his2 previous owner. <<case "mother">> $daughter. _His2 listing states that _he2 was used as a bed slave by _his2 MILF-loving owner. <<case "father">> @@ -1026,7 +1026,7 @@ $eventSlave.slaveName requests an interview with you. $He's a devoted slave, and <<case "mother">> $he had a _daughter2, who was sent to the slave orphanages. $He's heard a rumor through other slaves that $his _daughter2 will go up for sale soon. <<case "daughter">> - $his mother has been enslaved. _He2 was free the last $eventSlave.slaveName knew of _him2. $He's heard a rumor through other slaves that $his mother will go up for sale soon. + $his _mother2 has been enslaved. _He2 was free the last $eventSlave.slaveName knew of _him2. $He's heard a rumor through other slaves that $his _mother2 will go up for sale soon. <<case "older sister">> $his older _sister2 is being sold. _He2 was likely to be enslaved the last $eventSlave.slaveName knew of _him2, and now $he's heard a rumor through other slaves that $his big _sister2 is going to be sold to a new owner. <<case "young sister">> diff --git a/src/uncategorized/remoteSurgery.tw b/src/uncategorized/remoteSurgery.tw index 3758abd09baed6b4a8bdf7266aedb5d26cc816f0..53a8e26e1604cac5c3535bb15e9476596e1b3233 100644 --- a/src/uncategorized/remoteSurgery.tw +++ b/src/uncategorized/remoteSurgery.tw @@ -72,12 +72,14 @@ <</if>> </div> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'hairFace')" id="tab hairFace">Hair and face</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'upper')" id="tab upper">Upper</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'lower')" id="tab lower">Lower</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Race')" id="tab Race">Race</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Structural')" id="tab Structural">Structural</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'ExtremeSurgery')" id="tab ExtremeSurgery">ExtremeSurgery</button> +<div class="tabbar"> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'hairFace')" id="tab hairFace">Hair and face</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'upper')" id="tab upper">Upper</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'lower')" id="tab lower">Lower</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Race')" id="tab Race">Race</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Structural')" id="tab Structural">Structural</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'ExtremeSurgery')" id="tab ExtremeSurgery">ExtremeSurgery</button> +</div> <div id="hairFace" class="tabcontent"> <div class="content"> @@ -789,7 +791,7 @@ giant, <</if>> <</if>> - <<print getSlave($AS).boobsImplant>>cc getSlave($AS).boobsImplantType breast implants. + <<print getSlave($AS).boobsImplant>>cc <<= getSlave($AS).boobsImplantType>> breast implants. <<elseif getSlave($AS).boobsImplantType != "none">> <<if getSlave($AS).boobsImplant > 1000>> massive, <<print getSlave($AS).boobsImplant>>cc diff --git a/src/uncategorized/repBudget.tw b/src/uncategorized/repBudget.tw index d8d58f71416037b99d65cb8af0639ccb590c1b46..9e538b4092311fdef9f14dcf00f59cdfe3ccac83 100644 --- a/src/uncategorized/repBudget.tw +++ b/src/uncategorized/repBudget.tw @@ -126,10 +126,10 @@ for (var i = 0; i < State.variables.lastWeeksRepIncome.length; i++){ <h2>Policies</h2> </tr> - <<print budgetLine("policies", "Capital expenses")>> + <<print budgetLine("capEx", "Capital expenses")>> <<print budgetLine("edicts", "<<if $secExpEnabled > 0>>[[Edicts|edicts]]<<else>>Edicts<</if>>")>> - <<print budgetLine("capEx", "[[Policies|Policies][$nextButton = \"Back to Budget\", $nextLink = \"Rep Budget\"]] and [[Edicts|edicts][$nextButton = \"Back to Budget\", $nextLink = \"Rep Budget\"]]")>> + <<print budgetLine("policies", "[[Policies|Policies][$nextButton = \"Back to Budget\", $nextLink = \"Rep Budget\"]]")>> <<print budgetLine("futureSocieties", "[[Society shaping|Future Society][$nextButton = \"Back to Budget\", $nextLink = \"Rep Budget\"]]")>> diff --git a/src/uncategorized/resSale.tw b/src/uncategorized/resSale.tw index b72d74e7b62896c8a0a37ee95a385db5402c3ebc..3f378be64c8a73ed6371b1ee67e3da587856ce19 100644 --- a/src/uncategorized/resSale.tw +++ b/src/uncategorized/resSale.tw @@ -7,35 +7,53 @@ /* generate sales slave for images and pronouns */ <<if $RESSale == "TSS">> <<set $TSS.schoolSale = 1>> - <<= generateMarketSlave("TSS")>> + <<set _marketResult = generateMarketSlave("TSS")>> + <<set $activeSlave = _marketResult.slave>> + <<print _marketResult.text>> <<set $activeSlave.clothes = "a schoolgirl outfit">> <<elseif $RESSale == "GRI">> <<set $GRI.schoolSale = 1>> - <<= generateMarketSlave("GRI")>> + <<set _marketResult = generateMarketSlave("GRI")>> + <<set $activeSlave = _marketResult.slave>> + <<print _marketResult.text>> <<set $activeSlave.clothes = "a slave gown">> <<elseif $RESSale == "SCP">> <<set $SCP.schoolSale = 1>> - <<= generateMarketSlave("SCP")>> + <<set _marketResult = generateMarketSlave("SCP")>> + <<set $activeSlave = _marketResult.slave>> + <<print _marketResult.text>> <<set $activeSlave.clothes = "a string bikini">> <<elseif $RESSale == "LDE">> <<set $LDE.schoolSale = 1>> - <<= generateMarketSlave("LDE")>> + <<set _marketResult = generateMarketSlave("LDE")>> + <<set $activeSlave = _marketResult.slave>> + <<print _marketResult.text>> <<elseif $RESSale == "TGA">> <<set $TGA.schoolSale = 1>> - <<= generateMarketSlave("TGA")>> + <<set _marketResult = generateMarketSlave("TGA")>> + <<set $activeSlave = _marketResult.slave>> + <<print _marketResult.text>> <<elseif $RESSale == "TCR">> <<set $TCR.schoolSale = 1>> - <<= generateMarketSlave("TCR")>> + <<set _marketResult = generateMarketSlave("TCR")>> + <<set $activeSlave = _marketResult.slave>> + <<print _marketResult.text>> <<elseif $RESSale == "HA">> <<set $HA.schoolSale = 1>> - <<= generateMarketSlave("HA")>> + <<set _marketResult = generateMarketSlave("HA")>> + <<set $activeSlave = _marketResult.slave>> + <<print _marketResult.text>> <<set $activeSlave.clothes = "a nice maid outfit">> <<elseif $RESSale == "NUL">> <<set $NUL.schoolSale = 1>> - <<= generateMarketSlave("NUL")>> + <<set _marketResult = generateMarketSlave("NUL")>> + <<set $activeSlave = _marketResult.slave>> + <<print _marketResult.text>> <<else>> <<set $TFS.schoolSale = 1>> - <<= generateMarketSlave("TFS")>> + <<set _marketResult = generateMarketSlave("TFS")>> + <<set $activeSlave = _marketResult.slave>> + <<print _marketResult.text>> <</if>> <<setLocalPronouns $activeSlave>> diff --git a/src/uncategorized/saBeYourHeadGirl.tw b/src/uncategorized/saBeYourHeadGirl.tw deleted file mode 100644 index d42c3f07ff4bfa6acda512e73b37ff4b40f2f7ef..0000000000000000000000000000000000000000 --- a/src/uncategorized/saBeYourHeadGirl.tw +++ /dev/null @@ -1,210 +0,0 @@ -:: SA be your Head Girl [nobr] - -<<set $HGTimeInGrade += 1, _fetishChangeChance = fetishChangeChance($slaves[$i])>> - -<<if $HGSuite == 1>> - <<set $slaves[$i].rules.living = "luxurious">> -<</if>> -<<run tired($slaves[$i])>> - -<<if $arcologies[0].FSEgyptianRevivalistLaw == 0>> - helps manage your other slaves. $He helps them when they try and fail, and punishes them when they fail to try. - <<if $HGEnergy == 0>> - $He was @@.red;too exhausted@@ to make any real progress this week, however. - <</if>> -<<else>> - serves as your Consort. Though $he is still your slave, $his status is scarcely below that of a citizen. $He @@.green;contributes to your reputation@@ just like a Concubine, and $he is @@.hotpink;conscious@@ of the @@.mediumaquamarine;trust@@ you place in $him. - <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> - <<silently>> - <<include "SA please you">> - <</silently>> - <<if $slaves[$i].relationship > 4>> - <<if $familyTesting == 1>> - <<if $slaves[$i].relationshipTarget == $Concubine.ID>> - <<setLocalPronouns $Concubine 2>> - <<if areRelated($Concubine, $slaves[$i]) > 0>> - <<if $Concubine.mother == $slaves[$i].ID || $Concubine.father == $slaves[$i].ID>> - Your Concubine is your Consort's <<= _daughter2>>-<<= _wife2>>. Truly, $arcologies[0].name looks up to you @@.green;as children to a father.@@ - <<run repX(1000, "headGirl", $slaves[$i])>> - <<elseif $slaves[$i].mother == $Concubine.ID>> - Your Concubine is your Consort's mother-<<= _wife2>>. Truly, $arcologies[0].name looks up to you @@.green;as children to a father.@@ - <<run repX(1000, "headGirl", $slaves[$i])>> - <<elseif $slaves[$i].father == $Concubine.ID>> - Your Concubine is your Consort's father-<<= _wife2>>. Truly, $arcologies[0].name looks up to you @@.green;as children to a father.@@ - <<run repX(1000, "headGirl", $slaves[$i])>> - <<else>> - <<switch areSisters($slaves[$i], $Concubine)>> - <<case 1>> - Your Concubine is your Consort's twin-<<= _wife2>>. Truly, $arcologies[0].name looks up to you @@.green;as children to a father.@@ - <<run repX(1000, "headGirl", $slaves[$i])>> - <<case 2>> - Your Concubine is your Consort's <<= _sister2>>-<<= _wife2>>. Truly, $arcologies[0].name looks up to you @@.green;as children to a father.@@ - <<run repX(1000, "headGirl", $slaves[$i])>> - <<case 3>> - Your Concubine is your Consort's half-<<= _sister2>>-<<= _wife2>>. Truly, $arcologies[0].name looks up to you @@.green;as children to a father.@@ - <<run repX(1000, "headGirl", $slaves[$i])>> - <<default>> - //Shit went wrong! Post this in a bug report!// This is @@.red;NOT as it should be.@@ - <<run repX(500, "headGirl", $slaves[$i])>> - <</switch>> - <</if>> - <<else>> - Your Consort and your Concubine are <<if $wife == _wife2>>$wives<<else>>married<</if>> to each other and to Pharaoh. This is @@.green;as it should be.@@ - <<run repX(500, "headGirl", $slaves[$i])>> - <</if>> - <<else>> - <<if totalRelatives($slaves[$i]) > 0>> - <<set _sbyhg = $slaveIndices[$slaves[$i].relationshipTarget]>> - <<if def _sbyhg>> - <<setLocalPronouns $slaves[_sbyhg] 2>> - <<if $slaves[_sbyhg].mother == $slaves[$i].ID || $slaves[_sbyhg].father == $slaves[$i].ID>> - Your Consort has a <<= _daughter2>>-<<= _wife2>>. This is @@.green;as it should be.@@ - <<run repX(500, "headGirl", $slaves[$i])>> - <<elseif $slaves[$i].mother == $slaves[_sbyhg].ID>> - Your Consort has a mother-<<= _wife2>>. This is @@.green;as it should be.@@ - <<run repX(500, "headGirl", $slaves[$i])>> - <<elseif $slaves[$i].father == $slaves[_sbyhg].ID>> - Your Consort has a father-<<= _wife2>>. This is @@.green;as it should be.@@ - <<run repX(500, "headGirl", $slaves[$i])>> - <<else>> - <<switch areSisters($slaves[$i], $slaves[_sbyhg])>> - <<case 1>> - Your Consort has a twin-<<= _wife2>>. This is @@.green;as it should be.@@ - <<run repX(500, "headGirl", $slaves[$i])>> - <<case 2>> - Your Consort has a <<= _sister2>>-<<= _wife2>>. This is @@.green;as it should be.@@ - <<run repX(500, "headGirl", $slaves[$i])>> - <<case 3>> - Your Consort has a half-<<= _sister2>>-<<= _wife2>>. This is @@.green;as it should be.@@ - <<run repX(500, "headGirl", $slaves[$i])>> - <</switch>> - <</if>> - <</if>> - <</if>> - <</if>> - <<else>> - <<if $slaves[$i].relationshipTarget == $Concubine.ID>> - <<setLocalPronouns $Concubine 2>> - <<if $slaves[$i].relationTarget == $Concubine.ID>> - Your Concubine is your Consort's $slaves[$i].relation-<<= _wife2>>. Truly, $arcologies[0].name looks up to you @@.green;as children to a father.@@ - <<run repX(1000, "headGirl", $slaves[$i])>> - <<else>> - Your Consort and your Concubine are <<if $wife == _wife2>>$wives<<else>>married<</if>> to each other and to Pharaoh. This is @@.green;as it should be.@@ - <<run repX(500, "headGirl", $slaves[$i])>> - <</if>> - <<elseif $slaves[$i].relationshipTarget == $slaves[$i].relationTarget>> - <<set _sbyhg = $slaveIndices[$slaves[$i].relationshipTarget]>> - <<if def _sbyhg>> - <<setLocalPronouns $slaves[_sbyhg] 2>> - Your Consort has a $slaves[$i].relation-<<= _wife2>>. This is @@.green;as it should be.@@ - <<run repX(500, "headGirl", $slaves[$i])>> - <</if>> - <</if>> - <</if>> /* closes extended family mode */ - <</if>> - <<if $HGEnergy == 0>> - $He was @@.red;too exhausted@@ to make any real progress with your slaves this week, however. - <</if>> -<</if>> - -<<if $HGTimeInGrade > 12>> - <<if $HGSuite == 1>> - Being continually trusted with this position @@.hotpink;increases $his devotion to you,@@ and encourages $him to @@.mediumaquamarine;trust you in turn;@@ $he's also @@.hotpink;grateful@@ for $his nice suite, which makes $him one of the best provided for slaves in the Free Cities. - <<set $slaves[$i].devotion += 4, $slaves[$i].trust += 4>> - <<elseif ($slaves[$i].rules.living == "luxurious")>> - Being continually trusted with this position @@.hotpink;increases $his devotion to you@@ and encourages $him to @@.mediumaquamarine;trust you in turn.@@ - <<set $slaves[$i].devotion += 4, $slaves[$i].trust += 4>> - <<else>> - Being continually trusted with this position @@.hotpink;slightly increases $his devotion to you,@@ though $he harbors some doubts because $he isn't allowed a room of $his own to set $him apart from the other slaves. - <<set $slaves[$i].devotion += 1>> - <</if>> -<<else>> - <<if ($HGSuite == 1)>> - $He's @@.mediumaquamarine;grateful@@ for $his nice suite, which makes $him one of the best provided for slaves in the Free Cities. - <<set $slaves[$i].trust += 4>> - <<elseif $slaves[$i].rules.living != "luxurious" && $slaves[$i].devotion <= 50>> - Given $his lofty position, $he @@.mediumorchid;harbors some doubts@@ in $his value to you since $he isn't allowed a room of $his own to set $him apart from the other slaves. - <<set $slaves[$i].devotion -= 2>> - <</if>> -<</if>> -<<if $slaves[$i].rules.living != "luxurious">> - $His duties are @@.red;physically and mentally taxing,@@ especially with nothing more than a <<if $slaves[$i].rules.living == "normal">>bed<<else>>cot<</if>> waiting for $him in the slave dormitory. -<</if>> - -<<if ($personalAttention == "HG")>> - You're cooperating with $him this week, working with $assistant.name to free up some of $his time so $he can target more slaves in need of individual attention. - <<if ($slaves[$i].trust > 95)>> - $He is so trusting of you that $he can act as your own right hand, allowing $him to oversee your slaves with remarkable efficiency. - <<else>> - This arrangement @@.mediumaquamarine;builds trust@@ between you. - <<set $slaves[$i].trust += 2>> - <</if>> - <<if $slaves[$i].health.tired > 30>> - It also takes a load off $his tired shoulders. - <</if>> -<</if>> - -<<if ($HGFormality == 0)>> - <<if ($slaves[$i].trust > 95)>> - Every so often, when you're alone, $he calls you <<= properTitle()>>. $He treats your permission to do this as a sacred thing, and @@.hotpink;loves you for it.@@ - <<set $slaves[$i].devotion += 1>> - <<else>> - Your permission to be informal in private @@.mediumorchid;confuses $him@@ a little, since $he isn't perfectly confident enough to be comfortable with the idea. - <<set $slaves[$i].devotion -= 1>> - <</if>> -<</if>> - -<<if $slaves[$i].fetishKnown == 1>> - <<if $slaves[$i].fetish == "dom">> - <<if ($slaves[$i].fetishKnown == 1) && ($slaves[$i].fetishStrength <= 95)>> - Having all the slaves look up to and obey $him advances $his @@.lightcoral;dominant tendencies.@@ - <<set $slaves[$i].fetishStrength += 4>> - <</if>> - <<elseif _fetishChangeChance > random(0,100)>> - Having all the slaves look up to and obey $him affects $his sexuality, turning $him into a @@.lightcoral;bit of a dominatrix.@@ - <<set $slaves[$i].fetish = "dom", $slaves[$i].fetishStrength = 20, $slaves[$i].fetishKnown = 1>> - <<elseif $slaves[$i].fetishStrength <= random(20,60)>> - The sheer variety of sexual situations $he sees and participates in @@.pink;broaden $his sexual interests@@ and incline $him to take a dominant sexual role. - <<set $slaves[$i].fetishStrength -= 4>> - <</if>> -<<else>> - <<if $slaves[$i].fetish == "dom">> - Having all the slaves look up to and obey $him clearly excites $him; @@.lightcoral;$he's a natural dom!@@ - <<elseif _fetishChangeChance > random(0,100)>> - Having all the slaves look up to and obey $him affects $his sexuality, turning $him into a @@.lightcoral;bit of a dominatrix.@@ - <<set $slaves[$i].fetish = "dom", $slaves[$i].fetishStrength = 20, $slaves[$i].fetishKnown = 1>> - <</if>> -<</if>> - -<<if $slaves[$i].rules.lactation == "induce">> - $He works mammary stimulation into $his slave training regimen in an effort to bring in $his milk for you. - <<set $slaves[$i].induceLactation += 3>> - <<= induceLactation($slaves[$i])>> - <<if $slaves[$i].lactation == 1>><<set $slaves[$i].rules.lactation = "maintain">><</if>> -<<elseif $slaves[$i].rules.lactation == "maintain">> - Proper nursing and milking technique is a strong aspect of $his slave training regimen, both to keep $his milk flowing and to prevent the mounting pressure from distracting from $his work. - <<set $slaves[$i].lactationDuration = 2, $slaves[$i].boobs -= $slaves[$i].boobsMilk, $slaves[$i].boobsMilk = 0>> -<</if>> - -<<if ($slaves[$i].dick > 0) && ($universalRulesImpregnation == "HG") && canPenetrate($slaves[$i])>> - $He finds $his duty to impregnate slaves at will sexually satisfying. - <<set $slaves[$i].need = 0>> -<<else>> - <<if $slaves.length > 5>> - Seldom a day goes by without $him finding an outlet among your slaves for $his sexual desires. - <<set $slaves[$i].need = 0>> - <</if>> -<</if>> - -<<if $slaves[$i].prestige == 0>> - <<if $HGTimeInGrade+(($slaves[$i].intelligence+$slaves[$i].intelligenceImplant)/10)+($slaves[$i].devotion/10)+($slaves[$i].trust/10) > 50>> - $slaves[$i].slaveName has rendered such long and competent service as your Head Girl that many of your citizens have come to rely on $his word as an extension of yours, trusting that if $he does something, it's because you trust $him to. @@.green;$He has become prestigious on $his own merits, a remarkable achievement for a slave!@@ - <<set $slaves[$i].prestige += 1>> - <<set $slaves[$i].prestigeDesc = "Many citizens respect $his long and able service as your Head Girl.">> - <</if>> -<</if>> - -<<if !setup.HGCareers.includes($slaves[$i].career) && $slaves[$i].skill.headGirl < $masteredXP>> - <<set $slaves[$i].skill.headGirl += random(1,Math.ceil(($slaves[$i].intelligence+$slaves[$i].intelligenceImplant)/15) + 8)>> -<</if>> -<<set $slaves[$i].health.tired = Math.clamp($slaves[$i].health.tired, 0, 1000)>> diff --git a/src/uncategorized/saGuardsYou.tw b/src/uncategorized/saGuardsYou.tw deleted file mode 100644 index 094e5322f049c7091fc50082c01b7125855c07f5..0000000000000000000000000000000000000000 --- a/src/uncategorized/saGuardsYou.tw +++ /dev/null @@ -1,249 +0,0 @@ -:: SA guard you [nobr] - -carries arms in your defense. - -<<if $dojo > 1>> - <<set $slaves[$i].rules.living = "luxurious">> -<</if>> - -<<set _deadliness = Deadliness($slaves[$i])>> - -<<if $slaves[$i].skill.combat > 0>> - $His combat skills greatly increase $his deadliness. -<</if>> - -<<if setup.bodyguardCareers.includes($slaves[$i].career)>> - $He has experience in personal defense from before $he was a slave. -<<elseif $slaves[$i].skill.bodyguard >= $masteredXP>> - $He has experience in personal defense from working for you. -<<else>> - <<set $slaves[$i].skill.bodyguard += random(1,Math.ceil(($slaves[$i].intelligence+$slaves[$i].intelligenceImplant)/15) + 8)>> -<</if>> - -<<if ($slaves[$i].muscles > 30) && ($slaves[$i].muscles <= 95)>> - $He is strong and powerful yet quick and flexible. -<<elseif $slaves[$i].muscles > 95 && $slaves[$i].height >= 185>> - $His huge muscles are an intimidating sight and, despite their massive size, $he is tall enough to use them effectively. -<<elseif $slaves[$i].muscles > 95>> - $His huge muscles are an intimidating sight, but are so big that they actually detract from $his combat effectiveness. -<<elseif $slaves[$i].muscles > 5>> - $He is reasonably fit, but not enough to significantly affect $his combat effectiveness. -<<elseif $slaves[$i].muscles < -95>> - $He can barely stand, let alone fight. A single shot from $his own weapon is liable to incapacitate $him, making $him an absolute travesty of a bodyguard. -<<elseif $slaves[$i].muscles < -30>> - $He tires from just standing, rendering $him both ineffective and embarrassing to have as your guard. -<<elseif $slaves[$i].muscles < -5>> - $He is rather unfit, enough to negatively impact $his combat effectiveness. -<</if>> - -<<if getLimbCount($slaves[$i], 6) > 1>> - The artificial muscles of $his cybernetic limbs increase $his strength and flexibility to enhance $his combat abilities and give $him the intimidating appearance of a super-soldier. -<<elseif getLimbCount($slaves[$i], 105) > 1>> - $His tough combat limbs make $him an intimidating sight to behold. -<</if>> - -<<if $slaves[$i].height >= 170>> - $His height gives $him a reach advantage with $his sword. -<</if>> - -<<if $slaves[$i].health.condition > 50>> - $His shining health makes $him a better combatant. -<</if>> - -<<if $slaves[$i].boobs > 4000>> - $His titanic tits are a terrible hindrance in actual fighting. -<<elseif $slaves[$i].boobs > 2000>> - $His big breasts get in $his way and reduce $his efficiency. -<</if>> - -<<if $slaves[$i].dick >= 10>> - $His massive dick gets in $his way and reduces $his efficiency. -<</if>> - -<<if $slaves[$i].balls >= 15>> - $His massive balls slow $him down and limit $his range of motion. -<</if>> - -<<if $slaves[$i].butt > 6>> - $His massive ass slows $him down and limits $his range of motion. -<</if>> - -<<if $slaves[$i].hips > 2>> - $He struggles to move with $his inhumanly wide hips and frequently gets caught between things trying to follow you. -<</if>> - -<<if $slaves[$i].weight > 190>> - $His extreme weight nearly immobilizes $him. $He struggles to move let alone protect you. At least $his bloated body will likely stop bullets and block doorways when needed. -<<elseif $slaves[$i].weight > 160>> - $His extreme weight limits $his mobility and range of motion, making $him a poor bodyguard but decent meatshield. -<<elseif $slaves[$i].weight > 130>> - $His extreme weight is an impediment as a bodyguard. -<<elseif $slaves[$i].weight > 30>> - $His heavy weight is an impediment as a bodyguard. -<<elseif $slaves[$i].weight < -10>> - $His light weight is an impediment as a bodyguard. -<</if>> - -<<if $slaves[$i].health.condition < -50>> - $His poor health makes $him a weaker combatant. -<</if>> - -<<if $slaves[$i].health.tired > 90>> - $He is exhausted and can barely stay awake, let alone ready a weapon. -<<elseif $slaves[$i].health.tired > 60>> - $He is fatigued, making $his situational awareness and reaction time suffer. -<<elseif $slaves[$i].health.tired > 30>> - $He is tired, slightly lowering $his reaction time. -<</if>> - -<<if $slaves[$i].pregKnown == 1 || $slaves[$i].bellyPreg >= 1500>> - <<if $slaves[$i].bellyPreg >= 750000>> - $His monolithic pregnancy greatly restricts $his movement and renders $him nearly useless in combat. $He can barely waddle after you, and when $he does, finds doors and small passages don't agree with $his bloated figure. - <<elseif $slaves[$i].bellyPreg >= 450000>> - $His gigantic pregnancy greatly hinders $his movement and terribly reduces $his effectiveness in combat. It also limits where $he can follow you, as doors and small passages don't agree with $his bloated figure. - <<elseif $slaves[$i].bellyPreg >= 300000>> - $His massive pregnancy obstructs $his movement and greatly hinders $his ability to protect you. It also limits where $he can follow you, as doors and small passages don't agree with $his bloated figure. - <<elseif $slaves[$i].bellyPreg >= 150000>> - $His giant pregnancy obstructs $his movement and greatly slows $him down. It also limits where $he can follow you, as $he has trouble waddling through crowds. - <<elseif $slaves[$i].bellyPreg >= 100000>> - $His giant belly gets in $his way and weighs $him down. - <<elseif $slaves[$i].bellyPreg >= 10000>> - $His huge belly is unwieldy and hinders $him. - <<elseif $slaves[$i].bellyPreg >= 5000>> - $His advanced pregnancy limits $his effectiveness. - <<elseif $slaves[$i].bellyPreg >= 1500>> - $His growing pregnancy occasionally distracts $him from $his job. - <<else>> - The life just beginning to grow inside $him occasionally distracts $him from $his job. - <</if>> -<<elseif $slaves[$i].bellyImplant >= 1500>> - <<if $slaves[$i].bellyImplant >= 750000>> - $His monolithic, <<print $slaves[$i].bellyImplant>>cc implant filled belly greatly restricts $his movement and renders $him nearly useless in combat. $He can barely waddle after you, and when $he does, finds doors and small passages don't agree with $his bloated figure. - <<elseif $slaves[$i].bellyImplant >= 450000>> - $His gigantic, <<print $slaves[$i].bellyImplant>>cc implant filled belly greatly hinders $his movement and terribly reduces $his effectiveness in combat. It also limits where $he can follow you, as doors and small passages don't agree with $his bloated figure. - <<elseif $slaves[$i].bellyImplant >= 300000>> - $His massive, <<print $slaves[$i].bellyImplant>>cc implant filled belly obstructs $his movement and greatly hinders $his ability to protect you. It also limits where $he can follow you, as doors and small passages don't agree with $his bloated figure. - <<elseif $slaves[$i].bellyImplant >= 150000>> - $His giant, <<print $slaves[$i].bellyImplant>>cc implant filled belly obstructs $his movement and greatly slows $him down. It also limits where $he can follow you, as $he has trouble waddling through crowds. - <<elseif $slaves[$i].bellyImplant >= 100000>> - $His giant, <<print $slaves[$i].bellyImplant>>cc implant filled belly is very heavy and unwieldy, frequently getting in the way of $his job. - <<elseif $slaves[$i].bellyImplant >= 10000>> - $His huge, <<print $slaves[$i].bellyImplant>>cc implant filled belly is very heavy and unwieldy, throwing off $his weight and making $him far less effective. - <<elseif $slaves[$i].bellyImplant >= 5000>> - $His large, <<print $slaves[$i].bellyImplant>>cc implant filled belly is heavy and unwieldy, limiting $his effectiveness. - <<elseif $slaves[$i].bellyImplant >= 1500>> - $His swollen, <<print $slaves[$i].bellyImplant>>cc implant filled belly is heavy and occasionally distracts $him. - <</if>> -<</if>> -<<if $slaves[$i].labor == 1>> - $He's feeling labor pains, greatly detracting from $his ability to protect you. -<<elseif $slaves[$i].preg >= $slaves[$i].pregData.normalBirth && $slaves[$i].pregControl != "labor suppressors">> - $He'll be going into labor any time now, detracting from $his ability to protect you. -<</if>> - -<<if $slaves[$i].bellyFluid >= 10000>> - $His hugely bloated, <<print $slaves[$i].inflationType>>-filled belly is taut and painful, hindering $his ability to guard you. -<<elseif $slaves[$i].bellyFluid >= 5000>> - $His bloated, <<print $slaves[$i].inflationType>>-stuffed belly is constantly jiggling and moving, distracting $him and throwing off $his weight. -<<elseif $slaves[$i].bellyFluid >= 2000>> - $His distended, <<print $slaves[$i].inflationType>>-belly is uncomfortable and heavy, distracting $him. -<</if>> - -<<if $slaves[$i].teeth == "pointy">> - $His sharp teeth add nothing to $his actual effectiveness, but they're certainly intimidating. -<</if>> - -<<if ($slaves[$i].skill.combat < 1) && (random(-100,150) <= ($slaves[$i].intelligence+$slaves[$i].intelligenceImplant))>> - After some experience guarding you, and diligent practice in the armory, @@.green;$his combat skills increase.@@ - <<set $slaves[$i].skill.combat += 1>> -<<elseif $slaves[$i].skill.combat >= 1>> - $He maintains $his combat skill with practice in the armory. -<<else>> - Though $he practices diligently, $his basic combat skills do not impress. -<</if>> - -$His constant presence is -<<if _deadliness > 6>> - extremely intimidating, @@.green;adding much to your reputation.@@ - <<if $slaves[$i].career == "an arcology owner">> - You've made a one-time rival arcology owner into a deadly and loyal protector, a feat of slaveownership that's @@.green;internationally famous.@@ - <<run repX(_deadliness*50, "bodyguard", $slaves[$i])>> - <</if>> -<<elseif _deadliness > 3>> - intimidating, @@.green;adding to your reputation.@@ -<<else>> - hardly intimidating, @@.yellow;barely adding to your reputation.@@ -<</if>> - -<<run repX(_deadliness*50, "bodyguard", $slaves[$i])>> - -Being continually trusted with your life @@.hotpink;increases $his devotion to you@@ and encourages $him to @@.mediumaquamarine;trust you in turn.@@ - <<set $slaves[$i].devotion += 2>> - <<set $slaves[$i].trust += 4>> - -<<if $dojo > 1>> - $He @@.hotpink;appreciates@@ how special it is that $he has a nice room off the armory to rest in. $He can finally @@.green;rest easy@@ while still keeping tabs on your safety. - <<set $slaves[$i].devotion += 1>> -<<else>> - Between protecting you, training, and keeping vigil while you sleep, $he lives a @@.red;very tiring@@ life. -<</if>> -<<run tired($slaves[$i])>> - -<<if $bodyguardTrains == 1 && $slaves[$i].devotion > 95 && $slaves[$i].trust > 50 && $slaves[$i].skill.combat > 0 && $slaves[$i].intelligence+$slaves[$i].intelligenceImplant > 15>> - $He's confident in $his martial skills, but smart enough to know that $he isn't immortal, and devoted enough to worry about who will protect you should $he die. - <<set _successorCandidates = $slaves.filter( function(s) { return (assignmentVisible(s) || s.assignment == "be your Concubine" || s.assignment == "be the Wardeness" || s.assignment == "be your Head Girl" || s.assignment == "work as a servant" || s.assignment == "serve in the master suite") && bodyguardSuccessorEligible(s); } )>> - <<set _combatSkilled = _successorCandidates.filter( function(s) { return s.skill.combat > 0; })>> - <<if _combatSkilled.length < 2>> - <<unset $subSlave>> - <<set _flawedTrainee = 0>> - <<if $slaves[$i].relationship > 1>> - <<set $subSlave = getSlave($slaves[$i].relationshipTarget)>> - <<if (def $subSlave) && $subSlave.skill.combat == 0 && bodyguardSuccessorEligible($subSlave)>> - <<setLocalPronouns $subSlave 2>> - $He does $his best to train $subSlave.slaveName whenever $he can, hoping that $his - <<if $slaves[$i].relationship > 4>>_wife2<<elseif $slaves[$i].relationship == 4>>lover<<elseif $slaves[$i].relationship == 3>><<= _girl2>>friend<<else>>best friend<</if>> - can be made capable of stepping into $his place. - <</if>> - <</if>> - <<if ndef $subSlave>> - <<if $HeadGirl != 0 && $HeadGirl.skill.combat == 0 && bodyguardSuccessorEligible($HeadGirl)>> - $He does $his best to train $HeadGirl.slaveName whenever $he can, hoping that your Head Girl can be made capable of stepping into $his place. - <<set $subSlave = $HeadGirl>> - <</if>> - <</if>> - <<if ndef $subSlave>> - <<if $Concubine != 0 && $Concubine.skill.combat == 0 && $Concubine.devotion > 50 && $Concubine.muscles >= -30 && $Concubine.weight < 150 && $Concubine.butt < 10 && $Concubine.boobs < 25000 && $Concubine.belly < 5000 && $Concubine.balls < 20 && $Concubine.dick < 15 && $Concubine.fuckdoll == 0 && $Concubine.fetish != "mindbroken" && canWalk($Concubine)>> - $He does $his best to train $Concubine.slaveName whenever $he can, hoping that your Concubine can be made capable of stepping into $his place. - <<if $Concubine.boobs >= 8000 || $Concubine.butt >= 10 || $Concubine.belly >= 5000 || $Concubine.balls >= 10 || $Concubine.dick >= 10 || $Concubine.muscles < 0 || $Concubine.weight >= 100>> - $His body is poorly suited for combat, but $he can learn to work around it with enough effort. - <<set _flawedTrainee = random(0,50)>> - <</if>> - <<set $subSlave = $Concubine>> - <</if>> - <</if>> - <<if ndef $subSlave>> - <<if $Wardeness != 0 && $Wardeness.skill.combat == 0 && bodyguardSuccessorEligible($Wardeness)>> - $He does $his best to train $Wardeness.slaveName whenever $he can, hoping that your Wardeness can be made capable of stepping into $his place. - <<set $subSlave = $Wardeness>> - <</if>> - <</if>> - <<if ndef $subSlave>> - <<set $subSlave = _successorCandidates.find( function(s) { return s.skill.combat == 0; })>> - <<if def $subSlave>> - $He does $his best to train $subSlave.slaveName whenever $he can, hoping that $his subordinate can be made capable of stepping into $his place. - <</if>> - <</if>> - <<if def $subSlave>> - <<if ($slaves[$i].intelligence + $slaves[$i].intelligenceImplant - _flawedTrainee) > random(1,500)>> - By the end of the week, $he is satisfied that $subSlave.slaveName @@.green;has the combat skill@@ to contribute to your defense. - <<set _sgy = $slaveIndices[$subSlave.ID]>> - <<set $slaves[_sgy].skill.combat = 1>> - <</if>> - <<else>> - $He finds no suitable candidates to serve as $his replacement, leaving $him stressed over your future safety. The worry is exhausting and @@.red;bad for $his health.@@ - <<run healthDamage($slaves[$i], 3)>> - <</if>> - <<else>> - $He takes care to look after the skills of your other defensively capable slaves, satisfied that there are enough of them living in your penthouse. - <</if>> -<</if>> diff --git a/src/uncategorized/saLiveWithHG.tw b/src/uncategorized/saLiveWithHG.tw index 194319389d4ce5c518c87be9ed46d9536b04c113..edb4a7b6c2504166e678c5e7c6d76c1c2dd5e736 100644 --- a/src/uncategorized/saLiveWithHG.tw +++ b/src/uncategorized/saLiveWithHG.tw @@ -848,7 +848,28 @@ <<else>> and keeps $him on $his diet. <</if>> -<<elseif (($slaves[$i].muscles <= 95 && (($arcologies[0].FSPhysicalIdealist > 0 && $arcologies[0].FSPhysicalIdealistLaw == 0) || (($HeadGirl.fetish == "submissive" || $HeadGirl.fetish == "masochist") && $HeadGirl.fetishKnown == 1))) || ($slaves[$i].muscles <= 45 && ($arcologies[0].FSPhysicalIdealist > 0 && $arcologies[0].FSPhysicalIdealistLaw == 1)) || $slaves[$i].muscles <= 5) && !isAmputee($slaves[$i])>> +<<elseif + ( + ($slaves[$i].muscles <= 95 && + ( + ($arcologies[0].FSPhysicalIdealist > 0 && $arcologies[0].FSPhysicalIdealistLaw == 0) || + ( + ($HeadGirl.fetish == "submissive" || $HeadGirl.fetish == "masochist") && + $HeadGirl.fetishKnown == 1) + ) + ) + || + ($slaves[$i].muscles <= 45 && + ( + $arcologies[0].FSPhysicalIdealist > 0 && + $arcologies[0].FSPhysicalIdealistLaw == 1) + ) + || + $slaves[$i].muscles <= 5 && + ( + !isAmputee($slaves[$i]) + ) + )>> $HeadGirl.slaveName thinks $slaves[$i].slaveName <<if $HeadGirl.fetish == "submissive">> could use bigger muscles to better dominate _him2 with in bed diff --git a/src/uncategorized/saLongTermEffects.tw b/src/uncategorized/saLongTermEffects.tw index 27009ac1f26863511e7c793a68ab0d786bf957e3..74b49f2eb9b8b85332f4a26378082d285d49d71e 100644 --- a/src/uncategorized/saLongTermEffects.tw +++ b/src/uncategorized/saLongTermEffects.tw @@ -205,7 +205,11 @@ <</if>> <<case 5>> <<if $slaves[$i].earPiercing>> - Every morning, $he's greeted by $his girly reflection in the mirror, <<if $slaves[$i].earPiercing > 1>>whose slutty ear piercings make $him @@.green;feel more fuckable.@@<<else>>complete with pretty pierced ears @@.green;like a good slave girl.@@<</if>> + <<if canSee($slaves[$i])>> + Every morning, $he's greeted by $his girly reflection in the mirror, <<if $slaves[$i].earPiercing > 1>>whose slutty ear piercings make $him @@.green;feel more fuckable.@@<<else>>complete with pretty pierced ears @@.green;like a good slave girl.@@<</if>> + <<else>> + $His girly pierced ears make $him feel <<if $slaves[$i].earPiercing > 1>>@@.green;like a hot slut.@@<<else>>@@.green;like a cute girl.@@<</if>> + <</if>> <<set $slaves[$i].attrXY += 1>> <</if>> <</switch>> @@ -4395,7 +4399,7 @@ It's $Stud.slaveName's role to provide sperm for fertile slaves, but _his2 sperm is unable to fertilize $slaves[$i].slaveName's ova, so there is no point in forcing the union. <<else>> <<set _studRandiness = 0>> /* used to control the slave reaction. 1 - fucks slave, -1 - slave fucks stud, 0 - inert */ - It's $Stud.slaveName's role to + It's $Stud.slaveName's role to /* stud's reaction to the role */ <<if $Stud.fuckdoll > 0>> provide sperm for $him; all $he needs to do is signal the suit to stimulate an ejaculation. @@ -4436,7 +4440,7 @@ <<set $Stud.fetishStrength += 4>> <</if>> <<elseif ($Stud.fetish == "dom") && ($Stud.fetishKnown == 1) && ($Stud.fetishStrength > 60)>> - fill $him with child, a task your dominant Stud @@.mediumaquamarine;carries out with glee@@ as _he2 steadily dominates your slaves. + fill $him with child, a task your dominant Stud @@.mediumaquamarine;carries out with glee@@ as _he2 steadily dominates your slaves. <<if ($Stud.fetishStrength <= 95)>> The opportunity @@.lightcoral;strengthens _his2 dominant tendencies@@ by indulgence. <<set $Stud.fetishStrength += 4>> @@ -4448,14 +4452,14 @@ <<set _studRandiness = 1>> <<elseif $Stud.trust >= -20>> <<if ($Stud.fetish == "pregnancy") && ($Stud.fetishKnown == 1) && ($Stud.fetishStrength > 60)>> - fill $him with child, a task your pregnancy fetishist Stud @@.mediumaquamarine;takes unwarranted pride@@ in. + fill $him with child, a task your pregnancy fetishist Stud @@.mediumaquamarine;takes unwarranted pride@@ in. <<set $Stud.trust += 3>> <<if ($Stud.fetishStrength <= 95)>> The opportunity @@.lightcoral;strengthens _his2 pregnancy fetish@@ by indulgence. <<set $Stud.fetishStrength += 2>> <</if>> <<elseif ($Stud.fetish == "dom") && ($Stud.fetishKnown == 1) && ($Stud.fetishStrength > 60)>> - fill $him with child, a task your dominant Stud @@.mediumaquamarine;takes unwarranted pride@@ in. + fill $him with child, a task your dominant Stud @@.mediumaquamarine;takes unwarranted pride@@ in. <<set $Stud.trust += 3>> <<if ($Stud.fetishStrength <= 95)>> The opportunity @@.lightcoral;strengthens _his2 dominant tendencies@@ by indulgence. @@ -4633,7 +4637,7 @@ <</if>> <<elseif ($slaves[$i].devotion <= 75)>> <<if ($slaves[$i].fetish == "pregnancy") && ($slaves[$i].fetishKnown == 1) && ($slaves[$i].fetishStrength > 60)>> - $slaves[$i].slaveName, a pregnancy fetishist, is + $slaves[$i].slaveName, a pregnancy fetishist, is <<if _studRandiness == 1>> @@.hotpink;very willing to be bred@@ by your Stud, but never expected to be @@.lime;impregnated via tribbing.@@ <<set $slaves[$i].need -= 20>> @@ -6082,12 +6086,14 @@ <<= FutureSocieties.ChangePorn("Paternalist", 1)>> <</if>> <<if ($slaves[$i].fetish != "mindbroken")>> - <<if ($arcologies[0].FSGenderFundamentalistLawBimbo != 1 && $arcologies[0].FSIntellectualDependency == "unset") && ($slaves[$i].intelligenceImplant < 15)>> - Society @@.red;disapproves@@ of $slaves[$i].slaveName being uneducated; this holds back ideas about slave improvement. - <<= FutureSocieties.ChangePorn("Paternalist", -1)>> - <<elseif ($slaves[$i].intelligenceImplant <= -15)>> + <<if ($slaves[$i].intelligenceImplant <= -15)>> Society @@.red;is appalled@@ by $slaves[$i].slaveName's twisted education; it goes against paternalistic values. <<= FutureSocieties.ChangePorn("Paternalist", -2)>> + <<elseif ($arcologies[0].FSGenderFundamentalistLawBimbo != 1 && $arcologies[0].FSIntellectualDependency == "unset") && ($slaves[$i].intelligenceImplant < 15)>> + <<if ($slaves[$i].assignment != "learn in the schoolroom") && ($slaves[$i].assignment != "take classes")>> + Society @@.red;disapproves@@ of $slaves[$i].slaveName being uneducated; this holds back ideas about slave improvement. + <<= FutureSocieties.ChangePorn("Paternalist", -1)>> + <</if>> <</if>> <</if>> <<if ($slaves[$i].health.condition > 80)>> diff --git a/src/uncategorized/saPleaseYou.tw b/src/uncategorized/saPleaseYou.tw deleted file mode 100644 index 0edcff741a8013c83bdb3133a97127261a540aab..0000000000000000000000000000000000000000 --- a/src/uncategorized/saPleaseYou.tw +++ /dev/null @@ -1,1326 +0,0 @@ -:: SA please you [nobr] - -serves you this week. - -<<setPlayerPronouns>> -<<set _trainingEfficiency = 5+Math.trunc($slaves[$i].devotion/30)+(($slaves[$i].intelligence+$slaves[$i].intelligenceImplant)/32)>> -<<set _oralUse = 0, _analUse = 0, _vaginalUse = 0, _mammaryUse = 0, _penetrativeUse = 0>> -<<set _fetishChangeChance = fetishChangeChance($slaves[$i])>> - -<<if ($slaves[$i].toyHole != "all her holes")>> - <<if $slaves[$i].toyHole == "pussy">> - <<if !canDoVaginal($slaves[$i])>> - <<set $slaves[$i].toyHole = "all her holes">> - <</if>> - <<elseif $slaves[$i].toyHole == "ass">> - <<if !canDoAnal($slaves[$i])>> - <<set $slaves[$i].toyHole = "all her holes">> - <</if>> - <<elseif $slaves[$i].toyHole == "dick">> - <<if !canPenetrate($slaves[$i])>> - <<set $slaves[$i].toyHole = "all her holes">> - <</if>> - <</if>> - <<if ($slaves[$i].toyHole == "pussy")>> - <<if $slaves[$i].fuckdoll == 0>> - $He spends the week - <<if ($slaves[$i].fetish == "mindbroken")>> - unaware of your intent to use $his pussy. - <<elseif ($slaves[$i].trust < -20)>> - in terrified compliance with your use of $his pussy. - <<elseif ($slaves[$i].devotion < -20)>> - alternately struggling and lying corpselike as you use $his pussy. - <<elseif ($slaves[$i].devotion <= 20)>> - reluctantly accepting your use of $his pussy. - <<elseif ($slaves[$i].fetishKnown == 1) && ($slaves[$i].fetish == "submissive")>> - as your adoring submissive, seeing to your pleasure with $his womanhood. - <<elseif ($slaves[$i].devotion <= 50)>> - obediently serving you in the classical way, taking you into $his womanhood. - <<else>> - serving you in the classical way, warming your bed and lovingly taking you into $his womanhood. - <</if>> - You have the sexual energy to fuck $him - <<if ($slaves[$i].fetish == "mindbroken")>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _vaginalUse = random(21,40)>> - several times a day. - <<set $slaves[$i].devotion -= 5, $slaves[$i].trust -= 15>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _vaginalUse = random(7,14)>> - at least once a day. - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 9>> - <<else>> - <<set _vaginalUse = random(3,7)>> - on occasion. - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 3>> - <</if>> - $He doesn't react, even if $his body does. - <<elseif ($slaves[$i].trust >= -20) && ($slaves[$i].devotion <= 20)>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _vaginalUse = random(21,40)>> - several times a day; the constant - <<set $slaves[$i].devotion -= 5, $slaves[$i].trust -= 15>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _vaginalUse = random(7,14)>> - at least once a day; the regular - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 9>> - <<else>> - <<set _vaginalUse = random(3,7)>> - on occasion; the threat of - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 3>> - <</if>> - rape fills $him with @@.mediumorchid;revulsion@@ and @@.gold;fear.@@ - <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _vaginalUse = random(21,40)>> - several times a day; submitting to your constant - <<set $slaves[$i].devotion += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _vaginalUse = random(7,14)>> - at least once a day; submitting to your regular - <<set $slaves[$i].devotion += 2>> - <<else>> - <<set _vaginalUse = random(3,7)>> - on occasion; submitting to your - <<set $slaves[$i].devotion += 1>> - <</if>> - use @@.hotpink;habituates $him@@ to being your sex slave. - <<else>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _vaginalUse = random(21,40)>> - several times a day; constant, - <<set $slaves[$i].devotion += 3, $slaves[$i].trust += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _vaginalUse = random(7,14)>> - several times a day; regular, - <<set $slaves[$i].devotion += 2, $slaves[$i].trust += 2>> - <<else>> - <<set _vaginalUse = random(3,7)>> - on occasion; - <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> - <</if>> - enjoyable sex with you draws $him @@.hotpink;closer to you@@ and encourages $him to @@.mediumaquamarine;trust you.@@ - <</if>> - <<if ($slaves[$i].fetish != "mindbroken")>> - <<if ($slaves[$i].sexualFlaw == "hates penetration") && ($slaves[$i].devotion > 50)>> - The emotional closeness @@.green;resolves $his hatred of penetration.@@ - <<set $slaves[$i].sexualFlaw = "none">> - <</if>> - <<if ($slaves[$i].skill.vaginal < 100)>> - After a lot of time spent having vanilla sex, $his @@.green;vaginal skill improves.@@ - <<= SkillIncrease.Vaginal($slaves[$i], _trainingEfficiency)>> - <</if>> - <</if>> - <<if $PC.dick != 0>> - <<if ($slaves[$i].fetish != "mindbroken")>> - <<if $slaves[$i].fetish == "submissive">> - $He frequently climaxes with your <<if $PC.title == 1>>strong<<else>>soft<</if>> hands holding $him and your cock spreading heat through $his core, - <<if $slaves[$i].fetishKnown == 1>> - @@.hotpink;fulfilling $his life's role completely.@@ - <<else>> - $he @@.hotpink;seems to enjoy@@ being your fucktoy. - <</if>> - <<set $slaves[$i].devotion += 2>> - <<elseif _fetishChangeChance > random(0,100)>> - <<set $slaves[$i].fetish = "submissive", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> - $He frequently climaxes with your <<if $PC.title == 1>>strong<<else>>soft<</if>> hands holding $him and your cock spreading heat through $his core, teaching $him that @@.lightcoral;a $girl's role is to please a _womanP.@@ - <</if>> - <</if>> - <<if canImpreg($slaves[$i], $PC)>> - <<= knockMeUp($slaves[$i], _vaginalUse, 0, -1, 1)>> - <</if>> - <</if>> - <<set $slaves[$i].counter.vaginal += _vaginalUse, $vaginalTotal += _vaginalUse>> - <<else>> - You keep $him with you all week, using $him as your personal sex toy - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _vaginalUse = random(21,40)>> - several times a day. - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _vaginalUse = random(7,14)>> - at least once a day. - <<else>> - <<set _vaginalUse = random(3,7)>> - on occasion. - <</if>> - When you're not using $him, $he <<if !hasAnyLegs($slaves[$i])>>rests<<else>>stands<</if>> nearby, waiting silently for your order to present $his pussy. - <<if $PC.dick != 0>> - <<if canImpreg($slaves[$i], $PC)>> - <<= knockMeUp($slaves[$i], _vaginalUse, 0, -1, 1)>> - <</if>> - <</if>> - <<set $slaves[$i].counter.vaginal += _vaginalUse, $vaginalTotal += _vaginalUse>> - <</if>> - - <<elseif ($slaves[$i].toyHole == "ass")>> - <<if $slaves[$i].fuckdoll == 0>> - $He spends the week - <<if ($slaves[$i].fetish == "mindbroken")>> - unaware of your intent to use $his anus. - <<elseif ($slaves[$i].trust < -20)>> - in terrified compliance with your use of $his anus. - <<elseif ($slaves[$i].devotion < -20)>> - struggling and screaming as you sodomize $him. - <<elseif ($slaves[$i].devotion <= 20)>> - writhing in pain as you sodomize $him. - <<elseif ($slaves[$i].devotion <= 50)>> - obediently submitting to your use of $his butthole. - <<elseif ($slaves[$i].fetishKnown == 1) && ($slaves[$i].fetish == "buttslut")>> - as your adoring anal slave, orgasming to the feel of you<<if $PC.dick != 0>> shooting your seed<<else>>r favorite strap-on<</if>> up $his ass. - <<else>> - warming your bed and devotedly serving your sexual needs with $his anus. - <</if>> - You have the sexual energy to fuck $his butt - <<if ($slaves[$i].fetish == "mindbroken")>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _analUse = random(21,40)>> - several times a day. - <<set $slaves[$i].devotion -= 5, $slaves[$i].trust -= 15>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _analUse = random(7,14)>> - at least once a day. - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 9>> - <<else>> - <<set _analUse = random(3,7)>> - on occasion. - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 3>> - <</if>> - $He doesn't react, even if $his body does. - <<elseif ($slaves[$i].trust >= -20) && ($slaves[$i].devotion <= 20)>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _analUse = random(21,40)>> - several times a day; the constant - <<set $slaves[$i].devotion -= 5, $slaves[$i].trust -= 15>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _analUse = random(7,14)>> - at least once a day; the regular - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 9>> - <<else>> - <<set _analUse = random(3,7)>> - on occasion; the threat of - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 3>> - <</if>> - anal rape fills $him with @@.mediumorchid;revulsion@@ and @@.gold;fear.@@ - <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _analUse = random(21,40)>> - several times a day; constantly - <<set $slaves[$i].devotion += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _analUse = random(7,14)>> - at least once a day; regularly - <<set $slaves[$i].devotion += 2>> - <<else>> - <<set _analUse = random(3,7)>> - on occasion; - <<set $slaves[$i].devotion += 1>> - <</if>> - allowing you to penetrate $his rear @@.hotpink;habituates $him@@ to being your sex slave. - <<else>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _analUse = random(21,40)>> - several times a day; constantly - <<set $slaves[$i].devotion += 3, $slaves[$i].trust += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _analUse = random(7,14)>> - several times a day; regularly - <<set $slaves[$i].devotion += 2, $slaves[$i].trust += 2>> - <<else>> - <<set _analUse = random(3,7)>> - on occasion; - <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> - <</if>> - climaxing to your penetration of $his rear brings $him @@.hotpink;closer to you@@ and encourages $him to @@.mediumaquamarine;trust you.@@ - <</if>> - <<if ($slaves[$i].fetish != "mindbroken")>> - <<if ($slaves[$i].sexualFlaw == "hates anal") && ($slaves[$i].devotion > 50)>> - $He's devoted enough to derive emotional closeness from buttsex, which @@.green;resolves $his hatred of the act.@@ - <<set $slaves[$i].sexualFlaw = "none">> - <</if>> - <<if ($slaves[$i].skill.anal < 100)>> - After a lot of time spent getting buttfucked, $his @@.green;anal skill improves.@@ - <<= SkillIncrease.Anal($slaves[$i], _trainingEfficiency)>> - <</if>> - <<if $slaves[$i].fetish == "buttslut">> - <<if $slaves[$i].fetishKnown == 1>> - $He @@.hotpink;takes great pleasure@@ in $his rear being used as your personal <<if $PC.dick != 0>>cock holster<<else>>plaything<</if>>. - <<else>> - $He @@.hotpink;seems to enjoy@@ anal sex more than the usual slave. - <</if>> - <<set $slaves[$i].devotion += 2>> - <<elseif _fetishChangeChance > random(0,100)>> - <<set $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10, $slaves[$i].fetish = "buttslut">> - After repeated anal orgasms, @@.lightcoral;$he begins to crave $his next buttfuck.@@ - <</if>> - <</if>> - <<if canImpreg($slaves[$i], $PC)>> - <<= knockMeUp($slaves[$i], _analUse, 1, -1, 1)>> - <</if>> - <<set $slaves[$i].counter.anal += _analUse, $analTotal += _analUse>> - <<else>> - You keep $him with you all week, using $him as your personal sex toy - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _analUse = random(21,40)>> - several times a day. - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _analUse = random(7,14)>> - at least once a day. - <<else>> - <<set _analUse = random(3,7)>> - on occasion. - <</if>> - When you're not using $him, $he <<if !hasAnyLegs($slaves[$i])>>rests<<else>>stands<</if>> nearby, waiting silently for your order to present $his asshole. - <<if $PC.dick != 0>> - <<if canImpreg($slaves[$i], $PC)>> - <<= knockMeUp($slaves[$i], _analUse, 1, -1, 1)>> - <</if>> - <</if>> - <<set $slaves[$i].counter.anal += _analUse, $analTotal += _analUse>> - <</if>> - - <<elseif ($slaves[$i].toyHole == "mouth")>> - <<if $slaves[$i].fuckdoll == 0>> - $He spends the week - <<if ($slaves[$i].fetish == "mindbroken")>> - unaware of your intent to use $his mouth. - <<elseif ($slaves[$i].trust < -20)>> - in terrified compliance with your use of $his <<if ($PC.dick != 0)>>throat<<else>>mouth<</if>>. - <<elseif ($slaves[$i].devotion < -20)>> - struggling and gagging as you <<if ($PC.dick != 0)>>throatfuck $him<<else>>ride $his face<</if>>. - <<elseif ($slaves[$i].devotion <= 20)>> - reluctantly <<if ($PC.dick != 0)>>servicing your cock with $his mouth<<else>>licking your pussy<</if>>. - <<elseif ($slaves[$i].devotion <= 50)>> - obediently <<if ($PC.dick != 0)>>sucking your cock<<else>>eating you out<</if>>. - <<elseif ($slaves[$i].fetishKnown == 1) && ($slaves[$i].fetish == "cumslut")>> - as your adoring oral slave, orgasming when you leave $him with a <<if $PC.dick != 0>>mouth full of cum<<if $PC.vagina != -1>> or a <</if>><</if>><<if $PC.vagina != -1>>face covered in your pussyjuice<</if>>. - <<if $PC.dick != 0 && ($fuckSlaves <= ($PC.sexualEnergy/2 + ($PC.balls-3)))>> - Your balls produce so much cum for $him that $he has replaced half $his diet with your cum, and you often leave $him dizzy with a face and chest covered in your sticky pearly semen. - <<elseif $PC.dick != 0 && ($fuckSlaves <= ($PC.sexualEnergy + ($PC.balls-3)))>> - Your balls produce enough cum that $he usually gets facials after a mouthful of semen, and $he loves you for it. - <<else>> - $He usually has to fight for $his share of cum, making sure to milk cum from your urethra <<if $fuckSlaves > 1>>or suck it out of a pussy<</if>>. - <</if>> - <<else>> - warming your bed and lavishing devoted attention on your <<if $PC.dick != 0>>cock<<if $PC.vagina != -1>> and <</if>><</if>><<if $PC.vagina != -1>>pussy<</if>> with $his loving mouth. - <</if>> - You have the sexual energy to - <<if ($slaves[$i].fetish == "mindbroken")>> - <<if ($PC.dick != 0)>>use $his mouth<<else>>make $him eat you out<</if>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _oralUse = random(21,40)>> - several times a day. - <<set $slaves[$i].devotion -= 5, $slaves[$i].trust -= 15>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _oralUse = random(7,14)>> - at least once a day. - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 9>> - <<else>> - <<set _oralUse = random(3,7)>> - on occasion. - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 3>> - <</if>> - $He absentmindedly follows your lead. - <<elseif ($slaves[$i].trust >= -20) && ($slaves[$i].devotion <= 20)>> - <<if ($PC.dick != 0)>>rape $his face<<else>>force $him to eat you out<</if>> $him - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _oralUse = random(21,40)>> - several times a day; the constant - <<set $slaves[$i].devotion -= 5, $slaves[$i].trust -= 15>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _oralUse = random(7,14)>> - at least once a day; the regular - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 9>> - <<else>> - <<set _oralUse = random(3,7)>> - on occasion; the threat of - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 3>> - <</if>> - sexual abuse fills $him with @@.mediumorchid;revulsion@@ and @@.gold;fear.@@ - <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($PC.dick != 0)>>use $his mouth<<else>>make $him eat you out<</if>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _oralUse = random(21,40)>> - several times a day; constantly - <<set $slaves[$i].devotion += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _oralUse = random(7,14)>> - at least once a day; regularly - <<set $slaves[$i].devotion += 2>> - <<else>> - <<set _oralUse = random(3,7)>> - on occasion; - <<set $slaves[$i].devotion += 1>> - <</if>> - performing oral on you @@.hotpink;habituates $him@@ to being your sex slave. - <<else>> - <<if ($PC.dick != 0)>>get a blowjob<<if $PC.vagina != -1>> and some pussy licking<</if>> from $him<<else>>let $him eat you out<</if>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _oralUse = random(21,40)>> - several times a day; constantly - <<set $slaves[$i].devotion += 3, $slaves[$i].trust += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _oralUse = random(7,14)>> - several times a day; regularly - <<set $slaves[$i].devotion += 2, $slaves[$i].trust += 2>> - <<else>> - <<set _oralUse = random(3,7)>> - on occasion; - <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> - <</if>> - giving you pleasure brings $him @@.hotpink;closer to you@@ and encourages $him to @@.mediumaquamarine;trust you.@@ - <</if>> - <<if ($slaves[$i].fetish != "mindbroken")>> - <<if ($slaves[$i].sexualFlaw == "hates oral") && ($slaves[$i].devotion > 50)>> - $He's devoted enough to derive emotional closeness from giving you oral, which @@.green;resolves $his hatred of the act.@@ - <<set $slaves[$i].sexualFlaw = "none">> - <</if>> - <<if ($slaves[$i].behavioralFlaw == "hates men") && ($PC.dick != 0) && ($slaves[$i].devotion > 20)>> - Spending so much time in close proximity to your dick @@.green;reconciles $him to serving cocks.@@ - <<set $slaves[$i].behavioralFlaw = "none">> - <<elseif ($slaves[$i].behavioralFlaw == "hates women") && ($PC.vagina != -1) && ($slaves[$i].devotion > 20)>> - Spending so much time in close proximity to your womanhood @@.green;reconciles $him to serving a pussy.@@ - <<set $slaves[$i].behavioralFlaw = "none">> - <</if>> - <<if ($slaves[$i].skill.oral < 100)>> - After a lot of time spent <<if $PC.dick != 0>>sucking you off<<if $PC.vagina != -1>> and eating you out<</if>><<else>>eating you out<</if>>, $his @@.green;oral skill improves.@@ - <<= SkillIncrease.Oral($slaves[$i], _trainingEfficiency)>> - <</if>> - <<if $slaves[$i].fetish == "cumslut">> - <<if $slaves[$i].fetishKnown == 1>> - $He @@.hotpink;quivers with ecstasy@@ just from the <<if canTaste($slaves[$i])>>taste<<else>>feeling<</if>> of your <<if $PC.dick == 0>>girl<</if>>cum on $his tongue. - <<else>> - $He @@.hotpink;seems to enjoy@@ $his role as a cum receptacle more than you'd expect. - <</if>> - <<set $slaves[$i].devotion += 2>> - <<elseif _fetishChangeChance > random(0,100)>> - <<set $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10, $slaves[$i].fetish = "cumslut">> - $He frequently climaxes with <<if $PC.dick != 0>>your dick in $his mouth<<else>>$his mouth on your cunt<</if>>, learning that giving @@.lightcoral;blowjobs is a lot of fun.@@ - <</if>> - <</if>> - <<set $slaves[$i].counter.oral += _oralUse, $oralTotal += _oralUse>> - <<else>> - You keep $him with you all week, using it as your personal sex toy - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _oralUse = random(21,40)>> - several times a day. - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _oralUse = random(7,14)>> - at least once a day. - <<else>> - <<set _oralUse = random(3,7)>> - on occasion. - <</if>> - When you're not using it, it <<if !hasAnyLegs($slaves[$i])>>rests<<else>>stands<</if>> nearby, waiting silently for your order to open its mouth. - <<set $slaves[$i].counter.oral += _oralUse, $oralTotal += _oralUse>> - <</if>> - - <<elseif $slaves[$i].toyHole == "boobs">> - <<if $slaves[$i].fuckdoll == 0>> - $He spends the week - <<if ($slaves[$i].fetish == "mindbroken")>> - unaware of your intent to use $his breasts. - <<elseif ($slaves[$i].trust < -20)>> - in terrified compliance with your use of $his breasts. - <<elseif ($slaves[$i].devotion < -20)>> - trying to keep $his tits away from your grasping hands. - <<elseif ($slaves[$i].devotion <= 20)>> - reluctantly presenting $his tits for your use. - <<elseif ($slaves[$i].devotion <= 50)>> - obediently offering $his tits for your use. - <<elseif ($slaves[$i].fetishKnown == 1) && ($slaves[$i].fetish == "boobs")>> - moaning and shivering as you give it to $him where $he likes it best: $his tits. - <<else>> - keeping $his tits in constant contact with you, giving you titjobs<<if $slaves[$i].nipples == "fuckable">>, savoring your enjoyment of $his nipplecunts<</if>>, resting them against you as you work, and serving as a comfortable pillow at bedtime. - <</if>> - You have the sexual energy to - <<if ($slaves[$i].fetish == "mindbroken")>> - <<if ($PC.dick != 0)>> - <<if $slaves[$i].nipples == "fuckable">> - fuck $his boobs - <<else>> - cum on $his boobs - <</if>> - <<else>> - thoroughly grope $his boobs - <</if>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _mammaryUse = random(21,40)>> - several times a day. - <<set $slaves[$i].devotion -= 5, $slaves[$i].trust -= 15>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _mammaryUse = random(7,14)>> - at least once a day. - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 9>> - <<else>> - <<set _mammaryUse = random(3,7)>> - on occasion. - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 3>> - <</if>> - $He absentmindedly follows your lead. - <<elseif ($slaves[$i].trust >= -20) && ($slaves[$i].devotion <= 20)>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _mammaryUse = random(21,40)>> - <<if ($PC.dick != 0)>> - <<if $slaves[$i].nipples == "fuckable">> - fuck $his boobs - <<else>> - cum on $his boobs - <</if>> - <<else>> - thoroughly grope $his boobs - <</if>> - several times a day; the constant - <<set $slaves[$i].devotion -= 5, $slaves[$i].trust -= 15>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _mammaryUse = random(7,14)>> - <<if ($PC.dick != 0)>> - <<if $slaves[$i].nipples == "fuckable">> - fuck $his boobs - <<else>> - cum on $his boobs - <</if>> - <<else>> - thoroughly grope $his boobs - <</if>> - $him at least once a day; the regular - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 9>> - <<else>> - <<set _mammaryUse = random(3,7)>> - <<if ($PC.dick != 0)>> - <<if $slaves[$i].nipples == "fuckable">> - fuck $his boobs - <<else>> - cum on $his boobs - <</if>> - <<else>> - thoroughly grope $his boobs - <</if>> - $him on occasion; the threat of - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 3>> - <</if>> - sexual abuse fills $him with @@.mediumorchid;revulsion@@ and @@.gold;fear.@@ - <<elseif ($slaves[$i].devotion <= 20)>> - play with $his tits - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _mammaryUse = random(21,40)>> - several times a day; constantly - <<set $slaves[$i].devotion += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _mammaryUse = random(7,14)>> - at least once a day; regularly - <<set $slaves[$i].devotion += 2>> - <<else>> - <<set _mammaryUse = random(3,7)>> - on occasion; - <<set $slaves[$i].devotion += 1>> - <</if>> - submitting to your games @@.hotpink;habituates $him@@ to being your sex slave. - <<else>> - <<if ($PC.boobs >= 300)>>have mutual mammary intercourse until you both orgasm to nipple stimulation<<else>>have mammary intercourse with $him<</if>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _mammaryUse = random(21,40)>> - several times a day; constantly - <<set $slaves[$i].devotion += 3, $slaves[$i].trust += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _mammaryUse = random(7,14)>> - at least once a day; regularly - <<set $slaves[$i].devotion += 2, $slaves[$i].trust += 2>> - <<else>> - <<set _mammaryUse = random(3,7)>> - on occasion; - <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> - <</if>> - giving you pleasure brings $him @@.hotpink;closer to you@@ and encourages $him to @@.mediumaquamarine;trust you.@@ - <</if>> - <<if ($slaves[$i].fetish != "mindbroken")>> - <<if ($slaves[$i].sexualFlaw == "hates oral") && ($slaves[$i].devotion > 50)>> - $He's devoted enough to derive emotional closeness from giving you oral, which @@.green;resolves $his hatred of the act.@@ - <<set $slaves[$i].sexualFlaw = "none">> - <</if>> - <<if ($slaves[$i].behavioralFlaw == "hates men") && ($slaves[$i].devotion > 20) && $PC.title == 1>> - Spending so much time in close proximity to your masculinity @@.green;reconciles $him to serving the male gender.@@ - <<set $slaves[$i].behavioralFlaw = "none">> - <<elseif ($slaves[$i].behavioralFlaw == "hates women") && ($PC.title == 0) && ($slaves[$i].devotion > 20)>> - Spending so much time in close proximity to your femininity @@.green;reconciles $him to serving the female gender.@@ - <<set $slaves[$i].behavioralFlaw = "none">> - <</if>> - <<if $slaves[$i].fetish == "boobs">> - <<if $slaves[$i].fetishKnown == 1>> - $He @@.hotpink;quivers with ecstasy@@ just from the touch of your <<if $PC.title == 1>>strong<<else>>soft<</if>> hands against $his <<if $slaves[$i].boobs >= 300>>breasts<<else>>flat chest<</if>>. - <<else>> - $He @@.hotpink;seems to enjoy@@ having $his <<if $slaves[$i].boobs >= 300>>breasts<<else>>chest<</if>> fondled more than the average $girl. - <</if>> - <<set $slaves[$i].devotion += 2>> - <<elseif _fetishChangeChance > random(0,100)>> - <<set $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10, $slaves[$i].fetish = "boobs">> - $He climaxes to nipple stimulation alone, and starts acting as though - <<if $slaves[$i].clit > 0 && $slaves[$i].nipples != "fuckable">> - $he has @@.lightcoral;three pleasure buttons@@ rather than just one. - <<elseif $slaves[$i].vagina > -1 && $slaves[$i].nipples == "fuckable">> - $he has @@.lightcoral;a trio of pussies@@ rather than just one. - <<else>> - $his tits are $his @@.lightcoral;primary erogenous zone.@@ - <</if>> - <</if>> - <</if>> - <<if $slaves[$i].lactation > 0>> - <<set $slaves[$i].lactationDuration = 2>> - <<if $slaves[$i].boobsMilk > 0>> - <<set $slaves[$i].boobs -= $slaves[$i].boobsMilk, $slaves[$i].boobsMilk = 0>> - <</if>> - <<else>> - <<set $slaves[$i].induceLactation += 2>> - <<= induceLactation($slaves[$i])>> - <</if>> - <<set $slaves[$i].counter.mammary += _mammaryUse, $mammaryTotal += _mammaryUse>> - <<else>> - You keep $him with you all week, using $him as your personal sex toy - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _mammaryUse = random(21,40)>> - several times a day. - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _mammaryUse = random(7,14)>> - at least once a day. - <<else>> - <<set _mammaryUse = random(3,7)>> - on occasion. - <</if>> - When you're not using $him, $he <<if !hasAnyLegs($slaves[$i])>>rests<<else>>stands<</if>> nearby, waiting silently for your order to present $his chest. - <<set $slaves[$i].counter.mammary += _mammaryUse, $mammaryTotal += _mammaryUse>> - <</if>> - - /*check*/ - <<elseif ($slaves[$i].toyHole == "dick")>> - <<if $slaves[$i].fuckdoll > 0>> - All it takes is a simple command to force $his dick to attention. You have the sexual energy to ride $him - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _penetrativeUse = random(21,40)>> - several times a day. - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _penetrativeUse = random(7,14)>> - at least once a day. - <<else>> - <<set _penetrativeUse = random(3,7)>> - on occasion. - <</if>> - You have to do all the work, unfortunately. - <<elseif $slaves[$i].fetish == "mindbroken">> - <<if $slaves[$i].career == "a breeding bull">> - <<if canGetPregnant($PC)>> - $He spends the week eagerly trying to breed you. You have the sexual energy to take $him - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _penetrativeUse = random(21,40)>> - several times a day. - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _penetrativeUse = random(7,14)>> - at least once a day. - <<else>> - <<set _penetrativeUse = random(3,7)>> - on occasion. - <</if>> - $He happily mounts you and humps away, but $he has no sense of what's pleasurable to you and just excitedly thrusts until $he cums inside you. - <<else>> - You spend the week getting humped by $him after you've managed to encourage $him to mount you. You have the sexual energy to use $his dick - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _penetrativeUse = random(21,40)>> - several times a day. - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _penetrativeUse = random(7,14)>> - at least once a day. - <<else>> - <<set _penetrativeUse = random(3,7)>> - on occasion. - <</if>> - $His conditioning tells $him to impregnate others, and since $he sees you as already pregnant, just cums inside you for $his own pleasure. - <</if>> - <<else>> - You spend the week using $his dick after you've stimulated $him enough to get $him hard. You have the sexual energy to ride $him - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _penetrativeUse = random(21,40)>> - several times a day. - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _penetrativeUse = random(7,14)>> - at least once a day. - <<else>> - <<set _penetrativeUse = random(3,7)>> - on occasion. - <</if>> - $He sometimes thrusts out of instinct, but most of the work in the endeavor falls to you. - <</if>> - <<elseif $PC.preg >= 24 && $PC.pregMood == 1>> - $He spends the week - <<if ($slaves[$i].trust < -20)>> - cautiously fucking you in the missionary position. It takes a gentle touch to let $him know it safe to get hard, but after that $he knows what to do. - <<elseif ($slaves[$i].devotion < -20)>> - aggressively fucking your pussy with little regard for you or your child<<if $PC.pregType > 1>>ren<</if>>. - <<elseif ($slaves[$i].devotion <= 20)>> - obediently fucking you in the missionary position while putting up with your attempts to breast feed $him. - <<elseif ($slaves[$i].fetishKnown == 1) && ($slaves[$i].fetish == "dom")>> - as your adoring dom, giving you exactly what you need and treating you like a woman. - <<elseif $slaves[$i].career == "a breeding bull" || ($slaves[$i].fetishKnown == 1) && ($slaves[$i].fetish == "pregnancy")>> - eagerly driving $his cock into your pussy, and shooting cum as deep as $him can. - <<elseif ($slaves[$i].devotion <= 50)>> - obediently driving $his shaft into your womanhood as you knead your aching breasts. - <<else>> - eagerly driving $his shaft into your womanhood as you knead your aching breasts. - <</if>> - You have the sexual energy to desire $his dick in you - <<if ($slaves[$i].trust >= -20) && ($slaves[$i].devotion <= 20)>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _penetrativeUse = random(21,40)>> - several times a day; - <<set $slaves[$i].devotion -= 15, $slaves[$i].trust += 7>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _penetrativeUse = random(7,14)>> - at least once a day; - <<set $slaves[$i].devotion -= 10, $slaves[$i].trust += 7>> - <<else>> - <<set _penetrativeUse = random(3,7)>> - on occasion; - <<set $slaves[$i].devotion -= 5, $slaves[$i].trust += 7>> - <</if>> - getting to dominantly fuck $his '<<= WrittenMaster($slaves[$i])>>' @@.mediumorchid;builds $his self-confidence@@ and @@.mediumaquamarine;lessens $his fear@@ of you. - <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _penetrativeUse = random(21,40)>> - several times a day; - <<set $slaves[$i].devotion -= 5, $slaves[$i].trust += 5>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _penetrativeUse = random(7,14)>> - at least once a day; - <<set $slaves[$i].devotion -= 4, $slaves[$i].trust += 4>> - <<else>> - <<set _penetrativeUse = random(3,7)>> - on occasion; - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust += 3>> - <</if>> - getting to dominantly fuck $his '<<= WrittenMaster($slaves[$i])>>' @@.mediumorchid;builds $his self-confidence,@@ yet @@.mediumaquamarine;makes $him more trusting@@ of you. - <<else>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _penetrativeUse = random(21,40)>> - several times a day; constant, enjoyable - <<set $slaves[$i].devotion += 3, $slaves[$i].trust += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _penetrativeUse = random(7,14)>> - at least once a day; regular, enjoyable - <<set $slaves[$i].devotion += 2, $slaves[$i].trust += 2>> - <<else>> - <<set _penetrativeUse = random(3,7)>> - on occasion; enjoyable - <<set $slaves[$i].devotion++, $slaves[$i].trust++>> - <</if>> - sex with you draws $him @@.hotpink;closer to you@@ and encourages $him to @@.mediumaquamarine;trust you.@@ - <</if>> - <<elseif $PC.preg >= 24 && $PC.pregMood == 2>> - $He spends the week - <<if ($slaves[$i].trust < -20)>> - in fear under your gravid bulk as you forcibly ride $his dick in a futile attempt to cool your raging hormones. - <<elseif ($slaves[$i].devotion < -20)>> - alternately struggling or lying corpselike under your gravid bulk as you forcibly ride $his dick in a futile attempt to cool your raging hormones. - <<elseif ($slaves[$i].devotion <= 20)>> - reluctantly trying to avoid having to take all of your pregnancy weight while not pissing you off whenever you ride $his dick in a futile attempt to cool your raging hormones. - <<elseif ($slaves[$i].fetishKnown == 1) && ($slaves[$i].fetish == "submissive")>> - doing $his best to be a good belly support as $he submissively gives you what you want. - <<elseif ($slaves[$i].devotion <= 50)>> - obediently bearing your weight as you aggressively ride $his dick in a futile attempt to cool your raging hormones. - <<else>> - happily pampering and supporting your gravid bulk as you ride $his dick in a futile attempt to cool your raging hormones. - <</if>> - You have the sexual energy to aggressively mount $him - <<if ($slaves[$i].trust >= -20) && ($slaves[$i].devotion <= 20)>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _penetrativeUse = random(21,40)>> - several times a day; the constant, - <<set $slaves[$i].devotion -= 10, $slaves[$i].trust -= 25>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _penetrativeUse = random(7,14)>> - at least once a day; the regular, - <<set $slaves[$i].devotion -= 5, $slaves[$i].trust -= 15>> - <<else>> - <<set _penetrativeUse = random(3,7)>> - on occasion; the threat of - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 5>> - <</if>> - violent rape fills $him with @@.mediumorchid;revulsion@@ and @@.gold;fear.@@ - <<elseif ($slaves[$i].devotion <= 20)>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _penetrativeUse = random(21,40)>> - several times a day; submitting to your constant, - <<set $slaves[$i].devotion += 3, $slaves[$i].trust -= 5>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _penetrativeUse = random(7,14)>> - at least once a day; submitting to your regular, - <<set $slaves[$i].devotion += 2, $slaves[$i].trust -= 4>> - <<else>> - <<set _penetrativeUse = random(3,7)>> - on occasion; submitting to your rather - <<set $slaves[$i].devotion++, $slaves[$i].trust -= 3>> - <</if>> - forceful use @@.hotpink;habituates $him@@ to being a sex slave, though $he learns to @@.gold;fear@@ your bottomless lust. - <<else>> - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _penetrativeUse = random(21,40)>> - several times a day; constant, - <<set $slaves[$i].devotion += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _penetrativeUse = random(7,14)>> - at least once a day; regular, - <<set $slaves[$i].devotion += 2>> - <<else>> - <<set _penetrativeUse = random(3,7)>> - on occasion; - <<set $slaves[$i].devotion++>> - <</if>> - rough sex with you teaches $him that @@.hotpink;$his place is under your stomach.@@ - <</if>> - <<else>> - $He spends the week - <<if ($slaves[$i].trust < -20)>> - in terrified compliance with your use of $his dick. - <<elseif ($slaves[$i].devotion < -20)>> - alternately struggling or lying corpselike as you ride $his dick. - <<elseif ($slaves[$i].devotion <= 20)>> - reluctantly accepting your use of $his dick. - <<elseif ($slaves[$i].fetishKnown == 1) && ($slaves[$i].fetish == "submissive")>> - as your adoring submissive, seeing to your pleasure with $his shaft. - <<elseif ($slaves[$i].devotion <= 50 && $PC.vagina != -1)>> - obediently serving you in the classical way, driving into your womanhood. - <<elseif ($slaves[$i].devotion <= 50)>> - week obediently serving you by driving into your backdoor. - <<elseif $PC.vagina != -1 && ($slaves[$i].career == "a breeding bull" || ($slaves[$i].fetishKnown == 1) && ($slaves[$i].fetish == "pregnancy"))>> - eagerly driving $his cock into your pussy, thoroughly enjoying fucking pussy bareback and cumming deep inside. - <<elseif $PC.vagina != -1>> - serving you in the classical way, warming your bed and lovingly driving $his shaft into your womanhood. - <<else>> - serving you in the classical way, warming your bed and lovingly driving $his shaft into your backdoor. - <</if>> - <<if ($slaves[$i].trust >= -20) && ($slaves[$i].devotion <= 20)>> - You have the sexual energy to ride $him - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _penetrativeUse = random(21,40)>> - several times a day; the constant - <<set $slaves[$i].devotion -= 5, $slaves[$i].trust -= 15>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _penetrativeUse = random(7,14)>> - at least once a day; the regular - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 9>> - <<else>> - <<set _penetrativeUse = random(3,7)>> - on occasion; the threat of - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 3>> - <</if>> - rape fills $him with @@.mediumorchid;revulsion@@ and @@.gold;fear.@@ - <<elseif ($slaves[$i].devotion <= 20)>> - You have the sexual energy to ride $him - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _penetrativeUse = random(21,40)>> - several times a day; submitting to your constant - <<set $slaves[$i].devotion += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _penetrativeUse = random(7,14)>> - at least once a day; submitting to your regular - <<set $slaves[$i].devotion += 2>> - <<else>> - <<set _penetrativeUse = random(3,7)>> - on occasion; submitting to your - <<set $slaves[$i].devotion++>> - <</if>> - use @@.hotpink;habituates $him@@ to being your sex slave. - <<else>> - You have the sexual energy to get fucked by $him - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _penetrativeUse = random(21,40)>> - several times a day; constant, - <<set $slaves[$i].devotion += 3, $slaves[$i].trust += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _penetrativeUse = random(7,14)>> - at least once a day; regular, - <<set $slaves[$i].devotion += 2, $slaves[$i].trust += 2>> - <<else>> - <<set _penetrativeUse = random(3,7)>> - on occasion; - <<set $slaves[$i].devotion++, $slaves[$i].trust++>> - <</if>> - enjoyable sex with you draws $him @@.hotpink;closer to you@@ and encourages $him to @@.mediumaquamarine;trust you.@@ - <</if>> - <</if>> - /*check*/ - <<if ($slaves[$i].fetish != "mindbroken")>> - <<if ($slaves[$i].behavioralFlaw == "hates women") && ($PC.title == 0) && ($PC.vagina != -1) && ($PC.dick == 0) && ($slaves[$i].devotion > 20)>> - Spending so much intimate time with an attractive woman @@.green;reconciles $him to serving the fairer sex.@@ - <<set $slaves[$i].behavioralFlaw = "none">> - <</if>> - <</if>> - <<set $slaves[$i].counter.penetrative += _penetrativeUse, $penetrativeTotal += _penetrativeUse>> - <<if canImpreg($PC, $slaves[$i])>> - <<= knockMeUp($PC, _penetrativeUse, 0, $slaves[$i].ID)>> - <</if>> - <<if $sexualOpeness == 0>> - Rumors spread that you @@.red;enjoy taking it from slaves.@@ - <<set $PC.degeneracy += 2>> - <</if>> - <</if>> - -<<else>> - - <<if $slaves[$i].fuckdoll > 0>> - You keep $him with you all week, using $him as your personal sex toy. When you're not using $him, $he <<if !hasAnyLegs($slaves[$i])>>rests<<else>>stands<</if>> nearby, waiting silently. - <<set $slaves[$i].trust += 4>> - - <<elseif ($slaves[$i].anus == 0) && ($slaves[$i].vagina == 0)>> - Since you haven't yet decided to sell or take $his virginity or $his tight little anus, you let $him please you with $his mouth<<if $slaves[$i].nipples == "fuckable" && $PC.dick != 0>> and tits<</if>>. $He is @@.mediumaquamarine;duly grateful@@ you let $him keep $his innocence for another week, though $his - <<if $slaves[$i].nipples == "fuckable" && $PC.dick != 0>> - throat and breasts get a little sore picking up the slack. - <<else>> - throat gets a little sore doing the work of three holes. - <</if>> - <<set $slaves[$i].trust += 1>> - - <<elseif ($slaves[$i].vagina == 0)>> - Since you haven't yet decided to sell or take $his virginity, you let $him confine $his efforts to $his - <<if canDoAnal($slaves[$i]) && $slaves[$i].nipples == "fuckable" && $PC.dick != 0>> - anus, nipples and mouth. $He is @@.mediumaquamarine;duly grateful@@ you let $his keep $his innocence for another week, though $his butt, boobs and throat get a little sore. - <<elseif canDoAnal($slaves[$i])>> - anus and mouth. $He is @@.mediumaquamarine;duly grateful@@ you let $his keep $his innocence for another week, though $his butt and throat get a little sore. - <<elseif $slaves[$i].nipples == "fuckable" && $PC.dick != 0>> - nipples and mouth. $He is @@.mediumaquamarine;duly grateful@@ you let $his keep $his innocence for another week, though $his boobs and throat get a little sore. - <<else>> - mouth. $He is @@.mediumaquamarine;duly grateful@@ you let $his keep $his innocence for another week, though $his throat gets a little sore. - <</if>> - <<set $slaves[$i].trust += 1>> - - <<elseif ($slaves[$i].anus == 0)>> - Since you haven't yet decided to sell or take $his tight little anus, you let $him confine $his efforts to $his - <<if canDoVaginal($slaves[$i]) && $slaves[$i].nipples == "fuckable" && $PC.dick != 0>> - pussy, nipples and mouth. $He is @@.mediumaquamarine;duly grateful@@ you let $him put off taking it up the butt another week, though $his boobs and throat get a little sore. - <<elseif canDoVaginal($slaves[$i])>> - pussy and mouth. $He is @@.mediumaquamarine;duly grateful@@ you let $him put off taking it up the butt another week, though $his throat gets a little sore. - <<elseif $slaves[$i].nipples == "fuckable" && $PC.dick != 0>> - nipples and mouth. $He is @@.mediumaquamarine;duly grateful@@ you let $him put off taking it up the butt another week, though $his boobs and throat get a little sore. - <<else>> - mouth. $He is @@.mediumaquamarine;duly grateful@@ you let $him put off taking it up the butt another week, though $his throat gets a little sore. - <</if>> - <<set $slaves[$i].trust += 1>> - - <<elseif !canWalk($slaves[$i])>> - You carry $him around with you all week, using $him as your personal sex toy and bedwarmer. - <<if (isAmputee($slaves[$i]))>> - Without arms and legs, - <<elseif (!hasAnyLegs($slaves[$i]))>> - Without legs, - <<elseif (!hasBothLegs($slaves[$i]))>> - With just one leg, - <<elseif tooFatSlave($slaves[$i])>> - Immobilized by $his own weight, - <<elseif tooBigBreasts($slaves[$i])>> - Immobilized by $his own tits, - <<elseif tooBigBelly($slaves[$i])>> - Immobilized by $his own swollen orb of a midsection, - <<elseif tooBigBalls($slaves[$i])>> - Immobilized by $his own oversized testicles, - <<elseif tooBigDick($slaves[$i])>> - Immobilized by $his own oversized cock, - <<elseif tooBigButt($slaves[$i])>> - Immobilized by $his own massive ass, - <<else>> - With $his clipped heels, - <</if>> - $he is your @@.hotpink;helpless sexual appliance@@ and is @@.mediumaquamarine;forced to trust you.@@ - <<set $slaves[$i].trust += 4>> - - <<elseif ($slaves[$i].devotion > 50)>> - $He devotedly accompanies you all week, keeping $his - <<if canDoAnal($slaves[$i]) && canDoVaginal($slaves[$i])>> - mouth, vagina<<if $PC.dick != 0 && $slaves[$i].nipples == "fuckable">>, nipples<</if>> and asshole - <<elseif ($slaves[$i].vagina == -1) && canDoAnal($slaves[$i])>> - mouth<<if $PC.dick != 0 && $slaves[$i].nipples == "fuckable">>, nipples<</if>> and asshole - <<elseif ($slaves[$i].vagina > -1) && !canDoVaginal($slaves[$i]) && canDoAnal($slaves[$i])>> - mouth<<if $PC.dick != 0 && $slaves[$i].nipples == "fuckable">>, nipples<</if>> and, since $his pussy is covered by $his chastity belt, asshole - <<else>> - mouth<<if $PC.dick != 0 && $slaves[$i].nipples == "fuckable">>and nipples<</if>> - <</if>> - available for you at all times. - <<if canAchieveErection($slaves[$i]) && !($slaves[$i].chastityPenis)>> - Every time $his beloved <<= WrittenMaster($slaves[$i])>> fucks $him, $he gets a hard-on. - <<elseif ($slaves[$i].dick != 0) && ($slaves[$i].prostate > 0) && canDoVaginal($slaves[$i])>> - $He doesn't get a hard-on as you use $him, but $he comes from the prostate stimulation when $his beloved <<= WrittenMaster($slaves[$i])>> uses $his pussy. - <<elseif ($slaves[$i].dick != 0) && ($slaves[$i].prostate > 0) && canDoAnal($slaves[$i])>> - $He doesn't get a hard-on as you use $him, but $he comes from the prostate stimulation when $his beloved <<= WrittenMaster($slaves[$i])>> uses $his butt. - <<else>> - $He comes indecently hard whenever $his beloved <<= WrittenMaster($slaves[$i])>> uses $his body. - <</if>> - You have the sexual energy to fuck $him - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - several times a day; constant, - <<set $slaves[$i].devotion += 3, $slaves[$i].trust += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - at least once a day; regular, - <<set $slaves[$i].devotion += 2, $slaves[$i].trust += 2>> - <<else>> - on occasion; - <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> - <</if>> - loving sex with you draws $him @@.hotpink;closer to you@@ and encourages $him to @@.mediumaquamarine;trust you.@@ - - <<elseif ($slaves[$i].devotion > 20)>> - Whenever you feel the need, you use whichever of $his available holes that appears most appealing at the moment, since $he's up for anything. - <<if ($slaves[$i].dick != 0) && canAchieveErection($slaves[$i]) && !($slaves[$i].chastityPenis)>> - By the end of the week $he gets a hard-on when you use $him. - <</if>> - You have the sexual energy to fuck $him - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - several times a day; constant, - <<set $slaves[$i].devotion += 3, $slaves[$i].trust += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - at least once a day; regular, - <<set $slaves[$i].devotion += 2, $slaves[$i].trust += 2>> - <<else>> - on occasion; - <<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>> - <</if>> - enjoyable sex with you draws $him @@.hotpink;closer to you@@ and encourages $him to @@.mediumaquamarine;trust you.@@ - - <<elseif ($slaves[$i].trust < -20)>> - $He is afraid of you and does $his best to offer you $his - <<if canDoAnal($slaves[$i]) && canDoVaginal($slaves[$i])>> - mouth, vagina<<if $PC.dick != 0 && $slaves[$i].nipples == "fuckable">>, nipples<</if>> and asshole - <<elseif ($slaves[$i].vagina == -1) && canDoAnal($slaves[$i])>> - mouth<<if $PC.dick != 0 && $slaves[$i].nipples == "fuckable">>, nipples<</if>> and asshole - <<elseif ($slaves[$i].vagina > -1) && !canDoVaginal($slaves[$i]) && canDoAnal($slaves[$i])>> - mouth<<if $PC.dick != 0 && $slaves[$i].nipples == "fuckable">>, nipples<</if>> and, since $his pussy is covered by $his chastity belt, asshole - <<else>> - mouth<<if $PC.dick != 0 && $slaves[$i].nipples == "fuckable">>and nipples<</if>> - <</if>> - to save $himself from worse treatment than mere rape. - <<if ($slaves[$i].dick != 0) && canAchieveErection($slaves[$i]) && !($slaves[$i].chastityPenis)>> - By the end of the week $he gets a hard-on when you use $him. - <</if>> - You have the sexual energy to fuck $him - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - several times a day; submitting to your constant - <<set $slaves[$i].devotion += 3>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - at least once a day; submitting to your regular - <<set $slaves[$i].devotion += 2>> - <<else>> - on occasion; submitting to your - <<set $slaves[$i].devotion += 1>> - <</if>> - use @@.hotpink;habituates $him@@ to being your sex slave. - - <<else>> - Whenever you feel the need, you grab $him and use whichever of $his available holes that appears most appealing at the moment. - <<if ($slaves[$i].dick != 0) && canAchieveErection($slaves[$i])>> - $His dick stays limp as you rape $him. - <</if>> - You have the sexual energy to fuck $him - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - several times a day; the constant - <<set $slaves[$i].devotion -= 5, $slaves[$i].trust -= 15>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - at least once a day; the regular - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 9>> - <<else>> - on occasion; the threat of - <<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 3>> - <</if>> - rape fills $him with @@.mediumorchid;revulsion@@ and @@.gold;fear.@@ - <</if>> - - <<if ($fuckSlaves <= $PC.sexualEnergy/2)>> - <<set _acts = random(21,40)>> - <<elseif ($fuckSlaves <= $PC.sexualEnergy)>> - <<set _acts = random(7,14)>> - <<else>> - <<set _acts = random(3,7)>> - <</if>> - <<set _oralUse = 1>> - <<if canDoAnal($slaves[$i]) && $slaves[$i].anus > 0>><<set _analUse = 1>><</if>> - <<if canDoVaginal($slaves[$i]) && $slaves[$i].vagina > 0>><<set _vaginalUse = 1>><</if>> - <<set _mammaryUse = random(0,1)>> - <<if $slaves[$i].nipples == "fuckable">> - <<set _mammaryUse = 1>> - <</if>> - <<set _demand = _oralUse+_analUse+_vaginalUse+_mammaryUse>> - <<set _oralUse = Math.trunc((_oralUse/_demand)*_acts)>> - <<set _analUse = Math.trunc((_analUse/_demand)*_acts)>> - <<set _vaginalUse = Math.trunc((_vaginalUse/_demand)*_acts)>> - <<set _mammaryUse = Math.trunc((_mammaryUse/_demand)*_acts)>> - <<set $slaves[$i].counter.oral += _oralUse, $oralTotal += _oralUse>> - <<set $slaves[$i].counter.anal += _analUse, $analTotal += _analUse>> - <<set $slaves[$i].counter.vaginal += _vaginalUse, $vaginalTotal += _vaginalUse>> - <<set $slaves[$i].counter.mammary += _mammaryUse, $mammaryTotal += _mammaryUse>> - - <<if $slaves[$i].fuckdoll == 0>> - <<if ($slaves[$i].health.condition < 0) && (random(1,100) > 50)>> - Under your personal supervision, @@.green;$his health improves.@@ - <<run improveCondition($slaves[$i], 10)>> - <</if>> - <<if $slaves[$i].fetish != "mindbroken">> - <<if ($slaves[$i].skill.oral < 100)>> - After a lot of time spent with <<if $PC.dick != 0>>your dick in $his mouth<<else>>$his mouth on your cunt<</if>>, $his @@.green;oral skill improves.@@ - <<= SkillIncrease.Oral($slaves[$i], _trainingEfficiency)>> - <<elseif ($slaves[$i].skill.vaginal < 100) && ($slaves[$i].vagina > 0) && canDoVaginal($slaves[$i])>> - After a lot of time spent getting fucked, $his @@.green;vaginal skill improves.@@ - <<= SkillIncrease.Vaginal($slaves[$i], _trainingEfficiency)>> - <<elseif ($slaves[$i].skill.anal < 100) && ($slaves[$i].anus != 0) && canDoAnal($slaves[$i])>> - After a lot of time spent taking it up the ass, $his @@.green;anal skill improves.@@ - <<= SkillIncrease.Anal($slaves[$i], _trainingEfficiency)>> - <</if>> - <</if>> - <</if>> - - <<if $slaves[$i].lactation > 0 && _mammaryUse > 0>> - <<set $slaves[$i].lactationDuration = 2>> - <<if $slaves[$i].boobsMilk > 0>> - <<set $slaves[$i].boobs -= $slaves[$i].boobsMilk, $slaves[$i].boobsMilk = 0>> - <</if>> - <</if>> - -<</if>> - -<<set _cervixPump = 0>> -<<if $PC.dick != 0>> - <<if $slaves[$i].cervixImplant == 1 || $slaves[$i].cervixImplant == 3>> - <<set _cervixPump += 10*($PC.balls-2)*_vaginalUse>> - <</if>> - <<if $slaves[$i].cervixImplant == 2 || $slaves[$i].cervixImplant == 3>> - <<set _cervixPump += 10*($PC.balls-2)*_analUse>> - <</if>> -<</if>> - -<<if _cervixPump > 0>> - <<if $slaves[$i].fuckdoll == 0>> - <<if ($slaves[$i].fetish == "mindbroken")>> - $He is completely oblivious to $his @@.lime;increasingly swollen belly@@ and stands no chance of linking it to - <<else>> - $He notices $his @@.lime;belly has swollen@@ after - <</if>> - all the - <<if $slaves[$i].cervixImplant == 1>> - vaginal - <<elseif $slaves[$i].cervixImplant == 2>> - anal - <</if>> - sex $he's had with you. - <<set $slaves[$i].bellyImplant += _cervixPump>> - <<else>> - With each deposit of your seed into $him, $his @@.lime;stomach swells a little larger.@@ - <<set $slaves[$i].bellyImplant += _cervixPump>> - <</if>> -<</if>> - -<<if $slaves[$i].need>> - <<if $slaves[$i].energy > 95 && $masterSuiteUpgradeLuxury == 2 && $fuckSlaves > 1>> - $he's a nymphomaniac and very difficult to sate, but the fuckpit allows $him all the sex even $he could ever want. - <<set $slaves[$i].need = 0>> - <<elseif $slaves[$i].devotion > 95>> - $He's so devoted to you that any intimacy with you at all gives $him sexual satisfaction. - <<set $slaves[$i].need = 0>> - <<elseif $slaves[$i].fetishKnown>> - <<switch $slaves[$i].fetish>> - <<case "masochist" "submissive">> - <<if _analUse+_vaginalUse > 0>> - $He got tremendous sexual satisfaction from the <<print _analUse+_vaginalUse>> times you really fucked $him this week. - <<set $slaves[$i].need = 0>> - <</if>> - <<case "dom">> - <<if _penetrativeUse > 0>> - $He got tremendous sexual satisfaction from the _penetrativeUse times $he got to fuck you this week. - <<set $slaves[$i].need = 0>> - <</if>> - <<case "boobs">> - <<if _mammaryUse > 0>> - $He got tremendous sexual satisfaction from the _mammaryUse times you groped $his breasts to orgasm this week. - <<set $slaves[$i].need = 0>> - <</if>> - <<case "sadist">> - <<case "cumslut">> - <<if _oralUse > 0>> - $He got tremendous sexual satisfaction from the _oralUse times you fucked $his face this week. - <<set $slaves[$i].need = 0>> - <</if>> - <<case "buttslut">> - <<if _analUse > 0>> - $He got tremendous sexual satisfaction from the _analUse times you fucked $his ass this week. - <<set $slaves[$i].need = 0>> - <</if>> - <<case "pregnancy">> - <<if _vaginalUse > 0 && $slaves[$i].mpreg == 0>> - $He got tremendous sexual satisfaction from the _vaginalUse times you fucked $his pussy this week. - <<set $slaves[$i].need = 0>> - <<elseif _analUse > 0 && $slaves[$i].mpreg == 1>> - $He got tremendous sexual satisfaction from the _analUse times you fucked $his butt this week. - <<set $slaves[$i].need = 0>> - <</if>> - <<case "humiliation">> - <</switch>> - <</if>> -<</if>> - -<<if $familyTesting == 1>> - <<if $slaves[$i].father == -1 && $slaves[$i].mother != -1>> - Keeping your own $daughter as a personal fucktoy leaves quite a public impression. - <<elseif $slaves[$i].father > 0 && $slaves[$i].mother != $slaves[$i].father>> - <<set _spy = $slaveIndices[$slaves[$i].father]>> - <<if (def _spy) && ($slaves[_spy].assignment == "please you" || $slaves[_spy].assignment == "serve in the master suite" || $slaves[_spy].assignment == "be your Concubine")>> - Since you are also keeping $his father as a sexual servant, you often use them together, which leaves quite a public impression. - <</if>> - <</if>> - - <<if $slaves[$i].mother == -1>> - Keeping your own $daughter as a sexual servant leaves quite a public impression. - <<elseif $slaves[$i].mother > 0>> - <<set _spy = $slaveIndices[$slaves[$i].mother]>> - <<if (def _spy) && ($slaves[_spy].assignment == "please you" || $slaves[_spy].assignment == "serve in the master suite" || $slaves[_spy].assignment == "be your Concubine")>> - Since you are also keeping $his mother as a sexual servant, you often use them together, which leaves quite a public impression. - <</if>> - <</if>> - - <<set _children = $slaves.filter(function(s) { return (s.father == $slaves[$i].ID || s.mother == $slaves[$i].ID) && (s.assignment == "please you" || s.assignment == "serve in the master suite" || s.assignment == "be your Concubine"); })>> - <<if _children.length > 2>> - Since you are also keeping $his daughters, - <<for _spy = 0; _spy < _children.length; _spy++>> - <<if _spy < _children.length-1>> - _children[_spy].slaveName, - <<else>> - and _children[_spy].slaveName, - <</if>> - <</for>> - as sexual servants, you often enjoy them all at once, which leaves quite a public impression. - <<elseif _children.length > 1>> - Since you are also keeping $his daughters, _children[0].slaveName and _children[1].slaveName, as sexual servants, you often use them together, leaving quite a public impression. - <<elseif _children.length > 0>> - <<setLocalPronouns _children[0] 2>> - Since you are also keeping $his _daughter2 as a sexual servant, you often use them together, which leaves quite a public impression. - <</if>> - - <<set _children = $slaves.filter(function(s) { return (areSisters($slaves[$i], s) > 0) && (s.assignment == "please you" || s.assignment == "serve in the master suite" || s.assignment == "be your Concubine"); })>> - <<if _children.length > 2>> - Since you are also keeping $his sisters, - <<for _spy = 0; _spy < _children.length; _spy++>> - <<if _spy < _children.length-1>> - _children[_spy].slaveName, - <<else>> - and _children[_spy].slaveName, - <</if>> - <</for>> - as sexual servants, you often enjoy them all at once, which leaves quite a public impression. - <<elseif _children.length > 1>> - Since you are also keeping $his sisters, _children[0].slaveName and _children[1].slaveName, as sexual servants, you often use them together, leaving quite a public impression. - <<elseif _children.length > 0>> - <<setLocalPronouns _children[0] 2>> - Since you are also keeping $his _sister2 as a sexual servant, you often use them together, which leaves quite a public impression. - <</if>> - -<<else>> - <<if ($slaves[$i].relation != 0)>> - <<set _spy = $slaveIndices[$slaves[$i].relationTarget]>> - <<if (def _spy) && ($slaves[_spy].assignment == "please you" || $slaves[_spy].assignment == "serve in the master suite" || $slaves[_spy].assignment == "be your Concubine")>> - Since you are also keeping $his $slaves[_spy].relation as a sexual servant, you often use them together, which leaves quite a public impression. - <</if>> - <</if>> -<</if>> - -<<set _multiplier = 0.1>> -<<if $slaves[$i].relationship == -2>> - <<set _multiplier += 0.04>> -<<elseif $slaves[$i].relationship == -3 && $slaves[$i].devotion > 50>> - <<set _multiplier += 0.06>> -<</if>> -<<if $arcologies[0].FSRestart > 50 && $slaves[$i].breedingMark == 1 && $propOutcome == 1>> - <<set _multiplier += 0.04>> -<</if>> -<<if $arcologies[0].FSRepopulationFocus > 50 && $slaves[$i].bellyPreg >= 5000>> - <<set _multiplier += 0.02>> -<</if>> -<<if $slaves[$i].prestige > 0>> - <<set _multiplier += 0.03*$slaves[$i].prestige>> -<</if>> -<<if ($slaves[$i].ID == $Concubine.ID)>> - <<set _multiplier += 0.05>> -<<elseif ($slaves[$i].ID == $HeadGirl.ID) && ($arcologies[0].FSEgyptianRevivalistLaw == 1)>> - <<set _multiplier += 0.05>> -<</if>> -<<if $slaves[$i].porn.prestige > 2>> - <<set _multiplier += 0.1>> -<<elseif $slaves[$i].porn.prestige > 1>> - <<set _multiplier += 0.03>> -<</if>> - -<<run repX(Math.trunc(( Beauty($slaves[$i]) * FResult($slaves[$i]) ) * _multiplier/4), "fucktoy", $slaves[$i])>> - -Keeping $him as nothing but your personal -<<if ($slaves[$i].toyHole == "pussy")>> - pussy toy -<<elseif ($slaves[$i].toyHole == "ass")>> - anal toy -<<elseif ($slaves[$i].toyHole == "mouth")>> - oral toy -<<elseif ($slaves[$i].devotion <= 20)>> - rapebait -<<else>> - fucktoy -<</if>> -<<if ($slaves[$i].prestige > 0)>> - @@.green;adds considerably to your reputation,@@ since $he's prestigious. -<<else>> - @@.green;adds slightly to your reputation@@ as a prosperous citizen. -<</if>> - -<<if $slaves[$i].porn.prestige > 2>> - Having your every urge attended to by a famous porn star @@.green;is not lost on the citizenry.@@ -<<elseif $slaves[$i].porn.prestige > 1>> - Having a rising porn star to sate your urges with @@.green;demonstrates how well off you are.@@ -<</if>> - -<<if $slaves[$i].fuckdoll == 0>> - <<if $slaves[$i].relationship == -2>> - $His satisfaction with $his place near you is obvious, @@.green;bringing attention@@ to how completely you've broken $him. - <<elseif $slaves[$i].relationship == -3 && $slaves[$i].devotion > 50>> - $His satisfaction with $his <<= $wife>>ly duties is obvious, @@.green;bringing attention@@ to the slave future you're building. - <</if>> - <<if $arcologies[0].FSRestart > 50 && $slaves[$i].breedingMark == 1 && $propOutcome == 1>> - $His breeding mark and $his place near you as a breeding toy is obvious, @@.green;bringing attention@@ to how beautiful a pairing you make. - <</if>> - <<if $arcologies[0].FSRepopulationFocus > 50 && $slaves[$i].bellyPreg >= 5000>> - $His advanced pregnancy and role as your gravid breeder is obvious, @@.green;bringing attention@@ to a woman's ideal role in $arcologies[0].name. - <</if>> - <<if ($slaves[$i].behavioralQuirk == "confident")>> - $slaves[$i].slaveName @@.mediumaquamarine;confidently enjoys@@ the prestige within the slave hierarchy that comes with being your fucktoy. - <<set $slaves[$i].trust += 1>> - <<elseif ($slaves[$i].behavioralQuirk == "insecure")>> - $slaves[$i].slaveName @@.mediumaquamarine;constantly reassures $himself@@ that $he must be pretty, since you keep $him as a fucktoy. - <<set $slaves[$i].trust += 1>> - <</if>> - <<if ($slaves[$i].behavioralQuirk == "adores men")>> - <<if ($PC.dick != 0)>> - $slaves[$i].slaveName @@.hotpink;adores your company,@@ and is happy to spend time with you, even when you don't have your cock in $him. - <<set $slaves[$i].devotion += 1>> - <</if>> - <<elseif ($slaves[$i].behavioralQuirk == "adores women")>> - <<if ($PC.vagina != -1)>> - $slaves[$i].slaveName @@.hotpink;adores your company,@@ and is happy to spend time with you, even when you aren't fucking. - <<set $slaves[$i].devotion += 1>> - <</if>> - <<elseif ($slaves[$i].sexualQuirk == "romantic")>> - $slaves[$i].slaveName knows being part of your harem is the best romance $he can realistically expect, and does $his best to @@.mediumaquamarine;be content@@ with it. - <<set $slaves[$i].trust += 1>> - <</if>> - <<if $slaves[$i].fetish != "mindbroken">> - <<if $slaves[$i].fetish == "pregnancy" && ($PC.preg >= 20 || ($PC.preg >= 16 && $PC.career == "escort"))>> - $slaves[$i].slaveName @@.hotpink;enjoys being so close to $his gravid <<= WrittenMaster($slaves[$i])>>.@@ - <<set $slaves[$i].devotion += 1>> - <<if $slaves[$i].fetishKnown == 0>> - $He enjoys being tasked with servicing a pregnant _womanP far more than a normal slave would; @@.lightcoral;$he's harboring a pregnancy fetish!@@ - <<set $slaves[$i].fetishKnown = 1>> - <<elseif $slaves[$i].fetishStrength < 95>> - Being tasked with servicing a lusty pregnant _womanP @@.lightcoral;strengthens $his pregnancy fetish.@@ - <<set $slaves[$i].fetishStrength += 4>> - <</if>> - <<elseif _fetishChangeChance > random(0,100) && ($PC.preg >= 20 || ($PC.preg >= 16 && $PC.career == "escort"))>> - At first $he found the prospect of being used by $his increasingly pregnant <<= WrittenMaster($slaves[$i])>> a turn off, but being so close to your gravid form serves to be more erotic than $he anticipated. Soon $he finds $himself aroused less from the prospect of sex and more @@.lightcoral;the chance to be near your child laden belly.@@ - <<set $slaves[$i].fetish = "pregnancy", $slaves[$i].fetishKnown = 1, $slaves[$i].fetishStrength = 10>> - <</if>> - <</if>> -<</if>> diff --git a/src/uncategorized/saRelationships.tw b/src/uncategorized/saRelationships.tw index 7fb9358df1a09708627f5b587630fd5d89d99edf..ac9c3018dad90f06de39f5c045d373eb9b379cae 100644 --- a/src/uncategorized/saRelationships.tw +++ b/src/uncategorized/saRelationships.tw @@ -905,7 +905,7 @@ <<set _SlaveI.trust++>> <</if>> <<if _SlaveI.relationship < 5 && (jsRandom(0, 100) > 90)>> - Having been chaste for some time, _SlaveI.slaveName and _SlaveJ.slaveName find themselves less passionate about each other, and have gone back to being just @@.lightgreen;friends.@@ They both @@.mediumorchid;regret@@ the loss of intimacy. + Having been chaste for some time, _SlaveI.slaveName and _SlaveJ.slaveName find themselves less passionate about each other, and have gone back to being just @@.lightgreen;friends.@@ They both @@.mediumorchid;regret@@ the loss of intimacy. <<set _SlaveI.relationship = 1, _SlaveJ.relationship = 1, _SlaveI.devotion--, _SlaveJ.devotion-->> <</if>> <</if>> diff --git a/src/uncategorized/saRules.tw b/src/uncategorized/saRules.tw index 0f89b59cb3e5d96bd17efa56b7d295a3c6d8687e..e97817e4c5281e31b066819d4ad4e7e813839fd1 100644 --- a/src/uncategorized/saRules.tw +++ b/src/uncategorized/saRules.tw @@ -5750,6 +5750,54 @@ <</if>> <</if>> + /* rules rest block only applies to certain jobs for now - may consider dropping the condition during finalization */ + <<if ["work a glory hole"].includes($slaves[$i].assignment)>> + <<if $slaves[$i].rules.rest == "mandatory">> + <<if ($slaves[$i].devotion <= 20)>> + Getting a day off each week @@.mediumaquamarine;builds feelings of liberty@@ a slave shouldn't have. + <<set $slaves[$i].trust += 3>> + <<else>> + $He appreciates having a weekly day off and takes it as a sign that $he has a @@.mediumaquamarine;caring <<= WrittenMaster()>>.@@ + <<set $slaves[$i].trust += 1>> + <</if>> + <<elseif $slaveUsedRest>> + <<if $slaves[$i].rules.rest == "permissive">> + <<if ($slaves[$i].devotion <= 20)>> + $He's permitted to rest whenever $he feels even the slightest bit tired; @@.mediumaquamarine;a privilege not lost on $him.@@ + <<set $slaves[$i].trust += 2>> + <<else>> + $He @@.hotpink;likes@@ that you @@.mediumaquamarine;care enough@@ to let him rest when he gets tired. + <<set $slaves[$i].devotion += 1>> + <<set $slaves[$i].trust += 1>> + <</if>> + <<elseif $slaves[$i].rules.rest == "restrictive">> + <<if ($slaves[$i].devotion <= -20)>> + $He's permitted to rest when fatigue sets in, but not enough to shake $his tiredness; $he feels this @@.gold;deprivation@@ is intentional. + <<set $slaves[$i].trust -= 1>> + <<elseif ($slaves[$i].devotion <= 20)>> + $He's permitted to rest when fatigue sets in, and @@.hotpink;understands@@ this is less for $his wellbeing and more to prevent $him from become unproductive. + <<set $slaves[$i].devotion += 1>> + <<else>> + $He's permitted to rest when fatigue sets in and is @@.mediumaquamarine;thankful@@ you would allow $him the privilege so that $he may serve you better. + <<set $slaves[$i].trust += 1>> + <</if>> + <<elseif $slaves[$i].rules.rest == "cruel">> + <<if ($slaves[$i].devotion <= -20)>> + $He's @@.gold;terrified@@ that the only reason $he is given any time to rest at all is just to prolong your torment of $him. + <<set $slaves[$i].trust -= 3>> + <<elseif ($slaves[$i].devotion <= 20)>> + You work $him to the bone and only allow $him rest when on the verge of collapsing. $He @@.gold;fears@@ this @@.mediumorchid;cruelty@@ is just the beginning. + <<set $slaves[$i].trust -= 3>> + <<set $slaves[$i].devotion -= 3>> + <<else>> + Only being allowed rest when on the verge of collapsing @@.mediumorchid;shakes $his faith@@ in you a little. + <<set $slaves[$i].devotion -= 2>> + <</if>> + <</if>> + <<unset $slaveUsedRest>> + <</if>> + <</if>> + <<if ($universalRulesConsent == 0)>> <<if ($slaves[$i].devotion <= 20)>> <<if ($slaves[$i].trust > -10)>> diff --git a/src/uncategorized/salon.tw b/src/uncategorized/salon.tw index 287194ee5d0ceca9d3822b786d41f73767fee914..92dcfa97080d1a07eefb0a22fb95447d0f4a9ed2 100644 --- a/src/uncategorized/salon.tw +++ b/src/uncategorized/salon.tw @@ -1,24 +1,28 @@ :: Salon [nobr] -<<set $nextButton = "Confirm changes", $nextLink = "AS Dump", $returnTo = "Slave Interact">> +<<set $nextButton = "Confirm changes", $nextLink = "Slave Interact">> +<<set $AS = $activeSlave.ID>> +<<run App.Utils.setLocalPronouns(getSlave($AS))>> <<set $showEncyclopedia = 1>><<set $encyclopedia = "The Auto Salon">> <<if $showInches == 2>> - <<set _oldHLength = Math.round($activeSlave.hLength/2.54), _newHLength = 0>> + <<set _oldHLength = Math.round(getSlave($AS).hLength/2.54), _newHLength = 0>> <<else>> - <<set _oldHLength = $activeSlave.hLength, _newHLength = 0>> + <<set _oldHLength = getSlave($AS).hLength, _newHLength = 0>> <</if>> <h1>The Auto Salon</h1> -<span class="note">$activeSlave.slaveName is seated in the auto salon. $He is awaiting your artistic pleasure.</span> +<span class="note"> + <<= getSlave($AS).slaveName>> is seated in the auto salon. $He is awaiting your artistic pleasure. +</span> /* 000-250-006 */ <<if $seeImages == 1>> <<if $imageChoice == 1>> - <div class="imageRef lrgVector"><div class="mask"> </div><<= SlaveArt($activeSlave, 3, 0)>></div> + <div class="imageRef lrgVector"><div class="mask"> </div><<= SlaveArt(getSlave($AS), 3, 0)>></div> <<else>> - <div class="imageRef lrgRender"><div class="mask"> </div><<= SlaveArt($activeSlave, 3, 0)>></div> + <div class="imageRef lrgRender"><div class="mask"> </div><<= SlaveArt(getSlave($AS), 3, 0)>></div> <</if>> <</if>> /* 000-250-006 */ @@ -26,84 +30,84 @@ /* EYES */ <h3>Eyewear</h3> -<<if getBestVision($activeSlave) === 0>> +<<if getBestVision(getSlave($AS)) === 0>> $He is blind, and - <<if $activeSlave.eyewear == "none">> + <<if getSlave($AS).eyewear == "none">> has no eyewear. <<else>> - is wearing $activeSlave.eyewear. [[Remove|Salon][$activeSlave.eyewear = "none"]] + is wearing <<= getSlave($AS).eyewear>>. [[Remove|Salon][getSlave($AS).eyewear = "none"]] <</if>> <div class="choices"> - Give $him: [[Cosmetic glasses|Salon][$activeSlave.eyewear = "glasses",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + Give $him: [[Cosmetic glasses|Salon][getSlave($AS).eyewear = "glasses",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> -<<elseif anyVisionEquals($activeSlave, 1)>> +<<elseif anyVisionEquals(getSlave($AS), 1)>> $He is nearsighted, and $he - <<if $activeSlave.eyewear == "none">> + <<if getSlave($AS).eyewear == "none">> has no eyewear. <<else>> - is wearing $activeSlave.eyewear. [[Remove|Salon][$activeSlave.eyewear = "none"]] + is wearing <<= getSlave($AS).eyewear>>. [[Remove|Salon][getSlave($AS).eyewear = "none"]] <</if>> <div class="choices"> - Give $him: [[Cosmetic glasses|Salon][$activeSlave.eyewear = "glasses",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Corrective glasses|Salon][$activeSlave.eyewear = "corrective glasses",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Corrective contacts|Salon][$activeSlave.eyewear = "corrective contacts",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + Give $him: [[Cosmetic glasses|Salon][getSlave($AS).eyewear = "glasses",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Corrective glasses|Salon][getSlave($AS).eyewear = "corrective glasses",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Corrective contacts|Salon][getSlave($AS).eyewear = "corrective contacts",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <span class="note">Nearsightedness will impede performance on some assignments.</span> </div> <<else>> $His vision is normal, and $he - <<if $activeSlave.eyewear == "none">> + <<if getSlave($AS).eyewear == "none">> has no eyewear. <<else>> - is wearing $activeSlave.eyewear. [[Remove|Salon][$activeSlave.eyewear = "none"]] + is wearing <<= getSlave($AS).eyewear>>. [[Remove|Salon][getSlave($AS).eyewear = "none"]] <</if>> <div class="choices"> - Give $him: [[Cosmetic glasses|Salon][$activeSlave.eyewear = "glasses",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blurring glasses|Salon][$activeSlave.eyewear = "blurring glasses",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blurring contacts|Salon][$activeSlave.eyewear = "blurring contacts",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + Give $him: [[Cosmetic glasses|Salon][getSlave($AS).eyewear = "glasses",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blurring glasses|Salon][getSlave($AS).eyewear = "blurring glasses",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blurring contacts|Salon][getSlave($AS).eyewear = "blurring contacts",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <span class="note">Blurring options are annoying and impede performance on some assignments.</span> </div> <</if>> <div> Custom glass eyes and cosmetic lenses: - $He has <<print App.Desc.eyesType($activeSlave)>><<if hasAnyEyes($activeSlave)>>, they are <<print App.Desc.eyeColor($activeSlave)>><</if>>. - + $He has <<print App.Desc.eyesType(getSlave($AS))>><<if hasAnyEyes(getSlave($AS))>>, they are <<print App.Desc.eyeColor(getSlave($AS))>><</if>>. + <div class="choices"> /* remove lenses */ <<set _n = 0>> - <<if hasLeftEye($activeSlave) && getLeftEyeColor($activeSlave) !== getGeneticEyeColor($activeSlave, "left")>> + <<if hasLeftEye(getSlave($AS)) && getLeftEyeColor(getSlave($AS)) !== getGeneticEyeColor(getSlave($AS), "left")>> <<set _n++>> - [[Remove left lens|Salon][resetEyeColor($activeSlave, "left")]] + [[Remove left lens|Salon][resetEyeColor(getSlave($AS), "left")]] <</if>> - <<if hasRightEye($activeSlave) && getRightEyeColor($activeSlave) !== getGeneticEyeColor($activeSlave, "right")>> + <<if hasRightEye(getSlave($AS)) && getRightEyeColor(getSlave($AS)) !== getGeneticEyeColor(getSlave($AS), "right")>> <<set _n++>> <<if _n > 0>>|<</if>> - [[Remove right lens|Salon][resetEyeColor($activeSlave, "right")]] + [[Remove right lens|Salon][resetEyeColor(getSlave($AS), "right")]] <</if>> <<if _n === 2>> - | [[Remove both lenses|Salon][resetEyeColor($activeSlave, "both")]] + | [[Remove both lenses|Salon][resetEyeColor(getSlave($AS), "both")]] <</if>> /* remove glass eyes */ <<set _n = 0>> - <<if getLeftEyeType($activeSlave) === 2>> + <<if getLeftEyeType(getSlave($AS)) === 2>> <<set _n++>> - [[Remove left glass eye|Salon][eyeSurgery($activeSlave, "left", "remove")]] + [[Remove left glass eye|Salon][eyeSurgery(getSlave($AS), "left", "remove")]] <</if>> - <<if getRightEyeType($activeSlave) === 2>> + <<if getRightEyeType(getSlave($AS)) === 2>> <<set _n++>> <<if _n > 0>>|<</if>> - [[Remove right glass eye|Salon][eyeSurgery($activeSlave, "right", "remove")]] + [[Remove right glass eye|Salon][eyeSurgery(getSlave($AS), "right", "remove")]] <</if>> <<if _n === 2>> - | [[Remove both glass eyes|Salon][eyeSurgery($activeSlave, "both", "remove")]] + | [[Remove both glass eyes|Salon][eyeSurgery(getSlave($AS), "both", "remove")]] <</if>> </div> </div> <div> - <<if hasBothEyes($activeSlave)>> + <<if hasBothEyes(getSlave($AS))>> Change what $his eyes look like: - <<elseif hasAnyEyes($activeSlave)>> + <<elseif hasAnyEyes(getSlave($AS))>> Change what $his eye looks like or give $him a new glass eye: <<else>> Choose what kind of glass eyes you want $him to have: @@ -175,16 +179,16 @@ <<if $artificialEyeSide != "" && $artificialEyeColor != "">> <<link "Give" "Salon">> /* make sure the eye(s) exists: give glass eye if there is none */ - <<if ($artificialEyeSide === "left" || $artificialEyeSide === "both") && getLeftEyeType($activeSlave) === 0>> - <<run eyeSurgery($activeSlave, "left", "glass")>> + <<if ($artificialEyeSide === "left" || $artificialEyeSide === "both") && getLeftEyeType(getSlave($AS)) === 0>> + <<run eyeSurgery(getSlave($AS), "left", "glass")>> <</if>> - <<if ($artificialEyeSide === "right" || $artificialEyeSide === "both") && getRightEyeType($activeSlave) === 0>> - <<run eyeSurgery($activeSlave, "right", "glass")>> + <<if ($artificialEyeSide === "right" || $artificialEyeSide === "both") && getRightEyeType(getSlave($AS)) === 0>> + <<run eyeSurgery(getSlave($AS), "right", "glass")>> <</if>> /* apply modifications */ - <<run setEyeColorFull($activeSlave, $artificialEyeColor, $artificialEyeShape, $artificialEyeFill, $artificialEyeSide)>> - <<run cashX(forceNeg($modCost), "slaveMod", $activeSlave)>> + <<run setEyeColorFull(getSlave($AS), $artificialEyeColor, $artificialEyeShape, $artificialEyeFill, $artificialEyeSide)>> + <<run cashX(forceNeg($modCost), "slaveMod", getSlave($AS))>> /* reset variables */ <<set $artificialEyeSide = "", $artificialEyeColor = "", $artificialEyeShape = "", $artificialEyeFill = "">> @@ -192,8 +196,8 @@ /* make the following easier to read */ <<set _both = $artificialEyeSide === "both", - _leftGlass = !hasLeftEye($activeSlave) || getLeftEyeType($activeSlave) === 2, - _rightGlass = !hasRightEye($activeSlave) || getRightEyeType($activeSlave) === 2>> + _leftGlass = !hasLeftEye(getSlave($AS)) || getLeftEyeType(getSlave($AS)) === 2, + _rightGlass = !hasRightEye(getSlave($AS)) || getRightEyeType(getSlave($AS)) === 2>> $him $artificialEyeColor <<if _both>> @@ -230,11 +234,11 @@ /* EARS */ <h3>Ears</h3> <div> - <<if $activeSlave.earT != "none" && $activeSlave.earTColor != "hairless">> - $His fluffy ears are $activeSlave.earTColor. + <<if getSlave($AS).earT != "none" && getSlave($AS).earTColor != "hairless">> + $His fluffy ears are <<= getSlave($AS).earTColor>>. <div class="choices"> - <<if $activeSlave.earTColor != $activeSlave.hColor>> - [[Match current hair|Salon][$activeSlave.earTColor = $activeSlave.hColor]] or <span class="note">choose a new one:</span> + <<if getSlave($AS).earTColor != getSlave($AS).hColor>> + [[Match current hair|Salon][getSlave($AS).earTColor = getSlave($AS).hColor]] or <span class="note">choose a new one:</span> <<else>> <span class="note">Choose a dye color before dyeing $his ears:</span> <</if>> @@ -293,83 +297,83 @@ <<if $primaryEarColor != 0>> <div class="choices"> - [["Dye " + $his + " ears"|Salon][$activeSlave.earTColor = ($primaryEarColor + $secondaryEarColor),cashX(forceNeg($modCost), "slaveMod", $activeSlave), $primaryEarColor = 0, $secondaryEarColor = ""]] $primaryEarColor $secondaryEarColor now? + [["Dye " + $his + " ears"|Salon][getSlave($AS).earTColor = ($primaryEarColor + $secondaryEarColor),cashX(forceNeg($modCost), "slaveMod", getSlave($AS)), $primaryEarColor = 0, $secondaryEarColor = ""]] $primaryEarColor $secondaryEarColor now? </div> <</if>> <</if>> </div> <div> - <<if $activeSlave.earImplant == 1>> + <<if getSlave($AS).earImplant == 1>> $He has artificial inner ear implants, - <<if $activeSlave.earwear == "none">> + <<if getSlave($AS).earwear == "none">> which are unobstructed. <<else>> - and is wearing $activeSlave.earwear. [[Remove|Salon][$activeSlave.earwear = "none"]] + and is wearing <<= getSlave($AS).earwear>>. [[Remove|Salon][getSlave($AS).earwear = "none"]] <</if>> - <<elseif $activeSlave.hears < -1>> + <<elseif getSlave($AS).hears < -1>> $He is deaf, and - <<if $activeSlave.earwear == "none">> + <<if getSlave($AS).earwear == "none">> is wearing nothing on $his ears. <<else>> - is wearing $activeSlave.earwear. [[Remove|Salon][$activeSlave.earwear = "none"]] + is wearing <<= getSlave($AS).earwear>>. [[Remove|Salon][getSlave($AS).earwear = "none"]] <</if>> - <<elseif $activeSlave.hears > -1>> + <<elseif getSlave($AS).hears > -1>> $His hearing is normal, and $he - <<if $activeSlave.earwear == "none">> + <<if getSlave($AS).earwear == "none">> has nothing in $his ears. <<else>> - is wearing $activeSlave.earwear. [[Remove|Salon][$activeSlave.earwear = "none"]] + is wearing <<= getSlave($AS).earwear>>. [[Remove|Salon][getSlave($AS).earwear = "none"]] <</if>> <<else>> $He is hearing impaired, and - <<if $activeSlave.earwear == "none">> + <<if getSlave($AS).earwear == "none">> wears nothing to correct or worsen this. <<else>> - is wearing $activeSlave.earwear. [[Remove|Salon][$activeSlave.earwear = "none"]] + is wearing <<= getSlave($AS).earwear>>. [[Remove|Salon][getSlave($AS).earwear = "none"]] <</if>> <</if>> <div class="choices"> Give $him: - [[Hearing aids|Salon][$activeSlave.earwear = "hearing aids",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Muffling ear plugs|Salon][$activeSlave.earwear = "muffling ear plugs",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Deafening ear plugs|Salon][$activeSlave.earwear = "deafening ear plugs",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Hearing aids|Salon][getSlave($AS).earwear = "hearing aids",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Muffling ear plugs|Salon][getSlave($AS).earwear = "muffling ear plugs",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Deafening ear plugs|Salon][getSlave($AS).earwear = "deafening ear plugs",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <span class="note">Muffling options are annoying and impede performance on some assignments.</span> </div> </div> /*End ear check */ <div> - <<if $activeSlave.horn != "none">> - $His $activeSlave.horn are $activeSlave.hornColor + <<if getSlave($AS).horn != "none">> + $His <<= getSlave($AS).horn>> are <<= getSlave($AS).hornColor>> <div class="choices"> Set horn color: - [[Black|Salon][$activeSlave.hornColor = "black",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blazing Red|Salon][$activeSlave.hornColor = "blazing red",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blue-Violet|Salon][$activeSlave.hornColor = "blue-violet",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blue|Salon][$activeSlave.hornColor = "blue",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Brown|Salon][$activeSlave.hornColor = "brown",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Burgundy|Salon][$activeSlave.hornColor = "burgundy",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Copper|Salon][$activeSlave.hornColor = "copper",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Dark Blue|Salon][$activeSlave.hornColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Dark Brown|Salon][$activeSlave.hornColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Dark Orchid|Salon][$activeSlave.hornColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Deep Red|Salon][$activeSlave.hornColor = "deep red",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Golden|Salon][$activeSlave.hornColor = "golden",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Green-yellow|Salon][$activeSlave.hornColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Green|Salon][$activeSlave.hornColor = "green",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Grey|Salon][$activeSlave.hornColor = "grey",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Jet Black|Salon][$activeSlave.hornColor = "jet black",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neon Blue|Salon][$activeSlave.hornColor = "neon blue",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neon Green|Salon][$activeSlave.hornColor = "neon green",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neon Pink|Salon][$activeSlave.hornColor = "neon pink",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Pink|Salon][$activeSlave.hornColor = "pink",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Ivory|Salon][$activeSlave.hornColor = "ivory",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Purple|Salon][$activeSlave.hornColor = "purple",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Red|Salon][$activeSlave.hornColor = "red",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Sea Green|Salon][$activeSlave.hornColor = "sea green",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Silver|Salon][$activeSlave.hornColor = "silver",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[White|Salon][$activeSlave.hornColor = "white",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Black|Salon][getSlave($AS).hornColor = "black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blazing Red|Salon][getSlave($AS).hornColor = "blazing red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blue-Violet|Salon][getSlave($AS).hornColor = "blue-violet",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blue|Salon][getSlave($AS).hornColor = "blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Brown|Salon][getSlave($AS).hornColor = "brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Burgundy|Salon][getSlave($AS).hornColor = "burgundy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Copper|Salon][getSlave($AS).hornColor = "copper",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Dark Blue|Salon][getSlave($AS).hornColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Dark Brown|Salon][getSlave($AS).hornColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Dark Orchid|Salon][getSlave($AS).hornColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Deep Red|Salon][getSlave($AS).hornColor = "deep red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Golden|Salon][getSlave($AS).hornColor = "golden",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Green-yellow|Salon][getSlave($AS).hornColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Green|Salon][getSlave($AS).hornColor = "green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Grey|Salon][getSlave($AS).hornColor = "grey",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Jet Black|Salon][getSlave($AS).hornColor = "jet black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neon Blue|Salon][getSlave($AS).hornColor = "neon blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neon Green|Salon][getSlave($AS).hornColor = "neon green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neon Pink|Salon][getSlave($AS).hornColor = "neon pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Pink|Salon][getSlave($AS).hornColor = "pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Ivory|Salon][getSlave($AS).hornColor = "ivory",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Purple|Salon][getSlave($AS).hornColor = "purple",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Red|Salon][getSlave($AS).hornColor = "red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Sea Green|Salon][getSlave($AS).hornColor = "sea green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Silver|Salon][getSlave($AS).hornColor = "silver",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[White|Salon][getSlave($AS).hornColor = "white",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> <</if>> </div> @@ -378,10 +382,10 @@ <h3>Hair</h3> <div> - <<if $activeSlave.bald != 1>> - $His hair is $activeSlave.hColor. - <<if $activeSlave.origHColor != $activeSlave.hColor>> - [[Restore natural color|Salon][$activeSlave.hColor = $activeSlave.origHColor]] or <span class="note">choose a new one:</span> + <<if getSlave($AS).bald != 1>> + $His hair is <<= getSlave($AS).hColor>>. + <<if getSlave($AS).origHColor != getSlave($AS).hColor>> + [[Restore natural color|Salon][getSlave($AS).hColor = getSlave($AS).origHColor]] or <span class="note">choose a new one:</span> <<else>> <span class="note">Choose a dye color before dyeing $his hair:</span> <</if>> @@ -439,97 +443,97 @@ <<if $primaryHairColor != 0>> <div class="choices"> - [["Dye " + $his + " hair"|Salon][$activeSlave.hColor = ($primaryHairColor + $secondaryHairColor),cashX(forceNeg($modCost), "slaveMod", $activeSlave), $primaryHairColor = 0, $secondaryHairColor = ""]] $primaryHairColor $secondaryHairColor now? + [["Dye " + $his + " hair"|Salon][getSlave($AS).hColor = ($primaryHairColor + $secondaryHairColor),cashX(forceNeg($modCost), "slaveMod", getSlave($AS)), $primaryHairColor = 0, $secondaryHairColor = ""]] $primaryHairColor $secondaryHairColor now? </div> <</if>> <div> - <<if $activeSlave.hStyle !== "shaved">> - $His $activeSlave.hStyle hair is <<= lengthToEitherUnit($activeSlave.hLength)>> long. + <<if getSlave($AS).hStyle !== "shaved">> + $His <<= getSlave($AS).hStyle>> hair is <<= lengthToEitherUnit(getSlave($AS).hLength)>> long. <<else>> $His hair is shaved smooth. <</if>> <span class="note">General hairstyles will conform to hair length and clothing choices.</span> </div> <div class="choices"> - <<if $activeSlave.hLength > 1>> + <<if getSlave($AS).hLength > 1>> Style $his hair: - [[Afro|Salon][$activeSlave.hStyle = "afro",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Braided|Salon][$activeSlave.hStyle = "braided",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Cornrows|Salon][$activeSlave.hStyle = "cornrows",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Curled|Salon][$activeSlave.hStyle = "curled",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Dreadlocks|Salon][$activeSlave.hStyle = "dreadlocks",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Eary|Salon][$activeSlave.hStyle = "eary",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[In a bun|Salon][$activeSlave.hStyle = "bun",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[In a messy bun|Salon][$activeSlave.hStyle = "messy bun",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[In a ponytail|Salon][$activeSlave.hStyle = "ponytail",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[In tails|Salon][$activeSlave.hStyle = "tails",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Luxurious|Salon][$activeSlave.hStyle = "luxurious",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Messy|Salon][$activeSlave.hStyle = "messy",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neat|Salon][$activeSlave.hStyle = "neat",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Permed|Salon][$activeSlave.hStyle = "permed",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Shaved sides|Salon][$activeSlave.hStyle = "strip",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Up|Salon][$activeSlave.hStyle = "up",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Afro|Salon][getSlave($AS).hStyle = "afro",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Braided|Salon][getSlave($AS).hStyle = "braided",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Cornrows|Salon][getSlave($AS).hStyle = "cornrows",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Curled|Salon][getSlave($AS).hStyle = "curled",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Dreadlocks|Salon][getSlave($AS).hStyle = "dreadlocks",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Eary|Salon][getSlave($AS).hStyle = "eary",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[In a bun|Salon][getSlave($AS).hStyle = "bun",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[In a messy bun|Salon][getSlave($AS).hStyle = "messy bun",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[In a ponytail|Salon][getSlave($AS).hStyle = "ponytail",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[In tails|Salon][getSlave($AS).hStyle = "tails",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Luxurious|Salon][getSlave($AS).hStyle = "luxurious",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Messy|Salon][getSlave($AS).hStyle = "messy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neat|Salon][getSlave($AS).hStyle = "neat",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Permed|Salon][getSlave($AS).hStyle = "permed",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Shaved sides|Salon][getSlave($AS).hStyle = "strip",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Up|Salon][getSlave($AS).hStyle = "up",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <<else>> <span class="note">$His hair is too short to style meaningfully</span> <</if>> </div> <div class="choices"> - <<if $activeSlave.hLength > 1>> + <<if getSlave($AS).hLength > 1>> Cut and style $his hair: - [[Shaved|Salon][$activeSlave.hStyle = "shaved",$activeSlave.hLength = 0,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Trimmed short|Salon][$activeSlave.hStyle = "trimmed",$activeSlave.hLength = 10,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Buzzcut|Salon][$activeSlave.hStyle = "buzzcut",$activeSlave.hLength = 1,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Shaved|Salon][getSlave($AS).hStyle = "shaved",getSlave($AS).hLength = 0,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Trimmed short|Salon][getSlave($AS).hStyle = "trimmed",getSlave($AS).hLength = 10,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Buzzcut|Salon][getSlave($AS).hStyle = "buzzcut",getSlave($AS).hLength = 1,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> </div> <div class="choices"> Cut or lengthen $his hair: - <<if $activeSlave.hLength > 5>> - [[Very short|Salon][$activeSlave.hLength = 5,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + <<if getSlave($AS).hLength > 5>> + [[Very short|Salon][getSlave($AS).hLength = 5,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> - <<if $activeSlave.hLength > 10>> - | [[Short|Salon][$activeSlave.hLength = 10,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + <<if getSlave($AS).hLength > 10>> + | [[Short|Salon][getSlave($AS).hLength = 10,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> - <<if $activeSlave.hLength > 30>> - | [[Shoulder length|Salon][$activeSlave.hLength = 30,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + <<if getSlave($AS).hLength > 30>> + | [[Shoulder length|Salon][getSlave($AS).hLength = 30,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> - <<if $activeSlave.hLength > 60>> - | [[Long|Salon][$activeSlave.hLength = 60,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + <<if getSlave($AS).hLength > 60>> + | [[Long|Salon][getSlave($AS).hLength = 60,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> - <<if $activeSlave.hLength > 100>> - | [[Very long|Salon][$activeSlave.hLength = 100,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + <<if getSlave($AS).hLength > 100>> + | [[Very long|Salon][getSlave($AS).hLength = 100,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> - <<if $activeSlave.hLength == 1>> - | [[Apply hair growth stimulating treatment|Salon][$activeSlave.hLength = 1,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - <<elseif $activeSlave.hLength < 150>> - | [[Apply extensions|Salon][$activeSlave.hLength += 10,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + <<if getSlave($AS).hLength == 1>> + | [[Apply hair growth stimulating treatment|Salon][getSlave($AS).hLength = 1,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + <<elseif getSlave($AS).hLength < 150>> + | [[Apply extensions|Salon][getSlave($AS).hLength += 10,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> | Custom length: <<textbox "_newHLength" _oldHLength "Salon">> <<if $showInches == 1>> - cm (<<= cmToInchString($activeSlave.hLength)>>) + cm (<<= cmToInchString(getSlave($AS).hLength)>>) <<elseif $showInches == 2>> inches <</if>> - [[Apply|Salon][cashX(forceNeg($modCost), "slaveMod", $activeSlave), $activeSlave.hLength = (Number(_newHLength) || $activeSlave.hLength)]] + [[Apply|Salon][cashX(forceNeg($modCost), "slaveMod", getSlave($AS)), getSlave($AS).hLength = (Number(_newHLength) || getSlave($AS).hLength)]] </div> <div class="choices"> Have $his hair carefully maintained at its current length: - <<if $activeSlave.haircuts == 1>> - [[Cease maintenance|Salon][$activeSlave.haircuts = 0]] + <<if getSlave($AS).haircuts == 1>> + [[Cease maintenance|Salon][getSlave($AS).haircuts = 0]] <<else>> - [[Begin maintenance|Salon][$activeSlave.haircuts = 1]] + [[Begin maintenance|Salon][getSlave($AS).haircuts = 1]] <</if>> </div> <<else>> - <<if $activeSlave.hStyle == "bald">> + <<if getSlave($AS).hStyle == "bald">> $He is completely bald. <<else>> - $His current wig is $activeSlave.hColor. - <<if $activeSlave.hStyle != "bald">> - [[Remove wig|Salon][$activeSlave.hStyle = "bald",$activeSlave.hLength = 0,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] or <span class="note">choose a new one:</span> + $His current wig is <<= getSlave($AS).hColor>>. + <<if getSlave($AS).hStyle != "bald">> + [[Remove wig|Salon][getSlave($AS).hStyle = "bald",getSlave($AS).hLength = 0,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] or <span class="note">choose a new one:</span> <<else>> <span class="note">Choose a wig color:</span> <</if>> @@ -588,52 +592,52 @@ <<if $primaryHairColor != 0>> <div class="choices"> - [[Change|Salon][$activeSlave.hColor = ($primaryHairColor + $secondaryHairColor),cashX(forceNeg($modCost), "slaveMod", $activeSlave), $primaryHairColor = 0, $secondaryHairColor = ""]] $his wig color to $primaryHairColor $secondaryHairColor + [[Change|Salon][getSlave($AS).hColor = ($primaryHairColor + $secondaryHairColor),cashX(forceNeg($modCost), "slaveMod", getSlave($AS)), $primaryHairColor = 0, $secondaryHairColor = ""]] $his wig color to $primaryHairColor $secondaryHairColor </div> <</if>> <</if>> <div> - <<if $activeSlave.hStyle != "bald">> - $His $activeSlave.hStyle wig is <<= lengthToEitherUnit($activeSlave.hLength)>> long. + <<if getSlave($AS).hStyle != "bald">> + $His <<= getSlave($AS).hStyle>> wig is <<= lengthToEitherUnit(getSlave($AS).hLength)>> long. <span class="note">General hairstyles will conform to hair length and clothing choices.</span> - <<if $activeSlave.hLength == 0>><<set $activeSlave.hLength = 10>><</if>> + <<if getSlave($AS).hLength == 0>><<set getSlave($AS).hLength = 10>><</if>> <div class="choices"> Set wig length to: - <<if $activeSlave.hLength != 10>>[[lengthToEitherUnit(10)|Salon][$activeSlave.hLength = 10,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]]<</if>> - <<if $activeSlave.hLength != 30>>[[lengthToEitherUnit(30)|Salon][$activeSlave.hLength = 30,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]]<</if>> - <<if $activeSlave.hLength != 60>>[[lengthToEitherUnit(60)|Salon][$activeSlave.hLength = 60,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]]<</if>> - <<if $activeSlave.hLength != 90>>[[lengthToEitherUnit(90)|Salon][$activeSlave.hLength = 90,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]]<</if>> - <<if $activeSlave.hLength != 120>>[[lengthToEitherUnit(120)|Salon][$activeSlave.hLength = 120,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]]<</if>> - <<if $activeSlave.hLength != 150>>[[lengthToEitherUnit(150)|Salon][$activeSlave.hLength = 150,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]]<</if>> + <<if getSlave($AS).hLength != 10>>[[lengthToEitherUnit(10)|Salon][getSlave($AS).hLength = 10,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]<</if>> + <<if getSlave($AS).hLength != 30>>[[lengthToEitherUnit(30)|Salon][getSlave($AS).hLength = 30,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]<</if>> + <<if getSlave($AS).hLength != 60>>[[lengthToEitherUnit(60)|Salon][getSlave($AS).hLength = 60,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]<</if>> + <<if getSlave($AS).hLength != 90>>[[lengthToEitherUnit(90)|Salon][getSlave($AS).hLength = 90,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]<</if>> + <<if getSlave($AS).hLength != 120>>[[lengthToEitherUnit(120)|Salon][getSlave($AS).hLength = 120,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]<</if>> + <<if getSlave($AS).hLength != 150>>[[lengthToEitherUnit(150)|Salon][getSlave($AS).hLength = 150,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]<</if>> </div> <<else>> $He is not wearing a wig. <</if>> <div class="choices"> - <<if $activeSlave.hStyle != "bald">> + <<if getSlave($AS).hStyle != "bald">> Set wig style: <<else>> Give $him a wig: <</if>> - [[Afro|Salon][$activeSlave.hStyle = "afro",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Braided|Salon][$activeSlave.hStyle = "braided",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Cornrows|Salon][$activeSlave.hStyle = "cornrows",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Curled|Salon][$activeSlave.hStyle = "curled",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Dreadlocks|Salon][$activeSlave.hStyle = "dreadlocks",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Eary|Salon][$activeSlave.hStyle = "eary",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[In a bun|Salon][$activeSlave.hStyle = "bun",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[In a messy bun|Salon][$activeSlave.hStyle = "messy bun",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[In a ponytail|Salon][$activeSlave.hStyle = "ponytail",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[In tails|Salon][$activeSlave.hStyle = "tails",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Luxurious|Salon][$activeSlave.hStyle = "luxurious",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Messy|Salon][$activeSlave.hStyle = "messy",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neat|Salon][$activeSlave.hStyle = "neat",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Permed|Salon][$activeSlave.hStyle = "permed",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Shaved sides|Salon][$activeSlave.hStyle = "strip",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Up|Salon][$activeSlave.hStyle = "up",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Afro|Salon][getSlave($AS).hStyle = "afro",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Braided|Salon][getSlave($AS).hStyle = "braided",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Cornrows|Salon][getSlave($AS).hStyle = "cornrows",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Curled|Salon][getSlave($AS).hStyle = "curled",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Dreadlocks|Salon][getSlave($AS).hStyle = "dreadlocks",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Eary|Salon][getSlave($AS).hStyle = "eary",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[In a bun|Salon][getSlave($AS).hStyle = "bun",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[In a messy bun|Salon][getSlave($AS).hStyle = "messy bun",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[In a ponytail|Salon][getSlave($AS).hStyle = "ponytail",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[In tails|Salon][getSlave($AS).hStyle = "tails",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Luxurious|Salon][getSlave($AS).hStyle = "luxurious",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Messy|Salon][getSlave($AS).hStyle = "messy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neat|Salon][getSlave($AS).hStyle = "neat",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Permed|Salon][getSlave($AS).hStyle = "permed",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Shaved sides|Salon][getSlave($AS).hStyle = "strip",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Up|Salon][getSlave($AS).hStyle = "up",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> </div> <</if>> @@ -642,52 +646,52 @@ <h3>Makeup</h3> <div> - <<makeupDescription>> - <<if $activeSlave.makeup > 0>> - [[Remove|Salon][$activeSlave.makeup = 0,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + <<= App.Desc.makeup(getSlave($AS))>> + <<if getSlave($AS).makeup > 0>> + [[Remove|Salon][getSlave($AS).makeup = 0,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> <div class="choices"> Apply makeup: - [[Nice|Salon][$activeSlave.makeup = 1,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Gorgeous|Salon][$activeSlave.makeup = 2,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Slutty|Salon][$activeSlave.makeup = 4,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Color-coordinate with hair|Salon][$activeSlave.makeup = 3,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Nice|Salon][getSlave($AS).makeup = 1,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Gorgeous|Salon][getSlave($AS).makeup = 2,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Slutty|Salon][getSlave($AS).makeup = 4,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Color-coordinate with hair|Salon][getSlave($AS).makeup = 3,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> <div class="choices"> - [[Neon|Salon][$activeSlave.makeup = 5,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neon, color-coordinate with hair|Salon][$activeSlave.makeup = 6,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Neon|Salon][getSlave($AS).makeup = 5,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neon, color-coordinate with hair|Salon][getSlave($AS).makeup = 6,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> <div class="choices"> - [[Metallic|Salon][$activeSlave.makeup = 7,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Metallic, color-coordinate with hair|Salon][$activeSlave.makeup = 8,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Metallic|Salon][getSlave($AS).makeup = 7,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Metallic, color-coordinate with hair|Salon][getSlave($AS).makeup = 8,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> </div> /* NAILS */ <div> - <<nailsDescription>> + <<= App.Desc.nails(getSlave($AS))>> - <<if hasAnyArms($activeSlave)>> + <<if hasAnyArms(getSlave($AS))>> <div class="choices"> Treat nails: - [[Clip|Salon][$activeSlave.nails = 0,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Extend|Salon][$activeSlave.nails = 1,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Sharp, claw-like|Salon][$activeSlave.nails = 3,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Bright, glittery|Salon][$activeSlave.nails = 4,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Streetwalker-style|Salon][$activeSlave.nails = 5,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Color-coordinate with hair|Salon][$activeSlave.nails = 2,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Clip|Salon][getSlave($AS).nails = 0,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Extend|Salon][getSlave($AS).nails = 1,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Sharp, claw-like|Salon][getSlave($AS).nails = 3,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Bright, glittery|Salon][getSlave($AS).nails = 4,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Streetwalker-style|Salon][getSlave($AS).nails = 5,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Color-coordinate with hair|Salon][getSlave($AS).nails = 2,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> <div class="choices"> - [[Neon|Salon][$activeSlave.nails = 6,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neon, color-coordinate with hair|Salon][$activeSlave.nails = 7,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Neon|Salon][getSlave($AS).nails = 6,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neon, color-coordinate with hair|Salon][getSlave($AS).nails = 7,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> <div class="choices"> - [[Metallic|Salon][$activeSlave.nails = 8,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Metallic, color-coordinate with hair|Salon][$activeSlave.nails = 9,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Metallic|Salon][getSlave($AS).nails = 8,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Metallic, color-coordinate with hair|Salon][getSlave($AS).nails = 9,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> <</if>> </div> @@ -695,78 +699,78 @@ /* SKIN */ <h3>Skin</h3> <div> - $His skin is $activeSlave.skin. + $His skin is <<= getSlave($AS).skin>>. - <<if (setup.dyedSkins.includes($activeSlave.skin))>> - [[Remove coloring|Salon][$activeSlave.skin = $activeSlave.origSkin,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - <<elseif (($activeSlave.skin == "sun tanned") || ($activeSlave.skin == "spray tanned"))>> - [[Remove tanning|Salon][$activeSlave.skin = $activeSlave.origSkin,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + <<if (setup.dyedSkins.includes(getSlave($AS).skin))>> + [[Remove coloring|Salon][getSlave($AS).skin = getSlave($AS).origSkin,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + <<elseif ((getSlave($AS).skin == "sun tanned") || (getSlave($AS).skin == "spray tanned"))>> + [[Remove tanning|Salon][getSlave($AS).skin = getSlave($AS).origSkin,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> </div> -<<if (!setup.dyedSkins.includes($activeSlave.skin))>> +<<if (!setup.dyedSkins.includes(getSlave($AS).skin))>> <div class="choices"> - <<if ($activeSlave.skin == "sun tanned" || $activeSlave.skin == "spray tanned")>> + <<if (getSlave($AS).skin == "sun tanned" || getSlave($AS).skin == "spray tanned")>> $His skin tanning must be removed before any advanced procedure to change $his skin color. <<else>> Change skin tone: <<set _needsSpacers = 0>> - <<if (skinToneLevel($activeSlave.skin) > 1)>> + <<if (skinToneLevel(getSlave($AS).skin) > 1)>> <<if _needsSpacers == 1>> | <</if>> - [[Bleach|Salon][$activeSlave.skin = changeSkinTone($activeSlave.skin, -2), cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Bleach|Salon][getSlave($AS).skin = changeSkinTone(getSlave($AS).skin, -2), cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <<set _needsSpacers = 1>> <</if>> - <<if (skinToneLevel($activeSlave.skin) > 8)>> + <<if (skinToneLevel(getSlave($AS).skin) > 8)>> <<if _needsSpacers == 1>> | <</if>> - [[Lighten|Salon][$activeSlave.skin = changeSkinTone($activeSlave.skin, -1), cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Lighten|Salon][getSlave($AS).skin = changeSkinTone(getSlave($AS).skin, -1), cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <<set _needsSpacers = 1>> <</if>> - <<if (skinToneLevel($activeSlave.skin) < 18)>> + <<if (skinToneLevel(getSlave($AS).skin) < 18)>> <<if _needsSpacers == 1>> | <</if>> - [[Darken|Salon][$activeSlave.skin = changeSkinTone($activeSlave.skin, 1), cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Darken|Salon][getSlave($AS).skin = changeSkinTone(getSlave($AS).skin, 1), cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <<set _needsSpacers = 1>> <</if>> - <<if (skinToneLevel($activeSlave.skin) < 25)>> + <<if (skinToneLevel(getSlave($AS).skin) < 25)>> <<if _needsSpacers == 1>> | <</if>> - [[Blacken|Salon][$activeSlave.skin = changeSkinTone($activeSlave.skin, 2), cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Blacken|Salon][getSlave($AS).skin = changeSkinTone(getSlave($AS).skin, 2), cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <<set _needsSpacers = 1>> <</if>> <</if>> </div> <div class="choices"> <<set _needsSpacers = 0>> - <<if ($activeSlave.skin != "sun tanned")>> - <<if (skinToneLevel($activeSlave.skin) < 6)>> + <<if (getSlave($AS).skin != "sun tanned")>> + <<if (skinToneLevel(getSlave($AS).skin) < 6)>> $His skin is so light in color that any attempt at natural tanning is more likely to damage $his skin. - <<elseif (skinToneLevel($activeSlave.skin) > 20)>> + <<elseif (skinToneLevel(getSlave($AS).skin) > 20)>> $His skin is so dark in color that any attempt at natural tanning is not likely to appear on $his skin. <<else>> - [["Sun tan " + $his + " skin"|Salon][$activeSlave.skin = "sun tanned", cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [["Sun tan " + $his + " skin"|Salon][getSlave($AS).skin = "sun tanned", cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <<set _needsSpacers = 1>> <</if>> <</if>> - <<if ($activeSlave.skin != "spray tanned")>> + <<if (getSlave($AS).skin != "spray tanned")>> <<if _needsSpacers == 1>> | <</if>> - [["Spray tan " + $his + " skin"|Salon][$activeSlave.skin = "spray tanned", cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [["Spray tan " + $his + " skin"|Salon][getSlave($AS).skin = "spray tanned", cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> </div> <</if>> <div class="choices"> Dye or paint: - [[Blue|Salon][$activeSlave.skin = "dyed blue",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Camouflage|Salon][$activeSlave.skin = "camouflage patterned",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Gray|Salon][$activeSlave.skin = "dyed gray",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Green|Salon][$activeSlave.skin = "dyed green",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Pink|Salon][$activeSlave.skin = "dyed pink",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Red|Salon][$activeSlave.skin = "dyed red",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Tiger Stripes|Salon][$activeSlave.skin = "tiger striped",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Blue|Salon][getSlave($AS).skin = "dyed blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Camouflage|Salon][getSlave($AS).skin = "camouflage patterned",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Gray|Salon][getSlave($AS).skin = "dyed gray",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Green|Salon][getSlave($AS).skin = "dyed green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Pink|Salon][getSlave($AS).skin = "dyed pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Red|Salon][getSlave($AS).skin = "dyed red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Tiger Stripes|Salon][getSlave($AS).skin = "tiger striped",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> -<<if $activeSlave.tail != "none">> - $His tail is $activeSlave.tailColor. - <<if $activeSlave.tailColor != $activeSlave.hColor>> - [[Match current hair|Salon][$activeSlave.tailColor = $activeSlave.hColor]] or <span class="note">choose a new one:</span> +<<if getSlave($AS).tail != "none">> + $His tail is <<= getSlave($AS).tailColor>>. + <<if getSlave($AS).tailColor != getSlave($AS).hColor>> + [[Match current hair|Salon][getSlave($AS).tailColor = getSlave($AS).hColor]] or <span class="note">choose a new one:</span> <<else>> <span class="note">Choose a dye color before dyeing $his tail:</span> <</if>> @@ -824,35 +828,35 @@ <<if $primaryTailColor != 0>> <div class="choices"> - [["Dye " + $his + " tail"|Salon][$activeSlave.tailColor = ($primaryTailColor + $secondaryTailColor),cashX(forceNeg($modCost), "slaveMod", $activeSlave), $primaryTailColor = 0, $secondaryTailColor = ""]] $primaryTailColor $secondaryTailColor now? + [["Dye " + $his + " tail"|Salon][getSlave($AS).tailColor = ($primaryTailColor + $secondaryTailColor),cashX(forceNeg($modCost), "slaveMod", getSlave($AS)), $primaryTailColor = 0, $secondaryTailColor = ""]] $primaryTailColor $secondaryTailColor now? </div> <</if>> <</if>> /* MARKS */ <div> - <<if ($activeSlave.markings == "beauty mark")>> + <<if (getSlave($AS).markings == "beauty mark")>> $He has a prominent mole on $his face, which - <<if $activeSlave.face > 40>> + <<if getSlave($AS).face > 40>> qualifies as a beauty mark and enhances $his attractiveness due to $his facial beauty. - <<elseif $activeSlave.face < -10>> + <<elseif getSlave($AS).face < -10>> makes $him even less attractive. <<else>> qualifies as a beauty mark since $he's pretty, having no significant impact on $his beauty. <</if>> - [[Remove it|Salon][$activeSlave.markings = "none",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Remove it|Salon][getSlave($AS).markings = "none",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> </div> <div> - <<if ($activeSlave.markings == "birthmark")>> + <<if (getSlave($AS).markings == "birthmark")>> $He has a large birthmark, which - <<if $activeSlave.prestige > 0 || $activeSlave.porn.prestige > 1>> + <<if getSlave($AS).prestige > 0 || getSlave($AS).porn.prestige > 1>> enhances $his attractiveness due to $his prestige. <<else>> detracts from $his attractiveness. <</if>> - [[Bleach it|Salon][$activeSlave.markings = "none",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Bleach it|Salon][getSlave($AS).markings = "none",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> </div> @@ -860,79 +864,79 @@ <h3>Body hair</h3> /* EYEBROW HAIR */ -<<if $activeSlave.eyebrowHStyle != "bald">> +<<if getSlave($AS).eyebrowHStyle != "bald">> <div> - $His <<if $activeSlave.eyebrowFullness != "natural">>$activeSlave.eyebrowFullness<<if $activeSlave.eyebrowHStyle != "natural">>,<</if>> <</if>><<if $activeSlave.eyebrowHStyle != "natural">>$activeSlave.eyebrowHStyle <</if>> eyebrows - <<if $activeSlave.eyebrowHStyle == "shaved">> - would be $activeSlave.eyebrowHColor if present. + $His <<if getSlave($AS).eyebrowFullness != "natural">><<= getSlave($AS).eyebrowFullness>><<if getSlave($AS).eyebrowHStyle != "natural">>,<</if>> <</if>><<if getSlave($AS).eyebrowHStyle != "natural">><<= getSlave($AS).eyebrowHStyle>> <</if>> eyebrows + <<if getSlave($AS).eyebrowHStyle == "shaved">> + would be <<= getSlave($AS).eyebrowHColor>> if present. <<else>> - are $activeSlave.eyebrowHColor. + are <<= getSlave($AS).eyebrowHColor>>. <</if>> - <<if $activeSlave.eyebrowHColor != $activeSlave.hColor>> - [[Match the hair?|Salon][$activeSlave.eyebrowHColor = $activeSlave.hColor,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + <<if getSlave($AS).eyebrowHColor != getSlave($AS).hColor>> + [[Match the hair?|Salon][getSlave($AS).eyebrowHColor = getSlave($AS).hColor,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> </div> <div class="choices"> Dye $his eyebrow hair: - [[Auburn|Salon][$activeSlave.eyebrowHColor = "auburn",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Black|Salon][$activeSlave.eyebrowHColor = "black",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blazing Red|Salon][$activeSlave.eyebrowHColor = "blazing red",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blonde|Salon][$activeSlave.eyebrowHColor = "blonde",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blue-Violet|Salon][$activeSlave.eyebrowHColor = "blue-violet",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blue|Salon][$activeSlave.eyebrowHColor = "blue",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Brown|Salon][$activeSlave.eyebrowHColor = "brown",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Burgundy|Salon][$activeSlave.eyebrowHColor = "burgundy",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Chestnut|Salon][$activeSlave.eyebrowHColor = "chestnut",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Chocolate|Salon][$activeSlave.eyebrowHColor = "chocolate brown",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Copper|Salon][$activeSlave.eyebrowHColor = "copper",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Dark Blue|Salon][$activeSlave.eyebrowHColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Dark Brown|Salon][$activeSlave.eyebrowHColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Dark Orchid|Salon][$activeSlave.eyebrowHColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Auburn|Salon][getSlave($AS).eyebrowHColor = "auburn",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Black|Salon][getSlave($AS).eyebrowHColor = "black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blazing Red|Salon][getSlave($AS).eyebrowHColor = "blazing red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blonde|Salon][getSlave($AS).eyebrowHColor = "blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blue-Violet|Salon][getSlave($AS).eyebrowHColor = "blue-violet",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blue|Salon][getSlave($AS).eyebrowHColor = "blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Brown|Salon][getSlave($AS).eyebrowHColor = "brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Burgundy|Salon][getSlave($AS).eyebrowHColor = "burgundy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Chestnut|Salon][getSlave($AS).eyebrowHColor = "chestnut",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Chocolate|Salon][getSlave($AS).eyebrowHColor = "chocolate brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Copper|Salon][getSlave($AS).eyebrowHColor = "copper",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Dark Blue|Salon][getSlave($AS).eyebrowHColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Dark Brown|Salon][getSlave($AS).eyebrowHColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Dark Orchid|Salon][getSlave($AS).eyebrowHColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] | [[Deep Red|Salon][$primaryHairColor = "deep red"]] - | [[Ginger|Salon][$activeSlave.eyebrowHColor = "ginger",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Golden|Salon][$activeSlave.eyebrowHColor = "golden",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Green-yellow|Salon][$activeSlave.eyebrowHColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Green|Salon][$activeSlave.eyebrowHColor = "green",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Grey|Salon][$activeSlave.eyebrowHColor = "grey",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Hazel|Salon][$activeSlave.eyebrowHColor = "hazel",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Jet Black|Salon][$activeSlave.eyebrowHColor = "jet black",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neon Blue|Salon][$activeSlave.eyebrowHColor = "neon blue",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neon Green|Salon][$activeSlave.eyebrowHColor = "neon green",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neon Pink|Salon][$activeSlave.eyebrowHColor = "neon pink",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Pink|Salon][$activeSlave.eyebrowHColor = "pink",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Platinum Blonde|Salon][$activeSlave.eyebrowHColor = "platinum blonde",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Purple|Salon][$activeSlave.eyebrowHColor = "purple",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Red|Salon][$activeSlave.eyebrowHColor = "red",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Sea Green|Salon][$activeSlave.eyebrowHColor = "sea green",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Silver|Salon][$activeSlave.eyebrowHColor = "silver",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Strawberry-Blonde|Salon][$activeSlave.eyebrowHColor = "strawberry-blonde",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[White|Salon][$activeSlave.eyebrowHColor = "white",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + | [[Ginger|Salon][getSlave($AS).eyebrowHColor = "ginger",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Golden|Salon][getSlave($AS).eyebrowHColor = "golden",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Green-yellow|Salon][getSlave($AS).eyebrowHColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Green|Salon][getSlave($AS).eyebrowHColor = "green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Grey|Salon][getSlave($AS).eyebrowHColor = "grey",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Hazel|Salon][getSlave($AS).eyebrowHColor = "hazel",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Jet Black|Salon][getSlave($AS).eyebrowHColor = "jet black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neon Blue|Salon][getSlave($AS).eyebrowHColor = "neon blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neon Green|Salon][getSlave($AS).eyebrowHColor = "neon green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neon Pink|Salon][getSlave($AS).eyebrowHColor = "neon pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Pink|Salon][getSlave($AS).eyebrowHColor = "pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Platinum Blonde|Salon][getSlave($AS).eyebrowHColor = "platinum blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Purple|Salon][getSlave($AS).eyebrowHColor = "purple",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Red|Salon][getSlave($AS).eyebrowHColor = "red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Sea Green|Salon][getSlave($AS).eyebrowHColor = "sea green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Silver|Salon][getSlave($AS).eyebrowHColor = "silver",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Strawberry-Blonde|Salon][getSlave($AS).eyebrowHColor = "strawberry-blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[White|Salon][getSlave($AS).eyebrowHColor = "white",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> <div class="choices"> Style $his eyebrow hair: - [[Natural|Salon][$activeSlave.eyebrowHStyle = "natural",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Curved|Salon][$activeSlave.eyebrowHStyle = "curved",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Elongated|Salon][$activeSlave.eyebrowHStyle = "elongated",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[High-Arched|Salon][$activeSlave.eyebrowHStyle = "high-arched",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Rounded|Salon][$activeSlave.eyebrowHStyle = "rounded",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Shaved|Salon][$activeSlave.eyebrowHStyle = "shaved",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Shortened|Salon][$activeSlave.eyebrowHStyle = "shortened",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Slanted Inwards|Salon][$activeSlave.eyebrowHStyle = "slanted inwards",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Slanted Outwards|Salon][$activeSlave.eyebrowHStyle = "slanted outwards",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Straight|Salon][$activeSlave.eyebrowHStyle = "straight",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Natural|Salon][getSlave($AS).eyebrowHStyle = "natural",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Curved|Salon][getSlave($AS).eyebrowHStyle = "curved",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Elongated|Salon][getSlave($AS).eyebrowHStyle = "elongated",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[High-Arched|Salon][getSlave($AS).eyebrowHStyle = "high-arched",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Rounded|Salon][getSlave($AS).eyebrowHStyle = "rounded",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Shaved|Salon][getSlave($AS).eyebrowHStyle = "shaved",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Shortened|Salon][getSlave($AS).eyebrowHStyle = "shortened",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Slanted Inwards|Salon][getSlave($AS).eyebrowHStyle = "slanted inwards",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Slanted Outwards|Salon][getSlave($AS).eyebrowHStyle = "slanted outwards",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Straight|Salon][getSlave($AS).eyebrowHStyle = "straight",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> <div class="choices"> Shape $his eyebrow hair: - [[Natural|Salon][$activeSlave.eyebrowFullness = "natural",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Bushy|Salon][$activeSlave.eyebrowFullness = "bushy",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Thick|Salon][$activeSlave.eyebrowFullness = "thick",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Tapered|Salon][$activeSlave.eyebrowFullness = "tapered",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Threaded|Salon][$activeSlave.eyebrowFullness = "threaded",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Thin|Salon][$activeSlave.eyebrowFullness = "thin",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Pencil-Thin|Salon][$activeSlave.eyebrowFullness = "pencil-thin",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Natural|Salon][getSlave($AS).eyebrowFullness = "natural",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Bushy|Salon][getSlave($AS).eyebrowFullness = "bushy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Thick|Salon][getSlave($AS).eyebrowFullness = "thick",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Tapered|Salon][getSlave($AS).eyebrowFullness = "tapered",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Threaded|Salon][getSlave($AS).eyebrowFullness = "threaded",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Thin|Salon][getSlave($AS).eyebrowFullness = "thin",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Pencil-Thin|Salon][getSlave($AS).eyebrowFullness = "pencil-thin",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> <<else>> <div> @@ -942,73 +946,73 @@ /* PUBIC HAIR */ -<<set _pubertyAge = Math.min($activeSlave.pubertyAgeXX, $activeSlave.pubertyAgeXY)>> -<<if $activeSlave.pubicHStyle != "bald" && $activeSlave.pubicHStyle != "hairless" && $activeSlave.physicalAge >= _pubertyAge-1>> +<<set _pubertyAge = Math.min(getSlave($AS).pubertyAgeXX, getSlave($AS).pubertyAgeXY)>> +<<if getSlave($AS).pubicHStyle != "bald" && getSlave($AS).pubicHStyle != "hairless" && getSlave($AS).physicalAge >= _pubertyAge-1>> <div> $His - <<if $activeSlave.physicalAge < _pubertyAge>> + <<if getSlave($AS).physicalAge < _pubertyAge>> wispy pubic hair, which is just starting to grow in, - <<elseif $activeSlave.pubicHStyle == "in a strip">> + <<elseif getSlave($AS).pubicHStyle == "in a strip">> pubic hair, which is shaved into a strip, <<else>> - $activeSlave.pubicHStyle pubic hair + <<= getSlave($AS).pubicHStyle>> pubic hair <</if>> - <<if $activeSlave.pubicHStyle == "waxed">> - would be $activeSlave.pubicHColor if present. + <<if getSlave($AS).pubicHStyle == "waxed">> + would be <<= getSlave($AS).pubicHColor>> if present. <<else>> - is $activeSlave.pubicHColor. + is <<= getSlave($AS).pubicHColor>>. <</if>> - <<if $activeSlave.pubicHColor != $activeSlave.hColor>> - [[Match the curtains?|Salon][$activeSlave.pubicHColor = $activeSlave.hColor,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + <<if getSlave($AS).pubicHColor != getSlave($AS).hColor>> + [[Match the curtains?|Salon][getSlave($AS).pubicHColor = getSlave($AS).hColor,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> </div> <div class="choices"> Dye $his pubic hair: - [[Auburn|Salon][$activeSlave.pubicHColor = "auburn",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Black|Salon][$activeSlave.pubicHColor = "black",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blazing Red|Salon][$activeSlave.pubicHColor = "blazing red",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blonde|Salon][$activeSlave.pubicHColor = "blonde",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blue-Violet|Salon][$activeSlave.pubicHColor = "blue-violet",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blue|Salon][$activeSlave.pubicHColor = "blue",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Brown|Salon][$activeSlave.pubicHColor = "brown",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Burgundy|Salon][$activeSlave.pubicHColor = "burgundy",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Chestnut|Salon][$activeSlave.pubicHColor = "chestnut",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Chocolate|Salon][$activeSlave.pubicHColor = "chocolate brown",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Copper|Salon][$activeSlave.pubicHColor = "copper",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Dark Blue|Salon][$activeSlave.pubicHColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Dark Brown|Salon][$activeSlave.pubicHColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Dark Orchid|Salon][$activeSlave.pubicHColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Auburn|Salon][getSlave($AS).pubicHColor = "auburn",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Black|Salon][getSlave($AS).pubicHColor = "black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blazing Red|Salon][getSlave($AS).pubicHColor = "blazing red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blonde|Salon][getSlave($AS).pubicHColor = "blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blue-Violet|Salon][getSlave($AS).pubicHColor = "blue-violet",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blue|Salon][getSlave($AS).pubicHColor = "blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Brown|Salon][getSlave($AS).pubicHColor = "brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Burgundy|Salon][getSlave($AS).pubicHColor = "burgundy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Chestnut|Salon][getSlave($AS).pubicHColor = "chestnut",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Chocolate|Salon][getSlave($AS).pubicHColor = "chocolate brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Copper|Salon][getSlave($AS).pubicHColor = "copper",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Dark Blue|Salon][getSlave($AS).pubicHColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Dark Brown|Salon][getSlave($AS).pubicHColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Dark Orchid|Salon][getSlave($AS).pubicHColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] | [[Deep Red|Salon][$primaryHairColor = "deep red"]] - | [[Ginger|Salon][$activeSlave.pubicHColor = "ginger",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Golden|Salon][$activeSlave.pubicHColor = "golden",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Green-yellow|Salon][$activeSlave.pubicHColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Green|Salon][$activeSlave.pubicHColor = "green",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Grey|Salon][$activeSlave.pubicHColor = "grey",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Hazel|Salon][$activeSlave.pubicHColor = "hazel",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Jet Black|Salon][$activeSlave.pubicHColor = "jet black",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neon Blue|Salon][$activeSlave.pubicHColor = "neon blue",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neon Green|Salon][$activeSlave.pubicHColor = "neon green",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neon Pink|Salon][$activeSlave.pubicHColor = "neon pink",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Pink|Salon][$activeSlave.pubicHColor = "pink",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Platinum Blonde|Salon][$activeSlave.pubicHColor = "platinum blonde",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Purple|Salon][$activeSlave.pubicHColor = "purple",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Red|Salon][$activeSlave.pubicHColor = "red",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Sea Green|Salon][$activeSlave.pubicHColor = "sea green",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Silver|Salon][$activeSlave.pubicHColor = "silver",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Strawberry-Blonde|Salon][$activeSlave.pubicHColor = "strawberry-blonde",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[White|Salon][$activeSlave.pubicHColor = "white",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + | [[Ginger|Salon][getSlave($AS).pubicHColor = "ginger",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Golden|Salon][getSlave($AS).pubicHColor = "golden",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Green-yellow|Salon][getSlave($AS).pubicHColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Green|Salon][getSlave($AS).pubicHColor = "green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Grey|Salon][getSlave($AS).pubicHColor = "grey",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Hazel|Salon][getSlave($AS).pubicHColor = "hazel",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Jet Black|Salon][getSlave($AS).pubicHColor = "jet black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neon Blue|Salon][getSlave($AS).pubicHColor = "neon blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neon Green|Salon][getSlave($AS).pubicHColor = "neon green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neon Pink|Salon][getSlave($AS).pubicHColor = "neon pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Pink|Salon][getSlave($AS).pubicHColor = "pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Platinum Blonde|Salon][getSlave($AS).pubicHColor = "platinum blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Purple|Salon][getSlave($AS).pubicHColor = "purple",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Red|Salon][getSlave($AS).pubicHColor = "red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Sea Green|Salon][getSlave($AS).pubicHColor = "sea green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Silver|Salon][getSlave($AS).pubicHColor = "silver",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Strawberry-Blonde|Salon][getSlave($AS).pubicHColor = "strawberry-blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[White|Salon][getSlave($AS).pubicHColor = "white",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> <div class="choices"> Style $his pubic hair: - [[Waxed|Salon][$activeSlave.pubicHStyle = "waxed",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Landing strip|Salon][$activeSlave.pubicHStyle = "in a strip",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neat|Salon][$activeSlave.pubicHStyle = "neat",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Bushy in the front|Salon][$activeSlave.pubicHStyle = "bushy in the front and neat in the rear",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Bushy|Salon][$activeSlave.pubicHStyle = "bushy",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Very Bushy|Salon][$activeSlave.pubicHStyle = "very bushy",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Waxed|Salon][getSlave($AS).pubicHStyle = "waxed",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Landing strip|Salon][getSlave($AS).pubicHStyle = "in a strip",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neat|Salon][getSlave($AS).pubicHStyle = "neat",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Bushy in the front|Salon][getSlave($AS).pubicHStyle = "bushy in the front and neat in the rear",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Bushy|Salon][getSlave($AS).pubicHStyle = "bushy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Very Bushy|Salon][getSlave($AS).pubicHStyle = "very bushy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> <<else>> @@ -1019,68 +1023,68 @@ /* UNDERARM HAIR */ -<<if $activeSlave.underArmHStyle != "bald" && $activeSlave.underArmHStyle != "hairless" && $activeSlave.physicalAge >= _pubertyAge-1>> +<<if getSlave($AS).underArmHStyle != "bald" && getSlave($AS).underArmHStyle != "hairless" && getSlave($AS).physicalAge >= _pubertyAge-1>> <div> $His - <<if $activeSlave.physicalAge < _pubertyAge>> + <<if getSlave($AS).physicalAge < _pubertyAge>> wispy underarm hair <<else>> - $activeSlave.underArmHStyle underarm hair + <<= getSlave($AS).underArmHStyle>> underarm hair <</if>> - <<if $activeSlave.underArmHStyle == "waxed">> - would be $activeSlave.underArmHColor if present. + <<if getSlave($AS).underArmHStyle == "waxed">> + would be <<= getSlave($AS).underArmHColor>> if present. <<else>> - is $activeSlave.underArmHColor. + is <<= getSlave($AS).underArmHColor>>. <</if>> - <<if $activeSlave.underArmHColor != $activeSlave.hColor>> - [[Match the hair?|Salon][$activeSlave.underArmHColor = $activeSlave.hColor,cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + <<if getSlave($AS).underArmHColor != getSlave($AS).hColor>> + [[Match the hair?|Salon][getSlave($AS).underArmHColor = getSlave($AS).hColor,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] <</if>> </div> <div class="choices"> Dye $his armpit hair: - [[Auburn|Salon][$activeSlave.underArmHColor = "auburn",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Black|Salon][$activeSlave.underArmHColor = "black",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blazing Red|Salon][$activeSlave.underArmHColor = "blazing red",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blonde|Salon][$activeSlave.underArmHColor = "blonde",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blue-Violet|Salon][$activeSlave.underArmHColor = "blue-violet",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Blue|Salon][$activeSlave.underArmHColor = "blue",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Brown|Salon][$activeSlave.underArmHColor = "brown",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Burgundy|Salon][$activeSlave.underArmHColor = "burgundy",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Chestnut|Salon][$activeSlave.underArmHColor = "chestnut",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Chocolate|Salon][$activeSlave.underArmHColor = "chocolate brown",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Copper|Salon][$activeSlave.underArmHColor = "copper",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Dark Blue|Salon][$activeSlave.underArmHColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Dark Brown|Salon][$activeSlave.underArmHColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Dark Orchid|Salon][$activeSlave.underArmHColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Auburn|Salon][getSlave($AS).underArmHColor = "auburn",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Black|Salon][getSlave($AS).underArmHColor = "black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blazing Red|Salon][getSlave($AS).underArmHColor = "blazing red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blonde|Salon][getSlave($AS).underArmHColor = "blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blue-Violet|Salon][getSlave($AS).underArmHColor = "blue-violet",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Blue|Salon][getSlave($AS).underArmHColor = "blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Brown|Salon][getSlave($AS).underArmHColor = "brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Burgundy|Salon][getSlave($AS).underArmHColor = "burgundy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Chestnut|Salon][getSlave($AS).underArmHColor = "chestnut",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Chocolate|Salon][getSlave($AS).underArmHColor = "chocolate brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Copper|Salon][getSlave($AS).underArmHColor = "copper",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Dark Blue|Salon][getSlave($AS).underArmHColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Dark Brown|Salon][getSlave($AS).underArmHColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Dark Orchid|Salon][getSlave($AS).underArmHColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] | [[Deep Red|Salon][$primaryHairColor = "deep red"]] - | [[Ginger|Salon][$activeSlave.underArmHColor = "ginger",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Golden|Salon][$activeSlave.underArmHColor = "golden",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Green-yellow|Salon][$activeSlave.underArmHColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Green|Salon][$activeSlave.underArmHColor = "green",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Grey|Salon][$activeSlave.underArmHColor = "grey",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Hazel|Salon][$activeSlave.underArmHColor = "hazel",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Jet Black|Salon][$activeSlave.underArmHColor = "jet black",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neon Blue|Salon][$activeSlave.underArmHColor = "neon blue",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neon Green|Salon][$activeSlave.underArmHColor = "neon green",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neon Pink|Salon][$activeSlave.underArmHColor = "neon pink",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Pink|Salon][$activeSlave.underArmHColor = "pink",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Platinum Blonde|Salon][$activeSlave.underArmHColor = "platinum blonde",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Purple|Salon][$activeSlave.underArmHColor = "purple",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Red|Salon][$activeSlave.underArmHColor = "red",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Sea Green|Salon][$activeSlave.underArmHColor = "sea green",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Silver|Salon][$activeSlave.underArmHColor = "silver",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Strawberry-Blonde|Salon][$activeSlave.underArmHColor = "strawberry-blonde",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[White|Salon][$activeSlave.underArmHColor = "white",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + | [[Ginger|Salon][getSlave($AS).underArmHColor = "ginger",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Golden|Salon][getSlave($AS).underArmHColor = "golden",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Green-yellow|Salon][getSlave($AS).underArmHColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Green|Salon][getSlave($AS).underArmHColor = "green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Grey|Salon][getSlave($AS).underArmHColor = "grey",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Hazel|Salon][getSlave($AS).underArmHColor = "hazel",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Jet Black|Salon][getSlave($AS).underArmHColor = "jet black",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neon Blue|Salon][getSlave($AS).underArmHColor = "neon blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neon Green|Salon][getSlave($AS).underArmHColor = "neon green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neon Pink|Salon][getSlave($AS).underArmHColor = "neon pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Pink|Salon][getSlave($AS).underArmHColor = "pink",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Platinum Blonde|Salon][getSlave($AS).underArmHColor = "platinum blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Purple|Salon][getSlave($AS).underArmHColor = "purple",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Red|Salon][getSlave($AS).underArmHColor = "red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Sea Green|Salon][getSlave($AS).underArmHColor = "sea green",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Silver|Salon][getSlave($AS).underArmHColor = "silver",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Strawberry-Blonde|Salon][getSlave($AS).underArmHColor = "strawberry-blonde",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[White|Salon][getSlave($AS).underArmHColor = "white",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> <div class="choices"> Style $his armpit hair: - [[Waxed|Salon][$activeSlave.underArmHStyle = "waxed",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Shaved|Salon][$activeSlave.underArmHStyle = "shaved",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Neat|Salon][$activeSlave.underArmHStyle = "neat",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] - | [[Bushy|Salon][$activeSlave.underArmHStyle = "bushy",cashX(forceNeg($modCost), "slaveMod", $activeSlave)]] + [[Waxed|Salon][getSlave($AS).underArmHStyle = "waxed",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Shaved|Salon][getSlave($AS).underArmHStyle = "shaved",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Neat|Salon][getSlave($AS).underArmHStyle = "neat",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] + | [[Bushy|Salon][getSlave($AS).underArmHStyle = "bushy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] </div> <<else>> diff --git a/src/uncategorized/scheduledEvent.tw b/src/uncategorized/scheduledEvent.tw index e6233aefff37d82717c9b9a23c6340ca8063bc44..177f9ce538e14ee9665f463fc8805fc8047c5e79 100644 --- a/src/uncategorized/scheduledEvent.tw +++ b/src/uncategorized/scheduledEvent.tw @@ -127,7 +127,7 @@ <<elseif ($birthee != 0)>> <<set $birthed = 0>> <<goto "SE Birth">> -<<elseif ($FCTV.receiver > 0) && $FCTV.pcViewership.frequency != -1 && $FCTV.pcViewership.count == 0>> +<<elseif $FCTV.receiver > 0 && $FCTV.pcViewership.frequency != -1 && $FCTV.pcViewership.count == 0>> <<if $week > 50 && $FCTV.remote < 2>> <<goto "SE FCTV Remote">> <<else>> <<goto "SE FCTV Watch">> <</if>> diff --git a/src/uncategorized/schoolroom.tw b/src/uncategorized/schoolroom.tw index 5988860999385042d9a2e7c34d5ecb15ee823b28..24e18f341202ebdbcff81d88a8c76223ef470e75 100644 --- a/src/uncategorized/schoolroom.tw +++ b/src/uncategorized/schoolroom.tw @@ -87,7 +87,7 @@ <<set _Tmult0 = Math.trunc($schoolroom*1000*$upgradeMultiplierArcology)>> $schoolroomNameCaps has room to house $schoolroom slaves while they learn. There <<if $SchlRiIDs.length == 1>>is<<else>>are<</if>> currently $SchlRiIDs.length slave<<if $SchlRiIDs.length != 1>>s<</if>> learning in $schoolroomName. <div class="choices"> - [[Expand the schoolroom|Schoolroom][cashX(forceNeg(_Tmult0), "capEx"), $schoolroom += 5, $PC.skill.engineering += .1]] + [[Expand the schoolroom|Schoolroom][cashX(forceNeg(_Tmult0), "capEx"), $schoolroom += 5, $PC.skill.engineering += .1]] <span class="note"> Costs <<print cashFormat(_Tmult0)>> </span> @@ -107,7 +107,7 @@ <<set _Tmult1 = Math.trunc(10000*$upgradeMultiplierArcology)>> $schoolroomNameCaps inculcates the basic skills necessary to a sex slave. <div class="choices"> - [[Upgrade the curriculum to cover some intermediate skills|Schoolroom][cashX(forceNeg(_Tmult1), "capEx"), $schoolroomUpgradeSkills = 1]] + [[Upgrade the curriculum to cover some intermediate skills|Schoolroom][cashX(forceNeg(_Tmult1), "capEx"), $schoolroomUpgradeSkills = 1]] <span class="note"> Costs <<print cashFormat(_Tmult1)>> </span> @@ -122,7 +122,7 @@ <<else>> $schoolroomNameCaps includes only basic language classes in its curriculum. <div class="choices"> - [[Install advanced linguistic interfaces to efficiently teach the arcology's lingua franca|Schoolroom][cashX(forceNeg(_Tmult2), "capEx"), $schoolroomUpgradeLanguage = 1, $PC.skill.hacking += 0.1]] + [[Install advanced linguistic interfaces to efficiently teach the arcology's lingua franca|Schoolroom][cashX(forceNeg(_Tmult2), "capEx"), $schoolroomUpgradeLanguage = 1, $PC.skill.hacking += 0.1]] <span class="note"> Costs <<print cashFormat(_Tmult2)>> </span> @@ -134,7 +134,7 @@ <<if $schoolroomRemodelBimbo == 1>> <<set _Tmult3 = Math.trunc(7500*$upgradeMultiplierArcology*$HackingSkillMultiplier)>> <div> - $schoolroomNameCaps is designed with moronic slaves in mind and seeks to dumb down slaves by providing them a confusing, contradictory education that retards decision making skills and undoes existing schooling. [[Restore the curriculum to the standard|Schoolroom][cashX(forceNeg(_Tmult3), "capEx"), $schoolroomRemodelBimbo = 0]] + $schoolroomNameCaps is designed with moronic slaves in mind and seeks to dumb down slaves by providing them a confusing, contradictory education that retards decision making skills and undoes existing schooling. [[Restore the curriculum to the standard|Schoolroom][cashX(forceNeg(_Tmult3), "capEx"), $schoolroomRemodelBimbo = 0]] <span class="note"> Costs <<print cashFormat(_Tmult3)>> </span> @@ -143,7 +143,7 @@ <<if $schoolroomUpgradeRemedial == 1>> $schoolroomNameCaps has been upgraded with advanced teaching tools to help even the smartest slave learn at an acceptable pace. Dumb slaves won't learn much faster as a result, but smarties will benefit a great deal. <<else>> - $schoolroomNameCaps teaches woefully smart slaves using its modified methods. [[Purchase specialized materials to help smart slaves get on the right track|Schoolroom][cashX(forceNeg(_Tmult2), "capEx"), $schoolroomUpgradeRemedial = 1]] + $schoolroomNameCaps teaches woefully smart slaves using its modified methods. [[Purchase specialized materials to help smart slaves get on the right track|Schoolroom][cashX(forceNeg(_Tmult2), "capEx"), $schoolroomUpgradeRemedial = 1]] <span class="note"> Costs <<print cashFormat(_Tmult2)>> </span> @@ -155,7 +155,7 @@ <<set _Tmult3 = Math.trunc(7500*$upgradeMultiplierArcology*$HackingSkillMultiplier)>> $schoolroomNameCaps is designed with intelligent slaves in mind and seeks to smarten slaves by providing them with an education. <div class="choices"> - [[Redesign the curriculum to undo pesky educations and retard slaves while benefiting the most simple of minds|Schoolroom][cashX(forceNeg(_Tmult3), "capEx"), $schoolroomRemodelBimbo = 1]] + [[Redesign the curriculum to undo pesky educations and retard slaves while benefiting the most simple of minds|Schoolroom][cashX(forceNeg(_Tmult3), "capEx"), $schoolroomRemodelBimbo = 1]] <span class="note"> Costs <<print cashFormat(_Tmult3)>> </span> @@ -168,7 +168,7 @@ <<else>> $schoolroomNameCaps teaches idiots using standard methods. <div class="choices"> - [[Purchase specialized materials to help stupid slaves learn good|Schoolroom][cashX(forceNeg(_Tmult2), "capEx"), $schoolroomUpgradeRemedial = 1]] + [[Purchase specialized materials to help stupid slaves learn good|Schoolroom][cashX(forceNeg(_Tmult2), "capEx"), $schoolroomUpgradeRemedial = 1]] <span class="note"> Costs <<print cashFormat(_Tmult2)>> </span> @@ -183,7 +183,7 @@ </p> <p> - Rename $schoolroomName: <<textbox "$schoolroomName" $schoolroomName "Schoolroom">> + Rename $schoolroomName: <<textbox "$schoolroomName" $schoolroomName "Schoolroom">> <span class="note"> Use a noun or similar short phrase </span> diff --git a/src/uncategorized/seCoursing.tw b/src/uncategorized/seCoursing.tw index 9d8f813a6e11b7bf8a4184ed10e6278ca9145ebb..cbc3e4e7e384b5ebc2e0382c9bb2b3d780de09af 100644 --- a/src/uncategorized/seCoursing.tw +++ b/src/uncategorized/seCoursing.tw @@ -375,9 +375,12 @@ You lead your lurcher $activeLurcher.slaveName out on a leash, naked just like t _He2's so skinny that it's not likely _he2's physically fit enough to be quick. <<set $hareSpeed -= 1>> <</if>> -<<if $activeSlave.muscles > 30>> +<<if $activeSlave.muscles > 50>> _He2's so heavily muscled that _he2's probably slower than _he2 would be if _he2 were merely fit. <<set $hareSpeed -= 1>> +<<elseif $activeSlave.muscles > 30>> + _He2's quite toned, which will give _him2 an edge once _he2's up to speed. + <<set $hareSpeed += 1>> <<elseif $activeSlave.muscles <= 5>> _He2's soft, and _his2 legs show no sign of tone at all. <<set $hareSpeed -= 1>> @@ -421,6 +424,16 @@ You lead your lurcher $activeLurcher.slaveName out on a leash, naked just like t There is a slight roundness to _his2 middle, likely an early pregnancy that will distract _him2. <<set $hareSpeed -= 1>> <</if>> +<<if $activeSlave.health.tired > 90>> + _He2 is obviously tired and will likely be a quick catch. + <<set $hareSpeed -= 5>> +<<elseif $activeSlave.health.tired > 60>> + _He2 seems to be rather tired, which will slow _him2 out of the gate. + <<set $hareSpeed -= 2>> +<<elseif $activeSlave.health.tired > 30>> + _He2 seems a little tired, which will slow _his2 acceleration. + <<set $hareSpeed -= 1>> +<</if>> <<if _sec == 0>> <<set $hare1 = $activeSlave>> diff --git a/src/uncategorized/seCoursingRace.tw b/src/uncategorized/seCoursingRace.tw index c53f68633baf8b22dd1a114c3aa895a25be7cee6..04f91e9144755ac30ddd64f8f962245a99e0db07 100644 --- a/src/uncategorized/seCoursingRace.tw +++ b/src/uncategorized/seCoursingRace.tw @@ -25,6 +25,16 @@ You place your hand on the leash's quick release and <<if canHear($activeLurcher $His poor health slows $him down. <<set _LurcherSpeed -= 1>> <</if>> +<<if $activeLurcher.health.tired > 90>> + $He is exhausted and can barely stay awake; side bets are starting up on how far $he'll make it around the track. + <<set _LurcherSpeed -= 5>> +<<elseif $activeLurcher.health.tired > 60>> + $He is fatigued, sapping the strength $he'll need to reach $his top speed. + <<set _LurcherSpeed -= 2>> +<<elseif $activeLurcher.health.tired > 30>> + $He is tired and liable to be a slow start. + <<set _LurcherSpeed -= 1>> +<</if>> <<if !canSee($activeLurcher)>> $His inability to see causes $him to be cautious of $his footing, making $his first several strides slow and uncertain. <<set _LurcherSpeed -= 1>> @@ -45,9 +55,12 @@ You place your hand on the leash's quick release and <<if canHear($activeLurcher $He's so thin that $he lacks the vigor to run really well. <<set _LurcherSpeed -= 1>> <</if>> -<<if $activeLurcher.muscles > 30>> +<<if $activeLurcher.muscles > 50>> $He's muscle-bound, without the range of motion to move freely. <<set _LurcherSpeed -= 1>> +<<elseif $activeLurcher.muscles > 30>> + $He's fit, and is able to maintain $his speed quite well once $he reaches it. + <<set _LurcherSpeed += 1>> <<elseif $activeLurcher.muscles <= 5>> $He's soft, and is panting desperately within a few short strides. <<set _LurcherSpeed -= 1>> diff --git a/src/uncategorized/seCustomSlaveDelivery.tw b/src/uncategorized/seCustomSlaveDelivery.tw index dce4df586417e2f17bf743d8636c4b12924d41f9..04fb188991bd5e91cf6441ce49dd3b9bf204ce6d 100644 --- a/src/uncategorized/seCustomSlaveDelivery.tw +++ b/src/uncategorized/seCustomSlaveDelivery.tw @@ -102,7 +102,6 @@ <<set $activeSlaveOneTimeMinAge = 130>> <<set $activeSlaveOneTimeMaxAge = $retirementAge-1>> <</if>> -<<set $ageAdjustOverride = 1>> <<set $one_time_age_overrides_pedo_mode = 1>> <<if $customSlave.nationality != "Nationality is unimportant">> <<set $fixedNationality = $customSlave.nationality>> @@ -111,13 +110,13 @@ <<set $fixedRace = $customSlave.race>> <</if>> <<if $customSlave.sex == 2>> - <<set $activeSlave = GenerateNewSlave("XY")>> + <<set $activeSlave = GenerateNewSlave("XY", {mature: 0})>> <<set $activeSlave.dick = $customSlave.dick>> <<set $activeSlave.balls = $customSlave.balls>> <<set $activeSlave.scrotum = $activeSlave.balls>> <<set $activeSlave.foreskin = $activeSlave.dick>> <<else>> - <<set $activeSlave = GenerateNewSlave("XX")>> + <<set $activeSlave = GenerateNewSlave("XX", {mature: 0})>> <<if $customSlave.virgin == 0>> <<set $activeSlave.vagina = $customSlave.virgin>> <</if>> diff --git a/src/uncategorized/seExpiration.tw b/src/uncategorized/seExpiration.tw index 0f2b17ef42e45099ed099ebc4ba219e6cb3cf519..e21508be2c836400072bdc2dfd0e916deb1dace7 100644 --- a/src/uncategorized/seExpiration.tw +++ b/src/uncategorized/seExpiration.tw @@ -188,7 +188,7 @@ at the moment of $his scheduled emancipation, $he seems willing to consider a sh <<else>> $He makes no effort at all to conceal $his joy at being a free $woman again. <<if $activeSlave.origin == "$He put $himself up as collateral at a poker game, and lost.">> - A bet is a bet, but that was a lonnng year. There's still room for $him in your $mercenariesTitle, but many of them have come to see $him in a new, more... intimate way. As a free $woman, $he'll have to decide if it's worth the risk and the sex to stay here and fight for you who $he loathes... or else take up arms elsewhere in an ever more uncertain world. + A bet is a bet, but that was a lonnng year. There's still room for $him in your $mercenariesTitle, but many of them have come to see $him in a new, more... intimate way. As a free $woman, $he'll have to decide if it's worth the risk and the sex to stay here and fight for you who $he loathes... or else take up arms elsewhere in an ever more uncertain world. <<if $activeSlave.addict > 5>> They'll need to make money fast as they remain addicted to your aphrodisiacs. <</if>> diff --git a/src/uncategorized/seWeddingDouble.tw b/src/uncategorized/seWeddingDouble.tw index 868ace6ab0832432c4d9af0a752e96fe3c6be015..e7ac818551e17a480f986888bd2a43dc23f72db0 100644 --- a/src/uncategorized/seWeddingDouble.tw +++ b/src/uncategorized/seWeddingDouble.tw @@ -64,6 +64,8 @@ <<else>> as close to you as $he could. <</if>> + <<else>> + as close to you as $he could. <</if>> <<elseif _slave1.devotion < -20 && _slave1.trust > 20>> <<if _slave1.relationship == -1>> @@ -325,6 +327,8 @@ <<else>> as close to you as _he2 could. <</if>> + <<else>> + as close to you as $he could. <</if>> <<elseif _slave2.devotion < -20 && _slave2.trust > 20>> <<if _slave2.relationship == -1>> diff --git a/src/uncategorized/seWeddingSingle.tw b/src/uncategorized/seWeddingSingle.tw index c9d5d186894825ec67d4edecb55459ff0afa2e4a..912b3ff277b17f5b7b6a03cb277bb88893e7d284 100644 --- a/src/uncategorized/seWeddingSingle.tw +++ b/src/uncategorized/seWeddingSingle.tw @@ -42,6 +42,8 @@ In the days leading up to your wedding, $slaves[_wedS].slaveName spent $his time <<else>> as close to you as $he could. <</if>> + <<else>> + as close to you as $he could. <</if>> <<elseif $slaves[_wedS].devotion < -20 && $slaves[_wedS].trust > 20>> <<if $slaves[_wedS].relationship == -1>> diff --git a/src/uncategorized/servantsQuarters.tw b/src/uncategorized/servantsQuarters.tw index 225a08f86b512d1da381fb782417d6937e65928d..b49d6d0fb490008c0f0b4719eb242a95b6450663 100644 --- a/src/uncategorized/servantsQuarters.tw +++ b/src/uncategorized/servantsQuarters.tw @@ -81,7 +81,6 @@ </div> <</if>> - </p> <div> diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw index 36dbabd7fce4a0409653aa5edb9706b77648e48c..92a514128c5a1bb83d483443015c623cbbc2b85b 100644 --- a/src/uncategorized/slaveInteract.tw +++ b/src/uncategorized/slaveInteract.tw @@ -66,7 +66,7 @@ [←,Q] </span> <span id="prevSlave" style="font-weight:bold"> - <<link "Prev" "Slave Interact">><<set $slaves[_i] = $activeSlave, $activeSlave = $slaves[_slavesInLine[0]]>><</link>> + <<link "Prev" "Slave Interact">><<set $slaves[_i] = $activeSlave, $activeSlave = getSlave(_slavesInLine[0])>><</link>> </span> <span class='slave-name'> @@ -74,22 +74,24 @@ </span> <span id="nextSlave" style="font-weight:bold"> - <<link "Next" "Slave Interact">><<set $slaves[_i] = $activeSlave, $activeSlave = $slaves[_slavesInLine[1]]>><</link>> + <<link "Next" "Slave Interact">><<set $slaves[_i] = $activeSlave, $activeSlave = getSlave(_slavesInLine[1])>><</link>> </span> <span class="cyan"> [E,→] </span> </p> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Description'), App.UI.replace('#LSD', '_desc')" id="tab Description">Description</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Location')" id="tab Location">Location</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Appearance'), App.UI.Wardrobe.refreshAll(getSlave(V.activeSlave.ID))" id="tab Appearance">Appearance</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'PhysicalRegimen')" id="tab PhysicalRegimen">Physical Regimen</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Rules')" id="tab Rules">Rules</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Financial')" id="tab Financial">Financial</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Customize'), App.UI.SlaveInteract.custom(getSlave(V.activeSlave.ID))" id="tab Customize">Customize</button> -<<if $familyTesting == 1>> - <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'FamilyTab'), renderFamilyTree(V.slaves, V.activeSlave.ID)" id="tab FamilyTab">Family</button> -<</if>> +<div class="tabbar"> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Description'), App.UI.replace('#LSD', '_desc')" id="tab Description">Description</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Location')" id="tab Location">Location</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Appearance'), App.UI.Wardrobe.refreshAll(getSlave(V.activeSlave.ID))" id="tab Appearance">Appearance</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'PhysicalRegimen')" id="tab PhysicalRegimen">Physical Regimen</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Rules')" id="tab Rules">Rules</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Financial')" id="tab Financial">Financial</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Customize'), App.UI.SlaveInteract.custom(getSlave(V.activeSlave.ID))" id="tab Customize">Customize</button> + <<if $familyTesting == 1>> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'FamilyTab'), renderFamilyTree(V.slaves, V.activeSlave.ID)" id="tab FamilyTab">Family</button> + <</if>> +</div> <div id="artFrame"> <<if $seeImages == 1 && $eventDescription != 1>> @@ -226,8 +228,6 @@ <div id="Appearance" class="tabcontent"> <div class="content"> <p> - <h3>Appearance</h3> - <span id="clothes"></span> /*<script>App.UI.Wardrobe.clothes(getSlave(V.activeSlave.ID))</script>*/ @@ -283,112 +283,113 @@ <div id="PhysicalRegimen" class="tabcontent"> <div class="content"> - <h3>Physical Regimen</h3> - <span id="drugs"></span> - <script>App.UI.SlaveInteract.drugs(getSlave(V.activeSlave.ID))</script> + <p> + <span id="drugs"></span> + <script>App.UI.SlaveInteract.drugs(getSlave(V.activeSlave.ID))</script> - <span id="curatives"></span> - <script>App.UI.SlaveInteract.curatives(getSlave(V.activeSlave.ID))</script> + <span id="curatives"></span> + <script>App.UI.SlaveInteract.curatives(getSlave(V.activeSlave.ID))</script> - <span id="aphrodisiacs"></span> - <script>App.UI.SlaveInteract.aphrodisiacs(getSlave(V.activeSlave.ID))</script> + <span id="aphrodisiacs"></span> + <script>App.UI.SlaveInteract.aphrodisiacs(getSlave(V.activeSlave.ID))</script> - <span id="fertilityblock"></span> - <script>App.UI.SlaveInteract.fertility(getSlave(V.activeSlave.ID))</script> + <span id="fertilityblock"></span> + <script>App.UI.SlaveInteract.fertility(getSlave(V.activeSlave.ID))</script> - <span id="incubator"></span> - <script>App.UI.SlaveInteract.incubator(getSlave(V.activeSlave.ID))</script> + <span id="incubator"></span> + <script>App.UI.SlaveInteract.incubator(getSlave(V.activeSlave.ID))</script> - <span id="nursery"></span> - <script>App.UI.SlaveInteract.nursery(getSlave(V.activeSlave.ID))</script> + <span id="nursery"></span> + <script>App.UI.SlaveInteract.nursery(getSlave(V.activeSlave.ID))</script> - <<if $propOutcome == 1 && $arcologies[0].FSRestart != "unset">> - <<if $slaves[_i].breedingMark == 0 && $slaves[_i].fuckdoll == 0 && $slaves[_i].eggType == "human" && isFertile($slaves[_i]) && $slaves[_i].preg == 0>> - <br> - [[Breeder Eligibility Exam|BreedingTest]] + <<if $propOutcome == 1 && $arcologies[0].FSRestart != "unset">> + <<if $slaves[_i].breedingMark == 0 && $slaves[_i].fuckdoll == 0 && $slaves[_i].eggType == "human" && isFertile($slaves[_i]) && $slaves[_i].preg == 0>> + <br> + [[Breeder Eligibility Exam|BreedingTest]] + <</if>> <</if>> - <</if>> - <span id="bloating"></span> - <script>App.UI.SlaveInteract.bloating(getSlave(V.activeSlave.ID))</script> + <span id="bloating"></span> + <script>App.UI.SlaveInteract.bloating(getSlave(V.activeSlave.ID))</script> - Hormones: <strong><span id="hormones"> - <<if $slaves[_i].hormones == -2>>intensive male<<elseif $slaves[_i].hormones == -1>>male<<elseif $slaves[_i].hormones == 2>>intensive female<<elseif $slaves[_i].hormones == 1>>female<<else>>none<</if>></span></strong>. - <<if $slaves[_i].indentureRestrictions < 2>> - <<link "Intensive Female">><<set $slaves[_i].hormones = 2>><<replace "#hormones">>intensive female<</replace>><</link>> | - <</if>> - <<link "Female">><<set $slaves[_i].hormones = 1>><<replace "#hormones">>female<</replace>><</link>> | - <<link "None">><<set $slaves[_i].hormones = 0>><<replace "#hormones">>none<</replace>><</link>> | - <<link "Male">><<set $slaves[_i].hormones = -1>><<replace "#hormones">>male<</replace>><</link>> | - <<if $slaves[_i].indentureRestrictions < 2>> - <<link "Intensive Male">><<set $slaves[_i].hormones = -2>><<replace "#hormones">>intensive male<</replace>><</link>> - <</if>> + Hormones: <strong><span id="hormones"> + <<if $slaves[_i].hormones == -2>>intensive male<<elseif $slaves[_i].hormones == -1>>male<<elseif $slaves[_i].hormones == 2>>intensive female<<elseif $slaves[_i].hormones == 1>>female<<else>>none<</if>></span></strong>. + <<if $slaves[_i].indentureRestrictions < 2>> + <<link "Intensive Female">><<set $slaves[_i].hormones = 2>><<replace "#hormones">>intensive female<</replace>><</link>> | + <</if>> + <<link "Female">><<set $slaves[_i].hormones = 1>><<replace "#hormones">>female<</replace>><</link>> | + <<link "None">><<set $slaves[_i].hormones = 0>><<replace "#hormones">>none<</replace>><</link>> | + <<link "Male">><<set $slaves[_i].hormones = -1>><<replace "#hormones">>male<</replace>><</link>> | + <<if $slaves[_i].indentureRestrictions < 2>> + <<link "Intensive Male">><<set $slaves[_i].hormones = -2>><<replace "#hormones">>intensive male<</replace>><</link>> + <</if>> - <br>Diet: <strong><span id="diet">$slaves[_i].diet</span></strong>. - <<link "Healthy">><<set $slaves[_i].diet = "healthy">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> - <<if ($slaves[_i].health.condition < 90 || $slaves[_i].chem >= 10) && ($dietCleanse == 1)>> - | <<link "Cleanse">><<set $slaves[_i].diet = "cleansing">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> - <<elseif ($dietCleanse == 1)>> - | //$He is already healthy// - <</if>> - <<if ($slaves[_i].balls > 0) && ($cumProDiet == 1)>> - | <<link "Cum production">><<set $slaves[_i].diet = "cum production">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> - <</if>> - <<if isFertile($slaves[_i]) && $slaves[_i].preg == 0 && ($dietFertility == 1)>> - | <<link "Fertility">><<set $slaves[_i].diet = "fertility">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> - <</if>> - <<if ($slaves[_i].weight >= -95)>> - | <<link "Lose weight">><<set $slaves[_i].diet = "restricted">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> - <<else>> - | //$He is already underweight// - <</if>> - <<if $slaves[_i].weight <= 200>> - | <<link "Fatten">><<set $slaves[_i].diet = "fattening">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> - <<else>> - | //$He is already extremely overweight// - <</if>> - <<if $feeder == 1>> - <<if $slaves[_i].fuckdoll == 0 && $slaves[_i].fetish != "mindbroken">> - <<if ($slaves[_i].weight > 10 || $slaves[_i].weight < -10)>> - | <<link "Correct weight">><<set $slaves[_i].diet = "corrective">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> - <<else>> - //$He is already a healthy weight// + <br>Diet: <strong><span id="diet">$slaves[_i].diet</span></strong>. + <<link "Healthy">><<set $slaves[_i].diet = "healthy">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> + <<if ($slaves[_i].health.condition < 90 || $slaves[_i].chem >= 10) && ($dietCleanse == 1)>> + | <<link "Cleanse">><<set $slaves[_i].diet = "cleansing">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> + <<elseif ($dietCleanse == 1)>> + | //$He is already healthy// + <</if>> + <<if ($slaves[_i].balls > 0) && ($cumProDiet == 1)>> + | <<link "Cum production">><<set $slaves[_i].diet = "cum production">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> + <</if>> + <<if isFertile($slaves[_i]) && $slaves[_i].preg == 0 && ($dietFertility == 1)>> + | <<link "Fertility">><<set $slaves[_i].diet = "fertility">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> + <</if>> + <<if ($slaves[_i].weight >= -95)>> + | <<link "Lose weight">><<set $slaves[_i].diet = "restricted">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> + <<else>> + | //$He is already underweight// + <</if>> + <<if $slaves[_i].weight <= 200>> + | <<link "Fatten">><<set $slaves[_i].diet = "fattening">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> + <<else>> + | //$He is already extremely overweight// + <</if>> + <<if $feeder == 1>> + <<if $slaves[_i].fuckdoll == 0 && $slaves[_i].fetish != "mindbroken">> + <<if ($slaves[_i].weight > 10 || $slaves[_i].weight < -10)>> + | <<link "Correct weight">><<set $slaves[_i].diet = "corrective">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> + <<else>> + //$He is already a healthy weight// + <</if>> + <</if>> + | <<link "Estrogen enriched">><<set $slaves[_i].diet = "XX">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> + | <<link "Testosterone enriched">><<set $slaves[_i].diet = "XY">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> + <<if $dietXXY == 1 && $slaves[_i].balls > 0 && ($slaves[_i].ovaries == 1 || $slaves[_i].mpreg == 1)>> + | <<link "Herm hormone blend">><<set $slaves[_i].diet = "XXY">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> <</if>> <</if>> - | <<link "Estrogen enriched">><<set $slaves[_i].diet = "XX">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> - | <<link "Testosterone enriched">><<set $slaves[_i].diet = "XY">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> - <<if $dietXXY == 1 && $slaves[_i].balls > 0 && ($slaves[_i].ovaries == 1 || $slaves[_i].mpreg == 1)>> - | <<link "Herm hormone blend">><<set $slaves[_i].diet = "XXY">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> + <<if ($slaves[_i].muscles <= 95) && !isAmputee($slaves[_i])>> + | <<link "Build muscle">><<set $slaves[_i].diet = "muscle building">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> + <<elseif !isAmputee($slaves[_i])>> + | //$He is maintaining $his enormous musculature// + <<else>> + | //$He has no limbs and thus can't effectively build muscle// + <</if>> + <<if ($slaves[_i].muscles > 5 || $slaves[_i].fuckdoll == 0) && canWalk($slaves[_i])>> + | <<link "Slim down">><<set $slaves[_i].diet = "slimming">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> + <<elseif !canWalk($slaves[_i])>> + | //$He can't move and thus can't trim down// + <<elseif $slaves[_i].fuckdoll > 0>> + | //$He has no muscles left to lose// <</if>> - <</if>> - <<if ($slaves[_i].muscles <= 95) && !isAmputee($slaves[_i])>> - | <<link "Build muscle">><<set $slaves[_i].diet = "muscle building">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> - <<elseif !isAmputee($slaves[_i])>> - | //$He is maintaining $his enormous musculature// - <<else>> - | //$He has no limbs and thus can't effectively build muscle// - <</if>> - <<if ($slaves[_i].muscles > 5 || $slaves[_i].fuckdoll == 0) && canWalk($slaves[_i])>> - | <<link "Slim down">><<set $slaves[_i].diet = "slimming">><<replace "#diet">>$slaves[_i].diet<</replace>><</link>> - <<elseif !canWalk($slaves[_i])>> - | //$He can't move and thus can't trim down// - <<elseif $slaves[_i].fuckdoll > 0>> - | //$He has no muscles left to lose// - <</if>> - <br>Diet Base: <strong><span id="dietBase"><<if $slaves[_i].dietCum == 2>>cum based<<elseif ($slaves[_i].dietCum == 1) && ($slaves[_i].dietMilk == 0)>>cum added<<elseif ($slaves[_i].dietCum == 1) && ($slaves[_i].dietMilk == 1)>>cum and milk added<<elseif ($slaves[_i].dietMilk == 1) && ($slaves[_i].dietCum == 0)>>milk added<<elseif ($slaves[_i].dietMilk == 2)>>milk based<<elseif ($slaves[_i].dietCum == 0) && ($slaves[_i].dietMilk == 0)>>normal<<else>>THERE HAS BEEN AN ERROR<</if>></span></strong>. - <<link "Normal">><<set $slaves[_i].dietCum = 0>><<set $slaves[_i].dietMilk = 0>><<replace "#dietBase">>normal<</replace>><</link>> | - <<link "Cum added">><<set $slaves[_i].dietCum = 1>><<set $slaves[_i].dietMilk = 0>><<replace "#dietBase">>cum added<</replace>><</link>> | - <<link "Milk added">><<set $slaves[_i].dietCum = 0>><<set $slaves[_i].dietMilk = 1>><<replace "#dietBase">>milk added<</replace>><</link>> | - <<link "Cum & milk added">><<set $slaves[_i].dietCum = 1>><<set $slaves[_i].dietMilk = 1>><<replace "#dietBase">>cum & milk added<</replace>><</link>> | - <<link "Cum based">><<set $slaves[_i].dietCum = 2>><<set $slaves[_i].dietMilk = 0>><<replace "#dietBase">>cum based<</replace>><</link>> | - <<link "Milk based">><<set $slaves[_i].dietCum = 0>><<set $slaves[_i].dietMilk = 2>><<replace "#dietBase">>milk based<</replace>><</link>> - - <<if $arcologies[0].FSHedonisticDecadenceResearch == 1>> - <br>Solid Slave Food Access: <strong><span id="snacks"><<if $slaves[_i].onDiet == 0>>Free to stuff $himself.<<else>>On a strict diet.<</if>></span></strong> - <<link "No access">><<set $slaves[_i].onDiet = 1>><<replace "#snacks">>On a strict diet.<</replace>><</link>> | - <<link "Full access">><<set $slaves[_i].onDiet = 0>><<replace "#snacks">>Free to stuff $himself.<</replace>><</link>> - <</if>> + <br>Diet Base: <strong><span id="dietBase"><<if $slaves[_i].dietCum == 2>>cum based<<elseif ($slaves[_i].dietCum == 1) && ($slaves[_i].dietMilk == 0)>>cum added<<elseif ($slaves[_i].dietCum == 1) && ($slaves[_i].dietMilk == 1)>>cum and milk added<<elseif ($slaves[_i].dietMilk == 1) && ($slaves[_i].dietCum == 0)>>milk added<<elseif ($slaves[_i].dietMilk == 2)>>milk based<<elseif ($slaves[_i].dietCum == 0) && ($slaves[_i].dietMilk == 0)>>normal<<else>>THERE HAS BEEN AN ERROR<</if>></span></strong>. + <<link "Normal">><<set $slaves[_i].dietCum = 0>><<set $slaves[_i].dietMilk = 0>><<replace "#dietBase">>normal<</replace>><</link>> | + <<link "Cum added">><<set $slaves[_i].dietCum = 1>><<set $slaves[_i].dietMilk = 0>><<replace "#dietBase">>cum added<</replace>><</link>> | + <<link "Milk added">><<set $slaves[_i].dietCum = 0>><<set $slaves[_i].dietMilk = 1>><<replace "#dietBase">>milk added<</replace>><</link>> | + <<link "Cum & milk added">><<set $slaves[_i].dietCum = 1>><<set $slaves[_i].dietMilk = 1>><<replace "#dietBase">>cum & milk added<</replace>><</link>> | + <<link "Cum based">><<set $slaves[_i].dietCum = 2>><<set $slaves[_i].dietMilk = 0>><<replace "#dietBase">>cum based<</replace>><</link>> | + <<link "Milk based">><<set $slaves[_i].dietCum = 0>><<set $slaves[_i].dietMilk = 2>><<replace "#dietBase">>milk based<</replace>><</link>> + + <<if $arcologies[0].FSHedonisticDecadenceResearch == 1>> + <br>Solid Slave Food Access: <strong><span id="snacks"><<if $slaves[_i].onDiet == 0>>Free to stuff $himself.<<else>>On a strict diet.<</if>></span></strong> + <<link "No access">><<set $slaves[_i].onDiet = 1>><<replace "#snacks">>On a strict diet.<</replace>><</link>> | + <<link "Full access">><<set $slaves[_i].onDiet = 0>><<replace "#snacks">>Free to stuff $himself.<</replace>><</link>> + <</if>> + </p> </div> </div> @@ -473,6 +474,17 @@ <<link "Orgasm">><<set $slaves[_i].rules.reward = "orgasm">><<replace "#standardReward">>$slaves[_i].rules.reward<</replace>><</link>> | <<link "Situational">><<set $slaves[_i].rules.reward = "situational">><<replace "#standardReward">>$slaves[_i].rules.reward<</replace>><</link>> + /* + <<if ["be a servant", "get milked", "please you", "serve in the club", "serve in the master suite", "serve the public", "whore", "work as a farmhand", "work in the brothel", "work in the dairy", "work a glory hole"].includes($activeSlave.assignment)>> + <br>Sleep Rules: ''<span id="restRules">$slaves[_i].rules.rest</span>.'' + <<link "None">><<set $slaves[_i].rules.rest = "none">><<replace "#restRules">>$slaves[_i].rules.rest<</replace>><</link>> | + <<link "Cruel">><<set $slaves[_i].rules.rest = "cruel">><<replace "#restRules">>$slaves[_i].rules.rest<</replace>><</link>> | + <<link "Restrictive">><<set $slaves[_i].rules.rest = "restrictive">><<replace "#restRules">>$slaves[_i].rules.rest<</replace>><</link>> | + <<link "Permissive">><<set $slaves[_i].rules.rest = "permissive">><<replace "#restRules">>$slaves[_i].rules.rest<</replace>><</link>> | + <<link "Mandatory">><<set $slaves[_i].rules.rest = "mandatory">><<replace "#restRules">>$slaves[_i].rules.rest<</replace>><</link>> + <</if>> + */ + <<if setup.facilityHeads.includes($slaves[_i].assignment)>> <<if $slaves[_i].lactation != 2>> <br>Lactation maintenance for facility heads: ''<span id="lactationRules">$slaves[_i].rules.lactation</span>.'' @@ -513,6 +525,21 @@ <<link "Grant">><<set $slaves[_i].rules.release.master = 1>><<replace "#relMaster">>granted<</replace>><</link>> | <<link "Deny">><<set $slaves[_i].rules.release.master = 0>><<replace "#relMaster">>denied<</replace>><</link>> </div> + + <<if $slaves[_i].voice != 0>> + <br>Speech rules: ''<span id="speechRules">$slaves[_i].rules.speech</span>.'' + <<link "Restrictive">><<set $slaves[_i].rules.speech = "restrictive">><<replace "#speechRules">>$slaves[_i].rules.speech<</replace>><</link>> | + <<link "Permissive">><<set $slaves[_i].rules.speech = "permissive">><<replace "#speechRules">>$slaves[_i].rules.speech<</replace>><</link>> + <<if $slaves[_i].accent > 0 && $slaves[_i].accent < 4>>| <<link "Accent elimination">><<set $slaves[_i].rules.speech = "accent elimination">><<replace "#speechRules">>$slaves[_i].rules.speech<</replace>><</link>> + <<elseif $slaves[_i].accent > 3>>| <<link "Language lessons">><<set $slaves[_i].rules.speech = "language lessons">><<replace "#speechRules">>$slaves[_i].rules.speech<</replace>><</link>> + <</if>> + <</if>> + + <br> + Relationship rules: ''<span id="relationshipRules">$slaves[_i].rules.relationship</span>.'' + <<link "Restrictive">><<set $slaves[_i].rules.relationship = "restrictive">><<replace "#relationshipRules">>$slaves[_i].rules.relationship<</replace>><</link>> | + <<link "Just friends">><<set $slaves[_i].rules.relationship = "just friends">><<replace "#relationshipRules">>$slaves[_i].rules.relationship<</replace>><</link>> | + <<link "Permissive">><<set $slaves[_i].rules.relationship = "permissive">><<replace "#relationshipRules">>$slaves[_i].rules.relationship<</replace>><</link>> <</if>> <<if $slaves[_i].clitPiercing == 3 || $slaves[_i].vaginalAccessory == "smart bullet vibrator">> @@ -547,21 +574,6 @@ | <<link "No sex">><<set $slaves[_i].clitSetting = "none">><<replace "#setting">>$slaves[_i].clitSetting<</replace>><</link>> </div> <</if>> - - <<if $slaves[_i].voice != 0>> - <br>Speech rules: ''<span id="speechRules">$slaves[_i].rules.speech</span>.'' - <<link "Restrictive">><<set $slaves[_i].rules.speech = "restrictive">><<replace "#speechRules">>$slaves[_i].rules.speech<</replace>><</link>> | - <<link "Permissive">><<set $slaves[_i].rules.speech = "permissive">><<replace "#speechRules">>$slaves[_i].rules.speech<</replace>><</link>> - <<if $slaves[_i].accent > 0 && $slaves[_i].accent < 4>>| <<link "Accent elimination">><<set $slaves[_i].rules.speech = "accent elimination">><<replace "#speechRules">>$slaves[_i].rules.speech<</replace>><</link>> - <<elseif $slaves[_i].accent > 3>>| <<link "Language lessons">><<set $slaves[_i].rules.speech = "language lessons">><<replace "#speechRules">>$slaves[_i].rules.speech<</replace>><</link>> - <</if>> - <</if>> - - <br> - Relationship rules: ''<span id="relationshipRules">$slaves[_i].rules.relationship</span>.'' - <<link "Restrictive">><<set $slaves[_i].rules.relationship = "restrictive">><<replace "#relationshipRules">>$slaves[_i].rules.relationship<</replace>><</link>> | - <<link "Just friends">><<set $slaves[_i].rules.relationship = "just friends">><<replace "#relationshipRules">>$slaves[_i].rules.relationship<</replace>><</link>> | - <<link "Permissive">><<set $slaves[_i].rules.relationship = "permissive">><<replace "#relationshipRules">>$slaves[_i].rules.relationship<</replace>><</link>> </div> </div> @@ -680,4 +692,4 @@ </p> <</if>> </div> -</div> \ No newline at end of file +</div> diff --git a/src/uncategorized/slaveMarkets.tw b/src/uncategorized/slaveMarkets.tw index 219e66cc40a73d5316a0b1c80cad05cd5f092fa7..35a819ff6c06f54b2959b966e62068e56abe30bd 100644 --- a/src/uncategorized/slaveMarkets.tw +++ b/src/uncategorized/slaveMarkets.tw @@ -171,7 +171,9 @@ You visit the slave markets off the arcology plaza. It's always preferable to ex <</switch>> -<<= generateMarketSlave($slaveMarket, ($numArcology || 1))>> +<<set _marketResult = generateMarketSlave($slaveMarket, ($numArcology || 1))>> +<<set $activeSlave = _marketResult.slave>> +<<print _marketResult.text>> <br><br> diff --git a/src/uncategorized/stClaverPreparatory.tw b/src/uncategorized/stClaverPreparatory.tw index d2431778c1260f2dd086a434a67a319c5182be66..d573b2a1cff278be7db7221055aac6e26349b2ae 100644 --- a/src/uncategorized/stClaverPreparatory.tw +++ b/src/uncategorized/stClaverPreparatory.tw @@ -1,17 +1,19 @@ :: St. Claver Preparatory [nobr] -<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools">> +<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools", $slaveMarket = "SCP">> /* Multi-Purchase Support */ <<if ndef $newSlaves>><<set $newSlaves = []>><</if>> <<if $newSlaves.length > 0>> - <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $slaveMarket = "SCP", $returnTo = "Main", $newSlaveIndex = 0>> + <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $returnTo = "Main", $newSlaveIndex = 0>> <</if>> //St. Claver Preparatory is an old world preparatory school that was purchased by an old world medical school adapting to the demand for plastic surgeons from the Free Cities. It functions as a standard slave school until its students near graduation. At that point they are paired with a budding plastic surgeon. Intensive, flawless, and of course successful surgical modification of the student is required to complete certification as a Free Cities plastic surgeon of the top rank. All St. Claver's graduates are modified to a single exacting standard. Meanwhile, the slave school is free to train its students for obedience and sexual conformity. <<if $SCP.schoolUpgrade != 0>><br><br>You have endowed <<if $SCP.schoolUpgrade == 1>>thorough use of mental suppressants that reliably produce total devotion at the price of total stupidity.<<else>>diversification of the school's approach into general slave training that produces graduates with basic skills.<</if>> As a major <<if $PC.title == 0>>benefactrix<<else>>benefactor<</if>> of the institution, you also receive a discount on them.<</if>>// <br><br>St. Claver Preparatory offers a fresh graduate for inspection via video call. The interview takes place in a very obviously medical office, with medical supply robots wheeling past its glass walls and nurses hurrying to and fro. -<<= generateMarketSlave("SCP")>> +<<set _marketResult = generateMarketSlave("SCP")>> +<<set $activeSlave = _marketResult.slave>> +<<print _marketResult.text>> <<set _slaveCost = slaveCost($activeSlave)>> <<if $SCP.schoolSale != 0>> <<set _slaveCost = Math.trunc(_slaveCost*0.5)>> diff --git a/src/uncategorized/surgeryDegradation.tw b/src/uncategorized/surgeryDegradation.tw index 2a4583232f934facd0362a8fc995dfbbe73eb72d..f83d91f1d75216b71228b501532a65a48eda3396 100644 --- a/src/uncategorized/surgeryDegradation.tw +++ b/src/uncategorized/surgeryDegradation.tw @@ -10,7 +10,7 @@ /* disallow surgery for slaves on certain assignments */ <<switch getSlave($AS).assignment>> <<case "be your agent" "live with your agent">> - @@.red;You must retrieve getSlave($AS).slaveName from $his assignment before performing surgery on $him.@@ + @@.red;You must retrieve <<= getSlave($AS).slaveName>> from $his assignment before performing surgery on $him.@@ <<goto $nextLink>> <</switch>> @@ -128,8 +128,7 @@ As the remote surgery's long recovery cycle completes, <<switch $surgeryType>> <<case "fuckdoll">> - <<run generatePronouns(getSlave($AS))>> - <<setLocalPronouns getSlave($AS)>> + <<run App.Utils.setLocalPronouns(getSlave($AS))>> <<if $familyTesting == 1>> <<set _rels = $slaves.filter((s) => areRelated(s, getSlave($AS)) && !(s.ID === getSlave($AS).relationshipTarget))>> <<for _rel range _rels>> @@ -155,7 +154,7 @@ As the remote surgery's long recovery cycle completes, <<set $j = $slaveIndices[getSlave($AS).relationTarget]>> <<if def $j>> <<setLocalPronouns $slaves[$j] 2>> - $slaves[$j].slaveName will be @@.mediumorchid;horrified@@ and @@.gold;afraid@@ when _he2 finds out that _his2 getSlave($AS).relation is now a Fuckdoll. + $slaves[$j].slaveName will be @@.mediumorchid;horrified@@ and @@.gold;afraid@@ when _he2 finds out that _his2 <<= getSlave($AS).relation>> is now a Fuckdoll. <<set $slaves[$j].devotion -= 40>> <<set $slaves[$j].trust -= 40>> <</if>> @@ -179,18 +178,18 @@ As the remote surgery's long recovery cycle completes, <<set $j = $slaveIndices[getSlave($AS).rivalryTarget]>> <<if def $j>> <<setLocalPronouns $slaves[$j] 2>> - Naturally, $his rivalry with $slaves[$j].slaveName is over. $slaves[$j].slaveName will be pleased _he2 doesn't have to see getSlave($AS).slaveName any more, though being a Fuckdoll is terrifying enough that it's not likely _he2'll derive much satisfaction from it. + Naturally, $his rivalry with $slaves[$j].slaveName is over. $slaves[$j].slaveName will be pleased _he2 doesn't have to see <<= getSlave($AS).slaveName>> any more, though being a Fuckdoll is terrifying enough that it's not likely _he2'll derive much satisfaction from it. <<set $slaves[$j].rivalry = 0>> <<set $slaves[$j].rivalryTarget = 0>> <</if>> <</if>> <<set getSlave($AS).relationship=0, getSlave($AS).relationshipTarget=0, getSlave($AS).rivalry=0, getSlave($AS).rivalryTarget=0>> - <br><br>The Fuckdoll suit's systems connect to the arcology and run a full systems check. The reports waterfall down the nearest wallscreen, moving from the top of the Fuckdoll down. The simple brain activity sensor is showing elevated readings as getSlave($AS).slaveName desperately tries to find $his bearings. + <br><br>The Fuckdoll suit's systems connect to the arcology and run a full systems check. The reports waterfall down the nearest wallscreen, moving from the top of the Fuckdoll down. The simple brain activity sensor is showing elevated readings as <<= getSlave($AS).slaveName>> desperately tries to find $his bearings. <<if getSlave($AS).hLength > 20>>The twin tails of hair sticking out of the suit material that covers $his scalp are waving from side to side slightly as $he struggles.<</if>> <<if getBestVision(getSlave($AS)) > 0>>The suit does not have holes for vision, worsening the disorientation.<</if>> <<if getSlave($AS).voice == 0>>$His breath rushes in and<<else>>Incoherent moans are coming<</if>> out of $his <<if getSlave($AS).lips > 95>>facepussy<<else>>mouth insert<</if>>. - The suit can stimulate every intimate area that it covers with vibration, electrostimulation, warmth, and cold, and getSlave($AS).slaveName must be in agony as it tests these systems. + The suit can stimulate every intimate area that it covers with vibration, electrostimulation, warmth, and cold, and <<= getSlave($AS).slaveName>> must be in agony as it tests these systems. <br><br>The suit includes a network of small tubes filled with hydraulic fluid, and tiny pumps to move it around. This is necessary to keep the Fuckdoll's internal temperature stable, but it can also be used to restrict $his movements. The suit is doing so now; the Fuckdoll is desperately attempting to move, but the suit won't let $him. <<if hasAnyProstheticLimbs(getSlave($AS))>> @@ -217,8 +216,7 @@ As the remote surgery's long recovery cycle completes, The Fuckdoll continues to struggle. Since $he is new, $he is not yet able to obey the tonal command system the suit uses to transfer orders to its inhabitant, who cannot otherwise hear. $He will have to learn by painful experience, and eventually, that is all $he will know. <<case "fuckdollExtraction">> - <<run generatePronouns(getSlave($AS))>> - <<setLocalPronouns getSlave($AS)>> + <<run App.Utils.setLocalPronouns(getSlave($AS))>> If you were expecting a great return to humanity after extracting $him from $his Fuckdoll suit, you're to be disappointed. <<if getBestVision(getSlave($AS)) > 0>> You're denied any reaction from $him to the sight of $himself in the mirror outside the recovery area, as $he's wearing a pair of very dark glasses $he'll have to keep on for a few hours yet. $He's been denied almost all vision for a long time, and though $his recovery included light therapy, $he's still very sensitive to it. @@ -493,13 +491,13 @@ As the remote surgery's long recovery cycle completes, <<if getSlave($AS).fetish == "mindbroken">> $He shows little reaction to $his new head ornamentation. As with all invasive surgery @@.red;$his health has been affected.@@ <<elseif (getSlave($AS).devotion > 20)>> - <<if canSee(getSlave($AS))>>$He looks in the mirror and turns $his head side to side admiring $his new getSlave($AS).hornColor getSlave($AS).horn, <<else>>$He can't see but it's clear from the dull ache that something has been done to $his head, <</if>><<if hasAnyArms(getSlave($AS))>>the base is still a bit sore, but $he reaches up to feel their shape,<</if>> $he turns to you with a smile, tilting $his head at various angles to show them off. $He seems to think $his new horns are @@.hotpink;cute.@@ As with all invasive surgery @@.red;$his health has been affected.@@ + <<if canSee(getSlave($AS))>>$He looks in the mirror and turns $his head side to side admiring $his new <<= getSlave($AS).hornColor>> <<= getSlave($AS).horn>>, <<else>>$He can't see but it's clear from the dull ache that something has been done to $his head, <</if>><<if hasAnyArms(getSlave($AS))>>the base is still a bit sore, but $he reaches up to feel their shape,<</if>> $he turns to you with a smile, tilting $his head at various angles to show them off. $He seems to think $his new horns are @@.hotpink;cute.@@ As with all invasive surgery @@.red;$his health has been affected.@@ <<set getSlave($AS).devotion += 4>> <<elseif (getSlave($AS).devotion >= -20)>> - <<if canSee(getSlave($AS))>>$He eyes $his new getSlave($AS).hornColor getSlave($AS).horn disapprovingly<<else>>$He can't see but it's clear from the dull ache that something has been done to $his head, <</if>><<if hasAnyArms(getSlave($AS))>>the base is still a bit sore, but $he reaches up to tug on them gently,<</if>>$He's come to terms with the fact that $he's a slave, so $he isn't much affected mentally despite the surprise of having horns attached to $his head. As with all invasive surgery @@.red;$his health has been affected.@@ $He is @@.gold;sensibly fearful@@ of your total power over $his body. + <<if canSee(getSlave($AS))>>$He eyes $his new <<= getSlave($AS).hornColor>> <<= getSlave($AS).horn>> disapprovingly<<else>>$He can't see but it's clear from the dull ache that something has been done to $his head, <</if>><<if hasAnyArms(getSlave($AS))>>the base is still a bit sore, but $he reaches up to tug on them gently,<</if>>$He's come to terms with the fact that $he's a slave, so $he isn't much affected mentally despite the surprise of having horns attached to $his head. As with all invasive surgery @@.red;$his health has been affected.@@ $He is @@.gold;sensibly fearful@@ of your total power over $his body. <<set getSlave($AS).trust -= 5>> <<else>> - <<if canSee(getSlave($AS))>>$He eyes $his new getSlave($AS).hornColor getSlave($AS).horn with disgust.<<else>>$He can't see but it's clear from the dull ache that something has been done to $his head, and probably not for the better, <</if>><<if hasAnyArms(getSlave($AS))>>the base is still a bit sore, but $he reaches up to tug on them, as if to confirm it's not some trick.<</if>> For now, @@.mediumorchid;$he seems to view $his head ornamentation as a cruel imposition.@@ As with all invasive surgery @@.red;$his health has been affected.@@ $He is now @@.gold;terribly afraid@@ of your total power over $his body. + <<if canSee(getSlave($AS))>>$He eyes $his new <<= getSlave($AS).hornColor>> <<= getSlave($AS).horn>> with disgust.<<else>>$He can't see but it's clear from the dull ache that something has been done to $his head, and probably not for the better, <</if>><<if hasAnyArms(getSlave($AS))>>the base is still a bit sore, but $he reaches up to tug on them, as if to confirm it's not some trick.<</if>> For now, @@.mediumorchid;$he seems to view $his head ornamentation as a cruel imposition.@@ As with all invasive surgery @@.red;$his health has been affected.@@ $He is now @@.gold;terribly afraid@@ of your total power over $his body. <<set getSlave($AS).trust -= 10, getSlave($AS).devotion -= 5>> <</if>> @@ -972,7 +970,7 @@ As the remote surgery's long recovery cycle completes, <<if getSlave($AS).fetish != "mindbroken" && getSlave($AS).fuckdoll == 0>> When $he exits the room, $he feels that $his face is numb, <<if getSlave($AS).ID == $Bodyguard.ID>> - and upon <<if canSee(getSlave($AS))>>throwing a glance at the mirror<<else>>being informed of $his new scar<</if>>, $he frightens $himself, but is @@.hotpink;happier@@ with $his new look and @@.mediumaquamarine;more confident@@ that $he's the girl for the job. + and upon <<if canSee(getSlave($AS))>>throwing a glance at the mirror<<else>>being informed of $his new scar<</if>>, $he frightens $himself, but is @@.hotpink;happier@@ with $his new look and @@.mediumaquamarine;more confident@@ that $he's the $girl for the job. <<set getSlave($AS).devotion += 5>> <<set getSlave($AS).trust += 5>> <<elseif getSlave($AS).devotion > 20>> diff --git a/src/uncategorized/theFutanariSisters.tw b/src/uncategorized/theFutanariSisters.tw index 096b4e634d9e043aa3cccbced83dfff3deda3deb..6d2db7c81a8cf294f1d17d697c0de64ecf194583 100644 --- a/src/uncategorized/theFutanariSisters.tw +++ b/src/uncategorized/theFutanariSisters.tw @@ -1,10 +1,10 @@ :: The Futanari Sisters [nobr] -<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools">> +<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools", $slaveMarket = "TFS">> /* Multi-Purchase Support */ <<if ndef $newSlaves>><<set $newSlaves = []>><</if>> <<if $newSlaves.length > 0>> - <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $slaveMarket = "TFS", $returnTo = "Main", $newSlaveIndex = 0>> + <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $returnTo = "Main", $newSlaveIndex = 0>> <</if>> <<if $TFS.schoolPresent == 1>> @@ -132,7 +132,9 @@ The Sisters offer a member selected for sale into slavery for inspection via vid <br><br> -<<= generateMarketSlave("TFS")>> +<<set _marketResult = generateMarketSlave("TFS")>> +<<set $activeSlave = _marketResult.slave>> +<<print _marketResult.text>> <<set _slaveCost = slaveCost($activeSlave)>> <<set _slaveCost = Math.trunc(_slaveCost*0.8)>> <<if $TFS.schoolSale != 0>> diff --git a/src/uncategorized/theGymnasiumAcademy.tw b/src/uncategorized/theGymnasiumAcademy.tw index 6a8926ece9ed83898f51cf9502f2894a70787a7e..8a5e85e48d99f667daaf4bf28006427bd858cce0 100644 --- a/src/uncategorized/theGymnasiumAcademy.tw +++ b/src/uncategorized/theGymnasiumAcademy.tw @@ -1,17 +1,19 @@ :: The Gymnasium-Academy [nobr] -<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools">> +<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools", $slaveMarket = "TGA">> /* Multi-Purchase Support */ <<if ndef $newSlaves>><<set $newSlaves = []>><</if>> <<if $newSlaves.length > 0>> - <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $slaveMarket = "TGA", $returnTo = "Main", $newSlaveIndex = 0>> + <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $returnTo = "Main", $newSlaveIndex = 0>> <</if>> //The Gymnasium-Academy is a very unusual slave school. It sits at a bizarre juncture of the evolving gender roles and slave roles in the Free Cities. Its graduates are exclusively born male, and are not surgically or hormonally changed, but are thoroughly indoctrinated in the gender roles of the Free Cities to be accepting of their place in the new and rapidly changing world. Since the Gymnasium-Academy produces graduates with a greater ability to build muscle, fitness and virility than any of its competitors, it also trains for athletic perfection to further differentiate them. This training relies on traditional methods of corporal punishment. <<if $TGA.schoolUpgrade != 0>><br><br>Since you have endowed <<if $TGA.schoolUpgrade == 1>>advanced training methods at the Gymnasium-Academy, its graduates are now fanatically loyal.<<else>>a combat training center at the Gymnasium-Academy, its graduates are now deadly fighters.<</if>> As a major <<if $PC.title == 0>>benefactrix<<else>>benefactor<</if>> of the institution, you also receive a discount on them.<</if>>// <br><br>The Gymnasium-Academy offers a fresh graduate for inspection via video call. The interview takes place in an office overlooking an expansive workout room, in which a large number of naked, fit young bodies are performing punishing workout routines. -<<= generateMarketSlave("TGA")>> +<<set _marketResult = generateMarketSlave("TGA")>> +<<set $activeSlave = _marketResult.slave>> +<<print _marketResult.text>> <<set _slaveCost = slaveCost($activeSlave)>> <<if $TGA.schoolSale != 0>> <<set _slaveCost = Math.trunc(_slaveCost*0.5)>> diff --git a/src/uncategorized/theSlavegirlSchool.tw b/src/uncategorized/theSlavegirlSchool.tw index 169ca27671c4478821373a1a985aaa8398dc1ad4..7a9915d230de690c238d80d528935a3f42db3ba2 100644 --- a/src/uncategorized/theSlavegirlSchool.tw +++ b/src/uncategorized/theSlavegirlSchool.tw @@ -1,17 +1,19 @@ :: The Slavegirl School [nobr] -<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools">> +<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1, $encyclopedia = "Slave Schools", $slaveMarket = "TSS">> /* Multi-Purchase Support */ <<if ndef $newSlaves>><<set $newSlaves = []>><</if>> <<if $newSlaves.length > 0>> - <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $slaveMarket = "TSS", $returnTo = "Main", $newSlaveIndex = 0>> + <<set $nextButton = "Continue", $nextLink = "Bulk Slave Intro", $returnTo = "Main", $newSlaveIndex = 0>> <</if>> //The Slavegirl School is the newest slave school operating in the Free Cities. Its business model is to offer simpler, cheaper wares than its competitors. All Slavegirl School graduates are natural-born females without surgical modifications. Their training emphasizes elimination of any serious psychological deformities. They are promptly enslaved and sold as soon as they reach their majorities, and are marketed as complete virgins. <<if $TSS.schoolUpgrade != 0>><br><br>You have endowed <<if $TSS.schoolUpgrade == 1>>an alternative college at The Slavegirl School, which focuses on retraining good MILF stock into mature slave girls.<<else>>an improvement in the simplistic school's approach that teaches good basic skills without losing too much efficiency.<</if>> As a major <<if $PC.title == 0>>benefactrix<<else>>benefactor<</if>> of the institution, you also receive a discount on them.<</if>>// <br><br>The Slavegirl School offers a fresh graduate for inspection via video call. The interview takes place in a faculty member's office. Absurdly, it's barely distinguishable from an office at any traditional institution of higher education. The only giveaway is the profusion of sex toys on the desk and the pornography on the walls. -<<= generateMarketSlave("TSS")>> +<<set _marketResult = generateMarketSlave("TSS")>> +<<set $activeSlave = _marketResult.slave>> +<<print _marketResult.text>> <<set _slaveCost = slaveCost($activeSlave)>> <<if $TSS.schoolSale != 0>> <<set _slaveCost = Math.trunc(_slaveCost*0.5)>> diff --git a/src/uncategorized/underperformingSlaves.tw b/src/uncategorized/underperformingSlaves.tw index a6182dbb49c59a25e746861b4f08e87c1499be4b..ee7a8cf6587305d964cd62bab48a434dcfb57caa 100644 --- a/src/uncategorized/underperformingSlaves.tw +++ b/src/uncategorized/underperformingSlaves.tw @@ -3,7 +3,7 @@ <<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $showEncyclopedia = 1>> <p> <div> - <<= properMaster()>>, while many of your slaves work hard to earn ¤ each week, some succeed more than others. As a trader in slaves, you may appreciate the opportunity that comes when a particularly valuable slave didn't earn very much last week. Or perhaps you just want the chance to tweak these problem slaves and train them to be better? The choice is yours. + <<= properMaster()>>, while many of your slaves work hard to earn ¤ each week, some succeed more than others. As a trader in slaves, you may appreciate the opportunity that comes when a particularly valuable slave didn't earn very much last week. Or perhaps you just want the chance to tweak these problem slaves and train them to be better? The choice is yours. </div> <div> <<if ($slaveCostFactor > 1.1)>> @@ -20,14 +20,14 @@ </div> </p> <<run App.UI.tabbar.handlePreSelectedTab($tabChoice.Options)>> - -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'highSale')" id="tab highSale">Worth much but earning little</button> -<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'expensive')" id="tab expensive">Costing vs earning</button> - +<div class="tabbar"> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'highSale')" id="tab highSale">Worth much but earning little</button> + <button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'expensive')" id="tab expensive">Costing vs earning</button> +</div> <div id="highSale" class="tabcontent"> <div class="content"> <div style="font-style:italic"> - Take the rough value of a slave and divide it by how much they made overall last week. This will tell you how many weeks it might take them to earn the same amount you'd get for selling them right now. + Take the rough value of a slave and divide it by how much they made overall last week. This will tell you how many weeks it might take them to earn the same amount you'd get for selling them right now. </div> <<print App.UI.SlaveList.render.listMarkup( getBestSlavesIndices( @@ -78,4 +78,4 @@ ).get(0) )>> </div> -</div> \ No newline at end of file +</div> diff --git a/src/uncategorized/wardrobe.tw b/src/uncategorized/wardrobe.tw index 677130ff9e27b6f6ce840f3798cd42dca3d2ae74..77435f54c98f4d1925eb4bc5ff90aad9e56a90a5 100644 --- a/src/uncategorized/wardrobe.tw +++ b/src/uncategorized/wardrobe.tw @@ -13,7 +13,7 @@ <p class="scene-intro"> The room containing all the clothes and accessories you have available to dress your slaves in, as well as the supplies and tools your tailor needs to resize them to better fit your slaves. Several mirrors are set up for a slave to try on outfits should they be allowed to dress themselves. The selection includes <<set _ownItAll = ( - App.Data.misc.niceClothes.every((i) => isItemAccessible.entry(i.value, "clothing")) && + App.Data.misc.niceClothes.every((i) => isItemAccessible.entry(i.value, "clothing")) && App.Data.misc.harshClothes.every((i) => isItemAccessible.entry(i.value, "clothing")) )>> <<if _ownItAll>> diff --git a/src/utility/descriptionWidgetsFlesh.tw b/src/utility/descriptionWidgetsFlesh.tw index 575d4004b75c6cab4be66a7d432dcf3eb3be7b1c..6ce426619ddb34aa968cc58d2c60b606d212fff8 100644 --- a/src/utility/descriptionWidgetsFlesh.tw +++ b/src/utility/descriptionWidgetsFlesh.tw @@ -4186,11 +4186,11 @@ $He's got a <<else>> $He has nothing but small, perforated metal disks where $his ears should be. <</if>> - <<elseif $activeSlave.earWear == "none">> + <<elseif $activeSlave.earwear == "none">> $He has small unsightly holes on the sides of $his head. /*That can't be sanitary.*/ <<else>> The sides of $his head are smooth where $his ears should be, but upon closer inspection it is revealed that - <<if $activeSlave.earWear == "hearing aids">> + <<if $activeSlave.earwear == "hearing aids">> $his ear canals are fitted with hearing aids capped with a skin-matching sheet to obscure the hole. <<else>> $his ear canals are filled with plugs with skin-matching caps. @@ -4445,7 +4445,7 @@ $His <<if $showBodyMods == 1>> <<if $activeSlave.fuckdoll == 0>> - <<makeupDescription>> + <<= App.Desc.makeup($activeSlave)>> <</if>> <</if>> diff --git a/src/utility/descriptionWidgetsStyle.tw b/src/utility/descriptionWidgetsStyle.tw index a74e002f31814a1aeef86f2e0f94de4aad5ab058..e804e3984d6bbb0d65788af2653211a28804c6bc 100644 --- a/src/utility/descriptionWidgetsStyle.tw +++ b/src/utility/descriptionWidgetsStyle.tw @@ -3585,61 +3585,11 @@ $His <</widget>> -<<widget "nailsDescription">> - <<if !hasAnyArms($activeSlave)>> - $He has no hands, and thus, no nails. - <<elseif $activeSlave.nails == 1>> - $His nails are long and elegant. - <<elseif $activeSlave.nails == 2>> - $His nails are color-coordinated with $his $activeSlave.hColor hair. - <<elseif $activeSlave.nails == 3>> - $His nails are sharp and claw-like. - <<elseif $activeSlave.nails == 4>> - $His nails are bright and glittery. - <<elseif $activeSlave.nails == 5>> - $His nails are long and garish, streetwalker-style. - <<elseif $activeSlave.nails == 6>> - $His nails are vivid and eye-catching. - <<elseif $activeSlave.nails == 7>> - $His nails are vivid, eye-catching and color-coordinated with $his $activeSlave.hColor hair. - <<elseif $activeSlave.nails == 8>> - $His nails are shiny and metallic. - <<elseif $activeSlave.nails == 9>> - $His nails are shiny, metallic and color-coordinated with $his $activeSlave.hColor hair. - <<else>> - $His nails are neatly clipped. - <</if>> -<</widget>> - -<<widget "makeupDescription">> - <<if $activeSlave.makeup == 1>> - $He's wearing minimal makeup. - <<elseif $activeSlave.makeup == 2>> - $He's wearing expensive, luxurious makeup. - <<elseif $activeSlave.makeup == 3>> - $His makeup is color-coordinated with $his $activeSlave.hColor hair. - <<elseif $activeSlave.makeup == 4>> - $He's wearing stereotypical, garish streetwalker makeup. - <<elseif $activeSlave.makeup == 5>> - $He's wearing eye-catching neon makeup. - <<elseif $activeSlave.makeup == 6>> - $His neon makeup is color-coordinated with $his $activeSlave.hColor hair. - <<elseif $activeSlave.makeup == 7>> - $He's wearing expensive, metallic makeup. - <<elseif $activeSlave.makeup == 8>> - $His metallic makeup is color-coordinated with $his $activeSlave.hColor hair. - <<elseif $activeSlave.lipsTat == "permanent makeup">> - $His face appears to bear very heavy, slutty makeup, but on closer inspection, the makeup is actually tattooed on. - <<else>> - $His face is makeup-free. - <</if>> -<</widget>> - <<widget "upperFaceDescription">> <<if $activeSlave.fuckdoll == 0>> <<switch $activeSlave.clothes>> <<case "restrictive latex">> - The upper half of $his face is covered by the hood of $his latex suit: though $he can see through eye-holes, these can easily be closed to blind $him. + The upper half of $his face is covered by the hood of $his latex suit: though <<if canSee($activeSlave)>>$he can see through eye-holes, these can easily be closed to blind $him<<else>>there are eye-holes, they are currently closed due to their lack of use<</if>>. <<case "harem gauze">> $His harem outfit includes the traditional veil for $his face. <<case "a burkini">> diff --git a/src/utility/slaveCreationWidgets.tw b/src/utility/slaveCreationWidgets.tw index 427e5da8fbaabe473bd14fb170fb0f4cd95b0327..84049af8c4a640d940753715cd97543cc5914dc3 100644 --- a/src/utility/slaveCreationWidgets.tw +++ b/src/utility/slaveCreationWidgets.tw @@ -914,7 +914,9 @@ <br>[[Finish your order of slaves|Bulk Slave Intro]] <</if>> <br><br> -<<if $slaveMarket != "indentures" && $slaveMarket != "neighbor" && $slaveMarket != "heap" && $slaveMarket != "wetware">> +<<if App.Data.misc.lawlessMarkets.includes($slaveMarket)>> + <<set $applyLaw = 0>> +<<else>> <<set $applyLaw = 1>> <</if>> <<set $saleDescription = 1>><<include "Long Slave Description">>