diff --git a/devNotes/twine JS.txt b/devNotes/twine JS.txt index 5f11b45370b0ec796f4801a526156153424a359e..57bcbcad9a436611108feba55b1796a09364ad59 100644 --- a/devNotes/twine JS.txt +++ b/devNotes/twine JS.txt @@ -11475,86 +11475,6 @@ window.getHeroSlave = function(heroSlave, baseHeroSlave) { return newSlave; } -/*:: Art Color Tools JS [script]*/ - -/* -This takes a textual hair colour description and tries to guess the appropriate HTML compliant color code. - -hColor should be a color name, but can also be a string describing hair colour. - -This code's working is described to the user in the Encyclopedia, chapter "Lore", section "Dyes". -*/ -window.extractHairColor = function(hColor) { - /* - these are color names known and used in FreeCities - attributed color names are at the front of the array - */ - var FCname2HTMLarray = [ - ["blazing red", "#E00E2B"], - ["neon green", "#25d12b"], - ["neon blue", "#2284C3"], - ["neon pink", "#cc26aa"], - ["strawberry-blonde", "#e5a88c"], - ["platinum blonde", "#fcf3c1"], - ["dark brown", "#463325"], - ["brown", "#8D4F21"], - ["auburn", "#7e543e"], - ["black", "#3F4040"], - ["blonde", "#F4F1A3"], - ["blue", "#4685C5"], - ["burgundy", "#5f3946"], - ["chestnut", "#663622"], - ["chocolate", "#6e4937"], - ["copper", "#a16145"], - ["ginger", "#da822d"], - ["golden", "#ffdf31"], - ["green", "#5FBA46"], - ["grey", "#9e9fa4"], - ["hazel", "#8d6f1f"], - ["pink", "#D18CBC"], - ["red", "#BB2027"], - ["deep red", "#6D1318"], - ["blue-violet", "#8790B7"], - ["silver", "#cdc9c6"], - ["light olive", "#d4c6bb"], - ["dark", "#a46237"], - /* these are not actually FreeCities canon, but like to appear in custom descriptions */ - ["dark", "#463325"], - ["brunette", "#8D4F21"] - ]; - - /* these are HTML color names supported by most browsers */ - var HTMLstandardColors = ["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred ","indigo ","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"]; - - var FCnames = new Map(FCname2HTMLarray); - hColor = hColor.toLowerCase(); /* normalization: lowercase color name */ - var colorCode = FCnames.get(hColor); /* look up in FreeCities color names */ - if (!colorCode) { /* not a FreeCities color name*/ - if (HTMLstandardColors.includes(hColor) || hColor.match(/^#([0-9a-f]{3}){1,2}$/) !== null) { - colorCode = hColor; /* is a HTML color name or value, use it directly */ - } else { - /* - is not even a HTML color name. hColor probably is a description. - look for anything resembling a valid color name within the description. - */ - var hColorNoSpaces = hColor.replace(/\s+/g, ''); /* remove all spaces from description */ - var FCkeys = Array.from(FCnames.keys()); - var colorCodes = [ - FCnames.get(FCkeys.find(function (e){return hColor.startsWith(e);})), - HTMLstandardColors.find(function (e){return hColorNoSpaces.startsWith(e);}), - FCnames.get(FCkeys.find(function (e){return hColor.includes(e);})), - HTMLstandardColors.find(function (e){return hColorNoSpaces.includes(e);}) - ]; - colorCode = colorCodes.find(function (e){return e;}); /* picks the first successful guess */ - } - } - if (!colorCode) { - console.log("Art Color Tools JS: Unable to determine HTML compliant color code for hair color string '"+hColor+"'."); - colorCode = "fuchsia"; /* use fuchsia as error marker */ - } - return colorCode; -}; - /*SFJS [script]*/ window.simpleWorldEconomyCheck = function() { @@ -23274,3 +23194,95 @@ window.ArtControlRendered = function ArtControlRendered(slave, sizePlacement) { } return r; }; + +/* +This takes a textual hair colour description and tries to guess the appropriate HTML compliant color code. + +hColor should be a color name, but can also be a string describing hair colour. + +This code's working is described to the user in the Encyclopedia, chapter "Lore", section "Dyes". +*/ +window.extractHairColor = function(hColor) { + /* + these are color names known and used in FreeCities + attributed color names are at the front of the array + */ + var FCname2HTMLarray = [ + ["blazing red", "#E00E2B"], + ["neon green", "#25d12b"], + ["neon blue", "#2284C3"], + ["neon pink", "#cc26aa"], + ["strawberry-blonde", "#e5a88c"], + ["platinum blonde", "#fcf3c1"], + ["dark brown", "#463325"], + ["brown", "#8D4F21"], + ["auburn", "#7e543e"], + ["black", "#3F4040"], + ["blonde", "#F4F1A3"], + ["blue", "#4685C5"], + ["burgundy", "#5f3946"], + ["chestnut", "#663622"], + ["chocolate", "#6e4937"], + ["copper", "#a16145"], + ["ginger", "#da822d"], + ["golden", "#ffdf31"], + ["green", "#5FBA46"], + ["grey", "#9e9fa4"], + ["hazel", "#8d6f1f"], + ["pink", "#D18CBC"], + ["red", "#BB2027"], + ["deep red", "#6D1318"], + ["blue-violet", "#8790B7"], + ["silver", "#cdc9c6"], + ["light olive", "#d4c6bb"], + ["dark", "#a46237"], + /* these are not actually FreeCities canon, but like to appear in custom descriptions */ + ["dark", "#463325"], + ["brunette", "#8D4F21"] + ]; + + /* these are HTML color names supported by most browsers */ + var HTMLstandardColors = ["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred ","indigo ","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"]; + + var FCnames = new Map(FCname2HTMLarray); + hColor = hColor.toLowerCase(); /* normalization: lowercase color name */ + var colorCode = FCnames.get(hColor); /* look up in FreeCities color names */ + if (!colorCode) { /* not a FreeCities color name*/ + if (HTMLstandardColors.includes(hColor) || hColor.match(/^#([0-9a-f]{3}){1,2}$/) !== null) { + colorCode = hColor; /* is a HTML color name or value, use it directly */ + } else { + /* + is not even a HTML color name. hColor probably is a description. + look for anything resembling a valid color name within the description. + */ + var hColorNoSpaces = hColor.replace(/\s+/g, ''); /* remove all spaces from description */ + var FCkeys = Array.from(FCnames.keys()); + var colorCodes = [ + FCnames.get(FCkeys.find(function (e){return hColor.startsWith(e);})), + HTMLstandardColors.find(function (e){return hColorNoSpaces.startsWith(e);}), + FCnames.get(FCkeys.find(function (e){return hColor.includes(e);})), + HTMLstandardColors.find(function (e){return hColorNoSpaces.includes(e);}) + ]; + colorCode = colorCodes.find(function (e){return e;}); /* picks the first successful guess */ + } + } + if (!colorCode) { + console.log("Art Color Tools JS: Unable to determine HTML compliant color code for hair color string '"+hColor+"'."); + colorCode = "fuchsia"; /* use fuchsia as error marker */ + } + return colorCode; +}; + +window.clothing2artSuffix = function(v) { + if (v == "restrictive latex") { v = "latex"; } /* universal "special case": latex art is actually "restrictive latex" TODO: align name in vector source */ + return v.replace(/^a[n]? /,"") /* remove "a" and "an" from the beginning*/ + .replace(/ ?(outfit|clothing) ?/,"") /* remove "outfit" and "clothing" (redundant) */ + .replace(/ and .+/,"") /* remove concatenated descriptions */ + .replace(/\w\S*/g, + function(txt){ + return txt.charAt(0).toUpperCase() + + txt.substr(1).toLowerCase(); + } + ) /* CamelCase by whitespace */ + .replace(/\W/g,""); /* remove remaining whitespace */ +}; diff --git a/src/js/artColorToolsJS.tw b/src/art/artJS.tw similarity index 53% rename from src/js/artColorToolsJS.tw rename to src/art/artJS.tw index b2aab8762c848360ee09c0dd900e547a18090514..a9df7d82269f95cdbad2102220c822de1da56a5d 100644 --- a/src/js/artColorToolsJS.tw +++ b/src/art/artJS.tw @@ -1,4 +1,118 @@ -:: Art Color Tools JS [script] +:: Art JS [script] + +/* +Displays assistant images. Currently passage-based. +sizePlacement: Image size/center. + 3: Large, right. Example: description. + 2: Medium, right. Example: random events. +*/ +window.AssistantArtRendered = function AssistantArtRendered(sizePlacement) { + const V = State.variables; + let fileName = ""; + + if (V.imageChoice === 0) { + switch (V.assistantAppearance) { + case "monstergirl": + fileName = "'resources/renders/assistant monstergirl.png'";; + break; + case "shemale": + fileName = "'resources/renders/assistant shemale.png'"; + break; + case "amazon": + fileName = "'resources/renders/assistant amazon.png'"; + break; + case "businesswoman": + fileName = "'resources/renders/assistant businesswoman.png'"; + break; + case "goddess": + fileName = "'resources/renders/assistant goddess.png'"; + break; + case "schoolgirl": + fileName = "'resources/renders/assistant schoolgirl.png'"; + break; + default: + fileName = "'resources/renders/assistant default.png'"; + } + if (sizePlacement === 3) { + fileName = `<img src=${fileName} style='float:right; border:3px hidden'/>`; + } else { + fileName = `<img src=${fileName} style='float:right; border:3px hidden' width='300' height='300'/>`; + } + } + return fileName; +}; + +window.ArtControlRendered = function ArtControlRendered(slave, sizePlacement) { + const V = State.variables; + let fileName = ""; + let r = ""; + + if (slave.vagina > -1) { + if (slave.dick > 0) { + if (slave.balls > 0) { + fileName = "futanari"; + } else { + fileName = "herm"; + } + } else { + fileName = "female"; + } + } else { + if (slave.balls > 0) { + fileName = "shemale"; + } else { + fileName = "gelding"; + } + } + if (slave.belly > 1500) { + fileName = `preg ${fileName}`; + } + if (slave.boobs < 400) { + fileName = `${fileName} small`; + } else if (slave.boobs < 800) { + fileName = `${fileName} big`; + } else if (slave.boobs < 6000) { + fileName = `${fileName} huge`; + } else { + fileName = `${fileName} hyper`; + } + if (slave.muscles > 30) { + fileName = `${fileName} muscle`; + } else { + fileName = `${fileName} soft`; + } + if (slave.fuckdoll > 0) { + fileName = `${fileName} rebellious`; + } else if (slave.devotion <= 20) { + if (slave.trust < -20) { + fileName = `${fileName} reluctant`; + } else { + fileName = `${fileName} rebellious`; + } + } else if (slave.fetish === "mindbroken") { + fileName = `${fileName} reluctant`; + } else if (slave.devotion <= 50 || slave.fetishKnown !== 1 || V.seeMainFetishes === 0 && sizePlacement < 2) { + fileName = `${fileName} obedient`; + } else { + if (slave.fetish === "none") { + fileName = `${fileName} obedient`; + } else { + fileName = `${fileName} ${slave.fetish}`; + } + } + + fileName = `'resources/renders/${fileName}.png'`; + if (sizePlacement === 3) { + r = `<img src=${fileName} style='float:right; border:3px hidden'>`; + } else if (sizePlacement === 2) { + r = `<img src=${fileName} style='float:right; border:3px hidden' width='300' height='300'>`; + } else if (sizePlacement === 1) { + r = `<img src=${fileName} style='float:left; border:3px hidden' width='150' height='150'>`; + } else { + r = `<img src=${fileName} style='float:left; border:3px hidden' width='120' height='120'>`; + } + return r; +}; /* This takes a textual hair colour description and tries to guess the appropriate HTML compliant color code. @@ -77,3 +191,17 @@ window.extractHairColor = function(hColor) { } return colorCode; }; + +window.clothing2artSuffix = function(v) { + if (v == "restrictive latex") { v = "latex"; } /* universal "special case": latex art is actually "restrictive latex" TODO: align name in vector source */ + return v.replace(/^a[n]? /,"") /* remove "a" and "an" from the beginning*/ + .replace(/ ?(outfit|clothing) ?/,"") /* remove "outfit" and "clothing" (redundant) */ + .replace(/ and .+/,"") /* remove concatenated descriptions */ + .replace(/\w\S*/g, + function(txt){ + return txt.charAt(0).toUpperCase() + + txt.substr(1).toLowerCase(); + } + ) /* CamelCase by whitespace */ + .replace(/\W/g,""); /* remove remaining whitespace */ +}; diff --git a/src/art/vector/Helper_Functions.tw b/src/art/vector/Helper_Functions.tw deleted file mode 100644 index b19ee1383b514228dc1fe56f0c9bf8875399e971..0000000000000000000000000000000000000000 --- a/src/art/vector/Helper_Functions.tw +++ /dev/null @@ -1,15 +0,0 @@ -:: Art_Vector_Helper_Functions_ [script] - -window.clothing2artSuffix = function(v) { - if (v == "restrictive latex") { v = "latex"; } /* universal "special case": latex art is actually "restrictive latex" TODO: align name in vector source */ - return v.replace(/^a[n]? /,"") /* remove "a" and "an" from the beginning*/ - .replace(/ ?(outfit|clothing) ?/,"") /* remove "outfit" and "clothing" (redundant) */ - .replace(/ and .+/,"") /* remove concatenated descriptions */ - .replace(/\w\S*/g, - function(txt){ - return txt.charAt(0).toUpperCase() + - txt.substr(1).toLowerCase(); - } - ) /* CamelCase by whitespace */ - .replace(/\W/g,""); /* remove remaining whitespace */ -} diff --git a/src/js/vectorRevampedArtControlJS.tw b/src/art/vector_revamp/vectorRevampedArtControlJS.tw similarity index 100% rename from src/js/vectorRevampedArtControlJS.tw rename to src/art/vector_revamp/vectorRevampedArtControlJS.tw diff --git a/src/js/artJS.tw b/src/js/artJS.tw deleted file mode 100644 index 3405c98d0c18b2451b836d861e590780b38c988a..0000000000000000000000000000000000000000 --- a/src/js/artJS.tw +++ /dev/null @@ -1,115 +0,0 @@ -:: Art JS [script] - -/* -Displays assistant images. Currently passage-based. -sizePlacement: Image size/center. - 3: Large, right. Example: description. - 2: Medium, right. Example: random events. -*/ -window.AssistantArtRendered = function AssistantArtRendered(sizePlacement) { - const V = State.variables; - let fileName = ""; - - if (V.imageChoice === 0) { - switch (V.assistantAppearance) { - case "monstergirl": - fileName = "'resources/renders/assistant monstergirl.png'";; - break; - case "shemale": - fileName = "'resources/renders/assistant shemale.png'"; - break; - case "amazon": - fileName = "'resources/renders/assistant amazon.png'"; - break; - case "businesswoman": - fileName = "'resources/renders/assistant businesswoman.png'"; - break; - case "goddess": - fileName = "'resources/renders/assistant goddess.png'"; - break; - case "schoolgirl": - fileName = "'resources/renders/assistant schoolgirl.png'"; - break; - default: - fileName = "'resources/renders/assistant default.png'"; - } - if (sizePlacement === 3) { - fileName = `<img src=${fileName} style='float:right; border:3px hidden'/>`; - } else { - fileName = `<img src=${fileName} style='float:right; border:3px hidden' width='300' height='300'/>`; - } - } - return fileName; -}; - -window.ArtControlRendered = function ArtControlRendered(slave, sizePlacement) { - const V = State.variables; - let fileName = ""; - let r = ""; - - if (slave.vagina > -1) { - if (slave.dick > 0) { - if (slave.balls > 0) { - fileName = "futanari"; - } else { - fileName = "herm"; - } - } else { - fileName = "female"; - } - } else { - if (slave.balls > 0) { - fileName = "shemale"; - } else { - fileName = "gelding"; - } - } - if (slave.belly > 1500) { - fileName = `preg ${fileName}`; - } - if (slave.boobs < 400) { - fileName = `${fileName} small`; - } else if (slave.boobs < 800) { - fileName = `${fileName} big`; - } else if (slave.boobs < 6000) { - fileName = `${fileName} huge`; - } else { - fileName = `${fileName} hyper`; - } - if (slave.muscles > 30) { - fileName = `${fileName} muscle`; - } else { - fileName = `${fileName} soft`; - } - if (slave.fuckdoll > 0) { - fileName = `${fileName} rebellious`; - } else if (slave.devotion <= 20) { - if (slave.trust < -20) { - fileName = `${fileName} reluctant`; - } else { - fileName = `${fileName} rebellious`; - } - } else if (slave.fetish === "mindbroken") { - fileName = `${fileName} reluctant`; - } else if (slave.devotion <= 50 || slave.fetishKnown !== 1 || V.seeMainFetishes === 0 && sizePlacement < 2) { - fileName = `${fileName} obedient`; - } else { - if (slave.fetish === "none") { - fileName = `${fileName} obedient`; - } else { - fileName = `${fileName} ${slave.fetish}`; - } - } - - fileName = `'resources/renders/${fileName}.png'`; - if (sizePlacement === 3) { - r = `<img src=${fileName} style='float:right; border:3px hidden'>`; - } else if (sizePlacement === 2) { - r = `<img src=${fileName} style='float:right; border:3px hidden' width='300' height='300'>`; - } else if (sizePlacement === 1) { - r = `<img src=${fileName} style='float:left; border:3px hidden' width='150' height='150'>`; - } else { - r = `<img src=${fileName} style='float:left; border:3px hidden' width='120' height='120'>`; - } - return r; -};