From 65fb5a46cb54e72c282d2ae5e5499a81a94e4dcc Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sun, 10 Aug 2025 19:37:40 -0700 Subject: [PATCH] Add Widescreen Backgrounds extension --- app.js | 33 +++++++++++++++++++++++++++++++-- index.html | 11 +++++++++++ src/sw.js | 7 +++++-- sw.js | 9 ++++++--- 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/app.js b/app.js index 43eed8e..838a136 100644 --- a/app.js +++ b/app.js @@ -33,6 +33,7 @@ document.addEventListener('DOMContentLoaded', function () { const afGroup = afSelect.closest('.form-group'); const rendererSelect = document.getElementById('renderer-select'); const hdTextures = document.getElementById('check-hd-textures'); + const widescreenBgs = document.getElementById('check-widescreen-bgs'); // --- Sound Toggle --- function updateSoundEmojiState() { @@ -212,12 +213,22 @@ document.addEventListener('DOMContentLoaded', function () { } } - if (hdTextures) { + if (hdTextures || widescreenBgs) { iniContent += "[extensions]\n"; + } + + if (hdTextures) { value = hdTextures.checked ? 'YES' : 'NO'; iniContent += `${hdTextures.name}=${value}\n`; } + siFiles = getSiFiles(); + if (siFiles.length > 0) { + iniContent += `SI Loader=YES\n`; + iniContent += "[si loader]\n"; + iniContent += `files=${siFiles.join(',')}\n`; + } + const workerCode = ` self.onmessage = async (e) => { if (e.data.action === 'save') { @@ -292,6 +303,11 @@ document.addEventListener('DOMContentLoaded', function () { applyConfigToForm(config) { const elements = this.form.elements; for (const key in config) { + if (key == "files") { + elements["Widescreen Backgrounds"].checked = config[key].includes("widescreen.si"); + continue; + } + const element = elements[key]; if (!element) continue; @@ -473,6 +489,10 @@ document.addEventListener('DOMContentLoaded', function () { checkInitialCacheStatus(); }); + widescreenBgs.addEventListener('change', () => { + checkInitialCacheStatus(); + }); + rendererSelect.addEventListener('change', () => { showOrHideGraphicsOptions(); }); @@ -491,12 +511,21 @@ document.addEventListener('DOMContentLoaded', function () { } } + function getSiFiles() { + siFiles = []; + if (widescreenBgs && widescreenBgs.checked) { + siFiles.push('/LEGO/extra/widescreen.si'); + } + return siFiles; + } + function checkInitialCacheStatus() { if (navigator.serviceWorker.controller) { navigator.serviceWorker.controller.postMessage({ action: 'check_cache_status', language: languageSelect.value, - hdTextures: hdTextures.checked + hdTextures: hdTextures.checked, + siFiles: getSiFiles(), }); } } diff --git a/index.html b/index.html index a271002..988baa7 100644 --- a/index.html +++ b/index.html @@ -426,6 +426,10 @@ HD Textures: Enhance the game's visuals with high-definition textures. An extra 25MB download is + required when this is enabled.

+ Widescreen Backgrounds (work-in-progress): Adapts the game's background art + for modern widescreen monitors, eliminating unwanted 3D backgrounds on the + sides of the screen. An extra 1MB download is required when this is enabled.
@@ -438,6 +442,13 @@ HD Textures +
+ + +
diff --git a/src/sw.js b/src/sw.js index cee5d2e..fc01211 100644 --- a/src/sw.js +++ b/src/sw.js @@ -91,7 +91,7 @@ async function uninstallLanguagePack(language, client) { } } -async function checkCacheStatus(language, hdTextures, client) { +async function checkCacheStatus(language, hdTextures, siFiles, client) { const cacheName = getLanguageCacheName(language); const cache = await caches.open(cacheName); const requests = await cache.keys(); @@ -100,6 +100,9 @@ async function checkCacheStatus(language, hdTextures, client) { if (hdTextures) { requiredFiles = requiredFiles.concat(textureFiles); } + if (siFiles.length > 0) { + requiredFiles = requiredFiles.concat(siFiles); + } const missingFiles = requiredFiles.filter(file => !cachedUrls.includes(file)); client.postMessage({ @@ -131,7 +134,7 @@ self.addEventListener('message', (event) => { uninstallLanguagePack(event.data.language, event.source); break; case 'check_cache_status': - checkCacheStatus(event.data.language, event.data.hdTextures, event.source); + checkCacheStatus(event.data.language, event.data.hdTextures, event.data.siFiles, event.source); break; } } diff --git a/sw.js b/sw.js index bc7d21c..1200925 100644 --- a/sw.js +++ b/sw.js @@ -10,7 +10,7 @@ const { Strategy } = workbox.strategies; const { CacheableResponsePlugin } = workbox.cacheableResponse; const { RangeRequestsPlugin } = workbox.rangeRequests; -precacheAndRoute([{"revision":"a342ad33195eed2c0745b4f27c874451","url":"index.html"},{"revision":"013ceb7d67293d532e979dde0347f3af","url":"cancel_off.webp"},{"revision":"bfc1563be018d82685716c6130529129","url":"cancel_on.webp"},{"revision":"d282c260fd35522036936bb6faf8ad21","url":"cdspin.gif"},{"revision":"3d820bf72b19bd4e437a61e75f317b83","url":"configure_off.webp"},{"revision":"e2c0c5e6aa1f7703c385a433a2d2a519","url":"configure_on.webp"},{"revision":"88e1e81c930d8e6c24dfdc7af274e812","url":"favicon.png"},{"revision":"d16b293eca457e2fb1e7ef2caca8c904","url":"favicon.svg"},{"revision":"d2b9c2e128ef1e5e4265c603b0bc3305","url":"free_stuff_off.webp"},{"revision":"cbc6a6779897f932c3a3c8dceb329804","url":"free_stuff_on.webp"},{"revision":"05fba4ef1884cbbd6afe09ea3325efc0","url":"install_off.webp"},{"revision":"11247e92082ba3d978a2e3785b0acf51","url":"install_on.webp"},{"revision":"d23ea8243c18eb217ef08fe607097824","url":"island.webp"},{"revision":"c3314e6daf2056902c27b7ccbb237e9b","url":"isle.js"},{"revision":"0c7a24202bd246027d3fc600b647f00e","url":"isle.wasm"},{"revision":"6d4248f1a08c218943e582673179b7be","url":"poster.pdf"},{"revision":"a6fcac24a24996545c039a1755af33ea","url":"read_me_off.webp"},{"revision":"aae783d064996b4322e23b092d97ea4a","url":"read_me_on.webp"},{"revision":"766a9e6e6d890f24cef252e81753b29d","url":"run_game_off.webp"},{"revision":"70208e00e9ea641e4c98699f74100db3","url":"run_game_on.webp"},{"revision":"0a65c71d9983c9bb1bc6a5f405fd6fd9","url":"shark.webp"},{"revision":"88c1fd032e6fc16814690712a26c1ede","url":"uninstall_off.webp"},{"revision":"0118a4aca04c5fb0a525bf00b001844e","url":"uninstall_on.webp"},{"revision":"874db5446269fce0d688061532d7a48b","url":"app.js"},{"revision":"942885226607afc2faf4e4c99e166ed9","url":"style.css"},{"revision":"060210979e13e305510de6285e085db1","url":"manifest.json"},{"revision":"4f0172bc7007d34cebf681cc233ab57f","url":"install.webp"},{"revision":"6a70d35dadf51d2ec6e38a6202d7fb0b","url":"install.mp3"},{"revision":"eac041a0b8835bfea706d997b0b7b224","url":"downloader.js"}]); +precacheAndRoute([{"revision":"9543d844d0c63edf114f4b20bda17755","url":"index.html"},{"revision":"013ceb7d67293d532e979dde0347f3af","url":"cancel_off.webp"},{"revision":"bfc1563be018d82685716c6130529129","url":"cancel_on.webp"},{"revision":"d282c260fd35522036936bb6faf8ad21","url":"cdspin.gif"},{"revision":"3d820bf72b19bd4e437a61e75f317b83","url":"configure_off.webp"},{"revision":"e2c0c5e6aa1f7703c385a433a2d2a519","url":"configure_on.webp"},{"revision":"88e1e81c930d8e6c24dfdc7af274e812","url":"favicon.png"},{"revision":"d16b293eca457e2fb1e7ef2caca8c904","url":"favicon.svg"},{"revision":"d2b9c2e128ef1e5e4265c603b0bc3305","url":"free_stuff_off.webp"},{"revision":"cbc6a6779897f932c3a3c8dceb329804","url":"free_stuff_on.webp"},{"revision":"05fba4ef1884cbbd6afe09ea3325efc0","url":"install_off.webp"},{"revision":"11247e92082ba3d978a2e3785b0acf51","url":"install_on.webp"},{"revision":"d23ea8243c18eb217ef08fe607097824","url":"island.webp"},{"revision":"67c99852cbd60bccd6d12f2d101fb34c","url":"isle.js"},{"revision":"1dccb6f053644ceb5a4ec730174bf70d","url":"isle.wasm"},{"revision":"6d4248f1a08c218943e582673179b7be","url":"poster.pdf"},{"revision":"a6fcac24a24996545c039a1755af33ea","url":"read_me_off.webp"},{"revision":"aae783d064996b4322e23b092d97ea4a","url":"read_me_on.webp"},{"revision":"766a9e6e6d890f24cef252e81753b29d","url":"run_game_off.webp"},{"revision":"70208e00e9ea641e4c98699f74100db3","url":"run_game_on.webp"},{"revision":"0a65c71d9983c9bb1bc6a5f405fd6fd9","url":"shark.webp"},{"revision":"88c1fd032e6fc16814690712a26c1ede","url":"uninstall_off.webp"},{"revision":"0118a4aca04c5fb0a525bf00b001844e","url":"uninstall_on.webp"},{"revision":"bb300718068544d5464574079dd76404","url":"app.js"},{"revision":"942885226607afc2faf4e4c99e166ed9","url":"style.css"},{"revision":"060210979e13e305510de6285e085db1","url":"manifest.json"},{"revision":"4f0172bc7007d34cebf681cc233ab57f","url":"install.webp"},{"revision":"6a70d35dadf51d2ec6e38a6202d7fb0b","url":"install.mp3"},{"revision":"eac041a0b8835bfea706d997b0b7b224","url":"downloader.js"}]); const gameFiles = [ "/LEGO/Scripts/CREDITS.SI", "/LEGO/Scripts/INTRO.SI", "/LEGO/Scripts/NOCD.SI", "/LEGO/Scripts/SNDANIM.SI", @@ -91,7 +91,7 @@ async function uninstallLanguagePack(language, client) { } } -async function checkCacheStatus(language, hdTextures, client) { +async function checkCacheStatus(language, hdTextures, siFiles, client) { const cacheName = getLanguageCacheName(language); const cache = await caches.open(cacheName); const requests = await cache.keys(); @@ -100,6 +100,9 @@ async function checkCacheStatus(language, hdTextures, client) { if (hdTextures) { requiredFiles = requiredFiles.concat(textureFiles); } + if (siFiles.length > 0) { + requiredFiles = requiredFiles.concat(siFiles); + } const missingFiles = requiredFiles.filter(file => !cachedUrls.includes(file)); client.postMessage({ @@ -131,7 +134,7 @@ self.addEventListener('message', (event) => { uninstallLanguagePack(event.data.language, event.source); break; case 'check_cache_status': - checkCacheStatus(event.data.language, event.data.hdTextures, event.source); + checkCacheStatus(event.data.language, event.data.hdTextures, event.data.siFiles, event.source); break; } }