Add Widescreen Backgrounds extension

This commit is contained in:
Christian Semmler 2025-08-10 19:37:40 -07:00
parent 300af0a71f
commit 65fb5a46cb
No known key found for this signature in database
GPG Key ID: 086DAA1360BEEE5C
4 changed files with 53 additions and 7 deletions

33
app.js
View File

@ -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(),
});
}
}

View File

@ -426,6 +426,10 @@
<span class="tooltip-content">
<strong>HD Textures:</strong> Enhance the game's visuals with
high-definition textures. An extra 25MB download is
required when this is enabled.<br><br>
<strong>Widescreen Backgrounds (work-in-progress):</strong> 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.
</span>
</span>
@ -438,6 +442,13 @@
HD Textures
</label>
</div>
<div class="option-item">
<input type="checkbox" id="check-widescreen-bgs" name="Widescreen Backgrounds"
data-not-ini="true">
<label for="check-widescreen-bgs">
Widescreen Backgrounds
</label>
</div>
</div>
</div>
</div>

View File

@ -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;
}
}

9
sw.js
View File

@ -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;
}
}