From a71b6e5cadede4fd9d9e169892f1b323b93d3427 Mon Sep 17 00:00:00 2001
From: Arkerthan <arkerthan@mailbox.org>
Date: Mon, 21 Feb 2022 14:49:53 +0100
Subject: [PATCH] Split limbs into arms and legs in preparation of body mod
 changes

---
 devTools/types/FC/human.d.ts                  | 11 +++----
 .../updateCustomSlaveOrder.js                 |  4 +--
 src/facilities/nursery/utils/nurseryUtils.js  | 16 +++++-----
 src/js/CustomSlave.js                         |  8 ++---
 src/js/SlaveState.js                          | 30 ++++++++++++++-----
 src/js/itemAvailability.js                    |  4 +--
 .../specificMarkets/customSlaveMarket.js      |  3 +-
 src/npc/children/ChildState.js                |  8 ++---
 src/npc/startingGirls/startingGirls.js        |  6 +++-
 src/npc/surgery/surgery.js                    | 10 ++++++-
 src/player/js/PlayerState.js                  |  8 ++---
 11 files changed, 69 insertions(+), 39 deletions(-)

diff --git a/devTools/types/FC/human.d.ts b/devTools/types/FC/human.d.ts
index 8cc3ae8aad6..23ef528c941 100644
--- a/devTools/types/FC/human.d.ts
+++ b/devTools/types/FC/human.d.ts
@@ -464,16 +464,17 @@ declare global {
 		}
 		//#endregion
 
-		type LimbState = InstanceType<typeof App.Entity.LimbState>;
+		type ArmState = InstanceType<typeof App.Entity.ArmState>;
+		type LegState = InstanceType<typeof App.Entity.LegState>;
 
 		interface LimbsState {
 			arm: {
-				left: LimbState;
-				right: LimbState;
+				left: ArmState;
+				right: ArmState;
 			};
 			leg: {
-				left: LimbState,
-				right: LimbState;
+				left: LegState,
+				right: LegState;
 			};
 			PLimb: number;
 		}
diff --git a/src/data/backwardsCompatibility/updateCustomSlaveOrder.js b/src/data/backwardsCompatibility/updateCustomSlaveOrder.js
index d58dec28147..fb3c0ac2b4d 100644
--- a/src/data/backwardsCompatibility/updateCustomSlaveOrder.js
+++ b/src/data/backwardsCompatibility/updateCustomSlaveOrder.js
@@ -6,7 +6,7 @@ App.Update.CustomSlaveOrder = function(customSlaveOrder) {
 		if (jsDef(customSlaveOrder.amp) && customSlaveOrder.amp === 1) {
 			customSlaveOrder.leg = {left: null, right: null};
 		} else {
-			customSlaveOrder.leg = {left: new App.Entity.LimbState(), right: new App.Entity.LimbState()};
+			customSlaveOrder.leg = {left: new App.Entity.LegState(), right: new App.Entity.LegState()};
 		}
 	}
 
@@ -14,7 +14,7 @@ App.Update.CustomSlaveOrder = function(customSlaveOrder) {
 		if (jsDef(customSlaveOrder.amp) && customSlaveOrder.amp === 1) {
 			customSlaveOrder.arm = {left: null, right: null};
 		} else {
-			customSlaveOrder.arm = {left: new App.Entity.LimbState(), right: new App.Entity.LimbState()};
+			customSlaveOrder.arm = {left: new App.Entity.LegState(), right: new App.Entity.LegState()};
 		}
 	}
 
