diff --git a/mods/sky.js b/mods/sky.js index 6db94f67..03c56dd7 100644 --- a/mods/sky.js +++ b/mods/sky.js @@ -2,7 +2,7 @@ if (!enabledMods.includes("mods/betterSettings.js")) { enabledMods.unshift("mods var sky_settingsTab = new SettingsTab("Sky"); -var realtime_setting = new Setting("Use real life time for sky", "real_time", settingType.BOOLEAN, false, defaultValue=true); +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); @@ -12,78 +12,80 @@ sky_settingsTab.registerSettings("Ticks per hour", ticks_per_hour_setting); settingsManager.registerTab(sky_settingsTab); -var hour = initial_hour_setting.value; - -function lerpColor(start, end, t) { - return start.map((s, i) => Math.round(s + (end[i] - s) * t)); +//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 getSkyColors(hour) { - const SKY_COLOR_PAIRS = [ - [[0, 0, 15], [0, 0, 30]], // midnight - [[10, 10, 40], [20, 20, 60]], - [[255, 100, 50], [255, 150, 100]], - [[135, 206, 235], [180, 230, 255]], - [[135, 206, 250], [135, 206, 255]], - [[135, 206, 250], [120, 190, 240]], - [[255, 150, 100], [120, 70, 70]], - [[30, 15, 60], [20, 10, 40]], - [[0, 0, 15], [0, 0, 30]], // midnight - ]; + const SKY_COLOR_PAIRS = [ + [[0, 0, 15], [0, 0, 30]], // midnight + [[10, 10, 40], [20, 20, 60]], + [[255, 100, 50], [255, 150, 100]], + [[135, 206, 235], [180, 230, 255]], + [[135, 206, 250], [135, 206, 255]], + [[135, 206, 250], [120, 190, 240]], + [[255, 150, 100], [120, 70, 70]], + [[30, 15, 60], [20, 10, 40]], + [[0, 0, 15], [0, 0, 30]], // midnight + ]; - // Determine the interval (each interval is 3 hours) - const index = Math.floor(hour / 3); - const t = (hour % 3) / 3; + // Determine the interval (each interval is 3 hours) + const index = Math.floor(hour / 3); + const t = (hour % 3) / 3; - const [bottomStart, topStart] = SKY_COLOR_PAIRS[index]; - const [bottomEnd, topEnd] = SKY_COLOR_PAIRS[index + 1]; + const [bottomStart, topStart] = SKY_COLOR_PAIRS[index]; + const [bottomEnd, topEnd] = SKY_COLOR_PAIRS[index + 1]; - return { - skyTop: `rgb(${lerpColor(topStart, topEnd, t).join(", ")})`, - skyBottom: `rgb(${lerpColor(bottomStart, bottomEnd, t).join(", ")})`, - }; + return { + skyTop: `rgb(${lerpColor(topStart, topEnd, t).join(", ")})`, + skyBottom: `rgb(${lerpColor(bottomStart, bottomEnd, t).join(", ")})`, + }; } function renderSky(ctx) { - const { skyTop, skyBottom } = getSkyColors(hour); - const gradient = ctx.createLinearGradient(0, 0, 0, height * pixelSize); + // 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); - gradient.addColorStop(0, skyTop); - gradient.addColorStop(1, skyBottom); - - ctx.fillStyle = gradient; - ctx.fillRect(0, 0, width * pixelSize, height * pixelSize); + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, (width + 1) * pixelSize, (height + 1) * pixelSize); } function updateDayTime() { - if (realtime_setting.value) { - const now = new Date(); - hour = now.getHours() + now.getMinutes() / 60; - } else { - hour = (hour + (1 / ticks_per_hour_setting.value)) % 24; // Keep within 0-23 - } + if (paused) {return;} + + if (realtime_setting.value) { + const now = new Date(); + hour = now.getHours() + now.getMinutes() / 60; + } else { + hour = (hour + (1 / ticks_per_hour_setting.value)) % 24; // Keep within 0-23 + } } -// Make sure the sky gets VIP treatment in the render list +// Sky should be first layer function prioritizeRenderSky() { - const idx = renderPrePixelList.indexOf(renderSky); - if (idx !== -1) { - const [skyFn] = renderPrePixelList.splice(idx, 1); - renderPrePixelList.unshift(skyFn); - } + const idx = renderPrePixelList.indexOf(renderSky); + if (idx !== -1) { + const [skyFn] = renderPrePixelList.splice(idx, 1); + renderPrePixelList.unshift(skyFn); + } } // Resetting canvas also resets time -function initializeCanvas() { - const resizeCanvas = autoResizeCanvas; - autoResizeCanvas = (clear) => { - resizeCanvas(clear); - hour = initial_hour_setting.value; - }; +function initializeSky() { + hour = initial_hour_setting.value; } // Hooks -setTimeout(initializeCanvas, 500); +runAfterReset(initializeSky); runAfterLoad(prioritizeRenderSky); runEveryTick(updateDayTime); renderPrePixel(renderSky); + +var hour = initial_hour_setting.value;