Skip to content
Snippets Groups Projects
20-canvasmodel-combat-close-penis.js 5.24 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jimmys's avatar
    Jimmys committed
    // @ts-check
    
    Kirsty's avatar
    Kirsty committed
    /* globals CombatRenderer, CloseCombatMapper, CloseOptions */
    
    Jimmys's avatar
    Jimmys committed
    
    /**
     * @type {CanvasModelOptions<CloseOptions>}
     */
    const combatClosePenis = {
    	name: "combatClosePenis",
    	width: 64,
    	height: 64,
    
    xao's avatar
    xao committed
    	scale: true,
    
    Jimmys's avatar
    Jimmys committed
    	frames: 6,
    	generatedOptions() {
    		return [];
    	},
    	defaultOptions() {
    
    Kirsty's avatar
    Kirsty committed
    		return { ...CloseCombatMapper.generateOptions(), ...this.metadata };
    
    Jimmys's avatar
    Jimmys committed
    	},
    	preprocess(options) {
    
    Kirsty's avatar
    Kirsty committed
    		CloseCombatMapper.mapCloseOptions(options);
    
    		if (V.debug) {
    			// Save options for easy lookup
    			CombatRenderer.options[this.name] = options;
    		}
    
    Jimmys's avatar
    Jimmys committed
    	},
    	layers: {
    		base: {
    			srcfn(options) {
    				return `${options.src}penis/${options.position}/base-${V.player.vaginaExist ? "herm" : "penis"}.png`;
    			},
    			showfn(options) {
    				return !!options.showPenis;
    			},
    			animationfn(options) {
    				return options.animKeyPenis;
    			},
    			filters: ["body"],
    
    Kirsty's avatar
    Kirsty committed
    			z: CombatRenderer.indices.closeBase,
    
    Jimmys's avatar
    Jimmys committed
    		},
    		panties: {
    			srcfn(options) {
    				return `${options.src}penis/${options.position}/panties.png`;
    			},
    			showfn(options) {
    				return !!options.showPenis && V.worn.under_lower.state === "totheside";
    			},
    			animationfn(options) {
    				return options.animKeyPenis;
    			},
    			filters: ["worn_under_lower_main"],
    
    Kirsty's avatar
    Kirsty committed
    			z: CombatRenderer.indices.closeWorn,
    
    Jimmys's avatar
    Jimmys committed
    		},
    		penis: {
    			srcfn(options) {
    				if (window.playerHasStrapon()) {
    					options.pcPenis = V.worn.under_lower.name === "strap-on knotted cock" ? "strapon-knotted" : "strapon-dick";
    				} else if (playerChastity("cage")) {
    					options.pcPenis = options.penis.chastityPenis;
    
    Purity's avatar
    Purity committed
    				} else if (["beast-oral"].includes(options.penis.npc)) {
    
    Jimmys's avatar
    Jimmys committed
    					options.pcPenis = `${options.penis.size}-${options.penis.type}-${options.penis.state}`;
    				} else {
    					options.pcPenis = `${options.penis.size}-${options.penis.type}`;
    				}
    				return `${options.src}penis/${options.position}/${options.pcPenis}.png`;
    			},
    			showfn(options) {
    
    Kirsty's avatar
    Kirsty committed
    				const concealed = (V.worn.genitals.type.includes("hidden") || V.worn.genitals.name === "chastity parasite") && !window.playerHasStrapon();
    
    Jimmys's avatar
    Jimmys committed
    				return !!options.showPenis && !concealed;
    			},
    			animationfn(options) {
    				return options.animKeyPenis;
    			},
    
    Purity's avatar
    Purity committed
    			filtersfn(options) {
    				if (playerHasStrapon()) {
    					return ["worn_under_lower_main"];
    				}
    				if (options.penis.type === "parasite") {
    					return [];
    				}
    				return ["body"];
    			},
    
    Kirsty's avatar
    Kirsty committed
    			z: CombatRenderer.indices.closeGenitals + 4,
    
    Jimmys's avatar
    Jimmys committed
    		},
    		condom: {
    			srcfn(options) {
    
    Kirsty's avatar
    Kirsty committed
    				return `${options.src}penis/${options.position}/${options.penis.size}-condom.png`;
    
    Jimmys's avatar
    Jimmys committed
    			},
    			showfn(options) {
    				return !!options.showPenis && !!options.penis.condom;
    			},
    			animationfn(options) {
    				return options.animKeyPenis;
    			},
    			alpha: 0.4,
    			filters: ["condom"],
    
    Kirsty's avatar
    Kirsty committed
    			z: CombatRenderer.indices.closeGenitals + 4,
    
    Jimmys's avatar
    Jimmys committed
    		},
    		parasite: {
    			srcfn(options) {
    				const panties = V.earSlime.focus === "impregnation" ? "shorts" : "panties";
    				const herm = V.player.vaginaExist ? "-herm" : "";
    				return `${options.src}penis/${options.position}/parasite-${panties}${herm}.png`;
    			},
    			showfn(options) {
    				return !!options.showPenis && (V.parasite.clit.name === "parasite" || V.parasite.penis.name === "parasite");
    			},
    			animationfn(options) {
    				return options.animKeyPenis;
    			},
    			filters: ["parasitePanties"],
    
    Kirsty's avatar
    Kirsty committed
    			z: CombatRenderer.indices.closeWornUnder,
    
    Jimmys's avatar
    Jimmys committed
    		},
    		parasiteBalls: {
    			srcfn(options) {
    				return `${options.src}penis/${options.position}/parasite-balls.png`;
    			},
    			showfn(options) {
    				return (
    					!!options.showPenis &&
    					!!V.player.ballsExist &&
    					V.player.gender === "m" &&
    					(V.parasite.clit.name === "parasite" || V.parasite.penis.name === "parasite") &&
    					["mixed", "impregnation"].includes(V.earSlime.focus)
    				);
    			},
    			animationfn(options) {
    				return options.animKeyPenis;
    			},
    			filters: ["parasitePanties"],
    
    Kirsty's avatar
    Kirsty committed
    			z: CombatRenderer.indices.closeWornUnder,
    
    Jimmys's avatar
    Jimmys committed
    		},
    		chastity: {
    			srcfn(options) {
    				return `${options.src}penis/${options.position}/${options.penis.chastityDevice}.png`;
    			},
    			showfn(options) {
    				return !!options.showPenis && !!playerChastity("penis");
    			},
    			animationfn(options) {
    				return options.animKeyPenis;
    			},
    			filtersfn(options) {
    
    				if (options.penis.chastityDevice.includes("parasite")) {
    					return ["parasitePanties"];
    				}
    				return ["worn_genitals_main"];
    
    Jimmys's avatar
    Jimmys committed
    			},
    
    			z: CombatRenderer.indices.closeWorn + 3,
    
    Jimmys's avatar
    Jimmys committed
    		},
    		penetratedNpc: {
    			srcfn(options) {
    				return `${options.src}penis/${options.position}/npc/${options.penis.npc}-${options.penis.state}.png`;
    			},
    			showfn(options) {
    				return !!options.showPenis && !!options.penis.npc;
    			},
    			animationfn(options) {
    				return options.animKeyPenis;
    			},
    			filtersfn(options) {
    				return options.penis.npc === "tentacle" ? ["penisTentacle"] : ["penisNpc"];
    			},
    			alphafn(options) {
    				return options.penis.npc === "tentacle" && ["tentacles-wraith", "tentacles-wraith-penetrated"].includes(V.tentacleColour) ? 0.4 : 1;
    			},
    
    Kirsty's avatar
    Kirsty committed
    			z: CombatRenderer.indices.closeNpc,
    
    Jimmys's avatar
    Jimmys committed
    		},
    		cum: {
    			srcfn(options) {
    				return `${options.src}penis/${options.position}/npc/${options.penis.npc}-cum.png`;
    			},
    			showfn(options) {
    				return !!options.showPenis && options.penis.npc === "beast-oral" && V.orgasmdown >= 1;
    			},
    			animationfn(options) {
    				return options.animKeyPenis;
    			},
    
    Kirsty's avatar
    Kirsty committed
    			z: CombatRenderer.indices.closeCum,
    
    Jimmys's avatar
    Jimmys committed
    		},
    	},
    };
    Renderer.CanvasModels.combatClosePenis = combatClosePenis;