diff --git a/src/art/artJS.tw b/src/art/artJS.tw index cc074d0bfbeea4af91b90c1ef3df4365d50c647b..102da9ccb014acdc7c4b662699b67bfe60cd2eaa 100644 --- a/src/art/artJS.tw +++ b/src/art/artJS.tw @@ -2056,6 +2056,102 @@ window.ArtVectorBelly = function(slave) { return r; }; +window.ArtVectorBoob = function(slave) { + const T = State.temporary; + let r = ""; + let artScaleFactor, artTranslationX, artTranslationY; + + /* + 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) { + artScaleFactor = 1; + artTranslationX = 22; /* a little shift to the right is needed due to perspective */ + artTranslationY = 0; + } else { + artScaleFactor = 0.383433 * Math.log(0.0452403 * slave.boobs); + artTranslationX = -282.841 * artScaleFactor + 292.349; + artTranslationY = -225.438 * artScaleFactor + 216.274; + } + T.art_transform = `matrix(${artScaleFactor},0,0,${artScaleFactor},${artTranslationX},${artTranslationY})`; + T.art_boob_transform = T.art_transform; /* used in Boob_Addons.tw */ + T.art_scale_factor = artScaleFactor; /* used in Penis.tw */ + + 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 (State.variables.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 "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"); + } + return r; +}; + window.ArtVectorBoobAddons = function(slave) { let r = ""; diff --git a/src/art/vector/Boob.tw b/src/art/vector/Boob.tw index 7d12da83858f2119ce12abf35ba47ef9789a8b38..0331b94404d88ecb1e031aead288dda3156d82e2 100644 --- a/src/art/vector/Boob.tw +++ b/src/art/vector/Boob.tw @@ -3,90 +3,7 @@ /* BEWARE: _art_have_boobs and _art_scale_factor interfere with Art_Vector_Penis_ */ <<set _art_have_boobs = true>> -/* BEWARE: _art_boob_transform is also read by Art_Vector_Boob_Addons_ */ - -/* -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 _artSlave.boobs < 300>> - <<set _art_scale_factor = 1 >> - <<set _art_translation_x = 22 >> /* a little shift to the right is needed due to perspective */ - <<set _art_translation_y = 0 >> -<<else>> - <<set _art_scale_factor = 0.383433*Math.log(0.0452403*_artSlave.boobs) >> - <<set _art_translation_x = -282.841*_art_scale_factor+292.349 >> - <<set _art_translation_y = -225.438*_art_scale_factor+216.274 >> -<</if>> -/* -_art_boob_transform is for internal program usage. -_art_transform will affect the display. -*/ -<<set _art_boob_transform = "matrix(" + _art_scale_factor +",0,0," + _art_scale_factor + "," + _art_translation_x + "," + _art_translation_y + ")">> -<<set _art_transform = _art_boob_transform>> - -<<if _artSlave.boobs < 300 >> - /* BEWARE: this threshold may be used in other art-related code, too */ - /* boobs too small - draw areolae directly onto torso */ -<<else>> - <<include Art_Vector_Boob_Alt>> - /* shiny clothing */ - <<if $seeVectorArtHighlights == 1>> - <<if _artSlave.fuckdoll != 0 || _artSlave.clothes == "a latex catsuit" || _artSlave.clothes == "body oil">> - <<include Art_Vector_Boob_Outfit_Shine>> - <</if>> - <</if>> -<</if>> -<<if _artSlave.clothes != "a cheerleader outfit" && _artSlave.clothes != "a hijab and abaya" && _artSlave.clothes != "cutoffs and a t-shirt" && _artSlave.clothes != "a halter top dress" && _artSlave.clothes != "a mini dress" && _artSlave.clothes != "a leotard" && _artSlave.clothes != "a nice maid outfit" && _artSlave.clothes != "a slutty maid outfit" && _artSlave.clothes != "a military uniform" && _artSlave.clothes != "a nice nurse outfit" && _artSlave.clothes != "a schoolgirl outfit" && _artSlave.clothes != "a scalemail bikini" && _artSlave.clothes != "a slutty nurse outfit" && _artSlave.clothes != "a ball gown" && _artSlave.clothes != "battledress" && _artSlave.clothes != "spats and a tank top" && _artSlave.clothes != "nice business attire" && _artSlave.clothes != "slutty business attire" && _artSlave.clothes != "a bunny outfit" && _artSlave.clothes != "conservative clothing" && _artSlave.clothes != "a huipil" && _artSlave.clothes != "a kimono" && _artSlave.clothes != "a slave gown" && _artSlave.clothes != "stretch pants and a crop-top" && _artSlave.clothes != "a maternity dress" && _artSlave.clothes != "a slutty qipao" && _artSlave.clothes != "a slutty outfit" && _artSlave.clothes != "harem gauze" && _artSlave.clothes != "attractive lingerie" && _artSlave.clothes != "a penitent nuns habit" && _artSlave.clothes != "Western clothing" && _artSlave.clothes != "an apron" && _artSlave.clothes != "a schutzstaffel uniform" && _artSlave.clothes != "a slutty schutzstaffel uniform" && _artSlave.clothes != "a red army uniform" && _artSlave.clothes != "a long qipao" && _artSlave.clothes != "battlearmor" && _artSlave.clothes != "a mounty outfit" && _artSlave.clothes != "lederhosen" && _artSlave.clothes != "a dirndl" && _artSlave.clothes != "a biyelgee costume" && _artSlave.clothes != "a latex catsuit" && _artSlave.clothes != "a comfortable bodysuit" && _artSlave.clothes != "a cybersuit" && _artSlave.clothes != "a niqab and abaya" && _artSlave.clothes != "a burqa" && _artSlave.clothes != "a klan robe" && _artSlave.clothes != "a hijab and blouse" && _artSlave.clothes != "a burkini" && _artSlave.clothes != "panties and pasties" && _artSlave.clothes != "a bra" && _artSlave.clothes != "a slutty klan robe" && _artSlave.clothes != "striped underwear" && _artSlave.clothes != "a button-up shirt and panties" && _artSlave.clothes != "a striped bra" && _artSlave.clothes != "a t-shirt" && _artSlave.clothes != "a t-shirt and thong" && _artSlave.clothes != "a t-shirt and panties" && _artSlave.clothes != "sport shorts and a sports bra" && _artSlave.clothes != "sport shorts and a t-shirt" && _artSlave.clothes != "a sports bra" && _artSlave.clothes != "leather pants and pasties" && _artSlave.clothes != "leather pants and a tube top" && _artSlave.clothes != "a button-up shirt" && _artSlave.clothes != "a tube top and thong" && _artSlave.clothes != "a tube top" && _artSlave.clothes != "a tank-top" && _artSlave.clothes != "a tank-top and panties" && _artSlave.clothes != "a t-shirt and jeans" && _artSlave.clothes != "an oversized t-shirt" && _artSlave.clothes != "an oversized t-shirt and boyshorts" && _artSlave.clothes != "a sweater and cutoffs" && _artSlave.clothes != "a sweater and panties" && _artSlave.clothes != "a sweater" && _artSlave.clothes != "a police uniform" && _artSlave.clothes != "a one-piece swimsuit" && _artSlave.clothes != "a hanbok" && _artSlave.clothes != "a gothic lolita dress" && _artSlave.clothes != "kitty lingerie">> - <<if _artSlave.areolaeShape == "star">> - <<include Art_Vector_Boob_Areola_Star>> - <<elseif _artSlave.areolaeShape == "heart">> - <<include Art_Vector_Boob_Areola_Heart>> - <<elseif _artSlave.areolae == "0">> - <<include Art_Vector_Boob_Areola>> - <<elseif _artSlave.areolae == "2">> - <<include Art_Vector_Boob_Areola_Wide>> - <<elseif _artSlave.areolae == "1">> - <<include Art_Vector_Boob_Areola_Large>> - <<elseif _artSlave.areolae == "3">> - <<include Art_Vector_Boob_Areola_Huge>> - <</if>> - <<if _artSlave.nipples == "tiny">> - <<include Art_Vector_Boob_NippleTiny>> - <<elseif _artSlave.nipples == "cute">> - <<include Art_Vector_Boob_NippleCute>> - <<elseif _artSlave.nipples == "puffy">> - <<include Art_Vector_Boob_NipplePuffy>> - <<elseif _artSlave.nipples == "inverted">> - <<include Art_Vector_Boob_NippleInverted>> - <<elseif _artSlave.nipples == "huge">> - <<include Art_Vector_Boob_NippleHuge>> - <<elseif _artSlave.nipples == "partially inverted">> - <<include Art_Vector_Boob_NipplePartiallyInverted>> - <<elseif _artSlave.nipples == "fuckable">> - <<include Art_Vector_Boob_NippleFuckable>> - <</if>> -<</if>> - -/* -<<switch _artSlave.areolaStyle>> - <<case "normal">> - <<include Art_Vector_Boob_Areola>> - <<case "unusually wide">> - <<include Art_Vector_Boob_Areola_Wide>> - <<case "large">> - <<include Art_Vector_Boob_Areola_Large>> - <<case "huge">> - <<include Art_Vector_Boob_Areola_Huge>> - <<case "star shaped">> - <<include Art_Vector_Boob_Areola_Star>> - <<case "heart shaped">> - <<include Art_Vector_Boob_Areola_Heart>> -<</switch>> */ +<<= ArtVectorBoob(_artSlave)>> /* set _art_transform to empty string so stray SVG groups in other passages are not affected */ <<set _art_transform = "">>