import { showGoodbyePopup } from '../stores.js';
- import { startGame } from '../core/emscripten.js';
- import { pauseInstallAudio } from '../core/audio.js';
+ import { launchGame } from '../core/emscripten.js';
import { navigateTo } from '../core/navigation.js';
+ import { saveConfigFromDOM } from '../core/opfs.js';
import ImageButton from './ImageButton.svelte';
- let rendererValue = "0 0x682656f3 0x0 0x0 0x4000000"; // WebGL default
-
const buttons = [
{ id: 'run-game-btn', off: 'images/run_game_off.webp', on: 'images/run_game_on.webp', alt: 'Run Game', width: 135, height: 164, action: handleRunGame },
{ id: 'configure-btn', off: 'images/configure_off.webp', on: 'images/configure_on.webp', alt: 'Configure', width: 130, height: 147, action: () => navigateTo('configure') },
@@ -15,16 +13,9 @@
{ id: 'cancel-btn', off: 'images/cancel_off.webp', on: 'images/cancel_on.webp', alt: 'Cancel', width: 93, height: 145, action: () => showGoodbyePopup.set(true) }
];
- function handleRunGame() {
- pauseInstallAudio();
-
- // Get current renderer value from select
- const rendererSelect = document.getElementById('renderer-select');
- if (rendererSelect) {
- rendererValue = rendererSelect.value;
- }
-
- startGame(rendererValue);
+ async function handleRunGame() {
+ await saveConfigFromDOM();
+ launchGame();
}
diff --git a/src/lib/CrashOverlay.svelte b/src/lib/CrashOverlay.svelte
new file mode 100644
index 0000000..a9b9860
--- /dev/null
+++ b/src/lib/CrashOverlay.svelte
@@ -0,0 +1,151 @@
+
+
+{#if $gameCrashed}
+
+
+
+
+
Uh oh! The game crashed.
+
Sorry about that! Something went wrong and LEGO Island had to stop. You can try reloading the page to get back to the action.
+
Reload Page
+
If this keeps happening, please report the issue so we can fix it.
+
+
+
+{/if}
+
+
diff --git a/src/lib/DebugPanel.svelte b/src/lib/DebugPanel.svelte
index 9afe655..53b0ab2 100644
--- a/src/lib/DebugPanel.svelte
+++ b/src/lib/DebugPanel.svelte
@@ -1,28 +1,8 @@
{#if $debugUIVisible}
-
+
debugPanelOpen = !debugPanelOpen}>⚙
{#if debugPanelOpen}
@@ -384,5 +364,195 @@
{/if}
diff --git a/src/lib/EditorTooltip.svelte b/src/lib/EditorTooltip.svelte
index 4918415..9e6940d 100644
--- a/src/lib/EditorTooltip.svelte
+++ b/src/lib/EditorTooltip.svelte
@@ -55,7 +55,6 @@
border: none;
padding: 0;
cursor: pointer;
- -webkit-tap-highlight-color: transparent;
}
/* Expand touch target on mobile */
diff --git a/src/lib/FreeStuffPage.svelte b/src/lib/FreeStuffPage.svelte
index fe62e48..6e822ed 100644
--- a/src/lib/FreeStuffPage.svelte
+++ b/src/lib/FreeStuffPage.svelte
@@ -44,3 +44,100 @@
+
+
diff --git a/src/lib/GoodbyePopup.svelte b/src/lib/GoodbyePopup.svelte
index e4caac5..e1d10fa 100644
--- a/src/lib/GoodbyePopup.svelte
+++ b/src/lib/GoodbyePopup.svelte
@@ -57,3 +57,23 @@
{/if}
+
+
diff --git a/src/lib/MemoriesPage.svelte b/src/lib/MemoriesPage.svelte
new file mode 100644
index 0000000..bc841d6
--- /dev/null
+++ b/src/lib/MemoriesPage.svelte
@@ -0,0 +1,1063 @@
+
+
+{#snippet avatarStack(participants)}
+
+ {#each participants as p, idx}
+
+ {#if $actorThumbnails[p.charIndex]}
+
+ {:else}
+
{(ActorDisplayNames[p.charIndex] || '?')[0]}
+ {/if}
+
+ {/each}
+
+{/snippet}
+
+
+
+
+
+
+
+
+
+
Nick Brick's Memories
+
+ Help Nick remember what happened on the island.
+
+ {unlockCount}
+ /
+ {TOTAL_ANIMATIONS}
+
+
+
+
+
+
+
+
introOpen = !introOpen}>
+ How does this work?
+
+
+ {#if introOpen}
+
+
+ Join a multiplayer island and explore LEGO Island together to reenact the original
+ in-game animations. Each animation needs specific characters to perform it and a
+ spectator to trigger it — so you always need at least two players. When an animation
+ plays successfully, it's saved as a memory for everyone involved.
+
+
+
+
+ 2
+ Explore the island and browse available animations from the hotbar
+
+
+ 3
+ Mark interest in an animation and wait for other players to fill the required roles
+
+
+ 4
+ Collect all {TOTAL_ANIMATIONS} memories across the island
+
+
+
+ {/if}
+
+
+
+ {#each locationGroups as group}
+
0}
+ onclick={() => selectLocation(group.label)}
+ >
+
+ {#if $buildingThumbnails[group.label]}
+
+ {:else}
+
+ {/if}
+
+
+
{group.label}
+
+
+
{group.unlocked}/{group.total}
+
+
+
+ {/each}
+
+
+
+ {#if selectedGroup}
+
+
+
{selectedGroup.label}
+
{selectedGroup.unlocked}/{selectedGroup.total}
+
+
filter = 'all'}>All
+
filter = 'unlocked'}>Unlocked
+
filter = 'locked'}>Locked
+
+
cycleSort('latest')}>
+ Latest
+
+
+
cycleSort('alpha')}>
+ Name
+
+
+
+
+
+ {#if displayAnims.length === 0}
+
+ {#if filter === 'unlocked'}
+ No memories unlocked here yet.
+ {:else if filter === 'locked'}
+ All memories here are unlocked!
+ {:else}
+ No animations found.
+ {/if}
+
+ {:else}
+
+ {#each displayAnims as anim}
+ {@const now = Date.now()}
+
+
+
+
+
+ {#if anim.completions}
+
+ {/if}
+
+ {/each}
+
+ {/if}
+
+ {/if}
+
+
+
+
diff --git a/src/lib/MultiplayerPage.svelte b/src/lib/MultiplayerPage.svelte
new file mode 100644
index 0000000..88293b5
--- /dev/null
+++ b/src/lib/MultiplayerPage.svelte
@@ -0,0 +1,728 @@
+
+
+
+
+
+
+
+
+
Multiplayer
+
+
+
+
+ Experimental
+
+
+
+
Explore LEGO Island together with other players. Create an island and share the link to get started.
+
+ {#if !hasRoom}
+
+
+
+ {#if isPrivate}
+
+
+
+ {:else}
+
+
+
+
+ {/if}
+ {creating ? 'Creating...' : isPrivate ? 'Create Private Island' : 'Create Public Island'}
+
+
{ isPrivate = !isPrivate; }} disabled={creating || $opfsDisabled} title={isPrivate ? 'Switch to public (listed in browser)' : 'Switch to private (link only)'}>
+
+
+
+
+
+
+
+
+
+ {#each browserRows as row (row.id)}
+
+
!row.placeholder && navigateToRoom(row.roomId)}>
+ {#if row.placeholder}
+ {row.message}
+ {:else}
+ {row.roomId}
+
+
+
+
+ {row.players} /{row.maxPlayers}
+
+ {/if}
+
+ {/each}
+
+
+
+
+
+
+
+
+ Third-person camera
+ Toggle a camera behind your character to see yourself walking and performing emotes.
+
+
+
+
+
+
+
+
+
+
Nick Brick's Memories
+
Trigger 300+ original animations together. Fill actor roles and watch scenes play out.
+
+
+
+
+
+ Emotes and interactions
+ Wave, tip your hat, cycle colors and moods, and pick different walk and idle styles.
+
+
+
+
+
+ Shared world*
+ See other players on the island. Plants, buildings, and their states are synchronized.
+
+
+
+
+ {:else}
+
+
+
+ {roomName}
+ ·
+
+ {#if previewLoading}
+ ...
+ {:else if previewError}
+ {previewError}
+ {:else}
+
+
+
+ {playerCount}/{roomMaxPlayers}
+ {/if}
+
+
+
+
+
+ {#if !$gameRunning}
+
{ selectedActorIndex = idx; sessionStorage.setItem('mp-actor', idx); }}
+ />
+ {/if}
+
+ {#if roomFull}
+ Island is full. Wait for a player to leave or create a new island.
+ {:else}
+ Run Game
+ {/if}
+
+ {/if}
+
+
+
+
+
diff --git a/src/lib/OpfsDisabledBanner.svelte b/src/lib/OpfsDisabledBanner.svelte
new file mode 100644
index 0000000..abb7ae7
--- /dev/null
+++ b/src/lib/OpfsDisabledBanner.svelte
@@ -0,0 +1,27 @@
+
+
+{#if $opfsDisabled}
+
+ OPFS is disabled in this browser. This feature is unavailable. If you are using a
+ Private/Incognito window, please change to a regular window instead.
+
+{/if}
+
+
diff --git a/src/lib/PanningImage.svelte b/src/lib/PanningImage.svelte
new file mode 100644
index 0000000..a1be20e
--- /dev/null
+++ b/src/lib/PanningImage.svelte
@@ -0,0 +1,47 @@
+
+
+
+
+
diff --git a/src/lib/ReadMePage.svelte b/src/lib/ReadMePage.svelte
index b398c8e..735ec53 100644
--- a/src/lib/ReadMePage.svelte
+++ b/src/lib/ReadMePage.svelte
@@ -21,23 +21,30 @@
];
const faqItems = [
- { id: 'faq1', question: 'Is this the full, original game?', answer: `This is a complete port of the original 1997 PC game. You can select from multiple languages, including both the 1.0 and 1.1 versions of English, from the "Configure" menu before starting.
` },
- { id: 'faq2', question: 'How does this differ from the original 1997 CD-ROM game?', answer: `The core gameplay is identical, but this version has some great advantages! It runs in your browser with no installation needed and works on modern devices. It also includes enhancements like widescreen support, improved controls, many bug fixes from the decompilation project, and the ability to run at your display's maximum resolution (even 4K!).
Check out the "Configure" page to see what's possible.
` },
- { id: 'faq3', question: 'Can I save my progress?', answer: `Yes! The game automatically saves your progress. To ensure your game is saved, return to the Infocenter and use the exit door. This will bring you back to the main menu and lock in your save state. A "best effort" save is also attempted if you close the tab directly, but this method isn't always guaranteed.
` },
- { id: 'faq4', question: 'Does this run on mobile?', answer: `Yes! The game is designed to work on a wide range of devices, including desktops, laptops, tablets, and phones. It has even been seen running on Tesla in-car browsers !
` },
- { id: 'faq5', question: 'Which browsers are supported?', answer: `This port runs best on recent versions of modern browsers, including Chrome, Firefox, and Safari. For an optimal experience on iOS devices, please ensure you are running iOS 18 or newer.
` },
- { id: 'faq6', question: 'What are the controls?', answer: `You can play using a keyboard and mouse, a gamepad, or a touch screen. Gamepad support can vary depending on your browser. On mobile, you can select your preferred touch control scheme in the "Configure" menu.
` },
- { id: 'faq7', question: 'Can I play offline?', answer: `You bet! In the "Configure" menu, scroll to the "Offline Play" section. You'll find an option there to install all necessary game files (about 550MB) for offline access.
` },
- { id: 'faq8', question: "I don't hear any sound or music. How do I fix it?", answer: `Most modern browsers block audio until you interact with the page. Click the mute icon on the animated intro to enable sound.
` },
- { id: 'faq9', question: 'I think I found a bug! Where do I report it?', answer: `As an active development project, some bugs are expected. If you find one, we'd be grateful if you'd report it on the isle-portable GitHub Issues page . Please include details about your browser, device, and what you were doing when the bug occurred.
` },
- { id: 'faq10', question: 'Is this project open-source?', answer: `Yes, absolutely! This web port is built upon the incredible open-source LEGO Island (portable) project, and the code for this website is also available here .
` }
+ { id: 'faq1', question: 'Is this the same game as the original?', answer: `This is a complete port of the original 1997 PC game — the core gameplay is identical. You can select from multiple languages, including both the 1.0 and 1.1 versions of English, from the Configure page before starting.
On top of that, this version includes enhancements like widescreen support, improved controls, many bug fixes from the decompilation project, and the ability to run at your display's maximum resolution (even 4K!). Check out the Configure page to see what's possible.
` },
+ { id: 'faq2', question: 'Can I save my progress?', answer: `Yes! The game automatically saves your progress. To ensure your game is saved, return to the Infocenter and use the exit door. This will bring you back to the main menu and lock in your save state. A "best effort" save is also attempted if you close the tab directly, but this method isn't always guaranteed.
` },
+ { id: 'faq3', question: 'Does this run on mobile?', answer: `Yes! The game is designed to work on a wide range of devices, including desktops, laptops, tablets, and phones. It has even been seen running on Tesla in-car browsers !
` },
+ { id: 'faq4', question: 'Which browsers are supported?', answer: `See the System tab for a full list of supported browsers and minimum versions. For the best experience on iOS, make sure you're running iOS 18 or newer.
` },
+ { id: 'faq5', question: 'What are the controls?', answer: `You can play using a keyboard and mouse, a gamepad, or a touch screen. Gamepad support can vary depending on your browser. On mobile, you can select your preferred touch control scheme in the Configure menu.
` },
+ { id: 'faq6', question: 'Can I play offline?', answer: `You bet! On the Configure page, open the "Extras" tab and expand the "Offline Play" section. From there you can install all necessary game files (about 550MB) for offline access.
` },
+ { id: 'faq7', question: "I don't hear any sound or music. How do I fix it?", answer: `Most modern browsers block audio until you interact with the page. Click the mute icon on the animated intro to enable sound.
` },
+ { id: 'faq8', question: 'I think I found a bug! Where do I report it?', answer: `As an active development project, some bugs are expected. If you find one, we'd be grateful if you'd report it on the isle-portable GitHub Issues page . Please include details about your browser, device, and what you were doing when the bug occurred.
` },
+ { id: 'faq9', question: 'Is this project open-source?', answer: `Yes, absolutely! This web port is built upon the incredible open-source LEGO Island (portable) project, and the code for this website is also available here .
` }
];
const changelogItems = [
- { id: 'cl0', title: 'March 2026', items: [
+ { id: 'cl0', title: 'April 2026', items: [
+ { type: 'New', text: 'Multiplayer mode — create public or private islands and explore LEGO Island together with up to 16 players in real time' },
+ { type: 'New', text: 'Scene Player lets you watch over 300 original LEGO Island animations with playback controls and shareable links' },
+ { type: 'New', text: 'Memories page — reenact original in-game animations with other players in multiplayer and collect them as memories' },
+ { type: 'New', text: 'Cloud Sync automatically backs up your save files and config across devices when signed in' },
+ { type: 'New', text: 'Sign in with Discord to enable cloud sync, memories, and multiplayer features' },
+ { type: 'New', text: 'Crash reporting overlay captures diagnostics and lets you submit reports when something goes wrong' }
+ ]},
+ { id: 'cl1', title: 'March 2026', items: [
{ type: 'New', text: 'Voices tab on the Read Me page showcases reactions from the original LEGO Island development team' }
]},
- { id: 'cl1', title: 'February 2026', items: [
+ { id: 'cl2', title: 'February 2026', items: [
{ type: 'New', text: 'Save Editor lets you view and modify save files — change your player name, character, and high scores directly from the browser' },
{ type: 'New', text: 'Sky Color Editor allows customizing the island sky gradient colors in your save file' },
{ type: 'New', text: 'Vehicle Part Editor enables modifying vehicle parts and colors with a 3D preview' },
@@ -52,14 +59,14 @@
{ type: 'Improved', text: 'Save Editor tabs now use a carousel with arrow navigation for easier browsing on small screens' },
{ type: 'Fixed', text: 'Sticky hover highlights on touch devices for editor buttons' }
]},
- { id: 'cl2', title: 'January 2026', items: [
+ { id: 'cl3', title: 'January 2026', items: [
{ type: 'New', text: 'Debug menu for developers and power users. Tap the LEGO Island logo 5 times to unlock OGEL mode and access debug features like teleporting to locations, switching acts, and playing animations' },
{ type: 'Improved', text: 'Configure page redesigned with tabbed navigation, collapsible sections, quick presets (Classic/Modern Mode), and modern toggle switches' },
{ type: 'Improved', text: 'Read Me page reorganized into tabs (About, System, FAQ, Changelog, Manual) with the original instruction manual now viewable in-browser' },
{ type: 'Fixed', text: 'Safari audio not playing on first toggle' },
{ type: 'Fixed', text: 'Tooltips not working correctly on mobile devices' }
]},
- { id: 'cl3', title: 'December 2025', items: [
+ { id: 'cl4', title: 'December 2025', items: [
{ type: 'New', text: '"Active in Background" option keeps the game running when the tab loses focus' },
{ type: 'New', text: 'WASD navigation controls as an alternative to arrow keys' },
{ type: 'Fixed', text: 'Act 3 helicopter ammo now correctly sticks to targets and finishes animations' },
@@ -68,17 +75,17 @@
{ type: 'Fixed', text: 'Touch controls now properly support widescreen aspect ratios' },
{ type: 'Improved', text: 'Default anisotropic filtering increased to 16x for sharper textures' }
]},
- { id: 'cl4', title: 'November 2025', items: [
+ { id: 'cl5', title: 'November 2025', items: [
{ type: 'Fixed', text: 'Dictionary loading failure no longer causes crashes' },
{ type: 'Fixed', text: 'INI configuration now properly applies defaults when values are missing' }
]},
- { id: 'cl5', title: 'September 2025', items: [
+ { id: 'cl6', title: 'September 2025', items: [
{ type: 'New', text: 'Additional widescreen background images' },
{ type: 'Fixed', text: 'Jukebox state now correctly restored when using HD Music extension' },
{ type: 'Fixed', text: 'Background audio no longer gets stuck when starting audio fails' },
{ type: 'Improved', text: 'SI Loader actions now start at the correct time during world loading' }
]},
- { id: 'cl6', title: 'August 2025', items: [
+ { id: 'cl7', title: 'August 2025', items: [
{ type: 'New', text: 'Extended Bad Ending FMV extension shows the uncut beta animation' },
{ type: 'New', text: 'HD Music extension with high-quality audio' },
{ type: 'New', text: 'Widescreen backgrounds extension eliminates 3D edges on wide displays' },
@@ -87,7 +94,7 @@
{ type: 'Fixed', text: 'Purple edges no longer appear on scaled transparent 2D elements' },
{ type: 'Fixed', text: 'Transparent pixels now render correctly with alpha channel support' }
]},
- { id: 'cl7', title: 'July 2025', items: [
+ { id: 'cl8', title: 'July 2025', items: [
{ type: 'New', text: 'HD Textures extension with enhanced visuals' },
{ type: 'New', text: 'MSAA anti-aliasing support for smoother edges' },
{ type: 'New', text: 'Anisotropic filtering for sharper textures at angles' },
@@ -109,7 +116,7 @@
{ type: 'Improved', text: 'Mosaic transition animation is faster and cleaner' },
{ type: 'Improved', text: 'Loading UX for HD Textures with progress indicators' }
]},
- { id: 'cl8', title: 'June 2025 — Initial Release', items: [
+ { id: 'cl9', title: 'June 2025 — Initial Release', items: [
{ type: 'New', text: 'Emscripten web port — play LEGO Island directly in your browser!' },
{ type: 'New', text: 'WebGL rendering for hardware-accelerated 3D graphics' },
{ type: 'New', text: 'Software renderer fallback for devices without WebGL' },
@@ -161,26 +168,21 @@