2022-11-02 16:24:07 -04:00
propProperty = "element" ;
2022-09-14 14:37:03 -04:00
propValue = "sand" ;
propType = "string" ;
2022-09-30 12:29:16 -04:00
numberAdjusterProperty = "temp" ;
numberAdjusterValue = 1 ;
numberAdjusterMode = "add" ;
numberAdjusterVerb = "adding" ;
2022-09-14 14:37:03 -04:00
stringSynonyms = [ "string" , "str" , "st" , "s" ] ;
numberSynonyms = [ "number" , "num" , "nm" , "nu" , "nb" , "integer" , "int" , "i" , "it" , "float" ,
"flt" , "ft" , "fl" , "f" , "wholenumber" , "decimalnumber" , "wn" , "dn" , "w" ,
"d" , "deeznuts" ] ; / * T h e p u r p o s e o f t h e s e b l a t a n t l i e s i s , t h r o u g h a
reference to the Alice series of software , have an excuse to include deez
nuts . * /
objectSynonyms = [ "object" , "oj" , "obj" , "ob" , "o" , "json" ] ;
booleanSynonyms = [ "boolean" , "bool" , "boole" , "boo" , "bo" , "bl" , "b" ] ;
2022-11-02 16:20:58 -04:00
defaultStringTypeValues = [ "element" , "color" , "clone" , "changeTo" , "void" , "type" ] ;
defaultNumberTypeValues = [ "x" , "y" , "temp" , "start" , "vx" , "vy" , "chargeCD" , "start" , "burnStart" , "dir" , "panic" , "r" , "frequency" , "length" , "delay" , "volume" , "debounce" , "debounceLength" ] ;
defaultBooleanTypeValues = [ "burning" , "charge" , "dead" , "hissing" , "following" , "dirLocked" , "del" , "didChargeBlueTinted" ] ;
2022-09-14 14:37:03 -04:00
2022-11-02 16:20:58 -04:00
synonymsOfTrue = [ "true" , "t" , "1" , "yes" ] ;
synonymsOfFalse = [ "false" , "f" , "0" , "no" ] ;
2022-09-14 14:37:03 -04:00
colorInvalidError = "Color must be in the form \"rgb(red,green,blue)\" or \"hsl(hue,saturation%,lightness%)\" (without quotes)!" ;
function rgbStringToUnvalidatedObject ( string ) {
string = string . split ( "," ) ;
var red = parseFloat ( string [ 0 ] . substring ( 4 ) ) ;
var green = parseFloat ( string [ 1 ] ) ;
var blue = parseFloat ( string [ 2 ] . slice ( 0 , - 1 ) ) ;
return { r : red , g : green , b : blue } ;
} ;
function hslStringToUnvalidatedObject ( string ) {
string = string . split ( "," ) ;
var hue = parseFloat ( string [ 0 ] . substring ( 4 ) ) ;
var saturation = parseFloat ( string [ 1 ] . slice ( 0 , - 1 ) ) ;
var lightness = parseFloat ( string [ 2 ] . slice ( 0 , - 2 ) ) ;
return { h : hue , s : saturation , l : lightness } ;
} ;
document . addEventListener ( "keydown" , function ( e ) { //prop prompt listener
// , = propPrompt()
if ( e . keyCode == 188 ) {
e . preventDefault ( ) ;
2022-09-30 12:29:16 -04:00
shiftDown ? numberAdjusterPrompt ( ) : propPrompt ( ) ;
2022-09-14 14:37:03 -04:00
} ;
} ) ;
function propPrompt ( ) {
propProperty = prompt ( "Enter the property you want to set" ) ;
propValue = prompt ( "Enter the value you want to set to" ) ;
//special check: element
if ( propProperty === "element" ) {
//empty string
if ( propValue === "" ) {
alert ( "No element was specified!" ) ;
return false ;
} ;
// replace spaces with underscores
propValue = propValue . replace ( / /g , "_" ) ;
var propValueS = mostSimilarElement ( propValue ) ;
if ( propValueS === null || propValueS === undefined ) {
alert ( "Element \"" + value + "\" not found! Defaulting to sand." ) ;
propValue = "sand" ;
} else {
propValue = propValueS ;
} ;
} ;
//special check: color
if ( propProperty === "color" ) {
//empty string
if ( propValue === "" ) {
alert ( "No color was specified!" ) ;
return false ;
} ;
var splitValue = propValue . split ( "," ) ;
if ( ! propValue . startsWith ( "rgb(" ) ) { //if not RGB
if ( propValue . startsWith ( "hsl(" ) ) { //if HSL
if ( ! ( splitValue [ 1 ] . endsWith ( '%' ) ) || ! ( splitValue [ 2 ] . endsWith ( '%)' ) ) ) { //if missing percent symbols
alert ( colorInvalidError ) ;
return false ;
} ;
} else { //if not RGB and not HSL
alert ( colorInvalidError ) ;
return false ;
} ;
} ;
if ( propValue . split ( "," ) . length !== 3 ) { //if too short or long
alert ( colorInvalidError ) ;
return false ;
}
if ( propValue . startsWith ( "rgb(" ) ) { //if RGB
var checkedColorObject = rgbStringToUnvalidatedObject ( propValue ) ; //RGB NaN checking
if ( isNaN ( checkedColorObject . r ) || isNaN ( checkedColorObject . g ) || isNaN ( checkedColorObject . b ) ) {
//console.log(checkedColorObject);
alert ( "One or more color values are invalid!" ) ;
return false ;
} ;
} else if ( propValue . startsWith ( "hsl(" ) ) { //if HSL
var checkedColorObject = hslStringToUnvalidatedObject ( propValue ) ; //HSL NaN checking
if ( isNaN ( checkedColorObject . h ) || isNaN ( checkedColorObject . s ) || isNaN ( checkedColorObject . l ) ) {
//console.log(checkedColorObject);
alert ( "One or more color values are invalid!" ) ;
return false ;
} ;
} else { //if neither
alert ( colorInvalidError ) ;
return false ;
} ;
} ;
//special check: x
if ( propProperty === "x" ) {
//empty string
if ( ! propValue . isInteger ) {
alert ( "X values must be integers!" ) ;
} ;
} ;
if ( defaultNumberTypeValues . includes ( propProperty . toLowerCase ( ) ) ) {
propType = "number" ;
} else if ( defaultBooleanTypeValues . includes ( propProperty . toLowerCase ( ) ) ) {
propType = "boolean" ;
} else if ( defaultStringTypeValues . includes ( propProperty . toLowerCase ( ) ) ) {
propType = "string" ;
} else {
propType = prompt ( "Enter the type of the value" ) ;
if ( stringSynonyms . includes ( propType ) ) {
propType = "string"
} ;
if ( numberSynonyms . includes ( propType ) ) {
propType = "number" //Infinity (case-sensitively) is a *number*.
} ;
if ( booleanSynonyms . includes ( propType ) ) {
propType = "boolean"
} ;
if ( objectSynonyms . includes ( propType ) ) {
propType = "object" //null (case-sensitively) is an *object*.
}
} ;
//Conversion
if ( propType === "number" ) {
propValue = parseFloat ( propValue ) ;
if ( isNaN ( propValue ) ) {
alert ( "Value is not a number!" ) ;
return false ;
} ;
} else if ( propType === "boolean" ) {
2022-11-02 16:20:58 -04:00
if ( synonymsOfTrue . includes ( propValue . toLowerCase ( ) ) ) {
2022-09-14 14:37:03 -04:00
propValue = true ;
2022-11-02 16:20:58 -04:00
} else if ( synonymsOfFalse . includes ( propValue . toLowerCase ( ) ) ) {
2022-09-14 14:37:03 -04:00
propValue = false ;
} else {
alert ( "Unrecognized boolean value: " + propValue + "." ) ;
return false ;
} ;
} else if ( propType === "object" ) {
try {
propValue = JSON . parse ( propValue ) ;
} catch ( error ) {
alert ( "JSON is invalid! Note that it requires quotes around keys as well as those curly {} parentheses." ) ;
return false ;
} ;
} else if ( propType !== "string" ) {
alert ( "Unrecognized or unsupported type!" ) ;
return false ;
} ;
updatePropDescription ( ) ;
2022-09-30 12:29:16 -04:00
currentElement = "prop" ;
2022-09-14 14:37:03 -04:00
} ;
elements . prop = {
color : "#ff7f00" ,
tool : function ( pixel ) {
2022-09-30 12:29:16 -04:00
if ( propProperty === "element" ) {
pixel [ propProperty ] = propValue ;
pixel . temp = ( elements [ propValue ] . temp || pixel . temp ) ;
} else {
pixel [ propProperty ] = propValue ;
} ;
2022-09-14 14:37:03 -04:00
pixelTempCheck ( pixel ) ;
} ,
category : "tools" ,
2022-09-30 12:29:16 -04:00
desc : ` Sets properties of pixels.<br/>Currently setting ${ propProperty } to ${ propValue } ( ${ propType } ).<br/><span onclick=propPrompt() style= \" color: #ff00ff; \" ;>Press [,] or click here</span> to open the property tool prompt. ` ,
2022-09-14 14:37:03 -04:00
} ;
function updatePropDescription ( ) {
2022-09-30 12:29:16 -04:00
elements . prop . desc = ` Sets properties of pixels.<br/>Currently setting ${ propProperty } to ${ propValue } ( ${ propType } ).<br/><span onclick=propPrompt() style= \" color: #ff00ff; \" ;>Press [,] or click here</span> to open the property tool prompt. ` ;
} ;
function numberAdjusterPrompt ( ) {
numberAdjusterProperty = prompt ( "Enter the property you want to change" ) ;
numberAdjusterValue = prompt ( "Enter the value you want to use" ) ;
numberAdjusterMode = prompt ( "Enter \"set\" to set the property to the value,\nor \"add\" to add the value to the property." ) ;
//property check
//console.log("Null property path");
if ( numberAdjusterProperty === "" || numberAdjusterProperty === null ) {
alert ( "No property was specified! Defaulting to temp." ) ;
numberAdjusterProperty = "temp" ;
//console.log(numberAdjusterProperty);
} ;
//console.log("Property: " + numberAdjusterProperty);
//value check
if ( isNaN ( parseFloat ( numberAdjusterValue ) ) ) {
//console.log("Invalid value path");
//console.log(numberAdjusterValue);
//empty string
if ( numberAdjusterValue === "" || numberAdjusterValue === null ) {
//console.log("Null value path");
alert ( "No value was specified! Defaulting to 1" ) ;
numberAdjusterValue = 1 ;
//console.log(numberAdjusterValue);
} else {
//console.log("NaN value path");
alert ( "Invalid value! The value must be a number (defaulting to 1)" ) ;
numberAdjusterValue = 1 ;
//console.log(numberAdjusterValue);
} ;
} ;
numberAdjusterValue = parseFloat ( numberAdjusterValue ) ;
//console.log("Value: " + numberAdjusterValue);
//mode check
if ( ! [ "set" , "add" ] . includes ( numberAdjusterMode . toLowerCase ( ) ) ) {
//console.log("Invalid mode path");
//console.log(numberAdjusterMode);
//empty string
if ( numberAdjusterMode === "" || numberAdjusterMode === null ) {
//console.log("Null mode path");
alert ( "No mode was specified! Defaulting to \"add\"." ) ;
numberAdjusterMode = "add" ;
//console.log(numberAdjusterMode);
} else {
//console.log("Unknown mode path");
alert ( "Invalid mode! Only the values \"set\" or \"add\" are accepted (defaulting to \"add\")." ) ;
numberAdjusterMode = "add" ;
//console.log(numberAdjusterMode);
} ;
} ;
numberAdjusterMode = numberAdjusterMode . toLowerCase ( ) ;
//console.log("Mode: " + numberAdjusterMode);
if ( numberAdjusterMode === "set" ) {
2022-10-05 13:53:51 -04:00
numberAdjusterVerb = "assigning" ;
2022-09-30 12:29:16 -04:00
} else if ( numberAdjusterMode === "add" ) {
numberAdjusterVerb = "adding" ;
} else {
numberAdjusterVerb = "doing something probably invalid with" ;
}
updateNumberAdjusterDescription ( ) ;
currentElement = "number_adjuster" ;
} ;
elements . number _adjuster = {
color : "#7fff00" ,
tool : function ( pixel ) {
if ( numberAdjusterProperty !== "element" ) {
//console.log(numberAdjusterValue);
if ( numberAdjusterMode === "set" ) {
pixel [ numberAdjusterProperty ] = numberAdjusterValue ;
} else if ( numberAdjusterMode === "add" ) {
if ( typeof ( pixel [ numberAdjusterProperty ] ) === "undefined" ) {
pixel [ numberAdjusterProperty ] = 0 ;
} ;
pixel [ numberAdjusterProperty ] += numberAdjusterValue ;
} ;
pixelTempCheck ( pixel ) ;
} ;
} ,
category : "tools" ,
2022-10-05 13:53:51 -04:00
desc : ` Sets or adds to numeric properties of pixels.<br/>Currently ${ numberAdjusterVerb } ${ numberAdjusterValue } to ${ numberAdjusterProperty } .<br/><span onclick=numberAdjusterPrompt() style= \" color: #ff00ff; \" ;>Press [Shift+,] or click here</span> to open the adjuster tool prompt. ` ,
2022-09-30 12:29:16 -04:00
} ;
function updateNumberAdjusterDescription ( ) {
2022-10-05 13:53:51 -04:00
elements . number _adjuster . desc = ` Sets or adds to numeric properties of pixels.<br/>Currently ${ numberAdjusterVerb } ${ numberAdjusterValue } to ${ numberAdjusterProperty } .<br/><span onclick=numberAdjusterPrompt() style= \" color: #ff00ff; \" ;>Press [Shift+,] or click here</span> to open the adjuster tool prompt. ` ;
2022-09-14 14:37:03 -04:00
} ;