Support NPC-led conversation flow
Build and publish frontend / publish (push) Successful in 38s

This commit is contained in:
Ein Anderssono
2026-10-15 10:45:33 +02:00
parent b3a0e0ca5a
commit 0005bb1c83
3 changed files with 18 additions and 3 deletions
+14 -3
View File
@@ -115,6 +115,17 @@
}
return line;
}
function explainDialogueError(error) {
const code = String(error?.message || '');
const known = {
dialogue_temporarily_unavailable: 'Berättartjänsten svarar inte just nu. Vänta en stund och försök igen.',
world_version_conflict: 'Världen hann ändras medan du skrev. Jag har uppdaterat läget; skicka meddelandet igen.',
world_not_available: 'Världen är inte tillgänglig just nu. Försök igen om en liten stund.',
};
return known[code] || (/^[a-z0-9_]+$/.test(code)
? 'Jag kunde inte behandla det just nu. Försök igen om en liten stund.'
: code || 'Ett tillfälligt fel uppstod. Försök igen om en liten stund.');
}
function setVoiceStatus(message = '') { document.querySelector('#voice-status').textContent = message; }
function refreshMicrophone() {
const button = document.querySelector('#microphone');
@@ -534,19 +545,19 @@
gameState.world.version = result.world_version;
gameState.world.world_time = result.world_time;
pendingDialogue = null;
if (result.intent === 'move') {
if (result.intent === 'move' || result.intent === 'meet') {
try {
const refreshed = await request('/api/world');
if (refreshed.world) gameState = refreshed;
} catch (_) { /* The committed dialogue stays successful if this optional view refresh fails. */ }
}
const speakingNpc = result.intent === 'speak' ? gameState.world.npc : null;
const speakingNpc = ['speak', 'meet'].includes(result.intent) ? gameState.world.npc : null;
appendLine('assistant', result.reply, speakingNpc
? {speaker: speakingNpc.name, voice: {characterId: speakingNpc.id, voiceIdentity: speakingNpc.voice_identity}}
: {speaker: 'Berättelsen', voice: {role: 'narrator', voiceIdentity: 'neutral'}});
} catch (error) {
messageField.value = message;
appendLine('assistant', `Meddelandet kunde inte behandlas: ${error.message}. Texten ligger kvar i inmatningen; skicka igen för att försöka på nytt.`);
appendLine('assistant', `${explainDialogueError(error)} Ditt meddelande ligger kvar i inmatningen.`);
}
messageField.disabled = false;
messageField.focus();