diff --git a/devTools/javaSanityCheck/SanityCheck.jar b/devTools/javaSanityCheck/SanityCheck.jar index e7971c6d4f658b5427451dcd942522cc4a0780bf..f8d18c46a17e7426ef3e23c54cc7bc9ac96a609e 100644 Binary files a/devTools/javaSanityCheck/SanityCheck.jar and b/devTools/javaSanityCheck/SanityCheck.jar differ diff --git a/devTools/javaSanityCheck/excluded b/devTools/javaSanityCheck/excluded index 58f7edccba9af9ebbdc4f7f14b607cb0ea8ca1e6..6eeea37b1bfcf3a7d3e5c4750514f7cac5c40f9b 100644 --- a/devTools/javaSanityCheck/excluded +++ b/devTools/javaSanityCheck/excluded @@ -15,3 +15,4 @@ src/SecExp/js/secExp.js;O src/js/economyJS.js;S src/npc/assistant/assistant.js;O src/data/backwardsCompatibility/backwardsCompatibility.js;O +src/data/backwardsCompatibility/datatypeCleanup.js;S diff --git a/devTools/javaSanityCheck/htmlTags b/devTools/javaSanityCheck/htmlTags index f47666e085ad5cf69751eede6294385a905ca051..e999ad1f5046a679067dc6215fa6816f9d41cd9a 100644 --- a/devTools/javaSanityCheck/htmlTags +++ b/devTools/javaSanityCheck/htmlTags @@ -18,6 +18,7 @@ br;0 button;1 caption;1 center;1 +code;1 dd;1 div;1 dl;1 diff --git a/devTools/javaSanityCheck/sources.zip b/devTools/javaSanityCheck/sources.zip index 08024e87a312fddd55422916c6381160d48d12fe..0556ade3e1b3eb6bcfc052d340fae308dc4b4aec 100644 Binary files a/devTools/javaSanityCheck/sources.zip and b/devTools/javaSanityCheck/sources.zip differ diff --git a/src/002-config/mousetrapConfig.js b/src/002-config/mousetrapConfig.js index c82ac4be193661aef007b894ecbb0a50630f938a..ffcfcb7b0d3da9e458b5d6d55e630b34349bf52a 100644 --- a/src/002-config/mousetrapConfig.js +++ b/src/002-config/mousetrapConfig.js @@ -29,7 +29,7 @@ App.UI.Hotkeys = (function() { const bindings = {}; /** - * To ensure we only record one at at time + * To ensure we only record one at a time * @type {boolean} */ let recording = false; diff --git a/src/003-assets/CSS/tooltip.css b/src/003-assets/CSS/tooltip.css deleted file mode 100644 index 719d9e6bd315955439b5c7480bf150a143fec72a..0000000000000000000000000000000000000000 --- a/src/003-assets/CSS/tooltip.css +++ /dev/null @@ -1,71 +0,0 @@ -/* - * pure CSS tooltip - * based on https://codeconvey.com/pure-html5-css-tooltips-using-title-data-attribute/ - */ -.exampleTooltip, .devotion, .trust, .defiant { - position: relative; - display: inline; -} - -.exampleTooltip:after, .devotion:after, .trust:after, .defiant:after { - display: block; - visibility: hidden; - position: absolute; - font-size: smaller; - width: 20em; - height: auto; - background-color: slategray; - color: black; - text-decoration: none; - font-style: normal; - text-align: center; - border-radius: 3px; - padding: 5px; - z-index: 999; - bottom: 0; - left: 10px; -} - -.exampleTooltip:after { - content: "I am a helpful tooltip. We are very rare because we are still in development."; -} - -.devotion:after { - content: "Devotion is a measure of a slave's love for you."; -} - -.trust:after { - content: "Trust is a measure of a slave's expectations of you and confidence to perform well."; -} - -.defiant:after { - content: "Defiant slaves will actively work against you."; -} - -/* makes the arrow */ -.exampleTooltip:before, .devotion:before, .trust:before, .defiant:before { - position: absolute; - visibility: hidden; - width: 0; - height: 0; - left: 20px; - bottom: 0; - opacity: 0; - content: ""; - border-style: solid; - border-width: 6px 6px 0 6px; - border-color: slategray transparent transparent transparent; - z-index: 999; -} - -div.tooltipsEnabled .exampleTooltip:hover:after, div.tooltipsEnabled .devotion:hover:after, div.tooltipsEnabled .trust:hover:after, div.tooltipsEnabled .defiant:hover:after { - visibility: visible; - opacity: 1; - bottom: 20px; -} - -div.tooltipsEnabled .exampleTooltip:hover:before, div.tooltipsEnabled .devotion:hover:before, div.tooltipsEnabled .trust:hover:before, div.tooltipsEnabled .defiant:hover:before { - visibility: visible; - opacity: 1; - bottom: 15px; -} diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js index 4a37982a50aecc22e18309411ecf3bbbde1c2565..d4693f1c0875022a56fe0e8cc5d3e8860e511b7e 100644 --- a/src/data/backwardsCompatibility/backwardsCompatibility.js +++ b/src/data/backwardsCompatibility/backwardsCompatibility.js @@ -1173,6 +1173,14 @@ App.Update.globalVariables = function(node) { V.StudCum = Math.max(+V.StudCum, 0) || 0; } + // Recalculate finished prosthetics + V.adjustProstheticsCompleted = 0; + for (const prosthetic of V.adjustProsthetics) { + if (prosthetic.workLeft <= 0) { + V.adjustProstheticsCompleted++; + } + } + EconomyDatatypeCleanup(); ArcologyDatatypeCleanup(); diff --git a/src/endWeek/saGetMilked.js b/src/endWeek/saGetMilked.js index 1bef5b03cfae8bf73f6760523dced021239e3421..85876b9935cfac41f0037d3c3169eec686a75eea 100644 --- a/src/endWeek/saGetMilked.js +++ b/src/endWeek/saGetMilked.js @@ -901,94 +901,7 @@ App.SlaveAssignment.getMilked = (function() { // FACILITY DECORATION IMPACTS function applyFSDecoration() { - if (V.dairyDecoration !== "standard") { - let fsGain = Math.min(0.0001 * V.FSSingleSlaveRep * (milk + (5 * cum)), 1); - switch (V.dairyDecoration) { - case "Roman Revivalist": - arcology.FSRomanRevivalist = Math.clamp(arcology.FSRomanRevivalist += fsGain, 0, 100); - break; - case "Aztec Revivalist": - arcology.FSAztecRevivalist = Math.clamp(arcology.FSAztecRevivalist += fsGain, 0, 100); - break; - case "Egyptian Revivalist": - arcology.FSEgyptianRevivalist = Math.clamp(arcology.FSEgyptianRevivalist += fsGain, 0, 100); - break; - case "Edo Revivalist": - arcology.FSEdoRevivalist = Math.clamp(arcology.FSEdoRevivalist += fsGain, 0, 100); - break; - case "Arabian Revivalist": - arcology.FSArabianRevivalist = Math.clamp(arcology.FSArabianRevivalist += fsGain, 0, 100); - break; - case "Chinese Revivalist": - arcology.FSChineseRevivalist = Math.clamp(arcology.FSChineseRevivalist += fsGain, 0, 100); - break; - case "Chattel Religionist": - arcology.FSChattelReligionist = Math.clamp(arcology.FSChattelReligionist += fsGain, 0, 100); - break; - case "Degradationist": - arcology.FSDegradationist = Math.clamp(arcology.FSDegradationist += fsGain, 0, 100); - break; - case "Repopulation Focus": - arcology.FSRepopulationFocus = Math.clamp(arcology.FSRepopulationFocus += fsGain, 0, 100); - break; - case "Eugenics": - arcology.FSRestart = Math.clamp(arcology.FSRestart += fsGain, 0, 100); - break; - case "Asset Expansionist": - arcology.FSAssetExpansionist = Math.clamp(arcology.FSAssetExpansionist += fsGain, 0, 100); - break; - case "Transformation Fetishist": - arcology.FSTransformationFetishist = Math.clamp(arcology.FSTransformationFetishist += fsGain, 0, 100); - break; - case "Gender Radicalist": - arcology.FSGenderRadicalist = Math.clamp(arcology.FSGenderRadicalist += fsGain, 0, 100); - break; - case "Gender Fundamentalist": - arcology.FSGenderFundamentalist = Math.clamp(arcology.FSGenderFundamentalist += fsGain, 0, 100); - break; - case "Physical Idealist": - arcology.FSPhysicalIdealist = Math.clamp(arcology.FSPhysicalIdealist += fsGain, 0, 100); - break; - case "Hedonistic": - arcology.FSHedonisticDecadence = Math.clamp(arcology.FSHedonisticDecadence += fsGain, 0, 100); - break; - case "Supremacist": - arcology.FSSupremacist = Math.clamp(arcology.FSSupremacist += fsGain, 0, 100); - break; - case "Subjugationist": - arcology.FSSubjugationist = Math.clamp(arcology.FSSubjugationist += fsGain, 0, 100); - break; - case "Paternalist": - arcology.FSPaternalist = Math.clamp(arcology.FSPaternalist += fsGain, 0, 100); - break; - case "Pastoralist": - arcology.FSPastoralist = Math.clamp(arcology.FSPastoralist += fsGain, 0, 100); - break; - case "Maturity Preferentialist": - arcology.FSMaturityPreferentialist = Math.clamp(arcology.FSMaturityPreferentialist += fsGain, 0, 100); - break; - case "Youth Preferentialist": - arcology.FSYouthPreferentialist = Math.clamp(arcology.FSYouthPreferentialist += fsGain, 0, 100); - break; - case "Body Purist": - arcology.FSBodyPurist = Math.clamp(arcology.FSBodyPurist += fsGain, 0, 100); - break; - case "Slimness Enthusiast": - arcology.FSSlimnessEnthusiast = Math.clamp(arcology.FSSlimnessEnthusiast += fsGain, 0, 100); - break; - case "Slave Professionalism": - arcology.FSSlaveProfessionalism = Math.clamp(arcology.FSSlaveProfessionalism += fsGain, 0, 100); - break; - case "Intellectual Dependency": - arcology.FSIntellectualDependency = Math.clamp(arcology.FSIntellectualDependency += fsGain, 0, 100); - break; - case "Petite Admiration": - arcology.FSPetiteAdmiration = Math.clamp(arcology.FSPetiteAdmiration += fsGain, 0, 100); - break; - case "Statuesque Glorification": - arcology.FSStatuesqueGlorification = Math.clamp(arcology.FSStatuesqueGlorification += fsGain, 0, 100); - break; - } - } + const fsGain = 0.0001 * (milk + (5 * cum)); + FutureSocieties.DecorationBonus(V.dairyDecoration, fsGain); } })(); diff --git a/src/endWeek/saServeThePublic.js b/src/endWeek/saServeThePublic.js index b375f8295923506ae842a94095021e3aef21b82d..8c9154842949a567c4682d988f682d3d3ee6b23d 100644 --- a/src/endWeek/saServeThePublic.js +++ b/src/endWeek/saServeThePublic.js @@ -1260,94 +1260,8 @@ App.SlaveAssignment.serveThePublic = (function() { * */ function applyFSDecoration(slave) { - /* FACILITY DECORATION IMPACTS */ - const fsBeauty = (0.0005 * V.FSSingleSlaveRep * slave.sexAmount); - switch (V.clubDecoration) { - case "Roman Revivalist": - arcology.FSRomanRevivalist += fsBeauty; - break; - case "Aztec Revivalist": - arcology.FSAztecRevivalist += fsBeauty; - break; - case "Egyptian Revivalist": - arcology.FSEgyptianRevivalist += fsBeauty; - break; - case "Edo Revivalist": - arcology.FSEdoRevivalist += fsBeauty; - break; - case "Arabian Revivalist": - arcology.FSArabianRevivalist += fsBeauty; - break; - case "Chinese Revivalist": - arcology.FSChineseRevivalist += fsBeauty; - break; - case "Chattel Religionist": - arcology.FSChattelReligionist += fsBeauty; - break; - case "Degradationist": - arcology.FSDegradationist += fsBeauty; - break; - case "Asset Expansionist": - arcology.FSAssetExpansionist += fsBeauty; - break; - case "Transformation Fetishist": - arcology.FSTransformationFetishist += fsBeauty; - break; - case "Gender Radicalist": - arcology.FSGenderRadicalist += fsBeauty; - break; - case "Repopulation Focus": - arcology.FSRepopulationFocus += fsBeauty; - break; - case "Eugenics": - arcology.FSRestart += fsBeauty; - break; - case "Gender Fundamentalist": - arcology.FSGenderFundamentalist += fsBeauty; - break; - case "Physical Idealist": - arcology.FSPhysicalIdealist += fsBeauty; - break; - case "Hedonistic": - arcology.FSHedonisticDecadence += fsBeauty; - break; - case "Supremacist": - arcology.FSSupremacist += fsBeauty; - break; - case "Subjugationist": - arcology.FSSubjugationist += fsBeauty; - break; - case "Paternalist": - arcology.FSPaternalist += fsBeauty; - break; - case "Pastoralist": - arcology.FSPastoralist += fsBeauty; - break; - case "Maturity Preferentialist": - arcology.FSMaturityPreferentialist += fsBeauty; - break; - case "Youth Preferentialist": - arcology.FSYouthPreferentialist += fsBeauty; - break; - case "Body Purist": - arcology.FSBodyPurist += fsBeauty; - break; - case "Slimness Enthusiast": - arcology.FSSlimnessEnthusiast += fsBeauty; - break; - case "Slave Professionalism": - arcology.FSSlaveProfessionalism += fsBeauty; - break; - case "Intellectual Dependency": - arcology.FSIntellectualDependency += fsBeauty; - break; - case "Petite Admiration": - arcology.FSPetiteAdmiration += fsBeauty; - break; - case "Statuesque Glorification": - arcology.FSStatuesqueGlorification += fsBeauty; - break; - } + const fsBeauty = 0.0005 * slave.sexAmount; + FutureSocieties.DecorationBonus(V.clubDecoration, fsBeauty); } /** diff --git a/src/endWeek/saWhore.js b/src/endWeek/saWhore.js index 36289d69324cf059c4859ce9c1d4c650d139d53a..8b278a575e52119b285bccb81cadf7626608882f 100644 --- a/src/endWeek/saWhore.js +++ b/src/endWeek/saWhore.js @@ -1334,93 +1334,8 @@ App.SlaveAssignment.whore = (function() { */ function applyFSDecoration() { /* FACILITY DECORATION IMPACTS */ - const fsBeauty = (0.0005 * V.FSSingleSlaveRep * beauty); - switch (V.brothelDecoration) { - case "Roman Revivalist": - arcology.FSRomanRevivalist += fsBeauty; - break; - case "Aztec Revivalist": - arcology.FSAztecRevivalist += fsBeauty; - break; - case "Egyptian Revivalist": - arcology.FSEgyptianRevivalist += fsBeauty; - break; - case "Edo Revivalist": - arcology.FSEdoRevivalist += fsBeauty; - break; - case "Arabian Revivalist": - arcology.FSArabianRevivalist += fsBeauty; - break; - case "Chinese Revivalist": - arcology.FSChineseRevivalist += fsBeauty; - break; - case "Chattel Religionist": - arcology.FSChattelReligionist += fsBeauty; - break; - case "Degradationist": - arcology.FSDegradationist += fsBeauty; - break; - case "Asset Expansionist": - arcology.FSAssetExpansionist += fsBeauty; - break; - case "Transformation Fetishist": - arcology.FSTransformationFetishist += fsBeauty; - break; - case "Gender Radicalist": - arcology.FSGenderRadicalist += fsBeauty; - break; - case "Repopulation Focus": - arcology.FSRepopulationFocus += fsBeauty; - break; - case "Eugenics": - arcology.FSRestart += fsBeauty; - break; - case "Gender Fundamentalist": - arcology.FSGenderFundamentalist += fsBeauty; - break; - case "Physical Idealist": - arcology.FSPhysicalIdealist += fsBeauty; - break; - case "Hedonistic": - arcology.FSHedonisticDecadence += fsBeauty; - break; - case "Supremacist": - arcology.FSSupremacist += fsBeauty; - break; - case "Subjugationist": - arcology.FSSubjugationist += fsBeauty; - break; - case "Paternalist": - arcology.FSPaternalist += fsBeauty; - break; - case "Pastoralist": - arcology.FSPastoralist += fsBeauty; - break; - case "Maturity Preferentialist": - arcology.FSMaturityPreferentialist += fsBeauty; - break; - case "Youth Preferentialist": - arcology.FSYouthPreferentialist += fsBeauty; - break; - case "Body Purist": - arcology.FSBodyPurist += fsBeauty; - break; - case "Slimness Enthusiast": - arcology.FSSlimnessEnthusiast += fsBeauty; - break; - case "Slave Professionalism": - arcology.FSSlaveProfessionalism += fsBeauty; - break; - case "Intellectual Dependency": - arcology.FSIntellectualDependency += fsBeauty; - break; - case "Petite Admiration": - arcology.FSPetiteAdmiration += fsBeauty; - break; - case "Statuesque Glorification": - arcology.FSStatuesqueGlorification += fsBeauty; - break; - } + const fsBeauty = 0.0005 * beauty; + FutureSocieties.DecorationBonus(V.brothelDecoration, fsBeauty); } /** diff --git a/src/endWeek/saWorkAGloryHole.js b/src/endWeek/saWorkAGloryHole.js index 4a5dacf8093322fff3e13b6ce70b854005141f3a..18eebdd88eec4f52b8a45c49dd04e9ec44b0824e 100644 --- a/src/endWeek/saWorkAGloryHole.js +++ b/src/endWeek/saWorkAGloryHole.js @@ -309,95 +309,9 @@ App.SlaveAssignment.workAGloryHole = (function() { * */ function applyFSDecoration(slave) { - /* FACILITY DECORATION IMPACTS */ - if (slave.assignment === window.Job.ARCADE && V.arcadeDecoration !== "standard") { - const impact = (0.0001 * V.FSSingleSlaveRep * beauty); - switch (V.arcadeDecoration) { - case "Roman Revivalist": - V.arcologies[0].FSRomanRevivalist += impact; - break; - case "Aztec Revivalist": - V.arcologies[0].FSAztecRevivalist += impact; - break; - case "Egyptian Revivalist": - V.arcologies[0].FSEgyptianRevivalist += impact; - break; - case "Edo Revivalist": - V.arcologies[0].FSEdoRevivalist += impact; - break; - case "Arabian Revivalist": - V.arcologies[0].FSArabianRevivalist += impact; - break; - case "Chinese Revivalist": - V.arcologies[0].FSChineseRevivalist += impact; - break; - case "Repopulation Focus": - V.arcologies[0].FSRepopulationFocus += impact; - break; - case "Eugenics": - V.arcologies[0].FSRestart += impact; - break; - case "Chattel Religionist": - V.arcologies[0].FSChattelReligionist += impact; - break; - case "Degradationist": - V.arcologies[0].FSDegradationist += impact; - break; - case "Asset Expansionist": - V.arcologies[0].FSAssetExpansionist += impact; - break; - case "Transformation Fetishist": - V.arcologies[0].FSTransformationFetishist += impact; - break; - case "Gender Radicalist": - V.arcologies[0].FSGenderRadicalist += impact; - break; - case "Gender Fundamentalist": - V.arcologies[0].FSGenderFundamentalist += impact; - break; - case "Physical Idealist": - V.arcologies[0].FSPhysicalIdealist += impact; - break; - case "Hedonistic": - V.arcologies[0].FSHedonisticDecadence += impact; - break; - case "Supremacist": - V.arcologies[0].FSSupremacist += impact; - break; - case "Subjugationist": - V.arcologies[0].FSSubjugationist += impact; - break; - case "Paternalist": - V.arcologies[0].FSPaternalist += impact; - break; - case "Pastoralist": - V.arcologies[0].FSPastoralist += impact; - break; - case "Maturity Preferentialist": - V.arcologies[0].FSMaturityPreferentialist += impact; - break; - case "Youth Preferentialist": - V.arcologies[0].FSYouthPreferentialist += impact; - break; - case "Body Purist": - V.arcologies[0].FSBodyPurist += impact; - break; - case "Slimness Enthusiast": - V.arcologies[0].FSSlimnessEnthusiast += impact; - break; - case "Slave Professionalism": - V.arcologies[0].FSSlaveProfessionalism += impact; - break; - case "Intellectual Dependency": - V.arcologies[0].FSIntellectualDependency += impact; - break; - case "Petite Admiration": - V.arcologies[0].FSPetiteAdmiration += impact; - break; - case "Statuesque Glorification": - V.arcologies[0].FSStatuesqueGlorification += impact; - break; - } + if (slave.assignment === Job.ARCADE) { + const impact = (0.0001 * beauty); + FutureSocieties.DecorationBonus(V.arcadeDecoration, impact); } } diff --git a/src/endWeek/saWorkTheFarm.js b/src/endWeek/saWorkTheFarm.js index 14a9f87f1e26063fdc2d28cd50662a26851d458c..274cfd76de013a243bc21773a4a585672bae33dd 100644 --- a/src/endWeek/saWorkTheFarm.js +++ b/src/endWeek/saWorkTheFarm.js @@ -558,96 +558,9 @@ App.SlaveAssignment.workTheFarm = function(slave) { // Close Vignettes - // Open Facility Decorations - - if (V.farmyardDecoration !== "standard") { - const fsGain = Math.min(0.0001 * V.FSSingleSlaveRep * (food), 1); - switch (V.farmyardDecoration) { - case "Roman Revivalist": - arcology.FSRomanRevivalist = Math.clamp(arcology.FSRomanRevivalist += fsGain, 0, 100); - break; - case "Aztec Revivalist": - arcology.FSAztecRevivalist = Math.clamp(arcology.FSAztecRevivalist += fsGain, 0, 100); - break; - case "Egyptian Revivalist": - arcology.FSEgyptianRevivalist = Math.clamp(arcology.FSEgyptianRevivalist += fsGain, 0, 100); - break; - case "Edo Revivalist": - arcology.FSEdoRevivalist = Math.clamp(arcology.FSEdoRevivalist += fsGain, 0, 100); - break; - case "Arabian Revivalist": - arcology.FSArabianRevivalist = Math.clamp(arcology.FSArabianRevivalist += fsGain, 0, 100); - break; - case "Chinese Revivalist": - arcology.FSChineseRevivalist = Math.clamp(arcology.FSChineseRevivalist += fsGain, 0, 100); - break; - case "Chattel Religionist": - arcology.FSChattelReligionist = Math.clamp(arcology.FSChattelReligionist += fsGain, 0, 100); - break; - case "Degradationist": - arcology.FSDegradationist = Math.clamp(arcology.FSDegradationist += fsGain, 0, 100); - break; - case "Repopulation Focus": - arcology.FSRepopulationFocus = Math.clamp(arcology.FSRepopulationFocus += fsGain, 0, 100); - break; - case "Eugenics": - arcology.FSRestart = Math.clamp(arcology.FSRestart += fsGain, 0, 100); - break; - case "Asset Expansionist": - arcology.FSAssetExpansionist = Math.clamp(arcology.FSAssetExpansionist += fsGain, 0, 100); - break; - case "Transformation Fetishist": - arcology.FSTransformationFetishist = Math.clamp(arcology.FSTransformationFetishist += fsGain, 0, 100); - break; - case "Gender Radicalist": - arcology.FSGenderRadicalist = Math.clamp(arcology.FSGenderRadicalist += fsGain, 0, 100); - break; - case "Gender Fundamentalist": - arcology.FSGenderFundamentalist = Math.clamp(arcology.FSGenderFundamentalist += fsGain, 0, 100); - break; - case "Physical Idealist": - arcology.FSPhysicalIdealist = Math.clamp(arcology.FSPhysicalIdealist += fsGain, 0, 100); - break; - case "Hedonistic": - arcology.FSHedonisticDecadence = Math.clamp(arcology.FSHedonisticDecadence += fsGain, 0, 100); - break; - case "Supremacist": - arcology.FSSupremacist = Math.clamp(arcology.FSSupremacist += fsGain, 0, 100); - break; - case "Subjugationist": - arcology.FSSubjugationist = Math.clamp(arcology.FSSubjugationist += fsGain, 0, 100); - break; - case "Paternalist": - arcology.FSPaternalist = Math.clamp(arcology.FSPaternalist += fsGain, 0, 100); - break; - case "Pastoralist": - arcology.FSPastoralist = Math.clamp(arcology.FSPastoralist += fsGain, 0, 100); - break; - case "Maturity Preferentialist": - arcology.FSMaturityPreferentialist = Math.clamp(arcology.FSMaturityPreferentialist += fsGain, 0, 100); - break; - case "Youth Preferentialist": - arcology.FSYouthPreferentialist = Math.clamp(arcology.FSYouthPreferentialist += fsGain, 0, 100); - break; - case "Body Purist": - arcology.FSBodyPurist = Math.clamp(arcology.FSBodyPurist += fsGain, 0, 100); - break; - case "Slimness Enthusiast": - arcology.FSSlimnessEnthusiast = Math.clamp(arcology.FSSlimnessEnthusiast += fsGain, 0, 100); - break; - case "Slave Professionalism": - arcology.FSSlaveProfessionalism = Math.clamp(arcology.FSSlaveProfessionalism += fsGain, 0, 100); - break; - case "Intellectual Dependency": - arcology.FSIntellectualDependency = Math.clamp(arcology.FSIntellectualDependency += fsGain, 0, 100); - break; - case "Petite Admiration": - arcology.FSPetiteAdmiration = Math.clamp(arcology.FSPetiteAdmiration += fsGain, 0, 100); - break; - case "Statuesque Glorification": - arcology.FSStatuesqueGlorification = Math.clamp(arcology.FSStatuesqueGlorification += fsGain, 0, 100); - break; - } - } + // Facility Decorations + const fsGain = 0.0001 * food; + FutureSocieties.DecorationBonus(V.farmyardDecoration, fsGain); + return t; }; diff --git a/src/facilities/ads.js b/src/facilities/ads.js index 63def7e87a51661064f5821c76ac63bb851929cb..2cc8ec00a2051e9e1a134e9101c87b5943f29c6b 100644 --- a/src/facilities/ads.js +++ b/src/facilities/ads.js @@ -394,7 +394,7 @@ App.Ads.report = function(building, preview) { } else if (adCampaign.stacked === -1) { t += `Its advertisements feature trim girls with little in the way of T&A. `; } else { - t += `Its advertisements feature a variety of girls, some that are trim and others that are curvaceous. `; + t += `Its advertisements feature a variety of girls, some that are trim and others that are curvaceous. `; } t += `</div>`; } diff --git a/src/facilities/nursery/nursery.tw b/src/facilities/nursery/nursery.tw index 4fa0c863e9e028a14206a878c88c190e3c7e1d2d..f2222c9761bfa04c1fdcf81703b4a16098281770 100644 --- a/src/facilities/nursery/nursery.tw +++ b/src/facilities/nursery/nursery.tw @@ -224,7 +224,7 @@ Reserve an eligible mother-to-be's child to be placed in a room upon birth. Of $ <<set _pregWeek = $slaves[_u].pregWeek>> <<set _slaveName = SlaveFullName($slaves[_u])>> <div class="possible" @id="_slaveId" @data-preg-count="_WL" @data-reserved-spots="_reservedNursery" @data-preg-week="_pregWeek" @data-name="_slaveName"> - <<print "[[_slaveName|Long Slave Description][$activeSlave = $slaves[" + _u + "], $nextLink = passage()]]">> is <<= numberWithPluralOne($slaves[_u].pregWeek, "week")>> pregnant with + <<= App.UI.slaveDescriptionDialog($slaves[_u])>> is <<= numberWithPluralOne($slaves[_u].pregWeek, "week")>> pregnant with <<if $slaves[_u].pregSource == 0 || $slaves[_u].preg <= 5>>someone's<<if $slaves[_u].preg <= 5>>, though it is too early to tell whose,<</if>> <<elseif $slaves[_u].pregSource == -1>>your <<elseif $slaves[_u].pregSource == -2>>a citizen's diff --git a/src/facilities/nursery/widgets/utils/nurseryUtils.js b/src/facilities/nursery/widgets/utils/nurseryUtils.js index a189ed588a38b647cfad8655fe7b81ce8547f376..c2e3edb40ac58e61dd3e1ae2a21727fe188e4c39 100644 --- a/src/facilities/nursery/widgets/utils/nurseryUtils.js +++ b/src/facilities/nursery/widgets/utils/nurseryUtils.js @@ -755,7 +755,7 @@ App.Facilities.Nursery.nurserySort = function nurserySort() { r += `<div class="possible" @id="${slaveID}" @data-preg-count="${WL}" @data-reserved-spots="${reservedNursery}" @data-preg-week="${pregWeek}" @data-name="${slaveName}">`; - r += `${App.UI.passageLink(`${slaveName}`, "Long Slave Description", `${V.activeSlave = slave}, ${V.nextLink = passage()}`)} is ${pregWeek} weeks pregnant with `; + r += `${App.UI.SlaveDescriptionDialog(slave)} is ${pregWeek} weeks pregnant with `; switch (slave.pregSource) { case 0: diff --git a/src/gui/options/options.tw b/src/gui/options/options.tw index 0e9795e5680bfbad00d784b9423d087cfe1b9fda..46bd823470bfb6f6f3a1375c1257db830ed263f3 100644 --- a/src/gui/options/options.tw +++ b/src/gui/options/options.tw @@ -32,7 +32,7 @@ <div> This save was created using FC version $ver build $releaseID. You are currently playing version: <<= App.Version.base>>, mod version: <<= App.Version.pmod>>, build: <<= App.Version.release>><<if App.Version.commitHash>>, commit: <<= App.Version.commitHash>><</if>> -<div> +</div> <div class="indent"> [[Apply Backwards Compatibility Update|Backwards Compatibility]] <<if $secExpEnabled == 1>> diff --git a/src/gui/tooltips.js b/src/gui/tooltips.js new file mode 100644 index 0000000000000000000000000000000000000000..b821534873d7be11baabcc19c973a73f3067f71d --- /dev/null +++ b/src/gui/tooltips.js @@ -0,0 +1,55 @@ +(function() { + // The performance impact is around O(tooltips * nodes), with large passages (main, slave assignment report) adding + // tooltips could potentially take a significant amount of time when there are many potential tooltips. + const tooltips = { + exampleTooltip: "I am a helpful tooltip. We are very rare because we are still in development.", + + devotion: "Devotion is a measure of a slave's love for you.", + trust: "Trust is a measure of a slave's expectations of you and confidence to perform well.", + defiant: "Defiant slaves will actively work against you.", + + flaw: "Flaws impend your slaves performance. Try removing or converting them into quirks.", + intelligent: "More intelligent slaves tend to perform better.", + health: "The healthier your slaves, the better they perform.", + positive: "This is good.", + // noteworthy: "This is important.", + warning: "This is very bad. Try removing the cause for this.", + + error: "Something just broke. Please report this.", + + cash: "Money. Always useful.", + reputation: "Your reputation as a slaveowner. The more, the better.", + /* + skill: "t", + fetish: "t", + relationship: "t", + change: "t", + virginity: "t", + pregnant: "t", + stupid: "t", + education: "t", + */ + }; + + /** + * @param {HTMLElement} container + */ + function addTooltips(container) { + if (V.tooltipsEnabled === 0) { + return; + } + for (const tooltipsKey in tooltips) { + const elements = container.getElementsByClassName(tooltipsKey); + for (const element of elements) { + element.title += `${tooltips[tooltipsKey]}\n`; + } + } + } + + // passage + $(document).on(':passagerender', e => addTooltips(e.content)); + // story caption + $(document).on(':passageend', () => addTooltips(document.getElementById("story-caption"))); + // dialog + $(document).on(':dialogopening', e => addTooltips(e.target)); +})(); diff --git a/src/js/assayJS.js b/src/js/assayJS.js index 3e4d868891266afe5e50cb12e934b676bbea274f..2e97d25564d2f57542eb635e44a231c047e0a389 100644 --- a/src/js/assayJS.js +++ b/src/js/assayJS.js @@ -410,6 +410,16 @@ globalThis.getNonlocalPronouns = function(dickRatio) { return getPronouns(slave); }; +/** Get the origin for a given slave, with the correct pronouns. + * @param {App.Entity.SlaveState} slave + * @param {string} prop + * @returns {string} + */ +globalThis.pronounsForSlaveProp = function(slave, prop) { + const pronouns = getPronouns(slave); + return prop.replace(/\$([A-Z]?[a-z]+)/g, (match, cap1) => pronouns[cap1] || match); +}; + /** Get the written title for a given slave, without messing with global state. * @param {App.Entity.SlaveState} slave * @returns {string} diff --git a/src/js/extendedFamilyModeJS.js b/src/js/extendedFamilyModeJS.js index c467ec7bcb5b56fab5970e9e910ba256e1a11444..9ab734dfd28864e16f266cb1827f00fe78e56243 100644 --- a/src/js/extendedFamilyModeJS.js +++ b/src/js/extendedFamilyModeJS.js @@ -279,7 +279,7 @@ globalThis.mutualChildren = function(slave1, slave2, slaves) { /** Returns a random slave related to a given entity * @param {Relative} slave - * @param {function(App.Entity.SlaveState): boolean} filterFunction + * @param {function(App.Entity.SlaveState): boolean} [filterFunction] * @returns {App.Entity.SlaveState} */ globalThis.randomRelatedSlave = function(slave, filterFunction) { diff --git a/src/js/futureSocietyJS.js b/src/js/futureSocietyJS.js index cfba77e9bdf49917629d0406c1d60cd714e0ce15..25ae6ddfa38a2932d80225df6830d3044219d7af 100644 --- a/src/js/futureSocietyJS.js +++ b/src/js/futureSocietyJS.js @@ -100,6 +100,7 @@ globalThis.FutureSocieties = (function() { overflowToInfluence: overflowToInfluence, remove: removeFS, DecorationCleanup: DecorationCleanup, + DecorationBonus: FSDecorationBonus, Change: FSChange, ChangePorn: FSChangePorn, HighestDecoration: FSHighestDecoration @@ -438,6 +439,25 @@ globalThis.FutureSocieties = (function() { } } + /** Apply the decoration bonus for a slave working in a facility to the FS + * call as FutureSocieties.DecorationBonus() + * @param {string} decoration - not quoted, just pass it straight in + * @param {number} magnitude - will be multiplied by V.FSSingleSlaveRep + */ + function FSDecorationBonus(decoration, magnitude) { + if (decoration === "standard") { + return; // no bonus + } + + const FSString = decoration.replace(/ /g, ''); // removes spaces + const FSProp = FSString2Property[FSString]; // gets the property name + const arc = V.arcologies[0]; + + if (FSProp && Number.isFinite(arc[FSProp])) { + arc[FSProp] = Math.clamp(arc[FSProp] + magnitude * V.FSSingleSlaveRep, 0, 100); + } + } + /* call as FutureSocieties.Change() */ /* FSString should be in the FSString2Property object above */ function FSChange(FSString, magnitude, bonusMultiplier = 1) { diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js index 7b8889be1d68e76a982bbae69575f25013469e88..bb016cc5a2faab9105a6aac1e6ef01c69f56766e 100644 --- a/src/js/utilsDOM.js +++ b/src/js/utilsDOM.js @@ -319,15 +319,6 @@ App.Utils.htmlToElement = function(text) { return template.content.firstChild; }; -/* - * Shows tooltips if they are enabled. Must be called on every passage load, because <body> gets reset. - */ -$(document).on(":passagestart", event => { - if (V.tooltipsEnabled === 1) { - event.content.classList.add("tooltipsEnabled"); - } -}); - /** * Show a list of links (or disabled links) as a delimited strip * @param {Node[]} links diff --git a/src/npc/descriptions/arms.js b/src/npc/descriptions/arms.js new file mode 100644 index 0000000000000000000000000000000000000000..d8ccb8e33b04230e95dae236ef77feb85dc15332 --- /dev/null +++ b/src/npc/descriptions/arms.js @@ -0,0 +1,102 @@ +/** + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ +App.Desc.arms = function(slave) { + const r = []; + const { + his, He + } = getPronouns(slave); + + if (hasAnyNaturalArms(slave)) { + if (slave.weight > 190) { + r.push(`${He} has`); + if (hasBothNaturalArms(slave)) { + r.push(`hugely thick arms`); + } else { + r.push(`a hugely thick arm`); + } + r.push(`with sagging fat`); + if (slave.muscles > 5) { + r.push(`rolls and`); + } else { + r.push(`rolls.`); + } + } else if (slave.weight > 160) { + r.push(`${He} has`); + if (hasBothNaturalArms(slave)) { + r.push(`thick arms`); + } else { + r.push(`a thick arm`); + } + r.push(`with drooping fat`); + if (slave.muscles > 5) { + r.push(`folds and`); + } else { + r.push(`folds.`); + } + } else if (slave.weight > 130) { + r.push(`${He} has`); + if (hasBothNaturalArms(slave)) { + if (slave.muscles > 5) { + r.push(`plump arms with`); + } else { + r.push(`plump arms.`); + } + } else { + if (slave.muscles > 5) { + r.push(`a plump arm with`); + } else { + r.push(`a plump arm.`); + } + } + } else if (slave.weight > 97) { + r.push(`${He} has`); + if (hasBothNaturalArms(slave)) { + if (slave.muscles > 5) { + r.push(`chubby arms with`); + } else { + r.push(`chubby arms.`); + } + } else { + if (slave.muscles > 5) { + r.push(`a chubby arm with`); + } else { + r.push(`a chubby arm.`); + } + } + } else if (slave.muscles > 5) { + r.push(`${He} has`); + if (hasBothNaturalArms(slave)) { + r.push(`normal arms`); + } else { + r.push(`a normal arm`); + } + r.push(`with`); + } + + if (slave.muscles > 95) { + if (slave.weight > 95) { + r.push(`huge muscles hidden beneath ${his} soft flesh.`); + } else { + r.push(`huge muscles.`); + } + } else if (slave.muscles > 30) { + if (slave.weight > 95) { + r.push(`obvious muscles hidden beneath ${his} soft flesh.`); + } else { + r.push(`obvious muscles.`); + } + } else if (slave.muscles > 5) { + if (slave.weight > 30) { + r.push(`toned muscles hidden beneath ${his} soft flesh.`); + } else { + r.push(`toned muscles.`); + } + } else { + // little muscle to them. + } + } + return r.join(" "); +}; + diff --git a/src/npc/descriptions/descriptionWidgets.js b/src/npc/descriptions/descriptionWidgets.js index 01c06dd0e43024e1041e337e0db90e971d5a1382..afa2d2f1906bf815dfbfc517658585306a2e35f6 100644 --- a/src/npc/descriptions/descriptionWidgets.js +++ b/src/npc/descriptions/descriptionWidgets.js @@ -1265,7 +1265,7 @@ App.Desc.sexualHistory = function(slave) { } if (slave.lactation > 0 && slave.counter.milk < 20) { - r += `${He} has given a small quantity of milk `; + r += `${He} has given a small quantity of milk`; if (slave.counter.cum > 0) { r += ` and about ${num(slave.counter.cum)} deciliters of cum`; } diff --git a/src/npc/descriptions/dimensions.js b/src/npc/descriptions/dimensions.js new file mode 100644 index 0000000000000000000000000000000000000000..6a5a25208ba98965e4637b38701fed034c7f7c23 --- /dev/null +++ b/src/npc/descriptions/dimensions.js @@ -0,0 +1,285 @@ +/** + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ +App.Desc.dimensions = function(slave) { + const r = []; + const { + he, him, his, himself, He, His + } = getPronouns(slave); + + r.push(height()); + + r.push(`and`); + + r.push(weight()); + + if (slave.hips > 2) { + r.push(`${His} hips are unrealistically wide, it is obvious they have been artificially widened.`); + } + + r.push(App.Desc.waist(slave)); + + r.push(FS()); + r.push(travel()); + + r.push(App.Desc.heightImplant(slave)); + + r.push(muscles()); + r.push(App.Desc.arms(slave)); + + return r.join(" "); + + + function height() { + const r = []; + const averageHeight = Height.mean(slave); + const age = slave.physicalAge < 16 ? ` for ${his} age` : ``; + + r.push(`is`); + if (slave.height <= (averageHeight + 5) && slave.height >= (averageHeight - 5)) { + r.push(`an average height${age}`); + } else if (slave.height < (averageHeight - 15)) { + r.push(`petite${age}`); + } else if (slave.height < (averageHeight - 5)) { + r.push(`short${age}`); + } else if (slave.height > (averageHeight + 15)) { + r.push(`very tall${age}`); + } else if (slave.height > (averageHeight + 5)) { + r.push(`tall${age}`); + } + if (V.showHeightCMs === 1) { + r.push(`at ${heightToEitherUnit(slave.height)},`); + } + return r.join(" "); + } + function weight() { + const r = []; + if (slave.weight > 190) { + if (V.arcologies[0].FSHedonisticDecadence !== "unset") { + r.push(either(`perfectly curvy.`, `perfectly plush.`)); + } else { + r.push(`<span class="red">${either(`dangerously fat`, `dangerously overweight`, `extremely obese`)}.</span>`); + } + } else if (slave.weight > 160) { + if (V.arcologies[0].FSHedonisticDecadence !== "unset") { + r.push(either(`spectacularly curvy.`, `spectacularly plush.`)); + } else { + r.push(`<span class="red">${either(`extremely fat`, `extremely overweight`, `very obese`)}.</span>`); + } + } else if (slave.weight > 130) { + if (V.arcologies[0].FSHedonisticDecadence !== "unset") { + r.push(either(`amazingly curvy.`, `amazingly plush.`)); + } else { + r.push(`<span class="red">${either(`obese`, `very fat`, `very overweight`)}.</span>`); + } + } else if (slave.weight > 95) { + if (V.arcologies[0].FSHedonisticDecadence !== "unset") { + if (slave.hips > 1) { + r.push(`${either(`extremely curvy`, `extremely plush`)}, ${his} huge hips complementing ${his} plushness perfectly.`); + } else { + r.push(`${either(`extremely curvy`, `extremely plush`)}.`); + } + } else if (slave.hips > 1) { + r.push(`${either(`extremely curvy`, `extremely plush`)}, but ${his} huge hips make the extra weight attractive on ${him}.`); + } else { + r.push(`<span class="red">${either(`carrying a lot of extra weight`, `fat`, `overweight`)}.</span>`); + } + } else if (slave.weight > 30) { + if (V.arcologies[0].FSHedonisticDecadence !== "unset") { + if (slave.hips > 1) { + r.push(`${either(`quite curvy`, `very plush`)}, ${his} motherly hips adding to ${his} soft appeal.`); + } else { + r.push(`${either(`quite curvy`, `very plush`)}.`); + } + } else if (slave.hips > 1) { + r.push(`${either(`quite curvy`, `very plush`)}, but ${his} motherly hips make the extra weight attractive on ${him}.`); + } else { + r.push(`<span class="red">${either(`carrying extra weight`, `chubby`)}.</span>`); + } + } else if (slave.weight > 10) { + r.push(either(`nicely plush.`, `pleasingly curvy.`)); + } else if (slave.weight >= -10) { + r.push(either(`a healthy weight.`, `an attractive weight for ${his} frame.`, `neither too fat nor too skinny.`)); + } else if (slave.weight >= -30) { + r.push(either(`appealingly skinny.`, `pleasingly thin.`)); + } else if (slave.weight >= -95) { + if (slave.hips > 1) { + r.push(`${either(`quite skinny`, `very thin`)}, but ${his} wide hips make the gap between ${his} thighs very noticeable.`); + } else if (slave.hips < -1) { + r.push(`${either(`quite skinny`, `very thin`)}, but ${his} trim hips make ${him} look like a model.`); + } else { + r.push(`<span class="red">${either(`rail thin`, `too skinny`, `underweight`)}.</span>`); + } + } else { + r.push(`<span class="red">${either(`dangerously skinny`, `emaciated`)}.</span>`); + } + return r.join(" "); + } + function FS() { + const r = []; + + if (V.arcologies[0].FSStatuesqueGlorification !== "unset") { + if (heightPass(slave)) { + r.push(`${He} is tall enough`); + if (setup.heightBoostingShoes.includes(slave.shoes)) { + r.push(`in ${his} ${heightToEitherUnit(heelLength(slave))} ${slave.shoes}`); + } + r.push(`to measure up to society's strict tastes.`); + } else { + r.push(`${He} fails to measure up to society's strict`); + if (setup.heightBoostingShoes.includes(slave.shoes)) { + r.push(`tastes even with ${his} ${heightToEitherUnit(heelLength(slave))} ${slave.shoes}`); + } else { + r.push(`tastes.`); + } + } + } else if (V.arcologies[0].FSPetiteAdmiration !== "unset") { + if (heightPass(slave)) { + r.push(`Society finds ${him} adorably short.`); + } else if (slave.height >= 170) { + r.push(`Society finds ${him} distastefully tall.`); + } + } + + if (V.arcologies[0].FSGenderFundamentalistLawBeauty + V.arcologies[0].FSGenderRadicalistLawBeauty > 0) { + if (V.arcologies[0].FSHedonisticDecadence === "unset" && V.arcologies[0].FSPhysicalIdealistStrongFat === 0) { + if (slave.weight > 130) { + r.push(`${He} is much too fat for the fashionable feminine ideal.`); + } else if (slave.weight > 30) { + r.push(`${He} is too fat for the fashionable feminine ideal.`); + } else if (slave.weight < -30) { + r.push(`${He} is too skinny for the fashionable feminine ideal.`); + } + } else { + if (slave.weight > 130) { + r.push(`${He} is much too fat for the fashionable feminine ideal.`); + } else if (slave.weight < -30) { + r.push(`${He} is too skinny for the fashionable feminine ideal.`); + } + } + } else if (V.arcologies[0].FSSlimnessEnthusiastLaw === 1) { + if (V.arcologies[0].FSHedonisticDecadence === "unset" && V.arcologies[0].FSPhysicalIdealistStrongFat === 0) { + if (slave.weight > 30) { + r.push(`${He} is much too fat for the fashionable feminine ideal.`); + } else if (slave.weight > 10) { + r.push(`${He} is too fat for the fashionable feminine ideal.`); + } + } else { + if (slave.weight > 60) { + r.push(`${He} is much too fat for the fashionable feminine ideal.`); + } else if (slave.weight > 30) { + r.push(`${He} is too fat for the fashionable feminine ideal.`); + } + } + } else if (V.arcologies[0].FSHedonisticDecadenceLaw2 === 1) { + if (slave.weight <= 95) { + r.push(`${He} is too thin for the fashionable feminine ideal.`); + } else if (slave.weight <= 10) { + r.push(`${He} is much too thin for the fashionable feminine ideal.`); + } + } + return r.join(" "); + } + function travel() { + const r = []; + if (canWalk(slave)) { + if (slave.weight > (170 + (slave.muscles / 5)) && slave.physicalAge >= 18) { + r.push(`${He} is so fat that it is difficult for ${him} to move.`); + if (slave.muscles > 95) { + r.push(`However, ${he} is so powerfully built that ${he} can manage it with effort, though ${he} often has to stop for breaks.`); + } else if (slave.muscles > 30) { + r.push(`${He} can barely manage to get to ${his} feet unaided, and usually walks alongside objects to help relieve the weight.`); + } else if (slave.muscles > 5) { + r.push(`${He} requires assistance to get to ${his} feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit.`); + } else { + r.push(`${He} cannot get to ${his} feet unaided, and tries to stay seated as much as ${he} can.`); + } + } else if (slave.weight > (110 + (slave.muscles / 20)) && slave.physicalAge <= 3) { + r.push(`${He} is so fat that it is difficult for ${him} to move.`); + if (slave.muscles > 95) { + r.push(`However, ${he} is so powerfully built that ${he} can manage it with effort, though ${he} often has to stop for breaks.`); + } else if (slave.muscles > 30) { + r.push(`${He} can barely manage to get to ${his} feet unaided, and usually walks alongside objects to help relieve the weight.`); + } else if (slave.muscles > 5) { + r.push(`${He} requires assistance to get to ${his} feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit.`); + } else { + r.push(`${He} cannot get to ${his} feet unaided, and tries to stay seated as much as ${he} can.`); + } + } else if (slave.weight > (140 + (slave.muscles / 15)) && slave.physicalAge <= 12) { + r.push(`${He} is so fat that it is difficult for ${him} to move.`); + if (slave.muscles > 95) { + r.push(`However, ${he} is so powerfully built that ${he} can manage it with effort, though ${he} often has to stop for breaks.`); + } else if (slave.muscles > 30) { + r.push(`${He} can barely manage to get to ${his} feet unaided, and usually walks alongside objects to help relieve the weight.`); + } else if (slave.muscles > 5) { + r.push(`${He} requires assistance to get to ${his} feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit.`); + } else { + r.push(`${He} cannot get to ${his} feet unaided, and tries to stay seated as much as ${he} can.`); + } + } else if (slave.weight > (165 + (slave.muscles / 10)) && slave.physicalAge < 18) { + r.push(`${He} is so fat that it is difficult for ${him} to move.`); + if (slave.muscles > 95) { + r.push(`However, ${he} is so powerfully built that ${he} can manage it with effort, though ${he} often has to stop for breaks.`); + } else if (slave.muscles > 30) { + r.push(`${He} can barely manage to get to ${his} feet unaided, and usually walks alongside objects to help relieve the weight.`); + } else if (slave.muscles > 5) { + r.push(`${He} requires assistance to get to ${his} feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit.`); + } else { + r.push(`${He} cannot get to ${his} feet unaided, and tries to stay seated as much as ${he} can.`); + } + } + } + return r.join(" "); + } + function muscles() { + const r = []; + r.push(`${He} is`); + if (slave.muscles > 95) { + r.push(`<span class="pink">extremely muscular,</span> with defined pecs, powerful glutes, and massive`); + if (slave.weight > 95) { + r.push(`traps hidden beneath a layer of fat`); + } else { + r.push(`traps.`); + } + } else if (slave.muscles > 50) { + r.push(`<span class="pink">quite muscular,</span> with ripped abs, strong shoulders, and defined`); + if (slave.weight > 95) { + r.push(`lats hidden beneath a layer of fat`); + } else { + r.push(`lats.`); + } + } else if (slave.muscles > 30) { + r.push(`<span class="pink">well built,</span> yet feminine with defined abs and strong shapely`); + if (slave.weight > 95) { + r.push(`muscles hidden beneath a layer of fat`); + } else { + r.push(`muscles.`); + } + } else if (slave.muscles > 5) { + r.push(`<span class="pink">well built,</span> yet feminine, with just-visible`); + if (slave.weight > 30) { + r.push(`muscles hidden beneath a layer of fat`); + } else { + r.push(`muscles.`); + } + } else if (slave.muscles > -6) { + r.push(`<span class="pink">soft and feminine,</span> with no visible muscles.`); + } else if (slave.muscles > -31) { + r.push(`<span class="pink">rather weak,</span> with barely any muscles.`); + } else if (slave.muscles > -96) { + r.push(`<span class="pink">very weak;</span> ${he} struggles with day-to-day tasks.`); + } else { + r.push(`<span class="red">frail;</span> ${he} can barely hold ${himself} up.`); + } + + if (V.arcologies[0].FSGenderFundamentalistLawBeauty + V.arcologies[0].FSGenderRadicalistLawBeauty + V.arcologies[0].FSSlimnessEnthusiastLaw > 0 && V.arcologies[0].FSPhysicalIdealist === "unset" && V.arcologies[0].FSHedonisticDecadenceStrongFat === 0) { + if (V.arcologies[0].FSPhysicalIdealistLaw > 0 && slave.muscles > 50) { + r.push(`${He} is entirely too muscular for the fashionable feminine ideal.`); + } else if (slave.muscles > 30) { + r.push(`${He} is entirely too muscular for the fashionable feminine ideal.`); + } + } + return r.join(" "); + } +}; diff --git a/src/npc/descriptions/legs.js b/src/npc/descriptions/legs.js new file mode 100644 index 0000000000000000000000000000000000000000..1282f78d05cc4b8aebf05b61471aa2a4d6fb9a69 --- /dev/null +++ b/src/npc/descriptions/legs.js @@ -0,0 +1,131 @@ +/** + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ +App.Desc.legs = function(slave) { + const r = []; + const { + his, He + } = getPronouns(slave); + + if (hasAnyNaturalLegs(slave)) { + if (slave.weight > 190) { + r.push(`${He} has`); + if (hasBothNaturalLegs(slave)) { + r.push(`extremely fat legs with immense soft, rather uneven`); + if (slave.muscles > 5) { + r.push(`thighs and`); + } else { + r.push(`thighs.`); + } + } else { + r.push(`an extremely fat leg with an immense soft, rather uneven`); + if (slave.muscles > 5) { + r.push(`thigh and`); + } else { + r.push(`thigh.`); + } + } + } else if (slave.weight > 160) { + r.push(`${He} has`); + if (hasBothNaturalLegs(slave)) { + r.push(`very fat legs with massively thick, soft, somewhat uneven`); + if (slave.muscles > 5) { + r.push(`thighs and`); + } else { + r.push(`thighs.`); + } + } else { + r.push(`a very fat leg with a massively thick, soft, somewhat uneven`); + if (slave.muscles > 5) { + r.push(`thigh and`); + } else { + r.push(`thigh.`); + } + } + } else if (slave.weight > 130) { + r.push(`${He} has`); + if (hasBothNaturalLegs(slave)) { + r.push(`fat legs with hugely thick, soft`); + if (slave.muscles > 5) { + r.push(`thighs and`); + } else { + r.push(`thighs.`); + } + } else { + r.push(`a fat leg with a hugely thick, soft`); + if (slave.muscles > 5) { + r.push(`thigh and`); + } else { + r.push(`thigh.`); + } + } + } else if (slave.weight > 97) { + r.push(`${He} has`); + if (hasBothNaturalLegs(slave)) { + r.push(`fat legs with thick, soft`); + if (slave.muscles > 5) { + r.push(`thighs and`); + } else { + r.push(`thighs.`); + } + } else { + r.push(`a fat leg with a thick, soft`); + if (slave.muscles > 5) { + r.push(`thigh and`); + } else { + r.push(`thigh.`); + } + } + } else if (slave.weight > 95) { + r.push(`${He} has`); + if (hasBothNaturalLegs(slave)) { + r.push(`normal legs with thick, soft`); + if (slave.muscles > 5) { + r.push(`thighs and`); + } else { + r.push(`thighs.`); + } + } else { + r.push(`a normal leg with a thick, soft`); + if (slave.muscles > 5) { + r.push(`thigh and`); + } else { + r.push(`thigh.`); + } + } + } else if (slave.muscles > 5) { + r.push(`${He} has`); + if (hasBothNaturalLegs(slave)) { + r.push(`relatively normal legs and thighs`); + } else { + r.push(`a relatively normal leg and thigh`); + } + r.push(`with`); + } + + if (slave.muscles > 95) { + if (slave.weight > 95) { + r.push(`huge muscles hidden beneath ${his} soft flab.`); + } else { + r.push(`huge muscles.`); + } + } else if (slave.muscles > 30) { + if (slave.weight > 95) { + r.push(`obvious muscles hidden beneath ${his} soft flab.`); + } else { + r.push(`obvious muscles.`); + } + } else if (slave.muscles > 5) { + if (slave.weight > 30) { + r.push(`toned muscles hidden beneath ${his} soft flab.`); + } else { + r.push(`toned muscles.`); + } + } else { + // barely any muscle in them. + } + } + return r.join(" "); +}; + diff --git a/src/npc/descriptions/longSlave.js b/src/npc/descriptions/longSlave.js new file mode 100644 index 0000000000000000000000000000000000000000..2ebeb71c204ee9011e8d1e6ff90db757a7e3ac5a --- /dev/null +++ b/src/npc/descriptions/longSlave.js @@ -0,0 +1,587 @@ +/** + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ +App.Desc.longSlave = function({slave = V.activeSlave, saleDescription = V.saleDescription, showClothing = V.showClothing, eventDescription = V.eventDescription} = {}) { + const r = []; + const { + He, His, him, he, his + } = getPronouns(slave); + + SlaveStatClamp(slave); + + r.push(`<span id="artFrame">`); + if (V.seeImages === 1 && eventDescription !== 1 && passage() !== "Slave Interact") { + if (V.imageChoice === 1) { + r.push(`<div class="imageRef lrgVector"><div class="mask"> </div>${SlaveArt(slave, 3, 0)}</div>`); + } else { + r.push(`<div class="imageRef lrgRender"><div class="mask"> </div>${SlaveArt(slave, 3, 0)}</div>`); + } + } + r.push(`</span>`); + + r.push(`<p><span class="slave name simple">${SlaveFullName(slave)}</span>`); + + if (slave.custom.label) { + r.push(`(<span class="yellow"><span style="font-weight:bold">${slave.custom.label}</span></span>)`); + } + + if (saleDescription === 1 && V.ui !== "start") { + if (V.applyLaw === 1) { + r.push(`has passed inspection to be sold in your arcology.`); + r.push(App.Desc.lawCompliance(slave)); // includes CheckForGingering + } else { + r.push(`is for sale and is available to inspect.`); + if (V.prisonCrime) { + // reports a slave's crime in the criminal market + r.push(`${He} ${V.prisonCrime}`); + V.prisonCrime = 0; + } + } + r.push(`</p><p class="indent"><span style="font-weight:bold">${slave.slaveName}</span>`); + } + + r.push(`is`); + if (slave.devotion < -95) { + r.push(`a <span class="darkviolet">hate-filled,</span>`); + } else if (slave.devotion < -50) { + r.push(`a <span class="darkviolet">hateful,</span>`); + } else if (slave.devotion < -20) { + r.push(`a <span class="mediumorchid">reluctant,</span>`); + } else if (slave.devotion <= 20) { + r.push(`a <span class="yellow">hesitant,</span>`); + } else if (slave.devotion <= 50) { + r.push(`an <span class="hotpink">accepting,</span>`); + } else if (slave.devotion <= 95) { + r.push(`a <span class="deeppink">devoted,</span>`); + } else { + r.push(`a <span class="magenta">worshipful,</span>`); + } + if (slave.trust < -95) { + r.push(`<span class="goldenrod">abjectly terrified</span>`); + } else if (slave.trust < -50) { + r.push(`<span class="goldenrod">terrified</span>`); + } else if (slave.trust < -20) { + r.push(`<span class="gold">frightened</span>`); + } else if (slave.trust < 20) { + r.push(`<span class="yellow">fearful</span>`); + } else if (slave.trust <= 50) { + if (slave.devotion < -20) { + r.push(`<span class="orange">careful</span>`); + } else { + r.push(`<span class="mediumaquamarine">careful</span>`); + } + } else if (slave.trust < 95) { + if (slave.devotion < -20) { + r.push(`<span class="orangered">bold</span>`); + } else { + r.push(`<span class="mediumseagreen">trusting</span>`); + } + } else { + if (slave.devotion < -20) { + r.push(`<span class="darkred">defiant</span>`); + } else { + r.push(`<span class="seagreen">profoundly trusting</span>`); + } + } + + r.push(`<span class="coral name">${SlaveTitle(slave)}.</span>`); + + if (slave.indenture > -1) { + r.push(`${His}`); + if (slave.indentureRestrictions > 1) { + r.push(`restrictive`); + } else if (slave.indentureRestrictions > 0) { + r.push(`protective`); + } else { + r.push(`unrestricted`); + } + r.push(`indenture`); + if (slave.indenture > 0) { + if (slave.indenture > 1) { + r.push(`has ${slave.indenture} weeks left to run.`); + } else { + r.push(`expires next week.`); + } + } else { + r.push(`expires this week.`); + } + } + + r.push(App.Desc.sceneIntro(slave)); + + r.push(App.Desc.name(slave)); + + r.push(App.Desc.ageAndHealth(slave)); + + if (saleDescription !== 1) { + if (V.clinic !== 0 && V.clinicUpgradeScanner === 1) { + if (slave.chem > 15) { + r.push(`${V.clinicNameCaps}'s scanners score long term carcinogenic buildup in ${his} body at <span class="cyan">${Math.ceil(slave.chem / 10)}.</span>`); + } else { + r.push(`${V.clinicNameCaps}'s scanners confirm that ${he} has good prospects for long term health.`); + } + } + + r.push(App.Desc.geneticQuirkAssessment(slave)); + + if (V.showSexualHistory === 1 && V.ui !== "start") { + r.push(App.Desc.sexualHistory(slave)); + } + } + + r.push(App.Desc.mind(slave)); + + if (saleDescription === 0) { + if (eventDescription === 0) { + if (canSee(slave)) { + if (slave.attrKnown === 1) { + if (slave.assignment !== "work in the dairy" || V.dairyRestraintsSetting > 1) { + if (slave.attrXX > 85 && V.PC.boobs >= 400) { + r.push(`${His} attraction to women is obvious: ${he} can't seem to stop staring at your breasts.`); + } else if ((slave.attrXY > 85) && (V.PC.dick !== 0)) { + r.push(`${His} attraction to men is obvious: ${he} can't seem to stop glancing down at your package.`); + } else if ((slave.attrXY > 85) && V.PC.title === 1 && (V.PC.boobs < 300)) { + r.push(`${His} attraction to men is obvious: ${he} can't seem to stop checking out your broad chest.`); + } + } + } + } + } + } + + r.push(App.Desc.family(slave)); + + r.push(App.Desc.relationRival(slave)); + + if (slave.bodySwap > 0) { + if (slave.origBodyOwner !== "") { + r.push(`${He} currently possesses ${slave.origBodyOwner}'s body.`); + } + if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0 && slave.origBodyOwnerID > 0) { + if (getSlave(slave.origBodyOwnerID)) { + r.push(`${He} is fully aware that ${SlaveFullName(getSlave(slave.origBodyOwnerID))} is in ${his} old body.`); + } + } + } + + r.push(`</p><p class="indent">`); + + if (saleDescription === 0) { + if (slave.origin !== 0) { + r.push(pronounsForSlaveProp(slave, slave.origin)); + } + } + + r.push(App.Desc.career(slave)); + + r.push(App.Desc.prestige(slave)); + + r.push(App.Desc.skills(slave)); + + if (slave.custom.desc !== "" && slave.custom.desc) { + r.push(slave.custom.desc); + } + + if (V.arcologies[0].FSGenderFundamentalistLawBeauty + V.arcologies[0].FSGenderRadicalistLawBeauty > 0) { + if (genderLawPass(slave) === 1) { + r.push(`${His} body is a perfect example of the fashionable feminine ideal.`); + } + } else if (V.arcologies[0].FSSlimnessEnthusiastLaw === 1) { + if (slimLawPass(slave) === 1) { + r.push(`${His} body is a perfect example of the fashionable ideal flat body.`); + } + } else if (V.arcologies[0].FSHedonisticDecadenceLaw2 === 1) { + if (slave.boobs >= 2000 && slave.butt >= 5 && slave.weight > 95) { + r.push(`${His} body is a perfect example of the fashionable plump body.`); + } + } + + if (V.arcologies[0].FSRestartSMR > 0 && V.arcologies[0].FSRestart > 80 && (slave.dick === 0) && (slave.balls === 0) && (slave.ovaries === 0) && (slave.mpreg === 0) && (slave.vagina < 0)) { + r.push(`${His} body is a perfect example of a subhuman who has accepted their place in society.`); + } + + if (V.arcologies[0].FSIntellectualDependencyLawBeauty === 1) { + r.push(`${He} currently is graded`); + switch (bimboScore(slave)) { + case 6: + r.push(`an S-class`); + break; + case 5: + r.push(`an A-class`); + break; + case 4: + r.push(`a B-class`); + break; + case 3: + r.push(`a C-class`); + break; + case 2: + r.push(`a D-class`); + break; + case 1: + r.push(`an E-class`); + break; + default: + r.push(`an F-class`); + } + r.push(`bimbo by societal trends.`); + } + + if (V.showScores !== 0) { + r.push(`Currently, ${he} has an`); + r.push(`<span class="pink">`); + r.push(`<span style="font-weight:bold">`); + r.push(`attractiveness score`); + r.push(`</span>`); + r.push(`of`); + r.push(`<span class="text-decoration-line: underline">`); + r.push(`<span id="BeautyTooltip" style="font-weight:bold">`); + if (V.cheatMode || V.debugMode) { + r.push(App.UI.link(Beauty(slave), () => BeautyTooltip(slave))); + } else { + r.push(Beauty(slave)); + } + r.push(`</span>`); + r.push(`</span>`); + r.push(`</span>`); + r.push(`and a`); + r.push(`<span class="lightcoral">`); + r.push(`<span style="font-weight:bold">`); + r.push(`sexual score`); + r.push(`</span>`); + r.push(`of`); + r.push(`<span class="text-decoration-line: underline">`); + r.push(`<span id="FResultTooltip" style="font-weight:bold">`); + if (V.cheatMode || V.debugMode) { + r.push(App.UI.link(FResult(slave), () => FResultTooltip(slave))); + } else { + r.push(`${FResult(slave)}.`); + } + r.push(`</span>`); + r.push(`</span>`); + r.push(`</span>`); + } + + r.push(`</p><p class="indent">`); + + r.push(App.Desc.limbs(slave)); + + r.push(App.Desc.clothing(slave)); + r.push(App.Desc.armwear(slave)); + if (V.showBodyMods === 1) { + r.push(App.Desc.clothingCorset(slave)); + } + + if (showClothing === 1 && saleDescription === 0) { + r.push(`${He}`); + } else { + r.push(`${slave.slaveName}`); + } + + r.push(App.Desc.dimensions(slave)); + + r.push(App.Desc.bodyguard(slave)); + + if ((slave.counter.pitWins + slave.counter.pitLosses) > 0) { + r.push(`${He} has participated in ${num(slave.counter.pitWins + slave.counter.pitLosses)} pit fights, with ${slave.counter.pitWins} wins and ${slave.counter.pitLosses} losses.`); + } + + if (slave.counter.pitKills > 0) { + r.push(`${slave.counter.pitKills} slaves have died by ${his} hand in pit fights.`); + } + + r.push(App.Desc.piercing(slave, "corset")); + + r.push(App.Desc.pregnancy(slave)); + + r.push(App.Desc.legs(slave)); + + r.push(App.Desc.mods(slave, "thigh")); + r.push(App.Desc.mods(slave, "calf")); + r.push(App.Desc.mods(slave, "ankle")); + r.push(App.Desc.mods(slave, "foot")); + r.push(App.Desc.heels(slave, "foot")); + r.push(App.Desc.skin(slave)); + + if (saleDescription === 1) { + r.push(App.Desc.accent(slave)); + } + + let scarCounter = 0; + for (let scarName in slave.scar) { + if (slave.ID === V.Bodyguard.ID && scarCounter > 1) { + r.push(`${His} scars make ${him} look even more menacing than ${he} actually is.`); + break; + } else if ((slave.ID === V.Bodyguard.ID) && slave.scar[scarName].menacing > 0) { + r.push(`${His} menacing scar makes ${him} look terrifying.`); + break; + } else if ((slave.ID === V.Wardeness.ID) && scarCounter > 1) { + r.push(`${His} scars make ${him} look like ${he}'s in the right place.`); + break; + } + scarCounter++; + } + + if (slave.fuckdoll === 0) { + if (slave.markings === "birthmark" && slave.prestige === 0 && slave.porn.prestige < 2) { + r.push(`${He} has a large, liver-colored birthmark, detracting from ${his} beauty.`); + } + if (slave.skin === "sun tanned") { + if ((slave.rules.release.slaves === 1) || App.Utils.hasFamilySex(slave)) { + if (slave.fetishStrength > 60 && slave.fetishKnown === 1) { + r.push(`${His} tan is slightly uneven, since ${he} enjoys`); + if (slave.fetish === "buttslut") { + r.push(`letting other tanned slaves share a tanning bed with ${him} so they can sodomize ${him} while ${he} tans.`); + } else if ((slave.fetish === "cumslut")) { + r.push(`letting other tanned slaves share a tanning bed with ${him} so they get oral from ${him} while ${he} tans.`); + } else if ((slave.fetish === "sadist")) { + r.push(`forcing inferior slaves into the tanning beds with ${him} so ${he} can sodomize them while ${he} tans.`); + } else if ((slave.fetish === "dom")) { + r.push(`bringing other slaves into the tanning beds with ${him} so ${he} can fuck them while ${he} tans.`); + } else if ((slave.fetish === "masochist") || (slave.fetish === "submissive")) { + r.push(`letting other slaves into the tanning beds with ${him} so they can fuck ${him} while ${he} tans.`); + } else if ((slave.fetish === "boobs")) { + r.push(`bringing other slaves into the tanning beds with ${him} so ${he} can tittyfuck them while ${he} tans.`); + } else if ((slave.fetish === "pregnancy") && (jsRandom(0, 99) < V.seeDicks)) { + r.push(`letting slaves with dicks into the tanning beds with ${him} so they can cum inside ${him} while ${he} tans.`); + } else { + r.push(`bringing other slaves into the tanning beds with ${him} to have sex while ${he} tans.`); + } + } + } + } + } + + if (slave.fuckdoll === 0) { + // Describe any brands that are not directly addressed elsewhere in longSlave + r.push(App.Desc.mods(slave, "extra")); + } + + if (showClothing === 1 && saleDescription === 0) { + r.push(App.Desc.ears(slave)); + r.push(App.Desc.upperFace(slave)); + r.push(App.Desc.hair(slave)); + } else { + r.push(`${His} hair is ${slave.hColor}`); + } + if (slave.hColor !== slave.eyebrowHColor) { + r.push(r.pop() + `, with ${slave.eyebrowHColor} eyebrows`); + } else { + r.push(r.pop() + `.`); + } + + if (slave.fuckdoll === 0) { + if (slave.hColor === "red") { + if (slave.hLength >= 10) { + if (slave.markings === "freckles" || slave.markings === "heavily freckled") { + if (skinToneLevel(slave.skin) > 5 && skinToneLevel(slave.skin) < 10) { + r.push(`It goes perfectly with ${his} ${slave.skin} skin and freckles.`); + } + } + } + } + + const pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY); + if (slave.physicalAge < pubertyAge - 2) { + r.push(`${He} is too sexually immature to have armpit hair.`); + } else if (slave.underArmHStyle === "hairless") { + r.push(`${His} armpits are perfectly smooth and naturally hairless.`); + } else if (slave.underArmHStyle === "bald") { + r.push(`${His} armpits no longer grow hair, leaving them smooth and hairless.`); + } else if (slave.underArmHStyle === "waxed") { + if (slave.assignment === "work in the dairy" && V.dairyRestraintsSetting > 1) { + r.push(`${His} armpit hair has been removed to prevent chafing.`); + } else { + r.push(`${His} armpits are waxed and smooth.`); + } + } else if ((slave.physicalAge < pubertyAge - 1)) { + r.push(`${He} has a few ${slave.underArmHColor} wisps of armpit hair.`); + } else if ((slave.physicalAge < pubertyAge)) { + r.push(`${He} is on the verge of puberty and has a small patch of ${slave.underArmHColor} armpit hair.`); + } else if (slave.underArmHStyle === "shaved") { + r.push(`${His} armpits appear hairless, but closer inspection reveals light, ${slave.underArmHColor} stubble.`); + } else if (slave.underArmHStyle === "neat") { + r.push(`${His} armpit hair is neatly trimmed`); + if (!hasBothArms(slave)) { + r.push(`since`); + if (hasAnyArms(slave)) { + r.push(`at least half`); + } else { + r.push(`it`); + } + r.push(`is always in full view.`); + } else { + r.push(`to not be visible unless ${he} lifts ${his} arms.`); + } + } else if (slave.underArmHStyle === "bushy") { + r.push(`${His} ${slave.underArmHColor} armpit hair has been allowed to grow freely,`); + if (!hasAnyArms(slave)) { + r.push(`creating two bushy patches under where ${his} arms used to be.`); + } else { + r.push(`so it can be seen poking out from under ${his}`); + if (hasBothArms(slave)) { + r.push(`arms`); + } else { + r.push(`arm`); + } + r.push(`at all times.`); + } + } + } + + if (slave.voice === 0) { + r.push(`${He} is <span class="pink">completely silent,</span> which is understandable, since ${he}'s mute.`); + } else { + if (slave.lips > 95) { + r.push(`${He} is <span class="pink">effectively mute,</span> since ${his} lips are so large that ${he} can no longer speak intelligibly. ${He} can still`); + if (slave.devotion > 50) { + r.push(`moan`); + } else if (slave.devotion > 20) { + r.push(`whimper`); + } else { + r.push(`scream`); + } + r.push(`through them, though.`); + } + } + + if (V.showBodyMods === 1) { + if (slave.fuckdoll > 0) { + if (slave.earPiercing + slave.eyebrowPiercing + slave.nosePiercing > 0) { + r.push(`The piercings on ${his} head run through ${his} suit, helping secure the material to ${his} head.`); + } + } else { + r.push(App.Desc.mods(slave, "ear")); + r.push(App.Desc.mods(slave, "nose")); + r.push(App.Desc.mods(slave, "eyebrow")); + r.push(App.Desc.mods(slave, "cheek")); + r.push(App.Desc.mods(slave, "neck")); + if (slave.custom.tattoo !== "" && slave.custom.tattoo) { + r.push(slave.custom.tattoo); + } + } + } + + r.push(App.Desc.horns(slave)); + r.push(App.Desc.face(slave)); + r.push(App.Desc.mouth(slave)); + + if (showClothing === 1 && saleDescription === 0) { + if (slave.fuckdoll === 0) { + r.push(App.Desc.collar(slave)); + r.push(App.Desc.faceAccessory(slave)); + r.push(App.Desc.mouthAccessory(slave)); + if (slave.relationship > 4) { + if (hasAnyArms(slave)) { + r.push(`${He} has a simple gold band on the little finger of ${his}`); + if (!hasLeftArm(slave)) { + r.push(`right`); + } else { + r.push(`left`); + } + r.push(`hand.`); + } else { + r.push(`${He} has a simple gold band on a length of chain around ${his} neck.`); + } + } else if ((slave.relationship === -3)) { + if (hasAnyArms(slave)) { + r.push(`${He} has a simple steel band on the little finger of ${his}`); + if (!hasLeftArm(slave)) { + r.push(`right`); + } else { + r.push(`left`); + } + r.push(`hand.`); + } else { + r.push(`${He} has a simple steel band on a length of cord around ${his} neck.`); + } + } + } + } + + if (slave.fuckdoll === 0) { + r.push(App.Desc.nails(slave)); + } + r.push(App.Desc.mods(slave, "back")); + r.push(App.Desc.mods(slave, "shoulder")); + r.push(App.Desc.mods(slave, "upper arm")); + r.push(App.Desc.mods(slave, "lower arm")); + r.push(App.Desc.mods(slave, "hand")); + r.push(App.Desc.mods(slave, "wrist")); + + if (slave.fuckdoll === 0) { + if (slave.minorInjury !== 0) { + if (slave.minorInjury !== "sore ass") { + r.push(`${He} is sporting a <span class="red">${slave.minorInjury},</span> covered by makeup.`); + } + } + } + if (slave.health.illness > 0) { + if (slave.fuckdoll === 0) { + r.push(`${He}`); + } else { + r.push(`${His} suit reports that ${he}`); + } + if (slave.health.illness === 1) { + if (slave.fuckdoll === 0) { + r.push(`is <span class="red">feeling under the weather.</span>`); + } else { + r.push(`has <span class="red">fallen ill.</span>`); + } + } else if (slave.health.illness === 2) { + r.push(`is <span class="red">somewhat ill.</span>`); + } else if (slave.health.illness === 3) { + r.push(`is <span class="red">sick.</span>`); + } else if (slave.health.illness === 4) { + r.push(`is <span class="red">very sick.</span>`); + } else if (slave.health.illness === 5) { + r.push(`is <span class="red">terribly ill.</span>`); + } + } + + r.push(`</p><p class="indent">`); + + // Calling all boob widgets + r.push(App.Desc.boobs(slave)); + r.push(App.Desc.boobsShape(slave)); + r.push(App.Desc.boobsExtra(slave)); + r.push(App.Desc.mods(slave, "chest")); + r.push(App.Desc.mods(slave, "breast")); + r.push(App.Desc.shoulders(slave)); + r.push(App.Desc.nipples(slave)); + r.push(App.Desc.mods(slave, "nipple")); + r.push(App.Desc.areola(slave)); + r.push(App.Desc.mods(slave, "areolae")); + + if (slave.inflation > 0) { + // to be obsoleted with phase 4 + r.push(App.Desc.bellyInflation(slave)); + } else if (slave.bellyImplant >= 2000) { + r.push(App.Desc.bellyImplant(slave)); + } else { + r.push(App.Desc.belly(slave)); + } + r.push(App.Desc.mods(slave, "belly")); + r.push(App.Desc.butt(slave)); + + r.push(`</p><p class="indent">`); + + r.push(App.Desc.crotch(slave)); + r.push(App.Desc.dick(slave)); + r.push(App.Desc.vagina(slave)); + + r.push(App.Desc.anus(slave)); + + if (slave.fuckdoll === 0) { + r.push(`</p><p class="indent">`); + r.push(App.Desc.drugs(slave)); + } + r.push(`</p>`); + V.saleDescription = 0; + V.applyLaw = 0; + // clear sale and law flags, if set + + return r.join(" "); +}; + diff --git a/src/npc/descriptions/prestige.js b/src/npc/descriptions/prestige.js new file mode 100644 index 0000000000000000000000000000000000000000..a64107b3ea33215bbcb2a036addd20b9fbb652a4 --- /dev/null +++ b/src/npc/descriptions/prestige.js @@ -0,0 +1,44 @@ +/** + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ +App.Desc.prestige = function(slave) { + const r = []; + const { + He, him, he, his + } = getPronouns(slave); + + if (slave.prestige > 0) { + if (slave.prestigeDesc) { + r.push(pronounsForSlaveProp(slave, slave.prestigeDesc)); + } + if (slave.prestige > 2) { + r.push(`<span class="green">It is extremely prestigious to own ${him}.</span>`); + } else if (slave.prestige > 1) { + r.push(`<span class="green">It is quite prestigious to own ${him}.</span>`); + } else { + r.push(`<span class="green">It is fairly prestigious to own ${him}.</span>`); + } + } + + if (slave.porn.prestige > 0) { + if (slave.porn.prestigeDesc) { + r.push(pronounsForSlaveProp(slave, slave.porn.prestigeDesc)); + } + if (slave.porn.prestige > 2) { + r.push(`As such, ${he} tends to gain a following wherever ${he} goes.`); + } else if (slave.porn.prestige > 1) { + r.push(`As such, ${he} is recognized often.`); + } else { + r.push(`As such, ${he} is recognized occasionally.`); + } + } + + if (slave.prestige > 0 || slave.porn.prestige > 1) { + if (slave.fuckdoll === 0 && slave.markings === "birthmark") { + r.push(`${He} has a large, liver-colored birthmark, but since ${he}'s well known, this uniqueness adds to ${his} beauty rather than detracting from it.`); + } + } + return r.join(" "); +}; + diff --git a/src/npc/descriptions/relationRival.js b/src/npc/descriptions/relationRival.js new file mode 100644 index 0000000000000000000000000000000000000000..68650051dd28a3ea874131233ae4f977416fff9c --- /dev/null +++ b/src/npc/descriptions/relationRival.js @@ -0,0 +1,45 @@ +/** + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ +App.Desc.relationRival = function(slave) { + const r = []; + const { + his, He + } = getPronouns(slave); + + r.push(relative()); + r.push(rival()); + + return r.join(" "); + + function relative() { + if (slave.relationship >= 3 && totalRelatives(slave) > 0) { + const lover = getSlave(slave.relationshipTarget); + if (lover) { + if (relativeTerm(slave, lover) !== null) { + return `${He} is in an <span class="lightgreen">incestuous relationship with ${his} ${relativeTerm(slave, lover)}, ${SlaveFullName(lover)}.</span>`; + } + } + } else if (slave.relationship <= -2) { + if (relativeTerm(slave, V.PC) !== null) { + return `${He} is in an <span class="lightgreen">incestuous relationship with ${his} ${relativeTerm(slave, V.PC)}, you.</span>`; + } + } + } + + function rival() { + if (slave.rivalry !== 0) { + if (getSlave(slave.rivalryTarget)) { + if (slave.rivalry <= 1) { + return `${He} <span class="lightsalmon">dislikes</span> ${SlaveFullName(getSlave(slave.rivalryTarget))}.`; + } else if (slave.rivalry <= 2) { + return `${He} is ${SlaveFullName(getSlave(slave.rivalryTarget))}'s <span class="lightsalmon">rival.</span>`; + } else { + return `${He} <span class="lightsalmon">bitterly hates</span> ${SlaveFullName(getSlave(slave.rivalryTarget))}.`; + } + } + } + } +}; + diff --git a/src/npc/descriptions/skills.js b/src/npc/descriptions/skills.js new file mode 100644 index 0000000000000000000000000000000000000000..9ee1394458dd474ed055a2e7092a98ac13e4248c --- /dev/null +++ b/src/npc/descriptions/skills.js @@ -0,0 +1,75 @@ +/** + * @param {App.Entity.SlaveState} slave + * @returns {string} + */ +App.Desc.skills = function(slave) { + const r = []; + const { + He, girl + } = getPronouns(slave); + + + if (slave.fuckdoll > 0) { + r.push(`${He} is`); + if (slave.fuckdoll <= 10) { + r.push(`poorly adapted to life as a living sex toy.`); + } else if (slave.fuckdoll <= 30) { + r.push(`<span class="aquamarine">moderately adapted to life as a living sex toy.</span>`); + } else if (slave.fuckdoll <= 60) { + r.push(`<span class="aquamarine">well adapted to life as a living sex toy.</span>`); + } else if (slave.fuckdoll < 100) { + r.push(`<span class="aquamarine">almost perfectly adapted to life as a living sex toy.</span>`); + } else { + r.push(`<span class="aquamarine">perfectly adapted to life as a living sex toy.</span>`); + } + r.push(`Entertainment and prostitution skills are irrelevant for a Fuckdoll.`); + } else { + if (slave.skill.whoring <= 10) { + if (slave.skill.entertainment <= 10) { + } else if (slave.skill.entertainment <= 30) { + r.push(`${He} is <span class="aquamarine">reasonably entertaining.</span>`); + } else if (slave.skill.entertainment <= 60) { + r.push(`${He} is a <span class="aquamarine">skilled entertainer.</span>`); + } else if (slave.skill.entertainment < 100) { + r.push(`${He} is an <span class="aquamarine">expert entertainer.</span>`); + } else { + r.push(`${He} is a <span class="aquamarine">master of entertainment.</span>`); + } + } else { + if (slave.skill.entertainment <= 10) { + } else if (slave.skill.entertainment <= 30) { + r.push(`${He} is <span class="aquamarine">reasonably entertaining</span> and`); + } else if (slave.skill.entertainment <= 60) { + r.push(`${He} is a <span class="aquamarine">skilled entertainer</span> and`); + } else if (slave.skill.entertainment < 100) { + r.push(`${He} is an <span class="aquamarine">expert entertainer</span> and`); + } else { + r.push(`${He} is a <span class="aquamarine">master of entertainment</span> and`); + } + } + if (slave.skill.whoring <= 10) { + } else if (slave.skill.whoring <= 30) { + if (slave.skill.entertainment <= 10) { + r.push(`${He}`); + } + r.push(`has <span class="aquamarine">basic experience as a prostitute.</span>`); + } else if (slave.skill.whoring <= 60) { + if (slave.skill.entertainment <= 10) { + r.push(`${He} is`); + } + r.push(`a <span class="aquamarine">skilled streetwalker.</span>`); + } else if (slave.skill.whoring < 100) { + if (slave.skill.entertainment <= 10) { + r.push(`${He} is`); + } + r.push(`an <span class="aquamarine">expert working ${girl}.</span>`); + } else { + if (slave.skill.entertainment <= 10) { + r.push(`${He} is`); + } + r.push(`a <span class="aquamarine">masterful whore.</span>`); + } + } + return r.join(" "); +}; + diff --git a/src/pregmod/incubator.tw b/src/pregmod/incubator.tw index c55f0fcccab0610563a335c5103ed679fb71278f..cd8bed8614fee169bc544f58f8682b9767ce38e6 100644 --- a/src/pregmod/incubator.tw +++ b/src/pregmod/incubator.tw @@ -85,7 +85,7 @@ Reserve an eligible mother-to-be's child to be placed in a tank upon birth. Of $ <<set _pregWeek = $slaves[_u].pregWeek>> <<set _slaveName = SlaveFullName($slaves[_u])>> <div class="possible" @id="_slaveId" @data-preg-count="_pregCount" @data-reserved-spots="_reservedIncubator" @data-preg-week="_pregWeek" @data-name="_slaveName"> - <<print "[[_slaveName|Long Slave Description][$activeSlave = $slaves[" + _u + "], $nextLink = passage()]]">> is $slaves[_u].pregWeek week<<if $slaves[_u].pregWeek > 1>>s<</if>> pregnant with + <<= App.UI.slaveDescriptionDialog($slaves[_u])>> is $slaves[_u].pregWeek week<<if $slaves[_u].pregWeek > 1>>s<</if>> pregnant with <<if $slaves[_u].pregSource == 0 || $slaves[_u].preg <= 5>>someone's<<if $slaves[_u].preg <= 5>>, though it is too early to tell whose,<</if>> <<elseif $slaves[_u].pregSource == -1>>your <<elseif $slaves[_u].pregSource == -2>>a citizen's diff --git a/src/pregmod/killSlave.tw b/src/pregmod/killSlave.tw index 3cb552dfd4e32927b900631597aadb68aea68cdd..79161249e9934f79eef68a671c11ea63e2040de5 100644 --- a/src/pregmod/killSlave.tw +++ b/src/pregmod/killSlave.tw @@ -185,13 +185,11 @@ you <<if canHear($activeSlave)>>quietly <</if>>reach behind your desk and pull o $slaves[_ss].slaveName is @@.mediumorchid;grieved@@ that you have killed _his2 best source of comfort and companionship in a life of bondage. <br><br> <<set $slaves[_ss].devotion -= $slaves[_ss].relationship*10>> - <<set $display = 1>> <</if>> <<elseif $activeSlave.relationship == -3>> Killing one of your slave $wives is @@.red;socially unacceptable.@@ In addition, your other devoted slaves are @@.gold;worried@@ that you may not respect their status. <br><br> <<run repX(-200, "event")>> - <<set $display = 1>> <<for _ss = 0; _ss < $slaves.length; _ss++>> <<if $slaves[_ss].devotion > 50>> <<set $slaves[_ss].trust -= 10>> @@ -205,7 +203,6 @@ you <<if canHear($activeSlave)>>quietly <</if>>reach behind your desk and pull o $slaves[_ss].slaveName is @@.hotpink;pleased@@ that $he won't have to see _his2 rival any more. <br><br> <<set $slaves[_ss].devotion += $slaves[_ss].rivalry*3>> - <<set $display = 1>> <</if>> <</if>> diff --git a/src/uncategorized/clubReport.tw b/src/uncategorized/clubReport.tw index 930a6c113e0044a91fed43750ae0bb7eeed6f9b3..c3537777ab0b052f913f4f6546b45ec0192fce45 100644 --- a/src/uncategorized/clubReport.tw +++ b/src/uncategorized/clubReport.tw @@ -1,6 +1,6 @@ :: Club Report [nobr] -<span id="clubstats" /> +<span id="clubstats"></span> <<set _slaves = App.Utils.sortedEmployees(App.Entity.facilities.club)>> <<set _DL = _slaves.length, _SL = $slaves.length, $clubBonuses = 0, $legendaryEntertainerID = 0, _FLsFetish = 0>> diff --git a/src/uncategorized/longSlaveDescription.tw b/src/uncategorized/longSlaveDescription.tw index d94d60c5a4c80811714c271b8b99d70a76058303..2a94314a41f7534dc7c75281748c93e7441993eb 100644 --- a/src/uncategorized/longSlaveDescription.tw +++ b/src/uncategorized/longSlaveDescription.tw @@ -1,858 +1,2 @@ :: Long Slave Description [nobr] - -<<run SlaveStatClamp($activeSlave)>> -<<setLocalPronouns $activeSlave>> - -<span id="artFrame"> - <<if $seeImages == 1 && $eventDescription != 1 && passage() != "Slave Interact">> - <<if $imageChoice == 1>> - <div class="imageRef lrgVector"><div class="mask"> </div><<= SlaveArt($activeSlave, 3, 0)>></div> - <<else>> - <div class="imageRef lrgRender"><div class="mask"> </div><<= SlaveArt($activeSlave, 3, 0)>></div> - <</if>> - <</if>> -</span> - -<span style="font-weight:bold"><span class="pink"><<= SlaveFullName($activeSlave)>></span></span> - -<<if $activeSlave.custom.label>> (<span class="yellow"><span style="font-weight:bold"><<print $activeSlave.custom.label>></span></span>)<</if>> - -<<if $ui == "start">> -<<elseif $saleDescription == 1>> - <<if $applyLaw == 1>> - has passed inspection to be sold in your arcology. - <<= App.Desc.lawCompliance($activeSlave)>> /* includes CheckForGingering */ - <<else>> - is for sale and is available to inspect. - <<if $prisonCrime>> /* reports a slave's crime in the criminal market */ - $He $prisonCrime - <<set $prisonCrime = 0>> - <</if>> - <</if>> - <br> <span style="font-weight:bold">$activeSlave.slaveName</span> -<</if>> - -is - -<<if $activeSlave.devotion < -95>>a <span class="darkviolet">hate-filled,</span> -<<elseif $activeSlave.devotion < -50>>a <span class="darkviolet">hateful,</span> -<<elseif $activeSlave.devotion < -20>>a <span class="mediumorchid">reluctant,</span> -<<elseif $activeSlave.devotion <= 20>>a <span class="yellow">hesitant,</span> -<<elseif $activeSlave.devotion <= 50>>an <span class="hotpink">accepting,</span> -<<elseif $activeSlave.devotion <= 95>>a <span class="deeppink">devoted,</span> -<<else>>a <span class="magenta">worshipful,</span> -<</if>> -<<if $activeSlave.trust < -95>><span class="goldenrod">abjectly terrified</span> -<<elseif $activeSlave.trust < -50>><span class="goldenrod">terrified</span> -<<elseif $activeSlave.trust < -20>><span class="gold">frightened</span> -<<elseif $activeSlave.trust < 20>><span class="yellow">fearful</span> -<<elseif $activeSlave.trust <= 50>> - <<if $activeSlave.devotion < -20>> - <span class="orange">careful</span> - <<else>> - <span class="mediumaquamarine">careful</span> - <</if>> -<<elseif $activeSlave.trust < 95>> - <<if $activeSlave.devotion < -20>> - <span class="orangered">bold</span> - <<else>> - <span class="mediumseagreen">trusting</span> - <</if>> -<<else>> - <<if $activeSlave.devotion < -20>> - <span class="darkred">defiant</span> - <<else>> - <span class="seagreen">profoundly trusting</span> - <</if>> -<</if>> - -<<set $desc = SlaveTitle($activeSlave)>> -<span style="font-weight:bold"><span class="coral">$desc.</span></span> - -<<if $activeSlave.indenture > -1>> - $His <<if $activeSlave.indentureRestrictions > 1>>restrictive<<elseif $activeSlave.indentureRestrictions > 0>>protective<<else>>unrestricted<</if>> indenture - <<if $activeSlave.indenture > 0>> - <<if $activeSlave.indenture > 1>> - has $activeSlave.indenture weeks left to run. - <<else>> - expires next week. - <</if>> - <<else>> - expires this week. - <</if>> -<</if>> - -<<= App.Desc.sceneIntro($activeSlave)>> - -<<= App.Desc.name($activeSlave)>> - -<<= App.Desc.ageAndHealth($activeSlave)>> - -<<if $saleDescription != 1>> - <<if $clinic != 0 && $clinicUpgradeScanner == 1>> - <<if $activeSlave.chem > 15>> - $clinicNameCaps's scanners score long term carcinogenic buildup in $his body at <span class="cyan"><<print Math.ceil($activeSlave.chem/10)>>.</span> - <<else>> - $clinicNameCaps's scanners confirm that $he has good prospects for long term health. - <</if>> - <</if>> - - <<print App.Desc.geneticQuirkAssessment($activeSlave)>> - - <<if $showSexualHistory == 1 && $ui != "start">> - <<= App.Desc.sexualHistory($activeSlave)>> - <</if>> -<</if>> - -<<= App.Desc.mind($activeSlave)>> - -<<if $saleDescription == 0>> - <<if $eventDescription == 0>> - <<if canSee($activeSlave)>> - <<if ($activeSlave.attrKnown == 1)>> - <<if ($activeSlave.assignment != "work in the dairy") || ($dairyRestraintsSetting > 1)>> - <<if ($activeSlave.attrXX > 85) && ($PC.boobs >= 400)>> - $His attraction to women is obvious: $he can't seem to stop staring at your breasts. - <<elseif ($activeSlave.attrXY > 85) && ($PC.dick != 0)>> - $His attraction to men is obvious: $he can't seem to stop glancing down at your package. - <<elseif ($activeSlave.attrXY > 85) && $PC.title == 1 && ($PC.boobs < 300)>> - $His attraction to men is obvious: $he can't seem to stop checking out your broad chest. - <</if>> - <</if>> - <</if>> - <</if>> - <</if>> -<</if>> - -<<= App.Desc.family($activeSlave)>> - -<<if $activeSlave.relationship >= 3 && totalRelatives($activeSlave) > 0>> - <<set _lover = getSlave($activeSlave.relationshipTarget)>> - <<if def _lover>> - <<set _relTerm = relativeTerm($activeSlave, _lover)>> - <<if _relTerm !== null>> - $He is in an <span class="lightgreen">incestuous relationship with $his _relTerm, <<= SlaveFullName(_lover)>>.</span> - <</if>> - <</if>> -<<elseif $activeSlave.relationship <= -2>> - <<set _relTerm = relativeTerm($activeSlave, $PC)>> - <<if _relTerm !== null>> - $He is in an <span class="lightgreen">incestuous relationship with $his _relTerm, you.</span> - <</if>> -<</if>> - -<<if $activeSlave.rivalry != 0>> - <<set _lsd = $slaveIndices[$activeSlave.rivalryTarget]>> - <<if def _lsd>> - $He - <<if $activeSlave.rivalry <= 1>> - <span class="lightsalmon">dislikes</span> <<= SlaveFullName($slaves[_lsd])>>. - <<elseif $activeSlave.rivalry <= 2>> - is <<= SlaveFullName($slaves[_lsd])>>'s <span class="lightsalmon">rival.</span> - <<else>> - <span class="lightsalmon">bitterly hates</span> <<= SlaveFullName($slaves[_lsd])>>. - <</if>> - <</if>> -<</if>> - -<<if $activeSlave.bodySwap > 0>> - <<if $activeSlave.origBodyOwner !== "">> - $He currently possesses <<print $activeSlave.origBodyOwner>>'s body. - <</if>> - <<if $activeSlave.fetish != "mindbroken" && $activeSlave.fuckdoll == 0 && $activeSlave.origBodyOwnerID > 0>> - <<set _lsd = $slaveIndices[$activeSlave.origBodyOwnerID]>> - <<if def _lsd>> - $He is fully aware that <<= SlaveFullName($slaves[_lsd])>> is in $his old body. - <</if>> - <</if>> -<</if>> - -<br> - -<<if $saleDescription == 0>> - <<if $activeSlave.origin != 0>> - $activeSlave.origin - <</if>> -<</if>> - -<<= App.Desc.career($activeSlave)>> - -<<if $activeSlave.prestige > 0>> - <<if $activeSlave.prestigeDesc>>$activeSlave.prestigeDesc<</if>> - <<if $activeSlave.prestige > 2>> - <span class="green">It is extremely prestigious to own $him.</span> - <<elseif $activeSlave.prestige > 1>> - <span class="green">It is quite prestigious to own $him.</span> - <<else>> - <span class="green">It is fairly prestigious to own $him.</span> - <</if>> -<</if>> - -<<if $activeSlave.porn.prestige > 0>> - <<if $activeSlave.porn.prestigeDesc>>$activeSlave.porn.prestigeDesc<</if>> - <<if $activeSlave.porn.prestige > 2>> - As such, $he tends to gain a following wherever $he goes. - <<elseif $activeSlave.porn.prestige > 1>> - As such, $he is recognized often. - <<else>> - As such, $he is recognized occasionally. - <</if>> -<</if>> - -<<if $activeSlave.prestige > 0 || $activeSlave.porn.prestige > 1>> - <<if $activeSlave.fuckdoll == 0 && $activeSlave.markings == "birthmark">> - $He has a large, liver-colored birthmark, but since $he's well known, this uniqueness adds to $his beauty rather than detracting from it. - <</if>> -<</if>> - -<<if $activeSlave.fuckdoll > 0>> - $He is - <<if $activeSlave.fuckdoll <= 10>> - poorly adapted to life as a living sex toy. - <<elseif $activeSlave.fuckdoll <= 30>> - <span class="aquamarine">moderately adapted to life as a living sex toy.</span> - <<elseif $activeSlave.fuckdoll <= 60>> - <span class="aquamarine">well adapted to life as a living sex toy.</span> - <<elseif $activeSlave.fuckdoll < 100>> - <span class="aquamarine">almost perfectly adapted to life as a living sex toy.</span> - <<else>> - <span class="aquamarine">perfectly adapted to life as a living sex toy.</span> - <</if>> - Entertainment and prostitution skills are irrelevant for a Fuckdoll. -<<else>> - <<if $activeSlave.skill.whoring <= 10>> - <<if $activeSlave.skill.entertainment <= 10>> - <<elseif $activeSlave.skill.entertainment <= 30>> - $He is <span class="aquamarine">reasonably entertaining.</span> - <<elseif $activeSlave.skill.entertainment <= 60>> - $He is a <span class="aquamarine">skilled entertainer.</span> - <<elseif $activeSlave.skill.entertainment < 100>> - $He is an <span class="aquamarine">expert entertainer.</span> - <<else>> - $He is a <span class="aquamarine">master of entertainment.</span> - <</if>> - <<else>> - <<if $activeSlave.skill.entertainment <= 10>> - <<elseif $activeSlave.skill.entertainment <= 30>> - $He is <span class="aquamarine">reasonably entertaining</span> and - <<elseif $activeSlave.skill.entertainment <= 60>> - $He is a <span class="aquamarine">skilled entertainer</span> and - <<elseif $activeSlave.skill.entertainment < 100>> - $He is an <span class="aquamarine">expert entertainer</span> and - <<else>> - $He is a <span class="aquamarine">master of entertainment</span> and - <</if>> - <</if>> - <<if $activeSlave.skill.whoring <= 10>> - <<elseif $activeSlave.skill.whoring <= 30>> - <<if $activeSlave.skill.entertainment <= 10>>$He <</if>>has <span class="aquamarine">basic experience as a prostitute.</span> - <<elseif $activeSlave.skill.whoring <= 60>> - <<if $activeSlave.skill.entertainment <= 10>>$He is <</if>>a <span class="aquamarine">skilled streetwalker.</span> - <<elseif $activeSlave.skill.whoring < 100>> - <<if $activeSlave.skill.entertainment <= 10>>$He is <</if>>an <span class="aquamarine">expert working $girl.</span> - <<else>> - <<if $activeSlave.skill.entertainment <= 10>>$He is <</if>>a <span class="aquamarine">masterful whore.</span> - <</if>> -<</if>> - -<<if ($activeSlave.custom.desc != "") && (def $activeSlave.custom.desc)>> - <<print $activeSlave.custom.desc>> -<</if>> - -<<if $arcologies[0].FSGenderFundamentalistLawBeauty + $arcologies[0].FSGenderRadicalistLawBeauty > 0>> - <<if genderLawPass($activeSlave) == 1>> - $His body is a perfect example of the fashionable feminine ideal. - <</if>> -<<elseif $arcologies[0].FSSlimnessEnthusiastLaw == 1>> - <<if slimLawPass($activeSlave) == 1>> - $His body is a perfect example of the fashionable ideal flat body. - <</if>> -<<elseif $arcologies[0].FSHedonisticDecadenceLaw2 == 1>> - <<if ($activeSlave.boobs >= 2000) && ($activeSlave.butt >= 5) && ($activeSlave.weight > 95)>> - $His body is a perfect example of the fashionable plump body. - <</if>> -<</if>> - -<<if $arcologies[0].FSRestartSMR > 0 && $arcologies[0].FSRestart > 80 && ($activeSlave.dick == 0) && ($activeSlave.balls == 0) && ($activeSlave.ovaries == 0) && ($activeSlave.mpreg == 0) && ($activeSlave.vagina < 0)>> - $His body is a perfect example of a subhuman who has accepted their place in society. -<</if>> - -<<if $arcologies[0].FSIntellectualDependencyLawBeauty == 1>> - $He currently is graded - <<switch bimboScore($activeSlave)>> - <<case 6>> - an S-class - <<case 5>> - an A-class - <<case 4>> - a B-class - <<case 3>> - a C-class - <<case 2>> - a D-class - <<case 1>> - an E-class - <<default>> - an F-class - <</switch>> - bimbo by societal trends. -<</if>> - -<<if ($showScores != 0)>> - Currently, $he has an - <span class="pink"> - <span style="font-weight:bold"> - attractiveness score - </span> - of - <span class="text-decoration-line: underline"> - <span id="BeautyTooltip" style="font-weight:bold"> - <<if $cheatMode || $debugMode>> - <<link "<<= Beauty($activeSlave)>>">> - <<run BeautyTooltip($activeSlave)>> - <</link>> - <<else>> - <<= Beauty($activeSlave)>> - <</if>> - </span> - </span> - </span> - and a - <span class="lightcoral"> - <span style="font-weight:bold"> - sexual score - </span> - of - <span class="text-decoration-line: underline"> - <span id="FResultTooltip" style="font-weight:bold"> - <<if $cheatMode || $debugMode>> - <<link "<<= FResult($activeSlave)>>.">> - <<run FResultTooltip($activeSlave)>> - <</link>> - <<else>> - <<= FResult($activeSlave)>>. - <</if>> - </span> - </span> - </span> -<</if>> - -<br> - -<<= App.Desc.limbs($activeSlave)>> - -<<= App.Desc.clothing($activeSlave)>> -<<= App.Desc.armwear($activeSlave)>> -<<if $showBodyMods == 1>> - <<= App.Desc.clothingCorset($activeSlave)>> -<</if>> - -<<if ($showClothing == 1) && ($saleDescription == 0)>> - $He -<<else>> - $activeSlave.slaveName -<</if>> -<<set _averageHeight = Height.mean($activeSlave)>> -is -<<if $activeSlave.height <= (_averageHeight+5) && $activeSlave.height >= (_averageHeight-5)>> - an average height<<if $activeSlave.physicalAge < 16>> for $his age<</if>> -<<elseif $activeSlave.height < (_averageHeight-15)>> - petite<<if $activeSlave.physicalAge < 16>> for $his age<</if>> -<<elseif $activeSlave.height < (_averageHeight-5)>> - short<<if $activeSlave.physicalAge < 16>> for $his age<</if>> -<<elseif $activeSlave.height > (_averageHeight+15)>> - very tall<<if $activeSlave.physicalAge < 16>> for $his age<</if>> -<<elseif $activeSlave.height > (_averageHeight+5)>> - tall<<if $activeSlave.physicalAge < 16>> for $his age<</if>> -<</if>> -<<if $showHeightCMs == 1>> at <<= heightToEitherUnit($activeSlave.height)>>,<</if>> - -and - -<<if $activeSlave.weight > 190 >> - <<if $arcologies[0].FSHedonisticDecadence != "unset">> - <<print either("perfectly curvy", "perfectly plush")>>. - <<else>> - <span class="red"><<print either("dangerously fat", "dangerously overweight", "extremely obese")>>.</span> - <</if>> -<<elseif $activeSlave.weight > 160 >> - <<if $arcologies[0].FSHedonisticDecadence != "unset">> - <<print either("spectacularly curvy", "spectacularly plush")>>. - <<else>> - <span class="red"><<print either("extremely fat", "extremely overweight", "very obese")>>.</span> - <</if>> -<<elseif $activeSlave.weight > 130 >> - <<if $arcologies[0].FSHedonisticDecadence != "unset">> - <<print either("amazingly curvy", "amazingly plush")>>. - <<else>> - <span class="red"><<print either("obese", "very fat", "very overweight")>>.</span> - <</if>> -<<elseif $activeSlave.weight > 95>> - <<if $arcologies[0].FSHedonisticDecadence != "unset">> - <<print either("extremely curvy", "extremely plush")>><<if $activeSlave.hips > 1>>, $his huge hips complementing $his plushness perfectly<</if>>. - <<elseif $activeSlave.hips > 1>> - <<print either("extremely curvy", "extremely plush")>>, but $his huge hips make the extra weight attractive on $him. - <<else>> - <span class="red"><<print either("carrying a lot of extra weight", "fat", "overweight")>>.</span> - <</if>> -<<elseif $activeSlave.weight > 30>> - <<if $arcologies[0].FSHedonisticDecadence != "unset">> - <<print either("quite curvy", "very plush")>><<if $activeSlave.hips > 1>>, $his motherly hips adding to $his soft appeal<</if>>. - <<elseif $activeSlave.hips > 1>> - <<print either("quite curvy", "very plush")>>, but $his motherly hips make the extra weight attractive on $him. - <<else>> - <span class="red"><<print either("carrying extra weight", "chubby")>>.</span> - <</if>> -<<elseif $activeSlave.weight > 10 >><<print either("nicely plush", "pleasingly curvy")>>. -<<elseif $activeSlave.weight >= -10>><<print either("a healthy weight", "an attractive weight for $his frame", "neither too fat nor too skinny")>>. -<<elseif $activeSlave.weight >= -30>><<print either("appealingly skinny", "pleasingly thin")>>. -<<elseif $activeSlave.weight >= -95>> - <<if $activeSlave.hips > 1>> - <<print either("quite skinny", "very thin")>>, but $his wide hips make the gap between $his thighs very noticeable. - <<elseif $activeSlave.hips < -1>> - <<print either("quite skinny", "very thin")>>, but $his trim hips make $him look like a model. - <<else>> - <span class="red"><<print either("rail thin", "too skinny", "underweight")>>.</span> - <</if>> -<<else>><span class="red"><<print either("dangerously skinny", "emaciated")>>.</span> -<</if>> - -<<if $activeSlave.hips > 2>> - $His hips are unrealistically wide, it is obvious they have been artificially widened. -<</if>> - -<<= App.Desc.waist($activeSlave)>> - -<<if $arcologies[0].FSStatuesqueGlorification != "unset">> - <<if heightPass($activeSlave)>> - $He is tall enough <<if setup.heightBoostingShoes.includes($activeSlave.shoes)>>in $his <<= heightToEitherUnit(heelLength($activeSlave))>> $activeSlave.shoes <</if>>to measure up to society's strict tastes. - <<else>> - $He fails to measure up to society's strict tastes<<if setup.heightBoostingShoes.includes($activeSlave.shoes)>> even with $his <<= heightToEitherUnit(heelLength($activeSlave))>> $activeSlave.shoes<</if>>. - <</if>> -<<elseif $arcologies[0].FSPetiteAdmiration != "unset">> - <<if heightPass($activeSlave)>> - Society finds $him adorably short. - <<elseif $activeSlave.height >= 170>> - Society finds $him distastefully tall. - <</if>> -<</if>> - -<<if $arcologies[0].FSGenderFundamentalistLawBeauty + $arcologies[0].FSGenderRadicalistLawBeauty > 0>> - <<if $arcologies[0].FSHedonisticDecadence == "unset" && $arcologies[0].FSPhysicalIdealistStrongFat == 0>> - <<if $activeSlave.weight > 130>> - $He is much too fat for the fashionable feminine ideal. - <<elseif $activeSlave.weight > 30>> - $He is too fat for the fashionable feminine ideal. - <<elseif $activeSlave.weight < -30>> - $He is too skinny for the fashionable feminine ideal. - <</if>> - <<else>> - <<if $activeSlave.weight > 130>> - $He is much too fat for the fashionable feminine ideal. - <<elseif $activeSlave.weight < -30>> - $He is too skinny for the fashionable feminine ideal. - <</if>> - <</if>> -<<elseif $arcologies[0].FSSlimnessEnthusiastLaw == 1>> - <<if $arcologies[0].FSHedonisticDecadence == "unset" && $arcologies[0].FSPhysicalIdealistStrongFat == 0>> - <<if $activeSlave.weight > 30>> - $He is much too fat for the fashionable feminine ideal. - <<elseif $activeSlave.weight > 10>> - $He is too fat for the fashionable feminine ideal. - <</if>> - <<else>> - <<if $activeSlave.weight > 60>> - $He is much too fat for the fashionable feminine ideal. - <<elseif $activeSlave.weight > 30>> - $He is too fat for the fashionable feminine ideal. - <</if>> - <</if>> -<<elseif $arcologies[0].FSHedonisticDecadenceLaw2 == 1>> - <<if $activeSlave.weight <= 95>> - $He is too thin for the fashionable feminine ideal. - <<elseif $activeSlave.weight <= 10>> - $He is much too thin for the fashionable feminine ideal. - <</if>> -<</if>> - -<<if canWalk($activeSlave)>> - <<if $activeSlave.weight > (170+($activeSlave.muscles/5)) && $activeSlave.physicalAge >= 18>> - $He is so fat that it is difficult for $him to move. - <<if $activeSlave.muscles > 95>> - However, $he is so powerfully built that $he can manage it with effort, though $he often has to stop for breaks. - <<elseif $activeSlave.muscles > 30>> - $He can barely manage to get to $his feet unaided, and usually walks alongside objects to help relieve the weight. - <<elseif $activeSlave.muscles > 5>> - $He requires assistance to get to $his feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit. - <<else>> - $He cannot get to $his feet unaided, and tries to stay seated as much as $he can. - <</if>> - <<elseif $activeSlave.weight > (110+($activeSlave.muscles/20)) && $activeSlave.physicalAge <= 3>> - $He is so fat that it is difficult for $him to move. - <<if $activeSlave.muscles > 95>> - However, $he is so powerfully built that $he can manage it with effort, though $he often has to stop for breaks. - <<elseif $activeSlave.muscles > 30>> - $He can barely manage to get to $his feet unaided, and usually walks alongside objects to help relieve the weight. - <<elseif $activeSlave.muscles > 5>> - $He requires assistance to get to $his feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit. - <<else>> - $He cannot get to $his feet unaided, and tries to stay seated as much as $he can. - <</if>> - <<elseif $activeSlave.weight > (140+($activeSlave.muscles/15)) && $activeSlave.physicalAge <= 12>> - $He is so fat that it is difficult for $him to move. - <<if $activeSlave.muscles > 95>> - However, $he is so powerfully built that $he can manage it with effort, though $he often has to stop for breaks. - <<elseif $activeSlave.muscles > 30>> - $He can barely manage to get to $his feet unaided, and usually walks alongside objects to help relieve the weight. - <<elseif $activeSlave.muscles > 5>> - $He requires assistance to get to $his feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit. - <<else>> - $He cannot get to $his feet unaided, and tries to stay seated as much as $he can. - <</if>> - <<elseif $activeSlave.weight > (165+($activeSlave.muscles/10)) && $activeSlave.physicalAge < 18>> - $He is so fat that it is difficult for $him to move. - <<if $activeSlave.muscles > 95>> - However, $he is so powerfully built that $he can manage it with effort, though $he often has to stop for breaks. - <<elseif $activeSlave.muscles > 30>> - $He can barely manage to get to $his feet unaided, and usually walks alongside objects to help relieve the weight. - <<elseif $activeSlave.muscles > 5>> - $He requires assistance to get to $his feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit. - <<else>> - $He cannot get to $his feet unaided, and tries to stay seated as much as $he can. - <</if>> - <</if>> -<</if>> - -<<= App.Desc.heightImplant($activeSlave)>> - -$He is -<<if $activeSlave.muscles > 95>> - <span class="pink">extremely muscular,</span> with defined pecs, powerful glutes, and massive traps<<if $activeSlave.weight > 95>> hidden beneath a layer of fat<</if>>. -<<elseif $activeSlave.muscles > 50>> - <span class="pink">quite muscular,</span> with ripped abs, strong shoulders, and defined lats<<if $activeSlave.weight > 95>> hidden beneath a layer of fat<</if>>. -<<elseif $activeSlave.muscles > 30>> - <span class="pink">well built,</span> yet feminine with defined abs and strong shapely muscles<<if $activeSlave.weight > 95>> hidden beneath a layer of fat<</if>>. -<<elseif $activeSlave.muscles > 5>> - <span class="pink">well built,</span> yet feminine, with just-visible muscles<<if $activeSlave.weight > 30>> hidden beneath a layer of fat<</if>>. -<<elseif $activeSlave.muscles > -6>> - <span class="pink">soft and feminine,</span> with no visible muscles. -<<elseif $activeSlave.muscles > -31>> - <span class="pink">rather weak,</span> with barely any muscles. -<<elseif $activeSlave.muscles > -96>> - <span class="pink">very weak;</span> $he struggles with day-to-day tasks. -<<else>> - <span class="red">frail;</span> $he can barely hold $himself up. -<</if>> - -<<if $arcologies[0].FSGenderFundamentalistLawBeauty + $arcologies[0].FSGenderRadicalistLawBeauty + $arcologies[0].FSSlimnessEnthusiastLaw > 0 && $arcologies[0].FSPhysicalIdealist == "unset" && $arcologies[0].FSHedonisticDecadenceStrongFat == 0>> - <<if $arcologies[0].FSPhysicalIdealistLaw > 0 && $activeSlave.muscles > 50>> - $He is entirely too muscular for the fashionable feminine ideal. - <<elseif $activeSlave.muscles > 30>> - $He is entirely too muscular for the fashionable feminine ideal. - <</if>> -<</if>> - -<<if hasAnyNaturalArms($activeSlave)>> - <<if $activeSlave.weight > 190>> - $He has <<if hasBothNaturalArms($activeSlave)>>hugely thick arms<<else>>a hugely thick arm<</if>> with sagging fat rolls<<if $activeSlave.muscles > 5>> and<<else>>.<</if>> - <<elseif $activeSlave.weight > 160>> - $He has <<if hasBothNaturalArms($activeSlave)>>thick arms<<else>>a thick arm<</if>> with drooping fat folds<<if $activeSlave.muscles > 5>> and<<else>>.<</if>> - <<elseif $activeSlave.weight > 130>> - $He has <<if hasBothNaturalArms($activeSlave)>>plump arms<<else>>a plump arm<</if>><<if $activeSlave.muscles > 5>> with<<else>>.<</if>> - <<elseif $activeSlave.weight > 97>> - $He has <<if hasBothNaturalArms($activeSlave)>>chubby arms<<else>>a chubby arm<</if>><<if $activeSlave.muscles > 5>> with<<else>>.<</if>> - <<elseif $activeSlave.muscles > 5>> - $He has <<if hasBothNaturalArms($activeSlave)>>normal arms<<else>>a normal arm<</if>> with - <</if>> - <<if $activeSlave.muscles > 95>> - huge muscles<<if $activeSlave.weight > 95>> hidden beneath $his soft flesh<</if>>. - <<elseif $activeSlave.muscles > 30>> - obvious muscles<<if $activeSlave.weight > 95>> hidden beneath $his soft flesh<</if>>. - <<elseif $activeSlave.muscles > 5>> - toned muscles<<if $activeSlave.weight > 30>> hidden beneath $his soft flesh<</if>>. - <<else>> - /*little muscle to them.*/ - <</if>> -<</if>> - -<<= App.Desc.bodyguard($activeSlave)>> - -<<if ($activeSlave.counter.pitWins + $activeSlave.counter.pitLosses) > 0>> - $He has participated in <<print num($activeSlave.counter.pitWins + $activeSlave.counter.pitLosses)>> pit fights, with $activeSlave.counter.pitWins wins and $activeSlave.counter.pitLosses losses. -<</if>> - -<<if $activeSlave.counter.pitKills > 0>> - $activeSlave.counter.pitKills slaves have died by $his hand in pit fights. -<</if>> - -<<= App.Desc.piercing($activeSlave, "corset")>> - -<<= App.Desc.pregnancy($activeSlave)>> - -<<if hasAnyNaturalLegs($activeSlave)>> - <<if $activeSlave.weight > 190>> - $He has <<if hasBothNaturalLegs($activeSlave)>>extremely fat legs with immense soft, rather uneven thighs<<else>>an extremely fat leg with an immense soft, rather uneven thigh<</if>><<if $activeSlave.muscles > 5>> and<<else>>.<</if>> - <<elseif $activeSlave.weight > 160>> - $He has <<if hasBothNaturalLegs($activeSlave)>>very fat legs with massively thick, soft, somewhat uneven thighs<<else>>a very fat leg with a massively thick, soft, somewhat uneven thigh<</if>><<if $activeSlave.muscles > 5>> and<<else>>.<</if>> - <<elseif $activeSlave.weight > 130>> - $He has <<if hasBothNaturalLegs($activeSlave)>>fat legs with hugely thick, soft thighs<<else>>a fat leg with a hugely thick, soft thigh<</if>><<if $activeSlave.muscles > 5>> and<<else>>.<</if>> - <<elseif $activeSlave.weight > 97>> - $He has <<if hasBothNaturalLegs($activeSlave)>>fat legs with thick, soft thighs<<else>>a fat leg with a thick, soft thigh<</if>><<if $activeSlave.muscles > 5>> and<<else>>.<</if>> - <<elseif $activeSlave.weight > 95>> - $He has <<if hasBothNaturalLegs($activeSlave)>>normal legs with thick, soft thighs<<else>> a normal leg with a thick, soft thigh<</if>><<if $activeSlave.muscles > 5>> and<<else>>.<</if>> - <<elseif $activeSlave.muscles > 5>> - $He has <<if hasBothNaturalLegs($activeSlave)>>relatively normal legs and thighs<<else>>a relatively normal leg and thigh<</if>> with - <</if>> - <<if $activeSlave.muscles > 95>> - huge muscles<<if $activeSlave.weight > 95>> hidden beneath $his soft flab<</if>>. - <<elseif $activeSlave.muscles > 30>> - obvious muscles<<if $activeSlave.weight > 95>> hidden beneath $his soft flab<</if>>. - <<elseif $activeSlave.muscles > 5>> - toned muscles<<if $activeSlave.weight > 30>> hidden beneath $his soft flab<</if>>. - <<else>> - /*barely any muscle in them.*/ - <</if>> -<</if>> - -<<= App.Desc.mods($activeSlave, "thigh")>> -<<= App.Desc.mods($activeSlave, "calf")>> -<<= App.Desc.mods($activeSlave, "ankle")>> -<<= App.Desc.mods($activeSlave, "foot")>> -<<= App.Desc.heels($activeSlave, "foot")>> -<<= App.Desc.skin($activeSlave)>> - -<<if $saleDescription == 1>> - - <<= App.Desc.accent($activeSlave)>> - -<</if>> - -<<set _scarCounter = 0>> -<<for _scarName, _scar range $activeSlave.scar>> - <<if ($activeSlave.ID == $Bodyguard.ID) && _scarCounter > 1>> - $His scars make $him look even more menacing than $he actually is. - <<break>> - <<elseif ($activeSlave.ID == $Bodyguard.ID) && $activeSlave.scar[_scarName].menacing > 0>> - $His menacing scar makes $him look terrifying. - <<break>> - <<elseif ($activeSlave.ID == $Wardeness.ID) && _scarCounter > 1>> - $His scars make $him look like $he's in the right place. - <</if>> - <<set _scarCounter++>> -<</for>> - -<<if $activeSlave.fuckdoll == 0>> - <<if $activeSlave.markings == "birthmark" && $activeSlave.prestige == 0 && $activeSlave.porn.prestige < 2>> - $He has a large, liver-colored birthmark, detracting from $his beauty. - <</if>> - <<if ($activeSlave.skin == "sun tanned")>> - <<if (($activeSlave.rules.release.slaves === 1) || App.Utils.hasFamilySex($activeSlave))>> - <<if ($activeSlave.fetishStrength > 60) && ($activeSlave.fetishKnown == 1)>> - $His tan is slightly uneven, since $he enjoys - <<if ($activeSlave.fetish == "buttslut")>> - letting other tanned slaves share a tanning bed with $him so they can sodomize $him while $he tans. - <<elseif ($activeSlave.fetish == "cumslut")>> - letting other tanned slaves share a tanning bed with $him so they get oral from $him while $he tans. - <<elseif ($activeSlave.fetish == "sadist")>> - forcing inferior slaves into the tanning beds with $him so $he can sodomize them while $he tans. - <<elseif ($activeSlave.fetish == "dom")>> - bringing other slaves into the tanning beds with $him so $he can fuck them while $he tans. - <<elseif ($activeSlave.fetish == "masochist") || ($activeSlave.fetish == "submissive")>> - letting other slaves into the tanning beds with $him so they can fuck $him while $he tans. - <<elseif ($activeSlave.fetish == "boobs")>> - bringing other slaves into the tanning beds with $him so $he can tittyfuck them while $he tans. - <<elseif ($activeSlave.fetish == "pregnancy") && (random(0,99) < $seeDicks)>> - letting slaves with dicks into the tanning beds with $him so they can cum inside $him while $he tans. - <<else>> - bringing other slaves into the tanning beds with $him to have sex while $he tans. - <</if>> - <</if>> - <</if>> - <</if>> -<</if>> - -<<if $activeSlave.fuckdoll == 0>> - /* Describe any brands that are not directly addressed elsewhere in longSlave */ - <<= App.Desc.mods($activeSlave, "extra")>> -<</if>> - -<<if ($showClothing == 1) && ($saleDescription == 0)>> - - <<= App.Desc.ears($activeSlave)>> - - <<= App.Desc.upperFace($activeSlave)>> - - <<= App.Desc.hair($activeSlave)>> - -<<else>> - $His hair is $activeSlave.hColor<<if $activeSlave.hColor != $activeSlave.eyebrowHColor>>, with $activeSlave.eyebrowHColor eyebrows<</if>>. -<</if>> - -<<if $activeSlave.fuckdoll == 0>> - <<if ($activeSlave.hColor == "red")>> - <<if ($activeSlave.hLength >= 10)>> - <<if ($activeSlave.markings == "freckles") || ($activeSlave.markings == "heavily freckled")>> - <<if (skinToneLevel($activeSlave.skin) > 5) && (skinToneLevel($activeSlave.skin) < 10)>> - It goes perfectly with $his $activeSlave.skin skin and freckles. - <</if>> - <</if>> - <</if>> - <</if>> - - <<set _pubertyAge = Math.min($activeSlave.pubertyAgeXX, $activeSlave.pubertyAgeXY)>> - <<if ($activeSlave.physicalAge < _pubertyAge-2)>> - $He is too sexually immature to have armpit hair. - <<elseif $activeSlave.underArmHStyle == "hairless">> - $His armpits are perfectly smooth and naturally hairless. - <<elseif $activeSlave.underArmHStyle == "bald">> - $His armpits no longer grow hair, leaving them smooth and hairless. - <<elseif ($activeSlave.underArmHStyle == "waxed")>> - <<if ($activeSlave.assignment == "work in the dairy") && ($dairyRestraintsSetting > 1)>> - $His armpit hair has been removed to prevent chafing. - <<else>> - $His armpits are waxed and smooth. - <</if>> - <<elseif ($activeSlave.physicalAge < _pubertyAge-1)>> - $He has a few $activeSlave.underArmHColor wisps of armpit hair. - <<elseif ($activeSlave.physicalAge < _pubertyAge)>> - $He is on the verge of puberty and has a small patch of $activeSlave.underArmHColor armpit hair. - <<elseif $activeSlave.underArmHStyle == "shaved">> - $His armpits appear hairless, but closer inspection reveals light, $activeSlave.underArmHColor stubble. - <<elseif $activeSlave.underArmHStyle == "neat">> - $His armpit hair is neatly trimmed <<if !hasBothArms($activeSlave)>>since <<if hasAnyArms($activeSlave)>>at least half<<else>>it<</if>> is always in full view<<else>>to not be visible unless $he lifts $his arms<</if>>. - <<elseif $activeSlave.underArmHStyle == "bushy">> - $His $activeSlave.underArmHColor armpit hair has been allowed to grow freely, <<if !hasAnyArms($activeSlave)>>creating two bushy patches under where $his arms used to be<<else>>so it can be seen poking out from under $his arm<<if hasBothArms($activeSlave)>>s<</if>> at all times<</if>>. - <</if>> -<</if>> - -<<if $activeSlave.voice == 0>> - $He is <span class="pink">completely silent,</span> which is understandable, since $he's mute. -<<else>> - <<if $activeSlave.lips > 95>> - $He is <span class="pink">effectively mute,</span> since $his lips are so large that $he can no longer speak intelligibly. $He can still <<if $activeSlave.devotion > 50>>moan<<elseif $activeSlave.devotion > 20>>whimper<<else>>scream<</if>> through them, though. - <</if>> -<</if>> - -<<if $showBodyMods == 1>> - <<if $activeSlave.fuckdoll > 0>> - <<if $activeSlave.earPiercing+$activeSlave.eyebrowPiercing+$activeSlave.nosePiercing > 0>> - The piercings on $his head run through $his suit, helping secure the material to $his head. - <</if>> - <<else>> - <<= App.Desc.mods($activeSlave, "ear")>> - <<= App.Desc.mods($activeSlave, "nose")>> - <<= App.Desc.mods($activeSlave, "eyebrow")>> - <<= App.Desc.mods($activeSlave, "cheek")>> - <<= App.Desc.mods($activeSlave, "neck")>> - <<if ($activeSlave.custom.tattoo != "") && (def $activeSlave.custom.tattoo)>> - <<print $activeSlave.custom.tattoo>> - <</if>> - <</if>> -<</if>> - -<<= App.Desc.horns($activeSlave)>> -<<= App.Desc.face($activeSlave)>> -<<= App.Desc.mouth($activeSlave)>> - -<<if ($showClothing == 1) && ($saleDescription == 0)>> - - <<if $activeSlave.fuckdoll == 0>> - <<= App.Desc.collar($activeSlave)>> - <<= App.Desc.faceAccessory($activeSlave)>> - <<= App.Desc.mouthAccessory($activeSlave)>> - <<if ($activeSlave.relationship > 4)>> - <<if hasAnyArms($activeSlave)>> - $He has a simple gold band on the little finger of $his <<if !hasLeftArm($activeSlave)>>right<<else>>left<</if>> hand. - <<else>> - $He has a simple gold band on a length of chain around $his neck. - <</if>> - <<elseif ($activeSlave.relationship == -3)>> - <<if hasAnyArms($activeSlave)>> - $He has a simple steel band on the little finger of $his <<if !hasLeftArm($activeSlave)>>right<<else>>left<</if>> hand. - <<else>> - $He has a simple steel band on a length of cord around $his neck. - <</if>> - <</if>> - <</if>> - -<</if>> - -<<if $activeSlave.fuckdoll == 0>> - <<= App.Desc.nails($activeSlave)>> -<</if>> -<<= App.Desc.mods($activeSlave, "back")>> -<<= App.Desc.mods($activeSlave, "shoulder")>> -<<= App.Desc.mods($activeSlave, "upper arm")>> -<<= App.Desc.mods($activeSlave, "lower arm")>> -<<= App.Desc.mods($activeSlave, "hand")>> -<<= App.Desc.mods($activeSlave, "wrist")>> - -<<if $activeSlave.fuckdoll == 0>> - <<if $activeSlave.minorInjury != 0>> - <<if $activeSlave.minorInjury != "sore ass">> - $He is sporting a <span class="red">$activeSlave.minorInjury,</span> covered by makeup. - <</if>> - <</if>> -<</if>> -<<if $activeSlave.health.illness > 0>> - <<if $activeSlave.fuckdoll == 0>> - $He - <<else>> - $His suit reports that $he - <</if>> - <<if ($activeSlave.health.illness === 1)>> - <<if $activeSlave.fuckdoll == 0>> - is <span class="red">feeling under the weather.</span> - <<else>> - has <span class="red">fallen ill.</span> - <</if>> - <<elseif ($activeSlave.health.illness === 2)>> - is <span class="red">somewhat ill.</span> - <<elseif ($activeSlave.health.illness === 3)>> - is <span class="red">sick.</span> - <<elseif ($activeSlave.health.illness === 4)>> - is <span class="red">very sick.</span> - <<elseif ($activeSlave.health.illness === 5)>> - is <span class="red">terribly ill.</span> - <</if>> -<</if>> - -<br> - -/* Calling all boob widgets */ -<<print App.Desc.boobs($activeSlave)>> -<<= App.Desc.boobsShape($activeSlave)>> -<<print App.Desc.boobsExtra($activeSlave)>> -<<= App.Desc.mods($activeSlave, "chest")>> -<<= App.Desc.mods($activeSlave, "breast")>> -<<= App.Desc.shoulders($activeSlave)>> -<<print App.Desc.nipples($activeSlave)>> -<<= App.Desc.mods($activeSlave, "nipple")>> -<<print App.Desc.areola($activeSlave)>> -<<= App.Desc.mods($activeSlave, "areolae")>> - -<<if $activeSlave.inflation > 0>> /* to be obsoleted with phase 4 */ - <<= App.Desc.bellyInflation($activeSlave)>> -<<elseif $activeSlave.bellyImplant >= 2000>> - <<= App.Desc.bellyImplant($activeSlave)>> -<<else>> - <<= App.Desc.belly($activeSlave)>> -<</if>> -<<= App.Desc.mods($activeSlave, "belly")>> -/*<<= App.Desc.mods($activeSlave, "navel")>> Currently contained in App.Desc.belly()*/ -<<= App.Desc.butt($activeSlave)>> - -<br> - -<<= App.Desc.crotch($activeSlave)>> -<<= App.Desc.dick($activeSlave)>> -<<= App.Desc.vagina($activeSlave)>> - -<<= App.Desc.anus($activeSlave)>> - -<<if $activeSlave.fuckdoll == 0>> - <br> - <<= App.Desc.drugs($activeSlave)>> -<</if>> - -<<set $saleDescription = 0, $applyLaw = 0>> /* clear sale and law flags, if set */ +<<= App.Desc.longSlave({slave: $activeSlave})>> \ No newline at end of file diff --git a/src/uncategorized/multiImplant.tw b/src/uncategorized/multiImplant.tw index 0fd30c4d0c73eef8a3b0972ca3ca6d04e82de5d9..09e661aec1177c6ea24c58aa7994f95c0258f07a 100644 --- a/src/uncategorized/multiImplant.tw +++ b/src/uncategorized/multiImplant.tw @@ -87,6 +87,7 @@ that are ready be sent down. <<set _p = $adjustProsthetics[_k]>> <<if _p.slaveID == $activeSlave.ID && _p.workLeft <= 0>> <<set $adjustProsthetics.splice(_k, 1), _k-->> + <<set $adjustProstheticsCompleted-->> <<set addProsthetic($activeSlave, _p.id)>> <br><hr> <<switch _p.id>> @@ -205,7 +206,6 @@ that are ready be sent down. /* updates the interrogated slave */ <<set $slaves[_i] = $activeSlave>> <</for>> /* end of the $slaves loop */ -<<set $adjustProstheticsCompleted = 0>> /* This needs to be down here to over-ride any Surgery Degradation calls */ <<set $nextButton = "Continue">> diff --git a/src/uncategorized/nextWeek.tw b/src/uncategorized/nextWeek.tw index ec4c8c7e9ce1d8800604ee5aed776c71ffd94573..ee545303c1bbbf2fd3cb6c3c11d6e56331822e02 100644 --- a/src/uncategorized/nextWeek.tw +++ b/src/uncategorized/nextWeek.tw @@ -334,7 +334,7 @@ /% These are variables that either should be made into _temp vars or should be Zeroed out once done with them instead of here. This can also interfere with debugging or hide NaN's as zeroing things out would clear a NaN. Also could stop from NaN's getting worse? %/ /% Integer and float variables. No real need to zero them out but doesn't hurt to have them in a known state, though this might mask variables NaN'ing out. Takes up the least amount of Memory besides a "" string. %/ -<<set $i = 0, $j = 0, $averageProsperity = 0, $motherSlave = -1, $daughterSlave = -1, $devMother = -1, $devDaughter = -1, $alphaTwin = -1, $betaTwin = -1, $youngerSister = -1, $olderSister = -1, $recruiterSlave = -1>> +<<set $i = 0, $j = 0, $averageProsperity = 0, $motherSlave = -1, $daughterSlave = -1, $devMother = -1, $devDaughter = -1, $alphaTwin = -1, $betaTwin = -1, $youngerSister = -1, $olderSister = -1>> <<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, $shelterGirlID = -1>> /% Other arrays %/ diff --git a/src/uncategorized/randomNonindividualEvent.tw b/src/uncategorized/randomNonindividualEvent.tw index 5d762d66439cbc3aa860d235528445e3f62d1864..24abf725ceeb0aaf86e753276edcb44241b8e4f3 100644 --- a/src/uncategorized/randomNonindividualEvent.tw +++ b/src/uncategorized/randomNonindividualEvent.tw @@ -21,7 +21,7 @@ <<else>> <<silently>> /* initialize event lists as arrays [], not objects {} */ - <<set $events = [], $RecETSevent = [], $REFIevent = [], $PESSevent = [], $PETSevent = [], $REFSevent = [], $activeSlave = 0, $recruiterSlave = 0, _recruitEvents = []>> + <<set $events = [], $RecETSevent = [], $REFIevent = [], $PESSevent = [], $PETSevent = [], $REFSevent = [], $activeSlave = 0, _recruitEvents = []>> <<set $seed = 0>> diff --git a/src/uncategorized/saLongTermEffects.tw b/src/uncategorized/saLongTermEffects.tw index 35a67630ff54d57499637f1ca16dbc5ea410750e..fa8c05175ae6765b09e7d554a9678baddd11bde4 100644 --- a/src/uncategorized/saLongTermEffects.tw +++ b/src/uncategorized/saLongTermEffects.tw @@ -6410,7 +6410,7 @@ <<if ($slaves[$i].dick > 8)>> Society @@.green;approves@@ of $his massive member, which might be nonfunctional, but is a wonder of expansionism. <<set _Dic = $slaves[$i].dick-8>> - <<= FutureSocieties.ChangePorn("AssetExpansionist", _Dic, $pornFameBonus)>> + <<= FutureSocieties.ChangePorn("AssetExpansionist", _Dic)>> <<elseif ($slaves[$i].dick > 6)>> Society @@.green;approves@@ of $his enormous penis; $his cock furthers the fashion for dangling dicks on slaves. <<= FutureSocieties.ChangePorn("AssetExpansionist", 1)>> diff --git a/src/uncategorized/saRelationships.tw b/src/uncategorized/saRelationships.tw index e6968eeabedcb1843698379463205605bb9b438e..74330ad71a1f22b9f27fb20ae828770a2ccecdfd 100644 --- a/src/uncategorized/saRelationships.tw +++ b/src/uncategorized/saRelationships.tw @@ -70,7 +70,7 @@ <<set _seed = random(1, 80)>> <</if>> <<if _seed > 75>> - <<set $resentment = 0>> + <<set _resentment = 0>> <<for _j = 0; _j < _SL; _j++>> <<set _SlaveJ = $slaves[_j]>> <<setLocalPronouns _SlaveJ 2>> @@ -193,9 +193,9 @@ <<set _SlaveJ.relationship = 1, _SlaveJ.relationshipTarget = _SlaveI.ID, _SlaveI.relationship = 1, _SlaveI.relationshipTarget = _SlaveJ.ID>> <<break>> <<else>> - <<if $resentment == 0>> + <<if _resentment == 0>> _SlaveI.slaveName tries to strike up a friendship with _SlaveJ.slaveName and is @@.gold;punished@@ for breaking the rules against such things; $he @@.mediumorchid;resents@@ being castigated for simple sociability. - <<set _SlaveI.devotion -= 2, _SlaveI.trust -= 2, $resentment++>> + <<set _SlaveI.devotion -= 2, _SlaveI.trust -= 2, _resentment++>> <</if>> <</if>> <</if>> @@ -217,18 +217,20 @@ <<set _SlaveJ.relationship = 3, _SlaveJ.relationshipTarget = _SlaveI.ID, _SlaveI.relationship = 3, _SlaveI.relationshipTarget = _SlaveJ.ID>> <<break>> <<else>> - _SlaveI.slaveName tries to strike up a sexual relationship with _SlaveJ.slaveName and is @@.gold;punished@@ for breaking the rules against such things; $he @@.mediumorchid;resents@@ being prevented from pursuing _him2. - <<set _SlaveI.devotion -= 2, _SlaveI.trust -= 2>> - <</if>> - <</if>> - <</if>> - <</if>> - <</for>> - <<if _SlaveI.relationshipTarget != _SlaveJ.ID>> - <<set _SlaveJ = null>> + <<if _resentment == 0>> + _SlaveI.slaveName tries to strike up a sexual relationship with _SlaveJ.slaveName and is @@.gold;punished@@ for breaking the rules against such things; $he @@.mediumorchid;resents@@ being prevented from pursuing _him2. + <<set _SlaveI.devotion -= 2, _SlaveI.trust -= 2, _resentment++>> + <</if>> + <</if>> <</if>> <</if>> + <</if>> + <</for>> + <<if _SlaveI.relationshipTarget != _SlaveJ.ID>> + <<set _SlaveJ = null>> <</if>> + <</if>> /*seed*/ + <</if>> /*devotion*/ <</if>> <<set _drop = 1>> <</if>> diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw index 2f93c43e57c449adf40942bba792985756156c68..cc7ee6ee6c7f43b7bf8713546df864b3dbee0020 100644 --- a/src/uncategorized/slaveInteract.tw +++ b/src/uncategorized/slaveInteract.tw @@ -53,7 +53,7 @@ <<set _slavesInLine = App.UI.SlaveInteract.placeInLine(getSlave($AS))>> -<<set _desc = `<<set $activeSlave = getSlave($AS)>><<include "Long Slave Description">>`>> +<<set _desc = App.Desc.longSlave({slave: getSlave($AS), saleDescription: false, showClothing: true})>> <p align="center"> <<if $cheatMode == 1>> diff --git a/src/uncategorized/slaveSold.tw b/src/uncategorized/slaveSold.tw index e301f46239399c5e12cd2160f2b6097ce8621c92..cc796ef8c4a0fe2055ac6d062be4716f3800124a 100644 --- a/src/uncategorized/slaveSold.tw +++ b/src/uncategorized/slaveSold.tw @@ -3,7 +3,6 @@ <<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Main", $encyclopedia = "Personal Assistant">> <<setLocalPronouns $activeSlave>> -<<set $display = 0>> <<if !["abortion TV", "elite auction", "eugenics arcology", "organ crafter", "peacekeepers", "repopulationist arcology", "tentacle bred", "womb filler"].includes($buyer) && ((($activeSlave.actualAge < $retirementAge-1) && $policies.retirement.physicalAgePolicy == 0) || (($activeSlave.physicalAge < $retirementAge-1) && $policies.retirement.physicalAgePolicy == 1))>> /* organ crafter is not viable now, the elite/peacekeepers won't part so easily with a prize, some take place x months later when the event's max is 15 weeks, and the rest are snuff events. You don't want that slave back. */ <<if !$boomerangSlave || $boomerangWeeks > 15>> @@ -124,13 +123,11 @@ $slaves[_ss].slaveName is @@.mediumorchid;grieved@@ that you are selling _his2 best source of comfort and companionship in a life of bondage. <br><br> <<set $slaves[_ss].devotion -= $slaves[_ss].relationship*10>> - <<set $display = 1>> <</if>> <<elseif $activeSlave.relationship == -3>> Selling one of your slave $wives is @@.red;socially unacceptable.@@ In addition, your other devoted slaves are @@.gold;worried@@ that you may not respect their status. <br><br> <<run repX(-200, "slaveTransfer")>> - <<set $display = 1>> <<for _ss = 0; _ss < $slaves.length; _ss++>> <<if $slaves[_ss].devotion > 50>> <<set $slaves[_ss].trust -= 5>> @@ -144,7 +141,6 @@ $slaves[_ss].slaveName is @@.hotpink;pleased@@ that _he2 won't have to see _his2 rival any more. <br><br> <<set $slaves[_ss].devotion += $slaves[_ss].rivalry*3>> - <<set $display = 1>> <</if>> <</if>>