From c5e1d1e4ec374e0b0cc2e6211b0c1e1a27cd601d Mon Sep 17 00:00:00 2001
From: Jones <Jones>
Date: Mon, 23 Dec 2019 20:19:48 +0100
Subject: [PATCH] Update economyJS.js

---
 src/js/economyJS.js | 41 +++++++++++++++++++++++++++++++++++++----
 1 file changed, 37 insertions(+), 4 deletions(-)

diff --git a/src/js/economyJS.js b/src/js/economyJS.js
index 50babb6ae15..d6748a44763 100644
--- a/src/js/economyJS.js
+++ b/src/js/economyJS.js
@@ -137,7 +137,7 @@ window.calculateCosts = (function() {
 
 	// slave expenses
 	function predictTotalSlaveCosts() {
-		const V = Slave.variables;
+		const V = State.variables;
 		let loopCosts = 0;
 		let number = 0;
 		for (const slave of V.slaves) {
@@ -159,14 +159,47 @@ window.calculateCosts = (function() {
 	}
 
 	function getTotalSlaveCosts() {
+		const V = State.variables;
 		let slaveCost = 0;
 		let slaveCostMinor = 0;
-		for (const slave of State.variables.slaves) {
+		let numberServed = 0;
+		let loopCosts = 0;
+
+		// Figure out how many slaves are effectively getting their upkeep reduced by 20%
+		V.ServQiIDs.forEach(ID => {
+			numberServed += getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]);
+		});
+		V.JobIDArray["be a servant"].forEach(ID => {
+			numberServed += getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]);
+		});
+
+		// Find the total slave upkeep and pay for it
+		for (const slave of V.slaves) {
 			slaveCost = getSlaveCost(slave);
+			loopCosts += slaveCost;
 			cashX(forceNeg(slaveCost), "slaveUpkeep", slave);
-			slaveCostMinor = getSlaveMinorCosts(slave);
-			cashX(Math.abs(slaveCostMinor), "houseServant", slave);
 		}
+
+		// Calculate the servant reduction and credit them for it
+		const reducibleUpkeep = Math.trunc(loopCosts * 0.2);
+		V.ServQiIDs.forEach(ID => {
+			if (V.slaves.length > numberServed) {
+				slaveCostMinor = Math.trunc(reducibleUpkeep / V.slaves.length * getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]));
+				cashX(Math.abs(slaveCostMinor), "houseServant", V.slaves[V.slaveIndices[ID]]);
+			} else {
+				slaveCostMinor = Math.trunc(reducibleUpkeep / numberServed * getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]));
+				cashX(Math.abs(slaveCostMinor), "houseServant", V.slaves[V.slaveIndices[ID]]);
+			}
+		});
+		V.JobIDArray["be a servant"].forEach(ID => {
+			if (V.slaves.length > numberServed) {
+				slaveCostMinor = Math.trunc(reducibleUpkeep / V.slaves.length * getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]));
+				cashX(Math.abs(slaveCostMinor), "houseServant", V.slaves[V.slaveIndices[ID]]);
+			} else {
+				slaveCostMinor = Math.trunc(reducibleUpkeep / numberServed * getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]));
+				cashX(Math.abs(slaveCostMinor), "houseServant", V.slaves[V.slaveIndices[ID]]);
+			}
+		});
 	// nothing to return, cashX already billed.
 	}
 
-- 
GitLab