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;
};