diff --git a/devNotes/twine JS.txt b/devNotes/twine JS.txt index 20d4919b7fb20a1f2924ee750f1ccbf829745688..0d92046955cc4906b9d82c143934d1514ebeb542 100644 --- a/devNotes/twine JS.txt +++ b/devNotes/twine JS.txt @@ -12689,349 +12689,254 @@ window.saChoosesOwnClothes = (function() { })(); -/* :: FResult [script]*/ - -// this is a port of the FResult widget -// it has been broken up into several functions, because it grew too long -// it has been wrapped in a closure so as not to pollute the global namespace -// and so that nested functions are only evaluated once - -window.FResult = (function() { - "use strict"; - // we can't initialise our global variables on load, because SugarCube.State isn't initialised - // instead, declare them and initialise on run time - let V, result, incest_bonus; - function FResult(slave) { - V = State.variables; - incest_bonus = V.arcologies[0].FSEgyptianRevivalist > 20 || V.arcologies[0].FSEgyptianRevivalistIncestPolicy === 1; - - calcUseWeights(slave); - if (!slave.fuckdoll) - calcNotFuckdoll(slave); - else - result += slave.fuckdoll/10; - - result += Math.max(0, slave.aphrodisiacs) * 2; - - if (slave.inflationType === "aphrodisiac") - result += slave.inflation*4; - - if (slave.lactation > 0) - result += 1; +/* End Week Passage Conversions */ - if (slave.nipples === "fuckable") - calcFuckableTits(slave); +/*:: SA rest [script]*/ - if (V.seeAge === 1) - calcAge(slave); - if (slave.fetish === "mindbroken") - result = Math.trunc(result*0.4); - else - result = Math.trunc(result*0.7); +window.saRest = function saRest(slave) { - if (slave.pregWeek < 0) - result -= Math.trunc(result*slave.pregWeek/10); // reduced the most just after birth + var pronouns = getPronouns(slave); + var he = pronouns.pronoun, him = pronouns.object, his = pronouns.possessive, hers = pronouns.possessivePronoun, himself = pronouns.objectReflexive, boy = pronouns.noun; + var He = capFirstChar(he), His = capFirstChar(his); + var V = State.variables; - calcAmputation(slave); + var t = " takes the week off."; - if (V.arcologies[0].FSHedonisticDecadence > 20) - calcHedonismWeight(slave); - if (result < 2) { - if (supremeRaceP(slave) && V.arcologies[0].FSSupremacist > 20) - result = 0; - else - result = 2; + if (slave.fuckdoll > 0) { + t += " ${He} has nothing to do but "; + if (slave.amp == 0) { + t += "lie "; + } else { + t += "stand "; } - return result; + t += "in place."; } - function calcUseWeights(slave) { - result = (3 - slave.anus)+(slave.muscles/30); - if (slave.muscles < -95) - result -= 5; - else if (slave.muscles < -30) - result -= 2; - - const uses = V.oralUseWeight + V.vaginalUseWeight + V.analUseWeight; - if (uses <= 0) return; - - result += (6+slave.tonguePiercing) * (V.oralUseWeight/uses) * (slave.oralSkill/30); - if (slave.sexualFlaw === "cum addict") - result += (V.oralUseWeight/uses) * (slave.oralSkill/30); - if (canDoVaginal(slave)) { - result += 6 * (V.vaginalUseWeight/uses) * (slave.vaginalSkill/30); - result += (3 - slave.vagina); - result += slave.vaginaLube; - } - if (canDoAnal(slave)) { - result += 6 * (V.analUseWeight/uses) * (slave.analSkill/30); - if (slave.sexualFlaw === "anal addict") - result += (V.analUseWeight/uses) * (slave.analSkill/30); - if (slave.inflationType === "aphrodisiac") - result += (V.analUseWeight/uses) * (slave.inflation * 3); + if (slave.health > 90) { + t += ` ${His} health is so outstanding that rest does not improve it.`; + } else if (slave.health > -100) { + t += ` ${His} <span class='green'>health recovers</span> with rest.`; + slave.health += 10; + if (!(canHear(slave))) { + t += ` Since ${he} is deaf, the hustle and bustle of daily life in the penthouse <span class='green'>didn't bother ${him} at all.</span>`; + slave.health += 3; + } else if ((slave.hears == -1 && slave.earwear != "hearing aids") || (slave.hears == 0 && slave.earwear == "muffling ear plugs")) { + t += ` Since ${he} is hard of hearing, the hustle and bustle of daily life in the penthouse <span class='green'>didn't disturb ${his} rest as much.</span>`; + slave.health += 1; } } - function calcFuckableTits(slave) { - result += 2; - if (slave.fetish === "boobs") - result += Math.trunc(slave.fetishStrength/20); - } - - function calcWorksWithRelatives(slave) { - V.slaves.forEach(islave => { - if (isParentP(slave, islave) && sameAssignmentP(slave, islave)) { - result += 1; - if (incest_bonus) result += 1; + if (slave.fuckdoll == 0 && slave.fetish != "mindbroken") { + if (slave.devotion > 20) { + if (slave.trust <= 20) { + t += ` Being allowed to rest <span class='mediumaquamarine'>reduces ${his} fear</span> of you.`; + slave.trust += 4; + } else if (slave.trust <= 50) { + t += ` Being allowed to rest <span class='mediumaquamarine'>builds ${his} trust</span> in you.`; + slave.trust += 2; + } else { + t += ` Being allowed to rest <span class='mediumaquamarine'>confirms ${his} trust</span> in you.`; + slave.trust += 2; } - if (areSisters(slave, islave) > 0 && sameAssignmentP(slave, islave)) { - result += 1; - if (incest_bonus) result += 1; + } else { + if (slave.trust < -20) { + t += ` Being allowed to rest <span class='mediumaquamarine'>reduces ${his} fear</span> of you.`; + slave.trust += 4; } - }); - } - - function calcWorksWithRelativesVanilla(slave) { - const fre = getSlave(slave.relationTarget) - if (fre !== undefined && sameAssignmentP(slave, fre)) { - result += 2; - if (incest_bonus) result += 2; } } - function calcWorksWithRelationship(slave) { - const fre = V.slaves.findIndex(s => { - return haveRelationshipP(slave, s) && sameAssignmentP(slave, s); - }); - if (fre !== -1) result += 1; + if (V.showVignettes == 1 && slave.assignment === Job.REST) { + var _vignette = GetVignette(slave); + t += ` __This week__ ${_vignette.text} ` + if (_vignette.type == "cash") { + if (_vignette.effect > 0) { + t += `<span class='yellowgreen'>making you an extra ${cashFormat(Math.trunc(V.FResult*_vignette.effect))}.</span>`; + } else if (_vignette.effect < 0) { + t += `<span class='red'>losing you ${cashFormat(Math.abs(Math.trunc(V.FResult*_vignette.effect)))}.</span>`; + } else { + t += `an incident without lasting effect.`; + } + V.cash += Math.trunc(V.FResult*_vignette.effect); + } else if (_vignette.type == "devotion") { + if (_vignette.effect > 0) { + if (slave.devotion > 50) { + t += `<span class='hotpink'>increasing ${his} devotion to you.</span>`; + } else if (slave.devotion >= -20) { + t += `<span class='hotpink'>increasing ${his} acceptance of you.</span>`; + } else if (slave.devotion > -10) { + t += `<span class='hotpink'>reducing ${his} dislike of you.</span>`; + } else { + t += `<span class='hotpink'>reducing ${his} hatred of you.</span>`; + } + } else if (_vignette.effect < 0) { + if (slave.devotion > 50) { + t += `<span class='mediumorchid'>reducing ${his} devotion to you.</span>`; + } else if (slave.devotion >= -20) { + t += `<span class='mediumorchid'>reducing ${his} acceptance of you.</span>`; + } else if (slave.devotion > -10) { + t += `<span class='mediumorchid'>increasing ${his} dislike of you.</span>`; + } else { + t += `<span class='mediumorchid'>increasing ${his} hatred of you.</span>`; + } + } else { + t += `an incident without lasting effect.`; + } + slave.devotion += (1*_vignette.effect); + } else if (_vignette.type == "trust") { + if (_vignette.effect > 0) { + if (slave.trust > 20) { + t += `<span class='mediumaquamarine'>increasing ${his} trust in you.</span>`; + } else if (slave.trust > -10) { + t += `<span class='mediumaquamarine'>reducing ${his} fear of you.</span>`; + } else { + t += `<span class='mediumaquamarine'>reducing ${his} terror of you.</span>`; + } + } else if (_vignette.effect < 0) { + if (slave.trust > 20) { + t += `<span class='gold'>reducing ${his} trust in you.</span>`; + } else if (slave.trust >= -20) { + t += `<span class='gold'>increasing ${his} fear of you.</span>`; + } else { + t += `<span class='gold'>increasing ${his} terror of you.</span>`; + } + } else { + t += `an incident without lasting effect.`; + } + slave.trust += (1*_vignette.effect); + } else if (_vignette.type == "health") { + if (_vignette.effect > 0) { + t += `<span class='green'>improving ${his} health.</span>`; + } else if (_vignette.effect < 0) { + t += `<span class='red'>affecting ${his} health.</span>`; + } else { + t += `an incident without lasting effect.`; + } + slave.health += (2*_vignette.effect); + } else { + if (_vignette.effect > 0) { + t += `<span class='green'>gaining you a bit of reputation.</span>`; + } else if (_vignette.effect < 0) { + t += `<span class='red'>losing you a bit of reputation.</span>`; + } else { + t += `an incident without lasting effect.`; + } + V.rep += Math.trunc(V.FResult*_vignette.effect*0.1); + } } - function calcWorksWithRival(slave) { - const en = getSlave(slave.rivalryTarget); - if (en !== undefined && sameAssignmentP(slave, en)) result -= 1; - } + return t; +} - function calcHInjectionsDiet(slave) { - if (slave.drugs === "male hormone injections" || slave.drugs === "female hormone injections") - result -= 10; - if (slave.diet === "XXY") - result += 2; - else if (slave.diet === "XY" || slave.diet === "XX") - result += 1; - else if (slave.diet === "cum production") - result += 1; - else if (slave.diet === "fertility") - result += 1; - } - function calcPreg(slave) { - if (V.arcologies[0].FSRepopulationFocus > 20) { - if (slave.preg > 10) result += 2; - else result -= 2; - } else if (V.arcologies[0].FSRestart > 20) { - if (slave.bellyPreg >= 500 && slave.breedingMark === 1 && V.propOutcome === 1) - result += 1; - else if (slave.preg > 10) - result -= 10; - else - result += 0; - } - } +/*:: SA servant [script]*/ - function calcRace(slave) { - if (V.arcologies[0].FSSupremacist !== "unset" && supremeRaceP(slave)) - result -= (V.arcologies[0].FSSupremacist/5) + (V.arcologies[0].FSSupremacistLawME*10); - if (V.arcologies[0].FSSubjugationist !== "unset" && inferiorRaceP(slave)) - result += (V.arcologies[0].FSSubjugationist/10) + (V.arcologies[0].FSSubjugationistLawME); - } +window.saServant = function saServant(slave) { - function calcSexAttributes(slave) { - if (slave.clitPiercing > 2) result += 1; - if (slave.fetishKnown === 1 && slave.fetishStrength > 60 && slave.fetish != "none") - result += slave.fetishStrength/5; - - if (slave.attrKnown === 1) { - result += Math.trunc(slave.attrXX/20); - result += Math.trunc(slave.attrXY/20); - if (slave.energy > 95) result += 3; - else if (slave.energy > 80) result += 2; - else if (slave.energy > 60) result += 1; - else if (slave.energy <= 20) result -= 2; - else if (slave.energy <= 40) result -= 1; - } - if (slave.sexualFlaw !== "none") result -= 2; - if (slave.sexualQuirk !== "none") result += 2; - if (slave.behavioralFlaw !== "none") result -= 2; - if (slave.behavioralQuirk !== "none") result += 2; - } - - function calcCareer(slave) { - if (setup.whoreCareers.includes(slave.career)) - result += 1; - else if (slave.oralCount + slave.analCount + slave.vaginalCount + slave.mammaryCount + slave.penetrativeCount > 1000) - result += 1; - } - - function calcSight(slave) { - if (!canSee(slave)) result -= 3; - else if (slave.eyes <= -1) { - if (slave.eyewear !== "corrective glasses" && slave.eyewear !== "corrective contacts") - result -= 1; - } else if (slave.eyewear === "blurring glasses") - result -= 1; - else if (slave.eyewear === "blurring contacts") - result -= 1; - } + var pronouns = getPronouns(slave); + var he = pronouns.pronoun, him = pronouns.object, his = pronouns.possessive, hers = pronouns.possessivePronoun, himself = pronouns.objectReflexive, boy = pronouns.noun; + var He = capFirstChar(he), His = capFirstChar(his); + var V = State.variables; - function calcHearing(slave) { - if (!canHear(slave)) result -= 2; - else if (slave.hears <= -1) { - if (slave.earwear !== "hearing aids") - result -= 1; - } else if (slave.earwear === "muffling ear plugs") - result -= 1; - } + var t = `works as a servant. ${He} performs the lowest jobs in your penthouse, cleaning up after your other slaves, bathing them, helping them dress, and giving them sexual relief.`; - function calcEgyptianBonus(slave) { - if (V.racialVarieties === undefined) V.racialVarieties = []; - if (!V.racialVarieties.includes(slave.race)) - V.racialVarieties.push(slave.race); + if (V.servantsQuarters > 0) { + if ((V.universalRulesFacilityWork == 1 && slave.assignment == "be a servant" && V.servantsQuartersSpots > 0) || (slave.assignment == "work as a servant")) { + if (slave.assignment == "be a servant") { + t += ` Since there's extra space in the servants' quarters, ${V.assistantName} attaches ${him} to the cadre of maids there.`; + V.servantsQuartersSpots--; + } + if (V.Stewardess != 0) { + t += ` This brings ${him} under ${V.Stewardess.slaveName}'s supervision. The Stewardess `; + if (slave.devotion < -20) { + t += `subjects ${him} to <span class='gold'>corrective rape</span> when ${his} service is imperfect, <span class='hotpink'>when ${he} steps out of line</span>, or when the Stewardess just feels like raping ${him}, forcing the poor slave to <span class='yellowgreen'>find refuge in work.</span>`; + slave.devotion += 2; + slave.trust -= 2; + } else if (slave.devotion <= 20) { + t += `molests ${him}, encouraging the poor slave to <span class='hotpink'>keep ${his} head down</span> and <span class='yellowgreen'>work harder.</span>`; + slave.devotion += 2; + } else { + t += `uses <span class='hotpink'>sex as a reward</span>, getting ${him} off when ${he} <span class='yellowgreen'>works harder.</span>`; + slave.devotion++; + } + if (!(canHear(slave))) { + t += ` However, ${his} inability to hear often leaves ${him} oblivious to ${V.Stewardess.slaveName}'s orders, limiting their meaningful interactions.`; + V.cash += (V.stewardessBonus/4); + } else if ((slave.hears == -1 && slave.earwear != "hearing aids") || (slave.hears == 0 && slave.earwear == "muffling ear plugs")) { + t += ` However, ${he} often doesn't catch what ${V.Stewardess.slaveName} says, leading to frustration, confusion and less work done.`; + V.cash += (V.stewardessBonus/2); + } else { + V.cash += V.stewardessBonus; + } + } + } } - function calcYouthBonus(slave) { - if (slave.visualAge < 30) { - if (slave.actualAge > 30) - result += 5; // experienced for her apparent age - if (slave.physicalAge > 30) - result -= slave.physicalAge/2; // too old :( + t += ` ${He} is `; + if (slave.trust < -20) { + t += "frightened of punishment and works very hard, <span class='yellowgreen'>reducing the upkeep</span> of your slaves."; + } else if (slave.devotion < -20) { + if (slave.trust >= 20) { + t += `uninterested in doing such work and barely lifts a finger to <span class='yellowgreen'>reduce the upkeep</span> of your slaves.`; + } else { + t += `reluctant, requiring your other slaves to force ${his} services, and does not <span class='yellowgreen'>reduce upkeep</span> of your slaves much.`; } + } else if (slave.devotion <= 20) { + t += `hesitant, requiring your other slaves to demand ${his} services, and only slightly <span class='yellowgreen'>reduces upkeep</span> of your slaves.`; + } else if (slave.devotion <= 50) { + t += `obedient, offering your other slaves ${his} services, and moderately <span class='yellowgreen'>reduces the upkeep</span> of your slaves.`; + } else if (slave.devotion <= 95) { + t += `devoted, happily giving your other slaves ${his} services, and <span class='yellowgreen'>reduces the upkeep</span> of your slaves.`; + } else { + t += `so happy to serve your other slaves that ${he} often sees to their needs before they know they have them, and greatly <span class='yellowgreen'>reduces the upkeep</span> of your slaves.`; } - function calcMatureBonus(slave) { - if (slave.visualAge >= 30 && slave.actualAge >= 30 && slave.physicalAge < slave.visualAge) - result += Math.min((slave.physicalAge - slave.visualAge) * 2, 20); // looks and acts mature, but has a body that just won't quit - } + let _oral = jsRandom(5,10); + slave.oralCount += _oral; + V.oralTotal += _oral; - function calcNotFuckdoll(slave) { - if (V.familyTesting === 1 && totalRelatives(slave) > 0) - calcWorksWithRelatives(slave); - else if(!V.familyTesting && slave.relation !==0) - calcWorksWithRelativesVanilla(slave); - if (slave.relationship > 0) calcWorksWithRelationship(slave); - if (slave.rivalry !== 0) calcWorksWithRival(slave); - calcHInjectionsDiet(slave); - calcPreg(slave); - calcRace(slave); - calcSexAttributes(slave); - calcCareer(slave); - calcSight(slave); - calcHearing(slave); - if (V.arcologies[0].FSEgyptianRevivalist !== "unset") - calcEgyptianBonus(slave); - if (V.arcologies[0].FSYouthPreferentialist !== "unset") - calcYouthBonus(slave); - else if (V.arcologies[0].FSMaturityPreferentialist !== "unset") - calcMatureBonus(slave); + if (slave.relationship == -2) { + t += ` ${He} does ${his} best to perfect your domesticity due to ${his} emotional bond to you.`; + } else if (slave.relationship == -3 && slave.devotion > 50) { + t += ` ${He} does ${his}very best to be the perfect housewife, making ${him} an outstanding servant.`; } - function calcAge(slave) { - if ((V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset") && slave.physicalAge === V.minimumSlaveAge && slave.physicalAge === V.fertilityAge && canGetPregnant(slave)) { - result += 1; - if (slave.birthWeek === 0) result += result; - else if (slave.birthWeek < 4) result += 0.2*result; - } else if (slave.physicalAge === V.minimumSlaveAge) { - result += 1; - if (slave.birthWeek === 0 ) result += 0.5*result; - else if (slave.birthWeek < 4) result += 0.1*result; - } else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset")) { - result += 1; - if (slave.birthWeek === 0) - result += 0.5*result; - else if (slave.birthWeek < 4) - result += 0.1*result; - } + if (setup.servantCareers.includes(slave.career)) { + t += ` ${He} has experience with house keeping from ${his} life before ${he} was a slave, making ${him} more effective.`; + } else if (slave.skillS >= V.masteredXP) { + t += ` ${He} has experience with house keeping from working for you, making ${him} more effective.`; + } else { + slave.skillS += jsRandom(1,Math.ceil((slave.intelligence+slave.intelligenceImplant)/15) + 8); } - function calcAmputation(slave) { - switch(slave.amp) { - case 0: - case -2: - case -5: - break; - case 1: - result -= 2; - break; - default: - result -= 1; + if (slave.fetishStrength > 60) { + if (slave.fetish == "submissive" && slave.fetishKnown == 1) { + t += ` ${His} natural affinity for submission increases ${his} effectiveness.`; + } else if (slave.fetishKnown == 1 && slave.fetish == "dom") { + t += ` ${His} sexual appetite for domination reduces ${his} effectiveness.`; } } - function calcHedonismWeight(slave) { - if (slave.weight < 10) - result -= 2; - else if (slave.weight > 190) - result -= 5; // too fat - } - return FResult; -})(); - -/* End Week Passage Conversions */ - -/*:: SA rest [script]*/ - -window.saRest = function saRest(slave) { - - var pronouns = getPronouns(slave); - var he = pronouns.pronoun, him = pronouns.object, his = pronouns.possessive, hers = pronouns.possessivePronoun, himself = pronouns.objectReflexive, boy = pronouns.noun; - var He = capFirstChar(he), His = capFirstChar(his); - var V = State.variables; - - var t = " takes the week off."; - - if (slave.fuckdoll > 0) { - t += " ${He} has nothing to do but "; - if (slave.amp == 0) { - t += "lie "; - } else { - t += "stand "; - } - t += "in place."; + if (slave.energy < 20) { + t += ` ${His} frigidity allows ${him} to ignore the intercourse all around ${him}, making ${him} very efficient.`; + } else if (slave.energy < 40) { + t += ` ${His} low sex drive keeps ${him} from becoming too distracted by the intercourse all around ${him}, making ${him} more efficient.`; } - if (slave.health > 90) { - t += ` ${His} health is so outstanding that rest does not improve it.`; - } else if (slave.health > -100) { - t += ` ${His} <span class='green'>health recovers</span> with rest.`; - slave.health += 10; - if (!(canHear(slave))) { - t += ` Since ${he} is deaf, the hustle and bustle of daily life in the penthouse <span class='green'>didn't bother ${him} at all.</span>`; - slave.health += 3; - } else if ((slave.hears == -1 && slave.earwear != "hearing aids") || (slave.hears == 0 && slave.earwear == "muffling ear plugs")) { - t += ` Since ${he} is hard of hearing, the hustle and bustle of daily life in the penthouse <span class='green'>didn't disturb ${his} rest as much.</span>`; - slave.health += 1; - } + if ((slave.eyes <= -1 && slave.eyewear != "corrective glasses" && slave.eyewear != "corrective contacts") || (slave.eyewear == "blurring glasses") || (slave.eyewear == "blurring contacts")) { + t += ` ${His} bad vision makes ${him} a worse servant.`; } - if (slave.fuckdoll == 0 && slave.fetish != "mindbroken") { - if (slave.devotion > 20) { - if (slave.trust <= 20) { - t += ` Being allowed to rest <span class='mediumaquamarine'>reduces ${his} fear</span> of you.`; - slave.trust += 4; - } else if (slave.trust <= 50) { - t += ` Being allowed to rest <span class='mediumaquamarine'>builds ${his} trust</span> in you.`; - slave.trust += 2; - } else { - t += ` Being allowed to rest <span class='mediumaquamarine'>confirms ${his} trust</span> in you.`; - slave.trust += 2; - } + if (slave.lactation > 0) { + t += ` Since ${he} is lactating, `; + if (slave.devotion > 20 || slave.trust < -20) { + t += ` ${he} serves `; } else { - if (slave.trust < -20) { - t += ` Being allowed to rest <span class='mediumaquamarine'>reduces ${his} fear</span> of you.`; - slave.trust += 4; - } + t += `and disobedient, ${he} is restrained to serve `; } + t += `as a drink dispenser at mealtimes, and makes a meaningful contribution to ${his} fellow slaves' nutrition in concert with the feeding systems.`; } - if (V.showVignettes == 1 && slave.assignment === Job.REST) { + if (V.showVignettes == 1 && (slave.assignment === Job.SERVANT || slave.assignment === Job.SERVER)) { var _vignette = GetVignette(slave); t += ` __This week__ ${_vignette.text} ` if (_vignette.type == "cash") { @@ -13111,201 +13016,11 @@ window.saRest = function saRest(slave) { } return t; -} - -/*:: SA servant [script]*/ +}; -window.saServant = function saServant(slave) { +/*:: SA stay confined [script]*/ - var pronouns = getPronouns(slave); - var he = pronouns.pronoun, him = pronouns.object, his = pronouns.possessive, hers = pronouns.possessivePronoun, himself = pronouns.objectReflexive, boy = pronouns.noun; - var He = capFirstChar(he), His = capFirstChar(his); - var V = State.variables; - - var t = `works as a servant. ${He} performs the lowest jobs in your penthouse, cleaning up after your other slaves, bathing them, helping them dress, and giving them sexual relief.`; - - if (V.servantsQuarters > 0) { - if ((V.universalRulesFacilityWork == 1 && slave.assignment == "be a servant" && V.servantsQuartersSpots > 0) || (slave.assignment == "work as a servant")) { - if (slave.assignment == "be a servant") { - t += ` Since there's extra space in the servants' quarters, ${V.assistantName} attaches ${him} to the cadre of maids there.`; - V.servantsQuartersSpots--; - } - if (V.Stewardess != 0) { - t += ` This brings ${him} under ${V.Stewardess.slaveName}'s supervision. The Stewardess `; - if (slave.devotion < -20) { - t += `subjects ${him} to <span class='gold'>corrective rape</span> when ${his} service is imperfect, <span class='hotpink'>when ${he} steps out of line</span>, or when the Stewardess just feels like raping ${him}, forcing the poor slave to <span class='yellowgreen'>find refuge in work.</span>`; - slave.devotion += 2; - slave.trust -= 2; - } else if (slave.devotion <= 20) { - t += `molests ${him}, encouraging the poor slave to <span class='hotpink'>keep ${his} head down</span> and <span class='yellowgreen'>work harder.</span>`; - slave.devotion += 2; - } else { - t += `uses <span class='hotpink'>sex as a reward</span>, getting ${him} off when ${he} <span class='yellowgreen'>works harder.</span>`; - slave.devotion++; - } - if (!(canHear(slave))) { - t += ` However, ${his} inability to hear often leaves ${him} oblivious to ${V.Stewardess.slaveName}'s orders, limiting their meaningful interactions.`; - V.cash += (V.stewardessBonus/4); - } else if ((slave.hears == -1 && slave.earwear != "hearing aids") || (slave.hears == 0 && slave.earwear == "muffling ear plugs")) { - t += ` However, ${he} often doesn't catch what ${V.Stewardess.slaveName} says, leading to frustration, confusion and less work done.`; - V.cash += (V.stewardessBonus/2); - } else { - V.cash += V.stewardessBonus; - } - } - } - } - - t += ` ${He} is `; - if (slave.trust < -20) { - t += "frightened of punishment and works very hard, <span class='yellowgreen'>reducing the upkeep</span> of your slaves."; - } else if (slave.devotion < -20) { - if (slave.trust >= 20) { - t += `uninterested in doing such work and barely lifts a finger to <span class='yellowgreen'>reduce the upkeep</span> of your slaves.`; - } else { - t += `reluctant, requiring your other slaves to force ${his} services, and does not <span class='yellowgreen'>reduce upkeep</span> of your slaves much.`; - } - } else if (slave.devotion <= 20) { - t += `hesitant, requiring your other slaves to demand ${his} services, and only slightly <span class='yellowgreen'>reduces upkeep</span> of your slaves.`; - } else if (slave.devotion <= 50) { - t += `obedient, offering your other slaves ${his} services, and moderately <span class='yellowgreen'>reduces the upkeep</span> of your slaves.`; - } else if (slave.devotion <= 95) { - t += `devoted, happily giving your other slaves ${his} services, and <span class='yellowgreen'>reduces the upkeep</span> of your slaves.`; - } else { - t += `so happy to serve your other slaves that ${he} often sees to their needs before they know they have them, and greatly <span class='yellowgreen'>reduces the upkeep</span> of your slaves.`; - } - - let _oral = jsRandom(5,10); - slave.oralCount += _oral; - V.oralTotal += _oral; - - if (slave.relationship == -2) { - t += ` ${He} does ${his} best to perfect your domesticity due to ${his} emotional bond to you.`; - } else if (slave.relationship == -3 && slave.devotion > 50) { - t += ` ${He} does ${his}very best to be the perfect housewife, making ${him} an outstanding servant.`; - } - - if (setup.servantCareers.includes(slave.career)) { - t += ` ${He} has experience with house keeping from ${his} life before ${he} was a slave, making ${him} more effective.`; - } else if (slave.skillS >= V.masteredXP) { - t += ` ${He} has experience with house keeping from working for you, making ${him} more effective.`; - } else { - slave.skillS += jsRandom(1,Math.ceil((slave.intelligence+slave.intelligenceImplant)/15) + 8); - } - - if (slave.fetishStrength > 60) { - if (slave.fetish == "submissive" && slave.fetishKnown == 1) { - t += ` ${His} natural affinity for submission increases ${his} effectiveness.`; - } else if (slave.fetishKnown == 1 && slave.fetish == "dom") { - t += ` ${His} sexual appetite for domination reduces ${his} effectiveness.`; - } - } - - if (slave.energy < 20) { - t += ` ${His} frigidity allows ${him} to ignore the intercourse all around ${him}, making ${him} very efficient.`; - } else if (slave.energy < 40) { - t += ` ${His} low sex drive keeps ${him} from becoming too distracted by the intercourse all around ${him}, making ${him} more efficient.`; - } - - if ((slave.eyes <= -1 && slave.eyewear != "corrective glasses" && slave.eyewear != "corrective contacts") || (slave.eyewear == "blurring glasses") || (slave.eyewear == "blurring contacts")) { - t += ` ${His} bad vision makes ${him} a worse servant.`; - } - - if (slave.lactation > 0) { - t += ` Since ${he} is lactating, `; - if (slave.devotion > 20 || slave.trust < -20) { - t += ` ${he} serves `; - } else { - t += `and disobedient, ${he} is restrained to serve `; - } - t += `as a drink dispenser at mealtimes, and makes a meaningful contribution to ${his} fellow slaves' nutrition in concert with the feeding systems.`; - } - - if (V.showVignettes == 1 && (slave.assignment === Job.SERVANT || slave.assignment === Job.SERVER)) { - var _vignette = GetVignette(slave); - t += ` __This week__ ${_vignette.text} ` - if (_vignette.type == "cash") { - if (_vignette.effect > 0) { - t += `<span class='yellowgreen'>making you an extra ${cashFormat(Math.trunc(V.FResult*_vignette.effect))}.</span>`; - } else if (_vignette.effect < 0) { - t += `<span class='red'>losing you ${cashFormat(Math.abs(Math.trunc(V.FResult*_vignette.effect)))}.</span>`; - } else { - t += `an incident without lasting effect.`; - } - V.cash += Math.trunc(V.FResult*_vignette.effect); - } else if (_vignette.type == "devotion") { - if (_vignette.effect > 0) { - if (slave.devotion > 50) { - t += `<span class='hotpink'>increasing ${his} devotion to you.</span>`; - } else if (slave.devotion >= -20) { - t += `<span class='hotpink'>increasing ${his} acceptance of you.</span>`; - } else if (slave.devotion > -10) { - t += `<span class='hotpink'>reducing ${his} dislike of you.</span>`; - } else { - t += `<span class='hotpink'>reducing ${his} hatred of you.</span>`; - } - } else if (_vignette.effect < 0) { - if (slave.devotion > 50) { - t += `<span class='mediumorchid'>reducing ${his} devotion to you.</span>`; - } else if (slave.devotion >= -20) { - t += `<span class='mediumorchid'>reducing ${his} acceptance of you.</span>`; - } else if (slave.devotion > -10) { - t += `<span class='mediumorchid'>increasing ${his} dislike of you.</span>`; - } else { - t += `<span class='mediumorchid'>increasing ${his} hatred of you.</span>`; - } - } else { - t += `an incident without lasting effect.`; - } - slave.devotion += (1*_vignette.effect); - } else if (_vignette.type == "trust") { - if (_vignette.effect > 0) { - if (slave.trust > 20) { - t += `<span class='mediumaquamarine'>increasing ${his} trust in you.</span>`; - } else if (slave.trust > -10) { - t += `<span class='mediumaquamarine'>reducing ${his} fear of you.</span>`; - } else { - t += `<span class='mediumaquamarine'>reducing ${his} terror of you.</span>`; - } - } else if (_vignette.effect < 0) { - if (slave.trust > 20) { - t += `<span class='gold'>reducing ${his} trust in you.</span>`; - } else if (slave.trust >= -20) { - t += `<span class='gold'>increasing ${his} fear of you.</span>`; - } else { - t += `<span class='gold'>increasing ${his} terror of you.</span>`; - } - } else { - t += `an incident without lasting effect.`; - } - slave.trust += (1*_vignette.effect); - } else if (_vignette.type == "health") { - if (_vignette.effect > 0) { - t += `<span class='green'>improving ${his} health.</span>`; - } else if (_vignette.effect < 0) { - t += `<span class='red'>affecting ${his} health.</span>`; - } else { - t += `an incident without lasting effect.`; - } - slave.health += (2*_vignette.effect); - } else { - if (_vignette.effect > 0) { - t += `<span class='green'>gaining you a bit of reputation.</span>`; - } else if (_vignette.effect < 0) { - t += `<span class='red'>losing you a bit of reputation.</span>`; - } else { - t += `an incident without lasting effect.`; - } - V.rep += Math.trunc(V.FResult*_vignette.effect*0.1); - } - } - - return t; -}; - -/*:: SA stay confined [script]*/ - -window.saStayConfined = function saStayConfined(slave) { +window.saStayConfined = function saStayConfined(slave) { var pronouns = getPronouns(slave) var he = pronouns.pronoun, him = pronouns.object, his = pronouns.possessive, hers = pronouns.possessivePronoun, himself = pronouns.objectReflexive, boy = pronouns.noun @@ -37247,7 +36962,7 @@ window.FacilityNameCleanup = function FacilityNameCleanup() { V.farmyardNameCaps = V.farmyardNameCaps || "The Farmyard"; }; -/*:: Beauty [script]*/ +/*:: Slave Cost JS [script]*/ window.Beauty = (function() { "use strict"; @@ -37310,7 +37025,7 @@ window.Beauty = (function() { calcMultipliersBeauty(slave); beauty = Math.max(1, Math.trunc(0.5*beauty)); - V.beauty = beauty; + return beauty; }; function calcInitBeauty(slave) { @@ -38114,357 +37829,1085 @@ window.Beauty = (function() { } else { beauty += 4; } - }; + }; + + function calcFutaLawBigDickBeauty(slave) { + beauty += slave.dick; + if (slave.balls > 120) { + beauty += 14; + } else if (slave.balls > 100) { + beauty += 12; + } else if (slave.balls > 80) { + beauty += 10; + } else if (slave.balls > 60) { + beauty += 8; + } else if (slave.balls > 40) { + beauty += 6; + } else if (slave.balls > 20) { + beauty += 4; + } else if (slave.balls > 10) { + beauty += 2; + } else { + beauty += slave.balls; + } + }; + + function calcFutaLawBigBootyBeauty(slave) { + if (slave.hips >= 1) { + beauty += 4*(slave.hips - 1); /*8*/ + if (arcology.FSSlimnessEnthusiast !== "unset") { + beauty += 4*(slave.hips - 1); /*8*/ /* offsets the malus for big butts */ + } + } + if (slave.analSkill > 60 && slave.anus >= 2) { + beauty += 2*(slave.anus-2); /*6*/ + if (arcology.FSSlimnessEnthusiast != "unset") { + beauty += 2*(slave.anus-2); /*6*/ /* offsets the malus for big butts */ + } + } + if (slave.butt >= 5) { + beauty += (slave.butt - 5); /*15*/ + } + }; + + function calcFutaLawFemboyBeauty(slave) { + if (arcology.FSSlimnessEnthusiast === "unset") { /*balance with slimness*/ + beauty += 20; + if (slave.boobs < 300) { + beauty += 12; + } else if (slave.boobs < 400) { + beauty += 6; + } + } + if (slave.dick === 1) { + beauty += 12; + } else if (slave.dick === 2) { + beauty += 6; + } + if (slave.balls <= 2) { + beauty += 8; + } + if (slave.faceShape === "cute" && slave.face > 0) { /*uggos need not apply, maybe a small boost for other faceShapes*/ + beauty += ((arcology.FSGenderRadicalist/25)*(slave.face/30)) - 2; /*gives a slightly better boost than androgynous does with gendrad boost, 15.3*/ + } + if (slave.nipples === "tiny") { + beauty += 5; + } else if (slave.nipples === "cute") { + beauty += 2; + } else { + beauty -= 5; + } + }; + + function calcBodyProportionBeauty(slave) { + if (arcology.FSGenderFundamentalist !== "unset") { + if (slave.shoulders > slave.hips) { + if (slave.boobs <= 2000*(slave.shoulders - slave.hips)) { + beauty -= (slave.shoulders - slave.hips)*(1 + (arcology.FSGenderFundamentalist/200)); + } + } + } else if (arcology.FSGenderRadicalist === "unset") { + if (slave.shoulders > slave.hips) { + if (slave.boobs <= 2000*(slave.shoulders - slave.hips)) { + beauty -= slave.shoulders - slave.hips; + } + } + } + }; + + function calcVoiceBeauty(slave) { + if (canTalk(slave)) { + if (slave.accent >= 3) { + beauty -= 1; + } else if (slave.accent === 1) { + beauty += 1; + } + } else { + beauty -= 2; + } + }; + + function calcLimbsBeauty(slave) { + switch (slave.amp) { + case 1: + beauty -= 10; + break; + case -1: + case -2: + case -4: + beauty -= 2; + break; + } + }; + + function calcPubertyBeauty(slave) { + if (slave.pubertyXX === 1) { + beauty += 5; + } + if (slave.pubertyXY === 0 && slave.physicalAge > V.potencyAge && slave.balls > 0) { + beauty += 10; + if (arcology.FSGenderFundamentalist !== "unset") { + beauty += 5; + } + } + }; + + function calcFSMiscBeauty(slave) { + if (arcology.FSTransformationFetishist > 20) { + if (slave.lips > 70) { + if (slave.lipsImplant/slave.lips < 0.5) { + beauty -= ((slave.lips/10) + (arcology.FSTransformationFetishist/20)); + } + } + if (slave.hips === 3) { + beauty += 10; + } + } + if ((arcology.FSGenderRadicalist > 20 && arcology.FSGenderRadicalistLawFuta !== 3) || arcology.FSSlimnessEnthusiast > 20) { + if (slave.hips < 0) { + beauty += Math.abs(slave.hips); + } + } + if (arcology.FSPhysicalIdealist !== "unset") { + if (slave.height > Height.mean(slave)) { + beauty += 10; + } + } + if (arcology.FSHedonisticDecadenceLaw2 === 1) { + if (slave.boobs >= 2000 && slave.butt >= 5 && slave.weight > 95) { + beauty += 5 + (arcology.FSHedonisticDecadence/20); /*10*/ + } else { + beauty -= 15 + (arcology.FSHedonisticDecadence/20); /*-20*/ + } + } + if (arcology.FSChattelReligionistCreed === 1) { + if (V.nicaeaAssignment === slave.assignment) { + beauty += 2*V.nicaeaPower; + } + } + }; + + function calcPurityBeauty(slave) { + if (isPure(slave)) { + V.pure = V.pure++ || 1; + if (arcology.FSBodyPurist !== "unset") { + beauty += arcology.FSBodyPurist/5; + } + if (arcology.FSTransformationFetishist === "unset") { + beauty += 2; + } + } else if (arcology.FSTransformationFetishist !== "unset") { + beauty += arcology.FSTransformationFetishist/40; + } + }; + + function calcPhysiqueBeauty(slave) { + let physiquePass = 0; + + if (slave.boobs < 500 && slave.butt < 3) { + if (slave.muscles <= 30 && arcology.FSPhysicalIdealist === "unset" && slave.weight <= 10 && arcology.FSHedonisticDecadence === "unset") { + physiquePass = 1; + } else if (arcology.FSPhysicalIdealist !== "unset") { /* no muscle malus for muscle loving societies */ + if (arcology.FSPhysicalIdealistStrongFat === 1 && slave.weight <= 30) { /* reduced weight malus for fat loving societies */ + physiquePass = 1; + } else if (slave.weight <= 10) { + physiquePass = 1; + } + } else if (arcology.FSHedonisticDecadence !== "unset" && slave.weight <= 30) { /* reduced weight malus for fat loving societies */ + if (arcology.FSHedonisticDecadenceStrongFat === 1) { /* no muscle malus for muscle loving societies */ + physiquePass = 1; + } else if (slave.muscles <= 30) { + physiquePass = 1; + } + } + } + if (physiquePass === 1) { + beauty += 40; + if (arcology.FSSlimnessEnthusiast > 20) { + beauty += arcology.FSSlimnessEnthusiast/20; + if (canTalk(slave) && slave.voice === 3) { + beauty += arcology.FSSlimnessEnthusiast/40; + } + } + } else if (slave.butt > 4 && slave.boobs > 800) { + if (arcology.FSSlimnessEnthusiast === "unset") { + beauty += 1; + } + if (arcology.FSAssetExpansionist > 20) { + beauty += arcology.FSAssetExpansionist/20; + if (canTalk(slave) && slave.voice === 3) { + beauty += arcology.FSAssetExpansionist/40; + } + } + } + }; + + function calcSlimBeauty(slave) { + if (slimPass(slave) === 1) { + beauty += 40 + (arcology.FSSlimnessEnthusiast/20); /*45*/ + } else { + beauty -= arcology.FSSlimnessEnthusiast/20; + } + }; + + function calcGenderLawBeauty(slave) { + V.genderLawPass = 1; + + if (arcology.FSPhysicalIdealist === "unset" && arcology.FSHedonisticDecadenceStrongFat === 0 && slave.muscles > 30) { /*muscle check*/ + V.genderLawPass = 0; + } else if (arcology.FSHedonisticDecadence !== "unset" || arcology.FSPhysicalIdealistStrongFat === 1) { /*weight check*/ + if (slave.weight > 130 || slave.weight <= -30) { + V.genderLawPass = 0; + } + } else if (Math.abs(slave.weight) > 30) { + V.genderLawPass = 0; + } else if (arcology.FSAssetExpansionist !== "unset") { + if (slave.boobs < 500 || slave.boobs > 1600 || slave.butt < 3 || slave.butt > 6) { + V.genderLawPass = 0; + } + } else if (slave.boobs < 500 || slave.boobs > 800 || slave.butt < 3 || slave.butt > 4) { + V.genderLawPass = 0; + } + if (V.genderLawPass === 1) { + beauty += 60; + } else { + beauty -= 10; + } + }; + + function calcMultipliersBeauty(slave) { + calcBellyBeauty(slave); + if (arcology.FSGenderRadicalist !== "unset") { + if (slave.bellyPreg >= 500 && arcology.FSRepopulationFocus === "unset" && arcology.FSRestart === "unset") { + if (slave.mpreg === 1) { + beauty = 0.9*beauty; + } else { + beauty = 0.7*beauty; + } + } + } else if (arcology.FSGenderFundamentalist === "unset") { + if (slave.preg > 10 && arcology.FSRepopulationFocus === "unset" && arcology.FSRestart === "unset") { + beauty = 0.8*beauty; + } + } + if (slave.breedingMark === 1) { + if (V.propOutcome === 1) { + beauty = 2*beauty; + } else { + beauty += 2; + } + } + if (slave.fuckdoll === 0 && V.seeAge === 1) { + calcAgeBeauty(slave); + } + if (slave.prestige + slave.pornPrestige > 0) { + calcPrestigeBeauty(slave); + } + }; + + function calcBellyBeauty(slave) { + if (slave.bellySag > 0) { + if (slave.belly < 100) { + if (arcology.FSRepopulationFocus === "unset") { + beauty -= 20; + } + } + } + if (slave.bellyImplant >= 1500) { + if (arcology.FSTransformationFetishist > 20) { + beauty += Math.min(Math.trunc(slave.bellyImplant/1000), 50); /*50*/ + } else if (arcology.FSRepopulationFocus > 60) { + if ((slave.ovaries === 0 && slave.mpreg === 0) || slave.preg < -1) { + beauty += 20; + } + } else { + if (slave.bellyImplant >= 750000) { /* multipliers */ + beauty = 0.2*beauty; + } else if (slave.bellyImplant >= 450000) { + beauty = 0.5*beauty; + } else if (slave.bellyImplant >= 300000) { + beauty = 0.7*beauty; + } else if (slave.bellyImplant >= 100000) { + beauty = 0.8*beauty; + } else if (slave.bellyImplant >= 50000) { + beauty = 0.85*beauty; + } else { + beauty = 0.9*beauty; + } + } + } + }; + + function calcAgeBeauty(slave) { + if (slave.physicalAge === V.minimumSlaveAge) { + beauty += 1; + if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset") && arcology.FSRestart === "unset") { + if (slave.birthWeek === 0) { + beauty += 1.6*beauty; + } else if (slave.birthWeek < 4) { + beauty += 0.2*beauty; + } + } else { + if (slave.birthWeek === 0) { + beauty += 0.8*beauty; + } else if (slave.birthWeek < 4) { + beauty += 0.1*beauty; + } + } + } else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset") && arcology.FSRestart === "unset") { + beauty += 1; + if (slave.birthWeek === 0) { + beauty += 0.8*beauty; + } else if (slave.birthWeek < 4) { + beauty += 0.1*beauty; + } + } + }; + + function calcPrestigeBeauty(slave) { /* multipliers */ + if (slave.prestige >= 3) { + beauty += 2*beauty; + } else if (slave.prestige === 2) { + beauty += 0.5*beauty; + } else if (slave.prestige === 1) { + beauty += 0.25*beauty; + } + if (slave.pornPrestige === 3) { + beauty += beauty; + } else if (slave.pornPrestige === 2) { + beauty += 0.5*beauty; + } else if (slave.pornPrestige === 1) { + beauty += 0.1*beauty; + } + }; + + return Beauty; +})(); + +// this is a port of the FResult widget +// it has been broken up into several functions, because it grew too long +// it has been wrapped in a closure so as not to pollute the global namespace +// and so that nested functions are only evaluated once + +window.FResult = (function() { + "use strict"; + // we can't initialise our global variables on load, because SugarCube.State isn't initialised + // instead, declare them and initialise on run time + let V, result, incest_bonus; + function FResult(slave) { + V = State.variables; + incest_bonus = V.arcologies[0].FSEgyptianRevivalist > 20 || V.arcologies[0].FSEgyptianRevivalistIncestPolicy === 1; + + calcUseWeights(slave); + if (!slave.fuckdoll) + calcNotFuckdoll(slave); + else + result += slave.fuckdoll/10; + + result += Math.max(0, slave.aphrodisiacs) * 2; + + if (slave.inflationType === "aphrodisiac") + result += slave.inflation*4; + + if (slave.lactation > 0) + result += 1; + + if (slave.nipples === "fuckable") + calcFuckableTits(slave); + + if (V.seeAge === 1) + calcAge(slave); + if (slave.fetish === "mindbroken") + result = Math.trunc(result*0.4); + else + result = Math.trunc(result*0.7); + + if (slave.pregWeek < 0) + result -= Math.trunc(result*slave.pregWeek/10); // reduced the most just after birth + + calcAmputation(slave); + + if (V.arcologies[0].FSHedonisticDecadence > 20) + calcHedonismWeight(slave); + if (result < 2) { + if (supremeRaceP(slave) && V.arcologies[0].FSSupremacist > 20) + result = 0; + else + result = 2; + } + return result; + } + + function calcUseWeights(slave) { + result = (3 - slave.anus)+(slave.muscles/30); + if (slave.muscles < -95) + result -= 5; + else if (slave.muscles < -30) + result -= 2; + + const uses = V.oralUseWeight + V.vaginalUseWeight + V.analUseWeight; + if (uses <= 0) return; + + result += (6+slave.tonguePiercing) * (V.oralUseWeight/uses) * (slave.oralSkill/30); + if (slave.sexualFlaw === "cum addict") + result += (V.oralUseWeight/uses) * (slave.oralSkill/30); + if (canDoVaginal(slave)) { + result += 6 * (V.vaginalUseWeight/uses) * (slave.vaginalSkill/30); + result += (3 - slave.vagina); + result += slave.vaginaLube; + } + if (canDoAnal(slave)) { + result += 6 * (V.analUseWeight/uses) * (slave.analSkill/30); + if (slave.sexualFlaw === "anal addict") + result += (V.analUseWeight/uses) * (slave.analSkill/30); + if (slave.inflationType === "aphrodisiac") + result += (V.analUseWeight/uses) * (slave.inflation * 3); + } + } + + function calcFuckableTits(slave) { + result += 2; + if (slave.fetish === "boobs") + result += Math.trunc(slave.fetishStrength/20); + } + + function calcWorksWithRelatives(slave) { + V.slaves.forEach(islave => { + if (isParentP(slave, islave) && sameAssignmentP(slave, islave)) { + result += 1; + if (incest_bonus) result += 1; + } + if (areSisters(slave, islave) > 0 && sameAssignmentP(slave, islave)) { + result += 1; + if (incest_bonus) result += 1; + } + }); + } + + function calcWorksWithRelativesVanilla(slave) { + const fre = getSlave(slave.relationTarget); + if (fre !== undefined && sameAssignmentP(slave, fre)) { + result += 2; + if (incest_bonus) result += 2; + } + } + + function calcWorksWithRelationship(slave) { + const fre = V.slaves.findIndex(s => { + return haveRelationshipP(slave, s) && sameAssignmentP(slave, s); + }); + if (fre !== -1) result += 1; + } + + function calcWorksWithRival(slave) { + const en = getSlave(slave.rivalryTarget); + if (en !== undefined && sameAssignmentP(slave, en)) result -= 1; + } + + function calcHInjectionsDiet(slave) { + if (slave.drugs === "male hormone injections" || slave.drugs === "female hormone injections") + result -= 10; + if (slave.diet === "XXY") + result += 2; + else if (slave.diet === "XY" || slave.diet === "XX") + result += 1; + else if (slave.diet === "cum production") + result += 1; + else if (slave.diet === "fertility") + result += 1; + } + function calcPreg(slave) { + if (V.arcologies[0].FSRepopulationFocus > 20) { + if (slave.preg > 10) result += 2; + else result -= 2; + } else if (V.arcologies[0].FSRestart > 20) { + if (slave.bellyPreg >= 500 && slave.breedingMark === 1 && V.propOutcome === 1) + result += 1; + else if (slave.preg > 10) + result -= 10; + else + result += 0; + } + } - function calcFutaLawBigDickBeauty(slave) { - beauty += slave.dick; - if (slave.balls > 120) { - beauty += 14; - } else if (slave.balls > 100) { - beauty += 12; - } else if (slave.balls > 80) { - beauty += 10; - } else if (slave.balls > 60) { - beauty += 8; - } else if (slave.balls > 40) { - beauty += 6; - } else if (slave.balls > 20) { - beauty += 4; - } else if (slave.balls > 10) { - beauty += 2; - } else { - beauty += slave.balls; - } - }; + function calcRace(slave) { + if (V.arcologies[0].FSSupremacist !== "unset" && supremeRaceP(slave)) + result -= (V.arcologies[0].FSSupremacist/5) + (V.arcologies[0].FSSupremacistLawME*10); + if (V.arcologies[0].FSSubjugationist !== "unset" && inferiorRaceP(slave)) + result += (V.arcologies[0].FSSubjugationist/10) + (V.arcologies[0].FSSubjugationistLawME); + } - function calcFutaLawBigBootyBeauty(slave) { - if (slave.hips >= 1) { - beauty += 4*(slave.hips - 1); /*8*/ - if (arcology.FSSlimnessEnthusiast !== "unset") { - beauty += 4*(slave.hips - 1); /*8*/ /* offsets the malus for big butts */ - } - } - if (slave.analSkill > 60 && slave.anus >= 2) { - beauty += 2*(slave.anus-2); /*6*/ - if (arcology.FSSlimnessEnthusiast != "unset") { - beauty += 2*(slave.anus-2); /*6*/ /* offsets the malus for big butts */ - } + function calcSexAttributes(slave) { + if (slave.clitPiercing > 2) result += 1; + if (slave.fetishKnown === 1 && slave.fetishStrength > 60 && slave.fetish != "none") + result += slave.fetishStrength/5; + + if (slave.attrKnown === 1) { + result += Math.trunc(slave.attrXX/20); + result += Math.trunc(slave.attrXY/20); + if (slave.energy > 95) result += 3; + else if (slave.energy > 80) result += 2; + else if (slave.energy > 60) result += 1; + else if (slave.energy <= 20) result -= 2; + else if (slave.energy <= 40) result -= 1; } - if (slave.butt >= 5) { - beauty += (slave.butt - 5); /*15*/ + if (slave.sexualFlaw !== "none") result -= 2; + if (slave.sexualQuirk !== "none") result += 2; + if (slave.behavioralFlaw !== "none") result -= 2; + if (slave.behavioralQuirk !== "none") result += 2; + } + + function calcCareer(slave) { + if (setup.whoreCareers.includes(slave.career)) + result += 1; + else if (slave.oralCount + slave.analCount + slave.vaginalCount + slave.mammaryCount + slave.penetrativeCount > 1000) + result += 1; + } + + function calcSight(slave) { + if (!canSee(slave)) result -= 3; + else if (slave.eyes <= -1) { + if (slave.eyewear !== "corrective glasses" && slave.eyewear !== "corrective contacts") + result -= 1; + } else if (slave.eyewear === "blurring glasses") + result -= 1; + else if (slave.eyewear === "blurring contacts") + result -= 1; + } + + function calcHearing(slave) { + if (!canHear(slave)) result -= 2; + else if (slave.hears <= -1) { + if (slave.earwear !== "hearing aids") + result -= 1; + } else if (slave.earwear === "muffling ear plugs") + result -= 1; + } + + function calcEgyptianBonus(slave) { + if (V.racialVarieties === undefined) V.racialVarieties = []; + if (!V.racialVarieties.includes(slave.race)) + V.racialVarieties.push(slave.race); + } + + function calcYouthBonus(slave) { + if (slave.visualAge < 30) { + if (slave.actualAge > 30) + result += 5; // experienced for her apparent age + if (slave.physicalAge > 30) + result -= slave.physicalAge/2; // too old :( } - }; + } - function calcFutaLawFemboyBeauty(slave) { - if (arcology.FSSlimnessEnthusiast === "unset") { /*balance with slimness*/ - beauty += 20; - if (slave.boobs < 300) { - beauty += 12; - } else if (slave.boobs < 400) { - beauty += 6; - } + function calcMatureBonus(slave) { + if (slave.visualAge >= 30 && slave.actualAge >= 30 && slave.physicalAge < slave.visualAge) + result += Math.min((slave.physicalAge - slave.visualAge) * 2, 20); // looks and acts mature, but has a body that just won't quit + } + + function calcNotFuckdoll(slave) { + if (V.familyTesting === 1 && totalRelatives(slave) > 0) + calcWorksWithRelatives(slave); + else if(!V.familyTesting && slave.relation !==0) + calcWorksWithRelativesVanilla(slave); + if (slave.relationship > 0) calcWorksWithRelationship(slave); + if (slave.rivalry !== 0) calcWorksWithRival(slave); + calcHInjectionsDiet(slave); + calcPreg(slave); + calcRace(slave); + calcSexAttributes(slave); + calcCareer(slave); + calcSight(slave); + calcHearing(slave); + if (V.arcologies[0].FSEgyptianRevivalist !== "unset") + calcEgyptianBonus(slave); + if (V.arcologies[0].FSYouthPreferentialist !== "unset") + calcYouthBonus(slave); + else if (V.arcologies[0].FSMaturityPreferentialist !== "unset") + calcMatureBonus(slave); + } + + function calcAge(slave) { + if ((V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset") && slave.physicalAge === V.minimumSlaveAge && slave.physicalAge === V.fertilityAge && canGetPregnant(slave)) { + result += 1; + if (slave.birthWeek === 0) result += result; + else if (slave.birthWeek < 4) result += 0.2*result; + } else if (slave.physicalAge === V.minimumSlaveAge) { + result += 1; + if (slave.birthWeek === 0 ) result += 0.5*result; + else if (slave.birthWeek < 4) result += 0.1*result; + } else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset")) { + result += 1; + if (slave.birthWeek === 0) + result += 0.5*result; + else if (slave.birthWeek < 4) + result += 0.1*result; } - if (slave.dick === 1) { - beauty += 12; - } else if (slave.dick === 2) { - beauty += 6; + } + + function calcAmputation(slave) { + switch(slave.amp) { + case 0: + case -2: + case -5: + break; + case 1: + result -= 2; + break; + default: + result -= 1; } - if (slave.balls <= 2) { - beauty += 8; + } + + function calcHedonismWeight(slave) { + if (slave.weight < 10) + result -= 2; + else if (slave.weight > 190) + result -= 5; // too fat + } + return FResult; +})(); + +window.slaveCost = (function() { + "use strict"; + let V, arcology, multiplier, cost; + + function slaveCost(slave, isStartingSlave) { + V = State.variables; + arcology = V.arcologies[0]; + multiplier = V.slaveCostFactor; + cost = Beauty(slave)*FResult(slave); + + calcGenitalsCost(slave); + calcDevotionTrustCost(slave); + calcPreferencesCost(slave); + calcPregCost(slave); + if (slave.prestige + slave.pornPrestige > 0) { + calcPrestigeCost(slave); } - if (slave.faceShape === "cute" && slave.face > 0) { /*uggos need not apply, maybe a small boost for other faceShapes*/ - beauty += ((arcology.FSGenderRadicalist/25)*(slave.face/30)) - 2; /*gives a slightly better boost than androgynous does with gendrad boost, 15.3*/ + calcFSCost(slave); + if (V.seeAge === 1) { + calcAgeCost(slave); } - if (slave.nipples === "tiny") { - beauty += 5; - } else if (slave.nipples === "cute") { - beauty += 2; - } else { - beauty -= 5; + calcCareersCost(slave); + calcMiscCost(slave); + calcIndentureCost(slave); /* multipliers */ + + calcCost(slave); + if (isStartingSlave) { + calcStartingSlaveCost(slave); } + return cost; }; - function calcBodyProportionBeauty(slave) { - if (arcology.FSGenderFundamentalist !== "unset") { - if (slave.shoulders > slave.hips) { - if (slave.boobs <= 2000*(slave.shoulders - slave.hips)) { - beauty -= (slave.shoulders - slave.hips)*(1 + (arcology.FSGenderFundamentalist/200)); + function calcGenitalsCost(slave) { + if (slave.vagina === 0) { + multiplier += 0.1; + } + if (slave.vagina > -1 && arcology.FSRestartSMR === 1) { + if (slave.dick > 0) { + if (slave.ovaries === 0 && slave.balls === 0) { + multiplier += 0.8; } } - } else if (arcology.FSGenderRadicalist === "unset") { - if (slave.shoulders > slave.hips) { - if (slave.boobs <= 2000*(slave.shoulders - slave.hips)) { - beauty -= slave.shoulders - slave.hips; + } else if (slave.vagina > -1) { + if (slave.dick > 0) { + if (V.ui !== "start" || V.PC.dick === 0 || V.PC.vagina === 0) { + multiplier += 0.2; + if (slave.ovaries > 0) { + if (slave.balls > 0) { + multiplier += 0.8; + } + } + } else { + multiplier += 0.1; + if (slave.ovaries > 0) { + if (slave.balls > 0) { + multiplier += 0.2; + } + } } } } }; - function calcVoiceBeauty(slave) { - if (canTalk(slave)) { - if (slave.accent >= 3) { - beauty -= 1; - } else if (slave.accent === 1) { - beauty += 1; + function calcDevotionTrustCost(slave) { + if (V.specialSlavesPriceOverride === 1) { + if (slave.devotion > 50) { + multiplier += slave.devotion/200; + } + if (slave.trust > 50) { + multiplier += slave.trust/200; } } else { - beauty -= 2; - } - }; - - function calcLimbsBeauty(slave) { - switch (slave.amp) { - case 1: - beauty -= 10; - break; - case -1: - case -2: - case -4: - beauty -= 2; - break; - } - }; - - function calcPubertyBeauty(slave) { - if (slave.pubertyXX === 1) { - beauty += 5; - } - if (slave.pubertyXY === 0 && slave.physicalAge > V.potencyAge && slave.balls > 0) { - beauty += 10; - if (arcology.FSGenderFundamentalist !== "unset") { - beauty += 5; + multiplier += slave.devotion/200; + if (slave.devotion < -20) { + if (slave.trust > 0) { + multiplier -= slave.trust/200; + } + } else { + if (slave.trust > 0) { + multiplier += slave.trust/200; + } } } }; - function calcFSMiscBeauty(slave) { - if (arcology.FSTransformationFetishist > 20) { - if (slave.lips > 70) { - if (slave.lipsImplant/slave.lips < 0.5) { - beauty -= ((slave.lips/10) + (arcology.FSTransformationFetishist/20)); - } - } - if (slave.hips === 3) { - beauty += 10; - } + function calcPreferencesCost(slave) { + if (slave.behavioralFlaw !== "none") { + multiplier -= 0.1; } - if ((arcology.FSGenderRadicalist > 20 && arcology.FSGenderRadicalistLawFuta !== 3) || arcology.FSSlimnessEnthusiast > 20) { - if (slave.hips < 0) { - beauty += Math.abs(slave.hips); - } + if (slave.behavioralQuirk !== "none") { + multiplier += 0.1; } - if (arcology.FSPhysicalIdealist !== "unset") { - if (slave.height > Height.mean(slave)) { - beauty += 10; - } + if (slave.sexualFlaw === "breeder" && arcology.FSRepopulationFocus !== "unset") { + multiplier += 0.3; + } else if (slave.sexualFlaw !== "none") { + multiplier -= 0.1; } - if (arcology.FSHedonisticDecadenceLaw2 === 1) { - if (slave.boobs >= 2000 && slave.butt >= 5 && slave.weight > 95) { - beauty += 5 + (arcology.FSHedonisticDecadence/20); /*10*/ - } else { - beauty -= 15 + (arcology.FSHedonisticDecadence/20); /*-20*/ + if (slave.sexualQuirk !== "none") { + multiplier += 0.1; + } + if (slave.fetishKnown === 1) { + if (slave.fetish === "mindbroken") { + multiplier -= 0.3; + } else if (slave.fetish !== "none") { + multiplier += slave.fetishStrength/1000; } + } else { + multiplier -= 0.1; } - if (arcology.FSChattelReligionistCreed === 1) { - if (V.nicaeaAssignment === slave.assignment) { - beauty += 2*V.nicaeaPower; + if (slave.attrKnown === 1) { + if (slave.energy > 95) { + multiplier += 0.2; } } }; - function calcPurityBeauty(slave) { - if (isPure(slave)) { - V.pure = V.pure++ || 1; - if (arcology.FSBodyPurist !== "unset") { - beauty += arcology.FSBodyPurist/5; + function calcPregCost(slave) { + if (slave.mpreg === 1) { + multiplier += 0.2; + } + if (arcology.FSRepopulationFocusSMR === 1) { + if (slave.preg < -1) { + multiplier -= 0.5; + } else if (slave.bellyPreg >= 300000) { + multiplier += 1; + } else if (slave.bellyPreg >= 120000) { + multiplier += 0.5; + } else if (slave.preg > 10) { + multiplier += 0.1; } - if (arcology.FSTransformationFetishist === "unset") { - beauty += 2; + } else if (arcology.FSRestartSMR === 1) { + if (slave.preg < -1) { + multiplier += 0.5; + } else if (slave.bellyPreg >= 300000) { + multiplier -= 2.5; + } else if (slave.bellyPreg >= 30000) { + multiplier -= 1.5; + } else if (slave.preg > 10) { + multiplier -= 1.0; + } + } else { + if (slave.preg < -1) { + multiplier -= 0.1; + } else if (V.activeSlave.bellyPreg >= 300000) { + multiplier -= 1.5; + } else if (V.activeSlave.bellyPreg >= 120000) { + multiplier -= 0.5; + } else if (slave.preg > 10) { + multiplier -= 0.1; } - } else if (arcology.FSTransformationFetishist !== "unset") { - beauty += arcology.FSTransformationFetishist/40; } }; - function calcPhysiqueBeauty(slave) { - let physiquePass = 0; + function calcPrestigeCost(slave) { + if (slave.prestige > 0) { + multiplier += 0.7*slave.prestige; + } + if (slave.pornPrestige === 3) { + multiplier += 1.5; + } else if (slave.pornPrestige === 2) { + multiplier += 0.7; + } else if (slave.pornPrestige === 1) { + multiplier += 0.2; + } + }; - if (slave.boobs < 500 && slave.butt < 3) { - if (slave.muscles <= 30 && arcology.FSPhysicalIdealist === "unset" && slave.weight <= 10 && arcology.FSHedonisticDecadence === "unset") { - physiquePass = 1; - } else if (arcology.FSPhysicalIdealist !== "unset") { /* no muscle malus for muscle loving societies */ - if (arcology.FSPhysicalIdealistStrongFat === 1 && slave.weight <= 30) { /* reduced weight malus for fat loving societies */ - physiquePass = 1; - } else if (slave.weight <= 10) { - physiquePass = 1; - } - } else if (arcology.FSHedonisticDecadence !== "unset" && slave.weight <= 30) { /* reduced weight malus for fat loving societies */ - if (arcology.FSHedonisticDecadenceStrongFat === 1) { /* no muscle malus for muscle loving societies */ - physiquePass = 1; - } else if (slave.muscles <= 30) { - physiquePass = 1; - } + function calcFSCost(slave) { + if (arcology.FSSupremacistLawME !== 0) { + if (slave.race !== arcology.FSSupremacistRace) { + multiplier -= 0.1; } } - if (physiquePass === 1) { - beauty += 40; - if (arcology.FSSlimnessEnthusiast > 20) { - beauty += arcology.FSSlimnessEnthusiast/20; - if (canTalk(slave) && slave.voice === 3) { - beauty += arcology.FSSlimnessEnthusiast/40; - } + if (arcology.FSSubjugationistLawME !== 0) { + if (slave.race === arcology.FSSubjugationistRace) { + multiplier -= 0.2; } - } else if (slave.butt > 4 && slave.boobs > 800) { - if (arcology.FSSlimnessEnthusiast === "unset") { - beauty += 1; + } + if (arcology.FSRepopulationFocusSMR !== 0) { + if (slave.preg > 0) { + multiplier += 0.1; } - if (arcology.FSAssetExpansionist > 20) { - beauty += arcology.FSAssetExpansionist/20; - if (canTalk(slave) && slave.voice === 3) { - beauty += arcology.FSAssetExpansionist/40; - } + } else if (arcology.FSRestartSMR !== 0) { + if (slave.dick > 0) { + multiplier -= 0.1; + } + if (slave.balls > 0) { + multiplier -= 0.2; + } + if (slave.vagina > 0) { + multiplier -= 0.1; + } + if (slave.ovaries > 0) { + multiplier -= 0.5; } } - }; - - function calcSlimBeauty(slave) { - if (slimPass(slave) === 1) { - beauty += 40 + (arcology.FSSlimnessEnthusiast/20); /*45*/ - } else { - beauty -= arcology.FSSlimnessEnthusiast/20; + if (arcology.FSGenderFundamentalistSMR !== 0) { + if (slave.dick > 0) { + multiplier -= 0.1; + } + if (slave.balls > 0) { + multiplier -= 0.1; + } + } else if (arcology.FSGenderRadicalist !== "unset") { + if (slave.dick > 0) { + multiplier += 0.1; + } + if (slave.balls > 0) { + multiplier -= 0.1; + } + } + if (arcology.FSHedonisticDecadenceSMR !== 0) { + if (slave.weight > 60 && slave.muscles < 5) { + multiplier += 0.1; + } + } + if (arcology.FSArabianRevivalist > 50) { + multiplier += 0.1; } }; - function calcGenderLawBeauty(slave) { - V.genderLawPass = 1; - - if (arcology.FSPhysicalIdealist === "unset" && arcology.FSHedonisticDecadenceStrongFat === 0 && slave.muscles > 30) { /*muscle check*/ - V.genderLawPass = 0; - } else if (arcology.FSHedonisticDecadence !== "unset" || arcology.FSPhysicalIdealistStrongFat === 1) { /*weight check*/ - if (slave.weight > 130 || slave.weight <= -30) { - V.genderLawPass = 0; + function calcAgeCost(slave) { + if (slave.physicalAge === V.minimumSlaveAge && slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset")) { + if (slave.birthWeek === 0) { + multiplier -= 0.4; + } else if (slave.birthWeek < 4) { + multiplier -= 0.1; } - } else if (Math.abs(slave.weight) > 30) { - V.genderLawPass = 0; - } else if (arcology.FSAssetExpansionist !== "unset") { - if (slave.boobs < 500 || slave.boobs > 1600 || slave.butt < 3 || slave.butt > 6) { - V.genderLawPass = 0; + } else if (slave.physicalAge === V.minimumSlaveAge) { + if (slave.birthWeek === 0) { + multiplier -= 0.2; + } else if (slave.birthWeek < 4) { + multiplier -= 0.05; + } + } else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset")) { + if (slave.birthWeek === 0) { + multiplier -= 0.2; + } else if (slave.birthWeek < 4) { + multiplier -= 0.05; } - } else if (slave.boobs < 500 || slave.boobs > 800 || slave.butt < 3 || slave.butt > 4) { - V.genderLawPass = 0; } - if (V.genderLawPass === 1) { - beauty += 60; - } else { - beauty -= 10; + }; + + function calcCareersCost() { + if (slave.career !== 0) { + if (slave.career === "a slave") { + multiplier += 0.1; + } else if (setup.bodyguardCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.wardenessCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.attendantCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.matronCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.schoolteacherCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.stewardessCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.milkmaidCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.farmerCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.madamCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.DJCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.HGCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.recruiterCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.entertainmentCareers.includes(slave.career)) { + multiplier += 0.05; + } else if (setup.whoreCareers.includes(slave.career)) { + multiplier += 0.05; + } else if (setup.gratefulCareers.includes(slave.career)) { + multiplier += 0.05; + } else if (setup.menialCareers.includes(slave.career)) { + multiplier += 0.05; + } else if (setup.servantCareers.includes(slave.career)) { + multiplier += 0.05; + } + } + if (V.week-slave.weekAcquired >= 20 && slave.entertainSkill >= 100) { + if (!setup.entertainmentCareers.includes(slave.career)) { + multiplier += 0.05; + } + } + if (slave.oralCount + slave.analCount + slave.vaginalCount + slave.mammaryCount + slave.penetrativeCount > 1000) { + if (!setup.whoreCareers.includes(slave.career)) { + multiplier += 0.05; + } + } + if (!setup.bodyguardCareers.includes(slave.career) && slave.skillBG >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.wardenessCareers.includes(slave.career) && slave.skillWA >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.attendantCareers.includes(slave.career) && slave.skillAT >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.matronCareers.includes(slave.career) && slave.skillMT >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.schoolteacherCareers.includes(slave.career) && slave.skillTE >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.stewardessCareers.includes(slave.career) && slave.skillST >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.milkmaidCareers.includes(slave.career) && slave.skillMM >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.farmerCareers.includes(slave.career) && slave.skillFA >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.madamCareers.includes(slave.career) && slave.skillMD >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.DJCareers.includes(slave.career) && slave.skillDJ >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.HGCareers.includes(slave.career) && slave.skillHG >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.recruiterCareers.includes(slave.career) && slave.skillRC >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.servantCareers.includes(slave.career) && slave.skillS >= V.masteredXP) { + multiplier += 0.05; + } + if (!setup.entertainmentCareers.includes(slave.career) && slave.skillE >= V.masteredXP) { + multiplier += 0.05; + } + if (!setup.whoreCareers.includes(slave.career) && slave.skillW >= V.masteredXP) { + multiplier += 0.05; } }; - function calcMultipliersBeauty(slave) { - calcBellyBeauty(slave); - if (arcology.FSGenderRadicalist !== "unset") { - if (slave.bellyPreg >= 500 && arcology.FSRepopulationFocus === "unset" && arcology.FSRestart === "unset") { - if (slave.mpreg === 1) { - beauty = 0.9*beauty; - } else { - beauty = 0.7*beauty; - } - } - } else if (arcology.FSGenderFundamentalist === "unset") { - if (slave.preg > 10 && arcology.FSRepopulationFocus === "unset" && arcology.FSRestart === "unset") { - beauty = 0.8*beauty; - } + function calcMiscCost(slave) { + let totalInt = Math.clamp(slave.intelligence + slave.intelligenceImplant,-130,130); /* make absolutely certain we do not use +-131 in the next line */ + multiplier += Math.floor((Math.asin(totalInt/131))*50)/50; + if (slave.pubertyXY === 0 && slave.physicalAge >= V.potencyAge && slave.genes === "XY" && arcology.FSGenderRadicalist === "unset") { + multiplier += 0.5; } - if (slave.breedingMark === 1) { - if (V.propOutcome === 1) { - beauty = 2*beauty; - } else { - beauty += 2; + if (slave.brand !== 0) { + if (V.rep > 10000) { + multiplier += 0.1; + } else if (V.rep < 5000) { + multiplier -= 0.1; } } - if (slave.fuckdoll === 0 && V.seeAge === 1) { - calcAgeBeauty(slave); + if (slave.amp === 1) { + multiplier -= 0.2; } - if (slave.prestige + slave.pornPrestige > 0) { - calcPrestigeBeauty(slave); + if (slave.eyes === -2) { + multiplier -= 0.2; } }; - function calcBellyBeauty(slave) { - if (slave.bellySag > 0) { - if (slave.belly < 100) { - if (arcology.FSRepopulationFocus === "unset") { - beauty -= 20; - } + function calcIndentureCost(slave) { + if (slave.indenture > -1) { + multiplier -= 0.1*slave.indentureRestrictions; + multiplier -= (260-slave.indenture)/260; + } else if (V.seeAge === 1) { + if (slave.actualAge >= (V.retirementAge-5) && V.PhysicalRetirementAgePolicy !== 1) { + multiplier *= (V.retirementAge-slave.actualAge)/5; } - } - if (slave.bellyImplant >= 1500) { - if (arcology.FSTransformationFetishist > 20) { - beauty += Math.min(Math.trunc(slave.bellyImplant/1000), 50); /*50*/ - } else if (arcology.FSRepopulationFocus > 60) { - if ((slave.ovaries === 0 && slave.mpreg === 0) || slave.preg < -1) { - beauty += 20; - } - } else { - if (slave.bellyImplant >= 750000) { /* multipliers */ - beauty = 0.2*beauty; - } else if (slave.bellyImplant >= 450000) { - beauty = 0.5*beauty; - } else if (slave.bellyImplant >= 300000) { - beauty = 0.7*beauty; - } else if (slave.bellyImplant >= 100000) { - beauty = 0.8*beauty; - } else if (slave.bellyImplant >= 50000) { - beauty = 0.85*beauty; - } else { - beauty = 0.9*beauty; - } + if (slave.physicalAge >= (V.retirementAge-5) && V.PhysicalRetirementAgePolicy === 1) { + multiplier *= (V.retirementAge-slave.actualAge)/5; } } }; - function calcAgeBeauty(slave) { - if (slave.physicalAge === V.minimumSlaveAge) { - beauty += 1; - if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset") && arcology.FSRestart === "unset") { - if (slave.birthWeek === 0) { - beauty += 1.6*beauty; - } else if (slave.birthWeek < 4) { - beauty += 0.2*beauty; - } - } else { - if (slave.birthWeek === 0) { - beauty += 0.8*beauty; - } else if (slave.birthWeek < 4) { - beauty += 0.1*beauty; - } - } - } else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset") && arcology.FSRestart === "unset") { - beauty += 1; - if (slave.birthWeek === 0) { - beauty += 0.8*beauty; - } else if (slave.birthWeek < 4) { - beauty += 0.1*beauty; - } + function calcCost(slave) { + cost *= multiplier*50; + cost = Number(cost) || 0; + if (cost < V.minimumSlaveCost) { + cost = V.minimumSlaveCost; + } else if (cost <= 100000) { + /* do nothing */ + } else if (cost <= 200000) { + cost -= (cost-100000)*0.1; + } else if (cost <= 300000) { + cost -= 10000 + ((cost-200000)*0.2); + } else if (cost <= 400000) { + cost -= 30000 + ((cost-300000)*0.3); + } else if (cost <= 500000) { + cost -= 60000 + ((cost-400000)*0.4); + } else { + cost -= 100000 + ((cost-500000)*0.5); } + if (cost < 1000) { + cost = 1000; + } + cost = 500*Math.trunc(cost/500); }; - function calcPrestigeBeauty(slave) { /* multipliers */ - if (slave.prestige >= 3) { - beauty += 2*beauty; - } else if (slave.prestige === 2) { - beauty += 0.5*beauty; - } else if (slave.prestige === 1) { - beauty += 0.25*beauty; + function calcStartingSlaveCost(slave) { + let startingSlaveMultiplier = 0; + + if (slave.devotion > 20) { + startingSlaveMultiplier += (0.000117*(slave.devotion-20)*(slave.devotion-20))+(0.003167*(slave.devotion-20)); } - if (slave.pornPrestige === 3) { - beauty += beauty; - } else if (slave.pornPrestige === 2) { - beauty += 0.5*beauty; - } else if (slave.pornPrestige === 1) { - beauty += 0.1*beauty; + if (slave.whoreSkill) { + startingSlaveMultiplier += 0.00001*slave.whoreSkill*slave.whoreSkill; + } + if (slave.entertainSkill) { + startingSlaveMultiplier += 0.00001*slave.entertainSkill*slave.entertainSkill; + } + if (slave.vaginalSkill) { + startingSlaveMultiplier += 0.00001*slave.vaginalSkill*slave.vaginalSkill; + } + if (slave.analSkill) { + startingSlaveMultiplier += 0.00001*slave.analSkill*slave.analSkill; + } + if (slave.oralSkill) { + startingSlaveMultiplier += 0.00001*slave.oralSkill*slave.oralSkill; + } + if (slave.combatSkill) { + startingSlaveMultiplier += 0.1; + } + if (slave.prestige) { + startingSlaveMultiplier += slave.prestige; + } + if (startingSlaveMultiplier) { + if (slave.actualAge > 25) { + startingSlaveMultiplier -= startingSlaveMultiplier*(slave.actualAge-25)*0.05; + } + } + startingSlaveMultiplier = Math.clamp(startingSlaveMultiplier, 0, 10); + cost += cost*startingSlaveMultiplier; + cost = 500*Math.trunc(cost/500); + if (V.PC.career === "slaver") { + cost = cost/2; } }; - return Beauty; + return slaveCost; })(); + +window.startingSlaveCost = function startingSlaveCost(slave) { + return slaveCost(slave, true); +}; diff --git a/src/js/fresult.tw b/src/js/fresult.tw deleted file mode 100644 index bcb29ff23f0c8c506bc79f99369fdf79f38db719..0000000000000000000000000000000000000000 --- a/src/js/fresult.tw +++ /dev/null @@ -1,284 +0,0 @@ -:: FResult [script] - -// this is a port of the FResult widget -// it has been broken up into several functions, because it grew too long -// it has been wrapped in a closure so as not to pollute the global namespace -// and so that nested functions are only evaluated once - -window.FResult = (function() { - "use strict"; - // we can't initialise our global variables on load, because SugarCube.State isn't initialised - // instead, declare them and initialise on run time - let V, result, incest_bonus; - function FResult(slave) { - V = State.variables; - incest_bonus = V.arcologies[0].FSEgyptianRevivalist > 20 || V.arcologies[0].FSEgyptianRevivalistIncestPolicy === 1; - - calcUseWeights(slave); - if (!slave.fuckdoll) - calcNotFuckdoll(slave); - else - result += slave.fuckdoll/10; - - result += Math.max(0, slave.aphrodisiacs) * 2; - - if (slave.inflationType === "aphrodisiac") - result += slave.inflation*4; - - if (slave.lactation > 0) - result += 1; - - if (slave.nipples === "fuckable") - calcFuckableTits(slave); - - if (V.seeAge === 1) - calcAge(slave); - if (slave.fetish === "mindbroken") - result = Math.trunc(result*0.4); - else - result = Math.trunc(result*0.7); - - if (slave.pregWeek < 0) - result -= Math.trunc(result*slave.pregWeek/10); // reduced the most just after birth - - calcAmputation(slave); - - if (V.arcologies[0].FSHedonisticDecadence > 20) - calcHedonismWeight(slave); - if (result < 2) { - if (supremeRaceP(slave) && V.arcologies[0].FSSupremacist > 20) - result = 0; - else - result = 2; - } - return result; - } - - function calcUseWeights(slave) { - result = (3 - slave.anus)+(slave.muscles/30); - if (slave.muscles < -95) - result -= 5; - else if (slave.muscles < -30) - result -= 2; - - const uses = V.oralUseWeight + V.vaginalUseWeight + V.analUseWeight; - if (uses <= 0) return; - - result += (6+slave.tonguePiercing) * (V.oralUseWeight/uses) * (slave.oralSkill/30); - if (slave.sexualFlaw === "cum addict") - result += (V.oralUseWeight/uses) * (slave.oralSkill/30); - if (canDoVaginal(slave)) { - result += 6 * (V.vaginalUseWeight/uses) * (slave.vaginalSkill/30); - result += (3 - slave.vagina); - result += slave.vaginaLube; - } - if (canDoAnal(slave)) { - result += 6 * (V.analUseWeight/uses) * (slave.analSkill/30); - if (slave.sexualFlaw === "anal addict") - result += (V.analUseWeight/uses) * (slave.analSkill/30); - if (slave.inflationType === "aphrodisiac") - result += (V.analUseWeight/uses) * (slave.inflation * 3); - } - } - - function calcFuckableTits(slave) { - result += 2; - if (slave.fetish === "boobs") - result += Math.trunc(slave.fetishStrength/20); - } - - function calcWorksWithRelatives(slave) { - V.slaves.forEach(islave => { - if (isParentP(slave, islave) && sameAssignmentP(slave, islave)) { - result += 1; - if (incest_bonus) result += 1; - } - if (areSisters(slave, islave) > 0 && sameAssignmentP(slave, islave)) { - result += 1; - if (incest_bonus) result += 1; - } - }); - } - - function calcWorksWithRelativesVanilla(slave) { - const fre = getSlave(slave.relationTarget) - if (fre !== undefined && sameAssignmentP(slave, fre)) { - result += 2; - if (incest_bonus) result += 2; - } - } - - function calcWorksWithRelationship(slave) { - const fre = V.slaves.findIndex(s => { - return haveRelationshipP(slave, s) && sameAssignmentP(slave, s); - }); - if (fre !== -1) result += 1; - } - - function calcWorksWithRival(slave) { - const en = getSlave(slave.rivalryTarget); - if (en !== undefined && sameAssignmentP(slave, en)) result -= 1; - } - - function calcHInjectionsDiet(slave) { - if (slave.drugs === "male hormone injections" || slave.drugs === "female hormone injections") - result -= 10; - if (slave.diet === "XXY") - result += 2; - else if (slave.diet === "XY" || slave.diet === "XX") - result += 1; - else if (slave.diet === "cum production") - result += 1; - else if (slave.diet === "fertility") - result += 1; - } - function calcPreg(slave) { - if (V.arcologies[0].FSRepopulationFocus > 20) { - if (slave.preg > 10) result += 2; - else result -= 2; - } else if (V.arcologies[0].FSRestart > 20) { - if (slave.bellyPreg >= 500 && slave.breedingMark === 1 && V.propOutcome === 1) - result += 1; - else if (slave.preg > 10) - result -= 10; - else - result += 0; - } - } - - function calcRace(slave) { - if (V.arcologies[0].FSSupremacist !== "unset" && supremeRaceP(slave)) - result -= (V.arcologies[0].FSSupremacist/5) + (V.arcologies[0].FSSupremacistLawME*10); - if (V.arcologies[0].FSSubjugationist !== "unset" && inferiorRaceP(slave)) - result += (V.arcologies[0].FSSubjugationist/10) + (V.arcologies[0].FSSubjugationistLawME); - } - - function calcSexAttributes(slave) { - if (slave.clitPiercing > 2) result += 1; - if (slave.fetishKnown === 1 && slave.fetishStrength > 60 && slave.fetish != "none") - result += slave.fetishStrength/5; - - if (slave.attrKnown === 1) { - result += Math.trunc(slave.attrXX/20); - result += Math.trunc(slave.attrXY/20); - if (slave.energy > 95) result += 3; - else if (slave.energy > 80) result += 2; - else if (slave.energy > 60) result += 1; - else if (slave.energy <= 20) result -= 2; - else if (slave.energy <= 40) result -= 1; - } - if (slave.sexualFlaw !== "none") result -= 2; - if (slave.sexualQuirk !== "none") result += 2; - if (slave.behavioralFlaw !== "none") result -= 2; - if (slave.behavioralQuirk !== "none") result += 2; - } - - function calcCareer(slave) { - if (setup.whoreCareers.includes(slave.career)) - result += 1; - else if (slave.oralCount + slave.analCount + slave.vaginalCount + slave.mammaryCount + slave.penetrativeCount > 1000) - result += 1; - } - - function calcSight(slave) { - if (!canSee(slave)) result -= 3; - else if (slave.eyes <= -1) { - if (slave.eyewear !== "corrective glasses" && slave.eyewear !== "corrective contacts") - result -= 1; - } else if (slave.eyewear === "blurring glasses") - result -= 1; - else if (slave.eyewear === "blurring contacts") - result -= 1; - } - - function calcHearing(slave) { - if (!canHear(slave)) result -= 2; - else if (slave.hears <= -1) { - if (slave.earwear !== "hearing aids") - result -= 1; - } else if (slave.earwear === "muffling ear plugs") - result -= 1; - } - - function calcEgyptianBonus(slave) { - if (V.racialVarieties === undefined) V.racialVarieties = []; - if (!V.racialVarieties.includes(slave.race)) - V.racialVarieties.push(slave.race); - } - - function calcYouthBonus(slave) { - if (slave.visualAge < 30) { - if (slave.actualAge > 30) - result += 5; // experienced for her apparent age - if (slave.physicalAge > 30) - result -= slave.physicalAge/2; // too old :( - } - } - - function calcMatureBonus(slave) { - if (slave.visualAge >= 30 && slave.actualAge >= 30 && slave.physicalAge < slave.visualAge) - result += Math.min((slave.physicalAge - slave.visualAge) * 2, 20); // looks and acts mature, but has a body that just won't quit - } - - function calcNotFuckdoll(slave) { - if (V.familyTesting === 1 && totalRelatives(slave) > 0) - calcWorksWithRelatives(slave); - else if(!V.familyTesting && slave.relation !==0) - calcWorksWithRelativesVanilla(slave); - if (slave.relationship > 0) calcWorksWithRelationship(slave); - if (slave.rivalry !== 0) calcWorksWithRival(slave); - calcHInjectionsDiet(slave); - calcPreg(slave); - calcRace(slave); - calcSexAttributes(slave); - calcCareer(slave); - calcSight(slave); - calcHearing(slave); - if (V.arcologies[0].FSEgyptianRevivalist !== "unset") - calcEgyptianBonus(slave); - if (V.arcologies[0].FSYouthPreferentialist !== "unset") - calcYouthBonus(slave); - else if (V.arcologies[0].FSMaturityPreferentialist !== "unset") - calcMatureBonus(slave); - } - - function calcAge(slave) { - if ((V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset") && slave.physicalAge === V.minimumSlaveAge && slave.physicalAge === V.fertilityAge && canGetPregnant(slave)) { - result += 1; - if (slave.birthWeek === 0) result += result; - else if (slave.birthWeek < 4) result += 0.2*result; - } else if (slave.physicalAge === V.minimumSlaveAge) { - result += 1; - if (slave.birthWeek === 0 ) result += 0.5*result; - else if (slave.birthWeek < 4) result += 0.1*result; - } else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset")) { - result += 1; - if (slave.birthWeek === 0) - result += 0.5*result; - else if (slave.birthWeek < 4) - result += 0.1*result; - } - } - - function calcAmputation(slave) { - switch(slave.amp) { - case 0: - case -2: - case -5: - break; - case 1: - result -= 2; - break; - default: - result -= 1; - } - } - - function calcHedonismWeight(slave) { - if (slave.weight < 10) - result -= 2; - else if (slave.weight > 190) - result -= 5; // too fat - } - return FResult; -})(); diff --git a/src/js/beautyJS.tw b/src/js/slaveCostJS.tw similarity index 62% rename from src/js/beautyJS.tw rename to src/js/slaveCostJS.tw index a08e7e1515e74d2839f612060aea1666f4c158a1..bd9b50f90b9ce50d4224d4cff6a6ed08524fbba8 100644 --- a/src/js/beautyJS.tw +++ b/src/js/slaveCostJS.tw @@ -1,4 +1,4 @@ -:: Beauty [script] +:: Slave Cost JS [script] window.Beauty = (function() { "use strict"; @@ -1219,3 +1219,731 @@ window.Beauty = (function() { return Beauty; })(); + +// this is a port of the FResult widget +// it has been broken up into several functions, because it grew too long +// it has been wrapped in a closure so as not to pollute the global namespace +// and so that nested functions are only evaluated once + +window.FResult = (function() { + "use strict"; + // we can't initialise our global variables on load, because SugarCube.State isn't initialised + // instead, declare them and initialise on run time + let V, result, incest_bonus; + function FResult(slave) { + V = State.variables; + incest_bonus = V.arcologies[0].FSEgyptianRevivalist > 20 || V.arcologies[0].FSEgyptianRevivalistIncestPolicy === 1; + + calcUseWeights(slave); + if (!slave.fuckdoll) + calcNotFuckdoll(slave); + else + result += slave.fuckdoll/10; + + result += Math.max(0, slave.aphrodisiacs) * 2; + + if (slave.inflationType === "aphrodisiac") + result += slave.inflation*4; + + if (slave.lactation > 0) + result += 1; + + if (slave.nipples === "fuckable") + calcFuckableTits(slave); + + if (V.seeAge === 1) + calcAge(slave); + if (slave.fetish === "mindbroken") + result = Math.trunc(result*0.4); + else + result = Math.trunc(result*0.7); + + if (slave.pregWeek < 0) + result -= Math.trunc(result*slave.pregWeek/10); // reduced the most just after birth + + calcAmputation(slave); + + if (V.arcologies[0].FSHedonisticDecadence > 20) + calcHedonismWeight(slave); + if (result < 2) { + if (supremeRaceP(slave) && V.arcologies[0].FSSupremacist > 20) + result = 0; + else + result = 2; + } + return result; + } + + function calcUseWeights(slave) { + result = (3 - slave.anus)+(slave.muscles/30); + if (slave.muscles < -95) + result -= 5; + else if (slave.muscles < -30) + result -= 2; + + const uses = V.oralUseWeight + V.vaginalUseWeight + V.analUseWeight; + if (uses <= 0) return; + + result += (6+slave.tonguePiercing) * (V.oralUseWeight/uses) * (slave.oralSkill/30); + if (slave.sexualFlaw === "cum addict") + result += (V.oralUseWeight/uses) * (slave.oralSkill/30); + if (canDoVaginal(slave)) { + result += 6 * (V.vaginalUseWeight/uses) * (slave.vaginalSkill/30); + result += (3 - slave.vagina); + result += slave.vaginaLube; + } + if (canDoAnal(slave)) { + result += 6 * (V.analUseWeight/uses) * (slave.analSkill/30); + if (slave.sexualFlaw === "anal addict") + result += (V.analUseWeight/uses) * (slave.analSkill/30); + if (slave.inflationType === "aphrodisiac") + result += (V.analUseWeight/uses) * (slave.inflation * 3); + } + } + + function calcFuckableTits(slave) { + result += 2; + if (slave.fetish === "boobs") + result += Math.trunc(slave.fetishStrength/20); + } + + function calcWorksWithRelatives(slave) { + V.slaves.forEach(islave => { + if (isParentP(slave, islave) && sameAssignmentP(slave, islave)) { + result += 1; + if (incest_bonus) result += 1; + } + if (areSisters(slave, islave) > 0 && sameAssignmentP(slave, islave)) { + result += 1; + if (incest_bonus) result += 1; + } + }); + } + + function calcWorksWithRelativesVanilla(slave) { + const fre = getSlave(slave.relationTarget); + if (fre !== undefined && sameAssignmentP(slave, fre)) { + result += 2; + if (incest_bonus) result += 2; + } + } + + function calcWorksWithRelationship(slave) { + const fre = V.slaves.findIndex(s => { + return haveRelationshipP(slave, s) && sameAssignmentP(slave, s); + }); + if (fre !== -1) result += 1; + } + + function calcWorksWithRival(slave) { + const en = getSlave(slave.rivalryTarget); + if (en !== undefined && sameAssignmentP(slave, en)) result -= 1; + } + + function calcHInjectionsDiet(slave) { + if (slave.drugs === "male hormone injections" || slave.drugs === "female hormone injections") + result -= 10; + if (slave.diet === "XXY") + result += 2; + else if (slave.diet === "XY" || slave.diet === "XX") + result += 1; + else if (slave.diet === "cum production") + result += 1; + else if (slave.diet === "fertility") + result += 1; + } + function calcPreg(slave) { + if (V.arcologies[0].FSRepopulationFocus > 20) { + if (slave.preg > 10) result += 2; + else result -= 2; + } else if (V.arcologies[0].FSRestart > 20) { + if (slave.bellyPreg >= 500 && slave.breedingMark === 1 && V.propOutcome === 1) + result += 1; + else if (slave.preg > 10) + result -= 10; + else + result += 0; + } + } + + function calcRace(slave) { + if (V.arcologies[0].FSSupremacist !== "unset" && supremeRaceP(slave)) + result -= (V.arcologies[0].FSSupremacist/5) + (V.arcologies[0].FSSupremacistLawME*10); + if (V.arcologies[0].FSSubjugationist !== "unset" && inferiorRaceP(slave)) + result += (V.arcologies[0].FSSubjugationist/10) + (V.arcologies[0].FSSubjugationistLawME); + } + + function calcSexAttributes(slave) { + if (slave.clitPiercing > 2) result += 1; + if (slave.fetishKnown === 1 && slave.fetishStrength > 60 && slave.fetish != "none") + result += slave.fetishStrength/5; + + if (slave.attrKnown === 1) { + result += Math.trunc(slave.attrXX/20); + result += Math.trunc(slave.attrXY/20); + if (slave.energy > 95) result += 3; + else if (slave.energy > 80) result += 2; + else if (slave.energy > 60) result += 1; + else if (slave.energy <= 20) result -= 2; + else if (slave.energy <= 40) result -= 1; + } + if (slave.sexualFlaw !== "none") result -= 2; + if (slave.sexualQuirk !== "none") result += 2; + if (slave.behavioralFlaw !== "none") result -= 2; + if (slave.behavioralQuirk !== "none") result += 2; + } + + function calcCareer(slave) { + if (setup.whoreCareers.includes(slave.career)) + result += 1; + else if (slave.oralCount + slave.analCount + slave.vaginalCount + slave.mammaryCount + slave.penetrativeCount > 1000) + result += 1; + } + + function calcSight(slave) { + if (!canSee(slave)) result -= 3; + else if (slave.eyes <= -1) { + if (slave.eyewear !== "corrective glasses" && slave.eyewear !== "corrective contacts") + result -= 1; + } else if (slave.eyewear === "blurring glasses") + result -= 1; + else if (slave.eyewear === "blurring contacts") + result -= 1; + } + + function calcHearing(slave) { + if (!canHear(slave)) result -= 2; + else if (slave.hears <= -1) { + if (slave.earwear !== "hearing aids") + result -= 1; + } else if (slave.earwear === "muffling ear plugs") + result -= 1; + } + + function calcEgyptianBonus(slave) { + if (V.racialVarieties === undefined) V.racialVarieties = []; + if (!V.racialVarieties.includes(slave.race)) + V.racialVarieties.push(slave.race); + } + + function calcYouthBonus(slave) { + if (slave.visualAge < 30) { + if (slave.actualAge > 30) + result += 5; // experienced for her apparent age + if (slave.physicalAge > 30) + result -= slave.physicalAge/2; // too old :( + } + } + + function calcMatureBonus(slave) { + if (slave.visualAge >= 30 && slave.actualAge >= 30 && slave.physicalAge < slave.visualAge) + result += Math.min((slave.physicalAge - slave.visualAge) * 2, 20); // looks and acts mature, but has a body that just won't quit + } + + function calcNotFuckdoll(slave) { + if (V.familyTesting === 1 && totalRelatives(slave) > 0) + calcWorksWithRelatives(slave); + else if(!V.familyTesting && slave.relation !==0) + calcWorksWithRelativesVanilla(slave); + if (slave.relationship > 0) calcWorksWithRelationship(slave); + if (slave.rivalry !== 0) calcWorksWithRival(slave); + calcHInjectionsDiet(slave); + calcPreg(slave); + calcRace(slave); + calcSexAttributes(slave); + calcCareer(slave); + calcSight(slave); + calcHearing(slave); + if (V.arcologies[0].FSEgyptianRevivalist !== "unset") + calcEgyptianBonus(slave); + if (V.arcologies[0].FSYouthPreferentialist !== "unset") + calcYouthBonus(slave); + else if (V.arcologies[0].FSMaturityPreferentialist !== "unset") + calcMatureBonus(slave); + } + + function calcAge(slave) { + if ((V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset") && slave.physicalAge === V.minimumSlaveAge && slave.physicalAge === V.fertilityAge && canGetPregnant(slave)) { + result += 1; + if (slave.birthWeek === 0) result += result; + else if (slave.birthWeek < 4) result += 0.2*result; + } else if (slave.physicalAge === V.minimumSlaveAge) { + result += 1; + if (slave.birthWeek === 0 ) result += 0.5*result; + else if (slave.birthWeek < 4) result += 0.1*result; + } else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset")) { + result += 1; + if (slave.birthWeek === 0) + result += 0.5*result; + else if (slave.birthWeek < 4) + result += 0.1*result; + } + } + + function calcAmputation(slave) { + switch(slave.amp) { + case 0: + case -2: + case -5: + break; + case 1: + result -= 2; + break; + default: + result -= 1; + } + } + + function calcHedonismWeight(slave) { + if (slave.weight < 10) + result -= 2; + else if (slave.weight > 190) + result -= 5; // too fat + } + return FResult; +})(); + +window.slaveCost = (function() { + "use strict"; + let V, arcology, multiplier, cost; + + function slaveCost(slave, isStartingSlave) { + V = State.variables; + arcology = V.arcologies[0]; + multiplier = V.slaveCostFactor; + cost = Beauty(slave)*FResult(slave); + + calcGenitalsCost(slave); + calcDevotionTrustCost(slave); + calcPreferencesCost(slave); + calcPregCost(slave); + if (slave.prestige + slave.pornPrestige > 0) { + calcPrestigeCost(slave); + } + calcFSCost(slave); + if (V.seeAge === 1) { + calcAgeCost(slave); + } + calcCareersCost(slave); + calcMiscCost(slave); + calcIndentureCost(slave); /* multipliers */ + + calcCost(slave); + if (isStartingSlave) { + calcStartingSlaveCost(slave); + } + return cost; + }; + + function calcGenitalsCost(slave) { + if (slave.vagina === 0) { + multiplier += 0.1; + } + if (slave.vagina > -1 && arcology.FSRestartSMR === 1) { + if (slave.dick > 0) { + if (slave.ovaries === 0 && slave.balls === 0) { + multiplier += 0.8; + } + } + } else if (slave.vagina > -1) { + if (slave.dick > 0) { + if (V.ui !== "start" || V.PC.dick === 0 || V.PC.vagina === 0) { + multiplier += 0.2; + if (slave.ovaries > 0) { + if (slave.balls > 0) { + multiplier += 0.8; + } + } + } else { + multiplier += 0.1; + if (slave.ovaries > 0) { + if (slave.balls > 0) { + multiplier += 0.2; + } + } + } + } + } + }; + + function calcDevotionTrustCost(slave) { + if (V.specialSlavesPriceOverride === 1) { + if (slave.devotion > 50) { + multiplier += slave.devotion/200; + } + if (slave.trust > 50) { + multiplier += slave.trust/200; + } + } else { + multiplier += slave.devotion/200; + if (slave.devotion < -20) { + if (slave.trust > 0) { + multiplier -= slave.trust/200; + } + } else { + if (slave.trust > 0) { + multiplier += slave.trust/200; + } + } + } + }; + + function calcPreferencesCost(slave) { + if (slave.behavioralFlaw !== "none") { + multiplier -= 0.1; + } + if (slave.behavioralQuirk !== "none") { + multiplier += 0.1; + } + if (slave.sexualFlaw === "breeder" && arcology.FSRepopulationFocus !== "unset") { + multiplier += 0.3; + } else if (slave.sexualFlaw !== "none") { + multiplier -= 0.1; + } + if (slave.sexualQuirk !== "none") { + multiplier += 0.1; + } + if (slave.fetishKnown === 1) { + if (slave.fetish === "mindbroken") { + multiplier -= 0.3; + } else if (slave.fetish !== "none") { + multiplier += slave.fetishStrength/1000; + } + } else { + multiplier -= 0.1; + } + if (slave.attrKnown === 1) { + if (slave.energy > 95) { + multiplier += 0.2; + } + } + }; + + function calcPregCost(slave) { + if (slave.mpreg === 1) { + multiplier += 0.2; + } + if (arcology.FSRepopulationFocusSMR === 1) { + if (slave.preg < -1) { + multiplier -= 0.5; + } else if (slave.bellyPreg >= 300000) { + multiplier += 1; + } else if (slave.bellyPreg >= 120000) { + multiplier += 0.5; + } else if (slave.preg > 10) { + multiplier += 0.1; + } + } else if (arcology.FSRestartSMR === 1) { + if (slave.preg < -1) { + multiplier += 0.5; + } else if (slave.bellyPreg >= 300000) { + multiplier -= 2.5; + } else if (slave.bellyPreg >= 30000) { + multiplier -= 1.5; + } else if (slave.preg > 10) { + multiplier -= 1.0; + } + } else { + if (slave.preg < -1) { + multiplier -= 0.1; + } else if (V.activeSlave.bellyPreg >= 300000) { + multiplier -= 1.5; + } else if (V.activeSlave.bellyPreg >= 120000) { + multiplier -= 0.5; + } else if (slave.preg > 10) { + multiplier -= 0.1; + } + } + }; + + function calcPrestigeCost(slave) { + if (slave.prestige > 0) { + multiplier += 0.7*slave.prestige; + } + if (slave.pornPrestige === 3) { + multiplier += 1.5; + } else if (slave.pornPrestige === 2) { + multiplier += 0.7; + } else if (slave.pornPrestige === 1) { + multiplier += 0.2; + } + }; + + function calcFSCost(slave) { + if (arcology.FSSupremacistLawME !== 0) { + if (slave.race !== arcology.FSSupremacistRace) { + multiplier -= 0.1; + } + } + if (arcology.FSSubjugationistLawME !== 0) { + if (slave.race === arcology.FSSubjugationistRace) { + multiplier -= 0.2; + } + } + if (arcology.FSRepopulationFocusSMR !== 0) { + if (slave.preg > 0) { + multiplier += 0.1; + } + } else if (arcology.FSRestartSMR !== 0) { + if (slave.dick > 0) { + multiplier -= 0.1; + } + if (slave.balls > 0) { + multiplier -= 0.2; + } + if (slave.vagina > 0) { + multiplier -= 0.1; + } + if (slave.ovaries > 0) { + multiplier -= 0.5; + } + } + if (arcology.FSGenderFundamentalistSMR !== 0) { + if (slave.dick > 0) { + multiplier -= 0.1; + } + if (slave.balls > 0) { + multiplier -= 0.1; + } + } else if (arcology.FSGenderRadicalist !== "unset") { + if (slave.dick > 0) { + multiplier += 0.1; + } + if (slave.balls > 0) { + multiplier -= 0.1; + } + } + if (arcology.FSHedonisticDecadenceSMR !== 0) { + if (slave.weight > 60 && slave.muscles < 5) { + multiplier += 0.1; + } + } + if (arcology.FSArabianRevivalist > 50) { + multiplier += 0.1; + } + }; + + function calcAgeCost(slave) { + if (slave.physicalAge === V.minimumSlaveAge && slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset")) { + if (slave.birthWeek === 0) { + multiplier -= 0.4; + } else if (slave.birthWeek < 4) { + multiplier -= 0.1; + } + } else if (slave.physicalAge === V.minimumSlaveAge) { + if (slave.birthWeek === 0) { + multiplier -= 0.2; + } else if (slave.birthWeek < 4) { + multiplier -= 0.05; + } + } else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset")) { + if (slave.birthWeek === 0) { + multiplier -= 0.2; + } else if (slave.birthWeek < 4) { + multiplier -= 0.05; + } + } + }; + + function calcCareersCost() { + if (slave.career !== 0) { + if (slave.career === "a slave") { + multiplier += 0.1; + } else if (setup.bodyguardCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.wardenessCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.attendantCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.matronCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.schoolteacherCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.stewardessCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.milkmaidCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.farmerCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.madamCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.DJCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.HGCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.recruiterCareers.includes(slave.career)) { + multiplier += 0.1; + } else if (setup.entertainmentCareers.includes(slave.career)) { + multiplier += 0.05; + } else if (setup.whoreCareers.includes(slave.career)) { + multiplier += 0.05; + } else if (setup.gratefulCareers.includes(slave.career)) { + multiplier += 0.05; + } else if (setup.menialCareers.includes(slave.career)) { + multiplier += 0.05; + } else if (setup.servantCareers.includes(slave.career)) { + multiplier += 0.05; + } + } + if (V.week-slave.weekAcquired >= 20 && slave.entertainSkill >= 100) { + if (!setup.entertainmentCareers.includes(slave.career)) { + multiplier += 0.05; + } + } + if (slave.oralCount + slave.analCount + slave.vaginalCount + slave.mammaryCount + slave.penetrativeCount > 1000) { + if (!setup.whoreCareers.includes(slave.career)) { + multiplier += 0.05; + } + } + if (!setup.bodyguardCareers.includes(slave.career) && slave.skillBG >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.wardenessCareers.includes(slave.career) && slave.skillWA >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.attendantCareers.includes(slave.career) && slave.skillAT >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.matronCareers.includes(slave.career) && slave.skillMT >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.schoolteacherCareers.includes(slave.career) && slave.skillTE >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.stewardessCareers.includes(slave.career) && slave.skillST >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.milkmaidCareers.includes(slave.career) && slave.skillMM >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.farmerCareers.includes(slave.career) && slave.skillFA >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.madamCareers.includes(slave.career) && slave.skillMD >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.DJCareers.includes(slave.career) && slave.skillDJ >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.HGCareers.includes(slave.career) && slave.skillHG >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.recruiterCareers.includes(slave.career) && slave.skillRC >= V.masteredXP) { + multiplier += 0.1; + } + if (!setup.servantCareers.includes(slave.career) && slave.skillS >= V.masteredXP) { + multiplier += 0.05; + } + if (!setup.entertainmentCareers.includes(slave.career) && slave.skillE >= V.masteredXP) { + multiplier += 0.05; + } + if (!setup.whoreCareers.includes(slave.career) && slave.skillW >= V.masteredXP) { + multiplier += 0.05; + } + }; + + function calcMiscCost(slave) { + let totalInt = Math.clamp(slave.intelligence + slave.intelligenceImplant,-130,130); /* make absolutely certain we do not use +-131 in the next line */ + multiplier += Math.floor((Math.asin(totalInt/131))*50)/50; + if (slave.pubertyXY === 0 && slave.physicalAge >= V.potencyAge && slave.genes === "XY" && arcology.FSGenderRadicalist === "unset") { + multiplier += 0.5; + } + if (slave.brand !== 0) { + if (V.rep > 10000) { + multiplier += 0.1; + } else if (V.rep < 5000) { + multiplier -= 0.1; + } + } + if (slave.amp === 1) { + multiplier -= 0.2; + } + if (slave.eyes === -2) { + multiplier -= 0.2; + } + }; + + function calcIndentureCost(slave) { + if (slave.indenture > -1) { + multiplier -= 0.1*slave.indentureRestrictions; + multiplier -= (260-slave.indenture)/260; + } else if (V.seeAge === 1) { + if (slave.actualAge >= (V.retirementAge-5) && V.PhysicalRetirementAgePolicy !== 1) { + multiplier *= (V.retirementAge-slave.actualAge)/5; + } + if (slave.physicalAge >= (V.retirementAge-5) && V.PhysicalRetirementAgePolicy === 1) { + multiplier *= (V.retirementAge-slave.actualAge)/5; + } + } + }; + + function calcCost(slave) { + cost *= multiplier*50; + cost = Number(cost) || 0; + if (cost < V.minimumSlaveCost) { + cost = V.minimumSlaveCost; + } else if (cost <= 100000) { + /* do nothing */ + } else if (cost <= 200000) { + cost -= (cost-100000)*0.1; + } else if (cost <= 300000) { + cost -= 10000 + ((cost-200000)*0.2); + } else if (cost <= 400000) { + cost -= 30000 + ((cost-300000)*0.3); + } else if (cost <= 500000) { + cost -= 60000 + ((cost-400000)*0.4); + } else { + cost -= 100000 + ((cost-500000)*0.5); + } + if (cost < 1000) { + cost = 1000; + } + cost = 500*Math.trunc(cost/500); + }; + + function calcStartingSlaveCost(slave) { + let startingSlaveMultiplier = 0; + + if (slave.devotion > 20) { + startingSlaveMultiplier += (0.000117*(slave.devotion-20)*(slave.devotion-20))+(0.003167*(slave.devotion-20)); + } + if (slave.whoreSkill) { + startingSlaveMultiplier += 0.00001*slave.whoreSkill*slave.whoreSkill; + } + if (slave.entertainSkill) { + startingSlaveMultiplier += 0.00001*slave.entertainSkill*slave.entertainSkill; + } + if (slave.vaginalSkill) { + startingSlaveMultiplier += 0.00001*slave.vaginalSkill*slave.vaginalSkill; + } + if (slave.analSkill) { + startingSlaveMultiplier += 0.00001*slave.analSkill*slave.analSkill; + } + if (slave.oralSkill) { + startingSlaveMultiplier += 0.00001*slave.oralSkill*slave.oralSkill; + } + if (slave.combatSkill) { + startingSlaveMultiplier += 0.1; + } + if (slave.prestige) { + startingSlaveMultiplier += slave.prestige; + } + if (startingSlaveMultiplier) { + if (slave.actualAge > 25) { + startingSlaveMultiplier -= startingSlaveMultiplier*(slave.actualAge-25)*0.05; + } + } + startingSlaveMultiplier = Math.clamp(startingSlaveMultiplier, 0, 10); + cost += cost*startingSlaveMultiplier; + cost = 500*Math.trunc(cost/500); + if (V.PC.career === "slaver") { + cost = cost/2; + } + }; + + return slaveCost; +})(); + +window.startingSlaveCost = function startingSlaveCost(slave) { + return slaveCost(slave, true); +}; diff --git a/src/utility/assayWidgets.tw b/src/utility/assayWidgets.tw index 39052a47692e4708d8d2b335022e934a1d45d744..05944e0a2ad9f6d5955b639ad28e3e0db894a5e7 100644 --- a/src/utility/assayWidgets.tw +++ b/src/utility/assayWidgets.tw @@ -1,374 +1,7 @@ :: assay widgets [widget nobr] <<widget "slaveCost">> - -<<set $beauty = Beauty($args[0])>> -<<set $FResult = FResult($args[0])>> - -<<set $slaveCost = ($beauty*$FResult)>> - -<<set _slaveMultiplier = $slaveCostFactor>> - -<<if $args[0].behavioralFlaw != "none">> - <<set _slaveMultiplier -= 0.1>> -<</if>> -<<if $args[0].behavioralQuirk != "none">> - <<set _slaveMultiplier += 0.1>> -<</if>> -<<if $args[0].sexualFlaw == "breeder" && $arcologies[0].FSRepopulationFocus != "unset">> - <<set _slaveMultiplier += 0.3>> -<<elseif $args[0].sexualFlaw != "none">> - <<set _slaveMultiplier -= 0.1>> -<</if>> -<<if $args[0].sexualQuirk != "none">> - <<set _slaveMultiplier += 0.1>> -<</if>> - -<<if $args[0].fetishKnown == 1>> - <<if $args[0].fetish == "mindbroken">> - <<set _slaveMultiplier -= 0.3>> - <<elseif $args[0].fetish != "none">> - <<set _slaveMultiplier += $args[0].fetishStrength/1000>> - <</if>> -<<else>> - <<set _slaveMultiplier -= 0.1>> -<</if>> - -<<if $args[0].attrKnown == 1>> - <<if $args[0].energy > 95>> - <<set _slaveMultiplier += 0.2>> - <</if>> -<</if>> - -<<if $args[0].vagina == 0>> - <<set _slaveMultiplier += 0.1>> -<</if>> -<<if $args[0].mpreg == 1>> - <<set _slaveMultiplier += 0.2>> -<</if>> -<<if $arcologies[0].FSRepopulationFocusSMR == 1>> - <<if $args[0].preg < -1>> - <<set _slaveMultiplier -= 0.5>> - <<elseif ($args[0].bellyPreg >= 300000)>> - <<set _slaveMultiplier += 1>> - <<elseif ($args[0].bellyPreg >= 120000)>> - <<set _slaveMultiplier += 0.5>> - <<elseif $args[0].preg > 10>> - <<set _slaveMultiplier += 0.1>> - <</if>> -<<elseif $arcologies[0].FSRestartSMR == 1>> - <<if $args[0].preg < -1>> - <<set _slaveMultiplier += 0.5>> - <<elseif ($args[0].bellyPreg >= 300000)>> - <<set _slaveMultiplier -= 2.5>> - <<elseif ($args[0].bellyPreg >= 30000)>> - <<set _slaveMultiplier -= 1.5>> - <<elseif $args[0].preg > 10>> - <<set _slaveMultiplier -= 1.0>> - <</if>> -<<else>> - <<if $args[0].preg < -1>> - <<set _slaveMultiplier -= 0.1>> - <<elseif ($activeSlave.bellyPreg >= 300000)>> - <<set _slaveMultiplier -= 1.5>> - <<elseif ($activeSlave.bellyPreg >= 120000)>> - <<set _slaveMultiplier -= 0.5>> - <<elseif $args[0].preg > 10>> - <<set _slaveMultiplier -= 0.1>> - <</if>> -<</if>> - -<<set _int = Math.clamp($args[0].intelligence+$args[0].intelligenceImplant,-130,130)>> /* make absolutely certain we do not use +-131 in the next line */ -<<set _slaveMultiplier += Math.floor((Math.asin(_int/131))*50)/50>> - -<<if $args[0].vagina > -1 && $arcologies[0].FSRestartSMR == 1>> - <<if $args[0].dick > 0>> - <<if $args[0].ovaries == 0 && $args[0].balls == 0>> - <<set _slaveMultiplier += 0.8>> - <</if>> - <</if>> -<<elseif $args[0].vagina > -1>> - <<if $args[0].dick > 0>> - <<if ($ui != "start") || ($PC.dick == 0) || ($PC.vagina == 0)>> - <<set _slaveMultiplier += 0.2>> - <<if $args[0].ovaries > 0>> - <<if $args[0].balls > 0>> - <<set _slaveMultiplier += 0.8>> - <</if>> - <</if>> - <<else>> - <<set _slaveMultiplier += 0.1>> - <<if $args[0].ovaries > 0>> - <<if $args[0].balls > 0>> - <<set _slaveMultiplier += 0.2>> - <</if>> - <</if>> - <</if>> - <</if>> -<</if>> - -<<if $args[0].pubertyXY == 0 && $args[0].physicalAge >= $potencyAge && $args[0].genes == "XY" && $arcologies[0].FSGenderRadicalist == "unset">> - <<set _slaveMultiplier += 0.5>> -<</if>> - -<<if $args[0].prestige > 0>> - <<set _slaveMultiplier += 0.7*$args[0].prestige>> -<</if>> -<<if $args[0].pornPrestige == 3>> - <<set _slaveMultiplier += 1.5>> -<<elseif $args[0].pornPrestige == 2>> - <<set _slaveMultiplier += 0.7>> -<<elseif $args[0].pornPrestige == 1>> - <<set _slaveMultiplier += 0.2>> -<</if>> - -<<if $specialSlavesPriceOverride == 1>> - <<if $args[0].devotion > 50>> - <<set _slaveMultiplier += $args[0].devotion/200>> - <</if>> - <<if $args[0].trust > 50>> - <<set _slaveMultiplier += $args[0].trust/200>> - <</if>> -<<else>> - <<set _slaveMultiplier += $args[0].devotion/200>> - <<if $args[0].devotion < -20>> - <<if $args[0].trust > 0>> - <<set _slaveMultiplier -= $args[0].trust/200>> - <</if>> - <<else>> - <<if $args[0].trust > 0>> - <<set _slaveMultiplier += $args[0].trust/200>> - <</if>> - <</if>> -<</if>> - -<<if $args[0].brand != 0>> - <<if $rep > 10000>> - <<set _slaveMultiplier += 0.1>> - <<elseif $rep < 5000>> - <<set _slaveMultiplier -= 0.1>> - <</if>> -<</if>> - -<<if $arcologies[0].FSSupremacistLawME != 0>> - <<if $args[0].race != $arcologies[0].FSSupremacistRace>> - <<set _slaveMultiplier -= 0.1>> - <</if>> -<</if>> -<<if $arcologies[0].FSSubjugationistLawME != 0>> - <<if $args[0].race == $arcologies[0].FSSubjugationistRace>> - <<set _slaveMultiplier -= 0.2>> - <</if>> -<</if>> -<<if $arcologies[0].FSRepopulationFocusSMR != 0>> - <<if $args[0].preg > 0>> - <<set _slaveMultiplier += 0.1>> - <</if>> -<</if>> -<<if $arcologies[0].FSHedonisticDecadenceSMR != 0>> - <<if $args[0].weight > 60 && $args[0].muscles < 5>> - <<set _slaveMultiplier += 0.1>> - <</if>> -<</if>> -<<if $arcologies[0].FSRestartSMR != 0>> - <<if $args[0].dick > 0>> - <<set _slaveMultiplier -= 0.1>> - <</if>> - <<if $args[0].balls > 0>> - <<set _slaveMultiplier -= 0.2>> - <</if>> - <<if $args[0].vagina > 0>> - <<set _slaveMultiplier -= 0.1>> - <</if>> - <<if $args[0].ovaries > 0>> - <<set _slaveMultiplier -= 0.5>> - <</if>> -<</if>> -<<if $arcologies[0].FSGenderFundamentalistSMR != 0>> - <<if $args[0].dick > 0>> - <<set _slaveMultiplier -= 0.1>> - <</if>> - <<if $args[0].balls > 0>> - <<set _slaveMultiplier -= 0.1>> - <</if>> -<</if>> -<<if $arcologies[0].FSGenderRadicalist != "unset">> - <<if $args[0].dick > 0>> - <<set _slaveMultiplier += 0.1>> - <</if>> - <<if $args[0].balls > 0>> - <<set _slaveMultiplier -= 0.1>> - <</if>> -<</if>> -<<if $arcologies[0].FSArabianRevivalist > 50>> - <<set _slaveMultiplier += 0.1>> -<</if>> - -<<if $args[0].career != 0>> - <<if $args[0].career == "a slave">> - <<set _slaveMultiplier += 0.1>> - <<elseif setup.bodyguardCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.1>> - <<elseif setup.wardenessCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.1>> - <<elseif setup.attendantCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.1>> - <<elseif setup.matronCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.1>> - <<elseif setup.schoolteacherCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.1>> - <<elseif setup.stewardessCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.1>> - <<elseif setup.milkmaidCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.1>> - <<elseif setup.farmerCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.1>> - <<elseif setup.madamCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.1>> - <<elseif setup.DJCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.1>> - <<elseif setup.HGCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.1>> - <<elseif setup.recruiterCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.1>> - <<elseif setup.entertainmentCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.05>> - <<elseif setup.whoreCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.05>> - <<elseif setup.gratefulCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.05>> - <<elseif setup.menialCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.05>> - <<elseif setup.servantCareers.includes($args[0].career)>> - <<set _slaveMultiplier += 0.05>> - <</if>> -<</if>> -<<if ($week-$args[0].weekAcquired >= 20) && ($args[0].entertainSkill >= 100)>> -<<if setup.entertainmentCareers.includes($args[0].career)>> -<<else>> - <<set _slaveMultiplier += 0.05>> -<</if>> -<</if>> -<<if ($args[0].oralCount + $args[0].analCount + $args[0].vaginalCount + $args[0].mammaryCount + $args[0].penetrativeCount > 1000)>> -<<if setup.whoreCareers.includes($args[0].career)>> -<<else>> - <<set _slaveMultiplier += 0.05>> -<</if>> -<</if>> - -<<if !setup.bodyguardCareers.includes($activeSlave.career) && $activeSlave.skillBG >= $masteredXP>> - <<set _slaveMultiplier += 0.1>> -<</if>> -<<if !setup.wardenessCareers.includes($activeSlave.career) && $activeSlave.skillWA >= $masteredXP>> - <<set _slaveMultiplier += 0.1>> -<</if>> -<<if !setup.attendantCareers.includes($activeSlave.career) && $activeSlave.skillAT >= $masteredXP>> - <<set _slaveMultiplier += 0.1>> -<</if>> -<<if !setup.matronCareers.includes($activeSlave.career) && $activeSlave.skillMT >= $masteredXP>> - <<set _slaveMultiplier += 0.1>> -<</if>> -<<if !setup.schoolteacherCareers.includes($activeSlave.career) && $activeSlave.skillTE >= $masteredXP>> - <<set _slaveMultiplier += 0.1>> -<</if>> -<<if !setup.stewardessCareers.includes($activeSlave.career) && $activeSlave.skillST >= $masteredXP>> - <<set _slaveMultiplier += 0.1>> -<</if>> -<<if !setup.milkmaidCareers.includes($activeSlave.career) && $activeSlave.skillMM >= $masteredXP>> - <<set _slaveMultiplier += 0.1>> -<</if>> -<<if !setup.farmerCareers.includes($activeSlave.career) && $activeSlave.skillFA >= $masteredXP>> - <<set _slaveMultiplier += 0.1>> -<</if>> -<<if !setup.madamCareers.includes($activeSlave.career) && $activeSlave.skillMD >= $masteredXP>> - <<set _slaveMultiplier += 0.1>> -<</if>> -<<if !setup.DJCareers.includes($activeSlave.career) && $activeSlave.skillDJ >= $masteredXP>> - <<set _slaveMultiplier += 0.1>> -<</if>> -<<if !setup.HGCareers.includes($activeSlave.career) && $activeSlave.skillHG >= $masteredXP>> - <<set _slaveMultiplier += 0.1>> -<</if>> -<<if !setup.recruiterCareers.includes($activeSlave.career) && $activeSlave.skillRC >= $masteredXP>> - <<set _slaveMultiplier += 0.1>> -<</if>> -<<if !setup.servantCareers.includes($activeSlave.career) && $activeSlave.skillS >= $masteredXP>> - <<set _slaveMultiplier += 0.05>> -<</if>> -<<if !setup.entertainmentCareers.includes($activeSlave.career) && $activeSlave.skillE >= $masteredXP>> - <<set _slaveMultiplier += 0.05>> -<</if>> -<<if !setup.whoreCareers.includes($activeSlave.career) && $activeSlave.skillW >= $masteredXP>> - <<set _slaveMultiplier += 0.05>> -<</if>> - -<<if $seeAge == 1>> -<<if $args[0].physicalAge == $minimumSlaveAge && $args[0].physicalAge == $fertilityAge && canGetPregnant($args[0]) && ($arcologies[0].FSRepopulationFocus != "unset" || $arcologies[0].FSGenderFundamentalist != "unset")>> - <<if $args[0].birthWeek == 0>> - <<set _slaveMultiplier -= 0.4>> - <<elseif $args[0].birthWeek < 4>> - <<set _slaveMultiplier -= 0.1>> - <</if>> -<<elseif $args[0].physicalAge == $minimumSlaveAge>> - <<if $args[0].birthWeek == 0>> - <<set _slaveMultiplier -= 0.2>> - <<elseif $args[0].birthWeek < 4>> - <<set _slaveMultiplier -= 0.05>> - <</if>> -<<elseif $args[0].physicalAge == $fertilityAge && canGetPregnant($args[0]) && ($arcologies[0].FSRepopulationFocus != "unset" || $arcologies[0].FSGenderFundamentalist != "unset")>> - <<if $args[0].birthWeek == 0>> - <<set _slaveMultiplier -= 0.2>> - <<elseif $args[0].birthWeek < 4>> - <<set _slaveMultiplier -= 0.05>> - <</if>> -<</if>> -<</if>> - -<<if $args[0].amp == 1>> - <<set _slaveMultiplier -= 0.2>> -<</if>> - -<<if $args[0].eyes == -2>> - <<set _slaveMultiplier -= 0.2>> -<</if>> - -<<if $args[0].indenture > -1>> - <<set _slaveMultiplier -= 0.1*$args[0].indentureRestrictions>> - <<set _slaveMultiplier -= (260-$args[0].indenture)/260>> -<<elseif $seeAge == 1>> -<<if $args[0].actualAge >= ($retirementAge-5) && $PhysicalRetirementAgePolicy != 1>> - <<set _age = 52*($retirementAge-$args[0].actualAge)>> - <<set _slaveMultiplier = _slaveMultiplier*(_age/260)>> -<</if>> -<<if $args[0].physicalAge >= ($retirementAge-5) && $PhysicalRetirementAgePolicy == 1>> - <<set _age = 52*($retirementAge-$args[0].physicalAge)>> - <<set _slaveMultiplier = _slaveMultiplier*(_age/260)>> -<</if>> -<</if>> - -<<set $slaveCost = ($slaveCost*_slaveMultiplier*50)>> -<<set $slaveCost = Number($slaveCost) || 0>> - -<<if $slaveCost < $minimumSlaveCost>> - <<set $slaveCost = $minimumSlaveCost>> -<<elseif $slaveCost <= 100000>> -<<elseif $slaveCost <= 200000>> - <<set $slaveCost -= (($slaveCost-100000)*0.1)>> -<<elseif $slaveCost <= 300000>> - <<set $slaveCost -= 10000 + (($slaveCost-200000)*0.2)>> -<<elseif $slaveCost <= 400000>> - <<set $slaveCost -= 30000 + (($slaveCost-300000)*0.3)>> -<<elseif $slaveCost <= 500000>> - <<set $slaveCost -= 60000 + (($slaveCost-400000)*0.4)>> -<<else>> - <<set $slaveCost -= 100000 + (($slaveCost-500000)*0.5)>> -<</if>> -<<if $slaveCost < 1000>> - <<set $slaveCost = 1000>> -<</if>> - -<<set $slaveCost = 500*Math.trunc($slaveCost/500)>> - + <<set $slaveCost = slaveCost($args[0])>> <</widget>> /% @@ -377,52 +10,5 @@ Fires <<slaveCost>> and adds punishment multipliers for starting with trained and/or devoted slaves. %/ <<widget "StartingSlaveCost">> - -<<slaveCost $args[0]>> - -<<set _slaveMultiplier = 0>> - -<<if $args[0].devotion > 20>> - <<set _slaveMultiplier += (0.000117*($args[0].devotion-20)*($args[0].devotion-20))+(0.003167*($args[0].devotion-20))>> -<</if>> - -<<if $args[0].whoreSkill>> - <<set _slaveMultiplier += 0.00001*$args[0].whoreSkill*$args[0].whoreSkill>> -<</if>> -<<if $args[0].entertainSkill>> - <<set _slaveMultiplier += 0.00001*$args[0].entertainSkill*$args[0].entertainSkill>> -<</if>> -<<if $args[0].vaginalSkill>> - <<set _slaveMultiplier += 0.00001*$args[0].vaginalSkill*$args[0].vaginalSkill>> -<</if>> -<<if $args[0].analSkill>> - <<set _slaveMultiplier += 0.00001*$args[0].analSkill*$args[0].analSkill>> -<</if>> -<<if $args[0].oralSkill>> - <<set _slaveMultiplier += 0.00001*$args[0].oralSkill*$args[0].oralSkill>> -<</if>> -<<if $args[0].combatSkill>> - <<set _slaveMultiplier += 0.1>> -<</if>> - -<<if _slaveMultiplier>> - <<if $args[0].actualAge > 25>> - <<set _slaveMultiplier -= _slaveMultiplier*($args[0].actualAge-25)*0.05>> - <</if>> -<</if>> - -<<if $args[0].prestige>> - <<set _slaveMultiplier += $args[0].prestige>> -<</if>> - -<<if _slaveMultiplier>> - <<set _slaveMultiplier = Math.clamp(_slaveMultiplier,0,10)>> - <<set $slaveCost += $slaveCost*_slaveMultiplier>> - <<set $slaveCost = 500*Math.trunc($slaveCost/500)>> -<</if>> - -<<if $PC.career == "slaver">> - <<set $slaveCost = $slaveCost*.5>> -<</if>> - + <<set $slaveCost = startingSlaveCost($args[0])>> <</widget>>