diff --git a/src/interaction/sellSlave.js b/src/interaction/sellSlave.js index 5bca28ec90f93c9c5755aaad656fbcc59a86f6b1..cadfaacd5043554819a8d5d7dae338540b80a388 100644 --- a/src/interaction/sellSlave.js +++ b/src/interaction/sellSlave.js @@ -52,8 +52,8 @@ App.Interact.sellSlave = function(slave) { t.push(`${He} tries to conceal ${his} terror at going from a trustworthy slave master to the cruel and uncertain world outside your penthouse, but ${he} fails.`); } } - - cost = slaveCost(slave); + const costObj = slaveCost(slave, false, false, false, true); + cost = costObj.cost; cost = (random(70, 80) * Math.trunc(cost / 100)); if (slave.breedingMark === 1 && V.propOutcome === 1 && V.arcologies[0].FSRestart !== "unset") { @@ -903,7 +903,7 @@ App.Interact.sellSlave = function(slave) { App.UI.DOM.appendNewElement("span", relist, ` This will cost ${cashFormat(500)}`); } if (V.debugMode) { - App.UI.DOM.appendNewElement("div", scene, `Base slave cost: `).append(App.UI.DOM.cashFormat(cost)); + App.UI.DOM.appendNewElement("div", scene, `Estimated value: `).append(costObj.report); } const buyerKeys = []; for (const [key, obj] of buyers) { diff --git a/src/js/slaveCostJS.js b/src/js/slaveCostJS.js index 68d08bae4099c357f9d14a5d806d6f2f1e5dd0c0..37943e5eae6c2cbc2b1eb1e18fce3501c557ba31 100644 --- a/src/js/slaveCostJS.js +++ b/src/js/slaveCostJS.js @@ -1341,7 +1341,7 @@ globalThis.BeautyArray = (function() { if (arcology.FSTransformationFetishist > 20) { if (slave.lips > 70) { if (slave.lipsImplant / slave.lips < 0.5) { - adjustBeauty("Lips: Transformation Fetishist", -(((slave.lips / 10) + (arcology.FSTransformationFetishist / 20)))); + adjustBeauty("Lips: Transformation Fetishist", -((slave.lips / 10) + (arcology.FSTransformationFetishist / 20))); } } if (slave.hips === 3) { @@ -2271,15 +2271,120 @@ globalThis.FResultTooltip = function(slave, forSale = 0) { * @param {boolean} [isStartingSlave=false] is the slave a "starting slave" * @param {boolean} [followLaws=false] Apply cost variations from enacted Slave Market Regulations * @param {boolean} [isSpecial=false] is this slave a special/hero slave - * @returns {number} + * @param {boolean} [returnDOM] + * @returns {number|Object} */ -globalThis.slaveCost = function(slave, isStartingSlave = false, followLaws = false, isSpecial = false) { +globalThis.slaveCost = function(slave, isStartingSlave = false, followLaws = false, isSpecial = false, returnDOM = false) { const milked = App.SlaveAssignment.getMilked(slave, 1.0, true); - const beauty = slaveCostBeauty(slave, isStartingSlave, followLaws, isSpecial); - if ((milked.cash * 52) > beauty && !isStartingSlave) { // Arbitrarily, let's say their milk worth is what they would make in a year. Blocking starting slave for now because milk makes so much money, the estimation makes game start impossible. - return milked.cash * 52; + const beautyObj = slaveCostBeauty(slave, isStartingSlave, followLaws, isSpecial); + const cost = beautyObj.cost; + /** Arbitrarily, let's say their milk worth is what they would make in a year. Blocking starting slave for now because milk makes so much money, the estimation makes game start impossible. */ + const milkYear = milked.cash * 52; + if ((milkYear) > cost && !isStartingSlave) { + const milkSpan = App.UI.DOM.makeElement("span", cashFormat(milkYear)); + if (V.cheatMode || V.debugMode) { + milkSpan.tabIndex = 0; + milkSpan.classList.add("has-tooltip"); + tippy(milkSpan, { + content: `Value as a cow is greater than their value as a sex object. Value is based on a year's fluids with current body.`, + placement: "right", interactive: true, trigger: "click" + }); + } + return returnDOM ? {cost: milkYear, report: milkSpan} : milkYear; } else { - return beauty; + return returnDOM ? {cost: cost, report: costTooltip()} : cost; + } + + function costTooltip() { + // Make a link. Clicking the link will display detailed info about that over the top of the page (tooltip-style) + const span = App.UI.DOM.makeElement("span", cashFormat(cost)); + if (V.cheatMode || V.debugMode) { + span.tabIndex = 0; + span.classList.add("has-tooltip"); + tippy(span, { + content: costDisplay(), + placement: "right", interactive: true, trigger: "click" + }); + } + return span; + + /** Upon the link being clicked, set up some links to sort the info and a span to show it in + * @returns {HTMLElement} + */ + function costDisplay() { + let criteria = "value"; + let direction = "descending"; + + // Heading line that handles sorting + const el = document.createElement('div'); + el.classList.add("tip-details"); + + el.appendChild(document.createTextNode(`Sort by: `)); + el.appendChild(App.UI.DOM.generateLinksStrip([ + App.UI.DOM.link("Text", () => { + criteria = "text"; + jQuery(cheatFResultContents).empty().append(costFrame); + }, []), + App.UI.DOM.link("Value", () => { + criteria = "value"; + jQuery(cheatFResultContents).empty().append(costFrame); + }, []), + App.UI.DOM.link("Ascending", () => { + direction = "ascending"; + jQuery(cheatFResultContents).empty().append(costFrame); + }, []), + App.UI.DOM.link("Descending", () => { + direction = "descending"; + jQuery(cheatFResultContents).empty().append(costFrame); + }, []) + ])); + + let cheatFResultContents = App.UI.DOM.appendNewElement("div", el, costFrame()); + + App.UI.DOM.appendNewElement("div", el, "A slave's base value is modified by an additive multiplier.", "note"); + + return el; + + /** Set up the frame that contains the info + * @returns {HTMLDivElement} + */ + function costFrame() { + let el = document.createElement("div"); + el.classList.add("grid-2columns-auto"); + + let sortedBeautyMapKeys; + if (criteria === "text") { + if (direction === "descending") { + sortedBeautyMapKeys = Array.from(beautyObj.map.keys()).sort((a, b) => (a > b) ? 1 : -1); + } else { + sortedBeautyMapKeys = Array.from(beautyObj.map.keys()).sort((a, b) => (a < b) ? 1 : -1); + } + } else if (criteria === "value") { + if (direction === "descending") { + sortedBeautyMapKeys = Array.from(beautyObj.map.keys()).sort((a, b) => (beautyObj.map.get(a) < beautyObj.map.get(b)) ? 1 : -1); + } else { + sortedBeautyMapKeys = Array.from(beautyObj.map.keys()).sort((a, b) => (beautyObj.map.get(a) > beautyObj.map.get(b)) ? 1 : -1); + } + } + + for (const key of sortedBeautyMapKeys) { + let value = beautyObj.map.get(key); + value = (Math.floor(value * 10) / 10); + + let className; + if (value > 0) { + className = "green"; + } else if (value < 0) { + className = "red"; + } + App.UI.DOM.appendNewElement("div", el, value.toString(), className); + + App.UI.DOM.appendNewElement("div", el, capFirstChar(key)); + } + + return el; + } + } } }; @@ -2289,13 +2394,14 @@ globalThis.slaveCostBeauty = (function() { let arcology; let multiplier; let cost; + const map = new Map([]); /** * @param {App.Entity.SlaveState} slave * @param {boolean} isStartingSlave is the slave a "starting slave" * @param {boolean} followLaws Apply cost variations from enacted Slave Market Regulations * @param {boolean} isSpecial is this slave a special/hero slave - * @returns {number} + * @returns {Object} */ function slaveCost(slave, isStartingSlave, followLaws, isSpecial) { arcology = V.arcologies[0]; @@ -2321,7 +2427,7 @@ globalThis.slaveCostBeauty = (function() { if (isStartingSlave) { calcStartingSlaveCost(slave); } - return cost; + return {cost: cost, map: map}; } /** @@ -2329,32 +2435,32 @@ globalThis.slaveCostBeauty = (function() { */ function calcGenitalsCost(slave) { if (slave.vagina === 0 && slave.counter.vaginal === 0) { - multiplier += 0.2; + updateMultiplyer(`virgin`, 0.2); } if (slave.anus === 0 && slave.counter.anal === 0) { - multiplier += 0.2; + updateMultiplyer(`anal virgin`, 0.2); } // Boosted these to 20% to account for the fact that it limits the skill that can be attained if (slave.vagina > -1 && arcology.FSRestartSMR === 1) { if (slave.dick > 0) { if (slave.ovaries === 0 && slave.balls === 0) { - multiplier += 0.8; + updateMultiplyer(`castrated`, 0.8); } } } else if (slave.vagina > -1) { if (slave.dick > 0) { if (V.ui !== "start" || V.PC.dick === 0 || V.PC.vagina === -1) { - multiplier += 0.2; + updateMultiplyer(`dick`, 0.2); if (slave.ovaries > 0) { if (slave.balls > 0) { - multiplier += 0.8; + updateMultiplyer(`futa`, 0.8); } } } else { - multiplier += 0.1; + updateMultiplyer(`dick`, 0.1); if (slave.ovaries > 0) { if (slave.balls > 0) { - multiplier += 0.2; + updateMultiplyer(`futa`, 0.2); } } } @@ -2369,20 +2475,20 @@ globalThis.slaveCostBeauty = (function() { function calcDevotionTrustCost(slave, isSpecial) { if (isSpecial === true) { if (slave.devotion > 50) { - multiplier += slave.devotion / 200; + updateMultiplyer(`special devotion`, slave.devotion / 200); } if (slave.trust > 50) { - multiplier += slave.trust / 200; + updateMultiplyer(`special trust`, slave.trust / 200); } } else { - multiplier += slave.devotion / 200; + updateMultiplyer(`devotion`, slave.devotion / 200); if (slave.devotion < -20) { if (slave.trust > 0) { - multiplier -= slave.trust / 200; + updateMultiplyer(`trust with low devotion`, -slave.trust / 200); } } else { if (slave.trust > 0) { - multiplier += slave.trust / 200; + updateMultiplyer(`trust with devotion`, slave.trust / 200); } } } @@ -2393,31 +2499,31 @@ globalThis.slaveCostBeauty = (function() { */ function calcPreferencesCost(slave) { if (slave.behavioralFlaw !== "none") { - multiplier -= 0.1; + updateMultiplyer(`behavioral flaw`, -0.1); } if (slave.behavioralQuirk !== "none") { - multiplier += 0.1; + updateMultiplyer(`behavioral quirk`, 0.1); } if (slave.sexualFlaw === "breeder" && arcology.FSRepopulationFocus !== "unset") { - multiplier += 0.3; + updateMultiplyer(`sexual flaw, but a breeder`, 0.3); } else if (slave.sexualFlaw !== "none") { - multiplier -= 0.1; + updateMultiplyer(`sexual flaw`, -0.1); } if (slave.sexualQuirk !== "none") { - multiplier += 0.1; + updateMultiplyer(`sexual quirk`, 0.1); } if (slave.fetishKnown === 1) { if (slave.fetish === "mindbroken") { - multiplier -= 0.3; + updateMultiplyer(`mindbroken`, -0.3); } else if (slave.fetish !== "none") { - multiplier += slave.fetishStrength / 1000; + updateMultiplyer(`fetish`, slave.fetishStrength / 1000); } } else { - multiplier -= 0.1; + updateMultiplyer(`unknown fetish`, -0.1); } if (slave.attrKnown === 1) { if (slave.energy > 95) { - multiplier += 0.2; + updateMultiplyer(`high attraction`, 0.2); } } } @@ -2427,37 +2533,37 @@ globalThis.slaveCostBeauty = (function() { */ function calcPregCost(slave) { if (slave.mpreg === 1) { - multiplier += 0.2; + updateMultiplyer(`mpreg`, 0.2); } if (arcology.FSRepopulationFocusSMR === 1) { if (slave.preg < -1) { - multiplier -= 0.5; + updateMultiplyer(`repopulationist sterile`, -0.5); } else if (slave.bellyPreg >= 300000) { - multiplier += 1; + updateMultiplyer(`repopulationist mega preg`, 1); } else if (slave.bellyPreg >= 120000) { - multiplier += 0.5; + updateMultiplyer(`repopulationist very preg`, 0.5); } else if (slave.preg > slave.pregData.normalBirth / 4) { - multiplier += 0.1; + updateMultiplyer(`repopulationist showing`, 0.1); } } else if (arcology.FSRestartSMR === 1) { if (slave.preg < -1) { - multiplier += 0.5; + updateMultiplyer(`restart sterile`, 0.5); } else if (slave.bellyPreg >= 300000) { - multiplier -= 2.5; + updateMultiplyer(`restart mega preg`, -2.5); } else if (slave.bellyPreg >= 30000) { - multiplier -= 1.5; + updateMultiplyer(`restart very preg`, -1.5); } else if (slave.preg > slave.pregData.normalBirth / 4) { - multiplier -= 1.0; + updateMultiplyer(`restart showing`, -1.0); } } else { if (slave.preg < -1) { - multiplier -= 0.1; + updateMultiplyer(`sterile`, -0.1); } else if (slave.bellyPreg >= 300000) { - multiplier -= 1.5; + updateMultiplyer(`mega preg`, -1.5); } else if (slave.bellyPreg >= 120000) { - multiplier -= 0.5; + updateMultiplyer(`very preg`, -0.5); } else if (slave.bellyPreg >= 500 || slave.pregKnown === 1) { - multiplier -= 0.1; + updateMultiplyer(`restart showing`, -0.1); } } } @@ -2467,14 +2573,14 @@ globalThis.slaveCostBeauty = (function() { */ function calcPrestigeCost(slave) { if (slave.prestige > 0) { - multiplier += 0.7 * slave.prestige; + updateMultiplyer(`prestige`, 0.7 * slave.prestige); } if (slave.porn.prestige === 3) { - multiplier += 1.5; + updateMultiplyer(`porn prestige`, 1.5); } else if (slave.porn.prestige === 2) { - multiplier += 0.7; + updateMultiplyer(`porn prestige`, 0.7); } else if (slave.porn.prestige === 1) { - multiplier += 0.2; + updateMultiplyer(`porn prestige`, 0.2); } } @@ -2484,86 +2590,86 @@ globalThis.slaveCostBeauty = (function() { function calcFSCost(slave) { if (arcology.FSSupremacistLawME !== 0) { if (slave.race !== arcology.FSSupremacistRace) { - multiplier -= 0.1; + updateMultiplyer(`supremacist race`, -0.1); } } if (arcology.FSSubjugationistLawME !== 0) { if (slave.race === arcology.FSSubjugationistRace) { - multiplier -= 0.2; + updateMultiplyer(`subjugationist race`, -0.2); } } if (V.seeCats === 1 && slave.race === "catgirl") { if (arcology.FSBodyPurist === "unset" && V.projectN.techReleased === 1) { - multiplier += 0.5; + updateMultiplyer(`catgirl`, 0.5); } else if (arcology.FSBodyPurist === "unset" && V.projectN.techReleased === 0) { - multiplier += 0.9; + updateMultiplyer(`catgirl`, 0.9); } else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 0) { - multiplier -= 0.5; + updateMultiplyer(`catgirl`, -0.5); } else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 1 && V.projectN.techreleased === 1) { - multiplier += 0.5; + updateMultiplyer(`catgirl`, 0.5); } else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 1 && V.projectN.techreleased === 0) { - multiplier += 0.9; + updateMultiplyer(`catgirl`, 0.9); } if (arcology.FSEgyptianRevivalist !== "unset") { - multiplier += 0.2; + updateMultiplyer(`egyptian catgirl`, 0.2); } if (arcology.FSTransformationFetishist !== "unset") { - multiplier += 0.2; + updateMultiplyer(`transformation catgirl`, 0.2); } } if (arcology.FSRepopulationFocusSMR !== 0) { if (slave.preg > 0) { - multiplier += 0.1; + updateMultiplyer(`repopulationist preg`, 0.1); } } else if (arcology.FSRestartSMR !== 0) { if (slave.dick > 0) { - multiplier -= 0.1; + updateMultiplyer(`restart smr dick`, -0.1); } if (slave.balls > 0) { - multiplier -= 0.2; + updateMultiplyer(`restart smr balls`, -0.2); } if (slave.vagina > 0) { - multiplier -= 0.1; + updateMultiplyer(`restart smr vagina`, -0.1); } if (slave.ovaries > 0) { - multiplier -= 0.5; + updateMultiplyer(`restart smr ovaries`, -0.5); } } if (arcology.FSGenderFundamentalistSMR !== 0) { if (slave.dick > 0) { - multiplier -= 0.1; + updateMultiplyer(`gender fundamentalist smr dick`, -0.1); } if (slave.balls > 0) { - multiplier -= 0.1; + updateMultiplyer(`gender fundamentalist smr balls`, -0.1); } } else if (arcology.FSGenderRadicalist !== "unset") { if (slave.dick > 0) { - multiplier += 0.1; + updateMultiplyer(`gender radicalist dick`, 0.1); } if (slave.balls > 0 && arcology.FSGenderRadicalistLawFuta !== 2 && arcology.FSGenderRadicalistLawFuta !== 4) { - multiplier -= 0.1; + updateMultiplyer(`gender radicalist balls`, -0.1); } } if (arcology.FSPetiteAdmirationSMR !== 0 || arcology.FSStatuesqueGlorificationSMR !== 0) { if (heightPass(slave)) { - multiplier += 0.1; + updateMultiplyer(`petite admiration smr`, 0.1); } else { - multiplier -= 0.1; + updateMultiplyer(`petite admiration smr`, -0.1); } } if (arcology.FSSlaveProfessionalism !== "unset") { - multiplier += 0.1 * (slave.intelligence / 20); + updateMultiplyer(`slave professionalism`, 0.1 * (slave.intelligence / 20)); } if (arcology.FSHedonisticDecadenceSMR !== 0) { if (slave.weight > 60 && slave.muscles < 5) { - multiplier += 0.1; + updateMultiplyer(`hedonistic decadence smr`, 0.1); } } if (arcology.FSArabianRevivalist > 50) { - multiplier += 0.1; + updateMultiplyer(`arabian revivalist`, 0.1); } if (arcology.FSNeoImperialist > 40) { - multiplier += 0.1; + updateMultiplyer(`neo imperialist`, 0.1); } } @@ -2573,21 +2679,18 @@ globalThis.slaveCostBeauty = (function() { 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; + updateMultiplyer(`birthWeek`, 0.4); } else if (slave.birthWeek < 4) { - multiplier += 0.1; + updateMultiplyer(`birthWeek`, 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")) { + } else if ( + slave.physicalAge === V.minimumSlaveAge || + (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset")) + ) { if (slave.birthWeek === 0) { - multiplier += 0.2; + updateMultiplyer(`birthWeek`, 0.2); } else if (slave.birthWeek < 4) { - multiplier += 0.05; + updateMultiplyer(`birthWeek`, 0.05); } } } @@ -2598,102 +2701,102 @@ globalThis.slaveCostBeauty = (function() { function calcCareersCost(slave) { if (slave.career !== 0) { if (slave.career === "a slave") { - multiplier += 0.1; + updateMultiplyer(`career`, 0.1); } else if (App.Data.Careers.Leader.bodyguard.includes(slave.career)) { - multiplier += 0.1; + updateMultiplyer(`career`, 0.1); } else if (App.Data.Careers.Leader.wardeness.includes(slave.career)) { - multiplier += 0.1; + updateMultiplyer(`career`, 0.1); } else if (App.Data.Careers.Leader.attendant.includes(slave.career)) { - multiplier += 0.1; + updateMultiplyer(`career`, 0.1); } else if (App.Data.Careers.Leader.nurse.includes(slave.career)) { - multiplier += 0.1; + updateMultiplyer(`career`, 0.1); } else if (App.Data.Careers.Leader.matron.includes(slave.career)) { - multiplier += 0.1; + updateMultiplyer(`career`, 0.1); } else if (App.Data.Careers.Leader.schoolteacher.includes(slave.career)) { - multiplier += 0.1; + updateMultiplyer(`career`, 0.1); } else if (App.Data.Careers.Leader.stewardess.includes(slave.career)) { - multiplier += 0.1; + updateMultiplyer(`career`, 0.1); } else if (App.Data.Careers.Leader.milkmaid.includes(slave.career)) { - multiplier += 0.1; + updateMultiplyer(`career`, 0.1); } else if (App.Data.Careers.Leader.farmer.includes(slave.career)) { - multiplier += 0.1; + updateMultiplyer(`career`, 0.1); } else if (App.Data.Careers.Leader.madam.includes(slave.career)) { - multiplier += 0.1; + updateMultiplyer(`career`, 0.1); } else if (App.Data.Careers.Leader.DJ.includes(slave.career)) { - multiplier += 0.1; + updateMultiplyer(`career`, 0.1); } else if (App.Data.Careers.Leader.HG.includes(slave.career)) { - multiplier += 0.1; + updateMultiplyer(`career`, 0.1); } else if (App.Data.Careers.Leader.recruiter.includes(slave.career)) { - multiplier += 0.1; + updateMultiplyer(`career`, 0.1); } else if (App.Data.Careers.General.entertainment.includes(slave.career)) { - multiplier += 0.05; + updateMultiplyer(`career`, 0.05); } else if (App.Data.Careers.General.whore.includes(slave.career)) { - multiplier += 0.05; + updateMultiplyer(`career`, 0.05); } else if (App.Data.Careers.General.grateful.includes(slave.career)) { - multiplier += 0.05; + updateMultiplyer(`career`, 0.05); } else if (App.Data.Careers.General.menial.includes(slave.career)) { - multiplier += 0.05; + updateMultiplyer(`career`, 0.05); } else if (App.Data.Careers.General.servant.includes(slave.career)) { - multiplier += 0.05; + updateMultiplyer(`career`, 0.05); } } if (V.week - slave.weekAcquired >= 20 && slave.skill.entertainment >= 100) { if (!App.Data.Careers.General.entertainment.includes(slave.career)) { - multiplier += 0.05; + updateMultiplyer(`entertainment career`, 0.05); } } if (slave.counter.oral + slave.counter.anal + slave.counter.vaginal + slave.counter.mammary + slave.counter.penetrative > 1000) { if (!App.Data.Careers.General.whore.includes(slave.career)) { - multiplier += 0.05; + updateMultiplyer(`whore career`, 0.05); } } if (!App.Data.Careers.Leader.bodyguard.includes(slave.career) && slave.skill.bodyguard >= V.masteredXP) { - multiplier += 0.1; + updateMultiplyer(`good bodyguard`, 0.1); } if (!App.Data.Careers.Leader.wardeness.includes(slave.career) && slave.skill.wardeness >= V.masteredXP) { - multiplier += 0.1; + updateMultiplyer(`good wardeness`, 0.1); } if (!App.Data.Careers.Leader.attendant.includes(slave.career) && slave.skill.attendant >= V.masteredXP) { - multiplier += 0.1; + updateMultiplyer(`good attendant`, 0.1); } if (!App.Data.Careers.Leader.nurse.includes(slave.career) && slave.skill.nurse >= V.masteredXP) { - multiplier += 0.1; + updateMultiplyer(`good nurse`, 0.1); } if (!App.Data.Careers.Leader.matron.includes(slave.career) && slave.skill.matron >= V.masteredXP) { - multiplier += 0.1; + updateMultiplyer(`good matron`, 0.1); } if (!App.Data.Careers.Leader.schoolteacher.includes(slave.career) && slave.skill.teacher >= V.masteredXP) { - multiplier += 0.1; + updateMultiplyer(`good teacher`, 0.1); } if (!App.Data.Careers.Leader.stewardess.includes(slave.career) && slave.skill.stewardess >= V.masteredXP) { - multiplier += 0.1; + updateMultiplyer(`good stewardess`, 0.1); } if (!App.Data.Careers.Leader.milkmaid.includes(slave.career) && slave.skill.milkmaid >= V.masteredXP) { - multiplier += 0.1; + updateMultiplyer(`good milkmaid`, 0.1); } if (!App.Data.Careers.Leader.farmer.includes(slave.career) && slave.skill.farmer >= V.masteredXP) { - multiplier += 0.1; + updateMultiplyer(`good farmer`, 0.1); } if (!App.Data.Careers.Leader.madam.includes(slave.career) && slave.skill.madam >= V.masteredXP) { - multiplier += 0.1; + updateMultiplyer(`good madam`, 0.1); } if (!App.Data.Careers.Leader.DJ.includes(slave.career) && slave.skill.DJ >= V.masteredXP) { - multiplier += 0.1; + updateMultiplyer(`good DJ`, 0.1); } if (!App.Data.Careers.Leader.HG.includes(slave.career) && slave.skill.headGirl >= V.masteredXP) { - multiplier += 0.1; + updateMultiplyer(`good headGirl`, 0.1); } if (!App.Data.Careers.Leader.recruiter.includes(slave.career) && slave.skill.recruiter >= V.masteredXP) { - multiplier += 0.1; + updateMultiplyer(`good recruiter`, 0.1); } if (!App.Data.Careers.General.servant.includes(slave.career) && slave.skill.servant >= V.masteredXP) { - multiplier += 0.05; + updateMultiplyer(`good servant`, 0.05); } if (!App.Data.Careers.General.entertainment.includes(slave.career) && slave.skill.entertainer >= V.masteredXP) { - multiplier += 0.05; + updateMultiplyer(`good entertainer`, 0.05); } if (!App.Data.Careers.General.whore.includes(slave.career) && slave.skill.whore >= V.masteredXP) { - multiplier += 0.05; + updateMultiplyer(`good whore`, 0.05); } } @@ -2704,24 +2807,24 @@ globalThis.slaveCostBeauty = (function() { const 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; + updateMultiplyer(`intelligence`, 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; + updateMultiplyer(`child`, 0.5); } if (slave.geneticQuirks.albinism === 2) { - multiplier += 0.2; + updateMultiplyer(`albinism`, 0.2); } if (V.rep > 10000) { - multiplier += 0.1 * (Object.getOwnPropertyNames(slave.brand).length); + updateMultiplyer(`high rep brand`, 0.1 * (Object.getOwnPropertyNames(slave.brand).length)); } else if (V.rep < 5000) { - multiplier -= 0.1 * (Object.getOwnPropertyNames(slave.brand).length); + updateMultiplyer(`low rep brand`, -0.1 * (Object.getOwnPropertyNames(slave.brand).length)); } - multiplier -= getLimbCount(slave, 0) * 0.05; + updateMultiplyer(`limbs`, -getLimbCount(slave, 0) * 0.05); if (!canSee(slave)) { - multiplier -= 0.2; + updateMultiplyer(`vision`, -0.2); } if (slave.hears === -2) { - multiplier -= 0.1; + updateMultiplyer(`hearing`, -0.1); } } @@ -2730,13 +2833,13 @@ globalThis.slaveCostBeauty = (function() { */ function calcIndentureCost(slave) { if (slave.indenture > -1) { - multiplier -= 0.1 * slave.indentureRestrictions; - multiplier -= (260 - slave.indenture) / 260; + updateMultiplyer(`indenture level`, -0.1 * slave.indentureRestrictions); + updateMultiplyer(`indenture time`, -(260 - slave.indenture) / 260); } else if (V.seeAge === 1 && slave.actualAge >= (V.retirementAge - 5)) { if (V.policies.retirement.physicalAgePolicy === 0) { - multiplier *= (V.retirementAge - slave.actualAge) / 5; + updateMultiplyer(`near retirement`, (multiplier - (V.retirementAge - slave.actualAge) / 5)); } else { - multiplier *= (V.retirementAge - slave.physicalAge) / 5; + updateMultiplyer(`near retirement`, (multiplier - (V.retirementAge - slave.physicalAge) / 5)); } } } @@ -2807,11 +2910,18 @@ globalThis.slaveCostBeauty = (function() { startingSlaveMultiplier = Math.clamp(startingSlaveMultiplier, 0, 10); cost += cost * startingSlaveMultiplier; cost = 500 * Math.trunc(cost / 500); - if (V.PC.career === "slaver" || V.PC.career === "slave overseer" || V.PC.career === "slave tender") { + if (isPCCareerInCategory("slaver")) { cost /= 2; } } + function updateMultiplyer(string, value) { + if (value) { + map.set(string, value); + multiplier += value; + } + } + return slaveCost; })(); diff --git a/src/markets/marketUI.js b/src/markets/marketUI.js index 62a8a55c97112dfde15aa925e6f3256337e37522..981baec4b2e0a85ca42e932cb084708eb4eff5ad 100644 --- a/src/markets/marketUI.js +++ b/src/markets/marketUI.js @@ -9,7 +9,8 @@ App.Markets.purchaseFramework = function(slaveMarket, {sTitleSingular = "slave", sTitlePlural = "slaves", costMod = 1} = {}) { const el = new DocumentFragment(); const {slave, text} = generateMarketSlave(slaveMarket, (V.market.numArcology || 1)); - const cost = getCost(); + const costObj = getCost(); + const cost = costObj.cost; let prisonCrime = ""; if (slaveMarket === V.prisonCircuit[V.prisonCircuitIndex]) { prisonCrime = pronounsForSlaveProp(slave, text); @@ -17,16 +18,18 @@ App.Markets.purchaseFramework = function(slaveMarket, {sTitleSingular = "slave", $(el).append(` ${text}`); } - App.UI.DOM.appendNewElement("p", - el, - `The offered price is ${cashFormat(cost)}. ${(V.slavesSeen > V.slaveMarketLimit) ? `You have cast such a wide net for slaves this week that it is becoming more expensive to find more for sale. Your reputation helps determine your reach within the slave market.` : ``}` - ); + App.Events.addParagraph(el, [ + `The offered price is`, + App.UI.DOM.combineNodes(costObj.report, "."), + V.slavesSeen > V.slaveMarketLimit ? `You have cast such a wide net for slaves this week that it is becoming more expensive to find more for sale. Your reputation helps determine your reach within the slave market.` : `` + ]); el.append(choices()); return el; function getCost() { - let cost = slaveCost(slave, false, !App.Data.misc.lawlessMarkets.includes(slaveMarket)); + const costObj = slaveCost(slave, false, !App.Data.misc.lawlessMarkets.includes(slaveMarket), false, true); + let cost = costObj.cost; if (V.slavesSeen > V.slaveMarketLimit) { cost += cost * ((V.slavesSeen - V.slaveMarketLimit) * 0.1); } @@ -37,7 +40,7 @@ App.Markets.purchaseFramework = function(slaveMarket, {sTitleSingular = "slave", } console.log("CostMod: ", costMod); cost = 500 * Math.trunc(cost / 500); - return cost; + return {cost, report: costObj.report}; } function choices() { diff --git a/src/npc/startingGirls/startingGirlsPassage.js b/src/npc/startingGirls/startingGirlsPassage.js index 6e0fb5b4d5b8eaac3f9c3a64692d264c3a5f2ec8..0872b6e50f28f81a2ef4a7147d980e67c48f5221 100644 --- a/src/npc/startingGirls/startingGirlsPassage.js +++ b/src/npc/startingGirls/startingGirlsPassage.js @@ -11,7 +11,7 @@ App.StartingGirls.passage = function() { if (V.PC.dick !== 0 && V.PC.vagina !== -1 && (V.seeDicks !== 0 || V.makeDicks === 1)) { r.push(`Since you have both a penis and a vagina yourself, you've obviously had access to a source of advanced surgery and organ farming. <span class="skill player">Slaves get a smaller cost increase here for having both penises and vaginas, and for having both testicles and ovaries.</span>`); } - if (V.PC.career === "slaver" || V.PC.career === "slave overseer" || V.PC.career === "slave tender") { + if (isPCCareerInCategory("slaver")) { r.push(`Since you`); if (V.PC.career === "slaver") { r.push(`personally saw to the capture, breaking and or training of`);