Newer
Older
globalThis.isItemAccessible = (function() {
* @param {string} [category="clothing"] that item is in clothing, collar, etc
* @param {App.Entity.SlaveState} [slave]
* @returns {boolean|string} Returns true if item is accessible, and false if it is not. If the slave param is set, it may sometimes return a string instead of false, explaining why the item can't be used with that slave.
switch (category) {
case "clothing":
case "clothes":
selectedDB = App.Data.slaveWear.bellyAccessories;
selectedDB = App.Data.buttplugs;
selectedDB = App.Data.slaveWear.buttplugAttachments;
selectedDB = App.Data.slaveWear.vaginalAccessories;
selectedDB = App.Data.slaveWear.vaginalAttachments;
selectedDB = App.Data.slaveWear.dickAccessories;
selectedDB = App.Data.slaveWear.chastityDevices;
// console.log(`made a category for ${category} automatically, may need to define this by hand`);
console.log(`${string} is not a registered piece of clothing! Check App.Data.slaveWear.${category}`);
return isAvailable(item, category, slave);
* Returns array of wearable clothing in format [name, value], basically player facing / game data.
* @param {Map} map Map to look in (such as App.Data.clothes)
* @param {string} [filter] for example, if we want to filter clothing data by the "harsh" property, pass harsh as the parameter here.
* @param {any} [filterValue] remove any clothing where the .filter property does not match this value. Function will evaluate undefined as false.
for (const [key, obj] of map) { // FIXME: 'key' is declared but its value is never read.
if (filter && filterValue !== (obj[filter] || false)) {
continue;
}
if (V.cheatMode || isAvailable(obj)) {
const name = (obj.fs) ? `${obj.name} (FS)` : obj.name;
/**
* @param {object} item
* @param {string} [category="clothing"] that item is in clothing, collar, etc
* @param {App.Entity.SlaveState} [slave]
* @returns {boolean|string} Returns true if item is accessible, and false if it is not. If the slave param is set, it may sometimes return a string instead of false, explaining why the item can't be used with that slave.
*/
function isAvailable(item, category, slave) {
slaveResults = isAvailableForSlave(item, category, slave);
if (slaveResults === false) {
if (!(item.hasOwnProperty("fs")) && !(item.hasOwnProperty("requirements"))) {
if (item.hasOwnProperty("requirements")) {
if (item.requirements === true) {
if (V.arcologies[0][item.fs] > 0) {
return true;
if (slaveResults && slaveResults !== true) { // If we still haven't returned true or false, then we display why this particular slave can't use the item.
/**
* @param {object} item
* @param {string} [category="clothing"] that item is in clothing, collar, etc
* @param {App.Entity.SlaveState} [slave]
* @returns {boolean|string} Returns true if item is accessible, and false if it is not. If the slave param is set, it may sometimes return a string instead of false, explaining why the item can't be used with that slave.
*/
switch (category) {
case "clothing":
case "clothes":
break;
case "collar":
break;
case "bellyAccessory": {
switch (item.value) {
if (slave.belly > 10000) {
return true;
} else {
return `Slave belly too small for this`;
}
}
case "a small empathy belly":
case "a medium empathy belly":
case "a large empathy belly":
case "a huge empathy belly": {
if (slave.belly < 1500 && slave.weight < 130) {
return true;
} else {
return `Slave belly too big for this`;
}
}
default:
return true;
}
}
case "buttplug": {
switch (item.value) {
if (slave.anus < 2) {
return `Slave's anus is too small for this right now`;
} else {
return true;
}
}
case "long plug":
case "long, large plug": {
if (!(slave.breedingMark !== 1 || V.propOutcome === 0 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")) {
return "Elites frown on this";
} else {
return true;
}
}
case "long, huge plug": {
if (slave.anus < 2) {
return `Slave's anus is too small for this right now`;
} else if (!(slave.breedingMark !== 1 || V.propOutcome === 0 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")) {
return "Elites frown on this";
} else {
return true;
}
}
default:
return true;
}
}
case "buttplugAttachment":
break;
case "vaginalAccessory": {
if (slave.vagina < 0) {
return false;
}
switch (item.value) {
if (slave.vagina < 2) {
return `Slave's vagina is too small for this right now`;
} else {
return true;
}
}
case "long dildo":
case "long, large dildo": {
if (!(slave.breedingMark !== 1 || V.propOutcome === 0 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")) {
return "Elites frown on this";
} else {
return true;
}
}
case "long, huge dildo": {
if (slave.vagina < 2) {
return `Slave's vagina is too small for this right now`;
} else if (!(slave.breedingMark !== 1 || V.propOutcome === 0 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")) {
return "Elites frown on this";
} else {
return true;
}
}
default:
return true;
}
}
case "vaginalAttachment": {
if (slave.vagina < 0) {
return false;
}
switch (item.value) {
case "vibrator":
if (slave.vaginalAccessory === "none") {
return "No vaginal accessory to attach it to";
} else if (slave.vaginalAccessory === "bullet vibrator" || slave.vaginalAccessory === "smart bullet vibrator") {
return "Vaginal accessory already vibrates";
} else {
return true;
}
}
break;
}
case "dickAccessory":
case "shoes":
break;
case "chastity": {
switch (item.value) {
case "chastity belt":
case "full chastity":
return (slave.vagina > -1 && slave.dick > 0);
case "choose own chastity":
return (slave.choosesOwnChastity !== 1 && slave.devotion > 20 && slave.trust > 0);
case "revoke choosing own chastity":
return (slave.choosesOwnChastity > 0);
}
}
default:
break;
}
* @param {App.Entity.SlaveState} slave
* @param {string} prosthetic
* @returns {boolean}
*/
globalThis.isProstheticAvailable = function(slave, prosthetic) {
return slave.readyProsthetics.findIndex(function(p) { return p.id === prosthetic; }) !== -1;
};
/**
* @param {App.Entity.SlaveState} slave
* @param {string} prosthetic
*/
globalThis.addProsthetic = function(slave, prosthetic) {
let limb = prostheticToLimb(prosthetic);
if (limb > 0) {
let p = {
id: prosthetic,
arm: {left: new App.Entity.LimbState(), right: new App.Entity.LimbState()},
leg: {left: new App.Entity.LimbState(), right: new App.Entity.LimbState()}
};
p.arm.left.type = limb;
p.arm.right.type = limb;
p.leg.left.type = limb;
p.leg.right.type = limb;
slave.readyProsthetics.push(p);
} else {
/**
* @param {App.Entity.SlaveState} slave
* @param {string} prosthetic
* @returns {{}}
*/
globalThis.findProsthetic = function(slave, prosthetic) {
return slave.readyProsthetics.find(p => p.id === prosthetic);
};
/**
* @param {string} prosthetic
* @returns {number}
*/
globalThis.prostheticToLimb = function(prosthetic) {
switch (prosthetic) {
case "basicL":
return 2;
case "sexL":
return 3;
case "beautyL":
return 4;
case "combatL":
return 5;
case "cyberneticL":
return 6;
default:
return 0;
}
};
/**
*
* @param {number} limb
* @returns {string}
*/
globalThis.limbToProsthetic = function(limb) {