From ee669c557fb15ec674421bdca1d6b2fdeb36c9b8 Mon Sep 17 00:00:00 2001
From: Svornost <11434-svornost@users.noreply.gitgud.io>
Date: Wed, 3 Mar 2021 19:39:03 -0800
Subject: [PATCH] Apply PC career bonus only after all starting girls have been
 created.

---
 devTools/types/FC/gameState.d.ts              |   4 +-
 src/events/intro/acquisition.js               |   6 +
 src/npc/startingGirls/commitStartingGirl.tw   |   1 -
 src/npc/startingGirls/startingGirls.js        | 276 +++++++++---------
 src/npc/startingGirls/startingGirlsPassage.js |   8 +-
 5 files changed, 152 insertions(+), 143 deletions(-)

diff --git a/devTools/types/FC/gameState.d.ts b/devTools/types/FC/gameState.d.ts
index 3d16657eefb..cd327f88b18 100644
--- a/devTools/types/FC/gameState.d.ts
+++ b/devTools/types/FC/gameState.d.ts
@@ -157,7 +157,9 @@ declare namespace FC {
 
 		AS: number;
 		seed?: number;
-		applyCareerBonus?: Bool;
+		applyCareerBonus?: 0 | 1;
+		careerBonusNeeded?: number[];
+		originOverride?: 0 | 1;
 		prostheticsConfig?: string;
 		nationalitiescheck?: object;
 		cellPath?: number[];
diff --git a/src/events/intro/acquisition.js b/src/events/intro/acquisition.js
index ae3caef2448..8438577228b 100644
--- a/src/events/intro/acquisition.js
+++ b/src/events/intro/acquisition.js
@@ -5,6 +5,12 @@ App.Intro.acquisition = function() {
 
 	const r = [];
 
+	if (_.isArray(V.careerBonusNeeded)) {
+		V.slaves.filter(s => V.careerBonusNeeded.includes(s.ID)).forEach(App.StartingGirls.applyCareerBonus);
+		delete V.careerBonusNeeded;
+		delete V.applyCareerBonus;
+	}
+
 	if (V.freshPC === 1 || V.saveImported === 0) {
 		PCSetup();
 	}
diff --git a/src/npc/startingGirls/commitStartingGirl.tw b/src/npc/startingGirls/commitStartingGirl.tw
index 5a9c3c4ce7d..c2c4b16801b 100644
--- a/src/npc/startingGirls/commitStartingGirl.tw
+++ b/src/npc/startingGirls/commitStartingGirl.tw
@@ -19,7 +19,6 @@
 <<if $cash < minimumSlaveCost()>><<goto "Acquisition">><</if>>
 
 <<run cashX(forceNeg(startingSlaveCost($activeSlave)), "slaveTransfer", $activeSlave)>>
-<<run App.StartingGirls.applyCareerBonus(getSlave($activeSlave.ID))>>
 
 <<= SlaveFullName($activeSlave)>> has been added to your starting stable of slaves. You now have <<print cashFormat($cash)>> remaining.
 <br>
diff --git a/src/npc/startingGirls/startingGirls.js b/src/npc/startingGirls/startingGirls.js
index 4c0d092eb2b..ce2ca87f17c 100644
--- a/src/npc/startingGirls/startingGirls.js
+++ b/src/npc/startingGirls/startingGirls.js
@@ -154,97 +154,100 @@ App.StartingGirls.applyCareerBonus = function(slave) {
 		}
 	}
 
-	if (V.applyCareerBonus) {
-		switch (V.PC.career) {
-			case "capitalist":
-			case "entrepreneur":
-			case "business kid":
-				if (slave.skill.whoring < 60) {
-					slave.skill.whoring += 20;
-				}
-				break;
-			case "mercenary":
-			case "recruit":
-			case "child soldier":
-				if (slave.devotion > 20) {
-					slave.trust += 10;
-				} else {
-					slave.trust -= 10;
-				}
-				break;
-			case "slaver":
-			case "slave overseer":
-			case "slave tender":
-				slave.devotion += 10;
-				break;
-			case "medicine":
-			case "medical assistant":
-			case "nurse":
-				slave.boobs += 600;
-				slave.boobsImplant += 600;
-				slave.boobsImplantType = "normal";
-				slave.butt += 2;
-				slave.buttImplant += 2;
-				slave.buttImplantType = "normal";
-				slave.lips += 10;
-				slave.lipsImplant += 10;
-				slave.waist = -55;
-				break;
-			case "celebrity":
-			case "rising star":
-			case "child star":
-				if (slave.skill.entertainment < 60) {
-					slave.skill.entertainment += 20;
-				}
-				break;
-			case "servant":
-			case "handmaiden":
-			case "child servant":
+	switch (V.PC.career) {
+		case "capitalist":
+		case "entrepreneur":
+		case "business kid":
+			if (slave.skill.whoring < 60) {
+				slave.skill.whoring += 20;
+			}
+			break;
+		case "mercenary":
+		case "recruit":
+		case "child soldier":
+			if (slave.devotion > 20) {
 				slave.trust += 10;
-				slave.devotion += 10;
-				break;
-			case "gang":
-			case "hoodlum":
-			case "street urchin":
-				improveCondition(slave, 5);
-				if (slave.skill.combat < 1) {
-					slave.skill.combat += 1;
-				}
-				break;
-			case "BlackHat":
-			case "hacker":
-			case "script kiddy":
-				slave.intelligence += 40;
-				if (slave.intelligence > 100) {
-					slave.intelligence = 100;
-				}
-				break;
-			case "escort":
-			case "prostitute":
-			case "child prostitute":
-				if (slave.skill.entertainment < 60) {
-					slave.skill.entertainment += 20;
-				}
-				if (slave.skill.whoring < 60) {
-					slave.skill.whoring += 20;
-				}
-				applySexSkillBonus();
-				break;
-			case "wealth":
-			case "trust fund":
-			case "rich kid":
-				applySexSkillBonus();
-				break;
-			default:
-				slave.devotion += 10;
-				if (slave.skill.whoring < 60) {
-					slave.skill.whoring += 20;
-				}
-				if (slave.skill.entertainment < 60) {
-					slave.skill.entertainment += 20;
-				}
-				applySexSkillBonus();
-		}
+			} else {
+				slave.trust -= 10;
+			}
+			break;
+		case "slaver":
+		case "slave overseer":
+		case "slave tender":
+			slave.devotion += 10;
+			break;
+		case "medicine":
+		case "medical assistant":
+		case "nurse":
+			slave.boobs += 600;
+			slave.boobsImplant += 600;
+			slave.boobsImplantType = "normal";
+			slave.butt += 2;
+			slave.buttImplant += 2;
+			slave.buttImplantType = "normal";
+			slave.lips += 10;
+			slave.lipsImplant += 10;
+			slave.waist = -55;
+			break;
+		case "celebrity":
+		case "rising star":
+		case "child star":
+			if (slave.skill.entertainment < 60) {
+				slave.skill.entertainment += 20;
+			}
+			break;
+		case "servant":
+		case "handmaiden":
+		case "child servant":
+			slave.trust += 10;
+			slave.devotion += 10;
+			break;
+		case "gang":
+		case "hoodlum":
+		case "street urchin":
+			improveCondition(slave, 5);
+			if (slave.skill.combat < 1) {
+				slave.skill.combat += 1;
+			}
+			break;
+		case "BlackHat":
+		case "hacker":
+		case "script kiddy":
+			slave.intelligence += 40;
+			if (slave.intelligence > 100) {
+				slave.intelligence = 100;
+			}
+			break;
+		case "escort":
+		case "prostitute":
+		case "child prostitute":
+			if (slave.skill.entertainment < 60) {
+				slave.skill.entertainment += 20;
+			}
+			if (slave.skill.whoring < 60) {
+				slave.skill.whoring += 20;
+			}
+			applySexSkillBonus();
+			break;
+		case "wealth":
+		case "trust fund":
+		case "rich kid":
+			applySexSkillBonus();
+			break;
+		case "engineer":
+		case "construction":
+		case "worksite helper":
+			// slave bonus disabled for these careers
+			break;
+		default:
+			slave.devotion += 10;
+			if (slave.skill.whoring < 60) {
+				slave.skill.whoring += 20;
+			}
+			if (slave.skill.entertainment < 60) {
+				slave.skill.entertainment += 20;
+			}
+			applySexSkillBonus();
 	}
 };
 
@@ -1469,62 +1472,61 @@ App.StartingGirls.skills = function(slave, cheat = false) {
  */
 App.StartingGirls.finalize = function(slave) {
 	const el = new DocumentFragment();
-	const {him} = getPronouns(slave);
 	const cost = startingSlaveCost(slave);
-	if (V.cash >= cost) {
-		let r = [];
-		if (V.PC.career !== "engineer" && V.PC.career !== "construction" && V.PC.career !== "worksite helper") {
-			r.push(
-				App.UI.DOM.link(
-					"Add this slave",
-					() => {
-						V.applyCareerBonus = 1;
-					},
-					[],
-					"Commit Starting Girl"
-				)
-			);
 
-			r.push(`This will apply your <span class="springgreen">career bonus</span> to ${him}:`);
-			if (V.PC.career === "capitalist" || V.PC.career === "entrepreneur" || V.PC.career === "business kid") {
-				r.push(`one free level of <span class="cyan">prostitution skill.</span>`);
-			} else if (V.PC.career === "mercenary" || V.PC.career === "recruit" || V.PC.career === "child soldier") {
-				if (slave.devotion > 20) {
-					r.push(`<span class="mediumaquamarine">+10 trust.</span>`);
-				} else {
-					r.push(`<span class="gold">+10 fear.</span>`);
-				}
-			} else if (V.PC.career === "slaver" || V.PC.career === "slave overseer" || V.PC.career === "slave tender") {
-				r.push(`<span class="hotpink">+10 devotion.</span>`);
-			} else if (V.PC.career === "medicine" || V.PC.career === "medical assistant" || V.PC.career === "nurse") {
-				r.push(`free <span class="lime">basic implants.</span>`);
-			} else if (V.PC.career === "celebrity" || V.PC.career === "rising star" || V.PC.career === "child star") {
-				r.push(`one free level of <span class="cyan">entertainment skill.</span>`);
-			} else if (V.PC.career === "escort" || V.PC.career === "prostitute" || V.PC.career === "child prostitute") {
-				r.push(`two free levels of <span class="cyan">sex skills,</span> one free level of <span class="cyan">prostitution skill,</span> and one free level of <span class="cyan">entertainment skill.</span>`);
-			} else if (V.PC.career === "servant" || V.PC.career === "handmaiden" || V.PC.career === "child servant") {
-				r.push(`<span class="mediumaquamarine">+10 trust</span> and <span class="hotpink">+10 devotion.</span>`);
-			} else if (V.PC.career === "gang" || V.PC.career === "hoodlum" || V.PC.career === "street urchin") {
-				r.push(`<span class="green">+5 health</span> and one free level of <span class="cyan">combat skill.</span>`);
-			} else if (V.PC.career === "wealth" || V.PC.career === "trust fund" || V.PC.career === "rich kid") {
-				r.push(`two free levels of <span class="cyan">sex skills.</span>`);
-			} else if (V.PC.career === "BlackHat" || V.PC.career === "hacker" || V.PC.career === "script kiddy") {
-				r.push(`one free level of <span class="cyan">intelligence.</span>`);
-			} else {
-				r.push(`<span class="hotpink">+10 devotion,</span> one free level of <span class="cyan">prostitution skill</span> and <span class="cyan">entertainment skill,</span> and two free levels of <span class="cyan">sex skills.</span>`);
-			}
-			App.Events.addNode(el, r, "div", "indent");
+	let r = [];
+	r.push(`If applied, your <span class="springgreen">career bonus</span> will give this slave:`);
+	if (V.PC.career === "capitalist" || V.PC.career === "entrepreneur" || V.PC.career === "business kid") {
+		r.push(`one free level of <span class="cyan">prostitution skill.</span>`);
+	} else if (V.PC.career === "mercenary" || V.PC.career === "recruit" || V.PC.career === "child soldier") {
+		if (slave.devotion > 20) {
+			r.push(`<span class="mediumaquamarine">+10 trust.</span>`);
+		} else {
+			r.push(`<span class="gold">+10 fear.</span>`);
 		}
+	} else if (V.PC.career === "slaver" || V.PC.career === "slave overseer" || V.PC.career === "slave tender") {
+		r.push(`<span class="hotpink">+10 devotion.</span>`);
+	} else if (V.PC.career === "medicine" || V.PC.career === "medical assistant" || V.PC.career === "nurse") {
+		r.push(`free <span class="lime">basic implants.</span>`);
+	} else if (V.PC.career === "celebrity" || V.PC.career === "rising star" || V.PC.career === "child star") {
+		r.push(`one free level of <span class="cyan">entertainment skill.</span>`);
+	} else if (V.PC.career === "escort" || V.PC.career === "prostitute" || V.PC.career === "child prostitute") {
+		r.push(`two free levels of <span class="cyan">sex skills,</span> one free level of <span class="cyan">prostitution skill,</span> and one free level of <span class="cyan">entertainment skill.</span>`);
+	} else if (V.PC.career === "servant" || V.PC.career === "handmaiden" || V.PC.career === "child servant") {
+		r.push(`<span class="mediumaquamarine">+10 trust</span> and <span class="hotpink">+10 devotion.</span>`);
+	} else if (V.PC.career === "gang" || V.PC.career === "hoodlum" || V.PC.career === "street urchin") {
+		r.push(`<span class="green">+5 health</span> and one free level of <span class="cyan">combat skill.</span>`);
+	} else if (V.PC.career === "wealth" || V.PC.career === "trust fund" || V.PC.career === "rich kid") {
+		r.push(`two free levels of <span class="cyan">sex skills.</span>`);
+	} else if (V.PC.career === "BlackHat" || V.PC.career === "hacker" || V.PC.career === "script kiddy") {
+		r.push(`one free level of <span class="cyan">intelligence.</span>`);
+	} else {
+		r.push(`<span class="hotpink">+10 devotion,</span> one free level of <span class="cyan">prostitution skill</span> and <span class="cyan">entertainment skill,</span> and two free levels of <span class="cyan">sex skills.</span>`);
+	}
+	App.Events.addNode(el, r, "div");
+
+	const options = new App.UI.OptionsGroup();
+	options.addOption("Apply Career bonus:", "applyCareerBonus", V)
+		.addValue("Enable", 1).on()
+		.addValue("Disable", 0).off();
+	el.appendChild(options.render());
+
+	if (V.cash >= cost) {
 		App.UI.DOM.appendNewElement("div", el,
 			App.UI.DOM.link(
-				(V.PC.career !== "engineer" && V.PC.career !== "construction" && V.PC.career !== "worksite helper") ? "Add this slave without career bonus" : "Add this slave",
+				"Add this slave",
 				() => {
-					V.applyCareerBonus = 0;
+					if (V.applyCareerBonus) {
+						if (_.isArray(V.careerBonusNeeded)) {
+							V.careerBonusNeeded.push(slave.ID);
+						} else {
+							V.careerBonusNeeded = [slave.ID];
+						}
+					}
 				},
 				[],
 				"Commit Starting Girl"
-			),
-			"indent"
+			)
 		);
 	} else {
 		App.UI.DOM.appendNewElement("p", el, `Cannot afford the cost of ${cashFormat(cost)}`, "red");
diff --git a/src/npc/startingGirls/startingGirlsPassage.js b/src/npc/startingGirls/startingGirlsPassage.js
index 44e8d4dbf3c..87fefbfb06b 100644
--- a/src/npc/startingGirls/startingGirlsPassage.js
+++ b/src/npc/startingGirls/startingGirlsPassage.js
@@ -1,6 +1,7 @@
 App.StartingGirls.passage = function() {
-	if (!V.activeSlave) {
-		V.activeSlave = V.activeSlave ||App.StartingGirls.generate();
+	V.activeSlave = V.activeSlave || App.StartingGirls.generate();
+	if (!jsDef(V.applyCareerBonus)) {
+		V.applyCareerBonus = 1;
 	}
 	const el = new DocumentFragment();
 	let r = [];
@@ -317,7 +318,6 @@ App.StartingGirls.passage = function() {
 					};
 					App.UI.DOM.appendNewElement("div", el, App.UI.DOM.combineNodes(`Relative of slave: `, select));
 					const linkDiv = App.UI.DOM.appendNewElement("div", el, ``);
-					App.UI.DOM.appendNewElement("div", el, "Note: finalized slaves have already had your career bonuses applied, and these will transfer to the generated relative; remove them if you don't want to be charged for them.", "note");
 					App.UI.DOM.appendNewElement("div", el, "Warning: related slaves will influence each others' opinion of you, and may become difficult to control if not properly broken.", "note");
 					App.UI.DOM.appendNewElement("div", el, App.UI.DOM.passageLink("Back", "Starting Girls"));
 					jQuery(headerLinks).empty().append(el);
@@ -360,7 +360,7 @@ App.StartingGirls.passage = function() {
 		App.StartingGirls.applyPlayerOrigin(V.activeSlave);
 	}
 
-	App.UI.DOM.appendNewElement("h2", el, "You are customizing this slave:");
+	App.UI.DOM.appendNewElement("h2", el, "You are customizing this slave");
 	el.append(App.Desc.longSlave(V.activeSlave, {market: "generic"}));
 
 	// TODO: move me
-- 
GitLab