From 73b98823d9c8c1de6996aa7c2ee894ab88ec4d6b Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Thu, 6 Mar 2025 20:27:21 -0800 Subject: [PATCH 1/6] Update sandboxels.js --- mods/sandboxels.js | 599 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 501 insertions(+), 98 deletions(-) diff --git a/mods/sandboxels.js b/mods/sandboxels.js index 72a993cd..22ca262b 100644 --- a/mods/sandboxels.js +++ b/mods/sandboxels.js @@ -16,6 +16,9 @@ window.addEventListener("load", () => { document.getElementById("elementButton-paper_screen")?.remove() document.getElementById("elementButton-body_screen")?.remove() document.getElementById("elementButton-head_screen")?.remove() + document.getElementById("elementButton-ash_screen")?.remove() + document.getElementById("elementButton-mud_screen")?.remove() + document.getElementById("elementButton-dirt_screen")?.remove() document.getElementById("elementButton-bird_screen")?.remove() document.getElementById("elementButton-fly_screen")?.remove() document.getElementById("elementButton-rat_screen")?.remove() @@ -25,15 +28,152 @@ window.addEventListener("load", () => { document.getElementById("elementButton-simulated_human")?.remove() }) +viewInfo[8] = { // Screen Thermal View + name: "screen therm", + pixel: function(pixel,ctx) { + if (elements[pixel.element].isScreen == true) { + var temp = pixel.dtemp; + if (temp < -50) {temp = -50} + if (temp > 6000) {temp = 6000} + // logarithmic scale, with coldest being 225 (-50 degrees) and hottest being 0 (6000 degrees) + var hue = Math.round(225 - (Math.log(temp+100)/Math.log(6000+100))*225); + if (hue < 0) {hue = 0} + if (hue > 225) {hue = 225} + drawSquare(ctx,"hsl("+hue+",100%,50%)",pixel.x,pixel.y) + } + else { + var a = (settings.textures !== 0) ? pixel.alpha : undefined; + if (((elements[pixel.element].isGas && elements[pixel.element].glow !== false) || elements[pixel.element].glow || pixel.glow) && pixel.glow !== false) { + drawPlus(ctx,pixel.color,pixel.x,pixel.y,undefined,a) + // if (isEmpty(pixel.x+1,pixel.y) || isEmpty(pixel.x-1,pixel.y) || isEmpty(pixel.x,pixel.y+1) || isEmpty(pixel.x,pixel.y-1)) {} + } + else { + drawSquare(ctx,pixel.color,pixel.x,pixel.y,undefined,a) + } + if (pixel.charge && view !== 2) { // Yellow glow on charge + if (!elements[pixel.element].colorOn) { + drawSquare(ctx,"rgba(255,255,0,0.5)",pixel.x,pixel.y); + } + } + } + } +} + +screenTemp = function(pixel) { + for (var i = 0; i < biCoords.length; i++) { + var x = pixel.x+biCoords[i][0]; + var y = pixel.y+biCoords[i][1]; + if (!isEmpty(x,y,true)) { + var newPixel = pixelMap[x][y]; + if (elements[newPixel.element].isScreen) { + // Skip if both temperatures are the same + if (pixel.dtemp === newPixel.dtemp || elements[newPixel.element].insulate === true) { + continue; + } + // Set both pixel temperatures to their average + var avg = (pixel.dtemp + newPixel.dtemp)/2; + pixel.dtemp = avg; + newPixel.dtemp = avg; + pixelTempCheck(pixel); + pixelTempCheck(newPixel); + } + } + } +} + +doScreenBurning = function(pixel) { + if (pixel.digburning) { // Burning + if (pixel.digburnStart === undefined) { pixel.digburnStart = pixelTicks } + var info = elements[pixel.element]; + if (!info.insulate) { pixel.dtemp += 1; } + if (pixel.dtemp < 0) { + pixel.digburning = undefined; + pixel.digburnStart = undefined; + return; + } + for (var i = 0; i < adjacentCoords.length; i++) { // Burn adjacent pixels + var x = pixel.x+adjacentCoords[i][0]; + var y = pixel.y+adjacentCoords[i][1]; + if (!isEmpty(x,y,true)) { + var newPixel = pixelMap[x][y]; + if (elements[newPixel.element].dburn && !newPixel.digburning) { + if (Math.floor(Math.random()*100) < elements[newPixel.element].dburn) { + newPixel.digburning = true; + newPixel.digburnStart = pixelTicks; + } + } + if (elements[newPixel.element].dextinguish && elements[pixel.element].digburning !== true) { + pixel.digburning = undefined; + pixel.digburnStart = undefined; + return; + } + } + } + + if ((pixelTicks - pixel.digburnStart > (info.digburnTime || 200)) && Math.floor(Math.random()*100)<(info.dburn || 10) && !(info.digburnTime === undefined && info.hardness >= 1)) { + var digburnInto = info.digburnInto; + if (digburnInto === undefined) { + digburnInto = "fire_screen"; + } + else if (digburnInto instanceof Array) { + digburnInto = digburnInto[Math.floor(Math.random()*digburnInto.length)]; + } + changePixel(pixel,digburnInto); + if (info.digfireColor !== undefined && digburnInto === "fire_screen") { + pixel.color = pixelColorPick(pixel,info.digfireColor); + } + else { + pixel.color = pixelColorPick(pixel) + } + } + else if (Math.floor(Math.random()*100)<10 && info.id !== elements.fire_screen.id && info.digfireElement !== null) { // Spawn fire + if (!isEmpty(pixel.x,pixel.y-1)) { + var firePixel = pixelMap[pixel.x][pixel.y-1] + if (firePixel.element === "sandboxels_screen") { + changePixel(firePixel,(info.digfireElement || "fire_screen")); + firePixel.dtemp = pixel.dtemp//+(pixelTicks - (pixel.digburnStart || 0)); + if (info.digfireColor !== undefined) { + firePixel.color = pixelColorPick(pixelMap[pixel.x][pixel.y-1],info.digfireColor); + } + } + else if (!isEmpty(pixel.x,pixel.y+1)) { + var firePixel = pixelMap[pixel.x][pixel.y+1] + if (firePixel.element === "sandboxels_screen") { + changePixel(firePixel,(info.digfireElement || "fire_screen")); + firePixel.dtemp = pixel.dtemp//+(pixelTicks - (pixel.burnStart || 0)); + if (info.digfireColor !== undefined) { + firePixel.color = pixelColorPick(pixelMap[pixel.x][pixel.y+1],info.digfireColor); + } + } + } + } + // same for below if top is blocked + else if (!isEmpty(pixel.x,pixel.y+1)) { + var firePixel = pixelMap[pixel.x][pixel.y+1] + if (firePixel.element === "sandboxels_screen") { + changePixel(firePixel,(info.digfireElement || "fire_screen")); + firePixel.dtemp = pixel.dtemp//+(pixelTicks - (pixel.burnStart || 0)); + if (info.digfireColor !== undefined) { + firePixel.color = pixelColorPick(pixelMap[pixel.x][pixel.y+1],info.digfireColor); + } + } + } + } + + } +} + elements.sandboxels_screen_off = { name:"screen", color: "#454545", behavior: behaviors.WALL, - behaviorOn: [ - "XX|XX|XX", - "XX|CH:sandboxels_screen|XX", - "XX|XX|XX", - ], + tick: function(pixel) { + if (pixel.dtemp !== 20) { pixel.dtemp = 20 } + if (pixel.charge) { pixel.charges = pixelTicks } + if (pixelTicks - 10 > pixel.charges) { + changePixel(pixel,"sandboxels_screen") + } + }, tempHigh: 1500, stateHigh: ["molten_glass","molten_glass","molten_glass","molten_gallium"], conduct: 1, @@ -50,11 +190,11 @@ elements.sandboxels_screen = { name:"screen", hidden:true, color: "#1D1D1D", - behavior: [ - "XX|XX|XX", - "XX|XX|XX", - "XX|XX|XX", - ], + tick: function(pixel) { + if (pixel.dtemp !== 20) { pixel.dtemp = 20 } + if (pixel.charge) { pixel.charge = 0 } + }, + conduct: 1, tempHigh: 1500, stateHigh: ["molten_glass","molten_glass","molten_glass","molten_gallium"], breakInto: ["glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","sand"], @@ -74,7 +214,7 @@ elements.simulated_heat = { ], tool: function(pixel) { if (elements[pixel.element].isScreen === true) { - pixel.dtemp += 1 + pixel.dtemp += 2 } }, insulate:true, @@ -92,7 +232,7 @@ elements.simulated_cool = { ], tool: function(pixel) { if (elements[pixel.element].isScreen === true) { - pixel.dtemp -= 1 + pixel.dtemp -= 2 } }, insulate:true, @@ -206,6 +346,7 @@ elements.sand_screen = { isMoving: true, isSolid: true, tick: function(pixel) { + screenTemp(pixel) if (!isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1]; if (newPixel.element === "sandboxels_screen") { @@ -214,8 +355,6 @@ elements.sand_screen = { changePixel(pixel,"sandboxels_screen"); } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2); - pixel.dtemp = newPixel.dtemp; if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -229,8 +368,6 @@ elements.sand_screen = { } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2); - pixel.dtemp = newPixel.dtemp; if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -245,8 +382,6 @@ elements.sand_screen = { } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2); - pixel.dtemp = newPixel.dtemp; if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -280,6 +415,117 @@ elements.wet_sand_screen = { isMoving: true, isSolid: true, tick: function(pixel) { + screenTemp(pixel) + if (!isEmpty(pixel.x,pixel.y+1,true)) { + var newPixel = pixelMap[pixel.x][pixel.y+1]; + if (newPixel.element === "sandboxels_screen") { + changePixel(newPixel,pixel.element); + newPixel.dtemp = pixel.dtemp; + changePixel(pixel,"sandboxels_screen"); + } + else if (elements[newPixel.element].isScreen === true) { + if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { + swapPixels(newPixel, pixel) + } + } + } + }, + state: "solid", + density: 1905, +} + +elements.dirt_screen = { + name:"screen", + hidden:true, + color: ["#76552b","#5c4221","#573c1a","#6b481e"], + behavior: [ + "XX|XX|XX", + "XX|XX|XX", + "XX|XX|XX", + ], + properties: { + dtemp: 20, + }, + tempHigh: 1500, + stateHigh: ["molten_glass","molten_glass","molten_glass","molten_gallium"], + breakInto: ["glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","dirt"], + tempLow: -45, + stateLow: "sandboxels_screen_off", + category: "simulation", + isScreen: true, + isMoving: true, + isSolid: true, + tick: function(pixel) { + screenTemp(pixel) + if (!isEmpty(pixel.x,pixel.y+1,true)) { + var newPixel = pixelMap[pixel.x][pixel.y+1]; + if (newPixel.element === "sandboxels_screen") { + changePixel(newPixel,pixel.element); + newPixel.dtemp = pixel.dtemp; + changePixel(pixel,"sandboxels_screen"); + } + else if (elements[newPixel.element].isScreen === true) { + if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { + swapPixels(newPixel, pixel) + } + } + if (Math.random() > 0.5 && !isEmpty(pixel.x+1,pixel.y+1,true) && !isEmpty(pixel.x,pixel.y+1,true)) { + newPixel = pixelMap[pixel.x+1][pixel.y+1]; + if (newPixel.element === "sandboxels_screen") { + changePixel(newPixel,pixel.element); + newPixel.dtemp = pixel.dtemp; + changePixel(pixel,"sandboxels_screen"); + + } + else if (elements[newPixel.element].isScreen === true) { + if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { + swapPixels(newPixel, pixel) + } + } + } + else if (!isEmpty(pixel.x-1,pixel.y+1,true) && !isEmpty(pixel.x,pixel.y+1,true)) { + newPixel = pixelMap[pixel.x-1][pixel.y+1]; + if (newPixel.element === "sandboxels_screen") { + changePixel(newPixel,pixel.element); + newPixel.dtemp = pixel.dtemp; + changePixel(pixel,"sandboxels_screen"); + + } + else if (elements[newPixel.element].isScreen === true) { + if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { + swapPixels(newPixel, pixel) + } + } + } + } + }, + state: "solid", + density: 1602, +} + +elements.mud_screen = { + name:"screen", + hidden:true, + color: "#382417", + behavior: [ + "XX|XX|XX", + "XX|XX|XX", + "XX|XX|XX", + ], + properties: { + dtemp: 20, + }, + tempHigh: 1500, + stateHigh: ["molten_glass","molten_glass","molten_glass","molten_gallium"], + breakInto: ["glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","mud"], + tempLow: -45, + stateLow: "sandboxels_screen_off", + category: "simulation", + isScreen: true, + isMoving: true, + isSolid: true, + tick: function(pixel) { + screenTemp(pixel) if (!isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1]; if (newPixel.element === "sandboxels_screen") { @@ -288,8 +534,6 @@ elements.wet_sand_screen = { changePixel(pixel,"sandboxels_screen"); } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2); - pixel.dtemp = newPixel.dtemp; if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -323,6 +567,7 @@ elements.rock_screen = { isMoving: true, isSolid: true, tick: function(pixel) { + screenTemp(pixel) if (!isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1]; if (newPixel.element === "sandboxels_screen") { @@ -331,8 +576,6 @@ elements.rock_screen = { changePixel(pixel,"sandboxels_screen"); } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2); - pixel.dtemp = newPixel.dtemp; if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -346,8 +589,6 @@ elements.rock_screen = { } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2); - pixel.dtemp = newPixel.dtemp; if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -362,8 +603,6 @@ elements.rock_screen = { } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2); - pixel.dtemp = newPixel.dtemp; if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -395,7 +634,12 @@ elements.saw_screen = { category: "simulation", isScreen: true, isMoving: true, + dburn: 25, + digburnTime: 150, + digburnInto: ["fire_screen","fire_screen","fire_screen","ash_screen"], tick: function(pixel) { + screenTemp(pixel) + doScreenBurning(pixel) if (!isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1]; if (newPixel.element === "sandboxels_screen") { @@ -404,8 +648,6 @@ elements.saw_screen = { changePixel(pixel,"sandboxels_screen"); } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2); - pixel.dtemp = newPixel.dtemp; if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -419,8 +661,6 @@ elements.saw_screen = { } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2); - pixel.dtemp = newPixel.dtemp; if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -435,8 +675,6 @@ elements.saw_screen = { } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2); - pixel.dtemp = newPixel.dtemp; if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -445,7 +683,75 @@ elements.saw_screen = { } }, state: "solid", - density: 1200, + density: 393, +} + +elements.ash_screen = { + name:"screen", + hidden:true, + color: ["#8c8c8c","#9c9c9c"], + behavior: [ + "XX|XX|XX", + "XX|XX|XX", + "XX|XX|XX", + ], + properties: { + dtemp: 20, + }, + tempHigh: 1500, + stateHigh: ["molten_glass","molten_glass","molten_glass","molten_gallium"], + breakInto: ["glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","sawdust"], + tempLow: -45, + stateLow: "sandboxels_screen_off", + category: "simulation", + isScreen: true, + isMoving: true, + tick: function(pixel) { + screenTemp(pixel) + if (!isEmpty(pixel.x,pixel.y+1,true)) { + var newPixel = pixelMap[pixel.x][pixel.y+1]; + if (newPixel.element === "sandboxels_screen") { + changePixel(newPixel,pixel.element); + newPixel.dtemp = pixel.dtemp; + changePixel(pixel,"sandboxels_screen"); + } + else if (elements[newPixel.element].isScreen === true) { + if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { + swapPixels(newPixel, pixel) + } + } + if (Math.random() > 0.5 && !isEmpty(pixel.x+1,pixel.y+1,true) && !isEmpty(pixel.x,pixel.y+1,true)) { + newPixel = pixelMap[pixel.x+1][pixel.y+1]; + if (newPixel.element === "sandboxels_screen") { + changePixel(newPixel,pixel.element); + newPixel.dtemp = pixel.dtemp; + changePixel(pixel,"sandboxels_screen"); + + } + else if (elements[newPixel.element].isScreen === true) { + if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { + swapPixels(newPixel, pixel) + } + } + } + else if (!isEmpty(pixel.x-1,pixel.y+1,true) && !isEmpty(pixel.x,pixel.y+1,true)) { + newPixel = pixelMap[pixel.x-1][pixel.y+1]; + if (newPixel.element === "sandboxels_screen") { + changePixel(newPixel,pixel.element); + newPixel.dtemp = pixel.dtemp; + changePixel(pixel,"sandboxels_screen"); + + } + else if (elements[newPixel.element].isScreen === true) { + if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { + swapPixels(newPixel, pixel) + } + } + } + } + }, + state: "solid", + density: 700, } elements.cellulose_screen = { @@ -469,6 +775,7 @@ elements.cellulose_screen = { isScreen: true, isMoving: true, tick: function(pixel) { + screenTemp(pixel) if (Math.random() > 0.2 && !isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1]; if (newPixel.element === "sandboxels_screen") { @@ -477,8 +784,6 @@ elements.cellulose_screen = { changePixel(pixel,"sandboxels_screen"); } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -524,8 +829,6 @@ elements.cellulose_screen = { changePixel(pixel,"sandboxels_screen"); } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -539,8 +842,6 @@ elements.cellulose_screen = { changePixel(pixel,"sandboxels_screen"); } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -573,6 +874,7 @@ elements.blood_screen = { isScreen: true, isMoving: true, tick: function(pixel) { + screenTemp(pixel) if (Math.random() > 0.2 && !isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1]; if (newPixel.element === "sandboxels_screen") { @@ -640,8 +942,6 @@ elements.blood_screen = { changePixel(pixel,"sandboxels_screen"); } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -659,8 +959,6 @@ elements.blood_screen = { changePixel(pixel,"sandboxels_screen"); } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -697,6 +995,7 @@ elements.water_screen = { isScreen: true, isMoving: true, tick: function(pixel) { + screenTemp(pixel) if (Math.random() > 0.2 && !isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1]; if (newPixel.element === "sandboxels_screen") { @@ -705,8 +1004,6 @@ elements.water_screen = { changePixel(pixel,"sandboxels_screen"); } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } @@ -714,6 +1011,10 @@ elements.water_screen = { changePixel(newPixel, "wet_sand_screen") changePixel(pixel, "sandboxels_screen") } + if (elements[newPixel.element].id === elements.dirt_screen.id) { + changePixel(newPixel, "mud_screen") + changePixel(pixel, "sandboxels_screen") + } if (elements[newPixel.element].id === elements.saw_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { changePixel(newPixel, "cellulose_screen") changePixel(pixel, "sandboxels_screen") @@ -734,6 +1035,10 @@ elements.water_screen = { changePixel(newPixel, "wet_sand_screen") changePixel(pixel, "sandboxels_screen") } + if (elements[newPixel.element].id === elements.dirt_screen.id) { + changePixel(newPixel, "mud_screen") + changePixel(pixel, "sandboxels_screen") + } if (elements[newPixel.element].id === elements.saw_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { changePixel(newPixel, "cellulose_screen") changePixel(pixel, "sandboxels_screen") @@ -755,6 +1060,10 @@ elements.water_screen = { changePixel(newPixel, "wet_sand_screen") changePixel(pixel, "sandboxels_screen") } + if (elements[newPixel.element].id === elements.dirt_screen.id) { + changePixel(newPixel, "mud_screen") + changePixel(pixel, "sandboxels_screen") + } if (elements[newPixel.element].id === elements.saw_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { changePixel(newPixel, "cellulose_screen") changePixel(pixel, "sandboxels_screen") @@ -770,11 +1079,17 @@ elements.water_screen = { changePixel(pixel,"sandboxels_screen"); } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } + if (elements[newPixel.element].id === elements.sand_screen.id) { + changePixel(newPixel, "wet_sand_screen") + changePixel(pixel, "sandboxels_screen") + } + if (elements[newPixel.element].id === elements.dirt_screen.id) { + changePixel(newPixel, "mud_screen") + changePixel(pixel, "sandboxels_screen") + } if (elements[newPixel.element].id === elements.saw_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { changePixel(newPixel, "cellulose_screen") changePixel(pixel, "sandboxels_screen") @@ -789,11 +1104,17 @@ elements.water_screen = { changePixel(pixel,"sandboxels_screen"); } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isMoving === true) { swapPixels(newPixel, pixel) } + if (elements[newPixel.element].id === elements.sand_screen.id) { + changePixel(newPixel, "wet_sand_screen") + changePixel(pixel, "sandboxels_screen") + } + if (elements[newPixel.element].id === elements.dirt_screen.id) { + changePixel(newPixel, "mud_screen") + changePixel(pixel, "sandboxels_screen") + } if (elements[newPixel.element].id === elements.saw_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { changePixel(newPixel, "cellulose_screen") changePixel(pixel, "sandboxels_screen") @@ -823,6 +1144,7 @@ elements.steam_screen = { isScreen: true, isMoving: true, tick: function(pixel) { + screenTemp(pixel) if (Math.random() > 0.5) { pixel.dir1 = 1 } @@ -843,8 +1165,6 @@ elements.steam_screen = { changePixel(pixel,"sandboxels_screen"); } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp } } if (pixel.dtemp < 100) { changePixel(pixel,"water_screen") } @@ -869,6 +1189,7 @@ elements.oxygen_screen = { isScreen: true, isMoving: true, tick: function(pixel) { + screenTemp(pixel) if (Math.random() > 0.5) { pixel.dir1 = 1 } @@ -887,8 +1208,6 @@ elements.oxygen_screen = { swapPixels(newPixel, pixel) } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp } } }, @@ -911,7 +1230,12 @@ elements.fire_screen = { category: "simulation", isScreen: true, isMoving: true, + digburning: true, + digburnTime: 25, + digburnInto: "smoke_screen", tick: function(pixel) { + screenTemp(pixel) + doScreenBurning(pixel) if (Math.random() > 0.975) { changePixel(pixel,"smoke_screen") } @@ -933,8 +1257,6 @@ elements.fire_screen = { swapPixels(newPixel, pixel) } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp } } if (pixel.dtemp < 100) { changePixel(pixel,"smoke_screen") } @@ -959,6 +1281,7 @@ elements.smoke_screen = { isScreen: true, isMoving: true, tick: function(pixel) { + screenTemp(pixel) if (Math.random() > 0.95) { changePixel(pixel,"sandboxels_screen") } @@ -980,8 +1303,6 @@ elements.smoke_screen = { swapPixels(newPixel, pixel) } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp } } if (pixel.dtemp > 1000) { changePixel(pixel,"fire_screen") } @@ -1011,7 +1332,13 @@ elements.body_screen = { digBreakInto: "blood_screen", isScreen: true, isSolid: true, + dburn: 10, + digburnTime: 250, + digburnInto: ["fire_screen","ash_screen","ash_screen"], tick: function(pixel) { + screenTemp(pixel) + doScreenBurning(pixel) + if (pixel.dtemp > 300) { changePixel(pixel,"ash_screen") } if (!isEmpty(pixel.x,pixel.y-1,true) && pixelMap[pixel.x][pixel.y-1].element === "head_screen") { var headPixel = pixelMap[pixel.x][pixel.y-1] if (!isEmpty(pixel.x,pixel.y+1,true)) { @@ -1135,8 +1462,6 @@ elements.body_screen = { changePixel(pixel,"sandboxels_screen"); } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp } } }, @@ -1163,7 +1488,13 @@ elements.head_screen = { digBreakInto: "blood_screen", isScreen: true, isSolid: true, + dburn: 10, + digburnTime: 250, + digburnInto: ["fire_screen","ash_screen","ash_screen"], tick: function(pixel) { + screenTemp(pixel) + doScreenBurning(pixel) + if (pixel.dtemp > 300) { changePixel(pixel,"ash_screen") } if (!isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1]; if (newPixel.element === "sandboxels_screen") { @@ -1179,8 +1510,6 @@ elements.head_screen = { } } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp } } }, @@ -1204,7 +1533,13 @@ elements.fly_screen = { isScreen: true, isMoving: true, isSolid: true, + dburn: 95, + digburnTime: 25, + digburnInto: ["fire_screen","ash_screen","ash_screen"], tick: function(pixel) { + screenTemp(pixel) + doScreenBurning(pixel) + if (pixel.dtemp > 100) { changePixel(pixel,"ash_screen") } if (outOfBounds(pixel.x+(pixel.dir),pixel.y) || isEmpty(pixel.x+(pixel.dir),pixel.y)) { if (pixel.dir === -1) { pixel.dir = 1 @@ -1219,8 +1554,6 @@ elements.fly_screen = { swapPixels(newPixel, pixel) } else if (elements[newPixel.element].isScreen === true || newPixel.element !== "sandboxels_screen") { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp if (pixel.dir === -1) { pixel.dir = 1 } @@ -1235,8 +1568,6 @@ elements.fly_screen = { swapPixels(newPixel, pixel) } else if (elements[newPixel.element].isScreen === true || newPixel.element !== "sandboxels_screen") { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp if (pixel.dir === -1) { pixel.dir = 1 } @@ -1268,7 +1599,13 @@ elements.bird_screen = { isScreen: true, isMoving: true, isSolid: true, + dburn: 2, + digburnTime: 100, + digburnInto: ["fire_screen","ash_screen","ash_screen"], tick: function(pixel) { + screenTemp(pixel) + doScreenBurning(pixel) + if (pixel.dtemp > 300) { changePixel(pixel,"ash_screen") } if (outOfBounds(pixel.x+(pixel.dir),pixel.y) || isEmpty(pixel.x+(pixel.dir),pixel.y)) { if (pixel.dir === -1) { pixel.dir = 1 @@ -1283,8 +1620,6 @@ elements.bird_screen = { swapPixels(newPixel, pixel) } else if (elements[newPixel.element].isScreen === true || newPixel.element !== "sandboxels_screen") { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp if (elements[newPixel.element].id === elements.fly_screen.id && Math.random() < 0.5) { changePixel(newPixel, "sandboxels_screen") } @@ -1363,41 +1698,45 @@ elements.rat_screen = { isScreen: true, isSolid: true, isMoving: true, + dburn: 2, + digburnTime: 100, + digburnInto: ["fire_screen","ash_screen","ash_screen"], tick: function(pixel) { - if (!isEmpty(pixel.x,pixel.y+1,true)) { - var newPixel = pixelMap[pixel.x][pixel.y+1] - if (newPixel.element === "sandboxels_screen") { - swapPixels(newPixel,pixel); + screenTemp(pixel) + doScreenBurning(pixel) + if (pixel.dtemp > 300) { changePixel(pixel,"ash_screen") } + if (!isEmpty(pixel.x,pixel.y+1,true)) { + var newPixel = pixelMap[pixel.x][pixel.y+1] + if (newPixel.element === "sandboxels_screen") { + swapPixels(newPixel,pixel); + } + else if (Math.random() < 0.25 && elements[newPixel.element].isScreen === true) { + if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { + swapPixels(newPixel, pixel) } - else if (Math.random() < 0.25 && elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp - if (elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { - swapPixels(newPixel, pixel) + if (Math.random() < 0.5 && !isEmpty(pixel.x+1,pixel.y,true) && !isEmpty(pixel.x+1,pixel.y-1,true)) { + var newPixel = pixelMap[pixel.x+1][pixel.y]; + var newUpPixel = pixelMap[pixel.x+1][pixel.y-1]; + if (newPixel.element === "sandboxels_screen" || elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { + swapPixels(newPixel,pixel); } - if (Math.random() < 0.5 && !isEmpty(pixel.x+1,pixel.y,true) && !isEmpty(pixel.x+1,pixel.y-1,true)) { - var newPixel = pixelMap[pixel.x+1][pixel.y]; - var newUpPixel = pixelMap[pixel.x+1][pixel.y-1]; - if (newPixel.element === "sandboxels_screen" || elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { - swapPixels(newPixel,pixel); - } - else if (newPixel.element !== "sandboxels_screen" && newUpPixel.element === "sandboxels_screen") { - swapPixels(newUpPixel,pixel); - } + else if (newPixel.element !== "sandboxels_screen" && newUpPixel.element === "sandboxels_screen") { + swapPixels(newUpPixel,pixel); } - else if (!isEmpty(pixel.x-1,pixel.y,true) && !isEmpty(pixel.x-1,pixel.y-1,true)) { - var newPixel = pixelMap[pixel.x-1][pixel.y]; - var newUpPixel = pixelMap[pixel.x-1][pixel.y-1]; - if (newPixel.element === "sandboxels_screen" || elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { - swapPixels(newPixel,pixel); - } - else if (newPixel.element !== "sandboxels_screen" && newUpPixel.element === "sandboxels_screen") { - swapPixels(newUpPixel,pixel); - } + } + else if (!isEmpty(pixel.x-1,pixel.y,true) && !isEmpty(pixel.x-1,pixel.y-1,true)) { + var newPixel = pixelMap[pixel.x-1][pixel.y]; + var newUpPixel = pixelMap[pixel.x-1][pixel.y-1]; + if (newPixel.element === "sandboxels_screen" || elements[newPixel.element].density < elements[pixel.element].density && elements[newPixel.element].isSolid !== true && elements[newPixel.element].isMoving === true) { + swapPixels(newPixel,pixel); + } + else if (newPixel.element !== "sandboxels_screen" && newUpPixel.element === "sandboxels_screen") { + swapPixels(newUpPixel,pixel); } } } - else if (Math.random() < 0.25) { + } + else if (Math.random() < 0.25) { if (Math.random() < 0.5 && !isEmpty(pixel.x+1,pixel.y,true) && !isEmpty(pixel.x+1,pixel.y-1,true)) { var newPixel = pixelMap[pixel.x+1][pixel.y]; var newUpPixel = pixelMap[pixel.x+1][pixel.y-1]; @@ -1440,6 +1779,7 @@ elements.ice_screen = { isScreen: true, isSolid: true, tick: function(pixel) { + screenTemp(pixel) if (pixel.dtemp > 5) { changePixel(pixel,"water_screen") } }, state: "solid", @@ -1457,7 +1797,12 @@ elements.wood_screen = { digBreakInto: "saw_screen", isScreen: true, isSolid: true, + dburn: 5, + digburnTime: 300, + digburnInto: ["fire_screen","ash_screen"], tick: function(pixel) { + screenTemp(pixel) + doScreenBurning(pixel) if (pixel.dtemp > 400) { changePixel(pixel,"fire_screen") } }, tempHigh: 1500, @@ -1480,7 +1825,12 @@ elements.paper_screen = { }, isScreen: true, isSolid: true, + dburn: 70, + digburnTime: 300, + digburnInto: ["fire_screen","fire_screen","fire_screen","fire_screen","fire_screen","fire_screen","ash_screen"], tick: function(pixel) { + screenTemp(pixel) + doScreenBurning(pixel) if (pixel.dtemp > 248) { changePixel(pixel,"fire_screen") } }, tempHigh: 1500, @@ -1526,6 +1876,45 @@ elements.simulated_sand = { desc: "Use on screen to place simulated sand." } +elements.simulated_dirt = { + color: ["#76552b","#5c4221","#573c1a","#6b481e"], + tool: function(pixel) { + if (elements[pixel.element].id === elements.sandboxels_screen.id) { + changePixel(pixel,"dirt_screen"); + } + }, + insulate:true, + canPlace: false, + category: "simulation", + desc: "Use on screen to place simulated dirt." +} + +elements.simulated_wet_sand = { + color: ["#a19348","#b5a85e"], + tool: function(pixel) { + if (elements[pixel.element].id === elements.sandboxels_screen.id) { + changePixel(pixel,"wet_sand_screen"); + } + }, + insulate:true, + canPlace: false, + category: "simulation", + desc: "Use on screen to place simulated wet sand." +} + +elements.simulated_mud = { + color: "#382417", + tool: function(pixel) { + if (elements[pixel.element].id === elements.sandboxels_screen.id) { + changePixel(pixel,"mud_screen"); + } + }, + insulate:true, + canPlace: false, + category: "simulation", + desc: "Use on screen to place simulated mud." +} + elements.simulated_rock = { color: ["#808080","#4f4f4f","#949494"], tool: function(pixel) { @@ -1539,6 +1928,19 @@ elements.simulated_rock = { desc: "Use on screen to place simulated sand." } +elements.simulated_ash = { + color: ["#8c8c8c","#9c9c9c"], + tool: function(pixel) { + if (elements[pixel.element].id === elements.sandboxels_screen.id) { + changePixel(pixel,"ash_screen"); + } + }, + insulate:true, + canPlace: false, + category: "simulation", + desc: "Use on screen to place simulated ash." +} + elements.simulated_water = { color: "#2167ff", tool: function(pixel) { @@ -1648,6 +2050,7 @@ elements.simulated_fire = { tool: function(pixel) { if (elements[pixel.element].id === elements.sandboxels_screen.id) { changePixel(pixel,"fire_screen"); + pixel.digburning = true } }, insulate:true, @@ -1970,9 +2373,9 @@ elements.digitalizer = { onSelect: function() { logMessage("Do not digitalize unregistered elements!"); }, - tempHigh: 1500, - stateHigh: ["molten_glass","molten_glass","molten_glass","molten_gallium"], - breakInto: ["glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","glass_shard","sand"], + tempHigh: 600, + stateHigh: ["molten_aluminum","molten_aluminum","molten_aluminum","molten_gallium"], + breakInto: ["metal_scrap"], tempLow: -80, stateLow: "glass_shard", category: "simulation", From 2ceb926304e7fee17418913be829c54766cf1ec2 Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Thu, 6 Mar 2025 21:23:20 -0800 Subject: [PATCH 2/6] Update true_flashbang.js --- mods/true_flashbang.js | 469 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 464 insertions(+), 5 deletions(-) diff --git a/mods/true_flashbang.js b/mods/true_flashbang.js index d30dff31..cc7c0d91 100644 --- a/mods/true_flashbang.js +++ b/mods/true_flashbang.js @@ -1,6 +1,19 @@ // by nekonico -elements.true_flashbang = { +isEven = function(num) { + if (num % 2) { + return (true) + } + else {return (false)} +} + +isOdd = function(num) { + if (num % 1) { + return (true) + } + else {return (false)} +} +elements.flashy_flashbang = { color: "#65665c", onSelect: function() { logMessage("Caution: If you have epilepsy or any similar vision issues, do not place this element for your own safety."); @@ -16,7 +29,8 @@ elements.true_flashbang = { tempHigh: 1455.5, stateHigh: "molten_steel", excludeRandom: true, - cooldown: defaultCooldown + cooldown: defaultCooldown, + maxSize: 1, } elements.flashbang_flash = { @@ -36,7 +50,7 @@ elements.flashbang_flash = { done = false; } } - if ((Math.random() < 0.75 && done) || pixel.alpha < 0.05) { + if ((Math.random() < 0.75 && done) || pixel.alpha < 0.060784314) { deletePixel(pixel.x, pixel.y) settings.bg = "#000000"; } @@ -57,5 +71,450 @@ elements.flashbang_flash = { insulate: true, hidden: true, noMix: true, - excludeRandom: true -} \ No newline at end of file + excludeRandom: true, + cooldown: defaultCooldown, + maxSize: 1, +} + +elements.flashy_nuke = { + onSelect: function() { + logMessage("Caution: If you have epilepsy or any similar vision issues, do not place this element for your own safety."); + }, + color: "#534636", + behavior: [ + "XX|XX|XX", + "XX|XX|XX", + "M2|M1 AND EX:65>plasma,plasma,plasma,plasma,radiation,rad_steam,plasma,plasma,plasma,plasma,radiation,rad_steam,plasma,plasma,plasma,plasma,radiation,rad_steam,nuke_flash|M2", + ], + category: "weapons", + state: "solid", + density: 1500, + excludeRandom: true, + cooldown: defaultCooldown, + maxSize: 1, +} + +elements.nuke_flash = { + color: "#ffffff", + properties: { + delay: 60 + }, + tick: function(pixel) { + settings.bg = pixel.color; + let hex = Math.round(255 * pixel.alpha).toString(16); + pixel.color = `#${hex}ff${hex}` // credits to therazzler in the R74n discord for this code :3 + var done = true; + if (pixel.delay) { + var delayR = pixel.delay % 1; + var delay = pixel.delay - delayR; + if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) { + done = false; + } + } + if ((Math.random() < 0.75 && done) || pixel.alpha < 0.061) { + changePixel(pixel, "nuke_overflash") + } + if (pixel.delay) { + pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay) + } + doHeat(pixel); + + }, + category: "energy", + temp: 40, + tempLow: -270, + stateLow: ["liquid_light",null], + state: "gas", + category: "energy", + density: 0.00001, + ignoreAir: true, + insulate: true, + hidden: true, + noMix: true, + excludeRandom: true, + cooldown: defaultCooldown, + maxSize: 1, +} + +elements.nuke_overflash = { + color: "#00ff00", + properties: { + delay: 40 + }, + tick: function(pixel) { + settings.bg = pixel.color; + let hex = Math.round(255 * pixel.alpha).toString(16); + pixel.color = `#00${hex}00` // credits to therazzler in the R74n discord for this code :3 + var done = true; + if (pixel.delay) { + var delayR = pixel.delay % 1; + var delay = pixel.delay - delayR; + if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) { + done = false; + } + } + if ((Math.random() < 0.75 && done) || pixel.alpha < 0.061) { + deletePixel(pixel.x, pixel.y) + settings.bg = "#000000"; + } + if (pixel.delay) { + pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay) + } + doHeat(pixel); + + }, + category: "energy", + temp: 40, + tempLow: -270, + stateLow: ["liquid_light",null], + state: "gas", + category: "energy", + density: 0.00001, + ignoreAir: true, + insulate: true, + hidden: true, + noMix: true, + excludeRandom: true, + cooldown: defaultCooldown, + maxSize: 1, +} + +elements.flashy_h_bomb = { + onSelect: function() { + logMessage("Caution: If you have epilepsy or any similar vision issues, do not place this element for your own safety."); + }, + color: "#533636", + behavior: [ + "XX|XX|XX", + "XX|XX|XX", + "M2|M1 AND EX:90>plasma,plasma,plasma,plasma,fire,plasma,plasma,plasma,plasma,fire,plasma,plasma,plasma,plasma,fire,h_bomb_flash|M2", + ], + category: "weapons", + state: "solid", + density: 1600, + excludeRandom: true, + alias: "hydrogen bomb", + cooldown: defaultCooldown, + maxSize: 1, +} + +elements.h_bomb_flash = { + color: "#ffffff", + properties: { + delay: 30 + }, + tick: function(pixel) { + settings.bg = pixel.color; + let hex = Math.round(255 * pixel.alpha).toString(16); + pixel.color = `#ff${hex}${hex}` // credits to therazzler in the R74n discord for this code :3 + var done = true; + if (pixel.delay) { + var delayR = pixel.delay % 1; + var delay = pixel.delay - delayR; + if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) { + done = false; + } + } + if ((Math.random() < 0.75 && done) || pixel.alpha < 0.061) { + changePixel(pixel, "h_bomb_overflash") + } + if (pixel.delay) { + pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay) + } + doHeat(pixel); + + }, + category: "energy", + temp: 40, + tempLow: -270, + stateLow: ["liquid_light",null], + state: "gas", + category: "energy", + density: 0.00001, + ignoreAir: true, + insulate: true, + hidden: true, + noMix: true, + excludeRandom: true, + cooldown: defaultCooldown, + maxSize: 1, +} + +elements.h_bomb_overflash = { + color: "#ff0000", + properties: { + delay: 70 + }, + tick: function(pixel) { + settings.bg = pixel.color; + let hex = Math.round(255 * pixel.alpha).toString(16); + pixel.color = `#${hex}0000` // credits to therazzler in the R74n discord for this code :3 + var done = true; + if (pixel.delay) { + var delayR = pixel.delay % 1; + var delay = pixel.delay - delayR; + if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) { + done = false; + } + } + if ((Math.random() < 0.75 && done) || pixel.alpha < 0.061) { + deletePixel(pixel.x, pixel.y) + settings.bg = "#000000"; + } + if (pixel.delay) { + pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay) + } + doHeat(pixel); + + }, + category: "energy", + temp: 40, + tempLow: -270, + stateLow: ["liquid_light",null], + state: "gas", + category: "energy", + density: 0.00001, + ignoreAir: true, + insulate: true, + hidden: true, + noMix: true, + excludeRandom: true, + cooldown: defaultCooldown, + maxSize: 1, +} + +elements.flashy_firework = { + color: "#c44f45", + onSelect: function() { + logMessage("Caution: If you have epilepsy or any similar vision issues, do not place this element for your own safety."); + }, + tick: function(pixel) { + if ((pixel.temp > 1000 || pixel.charge) && !pixel.burning) { + pixel.burning = true; + pixel.burnStart = pixelTicks; + } + if (pixel.burning) { + if (!tryMove(pixel, pixel.x, pixel.y-1)) { + // tryMove again to the top left or top right + tryMove(pixel, pixel.x+(Math.random() < 0.5 ? -1 : 1), pixel.y-1); + } + if (pixelTicks-pixel.burnStart > 50 && Math.random() < 0.1) { + if (Math.random() > 0.5) { + explodeAt(pixel.x, pixel.y, 10, "fw_flash1"); + } + else if (Math.random() > 0.5) { + explodeAt(pixel.x, pixel.y, 10, "fw_flash2"); + } + else if (Math.random() > 0.5) { + explodeAt(pixel.x, pixel.y, 10, "fw_flash3"); + } + else { + explodeAt(pixel.x, pixel.y, 10, "fw_flash4"); + } + } + } + else { + if (!tryMove(pixel, pixel.x, pixel.y+1)) { + // tryMove again to the bottom left or bottom right + tryMove(pixel, pixel.x+(Math.random() < 0.5 ? -1 : 1), pixel.y+1); + } + } + doDefaults(pixel); + }, + burn: 90, + burnTime: 100, + properties: { burning:false }, + burning: true, + density: 2000, + conduct: 1, + state: "solid", + category: "weapons" +} + +elements.fw_flash1 = { + properties: { + delay: 5 + }, + color: ["#ff00ff","#00ffff"], + behavior: [ + "XX|XX|XX", + "XX|DL%25|M2", + "XX|M2|M1", + ], + tick: function(pixel) { + let hex = Math.round(255 * pixel.alpha).toString(16); + pixel.color = `#00${hex}${hex}` + settings.bg = pixel.color; + var done = true; + if (pixel.delay) { + var delayR = pixel.delay % 1; + var delay = pixel.delay - delayR; + if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) { + done = false; + } + } + if ((Math.random() < 0.75 && done) || pixel.alpha < 0.062) { + changePixel(pixel, "smoke") + settings.bg = "#000000"; + } + if (pixel.delay) { + pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay) + } + doHeat(pixel); + + }, + burning: true, + burnInto: "ash", + burnTime: 100, + fireElement: ["smoke","smoke","smoke","smoke","carbon_dioxide"], + rotatable: true, + temp: 649, + tempLow: 0, + stateLow: "carbon_dioxide", + category: "energy", + hidden: true, + state: "gas", + density: 700, + alias: "flashy firework ember" +} + +elements.fw_flash2 = { + properties: { + delay: 5 + }, + color: ["#ff00ff","#00ffff"], + behavior: [ + "XX|XX|XX", + "XX|DL%25|M2", + "XX|M2|M1", + ], + tick: function(pixel) { + let hex = Math.round(255 * pixel.alpha).toString(16); + pixel.color = `#${hex}00${hex}` + settings.bg = pixel.color; + var done = true; + if (pixel.delay) { + var delayR = pixel.delay % 1; + var delay = pixel.delay - delayR; + if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) { + done = false; + } + } + if ((Math.random() < 0.75 && done) || pixel.alpha < 0.062) { + changePixel(pixel, "smoke") + settings.bg = "#000000"; + } + if (pixel.delay) { + pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay) + } + doHeat(pixel); + + }, + burning: true, + burnInto: "ash", + burnTime: 100, + fireElement: ["smoke","smoke","smoke","smoke","carbon_dioxide"], + rotatable: true, + temp: 649, + tempLow: 0, + stateLow: "carbon_dioxide", + category: "energy", + hidden: true, + state: "gas", + density: 700, + alias: "flashy firework ember" +} + +elements.fw_flash3 = { + properties: { + delay: 5 + }, + color: ["#ff00ff","#00ffff"], + behavior: [ + "XX|XX|XX", + "XX|DL%25|M2", + "XX|M2|M1", + ], + tick: function(pixel) { + let hex = Math.round(255 * pixel.alpha).toString(16); + pixel.color = `#00${hex}00` + settings.bg = pixel.color; + var done = true; + if (pixel.delay) { + var delayR = pixel.delay % 1; + var delay = pixel.delay - delayR; + if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) { + done = false; + } + } + if ((Math.random() < 0.75 && done) || pixel.alpha < 0.062) { + changePixel(pixel, "smoke") + settings.bg = "#000000"; + } + if (pixel.delay) { + pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay) + } + doHeat(pixel); + + }, + burning: true, + burnInto: "ash", + burnTime: 100, + fireElement: ["smoke","smoke","smoke","smoke","carbon_dioxide"], + rotatable: true, + temp: 649, + tempLow: 0, + stateLow: "carbon_dioxide", + category: "energy", + hidden: true, + state: "gas", + density: 700, + alias: "flashy firework ember" +} + +elements.fw_flash4 = { + properties: { + delay: 5 + }, + color: "#ff00ff", + behavior: [ + "XX|XX|XX", + "XX|DL%25|M2", + "XX|M2|M1", + ], + tick: function(pixel) { + let hex = Math.round(255 * pixel.alpha).toString(16); + pixel.color = `#0000${hex}` + settings.bg = pixel.color; + var done = true; + if (pixel.delay) { + var delayR = pixel.delay % 1; + var delay = pixel.delay - delayR; + if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) { + done = false; + } + } + if ((Math.random() < 0.75 && done) || pixel.alpha < 0.062) { + changePixel(pixel, "smoke") + settings.bg = "#000000"; + } + if (pixel.delay) { + pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay) + } + doHeat(pixel); + + }, + burning: true, + burnInto: "ash", + burnTime: 100, + fireElement: ["smoke","smoke","smoke","smoke","carbon_dioxide"], + rotatable: true, + temp: 649, + tempLow: 0, + stateLow: "carbon_dioxide", + category: "energy", + hidden: true, + state: "gas", + density: 700, + alias: "flashy firework ember" +} From 12f0fa1908434dbfaff98eeaf3cf4a86f68d8650 Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Sat, 15 Mar 2025 12:17:28 -0700 Subject: [PATCH 3/6] Update sandboxels.js --- mods/sandboxels.js | 269 ++++++++++++--------------------------------- 1 file changed, 69 insertions(+), 200 deletions(-) diff --git a/mods/sandboxels.js b/mods/sandboxels.js index 22ca262b..714cf5f0 100644 --- a/mods/sandboxels.js +++ b/mods/sandboxels.js @@ -1,4 +1,4 @@ -/* mod by nekonico */ +// mod by nekonico window.addEventListener("load", () => { document.getElementById("elementButton-sandboxels_screen")?.remove() @@ -10,7 +10,7 @@ window.addEventListener("load", () => { document.getElementById("elementButton-steam_screen")?.remove() document.getElementById("elementButton-ice_screen")?.remove() document.getElementById("elementButton-wood_screen")?.remove() - document.getElementById("elementButton-saw_screen")?.remove() + document.getElementById("elementButton-sawdust_screen")?.remove() document.getElementById("elementButton-cellulose_screen")?.remove() document.getElementById("elementButton-blood_screen")?.remove() document.getElementById("elementButton-paper_screen")?.remove() @@ -170,7 +170,7 @@ elements.sandboxels_screen_off = { tick: function(pixel) { if (pixel.dtemp !== 20) { pixel.dtemp = 20 } if (pixel.charge) { pixel.charges = pixelTicks } - if (pixelTicks - 10 > pixel.charges) { + if (pixelTicks - 1 > pixel.charges) { changePixel(pixel,"sandboxels_screen") } }, @@ -190,6 +190,7 @@ elements.sandboxels_screen = { name:"screen", hidden:true, color: "#1D1D1D", + behavior: behaviors.WALL, tick: function(pixel) { if (pixel.dtemp !== 20) { pixel.dtemp = 20 } if (pixel.charge) { pixel.charge = 0 } @@ -308,12 +309,14 @@ elements.simulated_human = { if (!isEmpty(pixel.x, pixel.y+1),true && pixelMap[pixel.x][pixel.y+1].element === "sandboxels_screen") { var newPixel = pixelMap[pixel.x][pixel.y+1]; newPixel.element = "body_screen"; + newPixel.dir = 1 pixel.element = "head_screen"; } else if (!isEmpty(pixel.x, pixel.y-1),true && pixelMap[pixel.x][pixel.y-1].element === "sandboxels_screen") { var newPixel = pixelMap[pixel.x][pixel.y-1]; newPixel.element = "head_screen"; pixel.element = "body_screen"; + pixel.dir = 1 } else { changePixel(pixel, "sandboxels_screen"); @@ -614,7 +617,7 @@ elements.rock_screen = { density: 2550, } -elements.saw_screen = { +elements.sawdust_screen = { name:"screen", hidden:true, color: ["#dec150","#c7b15a"], @@ -638,6 +641,7 @@ elements.saw_screen = { digburnTime: 150, digburnInto: ["fire_screen","fire_screen","fire_screen","ash_screen"], tick: function(pixel) { + if (pixel.dtemp > 400) { changePixel(pixel,"fire_screen") } screenTemp(pixel) doScreenBurning(pixel) if (!isEmpty(pixel.x,pixel.y+1,true)) { @@ -775,6 +779,7 @@ elements.cellulose_screen = { isScreen: true, isMoving: true, tick: function(pixel) { + if (pixel.dtemp > 99) { changePixel(pixel,"paper_screen") } screenTemp(pixel) if (Math.random() > 0.2 && !isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1]; @@ -847,7 +852,6 @@ elements.cellulose_screen = { } } } - if (pixel.dtemp > 99) { changePixel(pixel,"paper_screen") } }, state: "solid", density: 1500, @@ -874,6 +878,7 @@ elements.blood_screen = { isScreen: true, isMoving: true, tick: function(pixel) { + if (pixel.dtemp > 99) { changePixel(pixel,"steam_screen") } screenTemp(pixel) if (Math.random() > 0.2 && !isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1]; @@ -968,7 +973,6 @@ elements.blood_screen = { } } } - if (pixel.dtemp > 99) { changePixel(pixel,"steam_screen") } }, state: "solid", density: 1060, @@ -995,6 +999,8 @@ elements.water_screen = { isScreen: true, isMoving: true, tick: function(pixel) { + if (pixel.dtemp < 0) { changePixel(pixel,"ice_screen") } + if (pixel.dtemp > 99) { changePixel(pixel,"steam_screen") } screenTemp(pixel) if (Math.random() > 0.2 && !isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1]; @@ -1015,7 +1021,7 @@ elements.water_screen = { changePixel(newPixel, "mud_screen") changePixel(pixel, "sandboxels_screen") } - if (elements[newPixel.element].id === elements.saw_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { + if (elements[newPixel.element].id === elements.sawdust_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { changePixel(newPixel, "cellulose_screen") changePixel(pixel, "sandboxels_screen") } @@ -1039,7 +1045,7 @@ elements.water_screen = { changePixel(newPixel, "mud_screen") changePixel(pixel, "sandboxels_screen") } - if (elements[newPixel.element].id === elements.saw_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { + if (elements[newPixel.element].id === elements.sawdust_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { changePixel(newPixel, "cellulose_screen") changePixel(pixel, "sandboxels_screen") } @@ -1064,7 +1070,7 @@ elements.water_screen = { changePixel(newPixel, "mud_screen") changePixel(pixel, "sandboxels_screen") } - if (elements[newPixel.element].id === elements.saw_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { + if (elements[newPixel.element].id === elements.sawdust_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { changePixel(newPixel, "cellulose_screen") changePixel(pixel, "sandboxels_screen") } @@ -1090,7 +1096,7 @@ elements.water_screen = { changePixel(newPixel, "mud_screen") changePixel(pixel, "sandboxels_screen") } - if (elements[newPixel.element].id === elements.saw_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { + if (elements[newPixel.element].id === elements.sawdust_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { changePixel(newPixel, "cellulose_screen") changePixel(pixel, "sandboxels_screen") } @@ -1115,14 +1121,12 @@ elements.water_screen = { changePixel(newPixel, "mud_screen") changePixel(pixel, "sandboxels_screen") } - if (elements[newPixel.element].id === elements.saw_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { + if (elements[newPixel.element].id === elements.sawdust_screen.id || elements[newPixel.element].id === elements.paper_screen.id) { changePixel(newPixel, "cellulose_screen") changePixel(pixel, "sandboxels_screen") } } } - if (pixel.dtemp < 0) { changePixel(pixel,"ice_screen") } - if (pixel.dtemp > 99) { changePixel(pixel,"steam_screen") } }, state: "solid", density: 997, @@ -1144,6 +1148,7 @@ elements.steam_screen = { isScreen: true, isMoving: true, tick: function(pixel) { + if (pixel.dtemp < 100) { changePixel(pixel,"water_screen") } screenTemp(pixel) if (Math.random() > 0.5) { pixel.dir1 = 1 @@ -1167,7 +1172,6 @@ elements.steam_screen = { else if (elements[newPixel.element].isScreen === true) { } } - if (pixel.dtemp < 100) { changePixel(pixel,"water_screen") } }, state: "solid", density: 0.6, @@ -1234,6 +1238,7 @@ elements.fire_screen = { digburnTime: 25, digburnInto: "smoke_screen", tick: function(pixel) { + if (pixel.dtemp < 100) { changePixel(pixel,"smoke_screen") } screenTemp(pixel) doScreenBurning(pixel) if (Math.random() > 0.975) { @@ -1259,7 +1264,6 @@ elements.fire_screen = { else if (elements[newPixel.element].isScreen === true) { } } - if (pixel.dtemp < 100) { changePixel(pixel,"smoke_screen") } }, state: "solid", density: 0.1, @@ -1281,6 +1285,7 @@ elements.smoke_screen = { isScreen: true, isMoving: true, tick: function(pixel) { + if (pixel.dtemp > 1000) { changePixel(pixel,"fire_screen") } screenTemp(pixel) if (Math.random() > 0.95) { changePixel(pixel,"sandboxels_screen") @@ -1305,7 +1310,6 @@ elements.smoke_screen = { else if (elements[newPixel.element].isScreen === true) { } } - if (pixel.dtemp > 1000) { changePixel(pixel,"fire_screen") } }, state: "solid", density: 1.292, @@ -1315,13 +1319,10 @@ elements.body_screen = { color: ["#A8A7AB","#878689"], name:"screen", hidden:true, - behavior: [ - "XX|CH:sandboxels_screen>blood_screen%0.1|XX", - "XX|XX|XX", - "XX|XX|XX", - ], + behavior: behaviors.WALL, properties: { dtemp: 20, + dir: 1, }, tempHigh: 1500, stateHigh: ["molten_glass","molten_glass","molten_glass","molten_gallium"], @@ -1336,130 +1337,60 @@ elements.body_screen = { digburnTime: 250, digburnInto: ["fire_screen","ash_screen","ash_screen"], tick: function(pixel) { + if (pixel.dtemp > 300) { changePixel(pixel,"ash_screen") } screenTemp(pixel) doScreenBurning(pixel) - if (pixel.dtemp > 300) { changePixel(pixel,"ash_screen") } if (!isEmpty(pixel.x,pixel.y-1,true) && pixelMap[pixel.x][pixel.y-1].element === "head_screen") { var headPixel = pixelMap[pixel.x][pixel.y-1] + if (Math.random() > 0.9) { + pixel.dir *= -1 + } if (!isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1] if (newPixel.element === "sandboxels_screen") { - changePixel(newPixel,"body_screen") - newPixel.dtemp = pixel.dtemp - changePixel(pixel,"head_screen") - pixel.dtemp = headPixel.dtemp + swapPixels(headPixel, pixel) + swapPixels(newPixel, pixel) } else if (elements[newPixel.element].isScreen === true) { - newPixel.dtemp = ((pixel.dtemp + newPixel.dtemp) / 2) - pixel.dtemp = newPixel.dtemp - if (Math.random() < 0.1 && !isEmpty(pixel.x+1,pixel.y,true) && !isEmpty(pixel.x+1,pixel.y-1,true)) { - var newPixel = pixelMap[pixel.x+1][pixel.y]; - var newHeadPixel = pixelMap[pixel.x+1][pixel.y-1]; + if (Math.random() < 0.5 && !isEmpty(pixel.x+pixel.dir,pixel.y,true) && !isEmpty(pixel.x+pixel.dir,pixel.y-1,true)) { + var newPixel = pixelMap[pixel.x+pixel.dir][pixel.y]; + var newHeadPixel = pixelMap[pixel.x+pixel.dir][pixel.y-1]; if (newPixel.element === "sandboxels_screen" && newHeadPixel.element === "sandboxels_screen") { - changePixel(pixel,"sandboxels_screen"); - changePixel(headPixel,"sandboxels_screen"); - changePixel(newPixel,"body_screen"); - changePixel(newHeadPixel,"head_screen"); - newPixel.dtemp = pixel.dtemp; - newHeadPixel.dtemp = headPixel.dtemp; + swapPixels(newPixel, pixel) + swapPixels(headPixel, newHeadPixel) } else if (newPixel.element !== "sandboxels_screen" && newHeadPixel.element === "sandboxels_screen") { var newPixel2 = newHeadPixel; var newHeadPixel2 = pixelMap[newHeadPixel.x][newHeadPixel.y-1]; if (newPixel2.element === "sandboxels_screen" && newHeadPixel2.element === "sandboxels_screen") { - changePixel(pixel,"sandboxels_screen"); - changePixel(headPixel,"sandboxels_screen"); - changePixel(newPixel2,"body_screen"); - changePixel(newHeadPixel2,"head_screen"); - newPixel2.dtemp = pixel.dtemp; - newHeadPixel2.dtemp = headPixel.dtemp; - } - } - } - else if (!isEmpty(pixel.x-1,pixel.y,true) && !isEmpty(pixel.x-1,pixel.y-1,true)) { - var newPixel = pixelMap[pixel.x-1][pixel.y]; - var newHeadPixel = pixelMap[pixel.x-1][pixel.y-1]; - if (newPixel.element === "sandboxels_screen" && newHeadPixel.element === "sandboxels_screen") { - changePixel(pixel,"sandboxels_screen"); - changePixel(headPixel,"sandboxels_screen"); - changePixel(newPixel,"body_screen"); - changePixel(newHeadPixel,"head_screen"); - newPixel.dtemp = pixel.dtemp; - newHeadPixel.dtemp = headPixel.dtemp; - } - else if (newPixel.element !== "sandboxels_screen" && newHeadPixel.element === "sandboxels_screen") { - var newPixel2 = newHeadPixel; - var newHeadPixel2 = pixelMap[newHeadPixel.x][newHeadPixel.y-1]; - if (newPixel2.element === "sandboxels_screen" && newHeadPixel2.element === "sandboxels_screen") { - changePixel(pixel,"sandboxels_screen"); - changePixel(headPixel,"sandboxels_screen"); - changePixel(newPixel2,"body_screen"); - changePixel(newHeadPixel2,"head_screen"); - newPixel2.dtemp = pixel.dtemp; - newHeadPixel2.dtemp = headPixel.dtemp; + swapPixels(newPixel2, pixel) + swapPixels(headPixel, newHeadPixel2) } } } } } - else if (Math.random() < 0.05 && !isEmpty(pixel.x+1,pixel.y,true) && !isEmpty(pixel.x+1,pixel.y-1,true)) { - var newPixel = pixelMap[pixel.x+1][pixel.y]; - var newHeadPixel = pixelMap[pixel.x+1][pixel.y-1]; + else if (Math.random() < 0.5 && !isEmpty(pixel.x+pixel.dir,pixel.y,true) && !isEmpty(pixel.x+pixel.dir,pixel.y-1,true)) { + var newPixel = pixelMap[pixel.x+pixel.dir][pixel.y]; + var newHeadPixel = pixelMap[pixel.x+pixel.dir][pixel.y-1]; if (newPixel.element === "sandboxels_screen" && newHeadPixel.element === "sandboxels_screen") { - changePixel(pixel,"sandboxels_screen"); - changePixel(headPixel,"sandboxels_screen"); - changePixel(newPixel,"body_screen"); - changePixel(newHeadPixel,"head_screen"); - newPixel.dtemp = pixel.dtemp; - newHeadPixel.dtemp = headPixel.dtemp; + swapPixels(newPixel, pixel) + swapPixels(headPixel, newHeadPixel) } else if (newPixel.element !== "sandboxels_screen" && newHeadPixel.element === "sandboxels_screen") { var newPixel2 = newHeadPixel; var newHeadPixel2 = pixelMap[newHeadPixel.x][newHeadPixel.y-1]; if (newPixel2.element === "sandboxels_screen" && newHeadPixel2.element === "sandboxels_screen") { - changePixel(pixel,"sandboxels_screen"); - changePixel(headPixel,"sandboxels_screen"); - changePixel(newPixel2,"body_screen"); - changePixel(newHeadPixel2,"head_screen"); - newPixel2.dtemp = pixel.dtemp; - newHeadPixel2.dtemp = headPixel.dtemp; + swapPixels(newPixel2, pixel) + swapPixels(headPixel, newHeadPixel2) } } } - else if (!isEmpty(pixel.x-1,pixel.y,true) && !isEmpty(pixel.x-1,pixel.y-1,true)) { - var newPixel = pixelMap[pixel.x-1][pixel.y]; - var newHeadPixel = pixelMap[pixel.x-1][pixel.y-1]; - if (newPixel.element === "sandboxels_screen" && newHeadPixel.element === "sandboxels_screen") { - changePixel(pixel,"sandboxels_screen"); - changePixel(headPixel,"sandboxels_screen"); - changePixel(newPixel,"body_screen"); - changePixel(newHeadPixel,"head_screen"); - newPixel.dtemp = pixel.dtemp; - newHeadPixel.dtemp = headPixel.dtemp; - } - else if (newPixel.element !== "sandboxels_screen" && newHeadPixel.element === "sandboxels_screen") { - var newPixel2 = newHeadPixel; - var newHeadPixel2 = pixelMap[newHeadPixel.x][newHeadPixel.y-1]; - if (newPixel2.element === "sandboxels_screen" && newHeadPixel2.element === "sandboxels_screen") { - changePixel(pixel,"sandboxels_screen"); - changePixel(headPixel,"sandboxels_screen"); - changePixel(newPixel2,"body_screen"); - changePixel(newHeadPixel2,"head_screen"); - newPixel2.dtemp = pixel.dtemp; - newHeadPixel2.dtemp = headPixel.dtemp; - } - } - } - if (!isEmpty(pixel.x,pixel.y-2,true) && pixelMap[pixel.x][pixel.y-2].element === "head_screen") { - changePixel(pixelMap[pixel.x][pixel.y-2],"sandboxels_screen"); - } } else if (!isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1]; if (newPixel.element === "sandboxels_screen") { - changePixel(newPixel,"body_screen"); - newPixel.dtemp = pixel.dtemp; - changePixel(pixel,"sandboxels_screen"); + swapPixels(newPixel, pixel) } else if (elements[newPixel.element].isScreen === true) { } @@ -1471,11 +1402,7 @@ elements.head_screen = { color: ["#46433F","#47443C","#4D483D"], name:"screen", hidden:true, - behavior: [ - "XX|XX|XX", - "XX|XX|XX", - "XX|XX|XX", - ], + behavior: behaviors.WALL, properties: { dtemp: 20, }, @@ -1492,9 +1419,9 @@ elements.head_screen = { digburnTime: 250, digburnInto: ["fire_screen","ash_screen","ash_screen"], tick: function(pixel) { + if (pixel.dtemp > 300) { changePixel(pixel,"ash_screen") } screenTemp(pixel) doScreenBurning(pixel) - if (pixel.dtemp > 300) { changePixel(pixel,"ash_screen") } if (!isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1]; if (newPixel.element === "sandboxels_screen") { @@ -1537,9 +1464,9 @@ elements.fly_screen = { digburnTime: 25, digburnInto: ["fire_screen","ash_screen","ash_screen"], tick: function(pixel) { + if (pixel.dtemp > 100) { changePixel(pixel,"ash_screen") } screenTemp(pixel) doScreenBurning(pixel) - if (pixel.dtemp > 100) { changePixel(pixel,"ash_screen") } if (outOfBounds(pixel.x+(pixel.dir),pixel.y) || isEmpty(pixel.x+(pixel.dir),pixel.y)) { if (pixel.dir === -1) { pixel.dir = 1 @@ -1603,9 +1530,9 @@ elements.bird_screen = { digburnTime: 100, digburnInto: ["fire_screen","ash_screen","ash_screen"], tick: function(pixel) { + if (pixel.dtemp > 300) { changePixel(pixel,"ash_screen") } screenTemp(pixel) doScreenBurning(pixel) - if (pixel.dtemp > 300) { changePixel(pixel,"ash_screen") } if (outOfBounds(pixel.x+(pixel.dir),pixel.y) || isEmpty(pixel.x+(pixel.dir),pixel.y)) { if (pixel.dir === -1) { pixel.dir = 1 @@ -1702,9 +1629,9 @@ elements.rat_screen = { digburnTime: 100, digburnInto: ["fire_screen","ash_screen","ash_screen"], tick: function(pixel) { + if (pixel.dtemp > 300) { changePixel(pixel,"ash_screen") } screenTemp(pixel) doScreenBurning(pixel) - if (pixel.dtemp > 300) { changePixel(pixel,"ash_screen") } if (!isEmpty(pixel.x,pixel.y+1,true)) { var newPixel = pixelMap[pixel.x][pixel.y+1] if (newPixel.element === "sandboxels_screen") { @@ -1779,8 +1706,8 @@ elements.ice_screen = { isScreen: true, isSolid: true, tick: function(pixel) { - screenTemp(pixel) if (pixel.dtemp > 5) { changePixel(pixel,"water_screen") } + screenTemp(pixel) }, state: "solid", density: 1200, @@ -1794,16 +1721,16 @@ elements.wood_screen = { properties: { dtemp: 20, }, - digBreakInto: "saw_screen", + digBreakInto: "sawdust_screen", isScreen: true, isSolid: true, dburn: 5, digburnTime: 300, digburnInto: ["fire_screen","ash_screen"], tick: function(pixel) { + if (pixel.dtemp > 400) { changePixel(pixel,"fire_screen") } screenTemp(pixel) doScreenBurning(pixel) - if (pixel.dtemp > 400) { changePixel(pixel,"fire_screen") } }, tempHigh: 1500, stateHigh: ["molten_glass","molten_glass","molten_glass","molten_gallium"], @@ -1829,9 +1756,9 @@ elements.paper_screen = { digburnTime: 300, digburnInto: ["fire_screen","fire_screen","fire_screen","fire_screen","fire_screen","fire_screen","ash_screen"], tick: function(pixel) { + if (pixel.dtemp > 248) { changePixel(pixel,"fire_screen") } screenTemp(pixel) doScreenBurning(pixel) - if (pixel.dtemp > 248) { changePixel(pixel,"fire_screen") } }, tempHigh: 1500, stateHigh: ["molten_glass","molten_glass","molten_glass","molten_gallium"], @@ -2076,7 +2003,7 @@ elements.simulated_sawdust = { color: ["#dec150","#c7b15a"], tool: function(pixel) { if (elements[pixel.element].id === elements.sandboxels_screen.id) { - changePixel(pixel,"saw_screen"); + changePixel(pixel,"sawdust_screen"); } }, insulate:true, @@ -2384,89 +2311,31 @@ elements.digitalizer = { var newPixel = pixelMap[pixel.x][pixel.y-1]; var screen = pixelMap[pixel.x][pixel.y+1]; if (screen.element === "sandboxels_screen") { - if (newPixel.element === "sand") { - changePixel(screen,"sand_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "ice") { - changePixel(screen,"ice_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "steam") { - changePixel(screen,"steam_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "water") { - changePixel(screen,"water_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "wood") { - changePixel(screen,"wood_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "paper") { - changePixel(screen,"paper_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "sawdust") { - changePixel(screen,"saw_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "cellulose") { - changePixel(screen,"cellulose_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "blood") { + var newElement = newPixel.element + var newElementName = `${newElement}_screen` + if (newElement === "body") { changePixel(screen,"blood_screen"); deletePixel(newPixel.x,newPixel.y) } - else if (newPixel.element === "body") { + else if (newElement === "head") { changePixel(screen,"blood_screen"); deletePixel(newPixel.x,newPixel.y) } - else if (newPixel.element === "head") { - changePixel(screen,"blood_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "rock") { - changePixel(screen,"rock_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "wall") { - changePixel(screen,"wall_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "fly") { - changePixel(screen,"fly_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "bird") { - changePixel(screen,"bird_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "rat") { - changePixel(screen,"rat_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "fire") { - changePixel(screen,"fire_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "smoke") { - changePixel(screen,"smoke_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (newPixel.element === "oxygen") { - changePixel(screen,"oxygen_screen"); - deletePixel(newPixel.x,newPixel.y) - } - else if (!isEmpty(pixel.x,pixel.y-2,true) && newPixel.element === "suited_body") { + else if (!isEmpty(pixel.x,pixel.y-2,true) && newElement === "suited_body") { var headPixel = pixelMap[pixel.x][pixel.y-2]; - if (headPixel.element === "suited_head" && newPixel.element === "suited_body") { + if (headPixel.element === "suited_head" && newElement === "suited_body") { changePixel(screen,"simulated_human"); deletePixel(newPixel.x,newPixel.y-1) deletePixel(newPixel.x,newPixel.y) } + else { + changePixel(screen,"blood_screen"); + deletePixel(newPixel.x,newPixel.y) + } + } + else if (elements[newElementName]) { + changePixel(screen,newElementName); + deletePixel(newPixel.x,newPixel.y) } else { changePixel(screen,"malware"); @@ -2482,7 +2351,7 @@ elements.digitalizer = { if (!elements.malware.reactions) { elements.malware.reactions = {} } elements.malware.reactions.sandboxels_screen = { "elem2": ["sand_screen","sandboxels_screen_off","sandboxels_screen_off","malware"] }; - elements.malware.reactions.saw_screen = { "elem2": ["wall_screen","wall_screen","sandboxels_screen_off","malware"] }; + elements.malware.reactions.sawdust_screen = { "elem2": ["wall_screen","wall_screen","sandboxels_screen_off","malware"] }; elements.malware.reactions.sand_screen = { "elem2": ["paper_screen","paper_screen","sandboxels_screen_off","malware"] }; elements.malware.reactions.rock_screen = { "elem2": ["wood_screen","wood_screen","sandboxels_screen_off","malware"] }; elements.malware.reactions.cellulose_screen = { "elem2": ["blood_screen","blood_screen","sandboxels_screen_off","malware"] }; @@ -2492,7 +2361,7 @@ if (!elements.malware.reactions) { elements.malware.reactions = {} } elements.malware.reactions.ice_screen = { "elem2": ["cellulose_screen","cellulose_screen","sandboxels_screen_off","malware"] }; elements.malware.reactions.wood_screen = { "elem2": ["rock_screen","rock_screen","sandboxels_screen_off","malware"] }; elements.malware.reactions.paper_screen = { "elem2": ["sand_screen","sand_screen","sandboxels_screen_off","malware"] }; - elements.malware.reactions.wall_screen = { "elem2": ["saw_screen","saw_screen","sandboxels_screen_off","malware"] }; + elements.malware.reactions.wall_screen = { "elem2": ["sawdust_screen","sawdust_screen","sandboxels_screen_off","malware"] }; elements.head.tick = function(pixel) { doHeat(pixel); From c1b0b1957ae911eebab5f6d76d83a0c3a6da0e72 Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Sat, 15 Mar 2025 12:17:59 -0700 Subject: [PATCH 4/6] Update debrisable.js --- mods/debrisable.js | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/mods/debrisable.js b/mods/debrisable.js index da9ae4fd..bf9ade73 100644 --- a/mods/debrisable.js +++ b/mods/debrisable.js @@ -125,7 +125,7 @@ elements.microplastic_water = { "mudstone": { elem2: ["mud","mud","clay"], chance: 0.00035 }, "glass_shard": { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.0005 }, "rad_shard": { elem2: "glass_pebble", color2:"#AECB83", chance: 0.00025 }, - "glass": { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.00005 }, + "glass": { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.0000025 }, "rad_glass": { elem2: "glass_pebble", color2:"#AECB83", chance: 0.000025 }, "rust": { elem1:"dirty_water", elem2: "rust_dust", chance: 0.0025 }, "plastic": { elem2: ["microplastic",null,null], chance: 0.00005 }, @@ -186,6 +186,7 @@ elements.silver_debris = { color: "#cacaca", behavior: behaviors.SUPPORT, tempHigh: 961.8, + stateHigh: "molten_silver", category: "powders", density: 9297, conduct: 0.99, @@ -216,6 +217,7 @@ elements.iron_debris = { }, breakInto: "iron_dust", tempHigh: 1538, + stateHigh: "molten_iron", category: "powders", density: 7660, conduct: 0.47, @@ -248,6 +250,7 @@ elements.steel_debris = { }, breakInto: "iron_debris", tempHigh: 1455.5, + stateHigh: "molten_steel", category: "powders", density: 7750, conduct: 0.42, @@ -1060,7 +1063,7 @@ elements.water.reactions.glass_shard = { elem2: "glass_pebble", color2:"#7BAECB" elements.water.reactions.rad_shard = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.00025 } -elements.water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.00005 } +elements.water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.0000025 } elements.water.reactions.rad_glass = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.000025 } @@ -1068,7 +1071,7 @@ elements.water.reactions.rust = { elem1:"dirty_water", elem2: "rust_dust", chanc elements.water.reactions.rust_dust = { elem1:"dirty_water", chance: 0.0025 } -elements.water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.00005 } +elements.water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.000005 } elements.salt_water.reactions.mudstone = { elem2: ["mud","mud","clay"], chance: 0.00035 } @@ -1076,7 +1079,7 @@ elements.salt_water.reactions.glass_shard = { elem2: "glass_pebble", color2:"#7B elements.salt_water.reactions.rad_shard = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.00025 } -elements.salt_water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.00005 } +elements.salt_water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.0000025 } elements.salt_water.reactions.rad_glass = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.000025 } @@ -1084,7 +1087,7 @@ elements.salt_water.reactions.rust = { elem1:"dirty_water", elem2: "rust_dust", elements.salt_water.reactions.rust_dust = { elem1:"dirty_water", chance: 0.0025 } -elements.salt_water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.00005 } +elements.salt_water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.000005 } elements.sugar_water.reactions.mudstone = { elem2: ["mud","mud","clay"], chance: 0.00035 } @@ -1092,7 +1095,7 @@ elements.sugar_water.reactions.glass_shard = { elem2: "glass_pebble", color2:"#7 elements.sugar_water.reactions.rad_shard = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.00025 } -elements.sugar_water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.00005 } +elements.sugar_water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.0000025 } elements.sugar_water.reactions.rad_glass = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.000025 } @@ -1100,7 +1103,7 @@ elements.sugar_water.reactions.rust = { elem1:"dirty_water", elem2: "rust_dust", elements.sugar_water.reactions.rust_dust = { elem1:"dirty_water", chance: 0.0025 } -elements.sugar_water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.00005 } +elements.sugar_water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.000005 } elements.dirty_water.reactions.mudstone = { elem2: ["mud","mud","clay"], chance: 0.00035 } @@ -1108,13 +1111,13 @@ elements.dirty_water.reactions.glass_shard = { elem2: "glass_pebble", color2:"#7 elements.dirty_water.reactions.rad_shard = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.00025 } -elements.dirty_water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.00005 } +elements.dirty_water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.0000025 } elements.dirty_water.reactions.rad_glass = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.000025 } elements.dirty_water.reactions.rust = { elem1:"dirty_water", elem2: "rust_dust", chance: 0.0025 } -elements.dirty_water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.00005 } +elements.dirty_water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.000005 } elements.smash.tool = function(pixel) { let old = pixel.element; From fcfc361d91a01fedb473f9a3fd14b66b4372046d Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Sun, 16 Mar 2025 10:15:52 -0700 Subject: [PATCH 5/6] human safety mod --- mods/human_friendly_design.js | 899 ++++++++++++++++++++++++++++++++++ 1 file changed, 899 insertions(+) create mode 100644 mods/human_friendly_design.js diff --git a/mods/human_friendly_design.js b/mods/human_friendly_design.js new file mode 100644 index 00000000..716961dd --- /dev/null +++ b/mods/human_friendly_design.js @@ -0,0 +1,899 @@ +elements.human.tick = function(pixel) { + if (isEmpty(pixel.x, pixel.y+1)) { + createPixel("body", pixel.x, pixel.y+1); + var color = pixel.color; + changePixel(pixel,"head"); + pixel.color = color; + if (pixel.bodyColor) { + pixelMap[pixel.x][pixel.y+1].color = pixel.bodyColor; + } + } + 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"); + if (pixel.bodyColor) { + pixel.color = pixel.bodyColor; + } + } +} + +elements.body.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 === "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) { + changePixel(pixel,"rotten_meat"); + } + return + } + + // Find the head + if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head") { + var head = pixelMap[pixel.x][pixel.y-1]; + if (head.dead) { // If head is dead, kill body + pixel.dead = head.dead; + } + else if (head.panic > 0) { + pixel.panic = head.panic; + delete head.panic; + } + } + else { var head = null } + if (head && Math.random() < 0.25) { + let y = Math.random() < 0.5 ? 0 : -1; + for (let x = 1; x < 10; x++) { + let x2 = pixel.x+(x*pixel.dir); + let y2 = pixel.y+y; + if (!isEmpty(x2,y2,true)) { + let seenPixel = pixelMap[x2][y2]; + if (elements.human.reactions[seenPixel.element] && elements.human.reactions[seenPixel.element].attr1 && elements.human.reactions[seenPixel.element].attr1.panic) { + pixel.panic += elements.human.reactions[seenPixel.element].attr1.panic; + pixel.dir *= -1; + break; + } + else if (seenPixel.dead || seenPixel.temp > 200) { + pixel.panic += 5; + pixel.dir *= -1; + if (seenPixel.panic) delete seenPixel.panic; + break; + } + } + } + } + if (pixel.burning) { + pixel.panic += 0.1; + if (head && pixelTicks-pixel.burnStart > 240) { + pixel.color = head.color; + } + } + if (pixel.charge) { + pixel.panic += 1; + } + else if (pixel.panic > 0) { + pixel.panic -= 0.1; + if (pixel.panic < 0) { pixel.panic = 0; } + else if (pixel.panic > 50) { pixel.panic = 50; } + } + + if (isEmpty(pixel.x, pixel.y-1)) { + // create blood if decapitated 10% chance + if (Math.random() < 0.1 && !pixel.charge) { + createPixel("blood", pixel.x, pixel.y-1); + // set dead to true 15% chance + if (Math.random() < 0.15) { + pixel.dead = pixelTicks; + } + } + } + else if (head === null) { return } + else if (Math.random() < 0.1*(isEmpty(pixel.x, pixel.y+1) ? 1 : 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 (hitPixel.element === "body" || hitPixel.element === "head" && hitPixel.panic < pixel.panic) { + // interact with other human + hitPixel.panic = pixel.panic; + } + } + } + // 15% chance to change direction + if (Math.random() < 0.15 || !moved) { + pixel.dir *= -1; + } + // homeostasis + if (pixel.temp > 37) { pixel.temp -= 1; } + else if (pixel.temp < 37) { pixel.temp += 1; } + } + +} + +elements.portal_in.tick = function(pixel) { + // if (Math.random() > 0.1) return; + if (!ticktemp.portal_out) ticktemp.portal_out = {}; + let channel = parseInt(pixel.channel) || 0; + if (!ticktemp.portal_out[channel]) { + ticktemp.portal_out[channel] = currentPixels.filter((p) => { + return elements[p.element].id === elements.portal_out.id && ( + isEmpty(p.x,p.y+1) || isEmpty(p.x,p.y-1) || + isEmpty(p.x+1,p.y) || isEmpty(p.x-1,p.y) + ) && + (parseInt(p.channel) || 0) === parseInt(channel) + }); + } + if (ticktemp.portal_out[channel].length) { + shuffleArray(squareCoordsShuffle); + let r; + for (var i = 0; i < squareCoordsShuffle.length; i++) { + var coord = squareCoordsShuffle[i]; + var x = pixel.x+coord[0]; + var y = pixel.y+coord[1]; + if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].movable) { + r = pixelMap[x][y]; + break; + } + } + if (r !== undefined || pixel.charge) { + let portal_out = choose(ticktemp.portal_out[channel]); + if (portal_out.del) return; + if (r !== undefined) { + shuffleArray(squareCoordsShuffle); + for (var j = 0; j < squareCoordsShuffle.length; j++) { + var coord2 = squareCoordsShuffle[j]; + var x2 = portal_out.x+coord2[0]; + var y2 = portal_out.y+coord2[1]; + if (isEmpty(x2,y2) && r.element !== "head" && r.element !== "body") { + tryMove(r,x2,y2); + } + else if (isEmpty(x2,y2) && (r.element === "head" || r.element === "body")) { + if (r.element === "head" && !isEmpty(r.x,r.y+1)) { + if (pixelMap[r.x][r.y+1].element === "body") { + r.element = "human" + r.bodyColor = pixelMap[r.x][r.y+1].color + deletePixel(r.x,r.y+1) + tryMove(r,x2,y2); + } + else { + tryMove(r,x2,y2); + } + } + else if (r.element === "body" && !isEmpty(r.x,r.y-1)) { + if (pixelMap[r.x][r.y-1].element === "head") { + r.element = "human" + r.bodyColor = r.color + r.color = pixelMap[r.x][r.y-1].color + deletePixel(r.x,r.y-1) + tryMove(r,x2,y2); + } + else { + tryMove(r,x2,y2); + } + } + } + break; + } + } + if (pixel.charge && !portal_out.charge && !portal_out.chargeCD) { + portal_out.charge = pixel.charge; + } + } + }; + doElectricity(pixel); +} + +elements.pipe.tick = function(pixel) { + if (!pixel.stage && pixelTicks-pixel.start > 60) { + for (var i = 0; i < squareCoords.length; i++) { + var coord = squareCoords[i]; + var x = pixel.x+coord[0]; + var y = pixel.y+coord[1]; + if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].movable) { + deletePixel(x,y) + } + if (isEmpty(x,y)) { + createPixel("pipe_wall",x,y); + } + } + pixel.stage = 1; + } + else if (pixel.stage === 1 && pixelTicks-pixel.start > 70) { //uninitialized + for (var i = 0; i < adjacentCoords.length; i++) { + var coord = adjacentCoords[i]; + var x = pixel.x+coord[0]; + var y = pixel.y+coord[1]; + if (isEmpty(x,y)) { + pixel.stage = 2; //blue + pixel.color = pixelColorPick(pixel,"#000036"); + break; + } + } + } + else if (pixel.stage > 1 && pixelTicks % 3 === pixel.stage-2) { //initialized + for (var i = 0; i < squareCoords.length; i++) { + var coord = squareCoords[i]; + var x = pixel.x+coord[0]; + var y = pixel.y+coord[1]; + if (!isEmpty(x,y,true) && pixelMap[x][y].element === "pipe") { + var newPixel = pixelMap[x][y]; + if (newPixel.stage === 1) { + var newColor; + switch (pixel.stage) { + case 2: newPixel.stage = 3; newColor = "#003600"; break; //green + case 3: newPixel.stage = 4; newColor = "#360000"; break; //red + case 4: newPixel.stage = 2; newColor = "#000036"; break; //blue + } + newPixel.color = pixelColorPick(newPixel,newColor); + } + } + } + var moved = false; + shuffleArray(squareCoordsShuffle); + for (var i = 0; i < squareCoordsShuffle.length; i++) { + var coord = squareCoordsShuffle[i]; + var x = pixel.x+coord[0]; + var y = pixel.y+coord[1]; + if (!isEmpty(x,y,true)) { + var newPixel = pixelMap[x][y]; + if (newPixel.element === "pipe") { + var nextStage; + switch (pixel.stage) { + case 2: nextStage = 4; break; //green + case 3: nextStage = 2; break; //red + case 4: nextStage = 3; break; //blue + } + if (pixel.con && !newPixel.con && newPixel.stage === nextStage) { //transfer to adjacent pipe + newPixel.con = pixel.con; + newPixel.con.x = newPixel.x; + newPixel.con.y = newPixel.y; + pixel.con = null; + moved = true; + break; + } + } + else if (!pixel.con && elements[newPixel.element].movable && newPixel.element !== "head" && newPixel.element !== "body") { //suck up pixel + pixel.con = newPixel; + deletePixel(newPixel.x,newPixel.y); + pixel.con.x = pixel.x; + pixel.con.y = pixel.y; + pixel.con.del; + moved = true; + break; + } + else if (!pixel.con && elements[newPixel.element].movable && (newPixel.element === "head" || newPixel.element === "body")) { + if (newPixel.element === "head") { + if (!isEmpty(newPixel.x,newPixel.y+1)) { + if (pixelMap[newPixel.x][newPixel.y+1].element === "body") { + newPixel.element = "human" + newPixel.bodyColor = pixelMap[newPixel.x][newPixel.y+1].color + deletePixel(newPixel.x,newPixel.y+1) + pixel.con = newPixel; + deletePixel(newPixel.x,newPixel.y); + pixel.con.x = pixel.x; + pixel.con.y = pixel.y; + pixel.con.del; + moved = true; + break; + } + else { + pixel.con = newPixel; + deletePixel(newPixel.x,newPixel.y); + pixel.con.x = pixel.x; + pixel.con.y = pixel.y; + pixel.con.del; + moved = true; + break; + } + } + else { + pixel.con = newPixel; + deletePixel(newPixel.x,newPixel.y); + pixel.con.x = pixel.x; + pixel.con.y = pixel.y; + pixel.con.del; + moved = true; + break; + } + } + else if (newPixel.element === "body") { + if (!isEmpty(newPixel.x,newPixel.y-1)) { + if (pixelMap[newPixel.x][newPixel.y-1].element === "head") { + newPixel.element = "human" + newPixel.bodyColor = newPixel.color + newPixel.color = pixelMap[newPixel.x][newPixel.y-1].color + deletePixel(newPixel.x,newPixel.y-1) + pixel.con = newPixel; + deletePixel(newPixel.x,newPixel.y); + pixel.con.x = pixel.x; + pixel.con.y = pixel.y; + pixel.con.del; + moved = true; + break; + } + else { + pixel.con = newPixel; + deletePixel(newPixel.x,newPixel.y); + pixel.con.x = pixel.x; + pixel.con.y = pixel.y; + pixel.con.del; + moved = true; + break; + } + } + else { + pixel.con = newPixel; + deletePixel(newPixel.x,newPixel.y); + pixel.con.x = pixel.x; + pixel.con.y = pixel.y; + pixel.con.del; + moved = true; + break; + } + } + else { + pixel.con = newPixel; + deletePixel(newPixel.x,newPixel.y); + pixel.con.x = pixel.x; + pixel.con.y = pixel.y; + pixel.con.del; + moved = true; + break; + } + } + } + } + if (pixel.con && !moved) { // move to same stage if none other + for (var i = 0; i < squareCoordsShuffle.length; i++) { + var coord = squareCoordsShuffle[i]; + var x = pixel.x+coord[0]; + var y = pixel.y+coord[1]; + if (isEmpty(x,y)) { + delete pixel.con.del; + pixel.con.x = x; + pixel.con.y = y; + pixelMap[x][y] = pixel.con; + currentPixels.push(pixel.con); + pixel.con = null; + break; + } + if (!isEmpty(x,y,true) && pixelMap[x][y].element === "pipe") { + var newPixel = pixelMap[x][y]; + if (pixel.con && !newPixel.con && newPixel.stage === pixel.stage) { + newPixel.con = pixel.con; + newPixel.con.x = newPixel.x; + newPixel.con.y = newPixel.y; + pixel.con = null; + break; + } + } + } + } + } + doDefaults(pixel); +} + +elements.drag.tool = function(pixel) { + if (dragStart === null) { + dragStart = pixelTicks; + draggingPixels = []; + } + if (pixelTicks === dragStart && !pixel.drag && (elements[pixel.element].movable || shiftDown) && pixel.element !== "head") { + pixel.drag = true; + draggingPixels.push(pixel); + } +} + +elements.drag.perTick = function() { + if (!draggingPixels) { return; } + for (var j = 0; j < (shiftDown ? 3 : 1); j++) { + for (var i = 0; i < draggingPixels.length; i++) { + var pixel = draggingPixels[i]; + if (pixel.del) { continue } + const x = pixel.x; + const y = pixel.y; + const [mX, mY] = [mousePos.x, mousePos.y]; + const empty = checkForEmptyPixels(x, y); + let bestVal = Math.sqrt(Math.pow(mX - x, 2) + Math.pow(mY - y, 2)); + let best = null; + for (const pixelPair of empty) { + const x_ = x + pixelPair[0]; + const y_ = y + pixelPair[1]; + const c = Math.sqrt(Math.pow(mX - x_, 2) + Math.pow(mY - y_, 2)); + if (c < bestVal) { + bestVal = c; + best = pixelPair; + } + } + if (best) { + if (pixel.element !== "body") { + tryMove(pixel, x + best[0], y + best[1], undefined, true); + } + else if (pixel.element === "body") { + if (!isEmpty(pixel.x,pixel.y-1)) { + var headPixel = pixelMap[pixel.x][pixel.y-1] + if (headPixel.element === "head") { + if (isEmpty(x + best[0], y + best[1] - 1)) { + tryMove(headPixel, x + best[0], y + best[1] - 1, undefined, true); + tryMove(pixel, x + best[0], y + best[1], undefined, true); + } + } + } + else {tryMove(pixel, x + best[0], y + best[1], undefined, true);} + } + } + } + } +} + +mouse1Action = function(e,mouseX=undefined,mouseY=undefined,startPos) { + if (currentElement === "erase") { mouse2Action(e,mouseX,mouseY,startPos); return; } + else if (currentElement === "pick") { mouseMiddleAction(e,mouseX,mouseY); return; } + // If x and y are undefined, get the mouse position + if (mouseX === undefined && mouseY === undefined) { + // var canvas = document.getElementById("game"); + // var ctx = canvas.getContext("2d"); + lastPos = mousePos; + mousePos = getMousePos(canvas, e); + var mouseX = mousePos.x; + var mouseY = mousePos.y; + } + var cooldowned = false; + if (mouseSize===1 && elements[currentElement].cooldown && !paused) { + if (pixelTicks-lastPlace < elements[currentElement].cooldown) { + return; + } + cooldowned = true; + } + lastPlace = pixelTicks; + if (cooldowned && !startPos) { + var coords = mouseRange(mouseX,mouseY); + } + else { + startPos = startPos || lastPos + var coords = lineCoords(startPos.x,startPos.y,mouseX,mouseY); + } + // if (!((cooldowned && startPos.x===lastPos.x && startPos.y===lastPos.y) || ((elements[currentElement].tool || elements[currentElement].category==="tools") && !elements[currentElement].canPlace))) { + // } + // else { var coords = mouseRange(mouseX,mouseY); } + var element = elements[currentElement]; + var mixList = []; + // For each x,y in coords + var done = {}; + for (var i = 0; i < coords.length; i++) { + var x = coords[i][0]; + var y = coords[i][1]; + if (!done[x]) { + done[x] = {} + } + if (done[x][y]) { continue; } + done[x][y] = true; + + if (mode === "replace" && (!elements[currentElement].tool || elements[currentElement].canPlace)) { + if (outOfBounds(x,y)) { + continue; + } + // Remove pixel at position from currentPixels + if (!isEmpty(x,y,true)) { + if (!(currentElement === pixelMap[x][y].element && pixelMap[x][y].start === pixelTicks-1)) { + deletePixel(x,y); + } + } + } + + if (currentElement === "mix") { + if (!isEmpty(x,y,true)) { + var pixel = pixelMap[x][y]; + if (!(elements[pixel.element].movable !== true || elements[pixel.element].noMix === true) || shiftDown) { + mixList.push(pixel); + } + } + continue; + } + else if (elements[currentElement].tool && !(elements[currentElement].canPlace && isEmpty(x,y))) { + // run the tool function on the pixel + if (!isEmpty(x,y,true)) { + var pixel = pixelMap[x][y]; + // if the current element has an ignore property and the pixel's element is in the ignore property, don't do anything + if (elements[currentElement].ignore && elements[currentElement].ignore.indexOf(pixel.element) !== -1) { + continue; + } + elements[currentElement].tool(pixel); + } + continue; + } + if (isEmpty(x, y)) { + if (currentPixels.length < maxPixelCount) { + createPixel(currentElement,x,y); + if (pixelMap[x][y] && currentElement === pixelMap[x][y].element && (elements[currentElement].customColor || elements[currentElement].singleColor)) { + pixelMap[x][y].color = pixelColorPick(pixelMap[x][y],currentColorMap[currentElement]); + } + if (currentElementProp) { + for (var key in currentElementProp) { + pixelMap[x][y][key] = currentElementProp[key] + } + } + } + } + else if (!outOfBounds(x,y)) { + if (elements[currentElement].extinguish) { + var pixel = pixelMap[x][y]; + if (pixel.burning && elements[pixel.element].burning !== true) { + delete pixel.burning; + delete pixel.burnStart; + } + } + } + } + if (currentElement === "mix") { + // 1. repeat for each pixel in mixList + // 2. choose 2 random pixels and swap their x and y + // 3. remove pixel from mixList + for (var i = 0; i < mixList.length; i++) { + var pixel1 = mixList[Math.floor(Math.random()*mixList.length)]; + var pixel2 = mixList[Math.floor(Math.random()*mixList.length)]; + if (pixel1.element !== "head" && pixel2.element !== "head" && pixel1.element !== "body" && pixel2.element !== "body") { + swapPixels(pixel1,pixel2); + } + else if (pixel1.element !== "head" && pixel2.element !== "head" && (pixel1.element === "body" || pixel2.element === "body")) { + if (pixel1.element === "body") { + if (!isEmpty(pixel1.x,pixel1.y-1, true)) { + var headPixel1 = pixelMap[pixel1.x][pixel1.y-1] + if (headPixel1.element === "head") { + if (!isEmpty(pixel2.x,pixel2.y-1, true)) { + var headPixel2 = pixelMap[pixel2.x][pixel2.y-1] + if (headPixel2.element !== "body" && !(elements[headPixel2.element].movable !== true || elements[headPixel2.element].noMix === true)) { + swapPixels(pixel1,pixel2); + swapPixels(headPixel1,headPixel2); + } + } + else if (isEmpty(pixel2.x,pixel2.y-1)) { + swapPixels(pixel1,pixel2) + tryMove(headPixel1, pixel1.x, pixel1.y-1) + } + } + } + } + else if (pixel2.element === "body") { + if (!isEmpty(pixel2.x,pixel2.y-1, true)) { + var headPixel1 = pixelMap[pixel2.x][pixel2.y-1] + if (headPixel1.element === "head") { + if (!isEmpty(pixel1.x,pixel1.y-1, true)) { + var headPixel2 = pixelMap[pixel1.x][pixel1.y-1] + if (headPixel2.element !== "body" && !(elements[headPixel2.element].movable !== true || elements[headPixel2.element].noMix === true)) { + swapPixels(pixel1,pixel2); + swapPixels(headPixel1,headPixel2); + } + } + else if (isEmpty(pixel1.x,pixel1.y-1)) { + swapPixels(pixel1,pixel2); + tryMove(headPixel1, pixel2.x,pixel2.y-1) + } + } + } + } + } + mixList.splice(mixList.indexOf(pixel1),1); + mixList.splice(mixList.indexOf(pixel2),1); + if (elements[pixel1.element].onMix) { + elements[pixel1.element].onMix(pixel1,pixel2); + } + if (elements[pixel2.element].onMix) { + elements[pixel2.element].onMix(pixel2,pixel1); + } + } + + } +} + +pixelTick = function(pixel,custom=null) { + if (pixel.start === pixelTicks) {return} + btemp = {}; + if (elements[pixel.element] === undefined) { + pixel.invalidElement = pixel.element; + changePixel(pixel,"unknown"); + return; + } + var info = elements[pixel.element]; + btemp.info = info; + btemp.pixel = pixel; + if (custom) { var behavior = custom; } + else if (pixel.charge && info.behaviorOn) { var behavior = info.behaviorOn; } + else { var behavior = info.behavior; } + if (pixel.flipX) { behavior = flipBehavior(behavior,"x"); } + if (pixel.flipY) { behavior = flipBehavior(behavior,"y"); } + if (pixel.r) { behavior = rotateBehavior(behavior,pixel.r); } + var x = pixel.x; + var y = pixel.y; + var move1Spots = []; btemp.move1Spots = move1Spots; + var move2Spots = []; btemp.move2Spots = move2Spots; + var supportSpots = []; btemp.supportSpots = supportSpots; + var swapSpots = []; btemp.swapSpots = swapSpots; + btemp.mixSpots = []; + btemp.move = true; + // Parse behavior +var height = behavior.length; +for (var by = 0; by < behavior.length; by++) { +var behaviorby = behavior[by]; +var width = behaviorby.length; +for (var bx = 0; bx < behaviorby.length; bx++) { + var b0 = behaviorby[bx]; + if (b0 === "XX") {continue} + //if (b.includes(" OR ")) { + // b = b.split(" OR ")[Math.floor(Math.random()*b.split(" OR ").length)]; + //} + // Loop through b0.split(" AND ") + if (b0.indexOf(" AND ") !== -1) { var andsplit = b0.split(" AND "); } + else { var andsplit = [b0]; } + for (var i = 0; i < andsplit.length; i++) { + var b = andsplit[i]; + if (b.indexOf(":") !== -1) { + var arg = b.split(":")[1].split(/[\:\%]/)[0]; + if (b.indexOf("%") === -1) { + b = b.split(/[\:\%]/)[0]; + } + } + else { var arg = null;} + btemp.arg = arg; + // If b has "%" followed by a number in it, it's a chance to move + if (b.indexOf("%") !== -1) { + // Split the string at the "%" and use the second half as the chance (float) + var chance = parseFloat(b.split("%")[1]); + //console.log(b+": "+(Math.random()*100 < chance)); + b = b.split(/[\:\%]/)[0]; + } + else { var chance = 100; } + if (chance===100 || Math.random()*100 < chance) { + var newCoords = behaviorCoords(x,y,bx,by,width,height); + btemp.newCoords = newCoords; + if (behaviorRules[b]) { + behaviorRules[b](); + continue; + } + } + } + } + } + if (btemp.deleted) {return;} + if (supportSpots.length > 0) { + var supportCount = 0; + var allEmpty = true; + for (var i = 0; i < supportSpots.length; i++) { + var bx = supportSpots[i].x; + var by = supportSpots[i].y; + var arg = supportSpots[i].arg; + if (!isEmpty(bx,by,true)) { + if (info.ignore && info.ignore.indexOf(pixelMap[bx][by].element) !== -1) {continue;} + if ((arg === null && !validDensitySwaps[info.state][elements[pixelMap[bx][by].element].state]) || pixelMap[bx][by].element == arg) { + supportCount++; + } + } + } + if (supportCount == supportSpots.length) { + btemp.move = false; + } + } + + var moved = false; + + if (swapSpots.length > 0) { + var coords = swapSpots[Math.floor(Math.random()*swapSpots.length)]; + if (pixelMap[coords.x][coords.y] !== undefined) { + swapPixels(pixel,pixelMap[coords.x][coords.y]); + btemp.move = false; + moved = true; + } + } + + if (btemp.mixSpots.length > 0) { + for (var i = 0; i < btemp.mixSpots.length; i++) { + var coord1 = choose(btemp.mixSpots); + var coord2 = choose(btemp.mixSpots); + var exists1 = !isEmpty(coord1.x,coord1.y,true); + var exists2 = !isEmpty(coord2.x,coord2.y,true); + if (isEmpty(coord1.x,coord1.y) && exists2) { + var pixel1 = pixelMap[coord2.x][coord2.y] + if (pixel1.element !== "head" && pixel1.element !== "body") { + tryMove(pixel1,coord1.x,coord1.y); + } + else if (pixel1.element !== "head" && pixel1.element === "body") { + if (!isEmpty(pixel1.x,pixel1.y-1, true)) { + var headPixel1 = pixelMap[pixel1.x][pixel1.y-1] + if (headPixel1.element === "head") { + if (!isEmpty(coord1.x,coord1.y-1, true)) { + var headPixel2 = pixelMap[coord1.x][coord1.y-1] + if (headPixel2.element !== "body" && !(elements[headPixel2.element].movable !== true || elements[headPixel2.element].noMix === true)) { + tryMove(pixel1,coord1.x,coord1.y); + swapPixels(headPixel1,headPixel2); + } + } + else if (isEmpty(coord1.x,coord1.y-1)) { + tryMove(pixel1,coord1.x,coord1.y); + tryMove(headPixel1, pixel1.x, pixel1.y-1) + } + } + } + } + } + else if (exists1 && isEmpty(coord2.x,coord2.y)) { + var pixel1 = pixelMap[coord1.x][coord1.y] + if (pixel1.element !== "head" && pixel1.element !== "body") { + tryMove(pixel1,coord2.x,coord2.y); + } + else if (pixel1.element !== "head" && pixel1.element === "body") { + if (!isEmpty(pixel1.x,pixel1.y-1, true)) { + var headPixel1 = pixelMap[pixel1.x][pixel1.y-1] + if (headPixel1.element === "head") { + if (!isEmpty(coord2.x,coord2.y-1, true)) { + var headPixel2 = pixelMap[coord2.x][coord2.y-1] + if (headPixel2.element !== "body" && !(elements[headPixel2.element].movable !== true || elements[headPixel2.element].noMix === true)) { + tryMove(pixel1,coord2.x,coord2.y); + swapPixels(headPixel1,headPixel2); + } + } + else if (isEmpty(coord2.x,coord2.y-1)) { + tryMove(pixel1,coord2.x,coord2.y); + tryMove(headPixel1, pixel1.x, pixel1.y-1) + } + } + } + } + } + else if (exists1 && exists2) { + var pixel1 = pixelMap[coord1.x][coord1.y]; + var pixel2 = pixelMap[coord2.x][coord2.y]; + if (pixel1.element !== "head" && pixel2.element !== "head" && pixel1.element !== "body" && pixel2.element !== "body") { + swapPixels(pixel1,pixel2); + } + else if (pixel1.element !== "head" && pixel2.element !== "head" && (pixel1.element === "body" || pixel2.element === "body")) { + if (pixel1.element === "body") { + if (!isEmpty(pixel1.x,pixel1.y-1, true)) { + var headPixel1 = pixelMap[pixel1.x][pixel1.y-1] + if (headPixel1.element === "head") { + if (!isEmpty(pixel2.x,pixel2.y-1, true)) { + var headPixel2 = pixelMap[pixel2.x][pixel2.y-1] + if (headPixel2.element !== "body" && !(elements[headPixel2.element].movable !== true || elements[headPixel2.element].noMix === true)) { + swapPixels(pixel1,pixel2); + swapPixels(headPixel1,headPixel2); + } + } + else if (isEmpty(pixel2.x,pixel2.y-1)) { + swapPixels(pixel1,pixel2) + tryMove(headPixel1, pixel1.x, pixel1.y-1) + } + } + } + } + else if (pixel2.element === "body") { + if (!isEmpty(pixel2.x,pixel2.y-1, true)) { + var headPixel1 = pixelMap[pixel2.x][pixel2.y-1] + if (headPixel1.element === "head") { + if (!isEmpty(pixel1.x,pixel1.y-1, true)) { + var headPixel2 = pixelMap[pixel1.x][pixel1.y-1] + if (headPixel2.element !== "body" && !(elements[headPixel2.element].movable !== true || elements[headPixel2.element].noMix === true)) { + swapPixels(pixel1,pixel2); + swapPixels(headPixel1,headPixel2); + } + } + else if (isEmpty(pixel1.x,pixel1.y-1)) { + swapPixels(pixel1,pixel2); + tryMove(headPixel1, pixel2.x,pixel2.y-1) + } + } + } + } + } + if (elements[pixel1.element].onMix) { + elements[pixel1.element].onMix(pixel1,pixel2); + } + if (elements[pixel2.element].onMix) { + elements[pixel2.element].onMix(pixel2,pixel1); + } + } + } + } + + if (btemp.sticking) { + btemp.move = false; + } + + // Move First Priority + if (btemp.move) { + if (move1Spots.length > 0) { + // While move1Spots is not empty + while (move1Spots.length > 0) { + // coords = random item of move1Spots + var j = Math.floor(Math.random()*move1Spots.length); + var coords = move1Spots[j]; + var nx = coords.x; + var ny = coords.y; + moved = tryMove(pixel,nx,ny,btemp.leaveBehind1 || btemp.leaveBehind); + if (moved) { + break; + } + else { + // remove coords from move1Spots + move1Spots.splice(j,1); + } + + + } + } + // Move Second Priority + if (!moved && move2Spots.length > 0) { + // While move2Spots is not empty + while (move2Spots.length > 0) { + // coords = random item of move2Spots + var j = Math.floor(Math.random()*move2Spots.length); + var coords = move2Spots[j]; + var nx = coords.x; + var ny = coords.y; + moved = tryMove(pixel,nx,ny,btemp.leaveBehind2 || btemp.leaveBehind); + if (moved) { + if (btemp.C2 && elements[btemp.C2]) { + changePixel(pixel,btemp.C2); + } + break; + } + else { + // remove coords from move2Spots + move2Spots.splice(j,1); + } + } + } + } + doAirDensity(pixel); + + + // Change tempearture if needed (unused) + /*if (info.tempChange != undefined) { + pixel.temp += info.tempChange; + pixelTempCheck(pixel); + }*/ + + // Burning + doBurning(pixel); + + // Heat Transfer + if (info.insulate !== true) { + doHeat(pixel); + } + + // Electricity Transfer + doElectricity(pixel); + + // Staining + if (info.stain) { + doStaining(pixel); + } + +} \ No newline at end of file From 80187085868954f368bcf536cc065579339452a9 Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Sun, 16 Mar 2025 14:43:22 -0700 Subject: [PATCH 6/6] brain fix --- mods/biology.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mods/biology.js b/mods/biology.js index a1530147..e88cc1aa 100644 --- a/mods/biology.js +++ b/mods/biology.js @@ -3729,7 +3729,7 @@ elements.brain = { if (!isEmpty(pixel.x, pixel.y-1, true)) { var hitPixel = pixelMap[pixel.x][pixel.y-1] doElectricity(hitPixel); - if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) { + if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) { pixel.chargeCD = 16 hitPixel.charge = 0.5 } @@ -3757,7 +3757,7 @@ elements.brain = { hitPixel.darkcharge = true } } - if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) { + if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) { pixel.chargeCD = 16 hitPixel.charge = 0.5 } @@ -3768,7 +3768,7 @@ elements.brain = { if (!isEmpty(pixel.x-1, pixel.y, true)) { var hitPixel = pixelMap[pixel.x-1][pixel.y] doElectricity(hitPixel); - if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) { + if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) { pixel.chargeCD = 16 hitPixel.charge = 0.5 } @@ -3779,7 +3779,7 @@ elements.brain = { if (!isEmpty(pixel.x+1, pixel.y, true)) { var hitPixel = pixelMap[pixel.x+1][pixel.y] doElectricity(hitPixel); - if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) { + if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) { pixel.chargeCD = 16 hitPixel.charge = 0.5 } @@ -3920,7 +3920,7 @@ elements.hypothalamus = { if (!isEmpty(pixel.x, pixel.y-1, true)) { var hitPixel = pixelMap[pixel.x][pixel.y-1] doElectricity(hitPixel); - if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) { + if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) { pixel.chargeCD = 16 hitPixel.charge = 0.5 } @@ -3931,7 +3931,7 @@ elements.hypothalamus = { if (!isEmpty(pixel.x, pixel.y+1, true)) { var hitPixel = pixelMap[pixel.x][pixel.y+1] doElectricity(hitPixel); - if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) { + if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) { pixel.chargeCD = 16 hitPixel.charge = 0.5 } @@ -3942,7 +3942,7 @@ elements.hypothalamus = { if (!isEmpty(pixel.x-1, pixel.y, true)) { var hitPixel = pixelMap[pixel.x-1][pixel.y] doElectricity(hitPixel); - if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) { + if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) { pixel.chargeCD = 16 hitPixel.charge = 0.5 } @@ -3953,7 +3953,7 @@ elements.hypothalamus = { if (!isEmpty(pixel.x+1, pixel.y, true)) { var hitPixel = pixelMap[pixel.x+1][pixel.y] doElectricity(hitPixel); - if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) { + if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) { pixel.chargeCD = 16 hitPixel.charge = 0.5 }