Newer
Older
/**
* @param {App.Entity.SlaveState} slave
*/
App.Interact.fAnimal = function(slave, type) {
const
frag = new DocumentFragment(),
r = [],
acts = {
VAGINAL: "vaginal",
ANAL: "anal",
ORAL: "oral",
},
vaginal = acts.VAGINAL,
anal = acts.ANAL,
approvingFetishes = ["masochist", "humiliation", "perverted", "sinful"]; // not strictly fetishes, but approvingFetishesAndBehavioralQuirksAndSexualQuirks doesn't have the same ring to it
act,
hole,
orifice = [];
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) {
a = isVowel(animal.name.charAt(0).toLowerCase()) ? `an` : `a`,
slaveApproves = () =>
approvingFetishes.includes(slave.fetish) ||
approvingFetishes.includes(slave.sexualQuirk) ||
approvingFetishes.includes(slave.behavioralQuirk) ||
slave.fetish === "buttslut" && act === anal ||
slave.fetish === "cumslut" && act === oral ||
slave.sexualQuirk === "gagfuck queen" && act === oral;
switch (act) {
case oral:
orifice = ["mouth", "throat"];
break;
case vaginal:
orifice = ["pussy", "cunt"];
hole = 0;
break;
case anal:
orifice = ["asshole", "rectum"];
hole = 1;
break;
default:
throw new Error(`Unexpected act type '${act}' in fAnimal()`);
}
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 ?
`suck off` :
act === vaginal ?
`get fucked by` :
`get fucked in the ass by`} ${a} ${animal.name}.`);
if (slave.fetish !== "mindbroken") {
if (slave.devotion > 50) {
introDevoted();
} else if (slave.devotion > 20) {
introNondevoted();
}
} else {
r.push(`${slave.slaveName} nods ${his} head dumbly, ${his} eyes vacant${!canSee(slave) ? ` as always` : ``}.`);
}
if (slave.devotion > 50) {
consummationDevoted();
} else if (slave.devotion > 20) {
consummationNondevoted();
} else if (slave.devotion > -20) {
consummationNonresistant();
} else {
consummationResistant();
sexEffects();
if (V.postSexCleanUp) {
cleanUp();
}
mainDiv.append(r.join(' '));
return frag;
r.push(`${slave.slaveName}'s face visibly brightens at the prospect of ${fetishDesc}, even if it's ${a} ${animal.name}'s cum.`);
r.push(`${slave.slaveName} visibly blanches at the thought of having to suck down ${a} ${animal.name}'s cum, but ${he} is so devoted to you that ${he} reluctantly agrees.`);
if ((act === vaginal && slave.vagina > 0) || (act === anal && slave.anus > 0)) {
r.push(`${slave.slaveName}'s face visibly brightens at the thought of ${fetishDesc}, even if the dick is ${a} ${animal.name}'s.`);
r.push(`${slave.slaveName} looks visibly disturbed, but is so attentive to your will that ${he} agrees.`);
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.`);
r.push(`${slave.slaveName} isn't too keen on the idea of sucking off ${a} ${animal.name}, but the idea of ${fetishDesc} is enough to get ${him} to comply.`);
r.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of blowing ${a} ${animal.name}, but quickly regains ${his} composure.`);
if ((act === vaginal && slave.vagina > 0) || (act === anal && slave.anus > 0)) {
r.push(`${slave.slaveName} doesn't seem terribly keen on the idea of fucking ${a} ${animal.name}, but the thought of ${fetishDesc} seems to be enough to win ${him} over.`);
r.push(`${slave.slaveName} tries in vain to coneal ${his} horror at the thought of fucking ${a} ${animal.name}, but quickly regains ${his} composure.`);
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.`);
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.`);
r.push(`${slave.slaveName} looks disgusted at the thought of sucking off ${a} ${animal.name} at first, but the thought of the ${fetishDesc} that comes with it seems to spark a small flame of lust in ${him}.`);
r.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of blowing ${a} ${animal.name}${canWalk(slave) ? `, and only the threat of worse punishment keeps ${him} from running away as fast as ${he} can` : ``}.`);
if ((act === vaginal && slave.vagina > 0) || (act === anal && slave.anus > 0)) {
r.push(`${slave.slaveName} looks disgusted at the thought of fucking ${a} ${animal.name} at first, but the thought of the ${fetishDesc} that comes with it seems to spark a small flame of lust in ${him}.`);
r.push(`${slave.slaveName} tries in vain to coneal ${his} horror at the thought of fucking ${a} ${animal.name}${canWalk(slave) ? `, and only the threat of worse punishment keeps ${him} from running away as fast as ${he} can` : ``}.`);
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.`);
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` : ``}.`);
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() {
r.push(`You have ${him} kneel on the floor before calling in the ${animal.name}. 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.name} is hard enough, ${slave.slaveName} takes its cock and begins to give it a few tentative licks before finally putting it in ${his} mouth.`);
r.push(`You have ${him} ${slave.clothes !== "no clothing" ? `take off ${his} clothes and ` : ``}get on the floor, ass in the air, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few short moments for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed.`);

brickode
committed
switch (animal) {
case V.activeCanine:
consummationDevotedCanine(act);
break;
case V.activeHooved:
consummationDevotedHooved(act);
break;
case V.activeFeline:
consummationDevotedFeline(act);
break;
default:
throw new Error(`Unexpected animal type '${type}' in consummationDevoted()`);
}

brickode
committed

brickode
committed
virginityCheck(act);
}
function consummationDevotedCanine(type) {
if (type === oral) {
r.push(`The slave seems to quickly get over the fact that the dick currently in ${his} mouth belongs to a canine as ${his} more carnal desires kick in.`);
r.push(`The slave visibly gags as the unfamiliar texture of ${a} ${animal.name}'s cock fills it, then gives a groan as the beast thrusts, filling ${his} throat.`);

brickode
committed
} else {
if (canWalk(slave)) {
r.push(`The canine clambers up to mount ${slave.slaveName}, eliciting a squeal from the ${girl} as its claws dig into ${his} flesh.`);
} else {
r.push(`The canine takes a few curious sniffs, then lines up its large cock with ${slave.slaveName}'s ${act === vaginal ? `pussy` : `asshole`}.`);
}

brickode
committed
r.push(`It takes a few tries, but the ${animal.name} finally manages to sink its cock into ${his} ${slaveApproves() && act === vaginal ? `wet ` : ``}${act === vaginal ? `cunt` : `asshole`} and begin to hammer away in the way that only canines can.`);

brickode
committed
}
function consummationDevotedHooved(type) {
if (type === oral) {
r.push(`The slave seems to quickly get over the fact that dick currently in ${his} mouth is not a human one as ${his} more carnal desires kick in.`);
} else {
r.push(`The slave visibly gags as the unfamiliar texture of ${a} ${animal.name}'s cock fills it, then gives a groan as the beast thrusts, stretching ${his} poor throat to the limit.`);
}
} else {
r.push(`${slave.slaveName} gives a long, drawn-out moan as the huge phallus fills ${his} ${act === vaginal ? `pussy` : `asshole`} nearly to its breaking point.`);
}

brickode
committed
}
function consummationDevotedFeline(type) {
if (type === oral) {
r.push(`The slave seems to quickly get over the fact that dick currently in ${his} mouth belongs to ${a} ${animal.name} as ${his} more carnal desires kick in.`);
r.push(`The slave visibly gags as the unfamiliar texture of ${a} ${animal.name}'s cock fills it, then gives a groan as the beast thrusts, the barbs on its cock rubbing the inside of ${his} mouth raw.`);
}
} else {
r.push(`${slave.slaveName} gives a squeal of pain as the barbed cock makes its way into ${his} ${act === vaginal ? `pussy` : `asshole`}.`);
}
}
}
function consummationNondevoted() {
r.push(`You tell ${him} to kneel on the floor before calling in the ${animal.name}. The beast slowly saunters up to the slave where ${he} waits, showing little concern when the slave hesitantly reaches out and begins masturbating it to begin the process of getting the animal hard. Once the ${animal.name} is hard enough, ${slave.slaveName} takes its cock, and, after taking a moment to steel ${his} resolve, begins to give it a few reluctant licks before putting it in ${his} mouth.`);
r.push(`You tell ${him} to ${slave.clothes !== "no clothing" ? `take off ${his} clothes and ` : ``}get on the floor, ass in the air, before calling in the ${animal.name}. 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.`);
}
switch (animal) {
case V.activeCanine:
consummationNondevotedCanine(act);
break;
case V.activeHooved:
consummationNondevotedHooved(act);
break;
case V.activeFeline:
consummationNondevotedFeline(act);
break;
default:
throw new Error(`Unexpected animal type '${type}' in consummationDevoted()`);
}
if (act !== oral) {
virginityCheck(act);
}
function consummationNondevotedCanine(type) {
if (type === oral) {
r.push(`Though the slave still seems to have some reservations about sucking off an animal, ${he} seems to forget that the cock in ${his} mouth belongs to ${a} ${animal.name} soon enough, once ${his} carnal desires kick in.`);
r.push(`The slave visibly gags as the unfamiliar texture of ${a} ${animal.name}'s cock fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
}
} else {
if (canWalk(slave)) {
r.push(`The canine clambers up to mount ${slave.slaveName}, eliciting a squeal from the ${girl} as its claws dig into ${his} flesh.`);
} else {
r.push(`The canine takes a few curious sniffs, then lines up its large cock with ${slave.slaveName}'s ${act === vaginal ? `pussy` : `asshole`}.`);
}
r.push(`It takes a few tries, but the ${animal.name} finally manages to sink its cock into ${his} ${slaveApproves() && act === vaginal ? `wet ` : ``}${act === vaginal ? `cunt` : `asshole`} and begin to hammer away in the way that only canines can.`);
}
}
function consummationNondevotedHooved(type) {
if (type === oral) {
r.push(`Though the slave still seems to have some reservations about sucking off ${a} ${animal.name}, ${he} seems to forget that the cock in ${his} mouth isn't human soon enough, once ${his} carnal desires kick in.`);
r.push(`The slave visibly gags as the unfamiliar texture of ${a} ${animal.name}'s cock fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
}
} else {
r.push(`${slave.slaveName} gives a long, drawn-out groan as the huge phallus fills ${his} ${act === vaginal ? `pussy` : `asshole`} nearly to its breaking point.`);
}
}
function consummationNondevotedFeline(type) {
if (type === oral) {
r.push(`Though the slave still seems to have some reservations about sucking off an animal, ${he} seems to forget that the cock in ${his} mouth belongs to a feline soon enough, once ${his} carnal desires kick in.`);
r.push(`The slave visibly gags as the unfamiliar texture of ${a} ${animal.name}'s barbed dick fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
}
} else {
r.push(`${slave.slaveName} gives a squeal of pain as the barbed cock makes its way into ${his} ${act === vaginal ? `pussy` : `asshole`}.`);
}

brickode
committed
function consummationNonresistant() {
if (act === oral) {
r.push(`You force ${him} to kneel on the floor before calling in the ${animal.name}. The beast slowly saunters up to the slave where ${he} waits, showing little concern when the slave reluctantly reaches out and begins masturbating it to begin the process of getting the animal hard. Once the ${animal.name} is hard enough, ${slave.slaveName} takes its cock and begins to give it a few tentative licks before finally putting it in ${his} mouth.`);
r.push(`You force ${him} to ${slave.clothes !== "no clothing" ? `take off ${his} clothes and ` : ``}get on the floor, ass in the air, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few short moments for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed.`);
}
switch (animal) {
case V.activeCanine:
consummationNonresistantCanine(act);
break;
case V.activeHooved:
consummationNonresistantHooved(act);
break;
case V.activeFeline:
consummationNonresistantFeline(act);
break;
default:
throw new Error(`Unexpected animal type '${type}' in consummationNonresistant()`);
}
if (act !== oral) {
virginityCheck(act);
}
function consummationNonresistantCanine(type) {
if (type === oral) {
if (slaveApproves()) {
r.push(`Though the slave still seems to have some reservations about sucking off an animal, ${he} seems to forget that the cock in ${his} mouth belongs to ${a} ${animal.name} soon enough, once ${his} carnal desires kick in.`);
r.push(`The slave visibly gags as the unfamiliar texture of ${a} ${animal.name}'s cock fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
}
} else {
if (canWalk(slave)) {
r.push(`The canine clambers up to mount ${slave.slaveName}, eliciting a squeal from the ${girl} as its claws dig into ${his} flesh.`);
} else {
r.push(`The canine takes a few curious sniffs, then lines up its large cock with ${slave.slaveName}'s ${act === vaginal ? `pussy` : `asshole`}.`);
}
r.push(`It takes a few tries, but the ${animal.name} finally manages to sink its cock into ${his} ${slaveApproves() && act === vaginal ? `wet ` : ``}${act === vaginal ? `cunt` : `asshole`} and begin to hammer away in the way that only canines can.`);
}
}
function consummationNonresistantHooved(type) {
if (type === oral) {
if (slaveApproves()) {
r.push(`Though the slave still seems to have some reservations about sucking off ${a} ${animal.name}, ${he} seems to forget that the cock in ${his} mouth isn't human soon enough, once ${his} carnal desires kick in.`);
r.push(`The slave visibly gags as the unfamiliar texture of ${a} ${animal.name}'s cock fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
}
} else {
r.push(`${slave.slaveName} gives a long, drawn-out groan as the huge phallus fills ${his} ${act === vaginal ? `pussy` : `asshole`} nearly to its breaking point.`);
}
}
function consummationNonresistantFeline(type) {
if (type === oral) {
if (slaveApproves()) {
r.push(`Though the slave still seems to have some reservations about sucking off an animal, ${he} seems to forget that the cock in ${his} mouth belongs to a feline soon enough, once ${his} carnal desires kick in.`);
} else {
r.push(`The slave visibly gags as the unfamiliar texture of ${a} ${animal.name}'s barbed dick fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
}
} else {
r.push(`${slave.slaveName} gives a squeal of pain as the barbed cock makes its way into ${his} ${act === vaginal ? `pussy` : `asshole`}.`);
}
}
}
function consummationResistant() {
if (act === oral) {
r.push(`You have to physically force ${him} to kneel on the floor before calling in the ${animal.name}. The beast slowly saunters up to the slave where ${he} is restrained, showing little concern when another slave reaches out and begins masturbating it to begin the process of getting the animal hard. Once the ${animal.name} is hard enough, the slave takes its cock and lines it up with ${slave.slaveName}'s mouth. The animal needs no prompting, and thrusts itself into ${his} ring-gagged mouth.`);
r.push(`You have to physically force ${him} to ${slave.clothes !== "no clothing" ? `take off ${his} clothes and ` : ``} get on the floor, ass in the air and restraints around ${his} wrists and ankles, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few short moments for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed.`);
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
}
switch (animal) {
case V.activeCanine:
consummationResistantCanine(act);
break;
case V.activeHooved:
consummationResistantHooved(act);
break;
case V.activeFeline:
consummationResistantFeline(act);
break;
default:
throw new Error(`Unexpected animal type '${type}' in consummationResistant()`);
}
if (act !== oral) {
virginityCheck(act);
}
function consummationResistantCanine(type) {
if (type === oral) {
if (slaveApproves()) {
r.push(`The slave glares daggers at you as ${he} takes the full length of the canine's cock in ${his} mouth, but ${slave.dick ?
canAchieveErection(slave) ?
`${his} fully-erect dick` :
`the precum leaking from ${his} dick` :
slave.vagina > -1 ?
`a slight sheen on ${his} pussylips` :
`a slight blush to ${his} cheeks`}
tells you that ${he}'s enjoying this, at least a little.`);
} else {
r.push(`The slave visibly gags as the unfamiliar texture of ${a} ${animal.name}'s cock fills it, and you get the feeling ${he} would have run away a long time ago if ${he} wasn't a little tied up at the moment.`);
}
} else {
if (canWalk(slave)) {
r.push(`The canine clambers up to mount ${slave.slaveName}, eliciting a squeal from the ${girl} as its claws dig into ${his} flesh.`);
} else {
r.push(`The canine takes a few curious sniffs, then lines up its large cock with ${slave.slaveName}'s ${act === vaginal ? `pussy` : `asshole`}.`);
}
r.push(`It takes a few tries, but the ${animal.name} finally manages to sink its cock into ${his} ${slaveApproves() && act === vaginal ? `wet ` : ``}${act === vaginal ? `cunt` : `asshole`} and begin to hammer away in the way that only canines can.`);
}
}
function consummationResistantHooved(type) {
if (type === oral) {
if (slaveApproves()) {
r.push(`The slave glares daggers at you as ${he} takes the full length of the ${animal.name}'s cock in ${his} mouth, but ${slave.dick ?
canAchieveErection(slave) ?
`${his} fully-erect dick` :
`the precum leaking from ${his} dick` :
slave.vagina > -1 ?
`a slight sheen on ${his} pussylips` :
`a slight blush to ${his} cheeks`}
tells you that ${he}'s enjoying this, at least a little.`);
} else {
r.push(`The slave visibly gags as the unfamiliar texture of ${a} ${animal.name}'s cock fills it, and you get the feeling ${he} would have run away a long time ago if ${he} wasn't a little tied up at the moment.`);
}
} else {
r.push(`${slave.slaveName} lets out a blood-curdling scream as the huge phallus fills ${his} ${act === vaginal ? `pussy` : `asshole`} nearly to its breaking point.`);
}
}
function consummationResistantFeline(type) {
if (type === oral) {
if (slaveApproves()) {
r.push(`The slave glares daggers at you as ${he} takes the full length of the feline's cock in ${his} mouth, but ${slave.dick ?
canAchieveErection(slave) ?
`${his} fully-erect dick` :
`the precum leaking from ${his} dick` :
slave.vagina > -1 ?
`a slight sheen on ${his} pussylips` :
`a slight blush to ${his} cheeks`}
tells you that ${he}'s enjoying this, at least a little.`);
} else {
r.push(`The slave visibly gags as the unfamiliar texture of ${a} ${animal.name}'s barbed dick fills it, and you get the feeling ${he} would have run away a long time ago if ${he} wasn't a little tied up at the moment.`);
}
} else {
r.push(`${slave.slaveName} lets out a blood-curdling scream as the barbed cock makes its way into ${his} ${act === vaginal ? `pussy` : `asshole`}.`);
}
}
}

brickode
committed
// MARK: Completion Function
function completion() {
switch (animal) {
case V.activeCanine:
completionCanine();
completionHooved();
break;
completionFeline();
break;
default:
throw new Error(`Unexpected animal type '${type}' in completion()`);
}
if (act !== oral && canGetPregnant(slave) && canBreed(slave, animal)) {
knockMeUp(slave, 5, hole, -8);
}
function completionCanine() {
if (act === oral) {
r.push(`The ${animal.species === "dog" ? `hound` : animal.name} wastes no time in beginning to hammer away at ${his} ${orifice[0]}, causing ${slave.slaveName} to moan uncontrollably as its thick, veiny member probes the depths of ${his} ${orifice[1]}. A few short minutes later, ${he} gives a loud groan ${slaveApproves() ? `and shakes in orgasm ` : ``}as the ${animal.name}'s knot begins to swell and its dick begins to erupt a thick stream of jizz down ${his} abused throat. Soon enough, the ${animal.name} finally finishes cumming and its knot is sufficiently small enough to slip out of ${slave.slaveName}'s mouth, causing ${him} to immediately begin coughing and retching uncontrollably. Having finished its business, the ${animal.name} runs off, presumably in search of food.`);
} else {
r.push(`The ${animal.species === "dog" ? `hound` : animal.name} wastes no time in beginning to hammer away at ${his} ${orifice[0]}, causing ${slave.slaveName} to moan uncontrollably as its thick, veiny member probes the depths of ${his} ${orifice[1]}. A few short minutes later, ${he} gives a loud groan ${slaveApproves() ? `and shakes in orgasm ` : ``}as the ${animal.name}'s knot begins to swell and its dick begins to erupt a thick stream of jizz into ${his} ${orifice[0]}. Soon enough, the ${animal.name} finally finishes cumming and its knot is sufficiently small enough to slip out of ${slave.slaveName}'s ${act === vaginal && slave.vagina < 3 || act === anal && slave.anus < 2 ?
`now-gaping ${orifice[0]}` :
orifice[0]}, causing a thick stream of cum to slide out of it. Having finished its business, the ${animal.name} runs off, presumably in search of food.`);
}
switch (act) {
case oral:
slave.counter.oral++;
return;
case vaginal:
slave.counter.vaginal++;
slave.vagina = slave.vagina < 3 ? 3 : slave.vagina;
return;
case anal:
slave.anus = slave.anus < 2 ? 2 : slave.anus;
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
return;
default:
throw new Error(`Unexpected act type '${act} in completionCanine()`);
}
}
function completionHooved() {
if (act === oral) {
r.push(`The ${animal.species === "horse" ? `stallion` : animal.name} begins to thrust faster and faster, causing ${him} to moan and groan past the huge ${animal.species} cock stretching ${his} poor throat to its limits. Before too long, the ${animal.name}'s movements begin to slow, and you can see its large testicles contract as its begins to erupt and pour its thick semen down ${his} throat and into ${his} stomach, filling it to the brim. After what seems like an impossibly long time, the ${animal.name}'s dick finally begins to soften and pull out, causing ${slave.slaveName} to begin coughing and retching uncontrollably. You have another slave lead the ${animal.name} away, with a fresh apple as a treat for its good performance.`);
} else {
r.push(`The ${animal.species === "horse" ? `stallion` : animal.name} begins to thrust faster and faster, causing ${him} to moan and groan as the huge ${animal.species} cock ${act === vaginal ? `batters ${his} cervix` : `fills ${him} completely`}. Before too long, the ${animal.name}'s movements begin to slow, and you can see its large testicles contract as its begins to erupt and fill ${his} ${orifice[1]} with its thick baby batter. After what seems like an impossibly long time, the ${animal.name}'s dick finally begins to soften and pull out, leaving ${slave.slaveName} panting and covered in sweat. You have another slave lead the ${animal.name} away, with a fresh apple as a treat for its good performance.`);
}
switch (act) {
case oral:
slave.counter.oral++;
return;
case vaginal:
slave.counter.vaginal++;
slave.vagina = slave.vagina < 4 ? 4 : slave.vagina;
return;
case anal:
slave.counter.anal++;
slave.anus = slave.anus < 3 ? 3 : slave.anus;
return;
default:
throw new Error(`Unexpected act type '${act} in completionHooved()`);
}
}
function completionFeline() {
if (act === oral) {
r.push(`The ${animal.name} begins to move, thrusting faster and faster. The ${girl} underneath it can't stop a groan of pain from escaping ${his} lips as the ${animal.species}'s barbed dick rubs the inside of ${his} mouth and throat raw. After a few minutes of painful coupling, the ${animal.species}'s thrusts finally slow, then stop completely as its ${animal.species !== "cat" ? `large` : ``} cock erupts down ${slave.slaveName}'s throat. With a ${animal.species !== "cat" ? `deep bellow` : `loud meow`}, he finally dismounts, gives you a long look, then stalks off.`);
} else {
r.push(`The ${animal.name} begins to move, thrusting faster and faster. The ${girl} underneath it can't stop a groan of pain from escaping ${his} lips as the ${animal.species}'s barbed dick rubs the inside of ${his} ${orifice[0]} raw. After a few minutes of painful coupling, the ${animal.species}'s thrusts finally slow, then stop completely as its ${animal.species !== "cat" ? `large` : ``} cock erupts, filling ${slave.slaveName} with its sperm. With a ${animal.species !== "cat" ? `deep bellow` : `loud meow`}, he finally dismounts, gives you a long look, then stalks off.`);
}
healthDamage(slave, 1);
switch (act) {
case oral:
slave.counter.oral++;
return;
case vaginal:
slave.counter.vaginal++;
slave.vagina = slave.vagina < 2 ? 2 : slave.vagina;
return;
case anal:
slave.counter.anal++;
slave.anus = slave.anus < 1 ? 1 : slave.anus;
throw new Error(`Unexpected act type '${act} in completionFeline()`);
}
}
}
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
// Post-sex Functions
function sexEffects() {
if (random(1, 100) > 100 + slave.devotion) {
switch (act) {
case oral:
if (slave.energy < 95 && slave.sexualFlaw !== "hates oral") {
r.push(`Having ${a} ${animal} fuck ${his} throat by force has given ${him} a hatred of oral sex.`);
}
slave.sexualFlaw = "hates oral";
return;
case vaginal:
if (slave.energy < 95 && slave.sexualFlaw !== "hates penetration") {
r.push(`Having ${a} ${animal} fuck ${him} by force has given ${him} a hatred of penetration.`);
}
slave.sexualFlaw = "hates penetration";
return;
case anal:
if (slave.energy < 95 && slave.sexualFlaw !== "hates anal") {
r.push(`Having ${a} ${animal} fuck ${his} asshole by force has given ${him} a hatred of anal penetration.`);
}
slave.sexualFlaw = "hates anal";
return;
default:
throw new Error(`Unexpected act type '${act}' in sexEffects()`);
}
}
}
function cleanUp() {
if (act !== oral) {
if (act === vaginal) {
if (slave.vagina === 3) {
r.push(`${capFirstChar(animal.name)} cum drips out out of ${his} fucked-out hole.`);
} else if (slave.vagina === 2) {
r.push(`${capFirstChar(animal.name)} cum drips out out of ${his} stretched vagina.`);
} else if (slave.vagina === 1) {
r.push(`${His} still-tight pussy keeps the ${animal.name}'s cum inside ${him}.`);
} else {
r.push(`${capFirstChar(animal.name)} cum slides right out of ${his} gaping hole.`);
}
} else {
if (slave.anus === 1) {
r.push(`${His} still-tight asshole keeps the ${animal.name}'s cum inside ${him}.`);
} else if (slave.anus === 2) {
r.push(`${capFirstChar(animal.name)} cum drips out of ${his} loosened anus.`);
} else {
r.push(`${capFirstChar(animal.name)} cum slides right out of ${his} fucked-out asshole.`);
}
}
}
if (canWalk(slave)) {
if (slave.vagina > 0) {
r.push(`${He} uses a quick douche to clean ${his} ${slave.vagina < 2 ? `tight` : slave.vagina > 3 ? `loose` : ``} pussy,`);
} else {
r.push(`${He} uses an enema to clean ${his} ${slave.anus < 2 ? `tight` : slave.anus < 3 ? `used` : `gaping`} butthole,`);
}
switch (slave.assignment) {
case Job.BROTHEL:
r.push(`just like ${he} does between each customer.`);
return;
case Job.CLUB:
r.push(`just like ${he} does in the club.`);
return;
case Job.DAIRY:
r.push(`to avoid besmirching the nice clean dairy.`);
return;
case Job.FARMYARD:
r.push(`to avoid tainting the food in ${V.farmyardName}.`);
return;
case Job.QUARTER:
r.push(`mostly to keep everything ${he} has to clean from getting any dirtier.`);
return;
case Job.WHORE:
r.push(`before returning to offering it for sale.`);
return;
case Job.PUBLIC:
r.push(`before returning to offering it for free.`);
return;
case Job.REST:
r.push(`before crawling back into bed.`);
return;
case Job.MILKED:
r.push(`${slave.lactation > 0 ? `before going to get ${his} uncomfortably milk-filled tits drained` : `and then rests until ${his} balls are ready to be drained again`}.`);
return;
case Job.HOUSE:
r.push(`since ${his} chores didn't perform themselves while you used ${his} fuckhole.`);
return;
case Job.FUCKTOY:
r.push(`before returning to await your next use of ${his} fuckhole, as though nothing had happened.`);
return;
case Job.SUBORDINATE:
r.push(`though it's only a matter of time before another slave decides to play with ${his} fuckhole.`);
return;
case Job.HEADGIRL:
r.push(`worried that ${his} charges got up to trouble while ${he} enjoyed ${his} ${WrittenMaster(slave)}'s use.`);
return;
case Job.BODYGUARD:
r.push(`so ${he} can be fresh and ready for more sexual use even as ${he} guards your person.`);
return;
case Job.TEACHER:
r.push(`before ${he} returns to teaching ${his} classes.`);
return;
default:
r.push(`before ${he} returns to ${slave.assignment}.`);
return;
}
}
}

brickode
committed
// MARK: Virginity Check Functions
function virginityCheck(type) {
switch (type) {
case vaginal:
if (act === vaginal && slave.vagina === 0) {
r.push(`The slave gives a loud ${slave.devotion > 20 ? `moan` : `groan`} as ${his} virginity is taken from ${him}${slave.devotion < -20 ? ` by force` : ``}.`);
virginityEffects(type);

brickode
committed
}

brickode
committed
case anal:
if (act === anal && slave.anus === 0) {
r.push(`The slave gives a loud ${slave.devotion > 20 ? `moan` : `groan`} as ${his} anal virginity is taken from ${him}${slave.devotion < -20 ? ` by force` : ``}.`);
virginityEffects(type);

brickode
committed
}

brickode
committed
default:
throw new Error(`Unexpected type value '${type}' in virginityCheck()`);
}
}
function virginityEffects(type) {
switch (type) {
case vaginal:
if (slave.devotion >= -20) {

brickode
committed
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
r.push(`Losing ${his} virginity in such a painful manner has increased ${his} devotion to you.`);
slave.devotion += 10;
} else {
if (slave.devotion > 50) {
r.push(`Since ${he} is well broken, losing ${his} virginity in such a manner has increased ${his} submission to you.`);
slave.devotion += 5;
} else if (slave.devotion >= -20) {
r.push(`Losing ${his} virginity in such a manner has increased ${his} submission to you, though ${he} is fearful that you'll decide to only use ${him} to sate your animals' lust.`);
slave.devotion += 5;
slave.trust -= 5;
} else {
r.push(`${He} is clearly unhappy in the manner in which ${his} virginity has been taken, and ${he} fears you'll decide to only use ${him} to sate your animals' lust.`);
slave.devotion -= 10;
slave.trust -= 10;
}
}
} else {
r.push(`Having ${his} pearl of great price taken by a mere beast has reinforced the hatred ${he} holds towards you, and ${he} is terrified you'll only use ${him} as a plaything for your animals.`);
slave.devotion -= 10;
slave.trust -= 10;
}
r.push(`Having ${his} cherry popped in such a manner was extremely painful and slightly damaged ${his} health.`);
healthDamage(slave, 5);
return;
case anal:
if (slave.devotion >= -20) {

brickode
committed
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
r.push(`Losing ${his} anal virginity in such a painful manner has increased ${his} devotion to you.`);
slave.devotion += 10;
} else {
if (slave.devotion > 50) {
r.push(`Since ${he} is well broken, losing ${his} anal virginity in such a manner has increased ${his} submission to you.`);
slave.devotion += 5;
} else if (slave.devotion >= -20) {
r.push(`Losing ${his} anal virginity in such a manner has increased ${his} submission to you, though ${he} is fearful that you'll decide to only use ${him} to sate your animals' lust.`);
slave.devotion += 5;
slave.trust -= 5;
} else {
r.push(`${He} is clearly unhappy in the manner in which ${his} anal virginity has been taken, and ${he} fears you'll decide to only use ${him} to sate your animals' lust.`);
slave.devotion -= 10;
slave.trust -= 10;
}
}
} else {
r.push(`Having ${his} pearl of great price taken by a mere beast has reinforced the hatred ${he} holds towards you, and ${he} is terrified you'll only use ${him} as a plaything for your animals.`);
slave.devotion -= 10;
slave.trust -= 10;
}
r.push(`Having ${his} rosebud broken in in such a manner was extremely painful and slightly damaged ${his} health.`);
healthDamage(slave, 5);
return;
default:
throw new Error(`Unexpected type value '${type}' in virginityEffects()`);
}
}