Date: Sun, 28 Sep 2025 15:46:04 +0800
Subject: [PATCH 035/105] 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 1d70c684..ccf3b56f 100644
--- a/mods/cubesstuff.js
+++ b/mods/cubesstuff.js
@@ -2182,7 +2182,7 @@ elements.white_hole = {
if (other && other !== pixel) {
let elemDef = elements[other.element];
- if (elemDef.hardness === 1 && !other.element === "white_hole") continue;
+ if (elemDef.hardness === 1) continue;
let dist = Math.sqrt(dx * dx + dy * dy);
@@ -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)
}
}
@@ -3325,3 +3325,4 @@ elements.replace_all_of_element = {
}
}
+
From 7235205acce22ab472daabc0b84f26d4f06c6282 Mon Sep 17 00:00:00 2001
From: David Kopal <112717418+DavidKopal@users.noreply.github.com>
Date: Sun, 28 Sep 2025 10:48:46 +0200
Subject: [PATCH 036/105] Add files via upload
---
mods/bf.js | 307 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 307 insertions(+)
create mode 100644 mods/bf.js
diff --git a/mods/bf.js b/mods/bf.js
new file mode 100644
index 00000000..0eaa5f38
--- /dev/null
+++ b/mods/bf.js
@@ -0,0 +1,307 @@
+async function _modprompt(message, defaultValue = "") { // thanks to ggod for this prompt function. Taken from nousersthings.js
+ return new Promise(resolve => {
+ promptInput(message, (result) => {
+ resolve(result)
+ }, "bf.js is asking you...", defaultValue)
+ })
+}
+
+class Interpreter {
+ constructor() {
+ this.map = new Array(64).fill(0)
+ this.index = 0
+ this.ci = 0
+ this.loops = []
+ this.code = ""
+ this.tsay = ""
+ }
+
+ async run(px) {
+ while (this.ci < this.code.length) {
+ const token = this.code[this.ci]
+
+ switch (token) {
+ case ">":
+ if (this.index + 1 == this.map.length) {
+ this.map.push(0)
+ }
+ this.index++
+ break
+
+ case "<":
+ if (this.index - 1 != -1) {
+ this.index--
+ }
+ break
+
+ case "+":
+ this.map[this.index]++
+ break
+
+ case "-":
+ this.map[this.index]--
+ break
+
+ case ".":
+ this.tsay += String.fromCharCode(this.map[this.index])
+ break
+
+ case "!":
+ promptText(this.tsay, () => { }, "bf.js")
+ break
+
+ case "/":
+ this.tsay = ""
+ break
+
+ case ",":
+ const ans = await _modprompt("")
+ if (ans.trim().length > 0) {
+ this.map[this.index] = ans[0].charCodeAt(0)
+ }
+ break
+
+ case "[":
+ if (this.map[this.index] === 0) {
+ let open = 1
+ while (open > 0) {
+ this.ci++
+ if (this.code[this.ci] === "[") open++
+ else if (this.code[this.ci] === "]") open--
+ }
+ } else {
+ this.loops.push(this.ci)
+ }
+ break
+
+ case "]":
+ if (this.map[this.index] !== 0) {
+ this.ci = this.loops[this.loops.length - 1]
+ } else {
+ this.loops.pop()
+ }
+ break
+ }
+
+ this.ci++
+ }
+
+ px.running = false
+ }
+}
+
+const bftokens = {
+ bf_base: "#00ff00",
+ bf_remote_base: "#008600",
+ bf_electric_base: "#5cb334",
+ ">": "#ff7f00",
+ "<": "#ff00ff",
+ "+": "#00ffff",
+ "-": "#800080",
+ "[": "#ff1493",
+ "]": "#1e90ff",
+ ".": "#ffd700",
+ ",": "#ff4500",
+ "!": "#ff69b4",
+ "/": "#bd1515",
+ "split": "#565656"
+}
+const bftokenslist = Object.keys(bftokens)
+
+elements.bf_base = {
+ category: "bf",
+ color: "#00ff00",
+ state: "solid",
+ behavior: behaviors.WALL,
+ conduct: 1,
+ tick: (px) => {
+ if (pixelTicks == px.start) {
+ px.act = false
+ px.interpreter = new Interpreter()
+ px.base = [px.x, px.y]
+ px.running = false
+ }
+ },
+}
+
+let remotebase1 = undefined
+let bfreader = undefined
+let bfreader2 = undefined
+let bfelectricbase = undefined
+
+elements.bf_remote_base = {
+ category: "bf",
+ color: "#008600",
+ state: "solid",
+ behavior: behaviors.WALL,
+ onSelect: async function () {
+ var bfans1 = await _modprompt("Please input in the coordinates of the desired pixel. When it activates, this activates. (X,Y)", "0,0")
+ if (!bfans1) { return }
+ let [x, y] = bfans1.split(",")
+ remotebase1 = [Number(x), Number(y)]
+ },
+ tick: (px) => {
+ if (pixelTicks == px.start) {
+ px.act = false
+ px.base = pixelMap[remotebase1[0]][remotebase1[1]].base
+ if (!pixelMap[remotebase1[0]][remotebase1[1]].remotes) {
+ pixelMap[remotebase1[0]][remotebase1[1]].remotes = []
+ }
+ pixelMap[remotebase1[0]][remotebase1[1]].remotes.push([px.x, px.y])
+ px.cd = false
+ }
+ },
+}
+
+elements.bf_electric_base = {
+ category: "bf",
+ color: "#5cb334",
+ state: "solid",
+ behavior: behaviors.WALL,
+ onSelect: async function () {
+ var bfans4 = await _modprompt("Please input in the coordinates of the desired base. (X,Y)", "0,0")
+ if (!bfans4) { return }
+ let [x, y] = bfans4.split(",")
+ bfelectricbase = [Number(x), Number(y)]
+ },
+ tick: (px) => {
+ if (pixelTicks == px.start) {
+ const base = pixelMap[bfelectricbase[0]][bfelectricbase[1]]
+ if (base.element == "bf_base") {
+ px.act = false
+ px.interpreter = base.interpreter
+ px.base = [px.x, px.y]
+ px.running = false
+ }
+ }
+ if (px.interpreter && pixel.charge && !px.running) {
+ px.running = true
+ px.act = true
+ px.interpreter.map.fill(0)
+ px.interpreter.code = ""
+ px.interpreter.index = 0
+ px.interpreter.ci = 0
+ }
+ }
+}
+
+elements.reader = {
+ category: "bf",
+ color: "#008600",
+ state: "solid",
+ behavior: behaviors.WALL,
+ conduct: 1,
+ onSelect: async function () {
+ var bfans2 = await _modprompt("Please input in the desired value to activate when read.", "0")
+ if (!bfans2) { return }
+ bfreader = Number(bfans2)
+ },
+ tick: (px) => {
+ if (pixelTicks == px.start) {
+ px.tread = bfreader
+ }
+ },
+}
+
+elements.pointer_reader = {
+ category: "bf",
+ color: "#008600",
+ state: "solid",
+ behavior: behaviors.WALL,
+ conduct: 1,
+ onSelect: async function () {
+ var bfans3 = await _modprompt("Please input in the desired pointer and value to activate when read. (pointer,value)", "0,0")
+ if (!bfans3) { return }
+ let [x, y] = bfans3.split(",")
+ bfreader2 = [Number(x), Number(y)]
+ },
+ tick: (px) => {
+ if (pixelTicks == px.start) {
+ px.tread = bfreader2
+ }
+ },
+}
+
+elements.bf_runner = {
+ category: "bf",
+ color: "#ababab",
+ tool: (px) => {
+ if ((px.element == "bf_base" || px.element == "bf_electric_base") && !px.running) {
+ px.running = true
+ px.act = true
+ px.interpreter.map.fill(0)
+ px.interpreter.code = ""
+ px.interpreter.index = 0
+ px.interpreter.ci = 0
+ }
+ }
+}
+
+bftokenslist.forEach(token => {
+ if (token == "bf_base" || token == "bf_remote_base" || token == "bf_electric_base") { return }
+ elements[token] = {
+ category: "bf",
+ color: bftokens[token],
+ state: "solid",
+ behavior: behaviors.WALL,
+ tick: (px) => {
+ if (!px.base) {
+ px.way = "l"
+ px.act = false
+ const ns = getNeighbors(px)
+ if (ns.length > 0) {
+ if (!isEmpty(px.x - 1, px.y)) {
+ const left = ns[0]
+ if (bftokenslist.includes(left.element) && left.base) {
+ px.base = left.base
+ }
+ }
+ }
+ } else {
+ if (px.act) {
+ px.color = "#00ff00"
+ } else {
+ px.color = bftokens[token]
+ }
+ const ns = getNeighbors(px)
+ if (ns.length > 0) {
+ const left = ns[0]
+ if (bftokenslist.includes(left.element) && left.base) {
+ if (left.act && !px.act) {
+ left.act = false
+ px.act = true
+ pixelMap[px.base[0]][px.base[1]].interpreter.code += token
+ if (isEmpty(px.x + 1, px.y)) {
+ if (!px.remotes) {
+ try {
+ pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]])
+ } catch {
+ const code = pixelMap[px.base[0]][px.base[1]].interpreter.code
+ pixelMap[px.base[0]][px.base[1]].interpreter = new Interpreter()
+ pixelMap[px.base[0]][px.base[1]].interpreter.code = code
+ pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]])
+ }
+ px.act = false
+ } else {
+ px.remotes.forEach(remote => {
+ pixelMap[remote[0]][remote[1]].act = true
+ })
+ }
+ }
+ }
+ }
+ if (ns.length >= 2) {
+ ns.forEach(n => {
+ if (n.element == "reader" && pixelMap[px.base[0]][px.base[1]].interpreter.map[pixelMap[px.base[0]][px.base[1]].interpreter.index] == n.tread) {
+ n.charge = 1
+ } else if (n.element == "pointer_reader" && pixelMap[px.base[0]][px.base[1]].interpreter.map[n.tread[0]] == n.tread[1]) {
+ n.charge = 1
+ }
+ })
+ }
+ }
+ }
+ }
+ }
+})
+
From 61f6e44b2979326179b6fe20caed9e9ada7f8c45 Mon Sep 17 00:00:00 2001
From: David Kopal <112717418+DavidKopal@users.noreply.github.com>
Date: Sun, 28 Sep 2025 17:22:43 +0200
Subject: [PATCH 037/105] Add files via upload
---
mods/bf.js | 88 ++++++++++++++++++++----------------------------------
1 file changed, 32 insertions(+), 56 deletions(-)
diff --git a/mods/bf.js b/mods/bf.js
index 0eaa5f38..830805ee 100644
--- a/mods/bf.js
+++ b/mods/bf.js
@@ -1,8 +1,8 @@
async function _modprompt(message, defaultValue = "") { // thanks to ggod for this prompt function. Taken from nousersthings.js
return new Promise(resolve => {
promptInput(message, (result) => {
- resolve(result)
- }, "bf.js is asking you...", defaultValue)
+ resolve(result);
+ }, "bf.js is asking you...", defaultValue);
})
}
@@ -93,7 +93,6 @@ class Interpreter {
const bftokens = {
bf_base: "#00ff00",
bf_remote_base: "#008600",
- bf_electric_base: "#5cb334",
">": "#ff7f00",
"<": "#ff00ff",
"+": "#00ffff",
@@ -103,8 +102,8 @@ const bftokens = {
".": "#ffd700",
",": "#ff4500",
"!": "#ff69b4",
- "/": "#bd1515",
- "split": "#565656"
+ "split": "#565656",
+ "act": "#ffc400",
}
const bftokenslist = Object.keys(bftokens)
@@ -121,13 +120,17 @@ elements.bf_base = {
px.base = [px.x, px.y]
px.running = false
}
+
+ if (!(px.interpreter instanceof Interpreter)) {
+ px.interpreter = new Interpreter()
+ }
},
+
}
let remotebase1 = undefined
let bfreader = undefined
let bfreader2 = undefined
-let bfelectricbase = undefined
elements.bf_remote_base = {
category: "bf",
@@ -135,7 +138,7 @@ elements.bf_remote_base = {
state: "solid",
behavior: behaviors.WALL,
onSelect: async function () {
- var bfans1 = await _modprompt("Please input in the coordinates of the desired pixel. When it activates, this activates. (X,Y)", "0,0")
+ var bfans1 = await _modprompt("Please input in the coordinates of the desired pixel. When it activates, this activates. (X,Y)", "0,0");
if (!bfans1) { return }
let [x, y] = bfans1.split(",")
remotebase1 = [Number(x), Number(y)]
@@ -153,38 +156,6 @@ elements.bf_remote_base = {
},
}
-elements.bf_electric_base = {
- category: "bf",
- color: "#5cb334",
- state: "solid",
- behavior: behaviors.WALL,
- onSelect: async function () {
- var bfans4 = await _modprompt("Please input in the coordinates of the desired base. (X,Y)", "0,0")
- if (!bfans4) { return }
- let [x, y] = bfans4.split(",")
- bfelectricbase = [Number(x), Number(y)]
- },
- tick: (px) => {
- if (pixelTicks == px.start) {
- const base = pixelMap[bfelectricbase[0]][bfelectricbase[1]]
- if (base.element == "bf_base") {
- px.act = false
- px.interpreter = base.interpreter
- px.base = [px.x, px.y]
- px.running = false
- }
- }
- if (px.interpreter && pixel.charge && !px.running) {
- px.running = true
- px.act = true
- px.interpreter.map.fill(0)
- px.interpreter.code = ""
- px.interpreter.index = 0
- px.interpreter.ci = 0
- }
- }
-}
-
elements.reader = {
category: "bf",
color: "#008600",
@@ -192,7 +163,7 @@ elements.reader = {
behavior: behaviors.WALL,
conduct: 1,
onSelect: async function () {
- var bfans2 = await _modprompt("Please input in the desired value to activate when read.", "0")
+ var bfans2 = await _modprompt("Please input in the desired value to activate when read.", "0");
if (!bfans2) { return }
bfreader = Number(bfans2)
},
@@ -210,7 +181,7 @@ elements.pointer_reader = {
behavior: behaviors.WALL,
conduct: 1,
onSelect: async function () {
- var bfans3 = await _modprompt("Please input in the desired pointer and value to activate when read. (pointer,value)", "0,0")
+ var bfans3 = await _modprompt("Please input in the desired pointer and value to activate when read. (pointer,value)", "0,0");
if (!bfans3) { return }
let [x, y] = bfans3.split(",")
bfreader2 = [Number(x), Number(y)]
@@ -226,7 +197,7 @@ elements.bf_runner = {
category: "bf",
color: "#ababab",
tool: (px) => {
- if ((px.element == "bf_base" || px.element == "bf_electric_base") && !px.running) {
+ if (px.element == "bf_base" && !px.running) {
px.running = true
px.act = true
px.interpreter.map.fill(0)
@@ -237,8 +208,8 @@ elements.bf_runner = {
}
}
-bftokenslist.forEach(token => {
- if (token == "bf_base" || token == "bf_remote_base" || token == "bf_electric_base") { return }
+for (let token of bftokenslist) {
+ if (token == "bf_base" || token == "bf_remote_base") { continue }
elements[token] = {
category: "bf",
color: bftokens[token],
@@ -272,21 +243,14 @@ bftokenslist.forEach(token => {
px.act = true
pixelMap[px.base[0]][px.base[1]].interpreter.code += token
if (isEmpty(px.x + 1, px.y)) {
- if (!px.remotes) {
- try {
- pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]])
- } catch {
- const code = pixelMap[px.base[0]][px.base[1]].interpreter.code
- pixelMap[px.base[0]][px.base[1]].interpreter = new Interpreter()
- pixelMap[px.base[0]][px.base[1]].interpreter.code = code
- pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]])
- }
- px.act = false
- } else {
+ if (px.remotes) {
px.remotes.forEach(remote => {
pixelMap[remote[0]][remote[1]].act = true
})
+ } else {
+ pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]])
}
+ px.act = false
}
}
}
@@ -303,5 +267,17 @@ bftokenslist.forEach(token => {
}
}
}
-})
+}
+elements.act.conduct = 0.1
+const oldact = elements.act.tick
+elements.act.tick = (px) => {
+ oldact(px)
+
+ if (px.charge && !px.act) {
+ px.act = true
+ px.charge = 0
+ } else {
+ px.charge = 0
+ }
+}
\ No newline at end of file
From fdca2fb3fbbb4289f67996cc9a0bb25241b13238 Mon Sep 17 00:00:00 2001
From: slweeb <91897291+slweeb@users.noreply.github.com>
Date: Sun, 28 Sep 2025 11:39:19 -0400
Subject: [PATCH 038/105] Update mod-list.html
---
mod-list.html | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/mod-list.html b/mod-list.html
index bf46b56a..b1247184 100644
--- a/mod-list.html
+++ b/mod-list.html
@@ -243,7 +243,6 @@
| radioactive.js | Radioactive elements on the periodic table [WIP] | kaeud |
| random_rocks.js | Randomly generates rocks on game load | Alice |
| roseyiede.js | Several variants of a substance called roseyiede | Alice |
-| scp.js | Mod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website. | Nekonico |
| some_tf_liquids.js | Various liquids from the Thermal Foundation Minecraft mod | Alice |
| stickystuff.js | Slime, Honey, and others can stick to other elements | Suss |
| the_ground.js | Several rocks, worldgen types, and gemstones | Alice |
@@ -295,7 +294,7 @@
| more_breaking.js | More elements can be broken | Alice |
| rays.js | More Ray types | Alice |
| rays++.js | Couple more rays | uptzik |
-| scp.js | Mod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website. | Nekonico |
+| scp.js | Creatures and items from the SCP Wiki | Nekonico |
| subspace.js | The Subspace Tripmine from Roblox | nousernamefound |
| war_crimes.js | Tear gas and more | voidapex11 |
| weapons.js | Variety of different weapons | Jayd |
@@ -356,7 +355,7 @@
| petal_dye.js | Boil petals to make dye | Suss |
| plants.js | Wide variety of new plants and fruits | Orchid |
| primordial_birthpool.js | Cross between Primordial Soup and Birthpool. Requires fey_and_more.js | Alice |
-| scp.js | Mod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website. | Nekonico |
+| scp.js | Creatures and items from the SCP Wiki | Nekonico |
| spring.js | Many nature elements, like sakura trees, butterflies, beehives, and more | R74n |
| the_ground_og.js | Simplified and more stable version of the_ground.js | Alice |
| the_ground.js | Several rock types, worldgen settings, and gemstones | Alice |
@@ -396,7 +395,7 @@
| random_elems.js | Curated randomly generated elements | Alice |
| random_liquids.js | Randomly generates liquids on game load | Alice |
| sbmixup.js | Silly elements from a Mix-Up! game | stefanblox |
-
| scp.js | Mod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website. | Nekonico |
+| scp.js | Creatures and items from the SCP Wiki | Nekonico |
| sports_beta.js | Several sports items | BluBun5193 |
| star_wars.js | Various items from Star Wars by Disney | SeaPickle754 |
| sus.js | Among Us crewmate | Nv7 |
From 0ae6c78aaad3cabf1946dbb5716ebeec3fd42087 Mon Sep 17 00:00:00 2001
From: slweeb <91897291+slweeb@users.noreply.github.com>
Date: Sun, 28 Sep 2025 11:40:46 -0400
Subject: [PATCH 039/105] 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 c24d159f..4d0a6d23 100644
--- a/mod-list.html
+++ b/mod-list.html
@@ -184,7 +184,6 @@
| noconfirm.js | Removes all confirmation popups | mollthecoder |
| page_color.js | Change the page color with the "pageColor" query parameter | Alice |
| pixelResizeTool.js | Button to change pixel scale | feeshmaster |
-| PRNGworldgenlib.js | Switched from random numbers to pseudorandom numbers - seeds generate consistently but take longer to load | Orchid |
| prompt.js | Primitive command console | Alice |
| prop.js | Tool to edit the attributes of pixels | Alice |
| random_everything.js | Allows every element to be spawned with Random | R74n |
@@ -459,7 +458,7 @@
| nv7.js | Giant Nv7 image [Large] | Nv7 |
| orchidslibrary.js | Library used by morechemistry.js, plants.js, and datawire.js | Orchid |
| place_all_elements.js | Experimental function that places every pixel | Alice |
-| PRNGworldgenlib.js | Switched from random numbers to pseudorandom numbers - seeds generate consistently but take longer to load | Orchid |
+| PRNGworldgenlib.js | World generation library with seeded randomness | Orchid |
| randomness_but_tick.js | Random experimental elements using the tick function feature | Alice |
| randomness_but_tool.js | Random experimental elements using the tool function feature | Alice |
| randomness.js | Random experimental elements | Alice |
From 019acbd239a3b3d0d018eb0ed293a64c6b793942 Mon Sep 17 00:00:00 2001
From: JustAGenericUsername
<92590792+JustAGenericUsername@users.noreply.github.com>
Date: Sun, 28 Sep 2025 14:25:38 -0400
Subject: [PATCH 040/105] buttony buttons
---
mods/logicgates.js | 39 ++++++++++++++++++---------------------
1 file changed, 18 insertions(+), 21 deletions(-)
diff --git a/mods/logicgates.js b/mods/logicgates.js
index d23eae20..3888d199 100644
--- a/mods/logicgates.js
+++ b/mods/logicgates.js
@@ -296,33 +296,30 @@ elements.E2L_button = {
state: "solid",
category: "logic",
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 = 5
+ }
+ }
+ }
+ pixel.db--
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)) {
- if ((pixelMap[x][y].charge || pixelMap[x][y].chargeCD)){
- for (var j = 0; j < adjacentCoords.length; j++) {
- var coord = adjacentCoords[j];
- var x = pixel.x+coord[0];
- var y = pixel.y+coord[1];
- if (!isEmpty(x,y,true)) {
- if (pixelMap[x][y].element == "logic_wire"){
- pixelMap[x][y].lstate = 2
- }
- }
+ if (pixelMap[x][y].element == "logic_wire"){
+ if (pixel.db > 0){
+ pixelMap[x][y].lstate = 2
+ } else {
+ pixelMap[x][y].lstate = -2
}
- return;
- }
- }
- }
- 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)) {
- if (pixelMap[x][y].element == "logic_wire" && pixelMap[x][y].lstate > 0){
- pixelMap[x][y].lstate = -2
}
}
}
From 9560f3dd0248259b804610dc6dcbe3d11e8f21ff Mon Sep 17 00:00:00 2001
From: Nekonico <163950752+DBNekonico@users.noreply.github.com>
Date: Sun, 28 Sep 2025 18:06:58 -0700
Subject: [PATCH 041/105] 173 does not go through walls !
---
mods/scp.js | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/mods/scp.js b/mods/scp.js
index 62d462e6..22a003c6 100644
--- a/mods/scp.js
+++ b/mods/scp.js
@@ -2757,7 +2757,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","head_096","body_096","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"],
+ ignore: ["scp_063","head_049","body_049","head_096","body_096","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"],
category: "scp",
tempHigh: 190,
stateHigh: ["molten_plastic","molten_plastic","fire","dioxin"],
@@ -3410,6 +3410,7 @@ elements.body_173 = {
seenPixel.dead = pixelTicks
}
}
+ break;
}
}
}
@@ -3453,6 +3454,7 @@ elements.body_173 = {
seenPixel.dead = pixelTicks
}
}
+ break;
}
}
}
@@ -3725,7 +3727,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.charge || electric.element == "scp_804" && electric.active == true || 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.element == "scp_804" && electric.active == true || 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]
@@ -3813,7 +3815,7 @@ elements.scp_229 = {
if (!isEmpty(x,y) && !outOfBounds(x,y) && pixel.nCD == undefined) {
var electric = pixelMap[x][y]
let old = electric.element;
- if (electric.element == "brain" || electric.element == "scp_804" && electric.active == true || elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.element == "fish" || electric.element == "frog" || electric.element == "rat" || electric.element == "bird" || electric.element == "head" || electric.element == "head_035" || electric.element == "head_1000" || electric.element == "head_008" || elements[electric.element].category == "machines" && Math.random() > 0.5 || electric.element == "battery" || electric.element == "electric" || electric.element == "lightning" || electric.element == "malware" || electric.element == "gray_goo") {
+ if (electric.element == "brain" || electric.element == "thunder_cloud" || electric.element == "scp_804" && electric.active == true || elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.element == "fish" || electric.element == "frog" || electric.element == "rat" || electric.element == "bird" || electric.element == "head" || electric.element == "head_035" || electric.element == "head_1000" || electric.element == "head_008" || elements[electric.element].category == "machines" && Math.random() > 0.5 || electric.element == "battery" || electric.element == "electric" || electric.element == "lightning" || electric.element == "malware" || electric.element == "gray_goo") {
deletePixel(electric.x,electric.y)
createPixel("scp_229",electric.x,electric.y)
electric = pixelMap[electric.x][electric.y]
@@ -5145,7 +5147,7 @@ elements.scp_999 = {
conduct: .5,
temp: 37,
extinguish: true,
- stain: 0.03,
+ stain: -0.03,
cooldown: defaultCooldown,
}
From 5914ce2c04ffe36ca1f8589c94d1674a1fc76adb Mon Sep 17 00:00:00 2001
From: Nekonico <163950752+DBNekonico@users.noreply.github.com>
Date: Sun, 28 Sep 2025 18:15:11 -0700
Subject: [PATCH 042/105] nuke update
---
mods/scp.js | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/mods/scp.js b/mods/scp.js
index 22a003c6..9f5e8138 100644
--- a/mods/scp.js
+++ b/mods/scp.js
@@ -102,6 +102,21 @@ elements.metanarrative_ontokinetic_hume_stabilizing_anomaly_neutralizing_all_pow
hidden: true,
}
+elements.site_nuke = {
+ color: "#815E2B",
+ behaviorOn: [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "M2|M1 AND EX:500>plasma,plasma,plasma,plasma,plasma,radiation,radiation,radiation,rad_steam,electric|M2",
+ ],
+ conduct: 0.75,
+ category: "scp",
+ state: "solid",
+ density: 1500,
+ excludeRandom: true,
+ cooldown: defaultCooldown
+}
+
elements.d_class = {
// color: ["#f5eac6","#d4c594","#a89160","#7a5733","#523018","#361e0e"],
color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"],
@@ -3826,6 +3841,10 @@ elements.scp_229 = {
else if (electric.element == "glass" || electric.element == "rad_glass" || electric.element == "stained_glass") {
electric.element = "glass_shard"
pixel.nCD = 2
+ }
+ else if (electric.element == "site_nuke") {
+ explodeAt(electric.x,electric.y,500,["plasma","plasma","plasma","plasma","plasma","plasma","plasma","radiation","radiation","radiation","radiation","rad_steam","electric","electric"])
+ pixel.nCD = 2
}
else if (electric.charge) {
deletePixel(electric.x,electric.y)
@@ -4933,7 +4952,7 @@ elements.scp_804 = {
}
}
}
- else if (manmade.element == "unknown" || manmade.element == "scp_035" || manmade.element == "scp_229" || elements[manmade.element].category == "machines" || manmade.element == "metal_scrap" || manmade.element == "solid_mercury" || manmade.element == "molten_gallium" || manmade.element == "steel" || manmade.element == "galvanized_steel" || manmade.element == "brass" || manmade.element == "bronze" || manmade.element == "invar" || manmade.element == "sterling" || manmade.element == "rose_gold" || manmade.element == "purple_gold" || manmade.element == "blue_gold" || manmade.element == "electrum" || manmade.element == "solder" || manmade.element == "particleboard") {
+ else if (manmade.element == "unknown" || manmade.element == "site_nuke" || manmade.element == "scp_035" || manmade.element == "scp_229" || elements[manmade.element].category == "machines" || manmade.element == "metal_scrap" || manmade.element == "solid_mercury" || manmade.element == "molten_gallium" || manmade.element == "steel" || manmade.element == "galvanized_steel" || manmade.element == "brass" || manmade.element == "bronze" || manmade.element == "invar" || manmade.element == "sterling" || manmade.element == "rose_gold" || manmade.element == "purple_gold" || manmade.element == "blue_gold" || manmade.element == "electrum" || manmade.element == "solder" || manmade.element == "particleboard") {
if (!manmade.repair) {
manmade.repair = 15
}
From 70e597dfeb989e287ff3b01219c762e3f164779e Mon Sep 17 00:00:00 2001
From: Nekonico <163950752+DBNekonico@users.noreply.github.com>
Date: Sun, 28 Sep 2025 18:44:01 -0700
Subject: [PATCH 043/105] gugfix
---
mods/scp.js | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/mods/scp.js b/mods/scp.js
index 9f5e8138..28b0118a 100644
--- a/mods/scp.js
+++ b/mods/scp.js
@@ -104,17 +104,17 @@ elements.metanarrative_ontokinetic_hume_stabilizing_anomaly_neutralizing_all_pow
elements.site_nuke = {
color: "#815E2B",
+ behavior: behaviors.WALL,
behaviorOn: [
"XX|XX|XX",
- "XX|XX|XX",
- "M2|M1 AND EX:500>plasma,plasma,plasma,plasma,plasma,radiation,radiation,radiation,rad_steam,electric|M2",
+ "XX|EX:250>molten_glass,molten_glass,plasma,plasma,plasma,plasma,plasma,plasma,plasma,radiation,radiation,radiation,rad_steam,electric,electric,electric|XX",
+ "M2|M1|M2",
],
- conduct: 0.75,
+ conduct: 1,
category: "scp",
state: "solid",
density: 1500,
excludeRandom: true,
- cooldown: defaultCooldown
}
elements.d_class = {
@@ -3843,7 +3843,7 @@ elements.scp_229 = {
pixel.nCD = 2
}
else if (electric.element == "site_nuke") {
- explodeAt(electric.x,electric.y,500,["plasma","plasma","plasma","plasma","plasma","plasma","plasma","radiation","radiation","radiation","radiation","rad_steam","electric","electric"])
+ explodeAt(electric.x,electric.y,100,["plasma","plasma","plasma","plasma","plasma","plasma","plasma","radiation","radiation","radiation","radiation","rad_steam","electric","electric"])
pixel.nCD = 2
}
else if (electric.charge) {
From eae096f0f0fd30a63cda8d5e36a6baf95ac18262 Mon Sep 17 00:00:00 2001
From: David Kopal <112717418+DavidKopal@users.noreply.github.com>
Date: Tue, 30 Sep 2025 06:12:27 +0200
Subject: [PATCH 044/105] logicgates.js integration and a few fixes.
---
mods/bf.js | 157 +++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 134 insertions(+), 23 deletions(-)
diff --git a/mods/bf.js b/mods/bf.js
index 830805ee..d4a6e663 100644
--- a/mods/bf.js
+++ b/mods/bf.js
@@ -16,9 +16,10 @@ class Interpreter {
this.tsay = ""
}
- async run(px) {
- while (this.ci < this.code.length) {
- const token = this.code[this.ci]
+ async run(px, code = this.code) {
+ this.ci = 0
+ while (this.ci < code.length) {
+ const token = code[this.ci]
switch (token) {
case ">":
@@ -66,8 +67,8 @@ class Interpreter {
let open = 1
while (open > 0) {
this.ci++
- if (this.code[this.ci] === "[") open++
- else if (this.code[this.ci] === "]") open--
+ if (code[this.ci] === "[") open++
+ else if (code[this.ci] === "]") open--
}
} else {
this.loops.push(this.ci)
@@ -90,6 +91,22 @@ class Interpreter {
}
}
+class RemoteBase {
+ constructor(base) {
+ this.base = base
+ this.code = ""
+ }
+
+ run() {
+ pixelMap[this.base[0]][this.base[1]].interpreter.run(pixelMap[this.base[0]][this.base[1]], this.code)
+ this.code = ""
+ }
+
+ getMap() {
+ return pixelMap[this.base[0]][this.base[1]].interpreter.map
+ }
+}
+
const bftokens = {
bf_base: "#00ff00",
bf_remote_base: "#008600",
@@ -104,6 +121,7 @@ const bftokens = {
"!": "#ff69b4",
"split": "#565656",
"act": "#ffc400",
+ "bf_gate": "#ffc400",
}
const bftokenslist = Object.keys(bftokens)
@@ -146,14 +164,21 @@ elements.bf_remote_base = {
tick: (px) => {
if (pixelTicks == px.start) {
px.act = false
- px.base = pixelMap[remotebase1[0]][remotebase1[1]].base
+ px.interpreter = new RemoteBase(pixelMap[remotebase1[0]][remotebase1[1]].base)
+ px.base = [px.x, px.y]
if (!pixelMap[remotebase1[0]][remotebase1[1]].remotes) {
pixelMap[remotebase1[0]][remotebase1[1]].remotes = []
}
pixelMap[remotebase1[0]][remotebase1[1]].remotes.push([px.x, px.y])
+ px.parent = remotebase1
px.cd = false
}
},
+ onDelete: (px) => {
+ if (!isEmpty(px.parent[0], px.parent[1]) && pixelMap[px.parent[0]][px.parent[1]].remotes) {
+ pixelMap[px.parent[0]][px.parent[1]].remotes.filter(a => !(a[0] === px.x && a[1] === px.y))
+ }
+ }
}
elements.reader = {
@@ -208,8 +233,85 @@ elements.bf_runner = {
}
}
+dependOn("logicgates.js", () => {
+ elements.bf_gate = {
+ category: "bf",
+ color: "#ffc400",
+ state: "solid",
+ behavior: behaviors.WALL,
+ tick: (px) => {
+ if (!px.base) {
+ px.act = false
+ const ns = getNeighbors(px)
+ if (ns.length > 0) {
+ if (!isEmpty(px.x - 1, px.y)) {
+ const left = ns[0]
+ if (bftokenslist.includes(left.element) && left.base) {
+ px.base = left.base
+ }
+ }
+ }
+ } else {
+ if (px.act) {
+ px.color = "#00ff00"
+ } else {
+ px.color = "#ffc400"
+ }
+ var countNeighborsResult = countNeighbors(pixel)
+ if (countNeighborsResult.charged > 0) {
+ px.can = true
+ } else {
+ px.can = false
+ }
+
+ if (!isEmpty(px.x - 1, px.y)) {
+ const left = pixelMap[px.x - 1][px.y]
+ if (bftokenslist.includes(left.element) && left.base) {
+ if (left.act && !px.act && px.can) {
+ left.act = false
+ px.act = true
+ pixelMap[px.base[0]][px.base[1]].interpreter.code += "g"
+ if (isEmpty(px.x + 1, px.y) || !pixelMap[px.x][px.y].base || (pixelMap[px.x][px.y].element == "bf_gate" && !pixelMap[px.x][px.y].can)) {
+ px.act = false
+ }
+ if (px.remotes) {
+ px.remotes.forEach(remote => {
+ pixelMap[remote[0]][remote[1]].act = true
+ })
+ } else {
+ pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]])
+ }
+ }
+ }
+ }
+
+ const ns = getNeighbors(px)
+ ns.forEach(n => {
+ if (pixelMap[px.base[0]][px.base[1]].interpreter instanceof Interpreter) {
+ if (n.element == "reader" && pixelMap[px.base[0]][px.base[1]].interpreter.map[pixelMap[px.base[0]][px.base[1]].interpreter.index] == n.tread) {
+ n.charge = 1
+ } else if (n.element == "pointer_reader" && pixelMap[px.base[0]][px.base[1]].interpreter.map[n.tread[0]] == n.tread[1]) {
+ n.charge = 1
+ }
+ } else {
+ if (n.element == "reader" && pixelMap[px.base[0]][px.base[1]].interpreter.getMap()[pixelMap[px.base[0]][px.base[1]].interpreter.index] == n.tread) {
+ n.charge = 1
+ } else if (n.element == "pointer_reader" && pixelMap[px.base[0]][px.base[1]].interpreter.getMap()[n.tread[0]] == n.tread[1]) {
+ n.charge = 1
+ }
+ }
+ })
+ }
+
+ if (isEmpty(px.x + 1, px.y) || !pixelMap[px.x + 1][px.y].base || (pixelMap[px.x + 1][px.y].element == "bf_gate" && !pixelMap[px.x + 1][px.y].can)) {
+ px.act = false
+ }
+ }
+ }
+}, true)
+
for (let token of bftokenslist) {
- if (token == "bf_base" || token == "bf_remote_base") { continue }
+ if (token == "bf_base" || token == "bf_remote_base" || token == "bf_gate") { continue }
elements[token] = {
category: "bf",
color: bftokens[token],
@@ -217,7 +319,6 @@ for (let token of bftokenslist) {
behavior: behaviors.WALL,
tick: (px) => {
if (!px.base) {
- px.way = "l"
px.act = false
const ns = getNeighbors(px)
if (ns.length > 0) {
@@ -235,36 +336,46 @@ for (let token of bftokenslist) {
px.color = bftokens[token]
}
const ns = getNeighbors(px)
- if (ns.length > 0) {
- const left = ns[0]
+ if (ns.length > 0 && !isEmpty(px.x - 1, px.y)) {
+ const left = pixelMap[px.x - 1][px.y]
if (bftokenslist.includes(left.element) && left.base) {
if (left.act && !px.act) {
left.act = false
px.act = true
pixelMap[px.base[0]][px.base[1]].interpreter.code += token
- if (isEmpty(px.x + 1, px.y)) {
- if (px.remotes) {
- px.remotes.forEach(remote => {
- pixelMap[remote[0]][remote[1]].act = true
- })
- } else {
- pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]])
- }
- px.act = false
+ if (px.remotes) {
+ px.remotes.forEach(remote => {
+ pixelMap[remote[0]][remote[1]].act = true
+ console.log(pixelMap[remote[0]][remote[1]].act)
+ })
+ } else {
+ pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]])
}
}
}
- if (ns.length >= 2) {
- ns.forEach(n => {
+ }
+ if (ns.length >= 2) {
+ ns.forEach(n => {
+ if (pixelMap[px.base[0]][px.base[1]].interpreter instanceof Interpreter) {
if (n.element == "reader" && pixelMap[px.base[0]][px.base[1]].interpreter.map[pixelMap[px.base[0]][px.base[1]].interpreter.index] == n.tread) {
n.charge = 1
} else if (n.element == "pointer_reader" && pixelMap[px.base[0]][px.base[1]].interpreter.map[n.tread[0]] == n.tread[1]) {
n.charge = 1
}
- })
- }
+ } else {
+ if (n.element == "reader" && pixelMap[px.base[0]][px.base[1]].interpreter.getMap()[pixelMap[px.base[0]][px.base[1]].interpreter.index] == n.tread) {
+ n.charge = 1
+ } else if (n.element == "pointer_reader" && pixelMap[px.base[0]][px.base[1]].interpreter.getMap()[n.tread[0]] == n.tread[1]) {
+ n.charge = 1
+ }
+ }
+ })
}
}
+
+ if (isEmpty(px.x + 1, px.y) || !pixelMap[px.x + 1][px.y].base || (pixelMap[px.x + 1][px.y].element == "bf_gate" && !pixelMap[px.x + 1][px.y].can)) {
+ px.act = false
+ }
}
}
}
From 13bc3d88d48bc758c8281ea9df4b7049c821778a Mon Sep 17 00:00:00 2001
From: slweeb <91897291+slweeb@users.noreply.github.com>
Date: Wed, 1 Oct 2025 13:18:10 -0400
Subject: [PATCH 045/105] Delete mods/liquid_Master.js
Nonfunctional
---
mods/liquid_Master.js | 55 -------------------------------------------
1 file changed, 55 deletions(-)
delete mode 100644 mods/liquid_Master.js
diff --git a/mods/liquid_Master.js b/mods/liquid_Master.js
deleted file mode 100644
index b3dc732f..00000000
--- a/mods/liquid_Master.js
+++ /dev/null
@@ -1,55 +0,0 @@
-runAfterLoad(function() {
- console.log("Liquefier Mod loaded!")
- console.log("Created by Hitochi — turns elements into liquid forms.")
-})
-
-elements.liquefier = {
- color: "#33ccff",
- behavior: behaviors.POWDER, // sits in place
- category: "machines",
- state: "solid",
- density: 2000,
- tick: function(pixel) {
- const dirs = [
- [0,1], [0,-1], [1,0], [-1,0],
- [1,1], [-1,1], [1,-1], [-1,-1]
- ];
- for (const [dx,dy] of dirs) {
- const x = pixel.x+dx;
- const y = pixel.y+dy;
- if (outOfBounds(x,y)) continue;
-
- const target = pixelMap[x][y];
- if (!target) continue;
- if (target.element === "liquefier") continue;
-
- const liquidName = target.element + "_liquid";
-
- // Define the liquid version if missing
- if (!elements[liquidName]) {
- let baseColor = elements[target.element]?.color || "#654321";
- if (Array.isArray(baseColor)) baseColor = baseColor[0];
-
- // check if original is food
- const isEdible =
- elements[target.element]?.isFood === true ||
- elements[target.element]?.category === "food";
-
- elements[liquidName] = {
- color: [baseColor, "#3399ff"], // tinted version
- behavior: behaviors.LIQUID,
- category: "liquids",
- state: "liquid",
- density: 1050,
- viscosity: 8,
- isFood: isEdible, // only food is edible
- desc: "Liquefied form of " + target.element
- };
- }
-
- // Turn neighbor into its liquid version
- changePixel(target, liquidName);
- }
- },
- desc: "Liquefies nearby pixels into their liquid versions. Food becomes drinkable."
-};
From 9a2ed81b4a96eccfde3cab7c26a4d8f3f0cbd7b2 Mon Sep 17 00:00:00 2001
From: slweeb <91897291+slweeb@users.noreply.github.com>
Date: Thu, 2 Oct 2025 17:27:08 -0400
Subject: [PATCH 046/105] Formatting and consistency
---
mod-list.html | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/mod-list.html b/mod-list.html
index 81272bed..54f54812 100644
--- a/mod-list.html
+++ b/mod-list.html
@@ -174,8 +174,8 @@
| extra_element_info.js | Descriptions to various vanilla elements. Used to provide the functionality that desc now does before it was added to vanilla | Melecie |
| extrasaveslots.js | Extra saves slots [KEEP IMPORTANT SAVES AS FILES!!] | Jayd |
| find.js | Find mode that highlights a chosen element as pulsating red and yellow [More Info] | Alice |
-| hideandshowtools.js | Tools to hide elements and show hidden elements | MicaelNotUsed |
| gasdecay.js | Gases will slowly decay over time | nousernamefound |
+| hideandshowtools.js | Tools to hide elements and show hidden elements | MicaelNotUsed |
| human_friendly_design.js | Drag and Mix tools don't kill humans | Nekonico |
| insane_random_events.js | Massively buffs random events | Alice |
| jaydsfunctions.js | Extra tools | Jayd |
@@ -201,12 +201,12 @@
| Science & Chemistry |
| alcohol.js | Methanol, (iso-)propanol, and butanol | Alice |
| alkahest.js | The alkahest, a liquid which dissolves anything | Alice |
-| alkali_metal.js | The missing alkali metals. (Inspired by nobegas.js and halogen.js) | Cube14yt |
+
| alkali_metal.js | The missing alkali metals (Inspired by noblegas.js and halogen.js) | Cube14yt |
| aScientistsWish.js | Several things related to science and physics | Carbon Monoxide, salmonfishy |
| bettermetalscrap.js | Metal scrap can be melted back into its original material | nousernamefound |
| bigger_star_spawners.js | Spawners for larger stars | Alice |
-| biology.js | Various elements and features that let you build your own organism | Nekonico |
-| bioooze_and_pyrogens.js | Bio-Ooze from Frackin' Universe and several heat-producing materials from various games' mods | Alice |
+| biology.js | Various elements and features for building large organisms | Nekonico |
+| bioooze_and_pyrogens.js | Bio-Ooze from Frackin' Universe and several heat-producing materials from various games' mods | Alice |
| boiling_things.js | Various elements can be vaporized | Alice |
| bouncing_balls.js | New types of balls that bounce accurately and roll | Nekonico |
| chalcopyrite.js | The chalcopyrite ore | Sophie |
@@ -220,7 +220,7 @@
| fire_mod.js | Various properties to change fire behavior and radioactive fire | Alice |
| fire_slime.js | Pyrogenic version of slime | Alice |
| Gemstones.js | Gemstones | Schweeny |
-| glenn_gases.js | Most gases from the Glenn's Gases mod into Sandboxels | Alice |
+| glenn_gases.js | Most gases from the Glenn's Gases mod into Sandboxels | Alice |
| grav_mudstones.js | Various forms of mudstone with different gravities | Alice |
| halogen.js | The missing halogens | nousernamefound |
| hidden_ground.js | Hides most rock variants from the_ground.js excluding the base rocks and walls | Melecie |
@@ -233,7 +233,7 @@
| mars.js | Martian materials | charcoal_afterlife |
| metals.js | Several metals | Alice |
| mixture.js | Many chemicals can be mixed | lllllllllwith10ls |
-| more_gold.js | Green Gold | pixelegend4 |
+| more_gold.js | Green and Black Gold | pixelegend4 |
| morechemistry.js | New chemicals, compounds, and machines | Orchid |
| moreliquids.js | Various liquids | te-agma-at |
| neutronium_compressor.js | Compressor from Minecraft's Avaritia mod that compresses 10,000 pixels of an element into a singularity | Alice |
@@ -253,7 +253,7 @@
| colored_lightbulbs.js | Light bulb that can be painted | guzzo86, ggod |
| combustion.js | Components necessary for combustion engines | uptzik |
| conveyance.js | Conveyors, operated with and without electricity | Melecie |
-| datawire.js | Adds a wire that transfers data and other operators and machines for it | Orchid |
+| datawire.js | Wire that transfers data and other operators and machines for it | Orchid |
| drill.js | Drills made out of several materials | Suss |
| ExtraMachines.js | Sensors, energy resources, materials, and more | Mecoolnotcool |
| fans.js | Fans | Cube14yt |
@@ -272,7 +272,7 @@
| pushers.js | Pixels that push elements away from them | Alice |
| sandboxels.js | Digital screen to play a mini version of Sandboxels | Nekonico |
| schematics.js | Schematics for logic gates | SquareScreamYT |
-| scp.js | Mod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website. | Nekonico |
+| scp.js | Creatures and items from the SCP Wiki | Nekonico |
| spouts.js | Spouts for all liquids | kaeud |
| state_voids.js | Several elements that delete specific states of matter | Alice |
| switches.js | Electrical switches that can be toggled | Alice |
@@ -281,7 +281,7 @@
| video.js | Video player | ggod |
| waterspout.js | Re-adds the old Water Spout | mollthecoder |
| WhisperingTheory.js | Many more variants of heater and cooler | kaeud |
-| wifi_draw.js | Draws connections between WiFi in wifi.js and logicgates.js | RedBirdly |
+| wifi_draw.js | Connections between WiFi in wifi.js and logicgates.js | RedBirdly |
| Weapons |
| aircrafts.js | Aircrafts and aircraft parts | Jayd |
@@ -293,7 +293,7 @@
| meat_rockets.js | Rockets that create meat when exploding | Melecie |
| more_breaking.js | More elements can be broken | Alice |
| rays.js | More Ray types | Alice |
-| rays++.js | Couple more rays | uptzik |
+| rays++.js | A couple more rays | uptzik |
| scp.js | Creatures and items from the SCP Wiki | Nekonico |
| subspace.js | The Subspace Tripmine from Roblox | nousernamefound |
| war_crimes.js | Tear gas and more | voidapex11 |
@@ -370,7 +370,7 @@
| bfdi.js | Several references to Battle for Dream Island | Taterbob |
| citybuilding.js | Seeds that create miniature buildings and other city-related items | SquareScreamYT |
| collab_mod.js | Created by multiple people, adds random things | mrapple, ilikepizza, stefanblox |
-| cubesstuff.js | Some random stuff like disco ball, pyrite, and nordic gold. | Cube14yt |
+| cubesstuff.js | Some random stuff like Disco Ball, Pyrite, and Nordic Gold | Cube14yt |
| doom.js | As seen on TikTok - Select the Doom element to start [WASD to move] | ggod |
| elem3.js | All elements and combinations from Elemental 3 [Very Large] | Sophie |
| explosionsound.js | Sound effects for explosions | nousernamefound |
@@ -417,7 +417,7 @@
| invisible_wall.js | Element like Wall that takes the color of the background | Alice |
| lightmap.js | Light sources glow | RedBirdly |
| liquid_mixing.js | Liquids can mix colors dynamically | Nekonico |
-| manyMoreThemes.js | Adds additional themes | Jayd |
+| manyMoreThemes.js | Additional themes | Jayd |
| moreViews.js | Many new rendering modes | ggod |
| nicer_flame.js | Fire is visually pleasing | RedBirdly |
| occlusion.js | Realistic shadows, similar to Terraria's lighting | RedBirdly |
@@ -445,7 +445,7 @@
| changeTempReactionParameter.js | The changeTemp property to modded reactions | Alice |
| code_library.js | Functions and variables common to some other mods | Alice |
| controllable_pixel_test.js | Pixel that can be controlled with the keyboard keys [More Info] [PC ONLY] | Alice |
-| customexplosion.js | Added a custom explosion element and interface for it. | Orchid |
+| customexplosion.js | Custom explosion element and interface for it | Orchid |
| date_test.js | K-pop idol birthday testing stuff | Alice |
| drawPixels_change_test.js | Test of altering drawPixels(). Gives burning pixels a red overlay similar to the yellow overlay for charged pixels | Alice |
| example_mod.js | Example mod for new modders | R74n |
@@ -471,8 +471,8 @@
| structure_test.js | Test for implementing structures into Sandboxels | Alice |
| test.js | Test that adds mayo :) | R74n |
| tool_pixel_behavior.js | Gives unique behaviors to tools if placed with cheats | Alice |
-| worldgenlibrary.js | World generation library | Orchid |
| worldgen_test.js | Element that generates a save with a grass layer, dirt layer, rock layer, and a pond | Alice |
+| worldgenlibrary.js | World generation library | Orchid |
| Broken or Deprecated |
| a_mod_by_alice.js | Combination of most of Alice's mods, and some other things | Alice |
From 2d14411305c9acf981a3041f6927937f1ba50f49 Mon Sep 17 00:00:00 2001
From: Nekonico <163950752+DBNekonico@users.noreply.github.com>
Date: Thu, 2 Oct 2025 18:45:16 -0700
Subject: [PATCH 047/105] keycard update
---
mods/scp.js | 528 ++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 489 insertions(+), 39 deletions(-)
diff --git a/mods/scp.js b/mods/scp.js
index 28b0118a..68257180 100644
--- a/mods/scp.js
+++ b/mods/scp.js
@@ -39,6 +39,14 @@ window.addEventListener("load", () => {
document.getElementById("elementButton-REDACTED")?.remove()
})
+async function _scpAskPrompt(message, defaultValue = "") {
+ return new Promise(resolve => {
+ promptInput(message, (result) => {
+ resolve(result);
+ }, "Awaiting credentials...", defaultValue);
+ })
+}
+
hex_is_light = function(color) {
hex = color.replace('#', '');
c_r = parseInt(hex.substring(0, 0 + 2), 16);
@@ -65,6 +73,47 @@ elements.human.reactions.scp_229 = { attr1:{panic:5} }
elements.human.reactions.scp_999 = { attr1:{panic:0} }
elements.human.reactions.black_acid = { attr1:{panic:1} }
+if (!elements.water.reactions) { elements.water.reactions = {}; }
+elements.water.reactions.access_door = { elem1:null, elem2:"rust", chance:0.000125 }
+
+if (!elements.body.reactions) { elements.body.reactions = {}; }
+elements.body.reactions.level_0 = { chance:0.3, func:function(pixel1,pixel2){
+ if (!pixel1.level || pixel1.level > pixel2.level) {
+ pixel1.level = pixel2.level
+ deletePixel(pixel2.x,pixel2.y)
+ }
+} },
+elements.body.reactions.level_1 = { chance:0.5, func:function(pixel1,pixel2){
+ if (!pixel1.level || pixel1.level > pixel2.level) {
+ pixel1.level = pixel2.level
+ deletePixel(pixel2.x,pixel2.y)
+ }
+} },
+elements.body.reactions.level_2 = { chance:0.5, func:function(pixel1,pixel2){
+ if (!pixel1.level || pixel1.level > pixel2.level) {
+ pixel1.level = pixel2.level
+ deletePixel(pixel2.x,pixel2.y)
+ }
+} },
+elements.body.reactions.level_3 = { chance:0.5, func:function(pixel1,pixel2){
+ if (!pixel1.level || pixel1.level > pixel2.level) {
+ pixel1.level = pixel2.level
+ deletePixel(pixel2.x,pixel2.y)
+ }
+} },
+elements.body.reactions.level_4 = { chance:0.5, func:function(pixel1,pixel2){
+ if (!pixel1.level || pixel1.level > pixel2.level) {
+ pixel1.level = pixel2.level
+ deletePixel(pixel2.x,pixel2.y)
+ }
+} },
+elements.body.reactions.level_5 = { chance:0.5, func:function(pixel1,pixel2){
+ if (!pixel1.level || pixel1.level > pixel2.level) {
+ pixel1.level = pixel2.level
+ deletePixel(pixel2.x,pixel2.y)
+ }
+} },
+
hyperCoords = [
[0,1],
[0,1],
@@ -102,12 +151,289 @@ elements.metanarrative_ontokinetic_hume_stabilizing_anomaly_neutralizing_all_pow
hidden: true,
}
+currentLevel = 0
+elements.keycard_terminal = {
+ color: "#C6B589",
+ onSelect: async function() {
+ currentLevel = await _scpAskPrompt("Please input the desired level requirement of this terminal as a number 0 through 5.", (currentLevel||undefined))
+ },
+ onPlace: function(pixel) {
+ if (!pixel.levelReq){
+ pixel.levelReq = currentLevel;
+ pixel.clone = pixel.levelReq;
+ }
+ },
+ tick: function(pixel) {
+ if (!pixel.levelReq){
+ pixel.levelReq = currentLevel;
+ pixel.clone = pixel.levelReq;
+ }
+ if (!pixel.clone){
+ pixel.clone = pixel.levelReq;
+ }
+ if (!isEmpty(pixel.x, pixel.y-1, true)){
+ if (pixel.levelReq && elements[pixelMap[pixel.x][pixel.y-1].element].level < pixel.levelReq) {}
+ else if (pixelMap[pixel.x][pixel.y-1].level >= pixel.levelReq && (pixelMap[pixel.x][pixel.y-1].element == "body" || pixelMap[pixel.x][pixel.y-1].element == "bead" || elements[pixelMap[pixel.x][pixel.y-1].element].keycard == true)|| pixelMap[pixel.x][pixel.y-1].on) {
+ pixel.on = true;
+ var coordsToShock = [
+ [pixel.x, pixel.y+1],
+ [pixel.x+1, pixel.y],
+ [pixel.x-1, pixel.y],
+ ]
+ for (var i = 0; i < coordsToShock.length; i++) {
+ var x = coordsToShock[i][0];
+ var y = coordsToShock[i][1];
+ if (!isEmpty(x,y,true)) {
+ var newpixel = pixelMap[x][y];
+ if (elements[newpixel.element].conduct) {
+ newpixel.charge = 1;
+ }
+ }
+ }
+ }
+ }
+ else if (pixel.on) {
+ pixel.on = false;
+ }
+ doDefaults(pixel);
+ },
+ category: "scp",
+ state: "solid",
+ density: 6394.4
+}
+
+elements.access_door = {
+ color: "#515151",
+ onSelect: async function() {
+ currentLevel = await _scpAskPrompt("Please input the desired level requirement of this door as a number 0 through 5.", (currentLevel||undefined))
+ },
+ onPlace: function(pixel) {
+ if (!pixel.levelReq){
+ pixel.levelReq = currentLevel;
+ pixel.clone = pixel.levelReq;
+ }
+ },
+ tick: function(pixel) {
+ if (pixel.level){
+ pixel.levelReq = pixel.level;
+ pixel.clone = pixel.level;
+ delete pixel.level
+ }
+ else if (!pixel.levelReq){
+ pixel.levelReq = currentLevel;
+ pixel.clone = pixel.levelReq;
+ }
+ if (!pixel.clone){
+ pixel.clone = pixel.levelReq;
+ }
+ 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")) {
+ 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)) {
+ movePixel(neighbor,pixel.x+1,pixel.y)
+ }
+ }
+ else if (isEmpty(pixel.x+1,pixel.y-1) && isEmpty(pixel.x+1,pixel.y-2)) {
+ if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x+1,pixel.y-2)) {
+ movePixel(neighbor,pixel.x+1,pixel.y-1)
+ }
+ }
+ else if (isEmpty(pixel.x+1,pixel.y+1) && isEmpty(pixel.x+1,pixel.y)) {
+ if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x+1,pixel.y)) {
+ 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)) {
+ 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) {
+ if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x+2,pixel.y-1)) {
+ movePixel(neighbor,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]
+ 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")) {
+ 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)) {
+ movePixel(neighbor,pixel.x-1,pixel.y)
+ }
+ }
+ else if (isEmpty(pixel.x-1,pixel.y-1) && isEmpty(pixel.x-1,pixel.y-2)) {
+ if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x-1,pixel.y-2)) {
+ movePixel(neighbor,pixel.x-1,pixel.y-1)
+ }
+ }
+ else if (isEmpty(pixel.x-1,pixel.y+1) && isEmpty(pixel.x-1,pixel.y)) {
+ if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x-1,pixel.y)) {
+ movePixel(neighbor,pixel.x-1,pixel.y+1)
+ }
+ }
+ else if (!isEmpty(pixel.x-1,pixel.y) && !isEmpty(pixel.x-1,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 && isEmpty(pixel.x-2,pixel.y+1) && isEmpty(pixel.x-2,pixel.y)) {
+ if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x-2,pixel.y-1)) {
+ movePixel(neighbor,pixel.x-2,pixel.y)
+ }
+ }
+ }
+ }
+ }
+ }
+ tryMove(pixel, pixel.x, pixel.y+1);
+ doDefaults(pixel);
+ },
+ grain: 0.5,
+ behavior: behaviors.WALL,
+ tempHigh: 1200,
+ stateHigh: "molten_galvanized_steel",
+ stateHighColorMultiplier: 0.86,
+ conduct: 0.475,
+ hardness: 0.8,
+ breakInto: "galvanized_steel",
+ breakIntoColorMultiplier: [1.1,1,0.86],
+ category: "scp",
+ state: "solid",
+ density: 7850,
+}
+
+elements.level_0 = {
+ color: ["#635957","#AB9D9C","#D3CCCC"],
+ name: "Level 0 Keycard",
+ behavior: behaviors.STURDYPOWDER,
+ keycard: true,
+ tick: function(pixel) {
+ if (!pixel.level){
+ pixel.level = 0;
+ }
+ doDefaults(pixel);
+ },
+ category: "scp",
+ tempHigh: 185,
+ stateHigh: "molten_plastic",
+ burn: 10,
+ burnTime: 400,
+ burnInto: "dioxin",
+ state: "solid",
+ density: 1052,
+}
+elements.level_1 = {
+ color: ["#8C7D0D","#FDE507","#FCF081"],
+ name: "Level 1 Keycard",
+ behavior: behaviors.STURDYPOWDER,
+ keycard: true,
+ tick: function(pixel) {
+ if (!pixel.level){
+ pixel.level = 1;
+ }
+ doDefaults(pixel);
+ },
+ category: "scp",
+ tempHigh: 185,
+ stateHigh: "molten_plastic",
+ burn: 10,
+ burnTime: 400,
+ burnInto: "dioxin",
+ state: "solid",
+ density: 1052,
+}
+elements.level_2 = {
+ color: ["#8C710B","#FDCC03","#FCE47F"],
+ name: "Level 2 Keycard",
+ behavior: behaviors.STURDYPOWDER,
+ keycard: true,
+ tick: function(pixel) {
+ if (!pixel.level){
+ pixel.level = 2;
+ }
+ doDefaults(pixel);
+ },
+ category: "scp",
+ tempHigh: 190,
+ stateHigh: ["molten_plastic","molten_plastic","glue"],
+ burn: 10,
+ burnTime: 400,
+ burnInto: "dioxin",
+ state: "solid",
+ density: 1052,
+}
+elements.level_3 = {
+ color: ["#885C28","#F6A33D","#F9CF9C"],
+ name: "Level 3 Keycard",
+ behavior: behaviors.STURDYPOWDER,
+ keycard: true,
+ tick: function(pixel) {
+ if (!pixel.level){
+ pixel.level = 3;
+ }
+ doDefaults(pixel);
+ },
+ category: "scp",
+ tempHigh: 190,
+ stateHigh: ["molten_plastic","molten_plastic","molten_plastic","glue"],
+ burn: 5,
+ burnTime: 400,
+ burnInto: "dioxin",
+ state: "solid",
+ density: 1057,
+}
+elements.level_4 = {
+ color: ["#87371D","#F35828","#F7AA92"],
+ name: "Level 4 Keycard",
+ behavior: behaviors.STURDYPOWDER,
+ keycard: true,
+ tick: function(pixel) {
+ if (!pixel.level){
+ pixel.level = 4;
+ }
+ doDefaults(pixel);
+ },
+ category: "scp",
+ tempHigh: 660.3,
+ density: 2600,
+ conduct: 0.73,
+ hardness: 0.05,
+ breakInto: "metal_scrap",
+ stateHigh:"molten_aluminum",
+ superconductAt: -271.95,
+ state: "solid",
+}
+elements.level_5 = {
+ color: ["#831924","#EB1C36","#F38C99"],
+ name: "Level 5 Keycard",
+ behavior: behaviors.STURDYPOWDER,
+ keycard: true,
+ tick: function(pixel) {
+ if (!pixel.level){
+ pixel.level = 5;
+ }
+ doDefaults(pixel);
+ },
+ category: "scp",
+ tempHigh: 927,
+ density: 8330,
+ conduct: 0.52,
+ hardness: 0.275,
+ stateHigh: "molten_tungsten",
+ state: "solid",
+}
+
elements.site_nuke = {
color: "#815E2B",
behavior: behaviors.WALL,
behaviorOn: [
"XX|XX|XX",
- "XX|EX:250>molten_glass,molten_glass,plasma,plasma,plasma,plasma,plasma,plasma,plasma,radiation,radiation,radiation,rad_steam,electric,electric,electric|XX",
+ "XX|EX:300>plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,radiation,radiation,radiation,rad_steam,electric,electric,electric|XX",
"M2|M1|M2",
],
conduct: 1,
@@ -185,6 +511,7 @@ elements.scientist = {
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.scientist.buttonColor)
+ pixelMap[pixel.x][pixel.y+1].level = 2
var color = pixel.color;
changePixel(pixel,"head");
pixel.color = color;
@@ -194,6 +521,7 @@ elements.scientist = {
pixelMap[pixel.x][pixel.y-1].color = pixel.color;
changePixel(pixel,"body");
pixel.color = pixelColorPick(pixel, elements.scientist.buttonColor);
+ pixel.level = 2
}
else {
deletePixel(pixel.x, pixel.y);
@@ -227,7 +555,7 @@ elements.guard = {
// color: ["#f5eac6","#d4c594","#a89160","#7a5733","#523018","#361e0e"],
color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"],
buttonColor: ["#848692","#2B2A30","#515159","#3A393F"],
- name: "Security Guard",
+ name: "Security Officer",
category: "scp",
properties: {
dead: false,
@@ -238,6 +566,7 @@ elements.guard = {
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.guard.buttonColor)
+ pixelMap[pixel.x][pixel.y+1].level = 2
var color = pixel.color;
changePixel(pixel,"head");
pixel.color = color;
@@ -247,6 +576,62 @@ elements.guard = {
pixelMap[pixel.x][pixel.y-1].color = pixel.color;
changePixel(pixel,"body");
pixel.color = pixelColorPick(pixel, elements.guard.buttonColor);
+ pixel.level = 2
+ }
+ 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.director = {
+ // color: ["#f5eac6","#d4c594","#a89160","#7a5733","#523018","#361e0e"],
+ color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"],
+ buttonColor: ["#2B2A30","#848692","#2B2A30","#515159","#919092","#069469","#047e99","#7f5fb0","#069469","#047e99","#7f5fb0","#EDEEF7","#D9D9E7","#F8F7FC","#C6C8DC","#D0DCF1"],
+ name: "Site Director",
+ 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.director.buttonColor)
+ pixelMap[pixel.x][pixel.y+1].level = 4
+ 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.director.buttonColor);
+ pixel.level = 4
}
else {
deletePixel(pixel.x, pixel.y);
@@ -1130,6 +1515,20 @@ elements.red_water = {
"bird":{elem2:"scp_009_meat", chance:0.015},
"frog":{elem2:"scp_009_meat", chance:0.015},
"tadpole":{elem2:"scp_009_meat", chance:0.015},
+ "iron": { elem1:null, elem2:"rust", chance:0.025 },
+ "steel": { elem1:null, elem2:"rust", chance:0.02 },
+ "galvanized_steel": { elem1:null, elem2:"rust", chance:0.00025 },
+ "access_door": { elem1:null, elem2:"rust", chance:0.00025 },
+ "aluminum": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.0025 },
+ "zinc": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.015 },
+ "steel": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.0125 },
+ "iron": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.0125 },
+ "tin": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.01 },
+ "brass": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.001 },
+ "bronze": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.001 },
+ "copper": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.0075 },
+ "silver": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.0075 },
+ "gold": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.0075 }
},
tempLow: -100,
stateLow: "red_steam",
@@ -1981,11 +2380,6 @@ elements.head_035 = {
name: "SCP-035-1",
color: ["#f7ead0","#faf9f6","#e9e6db"],
category: "life",
- behavior: [
- "CR:black_acid%0.01|CR:black_acid%0.05|CR:black_acid%0.01",
- "CR:black_acid%0.05|XX|CR:black_acid%0.05",
- "CR:black_acid%0.01|CR:black_acid%0.05|CR:black_acid%0.01",
- ],
hidden: true,
density: 1080,
state: "solid",
@@ -2026,7 +2420,10 @@ elements.head_035 = {
doHeat(pixel);
doBurning(pixel);
doElectricity(pixel);
- if (pixel.dead) {
+ if (Math.random() < 0.0125) {
+ releaseElement(pixel,"black_acid",4,true)
+ }
+ if (pixel.dead || (pixel.start+1000) , pixelTicks && Math.random() > 0.95) {
// Turn into rotten_meat if pixelTicks-dead > 500
if (pixelTicks-pixel.dead > 200 && Math.random() < 0.1) {
changePixel(pixel,"rotten_meat");
@@ -2772,7 +3169,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","head_096","body_096","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","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"],
category: "scp",
tempHigh: 190,
stateHigh: ["molten_plastic","molten_plastic","fire","dioxin"],
@@ -2904,7 +3301,7 @@ elements.shy_body = {
category: "scp",
pickElement: "scp_096",
hardness: 1,
- properties: {
+ properties: {
dead: false,
dir: 1,
h: 0,
@@ -3117,6 +3514,24 @@ elements.shy_body = {
else if (isEmpty(pixel.x+pixel.dir, pixel.y+2) && !outOfBounds(pixel.x+pixel.dir, pixel.y+2) && isEmpty(pixel.x+pixel.dir, pixel.y+3) && !outOfBounds(pixel.x+pixel.dir, pixel.y+3)) {
tryMove(head, pixel.x+pixel.dir, pixel.y+2)
tryMove(pixel, pixel.x+pixel.dir, pixel.y+3)
+ }
+ else if (!isEmpty(pixel.x+pixel.dir, pixel.y) && !outOfBounds(pixel.x+pixel.dir, pixel.y) && isEmpty(pixel.x+pixel.dir, pixel.y-1) && !outOfBounds(pixel.x+pixel.dir, pixel.y-1)) {
+ if (pixelMap[pixel.x+pixel.dir][pixel.y].target == true) {
+ changePixel(pixelMap[pixel.x+pixel.dir][pixel.y], "blood")
+ }
+ else {
+ tryMove(head, pixel.x+pixel.dir, pixel.y+2)
+ if (isBreakable(pixelMap[pixel.x+pixel.dir][pixel.y])) {
+ breakPixel(pixelMap[pixel.x+pixel.dir][pixel.y]);
+ swapPixels(pixel, pixelMap[pixel.x+pixel.dir][pixel.y])
+ }
+ else if (elements[pixelMap[pixel.x+pixel.dir][pixel.y].element].movable == true) {
+ swapPixels(pixel, pixelMap[pixel.x+pixel.dir][pixel.y])
+ }
+ else if (elements[pixelMap[pixel.x+pixel.dir][pixel.y].element].hardness != 1 ) {
+ swapPixels(pixel, pixelMap[pixel.x+pixel.dir][pixel.y])
+ }
+ }
}
else if (!isEmpty(pixel.x+pixel.dir, pixel.y) && !outOfBounds(pixel.x+pixel.dir, pixel.y) && !isEmpty(pixel.x+pixel.dir, pixel.y-1) && !outOfBounds(pixel.x+pixel.dir, pixel.y-1)) {
if (pixelMap[pixel.x+pixel.dir][pixel.y].target == true) {
@@ -3305,7 +3720,8 @@ elements.body_173 = {
density: 2400,
state: "solid",
conduct: .025,
- tempHigh: 1505,
+ tempHigh: 15050,
+ hardness: 1,
stateHigh: ["magma","magma","magma","magma","rust","rust","rust","magma","magma","magma","magma","rust","rust","rust","spray_paint"],
breakInto: ["concrete","concrete","concrete","concrete","rust","rust","rust","concrete","concrete","concrete","concrete","rust","rust","rust","spray_paint"],
forceSaveColor: true,
@@ -3580,7 +3996,8 @@ elements.head_173 = {
density: 2400,
state: "solid",
conduct: .025,
- tempHigh: 1505,
+ tempHigh: 15050,
+ hardness: 1,
stateHigh: ["magma","magma","magma","magma","rust","rust","rust","magma","magma","magma","magma","rust","rust","rust","spray_paint"],
breakInto: ["concrete","concrete","concrete","concrete","rust","rust","rust","concrete","concrete","concrete","concrete","rust","rust","rust","spray_paint"],
forceSaveColor: true,
@@ -3710,9 +4127,9 @@ elements.scp_229 = {
"XX|SH%5|XX",
],
category: "scp",
- hardness: 0.85,
+ hardness: 0.25,
breakInto: "metal_scrap",
- tempHigh: 1750,
+ tempHigh: 1250,
stateHigh: ["metal_scrap","metal_scrap","metal_scrap","metal_scrap","molten_glass","molten_plastic","molten_plastic"],
properties: {
radius: 10,
@@ -3742,7 +4159,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 == "scp_804" && electric.active == true || 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.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]
@@ -3830,7 +4247,7 @@ elements.scp_229 = {
if (!isEmpty(x,y) && !outOfBounds(x,y) && pixel.nCD == undefined) {
var electric = pixelMap[x][y]
let old = electric.element;
- if (electric.element == "brain" || electric.element == "thunder_cloud" || electric.element == "scp_804" && electric.active == true || elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.element == "fish" || electric.element == "frog" || electric.element == "rat" || electric.element == "bird" || electric.element == "head" || electric.element == "head_035" || electric.element == "head_1000" || electric.element == "head_008" || elements[electric.element].category == "machines" && Math.random() > 0.5 || electric.element == "battery" || electric.element == "electric" || electric.element == "lightning" || electric.element == "malware" || electric.element == "gray_goo") {
+ if (electric.element == "brain" || electric.element == "access_door" || electric.element == "keycard_terminal" || electric.element == "level_4" || electric.element == "level_5" || electric.element == "thunder_cloud" || electric.element == "scp_804" && electric.active == true || elements[electric.element].category == "logic" || elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.element == "fish" || electric.element == "frog" || electric.element == "rat" || electric.element == "bird" || electric.element == "head" || electric.element == "head_035" || electric.element == "head_1000" || electric.element == "head_008" || elements[electric.element].category == "machines" && Math.random() > 0.5 || electric.element == "battery" || electric.element == "electric" || electric.element == "lightning" || electric.element == "malware" || electric.element == "gray_goo") {
deletePixel(electric.x,electric.y)
createPixel("scp_229",electric.x,electric.y)
electric = pixelMap[electric.x][electric.y]
@@ -3843,7 +4260,7 @@ elements.scp_229 = {
pixel.nCD = 2
}
else if (electric.element == "site_nuke") {
- explodeAt(electric.x,electric.y,100,["plasma","plasma","plasma","plasma","plasma","plasma","plasma","radiation","radiation","radiation","radiation","rad_steam","electric","electric"])
+ 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) {
@@ -3877,6 +4294,7 @@ elements.scp_236 = {
dir: 1,
},
tick: function(pixel) {
+ doDefaults(pixel)
if (Math.random() < 0.2) {
pixel.dir = Math.random() < 0.5 ? 1 : -1
}
@@ -4952,7 +5370,7 @@ elements.scp_804 = {
}
}
}
- else if (manmade.element == "unknown" || manmade.element == "site_nuke" || manmade.element == "scp_035" || manmade.element == "scp_229" || elements[manmade.element].category == "machines" || manmade.element == "metal_scrap" || manmade.element == "solid_mercury" || manmade.element == "molten_gallium" || manmade.element == "steel" || manmade.element == "galvanized_steel" || manmade.element == "brass" || manmade.element == "bronze" || manmade.element == "invar" || manmade.element == "sterling" || manmade.element == "rose_gold" || manmade.element == "purple_gold" || manmade.element == "blue_gold" || manmade.element == "electrum" || manmade.element == "solder" || manmade.element == "particleboard") {
+ else if (manmade.element == "unknown" || manmade.element == "site_nuke" || manmade.element == "scp_035" || manmade.element == "access_door" || manmade.element == "keycard_terminal" || manmade.element == "scp_229" || elements[manmade.element].category == "machines" || elements[manmade.element].category == "logic" || manmade.element == "metal_scrap" || manmade.element == "solid_mercury" || manmade.element == "molten_gallium" || manmade.element == "steel" || manmade.element == "galvanized_steel" || manmade.element == "brass" || manmade.element == "bronze" || manmade.element == "invar" || manmade.element == "sterling" || manmade.element == "rose_gold" || manmade.element == "purple_gold" || manmade.element == "blue_gold" || manmade.element == "electrum" || manmade.element == "solder" || manmade.element == "particleboard") {
if (!manmade.repair) {
manmade.repair = 15
}
@@ -4987,7 +5405,7 @@ elements.scp_804 = {
}
}
}
- else if (!manmade.lc && !manmade.wc && manmade.element == "wood" || manmade.element == "tinder" || manmade.element == "scp_063" || manmade.element == "scp_012" || manmade.element == "dust" || manmade.element == "insulation" || manmade.element == "cloth" || manmade.element == "plastic" || manmade.element == "bead" || manmade.element == "glitter" || manmade.element == "confetti" || manmade.element == "paper" || manmade.element == "cement" || manmade.element == "acid" || manmade.element == "black_acid" || manmade.element == "alcohol" || manmade.element == "wax" || manmade.element == "poison" || manmade.element == "incense" || manmade.element == "gold_coin" || manmade.element == "borax" || manmade.element == "spray_paint" || manmade.element == "anesthesia" || manmade.element == "acid_gas" || manmade.element == "ball" || manmade.element == "potassium_salt" || manmade.element == "epsom_salt" || manmade.element == "sodium_acetate") {
+ else if (!manmade.lc && !manmade.wc && manmade.element == "wood" || manmade.element == "tinder" || manmade.element == "scp_063" || manmade.element == "scp_012" || manmade.element == "dust" || manmade.element == "insulation" || manmade.element == "cloth" || manmade.element == "plastic" || elements[manmade.element].keycard == true || manmade.element == "bead" || manmade.element == "glitter" || manmade.element == "confetti" || manmade.element == "paper" || manmade.element == "cement" || manmade.element == "acid" || manmade.element == "black_acid" || manmade.element == "alcohol" || manmade.element == "wax" || manmade.element == "poison" || manmade.element == "incense" || manmade.element == "gold_coin" || manmade.element == "borax" || manmade.element == "spray_paint" || manmade.element == "anesthesia" || manmade.element == "acid_gas" || manmade.element == "ball" || manmade.element == "potassium_salt" || manmade.element == "epsom_salt" || manmade.element == "sodium_acetate") {
if (!manmade.repair) {
manmade.repair = 6
}
@@ -5003,7 +5421,7 @@ elements.scp_804 = {
}
}
}
- else if (manmade.panic && manmade.element == "bone" || manmade.panic && manmade.element == "quicklime" || manmade.panic && manmade.element == "rotten_meat" || manmade.panic && manmade.element == "meat" || manmade.element == "cooked_meat" || manmade.element == "blood" || manmade.element == "infection" || manmade.element == "seltzer" || Math.random() > 0.9 && manmade.element == "dirty_water" || manmade.element == "pool_water" || manmade.element == "lamp_oil" || manmade.element == "neutral_acid" || manmade.element == "glue" || manmade.element == "soda" || manmade.element == "melted_wax" || manmade.element == "chocolate_milk" || manmade.element == "fruit_milk" || manmade.element == "pilk" || manmade.element == "eggnog" || manmade.element == "cream" || manmade.element == "nut_milk" || manmade.element == "vinegar" || manmade.element == "soap" || manmade.element == "bleach" || manmade.element == "dye" || manmade.element == "ink" || manmade.element == "vaccine" || manmade.element == "antidote" || manmade.element == "tea" || manmade.element == "coffee" || manmade.element == "caramel" || manmade.element == "molasses" || manmade.element == "ketchup" || manmade.element == "sauce" || manmade.element == "mayo" || manmade.element == "cyanide") {
+ else if (manmade.panic && manmade.element == "bone" || elements[manmade.element].category == "medicine" || manmade.panic && manmade.element == "quicklime" || manmade.panic && manmade.element == "rotten_meat" || manmade.panic && manmade.element == "meat" || manmade.element == "cooked_meat" || manmade.element == "blood" || manmade.element == "infection" || manmade.element == "seltzer" || Math.random() > 0.9 && manmade.element == "dirty_water" || manmade.element == "pool_water" || manmade.element == "lamp_oil" || manmade.element == "neutral_acid" || manmade.element == "glue" || manmade.element == "soda" || manmade.element == "melted_wax" || manmade.element == "chocolate_milk" || manmade.element == "fruit_milk" || manmade.element == "pilk" || manmade.element == "eggnog" || manmade.element == "cream" || manmade.element == "nut_milk" || manmade.element == "vinegar" || manmade.element == "soap" || manmade.element == "bleach" || manmade.element == "dye" || manmade.element == "ink" || manmade.element == "vaccine" || manmade.element == "antidote" || manmade.element == "tea" || manmade.element == "coffee" || manmade.element == "caramel" || manmade.element == "molasses" || manmade.element == "ketchup" || manmade.element == "sauce" || manmade.element == "mayo" || manmade.element == "cyanide") {
if (!manmade.repair) {
manmade.repair = 3
}
@@ -5632,24 +6050,10 @@ elements.body_1015 = {
return
}
- if (Math.random() < 0.5) {
- let yDir = -1
- for (let y = 1; y < height; y++) {
- let x2 = pixel.x
- let y2 = pixel.y+(y*yDir);
- let weight = 0
- if (!isEmpty(x2,y2,true) && !outOfBounds(x2,y2)) {
- weight++
- }
- if (isEmpty(x2,y2,true) || outOfBounds(x2,y2)) {
- if (weight > 4) {
- changePixel(pixel,"scp_1015")
- releaseElement(pixel,"blood")
- }
- }
- }
- }
-
+ if (Math.random() < 0.25 && !isEmpty(pixel.x-1,pixel.y+1) && !isEmpty(pixel.x+1,pixel.y+1) && !isEmpty(pixel.x-1,pixel.y-1) && !isEmpty(pixel.x+1,pixel.y-1) && !isEmpty(pixel.x,pixel.y-1) && !isEmpty(pixel.x,pixel.y+1) && !isEmpty(pixel.x-1,pixel.y) && !isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.5) {
+ changePixel(pixel,"scp_1015")
+ releaseElement(pixel,"blood",4,true)
+ }
// Find the head
if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_1015") {
var head = pixelMap[pixel.x][pixel.y-1];
@@ -6181,6 +6585,52 @@ elements.scp_1147_leaf = {
forceSaveColor: true
} */
+elements.scp_1424 = {
+ name: "SCP-1424",
+ color: ["#E7E7E5","#DCD9D4","#ACACAC"],
+ temp: -23,
+ properties: {
+ dir: 1,
+ },
+ tick: function(pixel) {
+ if (tryMove(pixel, pixel.x, pixel.y+1)) {} // Fall
+ doDefaults(pixel);
+ 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])) {
+ 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) {
+ moved = true;
+ break;
+ }
+ }
+ }
+ // 10% chance to change direction
+ if (Math.random() < 0.1 || !moved) {
+ pixel.dir *= -1;
+ }
+ }
+ if (Math.random() > 0.9 && Math.random() > 0.9) {
+ releaseElement(pixel,"ammonia",1,true)
+ }
+ if (pixel.temp > -17) { pixel.temp -= 1; }
+ else if (pixel.temp < -22) { pixel.temp += 1; }
+ },
+ category: "scp",
+ density: 1580,
+ state: "solid",
+ conduct: .025,
+ cooldown: defaultCooldown,
+}
+
elements.scp_1600 = {
name: "SCP-1600-1",
color: "#D6CE02",
@@ -6254,7 +6704,7 @@ elements.scp_1600 = {
pixel.color = "rgb("+avg.join(",")+")";
}
},
- ignore: ["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"],
+ 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"],
canPlace: true,
reactions: {
"scp_682":{ stain2:"#CA8E2F", chance:0.05,},
From c1b233c1357f621e1777e0abc55253a497bf223d Mon Sep 17 00:00:00 2001
From: David Kopal <112717418+DavidKopal@users.noreply.github.com>
Date: Fri, 3 Oct 2025 19:00:38 +0200
Subject: [PATCH 048/105] Add files via upload
---
mods/more_cells.js | 414 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 414 insertions(+)
create mode 100644 mods/more_cells.js
diff --git a/mods/more_cells.js b/mods/more_cells.js
new file mode 100644
index 00000000..9ff56ebc
--- /dev/null
+++ b/mods/more_cells.js
@@ -0,0 +1,414 @@
+viewInfo[4] = { // energy view
+ name: "enrg",
+ pixel: function (pixel, ctx) {
+ if (elements[pixel.element].isCell === true) {
+ var stat = pixel.energy
+ var ratio = Math.log(stat) / Math.log(3000)
+ var hue = Math.round(ratio * 240)
+ if (hue < 0) hue = 0
+ if (hue > 240) hue = 240
+ drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y)
+ }
+ }
+}
+
+viewInfo[5] = { // breath view
+ name: "brth",
+ pixel: function (pixel, ctx) {
+ if (elements[pixel.element].isCell === true) {
+ var stat = pixel.breath
+ var ratio = Math.log(stat) / Math.log(3000)
+ var hue = Math.round(ratio * 240)
+ if (hue < 0) hue = 0
+ if (hue > 240) hue = 240
+ drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y)
+ }
+ }
+}
+
+
+function baseCellTick(px) {
+ if (!elements[px.element].isCell) { return }
+
+ if (px.energy > 3000) { px.energy = 3000 }
+ if (px.breath > 3000) { px.breath = 3000 }
+
+ if (!px.static && Math.random() < 0.115) {
+ px.energy--
+ px.breath--
+ }
+
+ if (px.energy < 1 || px.breath < 1) {
+ changePixel(px, "cancer")
+ return
+ }
+
+ const ns = getNeighbors(px)
+ ns.forEach(n => {
+ if (!elements[n.element].isCell) { return }
+
+ if (n.energy < px.energy) {
+ let transfer = (px.energy - n.energy) / 4
+ transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2))
+ px.energy -= transfer
+ n.energy += transfer
+ }
+
+ if (n.breath < px.breath) {
+ let transfer = Math.floor((px.breath - n.breath) / 4)
+ transfer = Math.min(transfer, (px.transfer + n.transfer) / 2)
+ px.breath -= transfer
+ n.breath += transfer
+ }
+
+ })
+}
+
+elements.chlorocyte = {
+ color: ["#00ff00", "#00a500", "#008a00", "#26a026", "#3eff3e"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 1
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ px.energy += (4 - getNeighbors(px).length) * 3
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "steam", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "ice", "sugar_ice"],
+ state: "solid",
+ density: 1000.1,
+ category: "cells",
+ breakInto: ["water", "dna", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 }
+ }
+}
+
+elements.nucleolyte = {
+ color: "#FF6F3C",
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 1
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ const ns = getNeighbors(px)
+ for (let n of ns) {
+ if (n.element == "vena" && n.charge) {
+ px.breath += 80
+ px.energy += 80
+ break
+ }
+ }
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "steam", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "ice", "sugar_ice"],
+ state: "solid",
+ density: 1000.1,
+ category: "cells",
+ breakInto: ["sugar_water", "dna", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 }
+ }
+}
+
+elements.respira = {
+ color: ["#8888ff"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 1
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ px.breath += (4 - getNeighbors(px).length) * 3
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "steam", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "ice", "sugar_ice"],
+ state: "solid",
+ density: 1000.1,
+ category: "cells",
+ breakInto: ["water", "dna", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 }
+ }
+}
+
+elements.structura = {
+ color: ["#535353"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 0,
+ static: true,
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "steam", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "ice", "sugar_ice"],
+ state: "solid",
+ density: 1000.1,
+ category: "cells",
+ breakInto: ["water", "dna", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 }
+ }
+}
+
+elements.vena = {
+ color: ["#a85e5e"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 0,
+ static: false,
+ },
+ conduct: 1,
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ if (px.charge) {
+ px.transfer = 500
+ px.static = true
+ } else {
+ transfer = 0
+ px.static = false
+ }
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "sugar_water", "sugar_water"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"],
+ state: "solid",
+ density: 1010,
+ category: "cells",
+ breakInto: ["sugar_water", "sugar_water", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 }
+ }
+}
+
+elements.neurocell = {
+ color: ["#5e5fa8"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 50,
+ cd: 1
+ },
+ conduct: 1,
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ px.cd--
+ if (px.cd < 1) {
+ px.cd = 20
+ px.charge = 1
+ }
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "sugar_water", "sugar_water"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"],
+ state: "solid",
+ density: 1010,
+ category: "cells",
+ breakInto: ["sugar_water", "sugar_water", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 }
+ }
+}
+
+elements.insulon = {
+ color: ["#cadf7e"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 1
+ },
+ conduct: 1,
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ if (px.temp > 20) {
+ px.temp -= 6
+ }
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 300,
+ stateHigh: ["steam", "steam", "steam", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "ice", "sugar_ice"],
+ state: "solid",
+ density: 1000.1,
+ category: "cells",
+ breakInto: ["water", "dna", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 }
+ }
+}
+
+elements.carapace = {
+ color: ["#46065a"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 0
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 1200,
+ stateHigh: ["steam", "molten_copper", "steam", "sugar"],
+ state: "solid",
+ density: 1800,
+ category: "cells",
+ breakInto: ["water", "oxidized_copper", "dna", "dna"],
+}
+
+elements.phagocyte = {
+ color: ["#a3d9a6"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 0
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "sugar", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"],
+ state: "solid",
+ density: 1010,
+ category: "cells",
+ breakInto: ["dna", "sugar", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem2: "stem_cell", chance: 0.055 },
+ infection: { elem2: "stem_cell", chance: 0.075 },
+ poison: { elem2: "stem_cell", chance: 0.025 },
+ }
+}
+
+elements.stem_cell = {
+ color: ["#c0c0c0"],
+ behavior: behaviors.LIQUID,
+ noMix: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ const ns = getNeighbors(px)
+ if (ns.length > 0) {
+ const elem = ns[Math.floor(Math.random() * ns.length)].element
+ if (elements[elem].isCell) {
+ changePixel(px, elem)
+ }
+ }
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "sugar", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"],
+ state: "solid",
+ density: 1010,
+ category: "cells",
+ breakInto: ["dna", "sugar", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 }
+ }
+}
+
+elements.cancer.reactions.chlorocyte = { elem2: "cancer", chane: 0.005 }
+elements.cancer.reactions.respira = { elem2: "cancer", chane: 0.005 }
+elements.cancer.reactions.insulon = { elem2: "cancer", chane: 0.005 }
+elements.cancer.reactions.neurocell = { elem2: "cancer", chane: 0.005 }
+elements.cancer.reactions.vena = { elem2: "cancer", chane: 0.005 }
+
+elements.infection.reactions.chlorocyte = { elem2: "infection", chane: 0.0015 }
+elements.infection.reactions.respira = { elem2: "infection", chane: 0.0015 }
+elements.infection.reactions.insulon = { elem2: "infection", chane: 0.0015 }
+elements.infection.reactions.neurocell = { elem2: "infection", chane: 0.0015 }
+elements.infection.reactions.vena = { elem2: "infection", chane: 0.0015 }
\ No newline at end of file
From 851b3d9cb4957fc881b056a45ad4f489ad5aa157 Mon Sep 17 00:00:00 2001
From: Nekonico <163950752+DBNekonico@users.noreply.github.com>
Date: Fri, 3 Oct 2025 21:44:58 -0700
Subject: [PATCH 049/105] more fixes
---
mods/scp.js | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/mods/scp.js b/mods/scp.js
index 68257180..8c6b2aba 100644
--- a/mods/scp.js
+++ b/mods/scp.js
@@ -2174,7 +2174,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.6,
+ hardness: 0.9,
category: "scp",
behavior: [
"CR:black_acid%0.05|CR:black_acid%0.25|CR:black_acid%0.05",
@@ -3946,6 +3946,8 @@ elements.body_173 = {
break;
}
}
+ pixel.frozen1 = false
+ break;
}
if (x >= 99) {
pixel.frozen1 = false
@@ -3978,6 +3980,8 @@ elements.body_173 = {
break;
}
}
+ pixel.frozen2 = false
+ break;
}
if (x <= -99) {
pixel.frozen2 = false
@@ -5421,7 +5425,7 @@ elements.scp_804 = {
}
}
}
- else if (manmade.panic && manmade.element == "bone" || elements[manmade.element].category == "medicine" || manmade.panic && manmade.element == "quicklime" || manmade.panic && manmade.element == "rotten_meat" || manmade.panic && manmade.element == "meat" || manmade.element == "cooked_meat" || manmade.element == "blood" || manmade.element == "infection" || manmade.element == "seltzer" || Math.random() > 0.9 && manmade.element == "dirty_water" || manmade.element == "pool_water" || manmade.element == "lamp_oil" || manmade.element == "neutral_acid" || manmade.element == "glue" || manmade.element == "soda" || manmade.element == "melted_wax" || manmade.element == "chocolate_milk" || manmade.element == "fruit_milk" || manmade.element == "pilk" || manmade.element == "eggnog" || manmade.element == "cream" || manmade.element == "nut_milk" || manmade.element == "vinegar" || manmade.element == "soap" || manmade.element == "bleach" || manmade.element == "dye" || manmade.element == "ink" || manmade.element == "vaccine" || manmade.element == "antidote" || manmade.element == "tea" || manmade.element == "coffee" || manmade.element == "caramel" || manmade.element == "molasses" || manmade.element == "ketchup" || manmade.element == "sauce" || manmade.element == "mayo" || manmade.element == "cyanide") {
+ else if (manmade.panic && manmade.element == "bone" || elements[manmade.element].category == "medicine" || manmade.panic && manmade.element == "quicklime" || manmade.panic && manmade.element == "rotten_meat" || manmade.panic && manmade.element == "meat" || manmade.element == "cooked_meat" || manmade.element == "blood" || manmade.element == "infection" || manmade.element == "infected_blood" || manmade.element == "seltzer" || Math.random() > 0.9 && manmade.element == "dirty_water" || manmade.element == "pool_water" || manmade.element == "lamp_oil" || manmade.element == "neutral_acid" || manmade.element == "glue" || manmade.element == "soda" || manmade.element == "melted_wax" || manmade.element == "chocolate_milk" || manmade.element == "fruit_milk" || manmade.element == "pilk" || manmade.element == "eggnog" || manmade.element == "cream" || manmade.element == "nut_milk" || manmade.element == "vinegar" || manmade.element == "soap" || manmade.element == "bleach" || manmade.element == "dye" || manmade.element == "ink" || manmade.element == "vaccine" || manmade.element == "antidote" || manmade.element == "tea" || manmade.element == "coffee" || manmade.element == "caramel" || manmade.element == "molasses" || manmade.element == "ketchup" || manmade.element == "sauce" || manmade.element == "mayo" || manmade.element == "cyanide") {
if (!manmade.repair) {
manmade.repair = 3
}
From e2e995ab9d0a1024e74679fe452da25f45afe33c Mon Sep 17 00:00:00 2001
From: David Kopal <112717418+DavidKopal@users.noreply.github.com>
Date: Sat, 4 Oct 2025 13:57:31 +0200
Subject: [PATCH 050/105] Delete mods/more_cells.js
---
mods/more_cells.js | 414 ---------------------------------------------
1 file changed, 414 deletions(-)
delete mode 100644 mods/more_cells.js
diff --git a/mods/more_cells.js b/mods/more_cells.js
deleted file mode 100644
index 9ff56ebc..00000000
--- a/mods/more_cells.js
+++ /dev/null
@@ -1,414 +0,0 @@
-viewInfo[4] = { // energy view
- name: "enrg",
- pixel: function (pixel, ctx) {
- if (elements[pixel.element].isCell === true) {
- var stat = pixel.energy
- var ratio = Math.log(stat) / Math.log(3000)
- var hue = Math.round(ratio * 240)
- if (hue < 0) hue = 0
- if (hue > 240) hue = 240
- drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y)
- }
- }
-}
-
-viewInfo[5] = { // breath view
- name: "brth",
- pixel: function (pixel, ctx) {
- if (elements[pixel.element].isCell === true) {
- var stat = pixel.breath
- var ratio = Math.log(stat) / Math.log(3000)
- var hue = Math.round(ratio * 240)
- if (hue < 0) hue = 0
- if (hue > 240) hue = 240
- drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y)
- }
- }
-}
-
-
-function baseCellTick(px) {
- if (!elements[px.element].isCell) { return }
-
- if (px.energy > 3000) { px.energy = 3000 }
- if (px.breath > 3000) { px.breath = 3000 }
-
- if (!px.static && Math.random() < 0.115) {
- px.energy--
- px.breath--
- }
-
- if (px.energy < 1 || px.breath < 1) {
- changePixel(px, "cancer")
- return
- }
-
- const ns = getNeighbors(px)
- ns.forEach(n => {
- if (!elements[n.element].isCell) { return }
-
- if (n.energy < px.energy) {
- let transfer = (px.energy - n.energy) / 4
- transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2))
- px.energy -= transfer
- n.energy += transfer
- }
-
- if (n.breath < px.breath) {
- let transfer = Math.floor((px.breath - n.breath) / 4)
- transfer = Math.min(transfer, (px.transfer + n.transfer) / 2)
- px.breath -= transfer
- n.breath += transfer
- }
-
- })
-}
-
-elements.chlorocyte = {
- color: ["#00ff00", "#00a500", "#008a00", "#26a026", "#3eff3e"],
- behavior: behaviors.WALL,
- noMix: true,
- properties: {
- energy: 300,
- breath: 300,
- transfer: 1
- },
- isCell: true,
- hoverStat: function (px) {
- return `E:${px.energy} B:${px.breath}`
- },
- tick: (px) => {
- px.energy += (4 - getNeighbors(px).length) * 3
- baseCellTick(px)
- doDefaults(px)
- },
- tempHigh: 102,
- stateHigh: ["steam", "steam", "steam", "sugar"],
- tempLow: -2,
- stateLow: ["ice", "ice", "ice", "sugar_ice"],
- state: "solid",
- density: 1000.1,
- category: "cells",
- breakInto: ["water", "dna", "dna", "dna"],
- reactions: {
- ...elements.cell.reactions,
- cancer: { elem1: "cancer", chance: 0.005 }
- }
-}
-
-elements.nucleolyte = {
- color: "#FF6F3C",
- behavior: behaviors.WALL,
- noMix: true,
- properties: {
- energy: 300,
- breath: 300,
- transfer: 1
- },
- isCell: true,
- hoverStat: function (px) {
- return `E:${px.energy} B:${px.breath}`
- },
- tick: (px) => {
- const ns = getNeighbors(px)
- for (let n of ns) {
- if (n.element == "vena" && n.charge) {
- px.breath += 80
- px.energy += 80
- break
- }
- }
- baseCellTick(px)
- doDefaults(px)
- },
- tempHigh: 102,
- stateHigh: ["steam", "steam", "steam", "sugar"],
- tempLow: -2,
- stateLow: ["ice", "ice", "ice", "sugar_ice"],
- state: "solid",
- density: 1000.1,
- category: "cells",
- breakInto: ["sugar_water", "dna", "dna", "dna"],
- reactions: {
- ...elements.cell.reactions,
- cancer: { elem1: "cancer", chance: 0.005 }
- }
-}
-
-elements.respira = {
- color: ["#8888ff"],
- behavior: behaviors.WALL,
- noMix: true,
- properties: {
- energy: 300,
- breath: 300,
- transfer: 1
- },
- isCell: true,
- hoverStat: function (px) {
- return `E:${px.energy} B:${px.breath}`
- },
- tick: (px) => {
- px.breath += (4 - getNeighbors(px).length) * 3
- baseCellTick(px)
- doDefaults(px)
- },
- tempHigh: 102,
- stateHigh: ["steam", "steam", "steam", "sugar"],
- tempLow: -2,
- stateLow: ["ice", "ice", "ice", "sugar_ice"],
- state: "solid",
- density: 1000.1,
- category: "cells",
- breakInto: ["water", "dna", "dna", "dna"],
- reactions: {
- ...elements.cell.reactions,
- cancer: { elem1: "cancer", chance: 0.005 }
- }
-}
-
-elements.structura = {
- color: ["#535353"],
- behavior: behaviors.WALL,
- noMix: true,
- properties: {
- energy: 300,
- breath: 300,
- transfer: 0,
- static: true,
- },
- isCell: true,
- hoverStat: function (px) {
- return `E:${px.energy} B:${px.breath}`
- },
- tick: (px) => {
- baseCellTick(px)
- doDefaults(px)
- },
- tempHigh: 102,
- stateHigh: ["steam", "steam", "steam", "sugar"],
- tempLow: -2,
- stateLow: ["ice", "ice", "ice", "sugar_ice"],
- state: "solid",
- density: 1000.1,
- category: "cells",
- breakInto: ["water", "dna", "dna", "dna"],
- reactions: {
- ...elements.cell.reactions,
- cancer: { elem1: "cancer", chance: 0.005 }
- }
-}
-
-elements.vena = {
- color: ["#a85e5e"],
- behavior: behaviors.WALL,
- noMix: true,
- properties: {
- energy: 300,
- breath: 300,
- transfer: 0,
- static: false,
- },
- conduct: 1,
- isCell: true,
- hoverStat: function (px) {
- return `E:${px.energy} B:${px.breath}`
- },
- tick: (px) => {
- if (px.charge) {
- px.transfer = 500
- px.static = true
- } else {
- transfer = 0
- px.static = false
- }
- baseCellTick(px)
- doDefaults(px)
- },
- tempHigh: 102,
- stateHigh: ["steam", "steam", "sugar_water", "sugar_water"],
- tempLow: -2,
- stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"],
- state: "solid",
- density: 1010,
- category: "cells",
- breakInto: ["sugar_water", "sugar_water", "dna", "dna"],
- reactions: {
- ...elements.cell.reactions,
- cancer: { elem1: "cancer", chance: 0.005 }
- }
-}
-
-elements.neurocell = {
- color: ["#5e5fa8"],
- behavior: behaviors.WALL,
- noMix: true,
- properties: {
- energy: 300,
- breath: 300,
- transfer: 50,
- cd: 1
- },
- conduct: 1,
- isCell: true,
- hoverStat: function (px) {
- return `E:${px.energy} B:${px.breath}`
- },
- tick: (px) => {
- px.cd--
- if (px.cd < 1) {
- px.cd = 20
- px.charge = 1
- }
- baseCellTick(px)
- doDefaults(px)
- },
- tempHigh: 102,
- stateHigh: ["steam", "steam", "sugar_water", "sugar_water"],
- tempLow: -2,
- stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"],
- state: "solid",
- density: 1010,
- category: "cells",
- breakInto: ["sugar_water", "sugar_water", "dna", "dna"],
- reactions: {
- ...elements.cell.reactions,
- cancer: { elem1: "cancer", chance: 0.005 }
- }
-}
-
-elements.insulon = {
- color: ["#cadf7e"],
- behavior: behaviors.WALL,
- noMix: true,
- properties: {
- energy: 300,
- breath: 300,
- transfer: 1
- },
- conduct: 1,
- isCell: true,
- hoverStat: function (px) {
- return `E:${px.energy} B:${px.breath}`
- },
- tick: (px) => {
- if (px.temp > 20) {
- px.temp -= 6
- }
- baseCellTick(px)
- doDefaults(px)
- },
- tempHigh: 300,
- stateHigh: ["steam", "steam", "steam", "sugar"],
- tempLow: -2,
- stateLow: ["ice", "ice", "ice", "sugar_ice"],
- state: "solid",
- density: 1000.1,
- category: "cells",
- breakInto: ["water", "dna", "dna", "dna"],
- reactions: {
- ...elements.cell.reactions,
- cancer: { elem1: "cancer", chance: 0.005 }
- }
-}
-
-elements.carapace = {
- color: ["#46065a"],
- behavior: behaviors.WALL,
- noMix: true,
- properties: {
- energy: 300,
- breath: 300,
- transfer: 0
- },
- isCell: true,
- hoverStat: function (px) {
- return `E:${px.energy} B:${px.breath}`
- },
- tick: (px) => {
- baseCellTick(px)
- doDefaults(px)
- },
- tempHigh: 1200,
- stateHigh: ["steam", "molten_copper", "steam", "sugar"],
- state: "solid",
- density: 1800,
- category: "cells",
- breakInto: ["water", "oxidized_copper", "dna", "dna"],
-}
-
-elements.phagocyte = {
- color: ["#a3d9a6"],
- behavior: behaviors.WALL,
- noMix: true,
- properties: {
- energy: 300,
- breath: 300,
- transfer: 0
- },
- isCell: true,
- hoverStat: function (px) {
- return `E:${px.energy} B:${px.breath}`
- },
- tick: (px) => {
- baseCellTick(px)
- doDefaults(px)
- },
- tempHigh: 102,
- stateHigh: ["steam", "steam", "sugar", "sugar"],
- tempLow: -2,
- stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"],
- state: "solid",
- density: 1010,
- category: "cells",
- breakInto: ["dna", "sugar", "dna", "dna"],
- reactions: {
- ...elements.cell.reactions,
- cancer: { elem2: "stem_cell", chance: 0.055 },
- infection: { elem2: "stem_cell", chance: 0.075 },
- poison: { elem2: "stem_cell", chance: 0.025 },
- }
-}
-
-elements.stem_cell = {
- color: ["#c0c0c0"],
- behavior: behaviors.LIQUID,
- noMix: true,
- hoverStat: function (px) {
- return `E:${px.energy} B:${px.breath}`
- },
- tick: (px) => {
- const ns = getNeighbors(px)
- if (ns.length > 0) {
- const elem = ns[Math.floor(Math.random() * ns.length)].element
- if (elements[elem].isCell) {
- changePixel(px, elem)
- }
- }
- doDefaults(px)
- },
- tempHigh: 102,
- stateHigh: ["steam", "steam", "sugar", "sugar"],
- tempLow: -2,
- stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"],
- state: "solid",
- density: 1010,
- category: "cells",
- breakInto: ["dna", "sugar", "dna", "dna"],
- reactions: {
- ...elements.cell.reactions,
- cancer: { elem1: "cancer", chance: 0.005 }
- }
-}
-
-elements.cancer.reactions.chlorocyte = { elem2: "cancer", chane: 0.005 }
-elements.cancer.reactions.respira = { elem2: "cancer", chane: 0.005 }
-elements.cancer.reactions.insulon = { elem2: "cancer", chane: 0.005 }
-elements.cancer.reactions.neurocell = { elem2: "cancer", chane: 0.005 }
-elements.cancer.reactions.vena = { elem2: "cancer", chane: 0.005 }
-
-elements.infection.reactions.chlorocyte = { elem2: "infection", chane: 0.0015 }
-elements.infection.reactions.respira = { elem2: "infection", chane: 0.0015 }
-elements.infection.reactions.insulon = { elem2: "infection", chane: 0.0015 }
-elements.infection.reactions.neurocell = { elem2: "infection", chane: 0.0015 }
-elements.infection.reactions.vena = { elem2: "infection", chane: 0.0015 }
\ No newline at end of file
From 87b14daf94c094b9ca1c516799df9e71bdfbb256 Mon Sep 17 00:00:00 2001
From: David Kopal <112717418+DavidKopal@users.noreply.github.com>
Date: Sat, 4 Oct 2025 13:58:46 +0200
Subject: [PATCH 051/105] Add files via upload
---
mods/organism.js | 915 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 915 insertions(+)
create mode 100644 mods/organism.js
diff --git a/mods/organism.js b/mods/organism.js
new file mode 100644
index 00000000..d1aec81e
--- /dev/null
+++ b/mods/organism.js
@@ -0,0 +1,915 @@
+// heavily inspired by biology.js, go try it out too!
+viewInfo[4] = {
+ name: "enrg",
+ pixel: function (pixel, ctx) {
+ if (elements[pixel.element].isCell === true) {
+ var stat = pixel.energy
+ var ratio = stat / 3000
+ if (ratio < 0) ratio = 0
+ if (ratio > 1) ratio = 1
+ var hue = Math.round(ratio * 180)
+ drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y)
+ }
+ }
+}
+
+viewInfo[5] = {
+ name: "brth",
+ pixel: function (pixel, ctx) {
+ if (elements[pixel.element].isCell === true) {
+ var stat = pixel.breath
+ var ratio = stat / 3000
+ if (ratio < 0) ratio = 0
+ if (ratio > 1) ratio = 1
+ var hue = Math.round(ratio * 180)
+ drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y)
+ }
+ }
+}
+
+viewInfo[6] = {
+ name: "wste",
+ pixel: function (pixel, ctx) {
+ if (elements[pixel.element].properties?.waste !== undefined) {
+ let stat = pixel.waste || 1
+ let ratio = Math.log(stat) / Math.log(500)
+ if (ratio < 0) ratio = 0
+ if (ratio > 1) ratio = 1
+ let hue = 120 - Math.round(ratio * 120)
+ drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y)
+ }
+ }
+}
+
+function baseCellTick(px) {
+ if (!elements[px.element].isCell) { return }
+
+ if (px.energy > 3000) { px.energy = 3000 }
+ if (px.breath > 3000) { px.breath = 3000 }
+
+ if (!px.static && Math.random() < 0.115) {
+ px.energy -= 2
+ px.breath -= 2
+ }
+
+ if (px.energy < 1 || px.breath < 1 || (px.waste > 500 && px.element !== "urocyte") || px.waste > 3000) {
+ changePixel(px, "infection")
+ return
+ }
+
+ const ns = getNeighbors(px)
+ ns.forEach(n => {
+ if (!elements[n.element].isCell) { return }
+
+ if (n.energy < px.energy) {
+ let transfer = (px.energy - n.energy) / 4
+ transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2))
+ px.energy -= transfer
+ n.energy += transfer
+ } else if (n.energy > px.energy) {
+ let transfer = (n.energy - px.energy) / 4
+ transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2))
+ px.energy += transfer
+ n.energy -= transfer
+ }
+
+ if (n.breath < px.breath) {
+ let transfer = (px.breath - n.breath) / 4
+ transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2))
+ px.breath -= transfer
+ n.breath += transfer
+ } else if (n.breath > px.breath) {
+ let transfer = (n.breath - px.breath) / 4
+ transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2))
+ px.breath += transfer
+ n.breath -= transfer
+ }
+
+ })
+}
+
+elements.chlorocyte = { // generates energy per air pixel next to it
+ color: ["#00ff00", "#00a500", "#008a00", "#26a026", "#3eff3e"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 1
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ px.energy += (4 - getNeighbors(px).length) * 3
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "steam", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "ice", "sugar_ice"],
+ state: "solid",
+ density: 1000.1,
+ category: "nutrients",
+ breakInto: ["water", "dna", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 },
+ sugar: undefined,
+ sugar_water: undefined,
+ },
+ movable: false
+}
+
+elements.fermentocyte = { // stores and ferments sugar into energy
+ color: "#FF6F3C",
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 1,
+ waste: 0,
+ sugar: 0
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ if (px.sugar + 1 < 5) {
+ const ns = getNeighbors(px)
+ for (let n of ns) {
+ if (n.element == "sugar") {
+ deletePixel(n.x, n.y)
+ px.sugar++
+ break
+ }
+ }
+ }
+ if (px.sugar) {
+ px.sugar -= 0.0034
+ px.energy += 50
+ px.waste += 0.5
+ if (px.sugar < 0) { px.sugar = 0 }
+ }
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "steam", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "ice", "sugar_ice"],
+ state: "solid",
+ density: 1000.1,
+ category: "nutrients",
+ breakInto: ["sugar_water", "dna", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 },
+ sugar: undefined,
+ sugar_water: undefined,
+ },
+ movable: false
+}
+
+elements.urocyte = {
+ color: "#927d07",
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ waste: 0,
+ inWaste: true,
+ transfer: 1
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ if (px.waste >= 400) {
+ if (isEmpty(px.x, px.y + 1)) {
+ createPixel("waste", px.x, px.y + 1)
+ px.waste -= 400
+ } else if (isEmpty(px.x + 1, px.y)) {
+ createPixel("waste", px.x + 1, px.y)
+ px.waste -= 400
+ } else if (isEmpty(px.x - 1, px.y)) {
+ createPixel("waste", px.x - 1, px.y)
+ px.waste -= 400
+ }
+ }
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "steam", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "ice", "sugar_ice"],
+ state: "solid",
+ density: 1000.1,
+ category: "waste",
+ breakInto: ["water", "dna", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 },
+ sugar: undefined,
+ sugar_water: undefined,
+ },
+ movable: false
+}
+
+elements.root = { // stores water and converts it into energy
+ color: ["#fff0c0", "#bba86c"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 2,
+ water: 0
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ const ns = getNeighbors(px)
+ ns.forEach(n => {
+ if (n.element == "water") {
+ deletePixel(n.x, n.y)
+ px.water += 2
+ } else if (n.element == "root") {
+ if (n.energy < px.energy) {
+ let transfer = (px.energy - n.energy) / 4
+ transfer = Math.floor(Math.min(transfer, 40 / 2))
+ px.energy -= transfer
+ n.energy += transfer
+ } else if (n.energy > px.energy) {
+ let transfer = (n.breath - px.breath) / 4
+ transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2))
+ px.energy += transfer
+ n.energy -= transfer
+ }
+
+ if (n.breath < px.breath) {
+ let transfer = (px.breath - n.breath) / 4
+ transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2))
+ px.breath -= transfer
+ n.breath += transfer
+ } else if (n.breath > px.breath) {
+ let transfer = (n.breath - px.breath) / 4
+ transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2))
+ px.breath += transfer
+ n.breath -= transfer
+ }
+ } else if (n.element == "sugar_water") {
+ deletePixel(n.x, n.y)
+ px.water += 3
+ } else if (n.element == "mud") {
+ changePixel(n, "dirt")
+ px.water += 5
+ } else if (n.element == "wet_sand") {
+ changePixel(n, "sand")
+ px.water += 5
+ } else if (n.element == "dirt" && Math.random() < 0.075) {
+ px.water += 1
+ } else if (n.element == "sand" && Math.random() < 0.025) {
+ px.water += 1
+ }
+ })
+ if (px.water > 0 && Math.random() < 0.185) {
+ px.water -= 1
+ px.energy += 15
+ if (px.water < 0) { px.water = 0 }
+ }
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "steam", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "ice", "sugar_ice"],
+ state: "solid",
+ density: 1000.1,
+ category: "nutrients",
+ breakInto: ["sugar_water", "dna", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 },
+ sugar: undefined,
+ sugar_water: undefined,
+ },
+ movable: false,
+ isFood: true
+}
+
+elements.lipocyte = { // stores excess energy for later use
+ color: "#FFE680",
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 30,
+ fat: 0
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ if (px.energy >= 1300 && px.fat < 18) {
+ px.energy -= 1000
+ px.fat += 1
+ } else if (px.energy <= 300 && px.fat > 0 && Math.random() < 0.1875) {
+ px.fat -= 1
+ px.energy += 1000
+ }
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "steam", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "ice", "sugar_ice"],
+ state: "solid",
+ density: 1000.1,
+ category: "nutrients",
+ breakInto: ["sugar_water", "dna", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 },
+ sugar: undefined,
+ sugar_water: undefined,
+ },
+ movable: false
+}
+
+elements.aerocyte = { // generates breath out of energy
+ color: "#66ccff",
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ waste: 0,
+ transfer: 30,
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ if (px.energy >= 305 && px.breath <= 1995) {
+ px.energy -= 5
+ px.breath += 5
+ px.waste += 0.075
+ }
+
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "steam", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "ice", "sugar_ice"],
+ state: "solid",
+ density: 1000.1,
+ category: "breathing",
+ breakInto: ["sugar_water", "dna", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 },
+ sugar: undefined,
+ sugar_water: undefined,
+ },
+ movable: false
+}
+
+elements.respira = { // just like chlorocyte, but for breath
+ color: ["#8888ff"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 1
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ px.breath += (4 - getNeighbors(px).length) * 3
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "steam", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "ice", "sugar_ice"],
+ state: "solid",
+ density: 1000.1,
+ category: "breathing",
+ breakInto: ["water", "dna", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 },
+ sugar: undefined,
+ sugar_water: undefined,
+ },
+ movable: false
+}
+
+elements.vena = { // transfers energy when powered
+ color: ["#a85e5e"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 0,
+ static: false,
+ waste: 0
+ },
+ conduct: 1,
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ if (px.charge) {
+ px.transfer = 500
+ px.static = true
+ } else {
+ px.transfer = 0
+ px.static = false
+ }
+
+ if (px.energy > 3000) { px.energy = 3000 }
+ if (px.breath > 3000) { px.breath = 3000 }
+
+ if (!px.static && Math.random() < 0.115) {
+ px.energy -= 2
+ px.breath -= 2
+ }
+
+ if (px.energy < 1 || px.breath < 1 || (px.waste > 500 && px.element !== "urocyte") || px.waste > 3000) {
+ changePixel(px, "infection")
+ return
+ }
+
+ const ns = getNeighbors(px)
+ ns.forEach(n => {
+ if (!elements[n.element].isCell) { return }
+
+ if (n.energy < px.energy) {
+ let transfer = (px.energy - n.energy) / 4
+ transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2))
+ px.energy -= transfer
+ n.energy += transfer
+ } else if (n.energy > px.energy) {
+ let transfer = (n.energy - px.energy) / 4
+ transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2))
+ px.energy += transfer
+ n.energy -= transfer
+ }
+
+ if (n.breath < px.breath) {
+ let transfer = (px.breath - n.breath) / 4
+ transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2))
+ px.breath -= transfer
+ n.breath += transfer
+ } else if (n.breath > px.breath) {
+ let transfer = (n.breath - px.breath) / 4
+ transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2))
+ px.breath += transfer
+ n.breath -= transfer
+ }
+
+ if (n.waste !== undefined) {
+ if (n.inWaste) {
+ let transfer = Math.max(1, Math.floor(Math.min(px.waste / 4, (px.transfer + n.transfer) / 2)))
+ if (px.waste >= transfer) {
+ px.waste -= transfer
+ n.waste += transfer
+ }
+ } else {
+ if (n.waste < px.waste) {
+ let transfer = Math.max(1, Math.min((px.waste - n.waste) / 4, (px.transfer + n.transfer) / 2))
+ px.waste -= transfer
+ n.waste += transfer
+ } else if (n.waste > px.waste) {
+ let transfer = Math.max(1, Math.min((n.waste - px.waste) / 4, (px.transfer + n.transfer) / 2))
+ px.waste += transfer
+ n.waste -= transfer
+ }
+ }
+ }
+ })
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "sugar_water", "sugar_water"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"],
+ state: "solid",
+ density: 1010,
+ category: "structural",
+ breakInto: ["sugar_water", "sugar_water", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 },
+ sugar: undefined,
+ sugar_water: undefined,
+ },
+ movable: false
+}
+
+elements.neurocell = { // powers up venas
+ color: ["#5e5fa8"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 50,
+ cd: 1
+ },
+ conduct: 1,
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ px.cd--
+ if (px.cd < 1) {
+ px.cd = 20
+ px.charge = 1
+ }
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "sugar_water", "sugar_water"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"],
+ state: "solid",
+ density: 1010,
+ category: "structural",
+ breakInto: ["sugar_water", "sugar_water", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 },
+ sugar: undefined,
+ sugar_water: undefined,
+ },
+ movable: false
+}
+
+elements.waste = { // urocyte excretes this
+ color: "#5f9102",
+ behavior: behaviors.LIQUID,
+ state: "liquid",
+ category: "waste",
+ stateHigh: "stench",
+ burn: 20,
+ isFood: true,
+ burnTime: 150,
+ burnInto: "stench",
+ tempHigh: 120,
+ stateLow: "slime_ice",
+ tempLow: 0,
+ density: 1465,
+ viscosity: 5000
+}
+
+elements.mucus = { // light protective layer
+ color: "#aff036",
+ behavior: [
+ "XX|SA|XX",
+ "SA|DL%1|XX",
+ "XX AND M2|SA AND M1|XX AND M2"
+ ],
+ state: "liquid",
+ category: "protection",
+ stateHigh: "steam",
+ tempHigh: 120,
+ stateLow: "slime_ice",
+ tempLow: 0,
+ density: 1400,
+ viscosity: 5000
+}
+
+elements.toxic_mucus = { // toxic protective layer, eats bugs for energy
+ color: "#58046d",
+ behavior: [
+ "XX|SA|XX",
+ "SA|DL%1|XX",
+ "XX AND M2|SA AND M1|XX AND M2"
+ ],
+ tick: (px) => {
+ const ns = getNeighbors(px)
+ energy = 0
+ ns.forEach(n => {
+ if (["ant", "fly", "spider", "worm", "flea", "rat", "frog", "tadpole", "fish", "slug", "snail"].includes(n.element)) {
+ deletePixel(n.x, n.y)
+ energy++
+ } else if (n.element == "mucotoxin" && energy > 0) {
+ energy--
+ n.waste += 0.6
+ n.energy += 3000
+ }
+ })
+ },
+ state: "liquid",
+ category: "protection",
+ stateHigh: "steam",
+ tempHigh: 120,
+ stateLow: "slime_ice",
+ tempLow: 0,
+ density: 1400,
+ viscosity: 5000
+}
+
+elements.slimecoat = { // generates mucus
+ color: ["#5a4606"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 0
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ const ns = getNeighbors(px)
+ let change = (ns.length == 4)
+ if (change) {
+ ns.forEach(n => {
+ if (n.element == ("mucus" || "toxic_mucus" || "slimecoat")) {
+ change = false
+ }
+ })
+ }
+ if (change) {
+ changePixel(px, "stem_cell")
+ return
+ }
+ if (isEmpty(px.x - 1, px.y)) {
+ createPixel("mucus", px.x - 1, px.y)
+ }
+ if (isEmpty(px.x + 1, px.y)) {
+ createPixel("mucus", px.x + 1, px.y)
+ }
+ if (isEmpty(px.x, px.y - 1)) {
+ createPixel("mucus", px.x, px.y - 1)
+ }
+ if (isEmpty(px.x, px.y + 1)) {
+ createPixel("mucus", px.x, px.y + 1)
+ }
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 250,
+ stateHigh: "steam",
+ state: "solid",
+ density: 1800,
+ insulate: true,
+ category: "protection",
+ breakInto: ["tin", "dna", "dna"],
+ movable: false
+}
+
+elements.mucotoxin = { // generates toxic mucus
+ color: ["#5a2806"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ waste: 0,
+ transfer: 0
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ const ns = getNeighbors(px)
+ let change = (ns.length == 4)
+ if (change) {
+ ns.forEach(n => {
+ if (n.element == ("mucus" || "toxic_mucus" || "mucotoxin")) {
+ change = false
+ }
+ })
+ }
+ if (isEmpty(px.x - 1, px.y)) {
+ createPixel("toxic_mucus", px.x - 1, px.y)
+ }
+ if (isEmpty(px.x + 1, px.y)) {
+ createPixel("toxic_mucus", px.x + 1, px.y)
+ }
+ if (isEmpty(px.x, px.y - 1)) {
+ createPixel("toxic_mucus", px.x, px.y - 1)
+ }
+ if (isEmpty(px.x, px.y + 1)) {
+ createPixel("toxic_mucus", px.x, px.y + 1)
+ }
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 250,
+ stateHigh: "molten_tin",
+ state: "solid",
+ density: 1800,
+ insulate: true,
+ category: "protection",
+ breakInto: ["tin", "dna", "dna"],
+ movable: false
+}
+
+elements.carapace = { // heat-resistant, cancer/infection proof shell
+ color: ["#46065a"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 0
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (pixel) => {
+ if (getNeighbors(pixel).length == 4) { changePixel(pixel, "stem_cell"); return }
+ baseCellTick(pixel)
+ doDefaults(pixel)
+ if (!isEmpty(pixel.x, pixel.y - 1, true)) { // Everything after this in the tick function is from biology.js, make sure to check it out too!
+ var hitPixel = pixelMap[pixel.x][pixel.y - 1]
+ if (elements[hitPixel.element].isCell != true && Math.random() > 0.5) {
+ if (hitPixel.temp > pixel.temp) {
+ hitPixel.temp--
+ pixel.temp++
+ }
+ }
+ }
+ if (!isEmpty(pixel.x, pixel.y + 1, true)) {
+ var hitPixel = pixelMap[pixel.x][pixel.y + 1]
+ if (elements[hitPixel.element].isCell != true && Math.random() > 0.5) {
+ if (hitPixel.temp > pixel.temp) {
+ hitPixel.temp--
+ pixel.temp++
+ }
+ }
+ }
+ if (!isEmpty(pixel.x - 1, pixel.y, true)) {
+ var hitPixel = pixelMap[pixel.x - 1][pixel.y]
+ if (elements[hitPixel.element].isCell != true && Math.random() > 0.5) {
+ if (hitPixel.temp > pixel.temp) {
+ hitPixel.temp--
+ pixel.temp++
+ }
+ }
+ }
+ if (!isEmpty(pixel.x + 1, pixel.y, true)) {
+ var hitPixel = pixelMap[pixel.x + 1][pixel.y]
+ if (elements[hitPixel.element].isCell != true && Math.random() > 0.5) {
+ if (hitPixel.temp > pixel.temp) {
+ hitPixel.temp--
+ pixel.temp++
+ }
+ }
+ }
+ doDefaults(pixel);
+ if (pixel.temp > 250) {
+ changePixel(pixel, "molten_tin", 250)
+ }
+ },
+ tempHigh: 250,
+ stateHigh: "steam",
+ state: "solid",
+ density: 1800,
+ insulate: true,
+ category: "protection",
+ breakInto: ["tin", "dna", "dna"],
+ movable: false
+}
+
+elements.phagocyte = { // turns cancer and infection into stem cells
+ color: ["#a3d9a6"],
+ behavior: behaviors.WALL,
+ noMix: true,
+ properties: {
+ energy: 300,
+ breath: 300,
+ transfer: 0
+ },
+ isCell: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ if (Math.random() < 0.35) {
+ const coords = circleCoords(px.x, px.y, 3)
+ coords.forEach(coord => {
+ if (!isEmpty(coord.x, coord.y)) {
+ const n = pixelMap[coord.x][coord.y]
+ if (n.element === "infection" || n.element === "cancer" || n.element === "poison") {
+ if (Math.random() < 0.35) {
+ changePixel(n, "stem_cell")
+ }
+ }
+ }
+ })
+ }
+ baseCellTick(px)
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "sugar", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"],
+ state: "solid",
+ density: 1010,
+ category: "protection",
+ breakInto: ["dna", "sugar", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem2: "stem_cell", chance: 0.055 },
+ infection: { elem2: "stem_cell", chance: 0.075 },
+ poison: { elem2: "stem_cell", chance: 0.025 },
+ sugar: undefined,
+ sugar_water: undefined,
+ },
+ movable: false
+}
+
+elements.stem_cell = { // turns into the first cell it touches
+ color: ["#c0c0c0"],
+ behavior: behaviors.LIQUID,
+ noMix: true,
+ hoverStat: function (px) {
+ return `E:${px.energy} B:${px.breath}`
+ },
+ tick: (px) => {
+ const ns = getNeighbors(px)
+ if (ns.length > 0) {
+ const elem = ns[Math.floor(Math.random() * ns.length)].element
+ if (elements[elem].isCell && elem !== "phagocyte") {
+ changePixel(px, elem)
+ }
+ }
+ doDefaults(px)
+ },
+ tempHigh: 102,
+ stateHigh: ["steam", "steam", "sugar", "sugar"],
+ tempLow: -2,
+ stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"],
+ state: "solid",
+ density: 1010,
+ category: "structural",
+ breakInto: ["dna", "sugar", "dna", "dna"],
+ reactions: {
+ ...elements.cell.reactions,
+ cancer: { elem1: "cancer", chance: 0.005 },
+ sugar: undefined,
+ sugar_water: undefined,
+ }
+}
+
+elements.cancer.reactions.chlorocyte = { elem2: "cancer", chance: 0.005 }
+elements.cancer.reactions.respira = { elem2: "cancer", chance: 0.005 }
+elements.cancer.reactions.neurocell = { elem2: "cancer", chance: 0.005 }
+elements.cancer.reactions.vena = { elem2: "cancer", chance: 0.005 }
+elements.cancer.reactions.fermentocyte = { elem2: "cancer", chance: 0.005 }
+elements.cancer.reactions.root = { elem2: "cancer", chance: 0.005 }
+elements.cancer.reactions.lipocyte = { elem2: "cancer", chance: 0.005 }
+elements.cancer.reactions.slimecoat = { elem2: "cancer", chance: 0.005 }
+elements.cancer.reactions.mucotoxin = { elem2: "cancer", chance: 0.005 }
+elements.cancer.reactions.aerocyte = { elem2: "cancer", chance: 0.005 }
+elements.cancer.reactions.urocyte = { elem2: "cancer", chance: 0.005 }
+
+elements.infection.reactions.chlorocyte = { elem2: "infection", chance: 0.0015 }
+elements.infection.reactions.respira = { elem2: "infection", chance: 0.0015 }
+elements.infection.reactions.neurocell = { elem2: "infection", chance: 0.0015 }
+elements.infection.reactions.vena = { elem2: "infection", chance: 0.0015 }
+elements.infection.reactions.fermentocyte = { elem2: "infection", chance: 0.0015 }
+elements.infection.reactions.lipocyte = { elem2: "infection", chance: 0.0015 }
+elements.infection.reactions.root = { elem2: "infection", chance: 0.0015 }
+elements.infection.reactions.slimecoat = { elem2: "infection", chance: 0.0015 }
+elements.infection.reactions.mucotoxin = { elem2: "infection", chance: 0.0015 }
+elements.infection.reactions.aerocyte = { elem2: "infection", chance: 0.0015 }
+elements.infection.reactions.urocyte = { elem2: "infection", chance: 0.0015 }
+
+elements.ant.reactions.waste = { elem2: null, chance: 0.035, func: behaviors.FEEDPIXEL }
\ No newline at end of file
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 052/105] 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 aab544d30b1008fcf75c2e8b80bca26588510c53 Mon Sep 17 00:00:00 2001
From: slweeb <91897291+slweeb@users.noreply.github.com>
Date: Mon, 6 Oct 2025 19:20:06 -0400
Subject: [PATCH 053/105] Update devsnacks.js
---
mods/devsnacks.js | 35 ++++++++++++++++++++++++++++++++++-
1 file changed, 34 insertions(+), 1 deletion(-)
diff --git a/mods/devsnacks.js b/mods/devsnacks.js
index f1cde22f..562c31ff 100644
--- a/mods/devsnacks.js
+++ b/mods/devsnacks.js
@@ -73,4 +73,37 @@ elements.tea_powder = {
isFood: true,
hidden: true
}
-elements.water.reactions.tea_powder = { elem1:"tea", chance:0.0002 }
\ No newline at end of file
+elements.water.reactions.tea_powder = { elem1:"tea", chance:0.0002 }
+
+elements.pumpkin.breakInto = ["pumpkin_seed","pumpkin_mash","pumpkin_mash","pumpkin_mash",null];
+
+elements.pumpkin_mash = {
+ color: ["#DF7E06","#eba100"],
+ behavior: behaviors.STURDYPOWDER,
+ tempHigh: 125,
+ stateHigh: ["pumpkin_spice","pumpkin_spice",null],
+ category: "food",
+ state: "solid",
+ density: 490.3,
+ isFood: true,
+ hidden: true,
+}
+
+elements.pumpkin_seed.tempHigh = 125;
+elements.pumpkin_seed.stateHigh = ["pumpkin_spice","pumpkin_spice",null];
+
+elements.pumpkin_spice = {
+ color: "#8d4f03",
+ grain: 1.5,
+ behavior: behaviors.POWDER,
+ tempHigh: 400,
+ stateHigh: ["smoke","smoke","smoke","smoke","ash"],
+ category: "food",
+ state: "solid",
+ density: 490.3,
+ isFood: true,
+ hidden: true,
+}
+
+elements.coffee.reactions.pumpkin_spice = { elem2:null, color1:"#6A2F03", chance:0.005 };
+elements.coffee.reactions.pumpkin_mash = { elem2:null, color1:"#6A2F03", chance:0.005 };
\ No newline at end of file
From eb366140767cba0368cb9657853c938abc63cf11 Mon Sep 17 00:00:00 2001
From: slweeb <91897291+slweeb@users.noreply.github.com>
Date: Mon, 6 Oct 2025 19:36:04 -0400
Subject: [PATCH 054/105] Update devsnacks.js
---
mods/devsnacks.js | 31 +++++++++++++++++++++++++++++--
1 file changed, 29 insertions(+), 2 deletions(-)
diff --git a/mods/devsnacks.js b/mods/devsnacks.js
index 562c31ff..e63e7a54 100644
--- a/mods/devsnacks.js
+++ b/mods/devsnacks.js
@@ -83,7 +83,7 @@ elements.pumpkin_mash = {
tempHigh: 125,
stateHigh: ["pumpkin_spice","pumpkin_spice",null],
category: "food",
- state: "solid",
+ state: "liquid",
density: 490.3,
isFood: true,
hidden: true,
@@ -106,4 +106,31 @@ elements.pumpkin_spice = {
}
elements.coffee.reactions.pumpkin_spice = { elem2:null, color1:"#6A2F03", chance:0.005 };
-elements.coffee.reactions.pumpkin_mash = { elem2:null, color1:"#6A2F03", chance:0.005 };
\ No newline at end of file
+elements.coffee.reactions.pumpkin_mash = { elem2:null, color1:"#6A2F03", chance:0.005 };
+
+elements.apple = {
+ color: ["#b22424","#f5c517","#66b447"],
+ grain: 2,
+ behavior: behaviors.POWDER,
+ // singleColor: true,
+ category: "food",
+ state: "solid",
+ density: 750,
+ isFood: true,
+ breakInto: "juice",
+ tempHigh: 175,
+ stateHigh: ["applesauce",null]
+}
+
+elements.applesauce = {
+ color: "#E7C45A",
+ behavior: behaviors.LIQUID,
+ viscosity: 50000,
+ tempHigh: 400,
+ stateHigh: "smoke",
+ category: "food",
+ state: "liquid",
+ density: 750,
+ isFood: true,
+ hidden: true,
+}
\ No newline at end of file
From 1a6aee23f0eefd572a24b68f5276ea2c8327180b Mon Sep 17 00:00:00 2001
From: sq <>
Date: Wed, 8 Oct 2025 17:06:23 +0800
Subject: [PATCH 055/105] sugar spice and everything nice
---
mods/aChefsDream2.js | 145 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 144 insertions(+), 1 deletion(-)
diff --git a/mods/aChefsDream2.js b/mods/aChefsDream2.js
index 4a089e68..31fc4cfa 100644
--- a/mods/aChefsDream2.js
+++ b/mods/aChefsDream2.js
@@ -3,7 +3,7 @@
// https://github.com/SquareScreamYT/
// https://youtube.com/@sqec
-version = "v2.1.0"
+version = "v2.1.1"
runAfterLoad(function() {
console.log("Current aChefsDream version: "+version)
@@ -595,4 +595,147 @@ elements.pistachio_powder = {
hidden: true
}
+elements.pumpkin_mash = {
+ color: ["#f59c2f", "#efa810", "#e38f1a"],
+ behavior: behaviors.STURDYPOWDER,
+ tempHigh: 125,
+ stateHigh: ["pumpkin_spice","pumpkin_spice","smoke"],
+ category: "food",
+ state: "liquid",
+ density: 500,
+ isFood: true,
+ hidden: true,
+}
+
+elements.pumpkin.breakInto = ["pumpkin_seed", "pumpkin_mash", "pumpkin_mash", "pumpkin_mash", "pumpkin_mash", null];
+
+elements.pumpkin_spice = {
+ color: ["#95570b", "#ba7f36"],
+ behavior: behaviors.POWDER,
+ tempHigh: 400,
+ stateHigh: ["smoke","smoke","smoke","smoke","ash"],
+ category: "food",
+ state: "solid",
+ density: 500,
+ isFood: true,
+ hidden: true,
+}
+
+elements.cinnamon_powder.reactions.nutmeg_powder = { elem1: "pumpkin_spice", elem2: null, chance: 0.5 };
+
+elements.coffee.reactions.pumpkin_mash = { elem2: null, color1: "#7e3c09", chance: 0.005 };
+elements.coffee.reactions.pumpkin_spice = { elem2: null, color1: "#7e3c09", chance: 0.005 };
+
+elements.nutmeg_tree = {
+ color: "#6B4226",
+ behavior: behaviors.WALL,
+ tempHigh: 400,
+ stateHigh: ["ember", "charcoal", "fire"],
+ category: "solids",
+ burn: 5,
+ burnTime: 300,
+ burnInto: ["ember", "charcoal", "fire"],
+ state: "solid",
+ hardness: 0.2,
+ breakInto: "sawdust",
+ hidden: true
+};
+
+elements.nutmeg_branch = {
+ color: "#5c3b23",
+ behavior: [
+ "CR:nutmeg_leaves,nutmeg_branch%2|CR:nutmeg_leaves,nutmeg_branch%2|CR:nutmeg_leaves,nutmeg_branch%2",
+ "XX|XX|XX",
+ "XX|XX|XX",
+ ],
+ tempHigh: 100,
+ stateHigh: "nutmeg_tree",
+ tempLow: -30,
+ stateLow: "nutmeg_tree",
+ category: "life",
+ burn: 30,
+ burnTime: 60,
+ burnInto: ["sap", "ember"],
+ hidden: true,
+ state: "solid",
+ density: 1400,
+ breakInto: ["sap", "sawdust"]
+};
+
+elements.nutmeg_leaves = {
+ color: ["#4b7d3d", "#558c40"],
+ behavior: [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "XX|CR:nutmeg_fruit%0.1|XX",
+ ],
+ reactions: {
+ "vinegar": { elem1: "dead_plant", chance: 0.035 },
+ "baking_soda": { elem1: "dead_plant", chance: 0.01 },
+ "bleach": { elem1: "dead_plant", chance: 0.05 },
+ "alcohol": { elem1: "dead_plant", chance: 0.035 },
+ },
+ category: "life",
+ tempHigh: 90,
+ stateHigh: "dead_plant",
+ tempLow: -1.5,
+ stateLow: "frozen_plant",
+ burn: 60,
+ burnTime: 60,
+ burnInto: "dead_plant",
+ state: "solid",
+ density: 1050,
+ hidden: true
+};
+
+elements.nutmeg_fruit = {
+ color: ["#c0a25d", "#ddb86c"],
+ behavior: behaviors.POWDER,
+ category: "food",
+ tempHigh: 100,
+ stateHigh: "dead_plant",
+ burn: 60,
+ burnTime: 60,
+ cutInto: ["mace", "nutmeg", "nutmeg"],
+ breakInto: ["mace", "nutmeg", "nutmeg"],
+ state: "solid",
+ density: 1050
+};
+
+elements.mace = {
+ color: ["#e04e1b", "#cc3614"],
+ behavior: behaviors.POWDER,
+ category: "food",
+ tempHigh: 250,
+ stateHigh: ["ash", "smoke"],
+ isFood: true,
+ state: "solid",
+ density: 900,
+ hidden: false
+};
+
+elements.nutmeg = {
+ color: ["#8b5a2b", "#A0522D"],
+ behavior: behaviors.POWDER,
+ category: "food",
+ tempHigh: 250,
+ stateHigh: ["ash", "smoke"],
+ isFood: true,
+ state: "solid",
+ density: 1000,
+ breakInto: "nutmeg_powder",
+};
+
+elements.nutmeg_powder = {
+ color: "#C58940",
+ behavior: behaviors.POWDER,
+ category: "food",
+ tempHigh: 250,
+ stateHigh: ["ash", "smoke"],
+ isFood: true,
+ state: "solid",
+ density: 950,
+ hidden: false
+};
+
},true)
\ No newline at end of file
From 9b8c49bc428286557f7884cc3a6ae440317d97bf Mon Sep 17 00:00:00 2001
From: 3pm-on-github
Date: Wed, 8 Oct 2025 14:58:26 +0200
Subject: [PATCH 056/105] let's take a look...
---
mods/3pms_mod.js | 133 +++++++++++++++++++++++++----------------------
1 file changed, 72 insertions(+), 61 deletions(-)
diff --git a/mods/3pms_mod.js b/mods/3pms_mod.js
index 4e39d814..622d42db 100644
--- a/mods/3pms_mod.js
+++ b/mods/3pms_mod.js
@@ -1,43 +1,37 @@
-// mod moment
-// also made by 3pm
+// made by 3pm
-// starting the initiation
-version = "0.0.1"
-subversion = "0.0.12"
-versionname = "Gullible On The Ceilling"
+version = "0.0.2"
+subversion = "0.0.21"
+versionname = "Let's take a look..."
console.log("3pms_mod.js " + version + " \"" + versionname + "\"")
console.log("3pms_mod.js | Initiating...")
// bypassing the tps limit
-// nvm this is useless
-// whatever im keeping it
-setTimeout(() => {
- const tpsbutton = document.getElementById("tpsButton");
- tpsbutton.onclick = () => {
- var tpsprompt = prompt(
- "Enter the new simulation Ticks Per Second (TPS). This is how many updates per second the simulation will run.\n\n" +
- "The default is 30.\n\nThe current TPS is " + tps + ".\n\nNOTE: 3pms_mod.js removes the TPS limit.\n" +
- "Any TPS higher than 1000 isn\'t recommended.\n\n"
- );
-
- var newtps = parseInt(tpsprompt);
- if (tpsprompt !== null) {
- if (isNaN(newtps) || newtps == "") {
- alert("You did not enter a valid TPS.");
- } else {
- tps = parseInt(newtps);
- if (isNaN(tps) || tps <= 0) {
- alert("You did not enter a valid TPS.");
- tps = 30;
+function tpsPrompt() {
+ promptInput("Enter the new simulation Ticks Per Second (TPS). This is how many updates per second the simulation will run.\n\nThe default is 30.\n\nThe current TPS is " + tps + ".\n\nNOTE: 3pms_mod.js removes the TPS limit.\nAny TPS higher than 1000 isn't recommended.\n\n",
+ (r) => {
+ var newtps = parseInt(r);
+ if (r !== null) {
+ if (isNaN(newtps) || newtps == "") logMessage("You did not enter a valid TPS.");
+ else {
+ newtps = parseInt(newtps);
+ if (isNaN(newtps) || newtps <= 0) {
+ logMessage("You did not enter a valid TPS.");
+ }
+ else {
+ tps = newtps;
+ delete currentSaveData.oldTps;
+ }
+ }
+ resetInterval(tps);
}
- }
- resetInterval(tps);
- }
- focusGame();
- };
-}, 1000);
+ focusGame();
+ },
+ "Change TPS"
+ )
+}
// more settings
@@ -60,7 +54,7 @@ setTimeout(() => {
`);
- const menuText = document.getElementsByClassName("menuText")[6]
+ const menuText = document.getElementsByClassName("menuText")[9]
const newButton = document.createElement("button")
newButton.innerText = "More Settings"
newButton.className = "settingsButton"
@@ -73,7 +67,7 @@ setTimeout(() => {
// elements
-elements.calcium_oxide = { // most of this is taken off calcium
+elements.calcium_oxide = {
color: ["#544E45","#6A635E","#6E6A61","#756F62","#918A7B"],
tick: function(pixel) {
behaviors.POWDER(pixel);
@@ -95,39 +89,56 @@ elements.calcium_oxide = { // most of this is taken off calcium
fireColor: "#ff6b21"
}
-elements.eeraser = { // finally integrating it after over a year
+elements.eeraser = {
color: "#FFFF00",
- behavior: behaviors.WALL,
- behaviorON: [
- "DL|DL|DL",
- "DL|DL|DL",
+ behaviorOn: [
+ "DL|XX|DL",
+ "DL|XX|DL",
"DL|DL|DL",
],
+ behavior: [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "XX|XX|XX"
+ ],
+ conduct: 0.5,
category: "machines",
- insulate: elements.wire.insulate,
- conduct: elements.wire.conduct,
- noMix: elements.wire.noMix
+ state: "solid",
};
-// stopping the initiation
+// tools
+elements.replace_all_of_element = {
+ color: ["#ff3030", "#800000"],
+ name: "replace all of element",
+ onSelect: async function() {
+ promptInput(
+ "Enter the element to be replaced.",
+ (r) => {
+ if (r in elements) {
+ elements.replace_all_of_element.tool = function(pixel) {
+ elementbefore = pixel.element
+ for (var i = 0; i <= width; i++) {
+ for (var j = 0; j <= height; j++) {
+ if (!isEmpty(i,j,true)) {
+ if(pixelMap[i][j].element == elementbefore) {
+ changePixel(pixelMap[i][j], r)
+ }
+ }
+ }
+ }
+ }
+ } else {
+ logMessage("You did not enter an existing element.");
+ }
+ },
+ "3pms_mod.js"
+ );
+ },
+ category: "tools",
+};
+
+
setTimeout(() => {
console.log("3pms_mod.js | Initiated. Thank you.")
-}, 1000);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const thing=document.createElement("p");thing.innerText="MY NAME 📛 IS DAVID 👨🎤 DAD 👨👩👧👦👨👩👧👧 I ℹ️ WANT SOME ICE 🧊🇦🇶 CREAM 🧴🧴 DAVID 👨🎤 THAT IS MY NAME 📛 DAVID 👨🎤👨🎤 I ℹ️ WANT ANOTHER WHERE ❔❓ IS MY BALL 🏈🏈 I’M RUNNING 🏃♂️🏃♀️ OUT ON 🔛 THE ROAD 🚧 THERE IS A 🅰️ CAR 🚔🚖 AND IT IS GOING TO HIT 👊 ME 🖐🙋♀️ HEEEEEEEEELP HELP 💁 MEEEEEEE HEEEEEEEEEEEEEEEEELP\n\nthanks for using 3pms_mod.js :3";document.body.appendChild(thing)
\ No newline at end of file
+}, 1000);
\ No newline at end of file
From 561c158e5d505da2bb860ccbecafe8a7b9b6e7bf Mon Sep 17 00:00:00 2001
From: 3pm-on-github
Date: Wed, 8 Oct 2025 15:07:59 +0200
Subject: [PATCH 057/105] the humble mod-list change
---
mod-list.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/mod-list.html b/mod-list.html
index 78200bde..98b60f42 100644
--- a/mod-list.html
+++ b/mod-list.html
@@ -351,6 +351,7 @@
| volcanic_expansion.js | Obsidian, Pumice, and Andesite rocks | Jayd |
| Fun & Games |
+| 3pms_mod.js | Adds random stuff and tools | 3pm |
| 10kelements.js | Customizable amount of randomly generated elements | nousernamefound |
| all_around_fillers.js | Directional Filler variants | idk73248 |
| allliquids.js | Made all elements liquids | Adora |
From 8f6fdbb10fe31f8284e44603b44771fc3059f031 Mon Sep 17 00:00:00 2001
From: PogDog <121242106+P0gDog@users.noreply.github.com>
Date: Thu, 9 Oct 2025 20:01:15 +0000
Subject: [PATCH 058/105] Added my mods so far to mod list (Industry and
sensitive)
---
mod-list.html | 3 +++
1 file changed, 3 insertions(+)
diff --git a/mod-list.html b/mod-list.html
index 0c6543bd..d29479be 100644
--- a/mod-list.html
+++ b/mod-list.html
@@ -280,6 +280,7 @@
| waterspout.js | Re-adds the old Water Spout | mollthecoder |
| WhisperingTheory.js | Many more variants of heater and cooler | kaeud |
| wifi_draw.js | Draws connections between WiFi in wifi.js and logicgates.js | RedBirdly |
+| industry.js | Adds conveyors and emittors for most energy types | pogdog |
| Weapons |
| aircrafts.js | Aircrafts and aircraft parts | Jayd |
@@ -398,6 +399,8 @@
| triggerable_random_powders.js | Powders with different abilities, such as heating and cooling | Alice |
| troll.js | Various dumb elements that iterate randomly on the entire screen | Alice |
| WhisperingTheory.js | Powder and gas variant of heater and cooler | kaeud |
+| sensitive.js | Makes all elements sensitive to air | pogdog |
+
| Visual Effects |
| acid_and_shapes.js | Weird visual effects enabled in settings | Alice |
From 7c5fac598006c4bb109b03fc48dc1fac6a80d14b Mon Sep 17 00:00:00 2001
From: slweeb <91897291+slweeb@users.noreply.github.com>
Date: Thu, 9 Oct 2025 16:19:59 -0400
Subject: [PATCH 059/105] Update mod-list.html
---
mod-list.html | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/mod-list.html b/mod-list.html
index 1a44d3b3..d66c98aa 100644
--- a/mod-list.html
+++ b/mod-list.html
@@ -263,6 +263,7 @@
| gameOfLife.js | Conway's Game of Life on a screen | ggod |
| heatshield.js | Heatshields, makes Plasma cooler | Taterbob |
| human_friendly_design.js | Pipes, Portals, Drag, and Mix don't kill humans | Nekonico |
+| industry.js | Conveyors and emitters for most energy types | pogdog |
| logicgates.js | Predictable electricity and logic gates | nousernamefound |
| note_block_advanced.js | Edit of Alice's note_block.js, adds different blocks with different frequencies | CharsonBurensen |
| note_block.js | Musical Note Blocks | Alice |
@@ -281,8 +282,7 @@
| video.js | Video player | ggod |
| waterspout.js | Re-adds the old Water Spout | mollthecoder |
| WhisperingTheory.js | Many more variants of heater and cooler | kaeud |
-| wifi_draw.js | Draws connections between WiFi in wifi.js and logicgates.js | RedBirdly |
-| industry.js | Adds conveyors and emittors for most energy types | pogdog |
+| wifi_draw.js | Connections between WiFi in wifi.js and logicgates.js | RedBirdly |
| Weapons |
| aircrafts.js | Aircrafts and aircraft parts | Jayd |
@@ -398,6 +398,7 @@
| random_liquids.js | Randomly generates liquids on game load | Alice |
| sbmixup.js | Silly elements from a Mix-Up! game | stefanblox |
| scp.js | Creatures and items from the SCP Wiki | Nekonico |
+| sensitive.js | Makes all elements sensitive to air | pogdog |
| sports_beta.js | Several sports items | BluBun5193 |
| star_wars.js | Various items from Star Wars by Disney | SeaPickle754 |
| sus.js | Among Us crewmate | Nv7 |
@@ -405,7 +406,6 @@
| triggerable_random_powders.js | Powders with different abilities, such as heating and cooling | Alice |
| troll.js | Various dumb elements that iterate randomly on the entire screen | Alice |
| WhisperingTheory.js | Powder and gas variant of heater and cooler | kaeud |
-| sensitive.js | Makes all elements sensitive to air | pogdog |
| Visual Effects |
From 58c12d10676c13c1d153b85032af482d3f232dd8 Mon Sep 17 00:00:00 2001
From: slweeb <91897291+slweeb@users.noreply.github.com>
Date: Sat, 11 Oct 2025 13:00:18 -0400
Subject: [PATCH 060/105] Update devsnacks.js
---
mods/devsnacks.js | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/mods/devsnacks.js b/mods/devsnacks.js
index e63e7a54..20734dc8 100644
--- a/mods/devsnacks.js
+++ b/mods/devsnacks.js
@@ -133,4 +133,28 @@ elements.applesauce = {
density: 750,
isFood: true,
hidden: true,
-}
\ No newline at end of file
+}
+
+if (!elements.mayo.reactions) elements.mayo.reactions = {};
+elements.mayo.reactions.ketchup = { elem1:"mayochup", elem2:"mayochup" }
+
+elements.mayochup = {
+ color: "#FDCC94",
+ behavior: behaviors.LIQUID,
+ reactions: {
+ "rust": { elem2:"iron", chance:0.005 },
+ "oxidized_copper": { elem2:"copper", chance:0.005 },
+ "baking_soda": { "elem1":"carbon_dioxide", elem2:"foam", chance:0.005, attr2:{"foam":3} },
+ "glue": { elem2:null, chance:0.005 },
+ "oil": { elem2:null, chance:0.005 },
+ "sap": { elem2:null, chance:0.005 }
+ },
+ viscosity: 26745.5,
+ tempHigh: 180.3,
+ stateHigh: ["carbon_dioxide","methane","steam","salt","sugar","steam","carbon_dioxide","methane"],
+ category:"liquids",
+ state: "liquid",
+ density: 1072.5,
+ isFood: true,
+ hidden: true
+};
\ No newline at end of file
From 1cf69119a49f5e57d444eaaf46e42608baff2a2a Mon Sep 17 00:00:00 2001
From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com>
Date: Sat, 11 Oct 2025 22:09:08 -0500
Subject: [PATCH 061/105] Update morechemistry.js
Adds support for solubility.js
---
mods/morechemistry.js | 146 ++++++++++++++++++++----------------------
1 file changed, 69 insertions(+), 77 deletions(-)
diff --git a/mods/morechemistry.js b/mods/morechemistry.js
index eb628940..5008b2e5 100644
--- a/mods/morechemistry.js
+++ b/mods/morechemistry.js
@@ -1,97 +1,78 @@
/*
-*Version 2.2.0
+*Version 2.2.1
*/
dependOn("orchidslibrary.js", ()=>{
elements.cloner.keyInput = "str:clone", elements.ecloner.keyInput = "str:clone", elements.slow_cloner.keyInput = "str:clone", elements.floating_cloner.keyInput = "str:clone";
let xDown = false;
- elements.copper_sulfate = {
- behavior: behaviors.POWDER,
- color: ["#4391fd","#004cfe"],
- reactions: {
- ant: {"elem2": "dead_bug"},
- fly: {"elem2": "dead_bug"},
- firefly: {"elem2": "dead_bug"},
- stink_bug: {"elem2": "dead_bug"},
- bee: {"elem2": "dead_bug"},
- termite: {"elem2": "dead_bug"},
- spider: {"elem2": "dead_bug"},
- plant: {"elem2": "dead_plant"},
- grass: {"elem2": "dead_plant"},
- algae: {"elem2": null},
- kelp: {"elem2": "water"},
- coral: {"elem2": "water"},
- mushroom_cap: {"elem2": null},
- mushroom_stalk: {"elem2": null},
- mushroom_gill: {"elem2": null},
- mushroom_spore: {"elem2": null},
- zinc: {"stain2": "#2A1210"},
- fire: {"elem1": null,"elem2": "poison_gas","chance": 0.1},
- sugar: {"elem1": "oxidized_copper","elem2": null,"color1": ["#CB3D3D","#A6292B","#6E1B1B"]},
- magnesium: {elem1: "copper", elem2: "epsom_salt"},
- wood: {stain2: "#043023"},
- },
- tempHigh: 110,
- fireColor: [
- "#91d106",
- "#feff97",
- "#248e01"
- ],
- state: "solid",
- density: 3600,
- hidden: true,
- category: "powders",
- id: 509,
- movable: true,
- properties: {
- anhydrous: false
- },
- tick: function(pixel){
- if(pixelTicks-pixel.start == 2 && xDown){
- pixel.anhydrous = true;
- let rgb = {r: 235, g: 247, b: 250};
+ elements.copper_sulfate.reactions = {
+ ant: {"elem2": "dead_bug"},
+ fly: {"elem2": "dead_bug"},
+ firefly: {"elem2": "dead_bug"},
+ stink_bug: {"elem2": "dead_bug"},
+ bee: {"elem2": "dead_bug"},
+ termite: {"elem2": "dead_bug"},
+ spider: {"elem2": "dead_bug"},
+ plant: {"elem2": "dead_plant"},
+ grass: {"elem2": "dead_plant"},
+ algae: {"elem2": null},
+ kelp: {"elem2": "water"},
+ coral: {"elem2": "water"},
+ mushroom_cap: {"elem2": null},
+ mushroom_stalk: {"elem2": null},
+ mushroom_gill: {"elem2": null},
+ mushroom_spore: {"elem2": null},
+ zinc: {"stain2": "#2A1210"},
+ fire: {"elem1": null,"elem2": "poison_gas","chance": 0.1},
+ sugar: {"elem1": "oxidized_copper","elem2": null,"color1": ["#CB3D3D","#A6292B","#6E1B1B"]},
+ magnesium: {elem1: "copper", elem2: "epsom_salt"},
+ wood: {stain2: "#043023"},
+ }
+ elements.copper_sulfate.tick = function(pixel){
+ if(pixelTicks-pixel.start == 2 && xDown){
+ pixel.anhydrous = true;
+ let rgb = {r: 235, g: 247, b: 250};
+ 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: 235, g: 247, b: 250};
+ 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: 67, g: 145, b: 253} : {r: 0, g: 76, b: 254};
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: 235, g: 247, b: 250};
+
+ } 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: 67, g: 145, b: 253} : {r: 0, g: 76, b: 254};
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: 67, g: 145, b: 253} : {r: 0, g: 76, b: 254};
- 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: 67, g: 145, b: 253} : {r: 0, g: 76, b: 254};
- 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.water.ignore = ["copper_sulphate"], elements.steam.ignore = ["copper_sulphate"], elements.pool_water.ignore = ["copper_sulphate", 'pool_ice'], elements.salt_water.ignore = ["copper_sulphate", 'salt_ice'], elements.sugar_water.ignore = ["copper_sulphate", 'sugar_ice'], elements.seltzer.ignore = ["copper_sulphate", 'seltzer_ice'],
@@ -806,6 +787,7 @@ dependOn("orchidslibrary.js", ()=>{
category: "salts",
state: "solid",
density: 3900,
+ solubility: {water: 3.5},
reactions: {
potassium: {elem1: "gold_coin", elem2: "potassium_salt", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("hydrogen", x, y);}}}, color1: ["#574000", "#705200", "#634900", "#755600"]},
sodium: {elem1: "gold_coin", elem2: "salt", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("hydrogen", x, y);}}}, color1: ["#574000", "#705200", "#634900", "#755600"]},
@@ -823,6 +805,7 @@ dependOn("orchidslibrary.js", ()=>{
state: "solid",
color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"],
density: 2320,
+ solubility: {water: 0.543, color: ["#7a9ff0", "#7aa4ff", "#729bf2", "#6f9cfc"]},
reactions: {
baking_soda: {elem1: "magnesium_carbonate", elem2: "salt"},
lye: {elem1: "magnesium_hydroxide", elem2: "salt"},
@@ -852,6 +835,7 @@ dependOn("orchidslibrary.js", ()=>{
behavior: behaviors.POWDER,
state: "solid",
color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"],
+ solubility: {water: 0.745, color: ["#7a9ff0", "#7aa4ff", "#729bf2", "#6f9cfc"]},
reactions: {
baking_soda: {elem1: "limestone", elem2: "salt"},
lye: {elem1: "slaked_lime", elem2: "salt"},
@@ -941,6 +925,7 @@ dependOn("orchidslibrary.js", ()=>{
state: "solid",
color: ["#ffffff", "#fcfcfc", "#ffffff", "#ededed"],
density: 2470,
+ solubility: {water: 0.8, color: ["#7a9ff0", "#7aa4ff", "#729bf2", "#6f9cfc"]},
reactions: {
water: {elem1: "gallium", elem2: "acid"},
steam: {elem1: "gallium", elem2: "acid_gas"},
@@ -972,6 +957,7 @@ dependOn("orchidslibrary.js", ()=>{
density: 2480,
tempHigh: 630,
stateHigh: ["chlorine", "aluminum"],
+ solubility: {water: 0.458, color: ["#7a9ff0", "#7aa4ff", "#729bf2", "#6f9cfc"]},
}
elements.acid.reactions.aluminum = {elem1: "hydrogen", elem2: "aluminum_chloride"};
elements.acid.reactions.purple_gold = {elem1: ["aluminum_chloride", "aluminum_chloride", "hydrogen"], elem2: "gold"};
@@ -1079,6 +1065,7 @@ dependOn("orchidslibrary.js", ()=>{
state: "solid",
category: "salts",
alias: "Mg(CH₃COO)₂",
+ solubility: {water: 0.53, color: ["#7a9ff0", "#7aa4ff", "#729bf2", "#6f9cfc"]},
reactions: {
acid: {elem1: "magnesium_chloride", elem2: "vinegar"},
baking_soda: {elem1: "magnesium_carbonate", elem2: "sodium_acetate"},
@@ -1095,6 +1082,7 @@ dependOn("orchidslibrary.js", ()=>{
state: "solid",
category: "salts",
alias: "Ca(CH₃COO)₂",
+ solubility: {water: 0.347, color: ["#7a9ff0", "#7aa4ff", "#729bf2", "#6f9cfc"]},
reactions: {
acid: {elem1: "calcium_chloride", elem2: "vinegar"},
baking_soda: {elem1: "limestone", elem2: "sodium_acetate"},
@@ -1113,6 +1101,7 @@ dependOn("orchidslibrary.js", ()=>{
state: "solid",
category: "salts",
alias: "CH₃COOK",
+ solubility: {water: 2.55, color: ["#7a9ff0", "#7aa4ff", "#729bf2", "#6f9cfc"]},
reactions: {
acid: {elem1: "potassium_salt", elem2: "vinegar"},
baking_soda: {elem1: "caustic_potash", elem2: "sodium_acetate"},
@@ -1128,6 +1117,7 @@ dependOn("orchidslibrary.js", ()=>{
state: "solid",
category: "salts",
alias: "Cu(CH₃COO)₂",
+ solubility: {water: 0.072},
reactions: {
sodium: {elem1: "copper", elem2: "sodium_acetate"},
potassium: {elem1: "copper", elem2: "potassium_acetate"},
@@ -1148,6 +1138,7 @@ dependOn("orchidslibrary.js", ()=>{
state: "solid",
category: "salts",
alias: "CuCl₂",
+ solubility: {water: 0.743},
reactions: {
sodium: {elem1: "copper", elem2: "sodium_acetate"},
potassium: {elem1: "copper", elem2: "potassium_acetate"},
@@ -1265,6 +1256,7 @@ dependOn("orchidslibrary.js", ()=>{
alias: "H₂PtCl₆",
tempHigh: 500,
stateHigh: ["acid_gas", "chlorine", "platinum", "platinum"],
+ solubility: {water: 1, },
reactions: {
sodium: {elem1: "salt", elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]},
potassium: {elem1: "potassium_salt", elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]},
From 63266938901374aef480915c90b77c343383f64f Mon Sep 17 00:00:00 2001
From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com>
Date: Sat, 11 Oct 2025 22:10:12 -0500
Subject: [PATCH 062/105] Create solubility.js
First release of solubility.js
---
mods/solubility.js | 286 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 286 insertions(+)
create mode 100644 mods/solubility.js
diff --git a/mods/solubility.js b/mods/solubility.js
new file mode 100644
index 00000000..28e8fc0e
--- /dev/null
+++ b/mods/solubility.js
@@ -0,0 +1,286 @@
+/*
+* Version 1.0.0
+*/
+
+dependOn("orchidslibrary.js", ()=>{
+ elements.water.reactions.salt = undefined;
+ elements.water.reactions.sugar = undefined;
+ elements.water.properties = {capacity: 100, elemsDissolved: {}};
+ elements.salt.solubility = {water: 0.36, color: ["#7ca3f7", "#7798e0", "#89abf5", "#96b8ff"]};
+ elements.sugar.solubility = {water: 2, visc: 850, color: ["#9bb0de", "#a8bbe3", "#a2b8e8", "#a7b7d9"]};
+ elements.lye.solubility = {water: 1.09, color: ["#7ca3f7", "#7798e0", "#89abf5", "#96b8ff"]};
+ elements.caustic_potash.solubility = {water: 1.1, color: ["#7ca3f7", "#7798e0", "#89abf5", "#96b8ff"]};
+ elements.potassium_salt.solubility = {water: 0.3397, color: ["#7ca3f7", "#7798e0", "#89abf5", "#96b8ff"]};
+ elements.borax.solubility = {water: 0.041, color: ["#658ce0", "#7299ed", "#7597e0", "#78a1fa"]};
+ elements.epsom_salt.solubility = {water: 0.351, color: ["#658ce0", "#7299ed", "#7597e0", "#78a1fa"]};
+ elements.sodium_acetate.solubility = {water: 1.233, color: ["#7ca3f7", "#7798e0", "#89abf5", "#96b8ff"]};
+ elements.baking_soda.solubility = {water: 0.097, color: ["#7ca3f7", "#7798e0", "#89abf5", "#96b8ff"]};
+ elements.copper_sulfate.solubility = {water: 0.32, color: ["#4a68f0", "#3358ff", "#2948d6", "#2146ed"]};
+ elements.lye.reactions.water = undefined;
+ elements.soap.reactions.water = undefined;
+ elements.ash.solubility = {water: 1.1, func: function(p1, p2){
+ if(p1.elemsDissolved.caustic_potash != undefined){
+ p1.elemsDissolved.caustic_potash += p1.elemsDissolved.ash;
+ p1.elemsDissolved.ash = 0;
+ } else {
+ p1.elemsDissolved.caustic_potash = p1.elemsDissolved.ash;
+ p1.elemsDissolved.ash = 0;
+ }
+ if(p2.dissolved >= 100){
+ changePixel(p2, getItem(["limestone", "quicklime", "charcoal", "dust", "dust"]));
+ p2.dissolved = undefined;
+ }
+ }};
+ elements.water.reactions.ash = undefined;
+ function getItem(obj){
+ let res;
+ if(Array.isArray(obj)){
+ res = obj[Math.round(Math.random()*obj.length)];
+ while(res == null){
+ res = obj[Math.round(Math.random()*obj.length)];
+ }
+ } else {
+ res = obj;
+ }
+ return res;
+ }
+ function aqueousReaction(p1, p2){
+ for(let elem in p1.elemsDissolved){
+ if(elements[elem].reactions != null && p2.element != "water" && elements[elem].reactions[p2.element] != undefined){
+
+ let r = elements[elem].reactions[p2.element];
+ 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;
+ }
+ let c = (r.chance != undefined) ? r.chance : 1;
+ c = c*((p1.elemsDissolved[elem]/100)/elements[elem].solubility.water);
+ if(Math.random() > c){
+ return false;
+ }
+ if(r.aqFunc){
+ r.aqFunc(p1, p2);
+ }
+ if(r.elem1 != undefined){
+ let e = getItem(r.elem1);
+ if(elements[e].solubility != undefined && elements[e].solubility.water != undefined){
+ p1.elemsDissolved[e] = p1.elemsDissolved[elem];
+ p1.elemsDissolved[elem] = undefined;
+ } else {
+ if(e === null){
+ deletePixel(p1.x, p1.y);
+ } else {
+ changePixel(p1, e);
+ }
+ }
+ }
+ if(r.elem2 != undefined){
+ changePixel(p2, getItem(r.elem2));
+ }
+ if(r.charge1){
+ p1.charge = r.charge1;
+ }
+ if(r.charge2){
+ p2.charge = r.charge2;
+ }
+ if(r.stain1){
+ stainPixel(p1,r.stain1,0.05);
+ }
+ if(r.stain2){
+ stainPixel(p2,r.stain2,0.05);
+ }
+ } else if (p2.element == "water"){
+ for(let e2 in p2.elemsDissolved){
+ if(elements[elem].reactions != undefined && elements[elem].reactions[e2] != undefined){
+ let r = elements[elem].reactions[e2];
+ 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;
+ }
+ let c = (r.chance != undefined) ? r.chance : 1;
+ c = c*((p1.elemsDissolved[elem]/100)/elements[elem].solubility.water);
+ if(Math.random() > c){
+ return false;
+ }
+ if(r.aqFunc){
+ r.aqFunc(p1, p2);
+ }
+ if(r.elem1 != undefined){
+ let e = getItem(r.elem1);
+ if(elements[e].solubility != undefined && elements[e].solubility.water != undefined){
+ p1.elemsDissolved[e] = p1.elemsDissolved[elem];
+ p1.elemsDissolved[elem] = undefined;
+ } else {
+ if(e === null){
+ deletePixel(p1.x, p1.y);
+ } else {
+ changePixel(p1, e);
+ }
+ }
+ }
+ if(r.elem2 != undefined){
+ let e = getItem(r.elem2);
+ if(elements[e].solubility != undefined && elements[e].solubility.water != undefined){
+ p2.elemsDissolved[e] = p1.elemsDissolved[elem];
+ p2.elemsDissolved[elem] = undefined;
+ } else {
+ if(e === null){
+ deletePixel(p2.x, p2.y);
+ } else {
+ changePixel(p2, e);
+ }
+ }
+ }
+ if(r.charge1){
+ p1.charge = r.charge1;
+ }
+ if(r.charge2){
+ p2.charge = r.charge2;
+ }
+ if(r.stain1){
+ stainPixel(p1,r.stain1,0.05);
+ }
+ if(r.stain2){
+ stainPixel(p2,r.stain2,0.05);
+ }
+ }
+ }
+ }
+ }
+ }
+ function updateColor(pixel){
+ let c = pixel.oColor;
+ for(let element in pixel.elemsDissolved){
+ //if(elements[element].solubility.color != undefined){
+ let color = (elements[element].solubility.color != undefined) ? getItem(elements[element].solubility.color) : getItem(elements[element].color);
+ /*if(Array.isArray(elements[element].solubility.color)){
+ color = elements[element].solubility.color[Math.round(Math.random()*elements[element].solubility.color.length)];
+ while(color == undefined){
+ color = elements[element].solubility.color[Math.round(Math.random()*elements[element].solubility.color.length)];
+ }
+ } else {
+ color = elements[element].solubility.color;
+ }*/
+ if(color.startsWith("#")){
+ color = hexToRGB(color);
+ } else if(color.startsWith("rgb(")){
+ color = getRGB(color);
+ }
+ c = interpolateRgb(getRGB(c), color, ((pixel.elemsDissolved[element]/100)/elements[element].solubility.water) || 0.01);
+ //console.log(rgb, color, getRGB(pixel.oColor), ((pixel.elemsDissolved[elem]/100)/elements[elem].solubility.water));
+
+ }
+ pixel.color = c;
+ //}
+ }
+ function solventTick(pixel) {
+ if(pixel.start = pixelTicks+5){
+ pixel.oColor = pixel.color;
+ }
+ pixel.capacity = (1+((pixel.temp-20)/80))*100;
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ let total = 0;
+ for(let elem in pixel.elemsDissolved){
+ total += pixel.capacity*((pixel.elemsDissolved[elem]/100)/elements[elem].solubility.water);
+ }
+ if(p2 != null){
+ aqueousReaction(pixel, p2);
+ }
+ if(p2 != null && total < pixel.capacity){
+ if(elements[p2.element].solubility != null && elements[p2.element].solubility[pixel.element] != null){
+ let solubilityObj = elements[p2.element].solubility;
+ p2.dissolved = (p2.dissolved == undefined) ? elements[p2.element].solubility[pixel.element] : p2.dissolved+elements[p2.element].solubility[pixel.element];
+
+ if(pixel.elemsDissolved[p2.element] == undefined){
+ pixel.elemsDissolved[p2.element] = elements[p2.element].solubility[pixel.element];
+ } else {
+ pixel.elemsDissolved[p2.element] += elements[p2.element].solubility[pixel.element];
+ }
+ updateColor(pixel, p2.element);
+ if(solubilityObj.func != undefined){
+ solubilityObj.func(pixel, p2);
+ }
+ if(p2.dissolved >= 100){
+ deletePixel(p2.x, p2.y);
+ }
+ }
+ } else if(total > (pixel.capacity+20) && p2 == null) {
+ let solArr = [], elemArr = [];
+ for(let elem in pixel.elemsDissolved){
+ elemArr.push(elem);
+ solArr.push(elements[elem].solubility[pixel.element]);
+ }
+ let index = solArr.indexOf(Math.min(...solArr));
+ if(isEmpty(x,y) && !outOfBounds(x,y)){
+ createPixel(elemArr[index], x, y);
+ let max = (pixel.elemsDissolved[elemArr[index]] > (total-pixel.capacity)) ? total-pixel.capacity : pixel.elemsDissolved[elemArr[index]];
+ pixelMap[x][y].dissolved = 100-max;
+ updateColor(pixel);
+ pixel.elemsDissolved[elemArr[index]] -= max;
+ }
+ }
+ else if (p2 != null && p2.element == "water"){
+ for(let elem in pixel.elemsDissolved){
+ if(p2.elemsDissolved[elem] == undefined) {p2.elemsDissolved[elem] = 0;};
+ if(p2.elemsDissolved[elem] > pixel.elemsDissolved[elem] && pixel.elemsDissolved[elem]/100 < elements[elem].solubility[pixel.element]){
+ p2.elemsDissolved[elem]--;
+ pixel.elemsDissolved[elem]++;
+ updateColor(pixel);
+ updateColor(p2);
+ } else if (p2.elemsDissolved[elem] < pixel.elemsDissolved[elem] && p2.elemsDissolved[elem]/100 < elements[elem].solubility[pixel.element]) {
+ p2.elemsDissolved[elem]++;
+ pixel.elemsDissolved[elem]--;
+ updateColor(pixel);
+ updateColor(p2);
+ }
+ }
+ }
+ }
+ if(pixel.temp >= elements[pixel.element].solventTempHigh){
+ let elem = null;
+ let num = Math.random();
+ if(elem === null){
+ for(let e in pixel.elemsDissolved){
+ if(num <= ((pixel.elemsDissolved[e]/100)/elements[e].solubility.water)){
+ elem = e;
+ }
+ }
+ }
+ elem = (elem == null) ? "steam" : elem;
+ changePixel(pixel, elem);
+ pixel.dissolvedElems = {};
+ }
+ }
+ behaviors.SOLVENT = function(pixel){
+ let visc = 0;
+ for(let elem in pixel.elemsDissolved){
+ if(elements[elem].solubility.visc != undefined){
+ visc += ((pixel.elemsDissolved[elem]/100)/elements[elem].solubility[pixel.element])*elements[elem].solubility.visc;
+ }
+ }
+ if(elements[pixel.element].viscosity != undefined){
+ visc = visc*(elements[pixel.element].viscosity/1000);
+ }
+ let chance = 1-(visc/1000);
+ let dir = (Math.random()
Date: Sat, 11 Oct 2025 22:15:31 -0500
Subject: [PATCH 063/105] Update mod-list.html
Added solubility.js under science and chemistry
---
mod-list.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/mod-list.html b/mod-list.html
index d66c98aa..d9ed8b19 100644
--- a/mod-list.html
+++ b/mod-list.html
@@ -243,6 +243,7 @@
| radioactive.js | Radioactive elements on the periodic table [WIP] | kaeud |
| random_rocks.js | Randomly generates rocks on game load | Alice |
| roseyiede.js | Several variants of a substance called roseyiede | Alice |
+| solubility.js | Adds solubility and a simple-to-use format for other mods to use with it | Orchid |
| some_tf_liquids.js | Various liquids from the Thermal Foundation Minecraft mod | Alice |
| stickystuff.js | Slime, Honey, and others can stick to other elements | Suss |
| the_ground.js | Several rocks, worldgen types, and gemstones | Alice |
From bb63d6b89f95ede168970ea8a9763c2483e0973c Mon Sep 17 00:00:00 2001
From: Cube14yt
Date: Wed, 15 Oct 2025 21:46:02 +0800
Subject: [PATCH 064/105] 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 065/105] 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 066/105] 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 bdaeb77cf546bfb3e9d7aba617a5f285e9a21835 Mon Sep 17 00:00:00 2001
From: slweeb <91897291+slweeb@users.noreply.github.com>
Date: Thu, 16 Oct 2025 14:20:17 -0400
Subject: [PATCH 067/105] .
---
mod-list.html | 2 ++
mods/rich_grain.js | 54 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 56 insertions(+)
create mode 100644 mods/rich_grain.js
diff --git a/mod-list.html b/mod-list.html
index d9ed8b19..754017b0 100644
--- a/mod-list.html
+++ b/mod-list.html
@@ -147,6 +147,7 @@
| mustard.js | Mustard and Mustard Seeds | R74n |
| rainbow_cursor.js | Makes your cursor multicolored | R74n |
| random_everything.js | Allows every element to be spawned with Random | R74n |
+| rich_grain.js | Changes pixel grain to create richer colors | R74n |
| smooth_water.js | Changes water mechanics so that it flows in one direction until it bounces off of something | R74n |
| souls.js | Human Souls, Ectoplasm, and Tombstones | R74n |
| spring.js | Many nature elements, like sakura trees, butterflies, beehives, and more | R74n |
@@ -430,6 +431,7 @@
| paint_event.js | Random event that randomly paints a circle | Alice |
| rainbow_tests.js | Variants of the rainbow element with different maths | Alice |
| real_light.js | Everything is dark unless hit with a photon (Light) pixel, hot, or glowing | Nekonico |
+| rich_grain.js | Changes pixel grain to create richer colors | R74n |
| shader_by_jayd.js | Glow around light elements | Jayd |
| Shroomboxels.js | Variant of acid_and_shapes.js that uses a different trigonometric function | Alice |
| singleColor.js | Elements pick one color each time they're drawn | stefanblox |
diff --git a/mods/rich_grain.js b/mods/rich_grain.js
new file mode 100644
index 00000000..93532af2
--- /dev/null
+++ b/mods/rich_grain.js
@@ -0,0 +1,54 @@
+pixelColorPick = function(pixel,customColor=null) {
+ let element = pixel.element;
+ let elementInfo = elements[element];
+ //if (elementInfo.behavior instanceof Array) {
+
+ if (pixel.charge && elementInfo.colorOn) {
+ customColor = elementInfo.colorOn;
+ }
+ let rgb;
+ if (customColor !== null) {
+ if (Array.isArray(customColor)) {
+ customColor = customColor[Math.floor(Math.random() * customColor.length)];
+ }
+ if (customColor.startsWith("#")) {
+ customColor = hexToRGB(customColor);
+ }
+ rgb = customColor;
+ }
+ else {
+ rgb = elements[element].colorObject; // {r, g, b}
+ // If rgb is an array, choose a random item
+ if (Array.isArray(rgb)) {
+ rgb = rgb[Math.floor(Math.random() * rgb.length)];
+ }
+ }
+ // Randomly darken or lighten the RGB color
+ let grain = 15;
+ if (elementInfo.grain !== undefined) { grain = grain * elementInfo.grain }
+ let coloroffset = Math.floor(Math.random() * (Math.random() > 0.5 ? -1 : 1) * Math.random() * grain);
+ let r = rgb.r + coloroffset;
+ let g = rgb.g + coloroffset;
+ let b = rgb.b + coloroffset;
+ // better_grain.js changes begin
+ let hsl = RGBToHSL([r,g,b]);
+ hsl[0] += coloroffset/1.5/255;
+ // console.log(hsl)
+ let rgb2 = HSLtoRGB(hsl);
+ r = Math.round(rgb2[0]); g = Math.round(rgb2[1]); b = Math.round(rgb2[2]);
+ // better_grain.js changes end
+ // Make sure the color is within the RGB range
+ r = Math.max(0, Math.min(255, r));
+ g = Math.max(0, Math.min(255, g));
+ b = Math.max(0, Math.min(255, b));
+ let color = "rgb("+r+","+g+","+b+")";
+
+ /*}
+ else {
+ var color = elementInfo.color;
+ if (Array.isArray(color)) {
+ color = color[Math.floor(Math.random() * color.length)];
+ }
+ }*/
+ return color;
+}
\ No newline at end of file
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 068/105] 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 069/105] 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 070/105] 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 071/105] 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.js | Chlorine Trifluoride | Alice |
| cmur.js | CharsonsModUno (???) | CharsonBurensen |
| debrisable.js | Expands the number of breakable elements, changes erosion, and adds way to craft certain elements from breaking other elements | Nekonico |
+| eklegems.js | Large amouunt of gemstones and other crystals | ekle24 |
| fire_extinguisher.js | Fire extinguisher blocks and realistic firefighting foam to put out nearly anything | Dr_Lego |
| fire_mod.js | Various properties to change fire behavior and radioactive fire | Alice |
| fire_slime.js | Pyrogenic version of slime | Alice |
-| Gemstones.js | Gemstones | Schweeny |
| glenn_gases.js | Most gases from the Glenn's Gases mod into Sandboxels | Alice |
| grav_mudstones.js | Various forms of mudstone with different gravities | Alice |
| halogen.js | The missing halogens | nousernamefound |
@@ -335,6 +335,7 @@
| colonies.js | Rockets that contain settlers to terraform a planet | Nekonico |
| crimson.js | Elements relating to the Crimson from Terraria | Alice |
| dogs.js | Simple dog and dog food | hedera-ivy |
+| eklegems.js | Large amouunt of gemstones and other crystals | ekle24 |
| fairy_chain.js | Way too many fairies to fey_and_more.js | Alice |
| fantastic_creatures.js | Various animals | Melecie |
| fantasy_elements.js | Fantasy creatures and substances | pixelegend4 |
From f09e9fe5de551ec1a3d4a9e406e24b928ff2993b Mon Sep 17 00:00:00 2001
From: eliwhitfield-dot
Date: Sun, 26 Oct 2025 12:33:16 -0600
Subject: [PATCH 072/105] 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 073/105] 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 074/105] 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 075/105] 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 076/105] 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 077/105] 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.js | Thiquovite and wall builders | CharsonBurensen |
| triggerable_random_powders.js | Powders with different abilities, such as heating and cooling | Alice |
| troll.js | Various dumb elements that iterate randomly on the entire screen | Alice |
+| war.js | adds two countries that fight over land and water | Taterbob |
| WhisperingTheory.js | Powder and gas variant of heater and cooler | kaeud |
@@ -527,4 +528,4 @@