From 5f72e6f549eb3a9c954d308e42161e0c91fb2b9b Mon Sep 17 00:00:00 2001 From: tomt610 Date: Fri, 9 Jan 2026 00:23:23 +0000 Subject: [PATCH] Fix: Sync quest changes to committedTrackerData When manually adding/editing/removing quests via UI, the changes were only saved to extensionSettings but not to committedTrackerData.userStats. This caused the AI to see stale quest data on the next external server update, resulting in removed quests reappearing. - Add syncQuestsToCommittedData() function to update JSON quest data - Call sync and saveChatData() on all quest modification actions - Imports committedTrackerData, lastGeneratedData, saveChatData --- src/systems/rendering/quests.js | 41 +++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/src/systems/rendering/quests.js b/src/systems/rendering/quests.js index 036b0c3..a404a28 100644 --- a/src/systems/rendering/quests.js +++ b/src/systems/rendering/quests.js @@ -3,10 +3,35 @@ * Handles UI rendering for quests system (main and optional quests) */ -import { extensionSettings, $questsContainer } from '../../core/state.js'; -import { saveSettings } from '../../core/persistence.js'; +import { extensionSettings, $questsContainer, committedTrackerData, lastGeneratedData } from '../../core/state.js'; +import { saveSettings, saveChatData } from '../../core/persistence.js'; import { isItemLocked, setItemLock } from '../generation/lockManager.js'; +/** + * Syncs the current extensionSettings.quests to committedTrackerData.userStats + * This ensures quest changes made via UI are reflected in the data sent to AI + */ +function syncQuestsToCommittedData() { + const currentData = committedTrackerData.userStats || lastGeneratedData.userStats; + if (!currentData) return; + + const trimmed = currentData.trim(); + if (trimmed.startsWith('{') || trimmed.startsWith('[')) { + try { + const jsonData = JSON.parse(currentData); + if (jsonData && typeof jsonData === 'object') { + // Update quests in the JSON data + jsonData.quests = extensionSettings.quests || { main: 'None', optional: [] }; + const updatedJSON = JSON.stringify(jsonData, null, 2); + committedTrackerData.userStats = updatedJSON; + lastGeneratedData.userStats = updatedJSON; + } + } catch (e) { + console.warn('[RPG Quests] Failed to sync quests to committed data:', e); + } + } +} + /** * Helper to generate lock icon HTML if setting is enabled * @param {string} tracker - Tracker name @@ -250,7 +275,10 @@ function attachQuestEventHandlers() { } extensionSettings.quests.optional.push(questTitle); } + // Sync quest changes to committedTrackerData so AI sees the addition + syncQuestsToCommittedData(); saveSettings(); + saveChatData(); renderQuests(); } }); @@ -278,7 +306,10 @@ function attachQuestEventHandlers() { if (questTitle) { extensionSettings.quests.main = questTitle; + // Sync quest changes to committedTrackerData so AI sees the edit + syncQuestsToCommittedData(); saveSettings(); + saveChatData(); renderQuests(); } }); @@ -293,7 +324,10 @@ function attachQuestEventHandlers() { } else { extensionSettings.quests.optional.splice(index, 1); } + // Sync quest changes to committedTrackerData so AI sees the removal + syncQuestsToCommittedData(); saveSettings(); + saveChatData(); renderQuests(); }); @@ -306,7 +340,10 @@ function attachQuestEventHandlers() { if (newTitle && field === 'optional' && index !== undefined) { extensionSettings.quests.optional[index] = newTitle; + // Sync quest changes to committedTrackerData so AI sees the edit + syncQuestsToCommittedData(); saveSettings(); + saveChatData(); } });