From de915b4aa6a5d60c0e75ef15f2021e92ffb76082 Mon Sep 17 00:00:00 2001 From: Ein Anderssono Date: Thu, 15 Oct 2026 10:25:27 +0200 Subject: [PATCH] Migrate players to automatic voice replies --- index.html | 4 ++-- tests/voice.test.cjs | 7 +++++++ voice.js | 17 +++++++++++++++-- 3 files changed, 24 insertions(+), 4 deletions(-) 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));