diff --git a/mods/tech.js b/mods/tech.js index a01b4c45..cfa216a8 100644 --- a/mods/tech.js +++ b/mods/tech.js @@ -98,6 +98,7 @@ elements.nvidia_cpu = { "XX|SH|XX", ], category: "tech", + temp: 25, // Starting temperature (room temperature in Celsius) tempHigh: 1000, // Melting point for realism stateHigh: "molten_silicon", // Assuming it melts into molten silicon reactions: { @@ -106,11 +107,47 @@ elements.nvidia_cpu = { "acid": { elem1: "corroded_cpu", elem2: "null" }, "poison": { elem1: "corroded_cpu", elem2: "null" }, }, - breakInto: ["silicon", "metal_scrap"], + breakInto: ["silicon", "metal_fragments"], conduct: 10, // Moderate conductivity density: 2330, // Density of silicon + tick: function(pixel) { + if (!pixel.heatTick) { + pixel.heatTick = 0; + } + pixel.heatTick++; + if (pixel.heatTick >= 300) { // 300 ticks ~ 5 seconds + pixel.temp += 2; // Increase temperature by 2 degrees Celsius + pixel.heatTick = 0; // Reset heatTick counter + } + + // Check for cooling fan nearby + let cooled = false; + for (let dx = -1; dx <= 1; dx++) { + for (let dy = -1; dy <= 1; dy++) { + if (dx === 0 && dy === 0) continue; + let neighbor = pixelMap[pixel.x + dx]?.[pixel.y + dy]; + if (neighbor && neighbor.element === "spinning_cooler_fan") { + cooled = true; + } + } + } + + if (cooled) { + if (!pixel.coolTick) { + pixel.coolTick = 0; + } + pixel.coolTick++; + if (pixel.coolTick >= 300) { // 300 ticks ~ 5 seconds + pixel.temp -= 2; // Decrease temperature by 2 degrees Celsius + pixel.coolTick = 0; // Reset coolTick counter + } + } else { + pixel.coolTick = 0; // Reset coolTick counter if no cooler is nearby + } + }, }; + elements.molten_silicon = { color: "#ffcc99", behavior: behaviors.LIQUID, @@ -149,3 +186,97 @@ elements.silicon = { density: 2330, }; +elements.glowing_rainbow_led = { + color: ["#FF0000", "#FF7F00", "#FFFF00", "#00FF00", "#0000FF", "#4B0082", "#8B00FF"], // Colors of the rainbow + behavior: [ + "XX|XX|XX", + "XX|SH|XX", + "XX|XX|XX", + ], + category: "tech", + state: "solid", + density: 300, // Arbitrary density for LED + tempHigh: 150, // Melting point for realism + stateHigh: "molten_plastic", + reactions: { + "water": { elem1: "short_circuit", elem2: "steam" }, + "salt_water": { elem1: "short_circuit", elem2: "null" }, + "acid": { elem1: "corroded_led", elem2: "null" }, + "poison": { elem1: "corroded_led", elem2: "null" }, + }, + tick: function(pixel) { + // Function to cycle through colors + if (!pixel.colorIndex) { + pixel.colorIndex = 0; // Initialize color index + } + pixel.colorIndex = (pixel.colorIndex + 1) % elements.glowing_rainbow_led.color.length; + pixel.color = elements.glowing_rainbow_led.color[pixel.colorIndex]; + }, +}; + +elements.corroded_led = { + color: "#707070", + behavior: behaviors.POWDER, + category: "tech", + tempHigh: 800, + stateHigh: "ash", + conduct: 1, +}; + +elements.spinning_cooler_fan = { + color: "#4a90e2", // Blue color for the fan + behavior: [ + "XX|XX|XX", + "XX|XX|XX", + "XX|XX|XX", + ], + category: "tech", + state: "solid", + density: 800, // Arbitrary density for the fan + tick: function(pixel) { + // Define movement pattern + if (!pixel.moveStep) { + pixel.moveStep = 0; // Initialize movement step + } + + // Determine the current movement direction + let directions = [ + {dx: 0, dy: -1}, // Move up + {dx: 1, dy: 0}, // Move right + {dx: 0, dy: 1}, // Move down + {dx: -1, dy: 0} // Move left + ]; + + let move = directions[pixel.moveStep]; + + // Attempt to move in the current direction + let newX = pixel.x + move.dx; + let newY = pixel.y + move.dy; + + if (isEmpty(newX, newY)) { + // If the next position is empty, move there + movePixel(pixel, newX, newY); + } + + // Advance to the next step in the movement pattern + pixel.moveStep = (pixel.moveStep + 1) % directions.length; + }, +}; + +function isEmpty(x, y) { + // Check if the position (x, y) is empty + if (x >= 0 && y >= 0 && x < width && y < height) { + return !pixelMap[x][y]; + } + return false; +} + +function movePixel(pixel, newX, newY) { + // Move the pixel to the new position + if (isEmpty(newX, newY)) { + pixelMap[pixel.x][pixel.y] = null; // Clear the current position + pixel.x = newX; + pixel.y = newY; + pixelMap[newX][newY] = pixel; // Set the new position + } +}