diff --git a/mod.js b/mod.js index 968342c..709fb3f 100644 --- a/mod.js +++ b/mod.js @@ -1,61 +1,46 @@ -// my1stmod.js - A configurable delay element for Sandboxels -// When powered from the bottom, it waits for a delay then outputs power to the top -// When powered from the sides, it changes the delay duration +// my1stmod.js - Configurable delay gate for Sandboxels elements.delay_gate = { - color: "#8B4513", // Saddle brown color - behavior: [ - ["XX","SH:delay_gate","XX"], // Top: outputs shock to above - ["SH:delay_gate","XX","SH:delay_gate"], // Sides: accept input to change delay - ["XX","SH","XX"] // Bottom: accept power input - ], + color: "#8B4513", + behavior: behaviors.wall, // Fixed: lowercase 'wall' category: "machines", state: "solid", - conduct: 1, // Conducts electricity + conduct: 1, // Added: allows receiving power properties: { - delay: 30, // Default delay in ticks (0.5 seconds at 60fps) - timer: 0, // Current timer count - powered: false // Is currently receiving power? + delay: 30, // Delay in ticks + timer: 0, // Current countdown + powered: false // Is receiving power from below? }, tick: function(pixel) { - // Initialize properties if not set + // Initialize properties if (pixel.delay === undefined) pixel.delay = 30; if (pixel.timer === undefined) pixel.timer = 0; if (pixel.powered === undefined) pixel.powered = false; - // Check for power input from below (pixel.y + 1) + // Check power from below (input) let below = getPixel(pixel.x, pixel.y + 1); - let receivingPower = false; + let receivingPower = below && (below.charge || below.chargeCD); - if (below && (below.charge || below.chargeCD)) { - receivingPower = true; - } - - // Check for side inputs to adjust delay (left = decrease, right = increase) + // Check side inputs for delay adjustment let left = getPixel(pixel.x - 1, pixel.y); let right = getPixel(pixel.x + 1, pixel.y); - // Left side powered = decrease delay (faster) + // Left side = decrease delay (minimum 5) if (left && (left.charge || left.chargeCD) && pixel.delay > 5) { pixel.delay--; - // Visual feedback - flash lighter - pixel.color = "#A0522D"; - setTimeout(() => { - if (pixel) pixel.color = "#8B4513"; - }, 100); + pixel.color = "#A0522D"; // Flash lighter } - - // Right side powered = increase delay (slower) - if (right && (right.charge || right.chargeCD) && pixel.delay < 300) { + // Right side = increase delay (maximum 300) + else if (right && (right.charge || right.chargeCD) && pixel.delay < 300) { pixel.delay++; - // Visual feedback - flash darker - pixel.color = "#654321"; - setTimeout(() => { - if (pixel) pixel.color = "#8B4513"; - }, 100); + pixel.color = "#654321"; // Flash darker + } + else if (!receivingPower || pixel.timer >= pixel.delay) { + // Reset color when not adjusting + pixel.color = "#8B4513"; } - // Handle power delay logic + // Main delay logic if (receivingPower) { if (!pixel.powered) { // Just started receiving power @@ -63,52 +48,28 @@ elements.delay_gate = { pixel.timer = 0; } - // Increment timer while powered pixel.timer++; - // Check if delay reached - if (pixel.timer >= pixel.delay) { - // Output power to above - let above = getPixel(pixel.x, pixel.y - 1); - if (above && above.conduct) { - above.charge = 1; - above.chargeCD = 5; // Charge cooldown - } - // Visual indicator - turn yellow when outputting - pixel.color = "#FFD700"; - } else { - // Waiting state - pulsing color based on progress + // Visual progress indication + if (pixel.timer < pixel.delay) { let progress = pixel.timer / pixel.delay; - let r = Math.floor(139 + (255 - 139) * progress); - let g = Math.floor(69 + (215 - 69) * progress); - let b = Math.floor(19 + (0 - 19) * progress); - pixel.color = `rgb(${r},${g},${b})`; + let r = Math.floor(139 + (100 * progress)); + pixel.color = `rgb(${r}, 69, 19)`; + } + + // Output when delay reached + if (pixel.timer >= pixel.delay) { + let above = getPixel(pixel.x, pixel.y - 1); + if (above && elements[above.element].conduct) { + above.charge = 1; + above.chargeCD = 5; + } + pixel.color = "#FFD700"; // Gold = outputting } } else { - // No power input - if (pixel.powered) { - // Just lost power, reset - pixel.powered = false; - pixel.timer = 0; - pixel.color = "#8B4513"; - } + // Lost power, reset + pixel.powered = false; + pixel.timer = 0; } } -}; - -// Optional: Add a tool to manually set delay values -elements.delay_setter = { - color: "#4B0082", - tool: function(pixel) { - if (pixel.element === "delay_gate") { - // Cycle through preset delays: 10, 30, 60, 120, 300 ticks - const delays = [10, 30, 60, 120, 300]; - let currentIdx = delays.indexOf(pixel.delay); - let nextIdx = (currentIdx + 1) % delays.length; - pixel.delay = delays[nextIdx]; - logMessage(`Delay set to ${pixel.delay} ticks`); - } - }, - category: "tools", - desc: "Click on a Delay Gate to cycle through delay presets" }; \ No newline at end of file