From 49f0d9edd8e76a35573f04d13a79b0ac91fef760 Mon Sep 17 00:00:00 2001
From: slweeb <91897291+slweeb@users.noreply.github.com>
Date: Mon, 1 Apr 2024 23:55:37 -0400
Subject: [PATCH] .
---
mod-list.html | 1 +
mods/fools24.js | 842 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 843 insertions(+)
create mode 100644 mods/fools24.js
diff --git a/mod-list.html b/mod-list.html
index e9283bdd..b1dcf9b1 100644
--- a/mod-list.html
+++ b/mod-list.html
@@ -110,6 +110,7 @@
devtests.js Experimental features from the Sandboxels developer R74n
edible_everything.js Allows every element to be mixed into Batter and Dough R74n
fools.js Adds back FOOLS Mode R74n
+fools24.js Adds back the 2024 Multiversal Update (v5.9.1) R74n
smooth_water.js Changes water mechanics so that it flows in one direction until it bounces off of something R74n
spring.js Many nature elements, like sakura trees, butterflies, beehives, and more R74n
survival.js With limited resources, you must craft, sell, and buy to progress R74n
diff --git a/mods/fools24.js b/mods/fools24.js
new file mode 100644
index 00000000..8a526e53
--- /dev/null
+++ b/mods/fools24.js
@@ -0,0 +1,842 @@
+/*
+[Version 5.9.1 - April 1, 2024 - Multiversal Update]
+ + Multiverse Time Travel
+ + Use Timeline controls to navigate multidimensional space
+ + Split off from your current timeline
+ + Eat tool
+ + Mirror Dimension
+ + Access by throwing a test subject into a Mirror Portal
+ + Moon
+ + Moon Rock (Hidden)
+ + Freeze tool
+ + Freeze Ray
+ + Air
+ + UFO
+ + Life Force
+ + Carbon
+ + Photon
+ + Electron
+ + BBQ Sauce
+ + Mustard
+ + Holy Grenade
+ + Ice Ten
+ + Love (Amends anuran ailments)
+ + Love Bomb
+ + Dirt Bomb
+ + Cluster Cluster Bomb
+ + Cherry
+ + Blueberry
+ + Olive
+ + Blue Cheese
+ + Toad
+ + Mouse
+ + Basketball
+ + Baseball
+ + Tennis Ball
+ + Quirky Paint
+ + Pen tool
+ + Cursor
+ + Powder
+ + Footprint
+ + Light Ice (Hidden)
+ + Big Bang (Hidden)
+ [Changes]
+ + 68% of Humans are lactose intolerant
+ + 1% of Humans are gluten intolerant
+ + Humans now drink Water
+ - Removed Gender Binary
+ + Fireflies have a distinct sound
+ + Bless converts Antimatter and Strange Matter to Normal Matter
+ + Bless removes money, the root of all evil
+ + Bless converts Plastic to eco-friendly Paper
+ + Bless converts Water to Wine
+ + Pb&J recipe
+ + Helium can freeze again
+ + Helium increases pitch of Human voice
+ - Removed Blood
+ ~ Birds have been recolored as tribute
+ ~ Udders produce many kinds of Milk
+ ~ Cheerful Mode now hides ALL weapons
+ ~ Moved Firework to Machines
+ ~ Moved Ball to Special
+ ~ Renamed Gray Goo to Grey Goo
+ ~ Renamed Molten Tin to Moltin
+ ~ Unhid Supernova
+ + Re-added Cluster Bomb
+ [Bug Fixes]
+ ~ Fixed: Water is not wet
+*/
+
+currentversion = "5.9.1"
+
+if (!elements.bless.reactions) { elements.bless.reactions = {}; }
+elements.bless.reactions.gold_coin = { elem2:null }
+elements.bless.reactions.plastic = { elem2:"paper" }
+elements.bless.reactions.bead = { elem2:"sawdust" }
+elements.bless.reactions.water = { elem2:"alcohol", color2:"#722F37" }
+
+if (!elements.lead.reactions) { elements.lead.reactions = {}; }
+elements.lead.reactions.grape = { elem1:"nut_butter", elem2:"jelly" }
+elements.lead.reactions.jelly = { elem1:"nut_butter" }
+
+elements.head.tempTick = elements.head.tick
+elements.head.tick = function(pixel) {
+ elements.head.tempTick(pixel);
+ if (!pixel.sus) { // susceptibility to disease
+ pixel.sus = Math.random();
+ }
+}
+if (!elements.head.reactions) { elements.head.reactions = {}; }
+var lactoseReaction = function(pixel) {
+ if (pixel.sus < 0.68) { changePixel(pixel,"explosion") }
+}
+var glutenReaction = function(pixel) {
+ if (pixel.sus < 0.01) { changePixel(pixel,"explosion") }
+}
+elements.head.reactions.milk = { chance:0.1, func:lactoseReaction }
+elements.head.reactions.cheese = { chance:0.1, func:lactoseReaction }
+elements.head.reactions.butter = { chance:0.1, func:lactoseReaction }
+elements.head.reactions.melted_cheese = { chance:0.1, func:lactoseReaction }
+elements.head.reactions.melted_butter = { chance:0.1, func:lactoseReaction }
+elements.head.reactions.yogurt = { chance:0.1, func:lactoseReaction }
+elements.head.reactions.ice_cream = { chance:0.1, func:lactoseReaction }
+elements.head.reactions.cream = { chance:0.1, func:lactoseReaction }
+elements.head.reactions.frozen_yogurt = { chance:0.1, func:lactoseReaction }
+elements.head.reactions.wheat = { chance:0.1, func:glutenReaction }
+elements.head.reactions.bread = { chance:0.1, func:glutenReaction }
+elements.head.reactions.toast = { chance:0.1, func:glutenReaction }
+elements.head.reactions.gingerbread = { chance:0.1, func:glutenReaction }
+elements.head.reactions.batter = { chance:0.1, func:glutenReaction }
+elements.head.reactions.flour = { chance:0.1, func:glutenReaction }
+elements.head.reactions.baked_batter = { chance:0.1, func:glutenReaction }
+elements.head.reactions.water = { elem2:null, chance:0.1 }
+elements.head.reactions.sugar_water = { elem2:null, chance:0.1 }
+elements.head.reactions.seltzer = { elem2:null, chance:0.1 }
+elements.body.color = "#069469";
+
+elements.firework.category = "machines";
+
+elements.normal_matter = {
+ color: "#9ba89b",
+ behavior: [
+ "M2|M2|M2",
+ "M1|XX|M1",
+ "M1|M1|M1",
+ ],
+ category: "special",
+ state: "gas",
+ density: 2.1,
+ hidden: true
+};
+elements.bless.reactions.antimatter = { elem2:"normal_matter" }
+elements.bless.reactions.strange_matter = { elem2:"normal_matter" }
+
+elements.ice_ten = {
+ color: ["#84d0ff","#85daff","#80ffff"],
+ behavior: [
+ "XX|XX|XX",
+ "XX|CH:ice%0.5|XX",
+ "M2|M1|M2",
+ ],
+ reactions: {
+ "ice_ten": { func:function(pixel1,pixel2){
+ var pixels = currentPixels.slice();
+ for (var i = 0; i < pixels.length; i++) {
+ var pixel = pixels[i];
+ pixel.temp = -10000;
+ pixelTempCheck(pixel);
+ }
+ }, elem1:null, elem2:null },
+ },
+ temp:-100,
+ category: "special",
+ state: "solid",
+ density: 917,
+ excludeRandom: true
+};
+
+elements.gray_goo.name = "grey_goo";
+
+elements.big_bang = {
+ color: ["#ffebeb","#ffc9c9","#ffabab"],
+ behavior: [
+ "XX|XX|XX",
+ "XX|EX:200>hydrogen,neutron,proton,electric AND CH:void|XX",
+ "XX|XX|XX",
+ ],
+ temp: 1000000000000000,
+ category: "energy",
+ state: "gas",
+ density: 1000,
+ hardness: 1,
+ hidden: true,
+ excludeRandom: true,
+ maxSize: 1,
+ cooldown: defaultCooldown,
+ noMix: true
+};
+
+elements.blood.name = "life_force";
+elements.blood.color = ["#99ff00","#d9ff00"];
+delete elements.blood_ice.color;
+elements.blood_ice.name = "life_force_ice";
+
+elements.holy_grenade = {
+ color: "#fffd6a",
+ behavior: [
+ "XX|EX:10>bless|XX",
+ "XX|XX|XX",
+ "M2|M1 AND EX:10>bless|M2",
+ ],
+ category: "weapons",
+ state: "solid",
+ density: 1300,
+ excludeRandom: true,
+ cooldown: defaultCooldown
+}
+
+elements.love = {
+ color: ["#fccbff","#ff9edf","#ff5cb6"],
+ behavior: [
+ "M2|M1|M2",
+ "M1|DL%25|M1",
+ "M2|M1|M2",
+ ],
+ temp:20,
+ state: "gas",
+ density: 0.001,
+ canPlace: true,
+ category: "energy",
+ stain: -0.5
+};
+elements.love.reactions = elements.bless.reactions;
+elements.love.tool = elements.bless.tool;
+if (!elements.frog.reactions) { elements.frog.reactions = {}; }
+elements.frog.reactions.love = { elem1:"human" }
+if (!elements.bomb.reactions) { elements.bomb.reactions = {}; }
+elements.bomb.reactions.love = { elem1:"love_bomb" }
+if (!elements.grenade.reactions) { elements.grenade.reactions = {}; }
+elements.grenade.reactions.love = { elem1:"love_bomb" }
+
+elements.love_bomb = {
+ color: "#ff84f1",
+ behavior: [
+ "XX|EX:10>love|XX",
+ "XX|XX|XX",
+ "M2|M1 AND EX:10>love|M2",
+ ],
+ category: "weapons",
+ state: "solid",
+ density: 1300,
+ excludeRandom: true,
+ cooldown: defaultCooldown
+}
+elements.dirt_bomb = {
+ color: "#694805",
+ behavior: [
+ "XX|EX:10>dirt|XX",
+ "XX|XX|XX",
+ "M2|M1 AND EX:10>dirt|M2",
+ ],
+ category: "weapons",
+ state: "solid",
+ density: 1300,
+ excludeRandom: true,
+ cooldown: defaultCooldown
+}
+
+elements.cluster_bomb = {
+ color: "#7d776d",
+ behavior: [
+ "XX|EX:10>smoke,smoke,smoke,smoke,smoke,grenade%1|XX",
+ "XX|XX|XX",
+ "M2|M1 AND EX:10>smoke,smoke,smoke,smoke,smoke,grenade%1|M2",
+ ],
+ category: "weapons",
+ state: "solid",
+ density: 1300,
+ tempHigh: 1455.5,
+ stateHigh: "molten_steel",
+ excludeRandom: true,
+ cooldown: defaultCooldown
+}
+elements.cluster_cluster_bomb = {
+ color: "#c1b7a5",
+ behavior: [
+ "XX|EX:10>smoke,smoke,smoke,smoke,smoke,cluster_bomb%1|XX",
+ "XX|XX|XX",
+ "M2|M1 AND EX:10>smoke,smoke,smoke,smoke,smoke,cluster_bomb%1|M2",
+ ],
+ category: "weapons",
+ state: "solid",
+ density: 1300,
+ tempHigh: 1455.5,
+ stateHigh: "molten_steel",
+ excludeRandom: true,
+ cooldown: defaultCooldown
+}
+
+elements.bbq_sauce = {
+ color: "#571E1A",
+ behavior: behaviors.LIQUID,
+ viscosity: 50000,
+ tempHigh: 260,
+ stateHigh: ["carbon_dioxide","methane","steam","salt","sugar"],
+ category:"liquids",
+ state: "liquid",
+ density: 1235,
+ stain: 0.05,
+ isFood: true
+}
+if (!elements.ketchup.reactions) { elements.ketchup.reactions = {}; }
+elements.ketchup.reactions.molasses = { elem1:"bbq_sauce", elem2:"bbq_sauce" }
+
+elements.mustard = {
+ color: "#e1ad01",
+ behavior: behaviors.LIQUID,
+ viscosity: 50000,
+ tempHigh: 260,
+ stateHigh: ["carbon_dioxide","methane","steam","sugar"],
+ category:"liquids",
+ state: "liquid",
+ density: 1235,
+ stain: 0.05,
+ isFood: true
+}
+
+elements.cherry = {
+ color: ["#ff295b","#ff212c","#ff1f1f","#ff4e33"],
+ behavior: behaviors.POWDER,
+ reactions: {
+ "rock": { elem1:"juice", chance:0.1, color1:"#8e0000" },
+ "concrete": { elem1:"juice", chance:0.1, color1:"#8e0000" },
+ "basalt": { elem1:"juice", chance:0.1, color1:"#8e0000" },
+ "limestone": { elem1:"juice", chance:0.1, color1:"#8e0000" },
+ "tuff": { elem1:"juice", chance:0.1, color1:"#8e0000" },
+ "water": { elem2:"juice", chance:0.005, color2:"#8e0000" },
+ "sugar_water": { elem2:"juice", chance:0.025, color2:"#8e0000" },
+ "acid": { elem1:"juice", color1:"#8e0000" },
+ "acid_gas": { elem1:"juice", color1:"#8e0000" },
+ },
+ tempHigh: 256,
+ stateHigh: ["steam","sugar"],
+ category: "food",
+ state: "solid",
+ density: 1154,
+ breakInto: "juice",
+ breakIntoColor: "#8e0000",
+ ignoreAir: true,
+ isFood: true
+}
+elements.blueberry = {
+ color: ["#4929ff","#5821ff","#221cc8","#2406a0"],
+ behavior: behaviors.POWDER,
+ reactions: {
+ "rock": { elem1:"juice", chance:0.1, color1:"#1b1259" },
+ "concrete": { elem1:"juice", chance:0.1, color1:"#1b1259" },
+ "basalt": { elem1:"juice", chance:0.1, color1:"#1b1259" },
+ "limestone": { elem1:"juice", chance:0.1, color1:"#1b1259" },
+ "tuff": { elem1:"juice", chance:0.1, color1:"#1b1259" },
+ "water": { elem2:"juice", chance:0.005, color2:"#1b1259" },
+ "sugar_water": { elem2:"juice", chance:0.025, color2:"#1b1259" },
+ "acid": { elem1:"juice", color1:"#1b1259" },
+ "acid_gas": { elem1:"juice", color1:"#1b1259" },
+ },
+ tempHigh: 256,
+ stateHigh: ["steam","sugar"],
+ category: "food",
+ state: "solid",
+ density: 1154,
+ breakInto: "juice",
+ breakIntoColor: "#1b1259",
+ ignoreAir: true,
+ isFood: true
+}
+elements.olive = {
+ color: ["#808000","#91912c","#a1a148","#686800"],
+ behavior: behaviors.POWDER,
+ reactions: {
+ "rock": { elem1:"juice", chance:0.1, color1:"#ebeb55" },
+ "concrete": { elem1:"juice", chance:0.1, color1:"#ebeb55" },
+ "basalt": { elem1:"juice", chance:0.1, color1:"#ebeb55" },
+ "limestone": { elem1:"juice", chance:0.1, color1:"#ebeb55" },
+ "tuff": { elem1:"juice", chance:0.1, color1:"#ebeb55" },
+ "water": { elem2:"juice", chance:0.005, color2:"#ebeb55" },
+ "sugar_water": { elem2:"juice", chance:0.025, color2:"#ebeb55" },
+ "acid": { elem1:"juice", color1:"#ebeb55" },
+ "acid_gas": { elem1:"juice", color1:"#ebeb55" },
+ },
+ tempHigh: 256,
+ stateHigh: ["steam","sugar"],
+ category: "food",
+ state: "solid",
+ density: 1154,
+ breakInto: "juice",
+ breakIntoColor: "#ebeb55",
+ ignoreAir: true,
+ isFood: true
+}
+
+elements.carbon = elements.charcoal;
+elements.photon = elements.light;
+elements.electron = elements.electric;
+
+elements.blue_cheese = {
+ color: "#0352fc",
+ behavior: behaviors.STURDYPOWDER,
+ tempHigh: 54,
+ stateHigh: "melted_cheese",
+ category: "food",
+ state: "solid",
+ density: 477.62,
+ isFood: true
+};
+if (elements.cheese.reactions) { elements.blue_cheese.reactions = elements.cheese.reactions; }
+
+elements.moon = {
+ color: ["#b9b9b9","#8e8e8e","#b9b9b9"],
+ behavior: behaviors.WALL,
+ tempHigh: 100,
+ stateHigh: "melted_cheese",
+ category: "special",
+ state: "solid",
+ density: 3300,
+ insulate: true,
+ noMix: true,
+ alias: "satellite",
+ movable: false,
+ hardness: 0.8,
+ breakInto: "moon_rock"
+};
+if (!elements.light.reactions) { elements.light.reactions = {}; }
+elements.light.reactions.moon = { color1:"#ffffff" }
+elements.light.reactions.moon_rock = { color1:"#ffffff" }
+
+elements.moon_rock = {
+ color: ["#b9b9b9","#a3a3a3","#898989"],
+ behavior: behaviors.POWDER,
+ tempHigh: 100,
+ stateHigh: "melted_cheese",
+ category: "land",
+ state: "solid",
+ density: 3300,
+ hardness: 0.25,
+ breakInto: "dust",
+ hidden: true,
+ alias: "lunar_rock"
+};
+if (elements.rock.reactions) { elements.moon_rock.reactions = elements.rock.reactions; }
+
+elements.toad = elements.frog;
+
+elements.mouse = {
+ color: ["#aaaaaa","#8a8a8a","#cdcdcd"],
+ behavior: [
+ "XX|M2%1.5|M2%5",
+ "XX|FX%2|M2 AND BO",
+ "XX|M1|M2",
+ ],
+ egg: "mouse",
+ category: "life",
+ temp: 37.6,
+ tempHigh: 120,
+ stateHigh: "cooked_meat",
+ tempLow: -18,
+ stateLow: "frozen_meat",
+ breakInto: "blood",
+ burn:80,
+ burnTime:150,
+ state: "solid",
+ density: 1450,
+ conduct: 0.25
+};
+elements.bless.reactions.rat = { elem2:"mouse" }
+
+elements.ball.hidden = false;
+elements.basketball = {
+ color: "#d14b17",
+ behavior: [
+ "XX|XX|XX",
+ "XX|FY:0%5|XX",
+ "XX|M1 AND BO|XX",
+ ],
+ tempHigh: 250,
+ stateHigh: "molten_plastic",
+ category: "special",
+ flipY: false,
+ flippableY: true,
+};
+elements.baseball = {
+ color: "#d7d7d7",
+ behavior: [
+ "XX|XX|XX",
+ "XX|FY:0%5|XX",
+ "XX|M1 AND BO|XX",
+ ],
+ tempHigh: 250,
+ stateHigh: "molten_plastic",
+ category: "special",
+ flipY: false,
+ flippableY: true,
+};
+elements.tennis_ball = {
+ color: "#c2ff48",
+ behavior: [
+ "XX|XX|XX",
+ "XX|FY:0%5|XX",
+ "XX|M1 AND BO|XX",
+ ],
+ tempHigh: 250,
+ stateHigh: "molten_plastic",
+ category: "special",
+ flipY: false,
+ flippableY: true,
+};
+
+elements.supernova.hidden = false;
+
+elements.quirky_paint = {
+ color: ["#b1b1b1","#9dc270","#c170c2","#107f10","#442f21","#ff6e6e","#34555f"],
+ tool: function(pixel) {
+ var hexcode = "#"+(Math.floor(Math.random()*16777215).toString(16).padStart(6,"0"));
+ pixel.color = pixelColorPick(pixel,hexcode);
+ delete pixel.origColor;
+ },
+ category: "special",
+ canPlace: false,
+ desc: "Use on pixels to change color randomly."
+};
+
+elements.bird.color = "#1DA1F2";
+
+elements.freeze = {
+ color: ["#b1e5ff","#6e89ec"],
+ tool: function(pixel) {
+ pixel.temp -= 1000;
+ pixelTempCheck(pixel);
+ },
+ category: "energy",
+ excludeRandom: true
+};
+
+elements.freeze_ray = {
+ color: ["#00aaff","#0037ff"],
+ tick: function(pixel) {
+ var x = pixel.x;
+ for (var y = pixel.y; y < height; y++) {
+ if (outOfBounds(x, y)) {
+ break;
+ }
+ if (isEmpty(x, y)) {
+ if (Math.random() > 0.05) { continue }
+ createPixel("flash", x, y);
+ pixelMap[x][y].color = "#00aaff";
+ pixelMap[x][y].temp = -200;
+ }
+ else {
+ if (elements[pixelMap[x][y].element].isGas) { continue }
+ if (elements[pixelMap[x][y].element].id === elements.heat_ray.id) { break }
+ pixelMap[x][y].temp -= 100;
+ pixelTempCheck(pixelMap[x][y]);
+ break;
+ }
+ }
+ deletePixel(pixel.x, pixel.y);
+ },
+ temp: -200,
+ category: "energy",
+ state: "gas",
+ density: 1,
+ excludeRandom: true,
+ noMix: true
+};
+
+elements.ufo = {
+ color: "#9ddfa3",
+ behavior: [
+ "XX|XX|XX",
+ "XX|FX%5|M1%50",
+ "XX|XX|XX"
+ ],
+ tick: function(pixel) {
+ if (pixel.ray) {
+ if (isEmpty(pixel.x,pixel.y+1)) {
+ createPixel(pixel.ray,pixel.x,pixel.y+1);
+ }
+ if (Math.random() < 0.1) {
+ pixel.ray = null;
+ }
+ }
+ else if (Math.random() < 0.1) {
+ var rays = ["heat_ray","freeze_ray","god_ray"];
+ pixel.ray = rays[Math.floor(Math.random()*rays.length)];
+ }
+ },
+ breakInto: ["metal_scrap","slime"],
+ category: "special"
+};
+
+elements.udder.tick = function(pixel) {
+ if (Math.random() <= 0.025 && isEmpty(pixel.x,pixel.y+1)) {
+ var milks = ["milk","pilk","chocolate_milk","fruit_milk","eggnog"];
+ var milk = milks[Math.floor(Math.random()*milks.length)];
+ createPixel(milk,pixel.x,pixel.y+1);
+ pixelMap[pixel.x][pixel.y+1].temp = 38;
+ }
+ doDefaults(pixel);
+};
+
+elements.liquid_light.tempLow = -1000;
+elements.liquid_light.stateLowName = "light_ice";
+elements.light_ice = {
+ behavior: behaviors.WALL,
+ state: "solid",
+}
+
+fireflySound = null;
+elements.firefly.onSelect = function() {
+ fireflySound = new Audio("https://archive.org/download/09Fireflies/09%20Fireflies.mp3");
+}
+elements.firefly.onMouseDown = function() {
+ if (fireflySound) { fireflySound.play(); }
+}
+
+elements.pen = {
+ color: "#000000",
+ tool: function(pixel) {
+ if (pixel.element === "paper") {
+ pixel.color = pixelColorPick(pixel,"#000000");
+ }
+ },
+ category: "special",
+ desc: "Draws on Paper."
+}
+elements.eat = {
+ color: ["#ffba79","#efff79"],
+ tool: function(pixel) {
+ if (elements[pixel.element].isFood) {
+ deletePixel(pixel.x,pixel.y);
+ }
+ },
+ category: "tools",
+ desc: "Consumes edible pixels."
+}
+
+elements.molten_tin.name = "moltin";
+
+elements.ball.category = "energy";
+
+elements.liquid_helium.tempLow = -272;
+
+elements.cursor = {
+ color: ["#000000","#00ff00"],
+ behavior: behaviors.WALL,
+ tick: function(pixel) {
+ if (pixelTicks % 60 < 30) {
+ pixel.color = "#000000";
+ }
+ else {
+ pixel.color = "#00ff00";
+ }
+ },
+ category: "special",
+ related: "pointer"
+}
+elements.pointer.related = "cursor";
+
+elements.footprint = {
+ color: ["#73777A","#B3B7BA","#F3F7FA"],
+ colorPattern: [
+ "00000001",
+ "01111112",
+ "01111112",
+ "01111112",
+ "01111112",
+ "01111112",
+ "01111112",
+ "12222222",
+ ],
+ colorKey: {
+ "0": "#73777A",
+ "1": "#B3B7BA",
+ "2": "#F3F7FA",
+ },
+ behavior: behaviors.WALL,
+ category: "special"
+}
+
+elements.air = {
+ color: "#000000",
+ tool: function(){},
+ category: "gases"
+}
+
+elements.powder = {
+ color: "#ffffff",
+ colorPattern: ["F"],
+ colorKey: { "F": "#ffffff" },
+ behavior: behaviors.POWDER,
+ category: "powders",
+ state: "solid",
+}
+
+inMirrorDimension = false;
+function getMousePos(canvas, evt) {
+ // If evt.touches is defined, use the first touch
+ if (evt.touches) {
+ evt.preventDefault();
+ evt = evt.touches[0];
+ isMobile = true;
+ }
+ var rect = canvas.getBoundingClientRect();
+ return {
+ // Round to nearest pixel
+ x: Math.round((evt.clientX - rect.left)/pixelSize-0.5),
+ y: Math.round((evt.clientY - rect.top)/pixelSize-0.5)
+ };
+}
+oldGetMousePos = getMousePos;
+elements.mirror_portal = {
+ color: ["#e07aff","#693778","#4b2843","#1f0f1b"],
+ behavior: [
+ "XX|SW:mirror_portal%10|XX",
+ "SW:mirror_portal%10|XX|SW:mirror_portal%10",
+ "XX|SW:mirror_portal%10|XX"
+ ],
+ category: "special",
+ reactions: {
+ "body": {
+ func: function() {
+ if (!inMirrorDimension) {
+ inMirrorDimension = true;
+ for (var i = 0; i < currentPixels.length; i++) {
+ var pixel = currentPixels[i];
+ if (pixel.element === "mirror_portal") {
+ deletePixel(pixel.x,pixel.y);
+ i--;
+ }
+ }
+ document.head.insertAdjacentHTML("beforeend",`
+
+ `);
+ // invert the math in getMousePos
+ getMousePos = function(canvas, evt) {
+ if (evt.touches) {
+ evt.preventDefault();
+ evt = evt.touches[0];
+ isMobile = true;
+ }
+ var rect = canvas.getBoundingClientRect();
+ return {
+ x: Math.round((rect.right - evt.clientX)/pixelSize-0.5),
+ y: Math.round((rect.bottom - evt.clientY)/pixelSize-0.5)
+ };
+ }
+ }
+ else {
+ inMirrorDimension = false;
+ document.getElementById("mirrorDimensionStyle").remove();
+ for (var i = 0; i < currentPixels.length; i++) {
+ var pixel = currentPixels[i];
+ if (pixel.element === "mirror_portal") {
+ deletePixel(pixel.x,pixel.y);
+ i--;
+ }
+ }
+ getMousePos = oldGetMousePos;
+ }
+ },
+ }
+ },
+}
+
+for (var element in elements) {
+ var info = elements[element];
+ if (info.category === "weapons") {
+ info.nocheer = true
+ }
+}
+
+multiverseTimelines = [];
+multiverseIndex = 0;
+
+function saveTimeline() {
+ // save at current index
+ multiverseTimelines[multiverseIndex] = generateSave(undefined,{keep:["temp","color"]});
+}
+function splitTimeline() {
+ saveTimeline();
+ var newSave = generateSave(undefined,{keep:["temp","color"]});
+ // add new timeline one after current
+ multiverseTimelines.splice(multiverseIndex+1,0,newSave);
+ loadTimeline(multiverseIndex+1);
+}
+function newTimeline() {
+ // add new timeline at end
+ saveTimeline();
+ clearAll();
+ multiverseIndex = multiverseTimelines.length;
+ saveTimeline();
+ loadTimeline(multiverseIndex);
+}
+function loadTimeline(i) {
+ multiverseIndex = i;
+ loadSave(multiverseTimelines[i]);
+ document.getElementById("timelineIndex").textContent = i;
+}
+function nextTimeline() {
+ saveTimeline();
+ if (multiverseIndex === multiverseTimelines.length-1) {
+ newTimeline();
+ return
+ }
+ loadTimeline(multiverseIndex+1);
+}
+function prevTimeline() {
+ saveTimeline();
+ if (multiverseIndex === 0) {
+ return
+ }
+ loadTimeline(multiverseIndex-1);
+}
+function redoTimeline() {
+ loadTimeline(multiverseIndex);
+}
+function deleteTimeline() {
+ multiverseTimelines.splice(multiverseIndex,1);
+ if (multiverseIndex === multiverseTimelines.length) {
+ multiverseIndex--;
+ }
+ if (multiverseTimelines.length < 1) {
+ newTimeline();
+ }
+ loadTimeline(multiverseIndex);
+}
+
+window.addEventListener("load", function() {
+ absoluteZero = -Infinity;
+ this.document.getElementById("elementControls").insertAdjacentHTML("afterend",`
+
+Return to Normalcy
+
+ `);
+ this.document.getElementById("elementControls").insertAdjacentHTML("afterend",`
+
+Timeline-0 :Split New < > Redo Delete
+
+ `);
+ this.document.getElementById("thanksTo").insertAdjacentHTML("beforeend",`, and the friends we made along the way`);
+})
+window.addEventListener("keydown", function(e) {
+ if (e.ctrlKey || e.metaKey) {
+ return
+ }
+})
\ No newline at end of file