From 4beba7f9c115dfa5d0f92ec10c671ab7701e3302 Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Sun, 5 Oct 2025 15:51:31 -0700 Subject: [PATCH 01/19] more powerful 229 --- mods/scp.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/scp.js b/mods/scp.js index 8c6b2aba..1d479699 100644 --- a/mods/scp.js +++ b/mods/scp.js @@ -4163,7 +4163,7 @@ elements.scp_229 = { for (var i = 0; i < coords.length; i++) { if (!isEmpty(coords[i].x,coords[i].y) && !outOfBounds(coords[i].x,coords[i].y)) { var electric = pixelMap[coords[i].x][coords[i].y] - if (elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.element == "thunder_cloud" || electric.charge || electric.element == "access_door" && Math.random() > 0.75 || electric.element == "keycard_terminal" || electric.element == "level_5" || electric.element == "scp_804" && electric.active == true || elements[electric.element].category == "logic" || electric.element == "brain" || electric.element == "fish" || electric.element == "frog" || electric.element == "rat" || electric.element == "bird" || electric.element == "head" || electric.element == "head_1000" || electric.element == "head_035" || electric.element == "head_008" || electric.element == "battery" || electric.element == "electric" || electric.element == "lightning" || electric.element == "malware" || electric.element == "gray_goo") { + if (elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.element == "thunder_cloud" || electric.charge || electric.chargeCD || electric.element == "access_door" && Math.random() > 0.75 || electric.element == "keycard_terminal" || electric.element == "level_5" || electric.element == "scp_804" && electric.active == true || elements[electric.element].category == "logic" || electric.element == "brain" || electric.element == "fish" || electric.element == "frog" || electric.element == "rat" || electric.element == "bird" || electric.element == "head" || electric.element == "head_1000" || electric.element == "head_035" || electric.element == "head_008" || electric.element == "battery" || electric.element == "electric" || electric.element == "lightning" || electric.element == "malware" || electric.element == "gray_goo") { if (electric.y > pixel.y && electric.x > pixel.x && isEmpty(pixel.x+1,pixel.y+1)) { createPixel("scp_229",pixel.x+1,pixel.y+1) var electric2 = pixelMap[pixel.x+1][pixel.y+1] @@ -4267,7 +4267,7 @@ elements.scp_229 = { explodeAt(electric.x,electric.y,300,["plasma","plasma","plasma","plasma","plasma","plasma","plasma","radiation","radiation","radiation","radiation","rad_steam","electric","electric"]) pixel.nCD = 2 } - else if (electric.charge) { + else if (electric.charge || electric.chargeCD) { deletePixel(electric.x,electric.y) createPixel("scp_229",electric.x,electric.y) electric = pixelMap[electric.x][electric.y] From bb63d6b89f95ede168970ea8a9763c2483e0973c Mon Sep 17 00:00:00 2001 From: Cube14yt Date: Wed, 15 Oct 2025 21:46:02 +0800 Subject: [PATCH 02/19] Update cubesstuff.js --- mods/cubesstuff.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/cubesstuff.js b/mods/cubesstuff.js index ccf3b56f..f623c65e 100644 --- a/mods/cubesstuff.js +++ b/mods/cubesstuff.js @@ -3231,7 +3231,7 @@ elements.element_line = { } } if (pixel.dir === 1) { - if (!tryMove(pixel, pixel.x, pixel.y - 1, pixel.clone)) { + if (!tryMove(pixel, pixel.x, pixel.y + 1, pixel.clone)) { changePixel(pixel, pixel.clone, true) } } @@ -3241,7 +3241,7 @@ elements.element_line = { } } if (pixel.dir === 3) { - if (!tryMove(pixel, pixel.x, pixel.y + 1, pixel.clone)) { + if (!tryMove(pixel, pixel.x, pixel.y - 1, pixel.clone)) { changePixel(pixel, pixel.clone, true) } } @@ -3326,3 +3326,4 @@ elements.replace_all_of_element = { } + From eaf1ca58f3ba128ad39c95f405629119c0d494af Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Wed, 15 Oct 2025 18:44:07 -0700 Subject: [PATCH 03/19] a lot more stuff and bugfixes and 001 --- mods/scp.js | 1149 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1116 insertions(+), 33 deletions(-) diff --git a/mods/scp.js b/mods/scp.js index 1d479699..8b9a6a7d 100644 --- a/mods/scp.js +++ b/mods/scp.js @@ -1,6 +1,12 @@ /* by nekonico */ window.addEventListener("load", () => { + document.getElementById("elementButton-scp_001_light")?.remove() + document.getElementById("elementButton-melted_head")?.remove() + document.getElementById("elementButton-melted_body")?.remove() + document.getElementById("elementButton-melted_animal")?.remove() + document.getElementById("elementButton-melted_plant")?.remove() + document.getElementById("elementButton-fused_organism")?.remove() document.getElementById("elementButton-head_008")?.remove() document.getElementById("elementButton-body_008")?.remove() document.getElementById("elementButton-head_012_1")?.remove() @@ -15,6 +21,8 @@ window.addEventListener("load", () => { document.getElementById("elementButton-head_173")?.remove() document.getElementById("elementButton-body_173")?.remove() document.getElementById("elementButton-scp_229")?.remove() + document.getElementById("elementButton-packet")?.remove() + document.getElementById("elementButton-can")?.remove() document.getElementById("elementButton-head_457")?.remove() document.getElementById("elementButton-body_457")?.remove() document.getElementById("elementButton-head_1000")?.remove() @@ -34,9 +42,25 @@ window.addEventListener("load", () => { document.getElementById("elementButton-scp_009_plant")?.remove() document.getElementById("elementButton-red_cloud")?.remove() document.getElementById("elementButton-red_rain")?.remove() - document.getElementById("elementButton-shy_head")?.remove() - document.getElementById("elementButton-shy_body")?.remove() + document.getElementById("elementButton-head_096")?.remove() + document.getElementById("elementButton-body_096")?.remove() document.getElementById("elementButton-REDACTED")?.remove() + +vendingNormD = Object.keys(elements).filter(function(e) { + return elements[e].state == "liquid" && elements[e].movable == true && elements[e].category != "scp" && (elements[e].category == "food" || (elements[e].id == elements.water.id || elements[e].id == elements.sugar_water.id || elements[e].id == elements.seltzer.id || elements[e].id == elements.dirty_water.id || elements[e].id == elements.slime.id || elements[e].id == elements.neutral_acid.id || elements[e].id == elements.blood.id || elements[e].id == elements.sap.id || elements[e].id == elements.dye.id) || elements[e].isFood) && !elements[e].tool; +}); + +vendingNormF = Object.keys(elements).filter(function(e) { + return (elements[e].state != "liquid" && elements[e].state != "gas") && elements[e].category != "scp" && elements[e].movable == true && (elements[e].category == "food" || elements[e].isFood) && !elements[e].tool; +}); + +vendingWeirdD = Object.keys(elements).filter(function(e) { + return (elements[e].state == "liquid" || elements[e].state == "gas") && elements[e].movable == true && (elements[e].category == "food" || elements[e].category == "liquids" || elements[e].category == "life" || elements[e].category == "gases" || elements[e].category == "energy") && !elements[e].tool; +}); + +vendingWeirdF = Object.keys(elements).filter(function(e) { + return elements[e].state != "gas" && elements[e].movable == true && (elements[e].id != elements.armageddon.id && elements[e].id != elements.blaster.id && elements[e].id != elements.false_vacuum_decay_bomb.id && elements[e].id != elements.earthquake.id && elements[e].id != elements.tsunami.id && elements[e].id != elements.volcano.id && elements[e].id != elements.sinkhole.id) && (elements[e].category == "food" || elements[e].category == "life" || elements[e].category == "land" || elements[e].category == "weapons" || elements[e].category == "energy" || elements[e].isFood) && !elements[e].tool; +}); }) async function _scpAskPrompt(message, defaultValue = "") { @@ -229,7 +253,7 @@ elements.access_door = { if (!isEmpty(pixel.x-1, pixel.y, true) && !outOfBounds(pixel.x-1, pixel.y) && Math.random() > 0.9){ let neighbor = pixelMap[pixel.x-1][pixel.y] if (pixel.levelReq && elements[neighbor.element].level < pixel.levelReq) {} - else if (neighbor.level >= pixel.levelReq && (neighbor.element == "body" || neighbor.element == "body_1000" || neighbor.element == "body_008" || neighbor.element == "body_1015" || neighbor.element == "body_035" || neighbor.element == "body_012_1")) { + else if (neighbor.level >= pixel.levelReq && (neighbor.element == "body" || neighbor.element == "melted_body" || neighbor.element == "fused_organism" && Math.random() > 0.75 || neighbor.element == "body_1000" || neighbor.element == "body_008" || neighbor.element == "body_1015" || neighbor.element == "body_035" || neighbor.element == "body_012_1")) { if (neighbor.dir == 1 && !isEmpty(neighbor.x,neighbor.y-1) && !outOfBounds(neighbor.x,neighbor.y-1)) { if (isEmpty(pixel.x+1,pixel.y) && isEmpty(pixel.x+1,pixel.y-1)) { if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x+1,pixel.y-1)) { @@ -246,7 +270,7 @@ elements.access_door = { movePixel(neighbor,pixel.x+1,pixel.y+1) } } - else if (!isEmpty(pixel.x+1,pixel.y) && !isEmpty(pixel.x+1,pixel.y-1) && isEmpty(pixel.x+2,pixel.y+1) && isEmpty(pixel.x+2,pixel.y)) { + else if (!isEmpty(pixel.x+1,pixel.y) && !isEmpty(pixel.x+1,pixel.y-1) && isEmpty(pixel.x+2,pixel.y) && isEmpty(pixel.x+2,pixel.y-1)) { let doorB = pixelMap[pixel.x+1][pixel.y] let doorH = pixelMap[pixel.x+1][pixel.y-1] if (doorB.levelReq <= pixel.levelReq && doorH.levelReq <= pixel.levelReq) { @@ -257,6 +281,26 @@ elements.access_door = { } } } + else if (neighbor.level >= pixel.levelReq && neighbor.element == "fused_organism" && Math.random() > 0.5) { + if (neighbor.dir == 1 && !isEmpty(neighbor.x,neighbor.y-1) && !outOfBounds(neighbor.x,neighbor.y-1)) { + if (isEmpty(pixel.x+1,pixel.y)) { + tryMove(pixelMap[neighbor.x][neighbor.y],pixel.x+1,pixel.y) + } + else if (isEmpty(pixel.x+1,pixel.y-1)) { + tryMove(pixelMap[neighbor.x][neighbor.y],pixel.x+1,pixel.y-1) + } + else if (isEmpty(pixel.x+1,pixel.y+1)) { + tryMove(pixelMap[neighbor.x][neighbor.y],pixel.x+1,pixel.y+1) + } + else if (!isEmpty(pixel.x+1,pixel.y) && isEmpty(pixel.x+2,pixel.y)) { + let doorB = pixelMap[pixel.x+1][pixel.y] + let doorH = pixelMap[pixel.x+1][pixel.y-1] + if (doorB.levelReq <= pixel.levelReq && doorH.levelReq <= pixel.levelReq) { + tryMove(pixelMap[neighbor.x][neighbor.y],pixel.x+2,pixel.y) + } + } + } + } } else if (!isEmpty(pixel.x+1, pixel.y, true) && !outOfBounds(pixel.x+1, pixel.y) && Math.random() > 0.9){ let neighbor = pixelMap[pixel.x+1][pixel.y] @@ -307,6 +351,40 @@ elements.access_door = { density: 7850, } +elements.alarm = { + color: "#ff2222", + buttonColor: "#660000", + behavior: behaviors.WALL, + renderer: renderPresets.LED, + properties: { + radius: 8, + }, + tick: function(pixel) { + doDefaults(pixel) + if (!pixel.radius || pixel.radius != 8) { + pixel.radius = 8 + } + if (pixel.radius > 0 && (pixel.charge || pixel.chargeCD)) { + var coords = circleCoords(pixel.x,pixel.y,pixel.radius); + for (var i = 0; i < coords.length; i++) { + if (!isEmpty(coords[i].x,coords[i].y) && !outOfBounds(coords[i].x,coords[i].y)) { + var panic = pixelMap[coords[i].x][coords[i].y] + if (panic.panic != undefined && (panic.element == "body" || panic.element == "body_1000" || panic.element == "body_1015")) { + panic.panic += 0.025 + } + } + } + } + }, + category: "scp", + tempHigh: 1500, + stateHigh: ["molten_glass","molten_glass","molten_glass","molten_gallium","molten_aluminum","molten_copper","molten_plastic","molten_plastic"], + conduct: 1, + breakInto: ["glass_shard","bead","glass_shard","bead","copper"], + breakIntoColorMultiplier: [1.1,1,0.86], + forceSaveColor: true +} + elements.level_0 = { color: ["#635957","#AB9D9C","#D3CCCC"], name: "Level 0 Keycard", @@ -496,6 +574,61 @@ elements.d_class = { forceSaveColor: true, } +elements.maintenance = { + // color: ["#f5eac6","#d4c594","#a89160","#7a5733","#523018","#361e0e"], + color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"], + buttonColor: ["#111188","#1111dd","#047e99"], + name: "Technician", + category: "scp", + properties: { + dead: false, + dir: 1, + panic: 0 + }, + onPlace: function(pixel) { + if (isEmpty(pixel.x, pixel.y+1)) { + createPixel("body", pixel.x, pixel.y+1); + pixelMap[pixel.x][pixel.y+1].color = pixelColorPick(pixelMap[pixel.x][pixel.y+1], elements.maintenance.buttonColor) + pixelMap[pixel.x][pixel.y+1].level = 1 + var color = pixel.color; + changePixel(pixel,"head"); + pixel.color = color; + } + else if (isEmpty(pixel.x, pixel.y-1)) { + createPixel("head", pixel.x, pixel.y-1); + pixelMap[pixel.x][pixel.y-1].color = pixel.color; + changePixel(pixel,"body"); + pixel.color = pixelColorPick(pixel, elements.maintenance.buttonColor); + pixel.level = 1 + } + else { + deletePixel(pixel.x, pixel.y); + } + }, + reactions: { + "fire": { attr1:{panic:5} }, + "plasma": { attr1:{panic:5} }, + "cold_fire": { attr1:{panic:5} }, + "electric": { attr1:{panic:5} }, + "blood": { attr1:{panic:1} }, + "infection": { attr1:{panic:2} }, + "cancer": { attr1:{panic:3} }, + "plague": { attr1:{panic:5} }, + "radiation": { attr1:{panic:5} }, + "tnt": { attr1:{panic:5} }, + "dynamite": { attr1:{panic:5} }, + "c4": { attr1:{panic:5} }, + "grenade": { attr1:{panic:5} }, + "gunpowder": { attr1:{panic:5} }, + "acid": { attr1:{panic:5} }, + "acid_gas": { attr1:{panic:5} }, + "stench": { attr1:{panic:2} } + }, + related: ["body","head"], + cooldown: defaultCooldown, + forceSaveColor: true, +} + elements.scientist = { // color: ["#f5eac6","#d4c594","#a89160","#7a5733","#523018","#361e0e"], color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"], @@ -661,6 +794,706 @@ elements.director = { forceSaveColor: true, } +elements.scp_001_sdl = { + name: "SCP-001 CN: Locke", + color: "#c12600", + tick: function(pixel) { + // minimum 1726 + // maximum 7726 + if (pixel.eclipse) { pixel.color = pixelColorPick(pixel,"#f68656"); var c=0.01} + else if (pixel.temp < 1500) { pixel.color = pixelColorPick(pixel,"#7a4e43"); } + else if (pixel.temp < 3600) { pixel.color = pixelColorPick(pixel,"#ffbdbd"); var c=0.05 } + else if (pixel.temp < 7000) { pixel.color = pixelColorPick(pixel,"#c12600"); var c=0.1 } + else if (pixel.temp < 11000) { pixel.color = pixelColorPick(pixel,"#ffb09c"); var c=0.25 } + else if (pixel.temp < 28000) { pixel.color = pixelColorPick(pixel,"#f7fff5"); var c=0.5 } + else { pixel.color = pixelColorPick(pixel,"#c3bdff"); var c=0.4 } + if (pixel.temp < 1500) { var c=0 } + for (var i = 0; i < adjacentCoords.length; i++) { + var x = pixel.x+adjacentCoords[i][0]; + var y = pixel.y+adjacentCoords[i][1]; + if (isEmpty(x,y)) { + if (Math.random() > c) {continue} + createPixel("scp_001_light", x, y); + pixelMap[x][y].color = pixel.color; + } + else if (!outOfBounds(x,y)) { + var newPixel = pixelMap[x][y]; + if (elements[newPixel.element].id === elements.scp_001_sdl.id) { + if (pixel.eclipse) { newPixel.eclipse = true } + if (pixel.temp!==newPixel.temp) { + var avg = (pixel.temp + newPixel.temp)/2; + pixel.temp = avg; + newPixel.temp = avg; + pixelTempCheck(pixel); + pixelTempCheck(newPixel); + } + } + else if (elements[newPixel.element].id === elements.sun.id) { + changePixel(newPixel, "scp_001_sdl"); + } + } + } + }, + tool: function(pixel) { + if (pixel.element === "light") { + deletePixel(pixel.x,pixel.y); + } + if (pixel.element === "scp_001_light") { + deletePixel(pixel.x,pixel.y); + } + }, + canPlace: true, + reactions: { + "hydrogen": { elem2:"helium", temp1:5 }, + "helium": { elem2:"carbon_dioxide", temp1:5, tempMax:3600 }, + "carbon_dioxide": { elem2:"neon", temp1:5, tempMax:1800 }, + "sun": { elem2:"scp_001_sdl", }, + "light": { elem2:"scp_001_light" }, + }, + temp: 5504, + tempLow: -100, + stateLow: "supernova", + category: "scp", + state: "gas", + //density: 1408, + insulate: true, + noMix: true, + movable: false +} + +elements.scp_001_light = { + hidden: true, + name: "light", + color: "#c12600", + tick: function(pixel) { + if (Math.random() < 0.01) { + deletePixel(pixel.x,pixel.y); + return; + } + if (pixel.bx===undefined) { + // choose 1, 0, or -1 + pixel.bx = Math.random() < 0.5 ? 1 : Math.random() < 0.5 ? 0 : -1; + pixel.by = Math.random() < 0.5 ? 1 : Math.random() < 0.5 ? 0 : -1; + // if both are 0, make one of them 1 or -1 + if (pixel.bx===0 && pixel.by===0) { + if (Math.random() < 0.5) { pixel.bx = Math.random() < 0.5 ? 1 : -1; } + else { pixel.by = Math.random() < 0.5 ? 1 : -1; } + } + } + // move and invert direction if hit + if (pixel.bx && !tryMove(pixel, pixel.x+pixel.bx, pixel.y)) { + var newX = pixel.x + pixel.bx; + if (!isEmpty(newX, pixel.y, true)) { + var newPixel = pixelMap[pixel.x+pixel.bx][pixel.y]; + if (!elements[newPixel.element].insulate) { + newPixel.temp += 1; + pixelTempCheck(newPixel); + } + if (!elements.light.reactions[newPixel.element]) { + pixel.color = newPixel.color; + } + else if (!elements.scp_001_light.reactions[newPixel.element]) { + pixel.color = newPixel.color; + } + } + pixel.bx = -pixel.bx; + } + if (pixel.by && !tryMove(pixel, pixel.x, pixel.y+pixel.by)) { + var newY = pixel.y + pixel.by; + if (!isEmpty(pixel.x, newY, true)) { + var newPixel = pixelMap[pixel.x][pixel.y+pixel.by]; + if (!elements[newPixel.element].insulate && newPixel.temp < 200) { + newPixel.temp += 0.1; + pixelTempCheck(newPixel); + } + if (!elements.light.reactions[newPixel.element]) { + pixel.color = newPixel.color; + } + else if (!elements.scp_001_light.reactions[newPixel.element]) { + pixel.color = newPixel.color; + } + } + pixel.by = -pixel.by; + } + }, + onCollide: function(pixel1,pixel2) { + if (pixel2.element == "head") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_head" + } + else if (pixel2.element == "body") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_body" + } + else if (pixel2.element == "plant" || pixel2.element == "grass" || pixel2.element == "lichen" || pixel2.element == "kelp" || pixel2.element == "evergreen" || pixel2.element == "pistil" || pixel2.element == "petal" || pixel2.element == "bamboo" || pixel2.element == "bamboo_plant" || pixel2.element == "cactus" || pixel2.element == "corn" || pixel2.element == "wheat" || pixel2.element == "dead_plant" || pixel2.element == "sapling" || pixel2.element == "pinecone") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_plant" + } + else if (pixel2.element == "tree_branch") { + pixel2.element = "wood" + } + else if (pixel2.element == "cell" || pixel2.element == "cancer" || pixel2.element == "worm" || pixel2.element == "flea" || pixel2.element == "termite" || pixel2.element == "ant" || pixel2.element == "spider" || pixel2.element == "fly" || pixel2.element == "firefly" || pixel2.element == "bee" || pixel2.element == "stink_bug" || pixel2.element == "dead_bug" || pixel2.element == "bird" || pixel2.element == "rat" || pixel2.element == "frog" || pixel2.element == "tadpole" || pixel2.element == "fish" || pixel2.element == "slug" || pixel2.element == "snail" || pixel2.element == "coral") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_animal" + } + else if (pixel2.element == "head_008" || pixel2.element == "head_012_1" || pixel2.element == "head_035" || pixel2.element == "head_049" || pixel2.element == "head_096" || pixel2.element == "head_1000" || pixel2.element == "head_1015") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_head" + } + else if (pixel2.element == "body_008" || pixel2.element == "body_012_1" || pixel2.element == "body_035" || pixel2.element == "body_049" || pixel2.element == "body_096" || pixel2.element == "body_1000" || pixel2.element == "body_1015") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_body" + } + else if (pixel2.element == "scp_236" || pixel2.element == "scp_391" || pixel2.element == "scp_1424") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_animal" + } + else if (pixel2.element == "skin" || pixel2.element == "meat" || pixel2.element == "cured_meat" || pixel2.element == "rotten_meat" || pixel2.element == "cooked_meat") { + pixel2.origElem = pixel2.element + pixel2.element = "fused_organism" + } + else if (pixel2.element == "dust" || pixel2.element == "cloth" || pixel2.element == "cloth_scrap" || pixel2.element == "hair" || pixel2.element == "loose_hair") { + deletePixel(pixel2.x,pixel2.y) + } + if (elements[pixel2.element].isBio) { + pixel2.origElem = pixel2.element + if (pixel2.con) { + delete pixel2.con + } + pixel2.element = "melted_animal" + } + else if (elements[pixel2.element].isHair || pixel2.element == "loose_hair" || pixel2.element == "gaseous_material" || pixel2.element == "digested_material" || pixel2.element == "urine" || pixel2.element == "excrement" || pixel2.element == "brain_jar_juice") { + deletePixel(pixel2.x,pixel2.y) + } + }, + reactions: { + "glass": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, + "glass_shard": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, + "rad_glass": { "color1":["#ff0000","#ff0000","#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] }, + "rad_shard": { "color1":["#ff0000","#ff0000","#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] }, + "steam": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, + "rain_cloud": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, + "cloud": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, + "smog": { "color1":["#ff0000","#ff0000","#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] }, + "ice": { "color1":["#ff0000","#c2fff9"] }, + "rime": { "color1":["#ff0000","#c2fff9"] }, + "water": { "color1":["#ff0000","#a1bac9"] }, + "salt_water": { "color1":["#ff0000","#a1bac9"] }, + "sugar_water": { "color1":["#ff0000","#a1bac9"] }, + "dirty_water": { "color1":["#ff0000","#a1c9a8"] }, + "seltzer": { "color1":["#ff0000","#c2fff9"] }, + "diamond": { "color1":["#ff0000","#c2c5ff","#c2d9ff"] }, + "rainbow": { "color1":["#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, + "static": { "color1":["#ff0000","#ffffff","#bdbdbd","#808080","#424242","#1c1c1c"] }, + "light": { elem2:"scp_001_light" }, + }, + temp: 35, + tempLow: -273, + stateLow: ["liquid_light",null], + stateLowColorMultiplier: 0.8, + category: "scp", + state: "gas", + density: 0.00001, + ignoreAir: true, + insulate: true +} + +elements.melted_body = { + color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"], + name: "SCP-001-A", + category: "scp", + hidden: true, + density: 1500, + state: "solid", + conduct: .05, + temp: 37, + tempHigh: 150, + stateHigh: "cooked_meat", + tempLow: -30, + stateLow: "frozen_meat", + burn: 10, + burnTime: 250, + burnInto: "cooked_meat", + breakInto: ["blood","meat","bone"], + forceSaveColor: true, + pickElement: "human", + onCollide: function(pixel1,pixel2) { + if (elements[pixel2.element].melteda && pixel2.element != "melted_head" && Math.random() > 0.9 && pixel2.origElem != pixel1.origElem) { + pixel2.element = "fused_organism" + pixel1.element = "fused_organism" + } + }, + melteda: true, + stain: 0.01875, + stainSelf: 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.01 }, + "fallout": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.01 }, + "plague": { elem1:"plague", chance:0.05 }, + "egg": { elem2:"yolk", chance:0.5, oneway:true }, + "grape": { elem2:"juice", chance:0.5, color2:"#291824", oneway:true }, + "ant": { elem2:"dead_bug", chance:0.05, oneway:true }, + "spider": { elem2:"dead_bug", oneway:true }, + "fly": { elem2:"dead_bug", oneway:true }, + "firefly": { elem2:"dead_bug", oneway:true }, + "bee": { elem2:"dead_bug", oneway:true }, + "flea": { elem2:"dead_bug", oneway:true }, + "termite": { elem2:"dead_bug", oneway:true }, + "worm": { elem2:"slime", chance:0.05, oneway:true }, + "stink_bug": { elem2:"stench", oneway:true }, + "grass_seed": { elem2:null, chance:0.05 }, + "sun": { elem1:"cooked_meat" }, + "alcohol": { chance:0.2, attr1:{"panic":0} }, + "anesthesia": { attr1:{"panic":0} }, + "alcohol_gas": { chance:0.2, attr1:{"panic":0} }, + }, + properties: { + dead: false, + dir: 1, + panic: 0, + }, + 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 === "melted_head") { + 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) { + pixel.element = "rotten_meat" + } + return + } + + // Find the head + if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "melted_head") { + var head = pixelMap[pixel.x][pixel.y-1]; + if (pixel.color != head.color) { + pixel.color = head.color + pixel.shirtless = true + } + else { + pixel.shirtless = true + } + if (head.dead) { // If head is dead, kill body + pixel.dead = head.dead; + } + else if (head.panic > 0) { + delete head.panic; + } + } + else if (!isEmpty(pixel.x, pixel.y-1, true) && (pixelMap[pixel.x][pixel.y-1].element == "head" || pixelMap[pixel.x][pixel.y-1].element == "head_008" || pixelMap[pixel.x][pixel.y-1].element == "head_012_1" || pixelMap[pixel.x][pixel.y-1].element == "head_035" || pixelMap[pixel.x][pixel.y-1].element == "head_049" || pixelMap[pixel.x][pixel.y-1].element == "head_1000" || pixelMap[pixel.x][pixel.y-1].element == "head_1015")) { + var head = pixelMap[pixel.x][pixel.y-1]; + if (pixel.color != head.color) { + pixel.color = head.color + } + head.element = "melted_head" + } + else { var head = null } + + if (isEmpty(pixel.x, pixel.y-1)) { + // create blood if decapitated 10% chance + if (Math.random() < 0.05 && !pixel.charge) { + createPixel("blood", pixel.x, pixel.y-1); + } + 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 : pixel.panic+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; + } + } + else if (!isEmpty(pixel.x+move[0], pixel.y+move[1], true)) { + var hitPixel = pixelMap[pixel.x+move[0]][pixel.y+move[1]]; + if (elements[hitPixel.element].melteda == true) { + hitPixel.element == "fused_organism" + pixel.element == "fused_organism" + } + } + } + // 15% chance to change direction + if (Math.random() < 0.2 || !moved) { + pixel.dir *= -1; + } + } + + } +} + +elements.melted_head = { + color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"], + name: "SCP-001-A", + category: "scp", + hidden: true, + density: 1080, + state: "solid", + conduct: .05, + temp: 37, + tempHigh: 150, + stateHigh: "cooked_meat", + tempLow: -30, + stateLow: "frozen_meat", + burn: 10, + burnTime: 250, + burnInto: "cooked_meat", + breakInto: ["blood","meat","bone"], + forceSaveColor: true, + pickElement: "human", + onCollide: function(pixel1,pixel2) { + if (elements[pixel2.element].melteda && pixel2.element != "melted_body" && Math.random() > 0.9 && pixel2.origElem != pixel1.origElem) { + pixel2.element = "fused_organism" + pixel1.element = "fused_organism" + } + }, + melteda: true, + stain: 0.0375, + stainSelf: 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} }, + "anesthesia": { attr1:{"panic":0} }, + "alcohol_gas": { 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) { + pixel.element = "rotten_meat" + return + } + } + + // Find the body + if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "melted_body") { + var body = pixelMap[pixel.x][pixel.y+1]; + if (body.dead) { // If body is dead, kill head + pixel.dead = body.dead; + } + } + else if (!isEmpty(pixel.x, pixel.y+1, true) && (pixelMap[pixel.x][pixel.y+1].element == "body" || pixelMap[pixel.x][pixel.y+1].element == "body_008" || pixelMap[pixel.x][pixel.y+1].element == "body_012_1" || pixelMap[pixel.x][pixel.y+1].element == "body_035" || pixelMap[pixel.x][pixel.y+1].element == "body_049" || pixelMap[pixel.x][pixel.y+1].element == "body_1000" || pixelMap[pixel.x][pixel.y+1].element == "body_1015")) { + var body = pixelMap[pixel.x][pixel.y+1]; + body.element = "melted_body" + } + else { var body = null } + + // check for eating food + if (body && !pixel.dead && Math.random() < 0.1) { + shuffleArray(interactCoordsShuffle); + for (var i = 0; i < interactCoordsShuffle.length; i++) { + var x = pixel.x+interactCoordsShuffle[i][0]; + var y = pixel.y+interactCoordsShuffle[i][1]; + if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].isFood && pixelMap[x][y].panic === undefined) { + deletePixel(x,y); + break; + } + if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].melteda == true && pixelMap[pixel.x][pixel.y+1] != pixelMap[x][y] && Math.random() > 0.9) { + pixelMap[x][y].element = "fused_organism" + break; + } + } + } + + 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.5 && !pixel.charge) { + // set dead to true 15% chance + if (Math.random() < 0.15) { + pixel.dead = pixelTicks; + } + } + } + }, +} + +elements.melted_animal = { + color: ["#997457","#a698a9","#ac8650","#997457","#a698a9","#ac8650","#997457","#a698a9","#ac8650","#4c4e42","#5e0b04","#4c4e42","#5e0b04","#56482d","#52472c","#635443"], + name: "SCP-001-A", + behavior: [ + "XX|M2%0.5|M2%2.5", + "XX|FX%2|M2%25 AND BO", + "XX|M1|M2", + ], + tick: function(pixel) { + if (pixel.r != undefined) { + delete pixel.r + } + }, + reactions: { + "oxygen": { elem2:"carbon_dioxide", chance:0.5 }, + "meat": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"melted_animal", chance:0.1 }, + "sun": { elem2:"scp_001_sdl", elem1:"cooked_meat" }, + }, + onCollide: function(pixel1,pixel2) { + if (elements[pixel2.element].melteda || pixel1.origElem != pixel2.origElem) { + pixel1.element = "fused_organism" + pixel2.element = "fused_organism" + } + }, + melteda: true, + stain: 0.04, + stainSelf: true, + tempHigh: 275, + stateHigh: "cooked_meat", + tempLow: -20, + stateLow: "frozen_meat", + burn: 10, + burnTime: 300, + burnInto: "cooked_meat", + state: "liquid", + density: 900, + category: "scp", +} + +elements.melted_plant = { + color: ["#00bf00","#439809","#258b08","#118511","#127b12","#136d14"], + name: "SCP-001-A", + behavior: [ + "XX|ST|XX", + "SP|XX|SP", + "M2%0.1|M1|M2%0.1", + ], + reactions: { + "sun": { elem2:"scp_001_sdl", elem1:"dead_plant" }, + "light": { elem2:"scp_001_light" }, + "carbon_dioxide": { elem2:"oxygen" }, + "tree_branch": { elem2:"wood" }, + }, + onCollide: function(pixel1,pixel2) { + if (elements[pixel2.element].melteda && pixel2.element != "melted_plant" && pixel2.origElem != pixel1.origElem) { + pixel2.element = "fused_organism" + pixel1.element = "fused_organism" + } + }, + melteda: true, + stain: 0.025, + stainSelf: true, + tempHigh: 250, + stateHigh: "dead_plant", + tempLow: -20, + stateLow: "frozen_plant", + burn: 10, + burnTime: 200, + burnInto: ["dead_plant","fire","fire","fire","ash"], + state: "liquid", + density: 1200, + category: "scp", + isFood: true, +} + +elements.fused_organism = { + color: ["#E5D6C7","#f7ead0"], + name: "SCP-001-A", + behavior: behaviors.LIQUID, + viscosity: 6000, + reactions: { + "meat": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"fused_organism", chance:0.1 }, + "blood": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"fused_organism", chance:0.1 }, + "infection": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"fused_organism", chance:0.1 }, + "cooked_meat": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"fused_organism", chance:0.1 }, + "sun": { elem2:"scp_001_sdl", elem1:"cooked_meat" }, + "light": { elem2:"scp_001_light" }, + }, + tick: function(pixel) { + if (Math.random() < 0.45) { + let y = Math.random() < 0.5 ? 0 : -1; + let xDir = Math.random() < 0.5 ? 1 : -1; + for (let x = 1; x < 20; x++) { + let x2 = pixel.x+(x*xDir); + let y2 = pixel.y+y; + if (!isEmpty(x2,y2,true)) { + let seenPixel = pixelMap[x2][y2]; + if (elements[seenPixel.element].category == "life") { + if (pixel.dir != 1 && pixelMap[x2][y2].x > pixel.x) { + pixel.dir = 1 + } + else if (pixel.dir != -1 && pixelMap[x2][y2].x < pixel.x) { + pixel.dir = -1 + } + } + if (elements[seenPixel.element].id != elements.glass.id && elements[seenPixel.element].id != elements.stained_glass.id && elements[seenPixel.element].id != elements.glass_shard.id) { + break; + } + } + } + } + + if (!pixel.dir || pixel.dir == undefined) { + pixel.dir = 0; + } + + if (pixel.panic > 0 || !pixel.panic || pixel.panic == undefined) { + pixel.panic = 0; + } + if (Math.random() < 0.05) { // Move 5% 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]; + tryMove(pixel, pixel.x+move[0], pixel.y+move[1]) && pixel.x===origx && pixel.y===origy + } + if (!isEmpty(pixel.x+move[0], pixel.y+move[1], true)) { + var hitPixel = pixelMap[pixel.x+move[0]][pixel.y+move[1]]; + if (hitPixel.element == "fused_organism" && hitPixel.dir != pixel.dir) { + hitPixel.dir = pixel.dir; + } + if (hitPixel.element == "fused_organism" && pixel.level && (hitPixel.level < pixel.level || !hitPixel.level )) { + hitPixel.level = pixel.level; + } + } + } + // 5% chance to change direction + if (Math.random() < 0.05 || !moved) { + pixel.dir *= -1; + } + } + // homeostasis + if (pixel.temp > 47) { pixel.temp -= 1; } + else if (pixel.temp < 20) { pixel.temp += 1; } + for (var i = 0; i < adjacentCoords.length; i++) { + var coords = adjacentCoords[i]; + var x = pixel.x + coords[0]; + var y = pixel.y + coords[1]; + if (!isEmpty(x,y) && !outOfBounds(x,y) && Math.random() > 0.05) { + var shatter = pixelMap[x][y] + let old = shatter.element; + if (shatter.element == "glass" || shatter.element == "rad_glass" || shatter.element == "stained_glass") { + breakPixel(shatter) + } + } + } + }, + onCollide: function(pixel1,pixel2) { + if (elements[pixel2.element].category == "life") { + if (pixel2.element == "head") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_head" + } + else if (pixel2.element == "body") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_body" + } + else if (pixel2.element == "plant" || pixel2.element == "grass" || pixel2.element == "kelp" || pixel2.element == "coral" || pixel2.element == "evergreen" || pixel2.element == "pistil" || pixel2.element == "petal" || pixel2.element == "bamboo" || pixel2.element == "bamboo_plant" || pixel2.element == "cactus" || pixel2.element == "corn" || pixel2.element == "wheat" || pixel2.element == "dead_plant" || pixel2.element == "sapling" || pixel2.element == "pinecone") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_plant" + } + else if (pixel2.element == "tree_branch") { + pixel2.element = "wood" + } + else { + pixel2.element = "fused_organism" + } + } + if (elements[pixel2.element].category == "food") { + if (pixel2.element != "salt" && pixel2.element != "sugar" && pixel2.element != "broth" && pixel2.element != "hard_yolk" && pixel2.element != "sauce" && pixel2.element != "popcorn" && pixel2.element != "baked_potato" && pixel2.element != "mashed_potato" && pixel2.element != "bread" && pixel2.element != "toast" && pixel2.element != "gingerbread" && pixel2.element != "crumb" && pixel2.element != "baked_batter" && pixel2.element != "candy" && pixel2.element != "coffee_ground" && pixel2.element != "nut_oil" && pixel2.element != "baking_soda" && pixel2.element != "yogurt" && pixel2.element != "frozen_yogurt" && pixel2.element != "ice_cream" && pixel2.element != "ramen" && pixel2.element != "frosting" && pixel2.element != "soy_sauce" && pixel2.element != "corn_starch" && pixel2.element != "boba" && pixel2.element != "curry_powder" && pixel2.element != "olive_oil" && pixel2.element != "tatorade" && pixel2.element != "plain_cookie" && pixel2.element != "cookie") { + pixel2.element = "fused_organism" + } + } + if (pixel2.element == "paper" || pixel2.element == "confetti") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_plant" + } + if (pixel2.element == "head_008" || pixel2.element == "head_012_1" || pixel2.element == "head_035" || pixel2.element == "head_1000" || pixel2.element == "head_1015") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_head" + } + else if (pixel2.element == "body_008" || pixel2.element == "body_012_1" || pixel2.element == "body_035" || pixel2.element == "body_1000" || pixel2.element == "body_1015") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_body" + } + else if (pixel2.element == "scp_236" || pixel2.element == "scp_391" || pixel2.element == "scp_1424") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_animal" + } + else if (pixel2.element == "skin" || pixel2.element == "meat" || pixel2.element == "cured_meat" || pixel2.element == "rotten_meat" || pixel2.element == "cooked_meat" ) { + pixel2.element = "fused_organism" + } + else if (pixel2.element == "dust" || pixel2.element == "cloth" || pixel2.element == "cloth_scrap" || pixel2.element == "hair" || pixel2.element == "loose_hair") { + deletePixel(pixel2.x,pixel2.y) + } + if (elements[pixel2.element].melteda && (pixel2.element != "melted_body" || pixel2.shirtless == true && Math.random() > 0.5) && pixel2.element != "fused_organism") { + pixel2.element = "fused_organism" + } + else if (elements[pixel2.element].isBio == true) { + pixel2.origElem = pixel2.element + if (pixel2.con) { + delete pixel2.con + } + pixel2.element = "melted_animal" + } + else if (elements[pixel2.element].isHair == true || pixel2.element == "gaseous_material" || pixel2.element == "digested_material" || pixel2.element == "urine" || pixel2.element == "excrement" || pixel2.element == "brain_jar_juice") { + deletePixel(pixel2.x,pixel2.y) + } + }, + melteda: true, + stain: 0.125, + stainSelf: true, + tempHigh: 300, + stateHigh: "cooked_meat", + tempLow: -15, + stateLow: "frozen_meat", + burn: 5, + burnTime: 400, + burnInto: "cooked_meat", + state: "liquid", + density: 2000, + category: "scp", +} + elements.scp_008 = { name: "SCP-008", color: "#11111f", @@ -741,7 +1574,7 @@ elements.frozen_008 = { elements.body_008 = { name: "SCP-008-1", color: ["#069469","#047e99","#7f5fb0"], - category: "life", + category: "scp", hidden: true, density: 1500, state: "solid", @@ -915,7 +1748,7 @@ elements.body_008 = { elements.head_008 = { color: ["#75816B","#4D6B53"], name: "SCP-008-1", - category: "life", + category: "scp", hidden: true, density: 1080, state: "solid", @@ -2174,7 +3007,7 @@ elements.scp_035 = { color: ["#f7ead0","#faf9f6","#e9e6db"], buttonColor: ["#11111f","#f7ead0","#f7ead0","#f7ead0","#f7ead0","#11111f","#faf9f6","#faf9f6","#faf9f6","#faf9f6","#11111f","#e9e6db","#e9e6db","#e9e6db","#e9e6db","#11111f"], name: "SCP-035", - hardness: 0.9, + hardness: 0.98, category: "scp", behavior: [ "CR:black_acid%0.05|CR:black_acid%0.25|CR:black_acid%0.05", @@ -2215,7 +3048,7 @@ elements.scp_035 = { elements.body_035 = { color: ["#069469","#047e99","#7f5fb0"], - name: "SCP-035-1", + name: "SCP-035", category: "life", hidden: true, density: 1500, @@ -2377,7 +3210,7 @@ elements.body_035 = { } elements.head_035 = { - name: "SCP-035-1", + name: "SCP-035", color: ["#f7ead0","#faf9f6","#e9e6db"], category: "life", hidden: true, @@ -2483,7 +3316,7 @@ elements.black_acid = { "DB%3 AND M2%10|DL%1|DB%3 AND M2%10", "DB%3 AND M2%10|DB%5.5 AND M1|DB%3 AND M2%10", ], - ignore: [/*"scp_804"*/"shy_head","shy_body","scp_055","head","body","body_008","head_008","scp_035","body_035","head_035","glass_shard","porcelain_shard","rad_shard","color_sand","sand","iron","steel","glass","rad_glass","stained_glass","acid_gas","neutral_acid","acid_cloud","water","salt_water","sugar_water","dirty_water","copper","gold","porcelain","plastic","bead","microplastic","molten_plastic","pool_water","chlorine","hydrogen","oxygen","ozone","gold_coin","silver","nickel","calcium"], + ignore: [/*"scp_804"*/"head_096","body_096","scp_055","head","body","body_008","head_008","scp_035","body_035","head_035","glass_shard","porcelain_shard","rad_shard","color_sand","sand","iron","steel","glass","rad_glass","stained_glass","acid_gas","neutral_acid","acid_cloud","water","salt_water","sugar_water","dirty_water","copper","gold","porcelain","plastic","bead","microplastic","molten_plastic","pool_water","chlorine","hydrogen","oxygen","ozone","gold_coin","silver","nickel","calcium"], reactions: { "caustic_potash": { elem1:null, elem2:"potassium_salt" }, "water": { elem1:null, elem2:"dirty_water" }, @@ -3169,7 +4002,7 @@ elements.scp_063 = { "DL|XX|DL", "M2%80 AND DL|M1 AND DL|M2%80 AND DL", ], - ignore: ["scp_063","head_049","body_049","shy_head","shy_body","head_049_1","body_049_1","head_008_1","body_008_1","head_012_1","body_012_1","scp_999","scp_682","head","body","plant","grass","algae","cell","cancer","worm","flea","termite","ant","spider","fly","firefly","bee","stink_bug","human","bird","rat","frog","tadpole","fish","slug","snail","sapling","evergreen","cactus","kelp","coral","pistil","tree_branch","vine","bamboo_plant","mushroom_stalk","mushroom_gill","mushroom_cap","lichen","homunculus","root","hyphae","skin","porcelain"], + ignore: ["scp_063","head_049","body_049","head_096","body_096","head_049_1","body_049_1","head_008","body_008","head_012_1","body_012_1","scp_999","scp_682","head","body","plant","grass","algae","cell","cancer","worm","flea","termite","ant","spider","fly","firefly","bee","stink_bug","human","bird","rat","frog","tadpole","fish","slug","snail","sapling","evergreen","cactus","kelp","coral","pistil","tree_branch","vine","bamboo_plant","mushroom_stalk","mushroom_gill","mushroom_cap","lichen","homunculus","root","hyphae","skin","porcelain"], category: "scp", tempHigh: 190, stateHigh: ["molten_plastic","molten_plastic","fire","dioxin"], @@ -3194,24 +4027,24 @@ elements.scp_096 = { }, onPlace: function(pixel) { if (isEmpty(pixel.x, pixel.y+1)) { - createPixel("shy_body", pixel.x, pixel.y+1); - pixel.element = "shy_head"; + createPixel("body_096", pixel.x, pixel.y+1); + pixel.element = "head_096"; } else if (isEmpty(pixel.x, pixel.y-1)) { - createPixel("shy_head", pixel.x, pixel.y-1); + createPixel("head_096", pixel.x, pixel.y-1); pixelMap[pixel.x][pixel.y-1].color = pixel.color; - pixel.element = "shy_body"; + pixel.element = "body_096"; pixel.color = pixelColorPick(pixel) } else { deletePixel(pixel.x, pixel.y); } }, - related: ["shy_body","shy_head"], + related: ["body_096","head_096"], cooldown: defaultCooldown } -elements.shy_head = { +elements.head_096 = { hidden: true, name: "SCP-096", color: ["#ddd2d6","#C9BCC2","#b6adb2"], @@ -3234,7 +4067,7 @@ elements.shy_head = { } // Find the body - if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "shy_body") { + if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_096") { var body = pixelMap[pixel.x][pixel.y+1]; if (body.dead) { // If body is dead, kill head pixel.dead = body.dead; @@ -3294,7 +4127,7 @@ elements.shy_head = { }, }, -elements.shy_body = { +elements.body_096 = { name: "SCP-096", hidden: true, color: ["#ddd2d6","#C9BCC2","#b6adb2"], @@ -3311,7 +4144,7 @@ elements.shy_body = { 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 == "shy_head") { + if (headpixel.element == "head_096") { if (isEmpty(pixel.x, pixel.y-1)) { movePixel(pixelMap[pixel.x][pixel.y-2], pixel.x, pixel.y-1); } @@ -3326,7 +4159,7 @@ elements.shy_body = { doElectricity(pixel); // Find the head - if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "shy_head") { + if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_096") { var head = pixelMap[pixel.x][pixel.y-1]; } else { var head = null } @@ -3417,7 +4250,7 @@ elements.shy_body = { if (seenPixel.y < pixel.y) { if (!isEmpty(pixel.x, pixel.y-1, true)) { var headpixel = pixelMap[pixel.x][pixel.y-1]; - if (headpixel.element == "shy_head") { + if (headpixel.element == "head_096") { if (isEmpty(pixel.x, pixel.y-3)) { tryMove(headpixel, pixel.x, pixel.y-3); if (isEmpty(pixel.x, pixel.y-2)) { @@ -3455,7 +4288,7 @@ elements.shy_body = { if (seenPixel.y > pixel.y) { if (!isEmpty(pixel.x, pixel.y-1, true)) { var headpixel = pixelMap[pixel.x][pixel.y-1]; - if (headpixel.element == "shy_head") { + if (headpixel.element == "head_096") { if (isEmpty(pixel.x, pixel.y+1)) { tryMove(headpixel, pixel.x, pixel.y+1); if (isEmpty(pixel.x, pixel.y+2)) { @@ -3482,16 +4315,16 @@ elements.shy_body = { } } } - if (isEmpty(pixel.x, pixel.y-1) || !isEmpty(pixel.x,pixel.y-1) && pixelMap[pixel.x][pixel.y-1].element != "shy_head") { + if (isEmpty(pixel.x, pixel.y-1) || !isEmpty(pixel.x,pixel.y-1) && pixelMap[pixel.x][pixel.y-1].element != "head_096") { // create blood if decapitated 5% chance if (Math.random() < 0.05 && !pixel.charge) { createPixel("blood", pixel.x, pixel.y-1); } if (Math.random() < 0.9 && isEmpty(pixel.x,pixel.y-1)) { - createPixel("shy_head",pixel.x,pixel.y-1) + createPixel("head_096",pixel.x,pixel.y-1) } else if (Math.random() < 0.025 && !isEmpty(pixel.x,pixel.y-1,true) && !outOfBounds(pixel.x,pixel.y-1) ) { - changePixel(pixelMap[pixel.x][pixel.y-1],"shy_head") + changePixel(pixelMap[pixel.x][pixel.y-1],"head_096") } } else if (head == null) { return } @@ -3577,7 +4410,7 @@ elements.shy_body = { } // if (Math.random() > ((1-(elements[pixel.element].hardness || 1)) * (shiftDown ? 0.5 : 1))) { } - else if (old === pixel2.element && elements[pixel2.element].movable && !isEmpty(pixel2.x,pixel2.y+1) && !paused && pixel2.element != "shy_head" && pixel2.element != "shy_body") { + else if (old === pixel2.element && elements[pixel2.element].movable && !isEmpty(pixel2.x,pixel2.y+1) && !paused && pixel2.element != "head_096" && pixel2.element != "body_096") { let x = 0; let y = 0; if (Math.random() < 0.66) x = Math.random() < 0.5 ? 1 : -1; if (Math.random() < 0.66) y = Math.random() < 0.5 ? 1 : -1; @@ -3587,16 +4420,16 @@ elements.shy_body = { } } else { - if (isEmpty(pixel.x, pixel.y-1) || !isEmpty(pixel.x,pixel.y-1) && pixelMap[pixel.x][pixel.y-1].element != "shy_head") { + if (isEmpty(pixel.x, pixel.y-1) || !isEmpty(pixel.x,pixel.y-1) && pixelMap[pixel.x][pixel.y-1].element != "head_096") { // create blood if decapitated 5% chance if (Math.random() < 0.05 && !pixel.charge) { createPixel("blood", pixel.x, pixel.y-1); } if (Math.random() < 0.2 && isEmpty(pixel.x,pixel.y-1)) { - createPixel("shy_head",pixel.x,pixel.y-1) + createPixel("head_096",pixel.x,pixel.y-1) } else if (!isEmpty(pixel.x,pixel.y-1,true) && !outOfBounds(pixel.x,pixel.y-1) && (Math.random() < 0.1 || elements[pixelMap[pixel.x][pixel.y].element].state != "solid")) { - changePixel(pixelMap[pixel.x][pixel.y-1],"shy_head") + changePixel(pixelMap[pixel.x][pixel.y-1],"head_096") } } else if (head == null) { return } @@ -3719,7 +4552,6 @@ elements.body_173 = { hidden: true, density: 2400, state: "solid", - conduct: .025, tempHigh: 15050, hardness: 1, stateHigh: ["magma","magma","magma","magma","rust","rust","rust","magma","magma","magma","magma","rust","rust","rust","spray_paint"], @@ -3999,7 +4831,6 @@ elements.head_173 = { hidden: true, density: 2400, state: "solid", - conduct: .025, tempHigh: 15050, hardness: 1, stateHigh: ["magma","magma","magma","magma","rust","rust","rust","magma","magma","magma","magma","rust","rust","rust","spray_paint"], @@ -4420,6 +5251,258 @@ elements.scp_236 = { conduct: 0.2, } +elements.scp_261 = { + name: "SCP-261", + color: ["#2E312E","#252623","#120F10"], + properties: { + db: 0, + strange: 0, + }, + tick: function(pixel) { + if (typeof pixel.db == "undefined"){pixel.db = 0} + 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)){ + let newPixel = pixelMap[x][y] + if (newPixel.charge || newPixel.chargeCD){ + pixel.db = 10 + } + } + } + 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)){ + let newPixel = pixelMap[x][y] + if ((newPixel.element == "gold_coin" || newPixel.element == "penny" || newPixel.element == "bronze_coin" || newPixel.element == "money") && Math.random() > 0.15) { + pixel.strange++ + deletePixel(newPixel.x,newPixel.y) + if (pixel.strange > 25 && (Math.random() > (pixel.db*0.1))) { + let count = 1 + 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)) { + if (Math.random() < 0.3) { + createPixel("packet",x,y); + pixelMap[x][y].has = vendingWeirdF[Math.floor(Math.random() * vendingWeirdF.length)] + } + else if (Math.random() < 0.65) { + createPixel("can",x,y); + pixelMap[x][y].has = vendingWeirdD[Math.floor(Math.random() * vendingWeirdD.length)] + } + else if (Math.random() < 0.78) { + createPixel(vendingNormF[Math.floor(Math.random() * vendingNormF.length)],x,y); + } + else { + createPixel(vendingNormD[Math.floor(Math.random() * vendingNormD.length)],x,y); + } + count--; + if (count <= 0) { + return pixelMap[x][y]; + } + } + else if (!isEmpty(x,y,true) && (elements[pixelMap[x][y].element].state === "liquid" || elements[pixelMap[x][y].element].state === "gas")) { + if (Math.random() < 0.3) { + changePixel(pixelMap[x][y],"packet"); + pixelMap[x][y].has = vendingWeirdF[Math.floor(Math.random() * vendingWeirdF.length)] + } + else if (Math.random() < 0.65) { + changePixel(pixelMap[x][y],"can"); + pixelMap[x][y].has = vendingWeirdD[Math.floor(Math.random() * vendingWeirdD.length)] + } + else if (Math.random() < 0.78) { + changePixel(pixelMap[x][y],vendingNormF[Math.floor(Math.random() * vendingNormF.length)]); + } + else { + changePixel(pixelMap[x][y],vendingNormD[Math.floor(Math.random() * vendingNormD.length)]); + } + count--; + if (count <= 0) { + return pixelMap[x][y]; + } + } + } + } + else { + let count = 1 + 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)) { + if (Math.random() < 0.5) { + createPixel("packet",x,y); + if (Math.random() < 0.06666) { + pixelMap[x][y].has = "crumb" + } + else if (Math.random() < 0.23333) { + pixelMap[x][y].has = "toast" + } + else if (Math.random() < 0.4) { + pixelMap[x][y].has = "bread" + } + else if (Math.random() < 0.56666) { + pixelMap[x][y].has = "cooked_meat" + } + else if (Math.random() < 0.73333) { + pixelMap[x][y].has = "chocolate" + } + else { + pixelMap[x][y].has = vendingNormF[Math.floor(Math.random() * vendingNormF.length)] + } + } + else if (Math.random() < 0.9) { + createPixel("can",x,y); + if (Math.random() < 0.23333) { + pixelMap[x][y].has = "soda" + } + else if (Math.random() < 0.4) { + pixelMap[x][y].has = "seltzer" + } + else if (Math.random() < 0.56666) { + pixelMap[x][y].has = "juice" + } + else if (Math.random() < 0.73333) { + pixelMap[x][y].has = "poison" + } + else { + pixelMap[x][y].has = vendingNormD[Math.floor(Math.random() * vendingNormD.length)] + } + } + else { + createPixel(vendingNormF[Math.floor(Math.random() * vendingNormF.length)],x,y); + } + count--; + if (count <= 0) { + return pixelMap[x][y]; + } + } + else if (!isEmpty(x,y,true) && (elements[pixelMap[x][y].element].state === "liquid" || elements[pixelMap[x][y].element].state === "gas")) { + if (Math.random() < 0.5) { + changePixel(pixelMap[x][y],"packet"); + if (Math.random() < 0.06666) { + pixelMap[x][y].has = "crumb" + } + else if (Math.random() < 0.23333) { + pixelMap[x][y].has = "toast" + } + else if (Math.random() < 0.4) { + pixelMap[x][y].has = "bread" + } + else if (Math.random() < 0.56666) { + pixelMap[x][y].has = "cooked_meat" + } + else if (Math.random() < 0.73333) { + pixelMap[x][y].has = "chocolate" + } + else { + pixelMap[x][y].has = vendingNormF[Math.floor(Math.random() * vendingNormF.length)] + } + } + else if (Math.random() < 0.9) { + changePixel(pixelMap[x][y],"can"); + if (Math.random() < 0.23333) { + pixelMap[x][y].has = "soda" + } + else if (Math.random() < 0.4) { + pixelMap[x][y].has = "seltzer" + } + else if (Math.random() < 0.56666) { + pixelMap[x][y].has = "juice" + } + else if (Math.random() < 0.73333) { + pixelMap[x][y].has = "poison" + } + else { + pixelMap[x][y].has = vendingNormD[Math.floor(Math.random() * vendingNormD.length)] + } + } + else { + changePixel(pixelMap[x][y],vendingNormF[Math.floor(Math.random() * vendingNormF.length)]); + } + count--; + if (count <= 0) { + return pixelMap[x][y]; + } + } + } + } + } + } + } + if (pixel.db > 0) { + pixel.db-- + } + if (Math.random() > 0.95 && pixel.strange > 0) { + pixel.strange-- + } + tryMove(pixel, pixel.x, pixel.y+1); + doDefaults(pixel); + }, + grain: 0.5, + behavior: behaviors.WALL, + tempHigh: 1200, + stateHigh: ["molten_galvanized_steel","molten_galvanized_steel","molten_galvanized_steel","molten_galvanized_steel","armageddon"], + stateHighColorMultiplier: 0.86, + hardness: 0.99, + breakInto: ["galvanized_steel","galvanized_steel","galvanized_steel","galvanized_steel","armageddon"], + breakIntoColorMultiplier: [1.1,1,0.86], + category: "scp", + state: "solid", + density: 7850, +} + +elements.packet = { + behavior: behaviors.POWDER, + category: "powders", + hidden: true, + state: "solid", + color: ["#dc2c37","#edce66","#0dbf62","#0679ea","#7144b2","#d92097","#dc2c37","#edce66","#0dbf62","#0679ea","#7144b2","#d92097","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#dbbfe3", "#cc95db","#c477d9","#b85cd1", "#8d5cd1","#9e77d9","#cc95db", "#95a4db","#7789d9","#5c68d1", "#c1bfe3"], + tempHigh: 250, + stateHigh: ["metal_scrap","metal_scrap","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard"], + burn: 10, + burnTime: 200, + burnInto: ["metal_scrap","metal_scrap","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard"], + breakInto: ["metal_scrap","metal_scrap","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard"], + properties: { + has: "dust", + }, + onChange: function(pixel) { + releaseElement(pixel,pixel.has,4,true) + }, + onDelete: function(pixel) { + releaseElement(pixel,pixel.has,4,true) + }, + breakIntoColorMultiplier: [1.1,1,0.86], +} + +elements.can = { + behavior: behaviors.POWDER, + category: "powders", + hidden: true, + state: "solid", + color: ["#ff5e5e","#ffcc5e","#76ff5e","#5ed4ff","#5e61ff","#cf5eff","#d1c6be","#b5c0ad","#b9b8bc","#d1c6be","#b5c0ad","#b9b8bc","#ff5e5e","#ffcc5e","#76ff5e","#5ed4ff","#5e61ff","#cf5eff","#5e807d","#5e807d","#679e99","#5e807d","#5e807d"], + tempHigh: 250, + stateHigh: ["metal_scrap","metal_scrap","metal_scrap","metal_scrap","metal_scrap","rust","metal_scrap","rust","oxidized_copper","bead","glass_shard","glitter","glass_shard"], + breakInto: ["metal_scrap","metal_scrap","metal_scrap","metal_scrap","metal_scrap","rust","metal_scrap","rust","oxidized_copper","bead","glass_shard","glitter","glass_shard"], + hardness: 0.266, + properties: { + has: "foam", + }, + onChange: function(pixel) { + releaseElement(pixel,pixel.has,4,true) + }, + onDelete: function(pixel) { + releaseElement(pixel,pixel.has,4,true) + }, + breakIntoColorMultiplier: [1.1,1,0.86], +} + elements.scp_391 = { name: "SCP-391", color: ["#D7D0CA","#D7BFB5","#B49171","#986536","#B49171","#623613"], @@ -6708,7 +7791,7 @@ elements.scp_1600 = { pixel.color = "rgb("+avg.join(",")+")"; } }, - ignore: ["scp_1600_1","gallium","brass","zinc","sulfur","body_173","head_173","shy_body","shy_head","body_049","head_049","scp_035","scp_1015","scp_999","scp_063","scp_055"], + ignore: ["scp_261","scp_1600_1","gallium","brass","zinc","sulfur","body_173","head_173","body_096","head_096","body_049","head_049","scp_035","scp_1015","scp_999","scp_063","scp_055"], canPlace: true, reactions: { "scp_682":{ stain2:"#CA8E2F", chance:0.05,}, From 7ff1be2ae68a7b570572e8d60ddacbc0cad4dd76 Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Wed, 15 Oct 2025 18:44:41 -0700 Subject: [PATCH 04/19] Delete mods/daybreak.js --- mods/daybreak.js | 426 ----------------------------------------------- 1 file changed, 426 deletions(-) delete mode 100644 mods/daybreak.js diff --git a/mods/daybreak.js b/mods/daybreak.js deleted file mode 100644 index fb85815c..00000000 --- a/mods/daybreak.js +++ /dev/null @@ -1,426 +0,0 @@ -elements.beautiful_sun = { - color: "#c12600", - tick: function(pixel) { - // minimum 1726 - // maximum 7726 - if (pixel.eclipse) { pixel.color = pixelColorPick(pixel,"#f68656"); var c=0.01} - else if (pixel.temp < 1500) { pixel.color = pixelColorPick(pixel,"#7a4e43"); } - else if (pixel.temp < 3600) { pixel.color = pixelColorPick(pixel,"#ffbdbd"); var c=0.05 } - else if (pixel.temp < 7000) { pixel.color = pixelColorPick(pixel,"#c12600"); var c=0.1 } - else if (pixel.temp < 11000) { pixel.color = pixelColorPick(pixel,"#ffb09c"); var c=0.25 } - else if (pixel.temp < 28000) { pixel.color = pixelColorPick(pixel,"#f7fff5"); var c=0.5 } - else { pixel.color = pixelColorPick(pixel,"#c3bdff"); var c=0.4 } - if (pixel.temp < 1500) { var c=0 } - for (var i = 0; i < adjacentCoords.length; i++) { - var x = pixel.x+adjacentCoords[i][0]; - var y = pixel.y+adjacentCoords[i][1]; - if (isEmpty(x,y)) { - if (Math.random() > c) {continue} - createPixel("beautiful_light", x, y); - pixelMap[x][y].color = pixel.color; - } - else if (!outOfBounds(x,y)) { - var newPixel = pixelMap[x][y]; - if (elements[newPixel.element].id === elements.beautiful_sun.id) { - if (pixel.eclipse) { newPixel.eclipse = true } - if (pixel.temp!==newPixel.temp) { - var avg = (pixel.temp + newPixel.temp)/2; - pixel.temp = avg; - newPixel.temp = avg; - pixelTempCheck(pixel); - pixelTempCheck(newPixel); - } - } - else if (elements[newPixel.element].id === elements.sun.id) { - changePixel(newPixel, "beautiful_sun"); - } - } - } - }, - tool: function(pixel) { - if (pixel.element === "light") { - deletePixel(pixel.x,pixel.y); - } - if (pixel.element === "beautiful_light") { - deletePixel(pixel.x,pixel.y); - } - }, - canPlace: true, - reactions: { - "hydrogen": { elem2:"helium", temp1:5 }, - "helium": { elem2:"carbon_dioxide", temp1:5, tempMax:3600 }, - "carbon_dioxide": { elem2:"neon", temp1:5, tempMax:1800 }, - "sun": { elem2:"beautiful_sun", }, - "light": { elem2:"beautiful_light" }, - }, - temp: 5504, - tempLow: -100, - stateLow: "supernova", - category: "brokenday", - state: "gas", - //density: 1408, - insulate: true, - noMix: true, - alias: "hateful_star", - movable: false -}, - -elements.beautiful_light = { - hidden: true, - name: "light", - color: "#c12600", - tick: function(pixel) { - if (Math.random() < 0.01) { - deletePixel(pixel.x,pixel.y); - return; - } - if (pixel.bx===undefined) { - // choose 1, 0, or -1 - pixel.bx = Math.random() < 0.5 ? 1 : Math.random() < 0.5 ? 0 : -1; - pixel.by = Math.random() < 0.5 ? 1 : Math.random() < 0.5 ? 0 : -1; - // if both are 0, make one of them 1 or -1 - if (pixel.bx===0 && pixel.by===0) { - if (Math.random() < 0.5) { pixel.bx = Math.random() < 0.5 ? 1 : -1; } - else { pixel.by = Math.random() < 0.5 ? 1 : -1; } - } - } - // move and invert direction if hit - if (pixel.bx && !tryMove(pixel, pixel.x+pixel.bx, pixel.y)) { - var newX = pixel.x + pixel.bx; - if (!isEmpty(newX, pixel.y, true)) { - var newPixel = pixelMap[pixel.x+pixel.bx][pixel.y]; - if (!elements[newPixel.element].insulate) { - newPixel.temp += 1; - pixelTempCheck(newPixel); - } - if (!elements.light.reactions[newPixel.element]) { - pixel.color = newPixel.color; - } - else if (!elements.beautiful_light.reactions[newPixel.element]) { - pixel.color = newPixel.color; - } - } - pixel.bx = -pixel.bx; - } - if (pixel.by && !tryMove(pixel, pixel.x, pixel.y+pixel.by)) { - var newY = pixel.y + pixel.by; - if (!isEmpty(pixel.x, newY, true)) { - var newPixel = pixelMap[pixel.x][pixel.y+pixel.by]; - if (!elements[newPixel.element].insulate) { - newPixel.temp += 0.05; - pixelTempCheck(newPixel); - } - if (!elements.light.reactions[newPixel.element]) { - pixel.color = newPixel.color; - } - else if (!elements.beautiful_light.reactions[newPixel.element]) { - pixel.color = newPixel.color; - } - } - pixel.by = -pixel.by; - } - }, - reactions: { - "glass": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, - "glass_shard": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, - "rad_glass": { "color1":["#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] }, - "rad_shard": { "color1":["#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] }, - "steam": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, - "rain_cloud": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, - "cloud": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, - "smog": { "color1":["#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] }, - "ice": { "color1":"#c2fff9" }, - "rime": { "color1":"#c2fff9" }, - "water": { "color1":"#a1bac9" }, - "salt_water": { "color1":"#a1bac9" }, - "sugar_water": { "color1":"#a1bac9" }, - "dirty_water": { "color1":"#a1c9a8" }, - "seltzer": { "color1":"#c2fff9" }, - "diamond": { "color1":["#c2c5ff","#c2d9ff"] }, - "rainbow": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, - "static": { "color1":["#ffffff","#bdbdbd","#808080","#424242","#1c1c1c"] }, - "sun": { elem2:"beautiful_sun", }, - "light": { elem2:"beautiful_light" }, - "meat": { elem2:"fused_organism" }, - "head": { elem2:"melted_human" }, - "body": { elem2:"melted_human" }, - "dead_bug": { elem2:"melted_insect" }, - "worm": { elem2:"melted_insect" }, - "ant": { color2:"#5E0B04", elem2:"melted_insect" }, - "bee": { elem2:"melted_insect" }, - "fly": { elem2:"melted_insect" }, - "firefly": { elem2:"melted_insect" }, - "stinkbug": { elem2:"melted_insect" }, - "slug": { color2:["#997e12","#997e12","#997e12","#997e12","#997e12","#997e12","#403314","#403314","#403314","#403314","#403314","#403314","#124a44"], elem2:"melted_insect" }, - "snail": { color2:"#5c3104", elem2:"melted_insect", chance:0.5 }, - "tree_branch": { elem2:"wood" }, - "plant": { elem2:"melted_plant" }, - "grass": { elem2:"melted_plant" }, - "evergreen": { color2:"#006300", elem2:"melted_plant" }, - "pistil": { elem2:"melted_plant" }, - "petal": { color2:["#ff0000","#ff8800","#ffff00","#88ff00","#00ff00","#00ff88","#00ffff","#0088ff","#0000ff","#8800ff","#ff00ff"], elem2:"melted_plant" }, - "bamboo": { elem2:"melted_plant" }, - "bamboo_plant": { elem2:"melted_plant" }, - "cactus": { elem2:"melted_plant" }, - "corn": { color2:["#f8d223","#d6ba2a","#f7f5ba","#dbd281","#cdb12d"], elem2:"melted_plant" }, - "wheat": { color2:["#f1b569","#edb864","#de9c45","#c2853d"], elem2:"melted_plant" }, - "dead_plant": { elem2:"melted_plant" }, - "sapling": { elem2:"melted_plant" }, - "pinecone": { color2:["#5c3e33","#472f27","#31211b"], elem2:"melted_plant" }, - "bird": { color2:"#997457", elem2:"melted_animal" }, - "rat": { color2:["#a698a9","#8c7d82","#ccc3cf"], elem2:"melted_animal" }, - "fish": { elem2:"melted_fish", chance:0.2 }, - "tadpole": { color2:"#87b574", elem2:"melted_fish", chance:0.2 }, - "frog": { color2:"#607300", elem2:"melted_fish", chance:0.2 }, - }, - temp: 35, - tempLow: -273, - stateLow: ["liquid_light",null], - stateLowColorMultiplier: 0.8, - category: "brokenday", - state: "gas", - density: 0.00001, - ignoreAir: true, - insulate: true -}, - -elements.melted_human = { - color: ["#f3e7db","#eadaba","#d7bd96","#a07e56"], - behavior: behaviors.LIQUID, - viscosity: 7500, - reactions: { - "oxygen": { elem2:"carbon_dioxide", chance:0.5 }, - "meat": { elem2:null, chance:0.1 }, - "cooked_meat": { elem2:null, chance:0.1 }, - "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" }, - "light": { elem2:"beautiful_light" }, - "dead_bug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - "ant": { color2:"#D2B6AB", elem2:"fused_organism", chance:0.2 }, - "bee": { color2:"#E9DBAA", elem2:"fused_organism", chance:0.2 }, - "fly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "firefly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "stinkbug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "slug": { color2:["#DFD0AE","#E5D6C7"], elem2:"fused_organism", chance:0.2 }, - "snail": { color2:"#E5D6C7", elem2:"fused_organism", chance:0.15 }, - "head": { elem2:"melted_human", chance:0.1 }, - "body": { elem2:"melted_human", chance:0.1 }, - "bird": { color2:"#DAC8B7", elem2:"fused_organism", chance:0.1 }, - "rat": { color2:["#E2D5D0","#EADFD8"], elem2:"fused_organism", chance:0.1 }, - "fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.2 }, - "tadpole": { color2:"#DBDCC4", elem2:"fused_organism", chance:0.2 }, - "frog": { color2:"#D2CDAA", elem2:"fused_organism", chance:0.2 }, - "melted_fish": { color2:"#E3D1BC",elem2:"fused_organism", chance:0.1 }, - "melted_animal": { color2:["#E2D5D0","#EADFD8","#DAC8B7"], elem2:"fused_organism", chance:0.1 }, - "melted_insect": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - }, - tempHigh: 300, - stateHigh: "cooked_meat", - tempLow: -20, - stateLow: "frozen_meat", - burn: 10, - burnTime: 300, - burnInto: "cooked_meat", - state: "liquid", - density: 1900, - category: "brokenday", -}, - -elements.melted_animal = { - color: ["#997457","#a698a9"], - behavior: behaviors.LIQUID, - viscosity: 7500, - reactions: { - "oxygen": { elem2:"carbon_dioxide", chance:0.5 }, - "meat": { elem2:"fused_organism", chance:0.1 }, - "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" }, - "light": { elem2:"beautiful_light" }, - "dead_bug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - "ant": { color2:"#D2B6AB", elem2:"fused_organism", chance:0.2 }, - "bee": { color2:"#E9DBAA", elem2:"fused_organism", chance:0.2 }, - "fly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "firefly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "stinkbug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "slug": { color2:["#DFD0AE","#E5D6C7"], elem2:"fused_organism", chance:0.2 }, - "snail": { color2:"#E5D6C7", elem2:"fused_organism", chance:0.15 }, - "head": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "body": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "bird": { color2:"#997457", elem2:"melted_animal", chance:0.2 }, - "rat": { color2:["#a698a9","#8c7d82","#ccc3cf"], elem2:"melted_animal", chance:0.2 }, - "fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.2 }, - "tadpole": { color2:"#DBDCC4", elem2:"fused_organism", chance:0.2 }, - "frog": { color2:"#D2CDAA", elem2:"fused_organism", chance:0.2 }, - "melted_fish": { color2:"#E3D1BC",elem2:"fused_organism", chance:0.1 }, - "melted_human": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "melted_insect": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - }, - tempHigh: 275, - stateHigh: "cooked_meat", - tempLow: -20, - stateLow: "frozen_meat", - burn: 10, - burnTime: 300, - burnInto: "cooked_meat", - state: "liquid", - density: 900, - category: "brokenday", -}, - -elements.melted_fish = { - color: "#ac8650", - behavior: [ - "XX|XX|SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water,primordial_soup%5", - "M2%0.5|FX%0.5|M2%0.5 AND BO", - "M2%10|M1|M2%10 AND SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water,primordial_soup%14", - ], - reactions: { - "oxygen": { elem2:"carbon_dioxide", chance:0.5 }, - "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" }, - "light": { elem2:"beautiful_light" }, - "dead_bug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - "ant": { color2:"#D2B6AB", elem2:"fused_organism", chance:0.2 }, - "bee": { color2:"#E9DBAA", elem2:"fused_organism", chance:0.2 }, - "fly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "firefly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "stinkbug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "head": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "body": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "bird": { color2:"#DAC8B7", elem2:"fused_organism", chance:0.2 }, - "rat": { color2:["#E2D5D0","#EADFD8"], elem2:"fused_organism", chance:0.2 }, - "slug": { color2:["#DFD0AE","#E5D6C7"], elem2:"fused_organism", chance:0.2 }, - "snail": { color2:"#E5D6C7", elem2:"fused_organism", chance:0.15 }, - "fish": { elem2:"melted_fish", chance:0.2 }, - "tadpole": { color2:"#87b574", elem2:"melted_fish", chance:0.2 }, - "frog": { color2:"#607300", elem2:"melted_fish", chance:0.2 }, - "melted_animal": { color2:["#E2D5D0","#EADFD8","#DAC8B7"], elem2:"fused_organism", chance:0.1 }, - "melted_human": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "melted_insect": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - }, - tempHigh: 275, - stateHigh: "cooked_meat", - tempLow: -20, - stateLow: "frozen_meat", - burn: 10, - burnTime: 300, - burnInto: "cooked_meat", - state: "liquid", - density: 800, - category: "brokenday", -}, - -elements.melted_insect = { - color: ["#4c4e42","#5e0b04","#4c4e42","#5e0b04","#56482d","#52472c","#635443"], - behavior: behaviors.LIQUID, - viscosity: 4500, - reactions: { - "meat": { elem2:"fused_organism", chance:0.1 }, - "cooked_meat": { elem2:"fused_organism", chance:0.1 }, - "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" }, - "light": { elem2:"beautiful_light" }, - "dead_bug": { elem2:"melted_insect", chance:0.1 }, - "ant": { color2:"#5E0B04", elem2:"melted_insect", chance:0.2 }, - "bee": { color2:"#c4b100", elem2:"melted_insect", chance:0.2 }, - "fly": { elem2:"melted_insect", chance:0.2 }, - "firefly": { elem2:"melted_insect", chance:0.2 }, - "stinkbug": { elem2:"melted_insect", chance:0.2 }, - "slug": { color2:["#997e12","#997e12","#997e12","#997e12","#997e12","#997e12","#403314","#403314","#403314","#403314","#403314","#403314","#124a44"], elem2:"melted_insect", chance:0.2 }, - "snail": { color2:"#5c3104", elem2:"melted_insect", chance:0.15 }, - "fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.2 }, - "tadpole": { color2:"#DBDCC4", elem2:"fused_organism", chance:0.2 }, - "frog": { color2:"#D2CDAA", elem2:"fused_organism", chance:0.2 }, - "head": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "body": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "melted_human": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "bird": { color2:"#DAC8B7", elem2:"fused_organism", chance:0.1 }, - "rat": { color2:["#E2D5D0","#EADFD8"], elem2:"fused_organism", chance:0.1 }, - "melted_animal": { color2:["#E2D5D0","#EADFD8","#DAC8B7"], elem2:"fused_organism", chance:0.1 }, - "melted_fish": { color2:"#E3D1BC",elem2:"fused_organism", chance:0.1 }, - }, - tempHigh: 100, - stateHigh: "dead_bug", - tempLow: -20, - stateLow: "dead_bug", - burn: 10, - burnTime: 150, - burnInto: "ash", - state: "liquid", - density: 500, - category: "brokenday", -}, - -elements.melted_plant = { - color: ["#00bf00","#439809","#258b08","#118511","#127b12","#136d14"], - behavior: behaviors.LIQUID, - viscosity: 50000, - reactions: { - "sun": { elem2:"beautiful_sun", elem1:"dead_plant" }, - "light": { elem2:"beautiful_light" }, - "carbon_dioxide": { elem2:"oxygen" }, - "tree_branch": { elem2:"wood" }, - "plant": { elem2:"melted_plant", chance:0.2 }, - "grass": { elem2:"melted_plant", chance:0.2 }, - "evergreen": { color2:"#006300", elem2:"melted_plant", chance:0.2 }, - "pistil": { elem2:"melted_plant", chance:0.2 }, - "petal": { color2:["#CC9978","#CD8C6F","#BE785E","#CC9978","#CD8C6F","#BE785E","#A9D475","#5AF353","#8E5FA5"], elem2:"melted_plant", chance:0.1 }, - "bamboo": { elem2:"melted_plant", chance:0.1 }, - "bamboo_plant": { elem2:"melted_plant", chance:0.1 }, - "cactus": { elem2:"melted_plant", chance:0.1 }, - "corn": { color2:["#f8d223","#d6ba2a","#f7f5ba","#dbd281","#cdb12d"], elem2:"melted_plant", chance:0.1 }, - "wheat": { color2:["#f1b569","#edb864","#de9c45","#c2853d"], elem2:"melted_plant", chance:0.1 }, - "dead_plant": { elem2:"melted_plant", chance:0.1 }, - "sapling": { elem2:"melted_plant", chance:0.05 }, - "pinecone": { color2:["#5c3e33","#472f27","#31211b"], elem2:"melted_plant", chance:0.05 }, - }, - tempHigh: 250, - stateHigh: "dead_plant", - tempLow: -20, - stateLow: "frozen_plant", - burn: 10, - burnTime: 200, - burnInto: ["dead_plant","fire","fire","fire","ash"], - state: "liquid", - density: 1200, - category: "brokenday", -}; - -elements.fused_organism = { - color: ["#E5D6C7","#f7ead0"], - behavior: behaviors.LIQUID, - viscosity: 6000, - reactions: { - "meat": { elem2:"fused_organism", chance:0.1 }, - "cooked_meat": { elem2:"fused_organism", chance:0.1 }, - "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" }, - "light": { elem2:"beautiful_light" }, - "dead_bug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - "ant": { color2:"#D2B6AB", elem2:"fused_organism", chance:0.2 }, - "bee": { color2:"#E9DBAA", elem2:"fused_organism", chance:0.2 }, - "fly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "firefly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "stinkbug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "slug": { color2:["#DFD0AE","#E5D6C7"], elem2:"fused_organism", chance:0.2 }, - "snail": { color2:"#E5D6C7", elem2:"fused_organism", chance:0.15 }, - "head": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "body": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "melted_human": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "melted_insect": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - "bird": { color2:"#DAC8B7", elem2:"fused_organism", chance:0.1 }, - "rat": { color2:["#E2D5D0","#EADFD8"], elem2:"fused_organism", chance:0.1 }, - "fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.2 }, - "tadpole": { color2:"#DBDCC4", elem2:"fused_organism", chance:0.2 }, - "frog": { color2:"#D2CDAA", elem2:"fused_organism", chance:0.2 }, - "melted_animal": { color2:["#E2D5D0","#EADFD8","#DAC8B7"], elem2:"fused_organism", chance:0.1 }, - "melted_fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.1 }, - }, - tempHigh: 300, - stateHigh: "cooked_meat", - tempLow: -20, - stateLow: "frozen_meat", - burn: 10, - burnTime: 400, - burnInto: "cooked_meat", - state: "liquid", - density: 2000, - category: "brokenday", -}; - -HighNumber = "36 41 20 36 46 20 36 41 20 36 46 20 32 30 20 33 44 20 32 30 20 36 37 20 36 31 20 37 39" From 5183a9b0b3b09d03b3645adb66c348f988a2d18c Mon Sep 17 00:00:00 2001 From: Mnem42 <177770058+Mnem42@users.noreply.github.com> Date: Fri, 17 Oct 2025 15:49:04 +0100 Subject: [PATCH 05/19] Create zoom.js --- mods/zoom.js | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 mods/zoom.js diff --git a/mods/zoom.js b/mods/zoom.js new file mode 100644 index 00000000..dc8b2b0d --- /dev/null +++ b/mods/zoom.js @@ -0,0 +1,72 @@ +// IIFE because paranoid +(() => { + let canvas_div = document.getElementById("canvasDiv") + + keybinds["9"] = () => handle_zoom("in") + keybinds["0"] = () => handle_zoom("out") + + const controls_table = document.getElementById("controlsTable").lastElementChild + controls_table.insertAdjacentHTML("beforeBegin",` + + Zoom in/out + 9/0 + + `) + + const zoom_levels = [ + 0.5, + 1, + 2, + 3, + 6, + 12 + ] + + window.zoom_level = 1 + + function handle_zoom(direction){ + switch (direction){ + case "in": + if (!(zoom_level+1 in zoom_levels)) { break; } + window.zoom_level += 1 + break; + case "out": + if (!(zoom_level-1 in zoom_levels)) { break; } + window.zoom_level -= 1 + break; + } + + logMessage(`${zoom_levels[zoom_level]}x`) + rescale() + } + + function rescale(){ + const scale = zoom_levels[zoom_level]; + gameCanvas.style.transform = `scale(${scale})` + + canvas_div.style.overflow = scale > 1 ? "scroll" : "unset" + } + + // Redefine to give correct numbers when zoomed + window.getMousePos = (canvas, evt) => { + if (evt.touches) { + evt.preventDefault(); + evt = evt.touches[0]; + isMobile = true; + } + const rect = canvas.getBoundingClientRect(); + + let x = (evt.clientX - rect.left) / zoom_levels[window.zoom_level]; + let y = (evt.clientY - rect.top) / zoom_levels[window.zoom_level]; + + x = Math.floor((x / canvas.clientWidth) * (width+1)); + y = Math.floor((y / canvas.clientHeight) * (height+1)); + + return {x:x, y:y}; + } + + runAfterReset(() => { + window.zoom_level = 1 + rescale() + }) +})() From dc29ee6a685e42b1d1bc9792393a5d86d4fd0563 Mon Sep 17 00:00:00 2001 From: Mnem42 <177770058+Mnem42@users.noreply.github.com> Date: Fri, 17 Oct 2025 15:55:15 +0100 Subject: [PATCH 06/19] slight keybind change --- mods/zoom.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/zoom.js b/mods/zoom.js index dc8b2b0d..8c02e817 100644 --- a/mods/zoom.js +++ b/mods/zoom.js @@ -2,14 +2,14 @@ (() => { let canvas_div = document.getElementById("canvasDiv") - keybinds["9"] = () => handle_zoom("in") - keybinds["0"] = () => handle_zoom("out") + keybinds["0"] = () => handle_zoom("in") + keybinds["9"] = () => handle_zoom("out") const controls_table = document.getElementById("controlsTable").lastElementChild controls_table.insertAdjacentHTML("beforeBegin",` Zoom in/out - 9/0 + 0/9 `) From 9bbaaa3784ddce396ec8fbb27d42c1e19894a00c Mon Sep 17 00:00:00 2001 From: Mnem42 <177770058+Mnem42@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:14:56 +0100 Subject: [PATCH 07/19] General UI changes + a proper panning implementation --- mods/zoom.js | 100 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 85 insertions(+), 15 deletions(-) diff --git a/mods/zoom.js b/mods/zoom.js index 8c02e817..bd08a89d 100644 --- a/mods/zoom.js +++ b/mods/zoom.js @@ -2,16 +2,56 @@ (() => { let canvas_div = document.getElementById("canvasDiv") - keybinds["0"] = () => handle_zoom("in") - keybinds["9"] = () => handle_zoom("out") + // Be more granular at higher zoom levels + const speed_a = () => zoom_level > 3 ? 5 : 10 + const speed_b = () => zoom_level > 3 ? 10 : 20 + + keybinds["9"] = () => handle_zoom("in") + keybinds["0"] = () => handle_zoom("out") + + keybinds["w"] = () => handle_pan("up", speed_a()) + keybinds["a"] = () => handle_pan("left", speed_a()) + keybinds["s"] = () => handle_pan("down", speed_a()) + keybinds["d"] = () => handle_pan("right", speed_a()) + + keybinds["W"] = () => handle_pan("up", speed_b()) + keybinds["A"] = () => handle_pan("left", speed_b()) + keybinds["S"] = () => handle_pan("down", speed_b()) + keybinds["D"] = () => handle_pan("right", speed_b()) const controls_table = document.getElementById("controlsTable").lastElementChild + controls_table.insertAdjacentHTML("beforeBegin",` - - Zoom in/out - 0/9 - + + Zoom in/out + + 9/ + 0 + + + + Pan + + W + A + S + D + + + + Pan (fast) + + Shift + + W + A + S + D + + `) + + const zoom_data_div = document.createElement("div") + document.getElementById("logDiv").appendChild(zoom_data_div) const zoom_levels = [ 0.5, @@ -23,6 +63,7 @@ ] window.zoom_level = 1 + window.zoom_panning = [0,0] function handle_zoom(direction){ switch (direction){ @@ -34,17 +75,46 @@ if (!(zoom_level-1 in zoom_levels)) { break; } window.zoom_level -= 1 break; - } - - logMessage(`${zoom_levels[zoom_level]}x`) + } rescale() } - function rescale(){ - const scale = zoom_levels[zoom_level]; - gameCanvas.style.transform = `scale(${scale})` + function handle_pan(direction, speed){ + switch (direction){ + case "right": + zoom_panning[0] -= speed + break; + case "left": + zoom_panning[0] += speed + break; + case "up": + zoom_panning[1] += speed + break; + case "down": + zoom_panning[1] -= speed + break; + } + rescale() + } - canvas_div.style.overflow = scale > 1 ? "scroll" : "unset" + function rescale(){ + log_info() + + const scale = zoom_levels[zoom_level] + const x = zoom_panning[0] * (pixelSize * scale) + const y = zoom_panning[1] * (pixelSize * scale) + + gameCanvas.style.transform = `translate(${x}px,${y}px) scale(${scale})` + } + + function log_info(){ + // Values are negated to make them more intuitive + const x_pan = (-zoom_panning[0]).toString().padEnd(4) + const y_pan = (-zoom_panning[1]).toString().padEnd(4) + + zoom_data_div.innerText = "" + zoom_data_div.innerText += `Scale: ${zoom_levels[zoom_level]}x\n` + zoom_data_div.innerText += `Pan : ${x_pan}, ${y_pan}` } // Redefine to give correct numbers when zoomed @@ -56,8 +126,8 @@ } const rect = canvas.getBoundingClientRect(); - let x = (evt.clientX - rect.left) / zoom_levels[window.zoom_level]; - let y = (evt.clientY - rect.top) / zoom_levels[window.zoom_level]; + let x = (evt.clientX - rect.left) / zoom_levels[zoom_level]; + let y = (evt.clientY - rect.top) / zoom_levels[zoom_level]; x = Math.floor((x / canvas.clientWidth) * (width+1)); y = Math.floor((y / canvas.clientHeight) * (height+1)); From b1dce5423e8931c9ac0471ba4af18399124dee2c Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Sat, 25 Oct 2025 10:22:19 -0400 Subject: [PATCH 08/19] Update mod-list.html --- mod-list.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod-list.html b/mod-list.html index 754017b0..6777ef38 100644 --- a/mod-list.html +++ b/mod-list.html @@ -217,10 +217,10 @@ clf3.jsChlorine TrifluorideAlice cmur.jsCharsonsModUno (???)CharsonBurensen debrisable.jsExpands the number of breakable elements, changes erosion, and adds way to craft certain elements from breaking other elementsNekonico +eklegems.jsLarge amouunt of gemstones and other crystalsekle24 fire_extinguisher.jsFire extinguisher blocks and realistic firefighting foam to put out nearly anythingDr_Lego fire_mod.jsVarious properties to change fire behavior and radioactive fireAlice fire_slime.jsPyrogenic version of slimeAlice -Gemstones.jsGemstonesSchweeny glenn_gases.jsMost gases from the Glenn's Gases mod into SandboxelsAlice grav_mudstones.jsVarious forms of mudstone with different gravitiesAlice halogen.jsThe missing halogensnousernamefound @@ -335,6 +335,7 @@ colonies.jsRockets that contain settlers to terraform a planetNekonico crimson.jsElements relating to the Crimson from TerrariaAlice dogs.jsSimple dog and dog foodhedera-ivy +eklegems.jsLarge amouunt of gemstones and other crystalsekle24 fairy_chain.jsWay too many fairies to fey_and_more.jsAlice fantastic_creatures.jsVarious animalsMelecie fantasy_elements.jsFantasy creatures and substancespixelegend4 From f09e9fe5de551ec1a3d4a9e406e24b928ff2993b Mon Sep 17 00:00:00 2001 From: eliwhitfield-dot Date: Sun, 26 Oct 2025 12:33:16 -0600 Subject: [PATCH 09/19] Create black_hole.js --- mods/black_hole.js | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 mods/black_hole.js diff --git a/mods/black_hole.js b/mods/black_hole.js new file mode 100644 index 00000000..dd64dc6c --- /dev/null +++ b/mods/black_hole.js @@ -0,0 +1,43 @@ +elements.black_hole = { + color: "#000000", + tick: function(pixel) { + // Attract other pixels within a 9-pixel radius + for (let dx = -9; dx <= 9; dx++) { + for (let dy = -9; dy <= 9; dy++) { + let x = pixel.x + dx; + let y = pixel.y + dy; + + // Ignore out-of-bounds + if (!isEmpty(x, y, true)) { + let other = pixelMap[x]?.[y]; + if (other && other.element !== "black_hole") { + // Attraction: move other pixel towards the black hole + let stepX = Math.sign(pixel.x - other.x); + let stepY = Math.sign(pixel.y - other.y); + tryMove(other, other.x + stepX, other.y + stepY); + } + } + } + } + + // Convert touching pixels into black holes + const dirs = [ + [1, 0], [-1, 0], [0, 1], [0, -1], + [1, 1], [-1, -1], [1, -1], [-1, 1] + ]; + for (let d of dirs) { + let nx = pixel.x + d[0]; + let ny = pixel.y + d[1]; + if (isEmpty(nx, ny, true)) continue; + + let touching = pixelMap[nx]?.[ny]; + if (touching && touching.element !== "black_hole") { + changePixel(touching, "black_hole"); + } + } + }, + category: "special", + state: "solid", + density: 99999, // Very dense (optional) + hardness: 1, // Can't be destroyed easily +}; From e714af6319d67556ed84084546a4962e5d2f1f68 Mon Sep 17 00:00:00 2001 From: Mnem42 <177770058+Mnem42@users.noreply.github.com> Date: Sun, 26 Oct 2025 20:38:30 +0000 Subject: [PATCH 10/19] Potential fix and reorganising Fix the mod sometimes failing to load if it loads before the relevant parts of the UI --- mods/zoom.js | 112 +++++++++++++++++++++++++++------------------------ 1 file changed, 59 insertions(+), 53 deletions(-) diff --git a/mods/zoom.js b/mods/zoom.js index bd08a89d..a83fea4d 100644 --- a/mods/zoom.js +++ b/mods/zoom.js @@ -1,58 +1,5 @@ // IIFE because paranoid (() => { - let canvas_div = document.getElementById("canvasDiv") - - // Be more granular at higher zoom levels - const speed_a = () => zoom_level > 3 ? 5 : 10 - const speed_b = () => zoom_level > 3 ? 10 : 20 - - keybinds["9"] = () => handle_zoom("in") - keybinds["0"] = () => handle_zoom("out") - - keybinds["w"] = () => handle_pan("up", speed_a()) - keybinds["a"] = () => handle_pan("left", speed_a()) - keybinds["s"] = () => handle_pan("down", speed_a()) - keybinds["d"] = () => handle_pan("right", speed_a()) - - keybinds["W"] = () => handle_pan("up", speed_b()) - keybinds["A"] = () => handle_pan("left", speed_b()) - keybinds["S"] = () => handle_pan("down", speed_b()) - keybinds["D"] = () => handle_pan("right", speed_b()) - - const controls_table = document.getElementById("controlsTable").lastElementChild - - controls_table.insertAdjacentHTML("beforeBegin",` - - Zoom in/out - - 9/ - 0 - - - - Pan - - W - A - S - D - - - - Pan (fast) - - Shift + - W - A - S - D - - - `) - - const zoom_data_div = document.createElement("div") - document.getElementById("logDiv").appendChild(zoom_data_div) - const zoom_levels = [ 0.5, 1, @@ -117,6 +64,60 @@ zoom_data_div.innerText += `Pan : ${x_pan}, ${y_pan}` } + function patch_keybinds(){ + // Be more granular at higher zoom levels + const speed_a = () => zoom_level > 3 ? 5 : 10 + const speed_b = () => zoom_level > 3 ? 10 : 20 + + keybinds["9"] = () => handle_zoom("in") + keybinds["0"] = () => handle_zoom("out") + + keybinds["w"] = () => handle_pan("up", speed_a()) + keybinds["a"] = () => handle_pan("left", speed_a()) + keybinds["s"] = () => handle_pan("down", speed_a()) + keybinds["d"] = () => handle_pan("right", speed_a()) + + keybinds["W"] = () => handle_pan("up", speed_b()) + keybinds["A"] = () => handle_pan("left", speed_b()) + keybinds["S"] = () => handle_pan("down", speed_b()) + keybinds["D"] = () => handle_pan("right", speed_b()) + } + + function patch_ui(){ + const zoom_data_div = document.createElement("div") + document.getElementById("logDiv").appendChild(zoom_data_div) + + const controls_table = document.getElementById("controlsTable").lastElementChild + controls_table.insertAdjacentHTML("beforeBegin",` + + Zoom in/out + + 9/ + 0 + + + + Pan + + W + A + S + D + + + + Pan (fast) + + Shift + + W + A + S + D + + + `) + } + // Redefine to give correct numbers when zoomed window.getMousePos = (canvas, evt) => { if (evt.touches) { @@ -139,4 +140,9 @@ window.zoom_level = 1 rescale() }) + + runAfterLoad(() => { + patch_keybinds() + patch_ui() + }) })() From 7984b01c3f9f6365546f193c8abef6bb65302f5e Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sun, 26 Oct 2025 18:10:52 -0500 Subject: [PATCH 11/19] New salts and updated acidTick Added nitrates and made acidTick function as it should --- mods/morechemistry.js | 231 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 219 insertions(+), 12 deletions(-) diff --git a/mods/morechemistry.js b/mods/morechemistry.js index 5008b2e5..bedb5260 100644 --- a/mods/morechemistry.js +++ b/mods/morechemistry.js @@ -1,5 +1,5 @@ /* -*Version 2.2.1 +*Version 2.2.2 */ dependOn("orchidslibrary.js", ()=>{ @@ -683,23 +683,38 @@ dependOn("orchidslibrary.js", ()=>{ for(let coords of adjacentCoords){ let x = pixel.x+coords[0], y = pixel.y+coords[1]; let p2 = getPixel(x,y); - let ignore = false; - for(let item of elements[pixel.element].ignore){ + //let ignore = false; + /*for(let item of elements[pixel.element].ignore){ if(p2 != null && item.startsWith("*")&&p2.element.endsWith(item.split("*")[1])){ ignore = true; } else if (p2 != null && item.endsWith("*")&&p2.element.startsWith(item.split("*")[0])){ ignore = true; + } else if(p2 != null){ + ignore = (elements[pixel.element].ignore.includes(p2.element)) ? true : ignore; + } + }*/ + if(p2 != null){ + let ignore = elements[pixel.element].ignore.some(item=>{ + let res = false; + if(p2.element === item){ + res = true; + } else if(item.startsWith("*") && p2.element.endsWith(item.slice(1))) { + res = true; + } else if(item.endsWith("*") && p2.element.startsWith(item.slice(0,-1))){ + res = true; } + return res; + }); + if(!ignore){ + deletePixel(x,y); + deletePixel(pixel.x, pixel.y); } - if(p2 != null && !(elements[pixel.element].ignore.includes(p2.element) || ignore || p2.element == pixel.element)){ - deletePixel(x,y); - deletePixel(pixel.x, pixel.y); } } } elements.acid.behavior = behaviors.LIQUID; elements.acid.tick = acidTick; - elements.acid.ignore = elements.acid.ignore.concat(["nitric_acid", "aqua_regia", "nitrogen_dioxide", "nitric_acid_ice", "nitrogen_dioxide_ice", "acid", "chloroauric_acid", "*chloride", "*carbonate", "*acetate", "*sulfate", "*gallium", "*hydroxide", "salt", "*aluminum", "target_portal_in", "*magnesium", "*copper", "*iron", "*calcium", "sulfuric_acid", "*vinegar", "*gypsum", "*wall", "epsom_salt", "*platinum", "chloroplatinic_acid", "*sulfur*"]); + elements.acid.ignore = elements.acid.ignore.concat(["nitric_acid", "aqua_regia", "nitrogen_dioxide", "nitric_acid_ice", "nitrogen_dioxide_ice", "acid", "chloroauric_acid", "*chloride", "*carbonate", "*acetate", "*sulfate", "*gallium", "*hydroxide", "salt", "*aluminum", "target_portal_in", "*magnesium", "*copper*", "*iron", "*calcium", "sulfuric_acid", "*vinegar", "*gypsum", "*wall", "epsom_salt", "platinum", "chloroplatinic_acid", "*sulfur*", "wall", "porcelain", "plastic", "glass", "*sulfate", "*nitrate"]); elements.nitric_acid = { alias: "HNO₃", behavior: behaviors.LIQUID, @@ -710,6 +725,12 @@ dependOn("orchidslibrary.js", ()=>{ stateLow: "nitric_acid_ice", reactions: { acid: {elem1: null, elem2: "aqua_regia"}, + copper: {elem1: "hydrogen", elem2: "copper_nitrate"}, + sodium: {elem1: "hydrogen", elem2: "sodium_nitrate"}, + aluminum: {elem1: "hydrogen", elem2: "aluminum_nitrate"}, + potassium: {elem1: "hydrogen", elem2: "potassium_nitrate"}, + calcium: {elem1: "hydrogen", elem2: "calcium_nitrate"}, + magnesium: {elem1: "hydrogen", elem2: "magnesium_nitrate"}, }, density: 1510, category: "liquids", @@ -873,6 +894,8 @@ dependOn("orchidslibrary.js", ()=>{ density: 2960, reactions: { acid: {elem1: "magnesium_chloride", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, + sulfuric_acid: {elem1: "epsom_salt", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, + nitric_acid: {elem1: "magnesium_nitrate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, vinegar: {elem1: "magnesium_acetate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]} } } @@ -1140,11 +1163,11 @@ dependOn("orchidslibrary.js", ()=>{ alias: "CuCl₂", solubility: {water: 0.743}, reactions: { - sodium: {elem1: "copper", elem2: "sodium_acetate"}, - potassium: {elem1: "copper", elem2: "potassium_acetate"}, - magnesium: {elem1: "copper", elem2: "magnesium_acetate"}, - calcium: {elem1: "copper", elem2: "calcium_acetate"}, - aluminum: {elem1: "copper", elem2: "aluminum_acetate"}, + sodium: {elem1: "copper", elem2: "salt"}, + potassium: {elem1: "copper", elem2: "potassium_salt"}, + magnesium: {elem1: "copper", elem2: "magnesium_chloride"}, + calcium: {elem1: "copper", elem2: "calcium_chloride"}, + aluminum: {elem1: "copper", elem2: "aluminum_chloride"}, wood: {stain2: "#043023"}, }, properties: { @@ -1554,4 +1577,188 @@ dependOn("orchidslibrary.js", ()=>{ stateLow: "bismuth", temp: 270, }; + + elements.copper_nitrate = { + density: 3050, + tempHigh: 145, + stateHigh: ["oxidized_copper", "nitrogen_dioxide", "nitrogen_dioxide"], + color: ["#1717ff", "#2121ff", "#1b1bf5", "#0f0ff2", "#0707f7"], + behavior: behaviors.POWDER, + state: "solid", + category: "salts", + alias: "Cu(NO₃)₂", + solubility: {water: 1.25}, + reactions: { + sodium: {elem1: "copper", elem2: "sodium_nitrate"}, + potassium: {elem1: "copper", elem2: "potassium_nitrate"}, + calcium: {elem1: "copper", elem2: "calcium_nitrate"}, + aluminum: {elem1: "copper", elem2: "aluminum_nitrate"}, + wood: {stain2: "#043023"}, + ash: {elem1: "copper_carbonate", elem2: "potassium_nitrate"}, + baking_soda: {elem1: "copper_carbonate", elem2: "sodium_nitrate"}, + acid: {elem1: "copper_chloride", elem2: "nitric_acid"}, + sulfuric_acid: {elem1: "copper_sulfate", elem2: "nitric_acid"}, + }, + properties: { + anhydrous: false + }, + fireColor: "#19abff", + tick: function(pixel){ + if(pixelTicks-pixel.start == 2 && xDown){ + pixel.anhydrous = true; + let rgb = {r: 51, g: 158, b: 61}; + let num = 6 - (Math.round(Math.random()*12)); + for(let key in rgb){ + rgb[key] += num; + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; + } + let multi = (pixel.temp-70)/100; + multi = (multi < 0) ? 0 : ((multi > 1) ? 1 : multi); + if(Math.random() < 0.05*multi){ + pixel.anhydrous = true; + let rgb = {r: 51, g: 158, b: 61}; + let num = 6 - (Math.round(Math.random()*12)); + for(let key in rgb){ + rgb[key] += num; + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; + } + if(pixel.anhydrous){ + let neighbors = []; + for(let coords of squareCoords){ + let x = pixel.x+coords[0], y = pixel.y+coords[1]; + neighbors[neighbors.length] = (isEmpty(x,y) && !outOfBounds(x,y)) ? "air" : (!outOfBounds(x,y)) ? pixelMap[x][y].element : undefined; + } + if(neighbors.includes("air") && pixel.temp < 50 && Math.random() < 0.00035){ + pixel.anhydrous = false; + let rgb = (Math.random() > 0.5) ? {r: 7, g: 7, b: 247} : {r: 26, g: 26, b: 240}; + let num = 6 - (Math.round(Math.random()*12)); + for(let key in rgb){ + rgb[key] += num; + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; + + } else if (neighbors.includes("steam") || neighbors.includes("water") || neighbors.includes("salt_water") || neighbors.includes("sugar_water") || neighbors.includes("dirty_water") || neighbors.includes("seltzer") || neighbors.includes("pool_water") || neighbors.includes("slush")){ + pixel.anhydrous = false; + let rgb = (Math.random() > 0.5) ? {r: 7, g: 7, b: 247} : {r: 26, g: 26, b: 240}; + let num = 6 - (Math.round(Math.random()*12)); + for(let key in rgb){ + rgb[key] += num; + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; + } + } + } + }; + + elements.sodium_nitrate = { + color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"], + density: 2260, + category: "salts", + tempHigh: 650, + stateHigh: ["sodium", "nitrogen_dioxide"], + reactions: { + ash: {elem1: "baking_soda", elem2: "potassium_nitrate"}, + potassium: {elem1: "sodium", elem2: "potassium_nitrate"}, + //sulfuric_acid: {elem1: "sodium_sulfate", elem2: "nitric_acid"}, + acid: {elem1: "salt", elem2: "nitric_acid"}, + }, + solubility: {water: 0.86}, + alias: "NaNO₃", + behavior: behaviors.POWDER + }; + + elements.potassium_nitrate = { + color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"], + density: 2106, + category: "salts", + tempHigh: 800, + stateHigh: ["potassium", "nitrogen_dioxide"], + reactions: { + //sulfuric_acid: {elem1: "potassium_sulfate", elem2: "nitric_acid"}, + acid: {elem1: "potassium_salt", elem2: "nitric_acid"}, + }, + solubility: {water: 0.316}, + alias: "KNO₃", + behavior: behaviors.POWDER + }; + elements.magnesium_nitrate = { + color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"], + density: 2300, + category: "salts", + tempHigh: 290, + stateHigh: ["magnesium", "nitrogen_dioxide"], + reactions: { + potassium: {elem1: "magnesium", elem2: "potassium_nitrate"}, + sodium: {elem1: "magnesium", elem2: "sodium_nitrate"}, + sulfuric_acid: {elem1: "epsom_salt", elem2: "nitric_acid"}, + acid: {elem1: "magnesium_chloride", elem2: "nitric_acid"}, + }, + solubility: {water: 0.42}, + alias: "Mg(NO₃)₂", + behavior: behaviors.POWDER + }; + elements.calcium_nitrate = { + color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"], + density: 2504, + category: "salts", + tempHigh: 650, + stateHigh: ["calcium", "nitrogen_dioxide"], + reactions: { + potassium: {elem1: "calcium", elem2: "potassium_nitrate"}, + sodium: {elem1: "calcium", elem2: "sodium_nitrate"}, + magnesium: {elem1: "calcium", elem2: "magnesium_nitrate"}, + sulfuric_acid: {elem1: "gypsum", elem2: "nitric_acid"}, + acid: {elem1: "calcium_chloride", elem2: "nitric_acid"}, + }, + solubility: {water: 1.21}, + alias: "Ca(NO₃)₂", + behavior: behaviors.POWDER + }; + elements.aluminum_nitrate = { + color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"], + density: 1720, + category: "salts", + tempHigh: 150, + stateHigh: ["aluminum", "nitrogen_dioxide"], + reactions: { + sodium: {elem1: "aluminum", elem2: "sodium_nitrate"}, + potassium: {elem1: "aluminum", elem2: "potassium_nitrate"}, + calcium: {elem1: "aluminum", elem2: "calcium_nitrate"}, + magnesium: {elem1: "aluminum", elem2: "magnesium_nitrate"}, + //sulfuric_acid: {elem1: "aluminum_sulfate", elem2: "nitric_acid"}, + acid: {elem1: "aluminum_chloride", elem2: "nitric_acid"}, + }, + solubility: {water: 0.739}, + alias: "Al(NO₃)₃", + behavior: behaviors.POWDER + }; + elements.limestone.reactions.sulfuric_acid = {elem1: "gypsum", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}; + elements.slaked_lime.reactions.sulfuric_acid = {elem1: "gypsum", elem2: "water"}; + elements.quicklime.reactions.sulfuric_acid = {elem1: "gypsum", elem2: "oxygen"}; + elements.limestone.reactions.nitric_acid = {elem1: "calcium_nitrate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}; + elements.slaked_lime.reactions.nitric_acid = {elem1: "calcium_nitrate", elem2: "water"}; + elements.quicklime.reactions.nitric_acid = {elem1: "calcium_nitrate", elem2: "oxygen"}; + elements.copper_carbonate = { + color: ["#5ee092", "#54d186", "#52de8a", "#44c97a"], + category: "salts", + alias: "CuCO₃", + behavior: behaviors.POWDER, + reactions: { + vinegar: {elem1: "copper_acetate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, + acid: {elem1: "copper_chloride", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, + sulfuric_acid: {elem1: "copper_sulfate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, + nitric_acid: {elem1: "copper_nitrate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, + aqua_regia: {elem1: ["copper_nitrate", "copper_chloride"], elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, + }, + density: 4000, + tempHigh: 290, + stateHigh: ["oxidized_copper", "carbon_dioxide"], + }; + elements.aqua_regia.solubility = {water: 1}; + elements.acid.solubility = {water: 1}; + elements.vinegar.solubility = {water: 1}; + elements.nitric_acid.solubility = {water: 1}; + elements.sulfuric_acid.solubility = {water: 1}; }, true); From 17a0a62ed218b77f834ba98a8f16967f571afd8f Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sun, 26 Oct 2025 18:13:38 -0500 Subject: [PATCH 12/19] Update solubility.js Changed the tempHigh of water and tempLow of steam, and changed the chances for dissolved salts to be placed when water evaporates --- mods/solubility.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/mods/solubility.js b/mods/solubility.js index 28e8fc0e..95aefb36 100644 --- a/mods/solubility.js +++ b/mods/solubility.js @@ -1,5 +1,5 @@ /* -* Version 1.0.0 +* Version 1.1.0 */ dependOn("orchidslibrary.js", ()=>{ @@ -46,15 +46,15 @@ dependOn("orchidslibrary.js", ()=>{ } function aqueousReaction(p1, p2){ for(let elem in p1.elemsDissolved){ - if(elements[elem].reactions != null && p2.element != "water" && elements[elem].reactions[p2.element] != undefined){ + if(elements[elem].reactions != null && p2.element != "water" && (elements[elem].reactions[p2.element] != undefined || (elements[p2.element].reactions != null && elements[p2.element].reactions[elem] != undefined))){ - let r = elements[elem].reactions[p2.element]; + let r = elements[elem].reactions[p2.element] || elements[p2.element].reactions[elem]; if(r.tempMin && !((p1.temp >= r.tempMin) && (p2.temp >= r.tempMin))){ return false; } if(r.tempMax && !((p1.temp <= r.tempMax) && (p2.temp <= r.tempMax))){ return false; - } + <<<<<<<<< } if(r.charged && !(p1.charge || p2.charge)){ return false; } @@ -253,13 +253,13 @@ dependOn("orchidslibrary.js", ()=>{ let num = Math.random(); if(elem === null){ for(let e in pixel.elemsDissolved){ - if(num <= ((pixel.elemsDissolved[e]/100)/elements[e].solubility.water)){ + if(num <= ((pixel.elemsDissolved[e]/100)/elements[e].solubility.water)/4){ elem = e; } } } elem = (elem == null) ? "steam" : elem; - changePixel(pixel, elem); + changePixel(pixel, elem, 110); pixel.dissolvedElems = {}; } } @@ -282,5 +282,6 @@ dependOn("orchidslibrary.js", ()=>{ elements.water.tick = solventTick; elements.water.behavior = behaviors.SOLVENT; elements.water.tempHigh = undefined; - elements.water.solventTempHigh = 100; + elements.water.solventTempHigh = 101; + elements.steam.tempLow = 99 }, true); From 4f9ce8173e53cbdce75356283b6e669af6fc9496 Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Mon, 27 Oct 2025 08:01:24 -0500 Subject: [PATCH 13/19] Removed conflict header from git conflicts --- mods/solubility.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/solubility.js b/mods/solubility.js index 95aefb36..64400bad 100644 --- a/mods/solubility.js +++ b/mods/solubility.js @@ -54,7 +54,7 @@ dependOn("orchidslibrary.js", ()=>{ } if(r.tempMax && !((p1.temp <= r.tempMax) && (p2.temp <= r.tempMax))){ return false; - <<<<<<<<< } + } if(r.charged && !(p1.charge || p2.charge)){ return false; } From 626d4b8ec8734a2b79a899bc709a4760343b7bb6 Mon Sep 17 00:00:00 2001 From: TaterbobYT <167204207+TaterbobYT@users.noreply.github.com> Date: Tue, 28 Oct 2025 05:38:12 -0500 Subject: [PATCH 14/19] Update mod list --- mod-list.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod-list.html b/mod-list.html index 6777ef38..9055dcad 100644 --- a/mod-list.html +++ b/mod-list.html @@ -408,6 +408,7 @@ thiquovite.jsThiquovite and wall buildersCharsonBurensen triggerable_random_powders.jsPowders with different abilities, such as heating and coolingAlice troll.jsVarious dumb elements that iterate randomly on the entire screenAlice +war.jsadds two countries that fight over land and waterTaterbob WhisperingTheory.jsPowder and gas variant of heater and coolerkaeud @@ -527,4 +528,4 @@ - + From a50f4dc380b5b2d60d57653624147c6688329995 Mon Sep 17 00:00:00 2001 From: TaterbobYT <167204207+TaterbobYT@users.noreply.github.com> Date: Tue, 28 Oct 2025 05:43:56 -0500 Subject: [PATCH 15/19] Create war.js Yeah --- mods/war.js | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 mods/war.js diff --git a/mods/war.js b/mods/war.js new file mode 100644 index 00000000..967d5767 --- /dev/null +++ b/mods/war.js @@ -0,0 +1,51 @@ +elements.land = { +color: "#096600", +category: "war", +behavior: behaviors.WALL, +}; +elements.red = { +name: "redville", +color: "#880000", +category: "war", +behavior: [ +"XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5|XX", +"CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5|XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5", +"XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5|XX", +], +}; +elements.blu = { +name: "blue city", +color: "#000088", +category: "war", +behavior: [ +"XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5|XX", +"CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5|XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5", +"XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5|XX", +], +}; +elements.kerdly = { +name: "water", +category: "war", +color: "#5599ff", +behavior: behaviors.WALL, +}; +elements.suselle = { +name: "redville water", +category: "war", +color: "#7777dd", +behavior: [ +"XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5 AND CH:kralsei>suselle%1|XX", +"CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5 AND CH:kralsei>suselle%1|XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5 AND CH:kralsei>suselle%1", +"XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5 AND CH:kralsei>suselle%1|XX", +], +}; +elements.kralsei = { +name: "blue city water", +category: "war", +color: "#3377ff", +behavior: [ +"XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5 AND CH:suselle>kralsei%1|XX", +"CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5 AND CH:suselle>kralsei%1|XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5 AND CH:suselle>kralsei%1", +"XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5 AND CH:suselle>kralsei%1|XX", +], +}; From 5ff4e96d3a700cf678462fd5034a9436ba5f7295 Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Tue, 28 Oct 2025 07:41:58 -0400 Subject: [PATCH 16/19] Update mod-list.html --- mod-list.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mod-list.html b/mod-list.html index 9055dcad..6777ef38 100644 --- a/mod-list.html +++ b/mod-list.html @@ -408,7 +408,6 @@ thiquovite.jsThiquovite and wall buildersCharsonBurensen triggerable_random_powders.jsPowders with different abilities, such as heating and coolingAlice troll.jsVarious dumb elements that iterate randomly on the entire screenAlice -war.jsadds two countries that fight over land and waterTaterbob WhisperingTheory.jsPowder and gas variant of heater and coolerkaeud @@ -528,4 +527,4 @@ - + From eef7fb9756bc2615ca72177e6b9f981510af0d4b Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Wed, 29 Oct 2025 15:57:45 -0500 Subject: [PATCH 17/19] Faster and more random generation By replacing a for loop with Math.log(), it is able to generate a world in ~3 or less seconds compared to the 20+ seconds using a loop. additionally, the use of pseudorandom within the parameters of another pseudorandom function makes it appear more random and unpredictable. --- mods/PRNGworldgenlib.js | 64 ++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/mods/PRNGworldgenlib.js b/mods/PRNGworldgenlib.js index 39aa13d3..ecb610b1 100644 --- a/mods/PRNGworldgenlib.js +++ b/mods/PRNGworldgenlib.js @@ -1,11 +1,7 @@ -/*Version 1.0.0 Pseudorandom world generator*/ -function pseudorandom(key, max = 10){ - let num = max; - for(let i = 0; i < key; i++){ - num = ((num+(max*0.6))**1.8312312-2) % (max+1); - } - return num; -} +/*Version 1.1.0 Pseudorandom world generator*/ +function pseudorandom(key, num, max = 1){ + return (Math.log(key)*(num*Math.log(1625.4986772154357))) % max; +}; eLists.STONEELEMS = ["rock", "gravel", "tuff", "basalt", "rock_wall"]; let oreChances = { diamond: 0.045, @@ -31,13 +27,17 @@ class biome { if(!paused){togglePause();} let fraction = seed/(2**32); for(let level of this.yLevels){ - for(let x = 0; x <= width; x++){ - let heightIncrease = (fraction < 0.5) ? -3*(pseudorandom(((1-fraction)*x)*100)/11) : 3*(pseudorandom((fraction*x)*100)/11); + for(let x = 0; x <= width+2; x++){ + //console.log(x); + let heightIncrease = (fraction < 0.5) ? -3*pseudorandom(((1-fraction)*(x+1))*(100*pseudorandom(x, 1241, 500)), 1) : 3*pseudorandom(((fraction)*(x+1))*(100*pseudorandom(x, 1241, 500)), 1); let h = level + heightIncrease; for(let y = 0; y <= h; y++){ + //console.log(x,y); let elementsArr = this.layers[this.yLevels.indexOf(level)]; - let elem = elementsArr[Math.floor(((fraction < 0.5) ? elementsArr.length*pseudorandom(((1-fraction)*((x*y)*13))/11) : elementsArr.length*(pseudorandom((fraction*(x*y*17)))/11))%elementsArr.length)]; - let placed = tryCreate(elem, x, height-y); + let elem = elementsArr[Math.floor(elementsArr.length*pseudorandom((1-fraction)*pseudorandom((x+15)*(y+5), 65343, 500), 2) % elementsArr.length)] || elementsArr[0]; + //if(x == 0 || x == 1){console.log(elem);}; + let placed = tryCreate(elem, x-2, height-y); + if(placed != null && this.temp != null){ placed.temp = this.temp; } @@ -75,9 +75,9 @@ class biome { generateOreVeins(seed, multi = 1){ for(let x = 0; x <= width; x++){ for(let y = 0; y <= height; y++){ - let c = pseudorandom((seed/2**32)*x*y)/11; + let c = pseudorandom((seed/2**32)*pseudorandom(x*y, 657345, 600), 3); if(c <= 0.3){ - let c2 = pseudorandom((seed/2**32)*(x*y)*3)/11; + let c2 = pseudorandom((seed/2**32)*pseudorandom(x*y, 98755, 750), 4); let ore; for(let e in oreChances){ if(c2 <= oreChances[e]){ @@ -96,11 +96,11 @@ class biome { x2 += coords[0]; y2 += coords[1]; let p2 = getPixel(x2,y2); - if(p2 != null && eLists.STONEELEMS.includes(p2.element) && (pseudorandom((seed/2**32)*x2*y2)/11) < (0.35*multi)){ + if(p2 != null && eLists.STONEELEMS.includes(p2.element) && (pseudorandom((seed/2**32)*pseudorandom(x2,y2, 350), x2*y2) < (0.35*multi))){ hasStone = true; tryCreate(ore, x2, y2, true); } - if((pseudorandom((seed/2**32)*(x2*y2)*8)/11) < 0.15){ + if(pseudorandom((seed/2**32)*x2*y2, 6) < 0.15){ a = false; break; } @@ -128,7 +128,7 @@ enabledMods.forEach((item)=>{ biomes.orchard = new biome([["rock","rock","rock","gravel"], ["dirt", "dirt", "dirt", "rock", "gravel"], ["dirt", "dirt", "dirt", "dirt", "mud", "clay_soil", "gravel"]], [25, 30, 38], {afterFunc: (seed)=>{ for(let i = 0; i < width; i++){ console.log(i, width); - let elem = ((pseudorandom((seed/2**32)*i)/11) < 0.15) ? plants.tree[(Math.round(Math.random()*plants.tree.length)) % plants.tree.length] : "grass"; + let elem = (pseudorandom((seed/2**32)*pseudorandom(i, 6544, 500), 7) < 0.15) ? plants.tree[(Math.round(Math.random()*plants.tree.length)) % plants.tree.length] : "grass"; if(elem != undefined && elem != "grass"){elem += "_seed"}; elem = (elem == undefined) ? "apple_seed" : elem; tryCreate(elem, i, 42); @@ -140,15 +140,33 @@ elements.PRNGgenerate = { category: "tools", onSelect: function(){ let arr = []; + let txt = shiftDown; Object.keys(biomes).forEach(function(b){arr.push(b);}) promptInput("Leave blank to generate new seed. Your current seed is: " + seed, function(i){ - seed = parseInt(i) || Math.random()*(2**32); + seed = (i != null && i.toLowerCase() == "c") ? seed : parseFloat(i) || Math.random()*(2**32); seed = seed % (2**32); - promptChoose("", arr, (choice)=>{ - biomes[choice].generate(seed); - promptText("World generation complete."); - selectElement('dirt'); - }, "Select a biome to generate: "); + if(!txt){ + promptChoose("", arr, (choice)=>{ + biomes[choice].generate(seed); + promptText("World generation complete."); + selectElement('dirt'); + }, "Select a biome to generate: "); + } else { + let str = ""; + for(let key in biomes){ + str += `${key},`; + } + str = str.replace(/^,|,$/g, ''); + promptInput("Enter the name of a biome (caps-insensetive) \nBiomes Available: " + str, function(inp){ + if(!arr.includes(inp.toLowerCase())){ + promptText("Invalid selection."); + }else { + biomes[inp.toLowerCase()].generate(seed); + promptText("World generation complete."); + selectElement('dirt'); + } + }, "Enter Biome") + } }, "Enter seed:"); } } From f342ecf551bafc7991124e0fa83837aaacfaee91 Mon Sep 17 00:00:00 2001 From: Vito Date: Thu, 30 Oct 2025 09:32:35 -0500 Subject: [PATCH 18/19] added automatic text input detection and vein multipliers --- mods/PRNGworldgenlib.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/PRNGworldgenlib.js b/mods/PRNGworldgenlib.js index ecb610b1..14b110ab 100644 --- a/mods/PRNGworldgenlib.js +++ b/mods/PRNGworldgenlib.js @@ -118,9 +118,9 @@ class biome { } let biomes = { plains: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "dirt", "dirt", "mud", "gravel"], ["grass","flower_seed","grass","grass","grass","grass","sapling","grass","grass","grass","grass","grass","grass","grass","grass"]], [25, 38, 40]), - desert: new biome([["rock", "rock", "rock", "gravel"], ["rock", "packed_sand","rock", "packed_sand", "sand"], ["sand"], [null, null, null, null, null, null, null, null, null, "cactus"]], [17, 26, 40, 42]), - savanna: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "clay_soil", "dirt", "dirt"], ["grass",null,null, null, null, null, "sapling",null,null,null,null]], [25, 38, 40], {lc: ["#6fde26", "#8eed34", "#8cdb42", "#7bd12a", "#96e81c", "#a9e64e", "#a0d94c", "#a9d63e"], wc: ["#bdab7e", "#b09c6a", "#ab996d", "#998a63", "#917959", "#877051"]}), - tundra: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "rock", "permafrost"], ["permafrost", "permafrost", "permafrost", "permafrost", "permafrost", "permafrost", "ice", "snow"], [null,null,null,null,null,"pinecone",null,null,null,null,null,null]], [25, 30, 38, 40], {temp: -15}), + desert: new biome([["rock", "rock", "rock", "gravel"], ["rock", "packed_sand","rock", "packed_sand", "sand"], ["sand"], [null, null, null, null, null, null, null, null, null, "cactus"]], [17, 26, 40, 42], {vMulti: 1.2}), + savanna: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "clay_soil", "dirt", "dirt"], ["grass",null,null, null, null, null, "sapling",null,null,null,null]], [25, 38, 40], {lc: ["#6fde26", "#8eed34", "#8cdb42", "#7bd12a", "#96e81c", "#a9e64e", "#a0d94c", "#a9d63e"], wc: ["#bdab7e", "#b09c6a", "#ab996d", "#998a63", "#917959", "#877051"], vMulti: 1.5}), + tundra: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "rock", "permafrost"], ["permafrost", "permafrost", "permafrost", "permafrost", "permafrost", "permafrost", "ice", "snow"], [null,null,null,null,null,"pinecone",null,null,null,null,null,null]], [25, 30, 38, 40], {temp: -15, vMulti: 2}), } let seed = Math.random()*(2**32); enabledMods.forEach((item)=>{ @@ -141,7 +141,8 @@ elements.PRNGgenerate = { onSelect: function(){ let arr = []; let txt = shiftDown; - Object.keys(biomes).forEach(function(b){arr.push(b);}) + Object.keys(biomes).forEach(function(b){arr.push(b);}); + txt = (arr.length >= 7) ? true : txt; promptInput("Leave blank to generate new seed. Your current seed is: " + seed, function(i){ seed = (i != null && i.toLowerCase() == "c") ? seed : parseFloat(i) || Math.random()*(2**32); seed = seed % (2**32); From 88b2f45ac7e94045a13aaffd244935fea7bc90f0 Mon Sep 17 00:00:00 2001 From: ggodpl <46885632+ggodpl@users.noreply.github.com> Date: Sat, 1 Nov 2025 00:30:30 +0100 Subject: [PATCH 19/19] update elementsManager.js to the new dependency system --- mods/elementsManager.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/mods/elementsManager.js b/mods/elementsManager.js index 064f2df3..e118628e 100644 --- a/mods/elementsManager.js +++ b/mods/elementsManager.js @@ -1,4 +1,4 @@ -if (enabledMods.includes("mods/betterMenuScreens.js")) { +dependOn("betterMenuScreens.js", () => { const properties = { meta: [ {name: "name", type: "string", viewOnly: true, required: true}, @@ -1209,8 +1209,4 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { } runAfterLoadList.push(cssInject, loadChanges); -} else { - enabledMods.unshift("mods/betterMenuScreens.js"); - localStorage.setItem("enabledMods", JSON.stringify(enabledMods)); - window.location.reload(); -} +}, true); \ No newline at end of file