From a912a36e29524f4f1e2c7cfc2baea9b4ba2cbe47 Mon Sep 17 00:00:00 2001
From: Pregmodder <pregmodder@gmail.com>
Date: Thu, 1 Sep 2022 09:39:39 -0400
Subject: [PATCH] SlimnessFS Policy Addition

---
 devTools/types/FC/arcology.d.ts   |  2 +-
 js/003-data/policiesData.js       | 21 +++++++++++++++++++++
 src/endWeek/player/prDiet.js      |  4 ++--
 src/endWeek/player/prPregnancy.js |  2 ++
 src/endWeek/saDiet.js             |  4 ++--
 src/endWeek/saHormonesEffects.js  |  6 ++++--
 src/endWeek/saPregnancy.js        |  2 ++
 src/js/economyJS.js               |  6 ++++--
 8 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/devTools/types/FC/arcology.d.ts b/devTools/types/FC/arcology.d.ts
index 1ce42f9e1bc..f116eae9487 100644
--- a/devTools/types/FC/arcology.d.ts
+++ b/devTools/types/FC/arcology.d.ts
@@ -50,7 +50,7 @@ declare namespace FC {
 		};
 		FSSlimnessEnthusiast: {
 			noun: "Slimness Enthusiasm", adj: "Slimness Enthusiast", deco: "Slimness Enthusiast",
-			research: true, SMR: true, policy: "Law", choice: undefined
+			research: true, SMR: true, policy: "Law" | "FoodLaw", choice: undefined
 		};
 		FSAssetExpansionist: {
 			noun: "Asset Expansionism", adj: "Asset Expansionist", deco: "Asset Expansionist",
diff --git a/js/003-data/policiesData.js b/js/003-data/policiesData.js
index e5ad057b92a..cb4d218c4ad 100644
--- a/js/003-data/policiesData.js
+++ b/js/003-data/policiesData.js
@@ -1237,6 +1237,7 @@ App.Data.Policies.Selection = {
 						V.seeDicks !== 0 &&
 						V.arcologies[0].FSGenderRadicalist > 60 &&
 						V.arcologies[0].FSSlimnessEnthusiastLaw === 0 &&
+						V.arcologies[0].FSSlimnessFoodLaw === 0 &&
 						V.arcologies[0].FSGenderRadicalistLawFuta === 0
 					);
 				},
@@ -1583,6 +1584,25 @@ App.Data.Policies.Selection = {
 			}
 		],
 	},
