Skip to content
Snippets Groups Projects
itemAvailability.js 11.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • Pregmodder's avatar
    Pregmodder committed
    /* intended to condense the clothing/toy/etc availability checks into something less asinine */
    
    Skriv's avatar
    Skriv committed
    
    
    window.isItemAccessible = (function() {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	return {
    		array: array,
    		entry: entry,
    	};
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	/**
    	 * Checks whether clothing is accessible
    	 * @param {string} string Name of wearable item
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	 * @param {string} category that item is in clothing, collar, etc
    	 * @param {App.Entity.SlaveState} slave
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	 * @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.
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	 */
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	function entry(string, category = "clothing", slave) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    		if (V.cheatMode === 1) {
    			return true;
    		}
    
    		let niceDB = [];
    		let harshDB = [];
    
    		switch (category) {
    			case "clothing":
    			case "clothes":
    				niceDB = App.Data.misc.niceClothes;
    				harshDB = App.Data.misc.harshClothes;
    				break;
    			case "collar":
    				niceDB = App.Data.misc.niceCollars;
    				harshDB = App.Data.misc.harshCollars;
    				break;
    			case "bellyAccessory":
    				niceDB = App.Data.misc.bellyAccessories;
    				break;
    			case "buttplug":
    				niceDB = App.Data.misc.buttplugs;
    				break;
    			case "buttplugAttachment":
    				niceDB = App.Data.misc.buttplugAttachments;
    				break;
    			case "vaginalAccessory":
    				niceDB = App.Data.misc.vaginalAccessories;
    				break;
    			case "vaginalAttachment":
    				niceDB = App.Data.misc.vaginalAttachments;
    				break;
    			case "dickAccessory":
    				niceDB = App.Data.misc.vaginalAccessories;
    				break;
    			case "shoes":
    				niceDB = App.Data.misc.shoes;
    				break;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			case "chastity":
    				niceDB = App.Data.misc.chastityDevices;
    				break;
    
    			default:
    				console.log(`made a category for ${category} automatically, may need to define this by hand`);
    				niceDB = App.Data.misc[category];
    				break;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    		}
    		let item = niceDB.find((i) => i.value === string);
    
    		if (!item && (typeof harshDB !== 'undefined')) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			item = harshDB.find((i) => i.value === string);
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    		}
    		if (!item) {
    
    svornost's avatar
    svornost committed
    			console.log(`${string} is not a registered piece of clothing! Check App.Data.misc.${category}`);
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			return false; /* couldn't be found */
    		}
    
    		return isAvailable(item, category, slave);
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	/**
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	 * Returns array of wearable clothing in format [name, value], basically player facing / game data.
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	 * @param {string} db Name of array to look in (such as "App.Data.misc.niceClothes")
    	 * @returns {Array}
    	 */
    	function array(db) {
    		const array = [];
    		db.forEach((i) => {
    			if (V.cheatMode || isAvailable(i)) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				let name = i.name;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				if (i.fs) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    					name = i.name + ` (FS)`;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				array.push([name, i.value]);
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			}
    		});
    		return array;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    
    
    	function isAvailable(item, category, slave) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    		if (slave) {
    			let slaveResults = isAvailableForSlave(item, category, slave);
    			if (slaveResults !== true) { // If they are true we pass this check but want to run the others.
    				return slaveResults;
    			}
    		}
    
    		if (!(item.hasOwnProperty("fs")) && !(item.hasOwnProperty("rs"))) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			// No restriction, this clothing item is available to everyone
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    		if (item.hasOwnProperty("rs")) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			if (typeof item.rs === 'object' && item.rs !== null) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				let fail = false;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				// Scan rs requirments one by one if they are an object
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				Object.keys(item.rs).forEach((requirement) => {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    					if (typeof item.rs[requirement] === 'object' && item.rs[requirement] !== null) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    						let eitherCheck = 0;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    						if (requirement === "either") { // If we find the "either" nested object, we need to see if just one of the conditions in it are true.
    							Object.keys(item.rs.either).forEach((nestedRequirement) => {
    								if (typeof item.rs.either[nestedRequirement] === 'object' && item.rs.either[nestedRequirement] !== null) { // And yes sometimes even in either we have a nested object, to check V.PC mostly, so check for it.
    									let insideEitherCheck = 0;
    									Object.keys(item.rs.either[nestedRequirement]).forEach((insideNestedRequirement) => {
    										if (V[nestedRequirement][insideNestedRequirement] === item.rs.either[nestedRequirement][insideNestedRequirement]) {
    											insideEitherCheck++;
    										}
    									});
    									if (insideEitherCheck > 0) {
    										eitherCheck++;
    									}
    									if (V[nestedRequirement] === item.rs.either[nestedRequirement]) {
    										eitherCheck++;
    									}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    								} else {
    
    									if (item.rs.either[nestedRequirement] === V[nestedRequirement]) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    										eitherCheck++;
    									}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    								}
    							});
    						} else {
    							Object.keys(item.rs.either).forEach((nestedRequirement) => { // Otherwise we are probably recording a nested V variable to be checked.
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    								if (V[requirement][nestedRequirement] === item.rs[requirement][nestedRequirement]) {
    									eitherCheck++;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    								}
    							});
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    						}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    						if (eitherCheck === 0) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    							fail = true;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    						}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    					} else {
    						if (V[requirement] !== item.rs[requirement]) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    							fail = true;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    						}
    					}
    				});
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				if (fail) {
    					return false;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				} else {
    					return true;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				}
    			} else { // string
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				if (V[item.rs] < 1) {
    					return false;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				} else {
    					return true;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			}
    		}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    		if (item.hasOwnProperty("fs")) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			if (!(V.arcologies[0][item.fs] > 0)) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				return false;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    		return true;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    	function isAvailableForSlave(item, category, slave) {
    
    		switch (category) {
    			case "clothing":
    			case "clothes":
    				break;
    			case "collar":
    				break;
    			case "bellyAccessory": {
    				switch (item.value) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    					case "a support band": {
    
    						if (slave.belly > 10000) {
    							return true;
    						} else {
    							return `Slave belly too small for this`;
    						}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    					}
    					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) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    					case "huge plug": {
    
    						if (slave.anus < 2) {
    							return `Slave's anus is too small for this right now`;
    						} else {
    							return true;
    						}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    					}
    					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) {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    					case "huge dildo": {
    
    						if (slave.vagina < 2) {
    							return `Slave's vagina is too small for this right now`;
    						} else {
    							return true;
    						}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    					}
    					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":
    				if (slave.dick < 1) {
    					return false;
    				}
    				return true;
    			case "shoes":
    				break;
    			case "chastity": {
    				switch (item.value) {
    					case "chastity belt":
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    					case "combined chastity belt": {
    
    						if (slave.vagina > -1) {
    							return true;
    						} else {
    							return false;
    						}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    					}
    					case "chastity cage":
    					case "combined chastity cage": {
    						if (slave.dick > 0) {
    							return true;
    						} else {
    							return false;
    						}
    					}
    					case "genital chastity":
    					case "full chastity": {
    						if (slave.vagina > -1 && slave.dick > 0) {
    							return true;
    						} else {
    							return false;
    						}
    					}
    					case "choose own chastity": {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    						if (slave.choosesOwnChastity !== 1 && slave.devotion > 20 && slave.trust > 0) {
    							if (slave.choosesOwnClothes === 1) {
    								return "Slave is not choosing own clothing";
    							} else {
    								return true;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    						}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    						return false;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    					}
    					case "revoke choosing own chastity": {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    						if (slave.choosesOwnChastity > 0 && slave.devotion > 20 && slave.trust > 0) {
    							if (slave.choosesOwnClothes === 1) {
    								return "Slave is not choosing own clothing";
    							} else {
    								return true;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    						}
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    						return false;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    					}
    					default:
    						return true;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    		return true;
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    })();
    
    Arkerthan's avatar
    Arkerthan committed
    /**
    
    Arkerthan's avatar
    Arkerthan committed
     * @param {App.Entity.SlaveState} slave
     * @param {string} prosthetic
     * @returns {boolean}
     */
    
    window.isProstheticAvailable = function(slave, prosthetic) {
    	return slave.readyProsthetics.findIndex(function(p) { return p.id === prosthetic; }) !== -1;
    };
    
    Arkerthan's avatar
    Arkerthan committed
    
    /**
     * @param {App.Entity.SlaveState} slave
     * @param {string} prosthetic
     */
    window.addProsthetic = function(slave, prosthetic) {
    	if (!isProstheticAvailable(slave, prosthetic)) {
    
    		let limb = prostheticToLimb(prosthetic);
    		if (limb > 0) {
    			let p = {
    				id: prosthetic,
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    				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 {
    
    lowercasedonkey's avatar
    lowercasedonkey committed
    			slave.readyProsthetics.push({id: prosthetic});
    
    Arkerthan's avatar
    Arkerthan committed
    	}
    };
    
    Arkerthan's avatar
    Arkerthan committed
    /**
     * @param {App.Entity.SlaveState} slave
     * @param {string} prosthetic
     * @returns {{}}
     */
    window.findProsthetic = function(slave, prosthetic) {
    	return slave.readyProsthetics.find(p => p.id === prosthetic);
    };
    
    
    /**
     * @param {string} prosthetic
     * @returns {number}
     */
    window.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}
     */
    window.limbToProsthetic = function(limb) {
    	switch (limb) {
    		case 2:
    			return "basicL";
    		case 3:
    			return "sexL";
    		case 4:
    			return "beautyL";
    		case 5:
    			return "combatL";
    		case 6:
    			return "cyberneticL";
    		default:
    			return "";
    	}
    };