From 76b867339d17ad9805e8a9435da74efef81676ed Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Sun, 4 May 2025 20:56:29 -0700 Subject: [PATCH] time reversal mod! finally at last --- mods/reverse_time.js | 421 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 421 insertions(+) create mode 100644 mods/reverse_time.js diff --git a/mods/reverse_time.js b/mods/reverse_time.js new file mode 100644 index 00000000..f02876a7 --- /dev/null +++ b/mods/reverse_time.js @@ -0,0 +1,421 @@ +emptyList = [] + +runPerPixel(function(pixel) { + // run any code on each pixel every tick + if (pixel.start>pixelTicks) { + if (pixel.olderelement != undefined && pixel.oldercolor != undefined && pixel.olderstart != undefined && pixel.oldertemp != undefined && pixel.olderanimal != undefined && pixel.olderage != undefined) { + OGChangePixel(pixel) + } + else { + deletePixel(pixel.x,pixel.y) + } + } /* + if (pixel.start>pixelTicks+10) { + deletePixel(pixel.x,pixel.y) + } */ + if (pixel.burnStart && pixel.burnStart>pixelTicks) { + if (pixel.burning) { + delete pixel.burning; + delete pixel.burnStart; + } + } + if (pixel.origColor && !pixel.stainStart) { + pixel.stainStart = pixelTicks + } + if (pixel.stainStart && pixel.origColor && pixel.stainStart>pixelTicks) { + pixel.color = "rgb("+pixel.origColor[0]+","+pixel.origColor[1]+","+pixel.origColor[2]+")" + delete pixel.origColor + delete pixel.stainStart + } +}) + + +changePixel = function(pixel,element,changetemp=true) { + if (!element) { return } + if (elements[pixel.element].onChange !== undefined) { + elements[pixel.element].onChange(pixel,element); + } + if (!elements[element]) { + pixel.invalidElement = element; + element = "unknown" + } + if (!pixel.olderelement) { + pixel.olderelement = [] + } + if (!pixel.oldercolor) { + pixel.oldercolor = [] + } + if (!pixel.olderstart) { + pixel.olderstart = [] + } + if (!pixel.oldertemp) { + pixel.oldertemp = [] + } + if (!pixel.olderanimal) { + pixel.olderanimal = [] + } + if (!pixel.olderage) { + pixel.olderage = [] + } + for (var i = 0; i <= 500; i++) { + if (!pixel.olderelement[i]) { + pixel.olderelement[i] = pixel.element + if (pixel.element === "human") { + pixel.olderelement[i] = "head" + } + break; + } + } + for (var i = 0; i <= 500; i++) { + if (!pixel.oldercolor[i]) { + pixel.oldercolor[i] = pixel.color + break; + } + } + for (var i = 0; i <= 500; i++) { + if (!pixel.olderstart[i]) { + pixel.olderstart[i] = pixel.start + break; + } + } + for (var i = 0; i <= 500; i++) { + if (!pixel.oldertemp[i]) { + pixel.oldertemp[i] = pixel.temp + if (elements[pixel.element].tempHigh && elements[pixel.element].tempHigh < pixel.temp) { + pixel.oldertemp[i] = (elements[pixel.element].tempHigh - 1.5) + } + if (elements[pixel.element].tempLow && elements[pixel.element].tempLow > pixel.temp) { + pixel.oldertemp[i] = (elements[pixel.element].tempLow + 1.5) + } + break; + } + } + for (var i = 0; i <= 500; i++) { + if (!pixel.olderanimal[i]) { + pixel.olderanimal[i] = pixel.animal + if (!pixel.animal) { + pixel.olderanimal[i] = pixel.element + } + break; + } + } + for (var i = 0; i <= 500; i++) { + if (!pixel.olderage[i]) { + pixel.olderage[i] = pixel.age + if (!pixel.age) { + pixel.olderage[i] = pixel.start + } + break; + } + } + pixel.element = element; + pixel.color = pixelColorPick(pixel); + pixel.start = pixelTicks; + var elementInfo = elements[element]; + if (elementInfo.burning == true) { + pixel.burning = true; + pixel.burnStart = pixelTicks; + } + else if (pixel.burning && !elementInfo.burn) { + delete pixel.burning; + delete pixel.burnStart; + } + delete pixel.origColor; // remove stain + delete pixel.clone; + if (pixel.glow !== undefined) { + delete pixel.glow; + } + if (pixel.r && !elementInfo.rotatable) { + delete pixel.r; + } + if (pixel.flipX && !elementInfo.flippableX) { + delete pixel.flipX; + } + if (pixel.flipY && !elementInfo.flippableY) { + delete pixel.flipY; + } + // If elementInfo.flippableX, set it to true or false randomly + if (elementInfo.flipX !== undefined) { pixel.flipX = elementInfo.flipX } + else if (elementInfo.flippableX) { + pixel.flipX = Math.random() >= 0.5; + } + // If elementInfo.flippableY, set it to true or false randomly + if (elementInfo.flipY !== undefined) { pixel.flipY = elementInfo.flipY } + else if (elementInfo.flippableY) { + pixel.flipY = Math.random() >= 0.5; + } + if (elementInfo.temp !== undefined && changetemp) { + pixel.temp = (elementInfo.temp+pixel.temp)/2; + pixelTempCheck(pixel) + } + if (pixel.con && !elementInfo.canContain) { + delete pixel.con; + } + // If elementInfo.properties, set each key to its value + if (elementInfo.properties !== undefined) { + for (var key in elementInfo.properties) { + // If it is an array or object, make a copy of it + if (typeof elementInfo.properties[key] == "object") { + pixel[key] = JSON.parse(JSON.stringify(elementInfo.properties[key])); + } + else { + pixel[key] = elementInfo.properties[key]; + } + } + } + if (pixel.alpha !== undefined) { + delete pixel.alpha; + } + if (pixel.emit) { + delete pixel.emit; + } + if (elements[element].alpha !== undefined) { + pixel.alpha = elements[element].alpha; + } + if (elements[element].onPlace !== undefined) { + elements[element].onPlace(pixel); + } + checkUnlock(element); +} + +OGChangePixel = function(pixel) { + if (pixel.olderelement != undefined && pixel.oldercolor != undefined && pixel.olderstart != undefined && pixel.oldertemp != undefined && pixel.olderanimal != undefined && pixel.olderage != undefined && pixel.olderelement.length > emptyList.length && pixel.oldercolor.length > emptyList.length && pixel.olderstart.length > emptyList.length && pixel.oldertemp.length > emptyList.length && pixel.olderanimal.length > emptyList.length && pixel.olderage.length > emptyList.length && pixel.startpixelTicks) { + deletePixel(pixel.x,pixel.y) + } + else if (pixel.animal && pixel.start-pixelTicks >= 500 && Math.random() < 0.2) { + deletePixel(pixel.x,pixel.y) + } + if (pixel.start === pixelTicks) {return} + if (pixel.drag) pixel.fall = 0; + if (!tryMove(pixel, pixel.x, pixel.y+1)) { + if (pixel.animal || pixel.fall < 20) { + if (Math.random() < 0.5) { + if (!tryMove(pixel, pixel.x+1, pixel.y+1)) { + tryMove(pixel, pixel.x-1, pixel.y+1); + } + } else { + if (!tryMove(pixel, pixel.x-1, pixel.y+1)) { + tryMove(pixel, pixel.x+1, pixel.y+1); + } + } + pixel.fall = 0; + } + else if (outOfBounds(pixel.x,pixel.y+1) || (!isEmpty(pixel.x,pixel.y+1,true) && elements.egg.ignore.indexOf(pixelMap[pixel.x][pixel.y+1].element) === -1 && elements[pixelMap[pixel.x][pixel.y+1].element].state === "solid")) { + changePixel(pixel,"yolk") + } + else {pixel.fall = 0} + if (pixel.animal && pixelTicks-pixel.start >= 500 && Math.random() < 0.2) { + changePixel(pixel,pixel.animal) + } + } + else {pixel.fall ++} + if (pixel.temp < -2 || pixel.temp > 100) { + pixel.animal = null; + } + doDefaults(pixel); + }, + ignore: ["paper","sponge","straw","wheat","rat","frog","pollen","clay","snow","mud","wet_sand","tinder","feather","bread","ice_cream","dough"], + innerColor: "#ffffff", + properties: { "fall":0 }, + tempHigh: 1500, + stateHigh: ["steam","calcium","carbon_dioxide","sulfur_gas"], + breakInto: "yolk", + category: "food", + state: "solid", + density: 1031, + cooldown: defaultCooldown +} + +elements.tadpole = { + color: "#87b574", + behavior: [ + "XX|XX|M2%25 AND SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water%14", + "XX|FX%0.5|SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water%14", + "XX|M1|SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water%14", + ], + tick: function(pixel) { + if (pixel.start-pixelTicks > 500) { + OGChangePixel(pixel,"egg") + pixel.color = pixelColorPick(pixel,"#717c80") + pixel.animal = "tadpole" + } + if (pixelTicks-pixel.start > 500) { + changePixel(pixel,"frog"); + } + }, + reactions: { + "algae": { elem2:null, chance:0.25 }, + "kelp": { elem2:"water", chance:0.25 } + }, + tempHigh: 100, + stateHigh: "steam", + tempLow: -10, + stateLow: "ice", + breakInto: ["slime",null], + category:"life", + hidden: true, + state: "solid", + density: 1450, + conduct: 0.2 +} + +elements.frog = { + color: "#607300", + behavior: [ + "XX|XX|M2%3 AND SW:water,salt_water,sugar_water,dirty_water,seltzer%7", + "XX|FX%0.5|CR:slime%0.01 AND BO", + "XX|M1|XX", + ], + reactions: { + "fly": { elem2:null, chance:0.5, func:behaviors.FEEDPIXEL }, + "firefly": { elem1:"meat", elem2:null, chance:0.5 }, + "stink_bug": { elem2:null, chance:0.55, func:behaviors.FEEDPIXEL }, + "snail": { elem2:"limestone", chance:0.05, func:behaviors.FEEDPIXEL }, + "slug": { elem2:null, chance:0.2, func:behaviors.FEEDPIXEL }, + "worm": { elem2:null, chance:0.2, func:behaviors.FEEDPIXEL }, + "spider": { elem2:null, chance:0.2, func:behaviors.FEEDPIXEL }, + "algae": { elem2:null, chance:0.5, func:behaviors.FEEDPIXEL }, + "kelp": { elem2:"water", chance:0.5, func:behaviors.FEEDPIXEL }, + "oxygen": { elem2:"carbon_dioxide", chance:0.5 }, + "dead_bug": { elem2:null, chance:0.2, func:behaviors.FEEDPIXEL }, + "mercury": { elem1:"rotten_meat", chance:0.1 }, + "bleach": { elem1:"rotten_meat", chance:0.1 }, + "infection": { elem1:"rotten_meat", chance:0.025 }, + "uranium": { elem1:"rotten_meat", chance:0.1 }, + "cyanide": { elem1:"rotten_meat", chance:0.1 }, + "chlorine": { elem1:"meat", chance:0.1 }, + "alcohol": { elem1:"meat", chance:0.025 }, + "dirty_water": { elem1:"rotten_meat", chance:0.0001 }, + "pool_water": { elem1:"rotten_meat", chance:0.005 }, + "vinegar": { elem1:"rotten_meat", chance:0.001 }, + }, + tick: function(pixel) { + if (pixelTicks < pixel.start) { + OGChangePixel(pixel,"tadpole"); + } + }, + foodNeed: 10, + baby: "tadpole", + eggColor:"#717c80", + temp: 19.1, + tempHigh: 100, + stateHigh: "cooked_meat", + stateHighColor: "#CDAF96", + onStateHigh: function(pixel) { + releaseElement(pixel,"steam"); + }, + tempLow: -18, + stateLow: "frozen_frog", + category:"life", + breakInto: "slime", + burn:15, + burnTime:300, + state: "solid", + density: 1450, + conduct: 0.2 +} + +elements.fly = { + color: "#4c4e42", + behaviorOn: [ + "XX|CR:flash|XX", + "CR:flash|CH:ash|CR:flash", + "XX|CR:flash|XX", + ], + reactions: { + "dead_plant": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "meat": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "cooked_meat": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "rotten_meat": { elem2:[null,null,"ammonia"], chance:0.15, func:behaviors.FEEDPIXEL }, + "cheese": { elem2:[null,null,"ammonia"], chance:0.15, func:behaviors.FEEDPIXEL }, + "cheese_powder": { elem2:[null,null,"ammonia"], chance:0.15, func:behaviors.FEEDPIXEL }, + "rotten_cheese": { elem2:[null,null,"ammonia"], chance:0.15, func:behaviors.FEEDPIXEL }, + "vine": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "corn": { elem2:null, chance:0.05, func:behaviors.FEEDPIXEL }, + "potato": { elem2:null, chance:0.05, func:behaviors.FEEDPIXEL }, + "crumb": { elem2:null, chance:0.05, func:behaviors.FEEDPIXEL }, + "wheat": { elem2:null, chance:0.1, func:behaviors.FEEDPIXEL }, + "yeast": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "caramel": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "bread": { elem2:null, chance:0.1, func:behaviors.FEEDPIXEL }, + "sugar_water": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "honey": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL }, + "soda": { elem2:null, chance:0.15, func:behaviors.FEEDPIXEL } + }, + tick: function(pixel, onHit) { + var nx = pixel.flipX ? -1 : 1; + var ny = Math.random() < 0.5 ? -1 : 1; + var hit = false; + if (!tryMove(pixel, pixel.x+nx, pixel.y+ny)) { + if (!tryMove(pixel, pixel.x+nx, pixel.y-ny)) { + if (!tryMove(pixel, pixel.x, pixel.y+ny)) { + if (!tryMove(pixel, pixel.x, pixel.y-ny)) {hit=[pixel.x, pixel.y-ny]} + }else {hit=[pixel.x, pixel.y+ny]} + }else {hit=[pixel.x+nx, pixel.y-ny]} + }else {hit=[pixel.x+nx, pixel.y+ny]} + if (hit && onHit) { + if (!isEmpty(hit[0], hit[1], true)) { + onHit(pixel, pixelMap[hit[0]][hit[1]]); + } + else {onHit(pixel);} + } + if (pixel.del) {return} + if (!isEmpty(pixel.x+nx,pixel.y) || Math.random() < 0.02) { + pixel.flipX = !pixel.flipX; + } + if (pixel.charge && elements[pixel.element].behaviorOn) { + pixelTick(pixel) + } + doDefaults(pixel); + if (pixel.start-pixelTicks > 500) { + OGChangePixel(pixel,"egg") + pixel.animal = "fly" + } + }, + foodNeed: 15, + tempHigh: 100, + stateHigh: "ash", + tempLow: 0, + stateLow: "dead_bug", + breakInto: "dead_bug", + category:"life", + burn:95, + burnTime:25, + state: "solid", + density: 600, + conduct: 1 +} */ \ No newline at end of file