Skip to content
Snippets Groups Projects
fAnimal.js 8.49 KiB
Newer Older
brickode's avatar
brickode committed
/**
 * @param {App.Entity.SlaveState} slave
 */
App.Interact.fAnimal = function(slave, type) {
	const
		frag = new DocumentFragment(),
		r = [],

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

	let
		animal,
		fetishDesc,
		act;

	switch (type) {
		case "canine":
			animal = V.activeCanine;
			break;
		case "hooved":
			animal = V.activeHooved;
			break;
		case "feline":
			animal = V.activeFeline;
			break;
	}

	if (slave.assignment === Job.FUCKTOY || slave.assignment === Job.MASTERSUITE) {
brickode's avatar
brickode committed
		if (slave.toyHole === "pussy") {
			act = "vaginal";
		} else if (slave.toyHole === "ass") {
			act = "anal";
brickode's avatar
brickode committed
		} else if (slave.toyHole === "mouth") {
brickode's avatar
brickode committed
			act = "oral";
brickode's avatar
brickode committed
		} else {
			if (canDoVaginal(slave)) {
				act = "vaginal";
			} else if (canDoAnal(slave)) {
				act = "anal";
			} else {
				act = "oral";
			}
brickode's avatar
brickode committed
		}
	} else if (canDoVaginal(slave)) {
		act = "vaginal";
	} else if (canDoAnal(slave)) {
		act = "anal";
	} else {
		act = "oral";
	}

	const
brickode's avatar
brickode committed
		isVowel = e => /[aeiou]/.test(e),
		a = isVowel(animal.charAt(0).toLowerCase()) ? `an` : `a`,
brickode's avatar
brickode committed
		slaveApproves = () => slave.fetish.includes("masochist" || "humiliation") ||
			slave.fetish === "buttslut" && act === "anal" ||
			slave.fetish === "cumslut" && act === "oral" ||
			slave.sexualQuirk.includes("perverted") ||
			slave.sexualQuirk === "gagfuck queen" && act === "oral" ||
			slave.behavioralQuirk.includes("sinful");

	if (slave.fetish === "cumslut" && act === "oral") {
		fetishDesc = `getting to drink more cum`;
	} else if (slave.fetish === "humiliation") {
		fetishDesc = `committing such a humiliating act`;
	} else if (slave.fetish === "buttslut" && act === "anal") {
		fetishDesc = `getting to take a cock up ${his} ass`;
	} else if (slave.fetish === "masochist") {
		fetishDesc = `committing such a painful act`;
	} else if (slave.sexualQuirk === "perverted") {
		fetishDesc = `committing such a perverted act`;
	} else if (slave.sexualQuirk === "gagfuck queen" && act === "oral") {
		fetishDesc = `getting to suck more dick`;
	} else if (slave.behavioralQuirk === "sinful") {
		fetishDesc = `committing such a sinful act`;
	}

	const mainDiv = App.UI.DOM.appendNewElement("div", frag);

	r.push(canWalk(slave) ? `You call ${him} over and ` : `You order another slave to bring ${slave.slaveName} over. Once ${he} is situated, you`, `tell ${him} you want to watch ${him} ${act !== "oral" ? `get fucked by` : `suck off`} ${a} ${animal}.`);

	if (slave.fetish !== "mindbroken") {
		if (slave.devotion > 50) {
			introDevoted();
		} else if (slave.devotion > 20) {
			introNondevoted();
brickode's avatar
brickode committed
		} else if (slave.devotion >= -20) {
brickode's avatar
brickode committed
			introNonresistant();
		} else {
brickode's avatar
brickode committed
			introResistant();
brickode's avatar
brickode committed
		}
	} else {
		r.push(`${slave.slaveName} nods ${his} head dumbly, ${his} eyes vacant${!canSee(slave) ? ` as always` : ``}.`);
	}

	if (slave.devotion > 50) {
		consummationDevoted();
	}

brickode's avatar
brickode committed
	mainDiv.append(r.join(' '));

	return frag;



	// MARK: Intro Functions
	function introDevoted() {
brickode's avatar
brickode committed
		if (act === "oral") {
			if (slaveApproves()) {
				r.push(`${slave.slaveName}'s face visibly brightens at the prospect of ${fetishDesc}, even if it's ${a} ${animal}'s cum.`);
			} else {
				r.push(`${slave.slaveName} visibly blanches at the thought of having to suck down ${a} ${animal}'s cum, but ${he} is so devoted to you that ${he} reluctantly agrees.`);
			}
		} else {
			if ((act === "vaginal" && slave.vagina > 0) || (act === "anal" && slave.anus > 0)) {
brickode's avatar
brickode committed
				if (slaveApproves()) {
brickode's avatar
brickode committed
					r.push(`${slave.slaveName}'s face visibly brightens at the thought of ${fetishDesc}, even if the dick is ${a} ${animal}'s.`);
brickode's avatar
brickode committed
				} else {
brickode's avatar
brickode committed
					r.push(`${slave.slaveName} looks visibly disturbed, but is so attentive to your will that ${he} agrees.`);
brickode's avatar
brickode committed
				}
			} else {
brickode's avatar
brickode committed
				if (slaveApproves()) {
					r.push(`${slave.slaveName}'s face visibly brightens at the thought of ${fetishDesc}, although ${he} seems a bit hesitant at the thought of giving ${his} virginity to an animal.`);
				} else {
					r.push(`${slave.slaveName} looks visibly shaken at the thought of having ${his} precious ${!canDoVaginal(slave) ? `anal ` : ``}virginity taken by an animal, but is so attentive to your will that ${he} ultimately agrees.`);

	function introNondevoted() {
		if (act === "oral") {
			if (slaveApproves()) {
				r.push(`${slave.slaveName} isn't too keen on the idea of sucking off ${a} ${animal}, but the idea of ${fetishDesc} is enough to get ${him} to comply.`);
			} else {
				r.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of blowing ${a} ${animal}, but quickly regains ${his} composure.`);
			}
		} else {
			if ((act === "vaginal" && slave.vagina > 0) || (act === "anal" && slave.anus > 0)) {
				if (slaveApproves()) {
					r.push(`${slave.slaveName} doesn't seem terribly keen on the idea of fucking ${a} ${animal}, but the thought of ${fetishDesc} seems to be enough to win ${him} over.`);
				} else {
					r.push(`${slave.slaveName} tries in vain to coneal ${his} horror at the thought of fucking ${a} ${animal}, but quickly regains ${his} composure.`);
				}
			} else {
				if (slaveApproves()) {
					r.push(`${slave.slaveName} clearly has some reservations about having ${his} ${act === "anal" ? `anal ` : ``}virginity taken by ${a} ${fetishDesc}, but the thought of ${fetishDesc} is enough to make agree to comply.`);
				} else {
brickode's avatar
brickode committed
					r.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of having ${his} precious ${act === "anal" ? `rosebud` : `pearl`} taken by a beast, but quickly regains ${his} composure.`);
brickode's avatar
brickode committed
	function introNonresistant() {
brickode's avatar
brickode committed
		if (act === "oral") {
			if (slaveApproves()) {
				r.push(`${slave.slaveName} looks disgusted at the thought of sucking off ${a} ${animal} at first, but the thought of the ${fetishDesc} that comes with it seems to spark a small flame of lust in ${him}.`);
			} else {
brickode's avatar
brickode committed
				r.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of blowing ${a} ${animal}${canWalk(slave) ? `, and only the threat of worse punishment keeps ${him} from running away as fast as ${he} can` : ``}.`);
brickode's avatar
brickode committed
			}
		} else {
			if ((act === "vaginal" && slave.vagina > 0) || (act === "anal" && slave.anus > 0)) {
				if (slaveApproves()) {
					r.push(`${slave.slaveName} looks disgusted at the thought of fucking ${a} ${animal} at first, but the thought of the ${fetishDesc} that comes with it seems to spark a small flame of lust in ${him}.`);
				} else {
brickode's avatar
brickode committed
					r.push(`${slave.slaveName} tries in vain to coneal ${his} horror at the thought of fucking ${a} ${animal}${canWalk(slave) ? `, and only the threat of worse punishment keeps ${him} from running away as fast as ${he} can` : ``}.`);
brickode's avatar
brickode committed
				}
			} else {
				if (slaveApproves()) {
					r.push(`${slave.slaveName} clearly has some reservations about having ${his} ${act === "anal" ? `anal ` : ``}virginity taken by ${a} ${fetishDesc}, but the thought of ${fetishDesc} is enough to make agree to comply.`);
				} else {
brickode's avatar
brickode committed
					r.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of having ${his} precious ${act === "anal" ? `rosebud` : `pearl`} taken by a beast${canWalk(slave) ? `, and only the threat of worse punishment keeps ${him} from running away as fast as ${he} can` : ``}.`);
brickode's avatar
brickode committed

	function introResistant() {
		r.push(`${slave.slaveName}'s face contorts into a mixture of ${slave.devotion < -50 ? `hatred, anger, and disgust` : `anger and disgust`}, ${canWalk(slave) ?
			`and only the threat of far worse punishment is enough to prevent ${him} from running out of the room.` :
			`but ${he} knows ${he} is powerless to stop you`}.`);
	}



	// MARK: Consummation Functions

	function consummationDevoted() {
		if (act === "oral") {
			r.push(`You have ${him} kneel on the floor before calling in the ${animal}. The beast slowly saunters up to the slave where ${he} waits, showing little concern when the slave reaches out and begins masturbating it to begin the process of getting the animal hard. Once the ${animal} is hard enough, ${slave.slaveName} takes its cock and begins to give a few tentative licks before finally putting it in ${his} mouth.`);
		} else {
			r.push(`You have ${slave.clothes !== "no clothing" ? `take off ${his} clothes and ` : ``} get on the floor, ass in the air, before calling in the ${animal}. The beast slowly saunters up to the slave, where it takes only a few seconds for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed. Another slave lines its cock up with ${slave.slaveName}'s ${act === "vaginal" ? `pussy` : `ass`}, then with a thrust, the ${animal} begins to fuck ${him}.`);
		}
	}
brickode's avatar
brickode committed
};