Skip to content
Snippets Groups Projects
useSlave.js 9.93 KiB
/**
 * Creates a new sex scene
 * @param {App.Entity.SlaveState} slave
 * @returns {HTMLDivElement}
 */
App.UI.SlaveInteract.useSlave = function (slave) {
	// MARK: Declarations

	const
		mainDiv = document.createElement("div"),
		sceneText = document.createElement("span"),

		{ he, him, his } = getPronouns(slave),

		lust = {
			player: 0,
			slave: 0,
		},
		kneeling = {
			player: false,
			slave: false,
		};

	let
		clothes = slave.clothes;

	sceneText.append(intro());
	mainDiv.append(sceneText);

	// MARK: Text Functions

	function intro() {
		if (slave.devotion > 50) {
			const intro = App.UI.DOM.makeElement("div", `You pull ${slave.slaveName} in close and tell ${him} that you want to make love. With a ${Beauty(slave) > 150 && slave.face > 10 ? `pretty` : `quick`} smile, ${he} makes it clear that your advances are not unwanted.`);

			intro.append(generateOptions());

			return App.UI.DOM.linkReplace(
				`Have sex with ${him}`,
				intro
			);
		} else if (slave.devotion > 20) {
			const intro = App.UI.DOM.makeElement("div", `You tell ${slave.slaveName} that you want to fuck ${him}. Though ${he} seems hesitant, your tone and the stern look in your eye make it clear that ${he} has no choice, and ${he} reluctantly agrees.`);

			intro.append(generateOptions());

			return App.UI.DOM.linkReplace(
				`Fuck ${him}`,
				intro
			);
		} else {
			const intro = App.UI.DOM.makeElement("div", `You tell ${slave.slaveName} that you're going to fuck ${him}, whether ${he} likes it or not. The daggers ${he} glares at you feel almost physically tangible, but ${he} knows that ${he} ultimately has no choice.`);

			intro.append(generateOptions());

			return App.UI.DOM.linkReplace(
				`Rape ${him}`,
				intro
			);
		}
	}



	// MARK: Generator Functions

	function generateOptions() {
		const
			div = document.createElement("div"),
			face = generateFaceOptions(),
			chest = generateChestOptions(),
			crotch = generateCrotchOptions(),
			clothing = generateClothingOptions(),
			links = [];

		face.forEach(e => links.push(App.UI.DOM.link(e.link, () => {
			div.innerHTML = e.desc.innerHTML;
			e.effect();
			console.log(
				lust,
				kneeling,
			);
		})));

		chest.forEach(e => links.push(App.UI.DOM.link(e.link, () => {
			div.innerHTML = e.desc.innerHTML;
			e.effect();
			console.log(
				lust,
				kneeling,
			);
		})));

		crotch.forEach(e => links.push(App.UI.DOM.link(e.link, () => {
			div.innerHTML = e.desc.innerHTML;
			e.effect();
			console.log(
				lust,
				kneeling,
			);
		})));

		clothing.forEach(e => links.push(App.UI.DOM.link(e.link, () => {
			div.innerHTML = e.desc.innerHTML;
			e.effect();
			console.log(
				lust,
				kneeling,
			);
		})));

		div.append(App.UI.DOM.generateLinksStrip(links));

		return div;
	}

	function generateClothingOptions() {
		const
			defaultOptions = [
				{
					link: `Finger ${his} pussy`,
					desc: generateDescFingerPussy(),
					prereq: () => slave.vagina > -1 && (clothes === "no clothing" || clothes.includes("dress")),
					effect: () => {
						lust.player++;
						lust.slave += 5;
					}
				},
				{
					link: `Finger ${his} asshole`,
					desc: generateDescFingerAnus(),
					prereq: () => clothes === "no clothing" || clothes.includes("dress"),
					effect: () => {
						lust.player++;
						lust.slave += slave.fetish === "buttslut" ? 7 : 4;
					}
				},
				{
					link: `Pull up ${his} dress`,
					desc: generateDescPullUpDress(),
					prereq: () => clothes.includes("dress"),
					effect: () => {
						clothes = "no clothing";
						lust.player++;
						lust.slave += 2;
					}
				},
				{
					link: `Take off ${his} ${clothes
						.replace("an ", '')
						.replace("a ", '')}`,
					desc: generateDescRemoveClothing(),
					prereq: () => clothes !== "no clothing",
					effect: () => {
						clothes = "no clothing";
						lust.player++;
						lust.slave += 2;
					}
				},
			],
			availableOptions = defaultOptions.filter(e => e.prereq());

		return availableOptions;

		function generateDescFingerPussy() {
			if (slave.devotion > 50) {
				return `Fingering pussy test 1`;
			} else if (slave.devotion > 20) {
				return `Fingering pussy test 2`;
			} else if (slave.devotion > -20) {
				return `Fingering pussy test 3`;
			} else {
				return `Fingering pussy test 4`;
			}
		}

		function generateDescFingerAnus() {
			if (slave.devotion > 50) {
				return `Fingering anus test 1`;
			} else if (slave.devotion > 20) {
				return `Fingering anus test 2`;
			} else if (slave.devotion > -20) {
				return `Fingering anus test 3`;
			} else {
				return `Fingering anus test 4`;
			}
		}

		function generateDescPullUpDress() {
			if (slave.devotion > 50) {
				return `Pull up dress test 1`;
			} else if (slave.devotion > 20) {
				return `Pull up dress test 2`;
			} else if (slave.devotion > -20) {
				return `Pull up dress test 3`;
			} else {
				return `Pull up dress test 4`;
			}
		}

		function generateDescRemoveClothing() {
			if (slave.devotion > 50) {
				return `Remove clothing test 1`;
			} else if (slave.devotion > 20) {
				return `Remove clothing test 2`;
			} else if (slave.devotion > -20) {
				return `Remove clothing test 3`;
			} else {
				return `Remove clothing test 4`;
			}
		}
	}

	function generateFaceOptions() {
		const
			defaultOptions = [
				{
					link: `Kiss ${him}`,
					desc: generateDescRegularKiss(),
					prereq: () => slave.mouthAccessory === "none",
					effect: () => {
						lust.player++;
						lust.slave++;
					}
				},
				{
					link: `Kiss ${him} passionately`,
					desc: generateDescPassionateKiss(),
					prereq: () => slave.mouthAccessory === "none",
					effect: () => {
						lust.player++;
						lust.slave++;
					}
				},
				{
					link: `Kiss ${him} intimately`,
					desc: generateDescIntimateKiss(),
					prereq: () => slave.mouthAccessory === "none",
					effect: () => {
						lust.player++;
						lust.slave++;
					}
				},
				{
					link: `Have ${him} go down on you`,
					desc: generateDescSlaveGivesOral(),
					prereq: () => slave.mouthAccessory === "none",
					effect: () => {
						lust.player++;
						lust.slave++;
						kneeling.slave = true;
					}
				},
				{
					link: `Go down on ${him}`,
					desc: generateDescPlayerGivesOral(),
					prereq: () => clothes === "no clothing",
					effect: () => {
						lust.player++;
						lust.slave++;
						kneeling.player = true;
					}
				},
			],
			availableOptions = defaultOptions.filter(e => e.prereq());

		return availableOptions;



		function generateDescRegularKiss() {
			const
				div = document.createElement("div"),
				link = document.createElement("div");

			if (slave.devotion > 50) {
				div.append(`Face test regular 1`);
			} else if (slave.devotion > 20) {
				div.append(`Face test regular 2`);
			} else if (slave.devotion > -20) {
				div.append(`Face test regular 3`);
			} else {
				div.append(`Face test regular 4`);
			}

			link.append(App.UI.DOM.link("Test"));
			div.append(link);

			return div;
		}

		function generateDescPassionateKiss() {
			if (slave.devotion > 50) {
				return `Face test passionate 1`;
			} else if (slave.devotion > 20) {
				return `Face test passionate 2`;
			} else if (slave.devotion > -20) {
				return `Face test passionate 3`;
			} else {
				return `Face test passionate 4`;
			}
		}

		function generateDescIntimateKiss() {
			if (slave.devotion > 50) {
				return `Face test intimate 1`;
			} else if (slave.devotion > 20) {
				return `Face test intimate 2`;
			} else if (slave.devotion > -20) {
				return `Face test intimate 3`;
			} else {
				return `Face test intimate 4`;
			}
		}

		function generateDescSlaveGivesOral() {
			if (slave.devotion > 50) {
				return `Face test slave oral 1`;
			} else if (slave.devotion > 20) {
				return `Face test slave oral 2`;
			} else if (slave.devotion > -20) {
				return `Face test slave oral 3`;
			} else {
				return `Face test slave oral 4`;
			}
		}

		function generateDescPlayerGivesOral() {
			if (slave.devotion > 50) {
				return `Face test player oral 1`;
			} else if (slave.devotion > 20) {
				return `Face test player oral 2`;
			} else if (slave.devotion > -20) {
				return `Face test player oral 3`;
			} else {
				return `Face test player oral 4`;
			}
		}
	}

	function generateChestOptions() {
		const
			defaultOptions = [
				{
					link: `Grope ${his} chest`,
					desc: generateDescGrope(),
					prereq: () => true,
					effect: () => {
						lust.player += 2;
						lust.slave += slave.fetish === "boobs" ? 7 : 4;
					}
				},
			],
			availableOptions = defaultOptions.filter(e => e.prereq());

		return availableOptions;

		function generateDescGrope() {
			if (slave.devotion > 50) {
				return `Chest test grope 1`;
			} else if (slave.devotion > 20) {
				return `Chest test grope 2`;
			} else if (slave.devotion > -20) {
				return `Chest test grope 3`;
			} else {
				return `Chest test grope 4`;
			}
		}
	}

	function generateCrotchOptions() {
		const
			defaultOptions = [
				{
					link: `Fuck ${his} pussy`,
					desc: generateDescFuckPussy(),
					prereq: () => slave.vagina > -1 && clothes === "no clothing",
					effect: () => {
						lust.player += 4;
						lust.slave += 4;
					}
				},
				{
					link: `Fuck ${his} asshole`,
					desc: generateDescFuckAsshole(),
					prereq: () => clothes === "no clothing",
					effect: () => {
						lust.player += 4;
						lust.slave += slave.fetish === "buttslut" ? 7 : 4;
					}
				}
			],
			availableOptions = defaultOptions.filter(e => e.prereq());

		return availableOptions;

		function generateDescFuckPussy() {
			if (slave.devotion > 50) {
				return `Fuck pussy test 1`;
			} else if (slave.devotion > 20) {
				return `Fuck pussy test 2`;
			} else if (slave.devotion > -20) {
				return `Fuck pussy test 3`;
			} else {
				return `Fuck pussy test 4`;
			}
		}

		function generateDescFuckAsshole() {
			if (slave.devotion > 50) {
				return `Fuck asshole test 1`;
			} else if (slave.devotion > 20) {
				return `Fuck asshole test 2`;
			} else if (slave.devotion > -20) {
				return `Fuck asshole test 3`;
			} else {
				return `Fuck asshole test 4`;
			}
		}
	}

	return mainDiv;
};