From 30949404b136b071e9a80b2f5a4d9ed2c034e898 Mon Sep 17 00:00:00 2001
From: Arkerthan <arkerthan@gmail.com>
Date: Wed, 18 Sep 2019 14:04:34 +0200
Subject: [PATCH 1/8] use addProsthetic instead of direct access

---
 src/uncategorized/multiImplant.tw  | 2 +-
 src/uncategorized/remoteSurgery.tw | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/uncategorized/multiImplant.tw b/src/uncategorized/multiImplant.tw
index 210e0eb9a3e..88f76ef94c0 100644
--- a/src/uncategorized/multiImplant.tw
+++ b/src/uncategorized/multiImplant.tw
@@ -1011,7 +1011,7 @@ You head down to your <<if $surgeryUpgrade == 1>>heavily upgraded and customized
 			<<set _p = $adjustProsthetics[_k]>>
 			<<if _p.slaveID == $activeSlave.ID && _p.workLeft <= 0>>
 				<<set $adjustProsthetics.splice(_k, 1), _k-->>
-				<<set $activeSlave.readyProsthetics.push({id: _p.id})>>
+				<<set addProsthetic($activeSlave, _p.id)>>
 				<br><hr>
 				<<switch _p.id>>
 				<<case "ocular">>
diff --git a/src/uncategorized/remoteSurgery.tw b/src/uncategorized/remoteSurgery.tw
index c9981dfe7a8..e1e253978dd 100644
--- a/src/uncategorized/remoteSurgery.tw
+++ b/src/uncategorized/remoteSurgery.tw
@@ -8,7 +8,7 @@
 <<if $adjustProstheticsCompleted > 0>>
 	<<set $adjustProsthetics = $adjustProsthetics.filter(function(p) {
 		if (p.workLeft <= 0 && p.slaveID == $activeSlave.ID) {
-			$activeSlave.readyProsthetics.push({id: p.id});
+			addProsthetic($activeSlave, p.id);
 			$adjustProstheticsCompleted--;
 			return false;
 		}
-- 
GitLab


From 692509a42d3a6a07c3e5b7059f59af92be07bd09 Mon Sep 17 00:00:00 2001
From: Arkerthan <arkerthan@gmail.com>
Date: Fri, 20 Sep 2019 13:51:04 +0200
Subject: [PATCH 2/8] fix JSDoc

---
 src/js/itemAvailability.js |  2 +-
 src/js/surgery.js          | 10 +++++-----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/js/itemAvailability.js b/src/js/itemAvailability.js
index a43564b829d..26237b5bdbe 100644
--- a/src/js/itemAvailability.js
+++ b/src/js/itemAvailability.js
@@ -170,7 +170,7 @@ window.isItemAccessible = function(string) {
 	}
 };
 
-/*
+/**
  * @param {App.Entity.SlaveState} slave
  * @param {string} prosthetic
  * @returns {boolean}
diff --git a/src/js/surgery.js b/src/js/surgery.js
index dcd5c5a92c8..3efd07bcafc 100644
--- a/src/js/surgery.js
+++ b/src/js/surgery.js
@@ -453,11 +453,11 @@ App.Medicine.Surgery.sizingProcedures = function() {
 }();
 
 /**
-* Clean up extremities on removal or piercings, tats, and brands
-* For limbs use removeLimbs()
-* @param {App.Entity.SlaveState} slave
-* @param {string} part
-*/
+ * Clean up extremities on removal or piercings, tats, and brands
+ * For limbs use removeLimbs()
+ * @param {App.Entity.SlaveState} slave
+ * @param {string} part
+ */
 window.surgeryAmp = function(slave, part) {
 	switch (part) {
 		case "left ear":
-- 
GitLab


From c7c822bdd723db68072ac7166d8b9a9b8a29b9b1 Mon Sep 17 00:00:00 2001
From: Arkerthan <arkerthan@gmail.com>
Date: Fri, 20 Sep 2019 15:27:32 +0200
Subject: [PATCH 3/8] add limb prosthetic conversion functions

---
 src/js/itemAvailability.js | 43 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/src/js/itemAvailability.js b/src/js/itemAvailability.js
index 26237b5bdbe..b70979fde29 100644
--- a/src/js/itemAvailability.js
+++ b/src/js/itemAvailability.js
@@ -188,3 +188,46 @@ window.addProsthetic = function(slave, prosthetic) {
 		slave.readyProsthetics.push({id: prosthetic});
 	}
 };
+
+/**
+ * @param {string} prosthetic
+ * @returns {number}
+ */
+window.prostheticToLimb = function(prosthetic) {
+	switch (prosthetic) {
+		case "basicL":
+			return 2;
+		case "sexL":
+			return 3;
+		case "beautyL":
+			return 4;
+		case "combatL":
+			return 5;
+		case "cyberneticL":
+			return 6;
+		default:
+			return 0;
+	}
+};
+
+/**
+ *
+ * @param {number} limb
+ * @returns {string}
+ */
+window.limbToProsthetic = function(limb) {
+	switch (limb) {
+		case 2:
+			return "basicL";
+		case 3:
+			return "sexL";
+		case 4:
+			return "beautyL";
+		case 5:
+			return "combatL";
+		case 6:
+			return "cyberneticL";
+		default:
+			return "";
+	}
+};
-- 
GitLab


From a428148005cca8a92fac64cd26fb86d79c7ef342 Mon Sep 17 00:00:00 2001
From: Arkerthan <arkerthan@gmail.com>
Date: Fri, 20 Sep 2019 15:27:57 +0200
Subject: [PATCH 4/8] add findProsthetic()

---
 src/js/itemAvailability.js | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/js/itemAvailability.js b/src/js/itemAvailability.js
index b70979fde29..b2ced24f3d3 100644
--- a/src/js/itemAvailability.js
+++ b/src/js/itemAvailability.js
@@ -189,6 +189,15 @@ window.addProsthetic = function(slave, prosthetic) {
 	}
 };
 
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @param {string} prosthetic
+ * @returns {{}}
+ */
+window.findProsthetic = function(slave, prosthetic) {
+	return slave.readyProsthetics.find(p => p.id === prosthetic);
+};
+
 /**
  * @param {string} prosthetic
  * @returns {number}
-- 
GitLab


From f4db24a890f2354405b5ca0664321f186f52c4b5 Mon Sep 17 00:00:00 2001
From: Arkerthan <arkerthan@gmail.com>
Date: Fri, 20 Sep 2019 15:28:25 +0200
Subject: [PATCH 5/8] add readyLimbs to slave skeleton

---
 src/js/SlaveState.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js
index f0e8655811e..81613472dff 100644
--- a/src/js/SlaveState.js
+++ b/src/js/SlaveState.js
@@ -2448,6 +2448,7 @@ App.Entity.SlaveState = class SlaveState {
 		return {
 			arm: {left: {}, right: {}},
 			leg: {left: {}, right: {}},
+			readyProsthetics: [], // yes, not an object, but needed for hero slaves
 			counter: {},
 			brand: {},
 			scar: {},
-- 
GitLab


From b87d31c8d33bfef348a7e27675f5947ead308dc7 Mon Sep 17 00:00:00 2001
From: Arkerthan <arkerthan@gmail.com>
Date: Fri, 20 Sep 2019 15:32:24 +0200
Subject: [PATCH 6/8] add bodymod support to prosthetics

---
 src/js/itemAvailability.js | 16 +++++++++++++-
 src/js/surgery.js          | 43 +++++++++++++++++++++++++-------------
 2 files changed, 44 insertions(+), 15 deletions(-)

diff --git a/src/js/itemAvailability.js b/src/js/itemAvailability.js
index b2ced24f3d3..130127c6497 100644
--- a/src/js/itemAvailability.js
+++ b/src/js/itemAvailability.js
@@ -185,7 +185,21 @@ window.isProstheticAvailable = function(slave, prosthetic) {
  */
 window.addProsthetic = function(slave, prosthetic) {
 	if (!isProstheticAvailable(slave, prosthetic)) {
-		slave.readyProsthetics.push({id: prosthetic});
+		let limb = prostheticToLimb(prosthetic);
+		if (limb > 0) {
+			let p = {
+				id: prosthetic,
+				arm: {left: new App.Entity.LimbState(), right: new App.Entity.LimbState()},
+				leg: {left: new App.Entity.LimbState(), right: new App.Entity.LimbState()}
+			};
+			p.arm.left.type = limb;
+			p.arm.right.type = limb;
+			p.leg.left.type = limb;
+			p.leg.right.type = limb;
+			slave.readyProsthetics.push(p);
+		} else {
+			slave.readyProsthetics.push({id: prosthetic});
+		}
 	}
 };
 
diff --git a/src/js/surgery.js b/src/js/surgery.js
index 3efd07bcafc..404641a3d10 100644
--- a/src/js/surgery.js
+++ b/src/js/surgery.js
@@ -527,10 +527,19 @@ window.surgeryAmp = function(slave, part) {
  * @param {string} limb
  */
 window.removeLimbs = function(slave, limb) {
-	// TODO: add bodymod support for prosthetics
+	function remove(limb, side) {
+		const prosthetic = findProsthetic(slave, limbToProsthetic(slave[limb][side].type));
+
+		if (prosthetic) {
+			prosthetic[limb][side] = slave[limb][side];
+		}
+
+		slave[limb][side] = null;
+	}
+
 	switch (limb) {
 		case "left arm":
-			slave.arm.left = null;
+			remove("arm", "left");
 			delete slave.brand["left upper arm"];
 			delete slave.brand["left lower arm"];
 			delete slave.brand["left wrist"];
@@ -542,7 +551,7 @@ window.removeLimbs = function(slave, limb) {
 			}
 			break;
 		case "right arm":
-			slave.arm.right = null;
+			remove("arm", "right");
 			delete slave.brand["right upper arm"];
 			delete slave.brand["right lower arm"];
 			delete slave.brand["right wrist"];
@@ -554,7 +563,7 @@ window.removeLimbs = function(slave, limb) {
 			}
 			break;
 		case "left leg":
-			slave.leg.left = null;
+			remove("leg", "left");
 			delete slave.brand["left thigh"];
 			delete slave.brand["left calf"];
 			delete slave.brand["left ankle"];
@@ -568,7 +577,7 @@ window.removeLimbs = function(slave, limb) {
 			}
 			break;
 		case "right leg":
-			slave.leg.right = null;
+			remove("leg", "right");
 			delete slave.brand["right thigh"];
 			delete slave.brand["right calf"];
 			delete slave.brand["right ankle"];
@@ -601,23 +610,29 @@ window.removeLimbs = function(slave, limb) {
  * @param {number} id
  */
 window.attachLimbs = function(slave, limb, id) {
-	// TODO: add support for body mods
+	function attach(limb, side) {
+		let prosthetic = findProsthetic(slave, limbToProsthetic(id));
+
+		if (prosthetic) {
+			slave[limb][side] = prosthetic[limb][side];
+		} else {
+			slave[limb][side] = new App.Entity.LimbState();
+			slave[limb][side].type = id;
+		}
+	}
+
 	switch (limb) {
 		case "left arm":
-			slave.arm.left = new App.Entity.LimbState();
-			slave.arm.left.type = id;
+			attach("arm", "left");
 			break;
 		case "right arm":
-			slave.arm.right = new App.Entity.LimbState();
-			slave.arm.right.type = id;
+			attach("arm", "right");
 			break;
 		case "left leg":
-			slave.leg.left = new App.Entity.LimbState();
-			slave.leg.left.type = id;
+			attach("leg", "left");
 			break;
 		case "right leg":
-			slave.leg.right = new App.Entity.LimbState();
-			slave.leg.right.type = id;
+			attach("leg", "right");
 			break;
 		case "all":
 			attachLimbs(slave, "left arm", id);
-- 
GitLab


From c28e53e5760ebd74e68a0739289f703c385c8918 Mon Sep 17 00:00:00 2001
From: Arkerthan <arkerthan@gmail.com>
Date: Fri, 20 Sep 2019 15:50:50 +0200
Subject: [PATCH 7/8] increase version

---
 src/002-config/fc-version.js                | 4 ++--
 src/uncategorized/BackwardsCompatibility.tw | 9 +++++----
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js
index 4d275c841cb..70b8bee2c7a 100644
--- a/src/002-config/fc-version.js
+++ b/src/002-config/fc-version.js
@@ -1,8 +1,8 @@
 App.Version = {
 	base: "0.10.8",
 	pmod: "2.8.X",
-	release: 1051,
+	release: 1052,
 };
 
 /* Use release as save version */
-Config.saves.version = App.Version.release;
\ No newline at end of file
+Config.saves.version = App.Version.release;
diff --git a/src/uncategorized/BackwardsCompatibility.tw b/src/uncategorized/BackwardsCompatibility.tw
index 98c46e1fd57..f9d7bc0acb1 100644
--- a/src/uncategorized/BackwardsCompatibility.tw
+++ b/src/uncategorized/BackwardsCompatibility.tw
@@ -4001,10 +4001,6 @@ Done<br>
 	<</if>>
 <</if>>
 
-<<if $releaseID < App.Version.release>>
-	<<set $releaseID = App.Version.release>>
-<</if>>
-
 <<if def $activeArcology>>
 	<<unset $activeArcology>>
 <</if>>
@@ -4137,5 +4133,10 @@ Done<br>
 	<br>Fixed NaN FS value for FSStatuesqueGlorification
 <</if>>
 
+
+/* leave this at the bottom of BC */
+<<if $releaseID < App.Version.release>>
+	<<set $releaseID = App.Version.release>>
+<</if>>
 /* reset NaNArray after BC is run */
 <<set $NaNArray = findNaN()>>
-- 
GitLab


From 8a58bc7113a4cb09372e4ed5bc497ab59839d26d Mon Sep 17 00:00:00 2001
From: Arkerthan <arkerthan@gmail.com>
Date: Fri, 20 Sep 2019 15:56:03 +0200
Subject: [PATCH 8/8] BC for prosthetic bodymod support

---
 src/pregmod/widgets/pregmodWidgets.tw | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/pregmod/widgets/pregmodWidgets.tw b/src/pregmod/widgets/pregmodWidgets.tw
index 4d112836bd7..4aa21899783 100644
--- a/src/pregmod/widgets/pregmodWidgets.tw
+++ b/src/pregmod/widgets/pregmodWidgets.tw
@@ -570,6 +570,12 @@
 	<</if>>
 <</if>>
 
+<<if $releaseID < 1052>>
+	<<set _prosthetics = $args[0].readyProsthetics, $args[0].readyProsthetics = []>>
+	<<for _p range _prosthetics>>
+		<<run addProsthetic($args[0], _p.id)>>
+	<</for>>
+<</if>>
 
 <</widget>>
 
-- 
GitLab