diff --git a/src/facilities/nursery/utils/nurseryUtils.js b/src/facilities/nursery/utils/nurseryUtils.js
index 8b363c2b517..e5672420220 100644
--- a/src/facilities/nursery/utils/nurseryUtils.js
+++ b/src/facilities/nursery/utils/nurseryUtils.js
@@ -72,12 +72,12 @@ App.Facilities.Nursery.infantToChild = function infantToChild(child) {
 	child.accent = 0;
 	child.ageImplant = 0;
 	child.arm = {
-		left: new App.Entity.LimbState(),
-		right: new App.Entity.LimbState()
+		left: new App.Entity.ArmState(),
+		right: new App.Entity.LegState()
 	};
 	child.leg = {
-		left: new App.Entity.LimbState(),
-		right: new App.Entity.LimbState()
+		left: new App.Entity.LegState(),
+		right: new App.Entity.LegState()
 	};
 	child.analArea = 0;
 	child.anus = 0;
@@ -631,12 +631,12 @@ App.Facilities.Nursery.newChild = function newChild(child) {
 	/* eslint-enable */
 
 	child.arm = {
-		left: new App.Entity.LimbState(),
-		right: new App.Entity.LimbState()
+		left: new App.Entity.ArmState(),
+		right: new App.Entity.ArmState()
 	};
 	child.leg = {
-		left: new App.Entity.LimbState(),
-		right: new App.Entity.LimbState()
+		left: new App.Entity.LegState(),
+		right: new App.Entity.LegState()
 	};
 
 	if (V.surnamesForbidden === 1) {
diff --git a/src/js/CustomSlave.js b/src/js/CustomSlave.js
index 8c88013928a..b519a0589ef 100644
--- a/src/js/CustomSlave.js
+++ b/src/js/CustomSlave.js
@@ -156,14 +156,14 @@ App.Entity.CustomSlaveOrder = class CustomSlaveOrder {
 		this.nationality = "Stateless";
 
 		/** desired left and right leg state
-		 * @type {{left: App.Entity.LimbState, right: App.Entity.LimbState}}
+		 * @type {{left: App.Entity.LegState, right: App.Entity.LegState}}
 		 */
-		this.leg = {left: new App.Entity.LimbState(), right: new App.Entity.LimbState()};
+		this.leg = {left: new App.Entity.LegState(), right: new App.Entity.LegState()};
 
 		/** desired left and right arm state
-		 * @type {{left: App.Entity.LimbState, right: App.Entity.LimbState}}
+		 * @type {{left: App.Entity.ArmState, right: App.Entity.ArmState}}
 		 */
-		this.arm = {left: new App.Entity.LimbState(), right: new App.Entity.LimbState()};
+		this.arm = {left: new App.Entity.ArmState(), right: new App.Entity.ArmState()};
 
 		/** desired eye state
 		 * Only the "vision" property is used, all others are ignored
diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js
index 2874a159b17..3ae6e600cae 100644
--- a/src/js/SlaveState.js
+++ b/src/js/SlaveState.js
@@ -428,7 +428,6 @@ App.Entity.genitalPiercingState = class extends App.Entity.piercingState {
 	}
 };
 
-
 App.Entity.piercingStateRA = class {
 	constructor() {
 		/** @type {FC.PiercingType} */
@@ -449,7 +448,6 @@ App.Entity.genitalPiercingStateRA = class extends App.Entity.piercingStateRA {
 	}
 };
 
-
 App.Entity.completePiercingState = class {
 	constructor() {
 		this.ear = new App.Entity.piercingState();
@@ -504,6 +502,24 @@ App.Entity.LimbState = class LimbState {
 	}
 };
 
+/**
+ * To ensure that all new arms contain expected attributes
+ */
+App.Entity.ArmState = class extends App.Entity.LimbState {
+	constructor() {
+		super();
+	}
+};
+
+/**
+ * To ensure that all new legs contain expected attributes
+ */
+App.Entity.LegState = class extends App.Entity.LimbState {
+	constructor() {
+		super();
+	}
+};
+
 /**
  * To ensure that all new eyes contain expected attributes
  */
@@ -940,19 +956,19 @@ App.Entity.SlaveState = class SlaveState {
 		 * * 3: quadruped interface
 		 */
 		this.PLimb = 0;
-		/*
+		/**
 		 * legs of the slave
 		 */
 		this.leg = {
-			left: new App.Entity.LimbState(),
-			right: new App.Entity.LimbState()
+			left: new App.Entity.LegState(),
+			right: new App.Entity.LegState()
 		};
 		/**
 		 * arms of the slave
 		 */
 		this.arm = {
-			left: new App.Entity.LimbState(),
-			right: new App.Entity.LimbState()
+			left: new App.Entity.ArmState(),
+			right: new App.Entity.ArmState()
 		};
 		/** are heels clipped
 		 * @type {FC.Bool}
diff --git a/src/js/itemAvailability.js b/src/js/itemAvailability.js
index 8b7efc871ff..26b33ee2984 100644
--- a/src/js/itemAvailability.js
+++ b/src/js/itemAvailability.js
@@ -245,8 +245,8 @@ globalThis.addProsthetic = function(slave, 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()}
+				arm: {left: new App.Entity.ArmState(), right: new App.Entity.ArmState()},
+				leg: {left: new App.Entity.LegState(), right: new App.Entity.LegState()}
 			};
 			p.arm.left.type = limb;
 			p.arm.right.type = limb;
diff --git a/src/markets/specificMarkets/customSlaveMarket.js b/src/markets/specificMarkets/customSlaveMarket.js
index a9b76aeb00e..8eb1481e708 100644
--- a/src/markets/specificMarkets/customSlaveMarket.js
+++ b/src/markets/specificMarkets/customSlaveMarket.js
@@ -876,7 +876,8 @@ App.Markets["Custom Slave"] = function() {
 				App.UI.DOM.link(
 					"Add",
 					() => {
-						_.set(slave, value, new App.Entity.LimbState());
+						const limb = value.startsWith("leg.") ? new App.Entity.LegState() : new App.Entity.ArmState();
+						_.set(slave, value, limb);
 						jQuery(`#${descText.id}`).empty().append(description(true, text));
 					}
 				)
diff --git a/src/npc/children/ChildState.js b/src/npc/children/ChildState.js
index d37dd7932f7..308179296ee 100644
--- a/src/npc/children/ChildState.js
+++ b/src/npc/children/ChildState.js
@@ -352,8 +352,8 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * 6: swiss army leg
 		 */
 		this.leg = {
-			left: new App.Entity.LimbState(),
-			right: new App.Entity.LimbState()
+			left: new App.Entity.LegState(),
+			right: new App.Entity.LegState()
 		};
 		/**
 		 * arms of the slave
@@ -366,8 +366,8 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * 6: swiss army arm
 		 */
 		this.arm = {
-			left: new App.Entity.LimbState(),
-			right: new App.Entity.LimbState()
+			left: new App.Entity.ArmState(),
+			right: new App.Entity.ArmState()
 		};
 		/** Are heels clipped
 		 *
diff --git a/src/npc/startingGirls/startingGirls.js b/src/npc/startingGirls/startingGirls.js
index ed5cd636874..8a789727163 100644
--- a/src/npc/startingGirls/startingGirls.js
+++ b/src/npc/startingGirls/startingGirls.js
@@ -795,7 +795,11 @@ App.StartingGirls.physical = function(slave, cheat = false) {
 					options.addCustomOption(`${capFirstChar(side)} ${limb}: amputated`)
 						.addButton("Restore",
 							() => {
-								slave[limb][side] = new App.Entity.LimbState();
+								if (limb === "arm") {
+									slave[limb][side] = new App.Entity.ArmState();
+								} else {
+									slave[limb][side] = new App.Entity.LegState();
+								}
 							},
 							""
 						);
diff --git a/src/npc/surgery/surgery.js b/src/npc/surgery/surgery.js
index d12e5640397..a8e1029089c 100644
--- a/src/npc/surgery/surgery.js
+++ b/src/npc/surgery/surgery.js
@@ -838,13 +838,21 @@ globalThis.removeLimbs = function(slave, limb) {
  * @param {number} id
  */
 globalThis.attachLimbs = function(slave, limb, id) {
+	/**
+	 * @param {"arm"|"leg"} limb
+	 * @param {FC.BodySide} side
+	 */
 	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();
+			if (limb === "arm") {
+				slave[limb][side] = new App.Entity.ArmState();
+			} else {
+				slave[limb][side] = new App.Entity.LegState();
+			}
 			slave[limb][side].type = id;
 		}
 	}
diff --git a/src/player/js/PlayerState.js b/src/player/js/PlayerState.js
index dd5adec12d2..47389648642 100644
--- a/src/player/js/PlayerState.js
+++ b/src/player/js/PlayerState.js
@@ -526,15 +526,15 @@ App.Entity.PlayerState = class PlayerState {
 		 * your legs
 		 */
 		this.leg = {
-			left: new App.Entity.LimbState(),
-			right: new App.Entity.LimbState()
+			left: new App.Entity.LegState(),
+			right: new App.Entity.LegState()
 		};
 		/**
 		 * your arms
 		 */
 		this.arm = {
-			left: new App.Entity.LimbState(),
-			right: new App.Entity.LimbState()
+			left: new App.Entity.ArmState(),
+			right: new App.Entity.ArmState()
 		};
 		/** are your heels clipped
 		 * @type {FC.Bool}
-- 
GitLab