From 204d5a093b27f5b7aba160058c4471d4732886f6 Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Tue, 1 Aug 2023 21:45:34 -0400 Subject: [PATCH 1/4] Update onTryMoveInto.js --- mods/onTryMoveInto.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/onTryMoveInto.js b/mods/onTryMoveInto.js index 55374299..0261f691 100644 --- a/mods/onTryMoveInto.js +++ b/mods/onTryMoveInto.js @@ -28,7 +28,8 @@ elements.on_try_move_into_test = { related: ["debug", "ash"], } -function tryMove(pixel,nx,ny,leaveBehind=undefined) { +function tryMove(pixel,nx,ny,leaveBehind,force) { + if (pixel.drag && !force) { return true; } var info = elements[pixel.element]; var oob = outOfBounds(nx,ny); if (isEmpty(nx,ny,false,oob)) { // If coords is empty, move to coords From 69448f9d488915c0edf45385df8c3597db8efb4b Mon Sep 17 00:00:00 2001 From: GGodPL <46885632+GGodPL@users.noreply.github.com> Date: Wed, 2 Aug 2023 14:56:51 +0200 Subject: [PATCH 2/4] Update elementsManager.js --- mods/elementsManager.js | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/mods/elementsManager.js b/mods/elementsManager.js index 781f593a..8271a871 100644 --- a/mods/elementsManager.js +++ b/mods/elementsManager.js @@ -1,5 +1,4 @@ -const mod = "mods/betterMenuScreens.js"; -if (enabledMods.includes(mod)) { +if (enabledMods.includes("mods/betterMenuScreens.js")) { const properties = { meta: [ {name: "name", type: "string", viewOnly: true, required: true}, @@ -256,18 +255,37 @@ if (enabledMods.includes(mod)) { document.head.appendChild(style); } + // ugly way of doing it but probably works + const checkType = (key, value) => { + if (key == "behavior" && (typeof value == "function" || value instanceof Array)) return true; + if (["darkText", "hidden", "insulate", "noMix", "isFood", "forceAutoGen", "customColor", "ignoreAir", "excludeRandom", "burning", "flipX", "flipY", "flippableX", "flippableY"].includes(key) && typeof value != "boolean") return false; + if (["name", "category", "desc", "alias", "seed", "baby", "state", "stateHigh", "stateHighName", "stateHighColor", "stateLow", "stateLowNmae", "stateLowColor"].includes(key) && typeof value != "string") return false; + if (["id", "burn", "burnTime", "stateHighColorMultiplier", "stateLowColorMutliplier", "temp", "tempHigh", "extraTempHigh", "tempLow", "extraTempLow"].includes(key) && typeof value != "number") return false; + if (["color", "breakInto", "burnInto", "fireElement", "fireColor"].includes(key)) { + if (value instanceof Array) return value.filter(l => typeof l == "string").length == value.length; + if (typeof value != "string") return false; + } + return true; + } + const loadChanges = () => { const newElements = Storage.get("elements", []); for (const element of newElements) { const element_ = element; element_["behavior"] = behaviors[element_["behavior"]]; - elements[element.name] = element_; + elements[element.name] = {}; + // elements[element.name] = element_; + for (const key of Object.keys(element_)) { + const val = element_[key]; + if (checkType(key, val)) elements[element.name][key] = val; + else if (["name", "category"].includes(key)) elements[element.name][key] = key == "name" ? "NewElement" : "other"; + } } const changes = Storage.get("changes", []); for (const change of changes) { for (const key of Object.keys(change.changes)) { const c = change.changes[key]; - elements[change.element][key] = c; + if (checkType(key, c)) elements[change.element][key] = c; } } const deleted = Storage.get("deletedElements", []); @@ -1104,7 +1122,7 @@ if (enabledMods.includes(mod)) { runAfterLoadList.push(cssInject, loadChanges); } else { - enabledMods.unshift(mod); + enabledMods.unshift("mods/betterMenuScreens.js"); localStorage.setItem("enabledMods", JSON.stringify(enabledMods)); window.location.reload(); } From b23587b7d5b3873cc4f64fa53a3ee4e5c03d2f11 Mon Sep 17 00:00:00 2001 From: GGodPL <46885632+GGodPL@users.noreply.github.com> Date: Wed, 2 Aug 2023 16:03:19 +0200 Subject: [PATCH 3/4] Update elementsManager.js --- mods/elementsManager.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/mods/elementsManager.js b/mods/elementsManager.js index 8271a871..0f26b137 100644 --- a/mods/elementsManager.js +++ b/mods/elementsManager.js @@ -296,7 +296,7 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { const applyChange = (property, value) => { const element = Storage.get("currentElement"); - if (elements[element]) + if (element && elements[element]) elements[element][property] = value; let changes = Storage.get("changes", []); let a; @@ -320,6 +320,7 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { let customElements = Storage.get("elements", []); let deletedElements = Storage.get("deletedElements", []); let lastFreeRemoval = Storage.get("settings", {allowFreeRemoval: false, clearElements: false}, true).allowFreeRemoval; + Storage.set("lastFreeRemoval", lastFreeRemoval); for (const key of Object.keys(elements).concat(customElements.map(e => e.name)).sort((a, b) => a.localeCompare(b, undefined, {caseFirst: "false"}))) { const element = document.createElement("li"); const text = span(key); // only the text should be clickable @@ -376,7 +377,7 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { filterInput.placeholder = "Search elements..."; filterInput.onkeyup = (ev) => { const val = ev.target.value; - const deleted = Storage.get("deletedElements"); + const deleted = Storage.get("deletedElements", []); for (const c of document.getElementById("elementsList").children) { const span_ = c.querySelector("span"); if (!span_.innerText.toLowerCase().includes(val.toLowerCase()) || deleted.includes(span_.innerText)) { @@ -646,7 +647,7 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { const createButton = span("Create Element"); createButton.className = "createButton"; createButton.onclick = () => { - const elementData = Storage.get("newElement"); + const elementData = Storage.get("newElement", {}); if (!elementData["name"]) { document.getElementById("elementsManager/creator/meta/name/required").style.display = ""; } @@ -759,10 +760,10 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { clearElementsButton.type = "button"; if (settings && settings.clearElements) { clearElementsButton.value = "ON"; - clearElementsButton.state = "1"; + clearElementsButton.setAttribute("state", "1"); } else { clearElementsButton.value = "OFF"; - clearElementsButton.state = "0"; + clearElementsButton.setAttribute("state", "0"); } clearElementsButton.onclick = (ev) => { toggleSetting("clearElements", ev.target) @@ -776,13 +777,13 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { allowRemovalButton.type = "button"; if (settings && settings.allowFreeRemoval) { allowRemovalButton.value = "ON"; - allowRemovalButton.state = "1"; + allowRemovalButton.setAttribute("state", "1"); } else { allowRemovalButton.value = "OFF"; - allowRemovalButton.state = "0"; + allowRemovalButton.setAttribute("state", "0"); } allowRemovalButton.onclick = (ev) => { - toggleSetting("allowFreeRemoval", ev.target) + toggleSetting("allowFreeRemoval", ev.target); } allowRemovalDiv.appendChild(allowRemovalButton); general.appendChild(allowRemovalDiv); @@ -885,8 +886,9 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { loader: elementManagerLoader, preOpen: () => { const currentElement = Storage.get("currentElement"); + if (!currentElement) return closeMenu(); const element = elements[currentElement]; - if (!element) closeMenu(); + if (!element) return closeMenu(); for (const key of Object.keys(properties)) { for (const prop of properties[key]) { const id = "elementsManager/" + key + "/" + prop.name; @@ -1080,6 +1082,7 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { onClose: () => { const settings = Storage.get("settings", {allowFreeRemoval: false, clearElements: false}, true); const elements_ = Storage.get("elements", []).map(e => e.name); + const lastFreeRemoval = Storage.get("lastFreeRemoval", false); if (settings.allowFreeRemoval && !lastFreeRemoval) { for (const li of document.getElementById("elementsList").children) { const name = li.querySelector("span").innerText @@ -1115,7 +1118,7 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { li.querySelectorAll(".elementRemoveButton").forEach(e => e.remove()); } } - lastFreeRemoval = settings.allowFreeRemoval; + Storage.set("lastFreeRemoval", settings.allowFreeRemoval); openMenu("elementsManager", true); } } From 7d229e094cf5fc164288f3606aa47b4491e8220a Mon Sep 17 00:00:00 2001 From: GGodPL <46885632+GGodPL@users.noreply.github.com> Date: Thu, 3 Aug 2023 12:24:45 +0200 Subject: [PATCH 4/4] Update elementsManager.js --- mods/elementsManager.js | 102 ++++++++++++++++++++++++++++++++-------- 1 file changed, 83 insertions(+), 19 deletions(-) diff --git a/mods/elementsManager.js b/mods/elementsManager.js index 0f26b137..74cdbee9 100644 --- a/mods/elementsManager.js +++ b/mods/elementsManager.js @@ -257,7 +257,8 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { // ugly way of doing it but probably works const checkType = (key, value) => { - if (key == "behavior" && (typeof value == "function" || value instanceof Array)) return true; + if (key == "behavior" && (typeof value == "function" || (value instanceof Array && value.filter(e => e instanceof Array && e.filter(s => typeof s == "string").length == e.length).length == value.length))) return true; + else if (key == "behavior") return false; if (["darkText", "hidden", "insulate", "noMix", "isFood", "forceAutoGen", "customColor", "ignoreAir", "excludeRandom", "burning", "flipX", "flipY", "flippableX", "flippableY"].includes(key) && typeof value != "boolean") return false; if (["name", "category", "desc", "alias", "seed", "baby", "state", "stateHigh", "stateHighName", "stateHighColor", "stateLow", "stateLowNmae", "stateLowColor"].includes(key) && typeof value != "string") return false; if (["id", "burn", "burnTime", "stateHighColorMultiplier", "stateLowColorMutliplier", "temp", "tempHigh", "extraTempHigh", "tempLow", "extraTempLow"].includes(key) && typeof value != "number") return false; @@ -272,7 +273,7 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { const newElements = Storage.get("elements", []); for (const element of newElements) { const element_ = element; - element_["behavior"] = behaviors[element_["behavior"]]; + if (Object.keys(behaviors).includes(element_["behavior"])) element_["behavior"] = behaviors[element_["behavior"]]; elements[element.name] = {}; // elements[element.name] = element_; for (const key of Object.keys(element_)) { @@ -294,23 +295,50 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { } } - const applyChange = (property, value) => { + const saveChanges = () => { const element = Storage.get("currentElement"); - if (element && elements[element]) - elements[element][property] = value; - let changes = Storage.get("changes", []); - let a; - if (a = changes.find(c => c.element == element)) { - a.changes[property] = value; + const changes = Storage.get("tempChanges", []); + if (Storage.get("elements", []).find(a => a.name == element)) { + const elements_ = Storage.get("elements", []); + for (const change of changes) { + elements_.find(a => a.name == element)[change.property] = change.value; + } + Storage.set("elements", elements_); } else { - let c = {}; - c[property] = value; - changes.push({ - element, - changes: c - }) + const permChanges = Storage.get("changes", []); + for (const change of changes) { + let a; + if (a = permChanges.find(c => c.element == element)) { + a.changes[change.property] = change.value; + } else { + let c = {}; + c[change.property] = change.value; + permChanges.push({ + element, + changes: c + }) + } + } + Storage.set("changes", permChanges); + } + } + + const applyChange = (property, value) => { + // if (element && elements[element]) + // elements[element][property] = value; + const element = Storage.get("currentElement"); + const changes = Storage.get("tempChanges", []); + changes.push({property, value}); + Storage.set("tempChanges", changes); + const nullish = { + string: "", + boolean: false, + number: 0, + array: [], + } + if (elements[element][property] == value || value == nullish[value instanceof Array ? "array" : typeof value]) { + Storage.filter("tempChanges", e => e.property != property); } - Storage.set("changes", changes); } const elementsManagerLoader = () => { @@ -503,16 +531,23 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { dropdown.onchange = (ev) => { if (ev.target.value == "CUSTOM") { document.getElementById(id + "/textInput").style.display = ""; + } else if (ev.target.value == "NONE") { + applyChange(prop.name, null); } else { document.getElementById(id + "/textInput").style.display = "none"; applyChange(prop.name, ev.target.value); } } + const noneOption = document.createElement("option"); + noneOption.value = "NONE"; + noneOption.id = id + "/option/none" + noneOption.innerText = "None"; + dropdown.appendChild(noneOption); const el = createInput("text", false, id + "/textInput"); el.style.display = "none"; el.onchange = (ev) => { if (document.getElementById(id).value == "CUSTOM") { - applyChange(prop.name, ev.target.value.split(";")); + applyChange(prop.name, ev.target.value.split(";").map(e => e.split(","))); } else { ev.target.style.display = "none"; } @@ -532,7 +567,18 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { category.appendChild(br()); nodes.push(category); } + + const saveButton = span("Save Changes"); + saveButton.className = "createButton"; + saveButton.onclick = () => { + saveChanges(); + Storage.remove("tempChanges"); + closeMenu(); + alert("Changes successfully applied"); + } + nodes.push(br(), saveButton) + new MenuScreen() .setTitle("Element Manager") .setCloseButtonText("<") @@ -612,7 +658,7 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { el.onchange = (ev) => { if (document.getElementById(id).value == "CUSTOM") { const elementData = Storage.get("newElement", {}); - elementData[prop.name] = ev.target.value.split(";"); + elementData[prop.name] = ev.target.value.split(";").map(e => e.split(",")); Storage.set("newElement", elementData); } else { ev.target.style.display = "none"; @@ -885,6 +931,7 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { show: false, loader: elementManagerLoader, preOpen: () => { + Storage.remove("tempChanges"); const currentElement = Storage.get("currentElement"); if (!currentElement) return closeMenu(); const element = elements[currentElement]; @@ -936,6 +983,10 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { } } else if (prop.name == "name") { el.setAttribute("value", currentElement); + } else if (prop.name == "behavior") { + console.log(element[prop.name], element); + document.getElementById(id + "/option/none").selected = true; + document.getElementById(id + "/textInput").style.display = "none"; } else { const default_ = { string: "none", @@ -953,8 +1004,21 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { } } }, + close: () => { + if (!Storage.get("tempChanges") || !Storage.get("tempChanges", []).length || confirm("Are you sure you want to close the menu without saving the changes?")) { + const menuParent = document.getElementById("elementManagerParent"); + menuParent.style.display = "none"; + Storage.remove("tempChanges"); + Storage.remove("noClose"); + } else { + Storage.set("noClose", true); + } + }, onClose: () => { - openMenu("elementsManager"); + if (!Storage.get("noClose")) { + showingMenu = false; + openMenu("elementsManager", true); + } } }