From 6659725b21f8e3e78597830ea507d42636763366 Mon Sep 17 00:00:00 2001 From: redbirdly <155550833+redbirdly@users.noreply.github.com> Date: Sun, 2 Mar 2025 10:30:18 +0800 Subject: [PATCH 1/2] Update lightmap.js --- mods/lightmap.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/mods/lightmap.js b/mods/lightmap.js index c4e38e32..45d9fc7d 100644 --- a/mods/lightmap.js +++ b/mods/lightmap.js @@ -6,14 +6,15 @@ var lightmapWidth, lightmapHeight; var lightmapScale = 2; var lightSourceBoost = 2; var pixelSizeQuarter = pixelSizeHalf / 2; -var falloff = 0.8; // BetterSettings.js integration var lightmap_settingsTab = new SettingsTab("Lightmap"); var resolution_setting = new Setting("Resolution (higher number = lower quality)", "resolution", settingType.NUMBER, false, defaultValue=2); +var falloff_setting = new Setting("Falloff (higher number = higher blur radius)", "falloff", settingType.NUMBER, false, defaultValue=0.8); lightmap_settingsTab.registerSettings("Resolution", resolution_setting); +lightmap_settingsTab.registerSettings("Falloff", falloff_setting); settingsManager.registerTab(lightmap_settingsTab); @@ -90,6 +91,7 @@ function propagateLightmap() { var width = lightmap[0].length; var height = lightmap.length; + var falloff = falloff_setting.value; var neighbors = [ { dx: 1, dy: 0 }, { dx: -1, dy: 0 }, @@ -313,6 +315,12 @@ elements.fire.tick = function(pixel) { glowItsOwnColor(pixel); }; +var originalColdFireTick2 = elements.cold_fire.tick; +elements.cold_fire.tick = function(pixel) { + originalColdFireTick2(pixel); + glowItsOwnColor(pixel); +}; + var originalFlashTick = elements.flash.tick; elements.flash.tick = function(pixel) { originalFlashTick(pixel); @@ -354,7 +362,6 @@ elements.sun.tick = glowItsOwnColor; elements.magma.tick = glowItsOwnColor; elements.plasma.tick = glowItsOwnColor; elements.fw_ember.tick = glowItsOwnColor; -elements.cold_fire.tick = glowItsOwnColor; var radioactiveElements = [ "uranium", "radiation", "rad_glass", "fallout", From d47e8db594f36b43e0ee9c273ad41e111e0c3db2 Mon Sep 17 00:00:00 2001 From: redbirdly <155550833+redbirdly@users.noreply.github.com> Date: Sun, 2 Mar 2025 10:30:43 +0800 Subject: [PATCH 2/2] Update sky.js --- mods/sky.js | 72 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 61 insertions(+), 11 deletions(-) diff --git a/mods/sky.js b/mods/sky.js index 03c56dd7..5fa58396 100644 --- a/mods/sky.js +++ b/mods/sky.js @@ -1,25 +1,47 @@ +// Sky.js + +// BetterSettings.js integration if (!enabledMods.includes("mods/betterSettings.js")) { enabledMods.unshift("mods/betterSettings.js"); localStorage.setItem("enabledMods", JSON.stringify(enabledMods)); window.location.reload() }; var sky_settingsTab = new SettingsTab("Sky"); var realtime_setting = new Setting("Use real life time for sky", "real_time", settingType.BOOLEAN, false, defaultValue=false); var initial_hour_setting = new Setting("Initial hour", "initial_hour", settingType.NUMBER, false, defaultValue=8); -var ticks_per_hour_setting = new Setting("Ticks per hour", "ticks_per_hour", settingType.NUMBER, false, defaultValue=150); +var ticks_per_hour_setting = new Setting("Ticks per hour", "ticks_per_hour", settingType.NUMBER, false, defaultValue=300); +var airtemp_setting = new Setting("Change air temperature based on time", "air_temp", settingType.BOOLEAN, false, defaultValue=true); +var drawSun = new Setting("Add sun", "drawSun", settingType.BOOLEAN, false, defaultValue=true); sky_settingsTab.registerSettings("Real time", realtime_setting); sky_settingsTab.registerSettings("Initial hour", initial_hour_setting); sky_settingsTab.registerSettings("Ticks per hour", ticks_per_hour_setting); +sky_settingsTab.registerSettings("Temperature", airtemp_setting); +sky_settingsTab.registerSettings("Sun", drawSun); settingsManager.registerTab(sky_settingsTab); -//function lerpColor(start, end, t) { -// return start.map((s, i) => Math.round(s + (end[i] - s) * t)); -//} // Destructuring makes it faster function lerpColor([r1, g1, b1], [r2, g2, b2], t) { return [r1 + (r2 - r1) * t, g1 + (g2 - g1) * t, b1 + (b2 - b1) * t].map(Math.round); } +function hourToTemp(hour, Tmin=10, Tmax=30) { + return Tmin + (Tmax - Tmin) * Math.pow(Math.sin((Math.PI / 24) * (hour - 4)), 2); +} + +function getSunPositionInRect(x_, y_, w, h) { + // Convert hour to angle + var angle = Math.PI * (18 - hour) / 12; + + // Convert angle to position + var centerX = x_ + (w / 2); + var centerY = y_ + h; + var radius = (w) / 2; + var x = centerX + radius * Math.cos(angle); + var y = centerY - radius * Math.sin(angle); + + return { angle, x, y }; +} + function getSkyColors(hour) { const SKY_COLOR_PAIRS = [ [[0, 0, 15], [0, 0, 30]], // midnight @@ -46,15 +68,38 @@ function getSkyColors(hour) { }; } -function renderSky(ctx) { +function drawSunSquare(ctx, sunPos, size, color, blur) { + ctx.save(); + ctx.filter = `blur(${blur}px)`; + ctx.translate(sunPos.x * pixelSize, sunPos.y * pixelSize); + ctx.rotate(sunPos.angle); + ctx.fillStyle = color; + ctx.fillRect(-size * 0.5, -size * 0.5, size, size); + ctx.restore(); +} + +function renderSkyAndSun(ctx) { // Get sky colors and make gradient const { skyTop, skyBottom } = getSkyColors(hour); const gradient = ctx.createLinearGradient(0, 0, 0, height * pixelSize); gradient.addColorStop(0, skyTop); gradient.addColorStop(1, skyBottom); + ctx.globalAlpha = 1.0; ctx.fillStyle = gradient; ctx.fillRect(0, 0, (width + 1) * pixelSize, (height + 1) * pixelSize); + + // Draw sun + if (hour < 5.5 || hour > 18.5) {return;} + if (!drawSun.value) {return;} + + var sunPos = getSunPositionInRect(width * 0.1, height * 0.1, width * 0.8, height * 0.9); + var sunSize = pixelSize * 9; + var nearSunSetOrRise = Math.pow((1 - Math.cos((Math.PI / 6) * hour)) / 2, 4); + var color = RGBToHex(lerpColor([255, 230, 225], [255, 160, 128], nearSunSetOrRise)); + + drawSunSquare(ctx, sunPos, sunSize, color, 5); // Glow + drawSunSquare(ctx, sunPos, sunSize * 0.75, "#FFFFFF", 1); } function updateDayTime() { @@ -64,28 +109,33 @@ function updateDayTime() { const now = new Date(); hour = now.getHours() + now.getMinutes() / 60; } else { - hour = (hour + (1 / ticks_per_hour_setting.value)) % 24; // Keep within 0-23 + var hours_per_tick = 1 / (ticks_per_hour_setting.value + 1); + hour = (hour + hours_per_tick) % 24; // Keep within 0-23 + } + + if (airtemp_setting.value) { + airTemp = hourToTemp(hour, 12, 26); } } // Sky should be first layer -function prioritizeRenderSky() { - const idx = renderPrePixelList.indexOf(renderSky); +function prioritizeSky() { + const idx = renderPrePixelList.indexOf(renderSkyAndSun); if (idx !== -1) { const [skyFn] = renderPrePixelList.splice(idx, 1); renderPrePixelList.unshift(skyFn); } } -// Resetting canvas also resets time +// Resetting canvas also resets hour function initializeSky() { hour = initial_hour_setting.value; } // Hooks runAfterReset(initializeSky); -runAfterLoad(prioritizeRenderSky); +runAfterLoad(prioritizeSky); runEveryTick(updateDayTime); -renderPrePixel(renderSky); +renderPrePixel(renderSkyAndSun); var hour = initial_hour_setting.value;