From abcea7daad9be3cb08c09b7d9edc43369bce35ed Mon Sep 17 00:00:00 2001 From: "Laetitia (O-01-67)" <68935009+O-01-67@users.noreply.github.com> Date: Thu, 23 Feb 2023 12:54:14 -0500 Subject: [PATCH] finite, squeezable sponges --- mods/sponge_edit.js | 76 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 mods/sponge_edit.js diff --git a/mods/sponge_edit.js b/mods/sponge_edit.js new file mode 100644 index 00000000..f95396cb --- /dev/null +++ b/mods/sponge_edit.js @@ -0,0 +1,76 @@ +var modName = "mods/sponge_edit.js"; +var onTryMoveIntoMod = "mods/onTryMoveInto.js"; +var libraryMod = "mods/code_library.js"; + +if(enabledMods.includes(onTryMoveIntoMod) && enabledMods.includes(libraryMod)) { + elements.sponge.properties ??= {}; + elements.sponge.properties.maxAbsorb = 250; + + elements.sponge.tick = function(pixel) { + pixel.absorbed ??= {}; + var coordsToCheck = [ + [pixel.x-1,pixel.y], + [pixel.x+1,pixel.y], + [pixel.x,pixel.y-1], + [pixel.x,pixel.y+1], + ]; + shuffleArray(coordsToCheck); + for (var i = 0; i < coordsToCheck.length; i++) { + if(sumNumericArray(Object.values(pixel.absorbed)) >= pixel.maxAbsorb) { + break; + }; + var coord = coordsToCheck[i]; + if (!isEmpty(coord[0],coord[1],true)) { + var newPixel = pixelMap[coord[0]][coord[1]]; + if (elements[newPixel.element].state === "liquid" && ((elements[newPixel.element].density || 0) < 2500)) { + pixel.absorbed[newPixel.element] ??= 0; + pixel.absorbed[newPixel.element]++; + deletePixel(coord[0],coord[1]); + }; + }; + }; + if((pixel.absorbed.water ?? 0) < 5) { + doBurning(pixel); + }; + }; + + elements.sponge.onTryMoveInto = function(pixel,otherPixel) { + var absorbedElements = Object.keys(pixel.absorbed); + if(absorbedElements.length == 0) { + return false; + }; + var otherInfo = elements[otherPixel.element] + if((otherInfo.state ?? "solid") == "solid") { + //console.log(otherPixel.element,otherInfo.state); + var outputOffsets = [pixel.x - otherPixel.x, pixel.y - otherPixel.y]; + var twiceOffsets = outputOffsets.map(x => x * 2); + var newCoords = [pixel.x + outputOffsets[0], pixel.y + outputOffsets[1]]; + var twiceCoords = [pixel.x + twiceOffsets[0], pixel.y + twiceOffsets[1]]; + if(!isEmpty(newCoords[0],newCoords[1],true)) { + if(outOfBounds(newCoords[0],newCoords[1])) { //fail if OOB + return false; + }; + var newPixel = pixelMap[newCoords[0]][newCoords[1]]; + if((elements[newPixel.element].state ?? "solid") !== "gas") { //only displace gases + return false; + }; + if(!tryMove(newPixel,twiceCoords[0],twiceCoords[1])) { //if it can't push the gas out to the next pixel over + return false; //then return false because perpendicular expulsion too complex and multifaceted to deal with + }; + }; + if(isEmpty(pixel.x,pixel.y+1)) { + var randomElement = randomChoice(absorbedElements); + if(pixel.absorbed[randomElement] > 0) { + if(tryCreatePixel(randomElement,newCoords[0],newCoords[1])) { pixel.absorbed[randomElement]-- }; + } else { + delete pixel.absorbed[randomChoice] + }; + }; + }; + }; +} else { + enabledMods.splice(enabledMods.indexOf(modName),0,onTryMoveIntoMod); + enabledMods.splice(enabledMods.indexOf(modName),0,libraryMod); + localStorage.setItem("enabledMods", JSON.stringify(enabledMods)); + alert(`The ${onTryMoveIntoMod} mod and ${libraryMod} mods are required and have been automatically inserted (reload for this to take effect).`); +}; \ No newline at end of file