+	"arcologies[0].FSSlimnessFoodLaw": [
+		{
+			title: "Asset Slimming Food",
+			titleClass: "lime",
+			text: "slave food production will be required to follow a recipe that keeps chattel nice and trim, reducing the growth of disgusting flesh on their T&A.",
+			activatedText: "you have standardized a slave food recipe to keep your chattel nice and trim, reducing the amount of oversized T&A in the arcology.",
+			get requirements() {
+				return (
+					V.arcologies[0].FSGenderRadicalistLawBeauty === 0 &&
+					V.arcologies[0].FSGenderFundamentalistLawBeauty === 0 &&
+					V.arcologies[0].FSGenderRadicalistLawFuta !== 3 &&
+					V.arcologies[0].FSHedonisticDecadenceLaw2 === 0 &&
+					V.arcologies[0].FSPhysicalIdealistLaw === 0 &&
+					V.arcologies[0].FSSlimnessEnthusiast > 20
+				);
+			},
+			note: `Slaves will struggle to grow beyond the ideal amount of T&A. `
+		}
+	],
 	FSAssetExpansionist: {
 		"arcologies[0].FSAssetExpansionistSMR": [
 			{
@@ -1693,6 +1713,7 @@ App.Data.Policies.Selection = {
 				get requirements() {
 					return (
 						V.arcologies[0].FSSlimnessEnthusiastLaw === 0 &&
+						V.arcologies[0].FSSlimnessFoodLaw === 0 &&
 						V.arcologies[0].FSGenderRadicalistLawBeauty === 0 &&
 						V.arcologies[0].FSGenderFundamentalistLawBeauty === 0 &&
 						V.arcologies[0].FSPhysicalIdealistLaw === 0 &&
diff --git a/src/endWeek/player/prDiet.js b/src/endWeek/player/prDiet.js
index dc428a71812..1cb3472e50f 100644
--- a/src/endWeek/player/prDiet.js
+++ b/src/endWeek/player/prDiet.js
@@ -827,7 +827,7 @@ App.EndWeek.Player.diet = function(PC = V.PC) {
 			roll = 75;
 			target = Math.trunc(Math.clamp(weightMod * 2 - (boobSize - growthGoal) / 20, 0, 68));
 		}
-		if (PC.geneMods.NCS === 1) {
+		if (PC.geneMods.NCS === 1 || (V.arcologies[0].FSSlimnessFoodLaw === 1 && !canEatFood(PC))) {
 			roll *= 2;
 		}
 		// PC food is not laced with hormones normally, so galactorrhea is not triggered here.
@@ -844,7 +844,7 @@ App.EndWeek.Player.diet = function(PC = V.PC) {
 			roll = 80000;
 			target = Math.trunc(Math.clamp(weightMod * 1000 - (buttSize * 1000 - growthGoal) * 4, 0, 72000));
 		}
-		if (PC.geneMods.NCS === 1) {
+		if (PC.geneMods.NCS === 1 || (V.arcologies[0].FSSlimnessFoodLaw === 1 && !canEatFood(PC))) {
 			roll *= 2;
 		}
 		if (random(1, roll) <= target) {
diff --git a/src/endWeek/player/prPregnancy.js b/src/endWeek/player/prPregnancy.js
index 40e78c80fe0..a3197867d82 100644
--- a/src/endWeek/player/prPregnancy.js
+++ b/src/endWeek/player/prPregnancy.js
@@ -269,6 +269,7 @@ App.EndWeek.Player.pregnancy = function(PC = V.PC) {
 
 	function pregnancyPhysicalEffects() {
 		let boobTarget;
+		const slimnessFoodMod = (V.arcologies[0].FSSlimnessFoodLaw === 1 && !canEatFood(PC)) ? 0.5 : 1;
 		if (PC.geneMods.NCS === 1) {
 			// NCS: always working against secondary sexual characteristics even in pregnancies.
 			boobTarget = 0;
@@ -322,6 +323,7 @@ App.EndWeek.Player.pregnancy = function(PC = V.PC) {
 			}
 		}
 		boobTarget *= gigantomastiaMod;
+		boobTarget *= slimnessFoodMod;
 		if (PC.geneMods.NCS === 0) {
 			if (PC.pregType >= 30) {
 				if (PC.weight <= 65) {
diff --git a/src/endWeek/saDiet.js b/src/endWeek/saDiet.js
index 933a49ebb64..e3032f2ab03 100644
--- a/src/endWeek/saDiet.js
+++ b/src/endWeek/saDiet.js
@@ -1443,7 +1443,7 @@ App.SlaveAssignment.diet = function saDiet(slave) {
 			roll = 75;
 			target = Math.trunc(Math.clamp(weightGain * 2 - (boobSize - growthGoal) / 20, 0, 68));
 		}
-		if (slave.geneMods.NCS === 1) {
+		if (slave.geneMods.NCS === 1 || V.arcologies[0].FSSlimnessFoodLaw === 1) {
 			roll *= 2;
 		}
 		if (random(1, roll) <= target) {
@@ -1464,7 +1464,7 @@ App.SlaveAssignment.diet = function saDiet(slave) {
 			roll = 80000;
 			target = Math.trunc(Math.clamp(weightGain * 1000 - (buttSize * 1000 - growthGoal) * 4, 0, 72000));
 		}
-		if (slave.geneMods.NCS === 1) {
+		if (slave.geneMods.NCS === 1 || V.arcologies[0].FSSlimnessFoodLaw === 1) {
 			roll *= 2;
 		}
 		if (random(1, roll) <= target) {
diff --git a/src/endWeek/saHormonesEffects.js b/src/endWeek/saHormonesEffects.js
index 053971b0012..d573416597f 100644
--- a/src/endWeek/saHormonesEffects.js
+++ b/src/endWeek/saHormonesEffects.js
@@ -318,9 +318,11 @@ App.SlaveAssignment.hormonesEffects = function saHormonesEffects(slave) {
 			let normBreasts = 0;
 			let normButt = 0;
 			if (slave.hormoneBalance > 30 && slave.geneMods.NCS !== 1) {
+				const slimModBreasts = (V.arcologies[0].FSSlimnessFoodLaw === 1) ? 0.45 : 1; // 600 average breast target, 270 target, 475 @ 350 hormone
+				const slimModButts = (V.arcologies[0].FSSlimnessFoodLaw === 1) ? 0.6 : 1; // 2.5 average butt, 1.5 target
 				/* 'Expected' breast size based on weight for feminine-bodied slaves */
-				normBreasts = Math.trunc((100 + (slave.weight + 100) * 5 + 2 * slave.lactationAdaptation) * (0.85 + slave.hormoneBalance / 400) * gigantomastiaMod);
-				normButt = ((slave.weight + 100) * 0.025 * (0.9 + slave.hormoneBalance / 600) * (rearLipedemaMod / 2 + 1));
+				normBreasts = Math.trunc((100 + (slave.weight + 100) * 5 + 2 * slave.lactationAdaptation) * (0.85 + slave.hormoneBalance / 400) * gigantomastiaMod * slimModBreasts);
+				normButt = ((slave.weight + 100) * 0.025 * (0.9 + slave.hormoneBalance / 600) * (rearLipedemaMod / 2 + 1) * slimModButts);
 			}
 
 			if (slave.hormoneBalance >= 350) {
diff --git a/src/endWeek/saPregnancy.js b/src/endWeek/saPregnancy.js
index 5be39258e40..fe68632c4ce 100644
--- a/src/endWeek/saPregnancy.js
+++ b/src/endWeek/saPregnancy.js
@@ -615,6 +615,7 @@ App.SlaveAssignment.pregnancy = function saPregnancy(slave) {
 	 */
 	function pregnancyPhysicalEffects(slave) {
 		let boobTarget;
+		const slimnessFoodMod = V.arcologies[0].FSSlimnessFoodLaw === 1 ? 0.5 : 1;
 		if (slave.geneMods.NCS === 1) {
 			// NCS: always working against secondary sexual characteristics even in pregnancies.
 			boobTarget = 0;
@@ -668,6 +669,7 @@ App.SlaveAssignment.pregnancy = function saPregnancy(slave) {
 			}
 		}
 		boobTarget *= gigantomastiaMod;
+		boobTarget *= slimnessFoodMod;
 		if (slave.geneMods.NCS === 0) {
 			const boobSize = slave.boobs - slave.boobsImplant - slave.boobsMilk;
 			const buttSize = slave.butt - slave.buttImplant;
diff --git a/src/js/economyJS.js b/src/js/economyJS.js
index 9911372e1d3..602cfc5b41f 100644
--- a/src/js/economyJS.js
+++ b/src/js/economyJS.js
@@ -806,7 +806,8 @@ globalThis.calculateCosts = (function() {
 	}
 
 	function getPCFoodCosts() {
-		const foodCost = V.mods.food.cost;
+		const slimnessFoodMod = V.arcologies[0].FSSlimnessFoodLaw === 1 && !canEatFood(V.PC) ? 1.15 : 1;
+		const foodCost = V.mods.food.cost * slimnessFoodMod;
 		let costs = 0;
 		// Well this ought to be a mess.
 		// Basic food costs
@@ -1124,8 +1125,9 @@ globalThis.getSlaveCostArray = function(s) {
 	let cost = 0;
 	let retval = [];
 	let t = "";
+	const slimnessFoodMod = V.arcologies[0].FSSlimnessFoodLaw === 1 ? 1.15 : 1;
 	const rulesCost = V.rulesCost;
-	const foodCost = V.mods.food.cost;
+	const foodCost = V.mods.food.cost * slimnessFoodMod;
 	const drugsCost = V.drugsCost;
 
 	// Living expenses
-- 
GitLab