diff --git a/gravity.js b/gravity.js
new file mode 100644
index 00000000..da48e66c
--- /dev/null
+++ b/gravity.js
@@ -0,0 +1,40 @@
+elements.gravity_point = {
+ color: "#FFD700", // Goudkleurig
+ behavior: behaviors.STURDYPOWDER,
+ category: "special",
+ state: "solid",
+ density: 5000,
+ max_gravity_distance: 100, // Bereik van zwaartekracht
+ gravity_strength: 1, // Kracht van zwaartekracht
+
+ tick: function(pixel) {
+ for (var x = -pixel.max_gravity_distance; x <= pixel.max_gravity_distance; x++) {
+ for (var y = -pixel.max_gravity_distance; y <= pixel.max_gravity_distance; y++) {
+ var nx = pixel.x + x;
+ var ny = pixel.y + y;
+
+ if (!isEmpty(nx, ny, true)) {
+ var npixel = pixelMap[nx][ny];
+
+ if (npixel && npixel.element !== "gravity_point") {
+ var dx = nx - pixel.x;
+ var dy = ny - pixel.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+
+ if (distance < 1) distance = 1; // Voorkom delen door 0
+ if (distance <= pixel.max_gravity_distance) {
+ var force = (pixel.gravity_strength * 100) / (distance * distance);
+ var angle = Math.atan2(dy, dx);
+ var vx = -Math.cos(angle) * force;
+ var vy = -Math.sin(angle) * force;
+
+ // Voeg snelheid toe aan objecten
+ npixel.vx = (npixel.vx || 0) + vx;
+ npixel.vy = (npixel.vy || 0) + vy;
+ }
+ }
+ }
+ }
+ }
+ }
+};
diff --git a/mod-list.html b/mod-list.html
index 96137945..c41e32cc 100644
--- a/mod-list.html
+++ b/mod-list.html
@@ -160,6 +160,7 @@
| extra_element_info.js | Adds descriptions to various vanilla elements. Used to provide the functionality that desc now does before it was added to vanilla | Melecie |
| extrasaveslots.js | Adds extra saves slots !SAVE IMPORTANT SAVES AS FILES! | Jayd |
| find.js | Adds a find mode that highlights a chosen element as pulsating red and yellow (read commit description) | Alice |
+| hideandshowtools.js | Adds two tools, one that hides elements, and one that shows hidden elements | MicaelNotUsed |
| human_friendly_design.js | Makes the drag and mix tools not kill humans. | Nekonico |
| insane_random_events.js | Massively buffs random events | Alice |
| jaydsfunctions.js | Adds extra tools | Jayd |
diff --git a/mods/cookie_clicker.js b/mods/cookie_clicker.js
new file mode 100644
index 00000000..6e2e8b12
--- /dev/null
+++ b/mods/cookie_clicker.js
@@ -0,0 +1,943 @@
+// by Nekonico
+
+elements.cookie_dough = {
+ color: ["#bfac91","#CDBFAB",],
+ behavior: behaviors.STURDYPOWDER,
+ reactions: {
+ "chocolate": { elem1:"chocolate_chip_cookie_dough", elem2:null, chance: 0.5 },
+ "chocolate_powder": { elem1:"chocolate_chip_cookie_dough", elem2:null, chance: 0.5 },
+ },
+ category: "food",
+ tempHigh: 74,
+ stateHigh: "plain_cookie",
+ burn:40,
+ burnTime:25,
+ burnInto:"ash",
+ state: "solid",
+ density: 526.9,
+ isFood: true,
+ cookievalue: 0.5
+}
+
+elements.chocolate_chip_cookie_dough = {
+ color: ["#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#4d2818","#3b1b0d","#33160a"],
+ behavior: behaviors.STURDYPOWDER,
+ category: "food",
+ tempHigh: 74,
+ stateHigh: "cookie",
+ burn:40,
+ burnTime:25,
+ burnInto:"ash",
+ state: "solid",
+ density: 526.9,
+ isFood: true,
+ cookievalue: 0.5
+}
+
+clicked = false
+shopclicked = false
+cookies = 0
+oldcookies = 0
+createdcookies = 0
+/*
+CpS = 0
+mouseEff = 1 */
+buildings = { "cursors": [0,15,15], "grandmas": [0,100,100], "farms": [0,1100,1100], }
+shopitem = "cursors"
+/*
+shopupgrade = 0
+boughtUpgrades = { "cursors": [], "grandmas": [], "farms": [], } */
+cursorCount = []
+grandmaCount = []
+farmCount = []
+cursorprice = buildings.cursors[1]
+grandmaprice = buildings.grandmas[1]
+farmprice = buildings.farms[1]
+
+
+elements.plain_cookie = {
+ color: ["#C4966C","#C0946B"],
+ behavior: behaviors.POWDER,
+ reactions: {
+ "chocolate": { elem1:"cookie", elem2:null, chance: 0.25 },
+ "chocolate_powder": { elem1:"cookie", elem2:null, chance: 0.25 },
+ },
+ tempHigh: 192,
+ stateHigh: "toast",
+ category: "food",
+ burn: 10,
+ burnTime: 200,
+ burnInto: "toast",
+ breakInto: "crumb",
+ breakIntoColor: ["#c8946a","#c08655","#ba7a45","#a86d3e"],
+ state: "solid",
+ density: 233.96,
+ isFood: true,
+ cookievalue: 1
+}
+
+elements.cookie = {
+ color: ["#C4966C","#C0946B","#C4966C","#C0946B","#C4966C","#C0946B","#C4966C","#C0946B","#C4966C","#C0946B","#4d2818","#3b1b0d","#33160a"],
+ behavior: behaviors.POWDER,
+ tick: function(pixel) {
+ var top = mousePos.y - Math.floor(mouseSize/2);
+ var bottom = mousePos.y + Math.floor(mouseSize/2);
+ var left = mousePos.x - Math.floor(mouseSize/2);
+ var right = mousePos.x + Math.floor(mouseSize/2);
+ if ((pixel.x >= left && pixel.x <= right && pixel.y >= top && pixel.y <= bottom) && mouseIsDown === true && clicked === false) {
+ clicked = true
+ cookies += 1
+ }
+ else if ((pixel.x >= left && pixel.x <= right && pixel.y >= top && pixel.y <= bottom) && mouseIsDown !== true && clicked === true) {
+ clicked = false
+ }
+ doDefaults(pixel);
+ },
+ tempHigh: 95,
+ stateHigh: ["melted_chocolate","plain_cookie","plain_cookie"],
+ category: "food",
+ burn: 10,
+ burnTime: 200,
+ burnInto: ["melted_chocolate","plain_cookie","plain_cookie"],
+ breakInto: ["crumb","crumb","crumb","crumb","crumb","chocolate","chocolate_powder"],
+ breakIntoColor: ["#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#4d2818","#3b1b0d","#33160a"],
+ state: "solid",
+ density: 233.96,
+ isFood: true,
+ cookievalue: 1
+}
+
+elements.the_cookie = {
+ color: ["#C4966C","#C0946B","#C4966C","#C0946B","#C4966C","#C0946B","#C4966C","#C0946B","#C4966C","#C0946B","#4d2818","#3b1b0d","#33160a"],
+ colorKey: {
+ "l": "#C4966C",
+ "r": "#C0946B",
+ "d": "#4d2818",
+ "w": "#3b1b0d",
+ "b": "#33160a",
+ },
+ colorPattern: [
+ "rlrlrlrlrlrlrlrlrlr",
+ "rlrlrlrlrlrlrlrlrlr",
+ "rlrldlrlrlrlrlrlrlr",
+ "rlrlrwblrlrlrlrlrlr",
+ "rlrlrlrlrlrlwbrlrlr",
+ "rlrlddwlrlrlddwlrlr",
+ "rlrlwddbrlrbrlrlrlr",
+ "rlrldbdwrlrlrlrlrlr",
+ "rlrlrdwrrlrlrlrlrlr",
+ "rlrlrlrlrlrlrlblrlr",
+ "rlwlrlrlrlrlwdwlrlr",
+ "rlrlwlrlrlrlrlrlrlr",
+ "rlbwblrlrlrlrlrlrlr",
+ "rldlblrlrlrlrlrlrlr",
+ "rlrlrlrlbwrlrlrlrlr",
+ "rlrlrlrlwbdlrlrlrlr",
+ "rlrlrlrlrdrlrlrlrlr",
+ "rlrlrlrlrlrlrlrlrlr",
+ "rlrlrlrlrlrlrlrlrlr",
+ ],
+ behavior: behaviors.WALL,
+ tick: function(pixel) {
+ var top = mousePos.y - Math.floor(mouseSize/2);
+ var bottom = mousePos.y + Math.floor(mouseSize/2);
+ var left = mousePos.x - Math.floor(mouseSize/2);
+ var right = mousePos.x + Math.floor(mouseSize/2);
+ if ((pixel.x >= left && pixel.x <= right && pixel.y >= top && pixel.y <= bottom) && mouseIsDown === true && clicked === false) {
+ clicked = true
+ cookies += 1
+ }
+ else if ((pixel.x >= left && pixel.x <= right && pixel.y >= top && pixel.y <= bottom) && mouseIsDown !== true && clicked === true) {
+ clicked = false
+ }
+ doDefaults(pixel);
+ },
+ tempHigh: 95,
+ stateHigh: ["melted_chocolate","plain_cookie","plain_cookie"],
+ category: "clicker",
+ burn: 10,
+ burnTime: 200,
+ burnInto: ["melted_chocolate","plain_cookie","plain_cookie"],
+ breakInto: ["crumb","crumb","crumb","crumb","crumb","chocolate","chocolate_powder"],
+ breakIntoColor: ["#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#4d2818","#3b1b0d","#33160a"],
+ state: "solid",
+ density: 233.96,
+ isFood: true,
+ movable: false,
+}
+ /*
+elements.upgrade_shop = {
+ color: "#9C998B",
+ behavior: behaviors.WALL,
+ onSelect: function() {
+ var answer5 = prompt("Input the desired upgrade of this shop. It will not work if you place multiple upgrade shops while paused.",(shopupgrade||"cursors"));
+ if (!answer5) { return }
+ shopupgrade = (answer5);
+ var answer4 = prompt("Input the desired item of this shop. It will not work if you place multiple shop items while paused.",(shopitem||"cursors"));
+ if (!answer4) { return }
+ shopitem = (answer4);
+ },
+ tick: function(pixel) {
+ if (pixel.start < pixelTicks && !pixel.upgrade) {
+ pixel.upgrade = shopupgrade
+ }
+ if (pixel.start < pixelTicks && !pixel.item) {
+ pixel.item = shopitem
+ }
+ if (boughtUpgrades[pixel.item].indexOf(pixel.upgrade) !== -1 && pixel.upgrade <= 3) {
+ pixel.upgrade += 1
+ }
+ if ((cursorprice != buildings.cursors[1] || !cursorprice) || (grandmaprice != buildings.grandmas[1] || !grandmaprice) || (farmprice != buildings.farms[1])) {
+ cursorprice = Math.floor(buildings.cursors[1])
+ grandmaprice = Math.floor(buildings.grandmas[1])
+ farmprice = Math.floor(buildings.farms[1])
+ }
+ var top = mousePos.y - Math.floor(mouseSize/2);
+ var bottom = mousePos.y + Math.floor(mouseSize/2);
+ var left = mousePos.x - Math.floor(mouseSize/2);
+ var right = mousePos.x + Math.floor(mouseSize/2);
+ if ((pixel.x >= left && pixel.x <= right && pixel.y >= top && pixel.y <= bottom) && mouseIsDown === true && shopclicked === false && cookies >= (Math.floor(buildings[pixel.item][1]))) {
+ shopclicked = true
+ buildings[pixel.item][0] += 1
+ cookies -= (Math.round(buildings[pixel.item][1]))
+ buildings[pixel.item][1] = (buildings[pixel.item][2] * (1.15 ** buildings[pixel.item][0]))
+ }
+ else if ((pixel.x >= left && pixel.x <= right && pixel.y >= top && pixel.y <= bottom) && mouseIsDown === true && shopclicked === false) {
+ shopclicked = true
+ }
+ else if ((pixel.x >= left && pixel.x <= right && pixel.y >= top && pixel.y <= bottom) && mouseIsDown !== true && shopclicked === true) {
+ shopclicked = false
+ }
+ doDefaults(pixel);
+ },
+ tempHigh: 95,
+ stateHigh: ["melted_chocolate","plain_cookie","plain_cookie"],
+ category: "clicker",
+ burn: 10,
+ burnTime: 200,
+ burnInto: ["melted_chocolate","plain_cookie","plain_cookie"],
+ breakInto: ["crumb","crumb","crumb","crumb","crumb","chocolate","chocolate_powder"],
+ breakIntoColor: ["#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#4d2818","#3b1b0d","#33160a"],
+ state: "solid",
+ density: 233.96,
+ isFood: true,
+ movable: false,
+} */
+
+elements.shop = {
+ color: "#9C998B",
+ behavior: behaviors.WALL,
+ onSelect: function() {
+ var answer5 = prompt("Input the desired item of this shop. It will not work if you place multiple shop items while paused.",(shopitem||"cursors"));
+ if (!answer5) { return }
+ shopitem = (answer5);
+ },
+ tick: function(pixel) {
+ if (pixel.start < pixelTicks && !pixel.item) {
+ pixel.item = shopitem
+ }
+ if ((cursorprice != buildings.cursors[1] || !cursorprice) || (grandmaprice != buildings.grandmas[1] || !grandmaprice) || (farmprice != buildings.farms[1])) {
+ cursorprice = Math.floor(buildings.cursors[1])
+ grandmaprice = Math.floor(buildings.grandmas[1])
+ farmprice = Math.floor(buildings.farms[1])
+ }
+ var top = mousePos.y - Math.floor(mouseSize/2);
+ var bottom = mousePos.y + Math.floor(mouseSize/2);
+ var left = mousePos.x - Math.floor(mouseSize/2);
+ var right = mousePos.x + Math.floor(mouseSize/2);
+ if ((pixel.x >= left && pixel.x <= right && pixel.y >= top && pixel.y <= bottom) && mouseIsDown === true && shopclicked === false && cookies >= (Math.floor(buildings[pixel.item][1]))) {
+ shopclicked = true
+ buildings[pixel.item][0] += 1
+ cookies -= (Math.round(buildings[pixel.item][1]))
+ buildings[pixel.item][1] = (buildings[pixel.item][2] * (1.15 ** buildings[pixel.item][0]))
+ }
+ else if ((pixel.x >= left && pixel.x <= right && pixel.y >= top && pixel.y <= bottom) && mouseIsDown === true && shopclicked === false) {
+ shopclicked = true
+ }
+ else if ((pixel.x >= left && pixel.x <= right && pixel.y >= top && pixel.y <= bottom) && mouseIsDown !== true && shopclicked === true) {
+ shopclicked = false
+ }
+ doDefaults(pixel);
+ },
+ tempHigh: 95,
+ stateHigh: ["melted_chocolate","plain_cookie","plain_cookie"],
+ category: "clicker",
+ burn: 10,
+ burnTime: 200,
+ burnInto: ["melted_chocolate","plain_cookie","plain_cookie"],
+ breakInto: ["crumb","crumb","crumb","crumb","crumb","chocolate","chocolate_powder"],
+ breakIntoColor: ["#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#bfac91","#CDBFAB","#4d2818","#3b1b0d","#33160a"],
+ state: "solid",
+ density: 233.96,
+ isFood: true,
+ movable: false,
+}
+
+elements.cookie_maker = {
+ color: ["#60a2c3","#2e80a9"],
+ colorKey: {
+ "l": "#60a2c3",
+ "r": "#2e80a9",
+ },
+ colorPattern: [
+ "rrrlll",
+ ],
+ behavior: behaviors.WALL,
+ tick: function(pixel) {
+ if (cookies > 0 && oldcookies < cookies) {
+ createdcookies = (cookies - oldcookies)
+ oldcookies = cookies
+ }
+ else if (oldcookies > cookies) {
+ oldcookies = cookies
+ }
+ if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.75 && createdcookies > 0) {
+ createdcookies -= 1
+ createPixel("cookie", pixel.x, pixel.y+1)
+ }
+ },
+ category: "clicker",
+ state: "solid",
+ density: 2000,
+ movable: false,
+}
+
+elements.cursor = {
+ color: ["#60a2c3","#2e80a9"],
+ colorKey: {
+ "l": "#60a2c3",
+ "r": "#2e80a9",
+ },
+ colorPattern: [
+ "rrrlll",
+ ],
+ behavior: behaviors.WALL,
+ onPlace: function(pixel) {
+ cursorCount.push(pixel)
+ for (c = 0; c < cursorCount.length; c++) {
+ if (cursorCount[c] == pixel) {
+ pixel.cursorbuy = c
+ break;
+ }
+ }
+ },
+ tick: function(pixel) {
+ pixel.PixelTicks = pixelTicks
+ if (buildings.cursors[0] > pixel.cursorbuy) {
+ pixel.bought = true
+ }
+ if (pixel.bought === true) {
+ if (pixel.click > 0) {
+ pixel.click--
+ }
+ if ((pixel.PixelTicks - (pixel.cursorbuy * 1.5)) % 300 == 0) {
+ cookies += 1
+ pixel.color = "#aaaaaa"
+ pixel.click = 4
+ }
+ if ((!pixel.click || pixel.click === 0) && pixel.PixelTicks % 300 != 0 && pixel.PixelPreTicks % 300 != 0 && pixel.color != "#ffffff") {
+ pixel.color = "#ffffff"
+ }
+ if (pixel.cursorbuy === 143 && buildings.cursors[0] > 143) {
+ if ((pixel.PixelTicks - (pixel.cursorbuy * 1.5)) % 300 == 0) {
+ cookies += (buildings.cursors[0] - 143)
+ }
+ }
+ }
+ },
+ movable: false,
+ tempHigh: 220,
+ stateHigh: "cooked_meat",
+ category: "clicker",
+ state: "solid",
+ density: 1080,
+ hardness: 0.1,
+ breakInto: "meat"
+},
+
+elements.grandma = {
+ color: "#ffdbac",
+ category: "clicker",
+ properties: {
+ dead: false,
+ dir: 1,
+ },
+ related: ["granbody","granhead"],
+ cooldown: defaultCooldown,
+ forceSaveColor: true,
+ tick: function(pixel) {
+ if (isEmpty(pixel.x, pixel.y+1)) {
+ createPixel("granbody", pixel.x, pixel.y+1);
+ var color = pixel.color;
+ changePixel(pixel,"granhead");
+ pixel.color = color;
+ if (pixel.bodyColor) {
+ pixelMap[pixel.x][pixel.y+1].color = pixel.bodyColor;
+ }
+ }
+ else if (isEmpty(pixel.x, pixel.y-1)) {
+ createPixel("granhead", pixel.x, pixel.y-1);
+ pixelMap[pixel.x][pixel.y-1].color = pixel.color;
+ changePixel(pixel,"granbody");
+ if (pixel.bodyColor) {
+ pixel.color = pixel.bodyColor;
+ }
+ }
+ }
+}
+
+elements.granhead = {
+ color: "#ffdbac",
+ category: "clicker",
+ hidden: true,
+ density: 1080,
+ state: "solid",
+ conduct: .05,
+ temp: 37,
+ tempHigh: 150,
+ stateHigh: "cookie",
+ tempLow: -30,
+ stateLow: "frozen_meat",
+ burn: 10,
+ burnTime: 250,
+ burnInto: "cookie",
+ breakInto: ["cookie_dough","meat","bone"],
+ forceSaveColor: true,
+ reactions: {
+ "cancer": { elem1:"cancer", chance:0.005 },
+ "radiation": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.4 },
+ "neutron": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.03 },
+ "fallout": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.03 },
+ "plague": { elem1:"plague", chance:0.05 },
+ "oxygen": { elem2:"carbon_dioxide", chance:0.5 },
+ "beans": { elem2:[null,null,null,null,null,null,null,null,"stench"], chance:0.2 },
+ "sun": { elem1:"cooked_meat" },
+ "light": { stain1:"#825043" },
+ "bee": { stain1:"#cc564b", chance:0.2 },
+ "water": { elem2:"bubble", attr2:{"clone":"water"}, chance:0.001 },
+ "salt_water": { elem2:"bubble", attr2:{"clone":"salt_water"}, chance:0.001 },
+ "pool_water": { elem2:"bubble", attr2:{"clone":"pool_water"}, chance:0.001 },
+ "alcohol": { chance:0.2, attr1:{"panic":0} },
+ },
+ properties: {
+ dead: false
+ },
+ tick: function(pixel) {
+ doHeat(pixel);
+ doBurning(pixel);
+ doElectricity(pixel);
+ if (pixel.dead) {
+ // Turn into rotten_meat if pixelTicks-dead > 500
+ if (pixelTicks-pixel.dead > 200 && Math.random() < 0.1) {
+ changePixel(pixel,"meat");
+ return
+ }
+ }
+
+ // Find the body
+ if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "granbody") {
+ var body = pixelMap[pixel.x][pixel.y+1];
+ if (body.dead) { // If body is dead, kill head
+ pixel.dead = body.dead;
+ }
+ }
+ else { var body = null }
+
+ if (tryMove(pixel, pixel.x, pixel.y+1)) {
+ // create blood if severed 10% chance
+ if (isEmpty(pixel.x, pixel.y+1) && !pixel.dead && Math.random() < 0.1 && !pixel.charge) {
+ createPixel("cookie_dough", pixel.x, pixel.y+1);
+ // set dead to true 15% chance
+ if (Math.random() < 0.15) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ }
+ // homeostasis
+ if (pixel.temp > 37) { pixel.temp -= 1; }
+ else if (pixel.temp < 37) { pixel.temp += 1; }
+ },
+ onChange: function(pixel) {
+ for (var i = 0; i < adjacentCoords.length; i++) {
+ var coord = adjacentCoords[i];
+ var x = pixel.x+coord[0];
+ var y = pixel.y+coord[1];
+ if (!isEmpty(x,y,true) && pixelMap[x][y].panic !== undefined) {
+ pixelMap[x][y].panic += 20;
+ }
+ }
+ },
+ onDelete: function(pixel) {
+ for (var i = 0; i < adjacentCoords.length; i++) {
+ var coord = adjacentCoords[i];
+ var x = pixel.x+coord[0];
+ var y = pixel.y+coord[1];
+ if (!isEmpty(x,y,true) && pixelMap[x][y].panic !== undefined) {
+ pixelMap[x][y].panic += 20;
+ }
+ }
+ }
+}
+
+elements.granbody = {
+ color: "#b6effb",
+ category: "clicker",
+ hidden: true,
+ density: 1500,
+ state: "solid",
+ conduct: .05,
+ temp: 37,
+ tempHigh: 150,
+ stateHigh: "cookie",
+ tempLow: -30,
+ stateLow: "frozen_meat",
+ burn: 10,
+ burnTime: 250,
+ burnInto: "cookie",
+ breakInto: ["cookie_dough","meat","bone"],
+ forceSaveColor: true,
+ properties: {
+ dead: false,
+ dir: 1,
+ },
+ tick: function(pixel) {
+ if (tryMove(pixel, pixel.x, pixel.y+1)) { // Fall
+ if (!isEmpty(pixel.x, pixel.y-2, true)) { // Drag head down
+ var headpixel = pixelMap[pixel.x][pixel.y-2];
+ if (headpixel.element === "granhead") {
+ if (isEmpty(pixel.x, pixel.y-1)) {
+ movePixel(pixelMap[pixel.x][pixel.y-2], pixel.x, pixel.y-1);
+ }
+ else {
+ swapPixels(pixelMap[pixel.x][pixel.y-2], pixelMap[pixel.x][pixel.y-1]);
+ }
+ }
+ }
+ }
+ doHeat(pixel);
+ doBurning(pixel);
+ doElectricity(pixel);
+ if (pixel.dead) {
+ // Turn into rotten_meat if pixelTicks-dead > 500
+ if (pixelTicks-pixel.dead > 200 && Math.random() < 0.1) {
+ changePixel(pixel,"meat");
+ }
+ return
+ }
+
+ // Find the head
+ if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "granhead") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ if (head.dead) { // If head is dead, kill body
+ pixel.dead = head.dead;
+ }
+ else if (head.panic > 0) {
+ delete head.panic;
+ }
+ }
+ else { var head = null }
+ if (pixel.panic > 0) {
+ pixel.panic -= 0.1;
+ if (pixel.panic < 0) { pixel.panic = 0; }
+ else if (pixel.panic > 1) { pixel.panic = 1; }
+ }
+
+ if (isEmpty(pixel.x, pixel.y-1)) {
+ // create blood if decapitated 10% chance
+ if (Math.random() < 0.1 && !pixel.charge) {
+ createPixel("cookie_dough", pixel.x, pixel.y-1);
+ // set dead to true 15% chance
+ if (Math.random() < 0.15) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ }
+ else if (head === null) { return }
+ else if (Math.random() < 0.1*(isEmpty(pixel.x, pixel.y+1) ? 1 : 1)) { // Move 10% chance
+ var movesToTry = [
+ [1*pixel.dir,0],
+ [1*pixel.dir,-1],
+ ];
+ let moved = false;
+ // While movesToTry is not empty, tryMove(pixel, x, y) with a random move, then remove it. if tryMove returns true, break.
+ while (movesToTry.length > 0) {
+ var move = movesToTry.splice(Math.floor(Math.random() * movesToTry.length), 1)[0];
+ if (isEmpty(pixel.x+move[0], pixel.y+move[1]-1)) {
+ var origx = pixel.x+move[0];
+ var origy = pixel.y+move[1];
+ if (tryMove(pixel, pixel.x+move[0], pixel.y+move[1]) && pixel.x===origx && pixel.y===origy) {
+ movePixel(head, head.x+move[0], head.y+move[1]);
+ moved = true;
+ break;
+ }
+ }
+ }
+ // 15% chance to change direction
+ if (Math.random() < 0.15 || !moved) {
+ pixel.dir *= -1;
+ }
+ // homeostasis
+ if (pixel.temp > 37) { pixel.temp -= 1; }
+ else if (pixel.temp < 37) { pixel.temp += 1; }
+ }
+ pixel.PixelTicks = pixelTicks
+ if (pixel.PixelTicks % 30 == 0 && pixel.dead === false) {
+ cookies += 1
+ }
+ }
+}
+
+elements.grandma_maker = {
+ color: "#a0522d",
+ behavior: behaviors.WALL,
+ onPlace: function(pixel) {
+ grandmaCount.push(pixel)
+ for (g = 0; g < grandmaCount.length; g++) {
+ if (grandmaCount[g] == pixel) {
+ pixel.grandmalevel = g
+ break;
+ }
+ }
+ },
+ tick: function(pixel) {
+ if (buildings.grandmas[0] > pixel.grandmalevel && isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.5 && pixel.created !== true) {
+ pixel.created = true
+ createPixel("grandma", pixel.x, pixel.y+1)
+ }
+ },
+ category: "clicker",
+ state: "solid",
+ density: 2000,
+ movable: false,
+}
+
+elements.cookie_crop = {
+ color: "#C4966C",
+ behavior: behaviors.WALL,
+ tick: function(pixel) {
+ pixel.PixelTicks = pixelTicks
+ if (pixel.h === undefined) {
+ pixel.h = 0
+ }
+ if (pixel.h < 2) {
+ if (!tryMove(pixel,pixel.x,pixel.y+1)) {
+ if (pixel.temp < 100) {
+ if (isEmpty(pixel.x,pixel.y-1) && tryMove(pixel,pixel.x,pixel.y-1)) {
+ createPixel("cookie_crop",pixel.x,pixel.y+1);
+ pixelMap[pixel.x][pixel.y+1].h = 4
+ pixel.h++
+ }
+ }
+ }
+ }
+ if (pixel.h === 2) {
+ if (pixel.temp < 100) {
+ if (isEmpty(pixel.x+1,pixel.y) && pixel.leftPetal !== true) {
+ createPixel("cookie_crop",pixel.x+1,pixel.y);
+ pixelMap[pixel.x+1][pixel.y].h = 4
+ pixelMap[pixel.x+1][pixel.y].color = "#942e8c"
+ pixel.leftPetal = true
+ }
+ if (isEmpty(pixel.x-1,pixel.y) && pixel.rightPetal !== true) {
+ createPixel("cookie_crop",pixel.x-1,pixel.y);
+ pixelMap[pixel.x-1][pixel.y].h = 4
+ pixelMap[pixel.x-1][pixel.y].color = "#942e8c"
+ pixel.rightPetal = true
+ }
+ if (isEmpty(pixel.x,pixel.y-1)) {
+ createPixel("flower_cookie",pixel.x,pixel.y-1);
+ pixel.h = 3
+ }
+ }
+ }
+ if (pixel.h === 3) {
+ if (pixel.temp < 100) {
+ if (isEmpty(pixel.x+1,pixel.y) && pixel.leftPetal !== true) {
+ createPixel("cookie_crop",pixel.x+1,pixel.y);
+ pixelMap[pixel.x+1][pixel.y].h = 4
+ pixelMap[pixel.x+1][pixel.y].color = "#942e8c"
+ pixel.leftPetal = true
+ }
+ if (isEmpty(pixel.x-1,pixel.y) && pixel.rightPetal !== true) {
+ createPixel("cookie_crop",pixel.x-1,pixel.y);
+ pixelMap[pixel.x-1][pixel.y].h = 4
+ pixelMap[pixel.x-1][pixel.y].color = "#942e8c"
+ pixel.rightPetal = true
+ }
+ if (pixel.color != "#734e39") {
+ pixel.color = "#734e39"
+ }
+ }
+ }
+ doDefaults(pixel);
+ },
+ tempHigh: 200,
+ stateHigh: "cookie",
+ burn: 5,
+ burnTime: 100,
+ category: "clicker",
+ state: "solid",
+ density: 1500,
+ cooldown: defaultCooldown,
+ seed: true
+}
+
+elements.flower_cookie = {
+ color: ["#C4966C","#C0946B","#C4966C","#C0946B","#4d2818","#3b1b0d","#33160a"],
+ behavior: [
+ "XX|ST:cookie_crop|XX",
+ "ST:cookie_crop|XX|ST:cookie_crop",
+ "M2|ST:cookie_crop AND M1|M2",
+ ],
+ tick: function(pixel) {
+ pixel.PixelTicks = pixelTicks
+ if (pixel.PixelTicks % 30 == 0 && !isEmpty(pixel.x,pixel.y+1, true)) {
+ cookies += 8
+ }
+ },
+ tempHigh: 200,
+ stateHigh: "cookie",
+ burn: 5,
+ burnTime: 100,
+ category: "clicker",
+ state: "solid",
+ density: 1500,
+ cooldown: defaultCooldown,
+ seed: true
+}
+
+elements.farm_deployer = {
+ color: ["#76552b","#5c4221","#573c1a","#6b481e"],
+ behavior: behaviors.WALL,
+ onPlace: function(pixel) {
+ farmCount.push(pixel)
+ for (f = 0; f < farmCount.length; f++) {
+ if (farmCount[f] == pixel) {
+ pixel.farmbuy = f
+ break;
+ }
+ }
+ },
+ tick: function(pixel) {
+ if (buildings.farms[0] > pixel.farmbuy) {
+ pixel.bought = true
+ }
+ if (pixel.bought === true) {
+ changePixel(pixel, "cookie_crop")
+ }
+ },
+ category: "clicker",
+ state: "solid",
+ density: 2000,
+ movable: false,
+}
+
+elements.background = {
+ color: ["#60a2c3","#2e80a9"],
+ colorKey: {
+ "l": "#60a2c3",
+ "r": "#2e80a9",
+ },
+ colorPattern: [
+ "rrrlll",
+ ],
+ onSelect: function() {
+ logMessage("Draw a pipe, wait for walls to appear, then erase the exit hole.");
+ },
+ tick: function(pixel) {
+ if (!pixel.stage && pixelTicks-pixel.start > 60) {
+ for (var i = 0; i < squareCoords.length; i++) {
+ var coord = squareCoords[i];
+ var x = pixel.x+coord[0];
+ var y = pixel.y+coord[1];
+ if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].movable) {
+ deletePixel(x,y)
+ }
+ if (isEmpty(x,y)) {
+ createPixel("pipe_wall",x,y);
+ }
+ }
+ pixel.stage = 1;
+ }
+ else if (pixel.stage === 1 && pixelTicks-pixel.start > 70) { //uninitialized
+ for (var i = 0; i < adjacentCoords.length; i++) {
+ var coord = adjacentCoords[i];
+ var x = pixel.x+coord[0];
+ var y = pixel.y+coord[1];
+ if (isEmpty(x,y)) {
+ pixel.stage = 2; //blue
+ break;
+ }
+ }
+ }
+ else if (pixel.stage > 1 && pixelTicks % 3 === pixel.stage-2) { //initialized
+ for (var i = 0; i < squareCoords.length; i++) {
+ var coord = squareCoords[i];
+ var x = pixel.x+coord[0];
+ var y = pixel.y+coord[1];
+ if (!isEmpty(x,y,true) && pixelMap[x][y].element === pixel.element) {
+ var newPixel = pixelMap[x][y];
+ if (newPixel.stage === 1) {
+ var newColor;
+ switch (pixel.stage) {
+ case 2: newPixel.stage = 3; newColor = "#003600"; break; //green
+ case 3: newPixel.stage = 4; newColor = "#360000"; break; //red
+ case 4: newPixel.stage = 2; newColor = "#000036"; break; //blue
+ }
+ }
+ }
+ }
+ var moved = false;
+ shuffleArray(squareCoordsShuffle);
+ for (var i = 0; i < squareCoordsShuffle.length; i++) {
+ var coord = squareCoordsShuffle[i];
+ var x = pixel.x+coord[0];
+ var y = pixel.y+coord[1];
+ if (!isEmpty(x,y,true)) {
+ var newPixel = pixelMap[x][y];
+ if (newPixel.element === pixel.element) {
+ var nextStage;
+ switch (pixel.stage) {
+ case 2: nextStage = 4; break; //green
+ case 3: nextStage = 2; break; //red
+ case 4: nextStage = 3; break; //blue
+ }
+ if (pixel.con && !newPixel.con && newPixel.stage === nextStage) { //transfer to adjacent pipe
+ newPixel.con = pixel.con;
+ newPixel.con.x = newPixel.x;
+ newPixel.con.y = newPixel.y;
+ pixel.con = null;
+ moved = true;
+ break;
+ }
+ }
+ else if (!pixel.con && elements[newPixel.element].movable) { //suck up pixel
+ pixel.con = newPixel;
+ deletePixel(newPixel.x,newPixel.y);
+ pixel.con.x = pixel.x;
+ pixel.con.y = pixel.y;
+ pixel.con.del;
+ moved = true;
+ break;
+ }
+ }
+ }
+ if (pixel.con && !moved) { // move to same stage if none other
+ for (var i = 0; i < squareCoordsShuffle.length; i++) {
+ var coord = squareCoordsShuffle[i];
+ var x = pixel.x+coord[0];
+ var y = pixel.y+coord[1];
+ if (isEmpty(x,y)) {
+ delete pixel.con.del;
+ pixel.con.x = x;
+ pixel.con.y = y;
+ pixelMap[x][y] = pixel.con;
+ currentPixels.push(pixel.con);
+ pixel.con = null;
+ break;
+ }
+ if (!isEmpty(x,y,true) && pixelMap[x][y].element === pixel.element) {
+ var newPixel = pixelMap[x][y];
+ if (pixel.con && !newPixel.con && newPixel.stage === pixel.stage) {
+ newPixel.con = pixel.con;
+ newPixel.con.x = newPixel.x;
+ newPixel.con.y = newPixel.y;
+ pixel.con = null;
+ break;
+ }
+ }
+ }
+ }
+ }
+ doDefaults(pixel);
+ },
+ movable: false,
+ canContain: true,
+ behavior: behaviors.WALL,
+ tempHigh: 248,
+ stateHigh: ["fire","fire","fire","fire","fire","ash"],
+ burn: 70,
+ burnTime: 300,
+ burnInto: ["fire","fire","fire","fire","fire","ash"],
+ category: "clicker",
+ state: "solid",
+ density: 1201,
+ breakInto: "confetti",
+ breakIntoColor: ["#ffffff","#e6e6e6","#dbdbdb"]
+}
+
+updateStats = function() {
+ var statsDiv = document.getElementById("stats");
+ var stats = "x"+mousePos.x+",y"+mousePos.y+"";
+ stats += "Pxls:" + currentPixels.length+"";
+ stats += "" + tps+"tps";
+ stats += "" + pixelTicks+"";
+ stats += "Cookies:" + cookies+"";
+ if ((typeof pixelMap).length === 9) { return; }
+ if (pixelMap[mousePos.x] !== undefined) {
+ var currentPixel = pixelMap[mousePos.x][mousePos.y];
+ if (currentPixel !== undefined) {
+ stats += ""+langKey("gui.stats.elem","Elem")+":"+(elements[currentPixel.element].name || currentPixel.element).toUpperCase()+"";
+ stats += ""+langKey("gui.stats.temp","Temp")+":"+formatTemp(currentPixel.temp)+"";
+ if (currentPixel.charge) {
+ stats += "C"+parseFloat(currentPixel.charge)+"";
+ }
+ if (currentPixel.burning) {
+ stats += ""+langKey("gui.stats.burning","Burning")+"";
+ }
+ if (elements[currentPixel.element].hoverStat) {
+ stats += ""+elements[currentPixel.element].hoverStat(currentPixel).toString().replaceAll("<","<")+"";
+ }
+ else if (elements[currentElement].toolHoverStat) {
+ stats += ""+elements[currentElement].toolHoverStat(currentPixel).toString().replaceAll("<","<")+"";
+ }
+ else if (currentPixel.clone) {
+ stats += ""+currentPixel.clone.toString().toUpperCase().replaceAll("<","<")+"";
+ }
+ else if (currentPixel.con && currentPixel.con.element) {
+ stats += ""+currentPixel.con.element.toString().toUpperCase().replaceAll("<","<")+"";
+ }
+ }
+ }
+ if (shiftDown) {
+ stats += ""+shiftDownTypes[shiftDown]+"";
+ }
+ // If the view is not null, show the view in all caps
+ if (view !== null) {
+ stats += ""+(viewInfo[view] ? viewInfo[view].name : view)+"";
+ }
+ statsDiv.innerHTML = stats;
+}
+
+buildingProduction = function() {
+ for (var i = 0; i <= cursorCount.length; i++) {
+ if (i >= (cursorCount.length - 1) && cursorCount[i - 1] && cursorCount[i - 1].bought == true) {
+ if ((pixelTicks - (buildings.cursors[i] * 1.5)) % 300 == 0) {
+ cookies += (buildings.cursors[0] - (i + 1))
+ break;
+ }
+ }
+ }
+ for (var i = 0; i <= (grandmaCount.length - 1); i++) {
+ if (i >= (grandmaCount.length - 1) && grandmaCount[i - 1] && grandmaCount[i - 1].created == true) {
+ if (pixelTicks % 30 == 0) {
+ cookies += (buildings.grandmas[0] - (i + 1))
+ break;
+ }
+ }
+ }
+ for (var i = 0; i <= farmCount.length; i++) {
+ if (i >= (farmCount.length - 1) && farmCount[i - 1] && farmCount[i - 1].bought == true) {
+ if (pixelTicks % 30 == 0) {
+ cookies += ((buildings.farms[0] - (i + 1)) * 8)
+ break;
+ }
+ }
+ }
+}
+
+runEveryTick(buildingProduction)
+
+elements.dough.reactions.sugar = { elem1:"cookie_dough", elem2: null, chance:0.5}
+elements.dough.reactions.chocolate = { elem1:"chocolate_chip_cookie_dough", elem2: null, chance:0.5}
+elements.dough.reactions.chocolate_powder = { elem1:"chocolate_chip_cookie_dough", elem2: null, chance:0.5}
\ No newline at end of file
diff --git a/mods/hideandshowtools.js b/mods/hideandshowtools.js
new file mode 100644
index 00000000..63a3370a
--- /dev/null
+++ b/mods/hideandshowtools.js
@@ -0,0 +1,18 @@
+elements.hide = {
+ color: "#000000",
+ tool: function(pixel){
+ pixel.alpha = 0
+ },
+ category: "tools",
+ canPlace: false,
+ desc: "Use on pixels to hide them.",
+};
+elements.show = {
+ color: "#ffffff",
+ tool: function(pixel){
+ pixel.alpha = 1
+ },
+ category: "tools",
+ canPlace: false,
+ desc: "Use on pixels to show them."
+};
diff --git a/mods/nousersthings.js b/mods/nousersthings.js
index a8c6cbfa..ac5316f0 100644
--- a/mods/nousersthings.js
+++ b/mods/nousersthings.js
@@ -3939,7 +3939,7 @@ renderPostPixel(function(ctx){
if ((pixel.element == "sign") && pixel.sign){
ctx.font = `12pt Arial`
ctx.fillStyle = pixel.color;
- ctx.fillText(pixel.sign = pixel.sign.replace(/\$\{([\w.\[\]]+)\}/g, (_, path) => {
+ ctx.fillText(pixel.sign.replace(/\$\{([\w.\[\]]+)\}/g, (_, path) => {
try {
const value = new Function('return globalThis.' + path)();
return typeof value === 'object' ? JSON.stringify(value) : value ?? '';
@@ -3951,7 +3951,7 @@ renderPostPixel(function(ctx){
if (pixel.charge || pixel.chargeCD){
ctx.font = `12pt Arial`
ctx.fillStyle = pixel.color;
- ctx.fillText(pixel.sign = pixel.sign.replace(/\$\{([\w.\[\]]+)\}/g, (_, path) => {
+ ctx.fillText(pixel.sign.replace(/\$\{([\w.\[\]]+)\}/g, (_, path) => {
try {
const value = new Function('return globalThis.' + path)();
return typeof value === 'object' ? JSON.stringify(value) : value ?? '';