diff --git a/mod-list.html b/mod-list.html index 0b5c089c..a90df8fd 100644 --- a/mod-list.html +++ b/mod-list.html @@ -299,7 +299,7 @@ lone_urea.jsAdds urea without the rest of the piss modAlice maze.jsAdds a solvable maze generatorggod memelists.jsMakes it so you must select elements through a list at the bottom of the page.
We like listsmollthecoder -minecraft.jsAdds several things from MinecraftStellarX20 +minecraft.jsAdds several things from MinecraftStellarX20, nousernamefound minesweeper.jsA subpar implementation of MinesweeperAlice musicalfruit.jsHumans get gas from eating Beansmollthecoder prideflags.jsAdds some pride flags to the game.Adora diff --git a/mods/logicgates.js b/mods/logicgates.js index c8e01d18..a88458bc 100644 --- a/mods/logicgates.js +++ b/mods/logicgates.js @@ -461,4 +461,40 @@ elements.logic_unshock = { if (pixel.element == "logic_wire"){pixel.lstate = -2; pixel.color = pixelColorPick(pixel, "#3d4d2c")} }, excludeRandom: true, +} +elements.list_all_wifi = { + color: elements.lookup.color, + category: "tools", + tool: function(){}, + excludeRandom: true, + onSelect: function(){ + let results = {} + for (let i in currentPixels){ + var otherPixel = currentPixels[i] + if (["logic_receiver", "logic_transmitter"].includes(otherPixel.element)){ + if (otherPixel.channel){ + if (results[otherPixel.channel]){ + results[otherPixel.channel].push([otherPixel.x, otherPixel.y]) + } else { + results[otherPixel.channel] = [[otherPixel.x, otherPixel.y]] + } + } + } + } + console.log(results) + let keys = Object.keys(results) + let ans1 = prompt(keys.length + " unique channels have been found. Type 1 to list them all.", 1) + if(ans1 == "1"){ + ans2 = prompt("["+keys +"]"+ " These are all the channels found. Type the name of one of them to see the positions of all pixels with that channel.", keys[0]) + if (keys.includes(ans2)){ + let finalString = "" + for (i in results[ans2]){ + finalString += ", [" + finalString += results[ans2][i] + finalString += "]" + } + alert(finalString) + } + } + } } \ No newline at end of file diff --git a/mods/minecraft.js b/mods/minecraft.js index ec64d42e..82c4f9c0 100644 --- a/mods/minecraft.js +++ b/mods/minecraft.js @@ -1,116 +1,118 @@ elements.endstone = { -color: ["#e5edc2", "#bec797"], -behavior: behaviors.WALL, -category: "minecraft", -state: "solid", -stateHigh: "molten_endstone", -tempHigh: 1265 + color: ["#e5edc2", "#bec797"], + behavior: behaviors.WALL, + category: "minecraft", + state: "solid", + stateHigh: "molten_endstone", + tempHigh: 1265 }; elements.molten_endstone = { -color: ["#6615d6", "#9651f5", "#d3c3eb"], -behavior: behaviors.LIQUID, -category: "minecraft", -state: "liquid", -stateLow: "endstone", -tempLow: 1265, -temp: 1500, -viscosity: 1000, -density: 1025 + color: ["#6615d6", "#9651f5", "#d3c3eb"], + behavior: behaviors.LIQUID, + category: "minecraft", + state: "liquid", + stateLow: "endstone", + tempLow: 1265, + temp: 1500, + viscosity: 1000, + density: 1025 }; elements.netherrack = { -color: ["#8c2a0a", "#783722"], -behavior: behaviors.WALL, -category: "minecraft", -state: "solid", -tempHigh: 2750, -stateHigh: "molten_netherrack", + color: ["#8c2a0a", "#783722"], + behavior: behaviors.WALL, + category: "minecraft", + state: "solid", + tempHigh: 2750, + stateHigh: "molten_netherrack", }; elements.glowstone_dust = { -color: ["#d9d636", "#fffc63", "#a3a12f", "#e0dd3f"], -behavior: behaviors.POWDER, -category: "minecraft", -state: "solid", -tempHigh: 2500, -stateHigh: "molten_glowstone", -conduct: 0.975, -density: 1075 + color: ["#d9d636", "#fffc63", "#a3a12f", "#e0dd3f"], + behavior: behaviors.POWDER, + category: "minecraft", + state: "solid", + tempHigh: 2500, + stateHigh: "molten_glowstone", + conduct: 0.975, + density: 1075 }; elements.molten_netherrack = { -name: "Nether Magma", -color: ["#f7f09c", "#faf9eb", "#ffffff", "#dcf7f7", "#86dbdb", "#1268a6"], -behavior: behaviors.LIQUID, -category: "minecraft", -state: "liquid", -tempLow: 2750, -stateLow: "netherrack", -temp: 3000, -viscosity: 1000, -density: 2305 + name: "Nether Magma", + color: ["#f7f09c", "#faf9eb", "#ffffff", "#dcf7f7", "#86dbdb", "#1268a6"], + behavior: behaviors.LIQUID, + category: "minecraft", + state: "liquid", + tempLow: 2750, + stateLow: "netherrack", + temp: 3000, + viscosity: 1000, + density: 2305 }; elements.redstone_dust = { -color: ["#bf2424", "#f22424", "#a12020"], -behavior: behaviors.POWDER, -category: "minecraft", -state: "solid", -tempHigh: 1275, -stateHigh: "liquid_redstone", -density: 1250 + color: ["#bf2424", "#f22424", "#a12020"], + behavior: behaviors.POWDER, + category: "minecraft", + state: "solid", + tempHigh: 1275, + stateHigh: "liquid_redstone", + density: 1250 }; +/* behaviors.SOUL_SAND = [ -"SA|SA|SA", -"XX|XX|XX", -"SA AND M2|SA AND M1|SA AND M2", -]; + "SA|SA|SA", + "XX|XX|XX", + "SA AND M2|SA AND M1|SA AND M2", + ]; + */ elements.soul_sand = { -color: ["#91704d", "#704e2b", "#523517"], -behavior: behaviors.SOUL_SAND, -category: "minecraft", -state: "solid", -tempHigh: 2575, -stateHigh: "soul_glass", -density: 1375, -reactions: { -"water": { "elem1":"wet_soul_sand", "elem2":null }, -} + color: ["#91704d", "#704e2b", "#523517"], + behavior: behaviors.SUPPORTPOWDER, + category: "minecraft", + state: "solid", + tempHigh: 2575, + stateHigh: "soul_glass", + density: 1375, + reactions: { + "water": { "elem1":"wet_soul_sand", "elem2":null }, + } }; elements.soul_soil = { -color: ["#80664b", "#6e553b", "#5c452e"], -behavior: behaviors.SOUL_SAND, -category: "minecraft", -state: "solid", -tempHigh: 2565, -stateHigh: "soul_glass", -density: 1450, -reactions: { -"water": { "elem1":"soul_mud", "elem2":null }, -} + color: ["#80664b", "#6e553b", "#5c452e"], + behavior: behaviors.SUPPORTPOWDER, + category: "minecraft", + state: "solid", + tempHigh: 2565, + stateHigh: "soul_glass", + density: 1450, + reactions: { + "water": { "elem1":"soul_mud", "elem2":null }, + } }; elements.soul_mud = { -color: "#6e5437", -behavior: behaviors.POWDER, -category: "minecraft", -state: "solid", -tempHigh: 1985, -stateHigh: "soul_adobe", -density: 1585 + color: "#6e5437", + behavior: behaviors.POWDER, + category: "minecraft", + state: "solid", + tempHigh: 1985, + stateHigh: "soul_adobe", + density: 1585 }; elements.soul_glass = { -color: "#7a90c2", -behavior: behaviors.WALL, -category: "minecraft", -state: "solid", -tempHigh: 2585, -stateHigh: "molten_soul_glass", -density: 1685 + color: "#7a90c2", + behavior: behaviors.WALL, + category: "minecraft", + state: "solid", + tempHigh: 2585, + stateHigh: "molten_soul_glass", + density: 1685 }; elements.wet_soul_sand = { -color: ["#5c452e", "#856d56"], -behavior: behaviors.POWDER, -category: "minecraft", -state: "solid", -tempHigh: 150, -stateHigh: "soul_sand", -density: 1660, + color: ["#5c452e", "#856d56"], + behavior: behaviors.POWDER, + category: "minecraft", + state: "solid", + tempHigh: 150, + stateHigh: "soul_sand", + density: 1660, }; /* unfinished but near: Soul Adobe, @@ -124,3 +126,521 @@ Liquid Redstone, Soul Flame, Soul */ +let wardenMurderList = ["head", "body", "frog", "worm", "fly", "flea", "fish", "bird", "bee"] +function playSculk() { + var audio = new Audio("https://JustAGenericUsername.github.io/sculk" + Math.floor((Math.random()*6) +1) + ".ogg"); + audio.play(); +} +function playShriek() { + var audio = new Audio("https://JustAGenericUsername.github.io/shriek" + Math.floor((Math.random()*4) +1) + ".ogg"); + audio.play(); +} +function turnIntoSpecific(pixel){ + newPixel = pixel.storedPixel + newPixel.x = pixel.x; + newPixel.y = pixel.y; + delete newPixel.del; + delete newPixel.sculkSpread; + delete newPixel.rSeed; + let tempPixel = newPixel; + pixelMap[pixel.x][pixel.y] = tempPixel + currentPixels = currentPixels.filter(a => a.x != pixel.x || a.y != pixel.y); currentPixels.push((tempPixel)) +} +function findAboveNot(pixel, element){ + for (let i = pixel.y; i <= (0-height); i--){ + if (isEmpty(pixelMap[pixel.x][i], true) && element != "air"){ + return {distance: i, element: "air"} + } else if (!(pixelMap[pixel.x][i].element != element)){ + return {distance: i, element: pixelMap[pixel.x][i].element} + } + } + return {distance: height, element: "edge"} +} +function findAboveIs(pixel, element){ + for (let i = pixel.y; i <= (0-height); i--){ + if (isEmpty(pixelMap[pixel.x][i], true) && element == "air"){ + return {distance: i, element: "air"} + } else if (!(pixelMap[pixel.x][i].element == element)){ + return {distance: i, element: element} + } + } + return false +} +let canPlaySculk = 0 +let wardenCooldown = 0 +let totalSculk = { + sculk: 0, + wardens: 0, + sensors: 0, + shriekers: 0 +} +elements.sculk = { + color: ["#0c1a22", "#0a171d", "#071319", "#030f14", "#000a0f"], + behavior: behaviors.SUPPORT, + density: 1500, + category: "minecraft", + tempHigh: 250, + stateHigh: "experience", + tick: function(pixel){ + if (!pixel.type){pixel.type = "sculk"} + if (!pixel.rSeed && pixel.type == "sculk"){pixel.rSeed = [Math.random(), Math.random()]} + if (!pixel.rSeed && pixel.type == "sensor"){ + pixel.rSeed = true + pixel.color = pixelColorPick(pixel, "#112b4d") + } + if (!pixel.rSeed && pixel.type == "shrieker"){ + pixel.rSeed = true + pixel.color = pixelColorPick(pixel, "#dad6b8") + } + if (pixel.type == "sculk" && pixel.rSeed[0] < 0.05){ + pixel.color = "rgb(40, " + (12*Math.sin((0.05*pixelTicks)+(pixel.rSeed[1]*100)) + 201) + ", " + (46*Math.sin((0.1*pixelTicks)+(pixel.rSeed[1]*100))+201) + ")"; + } + if (pixel.type == "sculk"){ + if (!pixel.storedPixel){pixel.storedPixel = {element: "dirt", color: pixelColorPick({element: "dirt"}), start: pixel.start, temp: pixel.temp, x: pixel.x, y: pixel.y}} + if (!pixel.sculkSpread){pixel.sculkSpread = 0} + if (Math.random()<0.0001){ pixel.sculkSpread ++} + for (var i = 0; i < squareCoords.length; i++) { + var x = pixel.x+squareCoords[i][0]; + var y = pixel.y+squareCoords[i][1]; + // higher penalty for top/bottom coords, lower for side coords + let penalty = 0.9994 + for (var j = 0; j < squareCoords.length; j++) { + var jx = x+squareCoords[j][0]; + var jy = y+squareCoords[j][1]; + if (isEmpty(jx,jy,true)) {penalty = 0.8} + } + if (!isEmpty(x,y,true)) { + var newPixel = pixelMap[x][y]; + if (newPixel.element == "sculk" && newPixel.type == "sculk"){ + if (pixel.sculkSpread > newPixel.sculkSpread){ + newPixel.sculkSpread ++ + pixel.sculkSpread -- + } + } else if (!(["fire", "radiation", "uranium", "plasma", "bless", "god_ray", + "experience", "meat", "ash", "cooked_meat", "rotten_meat", "frozen_meat", + "cured_meat", "dead_plant", "frozen_plant", "warden", "warden_head", "warden_body", + "sculk"].includes(newPixel.element) || wardenMurderList.includes(newPixel.element))){ + if (Math.random() > (elements[newPixel.element].hardness || 0.2) && Math.random() > penalty && pixel.sculkSpread > 0 && pixel.temp < 80){ + pixel.sculkSpread -- + let pixelStorage = newPixel + deletePixel(x, y) + createPixel("sculk", x, y) + pixelMap[x][y].storedPixel = pixelStorage + } + } else if (["meat", "ash", "cooked_meat", "rotten_meat", "frozen_meat", "cured_meat", + "dead_plant", "frozen_plant", "blood", "cell", "cancer"].includes(newPixel.element) && pixel.temp < 80){ + deletePixel(x, y) + pixel.sculkSpread += 3 + } + } + } + } + if (pixel.type == "sensor"){ + let cCoords = circleCoords(pixel.x, pixel.y, 8) + for (var i = 0; i < cCoords.length; i++) { + var x = cCoords[i].x + var y = cCoords[i].y + if (!isEmpty(x, y, true)){ + if (wardenMurderList.includes(pixelMap[x][y].element)){ + if (canPlaySculk == 0){playSculk(); canPlaySculk = 4*30} + } + } + } + + } + if (pixel.type == "shrieker"){ + if (canPlaySculk >= 3.7*30 && wardenCooldown == 0){ + if (isEmpty(pixel.x-1, pixel.y-2, true)){ + createPixel("warden", pixel.x-1, pixel.y-2) + playShriek() + wardenCooldown = 15*30 + } + } + } + let nAirDist = findAboveNot(pixel, "air") + if (nAirDist){ + if (Math.random() < 0.001 && pixel.sculkSpread >= 2 && nAirDist.distance >= 6 && (nAirDist.element == "air"||nAirDist.element == "edge") && totalSculk.sensors < 10 && pixel.type == "sculk"){ + if (isEmpty(pixel.x, pixel.y-1, true)){ + createPixel("sculk", pixel.x, pixel.y-1) + pixelMap[pixel.x][pixel.y-1].type = "sensor" + pixel.sculkSpread -= 2 + } + } + else if (Math.random() < 0.0005 && pixel.sculkSpread >= 4 && nAirDist.distance >= 6 && (nAirDist.element == "air"||nAirDist.element == "edge") && totalSculk.shriekers < 4 && pixel.type == "sculk"){ + if (isEmpty(pixel.x, pixel.y-1, true)){ + createPixel("sculk", pixel.x, pixel.y-1) + pixelMap[pixel.x][pixel.y-1].type = "shrieker" + pixel.sculkSpread -= 4 + } + } + } + }, + breakInto: "experience", +} +const randgrid1 = Array.from({ length: Math.pow(12, 2) }, () => Math.random() * 2 * Math.PI); +const randgrid2 = Array.from({ length: Math.pow(12, 2) }, () => Math.random() * 2 * Math.PI); +function xpNoise(weight){ + const length = randgrid1.length; + const weightedGrid = new Array(length); + + for (let i = 0; i < length; i++) { + weightedGrid[i] = weightedAverage(randgrid1[i], randgrid2[i], weight); + } + + return weightedGrid; +} +function weightedAverage(num1, num2, weight){ + return ((weight * num1)+((1-weight)*num2)) +} +function getScalingFactor(d1, d2){ + return Math.min(d1, d2)/6 +} +function badNoise(C, x, y) { + // Helper function to calculate dot product + function dotProduct(a, b) { + return a[0] * b[0] + a[1] * b[1]; + } + + // Function d + function d(index) { + return [Math.cos(C[index]), Math.sin(C[index])]; + } + + // Function f + function f(x, y, t) { + return x + (y - x) * (6 * t ** 5 - 15 * t ** 4 + 10 * t ** 3); + } + + // Function g + function g(x, y, z, w) { + const dx = x - z; + const dy = y - w; + return dotProduct([dx, dy], d(z + w * 6 + 1)); + } + + // Main function h + const x0 = Math.floor(x); + const x1 = Math.ceil(x); + const y0 = Math.floor(y); + const y1 = Math.ceil(y); + + const g00 = g(x, y, x0, y0); + const g10 = g(x, y, x1, y0); + const g01 = g(x, y, x0, y1); + const g11 = g(x, y, x1, y1); + + const fx = f(g00, g10, x - x0); + const fy = f(g01, g11, x - x0); + + return Math.sqrt(2) * f(fx, fy, y - y0); +} +elements.experience = { + color: ["#e0fc2c", "#c2f62b", "#a3f02f", "#83e935", "#5ee13d"], + behavior: behaviors.SUPERFLUID, + density: 1600, + category: "minecraft", + tick: function(pixel){ + /* + if (typeof pixel.rSeed != "number"){delete pixel.rSeed} + if (!pixel.rSeed){pixel.rSeed = Math.random()} + */ + let scaling = getScalingFactor(width, height) + pixel.rSeed = badNoise(xpNoise(Math.sin(pixelTicks/30)), pixel.x/scaling, pixel.y/scaling) + pixel.color = "rgb(" + 70*(Math.sin((4*Math.PI)*pixelTicks/70 + 3*pixel.rSeed)+2.5) + ", 235, 80)" + if (typeof pixel.storedPixel != "undefined" && Math.random() < 0.8){ + deletePixel(pixel.x, pixel.y) + turnIntoSpecific(pixel) + return; + } else if (pixel.storedPixel){delete pixel.storedPixel} + /* // average rseed of neighbors + for (var i = 0; i < adjacentCoords.length; i++) { + var x = pixel.x + adjacentCoords[i][0] + var y = pixel.y + adjacentCoords[i][1] + if (!isEmpty(x,y,true)){ + let otherPixel = pixelMap[x][y] + if (otherPixel.element == "experience"){ + let sum1 = weightedAverage((pixel.rSeed || Math.random()), (otherPixel.rSeed || Math.random()), 0.95) + let sum2 = weightedAverage((pixel.rSeed || Math.random()), (otherPixel.rSeed || Math.random()), 0.05) + pixel.rSeed = sum1 + otherPixel.rSeed = sum2 + pixel.rSeed += (Math.random()/100)-0.005 + otherPixel.rSeed += (Math.random()/100)-0.005 + } + } + } + */ + }, + glow: true, +} + if (!elements.bless.reactions){elements.bless.reactions = {}} + elements.bless.reactions.sculk = {func: turnIntoSpecific, chance: 0.01} +elements.warden = { + color: "#09273f", + category: "minecraft", + properties: { + dead: false, + dir: 1, + }, + tick: function(pixel) { + if (isEmpty(pixel.x, pixel.y+1)) { + createPixel("warden_body", pixel.x, pixel.y+1); + pixel.element = "warden_head"; + } + else if (isEmpty(pixel.x, pixel.y-1)) { + createPixel("warden_head", pixel.x, pixel.y-1); + pixelMap[pixel.x][pixel.y-1].color = pixel.color; + pixel.element = "warden_body"; + pixel.color = pixelColorPick(pixel) + } + else { + deletePixel(pixel.x, pixel.y); + } + }, + related: ["warden_body","warden_head"], + cooldown: defaultCooldown, +} +elements.warden_body = { + color: "#030b16", + category: "minecraft", + hidden: true, + density: 1500, + state: "solid", + conduct: .05, + properties: { + dead: false, + dir: 1, + panic: 0 + }, + tick: function(pixel) { + age = pixelTicks - pixel.start; + if (age > 15*30){ + deletePixel(pixel.x, pixel.y); + } + 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"); + // } + deletePixel(pixel.x, pixel.y); + return + } + } + + // Find the head + if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "warden_head") { + var head = pixelMap[pixel.x][pixel.y-1]; + if (head.dead) { // If head is dead, kill body + pixel.dead = head.dead; + } + } + else { var head = null } + if (pixel.burning) { + pixel.panic += 0.1; + if (head && pixelTicks-pixel.burnStart > 240) { + pixel.color = head.color; + } + } + else if (pixel.panic > 0) { + pixel.panic -= 0.1; + } + + 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], + ]; + // 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]); + break; + } + } + } + // 15% chance to change direction + if (Math.random() < 0.15) { + pixel.dir *= -1; + } + // homeostasis + if (pixel.temp > 37) { pixel.temp -= 1; } + else if (pixel.temp < 37) { pixel.temp += 1; } + } + + }, + reactions: {} +}, +elements.warden_head = { + color: "#145377", + category: "minecraft", + hidden: true, + density: 1080, + state: "solid", + conduct: .05, + properties: { + dead: false + }, + tick: function(pixel) { + age = pixelTicks - pixel.start; + if (age > 15*30){ + deletePixel(pixel.x, pixel.y); + } + 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"); + deletePixel(pixel.x, pixel.y); + return + } + } + + // Find the body + if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "warden_body") { + var body = pixelMap[pixel.x][pixel.y+1]; + if (body.dead) { // If body is dead, kill head + pixel.dead = body.dead; + } + } + else { var body = null; pixel.dead = pixelTicks } + + if (tryMove(pixel, pixel.x, pixel.y+1)) { + // create blood if severed 10% chance + if (isEmpty(pixel.x, pixel.y+1) && !pixel.dead && Math.random() < 0.1 && !pixel.charge) { + // createPixel("blood", pixel.x, pixel.y+1); + // set dead to true 15% chance + // if (Math.random() < 0.15) { + pixel.dead = pixelTicks; + } + // } + } + // homeostasis + if (pixel.temp > 37) { pixel.temp -= 1; } + else if (pixel.temp < 37) { pixel.temp += 1; } + }, + reactions: {} +} +for (i = 0; i < wardenMurderList.length; i++){ + let e = wardenMurderList[i] + elements.warden_head.reactions[e] = {elem2: "meat", chance: 0.5} + elements.warden_body.reactions[e] = {elem2: "meat", chance: 0.5} +} +setInterval(function(){ + if (canPlaySculk > 0){ + canPlaySculk -- + } + if (typeof currentPixels != "undefined"){ + totalSculk = { + sculk: 0, + wardens: 0, + sensors: 0, + shriekers: 0 + } + for (let i in currentPixels){ + let pixel = currentPixels[i] + if (pixel.element == "warden_body"){ + totalSculk.wardens ++ + } else if (pixel.element == "sculk"){ + if (pixel.type == "sculk"){ + totalSculk.sculk ++ + } else if (pixel.type == "sensor"){ + totalSculk.sensors ++ + } else if (pixel.type == "shrieker"){ + totalSculk.shriekers ++ + } + } + } + } + if (wardenCooldown > 0){ + wardenCooldown -- + } +}, 1000/30) +let channelVar = "0" +elements.sculk_wifi_transmitter = { + color: "#142c47", + category: "minecraft", + behaviors: behaviors.WALL, + tempHigh: 250, + stateHigh: "dirt", + hoverStat: function(pixel){ + return pixel.channel || "unset" + }, + onSelect: function(){ + let ans1 = prompt("What channel should this transmitter be? Wont work if you do multiple while paused. (This is meant to be used in machinery!)", channelVar||0) + channelVar = ans1 + }, + tick: function(pixel){ + if (!pixel.channel){pixel.channel = channelVar} + for (let i in currentPixels){ + let otherPixel = currentPixels[i] + if (otherPixel.element == "sculk_wifi_receiver" && otherPixel.channel == pixel.channel){ + for (var j = 0; j < adjacentCoords.length; j++){ + let coord = adjacentCoords[j] + let x = otherPixel.x + coord[0] + let y = otherPixel.y + coord[1] + if (!isEmpty(x, y, true)){ + let neighborPixel = pixelMap[x][y] + if (elements[neighborPixel.element].conduct){ + neighborPixel.charge = pixel.charge + } + } + } + } + } + if (pixel.charge && canPlaySculk <= 0){ + canPlaySculk = 25 + playSculk() + } + doDefaults(pixel) + }, + conduct: 1 +} +elements.sculk_wifi_receiver = { + color: "#142c47", + category: "minecraft", + behaviors: behaviors.WALL, + tempHigh: 250, + stateHigh: "dirt", + hoverStat: function(pixel){ + return pixel.channel || "unset" + }, + onSelect: function(){ + let ans1 = prompt("What channel should this receiver be? Wont work if you do multiple while paused. (This is meant to be used in machinery!)", channelVar||0) + channelVar = ans1 + }, + tick: function(pixel){ + if (!pixel.channel){pixel.channel = channelVar} + } +} \ No newline at end of file diff --git a/mods/nousersthings.js b/mods/nousersthings.js index 2add5a22..375024d9 100644 --- a/mods/nousersthings.js +++ b/mods/nousersthings.js @@ -307,11 +307,6 @@ elements.technetium = { }, elements.destroyable_pipe = { color: "#414c4f", - onSelect: function() { - if(!enabledMods.contains("mods/nousersthings.js")){ - logMessage("credit to nousersthings.js for this element") - } - }, tick: function(pixel) { if (!pixel.stage && pixelTicks-pixel.start > 60) { for (var i = 0; i < squareCoords.length; i++) { @@ -2672,9 +2667,9 @@ elements.healing_serum = { pixel.waitReduce = true } if (pixel.wait == 0){ - if (!pixel.elementsSeen[pixelMap[x][y].element] && pixelMap[x][y].element != "healing_serum"){ + if (!pixel.elementsSeen[pixelMap[x][y].element] && !(["healing_serum", "bless", "experience"].includes(pixelMap[x][y].element))){ pixel.elementsSeen[pixelMap[x][y].element] = 1 - } else if (pixelMap[x][y].element != "healing_serum") { + } else if (!(["healing_serum", "bless", "experience"].includes(pixelMap[x][y].element))) { pixel.elementsSeen[pixelMap[x][y].element] += 1 } } @@ -2941,6 +2936,7 @@ elements.run_some_code = { color: "#68b2cf", category: "tools", canPlace: false, + tool: function(){}, onSelect: function(){ let code = prompt("Enter code to run") if (code){ @@ -3454,4 +3450,4 @@ elements.outer_outliner = { } deletePixel(pixel.x, pixel.y) } -} \ No newline at end of file +}