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",