diff --git a/package-lock.json b/package-lock.json
index 7934ee1..b0d8f9c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,6 +7,9 @@
"": {
"name": "isle.pizza",
"version": "1.0.0",
+ "dependencies": {
+ "three": "^0.182.0"
+ },
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^4.0.0",
"svelte": "^5.0.0",
@@ -3583,10 +3586,11 @@
}
},
"node_modules/devalue": {
- "version": "5.6.1",
- "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz",
- "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==",
- "dev": true
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.2.tgz",
+ "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/dot-prop": {
"version": "9.0.0",
@@ -3876,10 +3880,11 @@
"dev": true
},
"node_modules/esrap": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.1.tgz",
- "integrity": "sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg==",
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.2.tgz",
+ "integrity": "sha512-zA6497ha+qKvoWIK+WM9NAh5ni17sKZKhbS5B3PoYbBvaYHZWoS33zmFybmyqpn07RLUxSmn+RCls2/XF+d0oQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.4.15"
}
@@ -5192,10 +5197,11 @@
}
},
"node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
@@ -6715,10 +6721,11 @@
}
},
"node_modules/svelte": {
- "version": "5.46.1",
- "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.46.1.tgz",
- "integrity": "sha512-ynjfCHD3nP2el70kN5Pmg37sSi0EjOm9FgHYQdC4giWG/hzO3AatzXXJJgP305uIhGQxSufJLuYWtkY8uK/8RA==",
+ "version": "5.49.1",
+ "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.49.1.tgz",
+ "integrity": "sha512-jj95WnbKbXsXXngYj28a4zx8jeZx50CN/J4r0CEeax2pbfdsETv/J1K8V9Hbu3DCXnpHz5qAikICuxEooi7eNQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@jridgewell/remapping": "^2.3.4",
"@jridgewell/sourcemap-codec": "^1.5.0",
@@ -6728,9 +6735,9 @@
"aria-query": "^5.3.1",
"axobject-query": "^4.1.0",
"clsx": "^2.1.1",
- "devalue": "^5.5.0",
+ "devalue": "^5.6.2",
"esm-env": "^1.2.1",
- "esrap": "^2.2.1",
+ "esrap": "^2.2.2",
"is-reference": "^3.0.3",
"locate-character": "^3.0.0",
"magic-string": "^0.30.11",
@@ -6879,6 +6886,11 @@
"node": ">=10"
}
},
+ "node_modules/three": {
+ "version": "0.182.0",
+ "resolved": "https://registry.npmjs.org/three/-/three-0.182.0.tgz",
+ "integrity": "sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ=="
+ },
"node_modules/through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
diff --git a/package.json b/package.json
index dda8867..5e4ea1a 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,9 @@
"preview": "vite preview",
"prepare:assets": "node scripts/prepare.js"
},
+ "dependencies": {
+ "three": "^0.182.0"
+ },
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^4.0.0",
"svelte": "^5.0.0",
diff --git a/public/laura-selected.webp b/public/laura-selected.webp
new file mode 100644
index 0000000..70b5f86
Binary files /dev/null and b/public/laura-selected.webp differ
diff --git a/public/laura.webp b/public/laura.webp
new file mode 100644
index 0000000..6f0983f
Binary files /dev/null and b/public/laura.webp differ
diff --git a/public/mama-selected.webp b/public/mama-selected.webp
new file mode 100644
index 0000000..45a4f83
Binary files /dev/null and b/public/mama-selected.webp differ
diff --git a/public/mama.webp b/public/mama.webp
new file mode 100644
index 0000000..55c51bf
Binary files /dev/null and b/public/mama.webp differ
diff --git a/public/nick-selected.webp b/public/nick-selected.webp
new file mode 100644
index 0000000..d6e626c
Binary files /dev/null and b/public/nick-selected.webp differ
diff --git a/public/nick.webp b/public/nick.webp
new file mode 100644
index 0000000..bf46c22
Binary files /dev/null and b/public/nick.webp differ
diff --git a/public/papa-selected.webp b/public/papa-selected.webp
new file mode 100644
index 0000000..cc6b221
Binary files /dev/null and b/public/papa-selected.webp differ
diff --git a/public/papa.webp b/public/papa.webp
new file mode 100644
index 0000000..8393524
Binary files /dev/null and b/public/papa.webp differ
diff --git a/public/pepper-selected.webp b/public/pepper-selected.webp
new file mode 100644
index 0000000..1cacc14
Binary files /dev/null and b/public/pepper-selected.webp differ
diff --git a/public/pepper.webp b/public/pepper.webp
new file mode 100644
index 0000000..fdf9fa1
Binary files /dev/null and b/public/pepper.webp differ
diff --git a/public/save.webp b/public/save.webp
new file mode 100644
index 0000000..6456417
Binary files /dev/null and b/public/save.webp differ
diff --git a/src/App.svelte b/src/App.svelte
index 7f3bd8f..81dfbdd 100644
--- a/src/App.svelte
+++ b/src/App.svelte
@@ -8,6 +8,7 @@
import ReadMePage from './lib/ReadMePage.svelte';
import ConfigurePage from './lib/ConfigurePage.svelte';
import FreeStuffPage from './lib/FreeStuffPage.svelte';
+ import SaveEditorPage from './lib/SaveEditorPage.svelte';
import UpdatePopup from './lib/UpdatePopup.svelte';
import GoodbyePopup from './lib/GoodbyePopup.svelte';
import ConfigToast from './lib/ConfigToast.svelte';
@@ -76,6 +77,9 @@
+
+
+
+
+
+
diff --git a/src/lib/save-editor/MissionScoresEditor.svelte b/src/lib/save-editor/MissionScoresEditor.svelte
new file mode 100644
index 0000000..f51bbec
--- /dev/null
+++ b/src/lib/save-editor/MissionScoresEditor.svelte
@@ -0,0 +1,31 @@
+
+
+
+ {#if $currentPage === 'save-editor'}
+
+ {/if}
+
+
+
diff --git a/src/lib/save-editor/ScoreCube.svelte b/src/lib/save-editor/ScoreCube.svelte
new file mode 100644
index 0000000..93db3a5
--- /dev/null
+++ b/src/lib/save-editor/ScoreCube.svelte
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+ {#if loading}
+
+ {:else if error}
+
Error: {error}
+ {/if}
+
+
+
diff --git a/src/stores.js b/src/stores.js
index 97dd8f4..cf9e708 100644
--- a/src/stores.js
+++ b/src/stores.js
@@ -7,7 +7,8 @@ function getInitialPage() {
const pageMap = {
'#read-me': 'read-me',
'#configure': 'configure',
- '#free-stuff': 'free-stuff'
+ '#free-stuff': 'free-stuff',
+ '#save-editor': 'save-editor'
};
return pageMap[hash] || 'main';
}
@@ -35,6 +36,7 @@ export const installState = writable({
// Config toast
export const configToastVisible = writable(false);
+export const configToastMessage = writable('Settings saved');
// Debug UI visible (set when game reaches intro animation)
export const debugUIVisible = writable(false);
@@ -44,3 +46,11 @@ export const gameRunning = writable(false);
// Service worker registration
export const swRegistration = writable(null);
+
+// Save editor state
+export const saveEditorState = writable({
+ slots: [], // Array of SaveSlot objects
+ selectedSlot: null, // Currently selected slot number
+ loading: true,
+ error: null
+});