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..6486747
--- /dev/null
+++ b/src/lib/save-editor/MissionScoresEditor.svelte
@@ -0,0 +1,215 @@
+
+
+
+
Mission Scores
+
+
+ {#key missionData}
+
+
+
+ {#each missions as mission}
+
+
{mission.name}
+ {#each actors as actor}
+
+ handleScoreChange(mission.key, actor.id, 'score', c)}
+ title="Score"
+ />
+ handleScoreChange(mission.key, actor.id, 'highScore', c)}
+ title="High Score"
+ isHighScore={true}
+ />
+
+ {/each}
+
+ {/each}
+
+ {/key}
+
+
+
+
+ Grey
+
+
+ Yellow
+
+
+ Blue
+
+
+ Red
+
+ |
+ H = High Score
+
+
+
+
diff --git a/src/lib/save-editor/PlayerInfoEditor.svelte b/src/lib/save-editor/PlayerInfoEditor.svelte
new file mode 100644
index 0000000..5acd1f5
--- /dev/null
+++ b/src/lib/save-editor/PlayerInfoEditor.svelte
@@ -0,0 +1,298 @@
+
+
+
+
Player Info
+
+
+
Name
+
+ {#each nameSlots as char, i}
+ handleSlotBeforeInput(i, e)}
+ onkeydown={(e) => handleSlotKeydown(i, e)}
+ onfocus={handleSlotFocus}
+ bind:this={slotRefs[i]}
+ />
+ {/each}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/lib/save-editor/SaveSlotCard.svelte b/src/lib/save-editor/SaveSlotCard.svelte
new file mode 100644
index 0000000..2d9f1dd
--- /dev/null
+++ b/src/lib/save-editor/SaveSlotCard.svelte
@@ -0,0 +1,77 @@
+
+
+
+
+
diff --git a/src/lib/save-editor/SaveSlotList.svelte b/src/lib/save-editor/SaveSlotList.svelte
new file mode 100644
index 0000000..8f75398
--- /dev/null
+++ b/src/lib/save-editor/SaveSlotList.svelte
@@ -0,0 +1,54 @@
+
+
+
+
Save Slots
+ {#if existingSlots.length === 0}
+
No save files found
+ {:else}
+
+ {#each existingSlots as slot}
+ onSelect(slot.slotNumber)}
+ />
+ {/each}
+
+ {/if}
+
+
+
diff --git a/src/lib/save-editor/ScoreColorButton.svelte b/src/lib/save-editor/ScoreColorButton.svelte
new file mode 100644
index 0000000..a0fb94c
--- /dev/null
+++ b/src/lib/save-editor/ScoreColorButton.svelte
@@ -0,0 +1,64 @@
+
+
+
+
+
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
+});