From e5e2dc651b08908c69a15469929471590b6f7206 Mon Sep 17 00:00:00 2001 From: redbirdly <155550833+redbirdly@users.noreply.github.com> Date: Sat, 22 Feb 2025 13:34:24 +0800 Subject: [PATCH 1/3] Update clouds.js --- mods/clouds.js | 117 ++++++++++++++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 45 deletions(-) diff --git a/mods/clouds.js b/mods/clouds.js index ab31d62a..7a0df66a 100644 --- a/mods/clouds.js +++ b/mods/clouds.js @@ -1,70 +1,91 @@ // Clouds.js +if (!enabledMods.includes("mods/betterSettings.js")) { enabledMods.unshift("mods/betterSettings.js"); localStorage.setItem("enabledMods", JSON.stringify(enabledMods)); window.location.reload() }; + +var clouds_settingsTab = new SettingsTab("Clouds"); + +var cloud_count_setting = new Setting("Cloud count", "cloud_count", settingType.NUMBER, false, defaultValue=40); + +clouds_settingsTab.registerSettings("Real time", cloud_count_setting); + +settingsManager.registerTab(clouds_settingsTab); + // Biased random function randomGaussian(A, B, biasFactor=2) { - let u = Math.random(); - let v = Math.random(); - let num = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v); + let u = Math.random(); + let v = Math.random(); + let num = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v); - let mean = (A + B) / 2; - let stdDev = (B - A) / biasFactor; + let mean = (A + B) / 2; + let stdDev = (B - A) / biasFactor; + let result = mean + num * stdDev; - let result = mean + num * stdDev; - - return Math.min(Math.max(result, A), B); + return Math.min(Math.max(result, A), B); } -// Spawn clouds -var clouds = []; -setTimeout(() => { - for (var i = 0;i < 50;i++) { - var w = (Math.random() * 11) + 6; - var h = (Math.random() * 7) + 3; +function randomBetween(A, B) { + return Math.random() * (B - A) + A; +} - // Higher clouds = faster - var y = randomGaussian(0, height * 0.75, 5); - var speedFactor = (1 - (y / (height * 0.75))); +function initClouds(amount) { + for (let i = 0; i < amount; i++) { + var w = randomBetween(6, 17); + var h = randomBetween(4, 10); + var x = randomBetween(0, width - w); + var y = randomGaussian(0, height * 0.75, 4); - clouds.push({ - x: Math.random() * (width - w), - y: y, - w: w, - h: h, - dx: ((Math.random() - 0.5) * 0.05) * (0.5 + speedFactor * 2), // Velocity - color: Math.random() > 0.5 ? "255,255,255" : "210,210,190", - blur: Math.random() * 3 + 1 - }); + // Higher clouds move faster + var speedBoost = 1 - (y / (height * 0.75)); + var speed = ((Math.random() - 0.5) * 0.05) * (0.5 + speedBoost * 2); + + var color = Math.random() > 0.5 ? "255,255,255" : "210,210,190"; + var blur = Math.max(Math.min(1 / (Math.abs(speed) * 48), 4), 0); // For parallax + + // Pre-render the cloud + var offCanvas = document.createElement("canvas"); + var margin = blur; + offCanvas.width = w * pixelSize + 2 * margin; + offCanvas.height = h * pixelSize + 2 * margin; + var offCtx = offCanvas.getContext("2d"); + + var gradient = offCtx.createLinearGradient(0, margin, 0, h * pixelSize + margin); + gradient.addColorStop(0, `RGBA(${color},0.12)`); + gradient.addColorStop(1, `RGBA(${color},0.24)`); + + offCtx.filter = `blur(${blur}px)`; + offCtx.fillStyle = gradient; + offCtx.fillRect(margin, margin, w * pixelSize, h * pixelSize); + + clouds.push({ x, y, w, h, speed, color, blur, image: offCanvas, margin }); } -}, 600); +} function renderClouds(ctx) { - ctx.strokeStyle = "transparent"; - ctx.globalAlpha = Math.min(pixelTicks * 0.02,1); + // Fade in + ctx.globalAlpha = Math.min(pixelTicks * 0.02, 1); - for (var i = 0;i < clouds.length;i++) { + for (var i = 0; i < clouds.length; i++) { var cloud = clouds[i]; - - var gradient = ctx.createLinearGradient( - cloud.x * pixelSize, cloud.y * pixelSize, - cloud.x * pixelSize, (cloud.y + cloud.h) * pixelSize + ctx.drawImage( + cloud.image, + cloud.x * pixelSize - cloud.margin, + cloud.y * pixelSize - cloud.margin ); - gradient.addColorStop(0, `RGBA(${cloud.color},0.1)`); - gradient.addColorStop(1, `RGBA(${cloud.color},0.2)`); - - ctx.filter = `blur(${cloud.blur}px)`; - ctx.fillStyle = gradient; - ctx.fillRect(cloud.x * pixelSize, cloud.y * pixelSize, cloud.w * pixelSize, cloud.h * pixelSize); - ctx.filter = "none"; } } function updateClouds() { - if (paused) {return;} + if (paused) { return; } - for (var i = 0;i < clouds.length;i++) { + if (cloud_count_setting.value != clouds.length) { + clouds = []; + initClouds(cloud_count_setting.value); + return; + } + + for (var i = 0; i < clouds.length; i++) { var cloud = clouds[i]; - - cloud.x += cloud.dx; + cloud.x += cloud.speed; // Wrap around if (cloud.x > width) { @@ -75,5 +96,11 @@ function updateClouds() { } } +// Hooks renderPrePixel(renderClouds); runEveryTick(updateClouds); + +var clouds = []; +runAfterReset(() => { + initClouds(cloud_count_setting.value); +}); From fe1e9a8963ac2818c4be89515debb42c08778c9e Mon Sep 17 00:00:00 2001 From: redbirdly <155550833+redbirdly@users.noreply.github.com> Date: Sat, 22 Feb 2025 17:51:41 +0800 Subject: [PATCH 2/3] make circuitcore.js draw circuit preview correctly, and use tabs instead of spaces --- mods/circuitcore.js | 248 ++++++++++++++++++++++---------------------- 1 file changed, 124 insertions(+), 124 deletions(-) diff --git a/mods/circuitcore.js b/mods/circuitcore.js index 39c4b35b..d8f54143 100644 --- a/mods/circuitcore.js +++ b/mods/circuitcore.js @@ -12,35 +12,35 @@ cc_settingsTab.registerSettings("OverHeating", cc_setting1); settingsManager.registerTab(cc_settingsTab); var colorPalette_4bit = [ - "#101820", "#37175F", "#5F1717", "#6F175F", - "#005F00", "#1563BF", "#7F401A", "#525252", - "#8F8F8F", "#EE8822", "#FF3027", "#FF47FF", - "#58E618", "#27FFDF", "#FFFF27", "#FFFFFF" + "#101820", "#37175F", "#5F1717", "#6F175F", + "#005F00", "#1563BF", "#7F401A", "#525252", + "#8F8F8F", "#EE8822", "#FF3027", "#FF47FF", + "#58E618", "#27FFDF", "#FFFF27", "#FFFFFF" ]; function hueLerp(value) { - // Clamp the value between -50 and 400 - if (value < -50) value = -50; - if (value > 400) value = 400; + // Clamp the value between -50 and 400 + if (value < -50) value = -50; + if (value > 400) value = 400; - let r, g, b; + let r, g, b; - if (value <= 300) { - // Interpolate between blue and red - let t = (value + 50) / 350; // Normalize value from -50 to 300 to a 0-1 range - r = Math.round(255 * t); - g = 0; - b = Math.round(255 * (1 - t)); - } else { - // Interpolate between red and white - let t = (value - 300) / 100; // Normalize value from 300 to 400 to a 0-1 range - r = 255; - g = Math.round(255 * t); - b = Math.round(255 * t); - } + if (value <= 300) { + // Interpolate between blue and red + let t = (value + 50) / 350; // Normalize value from -50 to 300 to a 0-1 range + r = Math.round(255 * t); + g = 0; + b = Math.round(255 * (1 - t)); + } else { + // Interpolate between red and white + let t = (value - 300) / 100; // Normalize value from 300 to 400 to a 0-1 range + r = 255; + g = Math.round(255 * t); + b = Math.round(255 * t); + } - // Convert RGB values to a hex string - return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1).toUpperCase(); + // Convert RGB values to a hex string + return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1).toUpperCase(); } function cc_rgbToArray(colorString) { @@ -76,7 +76,7 @@ function cc_rgbToArray(colorString) { } function cc_arrayToRgbString(rgbArray) { - return `rgb(${rgbArray.join(', ')})`; + return `rgb(${rgbArray.join(', ')})`; } function cc_scaleList(numbers, scale) { @@ -220,58 +220,58 @@ function setPin(pixel, pins, index, value, rotation=pixel.circuitRotation) { // Circuits elements.four_bit_selector_circuit = { - cc_stableTick: function(pixel) { - var pins = [ - // First 4-bit input (A) - [-1, -2, true], // A0 - [-3, -2, true], // A1 - [-5, -2, true], // A2 - [-7, -2, true], // A3 + cc_stableTick: function(pixel) { + var pins = [ + // First 4-bit input (A) + [-7, -2, true], // A0 + [-5, -2, true], // A1 + [-3, -2, true], // A2 + [-1, -2, true], // A3 - // Second 4-bit input (B) - [7, -2, true], // B0 - [5, -2, true], // B1 - [3, -2, true], // B2 - [1, -2, true], // B3 + // Second 4-bit input (B) + [1, -2, true], // B0 + [3, -2, true], // B1 + [5, -2, true], // B2 + [7, -2, true], // B3 - // Selection pin (Sel) - [9, 0, true], // Selection (Sel) + // Selection pin (Sel) + [9, 0, true], // Selection (Sel) - // Output (O) - [-3, 2, false], // O0 (centered) - [-1, 2, false], // O1 (centered) - [1, 2, false], // O2 (centered) - [3, 2, false], // O3 (centered) - ]; + // Output (O) + [-3, 2, false], // O0 (centered) + [-1, 2, false], // O1 (centered) + [1, 2, false], // O2 (centered) + [3, 2, false], // O3 (centered) + ]; - initializeCircuit(pixel, pins, 17, 3); + initializeCircuit(pixel, pins, 17, 3); - // Read inputs - var A = [ - checkPin(pixel, pins, 0), - checkPin(pixel, pins, 1), - checkPin(pixel, pins, 2), - checkPin(pixel, pins, 3) - ]; + // Read inputs + var A = [ + checkPin(pixel, pins, 0), + checkPin(pixel, pins, 1), + checkPin(pixel, pins, 2), + checkPin(pixel, pins, 3) + ]; - var B = [ - checkPin(pixel, pins, 4), - checkPin(pixel, pins, 5), - checkPin(pixel, pins, 6), - checkPin(pixel, pins, 7) - ]; + var B = [ + checkPin(pixel, pins, 4), + checkPin(pixel, pins, 5), + checkPin(pixel, pins, 6), + checkPin(pixel, pins, 7) + ]; - var Sel = checkPin(pixel, pins, 8); // Selection pin + var Sel = checkPin(pixel, pins, 8); // Selection pin - // Select between A and B based on Sel - var output = Sel ? B : A; + // Select between A and B based on Sel + var output = Sel ? B : A; - // Output the selected 4-bit value - setPin(pixel, pins, 9, output[0]); // O0 - setPin(pixel, pins, 10, output[1]); // O1 - setPin(pixel, pins, 11, output[2]); // O2 - setPin(pixel, pins, 12, output[3]); // O3 - } + // Output the selected 4-bit value + setPin(pixel, pins, 9, output[0]); // O0 + setPin(pixel, pins, 10, output[1]); // O1 + setPin(pixel, pins, 11, output[2]); // O2 + setPin(pixel, pins, 12, output[3]); // O3 + } }; elements.four_bit_enabler_circuit = { @@ -404,13 +404,13 @@ elements.four_bit_randomizer_circuit = { var tempVar = 0; elements.temperature_sensor = { - behavior: behaviors.WALL, + behavior: behaviors.WALL, onSelect: function() { - var answertemp = Number(prompt("Set your target temperature:",(tempVar||undefined))); - if (!answertemp) { return } + var answertemp = Number(prompt("Set your target temperature:",(tempVar||undefined))); + if (!answertemp) { return } tempVar = answertemp; - }, - hoverStat: function(pixel) { + }, + hoverStat: function(pixel) { return `TargetTmp: {pixel.targetTemp}`; }, cc_stableTick: function(pixel) { @@ -1335,67 +1335,67 @@ elements.four_bit_adder_circuit = { }; elements.four_bit_subtractor_circuit = { - cc_stableTick: function(pixel) { - var pins = [ - // First 4-bit number (A) - [-1, -2, true], // A3 - [-3, -2, true], // A2 - [-5, -2, true], // A1 - [-7, -2, true], // A0 + cc_stableTick: function(pixel) { + var pins = [ + // First 4-bit number (A) + [-1, -2, true], // A3 + [-3, -2, true], // A2 + [-5, -2, true], // A1 + [-7, -2, true], // A0 - // Second 4-bit number (B) - [7, -2, true], // B3 - [5, -2, true], // B2 - [3, -2, true], // B1 - [1, -2, true], // B0 + // Second 4-bit number (B) + [7, -2, true], // B3 + [5, -2, true], // B2 + [3, -2, true], // B1 + [1, -2, true], // B0 - // Borrow-in (B_in) - [9, 0, true], // Borrow-in (B_in) + // Borrow-in (B_in) + [9, 0, true], // Borrow-in (B_in) - // Output difference (D) - [-1, 2, false], // D3 - [-3, 2, false], // D2 - [-5, 2, false], // D1 - [-7, 2, false], // D0 - [1, 2, false], // Borrow Out (B4) - ]; + // Output difference (D) + [-1, 2, false], // D3 + [-3, 2, false], // D2 + [-5, 2, false], // D1 + [-7, 2, false], // D0 + [1, 2, false], // Borrow Out (B4) + ]; - initializeCircuit(pixel, pins, 17, 3); + initializeCircuit(pixel, pins, 17, 3); - // Read inputs - var A = [ - checkPin(pixel, pins, 0), - checkPin(pixel, pins, 1), - checkPin(pixel, pins, 2), - checkPin(pixel, pins, 3) - ]; + // Read inputs + var A = [ + checkPin(pixel, pins, 0), + checkPin(pixel, pins, 1), + checkPin(pixel, pins, 2), + checkPin(pixel, pins, 3) + ]; - var B = [ - checkPin(pixel, pins, 4), - checkPin(pixel, pins, 5), - checkPin(pixel, pins, 6), - checkPin(pixel, pins, 7) - ]; + var B = [ + checkPin(pixel, pins, 4), + checkPin(pixel, pins, 5), + checkPin(pixel, pins, 6), + checkPin(pixel, pins, 7) + ]; - var B_in = checkPin(pixel, pins, 8); // Borrow-in + var B_in = checkPin(pixel, pins, 8); // Borrow-in - // Calculate the difference and borrow - var difference = []; - var borrow = B_in; + // Calculate the difference and borrow + var difference = []; + var borrow = B_in; - for (var i = 0; i < 4; i++) { - var bitDifference = A[i] - B[i] - borrow; - difference[i] = (bitDifference + 2) % 2; // Current bit difference - borrow = bitDifference < 0 ? 1 : 0; // Borrow for next bit - } + for (var i = 0; i < 4; i++) { + var bitDifference = A[i] - B[i] - borrow; + difference[i] = (bitDifference + 2) % 2; // Current bit difference + borrow = bitDifference < 0 ? 1 : 0; // Borrow for next bit + } - // Output the difference - setPin(pixel, pins, 9, difference[0]); // D0 - setPin(pixel, pins, 10, difference[1]); // D1 - setPin(pixel, pins, 11, difference[2]); // D2 - setPin(pixel, pins, 12, difference[3]); // D3 - setPin(pixel, pins, 13, borrow); // Borrow Out (B4) - } + // Output the difference + setPin(pixel, pins, 9, difference[0]); // D0 + setPin(pixel, pins, 10, difference[1]); // D1 + setPin(pixel, pins, 11, difference[2]); // D2 + setPin(pixel, pins, 12, difference[3]); // D3 + setPin(pixel, pins, 13, borrow); // Borrow Out (B4) + } }; function general_clock(speed, s2) { @@ -1930,7 +1930,7 @@ document.addEventListener('keydown', function(event) { } }); -function drawCircuitExtras() { +function drawCircuitExtras(ctx) { if (elements[currentElement].isCircuitCore && elements[currentElement].previewSize) { var circuitWidth = elements[currentElement].previewSize[0]; var circuitHeight = elements[currentElement].previewSize[1]; From ad14587fbb82b09a03bd7583ef2398cf18f21a2e Mon Sep 17 00:00:00 2001 From: redbirdly <155550833+redbirdly@users.noreply.github.com> Date: Sat, 22 Feb 2025 17:52:47 +0800 Subject: [PATCH 3/3] make wifi_draw.js draw connections correctly, and use tabs instead of spaces --- mods/wifi_draw.js | 132 +++++++++++++++++++++++----------------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/mods/wifi_draw.js b/mods/wifi_draw.js index 41bf5ad1..0d7c5e93 100644 --- a/mods/wifi_draw.js +++ b/mods/wifi_draw.js @@ -7,80 +7,80 @@ let receivers = []; let transmitters = []; function updateLogicLists() { - receivers = []; - transmitters = []; - logicReceivers = []; + receivers = []; + transmitters = []; + logicReceivers = []; logicTransmitters = []; - - for (let i = 0; i < currentPixels.length; i++) { - const pixel = currentPixels[i]; - if (pixel.element === "logic_receiver") { - logicReceivers.push(pixel); - } else if (pixel.element === "logic_transmitter") { - logicTransmitters.push(pixel); - } else if (pixel.element === "receiver") { - receivers.push(pixel); - } else if (pixel.element === "transmitter") { - transmitters.push(pixel); - } - } + + for (let i = 0; i < currentPixels.length; i++) { + const pixel = currentPixels[i]; + if (pixel.element === "logic_receiver") { + logicReceivers.push(pixel); + } else if (pixel.element === "logic_transmitter") { + logicTransmitters.push(pixel); + } else if (pixel.element === "receiver") { + receivers.push(pixel); + } else if (pixel.element === "transmitter") { + transmitters.push(pixel); + } + } } // Function to draw lines between linked transmitters and receivers -function drawLinks() { - // Iterate through transmitters and receivers to draw lines for linked channels - for (const transmitter of logicTransmitters) { - for (const receiver of logicReceivers) { - if (transmitter.channel === receiver.channel) { - ctx.beginPath(); - ctx.moveTo(transmitter.x * pixelSize + pixelSizeHalf, transmitter.y * pixelSize + pixelSizeHalf); - ctx.lineTo(receiver.x * pixelSize + pixelSizeHalf, receiver.y * pixelSize + pixelSizeHalf); - ctx.strokeStyle = "RGBA(255,255,255,0.2)"; +function drawLinks(ctx) { + // Iterate through transmitters and receivers to draw lines for linked channels + for (const transmitter of logicTransmitters) { + for (const receiver of logicReceivers) { + if (transmitter.channel === receiver.channel) { + ctx.beginPath(); + ctx.moveTo(transmitter.x * pixelSize + pixelSizeHalf, transmitter.y * pixelSize + pixelSizeHalf); + ctx.lineTo(receiver.x * pixelSize + pixelSizeHalf, receiver.y * pixelSize + pixelSizeHalf); + ctx.strokeStyle = "RGBA(255,255,255,0.2)"; - const neighbors = [ - { x: transmitter.x, y: transmitter.y - 1 }, // Top - { x: transmitter.x, y: transmitter.y + 1 }, // Bottom - { x: transmitter.x - 1, y: transmitter.y }, // Left - { x: transmitter.x + 1, y: transmitter.y } // Right - ]; + const neighbors = [ + { x: transmitter.x, y: transmitter.y - 1 }, // Top + { x: transmitter.x, y: transmitter.y + 1 }, // Bottom + { x: transmitter.x - 1, y: transmitter.y }, // Left + { x: transmitter.x + 1, y: transmitter.y } // Right + ]; - let highlight = false; - for (const neighbor of neighbors) { - if ( - neighbor.x >= 0 && neighbor.x < width && - neighbor.y >= 0 && neighbor.y < height - ) { - const neighborPixel = pixelMap[neighbor.x][neighbor.y]; - if (neighborPixel && neighborPixel.lstate > 0) { - highlight = true; - break; - } - } - } + let highlight = false; + for (const neighbor of neighbors) { + if ( + neighbor.x >= 0 && neighbor.x < width && + neighbor.y >= 0 && neighbor.y < height + ) { + const neighborPixel = pixelMap[neighbor.x][neighbor.y]; + if (neighborPixel && neighborPixel.lstate > 0) { + highlight = true; + break; + } + } + } - if (highlight) { - ctx.strokeStyle = "RGBA(255,200,0,0.4)"; - } - - ctx.lineWidth = 2; - ctx.stroke(); - } - } - } + if (highlight) { + ctx.strokeStyle = "RGBA(255,200,0,0.4)"; + } + + ctx.lineWidth = 2; + ctx.stroke(); + } + } + } - // Iterate through transmitters and receivers to draw lines for linked channels - for (const transmitter of transmitters) { - for (const receiver of receivers) { - if (transmitter._channel === receiver._channel) { - ctx.beginPath(); - ctx.moveTo(transmitter.x * pixelSize + pixelSizeHalf, transmitter.y * pixelSize + pixelSizeHalf); - ctx.lineTo(receiver.x * pixelSize + pixelSizeHalf, receiver.y * pixelSize + pixelSizeHalf); - ctx.strokeStyle = "RGBA(0,0,255,0.2)"; - ctx.lineWidth = 2; - ctx.stroke(); - } - } - } + // Iterate through transmitters and receivers to draw lines for linked channels + for (const transmitter of transmitters) { + for (const receiver of receivers) { + if (transmitter._channel === receiver._channel) { + ctx.beginPath(); + ctx.moveTo(transmitter.x * pixelSize + pixelSizeHalf, transmitter.y * pixelSize + pixelSizeHalf); + ctx.lineTo(receiver.x * pixelSize + pixelSizeHalf, receiver.y * pixelSize + pixelSizeHalf); + ctx.strokeStyle = "RGBA(0,0,255,0.2)"; + ctx.lineWidth = 2; + ctx.stroke(); + } + } + } } renderPostPixel(updateLogicLists);