diff --git a/src/art/artJS.js b/src/art/artJS.js index 019cd3b5a05fb62f7852ca04a0f39ab6eaf46424..13bf1648e1d5a2b41b7f4164fb7680976a8e4149 100644 --- a/src/art/artJS.js +++ b/src/art/artJS.js @@ -1728,1941 +1728,3 @@ window.skinColorCatcher = function (artSlave) { } return colorSlave; }; - -window.VectorArt = (function (artSlave) { - "use strict"; - let V, T, slave; - let r; - let leftArmType, rightArmType, legSize, torsoSize, buttSize, penisSize, hairLength; - let bellyScaleFactor, artBoobScaleFactor, heightScaleFactor; - let artTranslationX, artTranslationY; - let penisDrawtime, penisArtString; - - function VectorArt(artSlave) { - /* set constants */ - V = State.variables; - T = State.temporary; - slave = artSlave; - /* reset/initialize some variables */ - T.artTransformBelly = ""; - T.artTransformBoob = ""; - T.art_transform = ""; /* in case other files are trying to use this, and expecting a string */ - r = ""; - if (V.seeHeight !== 0) - heightScaleFactor = 200 / slave.height; - else - heightScaleFactor = 1; - - setArmType(); - setBoobScaling(); - setButtSize(); - setHairLength(); - setLegSize(); - setPenisSize(); - penisArtControl(); /* depends on setPenisSize and setBoobScaling, sets penisDrawtime and penisArtString */ - setTorsoSize(); - - /* - each function adds one layer of vector art - vector art added later is drawn over previously added art - (what is listed on the bottom in the code appears on the top of the image) - */ - ArtVectorHairBack(); - ArtVectorArm(); - ArtVectorAnalAccessories(); - ArtVectorButt(); - ArtVectorLeg(); - ArtVectorFeet(); /* includes shoes and leg outfits*/ - ArtVectorTorso(); - ArtVectorPussy(); - ArtVectorPubicHair(); - if (slave.vaginaPiercing !== 0 || slave.clitPiercing !== 0) - ArtVectorPussyPiercings(); - ArtVectorChastityBelt(); - ArtVectorTorsoOutfit(); /* note: clothing covers chastity belts */ - if (slave.scrotum > 0 && slave.balls > 0) - ArtVectorBalls(); - if (penisDrawtime === 0) /* for dicks behind boobs */ - r += penisArtString; - ArtVectorBelly(); /* includes navel piercing and belly-related clothing options */ - ArtVectorBoob(); /* includes areolae and piercings */ - if (penisDrawtime === 1) /* for dicks in front of boobs */ - r += penisArtString; - ArtVectorBoobAddons(); /* piercings always appear in front of boobs AND dick */ - ArtVectorCollar(); /* includes clavicle artwork */ - ArtVectorHead(); /* glasses are drawn here */ - ArtVectorHairFore(); - - return r; - } - - function setArmType() { - if (slave.amp === 1) { - leftArmType = "None"; - rightArmType = "None"; - } else { - if (slave.devotion > 50) { - leftArmType = "High"; - rightArmType = "High"; - } else if (slave.trust >= -20) { - if (slave.devotion < -20) { - leftArmType = "Rebel"; - rightArmType = "Low"; - } else if (slave.devotion <= 20) { - leftArmType = "Low"; - rightArmType = "Low"; - } else { - leftArmType = "Mid"; - rightArmType = "High"; - } - } else { - leftArmType = "Mid"; - rightArmType = "Mid"; - } - } - } - - function setBoobScaling() { - /* - Prepare SVG transform matrix for continuous boob scaling. - This transform affects boobs, areolae and piercings. - The parameters were fit by points (300,1.0) and (15000,2.5). - See https://www.wolframalpha.com/input/?i=log+fit+%7B%7B300,1%7D,%7B15000,2.5%7D%7D . - Boobs start at 300cc as of "flesh description widgets". - Upper value was discussed at https://github.com/Free-Cities/Free-Cities/issues/950#issuecomment-321359466 . - */ - if (slave.boobs < 300) { - artBoobScaleFactor = 1; - artTranslationX = 22; /* a little shift to the right is needed due to perspective */ - artTranslationY = 0; - } else { - artBoobScaleFactor = 0.383433 * Math.log(0.0452403 * slave.boobs) * heightScaleFactor; - artTranslationX = -282.841 * artBoobScaleFactor + 292.349; - artTranslationY = -225.438 * artBoobScaleFactor + 216.274; - } - T.artTransformBoob = `matrix(${artBoobScaleFactor},0,0,${artBoobScaleFactor},${artTranslationX},${artTranslationY})`; - } - - function setButtSize() { - /* Size calculations - needs to be done even for amputees */ - buttSize = Math.clamp(Math.trunc(slave.butt), 1, 7) - 1; - } - - function setHairLength() { - hairLength = undefined; - if (slave.hLength >= 60) - hairLength = "Long"; - else if (slave.hLength >= 30) - hairLength = "Medium"; - else if (slave.hLength >= 10) - hairLength = "Short"; - } - - function setLegSize() { - /* Leg wideness switch courtesy of Nov-X */ - /* needs to be done even for amputees */ - if (slave.hips === -2) { - if (slave.weight <= 0) - legSize = "Narrow"; - else if (slave.weight < 161) - legSize = "Normal"; - else - legSize = "Wide"; - } else if (slave.hips === -1) { - if (slave.weight <= -11) - legSize = "Narrow"; - else if (slave.weight < 96) - legSize = "Normal"; - else - legSize = "Wide"; - } else if (slave.hips === 0) { - if (slave.weight <= -96) - legSize = "Narrow"; - else if (slave.weight < 11) - legSize = "Normal"; - else if (slave.weight < 131) - legSize = "Wide"; - else - legSize = "Thick"; - } else if (slave.hips === 1) { - if (slave.weight <= -31) - legSize = "Normal"; - else if (slave.weight < 31) - legSize = "Wide"; - else - legSize = "Thick"; - } else { /* .hips === 2 or 3 */ - if (slave.weight <= -11) - legSize = "Wide"; - else - legSize = "Thick"; - } - } - - function setPenisSize() { - penisSize = undefined; - if (slave.dick > 6 || (slave.dick > 0 && slave.belly <= 4000)) - penisSize = Math.clamp(slave.dick, 1, 11) - 1; - } - - function penisArtControl() { - penisArtString = ""; - if (penisSize === undefined) { - penisDrawtime = -1; /* no penis to draw */ - } else { - penisDrawtime = 0; /* default is to draw before boobs/belly */ - switch (slave.clothes) { - /* BULGE OUTFITS LONG+MEDIUM OUTFITS */ - case "a ball gown": - case "a biyelgee costume": - case "a burkini": - case "a burqa": - case "a dirndl": - case "a halter top dress": - case "a hijab and abaya": - case "a hijab and blouse": - case "a kimono": - case "a klan robe": - case "a long qipao": - case "a maternity dress": - case "a military uniform": - case "a mounty outfit": - case "a nice maid outfit": - case "a nice nurse outfit": - case "a niqab and abaya": - case "a police uniform": - case "a red army uniform": - case "a schutzstaffel uniform": - case "a skimpy loincloth": - case "a slave gown": - case "a slutty nurse outfit": - case "a slutty schutzstaffel uniform": - case "a t-shirt and jeans": - case "a toga": - case "an apron": - case "battlearmor": - case "battledress": - case "conservative clothing": - case "jeans": - case "leather pants": - case "leather pants and a tube top": - case "leather pants and pasties": - case "lederhosen": - case "nice business attire": - case "slutty business attire": - case "spats and a tank top": - case "sport shorts": - case "sport shorts and a sports bra": - case "sport shorts and a t-shirt": - case "stretch pants and a crop-top": - penisArtString = jsInclude(`Art_Vector_Bulge_Outfit_${penisSize}`); - break; - /* BULGE OUTFITS SHORT OUTFITS */ - case "a bunny outfit": - case "a button-up shirt and panties": - case "a chattel habit": - case "a huipil": - case "a leotard": - case "a mini dress": - case "a monokini": - case "a one-piece swimsuit": - case "a penitent nuns habit": - case "a scalemail bikini": - case "a slutty klan robe": - case "a slutty maid outfit": - case "a slutty outfit": - case "a slutty qipao": - case "a succubus outfit": - case "a sweater and cutoffs": - case "a sweater and panties": - case "a t-shirt and panties": - case "a t-shirt and thong": - case "a tank-top and panties": - case "a thong": - case "a tube top and thong": - case "an oversized t-shirt and boyshorts": - case "attractive lingerie for a pregnant woman": - case "boyshorts": - case "cutoffs": - case "cutoffs and a t-shirt": - case "harem gauze": - case "kitty lingerie": - case "panties": - case "panties and pasties": - case "striped panties": - case "striped underwear": - if (slave.belly <= 4000) { - if (slave.dick > 3) - penisArtString = jsInclude("Art_Vector_Bulge_Outfit_3"); - else - penisArtString = jsInclude(`Art_Vector_Bulge_Outfit_${penisSize}`); - } - break; - /* hide everything */ - case "a cheerleader outfit": - case "a gothic lolita dress": - case "a hanbok": - case "a schoolgirl outfit": - break; - /* full frontal */ - default: - if (canAchieveErection(slave) && slave.dickAccessory !== "chastity" && slave.dickAccessory !== "combined chastity") { - penisDrawtime = 1; /* draw erect penis over boobs if boobs do not hide the penis' base */ - if (artBoobScaleFactor < 3.7) { - if (slave.foreskin !== 0) - penisArtString = jsInclude(`Art_Vector_Penis_${penisSize}`); - else - penisArtString = jsInclude(`Art_Vector_PenisCirc_${penisSize}`); - } - } else { - /* flaccid penises are drawn behind the boobs/belly */ - if (slave.foreskin !== 0) - penisArtString = jsInclude(`Art_Vector_Flaccid_${penisSize}`); - else - penisArtString = jsInclude(`Art_Vector_FlaccidCirc_${penisSize}`); - /* this draws chastity OVER latex catsuit. prndev finds this alright. */ - if (slave.dickAccessory === "chastity" || slave.dickAccessory === "combined chastity") - penisArtString += jsInclude(`Art_Vector_Chastity_Cage_${penisSize}`); - } - } - } - } - - function setTorsoSize() { - /* Torso size switch courtesy of Nov-X */ - if (slave.waist >= 96) { - if (slave.weight >= 96) - torsoSize = "Obese"; - else if (slave.weight >= 11) - torsoSize = "Fat"; - else if (slave.weight > -31) - torsoSize = "Chubby"; - else - torsoSize = "Normal"; - } else if (slave.waist >= 41) { - if (slave.weight >= 131) - torsoSize = "Obese"; - else if (slave.weight >= 31) - torsoSize = "Fat"; - else if (slave.weight >= 0) - torsoSize = "Chubby"; - else if (slave.weight > -96) - torsoSize = "Normal"; - else - torsoSize = "Hourglass"; - } else if (slave.waist >= 11) { - if (slave.weight >= 161) - torsoSize = "Obese"; - else if (slave.weight >= 96) - torsoSize = "Fat"; - else if (slave.weight >= 11) - torsoSize = "Chubby"; - else if (slave.weight > -31) - torsoSize = "Normal"; - else - torsoSize = "Hourglass"; - } else if (slave.waist > -11) { - if (slave.weight >= 191) - torsoSize = "Obese"; - else if (slave.weight >= 131) - torsoSize = "Fat"; - else if (slave.weight >= 31) - torsoSize = "Chubby"; - else if (slave.weight >= 0) - torsoSize = "Normal"; - else if (slave.weight > -96) - torsoSize = "Hourglass"; - else - torsoSize = "Unnatural"; - } else if (slave.waist > -41) { - if (slave.weight >= 161) - torsoSize = "Fat"; - else if (slave.weight >= 96) - torsoSize = "Chubby"; - else if (slave.weight >= 11) - torsoSize = "Normal"; - else if (slave.weight > -31) - torsoSize = "Hourglass"; - else - torsoSize = "Unnatural"; - } else if (slave.waist > -96) { - if (slave.weight >= 191) - torsoSize = "Fat"; - else if (slave.weight >= 131) - torsoSize = "Chubby"; - else if (slave.weight >= 31) - torsoSize = "Normal"; - else if (slave.weight > -11) - torsoSize = "Hourglass"; - else - torsoSize = "Unnatural"; - } else { - if (slave.weight >= 161) - torsoSize = "Chubby"; - else if (slave.weight >= 96) - torsoSize = "Normal"; - else if (slave.weight > 0) - torsoSize = "Hourglass"; - else - torsoSize = "Unnatural"; - } - } - - function ArtVectorAnalAccessories() { - if (slave.buttplug === "long plug") - r += jsInclude("Art_Vector_Plug_Long"); - else if (slave.buttplug === "large plug") - r += jsInclude("Art_Vector_Plug_Large"); - else if (slave.buttplug === "long, large plug") - r += jsInclude("Art_Vector_Plug_Large_Long"); - else if (slave.buttplug === "huge plug") - r += jsInclude("Art_Vector_Plug_Huge"); - else if (slave.buttplug === "long, huge plug") - r += jsInclude("Art_Vector_Plug_Huge_Long"); - - if (slave.buttplugAttachment === "tail") - r += jsInclude("Art_Vector_Plug_Tail"); - else if (slave.buttplugAttachment === "cat tail") - r += jsInclude("Art_Vector_Cat_Tail"); - } - - function ArtVectorArm() { - /* Arms position switch courtesy of Nov-X */ - /* Updated 2018-10-25 by Fr0g */ - /* - changed arm calculation block position*/ - /* - added brackets to make boolean logic run */ - - if (slave.amp === 1) { - /* Many amputee clothing art files exist, but draw nothing.They are excluded for now to reduce on rendering time - r += jsInclude("Art_Vector_Arm_Right_None"); - r += jsInclude("Art_Vector_Arm_Left_None"); - */ - } else { /* is not amputee or has limbs equipped so running arm calculation block */ - if (slave.amp === 0) { - r += jsInclude(`Art_Vector_Arm_Right_${rightArmType}`); - r += jsInclude(`Art_Vector_Arm_Left_${leftArmType}`); - if (slave.muscles >= 6) { - if (leftArmType === "High") - r += jsInclude("Art_Vector_Arm_Left_High_MLight"); - else if (leftArmType === "Mid") - r += jsInclude("Art_Vector_Arm_Left_Mid_MLight"); - else if (leftArmType === "Low") - r += jsInclude("Art_Vector_Arm_Left_Low_MLight"); - else if (leftArmType === "Rebel") - r += jsInclude("Art_Vector_Arm_Left_Rebel_MLight"); - - if (rightArmType === "High") - r += jsInclude("Art_Vector_Arm_Right_High_MLight"); - else if (rightArmType === "Mid") - r += jsInclude("Art_Vector_Arm_Right_Mid_MLight"); - else if (rightArmType === "Low") - r += jsInclude("Art_Vector_Arm_Right_Low_MLight"); - } - } else if (slave.PLimb === 1 || slave.PLimb === 2) { /* slave is an amputee and has PLimbs equipped */ - if (slave.amp === -1) { - r += jsInclude(`Art_Vector_Arm_Right_ProstheticBasic_${rightArmType}`); - r += jsInclude(`Art_Vector_Arm_Left_ProstheticBasic_${leftArmType}`); - } else if (slave.amp === -2) { - r += jsInclude(`Art_Vector_Arm_Right_ProstheticSexy_${rightArmType}`); - r += jsInclude(`Art_Vector_Arm_Left_ProstheticSexy_${leftArmType}`); - } else if (slave.amp === -3) {/* Reverting beauty limbs to regular SVG */ - r += jsInclude(`Art_Vector_Arm_Right_ProstheticBeauty_${rightArmType}`); - r += jsInclude(`Art_Vector_Arm_Left_ProstheticBeauty_${leftArmType}`); - } else if (slave.amp === -4) { - r += jsInclude(`Art_Vector_Arm_Right_ProstheticCombat_${rightArmType}`); - r += jsInclude(`Art_Vector_Arm_Left_ProstheticCombat_${leftArmType}`); - } else if (slave.amp === -5) { - r += jsInclude(`Art_Vector_Arm_Right_ProstheticSwiss_${rightArmType}`); - r += jsInclude(`Art_Vector_Arm_Left_ProstheticSwiss_${leftArmType}`); - } - } - /* shiny clothing */ - if (V.seeVectorArtHighlights === 1) { - if (slave.fuckdoll !== 0 || slave.clothes === "restrictive latex" || slave.clothes === "a latex catsuit" || slave.clothes === "body oil") { - /* only some arm positions have art (feel free to add more) */ - if (leftArmType === "High") - r += jsInclude("Art_Vector_Arm_Outfit_Shine_Left_High"); - else if (leftArmType === "Mid") - r += jsInclude("Art_Vector_Arm_Outfit_Shine_Left_Mid"); - else if (leftArmType === "Low") - r += jsInclude("Art_Vector_Arm_Outfit_Shine_Left_Low"); - } - } - /* TODO: simplify selection (select prefix, infix and suffix and combine instead of using switch statements) */ - switch (slave.clothes) { - case "a biyelgee costume": - case "a burkini": - case "a button-up shirt": - case "a button-up shirt and panties": - case "a cheerleader outfit": - case "a dirndl": - case "a gothic lolita dress": - case "a hanbok": - case "a hijab and blouse": - case "a huipil": - case "a kimono": - case "a klan robe": - case "a long qipao": - case "a military uniform": - case "a mounty outfit": - case "a nice maid outfit": - case "a nice nurse outfit": - case "a police uniform": - case "a red army uniform": - case "a schoolgirl outfit": - case "a slutty klan robe": - case "a slutty nurse outfit": - case "a slutty qipao": - case "a sweater": - case "a sweater and cutoffs": - case "a sweater and panties": - case "a t-shirt": - case "a t-shirt and jeans": - case "a t-shirt and panties": - case "a t-shirt and thong": - case "an oversized t-shirt": - case "an oversized t-shirt and boyshorts": - case "battlearmor": - case "battledress": - case "clubslut netting": - case "conservative clothing": - case "cutoffs and a t-shirt": - case "lederhosen": - case "nice business attire": - case "slutty business attire": - case "slutty jewelry": - case "sport shorts and a t-shirt": - case "Western clothing": - r += jsInclude(`Art_Vector_Arm_Outfit_${clothing2artSuffix(slave.clothes)}_Right_${rightArmType}`); - r += jsInclude(`Art_Vector_Arm_Outfit_${clothing2artSuffix(slave.clothes)}_Left_${leftArmType}`); - break; - /* manually handle special cases */ - case "a schutzstaffel uniform": - case "a slutty schutzstaffel uniform": - r += jsInclude(`Art_Vector_Arm_Outfit_SchutzstaffelUniform_Right_${rightArmType}`); - r += jsInclude(`Art_Vector_Arm_Outfit_SchutzstaffelUniform_Left_${leftArmType}`); - break; - case "a hijab and abaya": - case "a niqab and abaya": - case "a burqa": - r += jsInclude(`Art_Vector_Arm_Outfit_HijabAndAbaya_Right_${rightArmType}`); - r += jsInclude(`Art_Vector_Arm_Outfit_HijabAndAbaya_Left_${leftArmType}`); - break; - case "a slave gown": - /* only some arm positions have art (feel free to add more) */ - if (leftArmType !== "Rebel") - r += jsInclude(`Art_Vector_Arm_Outfit_SlaveGown_Left_${leftArmType}`); - } - } /* close .amp check */ - } - - function ArtVectorBalls() { - switch (slave.clothes) { - case "a bra": - case "a button-up shirt": - case "a comfortable bodysuit": - case "a cybersuit": - case "a fallen nuns habit": - case "a hanbok": - case "a latex catsuit": - case "a monokini": - case "a nice pony outfit": - case "a slutty pony outfit": - case "a sports bra": - case "a string bikini": - case "a striped bra": - case "a sweater": - case "a t-shirt": - case "a tank-top": - case "a thong": - case "a tube top": - case "an oversized t-shirt": - case "attractive lingerie": - case "body oil": - case "chains": - case "choosing her own clothes": - case "clubslut netting": - case "no clothing": - case "panties and pasties": - case "restrictive latex": - case "shibari ropes": - case "slutty jewelry": - case "uncomfortable straps": - case "Western clothing": - let ballsScaleFactor = (slave.scrotum / 3) * heightScaleFactor; - artTranslationX = -271 * (ballsScaleFactor - 1); - artTranslationY = -453 * (ballsScaleFactor - 1); - T.artTransformBalls = `matrix(${ballsScaleFactor},0,0,${ballsScaleFactor},${artTranslationX},${artTranslationY})`; - r += jsInclude("Art_Vector_Balls"); - } - } - - function ArtVectorBelly() { - if (slave.belly >= 2000) { - /* add pregnancy belly, scale dynamically (clothing and addons can be scaled, too) */ - /* TODO: add check in penis control. do not draw penis atop belly if _art_belly_scale_factor > 1. */ - bellyScaleFactor = 0.300 * Math.log(0.011 * slave.belly) * heightScaleFactor; - artTranslationX = -262 * (bellyScaleFactor - 1); - artTranslationY = -284 * (bellyScaleFactor - 1); - T.artTransformBelly = `matrix(${bellyScaleFactor},0,0,${bellyScaleFactor},${artTranslationX},${artTranslationY})`; - - if (slave.navelPiercing === 1) - r += jsInclude("Art_Vector_Belly_Pregnant_Piercing"); - else if (slave.navelPiercing === 2) - r += jsInclude("Art_Vector_Belly_Pregnant_Piercing_Heavy"); - else - r += jsInclude("Art_Vector_Belly"); - - switch (slave.clothes) { - case "a bra": - case "a cybersuit": - case "a Fuckdoll suit": - case "a latex catsuit": - case "a nice pony outfit": - case "a scalemail bikini": - case "a skimpy loincloth": - case "a slutty klan robe": - case "a slutty outfit": - case "a slutty pony outfit": - case "a sports bra": - case "a string bikini": - case "a striped bra": - case "a thong": - case "a tube top": - case "a tube top and thong": - case "attractive lingerie": - case "attractive lingerie for a pregnant woman": - case "body oil": - case "boyshorts": - case "chains": - case "choosing her own clothes": - case "cutoffs": - case "jeans": - case "kitty lingerie": - case "leather pants": - case "leather pants and a tube top": - case "leather pants and pasties": - case "no clothing": - case "panties": - case "panties and pasties": - case "restrictive latex": - case "shibari ropes": - case "slutty jewelry": - case "sport shorts": - case "sport shorts and a sports bra": - case "stretch pants and a crop-top": - case "striped panties": - case "striped underwear": - case "uncomfortable straps": - break; /* do nothing for these choices */ - /* manually handle special cases */ - case "a slutty schutzstaffel uniform": - r += jsInclude("Art_Vector_Belly_Outfit_SchutzstaffelUniform"); - break; - case "a niqab and abaya": - case "a burqa": - r += jsInclude("Art_Vector_Belly_Outfit_HijabAndAbaya"); - break; - default: - r += jsInclude(`Art_Vector_Belly_Outfit_${clothing2artSuffix(slave.clothes)}`); - } - /* shiny clothing */ - if (V.seeVectorArtHighlights === 1) { - if (slave.fuckdoll !== 0 || slave.clothes === "restrictive latex" || slave.clothes === "a latex catsuit" || slave.clothes === "body oil") { - r += jsInclude("Art_Vector_Belly_Outfit_Shine"); - } - } - } - /* belly piercings for flat bellies */ - if (slave.belly === 0) { - if (slave.navelPiercing === 1) - r += jsInclude("Art_Vector_Belly_Piercing"); - else if (slave.navelPiercing === 2) - r += jsInclude("Art_Vector_Belly_Piercing_Heavy"); - } - /* Torso Accessories */ - if ((slave.bellyAccessory === "a corset" || slave.bellyAccessory === "an extreme corset") && slave.belly === 0) { - if (torsoSize === "Normal") - r += jsInclude("Art_Vector_Corsetnormal"); - else if (torsoSize === "Hourglass") - r += jsInclude("Art_Vector_Corsethourglass"); - else if (torsoSize === "Unnatural") - r += jsInclude("Art_Vector_Corsetunnatural"); - } else if (slave.bellyAccessory === "a small empathy belly") { - r += jsInclude("Art_Vector_Empathy_Belly_Small"); - } else if (slave.bellyAccessory === "a medium empathy belly") { - r += jsInclude("Art_Vector_Empathy_Belly_Medium"); - } else if (slave.bellyAccessory === "a large empathy belly") { - r += jsInclude("Art_Vector_Empathy_Belly_Large"); - } else if (slave.bellyAccessory === "a huge empathy belly") { - r += jsInclude("Art_Vector_Empathy_Belly_Huge"); - } - } - - function ArtVectorBoob() { - if (slave.boobs < 300) { - /* BEWARE: this threshold may be used in other art-related code, too */ - /* boobs too small - draw areolae directly onto torso */ - } else { - r += jsInclude("Art_Vector_Boob_Alt"); - /* shiny clothing */ - if (V.seeVectorArtHighlights === 1) { - if (slave.fuckdoll !== 0 || slave.clothes === "a latex catsuit" || slave.clothes === "body oil") - r += jsInclude("Art_Vector_Boob_Outfit_Shine"); - } - } - switch (slave.clothes) { /* display nipples/areola for the following clothes */ - case "a chattel habit": - case "a fallen nuns habit": - case "a Fuckdoll suit": - case "a monokini": - case "a nice pony outfit": - case "a skimpy loincloth": - case "a slutty pony outfit": - case "a string bikini": - case "a succubus outfit": - case "a thong": - case "a toga": - case "attractive lingerie for a pregnant woman": - case "body oil": - case "boyshorts": - case "chains": - case "choosing her own clothes": - case "clubslut netting": - case "cutoffs": - case "jeans": - case "leather pants": - case "no clothing": - case "panties": - case "restrictive latex": - case "shibari ropes": - case "slutty jewelry": - case "sport shorts": - case "striped panties": - case "uncomfortable straps": - if (slave.areolaeShape === "star") - r += jsInclude("Art_Vector_Boob_Areola_Star"); - else if (slave.areolaeShape === "heart") - r += jsInclude("Art_Vector_Boob_Areola_Heart"); - else if (slave.areolae === 0) - r += jsInclude("Art_Vector_Boob_Areola"); - else if (slave.areolae === 1) - r += jsInclude("Art_Vector_Boob_Areola_Large"); - else if (slave.areolae === 2) - r += jsInclude("Art_Vector_Boob_Areola_Wide"); - else if (slave.areolae === 3) - r += jsInclude("Art_Vector_Boob_Areola_Huge"); - - if (slave.nipples === "tiny") - r += jsInclude("Art_Vector_Boob_NippleTiny"); - else if (slave.nipples === "cute") - r += jsInclude("Art_Vector_Boob_NippleCute"); - else if (slave.nipples === "puffy") - r += jsInclude("Art_Vector_Boob_NipplePuffy"); - else if (slave.nipples === "inverted") - r += jsInclude("Art_Vector_Boob_NippleInverted"); - else if (slave.nipples === "huge") - r += jsInclude("Art_Vector_Boob_NippleHuge"); - else if (slave.nipples === "partially inverted") - r += jsInclude("Art_Vector_Boob_NipplePartiallyInverted"); - else if (slave.nipples === "fuckable") - r += jsInclude("Art_Vector_Boob_NippleFuckable"); - } - } - - function ArtVectorBoobAddons() { - if (slave.boobs < 300) { - /* boobs too small: do not show boob-related art */ - /* BEWARE: this threshold should be kept in sync with the one in Art_Vector_Boob_ */ - } else { - switch (slave.clothes) { - case "a chattel habit": - case "a comfortable bodysuit": - case "a cybersuit": - case "a fallen nuns habit": - case "a Fuckdoll suit": - case "a latex catsuit": - case "a nice pony outfit": - case "a skimpy loincloth": - case "a slutty pony outfit": - case "a succubus outfit": - case "a thong": - case "body oil": - case "boyshorts": - case "choosing her own clothes": - case "cutoffs": - case "jeans": - case "leather pants": - case "no clothing": - case "panties": - case "restrictive latex": - case "sport shorts": - case "striped panties": - break; /* do nothing for these choices */ - /* manually handle special cases */ - case "a slutty schutzstaffel uniform": - r += jsInclude("Art_Vector_Boob_Outfit_SchutzstaffelUniform"); - break; - case "a niqab and abaya": - case "a burqa": - r += jsInclude("Art_Vector_Boob_Outfit_HijabAndAbaya"); - break; - default: - r += jsInclude(`Art_Vector_Boob_Outfit_${clothing2artSuffix(slave.clothes)}`); - } - } - if (V.showBodyMods === 1 && (slave.nipplesPiercing > 0 || slave.areolaePiercing > 0)) { - /* shows nipple piercings in game when selected; piercings will show on the outfits listed below */ - switch (slave.clothes) { - case "a chattel habit": - case "a comfortable bodysuit": - case "a cybersuit": - case "a fallen nuns habit": - case "a latex catsuit": - case "a monokini": - case "a nice pony outfit": - case "a penitent nuns habit": - case "a skimpy loincloth": - case "a slutty pony outfit": - case "a string bikini": - case "a succubus outfit": - case "a thong": - case "an apron": - case "attractive lingerie": - case "attractive lingerie for a pregnant woman": - case "body oil": - case "boyshorts": - case "chains": - case "choosing her own clothes": - case "cutoffs": - case "jeans": - case "leather pants": - case "leather pants and a tube top": - case "leather pants and pasties": - case "no clothing": - case "panties": - case "restrictive latex": - case "shibari ropes": - case "slutty jewelry": - case "sport shorts": - case "striped panties": - case "uncomfortable straps": - if (slave.nipplesPiercing === 1) - r += jsInclude("Art_Vector_Boob_Piercing"); - else if (slave.nipplesPiercing > 1) - r += jsInclude("Art_Vector_Boob_Piercing_Heavy"); - - if (slave.areolaePiercing === 1) - r += jsInclude("Art_Vector_Boob_Areola_Piercing"); - else if (slave.areolaePiercing > 1) - r += jsInclude("Art_Vector_Boob_Areola_Piercingheavy"); - } - } - } - - function ArtVectorButt() { - if (slave.amp === 0) - r += jsInclude(`Art_Vector_Butt_${buttSize}`); - else if (slave.amp === -1) - r += jsInclude(`Art_Vector_Butt_ProstheticBasic_${buttSize}`); - else if (slave.amp === -2) - r += jsInclude(`Art_Vector_Butt_ProstheticSexy_${buttSize}`); - else if (slave.amp === -3) /* reverted to regular SVG to match description */ - r += jsInclude(`Art_Vector_Butt_ProstheticBeauty_${buttSize}`); - else if (slave.amp === -4) - r += jsInclude(`Art_Vector_Butt_ProstheticCombat_${buttSize}`); - else if (slave.amp === -5) - r += jsInclude(`Art_Vector_Butt_ProstheticSwiss_${buttSize}`); - } - - function ArtVectorChastityBelt() { - let bodySize = ""; - if (slave.waist >= 96) { - if (slave.weight >= 11) - bodySize = "Fat"; - else if (slave.weight > -31) - bodySize = "_Chubby"; - } else if (slave.waist >= 41) { - if (slave.weight >= 31) - bodySize = "Fat"; - else if (slave.weight >= 0) - bodySize = "_Chubby"; - } else if (slave.waist >= 11) { - if (slave.weight >= 96) - bodySize = "Fat"; - else if (slave.weight >= 11) - bodySize = "_Chubby"; - } else if (slave.waist > -11) { - if (slave.weight >= 131) - bodySize = "Fat"; - else if (slave.weight >= 31) - bodySize = "_Chubby"; - } else if (slave.waist > -41) { - if (slave.weight >= 161) - bodySize = "Fat"; - else if (slave.weight >= 96) - bodySize = "_Chubby"; - } else if (slave.waist > -96) { - if (slave.weight >= 191) - bodySize = "Fat"; - else if (slave.weight >= 131) - bodySize = "_Chubby"; - } else { - if (slave.weight >= 31) - bodySize = "_Chubby"; - } - - if (slave.dickAccessory === "anal chastity" || slave.dickAccessory === "combined chastity" || slave.vaginalAccessory === "anal chastity" || slave.vaginalAccessory === "combined chastity") { - if (bodySize === "Fat") { - r += jsInclude("Art_Vector_Chastity_Vagina_Fat"); - } else { - r += jsInclude("Art_Vector_Chastity_Anus"); - r += jsInclude(`Art_Vector_Chastity_Base${bodySize}`); - } - } - if (slave.vaginalAccessory === "chastity belt" || slave.vaginalAccessory === "combined chastity") { - if (bodySize === "Fat") { - r += jsInclude("Art_Vector_Chastity_Vagina_Fat"); - } else { - r += jsInclude("Art_Vector_Chastity_Vagina"); - r += jsInclude(`Art_Vector_Chastity_Base${bodySize}`); - } - } - if (slave.vaginalAccessory !== "none") { - switch (slave.clothes) {/* shows vaginal accessories on the outfits below */ - case "a bra": - case "a button-up shirt": - case "a button-up shirt and panties": - case "a chattel habit": - case "a comfortable bodysuit": - case "a fallen nuns habit": - case "a Fuckdoll suit": - case "a latex catsuit": - case "a monokini": - case "a nice pony outfit": - case "a penitent nuns habit": - case "a slutty klan robe": - case "a slutty outfit": - case "a slutty pony outfit": - case "a sports bra": - case "a string bikini": - case "a striped bra": - case "a succubus outfit": - case "a sweater": - case "a t-shirt": - case "a t-shirt and panties": - case "a t-shirt and thong": - case "a tank-top": - case "a thong": - case "a tube top": - case "a tube top and thong": - case "an apron": - case "an oversized t-shirt": - case "attractive lingerie": - case "attractive lingerie for a pregnant woman": - case "body oil": - case "chains": - case "choosing her own clothes": - case "clubslut netting": - case "cutoffs": - case "harem gauze": - case "no clothing": - case "panties": - case "panties and pasties": - case "restrictive latex": - case "shibari ropes": - case "slutty jewelry": - case "striped underwear": - case "uncomfortable straps": - if (slave.vaginalAccessory === "dildo") { - r += jsInclude("Art_Vector_Dildo_Short"); - } else if (slave.vaginalAccessory === "long dildo") { - r += jsInclude("Art_Vector_Dildo_Long"); - } else if (slave.clothes !== "a comfortable bodysuit" && slave.clothes !== "a string bikini" && slave.clothes !== "attractive lingerie for a pregnant woman" && slave.clothes !== "restrictive latex") { - if (slave.vaginalAccessory === "large dildo") /* additional outfits disabled due to the art breaking with the larger accessories */ - r += jsInclude("Art_Vector_Dildo_Large"); - else if (slave.vaginalAccessory === "long, large dildo") - r += jsInclude("Art_Vector_Dildo_Large_Long"); - else if (slave.vaginalAccessory === "huge dildo") - r += jsInclude("Art_Vector_Dildo_Huge"); - else if (slave.vaginalAccessory === "long, huge dildo") - r += jsInclude("Art_Vector_Dildo_Huge_Long"); - } - } - } - } - - function ArtVectorCollar() { - r += jsInclude("Art_Vector_Clavicle"); - /* TODO": find out where "uncomfortable leather" collar art went */ - switch (slave.collar) { - case "leather with cowbell": - r += jsInclude("Art_Vector_Collar_Cowbell"); - break; - case "heavy gold": - r += jsInclude("Art_Vector_Collar_Gold_Heavy"); - break; - case "neck corset": - r += jsInclude("Art_Vector_Collar_Neck_Corset"); - break; - case "pretty jewelry": - r += jsInclude("Art_Vector_Collar_Pretty_Jewelry"); - break; - case "cruel retirement counter": - r += jsInclude("Art_Vector_Collar_Retirement_Cruel"); - break; - case "nice retirement counter": - r += jsInclude("Art_Vector_Collar_Retirement_Nice"); - break; - case "satin choker": - r += jsInclude("Art_Vector_Collar_Satin_Choker"); - break; - case "shock punishment": - r += jsInclude("Art_Vector_Collar_Shock_Punishment"); - break; - case "stylish leather": - r += jsInclude("Art_Vector_Collar_Stylish_Leather"); - break; - case "tight steel": - r += jsInclude("Art_Vector_Collar_Tight_Steel"); - break; - case "uncomfortable leather": - r += jsInclude("Art_Vector_Collar_Leather_Cruel"); - break; - case "silk ribbon": - r += jsInclude("Art_Vector_Collar_Silk_Ribbon"); - break; - case "bowtie": - r += jsInclude("Art_Vector_Collar_Bowtie"); - break; - case "ancient Egyptian": - r += jsInclude("Art_Vector_Collar_Ancientegyptian"); - } - } - - function ArtVectorFeet() { - let outfit, stockings; - if (slave.legAccessory === "short stockings") - stockings = "SS"; - else if (slave.legAccessory === "long stockings") - stockings = "LL"; - - /* Updated 2018-10-25 by Fr0g */ - /* - added brackets to make boolean logic run */ - if (slave.shoes === "heels") { - r += jsInclude("Art_Vector_Shoes_Heel"); - } else if (slave.shoes === "pumps") { - r += jsInclude("Art_Vector_Shoes_Pump"); - } else if (slave.shoes === "extreme heels") { - r += jsInclude(`Art_Vector_Shoes_Extreme_Heel_${legSize}`); - } else if (slave.shoes === "boots") { - r += jsInclude(`Art_Vector_Shoes_Boot_${legSize}`); - } else if (slave.shoes === "flats") { - r += jsInclude("Art_Vector_Shoes_Flat"); - } else { - if (slave.amp === 0) { - r += jsInclude("Art_Vector_Feet_Normal"); - } else if (slave.PLimb === 1 || slave.PLimb === 2) { - if (slave.amp === -1) - r += jsInclude("Art_Vector_Feet_ProstheticBasic"); - else if (slave.amp === -2) - r += jsInclude("Art_Vector_Feet_ProstheticSexy"); - else if (slave.amp === -3) - r += jsInclude("Art_Vector_Feet_ProstheticBeauty"); - else if (slave.amp === -4) - r += jsInclude("Art_Vector_Feet_ProstheticCombat"); - else if (slave.amp === -5) - r += jsInclude("Art_Vector_Feet_ProstheticSwiss"); - } - } - if (stockings !== undefined && slave.amp !== 1) { - if (slave.shoes === "heels") { - r += jsInclude(`Art_Vector_Shoes_Heel_${stockings}_${legSize}`); - } else if (slave.shoes === "pumps") { - r += jsInclude(`Art_Vector_Shoes_Pump_${stockings}_${legSize}`); - } else if (slave.shoes === "flats") { - r += jsInclude(`Art_Vector_Shoes_Flat_${stockings}_${legSize}`); - } else if (slave.shoes === "none") { - r += jsInclude(`Art_Vector_Shoes_Stockings_${stockings}_${legSize}`); - } - } - switch (slave.clothes) { - case "a bra": - case "a button-up shirt": - case "a button-up shirt and panties": - case "a chattel habit": - case "a comfortable bodysuit": - case "a cybersuit": - case "a gothic lolita dress": - case "a hanbok": - case "a leotard": - case "a nice pony outfit": - case "a one-piece swimsuit": - case "a penitent nuns habit": - case "a scalemail bikini": - case "a skimpy loincloth": - case "a slutty klan robe": - case "a slutty outfit": - case "a slutty pony outfit": - case "a sports bra": - case "a string bikini": - case "a striped bra": - case "a sweater": - case "a sweater and panties": - case "a t-shirt": - case "a t-shirt and panties": - case "a t-shirt and thong": - case "a tank-top": - case "a tank-top and panties": - case "a thong": - case "a tube top": - case "a tube top and thong": - case "an oversized t-shirt": - case "attractive lingerie for a pregnant woman": - case "chains": - case "choosing her own clothes": - case "kitty lingerie": - case "no clothing": - case "panties": - case "panties and pasties": - case "shibari ropes": - case "striped panties": - case "striped underwear": - case "uncomfortable straps": - break; /* do nothing for these cases */ - case "a Fuckdoll suit": - case "a latex catsuit": - case "body oil": - case "restrictive latex": - if (V.seeVectorArtHighlights === 1) /* special case for shiny clothing */ - outfit = "Shine"; - break; - default: - outfit = clothing2artSuffix(slave.clothes); - } - if (outfit !== undefined) { - if (slave.amp !== 1) { - if (slave.clothes !== "a slutty qipao" && slave.clothes !== "harem gauze" && slave.clothes !== "slutty jewelry" && slave.clothes !== "Western clothing") /* these clothes have a stump/leg outfit, but no butt outfit */ - r += jsInclude(`Art_Vector_Butt_Outfit_${outfit}_${buttSize}`); - if (slave.clothes !== "a schoolgirl outfit") /* file is there, but contains no artwork */ - r += jsInclude(`Art_Vector_Leg_Outfit_${outfit}_${legSize}`); - } else { - if (outfit === "Shine") /* the only stump outfit that does not draw an empty svg */ - r += jsInclude(`Art_Vector_Leg_Outfit_${outfit}_Stump`); - } - } - } - - function ArtVectorHairBack() { - if (hairLength !== undefined) { /* Don't draw hair if it isn't there */ - if (slave.fuckdoll !== 0 || (slave.bald !== 0 && slave.hStyle === "bald")) { - r += jsInclude("Art_Vector_Hair_Back_NoHair"); - } else { - switch (slave.clothes) { - case "a biyelgee costume": - case "a burkini": - case "a burqa": - case "a chattel habit": - case "a cybersuit": - case "a fallen nuns habit": - case "a hijab and abaya": - case "a hijab and blouse": - case "a klan robe": - case "a military uniform": - case "a mounty outfit": - case "a niqab and abaya": - case "a penitent nuns habit": - case "a police uniform": - case "a red army uniform": - case "a schutzstaffel uniform": - case "a slutty klan robe": - case "a slutty nurse outfit": - case "a slutty schutzstaffel uniform": - case "battlearmor": - case "restrictive latex": - case "Western clothing": - break; /* do nothing */ - default: - switch (slave.hStyle) { - case "buzzcut": - case "shaved": - case "shaved bald": - r += jsInclude("Art_Vector_Hair_Back_NoHair"); - break; - case "afro": - if (slave.hLength >= 150) - r += jsInclude("Art_Vector_Hair_Back_Afro_Giant"); - else - r += jsInclude(`Art_Vector_Hair_Back_Afro_${hairLength}`); - break; - case "messy bun": - r += jsInclude(`Art_Vector_Hair_Back_Ninja_${hairLength}`); - break; - case "strip": - r += jsInclude("Art_Vector_Hair_Back_NoHair"); - break; - case "braided": - case "bun": - case "cornrows": - case "curled": - case "dreadlocks": - case "eary": - case "luxurious": - case "messy": - case "neat": - case "permed": - case "ponytail": - case "tails": - case "up": - r += jsInclude(`Art_Vector_Hair_Back_${capFirstChar(slave.hStyle)}_${hairLength}`); - break; - default: - r += jsInclude("Art_Vector_Hair_Back_Messy_Medium"); - } - } - } - } - /* note: latex clothing actually shows some hair, but there is no appropriate art for it */ - if (slave.collar === "cat ears") - r += jsInclude("Art_Vector_Cat_Ear_Back"); - } - - function ArtVectorHairFore() { - if (hairLength !== undefined) { /* Don't draw hair if it isn't there */ - if (slave.fuckdoll !== 0 || (slave.bald !== 0 && slave.hStyle === "bald")) { - r += jsInclude("Art_Vector_Hair_Fore_NoHair"); - } else { - switch (slave.clothes) { - case "a biyelgee costume": - case "a burkini": - case "a burqa": - case "a chattel habit": - case "a cybersuit": - case "a fallen nuns habit": - case "a hijab and abaya": - case "a hijab and blouse": - case "a klan robe": - case "a military uniform": - case "a mounty outfit": - case "a niqab and abaya": - case "a penitent nuns habit": - case "a police uniform": - case "a red army uniform": - case "a schutzstaffel uniform": - case "a slutty klan robe": - case "a slutty nurse outfit": - case "a slutty schutzstaffel uniform": - case "battlearmor": - case "restrictive latex": - case "Western clothing": - break; /* do nothing */ - default: - switch (slave.hStyle) { - case "buzzcut": - case "shaved": - case "shaved bald": - r += jsInclude("Art_Vector_Hair_Fore_NoHair"); - break; - case "afro": - if (slave.hLength >= 150) - r += jsInclude("Art_Vector_Hair_Fore_Afro_Giant"); - else - r += jsInclude(`Art_Vector_Hair_Fore_Afro_${hairLength}`); - break; - case "messy bun": - r += jsInclude(`Art_Vector_Hair_Fore_Ninja_${hairLength}`); - break; - case "bun": - case "neat": - case "ponytail": - r += jsInclude(`Art_Vector_Hair_Fore_${capFirstChar(slave.hStyle)}`); - break; - case "braided": - case "cornrows": - case "curled": - case "dreadlocks": - case "eary": - case "luxurious": - case "messy": - case "permed": - case "strip": - case "tails": - case "up": - r += jsInclude(`Art_Vector_Hair_Fore_${capFirstChar(slave.hStyle)}_${hairLength}`); - break; - default: - r += jsInclude("Art_Vector_Hair_Fore_Messy_Medium"); - } - } - } - } - /* note: latex clothing actually shows some hair, but there is no appropriate art for it */ - if (slave.collar === "cat ears") - r += jsInclude("Art_Vector_Cat_Ear_Fore"); - } - - function ArtVectorHead() { - const eyebrowFullness = clothing2artSuffix(slave.eyebrowFullness); /* designed for clothing but works for eyebrows too. If other eyebrow styles are added, this may need to be changed. */ - const hasEyebrows = slave.eyebrowHStyle !== "bald" && slave.eyebrowHStyle !== "shaved"; - - r += jsInclude("Art_Vector_Head"); - /* shiny clothing */ - if (V.seeVectorArtHighlights === 1) { - if (slave.fuckdoll !== 0 || slave.clothes === "restrictive latex" || slave.clothes === "a latex catsuit") - r += jsInclude("Art_Vector_Head_Outfit_Shine"); - } - if (slave.clothes !== "restrictive latex") { - if (slave.markings === "beauty mark") - r += jsInclude("Art_Vector_Beauty_Mark"); - else if (slave.markings === "freckles") - r += jsInclude("Art_Vector_Freckles"); - else if (slave.markings === "heavily freckled") - r += jsInclude("Art_Vector_Freckles_Heavy"); - else if (slave.markings === "birthmark") - r += jsInclude("Art_Vector_Birthmark"); - else if (slave.minorInjury === "black eye") - r += jsInclude("Art_Vector_Black_Eye"); - } - /* FACIAL APPEARANCE */ - if (V.seeFaces === 1) { - if (slave.fuckdoll === 0 && slave.clothes !== "restrictive latex") { - switch (slave.race) { - case "southern european": - case "white": - if (slave.faceShape === "normal") { - r += jsInclude("Art_Vector_Eyes_TypeB"); - r += jsInclude("Art_Vector_Mouth_TypeA"); - r += jsInclude("Art_Vector_Nose_TypeA"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); - } else if (slave.faceShape === "masculine") { - r += jsInclude("Art_Vector_Eyes_TypeD"); - r += jsInclude("Art_Vector_Mouth_TypeF"); - r += jsInclude("Art_Vector_Nose_TypeF"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); - } else if (slave.faceShape === "androgynous") { - r += jsInclude("Art_Vector_Eyes_TypeE"); - r += jsInclude("Art_Vector_Mouth_TypeE"); - r += jsInclude("Art_Vector_Nose_TypeE"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); - } else if (slave.faceShape === "cute") { - r += jsInclude("Art_Vector_Eyes_TypeB"); - r += jsInclude("Art_Vector_Mouth_TypeB"); - r += jsInclude("Art_Vector_Nose_TypeD"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); - } else if (slave.faceShape === "sensual") { - r += jsInclude("Art_Vector_Eyes_TypeC"); - r += jsInclude("Art_Vector_Mouth_TypeC"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); - } else if (slave.faceShape === "exotic") { - r += jsInclude("Art_Vector_Eyes_TypeA"); - r += jsInclude("Art_Vector_Mouth_TypeC"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); - } - break; - case "asian": - case "malay": - case "pacific islander": - if (slave.faceShape === "normal") { - r += jsInclude("Art_Vector_Eyes_TypeA"); - r += jsInclude("Art_Vector_Mouth_TypeC"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeD_${eyebrowFullness}`); - } else if (slave.faceShape === "masculine") { - r += jsInclude("Art_Vector_Eyes_TypeD"); - r += jsInclude("Art_Vector_Mouth_TypeD"); - r += jsInclude("Art_Vector_Nose_TypeB"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); - } else if (slave.faceShape === "androgynous") { - r += jsInclude("Art_Vector_Eyes_TypeE"); - r += jsInclude("Art_Vector_Mouth_TypeE"); - r += jsInclude("Art_Vector_Nose_TypeA"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); - } else if (slave.faceShape === "cute") { - r += jsInclude("Art_Vector_Eyes_TypeC"); - r += jsInclude("Art_Vector_Mouth_TypeC"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); - } else if (slave.faceShape === "sensual") { - r += jsInclude("Art_Vector_Eyes_TypeA"); - r += jsInclude("Art_Vector_Mouth_TypeA"); - r += jsInclude("Art_Vector_Nose_TypeE"); - if (slave.eyebrowFullness === "pencil-thin") - r += jsInclude("Art_Vector_Eyebrow_TypeC_Pencilthin"); - else if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); - } else if (slave.faceShape === "exotic") { - r += jsInclude("Art_Vector_Eyes_TypeB"); - r += jsInclude("Art_Vector_Mouth_TypeC"); - r += jsInclude("Art_Vector_Nose_TypeF"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); - } - break; - case "amerindian": - case "latina": - if (slave.faceShape === "normal") { - r += jsInclude("Art_Vector_Eyes_TypeB"); - r += jsInclude("Art_Vector_Mouth_TypeE"); - r += jsInclude("Art_Vector_Nose_TypeD"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeB_${eyebrowFullness}`); - } else if (slave.faceShape === "masculine") { - r += jsInclude("Art_Vector_Eyes_TypeE"); - r += jsInclude("Art_Vector_Mouth_TypeD"); - r += jsInclude("Art_Vector_Nose_TypeF"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); - } else if (slave.faceShape === "androgynous") { - r += jsInclude("Art_Vector_Eyes_TypeA"); - r += jsInclude("Art_Vector_Mouth_TypeD"); - r += jsInclude("Art_Vector_Nose_TypeB"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeD_${eyebrowFullness}`); - } else if (slave.faceShape === "cute") { - r += jsInclude("Art_Vector_Eyes_TypeF"); - r += jsInclude("Art_Vector_Mouth_TypeB"); - r += jsInclude("Art_Vector_Nose_TypeB"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); - } else if (slave.faceShape === "sensual") { - r += jsInclude("Art_Vector_Eyes_TypeB"); - r += jsInclude("Art_Vector_Mouth_TypeE"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); - } else if (slave.faceShape === "exotic") { - r += jsInclude("Art_Vector_Eyes_TypeC"); - r += jsInclude("Art_Vector_Mouth_TypeA"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); - } - break; - case "black": - if (slave.faceShape === "normal") { - r += jsInclude("Art_Vector_Eyes_TypeD"); - r += jsInclude("Art_Vector_Mouth_TypeB"); - r += jsInclude("Art_Vector_Nose_TypeF"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); - } else if (slave.faceShape === "masculine") { - r += jsInclude("Art_Vector_Eyes_TypeA"); - r += jsInclude("Art_Vector_Mouth_TypeD"); - r += jsInclude("Art_Vector_Nose_TypeF"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); - } else if (slave.faceShape === "androgynous") { - r += jsInclude("Art_Vector_Eyes_TypeF"); - r += jsInclude("Art_Vector_Mouth_TypeE"); - r += jsInclude("Art_Vector_Nose_TypeB"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); - } else if (slave.faceShape === "cute") { - r += jsInclude("Art_Vector_Eyes_TypeC"); - r += jsInclude("Art_Vector_Mouth_TypeE"); - r += jsInclude("Art_Vector_Nose_TypeD"); - if (slave.eyebrowFullness === "natural") - r += jsInclude("Art_Vector_Eyebrow_TypeB_Natural"); - else if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeD_${eyebrowFullness}`); - } else if (slave.faceShape === "sensual") { - r += jsInclude("Art_Vector_Eyes_TypeC"); - r += jsInclude("Art_Vector_Mouth_TypeF"); - r += jsInclude("Art_Vector_Nose_TypeA"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); - } else if (slave.faceShape === "exotic") { - r += jsInclude("Art_Vector_Eyes_TypeE"); - r += jsInclude("Art_Vector_Mouth_TypeE"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); - } - break; - case "middle eastern": - if (slave.faceShape === "normal") { - r += jsInclude("Art_Vector_Eyes_TypeB"); - r += jsInclude("Art_Vector_Mouth_TypeA"); - r += jsInclude("Art_Vector_Nose_TypeA"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); - } else if (slave.faceShape === "masculine") { - r += jsInclude("Art_Vector_Eyes_TypeD"); - r += jsInclude("Art_Vector_Mouth_TypeF"); - r += jsInclude("Art_Vector_Nose_TypeA"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeB_${eyebrowFullness}`); - } else if (slave.faceShape === "androgynous") { - r += jsInclude("Art_Vector_Eyes_TypeF"); - r += jsInclude("Art_Vector_Mouth_TypeB"); - r += jsInclude("Art_Vector_Nose_TypeF"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); - } else if (slave.faceShape === "cute") { - r += jsInclude("Art_Vector_Eyes_TypeB"); - r += jsInclude("Art_Vector_Mouth_TypeB"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); - } else if (slave.faceShape === "sensual") { - r += jsInclude("Art_Vector_Eyes_TypeA"); - r += jsInclude("Art_Vector_Mouth_TypeD"); - r += jsInclude("Art_Vector_Nose_TypeA"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); - } else if (slave.faceShape === "exotic") { - r += jsInclude("Art_Vector_Eyes_TypeE"); - r += jsInclude("Art_Vector_Mouth_TypeE"); - r += jsInclude("Art_Vector_Nose_TypeE"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); - } - break; - case "semitic": - if (slave.faceShape === "normal") { - r += jsInclude("Art_Vector_Eyes_TypeB"); - r += jsInclude("Art_Vector_Mouth_TypeA"); - r += jsInclude("Art_Vector_Nose_TypeA"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); - } else if (slave.faceShape === "masculine") { - r += jsInclude("Art_Vector_Eyes_TypeD"); - r += jsInclude("Art_Vector_Mouth_TypeF"); - r += jsInclude("Art_Vector_Nose_TypeA"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeB_${eyebrowFullness}`); - } else if (slave.faceShape === "androgynous") { - r += jsInclude("Art_Vector_Eyes_TypeF"); - r += jsInclude("Art_Vector_Mouth_TypeB"); - r += jsInclude("Art_Vector_Nose_TypeF"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); - } else if (slave.faceShape === "cute") { - r += jsInclude("Art_Vector_Eyes_TypeB"); - r += jsInclude("Art_Vector_Mouth_TypeB"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); - } else if (slave.faceShape === "sensual") { - r += jsInclude("Art_Vector_Eyes_TypeA"); - r += jsInclude("Art_Vector_Mouth_TypeD"); - r += jsInclude("Art_Vector_Nose_TypeA"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); - } else if (slave.faceShape === "exotic") { - r += jsInclude("Art_Vector_Eyes_TypeE"); - r += jsInclude("Art_Vector_Mouth_TypeE"); - r += jsInclude("Art_Vector_Nose_TypeE"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); - } - break; - case "indo-aryan": - if (slave.faceShape === "normal") { - r += jsInclude("Art_Vector_Eyes_TypeE"); - r += jsInclude("Art_Vector_Mouth_TypeA"); - r += jsInclude("Art_Vector_Nose_TypeD"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); - } else if (slave.faceShape === "masculine") { - r += jsInclude("Art_Vector_Eyes_TypeF"); - r += jsInclude("Art_Vector_Mouth_TypeD"); - r += jsInclude("Art_Vector_Nose_TypeE"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); - } else if (slave.faceShape === "androgynous") { - r += jsInclude("Art_Vector_Eyes_TypeC"); - r += jsInclude("Art_Vector_Mouth_TypeB"); - r += jsInclude("Art_Vector_Nose_TypeD"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); - } else if (slave.faceShape === "cute") { - r += jsInclude("Art_Vector_Eyes_TypeC"); - r += jsInclude("Art_Vector_Mouth_TypeD"); - r += jsInclude("Art_Vector_Nose_TypeA"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeD_${eyebrowFullness}`); - } else if (slave.faceShape === "sensual") { - r += jsInclude("Art_Vector_Eyes_TypeA"); - r += jsInclude("Art_Vector_Mouth_TypeE"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeD_${eyebrowFullness}`); - } else if (slave.faceShape === "exotic") { - r += jsInclude("Art_Vector_Eyes_TypeA"); - r += jsInclude("Art_Vector_Mouth_TypeC"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); - } - break; - case "mixed race": - if (slave.faceShape === "normal") { - r += jsInclude("Art_Vector_Eyes_TypeE"); - r += jsInclude("Art_Vector_Mouth_TypeA"); - r += jsInclude("Art_Vector_Nose_TypeD"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); - } else if (slave.faceShape === "masculine") { - r += jsInclude("Art_Vector_Eyes_TypeF"); - r += jsInclude("Art_Vector_Mouth_TypeD"); - r += jsInclude("Art_Vector_Nose_TypeE"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); - } else if (slave.faceShape === "androgynous") { - r += jsInclude("Art_Vector_Eyes_TypeC"); - r += jsInclude("Art_Vector_Mouth_TypeB"); - r += jsInclude("Art_Vector_Nose_TypeD"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); - } else if (slave.faceShape === "cute") { - r += jsInclude("Art_Vector_Eyes_TypeC"); - r += jsInclude("Art_Vector_Mouth_TypeD"); - r += jsInclude("Art_Vector_Nose_TypeA"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeD_${eyebrowFullness}`); - } else if (slave.faceShape === "sensual") { - r += jsInclude("Art_Vector_Eyes_TypeA"); - r += jsInclude("Art_Vector_Mouth_TypeE"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeD_${eyebrowFullness}`); - } else if (slave.faceShape === "exotic") { - r += jsInclude("Art_Vector_Eyes_TypeA"); - r += jsInclude("Art_Vector_Mouth_TypeC"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); - } - break; - default: - if (slave.faceShape === "normal") { - r += jsInclude("Art_Vector_Eyes_TypeB"); - r += jsInclude("Art_Vector_Mouth_TypeA"); - r += jsInclude("Art_Vector_Nose_TypeA"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); - } else if (slave.faceShape === "masculine") { - r += jsInclude("Art_Vector_Eyes_TypeD"); - r += jsInclude("Art_Vector_Mouth_TypeF"); - r += jsInclude("Art_Vector_Nose_TypeF"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); - } else if (slave.faceShape === "androgynous") { - r += jsInclude("Art_Vector_Eyes_TypeE"); - r += jsInclude("Art_Vector_Mouth_TypeE"); - r += jsInclude("Art_Vector_Nose_TypeE"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); - } else if (slave.faceShape === "cute") { - r += jsInclude("Art_Vector_Eyes_TypeB"); - r += jsInclude("Art_Vector_Mouth_TypeB"); - r += jsInclude("Art_Vector_Nose_TypeD"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); - } else if (slave.faceShape === "sensual") { - r += jsInclude("Art_Vector_Eyes_TypeC"); - r += jsInclude("Art_Vector_Mouth_TypeC"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); - } else if (slave.faceShape === "exotic") { - r += jsInclude("Art_Vector_Eyes_TypeA"); - r += jsInclude("Art_Vector_Mouth_TypeC"); - r += jsInclude("Art_Vector_Nose_TypeC"); - if (hasEyebrows === true) - r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); - } - } - } - } - /* END FACIAL APPEARANCE */ - - if (slave.eyebrowPiercing === 1) - r += jsInclude("Art_Vector_Eyebrow_Light"); - else if (slave.eyebrowPiercing === 2) - r += jsInclude("Art_Vector_Eyebrow_Heavy"); - - if (slave.nosePiercing === 1) - r += jsInclude("Art_Vector_Nose_Light"); - else if (slave.nosePiercing === 2) - r += jsInclude("Art_Vector_Nose_Heavy"); - - if (slave.lipsPiercing === 1) - r += jsInclude("Art_Vector_Lip_Light"); - else if (slave.lipsPiercing === 2) - r += jsInclude("Art_Vector_Lip_Heavy"); - - /* ADDONS */ - if (slave.fuckdoll === 0) { /* fuckdolls cannot be decorated */ - if (slave.collar === "dildo gag") - r += jsInclude("Art_Vector_Dildo_Gag"); - else if (slave.collar === "ball gag") - r += jsInclude("Art_Vector_Ball_Gag"); - else if (slave.collar === "bit gag") - r += jsInclude("Art_Vector_Bit_Gag"); - else if (slave.collar === "massive dildo gag") - r += jsInclude("Art_Vector_Massive_Dildo_Gag"); - else if (slave.collar === "porcelain mask") - r += jsInclude("Art_Vector_Porcelain_Mask"); - - if (slave.eyewear === "corrective glasses" || slave.eyewear === "glasses" || slave.eyewear === "blurring glasses") - r += jsInclude("Art_Vector_Glasses"); - - /* head clothing */ - switch (slave.clothes) { - case "a biyelgee costume": - case "a bunny outfit": - case "a burkini": - case "a burqa": - case "a chattel habit": - case "a cybersuit": - case "a fallen nuns habit": - case "a hijab and abaya": - case "a hijab and blouse": - case "a klan robe": - case "a military uniform": - case "a mounty outfit": - case "a niqab and abaya": - case "a penitent nuns habit": - case "a police uniform": - case "a red army uniform": - case "a slutty klan robe": - case "a slutty nurse outfit": - case "a succubus outfit": - case "battlearmor": - case "harem gauze": - case "Western clothing": - r += jsInclude(`Art_Vector_Head_Outfit_${clothing2artSuffix(slave.clothes)}`); - break; - case "a schutzstaffel uniform": - case "a slutty schutzstaffel uniform": - r += jsInclude("Art_Vector_Head_Outfit_SchutzstaffelUniform"); - break; - case "kitty lingerie": - r += jsInclude("Art_Vector_Cat_Ear_Fore"); - r += jsInclude("Art_Vector_Cat_Ear_Back"); - } - } - } - - function ArtVectorLeg() { - /* Selection of matching SVG based on amputee level */ - if (slave.amp === 0) { - r += jsInclude(`Art_Vector_Leg_${legSize}`); - if (slave.muscles >= 97) - r += jsInclude(`Art_Vector_Leg_${legSize}_MHeavy`); - else if (slave.muscles >= 62) - r += jsInclude(`Art_Vector_Leg_${legSize}_MMedium`); - else if (slave.muscles >= 30) - r += jsInclude(`Art_Vector_Leg_${legSize}_MLight`); - } else if (slave.amp === 1) { - r += jsInclude("Art_Vector_Stump"); - } else if (slave.PLimb === 1 || slave.PLimb === 2) { /* slave is an amputee and has PLimbs equipped */ - if (slave.amp === -1) - r += jsInclude(`Art_Vector_Leg_ProstheticBasic_${legSize}`); - else if (slave.amp === -2) - r += jsInclude(`Art_Vector_Leg_ProstheticSexy_${legSize}`); - else if (slave.amp === -3) - r += jsInclude(`Art_Vector_Leg_ProstheticBeauty_${legSize}`); - else if (slave.amp === -4) - r += jsInclude(`Art_Vector_Leg_ProstheticCombat_${legSize}`); - else /* slave.amp === -5 */ - r += jsInclude(`Art_Vector_Leg_ProstheticSwiss_${legSize}`); - } - } - - function ArtVectorPubicHair() { - if (slave.fuckdoll !== 0 || slave.clothes !== "a latex catsuit") { - if (V.showBodyMods === 1 && slave.vaginaTat === "rude words") { - if (slave.dick !== 0) - T.art_pussy_tattoo_text = "Useless"; - else - T.art_pussy_tattoo_text = "Fucktoy"; - r += jsInclude("Art_Vector_Pussy_Tattoo"); - } - if (slave.physicalAge < 11) { - /* these art files exist, but draw empty svg's. Commented out for now to save on rendering time - r += jsInclude("Art_Vector_Pubic_Hair_None"); - r += jsInclude("Art_Vector_Pubic_Hair_Underarm_None"); - */ - } else if (slave.physicalAge <= 13) { - if (slave.pubicHStyle !== "waxed") - r += jsInclude("Art_Vector_Pubic_Hair_Wispy"); - } else if (slave.clothes !== "a comfortable bodysuit") { - switch (slave.pubicHStyle) { - case "bald": - case "hairless": - case "waxed": - /* commented out to save on rendering time - r += jsInclude("Art_Vector_Pubic_Hair_None"); - */ - break; - case "strip": - case "in a strip": - if (torsoSize === "Obese" || torsoSize === "Fat") - r += jsInclude("Art_Vector_Pubic_Hair_StripFat"); - else - r += jsInclude("Art_Vector_Pubic_Hair_Strip"); - break; - case "neat": - if (torsoSize === "Obese" || torsoSize === "Fat") - r += jsInclude("Art_Vector_Pubic_Hair_NeatFat"); - else - r += jsInclude("Art_Vector_Pubic_Hair_Neat"); - break; - case "bushy in the front and neat in the rear": - if (torsoSize === "Obese" || torsoSize === "Fat") - r += jsInclude("Art_Vector_Pubic_Hair_BushFat"); - else - r += jsInclude("Art_Vector_Pubic_Hair_Bush"); - break; - case "bushy": - if (torsoSize === "Obese" || torsoSize === "Fat") - r += jsInclude("Art_Vector_Pubic_Hair_BushyFat"); - else - r += jsInclude("Art_Vector_Pubic_Hair_Bushy"); - break; - case "very bushy": - if (torsoSize === "Obese" || torsoSize === "Fat") - r += jsInclude("Art_Vector_Pubic_Hair_Very_BushyFat"); - else - r += jsInclude("Art_Vector_Pubic_Hair_Very_Bushy"); - } - switch (slave.underArmHStyle) { - case "hairless": - case "waxed": - case "bald": - /* commented out to save on rendering time - r += jsInclude("Art_Vector_Pubic_Hair_Underarm_None"); - */ - break; - case "shaved": - r += jsInclude("Art_Vector_Pubic_Hair_Underarm_Shaved"); - break; - case "neat": - r += jsInclude("Art_Vector_Pubic_Hair_Underarm_Neat"); - break; - case "bushy": - r += jsInclude("Art_Vector_Pubic_Hair_Underarm_Bushy"); - } - } - } - } - - function ArtVectorPussy() { - if (slave.vagina >= 0 && slave.clothes !== "a latex catsuit" && slave.clothes !== "a comfortable bodysuit" && slave.clothes !== "a cybersuit") - r += jsInclude("Art_Vector_Pussy"); - } - - function ArtVectorPussyPiercings() { - switch (slave.clothes) {/* piercings display on these clothes */ - case "a bra": - case "a button-up shirt": - case "a chattel habit": - case "a comfortable bodysuit": - case "a cybersuit": - case "a fallen nuns habit": - case "a Fuckdoll suit": - case "a latex catsuit": - case "a monokini": - case "a nice pony outfit": - case "a penitent nuns habit": - case "a skimpy loincloth": - case "a slutty pony outfit": - case "a sports bra": - case "a string bikini": - case "a striped bra": - case "a succubus outfit": - case "a sweater": - case "a t-shirt": - case "a t-shirt and panties": - case "a t-shirt and thong": - case "a tank-top": - case "a tube top": - case "an oversized t-shirt": - case "attractive lingerie": - case "body oil": - case "chains": - case "choosing her own clothes": - case "no clothing": - case "restrictive latex": - case "shibari ropes": - case "slutty jewelry": - case "sport shorts": - case "sport shorts and a sports bra": - case "sport shorts and a t-shirt": - case "uncomfortable straps": - case "Western clothing": - /* piercinglevel = 1, Light; piercinglevel = 2, Heavy; piercinglevel = 3, Smart; piercinglevel = 0, None */ - if (slave.vaginaPiercing === 1) - r += jsInclude("Art_Vector_Pussy_Piercing"); - else if (slave.vaginaPiercing === 2) - r += jsInclude("Art_Vector_Pussy_Piercing_Heavy"); - - if (slave.clitPiercing === 1) - r += jsInclude("Art_Vector_Clit_Piercing"); - else if (slave.clitPiercing === 2) - r += jsInclude("Art_Vector_Clit_Piercing_Heavy"); - else if (slave.clitPiercing === 3) - r += jsInclude("Art_Vector_Clit_Piercing_Smart"); - } - } - - function ArtVectorTorso() { - r += jsInclude(`Art_Vector_Torso_${torsoSize}`); - if (slave.muscles >= 97) - r += jsInclude(`Art_Vector_Torso_${torsoSize}_MHeavy`); - else if (slave.muscles >= 62) - r += jsInclude(`Art_Vector_Torso_${torsoSize}_MMedium`); - else if (slave.muscles >= 30) - r += jsInclude(`Art_Vector_Torso_${torsoSize}_MLight`); - } - - function ArtVectorTorsoOutfit() { - /* TODO: latex catsuit should cover vagina and its piercings, too */ - switch (slave.clothes) { - case "a Fuckdoll suit": - case "a latex catsuit": - case "a nice pony outfit": - case "a slutty pony outfit": - case "choosing her own clothes": - case "no clothing": - break; /* no torso outfit */ - /* manually handle special cases */ - case "a cybersuit": - r += jsInclude(`Art_Vector_Torso_Outfit_Latex_${torsoSize}`); - break; - case "a slutty schutzstaffel uniform": - r += jsInclude(`Art_Vector_Torso_Outfit_SchutzstaffelUniform_${torsoSize}`); - break; - case "a niqab and abaya": - case "a burqa": - r += jsInclude(`Art_Vector_Torso_Outfit_HijabAndAbaya_${torsoSize}`); - break; - default: - r += jsInclude(`Art_Vector_Torso_Outfit_${clothing2artSuffix(slave.clothes)}_${torsoSize}`); - } - if (V.seeVectorArtHighlights === 1) { - if (slave.fuckdoll !== 0 || slave.clothes === "restrictive latex" || slave.clothes === "a latex catsuit") { - if (slave.amp !== 0) - r += jsInclude("Art_Vector_Torso_Outfit_Shine_Shoulder"); - if (slave.preg <= 0) - r += jsInclude(`Art_Vector_Torso_Outfit_Shine_${torsoSize}`); - } - } - } - return VectorArt; -})(); diff --git a/src/art/artWidgets.tw b/src/art/artWidgets.tw index b0bf63b04dde8f301e8808873843dfe5d28c7105..22f2127b7aeb7d4f40a6fda91ed29be8fbff8791 100644 --- a/src/art/artWidgets.tw +++ b/src/art/artWidgets.tw @@ -31,13 +31,7 @@ $args[2]: icon UI Display for vector art, 1 for on. <<elseif $imageChoice == 1>> /* VECTOR ART BY NOX*/ -<<set _artSlave = $args[0] >> -/* prepare HTML color codes for slave display */ -/* note: latex clothing is mostly emulated by rubber color for skin (and shoes) */ -/* TODO: consistently use American "color" instead of "colour" for all identifiers */ -<<run ArtVectorColor(_artSlave)>> -<<include Art_Vector_Generate_Stylesheet_>> -<<= VectorArt(_artSlave)>> +<<= VectorArt($args[0], $args[1])>> <<elseif $imageChoice == 2>> /* VECTOR ART BY NOX - Pregmod Legacy Version */ <<SVGFilters>> diff --git a/src/art/vector/ArtVectorColor.js b/src/art/vector/ArtVectorColor.js deleted file mode 100644 index 4becc3e941a59ff53ec54a085f9c13def8baaabd..0000000000000000000000000000000000000000 --- a/src/art/vector/ArtVectorColor.js +++ /dev/null @@ -1,386 +0,0 @@ -window.ArtVectorColor = function(slave) { - const T = State.temporary; - let outfitBaseColour; - - /* - WARNING: Some of these temporary variables are used in wardrobeUse.tw or salon.tw - Known examples are _outfitBaseColour, _glassesColor, and _shoeColour - */ - setOutfitColor(); - setSkinColor(); - setHairColor(); - setShoeColor(); - - function setOutfitColor() { - /* TODO: rewrite all textual descriptions not to explicitly mention the latex being of black color. */ - if (slave.clothes === "a Fuckdoll suit" || slave.clothes === "restrictive latex" || slave.clothes === "a latex catsuit" || slave.clothes === "a cybersuit") - outfitBaseColour = slave.clothingBaseColor || "#515351"; /* use custom color, or use default latex color */ - else if (slave.clothes == "a comfortable bodysuit") - outfitBaseColour = slave.clothingBaseColor || "#464646"; /* use custom color, or use default bodysuit color */ - - /* head addons */ - if (slave.collar === "porcelain mask") - T.glassesColor = slave.glassesColor || "#FFFFFF"; /* use custom color or white */ - else - T.glassesColor = slave.glassesColor || "#010101"; /* use custom color or default */ - - T.eyeColor = extractColor(slave.eyeColor, 1); - T.outfitBaseColour = outfitBaseColour; - } - - function setSkinColor() { - const colorSlave = skinColorCatcher(slave); - - /* setting default values */ - T.areolaStyle = colorSlave.areolaColor; - T.bellybuttonStyle = colorSlave.areolaColor; - T.labiaStyle = colorSlave.labiaColor; - T.skinColour = colorSlave.skinColor; - /* todo: introduce fleshStyle */ - /* these need to be declared so they can be set conditionally */ - T.headSkinStyle = undefined; - T.torsoSkinStyle = undefined; - T.boobSkinStyle = undefined; - T.penisSkinStyle = undefined; - T.scrotumSkinStyle = undefined; - T.bellySkinStyle = undefined; - - /* BEGIN SKIN COLOR OVERRIDES FOR LATEX CLOTHING EMULATION */ - if (slave.clothes === "a Fuckdoll suit") { - /* slave is a fuckdoll - display all skin as if it was black rubber */ - T.skinColour = outfitBaseColour; - T.areolaStyle = "fill:rgba(81,83,81,1);"; - T.labiaStyle = T.areolaStyle; - T.bellybuttonStyle = T.areolaStyle; - } else if (slave.clothes === "restrictive latex") { /* slave wears restrictive latex - display most skin as if it was rubber */ - /* nice latex does not cover any privates. */ - T.boobSkinStyle = "fill:"+T.skinColour+";"; - T.penisSkinStyle = "fill:"+T.skinColour+";"; - T.scrotumSkinStyle = "fill:"+T.skinColour+";"; - T.torsoSkinStyle = "fill:"+T.skinColour+";"; - /* rest of body is covered in latex */ - T.skinColour = outfitBaseColour; - T.bellybuttonStyle = outfitBaseColour; - } else if (slave.clothes === "a latex catsuit") { - /* nice latex does not cover head. */ - T.headSkinStyle = "fill:"+T.skinColour+";"; - /* rest of body is covered in latex */ - T.skinColour = outfitBaseColour; - /* catsuit covers areolae and crotch, too */ - T.bellybuttonStyle = outfitBaseColour; - } else if (slave.clothes === "a cybersuit") { - /* rest of body is covered in latex */ - T.skinColour = outfitBaseColour; - T.bellybuttonStyle = outfitBaseColour; - } else if (slave.clothes === "a comfortable bodysuit") { - /* nice bodysuit does not cover head. */ - T.headSkinStyle = "fill:"+T.skinColour+";"; - /* rest of body is covered in bodysuit */ - T.skinColour = outfitBaseColour; - T.bellySkinStyle = outfitBaseColour; - T.bellybuttonStyle = outfitBaseColour; - } - /* END SKIN COLOR OVERRIDES FOR LATEX CLOTHING EMULATION */ - - /* outfit dick coloring to match outfit rgba in svg */ - switch (slave.clothes) { - case "a cheerleader outfit": - T.scrotumSkinStyle = "fill:rgba(250,186,0,1);"; - T.bellySkinStyle = "fill:rgba(95,110,160,1);"; - break; - case "cutoffs and a t-shirt": - T.scrotumSkinStyle = "fill:rgba(81,124,211,1);"; - break; - case "a halter top dress": - T.scrotumSkinStyle = "fill:rgba(94,51,124,1);"; - T.bellySkinStyle = "fill:rgba(94,51,124,1);"; - break; - case "a burqa": - case "a hijab and abaya": - case "a niqab and abaya": - T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; - T.bellySkinStyle = "fill:rgba(51,51,51,1);"; - break; - case "a hijab and blouse": - T.scrotumSkinStyle = "fill:rgba(85,0,34,1);"; - T.bellySkinStyle = "fill:rgba(85,0,34,1);"; - break; - case "a burkini": - T.scrotumSkinStyle = "fill:rgba(0,97,158,1);"; - T.bellySkinStyle = "fill:rgba(0,97,158,1);"; - break; - case "a klan robe": - T.scrotumSkinStyle = "fill:rgba(236,236,236,1);"; - T.bellySkinStyle = "fill:rgba(236,236,236,1);"; - break; - case "a nice maid outfit": - case "a slutty maid outfit": - T.scrotumSkinStyle = "fill:rgba(225,225,225,1);"; - T.bellySkinStyle = "fill:rgba(225,225,225,1);"; - break; - case "a leotard": - T.scrotumSkinStyle = "fill:rgba(120,15,55,1);"; - T.bellySkinStyle = "fill:rgba(120,15,55,1);"; - break; - case "a military uniform": - T.scrotumSkinStyle = "fill:rgba(34,42,18,1);"; - T.bellySkinStyle = "fill:rgba(34,42,18,1);"; - break; - case "a mini dress": - T.scrotumSkinStyle = "fill:rgba(26,26,26,1);"; - T.bellySkinStyle = "fill:rgba(26,26,26,1);"; - break; - case "a nice nurse outfit": - T.scrotumSkinStyle = "fill:rgba(0,128,128,1);"; - T.bellySkinStyle = "fill:rgba(0,128,128,1);"; - break; - case "a slutty nurse outfit": - T.scrotumSkinStyle = "fill:rgba(255,255,255,1);"; - break; - case "a scalemail bikini": - T.scrotumSkinStyle = "fill:rgba(133,146,158,1);"; - break; - case "striped panties": - T.scrotumSkinStyle = "fill:rgba(255,255,255,1);"; - break; - case "a schoolgirl outfit": - T.scrotumSkinStyle = "fill:rgba(28,31,36,1);"; - T.bellySkinStyle = "fill:rgba(28,31,36,1);"; - break; - case "a ball gown": - T.scrotumSkinStyle = "fill:rgba(128,0,0,1);"; - T.bellySkinStyle = "fill:rgba(128,0,0,1);"; - break; - case "battledress": - T.scrotumSkinStyle = "fill:rgba(34,42,18,1);"; - T.bellySkinStyle = "fill:rgba(34,42,18,1);"; - break; - case "a slave gown": - T.scrotumSkinStyle = "fill:rgba(200,200,200,1);"; - T.bellySkinStyle = "fill:rgba(200,200,200,1);"; - break; - case "a slutty outfit": - T.scrotumSkinStyle = "fill:rgba(63,126,181,1);"; - break; - case "spats and a tank top": - T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; - break; - case "a succubus outfit": - T.scrotumSkinStyle = "fill:rgba(128,0,0,1);"; - T.bellySkinStyle = "fill:rgba(128,0,0,1);"; - break; - case "nice business attire": - T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; - T.bellySkinStyle = "fill:rgba(51,51,51,1);"; - break; - case "slutty business attire": - T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; - break; - case "attractive lingerie for a pregnant woman": - T.scrotumSkinStyle = "fill:rgba(153,153,153,1);"; - break; - case "a bunny outfit": - T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; - T.bellySkinStyle = "fill:rgba(51,51,51,1);"; - break; - case "conservative clothing": - T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; - T.bellySkinStyle = "fill:rgba(51,51,51,1);"; - break; - case "harem gauze": - T.scrotumSkinStyle = "fill:rgba(0,168,131,1);"; - break; - case "a huipil": - T.scrotumSkinStyle = "fill:rgba(200,200,200,1);"; - T.bellySkinStyle = "fill:rgba(200,200,200,1);"; - break; - case "a kimono": - T.scrotumSkinStyle = "fill:rgba(0,91,150,1);"; - T.bellySkinStyle = "fill:rgba(0,91,150,1);"; - break; - case "a maternity dress": - T.scrotumSkinStyle = "fill:rgba(48,54,72,1);"; - T.bellySkinStyle = "fill:rgba(48,54,72,1);"; - break; - case "a slutty qipao": - T.scrotumSkinStyle = "fill:rgba(204,177,68,1);"; - T.bellySkinStyle = "fill:rgba(204,177,68,1);"; - break; - case "stretch pants and a crop-top": - T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; - break; - case "a toga": - T.scrotumSkinStyle = "fill:rgba(200,200,200,1);"; - T.bellySkinStyle = "fill:rgba(200,200,200,1);"; - break; - case "a penitent nuns habit": - T.scrotumSkinStyle = "fill:rgba(114,93,73,1);"; - break; - case "a fallen nuns habit": - T.bellySkinStyle = "fill:rgba(51,51,51,1);"; - break; - case "a chattel habit": - T.scrotumSkinStyle = "fill:rgba(200,200,200,1);"; - break; - case "a monokini": - T.scrotumSkinStyle = "fill:rgba(33,47,61,1);"; - break; - case "a schutzstaffel uniform": - case "a slutty schutzstaffel uniform": - T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; - T.bellySkinStyle = "fill:rgba(51,51,51,1);"; - break; - case "a red army uniform": - T.scrotumSkinStyle = "fill:rgba(114,93,73,1);"; - T.bellySkinStyle = "fill:rgba(114,93,73,1);"; - break; - case "an apron": - T.scrotumSkinStyle = "fill:rgba(255,105,180,1);"; - T.bellySkinStyle = "fill:rgba(255,105,180,1);"; - break; - case "a dirndl": - T.scrotumSkinStyle = "fill:rgba(128,0,51,1);"; - T.bellySkinStyle = "fill:rgba(128,0,51,1);"; - break; - case "lederhosen": - T.scrotumSkinStyle = "fill:rgba(93,83,108,1);"; - break; - case "a long qipao": - T.scrotumSkinStyle = "fill:rgba(0,128,0,1);"; - break; - case "a mounty outfit": - T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; - T.bellySkinStyle = "fill:rgba(128,0,0,1);"; - break; - case "battlearmor": - T.scrotumSkinStyle = "fill:rgba(200,200,200,1);"; - break; - case "striped underwear": - T.scrotumSkinStyle = "fill:rgba(255,255,255,1);"; - break; - case "panties": - T.scrotumSkinStyle = "fill:rgba(255,170,238,1);"; - break; - case "a thong": - T.scrotumSkinStyle = "fill:rgba(34,28,36,1);"; - break; - case "a button-up shirt and panties": - case "a t-shirt and panties": - T.scrotumSkinStyle = "fill:rgba(255,255,255,1);"; - T.bellySkinStyle = "fill:rgba(255,255,255,1);"; - break; - case "a slutty klan robe": - T.scrotumSkinStyle = "fill:rgba(128,0,0,1);"; - break; - case "cutoffs": - T.scrotumSkinStyle = "fill:rgba(81,124,211,1);"; - break; - case "sport shorts": - case "sport shorts and a sports bra": - T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; - break; - case "a t-shirt and thong": - T.scrotumSkinStyle = "fill:rgba(200,55,171,1);"; - T.bellySkinStyle = "fill:rgba(200,55,171,1);"; - break; - case "jeans": - T.scrotumSkinStyle = "fill:rgba(81,124,211,1);"; - break; - case "leather pants": - case "leather pants and a tube top": - T.scrotumSkinStyle = "fill:rgba(26,26,26,1);"; - break; - case "leather pants and pasties": - T.scrotumSkinStyle = "fill:rgba(85,0,0,1);"; - break; - case "a t-shirt and jeans": - T.scrotumSkinStyle = "fill:rgba(81,124,211,1);"; - T.bellySkinStyle = "fill:rgba(255,255,255,1);"; - break; - case "a tank-top and panties": - T.scrotumSkinStyle = "fill:rgba(26,26,26,1);"; - T.bellySkinStyle = "fill:rgba(26,26,26,1);"; - break; - case "a tank-top": - T.bellySkinStyle = "fill:rgba(255,255,255,1);"; - break; - case "a tube top and thong": - T.scrotumSkinStyle = "fill:rgba(34,28,36,1);"; - break; - case "boyshorts": - T.scrotumSkinStyle = "fill:rgba(26,26,26,1);"; - break; - case "an oversized t-shirt and boyshorts": - T.bellySkinStyle = "fill:rgba(255,255,255,1);"; - break; - case "a sweater and panties": - T.scrotumSkinStyle = "fill:rgba(26,26,26,1);"; - T.bellySkinStyle = "fill:rgba(212,170,0,1);"; - break; - case "a sweater and cutoffs": - T.scrotumSkinStyle = "fill:rgba(77,77,77,1);"; - T.bellySkinStyle = "fill:rgba(85,0,0,1);"; - break; - case "a police uniform": - T.scrotumSkinStyle = "fill:rgba(11,23,40,1);"; - T.bellySkinStyle = "fill:rgba(11,23,40,1);"; - break; - case "a one-piece swimsuit": - T.scrotumSkinStyle = "fill:rgba(22,45,80,1);"; - T.bellySkinStyle = "fill:rgba(22,45,80,1);"; - break; - case "a skimpy loincloth": - T.scrotumSkinStyle = "fill:rgba(145,124,111,1);"; - break; - case "kitty lingerie": - T.scrotumSkinStyle = "fill:rgba(255,170,238,1);"; - break; - case "an oversized t-shirt": - T.bellySkinStyle = "fill:rgba(255,255,255,1);"; - break; - case "a hanbok": - T.bellySkinStyle = "fill:rgba(255,109,182,1);"; - break; - case "a gothic lolita dress": - T.bellySkinStyle = "fill:rgba(26,26,26,1);"; - break; - case "a sweater": - T.bellySkinStyle = "fill:rgba(85,0,0,1);"; - break; - case "sport shorts and a t-shirt": - T.scrotumSkinStyle = "fill:rgba(200,55,171,1);"; - T.bellySkinStyle = "fill:rgba(200,55,171,1);"; - break; - case "a biyelgee costume": - T.scrotumSkinStyle = "fill:rgba(33,68,120,1);"; - } - } - - function setHairColor() { - T.hairColour = extractColor(slave.hColor); - T.pubicHairColour = extractColor(slave.pubicHColor); - T.underarmHairColour = extractColor(slave.underArmHColor); - T.eyebrowHairColour = extractColor(slave.eyebrowHColor); - T.sclerae = extractColor(slave.sclerae); - } - - function setShoeColor() { - /* BEWARE: _shoeColour is read by Wardrobe Use */ - /* note: only heels use this _shoeShadowColour */ - - /* override color in case of full body latex outfit, or custom color*/ - if (slave.clothes === "a Fuckdoll suit" || slave.clothes === "restrictive latex") { - T.shoeColour = T.skinColour; - T.shoeShadowColour = T.shoeColour+";opacity: 0.5"; /* TODO: do not abuse "color" variable for style definitions. do not rely on dark background for shadow effect either. */ - } else if (slave.shoeColor !== undefined) { - T.shoeColour = slave.shoeColor+";opacity: 0.4"; /* shoe color selected by user */ - T.shoeShadowColour = T.shoeColour+";opacity: 0.5"; /* TODO: do not abuse "color" variable for style definitions. do not rely on dark background for shadow effect either. */ - } else { - T.shoeShadowColour = "#616a6b"; - if (slave.shoes === "none") - T.shoeColour = "#595959"; - else - T.shoeColour = "#80808080"; - } - } -}; diff --git a/src/art/vector/Generate_Stylesheet.tw b/src/art/vector/Generate_Stylesheet.tw deleted file mode 100644 index cb50ba685a6b24f2c6fc5015a064f0e72688c044..0000000000000000000000000000000000000000 --- a/src/art/vector/Generate_Stylesheet.tw +++ /dev/null @@ -1,56 +0,0 @@ -:: Art_Vector_Generate_Stylesheet_ [nobr] - -/* _art_display_class is the style class for this display */ -<<if _art_display_id > 0 >> - <<set _art_display_id += 1>> -<<else>> - <<set _art_display_id = 1>> -<</if>> -<<set _art_display_class = "ad"+_art_display_id >> - -/* setup height scaling and style */ -<<if $seeHeight == 0 || ($seeHeight == 1 && $args[1] == 3)>> - <<set _slaveHeightScale = 1>> - <<set _margin = 0>> -<<else>> - <<set _slaveHeightScale = _artSlave.height/200>> - <<set _margin = Math.max(50 - (50 * _slaveHeightScale), 0)>> -<</if>> - -<<print "<style>."+_art_display_class+" { - position: absolute; - height: 100%; - transform: scale(" + _slaveHeightScale + "); - margin-top: " + _margin + "%; - margin-left: auto; - margin-right: auto; - left: 0; - right: 0; -} -."+_art_display_class+" .white { fill:#FFFFFF; } -."+_art_display_class+" .skin { fill:"+_skinColour+"; } -."+_art_display_class+" .head { "+_headSkinStyle+"; } -."+_art_display_class+" .torso { "+_torsoSkinStyle+"; } -."+_art_display_class+" .boob { "+_boobSkinStyle+"; } -."+_art_display_class+" .penis { "+_penisSkinStyle+"; } -."+_art_display_class+" .scrotum { "+_scrotumSkinStyle+"; } -."+_art_display_class+" .belly { "+_bellySkinStyle+"; } -."+_art_display_class+" .areola { fill:"+_areolaStyle+"; } -."+_art_display_class+" .bellybutton { fill:"+_bellybuttonStyle+"; } -."+_art_display_class+" .labia { fill:"+_labiaStyle+"; } -."+_art_display_class+" .hair { fill:"+_hairColour+"; } -."+_art_display_class+" .pubic_hair { fill:"+_pubicHairColour+"; } -."+_art_display_class+" .underarm_hair { fill:"+_underarmHairColour+"; } -."+_art_display_class+" .eyebrow_hair { fill:"+_eyebrowHairColour+"; } -."+_art_display_class+" .shoe { fill:"+_shoeColour+"; } -."+_art_display_class+" .shoe_shadow { fill:"+_shoeShadowColour+"; } -."+_art_display_class+" .smart_piercing { fill:#4DB748; } -."+_art_display_class+" .steel_piercing { fill:#787878; } -."+_art_display_class+" .steel_chastity { fill:#BABABA; } -."+_art_display_class+" .outfit_base { fill:"+_outfitBaseColour+"; } -."+_art_display_class+" .gag { fill:#BF2126; } -."+_art_display_class+" .shadow { fill:#010101; } -."+_art_display_class+" .glasses { fill:"+_glassesColor+"; } -."+_art_display_class+" .eye { fill:"+_eyeColor+"; } -."+_art_display_class+" .sclera { fill:"+_sclerae+"; } -</style>" >> diff --git a/src/art/vector/VectorArtJS.js b/src/art/vector/VectorArtJS.js new file mode 100644 index 0000000000000000000000000000000000000000..d70f2a6c305931ed4324eff9968cb3cf349f6d18 --- /dev/null +++ b/src/art/vector/VectorArtJS.js @@ -0,0 +1,2389 @@ +window.VectorArt = (function () { + "use strict"; + let V, T, slave; + let r; + let leftArmType, rightArmType, legSize, torsoSize, buttSize, penisSize, hairLength; + let bellyScaleFactor, artBoobScaleFactor, heightScaleFactor; + let artTranslationX, artTranslationY; + let penisDrawtime, penisArtString; + + function VectorArt(artSlave, artSize) { + /* set constants */ + V = State.variables; + T = State.temporary; + slave = artSlave; + /* reset/initialize some variables */ + T.artTransformBelly = ""; + T.artTransformBoob = ""; + T.art_transform = ""; /* in case other files are trying to use this, and expecting a string */ + + setStylesheet(); /* initializes the stylesheet, and r */ + setArmType(); + setBoobScaling(); + setButtSize(); + setHairLength(); + setLegSize(); + setPenisSize(); + penisArtControl(); /* depends on setPenisSize and setBoobScaling, sets penisDrawtime and penisArtString */ + setTorsoSize(); + + /* + each function adds one layer of vector art + vector art added later is drawn over previously added art + (what is listed on the bottom in the code appears on the top of the image) + */ + ArtVectorHairBack(); + ArtVectorArm(); + ArtVectorAnalAccessories(); + ArtVectorButt(); + ArtVectorLeg(); + ArtVectorFeet(); /* includes shoes and leg outfits*/ + ArtVectorTorso(); + ArtVectorPussy(); + ArtVectorPubicHair(); + if (slave.vaginaPiercing !== 0 || slave.clitPiercing !== 0) + ArtVectorPussyPiercings(); + ArtVectorChastityBelt(); + ArtVectorTorsoOutfit(); /* note: clothing covers chastity belts */ + if (slave.scrotum > 0 && slave.balls > 0) + ArtVectorBalls(); + if (penisDrawtime === 0) /* for dicks behind boobs */ + r += penisArtString; + ArtVectorBelly(); /* includes navel piercing and belly-related clothing options */ + ArtVectorBoob(); /* includes areolae and piercings */ + if (penisDrawtime === 1) /* for dicks in front of boobs */ + r += penisArtString; + ArtVectorBoobAddons(); /* piercings always appear in front of boobs AND dick */ + ArtVectorCollar(); /* includes clavicle artwork */ + ArtVectorHead(); /* glasses are drawn here */ + ArtVectorHairFore(); + + return r; + } + + function setStylesheet() { + let slaveHeightScale, margin, displayClass; + + /* prepare HTML color codes for slave display */ + /* note: latex clothing is mostly emulated by rubber color for skin (and shoes) */ + /* TODO: consistently use American "color" instead of "colour" for all identifiers */ + ArtVectorColor(slave); + + /* displayClass is the style class for this display */ + if (T.art_display_id > 0) + T.art_display_id++; + else + T.art_display_id = 1; + displayClass = `ad${T.art_display_id}`; + T.art_display_class = displayClass; + + /* setup height scaling and style */ + if (V.seeHeight === 0) + heightScaleFactor = 1; + else + heightScaleFactor = 200 / slave.height; + + if (V.seeHeight === 0 || (V.seeHeight === 1 && artSize === 3)) { + slaveHeightScale = 1; + margin = 0; + } else { + slaveHeightScale = slave.height / 200; + margin = Math.max(50 - (50 * slaveHeightScale), 0); + } + + r = `<style>.${displayClass} {\ + position: absolute;\ + height: 100%;\ + transform: scale(${slaveHeightScale});\ + margin-top: ${margin}%;\ + margin-left: auto;\ + margin-right: auto;\ + left: 0;\ + right: 0;\ + }\ + .${displayClass} .white{ fill:#FFFFFF; }\ + .${displayClass} .skin{ fill:${T.skinColour}; }\ + .${displayClass} .head{ ${T.headSkinStyle}; }\ + .${displayClass} .torso{ ${T.torsoSkinStyle}; }\ + .${displayClass} .boob{ ${T.boobSkinStyle}; }\ + .${displayClass} .penis{ ${T.penisSkinStyle}; }\ + .${displayClass} .scrotum{ ${T.scrotumSkinStyle}; }\ + .${displayClass} .belly{ ${T.bellySkinStyle}; }\ + .${displayClass} .areola{ fill:${T.areolaStyle}; }\ + .${displayClass} .bellybutton{ fill:${T.bellybuttonStyle}; }\ + .${displayClass} .labia{ fill:${T.labiaStyle}; }\ + .${displayClass} .hair{ fill:${T.hairColour}; }\ + .${displayClass} .pubic_hair{ fill:${T.pubicHairColour}; }\ + .${displayClass} .underarm_hair{ fill:${T.underarmHairColour}; }\ + .${displayClass} .eyebrow_hair{ fill:${T.eyebrowHairColour}; }\ + .${displayClass} .shoe{ fill:${T.shoeColour}; }\ + .${displayClass} .shoe_shadow{ fill:${T.shoeShadowColour}; }\ + .${displayClass} .smart_piercing{ fill:#4DB748; }\ + .${displayClass} .steel_piercing{ fill:#787878; }\ + .${displayClass} .steel_chastity{ fill:#BABABA; }\ + .${displayClass} .outfit_base{ fill:${T.outfitBaseColour}; }\ + .${displayClass} .gag{ fill:#BF2126; }\ + .${displayClass} .shadow{ fill:#010101; }\ + .${displayClass} .glasses{ fill:${T.glassesColor}; }\ + .${displayClass} .eye{ fill:${T.eyeColor}; }\ + .${displayClass} .sclera{ fill:${T.sclerae}; }\ + </style>`; + } + + function setArmType() { + if (slave.amp === 1) { + leftArmType = "None"; + rightArmType = "None"; + } else { + if (slave.devotion > 50) { + leftArmType = "High"; + rightArmType = "High"; + } else if (slave.trust >= -20) { + if (slave.devotion < -20) { + leftArmType = "Rebel"; + rightArmType = "Low"; + } else if (slave.devotion <= 20) { + leftArmType = "Low"; + rightArmType = "Low"; + } else { + leftArmType = "Mid"; + rightArmType = "High"; + } + } else { + leftArmType = "Mid"; + rightArmType = "Mid"; + } + } + } + + function setBoobScaling() { + /* + Prepare SVG transform matrix for continuous boob scaling. + This transform affects boobs, areolae and piercings. + The parameters were fit by points (300,1.0) and (15000,2.5). + See https://www.wolframalpha.com/input/?i=log+fit+%7B%7B300,1%7D,%7B15000,2.5%7D%7D . + Boobs start at 300cc as of "flesh description widgets". + Upper value was discussed at https://github.com/Free-Cities/Free-Cities/issues/950#issuecomment-321359466 . + */ + if (slave.boobs < 300) { + artBoobScaleFactor = 1; + artTranslationX = 22; /* a little shift to the right is needed due to perspective */ + artTranslationY = 0; + } else { + artBoobScaleFactor = 0.383433 * Math.log(0.0452403 * slave.boobs) * heightScaleFactor; + artTranslationX = -282.841 * artBoobScaleFactor + 292.349; + artTranslationY = -225.438 * artBoobScaleFactor + 216.274; + } + T.artTransformBoob = `matrix(${artBoobScaleFactor},0,0,${artBoobScaleFactor},${artTranslationX},${artTranslationY})`; + } + + function setButtSize() { + /* Size calculations - needs to be done even for amputees */ + buttSize = Math.clamp(Math.trunc(slave.butt), 1, 7) - 1; + } + + function setHairLength() { + hairLength = undefined; + if (slave.hLength >= 60) + hairLength = "Long"; + else if (slave.hLength >= 30) + hairLength = "Medium"; + else if (slave.hLength >= 10) + hairLength = "Short"; + } + + function setLegSize() { + /* Leg wideness switch courtesy of Nov-X */ + /* needs to be done even for amputees */ + if (slave.hips === -2) { + if (slave.weight <= 0) + legSize = "Narrow"; + else if (slave.weight < 161) + legSize = "Normal"; + else + legSize = "Wide"; + } else if (slave.hips === -1) { + if (slave.weight <= -11) + legSize = "Narrow"; + else if (slave.weight < 96) + legSize = "Normal"; + else + legSize = "Wide"; + } else if (slave.hips === 0) { + if (slave.weight <= -96) + legSize = "Narrow"; + else if (slave.weight < 11) + legSize = "Normal"; + else if (slave.weight < 131) + legSize = "Wide"; + else + legSize = "Thick"; + } else if (slave.hips === 1) { + if (slave.weight <= -31) + legSize = "Normal"; + else if (slave.weight < 31) + legSize = "Wide"; + else + legSize = "Thick"; + } else { /* .hips === 2 or 3 */ + if (slave.weight <= -11) + legSize = "Wide"; + else + legSize = "Thick"; + } + } + + function setPenisSize() { + penisSize = undefined; + if (slave.dick > 6 || (slave.dick > 0 && slave.belly <= 4000)) + penisSize = Math.clamp(slave.dick, 1, 11) - 1; + } + + function penisArtControl() { + penisArtString = ""; + if (penisSize === undefined) { + penisDrawtime = -1; /* no penis to draw */ + } else { + penisDrawtime = 0; /* default is to draw before boobs/belly */ + switch (slave.clothes) { + /* BULGE OUTFITS LONG+MEDIUM OUTFITS */ + case "a ball gown": + case "a biyelgee costume": + case "a burkini": + case "a burqa": + case "a dirndl": + case "a halter top dress": + case "a hijab and abaya": + case "a hijab and blouse": + case "a kimono": + case "a klan robe": + case "a long qipao": + case "a maternity dress": + case "a military uniform": + case "a mounty outfit": + case "a nice maid outfit": + case "a nice nurse outfit": + case "a niqab and abaya": + case "a police uniform": + case "a red army uniform": + case "a schutzstaffel uniform": + case "a skimpy loincloth": + case "a slave gown": + case "a slutty nurse outfit": + case "a slutty schutzstaffel uniform": + case "a t-shirt and jeans": + case "a toga": + case "an apron": + case "battlearmor": + case "battledress": + case "conservative clothing": + case "jeans": + case "leather pants": + case "leather pants and a tube top": + case "leather pants and pasties": + case "lederhosen": + case "nice business attire": + case "slutty business attire": + case "spats and a tank top": + case "sport shorts": + case "sport shorts and a sports bra": + case "sport shorts and a t-shirt": + case "stretch pants and a crop-top": + penisArtString = jsInclude(`Art_Vector_Bulge_Outfit_${penisSize}`); + break; + /* BULGE OUTFITS SHORT OUTFITS */ + case "a bunny outfit": + case "a button-up shirt and panties": + case "a chattel habit": + case "a huipil": + case "a leotard": + case "a mini dress": + case "a monokini": + case "a one-piece swimsuit": + case "a penitent nuns habit": + case "a scalemail bikini": + case "a slutty klan robe": + case "a slutty maid outfit": + case "a slutty outfit": + case "a slutty qipao": + case "a succubus outfit": + case "a sweater and cutoffs": + case "a sweater and panties": + case "a t-shirt and panties": + case "a t-shirt and thong": + case "a tank-top and panties": + case "a thong": + case "a tube top and thong": + case "an oversized t-shirt and boyshorts": + case "attractive lingerie for a pregnant woman": + case "boyshorts": + case "cutoffs": + case "cutoffs and a t-shirt": + case "harem gauze": + case "kitty lingerie": + case "panties": + case "panties and pasties": + case "striped panties": + case "striped underwear": + if (slave.belly <= 4000) { + if (slave.dick > 3) + penisArtString = jsInclude("Art_Vector_Bulge_Outfit_3"); + else + penisArtString = jsInclude(`Art_Vector_Bulge_Outfit_${penisSize}`); + } + break; + /* hide everything */ + case "a cheerleader outfit": + case "a gothic lolita dress": + case "a hanbok": + case "a schoolgirl outfit": + break; + /* full frontal */ + default: + if (canAchieveErection(slave) && slave.dickAccessory !== "chastity" && slave.dickAccessory !== "combined chastity") { + penisDrawtime = 1; /* draw erect penis over boobs if boobs do not hide the penis' base */ + if (artBoobScaleFactor < 3.7) { + if (slave.foreskin !== 0) + penisArtString = jsInclude(`Art_Vector_Penis_${penisSize}`); + else + penisArtString = jsInclude(`Art_Vector_PenisCirc_${penisSize}`); + } + } else { + /* flaccid penises are drawn behind the boobs/belly */ + if (slave.foreskin !== 0) + penisArtString = jsInclude(`Art_Vector_Flaccid_${penisSize}`); + else + penisArtString = jsInclude(`Art_Vector_FlaccidCirc_${penisSize}`); + /* this draws chastity OVER latex catsuit. prndev finds this alright. */ + if (slave.dickAccessory === "chastity" || slave.dickAccessory === "combined chastity") + penisArtString += jsInclude(`Art_Vector_Chastity_Cage_${penisSize}`); + } + } + } + } + + function setTorsoSize() { + /* Torso size switch courtesy of Nov-X */ + if (slave.waist >= 96) { + if (slave.weight >= 96) + torsoSize = "Obese"; + else if (slave.weight >= 11) + torsoSize = "Fat"; + else if (slave.weight > -31) + torsoSize = "Chubby"; + else + torsoSize = "Normal"; + } else if (slave.waist >= 41) { + if (slave.weight >= 131) + torsoSize = "Obese"; + else if (slave.weight >= 31) + torsoSize = "Fat"; + else if (slave.weight >= 0) + torsoSize = "Chubby"; + else if (slave.weight > -96) + torsoSize = "Normal"; + else + torsoSize = "Hourglass"; + } else if (slave.waist >= 11) { + if (slave.weight >= 161) + torsoSize = "Obese"; + else if (slave.weight >= 96) + torsoSize = "Fat"; + else if (slave.weight >= 11) + torsoSize = "Chubby"; + else if (slave.weight > -31) + torsoSize = "Normal"; + else + torsoSize = "Hourglass"; + } else if (slave.waist > -11) { + if (slave.weight >= 191) + torsoSize = "Obese"; + else if (slave.weight >= 131) + torsoSize = "Fat"; + else if (slave.weight >= 31) + torsoSize = "Chubby"; + else if (slave.weight >= 0) + torsoSize = "Normal"; + else if (slave.weight > -96) + torsoSize = "Hourglass"; + else + torsoSize = "Unnatural"; + } else if (slave.waist > -41) { + if (slave.weight >= 161) + torsoSize = "Fat"; + else if (slave.weight >= 96) + torsoSize = "Chubby"; + else if (slave.weight >= 11) + torsoSize = "Normal"; + else if (slave.weight > -31) + torsoSize = "Hourglass"; + else + torsoSize = "Unnatural"; + } else if (slave.waist > -96) { + if (slave.weight >= 191) + torsoSize = "Fat"; + else if (slave.weight >= 131) + torsoSize = "Chubby"; + else if (slave.weight >= 31) + torsoSize = "Normal"; + else if (slave.weight > -11) + torsoSize = "Hourglass"; + else + torsoSize = "Unnatural"; + } else { + if (slave.weight >= 161) + torsoSize = "Chubby"; + else if (slave.weight >= 96) + torsoSize = "Normal"; + else if (slave.weight > 0) + torsoSize = "Hourglass"; + else + torsoSize = "Unnatural"; + } + } + + function ArtVectorAnalAccessories() { + if (slave.buttplug === "long plug") + r += jsInclude("Art_Vector_Plug_Long"); + else if (slave.buttplug === "large plug") + r += jsInclude("Art_Vector_Plug_Large"); + else if (slave.buttplug === "long, large plug") + r += jsInclude("Art_Vector_Plug_Large_Long"); + else if (slave.buttplug === "huge plug") + r += jsInclude("Art_Vector_Plug_Huge"); + else if (slave.buttplug === "long, huge plug") + r += jsInclude("Art_Vector_Plug_Huge_Long"); + + if (slave.buttplugAttachment === "tail") + r += jsInclude("Art_Vector_Plug_Tail"); + else if (slave.buttplugAttachment === "cat tail") + r += jsInclude("Art_Vector_Cat_Tail"); + } + + function ArtVectorArm() { + /* Arms position switch courtesy of Nov-X */ + /* Updated 2018-10-25 by Fr0g */ + /* - changed arm calculation block position*/ + /* - added brackets to make boolean logic run */ + + if (slave.amp === 1) { + /* Many amputee clothing art files exist, but draw nothing.They are excluded for now to reduce on rendering time + r += jsInclude("Art_Vector_Arm_Right_None"); + r += jsInclude("Art_Vector_Arm_Left_None"); + */ + } else { /* is not amputee or has limbs equipped so running arm calculation block */ + if (slave.amp === 0) { + r += jsInclude(`Art_Vector_Arm_Right_${rightArmType}`); + r += jsInclude(`Art_Vector_Arm_Left_${leftArmType}`); + if (slave.muscles >= 6) { + if (leftArmType === "High") + r += jsInclude("Art_Vector_Arm_Left_High_MLight"); + else if (leftArmType === "Mid") + r += jsInclude("Art_Vector_Arm_Left_Mid_MLight"); + else if (leftArmType === "Low") + r += jsInclude("Art_Vector_Arm_Left_Low_MLight"); + else if (leftArmType === "Rebel") + r += jsInclude("Art_Vector_Arm_Left_Rebel_MLight"); + + if (rightArmType === "High") + r += jsInclude("Art_Vector_Arm_Right_High_MLight"); + else if (rightArmType === "Mid") + r += jsInclude("Art_Vector_Arm_Right_Mid_MLight"); + else if (rightArmType === "Low") + r += jsInclude("Art_Vector_Arm_Right_Low_MLight"); + } + } else if (slave.PLimb === 1 || slave.PLimb === 2) { /* slave is an amputee and has PLimbs equipped */ + if (slave.amp === -1) { + r += jsInclude(`Art_Vector_Arm_Right_ProstheticBasic_${rightArmType}`); + r += jsInclude(`Art_Vector_Arm_Left_ProstheticBasic_${leftArmType}`); + } else if (slave.amp === -2) { + r += jsInclude(`Art_Vector_Arm_Right_ProstheticSexy_${rightArmType}`); + r += jsInclude(`Art_Vector_Arm_Left_ProstheticSexy_${leftArmType}`); + } else if (slave.amp === -3) {/* Reverting beauty limbs to regular SVG */ + r += jsInclude(`Art_Vector_Arm_Right_ProstheticBeauty_${rightArmType}`); + r += jsInclude(`Art_Vector_Arm_Left_ProstheticBeauty_${leftArmType}`); + } else if (slave.amp === -4) { + r += jsInclude(`Art_Vector_Arm_Right_ProstheticCombat_${rightArmType}`); + r += jsInclude(`Art_Vector_Arm_Left_ProstheticCombat_${leftArmType}`); + } else if (slave.amp === -5) { + r += jsInclude(`Art_Vector_Arm_Right_ProstheticSwiss_${rightArmType}`); + r += jsInclude(`Art_Vector_Arm_Left_ProstheticSwiss_${leftArmType}`); + } + } + /* shiny clothing */ + if (V.seeVectorArtHighlights === 1) { + if (slave.fuckdoll !== 0 || slave.clothes === "restrictive latex" || slave.clothes === "a latex catsuit" || slave.clothes === "body oil") { + /* only some arm positions have art (feel free to add more) */ + if (leftArmType === "High") + r += jsInclude("Art_Vector_Arm_Outfit_Shine_Left_High"); + else if (leftArmType === "Mid") + r += jsInclude("Art_Vector_Arm_Outfit_Shine_Left_Mid"); + else if (leftArmType === "Low") + r += jsInclude("Art_Vector_Arm_Outfit_Shine_Left_Low"); + } + } + /* TODO: simplify selection (select prefix, infix and suffix and combine instead of using switch statements) */ + switch (slave.clothes) { + case "a biyelgee costume": + case "a burkini": + case "a button-up shirt": + case "a button-up shirt and panties": + case "a cheerleader outfit": + case "a dirndl": + case "a gothic lolita dress": + case "a hanbok": + case "a hijab and blouse": + case "a huipil": + case "a kimono": + case "a klan robe": + case "a long qipao": + case "a military uniform": + case "a mounty outfit": + case "a nice maid outfit": + case "a nice nurse outfit": + case "a police uniform": + case "a red army uniform": + case "a schoolgirl outfit": + case "a slutty klan robe": + case "a slutty nurse outfit": + case "a slutty qipao": + case "a sweater": + case "a sweater and cutoffs": + case "a sweater and panties": + case "a t-shirt": + case "a t-shirt and jeans": + case "a t-shirt and panties": + case "a t-shirt and thong": + case "an oversized t-shirt": + case "an oversized t-shirt and boyshorts": + case "battlearmor": + case "battledress": + case "clubslut netting": + case "conservative clothing": + case "cutoffs and a t-shirt": + case "lederhosen": + case "nice business attire": + case "slutty business attire": + case "slutty jewelry": + case "sport shorts and a t-shirt": + case "Western clothing": + r += jsInclude(`Art_Vector_Arm_Outfit_${clothing2artSuffix(slave.clothes)}_Right_${rightArmType}`); + r += jsInclude(`Art_Vector_Arm_Outfit_${clothing2artSuffix(slave.clothes)}_Left_${leftArmType}`); + break; + /* manually handle special cases */ + case "a schutzstaffel uniform": + case "a slutty schutzstaffel uniform": + r += jsInclude(`Art_Vector_Arm_Outfit_SchutzstaffelUniform_Right_${rightArmType}`); + r += jsInclude(`Art_Vector_Arm_Outfit_SchutzstaffelUniform_Left_${leftArmType}`); + break; + case "a hijab and abaya": + case "a niqab and abaya": + case "a burqa": + r += jsInclude(`Art_Vector_Arm_Outfit_HijabAndAbaya_Right_${rightArmType}`); + r += jsInclude(`Art_Vector_Arm_Outfit_HijabAndAbaya_Left_${leftArmType}`); + break; + case "a slave gown": + /* only some arm positions have art (feel free to add more) */ + if (leftArmType !== "Rebel") + r += jsInclude(`Art_Vector_Arm_Outfit_SlaveGown_Left_${leftArmType}`); + } + } /* close .amp check */ + } + + function ArtVectorBalls() { + switch (slave.clothes) { + case "a bra": + case "a button-up shirt": + case "a comfortable bodysuit": + case "a cybersuit": + case "a fallen nuns habit": + case "a hanbok": + case "a latex catsuit": + case "a monokini": + case "a nice pony outfit": + case "a slutty pony outfit": + case "a sports bra": + case "a string bikini": + case "a striped bra": + case "a sweater": + case "a t-shirt": + case "a tank-top": + case "a thong": + case "a tube top": + case "an oversized t-shirt": + case "attractive lingerie": + case "body oil": + case "chains": + case "choosing her own clothes": + case "clubslut netting": + case "no clothing": + case "panties and pasties": + case "restrictive latex": + case "shibari ropes": + case "slutty jewelry": + case "uncomfortable straps": + case "Western clothing": + let ballsScaleFactor = (slave.scrotum / 3) * heightScaleFactor; + artTranslationX = -271 * (ballsScaleFactor - 1); + artTranslationY = -453 * (ballsScaleFactor - 1); + T.artTransformBalls = `matrix(${ballsScaleFactor},0,0,${ballsScaleFactor},${artTranslationX},${artTranslationY})`; + r += jsInclude("Art_Vector_Balls"); + } + } + + function ArtVectorBelly() { + if (slave.belly >= 2000) { + /* add pregnancy belly, scale dynamically (clothing and addons can be scaled, too) */ + /* TODO: add check in penis control. do not draw penis atop belly if _art_belly_scale_factor > 1. */ + bellyScaleFactor = 0.300 * Math.log(0.011 * slave.belly) * heightScaleFactor; + artTranslationX = -262 * (bellyScaleFactor - 1); + artTranslationY = -284 * (bellyScaleFactor - 1); + T.artTransformBelly = `matrix(${bellyScaleFactor},0,0,${bellyScaleFactor},${artTranslationX},${artTranslationY})`; + + if (slave.navelPiercing === 1) + r += jsInclude("Art_Vector_Belly_Pregnant_Piercing"); + else if (slave.navelPiercing === 2) + r += jsInclude("Art_Vector_Belly_Pregnant_Piercing_Heavy"); + else + r += jsInclude("Art_Vector_Belly"); + + switch (slave.clothes) { + case "a bra": + case "a cybersuit": + case "a Fuckdoll suit": + case "a latex catsuit": + case "a nice pony outfit": + case "a scalemail bikini": + case "a skimpy loincloth": + case "a slutty klan robe": + case "a slutty outfit": + case "a slutty pony outfit": + case "a sports bra": + case "a string bikini": + case "a striped bra": + case "a thong": + case "a tube top": + case "a tube top and thong": + case "attractive lingerie": + case "attractive lingerie for a pregnant woman": + case "body oil": + case "boyshorts": + case "chains": + case "choosing her own clothes": + case "cutoffs": + case "jeans": + case "kitty lingerie": + case "leather pants": + case "leather pants and a tube top": + case "leather pants and pasties": + case "no clothing": + case "panties": + case "panties and pasties": + case "restrictive latex": + case "shibari ropes": + case "slutty jewelry": + case "sport shorts": + case "sport shorts and a sports bra": + case "stretch pants and a crop-top": + case "striped panties": + case "striped underwear": + case "uncomfortable straps": + break; /* do nothing for these choices */ + /* manually handle special cases */ + case "a slutty schutzstaffel uniform": + r += jsInclude("Art_Vector_Belly_Outfit_SchutzstaffelUniform"); + break; + case "a niqab and abaya": + case "a burqa": + r += jsInclude("Art_Vector_Belly_Outfit_HijabAndAbaya"); + break; + default: + r += jsInclude(`Art_Vector_Belly_Outfit_${clothing2artSuffix(slave.clothes)}`); + } + /* shiny clothing */ + if (V.seeVectorArtHighlights === 1) { + if (slave.fuckdoll !== 0 || slave.clothes === "restrictive latex" || slave.clothes === "a latex catsuit" || slave.clothes === "body oil") { + r += jsInclude("Art_Vector_Belly_Outfit_Shine"); + } + } + } + /* belly piercings for flat bellies */ + if (slave.belly === 0) { + if (slave.navelPiercing === 1) + r += jsInclude("Art_Vector_Belly_Piercing"); + else if (slave.navelPiercing === 2) + r += jsInclude("Art_Vector_Belly_Piercing_Heavy"); + } + /* Torso Accessories */ + if ((slave.bellyAccessory === "a corset" || slave.bellyAccessory === "an extreme corset") && slave.belly === 0) { + if (torsoSize === "Normal") + r += jsInclude("Art_Vector_Corsetnormal"); + else if (torsoSize === "Hourglass") + r += jsInclude("Art_Vector_Corsethourglass"); + else if (torsoSize === "Unnatural") + r += jsInclude("Art_Vector_Corsetunnatural"); + } else if (slave.bellyAccessory === "a small empathy belly") { + r += jsInclude("Art_Vector_Empathy_Belly_Small"); + } else if (slave.bellyAccessory === "a medium empathy belly") { + r += jsInclude("Art_Vector_Empathy_Belly_Medium"); + } else if (slave.bellyAccessory === "a large empathy belly") { + r += jsInclude("Art_Vector_Empathy_Belly_Large"); + } else if (slave.bellyAccessory === "a huge empathy belly") { + r += jsInclude("Art_Vector_Empathy_Belly_Huge"); + } + } + + function ArtVectorBoob() { + if (slave.boobs < 300) { + /* BEWARE: this threshold may be used in other art-related code, too */ + /* boobs too small - draw areolae directly onto torso */ + } else { + r += jsInclude("Art_Vector_Boob_Alt"); + /* shiny clothing */ + if (V.seeVectorArtHighlights === 1) { + if (slave.fuckdoll !== 0 || slave.clothes === "a latex catsuit" || slave.clothes === "body oil") + r += jsInclude("Art_Vector_Boob_Outfit_Shine"); + } + } + switch (slave.clothes) { /* display nipples/areola for the following clothes */ + case "a chattel habit": + case "a fallen nuns habit": + case "a Fuckdoll suit": + case "a monokini": + case "a nice pony outfit": + case "a skimpy loincloth": + case "a slutty pony outfit": + case "a string bikini": + case "a succubus outfit": + case "a thong": + case "a toga": + case "attractive lingerie for a pregnant woman": + case "body oil": + case "boyshorts": + case "chains": + case "choosing her own clothes": + case "clubslut netting": + case "cutoffs": + case "jeans": + case "leather pants": + case "no clothing": + case "panties": + case "restrictive latex": + case "shibari ropes": + case "slutty jewelry": + case "sport shorts": + case "striped panties": + case "uncomfortable straps": + if (slave.areolaeShape === "star") + r += jsInclude("Art_Vector_Boob_Areola_Star"); + else if (slave.areolaeShape === "heart") + r += jsInclude("Art_Vector_Boob_Areola_Heart"); + else if (slave.areolae === 0) + r += jsInclude("Art_Vector_Boob_Areola"); + else if (slave.areolae === 1) + r += jsInclude("Art_Vector_Boob_Areola_Large"); + else if (slave.areolae === 2) + r += jsInclude("Art_Vector_Boob_Areola_Wide"); + else if (slave.areolae === 3) + r += jsInclude("Art_Vector_Boob_Areola_Huge"); + + if (slave.nipples === "tiny") + r += jsInclude("Art_Vector_Boob_NippleTiny"); + else if (slave.nipples === "cute") + r += jsInclude("Art_Vector_Boob_NippleCute"); + else if (slave.nipples === "puffy") + r += jsInclude("Art_Vector_Boob_NipplePuffy"); + else if (slave.nipples === "inverted") + r += jsInclude("Art_Vector_Boob_NippleInverted"); + else if (slave.nipples === "huge") + r += jsInclude("Art_Vector_Boob_NippleHuge"); + else if (slave.nipples === "partially inverted") + r += jsInclude("Art_Vector_Boob_NipplePartiallyInverted"); + else if (slave.nipples === "fuckable") + r += jsInclude("Art_Vector_Boob_NippleFuckable"); + } + } + + function ArtVectorBoobAddons() { + if (slave.boobs < 300) { + /* boobs too small: do not show boob-related art */ + /* BEWARE: this threshold should be kept in sync with the one in Art_Vector_Boob_ */ + } else { + switch (slave.clothes) { + case "a chattel habit": + case "a comfortable bodysuit": + case "a cybersuit": + case "a fallen nuns habit": + case "a Fuckdoll suit": + case "a latex catsuit": + case "a nice pony outfit": + case "a skimpy loincloth": + case "a slutty pony outfit": + case "a succubus outfit": + case "a thong": + case "body oil": + case "boyshorts": + case "choosing her own clothes": + case "cutoffs": + case "jeans": + case "leather pants": + case "no clothing": + case "panties": + case "restrictive latex": + case "sport shorts": + case "striped panties": + break; /* do nothing for these choices */ + /* manually handle special cases */ + case "a slutty schutzstaffel uniform": + r += jsInclude("Art_Vector_Boob_Outfit_SchutzstaffelUniform"); + break; + case "a niqab and abaya": + case "a burqa": + r += jsInclude("Art_Vector_Boob_Outfit_HijabAndAbaya"); + break; + default: + r += jsInclude(`Art_Vector_Boob_Outfit_${clothing2artSuffix(slave.clothes)}`); + } + } + if (V.showBodyMods === 1 && (slave.nipplesPiercing > 0 || slave.areolaePiercing > 0)) { + /* shows nipple piercings in game when selected; piercings will show on the outfits listed below */ + switch (slave.clothes) { + case "a chattel habit": + case "a comfortable bodysuit": + case "a cybersuit": + case "a fallen nuns habit": + case "a latex catsuit": + case "a monokini": + case "a nice pony outfit": + case "a penitent nuns habit": + case "a skimpy loincloth": + case "a slutty pony outfit": + case "a string bikini": + case "a succubus outfit": + case "a thong": + case "an apron": + case "attractive lingerie": + case "attractive lingerie for a pregnant woman": + case "body oil": + case "boyshorts": + case "chains": + case "choosing her own clothes": + case "cutoffs": + case "jeans": + case "leather pants": + case "leather pants and a tube top": + case "leather pants and pasties": + case "no clothing": + case "panties": + case "restrictive latex": + case "shibari ropes": + case "slutty jewelry": + case "sport shorts": + case "striped panties": + case "uncomfortable straps": + if (slave.nipplesPiercing === 1) + r += jsInclude("Art_Vector_Boob_Piercing"); + else if (slave.nipplesPiercing > 1) + r += jsInclude("Art_Vector_Boob_Piercing_Heavy"); + + if (slave.areolaePiercing === 1) + r += jsInclude("Art_Vector_Boob_Areola_Piercing"); + else if (slave.areolaePiercing > 1) + r += jsInclude("Art_Vector_Boob_Areola_Piercingheavy"); + } + } + } + + function ArtVectorButt() { + if (slave.amp === 0) + r += jsInclude(`Art_Vector_Butt_${buttSize}`); + else if (slave.amp === -1) + r += jsInclude(`Art_Vector_Butt_ProstheticBasic_${buttSize}`); + else if (slave.amp === -2) + r += jsInclude(`Art_Vector_Butt_ProstheticSexy_${buttSize}`); + else if (slave.amp === -3) /* reverted to regular SVG to match description */ + r += jsInclude(`Art_Vector_Butt_ProstheticBeauty_${buttSize}`); + else if (slave.amp === -4) + r += jsInclude(`Art_Vector_Butt_ProstheticCombat_${buttSize}`); + else if (slave.amp === -5) + r += jsInclude(`Art_Vector_Butt_ProstheticSwiss_${buttSize}`); + } + + function ArtVectorChastityBelt() { + let bodySize = ""; + if (slave.waist >= 96) { + if (slave.weight >= 11) + bodySize = "Fat"; + else if (slave.weight > -31) + bodySize = "_Chubby"; + } else if (slave.waist >= 41) { + if (slave.weight >= 31) + bodySize = "Fat"; + else if (slave.weight >= 0) + bodySize = "_Chubby"; + } else if (slave.waist >= 11) { + if (slave.weight >= 96) + bodySize = "Fat"; + else if (slave.weight >= 11) + bodySize = "_Chubby"; + } else if (slave.waist > -11) { + if (slave.weight >= 131) + bodySize = "Fat"; + else if (slave.weight >= 31) + bodySize = "_Chubby"; + } else if (slave.waist > -41) { + if (slave.weight >= 161) + bodySize = "Fat"; + else if (slave.weight >= 96) + bodySize = "_Chubby"; + } else if (slave.waist > -96) { + if (slave.weight >= 191) + bodySize = "Fat"; + else if (slave.weight >= 131) + bodySize = "_Chubby"; + } else { + if (slave.weight >= 31) + bodySize = "_Chubby"; + } + + if (slave.dickAccessory === "anal chastity" || slave.dickAccessory === "combined chastity" || slave.vaginalAccessory === "anal chastity" || slave.vaginalAccessory === "combined chastity") { + if (bodySize === "Fat") { + r += jsInclude("Art_Vector_Chastity_Vagina_Fat"); + } else { + r += jsInclude("Art_Vector_Chastity_Anus"); + r += jsInclude(`Art_Vector_Chastity_Base${bodySize}`); + } + } + if (slave.vaginalAccessory === "chastity belt" || slave.vaginalAccessory === "combined chastity") { + if (bodySize === "Fat") { + r += jsInclude("Art_Vector_Chastity_Vagina_Fat"); + } else { + r += jsInclude("Art_Vector_Chastity_Vagina"); + r += jsInclude(`Art_Vector_Chastity_Base${bodySize}`); + } + } + if (slave.vaginalAccessory !== "none") { + switch (slave.clothes) {/* shows vaginal accessories on the outfits below */ + case "a bra": + case "a button-up shirt": + case "a button-up shirt and panties": + case "a chattel habit": + case "a comfortable bodysuit": + case "a fallen nuns habit": + case "a Fuckdoll suit": + case "a latex catsuit": + case "a monokini": + case "a nice pony outfit": + case "a penitent nuns habit": + case "a slutty klan robe": + case "a slutty outfit": + case "a slutty pony outfit": + case "a sports bra": + case "a string bikini": + case "a striped bra": + case "a succubus outfit": + case "a sweater": + case "a t-shirt": + case "a t-shirt and panties": + case "a t-shirt and thong": + case "a tank-top": + case "a thong": + case "a tube top": + case "a tube top and thong": + case "an apron": + case "an oversized t-shirt": + case "attractive lingerie": + case "attractive lingerie for a pregnant woman": + case "body oil": + case "chains": + case "choosing her own clothes": + case "clubslut netting": + case "cutoffs": + case "harem gauze": + case "no clothing": + case "panties": + case "panties and pasties": + case "restrictive latex": + case "shibari ropes": + case "slutty jewelry": + case "striped underwear": + case "uncomfortable straps": + if (slave.vaginalAccessory === "dildo") { + r += jsInclude("Art_Vector_Dildo_Short"); + } else if (slave.vaginalAccessory === "long dildo") { + r += jsInclude("Art_Vector_Dildo_Long"); + } else if (slave.clothes !== "a comfortable bodysuit" && slave.clothes !== "a string bikini" && slave.clothes !== "attractive lingerie for a pregnant woman" && slave.clothes !== "restrictive latex") { + if (slave.vaginalAccessory === "large dildo") /* additional outfits disabled due to the art breaking with the larger accessories */ + r += jsInclude("Art_Vector_Dildo_Large"); + else if (slave.vaginalAccessory === "long, large dildo") + r += jsInclude("Art_Vector_Dildo_Large_Long"); + else if (slave.vaginalAccessory === "huge dildo") + r += jsInclude("Art_Vector_Dildo_Huge"); + else if (slave.vaginalAccessory === "long, huge dildo") + r += jsInclude("Art_Vector_Dildo_Huge_Long"); + } + } + } + } + + function ArtVectorColor() { + let outfitBaseColour; + + /* + WARNING: Some of these temporary variables are used in wardrobeUse.tw or salon.tw + Known examples are _outfitBaseColour, _glassesColor, and _shoeColour + */ + setOutfitColor(); + setSkinColor(); + setHairColor(); + setShoeColor(); + + function setOutfitColor() { + /* TODO: rewrite all textual descriptions not to explicitly mention the latex being of black color. */ + if (slave.clothes === "a Fuckdoll suit" || slave.clothes === "restrictive latex" || slave.clothes === "a latex catsuit" || slave.clothes === "a cybersuit") + outfitBaseColour = slave.clothingBaseColor || "#515351"; /* use custom color, or use default latex color */ + else if (slave.clothes == "a comfortable bodysuit") + outfitBaseColour = slave.clothingBaseColor || "#464646"; /* use custom color, or use default bodysuit color */ + + /* head addons */ + if (slave.collar === "porcelain mask") + T.glassesColor = slave.glassesColor || "#FFFFFF"; /* use custom color or white */ + else + T.glassesColor = slave.glassesColor || "#010101"; /* use custom color or default */ + + T.eyeColor = extractColor(slave.eyeColor, 1); + T.outfitBaseColour = outfitBaseColour; + } + + function setSkinColor() { + const colorSlave = skinColorCatcher(slave); + + /* setting default values */ + T.areolaStyle = colorSlave.areolaColor; + T.bellybuttonStyle = colorSlave.areolaColor; + T.labiaStyle = colorSlave.labiaColor; + T.skinColour = colorSlave.skinColor; + /* todo: introduce fleshStyle */ + /* these need to be declared so they can be set conditionally */ + T.headSkinStyle = undefined; + T.torsoSkinStyle = undefined; + T.boobSkinStyle = undefined; + T.penisSkinStyle = undefined; + T.scrotumSkinStyle = undefined; + T.bellySkinStyle = undefined; + + /* BEGIN SKIN COLOR OVERRIDES FOR LATEX CLOTHING EMULATION */ + if (slave.clothes === "a Fuckdoll suit") { + /* slave is a fuckdoll - display all skin as if it was black rubber */ + T.skinColour = outfitBaseColour; + T.areolaStyle = "fill:rgba(81,83,81,1);"; + T.labiaStyle = T.areolaStyle; + T.bellybuttonStyle = T.areolaStyle; + } else if (slave.clothes === "restrictive latex") { /* slave wears restrictive latex - display most skin as if it was rubber */ + /* nice latex does not cover any privates. */ + T.boobSkinStyle = "fill:"+T.skinColour+";"; + T.penisSkinStyle = "fill:"+T.skinColour+";"; + T.scrotumSkinStyle = "fill:"+T.skinColour+";"; + T.torsoSkinStyle = "fill:"+T.skinColour+";"; + /* rest of body is covered in latex */ + T.skinColour = outfitBaseColour; + T.bellybuttonStyle = outfitBaseColour; + } else if (slave.clothes === "a latex catsuit") { + /* nice latex does not cover head. */ + T.headSkinStyle = "fill:"+T.skinColour+";"; + /* rest of body is covered in latex */ + T.skinColour = outfitBaseColour; + /* catsuit covers areolae and crotch, too */ + T.bellybuttonStyle = outfitBaseColour; + } else if (slave.clothes === "a cybersuit") { + /* rest of body is covered in latex */ + T.skinColour = outfitBaseColour; + T.bellybuttonStyle = outfitBaseColour; + } else if (slave.clothes === "a comfortable bodysuit") { + /* nice bodysuit does not cover head. */ + T.headSkinStyle = "fill:"+T.skinColour+";"; + /* rest of body is covered in bodysuit */ + T.skinColour = outfitBaseColour; + T.bellySkinStyle = outfitBaseColour; + T.bellybuttonStyle = outfitBaseColour; + } + /* END SKIN COLOR OVERRIDES FOR LATEX CLOTHING EMULATION */ + + /* outfit dick coloring to match outfit rgba in svg */ + switch (slave.clothes) { + case "a cheerleader outfit": + T.scrotumSkinStyle = "fill:rgba(250,186,0,1);"; + T.bellySkinStyle = "fill:rgba(95,110,160,1);"; + break; + case "cutoffs and a t-shirt": + T.scrotumSkinStyle = "fill:rgba(81,124,211,1);"; + break; + case "a halter top dress": + T.scrotumSkinStyle = "fill:rgba(94,51,124,1);"; + T.bellySkinStyle = "fill:rgba(94,51,124,1);"; + break; + case "a burqa": + case "a hijab and abaya": + case "a niqab and abaya": + T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; + T.bellySkinStyle = "fill:rgba(51,51,51,1);"; + break; + case "a hijab and blouse": + T.scrotumSkinStyle = "fill:rgba(85,0,34,1);"; + T.bellySkinStyle = "fill:rgba(85,0,34,1);"; + break; + case "a burkini": + T.scrotumSkinStyle = "fill:rgba(0,97,158,1);"; + T.bellySkinStyle = "fill:rgba(0,97,158,1);"; + break; + case "a klan robe": + T.scrotumSkinStyle = "fill:rgba(236,236,236,1);"; + T.bellySkinStyle = "fill:rgba(236,236,236,1);"; + break; + case "a nice maid outfit": + case "a slutty maid outfit": + T.scrotumSkinStyle = "fill:rgba(225,225,225,1);"; + T.bellySkinStyle = "fill:rgba(225,225,225,1);"; + break; + case "a leotard": + T.scrotumSkinStyle = "fill:rgba(120,15,55,1);"; + T.bellySkinStyle = "fill:rgba(120,15,55,1);"; + break; + case "a military uniform": + T.scrotumSkinStyle = "fill:rgba(34,42,18,1);"; + T.bellySkinStyle = "fill:rgba(34,42,18,1);"; + break; + case "a mini dress": + T.scrotumSkinStyle = "fill:rgba(26,26,26,1);"; + T.bellySkinStyle = "fill:rgba(26,26,26,1);"; + break; + case "a nice nurse outfit": + T.scrotumSkinStyle = "fill:rgba(0,128,128,1);"; + T.bellySkinStyle = "fill:rgba(0,128,128,1);"; + break; + case "a slutty nurse outfit": + T.scrotumSkinStyle = "fill:rgba(255,255,255,1);"; + break; + case "a scalemail bikini": + T.scrotumSkinStyle = "fill:rgba(133,146,158,1);"; + break; + case "striped panties": + T.scrotumSkinStyle = "fill:rgba(255,255,255,1);"; + break; + case "a schoolgirl outfit": + T.scrotumSkinStyle = "fill:rgba(28,31,36,1);"; + T.bellySkinStyle = "fill:rgba(28,31,36,1);"; + break; + case "a ball gown": + T.scrotumSkinStyle = "fill:rgba(128,0,0,1);"; + T.bellySkinStyle = "fill:rgba(128,0,0,1);"; + break; + case "battledress": + T.scrotumSkinStyle = "fill:rgba(34,42,18,1);"; + T.bellySkinStyle = "fill:rgba(34,42,18,1);"; + break; + case "a slave gown": + T.scrotumSkinStyle = "fill:rgba(200,200,200,1);"; + T.bellySkinStyle = "fill:rgba(200,200,200,1);"; + break; + case "a slutty outfit": + T.scrotumSkinStyle = "fill:rgba(63,126,181,1);"; + break; + case "spats and a tank top": + T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; + break; + case "a succubus outfit": + T.scrotumSkinStyle = "fill:rgba(128,0,0,1);"; + T.bellySkinStyle = "fill:rgba(128,0,0,1);"; + break; + case "nice business attire": + T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; + T.bellySkinStyle = "fill:rgba(51,51,51,1);"; + break; + case "slutty business attire": + T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; + break; + case "attractive lingerie for a pregnant woman": + T.scrotumSkinStyle = "fill:rgba(153,153,153,1);"; + break; + case "a bunny outfit": + T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; + T.bellySkinStyle = "fill:rgba(51,51,51,1);"; + break; + case "conservative clothing": + T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; + T.bellySkinStyle = "fill:rgba(51,51,51,1);"; + break; + case "harem gauze": + T.scrotumSkinStyle = "fill:rgba(0,168,131,1);"; + break; + case "a huipil": + T.scrotumSkinStyle = "fill:rgba(200,200,200,1);"; + T.bellySkinStyle = "fill:rgba(200,200,200,1);"; + break; + case "a kimono": + T.scrotumSkinStyle = "fill:rgba(0,91,150,1);"; + T.bellySkinStyle = "fill:rgba(0,91,150,1);"; + break; + case "a maternity dress": + T.scrotumSkinStyle = "fill:rgba(48,54,72,1);"; + T.bellySkinStyle = "fill:rgba(48,54,72,1);"; + break; + case "a slutty qipao": + T.scrotumSkinStyle = "fill:rgba(204,177,68,1);"; + T.bellySkinStyle = "fill:rgba(204,177,68,1);"; + break; + case "stretch pants and a crop-top": + T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; + break; + case "a toga": + T.scrotumSkinStyle = "fill:rgba(200,200,200,1);"; + T.bellySkinStyle = "fill:rgba(200,200,200,1);"; + break; + case "a penitent nuns habit": + T.scrotumSkinStyle = "fill:rgba(114,93,73,1);"; + break; + case "a fallen nuns habit": + T.bellySkinStyle = "fill:rgba(51,51,51,1);"; + break; + case "a chattel habit": + T.scrotumSkinStyle = "fill:rgba(200,200,200,1);"; + break; + case "a monokini": + T.scrotumSkinStyle = "fill:rgba(33,47,61,1);"; + break; + case "a schutzstaffel uniform": + case "a slutty schutzstaffel uniform": + T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; + T.bellySkinStyle = "fill:rgba(51,51,51,1);"; + break; + case "a red army uniform": + T.scrotumSkinStyle = "fill:rgba(114,93,73,1);"; + T.bellySkinStyle = "fill:rgba(114,93,73,1);"; + break; + case "an apron": + T.scrotumSkinStyle = "fill:rgba(255,105,180,1);"; + T.bellySkinStyle = "fill:rgba(255,105,180,1);"; + break; + case "a dirndl": + T.scrotumSkinStyle = "fill:rgba(128,0,51,1);"; + T.bellySkinStyle = "fill:rgba(128,0,51,1);"; + break; + case "lederhosen": + T.scrotumSkinStyle = "fill:rgba(93,83,108,1);"; + break; + case "a long qipao": + T.scrotumSkinStyle = "fill:rgba(0,128,0,1);"; + break; + case "a mounty outfit": + T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; + T.bellySkinStyle = "fill:rgba(128,0,0,1);"; + break; + case "battlearmor": + T.scrotumSkinStyle = "fill:rgba(200,200,200,1);"; + break; + case "striped underwear": + T.scrotumSkinStyle = "fill:rgba(255,255,255,1);"; + break; + case "panties": + T.scrotumSkinStyle = "fill:rgba(255,170,238,1);"; + break; + case "a thong": + T.scrotumSkinStyle = "fill:rgba(34,28,36,1);"; + break; + case "a button-up shirt and panties": + case "a t-shirt and panties": + T.scrotumSkinStyle = "fill:rgba(255,255,255,1);"; + T.bellySkinStyle = "fill:rgba(255,255,255,1);"; + break; + case "a slutty klan robe": + T.scrotumSkinStyle = "fill:rgba(128,0,0,1);"; + break; + case "cutoffs": + T.scrotumSkinStyle = "fill:rgba(81,124,211,1);"; + break; + case "sport shorts": + case "sport shorts and a sports bra": + T.scrotumSkinStyle = "fill:rgba(51,51,51,1);"; + break; + case "a t-shirt and thong": + T.scrotumSkinStyle = "fill:rgba(200,55,171,1);"; + T.bellySkinStyle = "fill:rgba(200,55,171,1);"; + break; + case "jeans": + T.scrotumSkinStyle = "fill:rgba(81,124,211,1);"; + break; + case "leather pants": + case "leather pants and a tube top": + T.scrotumSkinStyle = "fill:rgba(26,26,26,1);"; + break; + case "leather pants and pasties": + T.scrotumSkinStyle = "fill:rgba(85,0,0,1);"; + break; + case "a t-shirt and jeans": + T.scrotumSkinStyle = "fill:rgba(81,124,211,1);"; + T.bellySkinStyle = "fill:rgba(255,255,255,1);"; + break; + case "a tank-top and panties": + T.scrotumSkinStyle = "fill:rgba(26,26,26,1);"; + T.bellySkinStyle = "fill:rgba(26,26,26,1);"; + break; + case "a tank-top": + T.bellySkinStyle = "fill:rgba(255,255,255,1);"; + break; + case "a tube top and thong": + T.scrotumSkinStyle = "fill:rgba(34,28,36,1);"; + break; + case "boyshorts": + T.scrotumSkinStyle = "fill:rgba(26,26,26,1);"; + break; + case "an oversized t-shirt and boyshorts": + T.bellySkinStyle = "fill:rgba(255,255,255,1);"; + break; + case "a sweater and panties": + T.scrotumSkinStyle = "fill:rgba(26,26,26,1);"; + T.bellySkinStyle = "fill:rgba(212,170,0,1);"; + break; + case "a sweater and cutoffs": + T.scrotumSkinStyle = "fill:rgba(77,77,77,1);"; + T.bellySkinStyle = "fill:rgba(85,0,0,1);"; + break; + case "a police uniform": + T.scrotumSkinStyle = "fill:rgba(11,23,40,1);"; + T.bellySkinStyle = "fill:rgba(11,23,40,1);"; + break; + case "a one-piece swimsuit": + T.scrotumSkinStyle = "fill:rgba(22,45,80,1);"; + T.bellySkinStyle = "fill:rgba(22,45,80,1);"; + break; + case "a skimpy loincloth": + T.scrotumSkinStyle = "fill:rgba(145,124,111,1);"; + break; + case "kitty lingerie": + T.scrotumSkinStyle = "fill:rgba(255,170,238,1);"; + break; + case "an oversized t-shirt": + T.bellySkinStyle = "fill:rgba(255,255,255,1);"; + break; + case "a hanbok": + T.bellySkinStyle = "fill:rgba(255,109,182,1);"; + break; + case "a gothic lolita dress": + T.bellySkinStyle = "fill:rgba(26,26,26,1);"; + break; + case "a sweater": + T.bellySkinStyle = "fill:rgba(85,0,0,1);"; + break; + case "sport shorts and a t-shirt": + T.scrotumSkinStyle = "fill:rgba(200,55,171,1);"; + T.bellySkinStyle = "fill:rgba(200,55,171,1);"; + break; + case "a biyelgee costume": + T.scrotumSkinStyle = "fill:rgba(33,68,120,1);"; + } + } + + function setHairColor() { + T.hairColour = extractColor(slave.hColor); + T.pubicHairColour = extractColor(slave.pubicHColor); + T.underarmHairColour = extractColor(slave.underArmHColor); + T.eyebrowHairColour = extractColor(slave.eyebrowHColor); + T.sclerae = extractColor(slave.sclerae); + } + + function setShoeColor() { + /* BEWARE: _shoeColour is read by Wardrobe Use */ + /* note: only heels use this _shoeShadowColour */ + + /* override color in case of full body latex outfit, or custom color*/ + if (slave.clothes === "a Fuckdoll suit" || slave.clothes === "restrictive latex") { + T.shoeColour = T.skinColour; + T.shoeShadowColour = T.shoeColour+";opacity: 0.5"; /* TODO: do not abuse "color" variable for style definitions. do not rely on dark background for shadow effect either. */ + } else if (slave.shoeColor !== undefined) { + T.shoeColour = slave.shoeColor+";opacity: 0.4"; /* shoe color selected by user */ + T.shoeShadowColour = T.shoeColour+";opacity: 0.5"; /* TODO: do not abuse "color" variable for style definitions. do not rely on dark background for shadow effect either. */ + } else { + T.shoeShadowColour = "#616a6b"; + if (slave.shoes === "none") + T.shoeColour = "#595959"; + else + T.shoeColour = "#80808080"; + } + } + } + + function ArtVectorCollar() { + r += jsInclude("Art_Vector_Clavicle"); + /* TODO": find out where "uncomfortable leather" collar art went */ + switch (slave.collar) { + case "leather with cowbell": + r += jsInclude("Art_Vector_Collar_Cowbell"); + break; + case "heavy gold": + r += jsInclude("Art_Vector_Collar_Gold_Heavy"); + break; + case "neck corset": + r += jsInclude("Art_Vector_Collar_Neck_Corset"); + break; + case "pretty jewelry": + r += jsInclude("Art_Vector_Collar_Pretty_Jewelry"); + break; + case "cruel retirement counter": + r += jsInclude("Art_Vector_Collar_Retirement_Cruel"); + break; + case "nice retirement counter": + r += jsInclude("Art_Vector_Collar_Retirement_Nice"); + break; + case "satin choker": + r += jsInclude("Art_Vector_Collar_Satin_Choker"); + break; + case "shock punishment": + r += jsInclude("Art_Vector_Collar_Shock_Punishment"); + break; + case "stylish leather": + r += jsInclude("Art_Vector_Collar_Stylish_Leather"); + break; + case "tight steel": + r += jsInclude("Art_Vector_Collar_Tight_Steel"); + break; + case "uncomfortable leather": + r += jsInclude("Art_Vector_Collar_Leather_Cruel"); + break; + case "silk ribbon": + r += jsInclude("Art_Vector_Collar_Silk_Ribbon"); + break; + case "bowtie": + r += jsInclude("Art_Vector_Collar_Bowtie"); + break; + case "ancient Egyptian": + r += jsInclude("Art_Vector_Collar_Ancientegyptian"); + } + } + + function ArtVectorFeet() { + let outfit, stockings; + if (slave.legAccessory === "short stockings") + stockings = "SS"; + else if (slave.legAccessory === "long stockings") + stockings = "LL"; + + /* Updated 2018-10-25 by Fr0g */ + /* - added brackets to make boolean logic run */ + if (slave.shoes === "heels") { + r += jsInclude("Art_Vector_Shoes_Heel"); + } else if (slave.shoes === "pumps") { + r += jsInclude("Art_Vector_Shoes_Pump"); + } else if (slave.shoes === "extreme heels") { + r += jsInclude(`Art_Vector_Shoes_Extreme_Heel_${legSize}`); + } else if (slave.shoes === "boots") { + r += jsInclude(`Art_Vector_Shoes_Boot_${legSize}`); + } else if (slave.shoes === "flats") { + r += jsInclude("Art_Vector_Shoes_Flat"); + } else { + if (slave.amp === 0) { + r += jsInclude("Art_Vector_Feet_Normal"); + } else if (slave.PLimb === 1 || slave.PLimb === 2) { + if (slave.amp === -1) + r += jsInclude("Art_Vector_Feet_ProstheticBasic"); + else if (slave.amp === -2) + r += jsInclude("Art_Vector_Feet_ProstheticSexy"); + else if (slave.amp === -3) + r += jsInclude("Art_Vector_Feet_ProstheticBeauty"); + else if (slave.amp === -4) + r += jsInclude("Art_Vector_Feet_ProstheticCombat"); + else if (slave.amp === -5) + r += jsInclude("Art_Vector_Feet_ProstheticSwiss"); + } + } + if (stockings !== undefined && slave.amp !== 1) { + if (slave.shoes === "heels") { + r += jsInclude(`Art_Vector_Shoes_Heel_${stockings}_${legSize}`); + } else if (slave.shoes === "pumps") { + r += jsInclude(`Art_Vector_Shoes_Pump_${stockings}_${legSize}`); + } else if (slave.shoes === "flats") { + r += jsInclude(`Art_Vector_Shoes_Flat_${stockings}_${legSize}`); + } else if (slave.shoes === "none") { + r += jsInclude(`Art_Vector_Shoes_Stockings_${stockings}_${legSize}`); + } + } + switch (slave.clothes) { + case "a bra": + case "a button-up shirt": + case "a button-up shirt and panties": + case "a chattel habit": + case "a comfortable bodysuit": + case "a cybersuit": + case "a gothic lolita dress": + case "a hanbok": + case "a leotard": + case "a nice pony outfit": + case "a one-piece swimsuit": + case "a penitent nuns habit": + case "a scalemail bikini": + case "a skimpy loincloth": + case "a slutty klan robe": + case "a slutty outfit": + case "a slutty pony outfit": + case "a sports bra": + case "a string bikini": + case "a striped bra": + case "a sweater": + case "a sweater and panties": + case "a t-shirt": + case "a t-shirt and panties": + case "a t-shirt and thong": + case "a tank-top": + case "a tank-top and panties": + case "a thong": + case "a tube top": + case "a tube top and thong": + case "an oversized t-shirt": + case "attractive lingerie for a pregnant woman": + case "chains": + case "choosing her own clothes": + case "kitty lingerie": + case "no clothing": + case "panties": + case "panties and pasties": + case "shibari ropes": + case "striped panties": + case "striped underwear": + case "uncomfortable straps": + break; /* do nothing for these cases */ + case "a Fuckdoll suit": + case "a latex catsuit": + case "body oil": + case "restrictive latex": + if (V.seeVectorArtHighlights === 1) /* special case for shiny clothing */ + outfit = "Shine"; + break; + default: + outfit = clothing2artSuffix(slave.clothes); + } + if (outfit !== undefined) { + if (slave.amp !== 1) { + if (slave.clothes !== "a slutty qipao" && slave.clothes !== "harem gauze" && slave.clothes !== "slutty jewelry" && slave.clothes !== "Western clothing") /* these clothes have a stump/leg outfit, but no butt outfit */ + r += jsInclude(`Art_Vector_Butt_Outfit_${outfit}_${buttSize}`); + if (slave.clothes !== "a schoolgirl outfit") /* file is there, but contains no artwork */ + r += jsInclude(`Art_Vector_Leg_Outfit_${outfit}_${legSize}`); + } else { + if (outfit === "Shine") /* the only stump outfit that does not draw an empty svg */ + r += jsInclude(`Art_Vector_Leg_Outfit_${outfit}_Stump`); + } + } + } + + function ArtVectorHairBack() { + if (hairLength !== undefined) { /* Don't draw hair if it isn't there */ + if (slave.fuckdoll !== 0 || (slave.bald !== 0 && slave.hStyle === "bald")) { + r += jsInclude("Art_Vector_Hair_Back_NoHair"); + } else { + switch (slave.clothes) { + case "a biyelgee costume": + case "a burkini": + case "a burqa": + case "a chattel habit": + case "a cybersuit": + case "a fallen nuns habit": + case "a hijab and abaya": + case "a hijab and blouse": + case "a klan robe": + case "a military uniform": + case "a mounty outfit": + case "a niqab and abaya": + case "a penitent nuns habit": + case "a police uniform": + case "a red army uniform": + case "a schutzstaffel uniform": + case "a slutty klan robe": + case "a slutty nurse outfit": + case "a slutty schutzstaffel uniform": + case "battlearmor": + case "restrictive latex": + case "Western clothing": + break; /* do nothing */ + default: + switch (slave.hStyle) { + case "buzzcut": + case "shaved": + case "shaved bald": + r += jsInclude("Art_Vector_Hair_Back_NoHair"); + break; + case "afro": + if (slave.hLength >= 150) + r += jsInclude("Art_Vector_Hair_Back_Afro_Giant"); + else + r += jsInclude(`Art_Vector_Hair_Back_Afro_${hairLength}`); + break; + case "messy bun": + r += jsInclude(`Art_Vector_Hair_Back_Ninja_${hairLength}`); + break; + case "strip": + r += jsInclude("Art_Vector_Hair_Back_NoHair"); + break; + case "braided": + case "bun": + case "cornrows": + case "curled": + case "dreadlocks": + case "eary": + case "luxurious": + case "messy": + case "neat": + case "permed": + case "ponytail": + case "tails": + case "up": + r += jsInclude(`Art_Vector_Hair_Back_${capFirstChar(slave.hStyle)}_${hairLength}`); + break; + default: + r += jsInclude("Art_Vector_Hair_Back_Messy_Medium"); + } + } + } + } + /* note: latex clothing actually shows some hair, but there is no appropriate art for it */ + if (slave.collar === "cat ears") + r += jsInclude("Art_Vector_Cat_Ear_Back"); + } + + function ArtVectorHairFore() { + if (hairLength !== undefined) { /* Don't draw hair if it isn't there */ + if (slave.fuckdoll !== 0 || (slave.bald !== 0 && slave.hStyle === "bald")) { + r += jsInclude("Art_Vector_Hair_Fore_NoHair"); + } else { + switch (slave.clothes) { + case "a biyelgee costume": + case "a burkini": + case "a burqa": + case "a chattel habit": + case "a cybersuit": + case "a fallen nuns habit": + case "a hijab and abaya": + case "a hijab and blouse": + case "a klan robe": + case "a military uniform": + case "a mounty outfit": + case "a niqab and abaya": + case "a penitent nuns habit": + case "a police uniform": + case "a red army uniform": + case "a schutzstaffel uniform": + case "a slutty klan robe": + case "a slutty nurse outfit": + case "a slutty schutzstaffel uniform": + case "battlearmor": + case "restrictive latex": + case "Western clothing": + break; /* do nothing */ + default: + switch (slave.hStyle) { + case "buzzcut": + case "shaved": + case "shaved bald": + r += jsInclude("Art_Vector_Hair_Fore_NoHair"); + break; + case "afro": + if (slave.hLength >= 150) + r += jsInclude("Art_Vector_Hair_Fore_Afro_Giant"); + else + r += jsInclude(`Art_Vector_Hair_Fore_Afro_${hairLength}`); + break; + case "messy bun": + r += jsInclude(`Art_Vector_Hair_Fore_Ninja_${hairLength}`); + break; + case "bun": + case "neat": + case "ponytail": + r += jsInclude(`Art_Vector_Hair_Fore_${capFirstChar(slave.hStyle)}`); + break; + case "braided": + case "cornrows": + case "curled": + case "dreadlocks": + case "eary": + case "luxurious": + case "messy": + case "permed": + case "strip": + case "tails": + case "up": + r += jsInclude(`Art_Vector_Hair_Fore_${capFirstChar(slave.hStyle)}_${hairLength}`); + break; + default: + r += jsInclude("Art_Vector_Hair_Fore_Messy_Medium"); + } + } + } + } + /* note: latex clothing actually shows some hair, but there is no appropriate art for it */ + if (slave.collar === "cat ears") + r += jsInclude("Art_Vector_Cat_Ear_Fore"); + } + + function ArtVectorHead() { + const eyebrowFullness = clothing2artSuffix(slave.eyebrowFullness); /* designed for clothing but works for eyebrows too. If other eyebrow styles are added, this may need to be changed. */ + const hasEyebrows = slave.eyebrowHStyle !== "bald" && slave.eyebrowHStyle !== "shaved"; + + r += jsInclude("Art_Vector_Head"); + /* shiny clothing */ + if (V.seeVectorArtHighlights === 1) { + if (slave.fuckdoll !== 0 || slave.clothes === "restrictive latex" || slave.clothes === "a latex catsuit") + r += jsInclude("Art_Vector_Head_Outfit_Shine"); + } + if (slave.clothes !== "restrictive latex") { + if (slave.markings === "beauty mark") + r += jsInclude("Art_Vector_Beauty_Mark"); + else if (slave.markings === "freckles") + r += jsInclude("Art_Vector_Freckles"); + else if (slave.markings === "heavily freckled") + r += jsInclude("Art_Vector_Freckles_Heavy"); + else if (slave.markings === "birthmark") + r += jsInclude("Art_Vector_Birthmark"); + else if (slave.minorInjury === "black eye") + r += jsInclude("Art_Vector_Black_Eye"); + } + /* FACIAL APPEARANCE */ + if (V.seeFaces === 1) { + if (slave.fuckdoll === 0 && slave.clothes !== "restrictive latex") { + switch (slave.race) { + case "southern european": + case "white": + if (slave.faceShape === "normal") { + r += jsInclude("Art_Vector_Eyes_TypeB"); + r += jsInclude("Art_Vector_Mouth_TypeA"); + r += jsInclude("Art_Vector_Nose_TypeA"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); + } else if (slave.faceShape === "masculine") { + r += jsInclude("Art_Vector_Eyes_TypeD"); + r += jsInclude("Art_Vector_Mouth_TypeF"); + r += jsInclude("Art_Vector_Nose_TypeF"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); + } else if (slave.faceShape === "androgynous") { + r += jsInclude("Art_Vector_Eyes_TypeE"); + r += jsInclude("Art_Vector_Mouth_TypeE"); + r += jsInclude("Art_Vector_Nose_TypeE"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); + } else if (slave.faceShape === "cute") { + r += jsInclude("Art_Vector_Eyes_TypeB"); + r += jsInclude("Art_Vector_Mouth_TypeB"); + r += jsInclude("Art_Vector_Nose_TypeD"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); + } else if (slave.faceShape === "sensual") { + r += jsInclude("Art_Vector_Eyes_TypeC"); + r += jsInclude("Art_Vector_Mouth_TypeC"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } else if (slave.faceShape === "exotic") { + r += jsInclude("Art_Vector_Eyes_TypeA"); + r += jsInclude("Art_Vector_Mouth_TypeC"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } + break; + case "asian": + case "malay": + case "pacific islander": + if (slave.faceShape === "normal") { + r += jsInclude("Art_Vector_Eyes_TypeA"); + r += jsInclude("Art_Vector_Mouth_TypeC"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeD_${eyebrowFullness}`); + } else if (slave.faceShape === "masculine") { + r += jsInclude("Art_Vector_Eyes_TypeD"); + r += jsInclude("Art_Vector_Mouth_TypeD"); + r += jsInclude("Art_Vector_Nose_TypeB"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } else if (slave.faceShape === "androgynous") { + r += jsInclude("Art_Vector_Eyes_TypeE"); + r += jsInclude("Art_Vector_Mouth_TypeE"); + r += jsInclude("Art_Vector_Nose_TypeA"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } else if (slave.faceShape === "cute") { + r += jsInclude("Art_Vector_Eyes_TypeC"); + r += jsInclude("Art_Vector_Mouth_TypeC"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); + } else if (slave.faceShape === "sensual") { + r += jsInclude("Art_Vector_Eyes_TypeA"); + r += jsInclude("Art_Vector_Mouth_TypeA"); + r += jsInclude("Art_Vector_Nose_TypeE"); + if (slave.eyebrowFullness === "pencil-thin") + r += jsInclude("Art_Vector_Eyebrow_TypeC_Pencilthin"); + else if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); + } else if (slave.faceShape === "exotic") { + r += jsInclude("Art_Vector_Eyes_TypeB"); + r += jsInclude("Art_Vector_Mouth_TypeC"); + r += jsInclude("Art_Vector_Nose_TypeF"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); + } + break; + case "amerindian": + case "latina": + if (slave.faceShape === "normal") { + r += jsInclude("Art_Vector_Eyes_TypeB"); + r += jsInclude("Art_Vector_Mouth_TypeE"); + r += jsInclude("Art_Vector_Nose_TypeD"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeB_${eyebrowFullness}`); + } else if (slave.faceShape === "masculine") { + r += jsInclude("Art_Vector_Eyes_TypeE"); + r += jsInclude("Art_Vector_Mouth_TypeD"); + r += jsInclude("Art_Vector_Nose_TypeF"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } else if (slave.faceShape === "androgynous") { + r += jsInclude("Art_Vector_Eyes_TypeA"); + r += jsInclude("Art_Vector_Mouth_TypeD"); + r += jsInclude("Art_Vector_Nose_TypeB"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeD_${eyebrowFullness}`); + } else if (slave.faceShape === "cute") { + r += jsInclude("Art_Vector_Eyes_TypeF"); + r += jsInclude("Art_Vector_Mouth_TypeB"); + r += jsInclude("Art_Vector_Nose_TypeB"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); + } else if (slave.faceShape === "sensual") { + r += jsInclude("Art_Vector_Eyes_TypeB"); + r += jsInclude("Art_Vector_Mouth_TypeE"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); + } else if (slave.faceShape === "exotic") { + r += jsInclude("Art_Vector_Eyes_TypeC"); + r += jsInclude("Art_Vector_Mouth_TypeA"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); + } + break; + case "black": + if (slave.faceShape === "normal") { + r += jsInclude("Art_Vector_Eyes_TypeD"); + r += jsInclude("Art_Vector_Mouth_TypeB"); + r += jsInclude("Art_Vector_Nose_TypeF"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); + } else if (slave.faceShape === "masculine") { + r += jsInclude("Art_Vector_Eyes_TypeA"); + r += jsInclude("Art_Vector_Mouth_TypeD"); + r += jsInclude("Art_Vector_Nose_TypeF"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); + } else if (slave.faceShape === "androgynous") { + r += jsInclude("Art_Vector_Eyes_TypeF"); + r += jsInclude("Art_Vector_Mouth_TypeE"); + r += jsInclude("Art_Vector_Nose_TypeB"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); + } else if (slave.faceShape === "cute") { + r += jsInclude("Art_Vector_Eyes_TypeC"); + r += jsInclude("Art_Vector_Mouth_TypeE"); + r += jsInclude("Art_Vector_Nose_TypeD"); + if (slave.eyebrowFullness === "natural") + r += jsInclude("Art_Vector_Eyebrow_TypeB_Natural"); + else if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeD_${eyebrowFullness}`); + } else if (slave.faceShape === "sensual") { + r += jsInclude("Art_Vector_Eyes_TypeC"); + r += jsInclude("Art_Vector_Mouth_TypeF"); + r += jsInclude("Art_Vector_Nose_TypeA"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } else if (slave.faceShape === "exotic") { + r += jsInclude("Art_Vector_Eyes_TypeE"); + r += jsInclude("Art_Vector_Mouth_TypeE"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); + } + break; + case "middle eastern": + if (slave.faceShape === "normal") { + r += jsInclude("Art_Vector_Eyes_TypeB"); + r += jsInclude("Art_Vector_Mouth_TypeA"); + r += jsInclude("Art_Vector_Nose_TypeA"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); + } else if (slave.faceShape === "masculine") { + r += jsInclude("Art_Vector_Eyes_TypeD"); + r += jsInclude("Art_Vector_Mouth_TypeF"); + r += jsInclude("Art_Vector_Nose_TypeA"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeB_${eyebrowFullness}`); + } else if (slave.faceShape === "androgynous") { + r += jsInclude("Art_Vector_Eyes_TypeF"); + r += jsInclude("Art_Vector_Mouth_TypeB"); + r += jsInclude("Art_Vector_Nose_TypeF"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); + } else if (slave.faceShape === "cute") { + r += jsInclude("Art_Vector_Eyes_TypeB"); + r += jsInclude("Art_Vector_Mouth_TypeB"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); + } else if (slave.faceShape === "sensual") { + r += jsInclude("Art_Vector_Eyes_TypeA"); + r += jsInclude("Art_Vector_Mouth_TypeD"); + r += jsInclude("Art_Vector_Nose_TypeA"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } else if (slave.faceShape === "exotic") { + r += jsInclude("Art_Vector_Eyes_TypeE"); + r += jsInclude("Art_Vector_Mouth_TypeE"); + r += jsInclude("Art_Vector_Nose_TypeE"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); + } + break; + case "semitic": + if (slave.faceShape === "normal") { + r += jsInclude("Art_Vector_Eyes_TypeB"); + r += jsInclude("Art_Vector_Mouth_TypeA"); + r += jsInclude("Art_Vector_Nose_TypeA"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); + } else if (slave.faceShape === "masculine") { + r += jsInclude("Art_Vector_Eyes_TypeD"); + r += jsInclude("Art_Vector_Mouth_TypeF"); + r += jsInclude("Art_Vector_Nose_TypeA"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeB_${eyebrowFullness}`); + } else if (slave.faceShape === "androgynous") { + r += jsInclude("Art_Vector_Eyes_TypeF"); + r += jsInclude("Art_Vector_Mouth_TypeB"); + r += jsInclude("Art_Vector_Nose_TypeF"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); + } else if (slave.faceShape === "cute") { + r += jsInclude("Art_Vector_Eyes_TypeB"); + r += jsInclude("Art_Vector_Mouth_TypeB"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); + } else if (slave.faceShape === "sensual") { + r += jsInclude("Art_Vector_Eyes_TypeA"); + r += jsInclude("Art_Vector_Mouth_TypeD"); + r += jsInclude("Art_Vector_Nose_TypeA"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } else if (slave.faceShape === "exotic") { + r += jsInclude("Art_Vector_Eyes_TypeE"); + r += jsInclude("Art_Vector_Mouth_TypeE"); + r += jsInclude("Art_Vector_Nose_TypeE"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); + } + break; + case "indo-aryan": + if (slave.faceShape === "normal") { + r += jsInclude("Art_Vector_Eyes_TypeE"); + r += jsInclude("Art_Vector_Mouth_TypeA"); + r += jsInclude("Art_Vector_Nose_TypeD"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); + } else if (slave.faceShape === "masculine") { + r += jsInclude("Art_Vector_Eyes_TypeF"); + r += jsInclude("Art_Vector_Mouth_TypeD"); + r += jsInclude("Art_Vector_Nose_TypeE"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } else if (slave.faceShape === "androgynous") { + r += jsInclude("Art_Vector_Eyes_TypeC"); + r += jsInclude("Art_Vector_Mouth_TypeB"); + r += jsInclude("Art_Vector_Nose_TypeD"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); + } else if (slave.faceShape === "cute") { + r += jsInclude("Art_Vector_Eyes_TypeC"); + r += jsInclude("Art_Vector_Mouth_TypeD"); + r += jsInclude("Art_Vector_Nose_TypeA"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeD_${eyebrowFullness}`); + } else if (slave.faceShape === "sensual") { + r += jsInclude("Art_Vector_Eyes_TypeA"); + r += jsInclude("Art_Vector_Mouth_TypeE"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeD_${eyebrowFullness}`); + } else if (slave.faceShape === "exotic") { + r += jsInclude("Art_Vector_Eyes_TypeA"); + r += jsInclude("Art_Vector_Mouth_TypeC"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } + break; + case "mixed race": + if (slave.faceShape === "normal") { + r += jsInclude("Art_Vector_Eyes_TypeE"); + r += jsInclude("Art_Vector_Mouth_TypeA"); + r += jsInclude("Art_Vector_Nose_TypeD"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); + } else if (slave.faceShape === "masculine") { + r += jsInclude("Art_Vector_Eyes_TypeF"); + r += jsInclude("Art_Vector_Mouth_TypeD"); + r += jsInclude("Art_Vector_Nose_TypeE"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } else if (slave.faceShape === "androgynous") { + r += jsInclude("Art_Vector_Eyes_TypeC"); + r += jsInclude("Art_Vector_Mouth_TypeB"); + r += jsInclude("Art_Vector_Nose_TypeD"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); + } else if (slave.faceShape === "cute") { + r += jsInclude("Art_Vector_Eyes_TypeC"); + r += jsInclude("Art_Vector_Mouth_TypeD"); + r += jsInclude("Art_Vector_Nose_TypeA"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeD_${eyebrowFullness}`); + } else if (slave.faceShape === "sensual") { + r += jsInclude("Art_Vector_Eyes_TypeA"); + r += jsInclude("Art_Vector_Mouth_TypeE"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeD_${eyebrowFullness}`); + } else if (slave.faceShape === "exotic") { + r += jsInclude("Art_Vector_Eyes_TypeA"); + r += jsInclude("Art_Vector_Mouth_TypeC"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } + break; + default: + if (slave.faceShape === "normal") { + r += jsInclude("Art_Vector_Eyes_TypeB"); + r += jsInclude("Art_Vector_Mouth_TypeA"); + r += jsInclude("Art_Vector_Nose_TypeA"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); + } else if (slave.faceShape === "masculine") { + r += jsInclude("Art_Vector_Eyes_TypeD"); + r += jsInclude("Art_Vector_Mouth_TypeF"); + r += jsInclude("Art_Vector_Nose_TypeF"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeE_${eyebrowFullness}`); + } else if (slave.faceShape === "androgynous") { + r += jsInclude("Art_Vector_Eyes_TypeE"); + r += jsInclude("Art_Vector_Mouth_TypeE"); + r += jsInclude("Art_Vector_Nose_TypeE"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeF_${eyebrowFullness}`); + } else if (slave.faceShape === "cute") { + r += jsInclude("Art_Vector_Eyes_TypeB"); + r += jsInclude("Art_Vector_Mouth_TypeB"); + r += jsInclude("Art_Vector_Nose_TypeD"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeA_${eyebrowFullness}`); + } else if (slave.faceShape === "sensual") { + r += jsInclude("Art_Vector_Eyes_TypeC"); + r += jsInclude("Art_Vector_Mouth_TypeC"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } else if (slave.faceShape === "exotic") { + r += jsInclude("Art_Vector_Eyes_TypeA"); + r += jsInclude("Art_Vector_Mouth_TypeC"); + r += jsInclude("Art_Vector_Nose_TypeC"); + if (hasEyebrows === true) + r += jsInclude(`Art_Vector_Eyebrow_TypeC_${eyebrowFullness}`); + } + } + } + } + /* END FACIAL APPEARANCE */ + + if (slave.eyebrowPiercing === 1) + r += jsInclude("Art_Vector_Eyebrow_Light"); + else if (slave.eyebrowPiercing === 2) + r += jsInclude("Art_Vector_Eyebrow_Heavy"); + + if (slave.nosePiercing === 1) + r += jsInclude("Art_Vector_Nose_Light"); + else if (slave.nosePiercing === 2) + r += jsInclude("Art_Vector_Nose_Heavy"); + + if (slave.lipsPiercing === 1) + r += jsInclude("Art_Vector_Lip_Light"); + else if (slave.lipsPiercing === 2) + r += jsInclude("Art_Vector_Lip_Heavy"); + + /* ADDONS */ + if (slave.fuckdoll === 0) { /* fuckdolls cannot be decorated */ + if (slave.collar === "dildo gag") + r += jsInclude("Art_Vector_Dildo_Gag"); + else if (slave.collar === "ball gag") + r += jsInclude("Art_Vector_Ball_Gag"); + else if (slave.collar === "bit gag") + r += jsInclude("Art_Vector_Bit_Gag"); + else if (slave.collar === "massive dildo gag") + r += jsInclude("Art_Vector_Massive_Dildo_Gag"); + else if (slave.collar === "porcelain mask") + r += jsInclude("Art_Vector_Porcelain_Mask"); + + if (slave.eyewear === "corrective glasses" || slave.eyewear === "glasses" || slave.eyewear === "blurring glasses") + r += jsInclude("Art_Vector_Glasses"); + + /* head clothing */ + switch (slave.clothes) { + case "a biyelgee costume": + case "a bunny outfit": + case "a burkini": + case "a burqa": + case "a chattel habit": + case "a cybersuit": + case "a fallen nuns habit": + case "a hijab and abaya": + case "a hijab and blouse": + case "a klan robe": + case "a military uniform": + case "a mounty outfit": + case "a niqab and abaya": + case "a penitent nuns habit": + case "a police uniform": + case "a red army uniform": + case "a slutty klan robe": + case "a slutty nurse outfit": + case "a succubus outfit": + case "battlearmor": + case "harem gauze": + case "Western clothing": + r += jsInclude(`Art_Vector_Head_Outfit_${clothing2artSuffix(slave.clothes)}`); + break; + case "a schutzstaffel uniform": + case "a slutty schutzstaffel uniform": + r += jsInclude("Art_Vector_Head_Outfit_SchutzstaffelUniform"); + break; + case "kitty lingerie": + r += jsInclude("Art_Vector_Cat_Ear_Fore"); + r += jsInclude("Art_Vector_Cat_Ear_Back"); + } + } + } + + function ArtVectorLeg() { + /* Selection of matching SVG based on amputee level */ + if (slave.amp === 0) { + r += jsInclude(`Art_Vector_Leg_${legSize}`); + if (slave.muscles >= 97) + r += jsInclude(`Art_Vector_Leg_${legSize}_MHeavy`); + else if (slave.muscles >= 62) + r += jsInclude(`Art_Vector_Leg_${legSize}_MMedium`); + else if (slave.muscles >= 30) + r += jsInclude(`Art_Vector_Leg_${legSize}_MLight`); + } else if (slave.amp === 1) { + r += jsInclude("Art_Vector_Stump"); + } else if (slave.PLimb === 1 || slave.PLimb === 2) { /* slave is an amputee and has PLimbs equipped */ + if (slave.amp === -1) + r += jsInclude(`Art_Vector_Leg_ProstheticBasic_${legSize}`); + else if (slave.amp === -2) + r += jsInclude(`Art_Vector_Leg_ProstheticSexy_${legSize}`); + else if (slave.amp === -3) + r += jsInclude(`Art_Vector_Leg_ProstheticBeauty_${legSize}`); + else if (slave.amp === -4) + r += jsInclude(`Art_Vector_Leg_ProstheticCombat_${legSize}`); + else /* slave.amp === -5 */ + r += jsInclude(`Art_Vector_Leg_ProstheticSwiss_${legSize}`); + } + } + + function ArtVectorPubicHair() { + if (slave.fuckdoll !== 0 || slave.clothes !== "a latex catsuit") { + if (V.showBodyMods === 1 && slave.vaginaTat === "rude words") { + if (slave.dick !== 0) + T.art_pussy_tattoo_text = "Useless"; + else + T.art_pussy_tattoo_text = "Fucktoy"; + r += jsInclude("Art_Vector_Pussy_Tattoo"); + } + if (slave.physicalAge < 11) { + /* these art files exist, but draw empty svg's. Commented out for now to save on rendering time + r += jsInclude("Art_Vector_Pubic_Hair_None"); + r += jsInclude("Art_Vector_Pubic_Hair_Underarm_None"); + */ + } else if (slave.physicalAge <= 13) { + if (slave.pubicHStyle !== "waxed") + r += jsInclude("Art_Vector_Pubic_Hair_Wispy"); + } else if (slave.clothes !== "a comfortable bodysuit") { + switch (slave.pubicHStyle) { + case "bald": + case "hairless": + case "waxed": + /* commented out to save on rendering time + r += jsInclude("Art_Vector_Pubic_Hair_None"); + */ + break; + case "strip": + case "in a strip": + if (torsoSize === "Obese" || torsoSize === "Fat") + r += jsInclude("Art_Vector_Pubic_Hair_StripFat"); + else + r += jsInclude("Art_Vector_Pubic_Hair_Strip"); + break; + case "neat": + if (torsoSize === "Obese" || torsoSize === "Fat") + r += jsInclude("Art_Vector_Pubic_Hair_NeatFat"); + else + r += jsInclude("Art_Vector_Pubic_Hair_Neat"); + break; + case "bushy in the front and neat in the rear": + if (torsoSize === "Obese" || torsoSize === "Fat") + r += jsInclude("Art_Vector_Pubic_Hair_BushFat"); + else + r += jsInclude("Art_Vector_Pubic_Hair_Bush"); + break; + case "bushy": + if (torsoSize === "Obese" || torsoSize === "Fat") + r += jsInclude("Art_Vector_Pubic_Hair_BushyFat"); + else + r += jsInclude("Art_Vector_Pubic_Hair_Bushy"); + break; + case "very bushy": + if (torsoSize === "Obese" || torsoSize === "Fat") + r += jsInclude("Art_Vector_Pubic_Hair_Very_BushyFat"); + else + r += jsInclude("Art_Vector_Pubic_Hair_Very_Bushy"); + } + switch (slave.underArmHStyle) { + case "hairless": + case "waxed": + case "bald": + /* commented out to save on rendering time + r += jsInclude("Art_Vector_Pubic_Hair_Underarm_None"); + */ + break; + case "shaved": + r += jsInclude("Art_Vector_Pubic_Hair_Underarm_Shaved"); + break; + case "neat": + r += jsInclude("Art_Vector_Pubic_Hair_Underarm_Neat"); + break; + case "bushy": + r += jsInclude("Art_Vector_Pubic_Hair_Underarm_Bushy"); + } + } + } + } + + function ArtVectorPussy() { + if (slave.vagina >= 0 && slave.clothes !== "a latex catsuit" && slave.clothes !== "a comfortable bodysuit" && slave.clothes !== "a cybersuit") + r += jsInclude("Art_Vector_Pussy"); + } + + function ArtVectorPussyPiercings() { + switch (slave.clothes) {/* piercings display on these clothes */ + case "a bra": + case "a button-up shirt": + case "a chattel habit": + case "a comfortable bodysuit": + case "a cybersuit": + case "a fallen nuns habit": + case "a Fuckdoll suit": + case "a latex catsuit": + case "a monokini": + case "a nice pony outfit": + case "a penitent nuns habit": + case "a skimpy loincloth": + case "a slutty pony outfit": + case "a sports bra": + case "a string bikini": + case "a striped bra": + case "a succubus outfit": + case "a sweater": + case "a t-shirt": + case "a t-shirt and panties": + case "a t-shirt and thong": + case "a tank-top": + case "a tube top": + case "an oversized t-shirt": + case "attractive lingerie": + case "body oil": + case "chains": + case "choosing her own clothes": + case "no clothing": + case "restrictive latex": + case "shibari ropes": + case "slutty jewelry": + case "sport shorts": + case "sport shorts and a sports bra": + case "sport shorts and a t-shirt": + case "uncomfortable straps": + case "Western clothing": + /* piercinglevel = 1, Light; piercinglevel = 2, Heavy; piercinglevel = 3, Smart; piercinglevel = 0, None */ + if (slave.vaginaPiercing === 1) + r += jsInclude("Art_Vector_Pussy_Piercing"); + else if (slave.vaginaPiercing === 2) + r += jsInclude("Art_Vector_Pussy_Piercing_Heavy"); + + if (slave.clitPiercing === 1) + r += jsInclude("Art_Vector_Clit_Piercing"); + else if (slave.clitPiercing === 2) + r += jsInclude("Art_Vector_Clit_Piercing_Heavy"); + else if (slave.clitPiercing === 3) + r += jsInclude("Art_Vector_Clit_Piercing_Smart"); + } + } + + function ArtVectorTorso() { + r += jsInclude(`Art_Vector_Torso_${torsoSize}`); + if (slave.muscles >= 97) + r += jsInclude(`Art_Vector_Torso_${torsoSize}_MHeavy`); + else if (slave.muscles >= 62) + r += jsInclude(`Art_Vector_Torso_${torsoSize}_MMedium`); + else if (slave.muscles >= 30) + r += jsInclude(`Art_Vector_Torso_${torsoSize}_MLight`); + } + + function ArtVectorTorsoOutfit() { + /* TODO: latex catsuit should cover vagina and its piercings, too */ + switch (slave.clothes) { + case "a Fuckdoll suit": + case "a latex catsuit": + case "a nice pony outfit": + case "a slutty pony outfit": + case "choosing her own clothes": + case "no clothing": + break; /* no torso outfit */ + /* manually handle special cases */ + case "a cybersuit": + r += jsInclude(`Art_Vector_Torso_Outfit_Latex_${torsoSize}`); + break; + case "a slutty schutzstaffel uniform": + r += jsInclude(`Art_Vector_Torso_Outfit_SchutzstaffelUniform_${torsoSize}`); + break; + case "a niqab and abaya": + case "a burqa": + r += jsInclude(`Art_Vector_Torso_Outfit_HijabAndAbaya_${torsoSize}`); + break; + default: + r += jsInclude(`Art_Vector_Torso_Outfit_${clothing2artSuffix(slave.clothes)}_${torsoSize}`); + } + if (V.seeVectorArtHighlights === 1) { + if (slave.fuckdoll !== 0 || slave.clothes === "restrictive latex" || slave.clothes === "a latex catsuit") { + if (slave.amp !== 0) + r += jsInclude("Art_Vector_Torso_Outfit_Shine_Shoulder"); + if (slave.preg <= 0) + r += jsInclude(`Art_Vector_Torso_Outfit_Shine_${torsoSize}`); + } + } + } + + return VectorArt; +})();