From 74b0a1abd12b02e686b522b290f08dfc39207aeb Mon Sep 17 00:00:00 2001
From: O-01-67 <68935009+O-01-67@users.noreply.github.com>
Date: Wed, 14 Sep 2022 14:37:03 -0400
Subject: [PATCH] Prop tool that might not work
my eyes fucking glazed over coding this
---
mods/prop.js | 185 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 185 insertions(+)
create mode 100644 mods/prop.js
diff --git a/mods/prop.js b/mods/prop.js
new file mode 100644
index 00000000..d9fd197c
--- /dev/null
+++ b/mods/prop.js
@@ -0,0 +1,185 @@
+propProperty = "element";
+propValue = "sand";
+propType = "string";
+
+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" ];
+
+defaultStringTypeValues = ["element","color","clone","changeTo","void"];
+defaultNumberTypeValues = ["x","y","temp","start","vx","vy","chargeCD","start","burnStart","dir","panic","r"];
+defaultBooleanTypeValues = ["burning","charge","dead"];
+
+trueSynonyms = ["true", "t", "1", "yes"];
+falseSynonyms = ["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();
+ propPrompt();
+ };
+});
+
+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") {
+ if(trueSynonyms.includes(propValue.toLowerCase())) {
+ propValue = true;
+ } else if(falseSynonyms.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();
+};
+
+elements.prop = {
+ color: "#ff7f00",
+ tool: function(pixel) {
+ pixel[propProperty] = propValue;
+ pixelTempCheck(pixel);
+ },
+ category: "tools",
+ desc: `Changes pixels of a specified type to another specified type.
Currently setting ${propProperty} to ${propValue} (${propType}).
Press [\"] or click here to open the replace prompt.`,
+};
+
+function updatePropDescription() {
+ elements.prop.desc = `Changes pixels of a specified type to another specified type.
Currently setting ${propProperty} to ${propValue} (${propType}).
Press [\"] or click here to open the replace prompt.`;
+};