diff --git a/mods/prop.js b/mods/prop.js
index 63f02d4f..9e2510b4 100644
--- a/mods/prop.js
+++ b/mods/prop.js
@@ -1,284 +1,314 @@
-propProperty = "element";
-propValue = "sand";
-propType = "string";
-numberAdjusterProperty = "temp";
-numberAdjusterValue = 1;
-numberAdjusterMode = "add";
-numberAdjusterVerb = "adding";
+var modName = "mods/prop.js";
+var variablesMod = "mods/prop and prompt variables.js";
-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" ]; /*The purpose of these blatant lies is, through 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" ];
+if(enabledMods.includes(variablesMod)) {
+ propProperty = "element";
+ propValue = "sand";
+ propType = "string";
+ numberAdjusterProperty = "temp";
+ numberAdjusterValue = 1;
+ numberAdjusterMode = "add";
+ numberAdjusterVerb = "adding";
-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"];
-
-synonymsOfTrue = ["true", "t", "1", "yes"];
-synonymsOfFalse = ["false", "f", "0", "no"];
-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();
- shiftDown ? numberAdjusterPrompt() : propPrompt();
+ 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 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;
- };
+ 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};
};
- //special check: color
- if(propProperty === "color") {
- //empty string
- if(propValue === "") {
- alert("No color was specified!");
- return false;
+
+ document.addEventListener("keydown", function(e) { //prop prompt listener
+ // , = propPrompt()
+ if (e.keyCode == 188) {
+ e.preventDefault();
+ shiftDown ? numberAdjusterPrompt() : propPrompt();
};
- 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
+ });
+
+ 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;
};
- } else { //if not RGB and not HSL
+ };
+ 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;
};
};
- 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!");
+
+ //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 if(defaultArrayTypeValues.includes(propProperty.toLowerCase())) {
+ propType = "array";
+ } else {
+ propType = prompt("Enter the type of the value");
+ if(stringSynonyms.includes(propType)) {
+ propType = "string";
+ } else if(numberSynonyms.includes(propType)) {
+ propType = "number"; //Infinity (case-sensitively) is a *number*.
+ } else if(booleanSynonyms.includes(propType)) {
+ propType = "boolean";
+ } else if(objectSynonyms.includes(propType)) {
+ propType = "object"; //null (case-sensitively) is an *object*.
+ } else if(arraySynonyms.includes(propType)) {
+ propType = "array"; //offset coords use arrays a lot
+ };
+ };
+
+ //Conversion
+ if(propType === "number") {
+ propValue = parseFloat(propValue);
+ if(isNaN(propValue)) {
+ alert("Value is not a number!");
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!");
+ } else if(propType === "boolean") {
+ if(synonymsOfTrue.includes(propValue.toLowerCase())) {
+ propValue = true;
+ } else if(synonymsOfFalse.includes(propValue.toLowerCase())) {
+ propValue = false;
+ } else {
+ alert("Unrecognized boolean value: " + propValue + ".");
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") {
- if(synonymsOfTrue.includes(propValue.toLowerCase())) {
- propValue = true;
- } else if(synonymsOfFalse.includes(propValue.toLowerCase())) {
- 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();
- currentElement = "prop";
-};
-
-elements.prop = {
- color: "#ff7f00",
- tool: function(pixel) {
- if(propProperty === "element") {
- pixel[propProperty] = propValue;
- pixel.temp = (elements[propValue].temp || pixel.temp);
- } else {
- pixel[propProperty] = propValue;
- };
- pixelTempCheck(pixel);
- },
- category: "tools",
- desc: `Sets properties of pixels.
Currently setting ${propProperty} to ${propValue} (${propType}).
Press [,] or click here to open the property tool prompt.`,
-};
-
-function updatePropDescription() {
- elements.prop.desc = `Sets properties of pixels.
Currently setting ${propProperty} to ${propValue} (${propType}).
Press [,] or click here 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") {
- numberAdjusterVerb = "assigning";
- } 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;
+ } 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 === "array") {
+ array = propType.split(",");
+ for(i = 0; i < array.length; i++) {
+ if(array[i].startsWith("s")) { //String
+ array[i] = array[i].substring(1);
+ } else if(array[i].startsWith("n")) { //Number
+ array[i] = array[i].substring(1);
+ if(isNaN(parseFloat(array[i]))) {
+ alert(array[i] + " is not a number!");
+ return false;
+ };
+ array[i] = parseFloat(array[i]);
+ } else if(array[i].startsWith("o")) { //Object
+ array[i] = array[i].substring(1);
+ try {
+ array[i] = JSON.parse(array[i]);
+ } catch (error) {
+ alert(array[i] + " is not valid JSON!");
+ return false;
+ };
+ } else if(array[i].startsWith("b")) { //Boolean
+ array[i] = array[i].substring(1);
+ if(synonymsOfTrue.includes(array[i].toLowerCase())) {
+ array[i] = true;
+ } else if(synonymsOfFalse.includes(array[i].toLowerCase())) {
+ array[i] = false;
+ } else {
+ alert("Unrecognized boolean value: " + array[i] + ".");
+ return false;
+ };
+ } else {
+ alert(array[i] + ' must start with "s" for a string, "n" for a number, "o" for an object, or "b" for a boolean.');
+ return false;
};
- pixel[numberAdjusterProperty] += numberAdjusterValue;
+ };
+ propType = array;
+ } else if(propType !== "string") {
+ alert("Unrecognized or unsupported type!");
+ return false;
+ };
+ updatePropDescription();
+ currentElement = "prop";
+ };
+
+ elements.prop = {
+ color: "#ff7f00",
+ tool: function(pixel) {
+ if(propProperty === "element") {
+ pixel[propProperty] = propValue;
+ pixel.temp = (elements[propValue].temp || pixel.temp);
+ } else {
+ pixel[propProperty] = propValue;
};
pixelTempCheck(pixel);
- };
- },
- category: "tools",
- desc: `Sets or adds to numeric properties of pixels.
Currently ${numberAdjusterVerb} ${numberAdjusterValue} to ${numberAdjusterProperty}.
Press [Shift+,] or click here to open the adjuster tool prompt.`,
-};
+ },
+ category: "tools",
+ desc: `Sets properties of pixels.
Currently setting ${propProperty} to ${propValue} (${propType}).
Press [,] or click here to open the property tool prompt.`,
+ };
-function updateNumberAdjusterDescription() {
- elements.number_adjuster.desc = `Sets or adds to numeric properties of pixels.
Currently ${numberAdjusterVerb} ${numberAdjusterValue} to ${numberAdjusterProperty}.
Press [Shift+,] or click here to open the adjuster tool prompt.`;
+ function updatePropDescription() {
+ elements.prop.desc = `Sets properties of pixels.
Currently setting ${propProperty} to ${propValue} (${propType}).
Press [,] or click here 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") {
+ numberAdjusterVerb = "assigning";
+ } 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",
+ desc: `Sets or adds to numeric properties of pixels.
Currently ${numberAdjusterVerb} ${numberAdjusterValue} to ${numberAdjusterProperty}.
Press [Shift+,] or click here to open the adjuster tool prompt.`,
+ };
+
+ function updateNumberAdjusterDescription() {
+ elements.number_adjuster.desc = `Sets or adds to numeric properties of pixels.
Currently ${numberAdjusterVerb} ${numberAdjusterValue} to ${numberAdjusterProperty}.
Press [Shift+,] or click here to open the adjuster tool prompt.`;
+ };
+} else {
+ alert(`The ${variablesMod} mod is required and has been automatically inserted (reload for this to take effect).`)
+ enabledMods.splice(enabledMods.indexOf(modName),0,variablesMod)
+ localStorage.setItem("enabledMods", JSON.stringify(enabledMods));
};