diff --git a/mods/prompt.js b/mods/prompt.js index 71401ee4..669e18ff 100644 --- a/mods/prompt.js +++ b/mods/prompt.js @@ -1,374 +1,419 @@ -colorInvalidError = "Color must be in the form \"rgb(red,green,blue)\" or \"hsl(hue,saturation%,lightness%)\" (without quotes)!"; -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.*/ - //Passing "Infinity" through parseFloat returns Infinity. -booleanSynonyms = [ "boolean", "bool", "boole", "boo", "bo", "bl", "b" ]; -synonymsOfTrue = ["true", "t", "1", "yes"]; -synonymsOfFalse = ["false", "f", "0", "no"]; -defaultStringTypeValues = ["element","color","clone","changeTo","void","type","spawn"]; -defaultNumberTypeValues = ["x","y","temp","start","vx","vy","chargeCD","start","burnStart","dir","panic","r","frequency","length","delay","volume","debounce","debounceLength","speed","fall","penetrateCounter","chargeCounter","spawnCounter","spawnTime","squadiusX","squadiusY","spawnTries","counter"]; -defaultBooleanTypeValues = ["burning","charge","dead","hissing","following","dirLocked","del","didChargeBlueTinted","shooting","del"]; -commandHelpObject = { - "set": "Sets properties for every pixel of a given type.\nUsage: set [property] [element] [value] \nDon't include framing characters []<>.\nThe element can be \"all\" to set the property for every pixel.\nNote: Strings can't have spaces because spaces are the separator used in the parsing split().\nArguments in [brackets] are required and ones in are optional.", - "test": "Test.", - "fill": "Fills the screen with the given pixel(s). Usage: fill [Overwrite pixels? (should be a bool)] [element] .\nDon't include framing characters []<>.\nArguments in [brackets] are required and ones in are optional.\nAdditional elements are separated by spaces.", - "randomfill": "Fills the screen with pixels from randomChoices. Usage: randomfill \nDon't include framing characters []<>.\nArguments in are optional.", - "count": "Tells you the amount of a specified pixel on the screen. Usage: count [element]\nDon't include framing characters []<>.\nArguments in [brackets] are required.", - "countall": "Logs to console a list of all elements on screen and their amounts. Usage: countall.", - "help": "Usage: help \nDon't include framing characters []<>.\nArguments in are optional." -} +var modName = "mods/prompt.js"; +var variablesMod = "mods/prop and prompt variables.js"; -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}; -} - -function alertIfError(alertError,text) { - if(alertError) { - alert(text); - return(true); - } else { - return(false); +if(enabledMods.includes(variablesMod)) { + commandHelpObject = { + "set": "Sets properties for every pixel of a given type.\nUsage: set [property] [element] [value] \nDon't include framing characters []<>.\nThe element can be \"all\" to set the property for every pixel.\nNote: Strings can't have spaces because spaces are the separator used in the parsing split().\nArguments in [brackets] are required and ones in are optional.", + "test": "Test.", + "fill": "Fills the screen with the given pixel(s). Usage: fill [Overwrite pixels? (should be a bool)] [element] .\nDon't include framing characters []<>.\nArguments in [brackets] are required and ones in are optional.\nAdditional elements are separated by spaces.", + "randomfill": "Fills the screen with pixels from randomChoices. Usage: randomfill \nDon't include framing characters []<>.\nArguments in are optional.", + "count": "Tells you the amount of a specified pixel on the screen. Usage: count [element]\nDon't include framing characters []<>.\nArguments in [brackets] are required.", + "countall": "Logs to console a list of all elements on screen and their amounts. Usage: countall.", + "help": "Usage: help \nDon't include framing characters []<>.\nArguments in are optional." } -} -function alertIfOutput(alertOutput,text) { - if(alertOutput) { - alert(text); - return(true); - } else { - return(false); + 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 funniPrompt(argument=null,alertOutput=true,alertError=true) { - argument === null ? inputText = prompt("Enter command") : inputText = argument; - // replace spaces with underscores - inputAsArray = inputText.split(" "); - var firstItem = inputAsArray[0]; - - switch(firstItem) { - case "set": - if(inputAsArray.length < 4) { - alertIfError(alertError,"Usage: set [property] [element] [value] \nDon't include framing characters []<>.\nThe element can be \"all\" to set the property for every pixel.\nNote: Strings can't have spaces because spaces are the separator used in the parsing split().\nArguments in [brackets] are required and ones in are optional."); - return false; - }; - var property = inputAsArray[1]; - //console.log("Property gotten: " + property); - var inputElement = inputAsArray[2]; - //console.log("Element gotten: " + inputElement); - var value = inputAsArray[3]; - //console.log("Value gotten: " + value); - var type = null; //dummy type for [value]-based assumption - if(inputAsArray.length >= 5) { - type = inputAsArray[4]; - }; - //console.log("Type gotten: " + type); - - if(type === null) { - type = null; //catch null type - } else if(numberSynonyms.includes(type.toLowerCase())) { - type = "number"; - } else if(booleanSynonyms.includes(type.toLowerCase())) { - type = "boolean"; - } else if(stringSynonyms.includes(type.toLowerCase())) { - type = "string"; - } /*else if(arraySynonyms.includes(type.toLowerCase())) { //I have no plans to implement these. - type = "array"; - } else if(objectSynonyms.includes(type.toLowerCase())) { - type = "object"; - }*/ else { - alertIfError(alertError,"Unrecognized type: \"" + type + "\"."); - return false; - }; - - if(type === null) { - if(defaultStringTypeValues.includes(property)) { - type = "string"; - } else if(defaultNumberTypeValues.includes(property)) { - type = "number"; - } else { - alertIfError(alertError,"Type could not be assumed from property. Please specify the type as a fourth argument."); - return false; - } - } - - if(type === "number") { - value = parseFloat(value); - if(isNaN(value)) { - alertIfError(alertError,"Value is not a number!"); + 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}; + } + + function alertIfError(alertError,text) { + if(alertError) { + alert(text); + return(true); + } else { + return(false); + } + } + + function alertIfOutput(alertOutput,text) { + if(alertOutput) { + alert(text); + return(true); + } else { + return(false); + } + } + + function funniPrompt(argument=null,alertOutput=true,alertError=true) { + argument === null ? inputText = prompt("Enter command") : inputText = argument; + // replace spaces with underscores + inputAsArray = inputText.split(" "); + var firstItem = inputAsArray[0]; + + switch(firstItem) { + case "set": + if(inputAsArray.length < 4) { + alertIfError(alertError,"Usage: set [property] [element] [value] \nDon't include framing characters []<>.\nThe element can be \"all\" to set the property for every pixel.\nNote: Strings can't have spaces because spaces are the separator used in the parsing split().\nArguments in [brackets] are required and ones in are optional."); return false; }; - } else if(type === "boolean") { - if(synonymsOfTrue.includes(value.toLowerCase())) { - value = true; - } else if(synonymsOfFalse.includes(value.toLowerCase())) { - value = false; - } else { - alertIfError(alertError,"Unrecognized boolean value: " + value + "."); + var property = inputAsArray[1]; + //console.log("Property gotten: " + property); + var inputElement = inputAsArray[2]; + //console.log("Element gotten: " + inputElement); + var value = inputAsArray[3]; + //console.log("Value gotten: " + value); + var type = null; //dummy type for [value]-based assumption + if(inputAsArray.length >= 5) { + type = inputAsArray[4]; + }; + //console.log("Type gotten: " + type); + + if(type === null) { + type = null; //catch null type + } else if(numberSynonyms.includes(type.toLowerCase())) { + type = "number"; + } else if(booleanSynonyms.includes(type.toLowerCase())) { + type = "boolean"; + } else if(stringSynonyms.includes(type.toLowerCase())) { + type = "string"; + } else if(arraySynonyms.includes(type.toLowerCase())) { + type = "array"; + } else if(objectSynonyms.includes(type.toLowerCase())) { + type = "object"; + }; + + var typeWhitelist = [null,"string","number","boolean","array","object"]; + if(!typeWhitelist.includes(type)) { + alertIfError(alertError,"Unrecognized type: \"" + type + "\"."); return false; + }; + + if(type === null) { + if(defaultStringTypeValues.includes(property)) { + type = "string"; + } else if(defaultNumberTypeValues.includes(property)) { + type = "number"; + } else if(defaultBooleanTypeValues.includes(property)) { + type = "boolean"; + } else if(defaultArrayTypeValues.includes(property)) { + type = "array"; + } else { + alertIfError(alertError,"Type could not be assumed from property. Please specify the type as a fourth argument."); + return false; + } } - } - //The values start out as strings when split from the array, so string is kind of the default form. - - //Special validation - - if(property === "element") { - var originalInput = value; //for error display - value = mostSimilarElement(value); - if(!elements[value]) { - alertIfError(alertError,"Element " + originalInput + " does not exist!"); - return false; + + if(type === "number") { + value = parseFloat(value); + if(isNaN(value)) { + alertIfError(alertError,"Value is not a number!"); + return false; + }; + } else if(type === "boolean") { + if(synonymsOfTrue.includes(value.toLowerCase())) { + value = true; + } else if(synonymsOfFalse.includes(value.toLowerCase())) { + value = false; + } else { + alertIfError(alertError,"Unrecognized boolean value: " + value + "."); + return false; + } + } else if(type === "object") { + try { + value = JSON.parse(value); + } catch (error) { + alertIfError(alertError,"JSON is invalid! Note that it requires quotes around keys as well as those curly {} parentheses."); + return false; + }; + } else if(type === "array") { + array = value.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; + }; + }; + value = array; } - }; - if(property === "x") { - if(!Number.isSafeInteger(value)) { - alertIfError(alertError,"X cannot be a decimal! And what are you doing trying to set position values anyway?"); - return false; - } - }; - if(property === "color") { - if(!value.startsWith("rgb(")) { //if not RGB - if(value.startsWith("hsl(")) { //if HSL - if(!(value.split(",")[1].endsWith('%')) || !(value.split(",")[2].endsWith('%)'))) { //if missing percent symbols + //The values start out as strings when split from the array, so string is kind of the default form. + + //Special validation + + if(property === "element") { + var originalInput = value; //for error display + value = mostSimilarElement(value); + if(!elements[value]) { + alertIfError(alertError,"Element " + originalInput + " does not exist!"); + return false; + } + }; + if(property === "x") { + if(!Number.isSafeInteger(value)) { + alertIfError(alertError,"X cannot be a decimal! And what are you doing trying to set position values anyway?"); + return false; + } + }; + if(property === "color") { + if(!value.startsWith("rgb(")) { //if not RGB + if(value.startsWith("hsl(")) { //if HSL + if(!(value.split(",")[1].endsWith('%')) || !(value.split(",")[2].endsWith('%)'))) { //if missing percent symbols + alertIfError(alertError,colorInvalidError); + return false; + }; + } else { //if not RGB and not HSL alertIfError(alertError,colorInvalidError); return false; }; - } else { //if not RGB and not HSL + } + if(value.split(",").length !== 3) { //if too short or long + alertIfError(alertError,colorInvalidError); + return false; + } + if(value.startsWith("rgb(")) { //if RGB + var checkedColorObject = rgbStringToUnvalidatedObject(value); //RGB NaN checking + if(isNaN(checkedColorObject.r) || isNaN(checkedColorObject.g) || isNaN(checkedColorObject.b)) { + //console.log(checkedColorObject); + alertIfError(alertError,"One or more color values are invalid!"); + return false; + }; + } else if(value.startsWith("hsl(")) { //if HSL + var checkedColorObject = hslStringToUnvalidatedObject(value); //HSL NaN checking + if(isNaN(checkedColorObject.h) || isNaN(checkedColorObject.s) || isNaN(checkedColorObject.l)) { + //console.log(checkedColorObject); + alertIfError(alertError,"One or more color values are invalid!"); + return false; + }; + } else { //if neither alertIfError(alertError,colorInvalidError); return false; }; - } - if(value.split(",").length !== 3) { //if too short or long - alertIfError(alertError,colorInvalidError); - return false; - } - if(value.startsWith("rgb(")) { //if RGB - var checkedColorObject = rgbStringToUnvalidatedObject(value); //RGB NaN checking - if(isNaN(checkedColorObject.r) || isNaN(checkedColorObject.g) || isNaN(checkedColorObject.b)) { - //console.log(checkedColorObject); - alertIfError(alertError,"One or more color values are invalid!"); - return false; - }; - } else if(value.startsWith("hsl(")) { //if HSL - var checkedColorObject = hslStringToUnvalidatedObject(value); //HSL NaN checking - if(isNaN(checkedColorObject.h) || isNaN(checkedColorObject.s) || isNaN(checkedColorObject.l)) { - //console.log(checkedColorObject); - alertIfError(alertError,"One or more color values are invalid!"); - return false; - }; - } else { //if neither - alertIfError(alertError,colorInvalidError); - return false; }; - }; - - //Actual setting code; - var setCount = 0; - for (var i = 1; i < width; i++) { - for (var j = 1; j < height; j++) { - if (!isEmpty(i,j)) { - //console.log("Pixel (" + i + "," + j + ") exists") - if(pixelMap[i][j].element === inputElement || inputElement === "all") { - //console.log("Element is a match: " + inputElement + ", " + pixelMap[i][j].element) - pixelMap[i][j][property] = value; - setCount++; + + //Actual setting code; + var setCount = 0; + for (var i = 1; i < width; i++) { + for (var j = 1; j < height; j++) { + if (!isEmpty(i,j)) { + //console.log("Pixel (" + i + "," + j + ") exists") + if(pixelMap[i][j].element === inputElement || inputElement === "all") { + //console.log("Element is a match: " + inputElement + ", " + pixelMap[i][j].element) + pixelMap[i][j][property] = value; + setCount++; + }; }; }; }; - }; - inputElement === "all" ? alertIfOutput(alertOutput,`Set ${property} of ${setCount} pixels to ${value}.`) : alertIfOutput(alertOutput,`Set ${property} of ${setCount} ${inputElement} pixels to ${value}.`) - return true; - case "test": - alertIfOutput(alertOutput,"pong"); - console.log("qwertyuiopasdfghjklzxcvbnm"); - return true; - case "fill": - if(inputAsArray.length < 3) { - alertIfError(alertError,"Usage: fill [overwrite (should be a bool)] [element] .\nDon't include framing characters []<>.\nArguments in [brackets] are required and ones in are optional."); - return false; - }; - - var doOverwrite = inputAsArray[1]; - - var elementList = inputAsArray.slice(2); - //console.log(elementList); - - for(i = 0; i < elementList.length; i++) { - var elementInConsideration = elementList[i] - var originalElement = elementInConsideration; //also for error display - elementInConsideration = mostSimilarElement(elementInConsideration); - if(!elements[elementInConsideration]) { - alertIfError(alertError,"Element " + originalElement + " does not exist!"); + inputElement === "all" ? alertIfOutput(alertOutput,`Set ${property} of ${setCount} pixels to ${value}.`) : alertIfOutput(alertOutput,`Set ${property} of ${setCount} ${inputElement} pixels to ${value}.`) + return true; + case "test": + alertIfOutput(alertOutput,"pong"); + console.log("qwertyuiopasdfghjklzxcvbnm"); + return true; + case "fill": + if(inputAsArray.length < 3) { + alertIfError(alertError,"Usage: fill [overwrite (should be a bool)] [element] .\nDon't include framing characters []<>.\nArguments in [brackets] are required and ones in are optional."); return false; - } - elementList[i] = elementInConsideration; - }; - //console.log(elementList); - - if(synonymsOfTrue.includes(doOverwrite.toLowerCase())) { - doOverwrite = true; - } else if(synonymsOfFalse.includes(doOverwrite.toLowerCase())) { - doOverwrite = false; - } else { - alertIfError(alertError,"Unrecognized boolean value: " + doOverwrite + "\n Note that for this command, the boolean value goes first."); - return false; - } - //console.log(doOverwrite); - //console.log(elementList); - - //Fill code - var fillCount = 0; - for (var i = 1; i < width; i++) { - for (var j = 1; j < height; j++) { - var randomElement = elementList[Math.floor(Math.random() * elementList.length)]; - if(doOverwrite) { - if(!isEmpty(i,j,true)) { deletePixel(i,j) }; - }; - if (isEmpty(i,j,false)) { - createPixel(randomElement,i,j); - fillCount++; - }; }; - }; - alertIfOutput(alertOutput,`Placed ${fillCount} pixels`); - return fillCount; - case "randomfill": - if(inputAsArray.length < 1) { //somehow? - alertIfError(alertError,"Usage: randomfill \nDon't include framing characters []<>.\nArguments in are optional."); - return false; - }; - - var doOverwrite = null; - - if(inputAsArray.length > 1) { + var doOverwrite = inputAsArray[1]; + + var elementList = inputAsArray.slice(2); + //console.log(elementList); + + for(i = 0; i < elementList.length; i++) { + var elementInConsideration = elementList[i] + var originalElement = elementInConsideration; //also for error display + elementInConsideration = mostSimilarElement(elementInConsideration); + if(!elements[elementInConsideration]) { + alertIfError(alertError,"Element " + originalElement + " does not exist!"); + return false; + } + elementList[i] = elementInConsideration; + }; + //console.log(elementList); + if(synonymsOfTrue.includes(doOverwrite.toLowerCase())) { doOverwrite = true; } else if(synonymsOfFalse.includes(doOverwrite.toLowerCase())) { doOverwrite = false; } else { - alertIfError(alertError,"Unrecognized boolean value: " + value); + alertIfError(alertError,"Unrecognized boolean value: " + doOverwrite + "\n Note that for this command, the boolean value goes first."); return false; - }; - } else { - doOverwrite = true; - }; - - var elementList = randomChoices; - - //Fill code - var fillCount = 0; - for (var i = 1; i < width; i++) { - for (var j = 1; j < height; j++) { - var randomElement = elementList[Math.floor(Math.random() * elementList.length)]; - if(doOverwrite) { - if(!isEmpty(i,j,true)) { deletePixel(i,j) }; - }; - if (isEmpty(i,j,false)) { - createPixel(randomElement,i,j); - fillCount++; - }; - }; - }; - alertIfOutput(alertOutput,`Placed ${fillCount} random pixels`); - return fillCount; - case "count": - if(inputAsArray.length < 2) { - alertIfError(alertError,"Usage: count [element]\nDon't include framing characters []<>.\nNote: The element name can't have a space in it because spaces are the separator used in the parsing split().\nArguments in [brackets] are required."); - return false; - }; - var inputElement = inputAsArray[1]; - //console.log("Element gotten: " + inputElement); - - var originalInput = inputElement; //for error display - inputElement = mostSimilarElement(inputElement); - //console.log("Element gotten: " + inputElement); - if(typeof(elements[inputElement]) === "undefined") { - alertIfError(alertError,"Element " + originalInput + " does not exist!"); - return false; - } - - //Actual counting code; - var count = 0; - for (var i = 1; i < width; i++) { - for (var j = 1; j < height; j++) { - if (!isEmpty(i,j)) { - //console.log("Pixel (" + i + "," + j + ") exists") - if(pixelMap[i][j].element === inputElement) { - //console.log("Element is a match: " + inputElement + ", " + pixelMap[i][j].element) - count++; + } + //console.log(doOverwrite); + //console.log(elementList); + + //Fill code + var fillCount = 0; + for (var i = 1; i < width; i++) { + for (var j = 1; j < height; j++) { + var randomElement = elementList[Math.floor(Math.random() * elementList.length)]; + if(doOverwrite) { + if(!isEmpty(i,j,true)) { deletePixel(i,j) }; + }; + if (isEmpty(i,j,false)) { + createPixel(randomElement,i,j); + fillCount++; }; }; }; - }; - alertIfOutput(alertOutput,`There are ${count} pixels of ${inputElement}`); - return count; - case "countall": - var listObject = {}; - - //Listing code; - for (var i = 1; i < width; i++) { - for (var j = 1; j < height; j++) { - if (!isEmpty(i,j)) { - var pixel = pixelMap[i][j]; - var element = pixel.element; - if(!listObject[pixel.element]) { - listObject[pixel.element] = 1; - } else { - listObject[pixel.element]++; - } + alertIfOutput(alertOutput,`Placed ${fillCount} pixels`); + return fillCount; + case "randomfill": + if(inputAsArray.length < 1) { //somehow? + alertIfError(alertError,"Usage: randomfill \nDon't include framing characters []<>.\nArguments in are optional."); + return false; + }; + + var doOverwrite = null; + + if(inputAsArray.length > 1) { + var doOverwrite = inputAsArray[1]; + if(synonymsOfTrue.includes(doOverwrite.toLowerCase())) { + doOverwrite = true; + } else if(synonymsOfFalse.includes(doOverwrite.toLowerCase())) { + doOverwrite = false; + } else { + alertIfError(alertError,"Unrecognized boolean value: " + value); + return false; + }; + } else { + doOverwrite = true; + }; + + var elementList = randomChoices; + + //Fill code + var fillCount = 0; + for (var i = 1; i < width; i++) { + for (var j = 1; j < height; j++) { + var randomElement = elementList[Math.floor(Math.random() * elementList.length)]; + if(doOverwrite) { + if(!isEmpty(i,j,true)) { deletePixel(i,j) }; + }; + if (isEmpty(i,j,false)) { + createPixel(randomElement,i,j); + fillCount++; + }; }; }; - }; - - var formattedList = ""; - var zelements = Object.keys(listObject); - for(k = 0; k < zelements.length; k++) { - var elementName = zelements[k]; - var elementCount = listObject[elementName]; - formattedList += `${elementName}: ${elementCount}\n`; - }; - - alertIfOutput(alertOutput,"Elements counts logged to console"); - console.log(formattedList); - return listObject; - case "help": - if(inputAsArray.length < 1) { //somehow - alertIfError(alertError,"Usage: help \nDon't include framing characters []<>.\nArguments in are optional."); - return false; - }; - if(inputAsArray.length < 2) { - alertOutput ? alertIfOutput(alertOutput,"Commands: \nset\ntest\nfill\nrandomfill\ncount\ncountall\nhelp") : console.log("Commands: set, test, fill, randomfill, count, countall, help"); - } else { - var command = inputAsArray[1]; - - if(typeof(commandHelpObject[command]) === "undefined") { - alertIfError(alertError,"Cound not find help for " + command + "."); + alertIfOutput(alertOutput,`Placed ${fillCount} random pixels`); + return fillCount; + case "count": + if(inputAsArray.length < 2) { + alertIfError(alertError,"Usage: count [element]\nDon't include framing characters []<>.\nNote: The element name can't have a space in it because spaces are the separator used in the parsing split().\nArguments in [brackets] are required."); return false; - } else { - alertOutput ? alertIfOutput(alertOutput,commandHelpObject[command]) : console.log(commandHelpObject[command].replace(/\n/g, " ")); - return true; }; - }; - return true; - default: - alertIfError(alertError,`Command ${firstItem} not found!`); - return false; + var inputElement = inputAsArray[1]; + //console.log("Element gotten: " + inputElement); + + var originalInput = inputElement; //for error display + inputElement = mostSimilarElement(inputElement); + //console.log("Element gotten: " + inputElement); + if(typeof(elements[inputElement]) === "undefined") { + alertIfError(alertError,"Element " + originalInput + " does not exist!"); + return false; + } + + //Actual counting code; + var count = 0; + for (var i = 1; i < width; i++) { + for (var j = 1; j < height; j++) { + if (!isEmpty(i,j)) { + //console.log("Pixel (" + i + "," + j + ") exists") + if(pixelMap[i][j].element === inputElement) { + //console.log("Element is a match: " + inputElement + ", " + pixelMap[i][j].element) + count++; + }; + }; + }; + }; + alertIfOutput(alertOutput,`There are ${count} pixels of ${inputElement}`); + return count; + case "countall": + var listObject = {}; + + //Listing code; + for (var i = 1; i < width; i++) { + for (var j = 1; j < height; j++) { + if (!isEmpty(i,j)) { + var pixel = pixelMap[i][j]; + var element = pixel.element; + if(!listObject[pixel.element]) { + listObject[pixel.element] = 1; + } else { + listObject[pixel.element]++; + } + }; + }; + }; + + var formattedList = ""; + var zelements = Object.keys(listObject); + for(k = 0; k < zelements.length; k++) { + var elementName = zelements[k]; + var elementCount = listObject[elementName]; + formattedList += `${elementName}: ${elementCount}\n`; + }; + + alertIfOutput(alertOutput,"Elements counts logged to console"); + console.log(formattedList); + return listObject; + case "help": + if(inputAsArray.length < 1) { //somehow + alertIfError(alertError,"Usage: help \nDon't include framing characters []<>.\nArguments in are optional."); + return false; + }; + if(inputAsArray.length < 2) { + alertOutput ? alertIfOutput(alertOutput,"Commands: \nset\ntest\nfill\nrandomfill\ncount\ncountall\nhelp") : console.log("Commands: set, test, fill, randomfill, count, countall, help"); + } else { + var command = inputAsArray[1]; + + if(typeof(commandHelpObject[command]) === "undefined") { + alertIfError(alertError,"Cound not find help for " + command + "."); + return false; + } else { + alertOutput ? alertIfOutput(alertOutput,commandHelpObject[command]) : console.log(commandHelpObject[command].replace(/\n/g, " ")); + return true; + }; + }; + return true; + default: + alertIfError(alertError,`Command ${firstItem} not found!`); + return false; + }; }; +} 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)); };