diff --git a/index.html b/index.html
index 1fa4990..f893546 100644
--- a/index.html
+++ b/index.html
@@ -85,8 +85,8 @@
let pendingDialogue = null;
let latestAssistantText = '';
let latestAssistantVoice = {role: 'narrator', voiceIdentity: 'neutral'};
- const voiceSettingsKey = 'ai-spel.voice-settings.v1';
- let voiceSettings = window.GameVoice.loadSettings(localStorage, voiceSettingsKey);
+ const voiceSettingsKey = 'ai-spel.voice-settings.v2';
+ let voiceSettings = window.GameVoice.loadSettings(localStorage, voiceSettingsKey, 'ai-spel.voice-settings.v1');
let voiceController;
let audioContext;
let voiceDisclosureAcknowledged = false;
diff --git a/tests/voice.test.cjs b/tests/voice.test.cjs
index 3b78024..7f7a07b 100644
--- a/tests/voice.test.cjs
+++ b/tests/voice.test.cjs
@@ -180,6 +180,13 @@ test('settings survive reload and invalid storage falls back to accessible defau
const defaults = GameVoice.loadSettings(storage, 'new-player');
assert.equal(defaults.mode, 'game-voice');
assert.equal(defaults.autoSpeak, true);
+ values.set('voice-v1', JSON.stringify({mode: 'screen-reader', autoSpeak: false, rate: 1.4, voiceName: 'Svensk', soundSignals: false}));
+ const migrated = GameVoice.loadSettings(storage, 'voice-v2', 'voice-v1');
+ assert.equal(migrated.mode, 'game-voice');
+ assert.equal(migrated.autoSpeak, true);
+ assert.equal(migrated.rate, 1.4);
+ assert.equal(migrated.voiceName, 'Svensk');
+ assert.equal(migrated.soundSignals, false);
const requested = {...GameVoice.DEFAULT_SETTINGS, mode: 'game-voice', autoSpeak: true, rate: 1.5, voiceName: 'Svensk'};
assert.equal(GameVoice.saveSettings(storage, 'voice', requested), true);
const loaded = GameVoice.loadSettings(storage, 'voice');
diff --git a/voice.js b/voice.js
index 1071231..46493e4 100644
--- a/voice.js
+++ b/voice.js
@@ -25,9 +25,22 @@
return {command: aliases[command] || 'unknown'};
}
- function loadSettings(storage, key) {
+ function loadSettings(storage, key, legacyKey) {
try {
- const stored = JSON.parse(storage.getItem(key) || '{}');
+ const current = storage.getItem(key);
+ if (!current && legacyKey) {
+ const legacy = JSON.parse(storage.getItem(legacyKey) || '{}');
+ const migrated = {
+ ...DEFAULT_SETTINGS,
+ rate: legacy.rate,
+ voiceName: legacy.voiceName,
+ speakerProfiles: legacy.speakerProfiles,
+ soundSignals: legacy.soundSignals,
+ };
+ saveSettings(storage, key, migrated);
+ return migrated;
+ }
+ const stored = JSON.parse(current || '{}');
const settings = {...DEFAULT_SETTINGS, ...stored};
if (!['screen-reader', 'game-voice', 'text-only'].includes(settings.mode)) settings.mode = DEFAULT_SETTINGS.mode;
settings.rate = Math.min(2, Math.max(0.5, Number(settings.rate) || 1));