From 613ec671192490209422490bc2849dc2f54ba8e8 Mon Sep 17 00:00:00 2001
From: Svornost <11434-svornost@users.noreply.gitgud.io>
Date: Tue, 2 Mar 2021 17:02:28 -0800
Subject: [PATCH] 1. Make seX a bit more flexible about where the PC is
 positioned, since it keeps coming up. 2. Make addPartner work on the PC in
 either position, and accept either a partner object or ID, instead of
 requiring an ID specifically. 3. Fix some misplaced parentheses in RE
 Arcology Inspection.

---
 src/events/reArcologyInspection.js            | 14 ++++----
 src/js/sexActsJS.js                           |  4 +--
 src/js/utilsSlave.js                          | 32 +++++++++++++------
 .../passage/fSlaveSlaveDickConsummate.tw      |  2 +-
 4 files changed, 33 insertions(+), 19 deletions(-)

diff --git a/src/events/reArcologyInspection.js b/src/events/reArcologyInspection.js
index 0782bea6528..39e794b36a9 100644
--- a/src/events/reArcologyInspection.js
+++ b/src/events/reArcologyInspection.js
@@ -249,9 +249,9 @@ App.Events.REArcologyInspection = class REArcologyInspection extends App.Events.
 							t.push(`Both of you know, of course, that you can't actually get ${him} pregnant, but the fantasy is fun anyway.`);
 						}
 						if (agent.mpreg === 1) {
-							t.push(VCheck.Anal(agent), 4);
+							t.push(VCheck.Anal(agent, 4));
 						} else {
-							t.push(VCheck.Vaginal(agent), 4);
+							t.push(VCheck.Vaginal(agent, 4));
 						}
 					} else if (canPenetrate(agent) && V.PC.vagina > 0) {
 						t.push(`Impatient, you push ${agent.slaveName} back on the bed and slide ${his} dick into your wet pussy. ${He} begs you to let ${him} put a baby in you${V.PC.bellyPreg >= 1500 ? `, even as ${he} eagerly paws at your current pregnancy` : ""}, and over the course of the evening ${he} fills you up several times, with ${agentLover.slaveName} "helping."`);
@@ -348,7 +348,7 @@ App.Events.REArcologyInspection = class REArcologyInspection extends App.Events.
 					}
 				} else if (agent.fetish === "buttslut") {
 					t.push(`Impatient, you bend ${him} over the end of the bed and start by sliding ${V.PC.dick > 0 ? "your hard cock" : `a strapon you found in ${his} nightstand`} into ${his} ass.`);
-					t.push(VCheck.Anal(agent), 2);
+					t.push(VCheck.Anal(agent, 2));
 				} else if (agent.fetish === "boobs") {
 					if (agent.nipples === "fuckable" && V.PC.dick > 0) {
 						t.push(`Impatient, you push ${him} back on ${his} bed and kneel over ${him}, sliding your hard cock into ${his} soft breast, making good use of ${his} fuckable nipple.`);
@@ -372,9 +372,9 @@ App.Events.REArcologyInspection = class REArcologyInspection extends App.Events.
 							t.push(`Both of you know, of course, that you can't actually get ${him} pregnant, but the fantasy is fun anyway.`);
 						}
 						if (agent.mpreg === 1) {
-							t.push(VCheck.Anal(agent), 4);
+							t.push(VCheck.Anal(agent, 4));
 						} else {
-							t.push(VCheck.Vaginal(agent), 4);
+							t.push(VCheck.Vaginal(agent, 4));
 						}
 					} else if (canPenetrate(agent) && V.PC.vagina > 0) {
 						t.push(`Impatient, you push ${him} back on the bed and slide ${his} dick into your wet pussy. ${He} begs you to let ${him} put a baby in you, and over the course of the evening ${he} fills you up several times.`);
@@ -402,9 +402,9 @@ App.Events.REArcologyInspection = class REArcologyInspection extends App.Events.
 					if (V.PC.dick > 0) {
 						t.push(`slides onto your hard dick.`);
 						if (agent.vagina >= 0) {
-							t.push(VCheck.Vaginal(agent), 2);
+							t.push(VCheck.Vaginal(agent, 2));
 						} else {
-							t.push(VCheck.Anal(agent), 2);
+							t.push(VCheck.Anal(agent, 2));
 						}
 					} else if (canPenetrate(agent) && (V.PC.vagina > 0 || V.PC.anus > 0)) {
 						t.push(`mounts you.`);
diff --git a/src/js/sexActsJS.js b/src/js/sexActsJS.js
index cfa4874d5db..0cade952c25 100644
--- a/src/js/sexActsJS.js
+++ b/src/js/sexActsJS.js
@@ -478,7 +478,7 @@ globalThis.actX = function(slave, act, count = 1) {
 
 /**
  * Sex is between two. This is a handy wrapper for actX that emphasizes that.
- * @param {App.Entity.SlaveState} slave1 always a slave
+ * @param {FC.HumanState} slave1 slave or PC
  * @param {FC.SlaveActs} act1 oral, anal, etc
  * @param {FC.HumanState | "public" | "slaves"} slave2 slave or PC or "public"
  * @param {FC.SlaveActs} act2 oral, anal, etc
@@ -496,6 +496,6 @@ globalThis.seX = function(slave1, act1, slave2, act2, count = 1) {
 		// someday we may track "slaves" and "assistant"
 	} else {
 		actX(slave2, act2, count);
-		addPartner(slave1, slave2.ID);
+		addPartner(slave1, slave2);
 	}
 };
diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js
index 94f6f00481f..7c2ba4ede39 100644
--- a/src/js/utilsSlave.js
+++ b/src/js/utilsSlave.js
@@ -3522,8 +3522,8 @@ globalThis.randomRapeRivalryTarget = function(slave, predicate) {
 
 /**
  * TODO: move this into seX() once interact scenes are converted
- * @param {App.Entity.SlaveState} slave
- * @param {number} partner The ID of the slave's partner.
+ * @param {FC.HumanState} slave
+ * @param {FC.HumanState|number} partner The slave's partner, or the ID of the slave's partner.
  *
  * | ***ID*** | **Type**              |
  * |---------:|:----------------------|
@@ -3536,15 +3536,29 @@ globalThis.randomRapeRivalryTarget = function(slave, predicate) {
  * | *-9*     | Futanari Sister       |
  */
 globalThis.addPartner = function(slave, partner) {
+	/** @returns {FC.HumanState} */
+	function getPartnerState() {
+		if (typeof partner === "number") {
+			if (partner === -1) {
+				return V.PC;
+			} else if (partner > 0) {
+				return getSlave(partner);
+			}
+		} else if ("partners" in partner) {
+			return partner;
+		}
+		return null;
+	}
+
 	if (typeof partner === "number") {
 		slave.partners.add(partner);
-
-		const partnerSlave = partner > 0 ? getSlave(partner) : null;
-		if (partnerSlave) {
-			partnerSlave.partners.add(slave.ID);
-		}
+	} else if ("ID" in partner) {
+		slave.partners.add(partner.ID);
 	} else {
-		console.trace();
-		throw `Partner is not a number. Type of partner is ${typeof partner}, value is "${partner}"`;
+		throw new TypeError(`partner must be an object or ID, not "${partner}"`);
+	}
+	const partnerState = getPartnerState();
+	if (partnerState) {
+		partnerState.partners.add(slave.ID);
 	}
 };
diff --git a/src/npc/interaction/passage/fSlaveSlaveDickConsummate.tw b/src/npc/interaction/passage/fSlaveSlaveDickConsummate.tw
index 319d6068e04..4b3669575a5 100644
--- a/src/npc/interaction/passage/fSlaveSlaveDickConsummate.tw
+++ b/src/npc/interaction/passage/fSlaveSlaveDickConsummate.tw
@@ -616,7 +616,7 @@ You call $slaverapistx.slaveName into the room.
 <br><br>
 
 <<set getSlave($AS).counter.penetrative += 1, $penetrativeTotal += 1, $slaverapistx.counter.vaginal += 1, $vaginalTotal += 1>>
-<<run addPartner(getSlave($AS), $slaverapistx.ID)>>
+<<run addPartner(getSlave($AS), $slaverapistx)>>
 
 /% Friendship/lust? %/
 <<if ([2].includes(getSlave($AS).relationship) && getSlave($AS).relationshipTarget == $slaverapistx.ID) && ([2].includes($slaverapistx.relationship) && $slaverapistx.relationshipTarget == $AS)>>
-- 
GitLab