diff --git a/src/js/descriptionWidgets.js b/src/js/descriptionWidgets.js index bf52c401b8bdcb44c7e0640d03008b79cd919f10..536ec4a5327ba0c1c866182c6a401400e7ef2c9e 100644 --- a/src/js/descriptionWidgets.js +++ b/src/js/descriptionWidgets.js @@ -1514,3 +1514,115 @@ App.Desc.longLimbs = function(slave) { return r; }; + +/** + * @param {App.Entity.SlaveState} slave + * @returns {string} long description of the slave's sexual history. + */ +App.Desc.sexualHistory = function(slave) { + const {He, he, his} = getPronouns(slave); + const weeksOwned = V.week - slave.weekAcquired; + + let r = `${He} has been with you `; + if (slave.weekAcquired === 0) { + r += `since before you owned the arcology, `; + } else if (slave.weekAcquired === 1) { + r += `since you first took control of the arcology, `; + } else { + r += `${numberWithPluralOne(Math.max(weeksOwned, 1), "week")}, `; + } + + const sexTypes = [ "mammary", "vaginal", "anal", "penetrative", "oral" ]; + const totalSex = sexTypes.reduce((res, el) => res += slave.counter[el], 0); + if (totalSex > 0) { + r += `and has been fucked about ${num(totalSex)} times, including `; + const sexNames = {mammary: "mammary", vaginal: "vanilla", anal: "anal", penetrative: "penetrating", oral: "oral"}; + r += sexTypes.filter((t) => slave.counter[t] > 0) + .map((t) => `${num(slave.counter[t])} ${sexNames[t]}`) + .reduce((res, ch, i, arr) => res + (i === arr.length - 1 ? ' and ' : ', ') + ch); + r += ` sexual encounters. `; + } else { + r += `and has had little or no sexual experience ${slave.weekAcquired > 0 ? "as your slave" : "in your new arcology"} yet. `; + } + + if (weeksOwned > 0) { + const sexDescriptions = { + mammary: `${he}'s put his tits to work`, + vaginal: `${his} pussy has been fucked`, + anal: `${he}'s been buttfucked`, + penetrative: `${he}'s pounded a hole`, + oral: `${he}'s sucked something off` + }; + const getSexTypeScaled = (t) => slave.counter[t] * ((t === "oral") ? 0.5 : 1.0); + const biggestSexType = sexTypes.reduce((res, el) => (getSexTypeScaled(el) > getSexTypeScaled(res)) ? el : res); + const frequency = (weeksOwned*112) / slave.counter[biggestSexType]; + if (frequency < 4.5) { + r += `Remarkably, this means ${sexDescriptions[biggestSexType]} `; + if (frequency < 1) { + r += `more than once every hour `; + } else if (frequency < 1.5) { + r += `about once every hour `; + } else { + r += `about once every ${num(Math.round(frequency), true)} hours `; + } + r += `${he}'s spent awake. `; + } + } + + if (slave.lactation > 0 && slave.counter.milk < 20) { + r += `${He} has given a small quantity of milk `; + if (slave.counter.cum > 0) { + r += ` and about ${num(slave.counter.cum)} deciliters of cum`; + } + r += `. `; + } else if (slave.counter.milk > 1) { + r += `${He} has given about ${num($activeSlave.counter.milk)} liters of milk`; + if (slave.counter.cum > 0) { + r += ` and about ${num(slave.counter.cum)} deciliters of cum`; + } + r += `. `; + } + + if (slave.counter.birthsTotal > 0) { + r += `${He} has given birth a total of ${numberWithPluralOne(slave.counter.birthsTotal, "time")}; `; + if (slave.counter.birthsTotal === slave.counter.births) { + if (slave.counter.births === 1) { + r += `it happened `; + } else if (slave.counter.births === 2) { + r += `both of them happened `; + } else { + r += `all of them happened `; + } + } else if (slave.counter.births === 1) { + r += `one of them happened `; + } else if (slave.counter.births > 1) { + r += `${slave.counter.births} of them happened `; + } else if (slave.counter.birthsTotal === 1) { + r += `it did not happen `; + } else { + r += `none of them happened `; + } + r += `within the walls of ${V.arcologies[0].name}. `; + } + + if (slave.counter.slavesKnockedUp > 0) { + r += `${He}'s knocked up ${numberWithPluralOne(slave.counter.slavesKnockedUp, "other slave girl")} `; + if (slave.counter.slavesFathered > 0) { + r += `and fathered ${numberWithPluralOne(slave.counter.slavesKnockedUp, "new slave")} `; + } + r += `for you. `; + } else if (slave.counter.slavesFathered > 0) { + r += `${He}'s fathered ${numberWithPluralOne(slave.counter.slavesKnockedUp, "new slave")} for you. `; + } + if (slave.counter.PCKnockedUp > 0) { + r += `${He}'s managed to knock you up ${numberWithPluralOne(slave.counter.PCKnockedUp, "time")}`; + if (slave.counter.PCChildrenFathered > 0) { + r += ` and is the father of ${slave.counter.PCChildrenFathered} of your children`; + } + r += `. `; + } else if (slave.counter.PCChildrenFathered > 0) { + r += `${He}'s the father of ${slave.counter.PCChildrenFathered} of your children.`; + } + + return r; +}; diff --git a/src/uncategorized/longSlaveDescription.tw b/src/uncategorized/longSlaveDescription.tw index 68b72f0703ade421d20a4cb66403baa7c4de935f..6d4451922c4288a5c4a5f5349e19844a969481b0 100644 --- a/src/uncategorized/longSlaveDescription.tw +++ b/src/uncategorized/longSlaveDescription.tw @@ -346,173 +346,11 @@ is <<geneticQuirkAssessment>> <<if $showSexualHistory == 1 && $ui != "start">> - <<set _weeksOwned = $week-$activeSlave.weekAcquired>> - $He has been with you - <<if $activeSlave.weekAcquired == 0>> - since before you owned the arcology, - <<elseif $activeSlave.weekAcquired == 1>> - since you first took control of the arcology, - <<elseif _weeksOwned > 1>> - <<print num($week-$activeSlave.weekAcquired)>> weeks, - <<else>> - one week, - <</if>> - - <<if ($activeSlave.counter.oral + $activeSlave.counter.vaginal + $activeSlave.counter.anal + $activeSlave.counter.mammary + $activeSlave.counter.penetrative) > 0>> - and has been fucked about <<print num($activeSlave.counter.oral + $activeSlave.counter.vaginal + $activeSlave.counter.anal + $activeSlave.counter.mammary + $activeSlave.counter.penetrative)>> times, including - <<if $activeSlave.counter.mammary > 0>> - <<print num($activeSlave.counter.mammary)>> mammary, - <</if>> - <<if $activeSlave.counter.vaginal > 0>> - <<print num($activeSlave.counter.vaginal)>> vanilla, - <</if>> - <<if $activeSlave.counter.anal > 0>> - <<print num($activeSlave.counter.anal)>> anal, - <</if>> - <<if $activeSlave.counter.penetrative > 0>> - <<print num($activeSlave.counter.penetrative)>> penetrating, - <</if>> - <<if ($activeSlave.counter.penetrative+$activeSlave.counter.mammary+$activeSlave.counter.vaginal+$activeSlave.counter.anal) > 0>> - and - <</if>> - <<print num($activeSlave.counter.oral)>> oral sexual encounters. - <<else>> - <<if $week-$activeSlave.weekAcquired >= 1>> - and - <<else>> - $He - <</if>> - has had little or no sexual experience <<if $activeSlave.weekAcquired != 0>>as your slave<<else>>in your new arcology<</if>> yet. - <</if>> - - <<set _sortedCounts = []>> - <<set _sortedCounts.push({type: "anal", value: $activeSlave.counter.anal}), _sortedCounts.push({type: "vaginal", value: $activeSlave.counter.vaginal}), _sortedCounts.push({type: "oral", value: $activeSlave.counter.oral/2}), _sortedCounts.push({type: "mammary", value: $activeSlave.counter.mammary}), _sortedCounts.push({type: "penetrative", value: $activeSlave.counter.penetrative})>> - <<set _sortedCounts = _sortedCounts.sort(function(a, b){return b.value-a.value})>> - <<if _weeksOwned > 0>> - <<if _sortedCounts[0].type == "anal">> - <<if (_weeksOwned*112)/$activeSlave.counter.anal < 4>> - Remarkably, this means that $he's been buttfucked - <<if (_weeksOwned*112)/$activeSlave.counter.anal < 1>> - more than once every hour - <<elseif (_weeksOwned*112)/$activeSlave.counter.anal < 1.5>> - about once every hour - <<elseif (_weeksOwned*112)/$activeSlave.counter.anal < 2.5>> - about once every two hours - <<elseif (_weeksOwned*112)/$activeSlave.counter.anal < 3.5>> - about once every three hours - <<else>> - about once every four hours - <</if>> - $he's spent awake. - <</if>> - <<elseif _sortedCounts[0].type == "vaginal">> - <<if (_weeksOwned*112)/$activeSlave.counter.vaginal < 4>> - Remarkably, this means that $his pussy has been fucked - <<if (_weeksOwned*112)/$activeSlave.counter.vaginal < 1>> - more than once every hour - <<elseif (_weeksOwned*112)/$activeSlave.counter.vaginal < 1.5>> - about once every hour - <<elseif (_weeksOwned*112)/$activeSlave.counter.vaginal < 2.5>> - about once every two hours - <<elseif (_weeksOwned*112)/$activeSlave.counter.vaginal < 3.5>> - about once every three hours - <<else>> - about once every four hours - <</if>> - $he's spent awake. - <</if>> - <<elseif _sortedCounts[0].type == "oral">> - <<if (_weeksOwned*112)/$activeSlave.counter.oral < 4>> - Remarkably, this means that $he's sucked something off - <<if (_weeksOwned*112)/$activeSlave.counter.oral < 1>> - more than once every hour - <<elseif (_weeksOwned*112)/$activeSlave.counter.oral < 1.5>> - about once every hour - <<elseif (_weeksOwned*112)/$activeSlave.counter.oral < 2.5>> - about once every two hours - <<elseif (_weeksOwned*112)/$activeSlave.counter.oral < 3.5>> - about once every three hours - <<else>> - about once every four hours - <</if>> - $he's spent awake. - <</if>> - <<elseif _sortedCounts[0].type == "mammary">> - <<if (_weeksOwned*112)/$activeSlave.counter.mammary < 4>> - Remarkably, this means that $he's put $his tits to work - <<if (_weeksOwned*112)/$activeSlave.counter.mammary < 1>> - more than once every hour - <<elseif (_weeksOwned*112)/$activeSlave.counter.mammary < 1.5>> - about once every hour - <<elseif (_weeksOwned*112)/$activeSlave.counter.mammary < 2.5>> - about once every two hours - <<elseif (_weeksOwned*112)/$activeSlave.counter.mammary < 3.5>> - about once every three hours - <<else>> - about once every four hours - <</if>> - $he's spent awake. - <</if>> - <<elseif _sortedCounts[0].type == "penetrative">> - <<if (_weeksOwned*112)/$activeSlave.counter.penetrative < 4>> - Remarkably, this means that $he's pounded a hole - <<if (_weeksOwned*112)/$activeSlave.counter.penetrative < 1>> - more than once every hour - <<elseif (_weeksOwned*112)/$activeSlave.counter.penetrative < 1.5>> - about once every hour - <<elseif (_weeksOwned*112)/$activeSlave.counter.penetrative < 2.5>> - about once every two hours - <<elseif (_weeksOwned*112)/$activeSlave.counter.penetrative < 3.5>> - about once every three hours - <<else>> - about once every four hours - <</if>> - $he's spent awake. - <</if>> - <</if>> - <</if>> - - <<if ($activeSlave.lactation > 0) && ($activeSlave.counter.milk < 20)>> - $He has given a small quantity of milk<<if ($activeSlave.counter.cum > 0)>> and about <<print num($activeSlave.counter.cum)>> deciliters of cum<</if>>. - <<elseif ($activeSlave.counter.milk > 1)>> - $He has given about <<print num($activeSlave.counter.milk)>> liters of milk<<if ($activeSlave.counter.cum > 0)>> and about <<print num($activeSlave.counter.cum)>> deciliters of cum<</if>>. - <</if>> - - <<if ($activeSlave.counter.birthsTotal != 0)>> - $He has given birth a total of <<print $activeSlave.counter.birthsTotal>> time<<if $activeSlave.counter.birthsTotal != 1>>s<</if>>; - <<if ($activeSlave.counter.births == $activeSlave.counter.birthsTotal)>> - <<if ($activeSlave.counter.births == 1)>> - it happened within the walls of $arcologies[0].name. - <<elseif ($activeSlave.counter.births == 2)>> - both of them happened within the walls of $arcologies[0].name. - <<else>> - all of them happened within the walls of $arcologies[0].name. - <</if>> - <<elseif $activeSlave.counter.births == 1>> - one of them happened within the walls of $arcologies[0].name. - <<elseif ($activeSlave.counter.births > 1)>> - $activeSlave.counter.births of them happened within the walls of $arcologies[0].name. - <<else>> - none of them happened within $arcologies[0].name. - <</if>> - <</if>> - - <<if $activeSlave.counter.slavesKnockedUp > 0>> - $He's knocked up $activeSlave.counter.slavesKnockedUp other slave girl<<if $activeSlave.counter.slavesKnockedUp > 1>>s<</if>><<if $activeSlave.counter.slavesFathered > 0>> and fathered $activeSlave.counter.slavesFathered new slave<<if $activeSlave.counter.slavesFathered > 1>>s<</if>> for you<</if>>. - <<elseif $activeSlave.counter.slavesFathered > 0>> - $He's fathered $activeSlave.counter.slavesFathered new slave<<if $activeSlave.counter.slavesFathered > 1>>s<</if>> for you. - <</if>> - <<if $activeSlave.counter.PCKnockedUp > 0>> - $He's managed to knock you up $activeSlave.counter.PCKnockedUp time<<if $activeSlave.counter.PCKnockedUp > 1>>s<</if>><<if $activeSlave.counter.slavesFathered > 0>> and is the father of $activeSlave.counter.PCChildrenFathered of your children<</if>>. - <<elseif $activeSlave.counter.PCChildrenFathered > 0>> - $He's the father of $activeSlave.counter.PCChildrenFathered of your children. - <</if>> + <<= App.Desc.sexualHistory($activeSlave)>> <</if>> - <</if>> <<if $activeSlave.fuckdoll == 0>> /* NORMAL NON-FUCKDOLL MENTAL REPORT */ - <<= App.Desc.eyes($activeSlave)>> <<if $activeSlave.fetish == "mindbroken">>